aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Schmidt <bernd.schmidt@analog.com>2006-02-06 16:36:35 +0000
committerBernd Schmidt <bernd.schmidt@analog.com>2006-02-06 16:36:35 +0000
commitb3d13cd7ae392041004db6b9bf5098372048c00e (patch)
tree2adf45987dc9f88c26eeb95b0071647ebb5c87ec
parent337db89251de80f8ff7a00b2d71bc333c630b6e4 (diff)
Merge reload-branch up to revision 101000reload-branch
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/reload-branch@110651 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--ChangeLog88
-rw-r--r--MAINTAINERS10
-rw-r--r--Makefile.def9
-rw-r--r--Makefile.in85
-rw-r--r--Makefile.tpl32
-rw-r--r--boehm-gc/ChangeLog11
-rw-r--r--boehm-gc/include/private/gcconfig.h21
-rw-r--r--boehm-gc/os_dep.c4
-rwxr-xr-xconfig.sub5
-rw-r--r--config/ChangeLog10
-rw-r--r--config/depstand.m4136
-rw-r--r--config/lead-dot.m432
-rw-r--r--config/no-executables.m42
-rwxr-xr-xconfigure189
-rw-r--r--configure.in32
-rw-r--r--contrib/ChangeLog4
-rwxr-xr-xcontrib/gennews3
-rw-r--r--contrib/regression/ChangeLog12
-rwxr-xr-xcontrib/regression/btest-gcc.sh66
-rwxr-xr-xdepcomp83
-rw-r--r--fixincludes/ChangeLog14
-rw-r--r--fixincludes/fixincl.c2
-rw-r--r--fixincludes/fixincl.x6
-rw-r--r--fixincludes/inclhack.def7
-rw-r--r--fixincludes/tests/base/math.h1
-rw-r--r--gcc/ABOUT-GCC-NLS11
-rw-r--r--gcc/ChangeLog3040
-rw-r--r--gcc/DATESTAMP2
-rw-r--r--gcc/Makefile.in193
-rw-r--r--gcc/aclocal.m423
-rw-r--r--gcc/ada/ChangeLog20
-rw-r--r--gcc/ada/cal.c4
-rw-r--r--gcc/ada/decl.c6
-rw-r--r--gcc/ada/gnat_rm.texi4
-rw-r--r--gcc/ada/gnat_ugn.texi10
-rw-r--r--gcc/ada/init.c10
-rw-r--r--gcc/ada/misc.c1
-rw-r--r--gcc/ada/raise.c12
-rw-r--r--gcc/ada/trans.c7
-rw-r--r--gcc/ada/utils2.c2
-rw-r--r--gcc/attribs.c7
-rw-r--r--gcc/basic-block.h40
-rw-r--r--gcc/bb-reorder.c2
-rw-r--r--gcc/bt-load.c7
-rw-r--r--gcc/builtins.def8
-rw-r--r--gcc/c-common.c120
-rw-r--r--gcc/c-common.h13
-rw-r--r--gcc/c-decl.c109
-rw-r--r--gcc/c-errors.c12
-rw-r--r--gcc/c-format.c20
-rw-r--r--gcc/c-gimplify.c1
-rw-r--r--gcc/c-lex.c12
-rw-r--r--gcc/c-objc-common.c2
-rw-r--r--gcc/c-opts.c27
-rw-r--r--gcc/c-parser.c171
-rw-r--r--gcc/c-pch.c2
-rw-r--r--gcc/c-pragma.c35
-rw-r--r--gcc/c-semantics.c27
-rw-r--r--gcc/c-tree.h1
-rw-r--r--gcc/c-typeck.c389
-rw-r--r--gcc/c.opt7
-rw-r--r--gcc/cfg.c145
-rw-r--r--gcc/cfganal.c6
-rw-r--r--gcc/cfgbuild.c3
-rw-r--r--gcc/cfgcleanup.c2
-rw-r--r--gcc/cfgexpand.c31
-rw-r--r--gcc/cfghooks.c6
-rw-r--r--gcc/cfghooks.h2
-rw-r--r--gcc/cfglayout.c26
-rw-r--r--gcc/cfgloop.h1
-rw-r--r--gcc/cfgloopmanip.c25
-rw-r--r--gcc/cfgrtl.c16
-rw-r--r--gcc/cgraph.c150
-rw-r--r--gcc/cgraph.h44
-rw-r--r--gcc/cgraphunit.c406
-rw-r--r--gcc/collect2.c30
-rw-r--r--gcc/combine.c10
-rw-r--r--gcc/common.opt9
-rw-r--r--gcc/config.gcc21
-rw-r--r--gcc/config.in23
-rw-r--r--gcc/config/alpha/alpha-protos.h2
-rw-r--r--gcc/config/alpha/alpha.c195
-rw-r--r--gcc/config/alpha/alpha.h1
-rw-r--r--gcc/config/alpha/alpha.md8
-rw-r--r--gcc/config/alpha/alpha.opt14
-rw-r--r--gcc/config/alpha/sync.md73
-rw-r--r--gcc/config/arc/arc.c32
-rw-r--r--gcc/config/arc/arc.opt8
-rw-r--r--gcc/config/arm/arm.c55
-rw-r--r--gcc/config/arm/arm.md56
-rw-r--r--gcc/config/arm/arm.opt14
-rw-r--r--gcc/config/arm/arm1020e.md388
-rw-r--r--gcc/config/arm/ieee754-df.S10
-rw-r--r--gcc/config/arm/ieee754-sf.S12
-rw-r--r--gcc/config/arm/semi.h2
-rw-r--r--gcc/config/arm/t-arm1
-rw-r--r--gcc/config/arm/vfp.md66
-rw-r--r--gcc/config/avr/avr.c34
-rw-r--r--gcc/config/avr/avr.opt4
-rw-r--r--gcc/config/bfin/bfin.c81
-rw-r--r--gcc/config/bfin/bfin.h5
-rw-r--r--gcc/config/bfin/bfin.md16
-rw-r--r--gcc/config/bfin/bfin.opt6
-rw-r--r--gcc/config/bfin/predicates.md2
-rw-r--r--gcc/config/bfin/uclinux.h10
-rw-r--r--gcc/config/c4x/c4x-c.c2
-rw-r--r--gcc/config/c4x/c4x.c7
-rw-r--r--gcc/config/c4x/c4x.h4
-rw-r--r--gcc/config/c4x/c4x.opt2
-rw-r--r--gcc/config/cris/aout.h4
-rw-r--r--gcc/config/cris/aout.opt4
-rw-r--r--gcc/config/cris/cris.c26
-rw-r--r--gcc/config/cris/cris.h14
-rw-r--r--gcc/config/cris/cris.opt10
-rw-r--r--gcc/config/darwin-c.c2
-rw-r--r--gcc/config/darwin-protos.h1
-rw-r--r--gcc/config/darwin.c18
-rw-r--r--gcc/config/darwin.h3
-rw-r--r--gcc/config/frv/frv-protos.h1
-rw-r--r--gcc/config/frv/frv.c19
-rw-r--r--gcc/config/frv/frv.h22
-rw-r--r--gcc/config/frv/frv.md2
-rw-r--r--gcc/config/h8300/h8300.c8
-rw-r--r--gcc/config/i386/cygming.h4
-rw-r--r--gcc/config/i386/emmintrin.h35
-rw-r--r--gcc/config/i386/i386-protos.h7
-rw-r--r--gcc/config/i386/i386.c282
-rw-r--r--gcc/config/i386/i386.h63
-rw-r--r--gcc/config/i386/i386.md182
-rw-r--r--gcc/config/i386/i386.opt24
-rw-r--r--gcc/config/i386/sse.md2
-rw-r--r--gcc/config/i386/winnt.c7
-rw-r--r--gcc/config/i386/x86-64.h9
-rw-r--r--gcc/config/i386/xmmintrin.h10
-rw-r--r--gcc/config/ia64/ia64-protos.h2
-rw-r--r--gcc/config/ia64/ia64.c102
-rw-r--r--gcc/config/ia64/ia64.h35
-rw-r--r--gcc/config/ia64/ia64.opt2
-rw-r--r--gcc/config/ia64/ia64intrin.h93
-rw-r--r--gcc/config/ia64/vect.md37
-rw-r--r--gcc/config/ip2k/ip2k.c5
-rw-r--r--gcc/config/m32r/m32r-protos.h2
-rw-r--r--gcc/config/m32r/m32r.c32
-rw-r--r--gcc/config/m32r/m32r.h4
-rw-r--r--gcc/config/m32r/m32r.md8
-rw-r--r--gcc/config/m32r/m32r.opt4
-rw-r--r--gcc/config/m68hc11/m68hc11.c12
-rw-r--r--gcc/config/m68hc11/m68hc11.h2
-rw-r--r--gcc/config/m68k/m68k-none.h4
-rw-r--r--gcc/config/m68k/m68k.c2
-rw-r--r--gcc/config/mcore/mcore.c4
-rw-r--r--gcc/config/mips/mips-protos.h3
-rw-r--r--gcc/config/mips/mips.c798
-rw-r--r--gcc/config/mips/mips.h44
-rw-r--r--gcc/config/mips/mips.md76
-rw-r--r--gcc/config/mips/mips.opt10
-rw-r--r--gcc/config/mmix/mmix.h2
-rw-r--r--gcc/config/mmix/mmix.md8
-rw-r--r--gcc/config/ns32k/ns32k.c2
-rw-r--r--gcc/config/rs6000/aix52.h1
-rw-r--r--gcc/config/rs6000/darwin-ldouble.c2
-rw-r--r--gcc/config/rs6000/eabispe.h2
-rw-r--r--gcc/config/rs6000/host-darwin.c2
-rw-r--r--gcc/config/rs6000/linux.h5
-rw-r--r--gcc/config/rs6000/linux64.h14
-rw-r--r--gcc/config/rs6000/linuxspe.h10
-rw-r--r--gcc/config/rs6000/lynx.h4
-rw-r--r--gcc/config/rs6000/predicates.md107
-rw-r--r--gcc/config/rs6000/rs6000-c.c10
-rw-r--r--gcc/config/rs6000/rs6000-protos.h3
-rw-r--r--gcc/config/rs6000/rs6000.c343
-rw-r--r--gcc/config/rs6000/rs6000.h24
-rw-r--r--gcc/config/rs6000/rs6000.md1341
-rw-r--r--gcc/config/rs6000/rs6000.opt6
-rw-r--r--gcc/config/rs6000/secureplt.h21
-rw-r--r--gcc/config/rs6000/sysv4.h26
-rw-r--r--gcc/config/rs6000/sysv4.opt8
-rw-r--r--gcc/config/rs6000/t-rtems35
-rw-r--r--gcc/config/rs6000/tramp.asm10
-rw-r--r--gcc/config/s390/2064.md5
-rw-r--r--gcc/config/s390/2084.md5
-rw-r--r--gcc/config/s390/s390-protos.h1
-rw-r--r--gcc/config/s390/s390.c261
-rw-r--r--gcc/config/s390/s390.h9
-rw-r--r--gcc/config/s390/s390.md86
-rw-r--r--gcc/config/s390/s390.opt2
-rw-r--r--gcc/config/sh/elf.h2
-rw-r--r--gcc/config/sh/linux-unwind.h94
-rw-r--r--gcc/config/sh/linux.h63
-rw-r--r--gcc/config/sh/predicates.md880
-rw-r--r--gcc/config/sh/sh-protos.h1
-rw-r--r--gcc/config/sh/sh.c866
-rw-r--r--gcc/config/sh/sh.h96
-rw-r--r--gcc/config/sh/sh.md6
-rw-r--r--gcc/config/sh/sh.opt20
-rw-r--r--gcc/config/sh/symbian-pre.h2
-rw-r--r--gcc/config/sh/symbian.c10
-rw-r--r--gcc/config/sh/ushmedia.h4
-rw-r--r--gcc/config/sol2-c.c2
-rw-r--r--gcc/config/sparc/predicates.md22
-rw-r--r--gcc/config/sparc/sol2-gas.h8
-rw-r--r--gcc/config/sparc/sol2.h2
-rw-r--r--gcc/config/sparc/sparc-protos.h6
-rw-r--r--gcc/config/sparc/sparc.c456
-rw-r--r--gcc/config/sparc/sparc.h13
-rw-r--r--gcc/config/sparc/sparc.md430
-rw-r--r--gcc/config/sparc/sparc.opt2
-rw-r--r--gcc/config/stormy16/stormy-abi2
-rw-r--r--gcc/config/stormy16/stormy16.c8
-rw-r--r--gcc/config/v850/v850.c2
-rwxr-xr-xgcc/configure659
-rw-r--r--gcc/configure.ac42
-rw-r--r--gcc/convert.c31
-rw-r--r--gcc/cp/ChangeLog373
-rw-r--r--gcc/cp/ChangeLog-19942
-rw-r--r--gcc/cp/ChangeLog-1999368
-rw-r--r--gcc/cp/ChangeLog-200379
-rw-r--r--gcc/cp/ChangeLog-20042
-rw-r--r--gcc/cp/ChangeLog.tree-ssa12
-rw-r--r--gcc/cp/Make-lang.in62
-rw-r--r--gcc/cp/NEWS52
-rw-r--r--gcc/cp/call.c698
-rw-r--r--gcc/cp/class.c933
-rw-r--r--gcc/cp/config-lang.in4
-rw-r--r--gcc/cp/cp-gimplify.c14
-rw-r--r--gcc/cp/cp-objcp-common.c24
-rw-r--r--gcc/cp/cp-tree.def64
-rw-r--r--gcc/cp/cp-tree.h1071
-rw-r--r--gcc/cp/cvt.c209
-rw-r--r--gcc/cp/cxx-pretty-print.c466
-rw-r--r--gcc/cp/cxx-pretty-print.h32
-rw-r--r--gcc/cp/decl.c842
-rw-r--r--gcc/cp/decl.h4
-rw-r--r--gcc/cp/decl2.c359
-rw-r--r--gcc/cp/dump.c82
-rw-r--r--gcc/cp/error.c482
-rw-r--r--gcc/cp/except.c89
-rw-r--r--gcc/cp/expr.c4
-rw-r--r--gcc/cp/friend.c46
-rw-r--r--gcc/cp/g++spec.c12
-rw-r--r--gcc/cp/init.c208
-rw-r--r--gcc/cp/lang-specs.h2
-rw-r--r--gcc/cp/lex.c18
-rw-r--r--gcc/cp/mangle.c443
-rw-r--r--gcc/cp/method.c230
-rw-r--r--gcc/cp/name-lookup.c606
-rw-r--r--gcc/cp/name-lookup.h27
-rw-r--r--gcc/cp/operators.def16
-rw-r--r--gcc/cp/optimize.c7
-rw-r--r--gcc/cp/parser.c666
-rw-r--r--gcc/cp/pt.c1914
-rw-r--r--gcc/cp/ptree.c2
-rw-r--r--gcc/cp/repo.c4
-rw-r--r--gcc/cp/rtti.c636
-rw-r--r--gcc/cp/search.c267
-rw-r--r--gcc/cp/semantics.c320
-rw-r--r--gcc/cp/tree.c96
-rw-r--r--gcc/cp/typeck.c769
-rw-r--r--gcc/cp/typeck2.c160
-rw-r--r--gcc/dbxout.c4
-rw-r--r--gcc/ddg.c45
-rw-r--r--gcc/df.c61
-rw-r--r--gcc/df.h11
-rw-r--r--gcc/diagnostic.c64
-rw-r--r--gcc/doc/c-tree.texi21
-rw-r--r--gcc/doc/extend.texi33
-rw-r--r--gcc/doc/install.texi56
-rw-r--r--gcc/doc/invoke.texi105
-rw-r--r--gcc/doc/md.texi10
-rw-r--r--gcc/doc/options.texi29
-rw-r--r--gcc/doc/passes.texi3
-rw-r--r--gcc/doc/rtl.texi11
-rw-r--r--gcc/doc/tm.texi210
-rw-r--r--gcc/doc/tree-ssa.texi10
-rw-r--r--gcc/dominance.c8
-rw-r--r--gcc/domwalk.c33
-rw-r--r--gcc/domwalk.h8
-rw-r--r--gcc/dwarf2out.c78
-rw-r--r--gcc/errors.h8
-rw-r--r--gcc/except.c39
-rw-r--r--gcc/except.h4
-rw-r--r--gcc/expmed.c2
-rw-r--r--gcc/expr.c39
-rw-r--r--gcc/expr.h2
-rw-r--r--gcc/final.c6
-rw-r--r--gcc/flags.h5
-rw-r--r--gcc/flow.c44
-rw-r--r--gcc/fold-const.c244
-rw-r--r--gcc/fortran/ChangeLog230
-rw-r--r--gcc/fortran/Make-lang.in8
-rw-r--r--gcc/fortran/arith.c62
-rw-r--r--gcc/fortran/arith.h2
-rw-r--r--gcc/fortran/array.c6
-rw-r--r--gcc/fortran/data.c4
-rw-r--r--gcc/fortran/error.c2
-rw-r--r--gcc/fortran/gfortran.h13
-rw-r--r--gcc/fortran/gfortran.texi92
-rw-r--r--gcc/fortran/intrinsic.c44
-rw-r--r--gcc/fortran/intrinsic.texi1227
-rw-r--r--gcc/fortran/invoke.texi8
-rw-r--r--gcc/fortran/io.c28
-rw-r--r--gcc/fortran/lang.opt4
-rw-r--r--gcc/fortran/match.c4
-rw-r--r--gcc/fortran/options.c20
-rw-r--r--gcc/fortran/parse.c2
-rw-r--r--gcc/fortran/resolve.c64
-rw-r--r--gcc/fortran/simplify.c17
-rw-r--r--gcc/fortran/trans-array.c184
-rw-r--r--gcc/fortran/trans-array.h6
-rw-r--r--gcc/fortran/trans-decl.c7
-rw-r--r--gcc/fortran/trans-expr.c178
-rw-r--r--gcc/fortran/trans-intrinsic.c6
-rw-r--r--gcc/fortran/trans-stmt.c90
-rw-r--r--gcc/fortran/trans-types.c144
-rw-r--r--gcc/fortran/trans.c6
-rw-r--r--gcc/fortran/trans.h9
-rw-r--r--gcc/function.c86
-rw-r--r--gcc/function.h3
-rw-r--r--gcc/gcc.c66
-rw-r--r--gcc/gcov.c6
-rw-r--r--gcc/gcse.c99
-rw-r--r--gcc/genemit.c1
-rw-r--r--gcc/genflags.c2
-rw-r--r--gcc/genmodes.c39
-rw-r--r--gcc/genpreds.c2
-rw-r--r--gcc/ggc-page.c2
-rw-r--r--gcc/ggc-zone.c2
-rw-r--r--gcc/gimple-low.c1
-rw-r--r--gcc/gimplify.c287
-rw-r--r--gcc/global.c4
-rw-r--r--gcc/gthr-posix.h1
-rw-r--r--gcc/hooks.c7
-rw-r--r--gcc/hooks.h1
-rw-r--r--gcc/ifcvt.c176
-rw-r--r--gcc/integrate.c1
-rw-r--r--gcc/intl.h4
-rw-r--r--gcc/ipa-inline.c408
-rw-r--r--gcc/java/ChangeLog189
-rw-r--r--gcc/java/Make-lang.in6
-rw-r--r--gcc/java/builtins.c1
-rw-r--r--gcc/java/class.c161
-rw-r--r--gcc/java/constants.c1
-rw-r--r--gcc/java/decl.c104
-rw-r--r--gcc/java/expr.c11
-rw-r--r--gcc/java/gjavah.c13
-rw-r--r--gcc/java/java-tree.h47
-rw-r--r--gcc/java/jcf-parse.c15
-rw-r--r--gcc/java/jcf-write.c2
-rw-r--r--gcc/java/jv-scan.c28
-rw-r--r--gcc/java/lang.c3
-rw-r--r--gcc/java/mangle.c124
-rw-r--r--gcc/java/parse.h4
-rw-r--r--gcc/java/parse.y431
-rw-r--r--gcc/java/resource.c1
-rw-r--r--gcc/java/typeck.c3
-rw-r--r--gcc/java/verify-glue.c2
-rw-r--r--gcc/java/verify-impl.c13
-rw-r--r--gcc/lambda-code.c211
-rw-r--r--gcc/lambda-trans.c1
-rw-r--r--gcc/lcm.c673
-rw-r--r--gcc/local-alloc.c186
-rw-r--r--gcc/longlong.h4
-rw-r--r--gcc/loop-doloop.c71
-rw-r--r--gcc/loop-iv.c6
-rw-r--r--gcc/loop-unroll.c16
-rw-r--r--gcc/loop-unswitch.c6
-rw-r--r--gcc/loop.c2
-rw-r--r--gcc/machmode.h3
-rw-r--r--gcc/mode-switching.c711
-rw-r--r--gcc/modulo-sched.c118
-rw-r--r--gcc/objc/ChangeLog58
-rw-r--r--gcc/objc/objc-act.c963
-rw-r--r--gcc/objc/objc-act.h3
-rw-r--r--gcc/objc/objc-lang.c2
-rw-r--r--gcc/objcp/ChangeLog15
-rw-r--r--gcc/objcp/objcp-decl.c15
-rw-r--r--gcc/objcp/objcp-decl.h3
-rw-r--r--gcc/objcp/objcp-lang.c2
-rw-r--r--gcc/opt-functions.awk49
-rw-r--r--gcc/optabs.c1
-rw-r--r--gcc/optc-gen.awk17
-rw-r--r--gcc/opth-gen.awk9
-rw-r--r--gcc/opts.c112
-rw-r--r--gcc/opts.h22
-rw-r--r--gcc/passes.c3
-rw-r--r--gcc/po/ChangeLog16
-rw-r--r--gcc/po/exgettext55
-rw-r--r--gcc/po/gcc.pot25683
-rw-r--r--gcc/po/sv.po37
-rw-r--r--gcc/postreload-gcse.c2
-rw-r--r--gcc/predict.c54
-rw-r--r--gcc/profile.c1
-rw-r--r--gcc/protoize.c6
-rw-r--r--gcc/read-rtl.c26
-rw-r--r--gcc/reg-stack.c584
-rw-r--r--gcc/reload.h7
-rw-r--r--gcc/reload1.c193
-rw-r--r--gcc/rtl-error.c12
-rw-r--r--gcc/rtl.c6
-rw-r--r--gcc/rtl.h3
-rw-r--r--gcc/rtlanal.c110
-rw-r--r--gcc/sbitmap.c4
-rw-r--r--gcc/sbitmap.h111
-rw-r--r--gcc/sched-rgn.c13
-rw-r--r--gcc/simplify-rtx.c43
-rw-r--r--gcc/stmt.c11
-rw-r--r--gcc/stor-layout.c21
-rw-r--r--gcc/stringpool.c2
-rw-r--r--gcc/stub-objc.c19
-rw-r--r--gcc/system.h5
-rw-r--r--gcc/target-def.h14
-rw-r--r--gcc/target.h12
-rw-r--r--gcc/targhooks.c24
-rw-r--r--gcc/targhooks.h2
-rw-r--r--gcc/testsuite/ChangeLog965
-rw-r--r--gcc/testsuite/ada/acats/tests/c3/c352001.a270
-rw-r--r--gcc/testsuite/g++.dg/abi/bitfield3.C4
-rw-r--r--gcc/testsuite/g++.dg/abi/bitfield8.C5
-rw-r--r--gcc/testsuite/g++.dg/abi/bitfield9.C3
-rw-r--r--gcc/testsuite/g++.dg/abi/dtor1.C4
-rw-r--r--gcc/testsuite/g++.dg/abi/empty10.C4
-rw-r--r--gcc/testsuite/g++.dg/abi/empty7.C4
-rw-r--r--gcc/testsuite/g++.dg/abi/empty9.C4
-rw-r--r--gcc/testsuite/g++.dg/abi/layout3.C4
-rw-r--r--gcc/testsuite/g++.dg/abi/layout4.C4
-rw-r--r--gcc/testsuite/g++.dg/abi/thunk1.C5
-rw-r--r--gcc/testsuite/g++.dg/abi/thunk2.C4
-rw-r--r--gcc/testsuite/g++.dg/abi/vbase11.C4
-rw-r--r--gcc/testsuite/g++.dg/abi/vthunk2.C4
-rw-r--r--gcc/testsuite/g++.dg/abi/vthunk3.C4
-rw-r--r--gcc/testsuite/g++.dg/charset/asm2.c2
-rw-r--r--gcc/testsuite/g++.dg/conversion/simd2.C16
-rw-r--r--gcc/testsuite/g++.dg/conversion/simd3.C15
-rw-r--r--gcc/testsuite/g++.dg/eh/simd-1.C1
-rw-r--r--gcc/testsuite/g++.dg/eh/simd-2.C1
-rw-r--r--gcc/testsuite/g++.dg/expr/ptrmem6.C12
-rw-r--r--gcc/testsuite/g++.dg/expr/ptrmem6a.C9
-rw-r--r--gcc/testsuite/g++.dg/expr/static_cast6.C15
-rw-r--r--gcc/testsuite/g++.dg/ext/attrib8.C4
-rw-r--r--gcc/testsuite/g++.dg/ext/builtin9.C3
-rw-r--r--gcc/testsuite/g++.dg/ext/label4.C6
-rw-r--r--gcc/testsuite/g++.dg/inherit/ptrmem3.C17
-rw-r--r--gcc/testsuite/g++.dg/inherit/using4.C14
-rw-r--r--gcc/testsuite/g++.dg/inherit/using5.C17
-rw-r--r--gcc/testsuite/g++.dg/inherit/using6.C15
-rw-r--r--gcc/testsuite/g++.dg/init/ctor4.C4
-rw-r--r--gcc/testsuite/g++.dg/init/ctor5.C17
-rw-r--r--gcc/testsuite/g++.dg/init/ctor6.C20
-rw-r--r--gcc/testsuite/g++.dg/init/member1.C18
-rw-r--r--gcc/testsuite/g++.dg/lookup/using14.C9
-rw-r--r--gcc/testsuite/g++.dg/opt/complex1.C9
-rw-r--r--gcc/testsuite/g++.dg/opt/crossjump1.C3
-rw-r--r--gcc/testsuite/g++.dg/opt/cse2.C2
-rw-r--r--gcc/testsuite/g++.dg/opt/interface2.C19
-rw-r--r--gcc/testsuite/g++.dg/opt/interface2.h11
-rw-r--r--gcc/testsuite/g++.dg/opt/longbranch2.C5
-rw-r--r--gcc/testsuite/g++.dg/opt/mmx1.C3
-rw-r--r--gcc/testsuite/g++.dg/opt/pr20931.C13
-rw-r--r--gcc/testsuite/g++.dg/opt/reg-stack4.C4
-rw-r--r--gcc/testsuite/g++.dg/other/big-struct.C3
-rw-r--r--gcc/testsuite/g++.dg/other/crash-4.C19
-rw-r--r--gcc/testsuite/g++.dg/other/error10.C15
-rw-r--r--gcc/testsuite/g++.dg/other/stdarg3.C2
-rw-r--r--gcc/testsuite/g++.dg/overload/error1.C4
-rw-r--r--gcc/testsuite/g++.dg/parse/crash11.C2
-rw-r--r--gcc/testsuite/g++.dg/parse/crash26.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg10.C11
-rw-r--r--gcc/testsuite/g++.dg/parse/defarg9.C20
-rw-r--r--gcc/testsuite/g++.dg/parse/template16.C15
-rw-r--r--gcc/testsuite/g++.dg/pch/local-1.C6
-rw-r--r--gcc/testsuite/g++.dg/pch/local-1.Hs7
-rw-r--r--gcc/testsuite/g++.dg/template/init5.C11
-rw-r--r--gcc/testsuite/g++.dg/template/new2.C14
-rw-r--r--gcc/testsuite/g++.dg/template/ptrmem15.C9
-rw-r--r--gcc/testsuite/g++.dg/template/spec24.C22
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr22005.C10
-rw-r--r--gcc/testsuite/g++.dg/vect/pr21734_1.cc20
-rw-r--r--gcc/testsuite/g++.dg/vect/pr21734_2.cc16
-rw-r--r--gcc/testsuite/g++.dg/warn/register-var-1.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.benjamin/warn02.C8
-rw-r--r--gcc/testsuite/g++.old-deja/g++.bob/inherit2.C6
-rw-r--r--gcc/testsuite/g++.old-deja/g++.brendan/arm2.C8
-rw-r--r--gcc/testsuite/g++.old-deja/g++.bugs/900205_04.C4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.eh/badalloc1.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.ext/asmspec1.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.ext/attrib1.C4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.ext/attrib2.C4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.ext/attrib3.C4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.jason/opeq3.C4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.jason/thunk3.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/redecl2.C8
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/redecl4.C4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/regstack.C2
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/store-expr1.C4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/store-expr2.C4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/assign1.C6
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/crash20.C13
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/memtemp78.C12
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20050423-1.c16
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20050520-1.c13
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr21293.c12
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr21562.c25
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr21638.c21
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr21761.c9
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr21839.c12
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20020720-1.x3
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20050604-1.c39
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20050607-1.c16
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/ieee/ieee.exp5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr21331.c15
-rw-r--r--gcc/testsuite/gcc.dg/20000609-1.c5
-rw-r--r--gcc/testsuite/gcc.dg/20000614-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/20000720-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/20000807-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/20000904-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/20001127-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/20010202-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/20010520-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/20011009-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/20011029-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/20011107-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/20011119-1.c5
-rw-r--r--gcc/testsuite/gcc.dg/20020108-1.c5
-rw-r--r--gcc/testsuite/gcc.dg/20020122-2.c4
-rw-r--r--gcc/testsuite/gcc.dg/20020122-3.c4
-rw-r--r--gcc/testsuite/gcc.dg/20020201-3.c4
-rw-r--r--gcc/testsuite/gcc.dg/20020206-1.c5
-rw-r--r--gcc/testsuite/gcc.dg/20020218-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/20020224-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/20020310-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/20020411-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/20020418-2.c4
-rw-r--r--gcc/testsuite/gcc.dg/20020426-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/20020426-2.c4
-rw-r--r--gcc/testsuite/gcc.dg/20020517-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/20020523-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/20020523-2.c4
-rw-r--r--gcc/testsuite/gcc.dg/20020531-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/20020616-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/20020729-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/20030204-1.c5
-rw-r--r--gcc/testsuite/gcc.dg/20030826-2.c4
-rw-r--r--gcc/testsuite/gcc.dg/20030926-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/20031202-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/20050524-1.c34
-rw-r--r--gcc/testsuite/gcc.dg/20050527-1.c55
-rw-r--r--gcc/testsuite/gcc.dg/20050603-1.c24
-rw-r--r--gcc/testsuite/gcc.dg/20050603-2.c21
-rw-r--r--gcc/testsuite/gcc.dg/20050603-3.c15
-rw-r--r--gcc/testsuite/gcc.dg/20050607-1.c13
-rw-r--r--gcc/testsuite/gcc.dg/980226-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/980312-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/980313-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/980414-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/980520-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/980709-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/990117-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/990130-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/990213-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/990214-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/990424-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/990524-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/991129-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/991209-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/991214-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/991230-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/Wattributes-1.c6
-rw-r--r--gcc/testsuite/gcc.dg/Wattributes-2.c6
-rw-r--r--gcc/testsuite/gcc.dg/Wattributes-3.c5
-rw-r--r--gcc/testsuite/gcc.dg/Wcxx-compat-1.c11
-rw-r--r--gcc/testsuite/gcc.dg/alias-8.c12
-rw-r--r--gcc/testsuite/gcc.dg/altivec-vec-merge.c (renamed from gcc/testsuite/gcc.dg/ppc-vec-merge.c)7
-rw-r--r--gcc/testsuite/gcc.dg/asm-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/attr-returns_twice-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/builtins-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/c99-math-double-1.c36
-rw-r--r--gcc/testsuite/gcc.dg/c99-math-float-1.c36
-rw-r--r--gcc/testsuite/gcc.dg/c99-math-long-double-1.c36
-rw-r--r--gcc/testsuite/gcc.dg/c99-math.h222
-rw-r--r--gcc/testsuite/gcc.dg/charset/asm3.c2
-rw-r--r--gcc/testsuite/gcc.dg/clobbers.c2
-rw-r--r--gcc/testsuite/gcc.dg/const-compare.c29
-rw-r--r--gcc/testsuite/gcc.dg/const-elim-1.c8
-rw-r--r--gcc/testsuite/gcc.dg/cpp/trad/num-sign.c2
-rw-r--r--gcc/testsuite/gcc.dg/format/cmn-err-1.c1
-rw-r--r--gcc/testsuite/gcc.dg/i386-387-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-387-2.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-387-3.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-387-4.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-387-5.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-387-6.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-387-7.c2
-rw-r--r--gcc/testsuite/gcc.dg/i386-387-8.c3
-rw-r--r--gcc/testsuite/gcc.dg/i386-3dnowA-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/i386-3dnowA-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/i386-asm-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-asm-2.c3
-rw-r--r--gcc/testsuite/gcc.dg/i386-asm-3.c2
-rw-r--r--gcc/testsuite/gcc.dg/i386-bitfield1.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-bitfield2.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-bitfield3.c2
-rw-r--r--gcc/testsuite/gcc.dg/i386-call-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/i386-loop-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-loop-2.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-loop-3.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-memset-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-pentium4-not-mull.c5
-rw-r--r--gcc/testsuite/gcc.dg/i386-pic-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-regparm.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-signbit-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-signbit-2.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-signbit-3.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-sse-12.c12
-rw-r--r--gcc/testsuite/gcc.dg/i386-sse-5.c5
-rw-r--r--gcc/testsuite/gcc.dg/i386-sse-8.c5
-rw-r--r--gcc/testsuite/gcc.dg/i386-ssefn-1.c3
-rw-r--r--gcc/testsuite/gcc.dg/i386-ssefn-2.c3
-rw-r--r--gcc/testsuite/gcc.dg/i386-ssefn-3.c2
-rw-r--r--gcc/testsuite/gcc.dg/i386-ssefn-4.c2
-rw-r--r--gcc/testsuite/gcc.dg/i386-unroll-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/i386-volatile-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/i386-xorps.c2
-rw-r--r--gcc/testsuite/gcc.dg/init-excess-1.c48
-rw-r--r--gcc/testsuite/gcc.dg/noncompile/20040203-3.c2
-rw-r--r--gcc/testsuite/gcc.dg/ppc-vector-memcpy.c2
-rw-r--r--gcc/testsuite/gcc.dg/ppc64-abi-2.c3
-rw-r--r--gcc/testsuite/gcc.dg/pr12092-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr14289-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr14796-1.c24
-rw-r--r--gcc/testsuite/gcc.dg/pr14796-2.c22
-rw-r--r--gcc/testsuite/gcc.dg/pr19236-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr20204.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr21709-1.c6
-rw-r--r--gcc/testsuite/gcc.dg/pr21858.c15
-rw-r--r--gcc/testsuite/gcc.dg/pr9771-1.c3
-rw-r--r--gcc/testsuite/gcc.dg/pr9814-1.c107
-rw-r--r--gcc/testsuite/gcc.dg/register-var-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/setjmp-2.c5
-rw-r--r--gcc/testsuite/gcc.dg/short-compare-1.c2
-rw-r--r--gcc/testsuite/gcc.dg/short-compare-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/sibcall-5.c3
-rw-r--r--gcc/testsuite/gcc.dg/simd-1.c8
-rw-r--r--gcc/testsuite/gcc.dg/simd-1b.c24
-rw-r--r--gcc/testsuite/gcc.dg/simd-2.c13
-rw-r--r--gcc/testsuite/gcc.dg/simd-3.c16
-rw-r--r--gcc/testsuite/gcc.dg/simd-4.c15
-rw-r--r--gcc/testsuite/gcc.dg/sync-2.c101
-rw-r--r--gcc/testsuite/gcc.dg/tls/debug-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/tls/opt-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/tls/opt-2.c4
-rw-r--r--gcc/testsuite/gcc.dg/torture/builtin-attr-1.c4
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr21817-1.c12
-rw-r--r--gcc/testsuite/gcc.dg/tree-prof/inliner-1.c37
-rw-r--r--gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp53
-rw-r--r--gcc/testsuite/gcc.dg/tree-prof/val-prof-1.c20
-rw-r--r--gcc/testsuite/gcc.dg/tree-prof/val-prof-2.c30
-rw-r--r--gcc/testsuite/gcc.dg/tree-prof/val-prof-3.c30
-rw-r--r--gcc/testsuite/gcc.dg/tree-prof/val-prof-4.c30
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/20030807-10.c8
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/20030807-6.c14
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/20040514-2.c7
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/foldaddr-1.c16
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11a.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11b.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11c.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/gen-vect-2.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/gen-vect-25.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/gen-vect-32.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/loop-2.c7
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/loop-3.c3
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/loop-4.c6
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/loop-7.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/loop-9.c24
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr14341.c16
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr14841.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr20701.c30
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr21029.c118
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr21086.c19
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr21090.c23
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr21332.c28
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr21458.c20
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr21582.c28
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr21658.c21
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr21985.c32
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr22018.c32
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/reassoc-1.c18
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/reassoc-2.c18
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-14.c14
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/stdarg-2.c15
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/stdarg-3.c11
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/stdarg-4.c4
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/stdarg-5.c7
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp01.c28
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp02.c24
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp03.c35
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp04.c13
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp05.c20
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp06.c31
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp07.c36
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp08.c23
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp09.c31
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp10.c25
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp11.c20
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp12.c23
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp13.c258
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp14.c46
-rw-r--r--gcc/testsuite/gcc.dg/uninit-4.c2
-rw-r--r--gcc/testsuite/gcc.dg/uninit-9.c2
-rw-r--r--gcc/testsuite/gcc.dg/unroll-1.c5
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-106.c40
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-107.c42
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-108.c40
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-109.c44
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-110.c40
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-111.c38
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-112.c38
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-113.c36
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-114.c39
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-62.c7
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-7.c4
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-77.c4
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-78.c4
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-91.c70
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-dv-2.c3
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-ifcvt-1.c74
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-none.c191
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-1.c56
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-2.c54
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-3.c41
-rw-r--r--gcc/testsuite/gcc.dg/wtypequal.c7
-rw-r--r--gcc/testsuite/gcc.misc-tests/i386-pf-3dnow-1.c4
-rw-r--r--gcc/testsuite/gcc.misc-tests/i386-pf-athlon-1.c4
-rw-r--r--gcc/testsuite/gcc.misc-tests/i386-pf-none-1.c4
-rw-r--r--gcc/testsuite/gcc.misc-tests/i386-pf-sse-1.c4
-rw-r--r--gcc/testsuite/gcc.target/i386/i386.exp2
-rw-r--r--gcc/testsuite/gcc.target/i386/movq.c8
-rw-r--r--gcc/testsuite/gcc.target/mips/ext_ins.c26
-rw-r--r--gcc/testsuite/gcc.target/mips/mips16e-extends.c21
-rw-r--r--gcc/testsuite/gcc.target/sparc/fexpand-2.c11
-rw-r--r--gcc/testsuite/gcc.target/sparc/fpmerge-2.c15
-rw-r--r--gcc/testsuite/gcc.target/sparc/fpmul-2.c47
-rw-r--r--gcc/testsuite/gcc.target/sparc/noresult.c10
-rw-r--r--gcc/testsuite/gcc.target/sparc/pdist-2.c18
-rw-r--r--gcc/testsuite/gcc.target/sparc/pdist-3.c36
-rw-r--r--gcc/testsuite/gfortran.dg/altreturn_1.f907
-rw-r--r--gcc/testsuite/gfortran.dg/array_constructor_3.f905
-rw-r--r--gcc/testsuite/gfortran.dg/array_constructor_4.f9023
-rw-r--r--gcc/testsuite/gfortran.dg/assign_2.f902
-rw-r--r--gcc/testsuite/gfortran.dg/assign_4.f904
-rwxr-xr-xgcc/testsuite/gfortran.dg/char_array_structure_constructor.f9028
-rwxr-xr-xgcc/testsuite/gfortran.dg/char_initialiser_actual.f9027
-rw-r--r--gcc/testsuite/gfortran.dg/char_pointer_assign.f9041
-rwxr-xr-xgcc/testsuite/gfortran.dg/char_pointer_comp_assign.f9031
-rw-r--r--gcc/testsuite/gfortran.dg/char_pointer_dependency.f9024
-rw-r--r--gcc/testsuite/gfortran.dg/char_pointer_dummy.f9033
-rw-r--r--gcc/testsuite/gfortran.dg/char_pointer_func.f9042
-rw-r--r--gcc/testsuite/gfortran.dg/deallocate_stat.f9077
-rw-r--r--gcc/testsuite/gfortran.dg/debug_1.f9020
-rw-r--r--gcc/testsuite/gfortran.dg/dollar_edit_descriptor-1.f13
-rwxr-xr-xgcc/testsuite/gfortran.dg/f2c_4.c9
-rwxr-xr-xgcc/testsuite/gfortran.dg/f2c_4.f9014
-rwxr-xr-xgcc/testsuite/gfortran.dg/f2c_5.c9
-rwxr-xr-xgcc/testsuite/gfortran.dg/f2c_5.f9012
-rw-r--r--gcc/testsuite/gfortran.dg/f2c_7.f9057
-rw-r--r--gcc/testsuite/gfortran.dg/forall_1.f9028
-rw-r--r--gcc/testsuite/gfortran.dg/implicit_5.f9022
-rw-r--r--gcc/testsuite/gfortran.dg/inquire_8.f9010
-rw-r--r--gcc/testsuite/gfortran.dg/logint-1.f43
-rw-r--r--gcc/testsuite/gfortran.dg/logint-2.f43
-rw-r--r--gcc/testsuite/gfortran.dg/logint-3.f43
-rw-r--r--gcc/testsuite/gfortran.dg/output_exponents_1.f9013
-rw-r--r--gcc/testsuite/gfortran.dg/pr19155.f5
-rw-r--r--gcc/testsuite/gfortran.dg/promotion.f903
-rw-r--r--gcc/testsuite/gfortran.dg/reshape-complex.f905
-rw-r--r--gcc/testsuite/gfortran.dg/ret_pointer_1.f905
-rw-r--r--gcc/testsuite/gfortran.dg/subnormal_1.f9011
-rw-r--r--gcc/testsuite/gfortran.dg/vect/vect-4.f9010
-rw-r--r--gcc/testsuite/gfortran.fortran-torture/execute/in-pack.f9092
-rw-r--r--gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_matmul.f908
-rw-r--r--gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_unpack.f904
-rw-r--r--gcc/testsuite/lib/gcc-dg.exp40
-rw-r--r--gcc/testsuite/lib/gfortran.exp2
-rw-r--r--gcc/testsuite/lib/obj-c++-dg.exp28
-rw-r--r--gcc/testsuite/lib/obj-c++.exp366
-rw-r--r--gcc/testsuite/lib/profopt.exp133
-rw-r--r--gcc/testsuite/lib/target-supports.exp46
-rw-r--r--gcc/testsuite/obj-c++.dg/basic.mm21
-rw-r--r--gcc/testsuite/obj-c++.dg/bitfield-1.mm113
-rw-r--r--gcc/testsuite/obj-c++.dg/bitfield-2.mm78
-rw-r--r--gcc/testsuite/obj-c++.dg/bitfield-3.mm57
-rw-r--r--gcc/testsuite/obj-c++.dg/bitfield-4.mm51
-rw-r--r--gcc/testsuite/obj-c++.dg/bitfield-5.mm29
-rw-r--r--gcc/testsuite/obj-c++.dg/class-protocol-1.mm442
-rw-r--r--gcc/testsuite/obj-c++.dg/comp-types-1.mm16
-rw-r--r--gcc/testsuite/obj-c++.dg/comp-types-10.mm19
-rw-r--r--gcc/testsuite/obj-c++.dg/comp-types-11.mm28
-rw-r--r--gcc/testsuite/obj-c++.dg/comp-types-12.mm14
-rw-r--r--gcc/testsuite/obj-c++.dg/comp-types-2.mm88
-rw-r--r--gcc/testsuite/obj-c++.dg/comp-types-3.mm38
-rw-r--r--gcc/testsuite/obj-c++.dg/comp-types-4.mm64
-rw-r--r--gcc/testsuite/obj-c++.dg/comp-types-5.mm74
-rw-r--r--gcc/testsuite/obj-c++.dg/comp-types-6.mm33
-rw-r--r--gcc/testsuite/obj-c++.dg/comp-types-7.mm38
-rw-r--r--gcc/testsuite/obj-c++.dg/comp-types-8.mm33
-rw-r--r--gcc/testsuite/obj-c++.dg/comp-types-9.mm25
-rw-r--r--gcc/testsuite/obj-c++.dg/cxx-class-1.mm18
-rw-r--r--gcc/testsuite/obj-c++.dg/cxx-ivars-1.mm42
-rw-r--r--gcc/testsuite/obj-c++.dg/cxx-ivars-2.mm76
-rw-r--r--gcc/testsuite/obj-c++.dg/cxx-ivars-3.mm46
-rw-r--r--gcc/testsuite/obj-c++.dg/cxx-scope-1.mm53
-rw-r--r--gcc/testsuite/obj-c++.dg/cxx-scope-2.mm19
-rw-r--r--gcc/testsuite/obj-c++.dg/defs.mm43
-rw-r--r--gcc/testsuite/obj-c++.dg/dg.exp37
-rw-r--r--gcc/testsuite/obj-c++.dg/empty-private-1.mm9
-rw-r--r--gcc/testsuite/obj-c++.dg/encode-1.mm23
-rw-r--r--gcc/testsuite/obj-c++.dg/encode-2.mm14
-rw-r--r--gcc/testsuite/obj-c++.dg/encode-3.mm30
-rw-r--r--gcc/testsuite/obj-c++.dg/encode-4.mm105
-rw-r--r--gcc/testsuite/obj-c++.dg/encode-5.mm74
-rw-r--r--gcc/testsuite/obj-c++.dg/encode-6.mm75
-rw-r--r--gcc/testsuite/obj-c++.dg/encode-7.mm78
-rw-r--r--gcc/testsuite/obj-c++.dg/encode-8.mm23
-rw-r--r--gcc/testsuite/obj-c++.dg/extern-c-1.mm18
-rw-r--r--gcc/testsuite/obj-c++.dg/extra-semi.mm10
-rw-r--r--gcc/testsuite/obj-c++.dg/fix-and-continue-2.mm24
-rw-r--r--gcc/testsuite/obj-c++.dg/isa-field-1.mm43
-rw-r--r--gcc/testsuite/obj-c++.dg/ivar-list-semi.mm12
-rw-r--r--gcc/testsuite/obj-c++.dg/layout-1.mm15
-rw-r--r--gcc/testsuite/obj-c++.dg/local-decl-1.mm44
-rw-r--r--gcc/testsuite/obj-c++.dg/lookup-1.mm8
-rw-r--r--gcc/testsuite/obj-c++.dg/lookup-2.mm56
-rw-r--r--gcc/testsuite/obj-c++.dg/method-1.mm30
-rw-r--r--gcc/testsuite/obj-c++.dg/method-10.mm45
-rw-r--r--gcc/testsuite/obj-c++.dg/method-11.mm25
-rw-r--r--gcc/testsuite/obj-c++.dg/method-12.mm31
-rw-r--r--gcc/testsuite/obj-c++.dg/method-13.mm27
-rw-r--r--gcc/testsuite/obj-c++.dg/method-14.mm14
-rw-r--r--gcc/testsuite/obj-c++.dg/method-15.mm43
-rw-r--r--gcc/testsuite/obj-c++.dg/method-16.mm34
-rw-r--r--gcc/testsuite/obj-c++.dg/method-17.mm32
-rw-r--r--gcc/testsuite/obj-c++.dg/method-18.mm25
-rw-r--r--gcc/testsuite/obj-c++.dg/method-19.mm81
-rw-r--r--gcc/testsuite/obj-c++.dg/method-2.mm56
-rw-r--r--gcc/testsuite/obj-c++.dg/method-20.mm17
-rw-r--r--gcc/testsuite/obj-c++.dg/method-21.mm25
-rw-r--r--gcc/testsuite/obj-c++.dg/method-3.mm24
-rw-r--r--gcc/testsuite/obj-c++.dg/method-4.mm24
-rw-r--r--gcc/testsuite/obj-c++.dg/method-5.mm30
-rw-r--r--gcc/testsuite/obj-c++.dg/method-6.mm19
-rw-r--r--gcc/testsuite/obj-c++.dg/method-7.mm21
-rw-r--r--gcc/testsuite/obj-c++.dg/method-8.mm30
-rw-r--r--gcc/testsuite/obj-c++.dg/method-9.mm33
-rw-r--r--gcc/testsuite/obj-c++.dg/no-extra-load.mm24
-rw-r--r--gcc/testsuite/obj-c++.dg/objc-gc-3.mm63
-rw-r--r--gcc/testsuite/obj-c++.dg/overload-1.mm11
-rw-r--r--gcc/testsuite/obj-c++.dg/pragma-1.mm11
-rw-r--r--gcc/testsuite/obj-c++.dg/pragma-2.mm23
-rw-r--r--gcc/testsuite/obj-c++.dg/private-1.mm60
-rw-r--r--gcc/testsuite/obj-c++.dg/private-2.mm56
-rw-r--r--gcc/testsuite/obj-c++.dg/proto-qual-1.mm52
-rw-r--r--gcc/testsuite/obj-c++.dg/qual-types-1.mm68
-rw-r--r--gcc/testsuite/obj-c++.dg/selector-1.mm30
-rw-r--r--gcc/testsuite/obj-c++.dg/selector-2.mm17
-rw-r--r--gcc/testsuite/obj-c++.dg/selector-3.mm26
-rw-r--r--gcc/testsuite/obj-c++.dg/selector-4.mm26
-rw-r--r--gcc/testsuite/obj-c++.dg/stubify-1.mm37
-rw-r--r--gcc/testsuite/obj-c++.dg/stubify-2.mm31
-rw-r--r--gcc/testsuite/obj-c++.dg/super-class-1.mm30
-rw-r--r--gcc/testsuite/obj-c++.dg/super-class-2.mm35
-rw-r--r--gcc/testsuite/obj-c++.dg/super-dealloc-1.mm46
-rw-r--r--gcc/testsuite/obj-c++.dg/super-dealloc-2.mm46
-rw-r--r--gcc/testsuite/obj-c++.dg/template-1.mm49
-rw-r--r--gcc/testsuite/obj-c++.dg/template-2.mm29
-rw-r--r--gcc/testsuite/obj-c++.dg/template-3.mm80
-rw-r--r--gcc/testsuite/obj-c++.dg/template-4.mm81
-rw-r--r--gcc/testsuite/obj-c++.dg/template-5.mm17
-rw-r--r--gcc/testsuite/obj-c++.dg/template-6.mm16
-rw-r--r--gcc/testsuite/obj-c++.dg/try-catch-1.mm42
-rw-r--r--gcc/testsuite/obj-c++.dg/try-catch-10.mm25
-rw-r--r--gcc/testsuite/obj-c++.dg/try-catch-2.mm78
-rw-r--r--gcc/testsuite/obj-c++.dg/try-catch-3.mm18
-rw-r--r--gcc/testsuite/obj-c++.dg/try-catch-4.mm25
-rw-r--r--gcc/testsuite/obj-c++.dg/try-catch-5.mm26
-rw-r--r--gcc/testsuite/obj-c++.dg/try-catch-6.mm14
-rw-r--r--gcc/testsuite/obj-c++.dg/try-catch-7.mm24
-rw-r--r--gcc/testsuite/obj-c++.dg/try-catch-8.mm27
-rw-r--r--gcc/testsuite/obj-c++.dg/try-catch-9.mm65
-rw-r--r--gcc/testsuite/obj-c++.dg/va-meth-1.mm74
-rw-r--r--gcc/testsuite/objc.dg/bitfield-5.m113
-rw-r--r--gcc/testsuite/objc.dg/class-protocol-1.m28
-rw-r--r--gcc/testsuite/objc.dg/comp-types-1.m21
-rw-r--r--gcc/testsuite/objc.dg/comp-types-10.m28
-rw-r--r--gcc/testsuite/objc.dg/comp-types-11.m14
-rw-r--r--gcc/testsuite/objc.dg/comp-types-5.m4
-rw-r--r--gcc/testsuite/objc.dg/comp-types-6.m5
-rw-r--r--gcc/testsuite/objc.dg/comp-types-8.m24
-rw-r--r--gcc/testsuite/objc.dg/comp-types-9.m19
-rw-r--r--gcc/testsuite/objc.dg/encode-6.m22
-rw-r--r--gcc/testsuite/objc.dg/extra-semi.m10
-rw-r--r--gcc/testsuite/objc.dg/fix-and-continue-2.m24
-rw-r--r--gcc/testsuite/objc.dg/isa-field-1.m43
-rw-r--r--gcc/testsuite/objc.dg/layout-1.m15
-rw-r--r--gcc/testsuite/objc.dg/lookup-1.m54
-rw-r--r--gcc/testsuite/objc.dg/method-15.m56
-rw-r--r--gcc/testsuite/objc.dg/method-16.m24
-rw-r--r--gcc/testsuite/objc.dg/method-17.m26
-rw-r--r--gcc/testsuite/objc.dg/method-18.m29
-rw-r--r--gcc/testsuite/objc.dg/method-19.m17
-rw-r--r--gcc/testsuite/objc.dg/method-9.m2
-rw-r--r--gcc/testsuite/objc.dg/next-runtime-1.m18
-rw-r--r--gcc/testsuite/objc.dg/no-extra-load.m6
-rw-r--r--gcc/testsuite/objc.dg/objc-gc-4.m63
-rw-r--r--gcc/testsuite/objc.dg/pragma-1.m23
-rw-r--r--gcc/testsuite/objc.dg/selector-2.m5
-rw-r--r--gcc/testsuite/objc.dg/selector-3.m26
-rw-r--r--gcc/testsuite/objc.dg/selector-4.m30
-rw-r--r--gcc/testsuite/objc.dg/stubify-1.m33
-rw-r--r--gcc/testsuite/objc.dg/stubify-2.m31
-rw-r--r--gcc/testsuite/objc.dg/super-class-4.m34
-rw-r--r--gcc/testsuite/objc.dg/super-dealloc-1.m46
-rw-r--r--gcc/testsuite/objc.dg/super-dealloc-2.m46
-rw-r--r--gcc/testsuite/objc.dg/try-catch-6.m25
-rw-r--r--gcc/testsuite/objc.dg/try-catch-7.m27
-rw-r--r--gcc/testsuite/objc.dg/try-catch-8.m65
-rw-r--r--gcc/testsuite/objc.dg/try-catch-9.m25
-rw-r--r--gcc/testsuite/objc/execute/next_mapping.h25
-rw-r--r--gcc/testsuite/treelang/compile/unsigned.tree6
-rw-r--r--gcc/timevar.c2
-rw-r--r--gcc/timevar.def2
-rw-r--r--gcc/timevar.h2
-rw-r--r--gcc/tlink.c4
-rw-r--r--gcc/toplev.c347
-rw-r--r--gcc/toplev.h2
-rw-r--r--gcc/tree-browser.c1
-rw-r--r--gcc/tree-browser.def2
-rw-r--r--gcc/tree-cfg.c913
-rw-r--r--gcc/tree-cfgcleanup.c756
-rw-r--r--gcc/tree-chrec.c160
-rw-r--r--gcc/tree-chrec.h10
-rw-r--r--gcc/tree-complex.c1403
-rw-r--r--gcc/tree-data-ref.c100
-rw-r--r--gcc/tree-dfa.c2
-rw-r--r--gcc/tree-eh.c20
-rw-r--r--gcc/tree-flow-inline.h16
-rw-r--r--gcc/tree-flow.h147
-rw-r--r--gcc/tree-gimple.c12
-rw-r--r--gcc/tree-if-conv.c3
-rw-r--r--gcc/tree-inline.c170
-rw-r--r--gcc/tree-into-ssa.c53
-rw-r--r--gcc/tree-loop-linear.c1
-rw-r--r--gcc/tree-mudflap.c21
-rw-r--r--gcc/tree-nested.c51
-rw-r--r--gcc/tree-nomudflap.c2
-rw-r--r--gcc/tree-optimize.c18
-rw-r--r--gcc/tree-outof-ssa.c49
-rw-r--r--gcc/tree-pass.h10
-rw-r--r--gcc/tree-phinodes.c6
-rw-r--r--gcc/tree-pretty-print.c62
-rw-r--r--gcc/tree-profile.c6
-rw-r--r--gcc/tree-scalar-evolution.c96
-rw-r--r--gcc/tree-sra.c7
-rw-r--r--gcc/tree-ssa-address.c707
-rw-r--r--gcc/tree-ssa-alias.c169
-rw-r--r--gcc/tree-ssa-ccp.c56
-rw-r--r--gcc/tree-ssa-copy.c18
-rw-r--r--gcc/tree-ssa-copyrename.c2
-rw-r--r--gcc/tree-ssa-dce.c10
-rw-r--r--gcc/tree-ssa-dom.c242
-rw-r--r--gcc/tree-ssa-dse.c11
-rw-r--r--gcc/tree-ssa-forwprop.c17
-rw-r--r--gcc/tree-ssa-live.c21
-rw-r--r--gcc/tree-ssa-loop-im.c24
-rw-r--r--gcc/tree-ssa-loop-ivcanon.c3
-rw-r--r--gcc/tree-ssa-loop-ivopts.c527
-rw-r--r--gcc/tree-ssa-loop-manip.c4
-rw-r--r--gcc/tree-ssa-loop-niter.c293
-rw-r--r--gcc/tree-ssa-loop-unswitch.c2
-rw-r--r--gcc/tree-ssa-operands.c33
-rw-r--r--gcc/tree-ssa-phiopt.c1
-rw-r--r--gcc/tree-ssa-pre.c32
-rw-r--r--gcc/tree-ssa-propagate.c155
-rw-r--r--gcc/tree-ssa-propagate.h35
-rw-r--r--gcc/tree-ssa-reassoc.c638
-rw-r--r--gcc/tree-ssa-sink.c1
-rw-r--r--gcc/tree-ssa-structalias.c3209
-rw-r--r--gcc/tree-ssa-structalias.h37
-rw-r--r--gcc/tree-ssa-threadupdate.c39
-rw-r--r--gcc/tree-ssa-uncprop.c1
-rw-r--r--gcc/tree-ssa.c19
-rw-r--r--gcc/tree-stdarg.c24
-rw-r--r--gcc/tree-vect-analyze.c431
-rw-r--r--gcc/tree-vect-generic.c531
-rw-r--r--gcc/tree-vect-transform.c413
-rw-r--r--gcc/tree-vectorizer.c201
-rw-r--r--gcc/tree-vectorizer.h44
-rw-r--r--gcc/tree-vrp.c2555
-rw-r--r--gcc/tree.c214
-rw-r--r--gcc/tree.def12
-rw-r--r--gcc/tree.h66
-rw-r--r--gcc/treelang/ChangeLog16
-rw-r--r--gcc/treelang/Make-lang.in5
-rw-r--r--gcc/treelang/lex.l2
-rw-r--r--gcc/treelang/parse.y6
-rw-r--r--gcc/treelang/treetree.c11
-rw-r--r--gcc/unwind-compat.c2
-rw-r--r--gcc/unwind-dw2-fde-compat.c2
-rw-r--r--gcc/unwind-dw2-fde-darwin.c5
-rw-r--r--gcc/unwind-dw2-fde-glibc.c6
-rw-r--r--gcc/unwind-dw2-fde.c6
-rw-r--r--gcc/unwind-dw2.c23
-rw-r--r--gcc/unwind-pe.h15
-rw-r--r--gcc/unwind.h3
-rw-r--r--gcc/value-prof.c37
-rw-r--r--gcc/var-tracking.c107
-rw-r--r--gcc/varasm.c37
-rw-r--r--gcc/varray.c6
-rw-r--r--gcc/vec.c2
-rw-r--r--gcc/vec.h154
-rw-r--r--include/ChangeLog35
-rw-r--r--include/ansidecl.h20
-rw-r--r--include/demangle.h3
-rw-r--r--include/libiberty.h17
-rw-r--r--libcpp/ChangeLog98
-rw-r--r--libcpp/Makefile.in52
-rw-r--r--libcpp/aclocal.m42
-rw-r--r--libcpp/charset.c24
-rw-r--r--libcpp/config.in8
-rwxr-xr-xlibcpp/configure389
-rw-r--r--libcpp/configure.ac7
-rw-r--r--libcpp/directives.c69
-rw-r--r--libcpp/expr.c8
-rw-r--r--libcpp/files.c60
-rw-r--r--libcpp/identifiers.c2
-rw-r--r--libcpp/include/cpplib.h25
-rw-r--r--libcpp/init.c6
-rw-r--r--libcpp/lex.c10
-rw-r--r--libcpp/line-map.c2
-rw-r--r--libcpp/macro.c29
-rw-r--r--libcpp/makedepend.c4
-rw-r--r--libcpp/mkdeps.c23
-rw-r--r--libcpp/pch.c34
-rw-r--r--libcpp/po/ChangeLog8
-rw-r--r--libcpp/po/cpplib.pot300
-rw-r--r--libcpp/po/fr.po22
-rw-r--r--libcpp/po/sv.po6901
-rw-r--r--libcpp/symtab.c9
-rw-r--r--libcpp/system.h10
-rw-r--r--libcpp/traditional.c4
-rw-r--r--libffi/ChangeLog17
-rwxr-xr-xlibffi/configure1
-rw-r--r--libffi/configure.ac1
-rw-r--r--libffi/src/mips/n32.S3
-rw-r--r--libffi/src/mips/o32.S3
-rw-r--r--libffi/src/powerpc/ppc_closure.S2
-rw-r--r--libffi/src/powerpc/sysv.S2
-rw-r--r--libgfortran/ChangeLog142
-rw-r--r--libgfortran/Makefile.am8
-rw-r--r--libgfortran/Makefile.in34
-rw-r--r--libgfortran/aclocal.m435
-rw-r--r--libgfortran/c99_protos.h12
-rw-r--r--libgfortran/config.h.in9
-rwxr-xr-xlibgfortran/configure580
-rw-r--r--libgfortran/configure.ac3
-rw-r--r--libgfortran/generated/exp_c4.c4
-rw-r--r--libgfortran/generated/in_pack_c4.c123
-rw-r--r--libgfortran/generated/in_pack_c8.c123
-rw-r--r--libgfortran/generated/in_pack_i4.c2
-rw-r--r--libgfortran/generated/in_pack_i8.c2
-rw-r--r--libgfortran/generated/in_unpack_c4.c111
-rw-r--r--libgfortran/generated/in_unpack_c8.c111
-rw-r--r--libgfortran/generated/in_unpack_i4.c2
-rw-r--r--libgfortran/generated/in_unpack_i8.c2
-rw-r--r--libgfortran/generated/matmul_c4.c9
-rw-r--r--libgfortran/generated/matmul_c8.c9
-rw-r--r--libgfortran/generated/matmul_i4.c9
-rw-r--r--libgfortran/generated/matmul_i8.c9
-rw-r--r--libgfortran/generated/matmul_r4.c9
-rw-r--r--libgfortran/generated/matmul_r8.c9
-rw-r--r--libgfortran/generated/reshape_c4.c6
-rw-r--r--libgfortran/generated/reshape_c8.c6
-rw-r--r--libgfortran/generated/reshape_i4.c6
-rw-r--r--libgfortran/generated/reshape_i8.c6
-rw-r--r--libgfortran/intrinsics/c99_functions.c30
-rw-r--r--libgfortran/intrinsics/unpack_generic.c51
-rw-r--r--libgfortran/io/format.c1
-rw-r--r--libgfortran/io/read.c42
-rw-r--r--libgfortran/io/transfer.c7
-rw-r--r--libgfortran/io/unix.c7
-rw-r--r--libgfortran/io/write.c7
-rw-r--r--libgfortran/libgfortran.h14
-rw-r--r--libgfortran/m4/cexp.m44
-rw-r--r--libgfortran/m4/in_pack.m47
-rw-r--r--libgfortran/m4/in_unpack.m47
-rw-r--r--libgfortran/m4/matmul.m49
-rw-r--r--libgfortran/m4/reshape.m46
-rw-r--r--libgfortran/runtime/in_pack_generic.c43
-rw-r--r--libgfortran/runtime/in_unpack_generic.c47
-rw-r--r--libiberty/ChangeLog88
-rw-r--r--libiberty/alloca.c18
-rw-r--r--libiberty/choose-temp.c2
-rw-r--r--libiberty/concat.c10
-rw-r--r--libiberty/config.in28
-rwxr-xr-xlibiberty/configure632
-rw-r--r--libiberty/configure.ac5
-rw-r--r--libiberty/cp-demangle.c28
-rw-r--r--libiberty/cp-demint.c8
-rw-r--r--libiberty/cplus-dem.c68
-rw-r--r--libiberty/dyn-string.c6
-rw-r--r--libiberty/fnmatch.c10
-rw-r--r--libiberty/getopt.c14
-rw-r--r--libiberty/getpwd.c4
-rw-r--r--libiberty/hashtab.c37
-rw-r--r--libiberty/lrealpath.c2
-rw-r--r--libiberty/make-relative-prefix.c2
-rw-r--r--libiberty/make-temp-file.c22
-rw-r--r--libiberty/mkstemps.c20
-rw-r--r--libiberty/pex-common.c10
-rw-r--r--libiberty/pex-djgpp.c2
-rw-r--r--libiberty/pex-msdos.c6
-rw-r--r--libiberty/pex-unix.c2
-rw-r--r--libiberty/pex-win32.c6
-rw-r--r--libiberty/pexecute.c2
-rw-r--r--libiberty/setenv.c8
-rw-r--r--libiberty/sigsetmask.c8
-rw-r--r--libiberty/sort.c4
-rw-r--r--libiberty/spaces.c2
-rw-r--r--libiberty/strndup.c4
-rw-r--r--libiberty/ternary.c2
-rw-r--r--libiberty/testsuite/demangle-expected4
-rw-r--r--libiberty/xmalloc.c22
-rw-r--r--libiberty/xstrdup.c2
-rw-r--r--libiberty/xstrerror.c23
-rw-r--r--libiberty/xstrndup.c4
-rw-r--r--libjava/ChangeLog280
-rw-r--r--libjava/Makefile.in4
-rw-r--r--libjava/aclocal.m435
-rwxr-xr-xlibjava/configure19
-rw-r--r--libjava/configure.ac11
-rw-r--r--libjava/configure.host26
-rw-r--r--libjava/defineclass.cc3
-rw-r--r--libjava/exception.cc14
-rw-r--r--libjava/external/Makefile.in2
-rw-r--r--libjava/external/sax/Makefile.in2
-rw-r--r--libjava/external/w3c_dom/Makefile.in2
-rw-r--r--libjava/gcj/Makefile.in2
-rw-r--r--libjava/gnu/classpath/jdwp/id/ArrayId.java62
-rw-r--r--libjava/gnu/classpath/jdwp/id/ArrayReferenceTypeId.java59
-rw-r--r--libjava/gnu/classpath/jdwp/id/ClassLoaderId.java64
-rw-r--r--libjava/gnu/classpath/jdwp/id/ClassObjectId.java64
-rw-r--r--libjava/gnu/classpath/jdwp/id/ClassReferenceTypeId.java59
-rw-r--r--libjava/gnu/classpath/jdwp/id/InterfaceReferenceTypeId.java59
-rw-r--r--libjava/gnu/classpath/jdwp/id/JdwpId.java127
-rw-r--r--libjava/gnu/classpath/jdwp/id/JdwpIdFactory.java165
-rw-r--r--libjava/gnu/classpath/jdwp/id/ObjectId.java99
-rw-r--r--libjava/gnu/classpath/jdwp/id/ReferenceTypeId.java81
-rw-r--r--libjava/gnu/classpath/jdwp/id/StringId.java64
-rw-r--r--libjava/gnu/classpath/jdwp/id/ThreadGroupId.java64
-rw-r--r--libjava/gnu/classpath/jdwp/id/ThreadId.java64
-rw-r--r--libjava/gnu/classpath/jdwp/processor/PacketProcessor.java138
-rw-r--r--libjava/gnu/classpath/jdwp/transport/ITransport.java84
-rw-r--r--libjava/gnu/classpath/jdwp/transport/JdwpCommandPacket.java149
-rw-r--r--libjava/gnu/classpath/jdwp/transport/JdwpConnection.java265
-rw-r--r--libjava/gnu/classpath/jdwp/transport/JdwpPacket.java286
-rw-r--r--libjava/gnu/classpath/jdwp/transport/JdwpReplyPacket.java127
-rw-r--r--libjava/gnu/classpath/jdwp/transport/SocketTransport.java171
-rw-r--r--libjava/gnu/classpath/jdwp/transport/TransportException.java75
-rw-r--r--libjava/gnu/classpath/jdwp/transport/TransportFactory.java115
-rw-r--r--libjava/gnu/classpath/jdwp/util/Signature.java135
-rw-r--r--libjava/gnu/gcj/Core.java5
-rw-r--r--libjava/gnu/gcj/natCore.cc9
-rw-r--r--libjava/gnu/gcj/runtime/SystemClassLoader.java1
-rw-r--r--libjava/gnu/java/net/natPlainSocketImplPosix.cc1
-rw-r--r--libjava/gnu/java/net/protocol/http/HTTPURLConnection.java6
-rw-r--r--libjava/gnu/java/nio/channels/natFileChannelPosix.cc11
-rw-r--r--libjava/gnu/regexp/RE.java36
-rw-r--r--libjava/gnu/regexp/RESyntax.java8
-rw-r--r--libjava/gnu/regexp/RETokenRepeated.java13
-rw-r--r--libjava/gnu/xml/dom/ls/SAXEventSink.java17
-rw-r--r--libjava/include/Makefile.in2
-rw-r--r--libjava/include/jvm.h49
-rw-r--r--libjava/java/io/ObjectInputStream.java34
-rw-r--r--libjava/java/io/natObjectInputStream.cc13
-rw-r--r--libjava/java/lang/Class.h4
-rw-r--r--libjava/java/lang/Class.java136
-rw-r--r--libjava/java/lang/mprec.c26
-rw-r--r--libjava/java/lang/natClass.cc33
-rw-r--r--libjava/java/lang/natString.cc15
-rw-r--r--libjava/java/lang/ref/natReference.cc10
-rw-r--r--libjava/java/net/URLClassLoader.java65
-rw-r--r--libjava/java/rmi/server/RMIClassLoader.java2
-rw-r--r--libjava/java/text/MessageFormat.java11
-rw-r--r--libjava/java/util/LinkedHashMap.java3
-rw-r--r--libjava/java/util/regex/Pattern.java3
-rw-r--r--libjava/jawt.c1
-rw-r--r--libjava/jni.cc24
-rw-r--r--libjava/link.cc9
-rw-r--r--libjava/mauve-libgcj8
-rw-r--r--libjava/stacktrace.cc9
-rw-r--r--libjava/sysdep/descriptor-n.h3
-rw-r--r--libjava/sysdep/descriptor-y.h5
-rw-r--r--libjava/sysdep/powerpc/descriptor.h9
-rw-r--r--libjava/testsuite/Makefile.in2
-rw-r--r--libjava/testsuite/libjava.jacks/jacks.xfail3
-rw-r--r--libjava/testsuite/libjava.jni/jni.exp2
-rw-r--r--libjava/testsuite/libjava.lang/PR19870.java44
-rw-r--r--libjava/testsuite/libjava.lang/PR19870.out8
-rw-r--r--libjava/testsuite/libjava.lang/pr17536.java5
-rw-r--r--libjava/testsuite/libjava.lang/pr17536.out1
-rw-r--r--libjava/testsuite/libjava.lang/pr21785.java21
-rw-r--r--libjava/testsuite/libjava.lang/pr21785.out0
-rw-r--r--libjava/testsuite/libjava.lang/pr21844.java33
-rw-r--r--libjava/testsuite/libjava.lang/pr21844.out1
-rw-r--r--libmudflap/ChangeLog29
-rw-r--r--libmudflap/Makefile.am1
-rw-r--r--libmudflap/Makefile.in1
-rw-r--r--libmudflap/mf-impl.h26
-rw-r--r--libmudflap/mf-runtime.c10
-rw-r--r--libmudflap/testsuite/libmudflap.c++/c++frags.exp4
-rw-r--r--libmudflap/testsuite/libmudflap.c++/ctors.exp4
-rw-r--r--libmudflap/testsuite/libmudflap.c/cfrags.exp6
-rw-r--r--libmudflap/testsuite/libmudflap.c/externs-1.c14
-rw-r--r--libmudflap/testsuite/libmudflap.c/externs-2.c2
-rw-r--r--libmudflap/testsuite/libmudflap.c/externs.exp40
-rw-r--r--libmudflap/testsuite/libmudflap.c/fail40-frag.c56
-rw-r--r--libobjc/ChangeLog23
-rw-r--r--libobjc/archive.c6
-rw-r--r--libobjc/class.c10
-rw-r--r--libobjc/encoding.c4
-rw-r--r--libobjc/exception.c1
-rw-r--r--libobjc/gc.c4
-rw-r--r--libobjc/hash.c4
-rw-r--r--libobjc/hash_compat.c2
-rw-r--r--libobjc/init.c2
-rw-r--r--libobjc/misc.c2
-rw-r--r--libobjc/nil_method.c2
-rw-r--r--libobjc/objc/NXConstStr.h2
-rw-r--r--libobjc/objc/Object.h4
-rw-r--r--libobjc/objc/Protocol.h2
-rw-r--r--libobjc/objc/encoding.h2
-rw-r--r--libobjc/objc/hash.h2
-rw-r--r--libobjc/objc/objc-api.h8
-rw-r--r--libobjc/objc/runtime.h10
-rw-r--r--libobjc/objc/sarray.h2
-rw-r--r--libobjc/objc/thr.h2
-rw-r--r--libobjc/objc/typedstream.h4
-rw-r--r--libobjc/objects.c4
-rw-r--r--libobjc/sarray.c4
-rw-r--r--libobjc/selector.c6
-rw-r--r--libobjc/sendmsg.c6
-rw-r--r--libobjc/thr-dce.c4
-rw-r--r--libobjc/thr-decosf1.c4
-rw-r--r--libobjc/thr-irix.c4
-rw-r--r--libobjc/thr-mach.c4
-rw-r--r--libobjc/thr-objc.c4
-rw-r--r--libobjc/thr-os2.c4
-rw-r--r--libobjc/thr-posix.c4
-rw-r--r--libobjc/thr-pthreads.c4
-rw-r--r--libobjc/thr-rtems.c4
-rw-r--r--libobjc/thr-single.c4
-rw-r--r--libobjc/thr-solaris.c4
-rw-r--r--libobjc/thr-vxworks.c4
-rw-r--r--libobjc/thr-win32.c4
-rw-r--r--libobjc/thr.c2
-rw-r--r--libstdc++-v3/ChangeLog476
-rw-r--r--libstdc++-v3/ChangeLog-1998942
-rw-r--r--libstdc++-v3/ChangeLog-19993545
-rw-r--r--libstdc++-v3/ChangeLog-20004486
-rw-r--r--libstdc++-v3/Makefile.in3
-rw-r--r--libstdc++-v3/acinclude.m422
-rw-r--r--libstdc++-v3/aclocal.m434
-rw-r--r--libstdc++-v3/config/abi/powerpc64-linux-gnu/32/baseline_symbols.txt3083
-rw-r--r--libstdc++-v3/config/abi/powerpc64-linux-gnu/32/nof/baseline_symbols.txt3083
-rw-r--r--libstdc++-v3/config/abi/powerpc64-linux-gnu/baseline_symbols.txt3239
-rw-r--r--libstdc++-v3/config/allocator/bitmap_allocator_base.h4
-rw-r--r--libstdc++-v3/config/allocator/malloc_allocator_base.h4
-rw-r--r--libstdc++-v3/config/allocator/mt_allocator_base.h4
-rw-r--r--libstdc++-v3/config/allocator/new_allocator_base.h4
-rw-r--r--libstdc++-v3/config/allocator/pool_allocator_base.h4
-rw-r--r--libstdc++-v3/config/cpu/alpha/atomicity.h38
-rw-r--r--libstdc++-v3/config/cpu/ia64/atomicity.h4
-rw-r--r--libstdc++-v3/config/cpu/powerpc/atomicity.h40
-rw-r--r--libstdc++-v3/config/cpu/s390/atomicity.h16
-rw-r--r--libstdc++-v3/config/linker-map.gnu14
-rwxr-xr-xlibstdc++-v3/configure18
-rw-r--r--libstdc++-v3/configure.ac2
-rw-r--r--libstdc++-v3/configure.host3
-rw-r--r--libstdc++-v3/docs/html/abi.html9
-rw-r--r--libstdc++-v3/docs/html/debug.html5
-rw-r--r--libstdc++-v3/docs/html/test.html4
-rw-r--r--libstdc++-v3/include/Makefile.am2
-rw-r--r--libstdc++-v3/include/Makefile.in5
-rw-r--r--libstdc++-v3/include/bits/allocator.h8
-rw-r--r--libstdc++-v3/include/bits/basic_string.h19
-rw-r--r--libstdc++-v3/include/bits/basic_string.tcc20
-rw-r--r--libstdc++-v3/include/bits/c++config51
-rw-r--r--libstdc++-v3/include/bits/deque.tcc54
-rw-r--r--libstdc++-v3/include/bits/fstream.tcc3
-rw-r--r--libstdc++-v3/include/bits/list.tcc6
-rw-r--r--libstdc++-v3/include/bits/stl_algo.h24
-rw-r--r--libstdc++-v3/include/bits/stl_algobase.h4
-rw-r--r--libstdc++-v3/include/bits/stl_deque.h89
-rw-r--r--libstdc++-v3/include/bits/stl_function.h6
-rw-r--r--libstdc++-v3/include/bits/stl_list.h74
-rw-r--r--libstdc++-v3/include/bits/stl_map.h73
-rw-r--r--libstdc++-v3/include/bits/stl_multimap.h81
-rw-r--r--libstdc++-v3/include/bits/stl_multiset.h88
-rw-r--r--libstdc++-v3/include/bits/stl_set.h78
-rw-r--r--libstdc++-v3/include/bits/stl_vector.h81
-rw-r--r--libstdc++-v3/include/bits/vector.tcc60
-rw-r--r--libstdc++-v3/include/c_std/std_cstdlib.h13
-rw-r--r--libstdc++-v3/include/debug/debug.h453
-rw-r--r--libstdc++-v3/include/debug/deque10
-rw-r--r--libstdc++-v3/include/debug/functions.h286
-rw-r--r--libstdc++-v3/include/debug/hash_map8
-rw-r--r--libstdc++-v3/include/debug/hash_set8
-rw-r--r--libstdc++-v3/include/debug/list10
-rw-r--r--libstdc++-v3/include/debug/macros.h229
-rw-r--r--libstdc++-v3/include/debug/map.h10
-rw-r--r--libstdc++-v3/include/debug/multimap.h10
-rw-r--r--libstdc++-v3/include/debug/multiset.h10
-rw-r--r--libstdc++-v3/include/debug/safe_iterator.h7
-rw-r--r--libstdc++-v3/include/debug/safe_sequence.h4
-rw-r--r--libstdc++-v3/include/debug/set.h10
-rw-r--r--libstdc++-v3/include/debug/string33
-rw-r--r--libstdc++-v3/include/debug/vector8
-rw-r--r--libstdc++-v3/include/ext/array_allocator.h5
-rw-r--r--libstdc++-v3/include/ext/hash_map7
-rw-r--r--libstdc++-v3/include/ext/hash_set7
-rw-r--r--libstdc++-v3/include/std/std_complex.h12
-rw-r--r--libstdc++-v3/include/std/std_sstream.h36
-rw-r--r--libstdc++-v3/include/tr1/hashtable2786
-rw-r--r--libstdc++-v3/include/tr1/unordered_map236
-rw-r--r--libstdc++-v3/include/tr1/unordered_set229
-rw-r--r--libstdc++-v3/libmath/Makefile.in3
-rw-r--r--libstdc++-v3/libmath/stubs.c17
-rw-r--r--libstdc++-v3/libsupc++/Makefile.in3
-rw-r--r--libstdc++-v3/libsupc++/unwind-cxx.h2
-rw-r--r--libstdc++-v3/po/Makefile.in3
-rw-r--r--libstdc++-v3/src/Makefile.in3
-rw-r--r--libstdc++-v3/src/bitmap_allocator.cc4
-rw-r--r--libstdc++-v3/src/debug.cc9
-rw-r--r--libstdc++-v3/src/misc-inst.cc5
-rw-r--r--libstdc++-v3/src/mt_allocator.cc5
-rw-r--r--libstdc++-v3/src/pool_allocator.cc1
-rw-r--r--libstdc++-v3/testsuite/17_intro/no_assert_neg.cc89
-rw-r--r--libstdc++-v3/testsuite/21_strings/basic_string/1.cc36
-rw-r--r--libstdc++-v3/testsuite/21_strings/basic_string/2.cc36
-rw-r--r--libstdc++-v3/testsuite/23_containers/deque/explicit_instantiation/1.cc (renamed from libstdc++-v3/testsuite/23_containers/deque/explicit_instantiation.cc)0
-rw-r--r--libstdc++-v3/testsuite/23_containers/deque/explicit_instantiation/2.cc35
-rw-r--r--libstdc++-v3/testsuite/23_containers/deque/explicit_instantiation/3.cc35
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/explicit_instantiation/1.cc (renamed from libstdc++-v3/testsuite/23_containers/list/explicit_instantiation.cc)0
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/explicit_instantiation/2.cc35
-rw-r--r--libstdc++-v3/testsuite/23_containers/list/explicit_instantiation/3.cc35
-rw-r--r--libstdc++-v3/testsuite/23_containers/map/explicit_instantiation/1.cc (renamed from libstdc++-v3/testsuite/23_containers/map/explicit_instantiation.cc)0
-rw-r--r--libstdc++-v3/testsuite/23_containers/map/explicit_instantiation/2.cc37
-rw-r--r--libstdc++-v3/testsuite/23_containers/map/explicit_instantiation/3.cc35
-rw-r--r--libstdc++-v3/testsuite/23_containers/multimap/explicit_instantiation/1.cc (renamed from libstdc++-v3/testsuite/23_containers/multimap/explicit_instantiation.cc)0
-rw-r--r--libstdc++-v3/testsuite/23_containers/multimap/explicit_instantiation/2.cc36
-rw-r--r--libstdc++-v3/testsuite/23_containers/multimap/explicit_instantiation/3.cc35
-rw-r--r--libstdc++-v3/testsuite/23_containers/multiset/explicit_instantiation/1.cc (renamed from libstdc++-v3/testsuite/23_containers/multiset/explicit_instantiation.cc)0
-rw-r--r--libstdc++-v3/testsuite/23_containers/multiset/explicit_instantiation/2.cc35
-rw-r--r--libstdc++-v3/testsuite/23_containers/multiset/explicit_instantiation/3.cc35
-rw-r--r--libstdc++-v3/testsuite/23_containers/set/explicit_instantiation/1.cc (renamed from libstdc++-v3/testsuite/23_containers/set/explicit_instantiation.cc)0
-rw-r--r--libstdc++-v3/testsuite/23_containers/set/explicit_instantiation/2.cc35
-rw-r--r--libstdc++-v3/testsuite/23_containers/set/explicit_instantiation/3.cc35
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/explicit_instantiation/1.cc (renamed from libstdc++-v3/testsuite/23_containers/vector/explicit_instantiation.cc)0
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/explicit_instantiation/2.cc35
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/explicit_instantiation/3.cc35
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/adjacent_find/1.cc67
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/adjacent_find/check_type.cc42
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/binary_search/1.cc54
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/binary_search/check_type.cc42
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/count/1.cc58
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/count/check_type.cc42
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/count_if/1.cc65
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/count_if/check_type.cc52
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/equal/1.cc73
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/equal/check_type.cc48
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/equal/equal.cc (renamed from libstdc++-v3/testsuite/25_algorithms/equal.cc)0
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/equal_range/1.cc63
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/equal_range/check_type.cc43
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/find/1.cc58
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/find/check_type.cc38
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/find_end/1.cc57
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/find_end/check_type.cc53
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/find_first_of/1.cc58
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/find_first_of/check_type.cc49
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/find_if/1.cc65
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/find_if/check_type.cc49
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/heap/heap.cc (renamed from libstdc++-v3/testsuite/25_algorithms/heap.cc)0
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/includes/1.cc90
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/includes/check_type.cc46
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/inplace_merge/1.cc84
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/inplace_merge/check_type.cc48
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/1.cc86
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/check_type.cc51
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/lower_bound/1.cc47
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/lower_bound/check_type.cc44
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/lower_bound/lower_bound.cc (renamed from libstdc++-v3/testsuite/25_algorithms/lower_bound.cc)0
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/max_element/1.cc71
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/max_element/check_type.cc44
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/merge/1.cc101
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/merge/check_type.cc46
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/min_element/1.cc71
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/min_element/check_type.cc44
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/mismatch/1.cc89
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/mismatch/check_type.cc51
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/next_permutation/1.cc84
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/next_permutation/check_type.cc44
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/nth_element/1.cc79
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/nth_element/check_type.cc45
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/partial_sort/1.cc66
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/partial_sort/check_type.cc49
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/partial_sort_copy/1.cc89
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/partial_sort_copy/check_type.cc68
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/partition/partition.cc (renamed from libstdc++-v3/testsuite/25_algorithms/partition.cc)0
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/prev_permutation/1.cc84
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/prev_permutation/check_type.cc44
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/remove/1.cc63
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/remove/check_type.cc39
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/remove_if/1.cc66
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/remove_if/check_type.cc50
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/replace/1.cc61
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/replace/check_type.cc38
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/replace_copy/1.cc72
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/replace_copy/check_type.cc56
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/replace_copy_if/1.cc76
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/replace_copy_if/check_type.cc56
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/replace_if/1.cc65
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/replace_if/check_type.cc52
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/rotate/1.cc126
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/rotate/check_type.cc48
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/rotate/rotate.cc (renamed from libstdc++-v3/testsuite/25_algorithms/rotate.cc)0
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/search/1.cc113
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/search/check_type.cc46
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/search_n/check_type.cc39
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/search_n/iterator.cc2
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/set_difference/1.cc132
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/set_difference/check_type.cc44
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/set_intersection/1.cc132
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/set_intersection/check_type.cc44
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/set_symmetric_difference/1.cc134
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/set_symmetric_difference/check_type.cc45
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/set_union/1.cc137
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/set_union/check_type.cc44
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/stable_sort/1.cc90
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/stable_sort/check_type.cc49
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/swap_ranges/1.cc60
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/swap_ranges/check_type.cc35
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/unique_copy/1.cc85
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/unique_copy/check_type.cc55
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/upper_bound/1.cc47
-rw-r--r--libstdc++-v3/testsuite/25_algorithms/upper_bound/check_type.cc44
-rw-r--r--libstdc++-v3/testsuite/26_numerics/cstdlib/13943.cc52
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_filebuf/in_avail/char/9701-3.cc (renamed from libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/char/9701-3.cc)0
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/char/1.cc (renamed from libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/wchar_t/9701-3.cc)49
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/wchar_t/1.cc54
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/1.cc6
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/21955.cc54
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/wchar_t/1.cc6
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_stringbuf/str/char/1.cc4
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_stringbuf/str/wchar_t/1.cc4
-rw-r--r--libstdc++-v3/testsuite/27_io/ios_base/cons/assign_neg.cc3
-rw-r--r--libstdc++-v3/testsuite/27_io/ios_base/cons/copy_neg.cc3
-rw-r--r--libstdc++-v3/testsuite/Makefile.in3
-rw-r--r--libstdc++-v3/testsuite/ext/array_allocator/2.cc12
-rw-r--r--libstdc++-v3/testsuite/ext/is_heap/1.cc46
-rw-r--r--libstdc++-v3/testsuite/ext/is_heap/check_type.cc47
-rw-r--r--libstdc++-v3/testsuite/ext/median.cc42
-rw-r--r--libstdc++-v3/testsuite/lib/libstdc++.exp31
-rw-r--r--libstdc++-v3/testsuite/libstdc++-dg/normal.exp3
-rw-r--r--libstdc++-v3/testsuite/testsuite_abi.cc1
-rw-r--r--libstdc++-v3/testsuite/testsuite_hooks.h18
-rw-r--r--libstdc++-v3/testsuite/testsuite_iterators.h40
-rw-r--r--maintainer-scripts/ChangeLog5
-rw-r--r--maintainer-scripts/crontab6
-rw-r--r--zlib/ChangeLog.gcj9
-rw-r--r--zlib/Makefile.in3
-rw-r--r--zlib/aclocal.m435
-rwxr-xr-xzlib/configure2
-rw-r--r--zlib/zconf.h8
1484 files changed, 91956 insertions, 46662 deletions
diff --git a/ChangeLog b/ChangeLog
index 7b69b1e8c8c..bae45e02fce 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,86 @@
+2005-06-13 Richard Sandiford <richard@codesourcery.com>
+
+ * MAINTAINERS: Update my email address.
+
+2005-06-13 Zack Weinberg <zack@codesourcery.com>
+
+ * depcomp: Update from automake CVS. Add 'ia64hp' stanza.
+ In 'cpp' stanza, support '#line' as well as '# '.
+
+2005-06-08 Andreas Schwab <schwab@suse.de>
+
+ * MAINTAINERS: Move myself from 'Write After Approval' to
+ 'CPU Port Maintainers' section as m68k maintainer.
+
+2005-06-07 Hans-Peter Nilsson <hp@axis.com>
+
+ * configure.in (unsupported_languages): New macro.
+ <mmix-knuth-mmixware>: Set unsupported_languages. Name explicit
+ non-ported target libraries in noconfigdirs.
+ <cris-*, crisv32-*> Ditto, except for non-aout, non-elf,
+ non-linux-gnu. Remove libgcj_ex_libffi.
+ <lang_frag loop>: Set add_this_lang=no if the language is in
+ unsupported_languages.
+ * configure: Regenerate.
+
+2005-06-04 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
+
+ * configure.in: Fix typo in handling of --with-mpfr-dir.
+ * configure: Regenerate.
+
+2005-06-04 Richard Sandiford <rsandifo@nildram.co.uk>
+
+ * MAINTAINERS: Update my email address.
+
+2005-06-02 Jim Blandy <jimb@redhat.com>
+
+ * config.sub: Add cases for the Renesas m32c. (This patch has been
+ accepted into the master sources.)
+
+2005-06-02 Aldy Hernandez <aldyh@redhat.com>
+ Michael Snyder <msnyder@redhat.com>
+ Stan Cox <scox@redhat.com>
+
+ * configure.in: Set noconfigdirs for ms1.
+
+ * configure: Regenerate.
+
+2005-06-01 Jerry DeLisle <jvdelisle@verizon.net>
+
+ * MAINTAINERS (Write After Approval): Add self.
+
+2005-06-01 Josh Conner <jconner@apple.com>
+
+ * MAINTAINERS (Write After Approval): Add self.
+
+2005-06-01 Kazu Hirata <kazu@codesourcery.com>
+
+ * MAINTAINERS: Update my email address.
+
+2005-05-27 Ziga Mahkovec <ziga.mahkovec@klika.si>
+
+ * MAINTAINERS (Write After Approval): Add self.
+
+2005-05-26 Chris Demetriou <cgd@broadcom.com>
+
+ * MAINTAINERS (Write After Approval): Remove self.
+
+2005-05-25 Paolo Bonzini <bonzini@gnu.org>
+
+ * Makefile.tpl (stage[+id+]-start): Iterate over target module as well.
+ (Dependencies): Consider target modules for bootstrap dependencies.
+ Make target bootstrap modules depend on each stage's gcc.
+ * Makefile.in: Regenerate.
+
+2005-05-20 Paolo Bonzini <bonzini@gnu.org>
+
+ * Makefile.def (configure-gcc): Depend on binutils having been built.
+ (all-gcc): No need to do it here.
+ * Makefile.in: Regenerate.
+
2005-05-19 Paul Brook <paul@codesourcery.com>
- * configure.in: Rewrite misleading error message when requested
+ * configure.in: Rewrite misleading error message when requested
language cannot be built.
* configure: Regenerate.
@@ -16,7 +96,7 @@
* libtool.m4 (AC_LIBTOOL_SYS_MAX_CMD_LEN): Use quotes on
lt_cv_sys_max_cmd_len for now.
-
+
2005-05-09 Stan Cox <scox@redhat.com>
* MAINTAINERS: Remove self, add Nick Clifton as iq2000 maintainer.
@@ -93,7 +173,7 @@
2005-04-06 Paolo Bonzini <bonzini@gnu.org>
- * Makefile.tpl (BUILD_CONFIGARGS): Include --with-build-subdir.
+ * Makefile.tpl (BUILD_CONFIGARGS): Include --with-build-subdir.
(TARGET_CONFIGARGS): Include --with-target-subdir.
(configure, all): New macros. Use them throughout.
* Makefile.in: Regenerate.
@@ -101,7 +181,7 @@
2005-04-04 Jon Grimm <jgrimm2@us.ibm.com>
* MAINTAINERS (Write After Approval): Add myself.
-
+
2005-03-31 Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
* MAINTAINERS: Remove 'loop unrolling' maintainer.
diff --git a/MAINTAINERS b/MAINTAINERS
index 5c0811fd1e7..b11c6d29871 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -49,7 +49,7 @@ fr30 port Nick Clifton nickc@redhat.com
frv port Aldy Hernandez aldyh@redhat.com
frv port Alexandre Oliva aoliva@redhat.com
h8 port Jeff Law law@redhat.com
-h8 port Kazu Hirata kazu@cs.umass.edu
+h8 port Kazu Hirata kazu@codesourcery.com
hppa port Jeff Law law@redhat.com
hppa port Dave Anglin dave.anglin@nrc.ca
i386 port Richard Henderson rth@redhat.com
@@ -60,10 +60,11 @@ iq2000 port Nick Clifton nickc@redhat.com
m32r port Nick Clifton nickc@redhat.com
m68hc11 port Stephane Carrez stcarrez@nerim.fr
m68k port (?) Jeff Law law@redhat.com
+m68k port Andreas Schwab schwab@suse.de
m68k-motorola-sysv port Philippe De Muyter phdm@macqel.be
mcore port Nick Clifton nickc@redhat.com
mips port Eric Christopher echristo@redhat.com
-mips port Richard Sandiford rsandifo@redhat.com
+mips port Richard Sandiford richard@codesourcery.com
mmix port Hans-Peter Nilsson hp@bitrange.com
mn10300 port Jeff Law law@redhat.com
mn10300 port Alexandre Oliva aoliva@redhat.com
@@ -223,12 +224,13 @@ Steve Chamberlain sac@transmeta.com
Michael Chastain mec.gnu@mindspring.com
Chandra Chavva cchavva@redhat.com
William Cohen wcohen@redhat.com
+Josh Conner jconner@apple.com
R. Kelley Cook kcook@gcc.gnu.org
Christian Cornelssen ccorn@cs.tu-berlin.de
François-Xavier Coudert coudert@clipper.ens.fr
David Daney ddaney@avtrex.com
Bud Davis bdavis9659@comcast.net
-Chris Demetriou cgd@broadcom.com
+Jerry DeLisle jvdelisle@verizon.net
Zdenek Dvorak dvorakz@suse.cz
Steve Ellcey sje@cup.hp.com
Mohan Embar gnustuff@thisiscool.com
@@ -277,6 +279,7 @@ Gabor Loki loki@inf.u-szeged.hu
Dave Love d.love@dl.ac.uk
Martin v. Löwis loewis@informatik.hu-berlin.de
HJ Lu hjl@lucon.org
+Ziga Mahkovec ziga.mahkovec@klika.si
Ranjit Mathew rmathew@hotmail.com
Michael Matz matz@suse.de
Greg McGary gkm@gnu.org
@@ -307,7 +310,6 @@ Douglas Rupp rupp@gnat.com
Matthew Sachs msachs@apple.com
Alex Samuel samuel@codesourcery.com
Tobias Schlüter tobias.schlueter@physik.uni-muenchen.de
-Andreas Schwab schwab@suse.de
Svein Seldal svein@dev.seldal.com
Franz Sirl franz.sirl-kernel@lauterbach.com
Michael Sokolov msokolov@ivan.Harhan.ORG
diff --git a/Makefile.def b/Makefile.def
index e338aa8599a..091b869aada 100644
--- a/Makefile.def
+++ b/Makefile.def
@@ -242,9 +242,9 @@ dependencies = { module=all-build-fixincludes; on=all-build-libiberty; };
// Host modules specific to gcc.
dependencies = { module=configure-gcc; on=configure-intl; };
-dependencies = { module=configure-gcc; on=configure-binutils; };
-dependencies = { module=configure-gcc; on=configure-gas; };
-dependencies = { module=configure-gcc; on=configure-ld; };
+dependencies = { module=configure-gcc; on=all-binutils; };
+dependencies = { module=configure-gcc; on=all-gas; };
+dependencies = { module=configure-gcc; on=all-ld; };
dependencies = { module=all-gcc; on=all-libiberty; hard=true; };
dependencies = { module=all-gcc; on=all-intl; };
dependencies = { module=all-gcc; on=all-build-texinfo; };
@@ -253,9 +253,6 @@ dependencies = { module=all-gcc; on=all-build-byacc; };
dependencies = { module=all-gcc; on=all-build-flex; };
dependencies = { module=all-gcc; on=all-build-libiberty; };
dependencies = { module=all-gcc; on=all-build-fixincludes; };
-dependencies = { module=all-gcc; on=all-binutils; };
-dependencies = { module=all-gcc; on=all-gas; };
-dependencies = { module=all-gcc; on=all-ld; };
dependencies = { module=all-gcc; on=all-zlib; };
dependencies = { module=all-gcc; on=all-libcpp; hard=true; };
dependencies = { module=all-gcc; on=all-libiberty; };
diff --git a/Makefile.in b/Makefile.in
index 7d6a55938bb..1e080926569 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -33414,7 +33414,7 @@ stage1-start::
@[ -f stage_current ] && $(MAKE) `cat stage_current`-end || : ; \
echo stage1 > stage_current ; \
echo stage1 > stage_last; \
- $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)
+ $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR) $(TARGET_SUBDIR)
@if bfd
@cd $(HOST_SUBDIR); [ -d stage1-bfd ] || \
mkdir stage1-bfd; \
@@ -33557,7 +33557,7 @@ stage2-start::
@[ -f stage_current ] && $(MAKE) `cat stage_current`-end || : ; \
echo stage2 > stage_current ; \
echo stage2 > stage_last; \
- $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)
+ $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR) $(TARGET_SUBDIR)
@if bfd
@cd $(HOST_SUBDIR); [ -d stage2-bfd ] || \
mkdir stage2-bfd; \
@@ -33743,7 +33743,7 @@ stage3-start::
@[ -f stage_current ] && $(MAKE) `cat stage_current`-end || : ; \
echo stage3 > stage_current ; \
echo stage3 > stage_last; \
- $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)
+ $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR) $(TARGET_SUBDIR)
@if bfd
@cd $(HOST_SUBDIR); [ -d stage3-bfd ] || \
mkdir stage3-bfd; \
@@ -33960,7 +33960,7 @@ stage4-start::
@[ -f stage_current ] && $(MAKE) `cat stage_current`-end || : ; \
echo stage4 > stage_current ; \
echo stage4 > stage_last; \
- $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)
+ $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR) $(TARGET_SUBDIR)
@if bfd
@cd $(HOST_SUBDIR); [ -d stage4-bfd ] || \
mkdir stage4-bfd; \
@@ -34174,7 +34174,7 @@ stageprofile-start::
@[ -f stage_current ] && $(MAKE) `cat stage_current`-end || : ; \
echo stageprofile > stage_current ; \
echo stageprofile > stage_last; \
- $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)
+ $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR) $(TARGET_SUBDIR)
@if bfd
@cd $(HOST_SUBDIR); [ -d stageprofile-bfd ] || \
mkdir stageprofile-bfd; \
@@ -34357,7 +34357,7 @@ stagefeedback-start::
@[ -f stage_current ] && $(MAKE) `cat stage_current`-end || : ; \
echo stagefeedback > stage_current ; \
echo stagefeedback > stage_last; \
- $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)
+ $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR) $(TARGET_SUBDIR)
@if bfd
@cd $(HOST_SUBDIR); [ -d stagefeedback-bfd ] || \
mkdir stagefeedback-bfd; \
@@ -34654,6 +34654,7 @@ configure-target-qthreads: maybe-all-target-newlib maybe-all-target-libgloss
+
# With all the machinery above in place, it is pretty easy to generate
# dependencies. Host dependencies are a bit more complex because we have
# to check for bootstrap/prebootstrap dependencies. To resolve
@@ -34676,30 +34677,30 @@ configure-stage3-gcc: maybe-configure-stage3-intl
configure-stage4-gcc: maybe-configure-stage4-intl
configure-stageprofile-gcc: maybe-configure-stageprofile-intl
configure-stagefeedback-gcc: maybe-configure-stagefeedback-intl
-configure-gcc: maybe-configure-binutils
-
-configure-stage1-gcc: maybe-configure-stage1-binutils
-configure-stage2-gcc: maybe-configure-stage2-binutils
-configure-stage3-gcc: maybe-configure-stage3-binutils
-configure-stage4-gcc: maybe-configure-stage4-binutils
-configure-stageprofile-gcc: maybe-configure-stageprofile-binutils
-configure-stagefeedback-gcc: maybe-configure-stagefeedback-binutils
-configure-gcc: maybe-configure-gas
-
-configure-stage1-gcc: maybe-configure-stage1-gas
-configure-stage2-gcc: maybe-configure-stage2-gas
-configure-stage3-gcc: maybe-configure-stage3-gas
-configure-stage4-gcc: maybe-configure-stage4-gas
-configure-stageprofile-gcc: maybe-configure-stageprofile-gas
-configure-stagefeedback-gcc: maybe-configure-stagefeedback-gas
-configure-gcc: maybe-configure-ld
-
-configure-stage1-gcc: maybe-configure-stage1-ld
-configure-stage2-gcc: maybe-configure-stage2-ld
-configure-stage3-gcc: maybe-configure-stage3-ld
-configure-stage4-gcc: maybe-configure-stage4-ld
-configure-stageprofile-gcc: maybe-configure-stageprofile-ld
-configure-stagefeedback-gcc: maybe-configure-stagefeedback-ld
+configure-gcc: maybe-all-binutils
+
+configure-stage1-gcc: maybe-all-stage1-binutils
+configure-stage2-gcc: maybe-all-stage2-binutils
+configure-stage3-gcc: maybe-all-stage3-binutils
+configure-stage4-gcc: maybe-all-stage4-binutils
+configure-stageprofile-gcc: maybe-all-stageprofile-binutils
+configure-stagefeedback-gcc: maybe-all-stagefeedback-binutils
+configure-gcc: maybe-all-gas
+
+configure-stage1-gcc: maybe-all-stage1-gas
+configure-stage2-gcc: maybe-all-stage2-gas
+configure-stage3-gcc: maybe-all-stage3-gas
+configure-stage4-gcc: maybe-all-stage4-gas
+configure-stageprofile-gcc: maybe-all-stageprofile-gas
+configure-stagefeedback-gcc: maybe-all-stagefeedback-gas
+configure-gcc: maybe-all-ld
+
+configure-stage1-gcc: maybe-all-stage1-ld
+configure-stage2-gcc: maybe-all-stage2-ld
+configure-stage3-gcc: maybe-all-stage3-ld
+configure-stage4-gcc: maybe-all-stage4-ld
+configure-stageprofile-gcc: maybe-all-stageprofile-ld
+configure-stagefeedback-gcc: maybe-all-stagefeedback-ld
all-gcc: all-libiberty
all-stage1-gcc: all-stage1-libiberty
@@ -34770,30 +34771,6 @@ all-stage4-gcc: maybe-all-build-fixincludes
all-stageprofile-gcc: maybe-all-build-fixincludes
all-stagefeedback-gcc: maybe-all-build-fixincludes
all-prebootstrap: maybe-all-build-fixincludes
-all-gcc: maybe-all-binutils
-
-all-stage1-gcc: maybe-all-stage1-binutils
-all-stage2-gcc: maybe-all-stage2-binutils
-all-stage3-gcc: maybe-all-stage3-binutils
-all-stage4-gcc: maybe-all-stage4-binutils
-all-stageprofile-gcc: maybe-all-stageprofile-binutils
-all-stagefeedback-gcc: maybe-all-stagefeedback-binutils
-all-gcc: maybe-all-gas
-
-all-stage1-gcc: maybe-all-stage1-gas
-all-stage2-gcc: maybe-all-stage2-gas
-all-stage3-gcc: maybe-all-stage3-gas
-all-stage4-gcc: maybe-all-stage4-gas
-all-stageprofile-gcc: maybe-all-stageprofile-gas
-all-stagefeedback-gcc: maybe-all-stagefeedback-gas
-all-gcc: maybe-all-ld
-
-all-stage1-gcc: maybe-all-stage1-ld
-all-stage2-gcc: maybe-all-stage2-ld
-all-stage3-gcc: maybe-all-stage3-ld
-all-stage4-gcc: maybe-all-stage4-ld
-all-stageprofile-gcc: maybe-all-stageprofile-ld
-all-stagefeedback-gcc: maybe-all-stagefeedback-ld
all-gcc: maybe-all-zlib
all-stage1-gcc: maybe-all-stage1-zlib
diff --git a/Makefile.tpl b/Makefile.tpl
index 2c114e40681..365301d73aa 100644
--- a/Makefile.tpl
+++ b/Makefile.tpl
@@ -1340,7 +1340,7 @@ stage[+id+]-start::
@[ -f stage_current ] && $(MAKE) `cat stage_current`-end || : ; \
echo stage[+id+] > stage_current ; \
echo stage[+id+] > stage_last; \
- $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR)[+
+ $(SHELL) $(srcdir)/mkinstalldirs $(HOST_SUBDIR) $(TARGET_SUBDIR)[+
FOR host_modules +][+ IF bootstrap +]
@if [+ module +]
@cd $(HOST_SUBDIR); [ -d stage[+id+]-[+module+] ] || \
@@ -1349,7 +1349,16 @@ stage[+id+]-start::
@CREATE_LINK_TO_DIR@ [+ IF prev +] ; \
set stage[+prev+]-[+module+] prev-[+module+] ; \
@CREATE_LINK_TO_DIR@ [+ ENDIF prev +]
-@endif [+ module +][+ ENDIF bootstrap +][+ ENDFOR host_modules +]
+@endif [+ module +][+ ENDIF bootstrap +][+ ENDFOR host_modules +][+
+ FOR target_modules +][+ IF bootstrap +]
+@if target-[+ module +]
+ @cd $(TARGET_SUBDIR); [ -d stage[+id+]-[+module+] ] || \
+ mkdir stage[+id+]-[+module+]; \
+ set stage[+id+]-[+module+] [+module+] ; \
+ @CREATE_LINK_TO_DIR@ [+ IF prev +] ; \
+ set stage[+prev+]-[+module+] prev-[+module+] ; \
+ @CREATE_LINK_TO_DIR@ [+ ENDIF prev +]
+@endif target-[+ module +][+ ENDIF bootstrap +][+ ENDFOR target_modules +]
stage[+id+]-end::
@rm -f stage_current[+ FOR host_modules +][+ IF bootstrap +]
@@ -1358,7 +1367,14 @@ stage[+id+]-end::
@UNDO_LINK_TO_DIR@ [+ IF prev +] ; \
set prev-[+module+] stage[+prev+]-[+module+] ; \
@UNDO_LINK_TO_DIR@ [+ ENDIF prev +]
-@endif [+ module +][+ ENDIF bootstrap +][+ ENDFOR host_modules +]
+@endif [+ module +][+ ENDIF bootstrap +][+ ENDFOR host_modules +][+
+ FOR target_modules +][+ IF bootstrap +]
+@if target-[+ module +]
+ @cd $(HOST_SUBDIR); set [+module+] stage[+id+]-[+module+] ; \
+ @UNDO_LINK_TO_DIR@ [+ IF prev +] ; \
+ set prev-[+module+] stage[+prev+]-[+module+] ; \
+ @UNDO_LINK_TO_DIR@ [+ ENDIF prev +]
+@endif [+ module +][+ ENDIF bootstrap +][+ ENDFOR target_modules +]
# Bubble a bugfix through all the stages up to stage [+id+]. They
# are remade, but not reconfigured. The next stage (if any) will not
@@ -1467,7 +1483,10 @@ do-distclean: distclean-stage1
# --------------------------------------
# Generic dependencies for target modules on host stuff, especially gcc
-[+ FOR target_modules +]
+[+ FOR target_modules +][+ IF bootstrap +]
+@if gcc-bootstrap[+ FOR bootstrap_stage +]
+configure-stage[+id+]-target-[+module+]: maybe-all-stage[+id+]-gcc[+ ENDFOR +]
+@endif gcc-bootstrap[+ ENDIF bootstrap +]
configure-target-[+module+]: maybe-all-gcc
[+ ENDFOR target_modules +]
@@ -1535,7 +1554,6 @@ configure-target-[+module+]: maybe-all-target-newlib maybe-all-target-libgloss
"prebootstrap"
(if (or (= (dep-subtarget "on") "install-")
- (=* (dep-module "on") "target-")
(not (hash-ref boot-modules (dep-module "module")))
(not (hash-ref boot-modules (dep-module "on"))))
"normal"
@@ -1549,6 +1567,10 @@ configure-target-[+module+]: maybe-all-target-newlib maybe-all-target-libgloss
(if (exist? "bootstrap")
(hash-create-handle! boot-modules (get "module") #t))
"" +][+ ENDFOR host_modules +]
+[+ FOR target_modules +][+
+ (if (exist? "bootstrap")
+ (hash-create-handle! boot-modules (string-append "target-" (get "module")) #t))
+ "" +][+ ENDFOR target_modules +]
# With all the machinery above in place, it is pretty easy to generate
# dependencies. Host dependencies are a bit more complex because we have
diff --git a/boehm-gc/ChangeLog b/boehm-gc/ChangeLog
index 6fa1406bd14..59bae15d6a2 100644
--- a/boehm-gc/ChangeLog
+++ b/boehm-gc/ChangeLog
@@ -1,3 +1,14 @@
+2005-06-15 Andreas Tobler <a.tobler@schweiz.ch>
+
+ * os_dep.c: Add FreeBSD/PowerPC bits.
+ (GC_SysVGetDataStart): Likewise.
+ * include/private/gcconfig.h: Likewise.
+
+2005-05-25 Andrew Haley <aph@redhat.com>
+
+ * include/private/gcconfig.h (HBLKSIZE): Define to 4096 on
+ powerpc64-linux.
+
2005-05-09 Mike Stump <mrs@apple.com>
* configure: Regenerate.
diff --git a/boehm-gc/include/private/gcconfig.h b/boehm-gc/include/private/gcconfig.h
index 5013dbd596b..c5077e6076f 100644
--- a/boehm-gc/include/private/gcconfig.h
+++ b/boehm-gc/include/private/gcconfig.h
@@ -239,6 +239,10 @@
# define POWERPC
# define mach_type_known
# endif
+# if defined(FREEBSD) && (defined(powerpc) || defined(__powerpc__))
+# define POWERPC
+# define mach_type_known
+# endif
# if defined(LINUX) && defined(__mc68000__)
# define M68K
# define mach_type_known
@@ -752,6 +756,7 @@
# if (defined (powerpc64) || defined(__powerpc64__))
# define ALIGNMENT 8
# define CPP_WORDSZ 64
+# define HBLKSIZE 4096
# else
# define ALIGNMENT 4
# endif
@@ -797,6 +802,22 @@
should be looked into some more */
# define NO_PTHREAD_TRYLOCK
# endif
+# ifdef FREEBSD
+# define ALIGNMENT 4
+# define OS_TYPE "FREEBSD"
+# ifndef GC_FREEBSD_THREADS
+# define MPROTECT_VDB
+# endif
+# define SIG_SUSPEND SIGUSR1
+# define SIG_THR_RESTART SIGUSR2
+# define FREEBSD_STACKBOTTOM
+# ifdef __ELF__
+# define DYNAMIC_LOADING
+# endif
+ extern char etext[];
+ extern char * GC_FreeBSDGetDataStart();
+# define DATASTART GC_FreeBSDGetDataStart(0x1000, &etext)
+# endif
# ifdef NETBSD
# define ALIGNMENT 4
# define OS_TYPE "NETBSD"
diff --git a/boehm-gc/os_dep.c b/boehm-gc/os_dep.c
index c4775c1978b..aadd5b96251 100644
--- a/boehm-gc/os_dep.c
+++ b/boehm-gc/os_dep.c
@@ -80,7 +80,7 @@
# define NEED_FIND_LIMIT
# endif
-#if defined(FREEBSD) && defined(I386)
+#if defined(FREEBSD) && (defined(I386) || defined(powerpc) || defined(__powerpc__))
# include <machine/trap.h>
# if !defined(PCR)
# define NEED_FIND_LIMIT
@@ -1387,7 +1387,7 @@ int * etext_addr;
}
# endif
-# if defined(FREEBSD) && defined(I386) && !defined(PCR)
+# if defined(FREEBSD) && (defined(I386) || defined(powerpc) || defined(__powerpc__)) && !defined(PCR)
/* Its unclear whether this should be identical to the above, or */
/* whether it should apply to non-X86 architectures. */
/* For now we don't assume that there is always an empty page after */
diff --git a/config.sub b/config.sub
index 87a1ee49e67..c2262a72984 100755
--- a/config.sub
+++ b/config.sub
@@ -273,6 +273,9 @@ case $basic_machine in
| z8k)
basic_machine=$basic_machine-unknown
;;
+ m32c)
+ basic_machine=$basic_machine-unknown
+ ;;
m6811 | m68hc11 | m6812 | m68hc12)
# Motorola 68HC11/12.
basic_machine=$basic_machine-unknown
@@ -351,6 +354,8 @@ case $basic_machine in
| ymp-* \
| z8k-*)
;;
+ m32c-*)
+ ;;
# Recognize the various machine names and aliases which stand
# for a CPU type and a company and sometimes even an OS.
386bsd)
diff --git a/config/ChangeLog b/config/ChangeLog
index c773aadd4a9..5fac2d0f49b 100644
--- a/config/ChangeLog
+++ b/config/ChangeLog
@@ -1,3 +1,13 @@
+2005-06-14 Tom Tromey <tromey@redhat.com>
+
+ PR libgcj/19877:
+ * no-executables.m4: Call real AC_FUNC_MMAP when cache variable
+ is set but not 'no'.
+
+2005-06-13 Zack Weinberg <zack@codesourcery.com>
+
+ * depstand.m4, lead-dot.m4: New files.
+
2005-05-19 Kelley Cook <kcook@gcc.gnu.org>
* accross.m4: Delete file.
diff --git a/config/depstand.m4 b/config/depstand.m4
new file mode 100644
index 00000000000..8f936e0c263
--- /dev/null
+++ b/config/depstand.m4
@@ -0,0 +1,136 @@
+## -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# Based on depend.m4 from automake 1.9, modified for standalone use in
+# an environment where GNU make is required.
+
+# ZW_PROG_COMPILER_DEPENDENCIES
+# -----------------------------
+# Variant of _AM_DEPENDENCIES which just does the dependency probe and
+# sets fooDEPMODE accordingly. Cache-variable compatible with
+# original; not side-effect compatible. As the users of this macro
+# may require accurate dependencies for correct builds, it does *not*
+# honor --disable-dependency-checking, and failure to detect a usable
+# method is an error. depcomp is assumed to be located in
+# $ac_aux_dir.
+#
+# FIXME: Should use the Autoconf 2.5x language-selection mechanism.
+
+AC_DEFUN([ZW_PROG_COMPILER_DEPENDENCIES],
+[ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+am_depcomp=$ac_aux_dir/depcomp
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ if test $depmode = none; then break; fi
+
+ _AS_ECHO([$as_me:$LINENO: trying $depmode], AS_MESSAGE_LOG_FD)
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "include sub/conftest.Po" > confmf
+
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ depcmd="depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c"
+ echo "| $depcmd" | sed -e 's/ */ /g' >&AS_MESSAGE_LOG_FD
+ if env $depcmd > conftest.err 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po >>conftest.err 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po >>conftest.err 2>&1 &&
+ ${MAKE-make} -s -f confmf >>conftest.err 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ _AS_ECHO([$as_me:$LINENO: success], AS_MESSAGE_LOG_FD)
+ break
+ fi
+ fi
+ _AS_ECHO([$as_me:$LINENO: failure, diagnostics are:], AS_MESSAGE_LOG_FD)
+ sed -e 's/^/| /' < conftest.err >&AS_MESSAGE_LOG_FD
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+if test x${am_cv_$1_dependencies_compiler_type-none} = xnone
+then AC_MSG_ERROR([no usable dependency style found])
+else AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+fi
+])
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+# ZW_CREATE_DEPDIR
+# ----------------
+# As AM_SET_DEPDIR, but also create the directory at config.status time.
+AC_DEFUN([ZW_CREATE_DEPDIR],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_CONFIG_COMMANDS([depdir], [mkdir $DEPDIR], [DEPDIR=$DEPDIR])
+])
diff --git a/config/lead-dot.m4 b/config/lead-dot.m4
new file mode 100644
index 00000000000..c8789fb2ced
--- /dev/null
+++ b/config/lead-dot.m4
@@ -0,0 +1,32 @@
+# -*- Autoconf -*-
+# Copyright (C) 2003 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+# serial 1
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
diff --git a/config/no-executables.m4 b/config/no-executables.m4
index ca26b7112c6..54e5a024288 100644
--- a/config/no-executables.m4
+++ b/config/no-executables.m4
@@ -53,7 +53,7 @@ if test x$gcc_no_link = xyes; then
ac_cv_func_mmap_fixed_mapped=no
fi
fi
-if test "x${ac_cv_func_mmap_fixed_mapped+set}" != xset; then
+if test "x${ac_cv_func_mmap_fixed_mapped}" != xno; then
m4_defn([AC_FUNC_MMAP])
fi)
diff --git a/configure b/configure
index be814518b79..58fd8852a73 100755
--- a/configure
+++ b/configure
@@ -1036,6 +1036,10 @@ case "${host}" in
configdirs="$configdirs libtermcap" ;;
esac
+# A target can indicate whether a language isn't supported for some reason.
+# Only spaces may be used in this macro; not newlines or tabs.
+unsupported_languages=
+
# Remove more programs from consideration, based on the host or
# target this usually means that a port of the program doesn't
# exist yet.
@@ -1264,15 +1268,18 @@ case "${target}" in
noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj} gcc gdb newlib"
;;
cris-*-* | crisv32-*-*)
- libgcj_ex_libffi=`echo ${libgcj} | sed -e 's/target-libffi//'`
+ unsupported_languages="$unsupported_languages java"
case "${target}" in
*-*-aout)
- noconfigdirs="$noconfigdirs ${libgcj}";;
+ unsupported_languages="$unsupported_languages f95"
+ noconfigdirs="$noconfigdirs target-libffi target-boehm-gc";;
*-*-elf)
- noconfigdirs="$noconfigdirs ${libgcj_ex_libffi}";;
+ unsupported_languages="$unsupported_languages f95"
+ noconfigdirs="$noconfigdirs target-boehm-gc";;
*-*-linux*)
- noconfigdirs="$noconfigdirs ${libgcj_ex_libffi} target-newlib target-libgloss";;
+ noconfigdirs="$noconfigdirs target-newlib target-libgloss";;
*)
+ unsupported_languages="$unsupported_languages f95"
noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss";;
esac
;;
@@ -1422,7 +1429,8 @@ case "${target}" in
noconfigdirs="$noconfigdirs target-libstdc++-v3"
;;
mmix-*-*)
- noconfigdirs="$noconfigdirs ${libgcj} gdb libgloss target-libgfortran"
+ noconfigdirs="$noconfigdirs target-libffi target-boehm-gc gdb libgloss"
+ unsupported_languages="$unsupported_languages f95 java"
;;
mn10200-*-*)
noconfigdirs="$noconfigdirs ${libgcj}"
@@ -1430,6 +1438,9 @@ case "${target}" in
mn10300-*-*)
noconfigdirs="$noconfigdirs ${libgcj}"
;;
+ ms1-*-*)
+ noconfigdirs="$noconfigdirs sim"
+ ;;
powerpc-*-aix*)
# copied from rs6000-*-* entry
noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
@@ -1778,7 +1789,7 @@ else
# 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:1782: checking for $ac_word" >&5
+echo "configure:1793: 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
@@ -1808,7 +1819,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:1812: checking for $ac_word" >&5
+echo "configure:1823: 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
@@ -1859,7 +1870,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:1863: checking for $ac_word" >&5
+echo "configure:1874: 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
@@ -1891,7 +1902,7 @@ fi
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:1895: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:1906: 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.
@@ -1902,12 +1913,12 @@ cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext << EOF
-#line 1906 "configure"
+#line 1917 "configure"
#include "confdefs.h"
main(){return(0);}
EOF
-if { (eval echo configure:1911: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1922: \"$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
@@ -1933,12 +1944,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:1937: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:1948: 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:1942: checking whether we are using GNU C" >&5
+echo "configure:1953: 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
@@ -1947,7 +1958,7 @@ else
yes;
#endif
EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1951: \"$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:1962: \"$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
@@ -1966,7 +1977,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:1970: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1981: 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
@@ -2033,7 +2044,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:2037: checking for $ac_word" >&5
+echo "configure:2048: 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
@@ -2065,7 +2076,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:2069: checking for $ac_word" >&5
+echo "configure:2080: 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
@@ -2098,7 +2109,7 @@ fi
fi
echo $ac_n "checking whether compiler driver understands Ada""... $ac_c" 1>&6
-echo "configure:2102: checking whether compiler driver understands Ada" >&5
+echo "configure:2113: checking whether compiler driver understands Ada" >&5
if eval "test \"`echo '$''{'acx_cv_cc_gcc_supports_ada'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2130,7 +2141,7 @@ else
fi
echo $ac_n "checking how to compare bootstrapped objects""... $ac_c" 1>&6
-echo "configure:2134: checking how to compare bootstrapped objects" >&5
+echo "configure:2145: checking how to compare bootstrapped objects" >&5
if eval "test \"`echo '$''{'gcc_cv_prog_cmp_skip'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2174,7 +2185,7 @@ fi
if test "x$with_mpfr_dir" != x; then
- gmpinc="-I$with_mpfr_dir/mpfr"
+ gmpinc="-I$with_mpfr_dir"
gmplibs="$with_mpfr_dir/libmpfr.a"
else
gmplibs="-lmpfr"
@@ -2228,9 +2239,9 @@ saved_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $gmpinc"
# Check GMP actually works
echo $ac_n "checking for correct version of gmp.h""... $ac_c" 1>&6
-echo "configure:2232: checking for correct version of gmp.h" >&5
+echo "configure:2243: checking for correct version of gmp.h" >&5
cat > conftest.$ac_ext <<EOF
-#line 2234 "configure"
+#line 2245 "configure"
#include "confdefs.h"
#include "gmp.h"
int main() {
@@ -2241,7 +2252,7 @@ choke me
; return 0; }
EOF
-if { (eval echo configure:2245: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2256: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
echo "$ac_t""yes" 1>&6
else
@@ -2254,12 +2265,12 @@ rm -f conftest*
if test x"$have_gmp" = xyes; then
echo $ac_n "checking for MPFR""... $ac_c" 1>&6
-echo "configure:2258: checking for MPFR" >&5
+echo "configure:2269: checking for MPFR" >&5
saved_LIBS="$LIBS"
LIBS="$LIBS $gmplibs"
cat > conftest.$ac_ext <<EOF
-#line 2263 "configure"
+#line 2274 "configure"
#include "confdefs.h"
#include <gmp.h>
#include <mpfr.h>
@@ -2267,7 +2278,7 @@ int main() {
mpfr_t n; mpfr_init(n);
; return 0; }
EOF
-if { (eval echo configure:2271: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2282: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
echo "$ac_t""yes" 1>&6
else
@@ -2400,7 +2411,14 @@ if test -d ${srcdir}/gcc; then
add_this_lang=no
;;
esac
-
+
+ # Disable a language that is unsupported by the target.
+ case " $unsupported_languages " in
+ *" $language "*)
+ add_this_lang=no
+ ;;
+ esac
+
case $add_this_lang in
no)
# Remove language-dependent dirs.
@@ -2754,7 +2772,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:2758: checking for $ac_word" >&5
+echo "configure:2776: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_BISON'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2789,7 +2807,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:2793: checking for $ac_word" >&5
+echo "configure:2811: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_YACC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2824,7 +2842,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:2828: checking for $ac_word" >&5
+echo "configure:2846: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_M4'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2859,7 +2877,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:2863: checking for $ac_word" >&5
+echo "configure:2881: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_FLEX'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2894,7 +2912,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:2898: checking for $ac_word" >&5
+echo "configure:2916: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_LEX'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2929,7 +2947,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:2933: checking for $ac_word" >&5
+echo "configure:2951: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_MAKEINFO'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3536,7 +3554,7 @@ test -n "$target_alias" && ncn_target_tool_prefix=$target_alias-
# Extract the first word of "${ncn_tool_prefix}ar", so it can be a program name with args.
set dummy ${ncn_tool_prefix}ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3540: checking for $ac_word" >&5
+echo "configure:3558: 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
@@ -3569,7 +3587,7 @@ if test -z "$ac_cv_prog_AR" ; then
# Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3573: checking for $ac_word" >&5
+echo "configure:3591: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_AR'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3608,7 +3626,7 @@ fi
# Extract the first word of "${ncn_tool_prefix}as", so it can be a program name with args.
set dummy ${ncn_tool_prefix}as; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3612: checking for $ac_word" >&5
+echo "configure:3630: 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
@@ -3641,7 +3659,7 @@ if test -z "$ac_cv_prog_AS" ; then
# Extract the first word of "as", so it can be a program name with args.
set dummy as; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3645: checking for $ac_word" >&5
+echo "configure:3663: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_AS'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3680,7 +3698,7 @@ fi
# Extract the first word of "${ncn_tool_prefix}dlltool", so it can be a program name with args.
set dummy ${ncn_tool_prefix}dlltool; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3684: checking for $ac_word" >&5
+echo "configure:3702: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3713,7 +3731,7 @@ if test -z "$ac_cv_prog_DLLTOOL" ; then
# Extract the first word of "dlltool", so it can be a program name with args.
set dummy dlltool; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3717: checking for $ac_word" >&5
+echo "configure:3735: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_DLLTOOL'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3752,7 +3770,7 @@ fi
# Extract the first word of "${ncn_tool_prefix}ld", so it can be a program name with args.
set dummy ${ncn_tool_prefix}ld; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3756: checking for $ac_word" >&5
+echo "configure:3774: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3785,7 +3803,7 @@ if test -z "$ac_cv_prog_LD" ; then
# Extract the first word of "ld", so it can be a program name with args.
set dummy ld; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3789: checking for $ac_word" >&5
+echo "configure:3807: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_LD'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3824,7 +3842,7 @@ fi
# Extract the first word of "${ncn_tool_prefix}nm", so it can be a program name with args.
set dummy ${ncn_tool_prefix}nm; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3828: checking for $ac_word" >&5
+echo "configure:3846: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_NM'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3857,7 +3875,7 @@ if test -z "$ac_cv_prog_NM" ; then
# Extract the first word of "nm", so it can be a program name with args.
set dummy nm; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3861: checking for $ac_word" >&5
+echo "configure:3879: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_NM'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3896,7 +3914,7 @@ fi
# Extract the first word of "${ncn_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ncn_tool_prefix}ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3900: checking for $ac_word" >&5
+echo "configure:3918: 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
@@ -3929,7 +3947,7 @@ if test -z "$ac_cv_prog_RANLIB" ; then
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3933: checking for $ac_word" >&5
+echo "configure:3951: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3968,7 +3986,7 @@ fi
# Extract the first word of "${ncn_tool_prefix}windres", so it can be a program name with args.
set dummy ${ncn_tool_prefix}windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3972: checking for $ac_word" >&5
+echo "configure:3990: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4001,7 +4019,7 @@ if test -z "$ac_cv_prog_WINDRES" ; then
# Extract the first word of "windres", so it can be a program name with args.
set dummy windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4005: checking for $ac_word" >&5
+echo "configure:4023: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_WINDRES'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4040,7 +4058,7 @@ fi
# Extract the first word of "${ncn_tool_prefix}objcopy", so it can be a program name with args.
set dummy ${ncn_tool_prefix}objcopy; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4044: checking for $ac_word" >&5
+echo "configure:4062: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_OBJCOPY'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4073,7 +4091,7 @@ if test -z "$ac_cv_prog_OBJCOPY" ; then
# Extract the first word of "objcopy", so it can be a program name with args.
set dummy objcopy; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4077: checking for $ac_word" >&5
+echo "configure:4095: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_OBJCOPY'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4112,7 +4130,7 @@ fi
# Extract the first word of "${ncn_tool_prefix}objdump", so it can be a program name with args.
set dummy ${ncn_tool_prefix}objdump; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4116: checking for $ac_word" >&5
+echo "configure:4134: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_OBJDUMP'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4145,7 +4163,7 @@ if test -z "$ac_cv_prog_OBJDUMP" ; then
# Extract the first word of "objdump", so it can be a program name with args.
set dummy objdump; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4149: checking for $ac_word" >&5
+echo "configure:4167: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_OBJDUMP'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4191,7 +4209,7 @@ fi
# Extract the first word of "${ncn_target_tool_prefix}ar", so it can be a program name with args.
set dummy ${ncn_target_tool_prefix}ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4195: checking for $ac_word" >&5
+echo "configure:4213: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_AR_FOR_TARGET'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4224,7 +4242,7 @@ if test -z "$ac_cv_prog_CONFIGURED_AR_FOR_TARGET" ; then
# Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4228: checking for $ac_word" >&5
+echo "configure:4246: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_AR_FOR_TARGET'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4263,7 +4281,7 @@ fi
# Extract the first word of "${ncn_target_tool_prefix}as", so it can be a program name with args.
set dummy ${ncn_target_tool_prefix}as; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4267: checking for $ac_word" >&5
+echo "configure:4285: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_AS_FOR_TARGET'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4296,7 +4314,7 @@ if test -z "$ac_cv_prog_CONFIGURED_AS_FOR_TARGET" ; then
# Extract the first word of "as", so it can be a program name with args.
set dummy as; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4300: checking for $ac_word" >&5
+echo "configure:4318: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_AS_FOR_TARGET'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4335,7 +4353,7 @@ fi
# Extract the first word of "${ncn_target_tool_prefix}dlltool", so it can be a program name with args.
set dummy ${ncn_target_tool_prefix}dlltool; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4339: checking for $ac_word" >&5
+echo "configure:4357: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_DLLTOOL_FOR_TARGET'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4368,7 +4386,7 @@ if test -z "$ac_cv_prog_CONFIGURED_DLLTOOL_FOR_TARGET" ; then
# Extract the first word of "dlltool", so it can be a program name with args.
set dummy dlltool; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4372: checking for $ac_word" >&5
+echo "configure:4390: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_DLLTOOL_FOR_TARGET'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4407,7 +4425,7 @@ fi
# Extract the first word of "${ncn_target_tool_prefix}ld", so it can be a program name with args.
set dummy ${ncn_target_tool_prefix}ld; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4411: checking for $ac_word" >&5
+echo "configure:4429: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_LD_FOR_TARGET'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4440,7 +4458,7 @@ if test -z "$ac_cv_prog_CONFIGURED_LD_FOR_TARGET" ; then
# Extract the first word of "ld", so it can be a program name with args.
set dummy ld; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4444: checking for $ac_word" >&5
+echo "configure:4462: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_LD_FOR_TARGET'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4479,7 +4497,7 @@ fi
# Extract the first word of "${ncn_target_tool_prefix}nm", so it can be a program name with args.
set dummy ${ncn_target_tool_prefix}nm; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4483: checking for $ac_word" >&5
+echo "configure:4501: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_NM_FOR_TARGET'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4512,7 +4530,7 @@ if test -z "$ac_cv_prog_CONFIGURED_NM_FOR_TARGET" ; then
# Extract the first word of "nm", so it can be a program name with args.
set dummy nm; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4516: checking for $ac_word" >&5
+echo "configure:4534: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_NM_FOR_TARGET'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4551,7 +4569,7 @@ fi
# Extract the first word of "${ncn_target_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ncn_target_tool_prefix}ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4555: checking for $ac_word" >&5
+echo "configure:4573: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_RANLIB_FOR_TARGET'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4584,7 +4602,7 @@ if test -z "$ac_cv_prog_CONFIGURED_RANLIB_FOR_TARGET" ; then
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4588: checking for $ac_word" >&5
+echo "configure:4606: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_RANLIB_FOR_TARGET'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4623,7 +4641,7 @@ fi
# Extract the first word of "${ncn_target_tool_prefix}windres", so it can be a program name with args.
set dummy ${ncn_target_tool_prefix}windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4627: checking for $ac_word" >&5
+echo "configure:4645: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CONFIGURED_WINDRES_FOR_TARGET'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4656,7 +4674,7 @@ if test -z "$ac_cv_prog_CONFIGURED_WINDRES_FOR_TARGET" ; then
# Extract the first word of "windres", so it can be a program name with args.
set dummy windres; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4660: checking for $ac_word" >&5
+echo "configure:4678: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_ncn_cv_CONFIGURED_WINDRES_FOR_TARGET'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4741,7 +4759,7 @@ RANLIB_FOR_TARGET=${RANLIB_FOR_TARGET}${extra_ranlibflags_for_target}
NM_FOR_TARGET=${NM_FOR_TARGET}${extra_nmflags_for_target}
echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
-echo "configure:4745: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo "configure:4763: 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"
@@ -4788,7 +4806,7 @@ esac
# gcc for stageN-gcc and stagePREV-gcc for stage(N-1). In case this is not
# possible, however, we can resort to mv.
echo $ac_n "checking if symbolic links between directories work""... $ac_c" 1>&6
-echo "configure:4792: checking if symbolic links between directories work" >&5
+echo "configure:4810: checking if symbolic links between directories work" >&5
if eval "test \"`echo '$''{'gcc_cv_prog_ln_s_dir'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -4902,15 +4920,34 @@ trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
# Transform confdefs.h into DEFS.
# Protect against shell expansion while executing Makefile rules.
# Protect against Makefile macro expansion.
-cat > conftest.defs <<\EOF
-s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
-s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
-s%\[%\\&%g
-s%\]%\\&%g
-s%\$%$$%g
-EOF
-DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
-rm -f conftest.defs
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then we branch to the quote section. Otherwise,
+# look for a macro that doesn't take arguments.
+cat >confdef2opt.sed <<\_ACEOF
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g
+t quote
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g
+t quote
+d
+: quote
+s,[ `~#$^&*(){}\\|;'"<>?],\\&,g
+s,\[,\\&,g
+s,\],\\&,g
+s,\$,$$,g
+p
+_ACEOF
+# We use echo to avoid assuming a particular line-breaking character.
+# The extra dot is to prevent the shell from consuming trailing
+# line-breaks from the sub-command output. A line-break within
+# single-quotes doesn't work because, if this script is created in a
+# platform that uses two characters for line-breaks (e.g., DOS), tr
+# would break.
+ac_LF_and_DOT=`echo; echo .`
+DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'`
+rm -f confdef2opt.sed
# Without the "./", some shells look in PATH for config.status.
diff --git a/configure.in b/configure.in
index c2ced9168a7..8535589ed22 100644
--- a/configure.in
+++ b/configure.in
@@ -257,6 +257,10 @@ case "${host}" in
configdirs="$configdirs libtermcap" ;;
esac
+# A target can indicate whether a language isn't supported for some reason.
+# Only spaces may be used in this macro; not newlines or tabs.
+unsupported_languages=
+
# Remove more programs from consideration, based on the host or
# target this usually means that a port of the program doesn't
# exist yet.
@@ -481,15 +485,18 @@ case "${target}" in
noconfigdirs="$noconfigdirs target-libstdc++-v3 target-libgloss ${libgcj} gcc gdb newlib"
;;
cris-*-* | crisv32-*-*)
- libgcj_ex_libffi=`echo ${libgcj} | sed -e 's/target-libffi//'`
+ unsupported_languages="$unsupported_languages java"
case "${target}" in
*-*-aout)
- noconfigdirs="$noconfigdirs ${libgcj}";;
+ unsupported_languages="$unsupported_languages f95"
+ noconfigdirs="$noconfigdirs target-libffi target-boehm-gc";;
*-*-elf)
- noconfigdirs="$noconfigdirs ${libgcj_ex_libffi}";;
+ unsupported_languages="$unsupported_languages f95"
+ noconfigdirs="$noconfigdirs target-boehm-gc";;
*-*-linux*)
- noconfigdirs="$noconfigdirs ${libgcj_ex_libffi} target-newlib target-libgloss";;
+ noconfigdirs="$noconfigdirs target-newlib target-libgloss";;
*)
+ unsupported_languages="$unsupported_languages f95"
noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss";;
esac
;;
@@ -639,7 +646,8 @@ case "${target}" in
noconfigdirs="$noconfigdirs target-libstdc++-v3"
;;
mmix-*-*)
- noconfigdirs="$noconfigdirs ${libgcj} gdb libgloss target-libgfortran"
+ noconfigdirs="$noconfigdirs target-libffi target-boehm-gc gdb libgloss"
+ unsupported_languages="$unsupported_languages f95 java"
;;
mn10200-*-*)
noconfigdirs="$noconfigdirs ${libgcj}"
@@ -647,6 +655,9 @@ case "${target}" in
mn10300-*-*)
noconfigdirs="$noconfigdirs ${libgcj}"
;;
+ ms1-*-*)
+ noconfigdirs="$noconfigdirs sim"
+ ;;
powerpc-*-aix*)
# copied from rs6000-*-* entry
noconfigdirs="$noconfigdirs gprof target-libgloss ${libgcj}"
@@ -1030,7 +1041,7 @@ have_gmp=yes
AC_ARG_WITH(mpfr-dir, [ --with-mpfr-dir=PATH Specify source directory for MPFR library])
if test "x$with_mpfr_dir" != x; then
- gmpinc="-I$with_mpfr_dir/mpfr"
+ gmpinc="-I$with_mpfr_dir"
gmplibs="$with_mpfr_dir/libmpfr.a"
else
gmplibs="-lmpfr"
@@ -1207,7 +1218,14 @@ if test -d ${srcdir}/gcc; then
add_this_lang=no
;;
esac
-
+
+ # Disable a language that is unsupported by the target.
+ case " $unsupported_languages " in
+ *" $language "*)
+ add_this_lang=no
+ ;;
+ esac
+
case $add_this_lang in
no)
# Remove language-dependent dirs.
diff --git a/contrib/ChangeLog b/contrib/ChangeLog
index b5bc02cab31..2c3fe2f22f0 100644
--- a/contrib/ChangeLog
+++ b/contrib/ChangeLog
@@ -1,3 +1,7 @@
+2005-06-05 Gerald Pfeifer <gerald@pfeifer.com>
+
+ * gennews (files): Update for egcs-1.0 release pages consolidation.
+
2005-04-17 Joseph S. Myers <joseph@codesourcery.com>
* gennews (files): Update for GCC 4.0.
diff --git a/contrib/gennews b/contrib/gennews
index 14a76b22510..ec8f056ac16 100755
--- a/contrib/gennews
+++ b/contrib/gennews
@@ -30,8 +30,7 @@ files="gcc-4.0/index.html gcc-4.0/changes.html
gcc-3.0/gcc-3.0.html gcc-3.0/features.html gcc-3.0/caveats.html
gcc-2.95/index.html gcc-2.95/features.html gcc-2.95/caveats.html
egcs-1.1/index.html egcs-1.1/features.html egcs-1.1/caveats.html
- egcs-1.0/egcs-1.0.3.html egcs-1.0/egcs-1.0.2.html egcs-1.0/egcs-1.0.1.html
- egcs-1.0/egcs-1.0.html egcs-1.0/features.html egcs-1.0/caveats.html"
+ egcs-1.0/index.html egcs-1.0/features.html egcs-1.0/caveats.html"
set -e
diff --git a/contrib/regression/ChangeLog b/contrib/regression/ChangeLog
index 23e1e287fd2..ae577173200 100644
--- a/contrib/regression/ChangeLog
+++ b/contrib/regression/ChangeLog
@@ -1,3 +1,15 @@
+2005-06-07 Hans-Peter Nilsson <hp@bitrange.com>
+
+ * btest-gcc.sh: Add support for option
+ --add-passes-despite-regression.
+
+2005-06-06 Hans-Peter Nilsson <hp@axis.com>
+
+ * btest-gcc.sh <Build>: Don't pass --with-newlib when target is
+ "*-linux*".
+
+ * btest-gcc.sh (TESTLOGS): Make libstdc++.sum optional.
+
2004-11-07 James A. Morrison <phython@gcc.gnu.org>
* README: Update website URL.
diff --git a/contrib/regression/btest-gcc.sh b/contrib/regression/btest-gcc.sh
index 6311a6c1dff..2e9ea1e52d7 100755
--- a/contrib/regression/btest-gcc.sh
+++ b/contrib/regression/btest-gcc.sh
@@ -1,7 +1,7 @@
#!/bin/sh
# Test GCC.
-# Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2001, 2002, 2005 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
@@ -18,7 +18,20 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# INPUT:
-# btest <target> <source> <prefix> <state> <build>
+# btest <options> <target> <source> <prefix> <state> <build>
+
+add_passes_despite_regression=0
+
+# <options> can be
+# --add-passes-despite-regression:
+# Add new "PASSes" despite there being some regressions.
+
+case "$1" in
+ --add-passes-despite-regression)
+ add_passes_despite_regression=1; shift;;
+ --*) echo "Invalid option: $1"; exit 2;;
+esac
+
# 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.
@@ -98,8 +111,7 @@ H_REAL_TARGET=`$SOURCE/config.sub $H_TARGET || exit 1`
# look at.
TESTLOGS="gcc/testsuite/gcc.sum
gcc/testsuite/g++.sum
-gcc/testsuite/objc.sum
-$H_TARGET/libstdc++-v3/testsuite/libstdc++.sum"
+gcc/testsuite/objc.sum"
# Build.
echo build > $RESULT
@@ -111,8 +123,12 @@ if [ $H_HOST = $H_TARGET ] ; then
make all || exit 1
fi
else
- $SOURCE/configure --prefix=$PREFIX --target=$H_TARGET \
- --with-gnu-ld --with-gnu-as --with-newlib || exit 1
+ withopt="--with-gnu-ld --with-gnu-as"
+ case "$H_TARGET" in
+ *-linux*) ;;
+ *) withopt="$withopt --with-newlib";;
+ esac
+ $SOURCE/configure --prefix=$PREFIX --target=$H_TARGET $withopt || exit 1
make || exit 1
fi
echo error > $RESULT || exit 1
@@ -122,6 +138,9 @@ make -k check-gcc
# Test libstd++-v3
make check-target-libstdc++-v3
+if [ -f $BUILD/$H_TARGET/libstdc++-v3/testsuite/libstdc++.sum ] ; then
+ TESTLOGS="$TESTLOGS $H_TARGET/libstdc++-v3/testsuite/libstdc++.sum"
+fi
# Test libffi
make check-target-libffi
@@ -172,17 +191,38 @@ for LOG in $TESTLOGS ; do
done | sort | uniq > $FAILED || exit 1
comm -12 $FAILED $PASSES >> $REGRESS || exit 1
NUMREGRESS=`wc -l < $REGRESS | tr -d ' '`
+
+if [ $NUMREGRESS -eq 0 ] || [ $add_passes_despite_regression -ne 0 ] ; then
+ # Update the state.
+ for LOG in $TESTLOGS ; do
+ L=`basename $LOG`
+ awk '/^PASS: / { print "'$L'",$2; }' $LOG || exit 1
+ done | sort | uniq | comm -23 - $FAILED > ${PASSES}~ || exit 1
+ [ -s ${PASSES}~ ] || exit 1
+ if [ $NUMREGRESS -ne 0 ] ; then
+ # The way we keep track of new PASSes when in "regress-N" for
+ # --add-passes-despite-regression, is to *add* them to previous
+ # PASSes. Just as without this option, we don't forget *any* PASS
+ # lines, because besides the ones in $REGRESS that we definitely
+ # don't want to lose, their removal or rename may have been a
+ # mistake (as in, the cause of the "regress-N" state). If they
+ # come back, we then know they're regressions.
+ cat ${PASSES}~ ${PASSES} | sort -u > ${PASSES}~~
+ mv ${PASSES}~~ ${PASSES} || exit 1
+ rm ${PASSES}~ || exit 1
+ else
+ # In contrast to the merging for "regress-N", we just overwrite
+ # the known PASSes when in the "pass" state, so we get rid of
+ # stale PASS lines for removed, moved or otherwise changed tests
+ # which may be added back with a different meaning later on.
+ mv ${PASSES}~ ${PASSES} || exit 1
+ fi
+fi
+
if [ $NUMREGRESS -ne 0 ] ; then
echo regress-$NUMREGRESS > $RESULT
exit 1
fi
-# It passed. Update the state.
-for LOG in $TESTLOGS ; do
- L=`basename $LOG`
- awk '/^PASS: / { print "'$L'",$2; }' $LOG || exit 1
-done | sort | uniq | comm -23 - $FAILED > ${PASSES}~ || exit 1
-[ -s ${PASSES}~ ] || exit 1
-mv ${PASSES}~ ${PASSES} || exit 1
echo pass > $RESULT
exit 0
diff --git a/depcomp b/depcomp
index 11e2d3bfe1c..3510ab0ff53 100755
--- a/depcomp
+++ b/depcomp
@@ -1,9 +1,9 @@
#! /bin/sh
# depcomp - compile a program generating dependencies as side-effects
-scriptversion=2004-05-31.23
+scriptversion=2005-05-16.16
-# Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 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
@@ -17,8 +17,8 @@ scriptversion=2004-05-31.23
# 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.
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
@@ -50,11 +50,11 @@ Environment variables:
Report bugs to <bug-automake@gnu.org>.
EOF
- exit 0
+ exit $?
;;
-v | --v*)
echo "depcomp $scriptversion"
- exit 0
+ exit $?
;;
esac
@@ -276,6 +276,29 @@ icc)
rm -f "$tmpdepfile"
;;
+ia64hp)
+ # The "hp" stanza above does not work with HP's ia64 compilers,
+ # which have integrated preprocessors. The correct option to use
+ # with these is +Maked; it writes dependencies to a file named
+ # 'foo.d', which lands next to the object file, wherever that
+ # happens to be.
+ tmpdepfile=`echo "$object" | sed -e 's/\.o$/.d/'`
+ "$@" +Maked
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ # The object file name is correct already.
+ cat "$tmpdepfile" > "$depfile"
+ # Add `dependent.h:' lines.
+ sed -ne '2,${; s/^ //; s/ \\*$//; s/$/:/; p; }' "$tmpdepfile" >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
tru64)
# The Tru64 compiler uses -MD to generate dependencies as a side
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
@@ -287,36 +310,43 @@ tru64)
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
if test "$libtool" = yes; then
- # Dependencies are output in .lo.d with libtool 1.4.
- # With libtool 1.5 they are output both in $dir.libs/$base.o.d
- # and in $dir.libs/$base.o.d and $dir$base.o.d. We process the
- # latter, because the former will be cleaned when $dir.libs is
- # erased.
- tmpdepfile1="$dir.libs/$base.lo.d"
- tmpdepfile2="$dir$base.o.d"
- tmpdepfile3="$dir.libs/$base.d"
+ # With Tru64 cc, shared objects can also be used to make a
+ # static library. This mecanism is used in libtool 1.4 series to
+ # handle both shared and static libraries in a single compilation.
+ # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+ #
+ # With libtool 1.5 this exception was removed, and libtool now
+ # generates 2 separate objects for the 2 libraries. These two
+ # compilations output dependencies in in $dir.libs/$base.o.d and
+ # in $dir$base.o.d. We have to check for both files, because
+ # one of the two compilations can be disabled. We should prefer
+ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+ # automatically cleaned when .libs/ is deleted, while ignoring
+ # the former would cause a distcleancheck panic.
+ tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
+ tmpdepfile2=$dir$base.o.d # libtool 1.5
+ tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
+ tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
"$@" -Wc,-MD
else
- tmpdepfile1="$dir$base.o.d"
- tmpdepfile2="$dir$base.d"
- tmpdepfile3="$dir$base.d"
+ tmpdepfile1=$dir$base.o.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ tmpdepfile4=$dir$base.d
"$@" -MD
fi
stat=$?
if test $stat -eq 0; then :
else
- rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
exit $stat
fi
- if test -f "$tmpdepfile1"; then
- tmpdepfile="$tmpdepfile1"
- elif test -f "$tmpdepfile2"; then
- tmpdepfile="$tmpdepfile2"
- else
- tmpdepfile="$tmpdepfile3"
- fi
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ do
+ test -f "$tmpdepfile" && break
+ done
if test -f "$tmpdepfile"; then
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
# That's a tab and a space in the [].
@@ -460,7 +490,8 @@ cpp)
done
"$@" -E |
- sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+ sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
sed '$ s: \\$::' > "$tmpdepfile"
rm -f "$depfile"
echo "$object : \\" > "$depfile"
diff --git a/fixincludes/ChangeLog b/fixincludes/ChangeLog
index de13766fa73..b985434dafd 100644
--- a/fixincludes/ChangeLog
+++ b/fixincludes/ChangeLog
@@ -1,3 +1,17 @@
+2005-06-15 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
+
+ PR libfortran/15266
+ * inclhack.def (broken_cabs): Mention IRIX 5/6 problem.
+ Use double quotes in select so \t matches tabs.
+ Add IRIX testcase.
+ * fixincl.x: Regenerate.
+ * tests/base/math.h [BROKEN_CABS_CHECK]: Adapt for new testcase.
+
+2005-05-22 Danny Smith <dannysmith@users.souceforge.net>
+
+ PR target/21683
+ * fixincl.c: Don't include <sys/wait.h> if SEPARATE_FIX_PROC.
+
2005-05-19 Eric Botcazou <ebotcazou@libertysurf.fr>
Joseph S. Myers <joseph@codesourcery.com>
diff --git a/fixincludes/fixincl.c b/fixincludes/fixincl.c
index 5f07afa408f..6d967e6428b 100644
--- a/fixincludes/fixincl.c
+++ b/fixincludes/fixincl.c
@@ -24,7 +24,9 @@ Boston, MA 02111-1307, USA. */
#include "fixlib.h"
#include <sys/stat.h>
+#ifndef SEPARATE_FIX_PROC
#include <sys/wait.h>
+#endif
#if defined( HAVE_MMAP_FILE )
#include <sys/mman.h>
diff --git a/fixincludes/fixincl.x b/fixincludes/fixincl.x
index 9b39019fe6f..a91d8e3b74b 100644
--- a/fixincludes/fixincl.x
+++ b/fixincludes/fixincl.x
@@ -2,11 +2,11 @@
*
* DO NOT EDIT THIS FILE (fixincl.x)
*
- * It has been AutoGen-ed Thursday May 19, 2005 at 08:56:10 AM CEST
+ * It has been AutoGen-ed Wednesday June 8, 2005 at 12:02:02 AM MEST
* From the definitions inclhack.def
* and the template file fixincl
*/
-/* DO NOT CVS-MERGE THIS FILE, EITHER Thu May 19 08:56:10 CEST 2005
+/* DO NOT CVS-MERGE THIS FILE, EITHER Wed Jun 8 00:02:03 MEST 2005
*
* You must regenerate it. Use the ./genfixes script.
*
@@ -1511,7 +1511,7 @@ tSCC zBroken_CabsList[] =
* content selection pattern - do fix if pattern found
*/
tSCC zBroken_CabsSelect0[] =
- "^extern[ \\t]+double[ \\t]+cabs";
+ "^extern[ \t]+double[ \t]+cabs";
#define BROKEN_CABS_TEST_CT 1
static tTestDesc aBroken_CabsTests[] = {
diff --git a/fixincludes/inclhack.def b/fixincludes/inclhack.def
index 447997b14fb..798e8bcb207 100644
--- a/fixincludes/inclhack.def
+++ b/fixincludes/inclhack.def
@@ -907,6 +907,8 @@ fix = {
/*
* Remove `extern double cabs' declarations from math.h.
* This conflicts with C99. Discovered on AIX.
+ * IRIX 5 and IRIX 6 before 6.5.18 (where C99 support was introduced)
+ * declares cabs() to take a struct __cabs_s argument.
* SunOS4 has its cabs() declaration followed by a comment which
* terminates on the following line.
* Darwin hides its broken cabs in architecture-specific subdirs.
@@ -916,7 +918,7 @@ fix = {
files = "math.h";
files = "architecture/ppc/math.h";
files = "architecture/i386/math.h";
- select = '^extern[ \t]+double[ \t]+cabs';
+ select = "^extern[ \t]+double[ \t]+cabs";
c_fix = format;
c_fix_arg = "";
@@ -929,7 +931,8 @@ fix = {
"#endif\n"
"extern double cabs ( _Complex z );\n"
"extern double cabs(); /* This is a comment\n"
- " and it ends here. */";
+ " and it ends here. */\n"
+ "extern double cabs(struct __cabs_s);";
};
diff --git a/fixincludes/tests/base/math.h b/fixincludes/tests/base/math.h
index 945cc04e11e..37d34c58d60 100644
--- a/fixincludes/tests/base/math.h
+++ b/fixincludes/tests/base/math.h
@@ -28,6 +28,7 @@ struct exception;
/* This is a comment
and it ends here. */
+
#endif /* BROKEN_CABS_CHECK */
diff --git a/gcc/ABOUT-GCC-NLS b/gcc/ABOUT-GCC-NLS
index b0919d1b2ac..8107d583e07 100644
--- a/gcc/ABOUT-GCC-NLS
+++ b/gcc/ABOUT-GCC-NLS
@@ -25,15 +25,22 @@ responsibility to translate the message before the user sees it.
By convention, any function parameter in the GCC sources whose name
ends in `msgid' is expected to be a message requiring translation.
-For example, the `error' function's first parameter is named `msgid'.
+If the parameter name ends with `gmsgid', it is assumed to be a GCC
+diagnostics format string requiring translation, if it ends with
+`cmsgid', it is assumed to be a format string for `printf' family
+of functions, requiring a translation.
+For example, the `error' function's first parameter is named `gmsgid'.
GCC's exgettext script uses this convention to determine which
function parameter strings need to be translated. The exgettext
script also assumes that any occurrence of `%eMSGID}' on a source
line, where MSGID does not contain `%' or `}', corresponds to a
message MSGID that requires translation; this is needed to identify
diagnostics in GCC spec strings.
+The `G_(GMSGID)' macro defined in intl.h can be used to mark GCC diagnostics
+format strings as requiring translation, but other than that it is a
+no-op at runtime.
-If you modify source files, you'll need at least version 0.10.37 of the
+If you modify source files, you'll need at least version 0.14.15 of the
GNU gettext package to propagate the modifications to the translation
tables.
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8ae7f780dbf..82fb8a6ca94 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,3036 @@
+2005-06-16 Jan Hubicka <jh@suse.cz>
+
+ * Makefile.in (cfg.o): Add new dependencies.
+ * basic-block.h (reorder_block_def): Kill
+ original/copy/duplicated/copy_number fields.
+ (BB_DUPLICATED): New flag.
+ (initialize_original_copy_tables, free_original_copy_tables,
+ set_bb_original, get_bb_original, set_bb_copy, get_bb_copy): New.
+ * cfg.c: Include hashtab.h and alloc-pool.h
+ (bb_original, bb_copy, original_copy_bb_pool): New static vars.
+ (htab_bb_copy_original_entry): New struct.
+ (bb_copy_original_hash, bb_copy_original_eq): New static functions.
+ (initialize_original_copy_tables, free_original_copy_tables,
+ set_bb_original, get_bb_original, set_bb_copy, get_bb_copy): New
+ global functions.
+ * cfghooks.c (duplicate_block): Update original/copy handling.
+ * cfglayout.c (fixup_reorder_chain): Likewise.
+ (cfg_layout_initialize): Initialize orignal_copy tables.
+ (cfg_layout_finalize): FInalize original_copy tables.
+ (can_copy_bbs_p): Use BB_DUPLICATED flag.
+ (copy_bbs): Likewise.
+ * cfgloopmanip.c (update-single_exits_after_duplication): Likewise.
+ (duplicate_loop_to_header_edge): Likewise; update handling of
+ copy_number.
+ (loop_version): Likewise.
+ * dominance.c (get_dominated_by_region): Use BB_DUPLICATED_FLAG.
+ * except.c (expand_resx_expr): Check that reg->resume is not set.
+ * loop-unroll.c (unroll_loop_constant_iterations,
+ unroll_loop_runtime_iterations, apply_opt_in_copies): Update
+ copy/original handling.
+ * loop-unwitch.c (unswitch_loop): Likewise.
+ * tree-cfg.c (create_bb): Do not initialize RBI.
+ (disband_implicit_edges): Do not kill RBI.
+ (add_phi_args_after_copy_bb): Use new original/copy mapping.
+ (add_phi_args_after_copy): Use BB_DUPLICATED flag.
+ (tree_duplicate_sese_region): Update original/copy handling.
+ * tree-ssa-loop-ivcanon.c (try_unroll_loop_completely): Likewise.
+ * tree-ssa-loop-manip.c (copy_phi_node_args): Likewise.
+ * tree-ssa-loop-unswitch.c (tree_unswitch_single_loop): Likewise.
+
+2005-06-15 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR tree-opt/21923
+ * tree-ssa.c (tree_ssa_useless_type_conversion_1): Conversions between
+ integer types whos ranges are different are not useless.
+
+2005-06-15 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR tree-opt/22024
+ * tree-ssa-reassoc.c (init_reassoc): Also give chain decl a distint
+ rank.
+
+2005-06-15 Diego Novillo <dnovillo@redhat.com>
+
+ * tree-ssa-structalias.c (dump_solution_for_var): Reformat
+ output.
+ (dump_sa_points_to_info): Make extern.
+ (debug_sa_points_to_info): New.
+ * tree-ssa-structalias.h (TREE_SSA_STRUCTALIAS_H): Rename from
+ TREE_ALIAS_COMMON.
+ (dump_sa_points_to_info): Declare.
+ (debug_sa_points_to_info): Declare.
+
+2005-06-15 Joseph S. Myers <joseph@codesourcery.com>
+
+ * c-tree.h (default_function_array_conversion): Declare.
+ * c-typeck.c (default_function_array_conversion): Export. Correct
+ comment.
+ (default_conversion): Do not call
+ default_function_array_conversion. Do not allow FUNCTION_TYPE.
+ (build_function_call): Call default_function_array_conversion on
+ the function.
+ (convert_arguments): Do not call it on the function arguments.
+ (build_unary_op): Do not allow ARRAY_TYPE or FUNCTION_TYPE for
+ TRUTH_NOT_EXPR. Call default_function_array_conversion for taking
+ address of ARRAY_REF.
+ (build_compound_expr): Do not call
+ default_function_array_conversion.
+ (build_c_cast): Do not call default_function_array_conversion.
+ (convert_for_assignment): Do not call default_conversion.
+ (digest_init): Call default_function_array_conversion to convert
+ string constants and compound literals to pointers, but not
+ otherwise.
+ (output_init_element): Likewise.
+ (build_asm_expr): Do not call default_function_array_conversion.
+ (c_process_expr_stmt): Likewise.
+ (c_objc_common_truthvalue_conversion): Likewise. Do not allow
+ FUNCTION_TYPE.
+ * c-parser.c (c_parser_expression_conv): New.
+ (c_parser_asm_operands, c_parser_expr_list): Add convert_p
+ argument. All callers changed. Call
+ default_function_array_conversion if convert_p.
+ (c_parser_initializer, c_parser_initval): Call
+ default_function_array_conversion except for string constants and
+ compound literals.
+ (c_parser_initelt): Call default_function_array_conversion for
+ ObjC expression received.
+ (c_parser_statement_after_labels): Call c_parser_expression_conv
+ for return and expression statements.
+ (c_parser_paren_condition, c_parser_for_statement,
+ c_parser_conditional_expression): Call c_parser_expression_conv.
+ (c_parser_expr_no_commas, c_parser_conditional_expression,
+ c_parser_binary_expression, c_parser_cast_expression,
+ c_parser_unary_expression): Call
+ default_function_array_conversion.
+
+2005-06-15 Diego Novillo <dnovillo@redhat.com>
+
+ * tree-vrp.c (vrp_int_const_binop): Do not handle MAX_EXPR
+ when the result overflows.
+
+2005-06-15 David Ung <davidu@mips.com>
+
+ * config/mips/mips.c (mips_rtx_cost_data): Add cost for 4kc, 4kp,
+ 24k and 24kx.
+
+2005-06-15 Richard Sandiford <richard@codesourcery.com>
+
+ * doc/invoke.texi (-mips16): Fix typo.
+
+2005-06-15 David Ung <davidu@mips.com>
+
+ * config/mips/mips.h (GENERATE_MIPS16E): New definition.
+ * config/mips/mips.md (zero_extend<SHORT:mode><GPR:mode>2):
+ Changed expand condition to exclude generating of "and" if
+ GENERATE_MIPS16E is true.
+ (*zero_extend<SHORT:mode><GPR:mode>2_mips16e): New pattern for
+ matching mips16e zeb/zeh.
+ (*extend<SHORT:mode><GPR:mode>2_mips16e): New pattern for matching
+ mips16e seb/seh.
+ (*extend<SHORT:mode><GPR:mode>2): Disable this pattern for
+ GENERATE_MIPS16E.
+ * doc/invoke.texi (MIPS Options): Add comment to -mips16
+ indicating MIPS16e ASE is used if targetting for MIPS32 or MIPS64.
+
+2005-06-15 Diego Novillo <dnovillo@redhat.com>
+
+ PR 22018
+ * tree-vrp.c (vrp_int_const_binop): New.
+ (extract_range_from_binary_expr): Call it.
+ Unify handling division and multiplication.
+
+2005-06-15 Aldy Hernandez <aldyh@redhat.com>
+
+ * c-common.h (same_scalar_type_ignoring_signedness): Protoize.
+
+ * c-common.c (same_scalar_type_ignoring_signedness): New.
+
+ * c-typeck.c (build_binary_op): Check compatability of vector
+ types. Move error report after switch.
+ Do not clobber code[01] on *_DIV_EXPR case.
+
+ * testsuite/gcc.dg/simd-1.c: Update error messages.
+ * testsuite/gcc.dg/simd-1b.c: Re-enable tests. Update error
+ messages.
+ * testsuite/gcc.dg/simd-2.c: Update error messages.
+ * testsuite/gcc.dg/simd-4.c: New.
+
+2005-06-15 Bernd Schmidt <bernd.schmidt@analog.com>
+
+ * Makefile.in (local-alloc.o): Depend on $(GGC_H) and reload.h.
+ * local-alloc.c: Include "ggc.h" and "reload.h".
+ (struct equivalence): New member is_arg_equivalence.
+ (local_alloc): Always call update_equiv_regs.
+ (update_equiv_regs): Allocate reg_equiv_init; set reg_equiv_init_size.
+ Detect equivalences made by stores to memory in a second pass.
+ Return early if not optimizing.
+ Initialize reg_equiv_init for all equivalences; treat equivalences for
+ REG_EQUIV notes existing before this pass specially.
+ (no_equiv): Don't clear reg_equiv_init or remove notes if the
+ is_arg_equivalence field is set.
+ * reload.h (reg_equiv_init, reg_equiv_init_size): Declare.
+ * reload1.c (reg_equiv_init): No longer static.
+ (reg_equiv_init_size): New variable.
+ (reload): Don't allocate reg_equiv_init; don't free it when done but
+ clear it.
+ Restructure equivalence set up code not to set reg_equiv_init, but to
+ clear it when we can't use an equivalence.
+ Undo change disabling equivalences for MEM_READONLY_P memrefs.
+ Dump equivalencing insns to dump_file.
+
+2005-06-14 Richard Sandiford <richard@codesourcery.com>
+
+ * config/mips/mips.c (machine_function): Add varargs_size field.
+ (mips_setup_incoming_varargs): Store the amount of extra stack space
+ there rather than in *pretend_size. When saving registers, always
+ expect virtual_incoming_args_rtx to point to the start of the
+ pretend arguments.
+ (mips_va_start): Remove alignment hack. Handle all
+ !EABI_FLOAT_VARARGS_P cases in the same way.
+ (compute_frame_size): Handle varargs_size. Remove the redundant
+ !TARGET_OLDABI condition in the handling of pretend_args_size.
+ (mips_initial_elimination_offset): Remove the now-redundant check
+ of TARGET_NEWABI.
+
+2005-06-14 Jeff Law <law@redhat.com>
+
+ * tree-vrp.c (local_fold): Remove.
+ (simplify_using_ranges): Use fold_convert, not local_fold. Tweak
+ DIV/MOD case slightly for readability.
+
+2005-06-14 Frank Ch. Eigler <fche@redhat.com>
+
+ PR mudflap/21023
+ * tree-mudflap.c (mudflap_finish_file): Exclude non-public
+ rather than static objects (!) from libmudflap registration.
+
+2005-06-14 Richard Sandiford <richard@codesourcery.com>
+
+ * opt-functions.awk (global_state_p, needs_state_p, static_var): New.
+ (var_ref): Take the option's flags as a second parameter. Check
+ static_var.
+ * optc-gen.awk: Declare local state variables. Pass flags to var_ref.
+
+2005-06-14 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ PR target/20301
+ * config/sparc/sol2.h (ASM_GENERATE_INTERNAL_LABEL): Emit
+ unsigned index numbers.
+
+2005-06-13 Geoffrey Keating <geoffk@apple.com>
+
+ * Makefile.in (install-man): Doesn't really depend on installdirs.
+ (various rules for installing manpages): Do depend on installdirs.
+
+2005-06-14 Nathan Sidwell <nathan@codesourcery.com>
+
+ * unwind-dw2-fde-darwin.c (examine_objects): Fix aliasing in
+ read_encoded_value_with_base call.
+ * unwind-dw2-fde-glibc.c (_Unwind_IteratePhdrCallback): Likewise.
+ * unwind-dw2-fde.c (_Unwind_Find_FDE): Likewise.
+ * unwind-dw2.c (extract_cie_info): Fix aliasing in
+ read_encoded_value call.
+ (execute_cfa_program, uw_frame_state_for): Likewise.
+
+2005-06-13 Roger Sayle <roger@eyesopen.com>
+
+ PR rtl-optimization/22053
+ * reg-stack.c (compensate_edge): Correct mistake in the assertion
+ checking of EDGE_ABNORMAL_CALL edges; complex return values can
+ result in the top two stack slots, st(0) and st(1), being live.
+
+2005-06-13 Jeff Law <law@redhat.com>
+
+ * tree-ssa-dom.c (simplify_rhs_and_lookup_avail_expr): No longer
+ simplify DIV, MOD or ABS expressions using VRP information.
+ Remove WALK_DATA parameter. Prototype and all callers updated.
+ (eliminate_redundant_computations): Remove WALK_DATA parameter.
+ Prototype and all callers updated.
+ (optimize_stmt): WALK_DATA parameter is now unused.
+
+ * tree-vrp.c (local_fold): New function. Like fold, but
+ strips useless type conversions in the result.
+ (simplify_using_ranges): New function, largely cribbed from
+ tree-ssa-dom.c::simplify_rhs_and_lookup_avail_expr.
+ (vrp_finalize): Call simplify_using_ranges.
+
+2005-06-13 Mark Mitchell <mark@codesourcery.com>
+
+ * config/i386/x86-64.h (ASM_SPEC): Explicitly pass --64 to the
+ assembler in 64-bit mode.
+
+2005-06-13 David Edelsohn <edelsohn@gnu.org>
+
+ Revert scc_operand patch.
+ * config/rs6000/predicates.md (scc_operand): Delete.
+ * config/rs6000/rs6000.md (scc_operand): Change to scc_eq_operand.
+
+2005-06-13 Jakub Jelinek <jakub@redhat.com>
+
+ * trans-expr.c (gfc_conv_function_call): Return int instead of
+ void. Use a local variable for has_alternate_specifier and
+ return it. Avoid modification of function type's return value
+ in place, since it may be shared.
+ * trans.h (has_alternate_specifier): Remove.
+ (gfc_conv_function_call): Change return type.
+ * trans-stmt.c (has_alternate_specifier): Remove.
+ (gfc_trans_call): Add a local has_alternate_specifier variable,
+ set it from gfc_conv_function_call return value.
+
+2005-06-13 Zdenek Dvorak <dvorakz@suse.cz>
+
+ PR middle-end/21985
+ * fold-const.c (split_address_to_core_and_offset): Always return
+ the address of the base object.
+
+2005-06-13 Bernd Schmidt <bernd.schmidt@analog.com>
+
+ * doc/invoke.texi (Blackfin Options): Document -mlong-calls.
+
+2005-06-12 Richard Henderson <rth@redhat.com>
+
+ PR tree-opt/21994
+ * tree-complex.c (update_complex_components_on_edge): New.
+ (update_parameter_components): Use it.
+ (update_phi_components): Likewise.
+ (expand_complex_move): Likewise for is_ctrl_altering_stmt.
+
+2005-06-12 James A. Morrison <phython@gcc.gnu.org>
+
+ PR tree-optimization/14796
+ * fold-const (fold_binary): Transform (X << C) >> C into X & (-1>>C)
+ for unsigned types.
+
+2005-06-12 Kazu Hirata <kazu@codesourcery.com>
+
+ * cgraphunit.c, tree-ssa-loop-ivopts.c,
+ tree-ssa-structalias.c, tree-vectorizer.c, tree-vectorizer.h,
+ config/sparc/sparc.c: Fix comment typos.
+
+2005-06-12 Richard Earnshaw <richard.earnshaw@arm.com>
+
+ * arm/ieee754-df.s (aeabi_dcmpeq, aeabi_dcmplt, aeabi_dcmple)
+ (aeabi_dcmpge, aeabi_dcmpgt): Maintain 8-byte stack alignment.
+ * arm/ieee754-sf.s (aeabi_l2f, aeabi_fcmpeq, aeabi_fcmplt)
+ (aeabi_fcmple, aeabi_fcmpge, aeabi_fcmpgt): Likewise.
+
+2005-06-12 James A. Morrison <phython@gcc.gnu.org>
+
+ PR tree-optimization/14796
+ * fold-const.c (fold_binary): Transform (A >> C) << C into
+ one BIT_AND_EXPR.
+ <shift>: Transform (A OP c1) OP c2 into A OP (c1 + c2).
+
+2005-06-11 Geoffrey Keating <geoffk@apple.com>
+
+ * config/rs6000/predicates.md (reg_or_arith_cint_operand): Delete.
+ (reg_or_add_cint_operand): Rename from reg_or_add_cint64_operand.
+ Handle SImode.
+ (reg_or_sub_cint_operand): Likewise.
+ (mask_operand): Handle DImode.
+ (mask64_operand): Delete.
+ (and64_operand): Delete.
+ * config/rs6000/rs6000.c (num_insns_constant): Use mask_operand
+ instead of mask64_operand.
+ (print_operand): Likewise.
+ (rs6000_rtx_costs): Use mask_operand and reg_or_add_cint_operand and
+ reg_or_sub_cint_operand instead of *64_* variants.
+ * config/rs6000/rs6000.h (EXTRA_CONSTRAINT): Use mask_operand
+ instead of mask64_operand.
+ * config/rs6000/rs6000.md: Use mask_operand and and_operand instead
+ of *64_* variants.
+ (FP): New.
+ (add_op2): Delete.
+ (add<mode>3): Use reg_or_add_cint_operand.
+ (sub_op2): Delete.
+ (sub<mode>3): Use reg_or_sub_cint_operand.
+ (udiv<mode>3, div<mode>3, div<mode>3_no_mq, mod<mode>3,
+ mov<mode>_internal2, mov<mode>, cmp<mode>, cmp<mode>,
+ cmp<mode>_internal1, indirect_jump<mode>, ctr<mode>,
+ ctr<mode>_internal1, ctr<mode>_internal2, ctr<mode>_internal5,
+ ctr<mode>_internal6, save_fpregs_<mode>, return_internal_<mode>,
+ return_and_restore_fpregs_<mode>, eh_set_lr_<mode>,
+ various unnamed patterns): New.
+ (udivsi3, divsi3, divsi3_no_mq, modsi3, movsi_internal2, movsi,
+ cmpsi, cmpsi_internal1, indirect_jumpsi, ctrsi, ctrsi_internal1,
+ ctrsi_internal2, ctrsi_internal5, ctrsi_internal6, save_fpregs_si,
+ return_internal_si, return_and_restore_fpregs_si, eh_set_lr_si,
+ udivdi3, divdi3, divdi3_no_mq, moddi3, movdi_internal2, movdi,
+ cmpdi, cmpdi_internal1, indirect_jumpdi, ctrdi, ctrdi_internal1,
+ ctrdi_internal2, ctrdi_internal5, ctrdi_internal6, save_fpregs_di,
+ return_internal_di, return_and_restore_fpregs_di, eh_set_lr_di,
+ movhi, movqi, cmpsf, cmpdf, cmptf, various unnamed patterns):
+ Delete.
+
+2005-06-11 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * rtl.h (to_rtx_code): Remove.
+ * machmode.h (to_machine_mode): Likewise.
+ * read-rtl.c (apply_mode_macro): Replace to_machine_mode with
+ explicit cast.
+ (apply_mode_maps): Likewise.
+ (read_rtx_1): Likewise.
+ (apply_code_macro): Replace to to_rtx_code with explicit cast.
+ (check_code_macro): Likewise.
+ (read_rtx_1): Likewise.
+
+2005-06-11 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * c-typeck.c (convert_for_assignment): Avoid checking
+ OPT_Wc___compat, as it is always true.
+
+2005-06-11 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.md (eq<mode>_compare): Restrict to Pmode.
+
+2005-06-11 Daniel Berlin <dberlin@dberlin.org>
+
+ Fix PR tree-optimization/22005
+ Fix PR tree-optimization/22025
+
+ * tree-ssa-structalias.c (struct variable_info): Add has_union
+ member.
+ (create_variable_info_for): Mark variables containing unions.
+ Don't sort the field stack if notokay is true.
+ (find_what_p_points_to): Convert variables containing unions back
+ to their SFT's if necessary.
+
+2005-06-11 Daniel Berlin <dberlin@dberlin.org>
+
+ * lambda-code.c (replace_uses_equiv_to_x_with_y): Verify the step
+ is an INTEGER_CST before calling int_cst_value.
+
+2005-06-10 Uros Bizjak <uros@kss-loka.si>
+
+ PR target/21981
+ * config/i386/i386.c (ix86_function_value_regno_p): Return true
+ for FIRST_MMX_REG if TARGET_MMX.
+ (ix86_return_in_memory): Return 1 for MMX/3dNow vectors. Delete
+ wrong comment.
+ (ix86_struct_value_rtx): Emit warning for MMX ABI violations.
+ (ix86_value_regno): Return FIRST_MMX_REG for MMX vector modes.
+
+2005-06-10 Daniel Berlin <dberlin@dberlin.org>
+
+ * lambda-code.c (replace_uses_equiv_to_x_with_y): Check step
+ and access function against chrec_dont_know.
+
+2005-06-10 Daniel Berlin <dberlin@dberlin.org>
+
+ * lambda-code.c (replace_uses_of_x_with_y): Renamed and rewritten
+ slightly.
+ (exit_phi_for_loop_p): New function.
+ (can_put_in_inner_loop): Ditto.
+ (can_convert_to_perfect_nest): Ditto.
+ (perfect_nestify): Create iv with right type.
+ Rewrite statements in correct order.
+
+2005-06-10 Keith Besaw <kbesaw@us.ibm.com>
+
+ * tree-ssa-alias.c (new_type_alias): Use existing type
+ tag if VAR has just one in its may_aliases list.
+
+2005-06-10 Fariborz Jahanian <fjahanian@apple.com>
+
+ * rs6000/predicates.md (scc_operand): New.
+ * rs6000/rs6000.md : Use scc_operand for eq:SI compares.
+
+2005-06-10 Dorit Nuzman <dorit@il.ibm.com>
+
+ * tree-vect-analyze.c (vect_analyze_data_ref_dependence): DRs whose
+ dependence-distance modulo VF is 0 are recorded in the
+ SAME_ALIGN_REFs VEC in each DR.
+ (vect_enhance_data_refs_alignment): Avoid 80 column overflow. The
+ alignment information of DRs that are in the SAME_ALIGN_REFs VEC of the
+ DR we want to peel for, is set to 0.
+ * tree-vect-transform.c (vect_do_peeling_for_loop_bound): Fix printout.
+ * tree-vectorizer.c (destroy_loop_vec_info): Free the SAME_ALIGN_REFs
+ VEC.
+ * tree-vectorizer.h (dr_p): New type. Defined to use the VEC API.
+ (_stmt_vec_info): Added new field same_align_refs.
+ (STMT_VINFO_SAME_ALIGN_REFS): New macro.
+
+2005-06-10 Nathan Sidwell <nathan@codesourcery.com>
+
+ * vec.h (VEC_safe_grow): Append MEM_STAT_INFO.
+
+2005-06-10 Alan Modra <amodra@bigpond.net.au>
+
+ * config/rs6000/linux.h (NO_PROFILE_COUNTERS): Define.
+ * config/rs6000/linux64.h (NO_PROFILE_COUNTERS): Define as 1.
+ * config/rs6000/rs6000.c (output_function_profiler): Obey
+ NO_PROFILE_COUNTERS. Handle TARGET_SECURE_PLT. Use "bcl 20,31"
+ for -fPIC. Delete save_lr and substitute its value into strings.
+
+2005-06-09 Dale Johannesen <dalej@apple.com>
+
+ * config/i386/i386.c (optimization_options): Make -fno-math-errno
+ the default on Darwin.
+ * config/rs6000/rs6000.c (optimization_options): Ditto.
+ * doc/invoke.texi (-fno-math-errno): Document.
+
+2005-06-09 Dale Johannesen <dalej@apple.com>
+
+ * config/rs6000/rs6000.c (TARGET_INSN_VALID_WITHIN_DOLOOP):
+ Change to TARGET_INVALID_WITHIN_DOLOOP.
+
+2005-06-09 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.md (eq): Convert to define_insn_and_split.
+ * config/rs6000/predicates.md (scc_eq_operand): New.
+
+2005-06-09 Kaz Kojima <kkojima@gcc.gnu.org>
+
+ * config/sh/sh.md (mextr_rl): Set buffer size properly.
+ (*mextr_lr): Likewise.
+
+2005-06-09 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ PR c/21759
+ * c.opt (Wc++-compat): New.
+ * doc/invoke.texi (-Wc++-compat): Document.
+ * c-typeck.c (convert_for_assignment): Check for implicit
+ conversion void* -> T*.
+
+2005-06-09 Gabriel Dos Reis <gdr@integrable-solutions.edu>
+
+ * machmode.h (to_machine_mode): New.
+ * rtl.h (to_rtx_code): Likewise.
+ * read-rtl.c (apply_mode_macro): Convert mode to machine_mode.
+ (print_c_condition): Convert return value of htab_find().
+ (apply_code_macro): Add explicit cast when convertin to enums.
+ (apply_mode_maps): Likewise.
+ (check_code_macro): Likewise.
+ (read_rtx_1): Likewise.
+
+2005-06-09 Richard Henderson <rth@redhat.com>
+
+ * config/ia64/ia64.c (update_set_flags): Just return for IF_THEN_ELSE.
+ Use SCALAR_FLOAT_MODE_P.
+ * config/ia64/vect.md (vcondv2sf): Remove code check on comparison.
+ (fselect): Rename from fpcmp; use %F.
+ (fpcmp): New.
+
+2005-06-09 Jan Hubicka <jh@suse.cz>
+
+ * cgraphunit.c (cgraph_create_edges): Do not walk BLOCK; finalize
+ local statics when doing unit-at-a-time.
+ (cgraph_varpool_assemble_pending_decls): Output debug info.
+ * dwarf2out.c (decls_for_scope): Skip local statics.
+ (dwarf2out_decl): Handle local statics.
+ * passes.c (rest_of_decl_compilation): Do not differentiate
+ local and global statics in unit-at-a-time.
+ * tree-inline.c (remap_decls): Put local static into
+ unexpanded_vars_list rather than introducing duplicated VAR_DECL
+ node.
+
+2005-06-09 Daniel Berlin <dberlin@dberlin.org>
+
+ * config/rs6000/rs6000.c: (rs6000_insn_valid_within_doloop): Fix
+ prototype.
+
+2005-06-08 Daniel Berlin <dberlin@dberlin.org>
+
+ * Makefile.in (OBJS-common): Add tree-ssa-structalias.o.
+ * tree-flow.h (find_what_p_points_to): Add prototype.
+ (push_fields_onto_fieldstack): Ditto.
+ (sort_fieldstack): Ditto.
+ * tree-optimize.c (init_tree_optimization_passes): Add
+ pass_build_pta and pass_del_pta.
+ * tree-pass.h (pass_build_pta): New structure.
+ (pass_del_pta): Ditto.
+ * tree-ssa-alias.c (compute_flow_sensitive_aliasing): Disambiguate
+ using new alias analyzer.
+ (push_fields_onto_fieldstack): Removed from here.
+ (bitpos_of_field): Ditto.
+ (fieldoff_compare): Ditto.
+ * tree-ssa-structalias.c: New file.
+ * tree-ssa-structalias.h: Ditto.
+
+2005-06-09 Nathan Sidwell <nathan@codesourcery.com>
+
+ * c-typeck.c (build_c_cast): Check type punning on COMPONENT_REF
+ too.
+
+2005-06-09 Bernd Schmidt <bernd.schmidt@analog.com>
+
+ * config/bfin/bfin.c (enum bfin_builtins): Moved here from...
+ * config/bfin/bfin.h (enum bfin_builtins): ... here.
+
+2005-06-09 Adrian Straetling <straetling@de.ibm.com>
+
+ * target.h (insn_valid_within_doloop): Rename into
+ "invalid_within_doloop". Change return type to "const char *".
+ Update Comment.
+ * targhooks.h (default_insn_valid_within_doloop): Rename into
+ "default_invalid_within_doloop".
+ * targhooks.c (default_insn_valid_within_doloop): Likewise.
+ Update Comment.
+ * target-def.h (TARGET_INSN_VALID_WITHIN_DOLOOP): Rename target hook
+ into "TARGET_INVALID_WITHIN_DOLOOP". Default it to
+ "default_invalid_within_doloop".
+ * hooks.c (hook_constcharptr_rtx_null): New function.
+ (hook_bool_rtx_true): Remove.
+ * hooks.h (hook_constcharptr_rtx_null): Declare.
+ (hook_bool_rtx_true): Remove.
+ * loop-doloop.c (doloop_valid_p): Temporarily store return value of
+ "invalid_within_doloop" and print error message if non-null.
+ Update Comment.
+ * doc/tm.texi: Update documentation.
+ * config/s390/s390.c: Adjust to new hook name and new default hook.
+ * config/rs6000/rs6000.c: (rs6000_insn_valid_within_doloop): Rename
+ into "rs6000_invalid_within_doloop".
+ (rs6000_invalid_within_doloop): Change return type to "static const
+ char *" and replace return values. Update Comment.
+
+2005-06-09 Bernd Schmidt <bernd.schmidt@analog.com>
+
+ * config/bfin/bfin.opt (mlong-calls): New.
+ * config/bfin/predicates.md (call_insn_operand): Disallow SYMBOL_REF
+ if TARGET_LONG_CALLS.
+
+2005-06-09 Richard Henderson <rth@redhat.com>
+
+ PR tree-opt/20610
+ * tree.h (DECL_COMPLEX_GIMPLE_REG_P): New.
+ (struct tree_decl): Add gimple_reg_flag.
+ * integrate.c (copy_decl_for_inlining): Copy it.
+ * gimplify.c (internal_get_tmp_var): Set it.
+ (gimplify_bind_expr): Likewise.
+ (gimplify_function_tree): Likewise.
+ (gimplify_modify_expr_complex_part): New.
+ (gimplify_modify_expr): Use it.
+ * tree-gimple.c (is_gimple_reg_type): Allow complex.
+ (is_gimple_reg): Allow complex with DECL_COMPLEX_GIMPLE_REG_P set.
+
+ * tree-complex.c (complex_lattice_t): New.
+ (complex_lattice_values, complex_variable_components): New.
+ (some_nonzerop, find_lattice_value, is_complex_reg,
+ init_parameter_lattice_values, init_dont_simulate_again,
+ complex_visit_stmt, complex_visit_phi, create_components,
+ update_complex_components, update_parameter_components,
+ update_phi_components, update_all_vops, expand_complex_move): New.
+ (extract_component): Handle INDIRECT_REF, COMPONENT_REF, ARRAY_REF,
+ SSA_NAME.
+ (update_complex_assignment): Use update_complex_components;
+ handle updates of return_expr properly.
+ (expand_complex_addition): Use complex lattice values.
+ (expand_complex_multiplication): Likewise.
+ (expand_complex_division): Likewise.
+ (expand_complex_libcall): Use update_complex_components.
+ (expand_complex_comparison): Use update_stmt.
+ (expand_complex_operations_1): Use expand_complex_move, retrieve
+ lattice values.
+ (tree_lower_complex): Compute lattice values.
+ (tree_lower_complex_O0): Duplicate from tree_lower_complex.
+ (pass_lower_complex_O0): Rename from pass_lower_complex.
+ (pass_lower_complex, gate_no_optimization): New.
+ * tree-optimize.c (init_tree_optimization_passes): Update for
+ complex pass changes.
+ * tree-pass.h (pass_lower_complex_O0): Declare.
+
+2005-06-08 Dale Johannesen <dalej@apple.com>
+
+ * config/darwin.c (darwin_binds_local_p): New.
+ * config/darwin-protos.h (darwin_binds_local_p): Declare it.
+ * config/i386/i386.c (TARGET_BINDS_LOCAL_P): Use it for TARGET_MACHO.
+ * config/rs6000/rs6000.c (rs6000_binds_local_p): Remove.
+ (TARGET_BINDS_LOCAL_P): Change it to darwin_binds_local_p.
+
+2005-06-08 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/rs6000.h: Remove rs6000_long_double_size_string,
+ rs6000_isel, rs6000_spe, rs6000_alignment_string,
+ rs6000_sched_restricted_insns_priority_str,
+ rs6000_sched_restricted_insns_priority, rs6000_abi_string.
+
+2005-06-08 Zdenek Dvorak <dvorakz@suse.cz>
+
+ * tree-ssa-address.c (addr_for_mem_ref): Use LAST_VIRTUAL_REGISTER
+ instead of FIRST_PSEUDO_REGISTER for creating pseudoregisters.
+ * tree-ssa-loop-ivopts.c (add_cost, multiply_by_cost,
+ multiplier_allowed_in_address_p, get_address_cost): Ditto.
+
+2005-06-08 Richard Henderson <rth@redhat.com>
+
+ * config/ia64/ia64.h (NO_PROFILE_COUNTERS): New.
+ * config/ia64/ia64.c (ia64_output_function_profiler): Honor it.
+ Emit out3 load right after alloc.
+
+2005-06-08 Aldy Hernandez <aldyh@redhat.com>
+
+ * config/rs6000/linuxspe.h (SUBSUBTARGET_OVERRIDE_OPTIONS): Use
+ rs6000_explicit_options.
+
+2005-06-08 Richard Henderson <rth@redhat.com>
+
+ * config/ia64/ia64.h (FUNCTION_PROFILER): Move implementation ...
+ * config/ia64/ia64.c (ia64_output_function_profiler): ... here; add
+ unwind markup.
+ * config/ia64/ia64-protos.h (ia64_output_function_profiler): Declare.
+
+2005-06-08 Joseph S. Myers <joseph@codesourcery.com>
+
+ * config/sol2-c.c (cmn_err_char_table): Allow width for %b
+ formats.
+
+2005-06-08 James A. Morrison <phython@gcc.gnu.org>
+
+ PR target/20666
+ * config/sparc/sparc.c (sparc_fold_builtin): New function
+ (sparc_vis_mul8x16): New function.
+ (sparc_handle_vis_mul8x16): New function.
+ (TARGET_FOLD_BUILTIN): Define to sparc_fold_builtin.
+
+2005-06-08 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.md (call_indirect_nonlocal_aix32): Prefer
+ CTR to LR.
+ (call_indirect_nonlocal_aix64): Same.
+ (call_value_indirect_nonlocal_aix32): Same.
+ (call_value_indirect_nonlocal_aix64): Same.
+
+ PR target/10588
+ (eq): Use CLZ splitter for compare with zero.
+
+2005-06-08 Bernd Schmidt <bernd.schmidt@analog.com>
+
+ * config/bfin/bfin.c (bfin_return_in_memory): Simplify; return
+ everything larger than 8 bytes in memory.
+
+ * config/bfin/bfin.h (enum bfin_builtins): New.
+ * config/bfin/bfin.md (UNSPEC_VOLATILE_CSYNC, UNSPEC_VOLATILE_SSYNC):
+ New constants.
+ (csync, ssync): New insn patterns.
+ * config/bfin/bfin.c (bfin_init_builtins, bfin_expand_builtin):
+ New functions.
+ (def_builtin): New macro.
+ (TARGET_INIT_BUILTINS, TARGET_EXPAND_BUILTIN): Define.
+
+ From Jie Zhang <jie.zhang@analog.com>
+ * config/bfin/bfin.h (ASM_OUTPUT_ALIGN): Gas now emulates the
+ behavior of the native assembler in VDSP. So change accordingly.
+
+2005-06-08 Sebastian Pop <pop@cri.ensmp.fr>
+
+ * tree-data-ref.c (compute_estimated_nb_iterations,
+ analyze_array_indexes, compute_overlap_steps_for_affine_1_2,
+ analyze_subscript_affine_affine, find_data_references_in_loop):
+ Fixed to use chrec_contains_undetermined to test the values of
+ loop->estimated_nb_iterations.
+ * tree-ssa-loop-niter.c (estimate_numbers_of_iterations_loop):
+ Compute the estimation only when loop->estimated_nb_iterations
+ has not yet been initialized.
+ (convert_step_widening, scev_probably_wraps_p): Add a call to
+ estimate_numbers_of_iterations_loop.
+ * tree-vrp.c (execute_vrp): Don't call estimate_numbers_of_iterations.
+
+2005-06-08 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ PR debug/21946
+ * dwarf2out.c (add_loc_descr_op_piece): Move to the
+ DWARF2_DEBUGGING_INFO section.
+
+2005-06-08 Richard Henderson <rth@redhat.com>
+
+ PR target/21721
+ * config/ia64/ia64.c (emit_predicate_relation_info): Skip p0.
+
+2005-06-08 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ PR target/21889
+ * target.h (gcc_target) <asm_out>: New field output_dwarf_dtprel.
+ * target-def.h (TARGET_ASM_OUTPUT_DWARF_DTPREL): New macro.
+ (TARGET_ASM_OUT): Add it.
+ * doc/tm.texi (Debugging Info): Document it.
+ * dwarf2out.c (output_loc_operands) <INTERNAL_DW_OP_tls_addr>:
+ Test it instead of ASM_OUTPUT_DWARF_DTPREL.
+ (loc_descriptor_from_tree_1) <VAR_DECL>: Likewise.
+ * system.h: Poison ASM_OUTPUT_DWARF_DTPREL.
+ * config/frv/frv-protos.h (frv_output_dwarf_dtprel): Delete.
+ * config/frv/frv.c (frv_output_dwarf_dtprel): Make static and unused.
+ (gen_inlined_tls_plt): Remove unused variable MEM.
+ (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to frv_output_dwarf_dtprel.
+ * config/frv/frv.h (ASM_OUTPUT_DWARF_DTPREL): Delete.
+ * config/i386/i386-protos.h (i386_output_dwarf_dtprel): Delete.
+ * config/i386/i386.c (i386_output_dwarf_dtprel): Make static and
+ unused.
+ (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to i386_output_dwarf_dtprel.
+ * config/i386/i386.h (ASM_OUTPUT_DWARF_DTPREL): Delete.
+ * config/ia64/ia64-protos.h (ia64_output_dwarf_dtprel): Delete.
+ * config/ia64/ia64.c (ia64_output_dwarf_dtprel): Make static and
+ unused.
+ (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to ia64_output_dwarf_dtprel.
+ * config/ia64/ia64.h (ASM_OUTPUT_DWARF_DTPREL): Delete.
+ * config/rs6000/rs6000-protos.h (rs6000_output_dwarf_dtprel): Delete.
+ * config/rs6000/rs6000.c (rs6000_output_dwarf_dtprel): Make static and
+ unused.
+ (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to rs6000_output_dwarf_dtprel
+ * config/rs6000/rs6000.h (ASM_OUTPUT_DWARF_DTPREL): Delete.
+ * config/s390/s390-protos.h (s390_output_dwarf_dtprel): Delete.
+ * config/s390/s390.c (s390_output_dwarf_dtprel): Make static and
+ unused.
+ (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to s390_output_dwarf_dtprel.
+ * config/s390/s390.h (ASM_OUTPUT_DWARF_DTPREL): Delete.
+ * config/sparc/sol2-gas.h (TARGET_SUN_TLS): Define to 0.
+ (TARGET_GNU_TLS): Define to 1.
+ * config/sparc/sparc-protos.h (sparc_output_dwarf_dtprel): Delete.
+ * config/sparc/sparc.c (sparc_output_dwarf_dtprel): Make static and
+ unused.
+ (TARGET_ASM_OUTPUT_DWARF_DTPREL): Define to sparc_output_dwarf_dtprel
+ if TARGET_GNU_TLS only.
+ * config/sparc/sparc.h (ASM_OUTPUT_DWARF_DTPREL): Delete.
+
+ * config.gcc (sparc64-*-solaris2*): Include tm-dwarf2.h last.
+ (sparc-*-solaris2*): Likewise on Solaris 7 and up.
+
+2005-06-07 Dale Johannesen <dalej@apple.com>
+
+ * config/i386/i386.md (movqi_1): Fix case where source
+ is memory and destination EDI.
+
+2005-06-08 Kazu Hirata <kazu@codesourcery.com>
+
+ * config/c4x/c4x.h (PREDICATE_CODES): Remove mem_operand.
+
+2005-06-07 Eric Christopher <echristo@redhat.com>
+
+ * system.h: Poison EXTRA_CC_MODES.
+ * config/frv/frv.h (SELECT_CC_MODE): Rewrite comment.
+ * config/ia64/ia64.h (SELECT_CC_MODE): Ditto.
+ * doc/md.texi (Jump Patterns): Replace reference to
+ EXTRA_CC_MODES with machine-modes.def.
+ * doc/rtl.texi (Machine Modes): Ditto.
+
+2005-06-07 Richard Henderson <rth@redhat.com>
+
+ * varasm.c (initialize_cold_section_name): Fix alloca buffer overflow.
+ (assemble_start_function): Fix strcmp confusion.
+
+2005-06-07 Uros Bizjak <uros@kss-loka.si>
+
+ * config/i386/i386.h (enum ix86_entity): New.
+ (enum ix86_stack_slot): New.
+ (OPTIMIZE_MODE_SWITCHING): Redefine to use
+ ix86_optimize_mode_switching[] array.
+ (NUM_MODES_FOR_MODE_SWITCHING): Redefine for 4 entities.
+ (MODE_NEEDED): Use ix86_mode_needed() function.
+ (EMIT_MODE_SET): Redefine for changed emit_i387_cw_initialization ()
+ function.
+ (struct machine_function): Use optimize_mode_switching[] array.
+
+ * config/i386/i386.c (MAX_386_STACK_LOCALS): Remove.
+ (ix86_mode_needed): New function.
+ (emit_i387_cw_initialization): Cleanup. Use mode to calculate
+ correct stack positions for stored control words.
+ (assign_386_stack_local): Use enum ix86_stack_slot. Change assert.
+ (ix86_expand_builtin) [IX86_BUILTIN_LDMXCSR]: Change constant to
+ SLOT_TEMP.
+ [IX86_BUILTIN_STMXCSR]: Same.
+
+ * config/i386/i386-protos.h (assign_stack_local): Change prototype.
+ (emit_i387_cw_initialization): Change prototype.
+ (ix86_mode_needed): New prototype.
+
+ * config/i386/i386.md (i387_cw attribute): Change order of elements.
+ (truncdfsf2, truncxfsf2, truncxfdf2, fix_trunc<mode>_fisttp_i387_1)
+ (*fix_trunc<mode>_i387_1, lrint<mode>2, *fist<mode>2_floor_1)
+ (*fist<mode>2_ceil_1): Change constant in call to
+ assign_386_stack_local to SLOT_TEMP.
+ (*fix_trunc<mode>_i387_1): Change constant in call to
+ assign_386_stack_local to SLOT_CW_STORED and SLOT_CW_TRUNC.
+ Use new ix86_optimize_mode_switching[] array.
+ (frndintxf2_floor, *fist<mode>2_floor_1): Change constants in call to
+ assign_386_stack_local to SLOT_CW_STORED and SLOT_CW_FLOOR.
+ Use new ix86_optimize_mode_switching[] array.
+ (frndintxf2_ceil, *fist<mode>2_ceil_1): Change constants in call to
+ assign_386_stack_local to SLOT_CW_STORED and SLOT_CW_CEIL.
+ Use new ix86_optimize_mode_switching[] array.
+ (frndintxf2_trunc): Change constants in call to
+ assign_386_stack_local to SLOT_CW_STORED and SLOT_CW_TRUNC.
+ Use new ix86_optimize_mode_switching[] array.
+ (frndintxf2_mask_pm): Change constants in call to
+ assign_386_stack_local to SLOT_CW_STORED and SLOT_CW_MASK_PM.
+ Use new ix86_optimize_mode_switching[] array.
+
+ (define_peephole2): Change constant from 17 to FLAGS_REG;
+
+2005-06-07 Richard Henderson <rth@redhat.com>
+
+ PR rtl-opt/21528
+ * rtlanal.c (reg_overlap_mentioned_p) <MEM>: Handle 'E' formats.
+
+2005-06-07 Dale Johannesen <dalej@apple.com>
+
+ * tree-nested.c (finalize_nesting_tree_1): Disable
+ warn_padded around layout_type call.
+
+2005-06-08 Zdenek Dvorak <dvorakz@suse.cz>
+
+ * tree-ssa-loop-ivopts.c (rewrite_use_outer): Unshare the expression
+ before emiting it.
+
+2005-06-07 Eric Christopher <echristo@redhat.com>
+
+ * config/mips/predicates.md: Revert previous patch.
+
+2005-06-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/21850
+ * tree.c (get_unwidened): Stop at NOP_EXPR/CONVERT_EXPR that convert
+ from vector types.
+
+2005-06-07 Diego Novillo <dnovillo@redhat.com>
+
+ * tree-ssa-threadupdate.c (struct thread_stats_d): Declare.
+ (thread_stats): New local variable.
+ (redirect_edges): Increment count of threaded edges.
+ (thread_through_all_blocks): Initialize thread_stats.
+ Display number of threaded jumps if TDF_STATS is enabled.
+
+2005-06-07 Kazu Hirata <kazu@codesourcery.com>
+
+ * sbitmap.h (sbitmap_iter_init): Consistently treat bit_num as
+ the current bit index with no modulo.
+
+2005-06-07 Sebastian Pop <pop@cri.ensmp.fr>
+
+ PR 18403 and meta PR 21861.
+ * Makefile.in (tree-chrec.o): Depend on CFGLOOP_H and TREE_FLOW_H.
+ * tree-chrec.c: Include cfgloop.h and tree-flow.h.
+ (evolution_function_is_invariant_rec_p,
+ evolution_function_is_invariant_p): New.
+ (chrec_convert): Use an extra parameter AT_STMT for refining the
+ information that is passed down to convert_step. Integrate the
+ code that was in count_ev_in_wider_type.
+ * tree-chrec.h (count_ev_in_wider_type): Removed.
+ (chrec_convert): Modify its declaration.
+ (evolution_function_is_invariant_p): Declared.
+ (evolution_function_is_affine_p): Use evolution_function_is_invariant_p.
+ * tree-flow.h (can_count_iv_in_wider_type): Renamed convert_step.
+ (scev_probably_wraps_p): Declared.
+ * tree-scalar-evolution.c (count_ev_in_wider_type): Removed.
+ (follow_ssa_edge_in_rhs, interpret_rhs_modify_expr):
+ Use an extra parameter AT_STMT for refining the information that is
+ passed down to convert_step.
+ (follow_ssa_edge_inner_loop_phi, follow_ssa_edge,
+ analyze_scalar_evolution_1): Initialize AT_STMT with the current
+ analyzed statement.
+ (instantiate_parameters_1): Don't know yet how to initialize AT_STMT.
+ * tree-ssa-loop-ivopts.c (idx_find_step): Update the use of
+ can_count_iv_in_wider_type to use convert_step.
+ * tree-ssa-loop-niter.c (can_count_iv_in_wider_type_bound): Move
+ code that is independent of the loop over the known iteration
+ bounds to convert_step_widening, the rest is moved to
+ proved_non_wrapping_p.
+ (scev_probably_wraps_p): New.
+ (can_count_iv_in_wider_type): Renamed convert_step.
+ * tree-vrp.c (adjust_range_with_scev): Take an extra AT_STMT parameter.
+ Use scev_probably_wraps_p for computing init_is_max.
+ (vrp_visit_assignment): Pass the current analyzed statement to
+ adjust_range_with_scev.
+ (execute_vrp): Call estimate_numbers_of_iterations for refining the
+ information provided by scev analyzer.
+
+2005-06-07 Eric Christopher <echristo@redhat.com>
+
+ * config/mips/predicates.md (sleu_operand): Use
+ IN_RANGE to specify range of operand.
+
+2005-06-07 Steven Bosscher <stevenb@suse.de>
+
+ PR tree-optimization/21847
+ * tree-ssa-dce.c (mark_stmt_if_obviously_necessary): With
+ -fnon-call-exceptions, also mark statements inherently
+ necessary if they may throw.
+
+2005-06-07 Adrian Straetling <straetling@de.ibm.com>
+
+ * config/s390/s390.md: ("UNSPECV_MB", "UNSPECV_CAS"): New constants.
+ ("type"): Add "sem" to 'type' attribute.
+ ("memory_barrier", "*memory_barrier", "sync_compare_and_swapdi",
+ "sync_compare_and_swapsi", "sync_compare_and_swap_ccdi",
+ "sync_compare_and_swap_ccsi", "*sync_compare_and_swap_ccdi",
+ "*sync_compare_and_swap_ccsi"): New patterns.
+ * config/s390/2064.md: ("z_sem"): New insn_reservation.
+ * config/s390/2084.md: ("x_sem"): New insn_reservation.
+ * config/s390/s390.c: (s390_compare_emitted): New global variable.
+ (s390_emit_compare): Do not emit comparison again after cas.
+ * config/s390/s390.h (s390_compare_emitted): Declare.
+
+2005-06-07 Kazu Hirata <kazu@codesourcery.com>
+
+ * sbitmap.h (sbitmap_iterator, sbitmap_iter_init,
+ sbitmap_iter_cond, sbitmap_iter_next): New.
+ * bt-load.c, cfganal.c, combine.c, ddg.c, flow.c,
+ modulo-sched.c, sbitmap.c, sched-rgn.c, tree-into-ssa.c,
+ tree-outof-ssa.c, tree-ssa-alias.c, tree-ssa-live.c: Update
+ uses of EXECUTE_IF_SET_IN_SBITMAP to the new style.
+
+2005-06-07 Zdenek Dvorak <dvorakz@suse.cz>
+
+ * tree-ssa-address.c: New file.
+ * Makefile.in (tree-ssa-address.o): Add.
+ * expr.c (expand_expr_real_1): Do not handle REF_ORIGINAL on
+ INDIRECT_REFs. Handle TARGET_MEM_REFs.
+ * tree-eh.c (tree_could_trap_p): Handle TARGET_MEM_REFs.
+ * tree-flow.h (struct mem_address): New.
+ (struct affine_tree_combination): Moved from tree-ssa-loop-ivopts.c.
+ (create_mem_ref, addr_for_mem_ref, get_address_description,
+ maybe_fold_tmr, multiplier_allowed_in_address_p,
+ multiply_by_cost): Declare.
+ * tree-mudflap.c (mf_xform_derefs_1): Handle TARGET_MEM_REFs.
+ * tree-pretty-print.c (dump_generic_node): Ditto.
+ * tree-ssa-loop-im.c (for_each_index): Ditto.
+ * tree-ssa-loop-ivopts.c (may_be_unaligned_p,
+ find_interesting_uses_address): Ditto.
+ (rewrite_address_base, build_addr_strip_iref): Removed.
+ (struct affine_tree_combination): Moved to tree-flow.h.
+ (get_ref_tag, copy_ref_info): New functions.
+ (rewrite_use_address): Produce TARGET_MEM_REFs.
+ (tree_ssa_iv_optimize): Do not call update_ssa
+ and rewrite_into_loop_closed_ssa.
+ (tree_to_aff_combination): Use build_fold_addr_expr instead of
+ build_addr_strip_iref.
+ (unshare_aff_combination): New function.
+ (fold_affine_sum): Removed.
+ (get_computation_at): Use get_computation_aff. Unshare the result.
+ (get_computation_aff, multiplier_allowed_in_address_p): New function.
+ (multiply_by_cost): Exported.
+ (get_address_cost): Use multiplier_allowed_in_address_p.
+ * tree-ssa-operands.c (get_tmr_operands): New function.
+ (get_expr_operands): Handle TARGET_MEM_REFs.
+ * tree.c (copy_node_stat): Copy annotations for TARGET_MEM_REFs.
+ (build): Handle 7 arguments.
+ (build7_stat): New function.
+ * tree.def (TARGET_MEM_DEF): New.
+ * tree.h (REF_ORIGINAL): Removed.
+ (TMR_SYMBOL, TMR_BASE, TMR_INDEX, TMR_STEP, TMR_OFFSET, TMR_ORIGINAL,
+ TMR_TAG, build7): New macros.
+ (build7_stat, tree_mem_ref_addr, copy_mem_ref_info): Declare.
+ * tree-ssa-ccp.c (fold_stmt_r): Call maybe_fold_tmr.
+ * doc/c-tree.texi: Document TARGET_MEM_REF.
+ * doc/tree-ssa.texi: Add TARGET_MEM_REF to gimple grammar.
+
+2005-06-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/21946
+ * dwarf2out.c (add_loc_descr_op_piece): New function.
+ (multiple_reg_loc_descriptor, concat_loc_descriptor,
+ loc_descriptor): Use it.
+ * var-tracking.c: Include regs.h and expr.h.
+ (emit_note_insn_var_location): Skip over pieces where offset
+ is smaller than previous offset plus previous piece mode size.
+ Optimize adjacent hard registers or memory locations.
+ * Makefile.in (var-tracking.o): Depend on $(REGS_H) and $(EXPR_H).
+
+2005-06-07 Richard Guenther <rguenth@gcc.gnu.org>
+
+ * c-typeck.c (c_finish_if_stmt): Use void_type_node as type
+ for COND_EXPR.
+ * gimplify.c (gimplify_cond_expr): No need to fix up the
+ type of COND_EXPRs.
+
+2005-06-07 Richard Guenther <rguenth@gcc.gnu.org>
+
+ * tree-ssa.c (tree_ssa_useless_type_conversion_1): Fix
+ comments.
+
+2005-06-07 Geoffrey Keating <geoffk@apple.com>
+
+ * config/rs6000/host-darwin.c (segv_handler): Widen the possible
+ 'stwux' instructions that are considered to be stack decrements.
+
+ * rtlanal.c (subreg_offset_representable_p): Handle objects
+ with holes.
+
+2005-06-06 Uros Bizjak <uros@kss-loka.si>
+
+ * mode-switching.c (optimize_mode_switching): Fix n_exprs parameter
+ in call to pre_edge_lcm.
+
+2005-06-06 Kaz Kojima <kkojima@gcc.gnu.org>
+
+ * config/sh/linux-unwind.h (SH_DWARF_FRAME_XD0): Remove for SH5.
+ (SH_DWARF_FRAME_PR, SH_DWARF_FRAME_GBR, SH_DWARF_FRAME_MACL)
+ (SH_DWARF_FRAME_MACH, SH_DWARF_FRAME_PC, SH_DWARF_FRAME_FPUL):
+ Likewise.
+ (SH_DWARF_FRAME_FP0, SH_DWARF_FRAME_FPSCR): Define to the correct
+ dwarf register number for SHmedia.
+ (shmedia_fallback_frame_state): New.
+ (MD_FALLBACK_FRAME_STATE_FOR): Define to it for SH5.
+
+ * config/sh/linux.h (FUNCTION_PROFILER): Provide SHMEDIA version.
+
+2005-06-06 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * c-lex.c (lex_string): Use XOBFINISH.
+ * collect2.c (extract_string, dump_file): Likewise.
+ * dbxout.c (dbxout_finish_complex_stabs): Likewise.
+ * gcc.c (init_spec, build_search_list, convert_filename,
+ set_collect_gcc_options, do_spec_2, do_spec_1, main): Likewise.
+ * genpreds.c (write_predicate_subfunction): Likewise.
+ * genflags.c (main): Likewise.
+ * read-rtl.c (mode_attr_index, apply_macro_to_string,
+ join_c_conditions, read_quoted_string, read_braced_string,
+ read_rtx_1): Likewise.
+ * stringpool.c (ggc_alloc_string): Likewise.
+ * tlink.c (obstack_fgets, recompile_files): Likewise.
+
+2005-06-06 Jakub Jelinek <jakub@redhat.com>
+
+ * intl.h (G_): New macro.
+ * rtl-error.c (error_for_asm, warning_for_asm): Use gmsgid
+ instead of msgid for argument name.
+ * tree-ssa.c (warn_uninit): Likewise.
+ * c-parser.c (c_parser_error): Likewise.
+ * config/rs6000/rs6000-c.c (SYNTAX_ERROR): Likewise.
+ * config/darwin-c.c (BAD): Likewise.
+ * config/c4x/c4x-c.c (BAD): Likewise.
+ * c-pragma.c (GCC_BAD, GCC_BAD2): Likewise.
+ * c-errors.c (pedwarn_c99, pedwarn_c90): Likewise.
+ * c-common.c (c_parse_error): Likewise.
+ * diagnostic.c (diagnostic_set_info, verbatim, inform, warning,
+ warning0, pedwarn, error, sorry, fatal_error, internal_error):
+ Likewise.
+ (fnotice): Use cmsgid instead of msgid for argument name.
+ * gcov.c (fnotice): Likewise.
+ * protoize.c (notice): Likewise.
+ * final.c (output_operand_lossage): Likewise.
+ * gcc.c (fatal, notice): Likewise.
+ (error): Use gmsgid instead of msgid for argument name.
+ * collect2.c (notice, fatal_perror, fatal): Use cmsgid instead
+ of msgid for argument name.
+ (error): Use gmsgid instead of msgid for argument name.
+ * c-decl.c (locate_old_decl, implicit_decl_warning): Use G_()
+ instead of N_().
+ * c-typeck.c (readonly_error, convert_for_assignment): Likewise.
+ * tree-inline.c (inline_forbidden_p_1): Likewise.
+ * ABOUT-GCC-NLS: Require gettext 0.14.5 or later. Mention the new
+ conventions for marking translations.
+ * doc/install.texi: Mention gettext 0.14.5 or later requirement.
+
+ * tree-chrec.c (reset_evolution_in_loop): Use build3 instead of
+ build2.
+
+ * fold-const.c (operand_equal_p): Don't return 1, if element
+ chains for 2 VECTOR_CSTs are not the same length.
+
+ PR regression/21897
+ * fold-const.c (fold_ternary) <case BIT_FIELD_REF>: Don't crash if
+ not all VECTOR_CST elements are given.
+
+ * combine.c (try_combine): Use hard_regno_nregs array instead of
+ HARD_REGNO_NREGS macro.
+ * config/rs6000/rs6000.c (rs6000_split_multireg_move,
+ rs6000_register_move_cost, rs6000_memory_move_cost): Likewise.
+ * config/ia64/ia64.c (mark_reg_gr_used_mask): Likewise.
+
+2005-06-06 Daniel Berlin <dberlin@dberlin.org>
+
+ * tree-ssa-reassoc.o: New.
+ (OBJS-common): Add tree-ssa-reassoc.o
+ * timevar.def: Add TV_TREE_REASSOC
+ * tree-optimize.c (pass_reassoc): Add call.
+ * tree-pass.h (pass_reassoc): Add.
+ * tree-ssa-reassoc.c: New file.
+
+2005-06-06 Eric Christopher <echristo@redhat.com>
+
+ target/21927
+ * expr.c (do_store_flag): Remove check for non-negative BRANCH_COST.
+
+2005-06-06 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
+
+ * config/i386/x86-64.h (ASM_OUTPUT_MAX_SKIP_ALIGN): Guard with
+ HAVE_GAS_MAX_SKIP_P2ALIGN.
+ (HAVE_AS_DWARF2_DEBUG_LINE): Remove.
+
+2005-06-06 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
+
+ * Makefile.in (mips-tfile.o): Add $(srcdir)/../include prefix to
+ getopt.h dependency.
+ (mips-tdump.o): Likewise.
+
+2005-06-06 Jan Hubicka <jh@suse.cz>
+
+ * predict.c (tree_predict_edge): Don't drop useless predictions;
+ check that it is not called too late in the game.
+ (gate_estimate_probability): New gate.
+ (pass_profile): Gate.
+ * tree-mudflap.c (mf_build_check_statement_for): Do not drop
+ predictions; update CFG instead.
+ * cfgrtl.c (rtl_verify_flow_info): Check that predcitions are consumed.
+
+2005-06-06 Jie Zhang <jie.zhang@analog.com>
+
+ * config.gcc (bfin*-uclinux*): New.
+ * config/bfin/uclinux.h: New file.
+
+2005-06-06 Ben Elliston <bje@au.ibm.com>
+
+ * doc/md.texi (Insn Splitting): Fix some wording.
+
+2005-06-05 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.c (rs6000_emit_swdivsf): New function.
+ (rs6000_emit_swdivdf): New function.
+ * config/rs6000/rs6000.md (fres): New pattern.
+ (divsf3): Add approximation through rs6000_emit_swdivsf.
+ (fred): New pattern.
+ (divdf3): Add approximation through rs6000_emit_swdivdf.
+ * config/rs6000/rs6000-protos.h (rs6000_emit_swdivsf): Declare.
+ (rs6000_emit_swdivdf): Declare.
+ * config/rs6000/rs6000.opt (mswdiv): New option.
+ * doc/invoke.texi (RS/6000 and PowerPC Options): Document mswdiv.
+
+2005-06-05 Zdenek Dvorak <dvorakz@suse.cz>
+
+ PR tree-optimization/21846
+ * tree-cfg.c (replace_uses_by): Update information stored at loops.
+ * tree-flow.h (substitute_in_loop_info): Declare.
+ * tree-scalar-evolution.c (initialize_scalar_evolutions_analyzer):
+ Ensure that chrec_dont_know and chrec_known have a type.
+ * tree-ssa-loop-niter.c (substitute_in_loop_info): New function.
+
+2005-06-05 Steven Bosscher <stevenb@suse.de>
+
+ * config/i386/i386.c (x86_use_loop): Remove.
+ * config/i386/i386.h (x86_use_loop): Remove extern decl.
+ (TARGET_USE_LOOP): Remove.
+ * config/i386/i386.md (doloop_end, doloop_end_internal): Remove.
+ Also remove related define_splits.
+
+2005-06-05 Dorit Nuzman <dorit@il.ibm.com>
+
+ * tree-flow.h (stmt_ann_d): Move aux to ...
+ (tree_ann_common_d): ... here.
+ * tree-ssa-loop-im.c (LIM_DATA, determine_invariantness_stmt,
+ move_computations_stmt, schedule_sm): Update references to
+ aux.
+ * tree-vectorizer.h (set_stmt_info, vinfo_for_stmt): Likewise.
+ * tree-vect-transform.c (vect_create_index_for_vector_ref): Update
+ call to set_stmt_info.
+ (vect_transform_loop): Likewise.
+ * tree-vectorizer.c (new_loop_vec_info, destroy_loop_vec_info):
+ Likewise.
+
+ * tree-vect-analyze.c (vect_analyze_scalar_cycles): Made void instead of
+ bool.
+ (vect_mark_relevant): Takes two additional arguments - live_p and
+ relevant_p. Set RELEVANT_P and LIVE_P according to these arguments.
+ (vect_stmt_relevant_p): Differentiate between a live stmt and a
+ relevant stmt. Return two values = live_p and relevant_p.
+ (vect_mark_stmts_to_be_vectorized): Call vect_mark_relevant and
+ vect_stmt_relevant_p with additional arguments. Phis are no longer
+ put into the worklist (analyzed seperately in analyze_scalar_cycles).
+ (vect_determine_vectorization_factor): Also check for LIVE_P, because a
+ stmt that is marked as irrelevant and live, cause it's only used out
+ side the loop, may need to be vectorized (e.g. reduction).
+ (vect_analyze_operations): Examine phis. Call
+ vectorizable_live_operation for for LIVE_P stmts. Check if
+ need_to_vectorize.
+ (vect_analyze_scalar_cycles): Update documentation. Don't fail
+ vectorization - just classify the scalar cycles created by the loop
+ phis. Call vect_is_simple_reduction.
+ (vect_analyze_loop): Call to analyze_scalar_cycles moved earlier.
+ * tree-vect-transform.c (vect_create_index_for_vector_ref): Update
+ call to set_stmt_info.
+ (vect_get_vec_def_for_operand): Code reorganized - the code that
+ classifies the type of use was factored out to vect_is_simple_use.
+ (vectorizable_store, vect_is_simple_cond): Call vect_is_simple_use with
+ additional arguments.
+ (vectorizable_assignment): Likewise. Also make sure the stmt is relevant
+ and computes a loop_vec_def.
+ (vectorizable_operation, vectorizable_load, vectorizable_condition):
+ Likewise.
+ (vectorizable_live_operation): New.
+ (vect_transform_stmt): Handle LIVE_P stmts.
+ * tree-vectorizer.c (new_stmt_vec_info): Initialize the new fields
+ STMT_VINFO_LIVE_P and STMT_VINFO_DEF_TYPE.
+ (new_loop_vec_info, destroy_loop_vec_info): Also handle phis.
+ (vect_is_simple_use): Determine the type of the def and return it
+ in a new function argument. Consider vect_reduction_def and
+ vect_induction_def, but for now these are not supported.
+ (vect_is_simple_reduction): New. Empty for now.
+ * tree-vectorizer.h (vect_def_type): New enum type.
+ (_stmt_vec_info): Added new fields - live and _stmt_vec_info.
+ (STMT_VINFO_LIVE_P, STMT_VINFO_DEF_TYPE): New accessor macros.
+ (vect_is_simple_use): New arguments added to function declaration.
+ (vect_is_simple_reduction): New function declaration.
+ (vectorizable_live_operation): New function declaration.
+
+ * tree-vect-analyze.c (vect_can_advance_ivs_p): Add debug printout.
+ (vect_can_advance_ivs_p): Likewise.
+ * tree-vect-transform.c (vect_update_ivs_after_vectorizer): Likewise.
+
+2005-06-05 Eric Christopher <echristo@redhat.com>
+
+ * config/mips/mips.c (mips_rtx_costs): Remove unused variable.
+
+2005-06-05 Hans-Peter Nilsson <hp@bitrange.com>
+
+ PR target/21914
+ * config/mmix/mmix.md ("*movdicc_real_foldable")
+ ("*movdfcc_real_foldable", "*bCC_foldable")
+ ("*bCC_inverted_foldable"): Specify DImode for register being
+ compared.
+
+2005-06-04 Roger Sayle <roger@eyesopen.com>
+
+ * reg-stack.c (struct block_info_def): Correct grammar typo.
+ (compensate_edge): Clean-up. Perform as little work as possible
+ when src and dest stacks match. Avoid modifying block_info.
+ Reorder and simplify assertion checks. Avoid unnecessary copying
+ of regstack structure.
+ (convert_regs_1): Set the done flag here...
+ (convert_regs_2): ... instead of here.
+
+2005-06-04 Dale Johannesen <dalej@apple.com>
+
+ * config/rs6000/rs6000.c (no_global_regs_above): New.
+ (rs6000_emit_prologue): Use it; cosmetic formatting fixes.
+ (rs6000_emit_epilogue): Use it; cosmetic formatting fixes.
+ (rs6000_conditional_register_usage): Don't put Darwin PIC
+ register in global_regs.
+ (rs6000_stack_info): Don't set lr_save_p just because Darwin
+ PIC reg used.
+ (rs6000_emit_prologue): Save LR in R0 around Darwin PIC setup,
+ if not done by lr_save_p.
+ * config/rs6000/rs6000.md (insnv1_internal1): Back out 05-18 patch.
+ Use rotate instead of ashift.
+ (call_indirect_nonlocal_sysv): Prefer CTR to LR.
+ (call_value_indirect_nonlocal_sysv): Ditto.
+
+2005-06-04 Jan Hubicka <jh@suse.cz>
+
+ * cgraphunit.c (cgraph_reset_node): Break out from ...
+ (cgraph_finalize_function): ... here.
+ (cgraph_finalize_compilation_unit): Reset nodes where backend
+ removed the body.
+
+2005-06-04 Richard Henderson <rth@redhat.com>
+
+ PR target/21888
+ * config/alpha/alpha.c (alpha_align_insns): Don't insert nops
+ until we've passed initial ldgp.
+
+2005-06-04 Daniel Berlin <dberlin@dberlin.org>
+
+ * cfgexpand.c (expand_one_var): Use DECL_HAS_VALUE_EXPR_P.
+ * dwarf2out.c (loc_descriptor_from_tree_1): Ditto.
+ * expr.c (expand_var): Ditto.
+ * function.c (gimplify_parameters): Use SET_DECL_VALUE_EXPR too.
+ * gimplify.c (gimplify_decl_expr): Ditto.
+ (gimplify_expr): Ditto.
+ * tree-mudflap.c (mf_decl_eligible_p): Use DECL_HAS_VALUE_EXPR_P.
+ * tree.c (value_expr_for_decl): New.
+ (print_value_expr_statistics): New.
+ (init_ttree): Init value_expr_for_decl.
+ (decl_value_expr_lookup): New.
+ (decl_value_expr_insert): Ditto.
+ (copy_node_stat): Copy DECL_VALUE_EXPR status.
+ * tree.h (DECL_VALUE_EXPR): Use hashtable.
+ (SET_DECL_VALUE_EXPR): New.
+ (DECL_HAS_VALUE_EXPR_P): New.
+
+2005-06-04 Steven Bosscher <stevenb@suse.de>
+
+ * lcm.c: Move all mode-switching related functions from here...
+ * mode-switching.c: ...to this new file.
+ * doc/passes.texi: Update accordingly.
+
+ * basic-block.h (label_value_list): Remove extern decl.
+ * cfgrtl.c (label_value_list): Remove.
+ (can_delete_label_p): Don't look at it.
+ * cfgcleanup.c (cleanup_cfg): Don't free it.
+
+ * common.opt: Don't refer to non-existing flag_alias_check.
+
+2005-06-04 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/aix52.h (ASM_CPU_SPEC): Add power5.
+
+2005-06-04 Kazu Hirata <kazu@codesourcery.com>
+
+ * function.c (prologue, epilogue, sibcall_epilogue): Change
+ their types to VEC(int,heap)*.
+ (free_after_compilation): Free the three vectors above.
+ (init_function_for_compilation, record_insns, contains,
+ prologue_epilogue_contains, sibcall_epilogue_contains,
+ reposition_prologue_and_epilogue_notes): Use VEC instead of
+ VARRAY. (init_function_once): Remove.
+ * function.h: Remove the prototype for init_function_once.
+ * toplev.c (backend_init): Don't call init_function_once.
+
+2005-06-04 Jan Hubicka <jh@suse.cz>
+
+ * predict.c (tree_predict_edge): Do not predict entry edge and
+ single succestor edge.
+
+2005-06-04 Joseph S. Myers <joseph@codesourcery.com>
+
+ PR c/21873
+ * c-typeck.c (push_init_level): Don't pop levels without braces if
+ implicit == 1.
+
+2005-06-03 Sebastian Pop <pop@cri.ensmp.fr>
+
+ * tree-data-ref.c (compute_self_dependence): New function.
+ (compute_all_dependences): Use it.
+
+2005-06-03 Geoffrey Keating <geoffk@apple.com>
+
+ * c-parser.c (c_parser_parms_declarator): Don't use chainon().
+ (c_parser_expr_list): Don't use chainon().
+
+ * config/darwin.h (LINK_SPEC): Pass -syslibroot to linker
+ when -isysroot passed.
+
+2005-06-03 Joseph S. Myers <joseph@codesourcery.com>
+
+ PR c/21879
+ * c-decl.c (start_function): Restore label_context_stack_se and
+ label_context_stack_vm if returning with an error.
+
+2005-06-03 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * configure.ac: Check declaration for asprintf, needed by
+ libiberty.h.
+ * configure: Regenerate.
+ * config.in: Likewise.
+
+2005-06-03 Diego Novillo <dnovillo@redhat.com>
+
+ * tree-ssa-dom.c (record_edge_info): Use last_basic_block to
+ allocate info array.
+ * tree-vrp.c (extract_range_from_unary_expr): Set resulting
+ range to varying in cast expressions that change
+ TYPE_PRECISION.
+
+2005-06-03 Eric Christopher <echristo@redhat.com>
+
+ * config/mips/mips.opt: Add RejectNegative to divide-breaks and
+ divide-traps.
+
+2005-06-03 Jan Hubicka <jh@suse.cz>
+
+ * basic-block.h (remove_predictions_associated_with_edge): Declare.
+ * cfg.c (remove_edge): Use it.
+ * predict.c (remove_predictions_associated_with_edge): New function.
+
+2005-06-03 Pat Haugen <pthaugen@us.ibm.com>
+
+ * config/rs6000/rs6000.c (rs6000_conditional_register_usage):
+ Clear call_realy_used_regs[r2] when ABI_AIX.
+
+2005-06-03 Richard Guenther <rguenth@gcc.gnu.org>
+
+ PR middle-end/21858
+ * fold-const.c (fold_binary): Fix type mismatches in folding
+ of comparisons.
+
+2005-06-03 Kazu Hirata <kazu@codesourcery.com>
+
+ * cgraph.c, cgraphunit.c, config/mips/mips.c: Fix comment
+ typos.
+
+2005-06-03 Joseph S. Myers <joseph@codesourcery.com>
+
+ * collect2.c (maybe_unlink): Use unlink_if_ordinary.
+
+2005-06-02 Bernd Schmidt <bernd.schmidt@analog.com>
+
+ * reload1.c (reload): Revert my previous patch.
+
+2005-06-03 Nick Clifton <nickc@redhat.com>
+
+ * config/arm/semi.h (ASM_SPEC): Fix typo passing -mfloat-abi to
+ assembler.
+
+2005-06-03 Kazu Hirata <kazu@codesourcery.com>
+
+ PR tree-optimization/21849
+ * tree-ssa-copy.c (dump_copy_of): Call sbitmap_zero.
+
+2005-06-02 Richard Henderson <rth@redhat.com>
+
+ * Makefile.in (tree-vect-generic.o): New.
+ (OBJS-common, GTFILES, s-gtype): Add it.
+ * tree-complex.c (build_replicated_const, vector_inner_type,
+ vector_last_type, vector_last_nunits, build_word_mode_vector_type,
+ elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
+ do_negate, expand_vector_piecewise, expand_vector_parallel,
+ expand_vector_addition, expand_vector_operation,
+ type_for_widest_vector_mode, expand_vector_operations_1,
+ gate_expand_vector_operations, expand_vector_operations,
+ pass_lower_vector_ssa): Move to tree-vect-generic.c.
+ (tree_lower_complex): Rename from tree_lower_operations.
+ (pass_lower_complex): Rename from pass_pre_expand.
+ * tree-vect-generic.c: New file.
+ * tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
+ (pass_lower_vector): New.
+ * tree-optimize.c (init_tree_optimization_passes): Update to match.
+
+2005-06-02 Richard Henderson <rth@redhat.com>
+
+ * modulo-sched.c (doloop_register_get): Protect against
+ doloop_end not defined.
+
+2005-06-02 Kazu Hirata <kazu@codesourcery.com>
+
+ * config/sh/sh.c (general_movsrc_operand,
+ general_movdst_operand, arith_reg_operand, arith_reg_dest,
+ logical_reg_operand, int_gpr_dest, fp_arith_reg_operand,
+ fp_arith_reg_dest, arith_operand, arith_reg_or_0_operand,
+ xor_operand, cmp_operand, logical_operand, and_operand,
+ fpscr_operand, fpul_operand, symbol_ref_operand,
+ commutative_float_operator, noncommutative_float_operator,
+ unary_float_operator, binary_float_operator,
+ binary_logical_operator, equality_comparison_operator,
+ greater_comparison_operator, less_comparison_operator,
+ shift_operator, logical_operator, target_reg_operand,
+ target_operand, mextr_bit_offset, extend_reg_operand,
+ trunc_hi_operand, extend_reg_or_0_operand, minuend_operand,
+ general_extend_operand, ua_address_operand,
+ cache_address_operand, inqhi_operand, sh_rep_vec, sh_1el_vec,
+ sh_const_vec, ua_offset, sh_register_operand, cmpsi_operand,
+ shift_count_reg_operand, shift_count_operand,
+ unaligned_load_operand): Move to ...
+ * config/sh/predicates.md: ... here.
+ * config/sh/sh.h (PREDICATE_CODES, SPECIAL_MODE_PREDICATES):
+ Remove.
+
+2005-06-02 Andrew Pinski <pinskia@physics.uc.edu>
+
+ * tree.c (build_common_builtin_nodes): Fix the return type on
+ __builtin_memcmp.
+
+2005-06-02 Richard Guenther <rguenth@gcc.gnu.org>
+
+ * tree-ssa-loop-ivopts.c (build_addr_strip_iref): Remove.
+ (find_interesting_uses_address): Use build_fold_addr_expr instead.
+ (strip_offset_1): Likewise.
+ (tree_to_aff_combination): Likewise.
+
+2005-06-02 DJ Delorie <dj@redhat.com>
+
+ * convert.c (convert_to_pointer): Avoid recursion if no conversion
+ is needed.
+
+2005-06-02 Richard Guenther <rguenth@gcc.gnu.org>
+
+ * tree-chrec.c (chrec_fold_plus_1): Ensure we build
+ binary operations with the correct types.
+ * tree-ssa-loo-ivopts.c (idx_find_step): Use sizetype
+ for all computation.
+
+2005-06-02 Kazu Hirata <kazu@codesourcery.com>
+
+ * tree-vrp.c, config/arm/arm.md, config/arm/arm1020e.md,
+ config/rs6000/rs6000.md: Fix comment typos. Follow splling
+ conventions.
+ * doc/install.texi: Fix a typo.
+
+2005-06-02 Jan Hubicka <jh@suse.cz>
+
+ * cgraphunit.c (cgraph_function_and_variable_visibility): Extern
+ inline functions are not local.
+
+2005-06-02 Kazu Hirata <kazu@codesourcery.com>
+
+ * gimplify.c (gimplify_ctx): Change the type of case_labels to
+ VEC from VARRAY.
+ (gimplify_switch_expr, gimplify_case_label_expr): Adjust uses
+ of case_labels.
+
+2005-06-02 Richard Guenther <rguenth@gcc.gnu.org>
+
+ * c-typeck.c (build_indirect_ref): Build INDIRECT_REF
+ with correct type.
+
+2005-06-02 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (s390_add_execute): Do not handle out-of-pool
+ execute templates.
+ (s390_dump_pool): Likewise.
+ (s390_mainpool_start, s390_mainpool_finish): Likewise.
+ (s390_chunkify_start): Likewise.
+ (s390_dump_execute): Remove.
+ (s390_reorg): Handle out-of-pool execute templates.
+
+2005-06-02 Adrian Straetling <straetling@de.ibm.com>
+
+ * optabs.c: (expand_bool_compare_and_swap): Emit barrier after
+ unconditional jump.
+
+2005-06-02 Jan Hubicka <jh@suse.cz>
+
+ * cgraph.c (cgraph_node): Maintain master clones.
+ (cgraph_remove_node): Likewise.
+ (availability_names): New static variable.
+ (dump_cgraph_node): Dump availability.
+ (dump_cgraph_varpool_node): Likewise.
+ (cgraph_is_master_clone, cgraph_master_clone,
+ cgraph_function_body_availability,
+ cgraph_variable_initializer_availability): New functions.
+ * cgraph.h (availability): New enum.
+ (struct cgraph_node): Add master_clone.
+ (cgraph_is_master_clone, cgraph_master_clone,
+ cgraph_function_body_availability,
+ cgraph_variable_initializer_availability): Declare.
+ * cgraphunit.c (cgraph_expand_function): Setcgraph_function_flags_ready.
+ (cgraph_remove_unreachable_nodes): Remove unreachable nodes.
+ * ipa-inline.c (cgraph_decide_inlining): Do not call
+ cgraph_remove_unreachable_nodes.
+
+ * cgraphunit.c (cgraph_function_and_variable_visibility): Fix typo in
+ previous patch.
+
+2005-06-02 Diego Novillo <dnovillo@redhat.com>
+
+ PR 21582
+ * tree-vrp.c (nonnull_arg_p): New.
+ (get_value_range): Call it.
+
+2005-06-02 Eric Christopher <echristo@redhat.com>
+
+ * config/mips/mips.h (processor_type): Remove PROCESSOR_DEFAULT,
+ add PROCESSOR_MAX.
+ (mips_rtx_cost_data): New datatype.
+ (MEMORY_MOVE_COST): Use data from structure.
+ (BRANCH_COST): Ditto.
+ (LOGICAL_OP_NON_SHORT_CIRCUIT): Define to zero.
+ * config/mips/mips.md (cpu): Rework for processor_type changes.
+ * config/mips/mips.c (mips_cost): New variable.
+ (DEFAULT_COSTS): Define.
+ (mips_rtx_cost_data): New.
+ (mips_rtx_costs): Use. Minor formatting changes. Use COSTS_N_INSNS
+ for NEG cost. Add support for FLOAT, UNSIGNED_FLOAT, FIX,
+ FLOAT_EXTEND, FLOAT_TRUNCATE, and SQRT.
+ (override_options): Set cost data.
+ (mips_register_move_cost): Formatting changes.
+ (bdesc_arrays): Use PROCESSOR_MAX.
+ (mips_init_builtins): Ditto.
+
+2005-06-02 Diego Novillo <dnovillo@redhat.com>
+
+ PR 21765
+ * doc/invoke.texi: Document -ftree-vrp.
+
+2005-06-02 Dorit Nuzman <dorit@il.ibm.com>
+
+ PR tree-optimization/21734
+ * tree-vectorizer.c (slpeel_update_phis_for_duplicate_loop): Use the
+ phi_result when current_def is not available.
+ (slpeel_update_phi_nodes_for_guard1): Don't fail if current_def is not
+ available.
+
+2005-06-02 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.c (rs6000_insn_valid_within_doloop): New.
+ (TARGET_INSN_VALID_WITHIN_DOLOOP): Define.
+
+2005-06-02 Diego Novillo <dnovillo@redhat.com>
+
+ * tree-vrp.c (has_assert_expr, maybe_add_assert_expr): Remove.
+
+2005-06-02 Jan Hubicka <jh@suse.cz>
+
+ * cgraph.c (dump_cgraph_node): Print new flags.
+ (dump_cgraph_varpool_node): Likewise.
+ (decide_variable_is_needed): Initialize externally_visible flag.
+ * cgraph.h (cgraph_local_info): Add externally_visible flag.
+ (cgraph_varpool_node): Likewise.
+ (cgraph_function_flags_ready): Declare.
+ * cgraph.c (cgraph_mark_local_functions): Rename to ...
+ (cgraph_function_and_variable_visibility) ... this one; handle
+ externally_visible flags.
+ (decide_is_function_needed): Set externally_visible flag.
+ (cgraph_finalize_function): Deal properly with early cleanups.
+ (cgraph_optimize): Update call of
+ cgraph_function_and_variable_visibility.
+
+2005-06-02 Steven Bosscher <stevenb@suse.de>
+ Mostafa Hagog <mustafa@il.ibm.com>
+
+ * cfgloop.h (doloop_condition_get): Make external.
+ * loop-doloop.c (doloop_condition_get): Generalize to make it
+ usable in modulo-sched.c.
+ * modulo-sched.c (doloop_register_get): Use
+ doloop_condition_get instead of duplicating it.
+
+2005-06-02 Bernd Schmidt <bernd.schmidt@analog.com>
+
+ * reload1.c (reload): Undo 2005-04-20 change. Make sure we detect
+ the correct set of init_insns that need deletion.
+ * local-alloc.c (update_equiv_regs): When substituting sole definition
+ into sole use of a reg, delete it from liveness information.
+
+2005-06-02 Kaz Kojima <kkojima@gcc.gnu.org>
+
+ * config/sh/sh.h (TARGET_FPU_DOUBLE): Use MASK_SH4.
+
+2005-06-01 Diego Novillo <dnovillo@redhat.com>
+
+ PR 14341, PR 21332, PR 20701, PR 21029, PR 21086, PR 21090
+ PR 21289, PR 21348, PR 21367, PR 21368, PR 21458.
+ * fold-const.c (invert_tree_comparison): Make extern.
+ * tree-flow.h (enum value_range_type): Move to tree-ssa-propagate.
+ (struct value_range_def): Limewise.
+ (get_value_range): Remove.
+ (dump_value_range): Remove.
+ (dump_all_value_ranges): Remove.
+ (debug_all_value_ranges): Remove.
+ (vrp_evaluate_conditional): Declare.
+ * tree-ssa-propagate.c (struct prop_stats_d): Add field
+ num_pred_folded.
+ (substitute_and_fold): Add argument use_ranges_p.
+ Update all callers.
+ If use_ranges_p is true, call fold_predicate_in to fold
+ predicates using range information.
+ Ignore ASSERT_EXPRs.
+ Change debugging output to only show statements that have been
+ folded.
+ (replace_phi_args_in): Move debugging output code from
+ substitute and fold.
+ (fold_predicate_in): New local function.
+ * tree-ssa-propagate.h (enum value_range_type): Move from
+ tree-flow.h.
+ (struct value_range_d): Likewise.
+ Add field 'equiv'.
+ (value_range_t): Rename from value_range.
+ * tree-vrp.c (found_in_subgraph): Rename from found.
+ (get_opposite_operand): Remove.
+ (struct assert_locus_d): Declare.
+ (assert_locus_t): Declare.
+ (need_assert_for): Declare.
+ (asserts_for): Declare.
+ (blocks_visited): Declare.
+ (vr_value): Declare.
+ (set_value_range): Add argument 'equiv'.
+ Don't drop to VARYING ranges that cover all values in the
+ type.
+ Make deep copy of equivalence set 'equiv'.
+ (copy_value_range): New local function.
+ (set_value_range_to_undefined): New local function.
+ (compare_values): Return -2 if either value has overflowed.
+ (range_includes_zero_p): New local function.
+ (extract_range_from_assert): Flip the predicate code if the
+ name being asserted is on the RHS of the predicate.
+ Avoid creating unnecessary symbolic ranges if the comparison
+ includes another name with a known numeric range.
+ Update the equivalnce set of the new range when asserting
+ EQ_EXPR predicates.
+ (extract_range_from_ssa_name): Update the equivalence set of
+ the new range with VAR.
+ (extract_range_from_binary_expr): Also handle TRUTH_*_EXPR.
+ If -fwrapv is used, set the resulting range to VARYING if the
+ operation overflows. Otherwise, use TYPE_MIN_VALUE and
+ TYPE_MAX_VALUE to represent -INF and +INF.
+ Fix handling of *_DIV_EXPR.
+ (extract_range_from_unary_expr): Handle MINUS_EXPR and
+ ABS_EXPR properly by switching the range around if necessary.
+ (extract_range_from_comparison): New local function.
+ (extract_range_from_expr): Call it.
+ (adjust_range_with_scev): Do not adjust the range if using
+ wrapping arithmetic (-fwrapv).
+ (dump_value_range): Also show equivalence set.
+ Show -INF and +INF for TYPE_MIN_VALUE and TYPE_MAX_VALUE.
+ (build_assert_expr_for): Also build ASSERT_EXPR for EQ_EXPR.
+ (infer_value_range): Change return value to bool.
+ Add arguments 'comp_code_p' and 'val_p'.
+ Do not attempt to infer ranges from statements that may throw.
+ Store the comparison code in comp_code_p.
+ Store the other operand to be used in the predicate in val_p.
+ (dump_asserts_for): New.
+ (debug_asserts_for): New.
+ (dump_all_asserts): New.
+ (debug_all_asserts): New.
+ (register_new_assert_for): New.
+ (register_edge_assert_for): New.
+ (find_conditional_asserts): New.
+ (find_assert_locations): New.
+ (process_assert_insertions_for): New.
+ (process_assert_insertions): New.
+ (insert_range_assertions): Initialize found_in_subgraph,
+ blocks_visited, need_assert_for and asserts_for.
+ Call find_assert_locations and process_assert_insertions.
+ (remove_range_assertions): Add more documentation.
+ (vrp_initialize): Change return type to void.
+ Do not try to guess if running VRP is worth it.
+ (compare_name_with_value): New.
+ (compare_names): New.
+ (vrp_evaluate_conditional): Add argument 'use_equiv_p'. If
+ use_equiv_p is true, call compare_names and
+ compare_name_with_value to compare all the ranges for every
+ name in the equivalence set of the predicate operands.
+ Update all callers.
+ (vrp_meet): Try harder not to derive a VARYING range.
+ If two values meet, the resulting equivalence set is the
+ intersection of the two equivalence sets.
+ (vrp_visit_phi_node): Call copy_value_range to get the current
+ range information of the LHS.
+ (vrp_finalize): Create a value vector representing all the
+ names that ended up with exactly one value in their range.
+ Call substitute_and_fold.
+ (execute_vrp): Document equivalence sets in ranges.
+ * tree.h (SSA_NAME_VALUE_RANGE): Remove.
+ (struct tree_ssa_name): Remove field value_range.
+ (invert_tree_comparison): Declare.
+
+2005-06-01 Daniel Berlin <dberlin@dberlin.org>
+
+ Fix PR tree-optimization/21839
+
+ * gimplify.c (zero_sized_field_decl): New function.
+ (gimplify_init_ctor_eval): Use it.
+
+2005-06-01 Josh Conner <jconner@apple.com>
+
+ PR 21478
+ * gimplify.c (gimplify_init_constructor): Don't spill initializer
+ to read-only memory if it's sparse.
+
+2005-06-01 Ramana Radhakrishnan <ramana@codito.com>
+
+ * doc/rtl.texi: Remove references to NOTE_INSN_SETJMP.
+ Add documentation for REG_SETJMP
+
+2005-06-01 Richard Guenther <rguenth@gcc.gnu.org>
+
+ * stmt.c (expand_case): Use build_int_cst.
+ (node_has_low_bound): Likewise, and correct type mismatch.
+ (node_has_high_bound): Likewise.
+ * fold-const.c (fold_binary): Ensure we build trees
+ with the correct types - undo what STRIP_NOPS possibly did.
+
+2005-06-01 Richard Guenther <rguenth@gcc.gnu.org>
+
+ * tree.h (fold_indirect_ref_1): Export from fold-const.c.
+ * fold-const.c (fold_indirect_ref_1): No longer static.
+ * tree-inline.c (copy_body_r): Use fold_indirect_ref_1 for
+ folding, if possible.
+
+2005-06-01 Joseph S. Myers <joseph@codesourcery.com>
+
+ * common.opt (fjump-tables): New.
+ * doc/invoke.texi (-fno-jump-tables): Document.
+ * stmt.c (expand_end_case_type): Do not emit jump tables unless
+ flag_jump_tables.
+
+2005-06-01 Richard Earnshaw <richard.earnshaw@arm.com>
+
+ * arm.md (bunordered, bordered, bungt, bunlt, bunge, bunle, buneq)
+ (bltgt, arm_buneq, arm_bltgt, sunordered, sordered, sungt, sunge)
+ (sunlt, sunle): Enable patterns on VFP.
+
+ * arm.md (attribute 'type'): Add new types - f_loads floadd, f_stores,
+ f_stored, f_flag, f_cvt.
+ (generic_sched): No-longer used for the arm1020e and arm1022e cores.
+ Include arm1020e.md.
+ * vfp.md (fmstat): New cpu unit. Add an exclusion set between it and
+ the ds and fmac pipelines. Re-work all load and store patterns and
+ all conversion patterns to use new attributes. Adjust reservation
+ descriptions accordingly.
+ * arm1020e.md: New file.
+ * t-arm: Add dependency.
+
+2005-06-01 Jan Hubicka <jh@suse.cz>
+
+ * except.c (struct eh_region): Kill unused fields.
+ * basic-block.h (struct basic_block_def): Likewise.
+
+2005-06-01 J"orn Rennecke <joern.rennecke@st.com>
+
+ PR rtl-optimization/21767
+ * rtl.h (function_invariant_p): Re-add declaration.
+ * reload1.c (function_invariant_p): No longer static.
+ * ifcvt.c (dead_or_predicable): Remove REG_EQUAL notes that
+ might have become invalid.
+
+2005-06-01 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/21536
+ PR c/20760
+ * gimplify.c (gimplify_decl_expr): Call gimplify_type_sizes
+ on variable sizes types if a decl is a pointer to a VLA.
+ (gimplify_type_sizes): Handle POINTER_TYPE and REFERENCE_TYPE.
+ Call gimplify_type_sizes on aggregate fields. Prevent infinite
+ recursion.
+
+ * fold-const.c (fold_ternary): Optimize BIT_FIELD_REF of VECTOR_CST.
+
+ * config/i386/xmmintrin.h (_mm_setzero_ps, _mm_set_ss, _mm_set1_ps,
+ _mm_set_ps, _mm_setr_ps): Add __extension__.
+ * config/i386/emmintrin.h (_mm_set_sd, _mm_set1_pd, _mm_set_pd,
+ _mm_setr_pd, _mm_setzero_pd, _mm_set_epi64x, _mm_set_epi64x,
+ _mm_set_epi32, _mm_set_epi16, _mm_set_epi8, _mm_setzero_si128):
+ Likewise.
+ (_mm_clflush): Don't use return in void function.
+
+ * config/i386/emmintrin.h (_mm_castpd_ps, _mm_castpd_si128,
+ _mm_castps_pd, _mm_castps_si128, _mm_castsi128_ps, _mm_castsi128_pd):
+ Use __inline instead of inline.
+
+2005-06-01 Richard Guenther <rguenth@gcc.gnu.org>
+
+ * fold-const.c (fold_binary): Fix types in strlen vs.
+ zero comparison folding.
+
+2005-06-01 Richard Henderson <rth@redhat.com>
+
+ * configure.ac (HAVE_AS_JSRDIRECT_RELOCS): New.
+ * config.in, configure: Rebuild.
+ * config/alpha/alpha.c (print_operand): Add 'j'.
+ * alpha.md (divmodsi_internal_er_1): Use it.
+ (divmoddi_internal_er_1): Likewise.
+
+2005-06-01 Richard Sandiford <rsandifo@redhat.com>
+
+ * system.h (TARGET_OPTIONS, TARGET_SWITCHES): Poison.
+ * opts.h (print_filtered_help): Delete.
+ * opts.c (handle_option, decode_options): Remove calls to
+ set_target_switch.
+ (print_target_help): New function.
+ (common_option, print_help): Call print_target_help instead of
+ display_target_options.
+ (print_filtered_help): Make static.
+ * toplev.h (display_target_options, set_target_switch): Delete.
+ * toplev.c (target_switches, target_options, display_target_options)
+ (set_target_switch): Delete.
+ (print_switch_values): Remove handling of TARGET_SWITCHES and
+ TARGET_OPTIONS.
+ (default_get_pch_validity): Likewise. Only treat target_flags
+ specially if targetm.check_pch_target_flags is nonnull.
+ (pch_option_mismatch): New function.
+ (default_pch_valid_p): Use it. Remove handling of TARGET_SWITCHES
+ and TARGET_OPTIONS. Only treat target_flags specially if
+ targetm.check_pch_target_flags is nonnull.
+ * config/ia64/ia64.c (ia64_override_options): Don't mention
+ TARGET_OPTIONS in comment.
+ * config/m68k/m68k-none.h (CC1_SPEC): Likewise.
+ * doc/invoke.texi: Remove a reference to TARGET_SWITCHES.
+ * doc/tm.texi (TARGET_DEFAULT_TARGET_FLAGS): Don't mention the
+ interaction with TARGET_SWITCHES.
+ (TARGET_@var{featurename}, TARGET_SWITCHES, TARGET_OPTIONS): Delete.
+
+2005-06-01 Richard Sandiford <rsandifo@redhat.com>
+
+ * config/sh/sh.c (multcosts): Check sh_multcost rather than
+ sh_multcost_str.
+ (sh_register_move_cost): Likewise sh_gettrcost and sh_gettrcost_str.
+ (sh_multcost_str, sh_gettrcost_str, sh_div_str, sh_divsi3_libfunc)
+ (cut2_workaround_str): Delete.
+ * config/sh/sh.h (SUBTARGET_OPTIONS, TARGET_OPTIONS)
+ (TARGET_SH5_CUT2_WORKAROUND, sh_multcost_str, sh_gettrcost_str)
+ (sh_div_str, sh_divsi3_libfunc, cut2_workaround_str): Delete.
+ * config/sh/sh.opt (mcut2-workaround, mdiv=, mdivsi3_libfunc=)
+ (mgettrcost=, multcost=): New options.
+
+2005-06-01 Richard Sandiford <rsandifo@redhat.com>
+
+ * opts.h (cl_option_state): New structure.
+ (get_option_state): Declare.
+ * opts.c (get_option_state): New function.
+ * toplev.c (option_affects_pch_p): New function.
+ (default_get_pch_validity): Store the state of all options for which
+ option_affects_pch_p returns true.
+ (default_pch_valid_p): Check the state of those options here.
+ Only check target_flags separately if targetm.check_pch_target_Flags
+ is nonnull or if TARGET_SWITCHES is defined.
+
+2005-06-01 Richard Sandiford <rsandifo@redhat.com>
+
+ * config/mips/mips-protos.h (mips_use_ins_ext_p): Remove parameter
+ names.
+
+2005-06-01 Mostafa Hagog <mustafa@il.ibm.com>
+
+ * modulo-sched.c (undo_generate_reg_moves ): Fix PR 21138.
+
+2005-06-01 Mostafa Hagog <mustafa@il.ibm.com>
+
+ * gcse.c (compute_transp, load_killed_in_block): Use
+ MEM_READONLY_P.
+
+2005-06-01 David.Billinghurst <David.Billinghurst@riotinto.com>
+
+ PR target/21854
+ * config/mips/mips-protos.h: Declare mips_use_ins_ext_p
+
+2005-05-31 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * errors.h (warning, error, fatal, internal_error): Add printf
+ attribute.
+ * genmodes.c (make_vector_mode): Fix format arguments.
+
+2005-05-31 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * basic-block.h, bb-reorder.c, c-gimplify.c, config/darwin.c,
+ config/rs6000/rs6000-c.c, dominance.c, gimple-low.c, gimplify.c,
+ lambda-code.c, lambda-trans.c, tree-browser.c, tree-cfg.c,
+ tree-chrec.c, tree-data-ref.c, tree-dfa.c, tree-eh.c,
+ tree-if-conv.c, tree-into-ssa.c, tree-loop-linear.c,
+ tree-mudflap.c, tree-nomudflap.c, tree-outof-ssa.c,
+ tree-pretty-print.c, tree-scalar-evolution.c, tree-sra.c,
+ tree-ssa-ccp.c, tree-ssa-copy.c, tree-ssa-dce.c, tree-ssa-dom.c,
+ tree-ssa-dse.c, tree-ssa-forwprop.c, tree-ssa-live.c,
+ tree-ssa-operands.c, tree-ssa-phiopt.c, tree-ssa-pre.c,
+ tree-ssa-propagate.c, tree-ssa-sink.c, tree-ssa-threadupdate.c,
+ tree-ssa-uncprop.c, tree-ssa.c, tree-vect-analyze.c,
+ tree-vect-transform.c, tree-vectorizer.c, vec.c: Don't include
+ errors.h and include toplev.h if necessary.
+
+ * rtl.c, varray.c: If we're compiling as a GENERATOR_FILE, include
+ errors.h otherwise include toplev.h.
+
+ * Makefile.in: Update dependencies.
+
+2005-06-01 Danny Smith <dannysmith@users.sourceforge.net>
+
+ * config/i386/cygming.h (NO_PROFILE_COUNTERS): Define.
+
+2005-05-31 Geoffrey Keating <geoffk@geoffk.org>
+
+ * config/rs6000/rs6000.md (sync_boolcshort_internal): New.
+ * config/rs6000/rs6000.c (rs6000_emit_sync): Shift count must
+ be complemented for big-endian. Mask for AND must be rotated,
+ not shifted. Handle short operands with NOT on the memory
+ operation.
+
+2005-05-30 Daniel Berlin <dberlin@dberlin.org>
+
+ * c-objc-common.c (c_tree_printer): Check flag before hashtable.
+ Use DECL_DEBUG_EXPR and SET_DECL_DEBUG_EXPR.
+ * dwarf2out.c (dwarf2out_var_location): Ditto.
+ * toplev.c (default_tree_printer): Ditto.
+ * tree-outof-ssa.c (create_temp): Ditto.
+ * tree-sra.c (instantiate_element): Ditto.
+ * var-tracking.c (track_expr_p): Ditto.
+ * tree.c (struct tree_map): New structure.
+ (debug_expr_for_decl): New.
+ (tree_map_eq): New function.
+ (tree_map_hash): Ditto.
+ (tree_map_marked_p): Ditto.
+ (print_debug_expr_statistics): Ditto.
+ (decl_debug_expr_lookup): Ditto.
+ (decl_debug_expr_insert): Ditto.
+ (dump_tree_statistics): Dump debug_expr hashtable stats.
+ * tree.h (DECL_DEBUG_EXPR): Change
+ (SET_DECL_DEBUG_EXPR): Add.
+
+2005-06-01 Alan Modra <amodra@bigpond.net.au>
+
+ * configure.ac: Add --enable-secureplt.
+ (HAVE_AS_REL16): Test for R_PPC_REL16 relocs.
+ * config.in: Regenerate.
+ * configure: Regenerate.
+ * config.gcc (powerpc64-*-linux*, powerpc-*-linux*): Add
+ rs6000/secureplt.h to tm_file when enable_secureplt.
+ * doc/invoke.texi (msecure-plt, mbss-plt): Document.
+ * doc/install.texi: Document --enable-targets and --enable-secureplt.
+ Correct xrefs to "Using the GNU Compiler Collection (GCC)".
+ * config/rs6000/secureplt.h: New file.
+ * config/rs6000/sysv4.h (TARGET_SECURE_PLT): Define.
+ (SUBTARGET_OVERRIDE_OPTIONS): Error if -msecure-plt given without
+ assembler support.
+ (CC1_SECURE_PLT_DEFAULT_SPEC): Define.
+ (CC1_SPEC): Delete duplicate mno-sdata. Invoke cc1_secure_plt_default.
+ (SUBTARGET_EXTRA_SPECS): Add cc1_secure_plt_default.
+ * config/rs6000/sysv4.opt (msecure-plt, bss-plt): Add options.
+ * config/rs6000/rs6000.h (TARGET_SECURE_PLT): Define.
+ * config/rs6000/rs6000.c (rs6000_emit_load_toc_table): Handle
+ TARGET_SECURE_PLT got register load sequence.
+ (rs6000_emit_prologue): Call rs6000_emit_load_toc_table when
+ TARGET_SECURE_PLT.
+ (rs6000_elf_declare_function_name): Don't emit toc address offset
+ word when TARGET_SECURE_PLT.
+ * config/rs6000/rs6000.md (elf_high, elf_low): Move past load_toc_*.
+ (load_toc_v4_PIC_1) Enable for TARGET_SECURE_PLT.
+ (load_toc_v4_PIC_3b, load_toc_v4_PIC_3c): New insns.
+ (call, call_value): Mark pic_offset_table_rtx used for sysv pic and
+ TARGET_SECURE_PLT.
+ (call_nonlocal_sysv, call_value_nonlocal_sysv, sibcall_nonlocal_sysv,
+ sibcall_value_nonlocal_sysv): Add 32768 offset when TARGET_SECURE_PLT
+ and -fPIC.
+ * config/rs6000/tramp.asm (trampoline_initial): Use "bcl 20,31".
+ (__trampoline_setup): Likewise. Init r30 before plt call.
+
+2005-05-31 DJ Delorie <dj@redhat.com>
+
+ * expr.c (convert_move): When a partial_int requires multiple
+ conversion steps, make sure successive steps convert the
+ intermediate value, not the original value.
+
+ * expmed.c (expand_mult): Convert partial_int multiplies to
+ shift/add combinations too.
+
+ * genmodes.c (mode_data): Add wider_2x.
+ (calc_wider_mode): Calculate twice-wider mode too.
+ (emit_mode_wider): Emit twice-wider mode too.
+ * machmode.h (mode_2xwider, GET_MODE_2XWIDER_MODE): New.
+ * expr.c (expand_expr_real_1): Use it for expanding
+ multiplies.
+
+2005-05-31 Zdenek Dvorak <dvorakz@suse.cz>
+
+ PR tree-optimization/21817
+ * tree-ssa-loop-im.c (for_each_index): Handle VECTOR_CST.
+
+2005-05-31 Pat Haugen <pthaugen@us.ibm.com>
+
+ * loop.c (loop_invariant_p, valid_initial_value_p): Revert last
+ change.
+
+2005-05-31 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR middle-end/20931
+ PR middle-end/20946
+ * fold-const.c (fold_checksum_tree): Copy types also if
+ TYPE_CONTAINS_PLACEHOLDER_INTERNAL is set.
+ Don't call fold_checksum_tree for TREE_LIST's TREE_CHAIN
+ first.
+ Tail recurse TREE_LIST's TREE_CHAIN.
+
+2005-05-31 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR tree-opt/21732
+ * tree-ssa-copy.c (dump_copy_of): Create a bitmap and don't visit a
+ SSA_NAME twice and cause the loop to become finite. Remove the test
+ for val.
+
+2005-05-31 Andrew Pinski <pinskia@physics.uc.edu>
+
+ * tree-cfg.c (verify_expr): Add checking for COND_EXPR's conditional
+ expression.
+
+2005-05-31 Richard Sandiford <rsandifo@redhat.com>
+
+ * doc/tm.texi (TARGET_GET_PCH_VALIDITY, TARGET_PCH_VALID_P): Tweak
+ the documentation to make it more future-proof.
+ (TARGET_CHECK_PCH_TARGET_FLAGS): Document this new hook.
+ * target.h (gcc_target): Add check_pch_target_flags.
+ * target-def.h (TARGET_CHECK_PCH_TARGET_FLAGS): New macro.
+ (TARGET_INITIALIZER): Include it.
+ * toplev.c (default_pch_valid_p): Use targetm.check_pch_target_flags.
+ * config/sh/sh-protos.h (sh_pch_valid_p): Delete.
+ * config/sh/sh.c (TARGET_PCH_VALID_P, sh_pch_valid_p): Delete.
+ (sh_check_pch_target_flags): New function.
+ (TARGET_CHECK_PCH_TARGET_FLAGS): Override default.
+
+2005-05-31 Richard Guenther <rguenth@gcc.gnu.org>
+
+ * fold-const.c (extract_array_ref): Handle more cases,
+ do some useful canonicalization of the base.
+ (fold_binary): Explicitly deal with arrays of zero-sized
+ structures during folding of &a[i] == &a[j].
+
+2005-05-31 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ * doc/install.texi (sparc-sun-solaris2*): Update note
+ about Sun bug 4910101.
+ (sparc-sun-solaris2.7): Document bootstrap
+ failure with Sun WorkShop 6 99/08/18 as.
+
+2005-05-30 Pat Haugen <pthaugen@us.ibm.com>
+
+ * loop.c (loop_invariant_p, valid_initial_value_p): Use
+ regs_invalidated_by_call instead of call_used_regs.
+
+2005-05-30 Paolo Carlini <pcarlini@suse.de>
+
+ PR middle-end/21743
+ * builtins.def (BUILT_IN_CLOG, BUILT_IN_CLOGF, BUILT_IN_CLOGL):
+ Enable.
+ * doc/extend.texi: Add clog, clogf, clogl.
+
+2005-05-30 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR middle-end/20303
+ * c-pragma.c: Include "vec.h".
+ (handle_pragma_visibility): Use VEC.
+
+ * doc/invoke.texi: Remove the nested visibility push limit.
+
+2005-05-30 Roger Sayle <roger@eyesopen.com>
+
+ PR rtl-optimization/15422
+ * reg-stack.c (starting_stack_p): New static global.
+ (straighten_stack): Delete prototype. Change to update the stack
+ before the current insn.
+ (subst_stack_regs): Update call to straighten stack.
+ (emit_swap_insn): Delete prototype. For the first insn in a
+ basic block, update stack_in instead of emitting a real swap.
+ (change_stack): When changing the stack before the first insn
+ in a basic block, update stack_in instead of emitting real code.
+ (compensate_edges): Clear starting_stack_p during compensation.
+ (convert_regs_1): Keep track of starting_stack_p whilst processing
+ a basic block.
+
+2005-05-30 Kazu Hirata <kazu@cs.umass.edu>
+
+ * tree-ssa-ccp.c (const_val): Make it static.
+
+2005-05-29 Geoffrey Keating <geoffk@apple.com>
+
+ PR target/21761
+ * config/rs6000/rs6000.md: Remove stray TARGET_32BIT from
+ pattern involving `:P'.
+
+ * Makefile.in (install-cpp): Depend on installdirs.
+
+2005-05-30 Kazu Hirata <kazu@cs.umass.edu>
+
+ * tree-outof-ssa.c (_elim_graph): Change the type of edge_list
+ to VEC(int,heap)*.
+ (new_elim_graph, clear_elim_graph, delete_elim_graph,
+ elim_graph_add_edge, elim_graph_remove_succ_edge,
+ FOR_EACH_ELIM_GRAPH_SUCC, FOR_EACH_ELIM_GRAPH_PRED): Use VEC
+ instead of VARRAY.
+
+2005-05-29 Kazu Hirata <kazu@cs.umass.edu>
+
+ * cgraphunit.c, ipa-inline.c, loop-iv.c, modulo-sched.c,
+ opts.c, postreload-gcse.c, tree-browser.def, tree-eh.c,
+ tree-ssa-copyrename.c, tree-vect-analyze.c: Fix typos and
+ follow spelling conventions in error/dump messages.
+
+2005-05-29 Roger Sayle <roger@eyesopen.com>
+ Richard Henderson <rth@redhat.com>
+
+ * ifcvt.c (noce_emit_move_insn): Construct a SET pattern directly
+ if the RHS isn't suitable for calling emit_move_insn.
+
+2005-05-29 Kazu Hirata <kazu@cs.umass.edu>
+
+ * tree-ssa-ccp.c (ccp_fold): Return immediately after calling
+ fold_unary and fold_binary.
+
+2005-05-29 Roger Sayle <roger@eyesopen.com>
+
+ * reg-stack.c (propagate_stack): Always copy the source stack to
+ the destination. This routine is now only called when this is safe.
+ (better_edge): New function split out from convert_regs_1 to
+ determine which of two edges is better to propagate across.
+ (convert_regs_1): We need only search for a best edge if the
+ stack layout hasn't been defined yet. Use better_edge to help
+ find beste. No longer traverse unnecessary edges.
+
+2005-05-29 Keith Besaw <kbesaw@us.ibm.com>
+
+ * tree-ssa-alias.c (new_type_alias): New procedure to
+ create a type memory tag for a pointer with a may-alias
+ set determined from a variable declaration.
+ * tree-flow.h: export declaration of new_type_alias
+ * tree-optimize.c (init_tree_optimization_passes): document
+ that pass_may_alias cannot be called after pass_vectorize.
+ * tree-vect-transform (vect_create_data_ref_ptr): Call
+ new_type_alias when an type memory tag isn't available
+ for a reference.
+ (vectorizable_store): Use copy_virtual_operands to update
+ virtual defs in place (so that loop_version can be called).
+ Call mark_for_renaming for the virtual defs in case peeling
+ is done and virtual uses outside the loop need to be updated.
+
+2005-05-29 Dorit Naishlos <dorit@il.ibm.com>
+
+ PR tree-optimization/21639
+ * tree-complex.c (pass_lower_vector_s): Remove TODO_ggc_collect.
+
+2005-05-29 Jan Hubicka <jh@suse.cz>
+
+ PR tree-optimization/21562
+ * cfgexpand.c (construct_init_block): Deal properly with the case
+ of entry edge not pointing to very first basic block.
+
+2005-05-28 Kazu Hirata <kazu@cs.umass.edu>
+
+ * tree-ssa-ccp.c (ccp_fold): Remove code that produces
+ non-gimple min invariant.
+
+ * Makefile.in (OBJS-common): Add tree-cfgcleanup.o.
+ * tree-flow.h: Add prototypes for start_recording_case_labels
+ and end_recording_case_labels.
+ * tree-cfg.c (start_recording_case_labels,
+ end_recording_case_labels): Export.
+ (cleanup_tree_cfg_loop, modified_noreturn_calls,
+ cleanup_control_flow, cleanup_control_expr_graph,
+ remove_fallthru_edge, phi_alternatives_equal,
+ tree_forwarder_block_p, has_abnormal_incoming_edge_p,
+ remove_forwarder_block, cleanup_forwarder_blocks,
+ remove_forwarder_block_with_phi, merge_phi_nodes,
+ gate_merge_phi, pass_merge_phi): Move to ...
+ * tree-cfgcleanup.c: ... here.
+
+ * basic-block.h: Remove forward declaration of bb_ann_d.
+
+2005-05-28 Jan Hubicka <jh@suse.cz>
+
+ * tree-ssa-threadupdate.c: (create_edge_and_update_destination_phis):
+ Update profile.
+ * value-prof.c (tree_divmod_fixed_value_transform): Be more verbose in
+ debug output.
+ (tree_mod_subtract): Fix profile updating code.
+ (tree_divmod_values_to_profile): Do not produce useless value profilers
+ for divisions.
+
+2005-05-28 Kazu Hirata <kazu@cs.umass.edu>
+
+ * tree-ssa-dom.c (vrp_element_p): Define.
+ (vrp_hash_elt): Change the type of records to
+ VEC(vrp_element_p,heap).
+ (vrp_free): New.
+ (tree_ssa_dominator_optimize): Pass vrp_free to htab_create.
+ Update uses of VRP records.
+ (simplify_cond_and_lookup_avail_expr, record_range): Update
+ uses of VRP records.
+
+ * tree-inline.c (cfun_stack): Change the type to
+ VEC(function_p,heap).
+ (push_cfun, pop_cfun): Use VEC instead of VARRAY.
+
+2005-05-27 Ian Lance Taylor <ian@airs.com>
+
+ * c-decl.c (add_stmt): Add C frontend specific version.
+ (stmts_are_full_exprs_p): Remove.
+ * c-common.h (STMT_IS_FULL_EXPR_P): Remove.
+ (stmts_are_full_exprs_p): Don't declare.
+ * c-semantics.c (add_stmt): Remove.
+
+2005-05-27 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * config/mips/mips-protos.h (mips_declare_object): Add printf
+ attribute.
+ * config/mips/mips.c (mips_declare_object_name): Fix format
+ argument.
+
+2005-05-27 Roger Sayle <roger@eyesopen.com>
+
+ * reg-stack.c (compensate_edge): Remove original prototype.
+ (propagate_stack): New function to copy the stack layout
+ at the start of a basic block from the layout at the end of
+ one of its predecessors.
+ (compensate_edge): Assume that both source and destination
+ blocks have already had their stack layouts defined.
+ (compensate_edges): Traverse all non-entry edges in the CFG
+ and call compensate_edge on each in turn.
+ (convert_regs_1): Change return type to void. Call
+ propagate_stack instead of compensate_edge.
+ (convert_regs_2): Change return type to void. Update call
+ to convert_regs_1 to ignore the (now void) return value.
+ (convert_regs): Update calls to convert_regs_2 to ignore
+ the (now void) return value. After all the basic blocks have
+ been processed, call compensate_edges to actually emit new
+ insns.
+ (reg_to_stack): Initialize the aux info for each basic block
+ with FOR_EACH_BB instead of which FOR_EACH_BB_REVERSE.
+
+2005-05-28 Jan Hubicka <jh@suse.cz>
+
+ * except.c (can_throw_internal_1, can_throw_external_1): Add
+ "is_resx" argument.
+ (can_throw_external, can_throw_internal): Bring into sync wrt
+ dealing resx.
+ * except.h (can_throw_internal_1, can_throw_external_1): Update
+ prototype.
+ * tree-eh.c (tree_can_throw_internal, tree_can_throw_external):
+ Deal properly with resx.
+
+2005-05-27 Kazu Hirata <kazu@cs.umass.edu>
+
+ * basic-block.h (basic_block_def): Add phi_nodes and
+ predictions. Remove tree_annotations.
+ * predict.c (tree_predicted_by_p, tree_predict_edge,
+ combine_predictions_for_bb): Adjust references to predictions.
+ * tree-cfg.c (init_empty_tree_cfg, create_bb): Don't call
+ create_block_annotation.
+ (create_block_annotation, free_blocks_annotatios,
+ clear_blocks_annotations): Remove.
+ (dump_cfg_stats): Don't print out the memory spent on
+ bb_ann_d.
+ (delete_tree_cfg_annotations): Don't call free_blocks_annotations.
+ * tree-flow-inline.h (bb_ann): Remove.
+ (phi_nodes, set_phi_nodes): Update references to phi_nodes.
+ * tree-flow.h (bb_ann_d): Remove.
+ * tree-if-conv.c (process_phi_nodes): Update a reference to
+ phi_nodes.
+ * tree-phinodes.c (reserve_phi_args_for_new_edge,
+ create_phi_node, remove_phi_node): Likewise.
+ * tree-pretty-print.c (dump_generic_bb_buff): Don't call bb_ann.
+ * tree-ssa-dom.c (threaded_blocks): New.
+ (tree_ssa_dominator_optimize): Initialize, clear, and free
+ threaded_blocks. Update a call to thread_through_all_blocks.
+ (thread_across_edge): Use threaded_blocks instead of setting
+ incoming_edge_threaded.
+ * tree-ssa-threadupdate.c (threaded_through_all_blocks): Take
+ a bitmap of blocks that are threaded through.
+ * tree.h: Move the prototype of threaded_through_blocks to
+ tree-flow.h.
+
+ * domwalk.c (walk_dominator_tree, init_walk_dominator_tree,
+ fini_walk_dominator_tree): Use VEC instead of VARRAY.
+ * domwalk.h (dom_walk_data): Change the type of
+ block_data_stack and free_block_data to VEC(void_p,heap)*.
+ * tree-ssa-dse.c (dse_initialize_block_local_data,
+ dse_optimize_stmt, dse_record_phis, dse_finalize_block): Use
+ VEC instead of VARRAY.
+
+2005-05-27 Jan Hubicka <jh@suse.cz>
+
+ * cgraph.c: Include tree-gimple.h
+ (cgraph_edge): Rename expr to stmt.
+ (cgraph_create_edge): Likewise.
+ (cgraph_clone_node): Likewise.
+ * cgraph.h (cgraph_node): Use call_stmt instead of call_expr.
+ * cgraphunit.c (record_call_1): Rename to ...
+ (record_reference): ... this one; do not build edges.
+ (cgraph_varpool_analyze_pending_decls): Call record_reference directly.
+ (current_basic_block): Kill.
+ (cgraph_create_edges): Rewrite to work on gimple statements nicely.
+ (verify_cgraph_node): Likewise.
+ * tree-inline.c (copy_body_r): Do not mess up with cgraph edges.
+ (copy_bb): Mess up with cgraph edges here; simplify EH handling.
+ (copy_edges_for_bb): Simplify EH handling.
+ (expand_call_inline): Pass statement to cgraph_edge and
+ cgraph_create_edge.
+
+2005-05-27 Richard Guenther <rguenth@gcc.gnu.org>
+
+ * tree-inline.c (copy_body_r): Manually fold *& to deal
+ with ADDR_EXPRs with mismatched types for now.
+
+ * gimplify.c (fold_indirect_ref_rhs): New function.
+ (gimplify_modify_expr_rhs): Use it instead of pessimistic
+ fold_indirect_ref.
+
+ * fold-const.c (fold_indirect_ref_1): Add type argument;
+ make sure the resulting expression is of this type.
+ (build_fold_indirect_ref, fold_indirect_ref): Adjust callers.
+
+2005-05-27 Kazu Hirata <kazu@cs.umass.edu>
+
+ PR tree-optimization/21658
+ * tree-ssa-ccp.c (ccp_fold): Call fold_binary instead of
+ fold_binary_to_constant. Likewise, call fold_unary instead of
+ fold_unary_to_constant.
+
+2005-05-27 Nathan Sidwell <nathan@codesourcery.com>
+
+ * vec.h: Implement integral type vector specialization.
+ (VEC_T): Define a non-GTY structure.
+ (VEC_T_GTY): Define a GTY structure.
+ (VEC_TA): Rename to ...
+ (VEC_TA_GTY): ... here.
+ (DEF_VEC_I, DEF_VEC_ALLOC_I): New.
+ (DEF_VEC_P, DEF_VEC_ALLOC_P): Adjust.
+ (DEF_VEC_FUNC_P, DEF_VEC_ALLOC_FUNC_P): New, broken out of
+ DEF_VEC_P and DEF_VEC_ALLOC_P.
+ (DEF_VEC_O, DEF_VEC_ALLOC_O): Adjust.
+ (DEF_VEC_FUNC_O, DEF_VEC_ALLOC_FUNC_O): New, broken out of
+ DEF_VEC_O and DEF_VEC_ALLOC_O.
+ * global.c: Use DEF_VEC_I, DEF_VEC_ALLOC_I.
+ * lambda-code.c: Likewise.
+ * tree-into-ssa.c: Likewise.
+ * tree-ssa-live.c: Likewise.
+
+2005-05-27 Kazu Hirata <kazu@cs.umass.edu>
+
+ * tree-into-ssa.c (update_ssa): Ensure that the operand cache
+ is up-to-date.
+ * tree-ssa-dom.c (tree_ssa_dominator_optimize): Call
+ update_stmt_if_modified before calling update_ssa.
+
+2005-05-27 Ralf Corsepius <ralf.corsepius@rtems.org>
+
+ * config/rs6000/t-rtems: Remove roe multilib variant.
+
+2005-05-26 Roger Sayle <roger@eyesopen.com>
+
+ PR tree-optimization/9814
+ * ifcvt.c (noce_emit_move_insn): If we fail to recognize the move
+ instruction, add the necessary clobbers by re-expanding the RTL
+ for arithmetic operations via optab.c's expand_unop/expand_binop.
+ (noce_try_bitop): New function to optimize bit manipulation idioms
+ of the form "if (x & C) x = x op C" and "if (!(x & C) x = x op C".
+ (noce_process_if_block): Call noce_try_bitop.
+
+2005-05-26 Roger Sayle <roger@eyesopen.com>
+
+ * reg-stack.c (convert_regs_entry, convert_regs_exit,
+ convert_regs_1, convert_regs_2, convert_regs): Delete prototypes.
+ (reg_to_stack): Move to end of the file. Initialize the per
+ basic block information here, instead of...
+ (convert_regs_entry): Here.
+ (convert_regs): Change unused return type to void.
+
+2005-05-27 Kazu Hirata <kazu@cs.umass.edu>
+
+ * c-pch.c, timevar.c, timevar.h, unwind-compat.c,
+ unwind-dw2-fde-compat.c, unwind-dw2-fde.c, config/mmix/mmix.h,
+ config/rs6000/eabispe.h, config/rs6000/lynx.h,
+ config/sh/elf.h, config/sh/symbian-pre.h,
+ config/sparc/sparc-protos.h: Update copyright.
+
+2005-05-26 Mike Stump <mrs@apple.com>
+
+ * darwin.h (ASM_OUTPUT_LABELREF): Handle quoted non-lazy pointers
+ for Objective-C++.
+
+2005-05-26 Richard Guenther <rguenth@gcc.gnu.org>
+
+ * tree-ssa-forwprop.c (forward_propagate_addr_expr):
+ See through ADDR_EXPR in finding place to propagate into.
+
+2005-05-26 Kazu Hirata <kazu@cs.umass.edu>
+
+ * c-common.c, c-parser.c, cfgbuild.c, cfghooks.c, cfghooks.h,
+ cfgrtl.c, cgraphunit.c, ddg.c, expr.h, gcse.c, ggc-page.c,
+ ggc-zone.c, gimplify.c, ipa-inline.c, longlong.h, targhooks.c,
+ tree-flow-inline.h, tree-pass.h, tree-ssa-dse.c,
+ tree-ssa-loop-im.c, tree-ssa-loop-ivopts.c,
+ tree-ssa-operands.c, tree-vect-analyze.c,
+ tree-vect-transform.c, tree-vectorizer.c, tree.c,
+ config/arm/arm.c, config/bfin/bfin.c, config/frv/frv.c,
+ config/frv/frv.md, config/i386/i386.c, config/i386/sse.md,
+ config/m68hc11/m68hc11.c, config/m68hc11/m68hc11.h,
+ config/mcore/mcore.c, config/mips/mips.c, config/mips/mips.md,
+ config/rs6000/darwin-ldouble.c, config/rs6000/rs6000.c,
+ config/rs6000/rs6000.h, config/sh/sh.c, config/sh/sh.md,
+ config/sh/ushmedia.h, config/sparc/sparc.c,
+ config/sparc/sparc.md, config/stormy16/stormy-abi: Fix comment
+ typos. Follow spelling conventions.
+ * doc/invoke.texi, doc/tm.texi, doc/tree-ssa.texi: Fix typos.
+ Follow spelling conventions.
+
+2005-05-26 David Ung <davidu@mips.com>
+
+ * config/mips/mips.c (mips_use_ins_ext_p): New helper function
+ that determines whether the MIPS32/64 R2 ext/ins should be used.
+ * config/mips/mips.h (ISA_HAS_EXT_INS): New macro.
+ * config/mips/mips.md (extzv): Changed predicate for operand to
+ nonimmediate_operand. Add code to generate insn patterns for
+ extzvsi and extzvdi.
+ (extzv<mode>): New pattern to match mips32/64 r2 ext insn.
+ (insv): Similarly for insertion.
+ (insv<mode>): Similarly.
+
+2005-05-26 Paolo Bonzini <bonzini@gnu.org>
+
+ * simplify-rtx.c (avoid_constant_pool_reference): Support
+ offsetted addresses in the constant pool.
+
+2005-05-26 Paolo Bonzini <bonzini@gnu.org>
+
+ * df.h (DF_SUBREGS, df_local_def_available_p, df_insn_modified_p): New.
+ * df.c (DF_SUBREGS, df_local_def_available_p, df_insn_modified_p): New.
+
+2005-05-26 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/21716
+ * reg-stack.c (swap_rtx_condition): Don't crash if %ax user was not
+ found in the basic block and last insn in the basic block is not
+ INSN_P. Remove explicit unspec numbers that are no longer valid
+ from comments.
+
+2005-05-26 Paolo Bonzini <bonzini@gnu.org>
+
+ * tree-vect-transform.c (vectorizable_operation): Try word_mode
+ vectorization if UNITS_PER_WORD == UNITS_PER_SIMD_WORD, even
+ if a vector mode is available.
+
+2005-05-25 Roger Sayle <roger@eyesopen.com>
+
+ PR middle-end/21709
+ * fold-const.c (const_binop): Check for division by zero during
+ complex division.
+
+2005-05-26 Ian Lance Taylor <ian@airs.com>
+
+ * reload1.c (verify_initial_elim_offsets): Add braces to avoid
+ having a declaration after a statement.
+
+2005-05-26 Richard Sandiford <rsandifo@redhat.com>
+
+ * opt-functions.awk (var_type): New function.
+ (var_set): Use CLVC_STRING if var_type returns "const char *".
+ * opth-gen.awk: Use var_type to find out the types of variables.
+ Don't print comments above each "extern" definition.
+ * optc-gen.awk: Use var_type in the same way.
+ * opts.h (cl_var_cond): Rename to...
+ (cl_var_type): ...this. Add CLVC_STRING.
+ (cl_option): Make "flag_var" a "void *" pointer. Replace "var_cond"
+ with "var_type".
+ * opts.c (handle_option, option_enabled): Update after above name
+ change. Cast flag_var before using it. Handle CLVC_STRING.
+
+ * config/alpha/alpha.h (alpha_tls_size): Delete.
+ * config/alpha/alpha.c (alpha_tls_size, alpha_cpu_string)
+ (alpha_tune_string, alpha_tp_string, alpha_fprm_string)
+ (alpha_fptm_string, alpha_mlat_string): Delete.
+ (alpha_handle_option): Don't set the above variables here. Use the
+ integer argument to check the validity of -mtls-size=.
+ * config/alpha/alpha.opt (mcpu=, mtune=, mfp-rounding-mode=)
+ (mfp-trap-mode=, mtrap-precision=, mmemory-latency=): Add Var()s.
+ (mtls-size=): Likewise. Convert to a UInteger and initialize the
+ variable to 32.
+
+ * config/arc/arc.c (arc_cpu_string, arc_text_string)
+ (arc_data_string, arc_rodata_string): Delete.
+ (arc_handle_option): Don't set the above variables here.
+ * config/arc/arc.opt (mcpu=, mtext=, mdata=, mrodata=): Add Var()s
+ and initialize them.
+
+ * config/arm/arm.c (target_fpu_name, target_fpe_name)
+ (target_float_abi_name, target_abi_name, structure_size_string)
+ (arm_pic_register_string): Delete.
+ (arm_handle_option): Don't set the above variables here, except
+ in the handling of -mhard-float and -msoft-float.
+ * config/arm/arm.opt (mabi=, mfloat-abi=, mfp=, mfpe=, mfpu=)
+ (mpic-register=, mstructure-size-boundary=): Add Var()s.
+
+ * config/avr/avr.c (avr_init_stack, avr_mcu_name, TARGET_HANDLE_OPTION)
+ (avr_handle_option): Delete.
+ * config/avr/avr.opt (mmcu=, minit-stack=): Add Var()s and initialize
+ them.
+
+ * config/bfin/bfin.c (bfin_library_id): Delete.
+ (bfin_handle_option): Don't set it.
+ * config/bfin/bfin.opt (mshared-library-id=): Add Var().
+
+ * config/c4x/c4x.h (c4x_rpts_cycles): Delete.
+ * config/c4x/c4x.c (c4x_rpts_cycles): Delete.
+ (c4x_handle_option): Don't set c4x_rpts_cycles here.
+ * config/c4x/c4x.opt (mrpts=): Add Var().
+
+ * config/cris/aout.h (CRIS_SUBTARGET_HANDLE_OPTION): Don't set
+ cris_elinux_stacksize_str here.
+ * config/cris/aout.opt (melinux-stacksize=): Add Var().
+ * config/cris/cris.h (cris_max_stackframe_str, cris_cpu_str)
+ (cris_tune_str, cris_elinux_stacksize_str): Delete.
+ * config/cris/cris.c (cris_max_stackframe_str, cris_cpu_str)
+ (cris_tune_str, cris_elinux_stacksize_str): Delete.
+ (cris_handle_option): Don't set the above variables here.
+ * config/cris/cris.opt (mcpu=, march=, mtune=, mmax-stackframe=)
+ (max-stackframe=): Add Var()s.
+
+ * config/i386/i386.h (ix86_tune_string, ix86_arch_string): Delete.
+ * config/i386/i386.c (ix86_cmodel_string, ix86_asm_string)
+ (ix86_tls_dialect_string, ix86_tune_string, ix86_arch_string)
+ (ix86_fpmath_string, ix86_regparm_string, ix86_align_loops_string)
+ (ix86_align_jumps_string, ix86_preferred_stack_boundary_string)
+ (ix86_branch_cost_string, ix86_align_funcs_string): Delete.
+ (ix86_handle_option): Don't set the above variables here.
+ * config/i386/i386.opt (malign-functions=, malign-jumps=)
+ (malign-loops=, march=, masm=, mbranch-cost=, mcmodel=, mfpmath=)
+ (mpreferred-stack-boundary=, mregparm=, mtls-dialect=, mtune=): Add
+ Var()s.
+
+ * config/ia64/ia64.h (ia64_tls_size): Delete.
+ * config/ia64/ia64.c (ia64_tls_size): Delete.
+ (ia64_handle_option): Treat -mtls-size= as a UInteger option,
+ reading the integer argument from the "value" parameter. Don't
+ set ia64_tls_size here.
+ * config/ia64/ia64.opt (mtls-size=): Turn into a UInteger option.
+ Add Var() and Init().
+
+ * config/m32r/m32r.h (m32r_cache_flush_func): Delete.
+ (m32r_cache_flush_trap): Delete.
+ * config/m32r/m32r.c (m32r_cache_flush_func): Delete.
+ (m32r_cache_flush_trap): Delete.
+ (m32r_handle_option): Don't set the above variables when handling
+ -mflush-func= and -mflush-trap=.
+ * config/m32r/m32r.opt (-mflush-func=, -mflush-trap=): Add Var()s
+ and Init()s.
+
+ * config/mips/mips.h (mips_cache_flush_func): Delete.
+ * config/mips/mips.c (mips_arch_string, mips_tune_string)
+ (mips_cache_flush_func): Delete.
+ (mips_handle_option): Don't set the above variables when handling
+ -march=, -mtune= and -mflush-func=.
+ * config/mips/mips.opt (march=, mflush-func=, mtune=): Add Var()s.
+
+ * config/s390/s390.c (s390_arch_string): Delete.
+ (s390_handle_option): Don't set it here.
+ * config/s390/s390.opt (march=): Add Var().
+
+ * config/sparc/sparc.h (sparc_cmodel_string): Delete.
+ * config/sparc/sparc.c (sparc_cmodel_string): Delete.
+ (sparc_handle_option): Don't set it here.
+ * config/sparc/sparc.opt (mcmodel=): Add Var().
+
+2005-05-25 Roger Sayle <roger@eyesopen.com>
+
+ * convert.c (convert_to_integer) <POINTER_TYPE>: Avoid recursive
+ call to convert_to_integer by building the NOP_EXPR directly.
+
+2005-05-25 Richard Sandiford <rsandifo@redhat.com>
+
+ * config/rs6000/rs6000.opt (mprioritize-restricted-insns=): Fix typo.
+
+2005-05-25 Daniel Berlin <dberlin@dberlin.org>
+ Jeff Law <law@redhat.com>
+
+ * tree-cfg.c (verify_expr, case ADDR_EXPR): Verify invariant,
+ constant and side_effects of the ADDR_EXPR are consistent.
+
+ * tree-nested.c (convert_local_reference): Set CURRENT_FUNCTION_DECL
+ appropriately around calls to recompute_tree_invarant_for_addr_expr.
+
+2005-05-25 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * config/s390/s390.c (GP_ARG_NUM_REG, FP_ARG_NUM_REG): New defines.
+ (s390_function_arg, s390_gimplify_va_arg): Use them.
+ (s390_register_info): Save only required subset of argument
+ registers into save area for va_list.
+ (s390_va_start): Initialize only required elements of va_list struct.
+ (s390_build_builtin_va_list): Set va_list_[gf]pr_counter_field.
+
+2005-05-25 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * reload1.c (verify_initial_elim_offsets): Return boolean status
+ instead of aborting.
+ (reload): Adapt verify_initial_elim_offsets call site. Restart
+ main loop if some initial elimination offsets changed.
+
+2005-05-25 Adam Nemet <anemet@lnxw.com>
+
+ * config/rs6000/lynx.h (CC1_SPEC): Use -maix-struct-return instead
+ of -mno-svr4-struct-return.
+
+2005-05-25 Daniel Berlin <dberlin@dberlin.org>
+
+ Fix PR tree-optimization/21705
+
+ * tree-ssa-pre.c (in_fre): New static variable.
+ (create_value_expr_from): Recursively value number reference ops
+ in argument lists.
+ (can_value_number_call): Temporary restrict only exists for
+ PRE, not FRE.
+
+2005-05-25 Kazu Hirata <kazu@cs.umass.edu>
+
+ * tree-into-ssa.c (rewrite_into_ssa, update_ssa): Replace
+ sizeof (bitmap *) with sizeof (bitmap).
+
+2005-05-25 Daniel Berlin <dberlin@dberlin.org>
+
+ * lambda-code.c (perfect_nestify): Call update_stmt on the exit
+ condition.
+
+2005-05-25 Adrian Straetling <straetling@de.ibm.com>
+
+ * config/s390/s390.c (TARGET_INSN_VALID_WITHIN_DOLOOP): Set to
+ hook_bool_rtx_true.
+
+2005-05-25 Jan Hubicka <jh@suse.cz>
+
+ * Makefile.in (ipa-inline.o): Add COEVERAGE_H dependency.
+ * cgraph.c (cgraph_create_node): Reset estimated_growth.
+ * cgraph.h (cgraph_global_info): Add estimated_growth.
+ * ipa-inline.c: Include coverage.h
+ (max_insns, max_count): New static variables.
+ (cgraph_estimate_size_after_inlining): Cache the result.
+ (cgraph_estimate_growth):
+ * passes.c (rest_of_clean_state): Kill coverage_end_function.
+ * timevar.def (TV_INLINE_HEURISTICS): New timevar.
+ * tree-optimize.c (init_tree_optimization_passes): Move profiling before
+ inlining.
+ (ipa_passes): Initialize bitmaps.
+
+2005-05-25 Adrian Straetling <straetling@de.ibm.com>
+
+ * loop-doloop.c: Include "target.h".
+ (doloop_valid_p): Move tests to function in targhooks.c.
+ * target.h (struct gcc_target): New target hook
+ "insn_valid_within_doloop".
+ * target-def.h: Define default value for "insn_valid_within_doloop".
+ (TARGET_INITIALIZER): Insert new target hook into initializer.
+ * targhooks.c (default_insn_valid_within_doloop): New function.
+ * targhooks.h (default_insn_valid_within_doloop): Declare.
+ * hooks.c (hook_bool_rtx_true): New function.
+ * hooks.h (hook_bool_rtx_true): Declare.
+ * doc/tm.texi: Add documentation for new target hook.
+
+2005-05-25 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ PR target/21412
+ * config/sparc/sparc.h (SPARC_SYMBOL_REF_TLS_P): New macro
+ * config/sparc/sparc-protos.h (tls_symbolic_operand): Delete.
+ (sparc_tls_referenced_p): New prototype.
+ * config/sparc/sparc.c (tls_symbolic_operand): Delete.
+ (sparc_expand_move): Look for TLS addresses with constant offsets.
+ (legitimate_constant_p): Use SPARC_SYMBOL_REF_TLS_P instead of
+ tls_symbolic_operand.
+ (legitimate_pic_operand_p): Likewise.
+ (legitimate_address_p): Likewise.
+ (legitimize_address): Likewise.
+ (sparc_tls_symbol_ref_1): New function.
+ (sparc_tls_referenced_p): New function.
+ * config/sparc/predicates.md (tgd_symbolic_operand): Use
+ SYMBOL_REF_TLS_MODEL instead of tls_symbolic_operand.
+ (tld_symbolic_operand): Likewise.
+ (tie_symbolic_operand): Likewise.
+ (tle_symbolic_operand): Likewise.
+
+2005-05-24 DJ Delorie <dj@redhat.com>
+
+ * common.opt (-Wattributes): New. Default true.
+ * doc/invoke.texi (-Wno-attributes): Document.
+
+ * attribs.c (decl_attributes): Move warning control from if() to
+ warning(OPT_*).
+ * c-common.c (handle_packed_attribute): Likewise.
+ (handle_nocommon_attribute): Likewise.
+ (handle_common_attribute): Likewise.
+ (handle_noreturn_attribute): Likewise.
+ (handle_noinline_attribute): Likewise.
+ (handle_always_inline_attribute): Likewise.
+ (handle_used_attribute): Likewise.
+ (handle_unused_attribute): Likewise.
+ (handle_const_attribute): Likewise.
+ (handle_transparent_union_attribute): Likewise.
+ (handle_constructor_attribute): Likewise.
+ (handle_destructor_attribute): Likewise.
+ (handle_mode_attribute): Likewise.
+ (handle_alias_attribute): Likewise.
+ (handle_visibility_attribute): Likewise.
+ (handle_tls_model_attribute): Likewise.
+ (handle_malloc_attribute): Likewise.
+ (handle_returns_twice_attribute): Likewise.
+ (handle_pure_attribute): Likewise.
+ (handle_deprecated_attribute): Likewise.
+ (handle_vector_size_attribute): Likewise.
+ (handle_nothrow_attribute): Likewise.
+ (handle_cleanup_attribute): Likewise.
+ (handle_warn_unused_result_attribute): Likewise.
+ (handle_sentinel_attribute): Likewise.
+ * c-decl.c (diagnose_mismatched_decls): Likewise.
+ (start_decl): Likewise.
+ (grokdeclarator): Likewise.
+ (start_function): Likewise.
+ * c-format.c (check_function_format): Likewise.
+ * stor-layout.c (place_field): Likewise.
+ (finalize_record_size): Likewise.
+ * tree.c (handle_dll_attribute)): Likewise.
+ * varasm.c (default_assemble_visibility): Likewise.
+ * config/darwin.c (darwin_handle_weak_import_attribute): Likewise.
+ (darwin_assemble_visibility): Likewise.
+ * config/arc/arc.c (arc_handle_interrupt_attribute): Likewise.
+ * config/arm/arm.c (arm_handle_fndecl_attribute): Likewise.
+ (arm_handle_isr_attribute): Likewise.
+ * config/avr/avr.c (avr_handle_progmem_attribute): Likewise.
+ (avr_handle_fndecl_attribute): Likewise.
+ * config/bfin/bfin.c (handle_int_attribute): Likewise.
+ * config/c4x/c4x.c (c4x_handle_fntype_attribute): Likewise.
+ * config/h8300/h8300.c (h8300_handle_fndecl_attribute): Likewise.
+ (h8300_handle_eightbit_data_attribute): Likewise.
+ (h8300_handle_tiny_data_attribute): Likewise.
+ * config/i386/i386.c (ix86_handle_cdecl_attribute): Likewise.
+ (ix86_handle_regparm_attribute): Likewise.
+ (ix86_handle_struct_attribute): Likewise.
+ * config/i386/winnt.c (ix86_handle_shared_attribute): Likewise.
+ (i386_pe_encode_section_info): Likewise.
+ * config/ia64/ia64.c (ia64_handle_model_attribute): Likewise.
+ * config/ip2k/ip2k.c (ip2k_handle_progmem_attribute): Likewise.
+ (ip2k_handle_fndecl_attribute): Likewise.
+ * config/m32r/m32r.c (m32r_handle_model_attribute): Likewise.
+ * config/m68hc11/m68hc11 (m68hc11_handle_page0_attribute): Likewise.
+ (m68hc11_handle_fntype_attribute): Likewise.
+ (m68hc11_encode_section_info): Likewise.
+ * config/m68k/m68k.c (m68k_handle_fndecl_attribute): Likewise.
+ * config/mcore/mcore.c (mcore_handle_naked_attribute): Likewise.
+ * config/ns32k/ns32k.c (ns32k_handle_fntype_attribute): Likewise.
+ * config/rs6000/rs6000.c (rs6000_handle_longcall_attribute): Likewise.
+ * config/sh/sh.c (sh_handle_interrupt_handler_attribute): Likewise.
+ (sh_handle_sp_switch_attribute): Likewise.
+ (sh_handle_trap_exit_attribute): Likewise.
+ * config/sh/symbian.c (sh_symbian_dllimport_p): Likewise.
+ (sh_symbian_handle_dll_attribute): Likewise.
+ * config/stormy16/stormy16.c (xstormy16_handle_interrupt_attribute): Likewise.
+ (xstormy16_handle_below100_attribute): Likewise.
+ * config/v850/v850.c (v850_handle_interrupt_attribute): Likewise.
+
+ * c-common.c (unsigned_conversion_warning): Move warning control
+ from if() to warning(OPT_*).
+ (c_common_truthvalue_conversion): Likewise.
+ (c_do_switch_warnings): Likewise.
+ * c-decl.c (diagnose_mismatched_decls): Likewise.
+ (diagnose_mismatched_decls): Likewise.
+ (define_label): Likewise.
+ (grokdeclarator): Likewise.
+ * c-format.c (check_format_info): Likewise.
+ * c-lex.c (interpret_integer): Likwise.
+ (lex_string): Likewise.
+ * c-opts.c (c_common_post_options): Likewise.
+ * c-parser.c (c_parser_unary_expression): Likewise.
+ * c-pragma.c (handle_pragma_redefine_extname): Likewise.
+ (handle_pragma_extern_prefix): Likewise.
+ * c-typeck.c (build_binary_op): Likewise.
+ * gcse.c (is_too_expensive): Likewise.
+ * opts.c (decode_options): Likewise.
+ * stor-layout.c (place_field): Likewise.
+ * tree-cfg.c (remove_bb): Likewise.
+
+ * c.opt (-Wreturn-type): Add Var(warn_return_type).
+ * flags.h (warn_return_type): Remove.
+ * toplev.c (warn_return_type): Likewise.
+
+2005-05-24 Kelley Cook <kcook@gcc.gnu.org>
+
+ * configure.ac: Don't use gcc_AC_C_LONG_LONG. Check for
+ existence of long long and __int64 before determining their size.
+ * aclocal.m4: Delete gcc_AC_C_LONG_LONG.
+ * configure, config.h.in: Regenerate.
+
+2005-05-24 Kelley Cook <kcook@gcc.gnu.org>
+
+ * configure: Regenerate.
+
+2005-05-24 Ziemowit Laski <zlaski@apple.com>
+
+ * c-common.h (objc_comptypes): Remove prototype.
+ (objc_compare_types): New prototype.
+ (objc_volatilized_decl): Likewise.
+ (objc_type_quals_match): Likewise.
+ * c-decl.c (objc_mark_locals_volatile): Streamline by calling
+ objc_volatilize_decl().
+ * c-typeck.c (comp_target_types): Remove third parameter; do
+ not call objc_comptypes().
+ (comptypes): Remove calls to objc_comptypes().
+ (build_function_call): Extend compatible prototype check to ObjC.
+ (build_conditional_expr): Adjust call to comp_target_types().
+ (convert_for_assignment): Call objc_compare_types() instead of
+ objc_comptypes(); adjust calls to comp_target_types(); call
+ objc_type_quals_match() before issuing qualifier mismatch
+ warnings.
+ (build_binary_op): Call objc_compare_types() before issuing
+ pointer mismatch warnings; adjust calls to
+ comp_target_types().
+ * stub-objc.c (objc_comptypes): Remove stub.
+ (objc_compare_types): New stub.
+ (objc_volatilized_decl): Likewise.
+ (objc_type_quals_match): Likewise.
+
+2005-05-24 Paolo Carlini <pcarlini@suse.de>
+
+ * config/ia64/ia64intrin.h: Define nothing for C++:
+ overloaded builtins have been ported to C++.
+
+2005-05-24 Jeff Law <law@redhat.com>
+
+ * tree-nested.c (build_addr): New "context" argument. Temporarily
+ set current_function_decl around the call to build the ADDR_EXPR.
+ (get_static_chain): Pass proper context to build_addr.
+ (convert_nl_goto_reference): Likewise.
+ (convert_tramp_reference): Likewise.
+ (final_nesting_tree_1): Likewise.
+ * tree-profile.c (tree_gen_interval_profiler): Likewise.
+ (tree_gen_pow2_profiler): Likewise.
+ (tree_gen_one_value_profiler): Likewise.
+ * tree-ssa-loop-ivopts.c (build_addr_strip_iref): Likewise.
+ * tree.h (build_addr): Update prototype.
+
+2005-05-24 Kazu Hirata <kazu@cs.umass.edu>
+
+ * tree-flow.h (bb_ann_d): Remove has_escape_site.
+ * tree-ssa-alias.c (compute_points_to_addr_escape): Don't
+ write to has_escape_site.
+
+2005-05-24 Jeff Law <law@redhat.com>
+
+ * Makefile.in (tree-cfg.o): Depend on tree-ssa-propagate.h.
+ * tree-cfg.c: Include tree-ssa-propagate.h.
+ (replace_uses_by): Call recompute_tree_invarant_for_addr_expr as
+ needed.
+
+2005-05-24 Nick Clifton <nickc@redhat.com>
+
+ * config/rs6000/rs6000-c.c (rs6000_cpu_cpp_builtins): Define
+ __NO_FPRS__ when 'f' class registers will not be available.
+
+2005-05-24 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
+
+ * config/m32r/m32r.c (m32r_expand_block_move): Return 0 if
+ nothing was done.
+ * config/m32r/m32r.md (movmemsi): If m32r_expand_block_move did
+ nothing then FAIL.
+ * config/m32r/m32r/m32r-protos.h (m32r_expand_block_move): Update
+ prototype.
+
+2005-05-23 Jeff Law <law@redhat.com>
+
+ * tree-ssa-dom.c (cprop_into_stmt): Do not call
+ recompute_tree_invariant_for_addr_expr here.
+ (optimize_stmt): Call it here instead and do so if anything
+ at all has changed in the statement and the RHS is an ADDR_EXPR.
+ * tree-ssa-forwprop.c (tidy_after_forward_propagate_addr): If
+ needed, call recompute_tree_invariant_for_addr_expr.
+ * tree-ssa-propagate.c (substitute_and_fold): Call
+ recompute_tree_invariant_for_addr_expr as needed.
+
+2005-05-23 Andreas Krebbel <krebbel1@de.ibm.com>
+
+ * config/s390/s390.c (s390_optimize_prologue): Don't replace an insn
+ saving less registers than the replacement.
+
+2005-05-23 Jan Hubicka <jh@suse.cz>
+
+ * tree-flow.h (stmt_ann_d): Kill GTY ((skip)) mark on BB.
+
+2005-05-23 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ * config/sparc/sparc-protos.h (sparc_expand_move): New prototype.
+ * config/sparc/sparc.c (sparc_expand_move): New function.
+ (sparc_emit_set_const64): Rewrite assert condition on entry.
+ (legitimate_constant_p) <CONST_VECTOR>: New case.
+ (legitimize_pic_address): Use TARGET_ARCH64 to select the mode.
+ * config/sparc/sparc.md (movqi, movhi, movsi, movdi, movV32,
+ movV64, movtf): Use nonimmediate_operand for the first operand.
+ Rewrite. Only invoke sparc_expand_move.
+ * config/sparc/predicates.md (input_operand): Reorder tests.
+
+2005-05-23 Jan Beulich <jbeulich@novell.com>
+
+ * gthr-posix.h (__gthread_recursive_mutex_init_function): Add
+ missing return statement.
+
+2005-05-22 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ * config/sparc/sparc.c (sparc_emit_float_lib_cmp): Use
+ emit_move_insn for moves to TFmode stack slots.
+
+2005-05-21 Richard Guenther <rguenth@gcc.gnu.org>
+
+ * tree-stdarg.c (execute_optimize_stdarg): Handle references
+ to va_list of the form &va[0].
+
+2005-05-20 Jan Hubicka <jh@suse.cz>
+
+ * Makefile.in (insn-emit.o): Add basic-block.h dependency.
+ * genemit.c (main): Make insn-emit to include basic-block.h too.
+
+2005-05-20 Jan Hubicka <jh@suse.cz>
+
+ * cgraphunit.c (cgraph_expand_function): Force function being lowered.
+
+2005-05-19 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/alpha.c (emit_unlikely_jump, emit_load_locked,
+ emit_store_conditional): Split out from ...
+ (alpha_split_atomic_op): ... here.
+ (alpha_split_compare_and_swap): New; extract from .md file.
+ (alpha_split_lock_test_and_set): Likewise.
+ * config/alpha/alpha-protos.h: Update.
+ * config/alpha/sync.md (sync_compare_and_swap<I48MODE>): Move
+ split code into alpha.c.
+ (sync_lock_test_and_set<I48MODE>): Likewise.
+
+2005-05-19 Richard Henderson <rth@redhat.com>
+
+ * unwind.h, unwind-pe.h: Revert gcc_unreachable change of 05-17.
+
2005-05-19 Richard Henderson <rth@redhat.com>
* config/i386/sse.md (mulv4si3): Use all register inputs.
@@ -284,7 +3317,8 @@
* tree-cfg.c (replace_uses_by): Export.
* tree-flow.h (replace_uses_by): Declare.
-2005-05-17 Mike Stump <mrs@apple.com>
+2005-05-17 Ziemowit Laski <zlaski@apple.com>
+ Mike Stump <mrs@apple.com>
Yet more Objective-C++...
@@ -552,6 +3586,10 @@
2005-05-17 Paolo Bonzini <bonzini@gnu.org>
+ * tree-ssa-math-opts.c: New file.
+
+2005-05-17 Paolo Bonzini <bonzini@gnu.org>
+
* Makefile.in: Add tree-ssa-math-opts.c.
* expr.c (expand_expr_real_1) <case RDIV_EXPR>: Never emit as a*(1/b).
* fold-const.c (distribute_real_division): New.
diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP
index dbecfd42d81..91637d623e0 100644
--- a/gcc/DATESTAMP
+++ b/gcc/DATESTAMP
@@ -1 +1 @@
-20050520
+20050615
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index b53e593446c..fea708a51e4 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -684,7 +684,7 @@ CONFIG_H = config.h $(host_xm_file_list)
TCONFIG_H = tconfig.h $(xm_file_list)
TM_P_H = tm_p.h $(tm_p_file_list)
GTM_H = tm.h $(tm_file_list)
-TM_H = $(GTM_H) insn-constants.h insn-flags.h
+TM_H = $(GTM_H) insn-constants.h insn-flags.h options.h
# Variables for version information.
BASEVER := $(srcdir)/BASE-VER # 4.x.y
@@ -925,16 +925,18 @@ C_OBJS = c-lang.o stub-objc.o $(C_AND_OBJC_OBJS)
OBJS-common = \
tree-chrec.o tree-scalar-evolution.o tree-data-ref.o \
tree-cfg.o tree-dfa.o tree-eh.o tree-ssa.o tree-optimize.o tree-gimple.o \
- gimplify.o tree-pretty-print.o tree-into-ssa.o \
+ gimplify.o tree-pretty-print.o tree-into-ssa.o \
tree-outof-ssa.o tree-ssa-ccp.o tree-vn.o tree-ssa-uncprop.o \
- tree-ssa-dce.o tree-ssa-copy.o tree-nrv.o tree-ssa-copyrename.o \
+ tree-ssa-dce.o tree-ssa-copy.o tree-nrv.o tree-ssa-copyrename.o \
tree-ssa-pre.o tree-ssa-live.o tree-ssa-operands.o tree-ssa-alias.o \
tree-ssa-phiopt.o tree-ssa-forwprop.o tree-nested.o tree-ssa-dse.o \
tree-ssa-dom.o domwalk.o tree-tailcall.o gimple-low.o tree-iterator.o \
- tree-phinodes.o tree-ssanames.o tree-sra.o tree-complex.o tree-ssa-loop.o \
- tree-ssa-loop-niter.o tree-ssa-loop-manip.o tree-ssa-threadupdate.o \
+ tree-phinodes.o tree-ssanames.o tree-sra.o tree-complex.o \
+ tree-vect-generic.o tree-ssa-loop.o tree-ssa-loop-niter.o \
+ tree-ssa-loop-manip.o tree-ssa-threadupdate.o \
tree-vectorizer.o tree-vect-analyze.o tree-vect-transform.o \
- tree-ssa-loop-ivcanon.o tree-ssa-propagate.o tree-ssa-math-opts.o \
+ tree-ssa-loop-ivcanon.o tree-ssa-propagate.o tree-ssa-address.o \
+ tree-ssa-math-opts.o \
tree-ssa-loop-ivopts.o tree-if-conv.o tree-ssa-loop-unswitch.o \
alias.o bb-reorder.o bitmap.o builtins.o caller-save.o calls.o \
cfg.o cfganal.o cfgbuild.o cfgcleanup.o cfglayout.o cfgloop.o \
@@ -948,7 +950,7 @@ OBJS-common = \
haifa-sched.o hooks.o ifcvt.o insn-attrtab.o insn-emit.o insn-modes.o \
insn-extract.o insn-opinit.o insn-output.o insn-peep.o insn-recog.o \
integrate.o intl.o jump.o langhooks.o lcm.o lists.o local-alloc.o \
- loop.o modulo-sched.o optabs.o options.o opts.o \
+ loop.o mode-switching.o modulo-sched.o optabs.o options.o opts.o \
params.o postreload.o postreload-gcse.o predict.o \
insn-preds.o pointer-set.o postreload.o \
print-rtl.o print-tree.o profile.o value-prof.o var-tracking.o \
@@ -960,8 +962,11 @@ OBJS-common = \
varasm.o varray.o vec.o version.o vmsdbgout.o xcoffout.o alloc-pool.o \
et-forest.o cfghooks.o bt-load.o pretty-print.o $(GGC) web.o passes.o \
rtl-profile.o tree-profile.o rtlhooks.o cfgexpand.o lambda-mat.o \
+ lambda-trans.o lambda-code.o tree-loop-linear.o tree-ssa-sink.o \
lambda-trans.o lambda-code.o tree-loop-linear.o tree-ssa-sink.o \
- tree-vrp.o tree-stdarg.o
+ tree-vrp.o tree-stdarg.o tree-cfgcleanup.o tree-ssa-reassoc.o \
+ tree-ssa-structalias.o
+
OBJS-md = $(out_object_file)
OBJS-archive = $(EXTRA_OBJS) $(host_hook_obj) tree-inline.o \
@@ -1658,34 +1663,37 @@ stor-layout.o : stor-layout.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(TREE_H) $(PARAMS_H) $(FLAGS_H) function.h $(EXPR_H) $(RTL_H) \
$(GGC_H) $(TM_P_H) $(TARGET_H) langhooks.h $(REGS_H) gt-stor-layout.h \
toplev.h
+tree-ssa-structalias.o: tree-ssa-structalias.c tree-ssa-structalias.h \
+ $(SYSTEM_H) $(CONFIG_H) $(GGC_H) $(TREE_H) $(TREE_FLOW_H) \
+ $(TM_H) coretypes.h cgraph.h tree-pass.h $(TIMEVAR_H)
tree-ssa.o : tree-ssa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) output.h $(DIAGNOSTIC_H) \
- errors.h toplev.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h \
+ toplev.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h \
$(TREE_DUMP_H) langhooks.h tree-pass.h $(BASIC_BLOCK_H) bitmap.h \
$(FLAGS_H) $(GGC_H) hard-reg-set.h $(HASHTAB_H) pointer-set.h \
$(TREE_GIMPLE_H) tree-inline.h $(VARRAY_H)
tree-into-ssa.o : tree-into-ssa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) output.h $(DIAGNOSTIC_H) \
- errors.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
+ function.h $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
langhooks.h domwalk.h tree-pass.h $(GGC_H) $(PARAMS_H) $(BASIC_BLOCK_H) \
bitmap.h $(CFGLOOP_H) $(FLAGS_H) hard-reg-set.h $(HASHTAB_H) \
$(TREE_GIMPLE_H) tree-inline.h $(VARRAY_H)
tree-outof-ssa.o : tree-outof-ssa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) output.h $(DIAGNOSTIC_H) \
- errors.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
+ function.h $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
langhooks.h tree-pass.h $(TREE_SSA_LIVE_H) $(BASIC_BLOCK_H) bitmap.h \
$(FLAGS_H) $(GGC_H) hard-reg-set.h $(HASHTAB_H) $(TREE_GIMPLE_H) \
- tree-inline.h $(VARRAY_H)
+ tree-inline.h $(VARRAY_H) toplev.h
tree-ssa-dse.o : tree-ssa-dse.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
- $(TM_H) errors.h $(GGC_H) $(TREE_H) $(RTL_H) $(TM_P_H) $(BASIC_BLOCK_H) \
+ $(TM_H) $(GGC_H) $(TREE_H) $(RTL_H) $(TM_P_H) $(BASIC_BLOCK_H) \
$(TREE_FLOW_H) tree-pass.h $(TREE_DUMP_H) domwalk.h $(FLAGS_H) \
$(DIAGNOSTIC_H) $(TIMEVAR_H)
tree-ssa-forwprop.o : tree-ssa-forwprop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
- $(TM_H) errors.h $(GGC_H) $(TREE_H) $(RTL_H) $(TM_P_H) $(BASIC_BLOCK_H) \
+ $(TM_H) $(GGC_H) $(TREE_H) $(RTL_H) $(TM_P_H) $(BASIC_BLOCK_H) \
$(TREE_FLOW_H) tree-pass.h $(TREE_DUMP_H) $(DIAGNOSTIC_H) $(TIMEVAR_H) \
langhooks.h
tree-ssa-phiopt.o : tree-ssa-phiopt.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
- $(TM_H) errors.h $(GGC_H) $(TREE_H) $(RTL_H) $(TM_P_H) $(BASIC_BLOCK_H) \
+ $(TM_H) $(GGC_H) $(TREE_H) $(RTL_H) $(TM_P_H) $(BASIC_BLOCK_H) \
$(TREE_FLOW_H) tree-pass.h $(TREE_DUMP_H) langhooks.h $(FLAGS_H) \
$(DIAGNOSTIC_H) $(TIMEVAR_H)
tree-nrv.o : tree-nrv.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
@@ -1694,26 +1702,26 @@ tree-nrv.o : tree-nrv.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
langhooks.h
tree-ssa-copy.o : tree-ssa-copy.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h $(DIAGNOSTIC_H) \
- errors.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
+ function.h $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
$(BASIC_BLOCK_H) tree-pass.h langhooks.h tree-ssa-propagate.h $(FLAGS_H)
tree-ssa-propagate.o : tree-ssa-propagate.c $(TREE_FLOW_H) $(CONFIG_H) \
$(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h \
- $(DIAGNOSTIC_H) errors.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h \
+ $(DIAGNOSTIC_H) function.h $(TIMEVAR_H) $(TM_H) coretypes.h \
$(TREE_DUMP_H) $(BASIC_BLOCK_H) tree-pass.h langhooks.h \
tree-ssa-propagate.h vec.h gt-tree-ssa-propagate.h $(FLAGS_H) $(VARRAY_H)
tree-ssa-dom.o : tree-ssa-dom.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h $(DIAGNOSTIC_H) \
- errors.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
+ function.h $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
$(BASIC_BLOCK_H) domwalk.h real.h tree-pass.h $(FLAGS_H) langhooks.h \
tree-ssa-propagate.h $(CFGLOOP_H)
tree-ssa-uncprop.o : tree-ssa-uncprop.c $(TREE_FLOW_H) $(CONFIG_H) \
$(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h \
- $(DIAGNOSTIC_H) errors.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h \
+ $(DIAGNOSTIC_H) function.h $(TIMEVAR_H) $(TM_H) coretypes.h \
$(TREE_DUMP_H) $(BASIC_BLOCK_H) domwalk.h real.h tree-pass.h $(FLAGS_H) \
langhooks.h tree-ssa-propagate.h
tree-ssa-threadupdate.o : tree-ssa-threadupdate.c $(TREE_FLOW_H) $(CONFIG_H) \
$(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h \
- $(DIAGNOSTIC_H) errors.h function.h $(TM_H) coretypes.h $(TREE_DUMP_H) \
+ $(DIAGNOSTIC_H) function.h $(TM_H) coretypes.h $(TREE_DUMP_H) \
$(BASIC_BLOCK_H) $(FLAGS_H) tree-pass.h $(CFGLOOP_H)
tree-ssanames.o : tree-ssanames.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(TREE_H) $(VARRAY_H) $(GGC_H) gt-tree-ssanames.h $(TREE_FLOW_H)
@@ -1723,20 +1731,20 @@ tree-phinodes.o : tree-phinodes.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
domwalk.o : domwalk.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(TREE_H) $(BASIC_BLOCK_H) $(TREE_FLOW_H) domwalk.h $(GGC_H)
tree-ssa-live.o : tree-ssa-live.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
- $(TREE_H) $(DIAGNOSTIC_H) errors.h function.h $(TIMEVAR_H) \
+ $(TREE_H) $(DIAGNOSTIC_H) function.h $(TIMEVAR_H) \
$(TM_H) coretypes.h $(TREE_DUMP_H) $(TREE_SSA_LIVE_H) $(BASIC_BLOCK_H) \
bitmap.h $(FLAGS_H) $(HASHTAB_H) $(TREE_GIMPLE_H) tree-inline.h \
- $(VARRAY_H)
+ $(VARRAY_H) toplev.h
tree-ssa-copyrename.o : tree-ssa-copyrename.c $(TREE_FLOW_H) $(CONFIG_H) \
$(SYSTEM_H) $(TREE_H) $(DIAGNOSTIC_H) function.h $(TIMEVAR_H) tree-pass.h \
$(TM_H) coretypes.h $(TREE_DUMP_H) $(TREE_SSA_LIVE_H) $(BASIC_BLOCK_H) \
bitmap.h $(FLAGS_H) $(HASHTAB_H) langhooks.h $(TREE_GIMPLE_H) \
tree-inline.h
tree-ssa-pre.o : tree-ssa-pre.c $(TREE_FLOW_H) $(CONFIG_H) \
- $(SYSTEM_H) $(TREE_H) $(GGC_H) $(DIAGNOSTIC_H) errors.h $(TIMEVAR_H) \
+ $(SYSTEM_H) $(TREE_H) $(GGC_H) $(DIAGNOSTIC_H) $(TIMEVAR_H) \
$(TM_H) coretypes.h $(TREE_DUMP_H) tree-pass.h $(FLAGS_H) $(CFGLOOP_H) \
- alloc-pool.h $(BASIC_BLOCK_H) bitmap.h $(FIBHEAP_H) $(HASHTAB_H) \
- langhooks.h real.h $(TREE_GIMPLE_H) tree-inline.h tree-iterator.h
+ alloc-pool.h $(BASIC_BLOCK_H) bitmap.h $(HASHTAB_H) $(TREE_GIMPLE_H) \
+ tree-inline.h tree-iterator.h
tree-vn.o : tree-vn.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(GGC_H) \
$(TREE_H) $(TREE_FLOW_H) $(HASHTAB_H) langhooks.h tree-pass.h \
$(TREE_DUMP_H) $(DIAGNOSTIC_H)
@@ -1746,15 +1754,22 @@ tree-vrp.o : tree-vrp.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
$(CFGLOOP_H) $(SCEV_H) tree-chrec.h $(TIMEVAR_H)
tree-cfg.o : tree-cfg.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) $(FLAGS_H) output.h \
+ $(DIAGNOSTIC_H) function.h $(TIMEVAR_H) $(TM_H) coretypes.h \
+ $(TREE_DUMP_H) except.h langhooks.h $(CFGLOOP_H) tree-pass.h \
+ $(CFGLAYOUT_H) $(BASIC_BLOCK_H) hard-reg-set.h $(HASHTAB_H) toplev.h \
+ tree-ssa-propagate.h
+tree-cfgcleanup.o : tree-cfg.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
+ $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) $(FLAGS_H) output.h \
$(DIAGNOSTIC_H) errors.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h \
$(TREE_DUMP_H) except.h langhooks.h $(CFGLOOP_H) tree-pass.h \
- $(CFGLAYOUT_H) $(BASIC_BLOCK_H) hard-reg-set.h $(HASHTAB_H) toplev.h
+ $(CFGLAYOUT_H) $(BASIC_BLOCK_H) hard-reg-set.h $(HASHTAB_H) toplev.h \
+ tree-ssa-propagate.h
tree-tailcall.o : tree-tailcall.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
$(RTL_H) $(TREE_H) $(TM_P_H) function.h $(TM_H) coretypes.h \
$(TREE_DUMP_H) $(DIAGNOSTIC_H) except.h tree-pass.h $(FLAGS_H) langhooks.h \
$(BASIC_BLOCK_H) hard-reg-set.h
tree-ssa-sink.o : tree-ssa-sink.c $(TREE_FLOW_H) $(CONFIG_H) \
- $(SYSTEM_H) $(TREE_H) $(GGC_H) $(DIAGNOSTIC_H) errors.h $(TIMEVAR_H) \
+ $(SYSTEM_H) $(TREE_H) $(GGC_H) $(DIAGNOSTIC_H) $(TIMEVAR_H) \
$(TM_H) coretypes.h $(TREE_DUMP_H) tree-pass.h $(FLAGS_H) alloc-pool.h \
$(BASIC_BLOCK_H) bitmap.h $(CFGLOOP_H) $(FIBHEAP_H) $(HASHTAB_H) \
langhooks.h real.h $(TREE_GIMPLE_H) tree-inline.h tree-iterator.h
@@ -1765,24 +1780,24 @@ tree-nested.o: tree-nested.c $(CONFIG_H) $(SYSTEM_H) $(TM_H) $(TREE_H) \
tree-if-conv.o: tree-if-conv.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(TREE_H) $(FLAGS_H) $(TIMEVAR_H) $(BASIC_BLOCK_H) $(TREE_FLOW_H) \
$(CFGLOOP_H) $(RTL_H) $(C_COMMON_H) tree-chrec.h $(TREE_DATA_REF_H) \
- $(SCEV_H) tree-pass.h $(DIAGNOSTIC_H) errors.h $(TARGET_H) $(TREE_DUMP_H) \
+ $(SCEV_H) tree-pass.h $(DIAGNOSTIC_H) $(TARGET_H) $(TREE_DUMP_H) \
$(VARRAY_H)
tree-iterator.o : tree-iterator.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \
coretypes.h $(GGC_H) tree-iterator.h $(TREE_GIMPLE_H) gt-tree-iterator.h
tree-dfa.o : tree-dfa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h $(DIAGNOSTIC_H) \
- errors.h tree-inline.h $(HASHTAB_H) pointer-set.h $(FLAGS_H) function.h \
+ tree-inline.h $(HASHTAB_H) pointer-set.h $(FLAGS_H) function.h \
$(TIMEVAR_H) convert.h $(TM_H) coretypes.h langhooks.h $(TREE_DUMP_H) \
tree-pass.h $(PARAMS_H) $(CGRAPH_H) $(BASIC_BLOCK_H) hard-reg-set.h \
$(TREE_GIMPLE_H)
tree-ssa-operands.o : tree-ssa-operands.c $(TREE_FLOW_H) $(CONFIG_H) \
- $(SYSTEM_H) $(TREE_H) $(GGC_H) $(DIAGNOSTIC_H) errors.h tree-inline.h \
- $(FLAGS_H) function.h $(TM_H) $(TIMEVAR_H) tree-pass.h \
+ $(SYSTEM_H) $(TREE_H) $(GGC_H) $(DIAGNOSTIC_H) tree-inline.h \
+ $(FLAGS_H) function.h $(TM_H) $(TIMEVAR_H) tree-pass.h toplev.h \
gt-tree-ssa-operands.h coretypes.h langhooks.h tree-ssa-opfinalize.h
tree-eh.o : tree-eh.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
$(RTL_H) $(TREE_H) $(TM_H) $(FLAGS_H) function.h except.h langhooks.h \
$(GGC_H) tree-pass.h coretypes.h $(TIMEVAR_H) $(TM_P_H) \
- $(TREE_DUMP_H) tree-inline.h tree-iterator.h
+ $(TREE_DUMP_H) tree-inline.h tree-iterator.h toplev.h
tree-ssa-loop.o : tree-ssa-loop.c $(TREE_FLOW_H) $(CONFIG_H) \
$(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(CFGLOOP_H) \
output.h $(DIAGNOSTIC_H) $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
@@ -1792,6 +1807,11 @@ tree-ssa-loop-unswitch.o : tree-ssa-loop-unswitch.c $(TREE_FLOW_H) \
$(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(CFGLOOP_H) \
domwalk.h $(PARAMS_H) output.h $(DIAGNOSTIC_H) $(TIMEVAR_H) $(TM_H) \
coretypes.h $(TREE_DUMP_H) tree-pass.h $(BASIC_BLOCK_H) hard-reg-set.h
+tree-ssa-address.o : tree-ssa-address.c $(TREE_FLOW_H) $(CONFIG_H) \
+ $(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) \
+ output.h diagnostic.h $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
+ tree-pass.h $(FLAGS_H) tree-inline.h $(RECOG_H) insn-config.h $(EXPR_H) \
+ gt-tree-ssa-address.h $(GGC_H)
tree-ssa-loop-niter.o : tree-ssa-loop-niter.c $(TREE_FLOW_H) $(CONFIG_H) \
$(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(CFGLOOP_H) $(PARAMS_H) \
tree-inline.h output.h $(DIAGNOSTIC_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
@@ -1828,58 +1848,62 @@ tree-ssa-alias.o : tree-ssa-alias.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
function.h $(TIMEVAR_H) convert.h $(TM_H) coretypes.h langhooks.h \
$(TREE_DUMP_H) tree-pass.h $(PARAMS_H) $(BASIC_BLOCK_H) $(DIAGNOSTIC_H) \
hard-reg-set.h $(TREE_GIMPLE_H) vec.h
+tree-ssa-reassoc.o : tree-ssa-reassoc.c $(TREE_FLOW_H) $(CONFIG_H) \
+ $(SYSTEM_H) $(TREE_H) $(GGC_H) $(DIAGNOSTIC_H) errors.h $(TIMEVAR_H) \
+ $(TM_H) coretypes.h $(TREE_DUMP_H) tree-pass.h $(FLAGS_H) tree-iterator.h\
+ $(BASIC_BLOCK_H) $(HASHTAB_H) $(TREE_GIMPLE_H) tree-inline.h
tree-optimize.o : tree-optimize.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h $(DIAGNOSTIC_H) \
$(FLAGS_H) $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) toplev.h \
function.h langhooks.h $(FLAGS_H) $(CGRAPH_H) tree-inline.h \
tree-mudflap.h $(GGC_H) $(CGRAPH_H) tree-pass.h $(CFGLOOP_H) \
$(BASIC_BLOCK_H) graph.h hard-reg-set.h
-c-gimplify.o : c-gimplify.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) errors.h \
+c-gimplify.o : c-gimplify.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \
$(C_TREE_H) $(C_COMMON_H) $(DIAGNOSTIC_H) $(TREE_GIMPLE_H) $(VARRAY_H) \
$(FLAGS_H) langhooks.h toplev.h $(RTL_H) $(TREE_FLOW_H) $(LANGHOOKS_DEF_H) \
$(TM_H) coretypes.h $(C_PRETTY_PRINT_H) $(CGRAPH_H) $(BASIC_BLOCK_H) \
hard-reg-set.h $(TREE_DUMP_H) tree-inline.h
-gimplify.o : gimplify.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) errors.h \
+gimplify.o : gimplify.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \
$(DIAGNOSTIC_H) $(TREE_GIMPLE_H) tree-inline.h $(VARRAY_H) langhooks.h \
$(LANGHOOKS_DEF_H) $(TREE_FLOW_H) $(CGRAPH_H) $(TIMEVAR_H) $(TM_H) \
coretypes.h except.h $(FLAGS_H) $(RTL_H) function.h $(EXPR_H) output.h \
- $(GGC_H) gt-gimplify.h $(HASHTAB_H) real.h $(TARGET_H)
-gimple-low.o : gimple-low.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) errors.h \
+ $(GGC_H) gt-gimplify.h $(HASHTAB_H) real.h $(TARGET_H) toplev.h
+gimple-low.o : gimple-low.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \
$(DIAGNOSTIC_H) $(TREE_GIMPLE_H) tree-inline.h $(VARRAY_H) langhooks.h \
$(LANGHOOKS_DEF_H) $(TREE_FLOW_H) $(TIMEVAR_H) $(TM_H) coretypes.h \
except.h $(FLAGS_H) $(RTL_H) function.h $(EXPR_H) tree-pass.h \
$(HASHTAB_H) toplev.h
tree-browser.o : tree-browser.c tree-browser.def $(CONFIG_H) $(SYSTEM_H) \
- $(TREE_H) errors.h tree-inline.h $(DIAGNOSTIC_H) $(HASHTAB_H) \
+ $(TREE_H) tree-inline.h $(DIAGNOSTIC_H) $(HASHTAB_H) \
$(TM_H) coretypes.h
tree-chrec.o: tree-chrec.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
- errors.h $(GGC_H) $(TREE_H) tree-chrec.h tree-pass.h $(PARAMS_H) \
- $(DIAGNOSTIC_H) $(VARRAY_H)
+ $(GGC_H) $(TREE_H) tree-chrec.h tree-pass.h $(PARAMS_H) \
+ $(DIAGNOSTIC_H) $(VARRAY_H) $(CFGLOOP_H) $(TREE_FLOW_H)
tree-scalar-evolution.o: tree-scalar-evolution.c $(CONFIG_H) $(SYSTEM_H) \
- coretypes.h $(TM_H) errors.h $(GGC_H) $(TREE_H) $(RTL_H) \
+ coretypes.h $(TM_H) $(GGC_H) $(TREE_H) $(RTL_H) \
$(BASIC_BLOCK_H) $(DIAGNOSTIC_H) $(TREE_FLOW_H) $(TREE_DUMP_H) \
$(TIMEVAR_H) $(CFGLOOP_H) $(SCEV_H) tree-pass.h $(FLAGS_H) tree-chrec.h
tree-data-ref.o: tree-data-ref.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
- errors.h $(GGC_H) $(TREE_H) $(RTL_H) $(BASIC_BLOCK_H) $(DIAGNOSTIC_H) \
+ $(GGC_H) $(TREE_H) $(RTL_H) $(BASIC_BLOCK_H) $(DIAGNOSTIC_H) \
$(TREE_FLOW_H) $(TREE_DUMP_H) $(TIMEVAR_H) $(CFGLOOP_H) \
$(TREE_DATA_REF_H) $(SCEV_H) tree-pass.h tree-chrec.h
tree-vect-analyze.o: tree-vect-analyze.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
- $(TM_H) errors.h $(GGC_H) $(OPTABS_H) $(TREE_H) $(BASIC_BLOCK_H) \
+ $(TM_H) $(GGC_H) $(OPTABS_H) $(TREE_H) $(BASIC_BLOCK_H) \
$(DIAGNOSTIC_H) $(TREE_FLOW_H) $(TREE_DUMP_H) $(TIMEVAR_H) $(CFGLOOP_H) \
tree-vectorizer.h $(TREE_DATA_REF_H) $(SCEV_H) $(EXPR_H) tree-chrec.h
tree-vect-transform.o: tree-vect-transform.c $(CONFIG_H) $(SYSTEM_H) \
- coretypes.h $(TM_H) errors.h $(GGC_H) $(OPTABS_H) $(TREE_H) $(RTL_H) \
+ coretypes.h $(TM_H) $(GGC_H) $(OPTABS_H) $(TREE_H) $(RTL_H) \
$(BASIC_BLOCK_H) $(DIAGNOSTIC_H) $(TREE_FLOW_H) $(TREE_DUMP_H) \
$(TIMEVAR_H) $(CFGLOOP_H) $(TARGET_H) tree-pass.h $(EXPR_H) \
tree-vectorizer.h $(TREE_DATA_REF_H) $(SCEV_H) langhooks.h toplev.h \
tree-chrec.h
tree-vectorizer.o: tree-vectorizer.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
- $(TM_H) errors.h $(GGC_H) $(OPTABS_H) $(TREE_H) $(RTL_H) $(BASIC_BLOCK_H) \
+ $(TM_H) $(GGC_H) $(OPTABS_H) $(TREE_H) $(RTL_H) $(BASIC_BLOCK_H) \
$(DIAGNOSTIC_H) $(TREE_FLOW_H) $(TREE_DUMP_H) $(TIMEVAR_H) $(CFGLOOP_H) \
tree-pass.h $(EXPR_H) tree-vectorizer.h $(TREE_DATA_REF_H) $(SCEV_H) \
input.h $(TARGET_H) $(CFGLAYOUT_H) toplev.h tree-chrec.h
tree-loop-linear.o: tree-loop-linear.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
- $(TM_H) errors.h $(GGC_H) $(OPTABS_H) $(TREE_H) $(RTL_H) $(BASIC_BLOCK_H) \
+ $(TM_H) $(GGC_H) $(OPTABS_H) $(TREE_H) $(RTL_H) $(BASIC_BLOCK_H) \
$(DIAGNOSTIC_H) $(TREE_FLOW_H) $(TREE_DUMP_H) $(TIMEVAR_H) $(CFGLOOP_H) \
tree-pass.h $(TREE_DATA_REF_H) $(SCEV_H) $(EXPR_H) $(LAMBDA_H) \
$(TARGET_H) tree-chrec.h $(VARRAY_H)
@@ -1889,17 +1913,17 @@ tree-stdarg.o: tree-stdarg.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
tree-gimple.o : tree-gimple.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(EXPR_H) \
$(RTL_H) $(TREE_GIMPLE_H) $(TM_H) coretypes.h bitmap.h $(GGC_H) \
output.h $(TREE_FLOW_H)
-tree-mudflap.o : $(CONFIG_H) errors.h $(SYSTEM_H) $(TREE_H) tree-inline.h \
+tree-mudflap.o : $(CONFIG_H) $(SYSTEM_H) $(TREE_H) tree-inline.h \
$(TREE_GIMPLE_H) $(DIAGNOSTIC_H) $(HASHTAB_H) langhooks.h tree-mudflap.h \
$(TM_H) coretypes.h $(TREE_DUMP_H) tree-pass.h $(CGRAPH_H) $(GGC_H) \
gt-tree-mudflap.h $(BASIC_BLOCK_H) $(FLAGS_H) function.h hard-reg-set.h \
- $(RTL_H) $(TM_P_H) $(TREE_FLOW_H)
-tree-nomudflap.o : $(CONFIG_H) errors.h $(SYSTEM_H) $(TREE_H) tree-inline.h \
+ $(RTL_H) $(TM_P_H) $(TREE_FLOW_H) toplev.h
+tree-nomudflap.o : $(CONFIG_H) $(SYSTEM_H) $(TREE_H) tree-inline.h \
$(C_TREE_H) $(C_COMMON_H) $(TREE_GIMPLE_H) $(DIAGNOSTIC_H) $(HASHTAB_H) \
output.h $(VARRAY_H) langhooks.h tree-mudflap.h $(TM_H) coretypes.h \
- $(GGC_H) gt-tree-mudflap.h tree-pass.h
+ $(GGC_H) gt-tree-mudflap.h tree-pass.h toplev.h
tree-pretty-print.o : tree-pretty-print.c $(CONFIG_H) $(SYSTEM_H) \
- errors.h $(TREE_H) $(DIAGNOSTIC_H) real.h $(HASHTAB_H) $(TREE_FLOW_H) \
+ $(TREE_H) $(DIAGNOSTIC_H) real.h $(HASHTAB_H) $(TREE_FLOW_H) \
$(TM_H) coretypes.h tree-iterator.h tree-chrec.h langhooks.h
fold-const.o : fold-const.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(TREE_H) $(FLAGS_H) real.h toplev.h $(HASHTAB_H) $(EXPR_H) $(RTL_H) \
@@ -1948,7 +1972,7 @@ rtl-error.o: rtl-error.c $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(CONFIG_H)
rtl.o : rtl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) real.h \
- $(GGC_H) errors.h $(BCONFIG_H) insn-notes.def reg-notes.def
+ $(GGC_H) $(BCONFIG_H) insn-notes.def reg-notes.def toplev.h
print-rtl.o : print-rtl.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(RTL_H) $(TREE_H) hard-reg-set.h $(BASIC_BLOCK_H) real.h $(FLAGS_H) \
@@ -2063,7 +2087,8 @@ cgraphunit.o : cgraphunit.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
ipa.o : ipa.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(CGRAPH_H)
ipa-inline.o : ipa-inline.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(TREE_H) langhooks.h tree-inline.h $(FLAGS_H) $(CGRAPH_H) intl.h \
- $(DIAGNOSTIC_H) $(FIBHEAP_H) $(PARAMS_H) $(TIMEVAR_H) tree-pass.h
+ $(DIAGNOSTIC_H) $(FIBHEAP_H) $(PARAMS_H) $(TIMEVAR_H) tree-pass.h \
+ $(COVERAGE_H)
coverage.o : coverage.c $(GCOV_IO_H) $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(RTL_H) $(TREE_H) $(FLAGS_H) output.h $(REGS_H) $(EXPR_H) \
function.h toplev.h $(GGC_H) langhooks.h $(COVERAGE_H) gt-coverage.h \
@@ -2090,16 +2115,19 @@ resource.o : resource.c $(CONFIG_H) $(RTL_H) hard-reg-set.h $(SYSTEM_H) \
lcm.o : lcm.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(REGS_H) \
hard-reg-set.h $(FLAGS_H) real.h insn-config.h $(INSN_ATTR_H) $(RECOG_H) \
$(BASIC_BLOCK_H) $(TM_P_H) function.h output.h
-tree-ssa-dce.o : tree-ssa-dce.c $(CONFIG_H) $(SYSTEM_H) errors.h $(TREE_H) \
+mode-switching.o : mode-switching.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
+ $(RTL_H) $(REGS_H) hard-reg-set.h $(FLAGS_H) real.h insn-config.h \
+ $(INSN_ATTR_H) $(RECOG_H) $(BASIC_BLOCK_H) $(TM_P_H) function.h output.h
+tree-ssa-dce.o : tree-ssa-dce.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \
$(RTL_H) $(TM_P_H) $(TREE_FLOW_H) $(DIAGNOSTIC_H) $(TIMEVAR_H) $(TM_H) \
coretypes.h $(TREE_DUMP_H) tree-pass.h $(FLAGS_H) $(BASIC_BLOCK_H) \
$(GGC_H) hard-reg-set.h $(OBSTACK_H) $(TREE_GIMPLE_H)
tree-ssa-ccp.o : tree-ssa-ccp.c $(TREE_FLOW_H) $(CONFIG_H) \
$(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h \
- $(DIAGNOSTIC_H) errors.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h \
+ $(DIAGNOSTIC_H) function.h $(TIMEVAR_H) $(TM_H) coretypes.h \
$(TREE_DUMP_H) $(BASIC_BLOCK_H) tree-pass.h langhooks.h \
tree-ssa-propagate.h $(FLAGS_H) $(TARGET_H)
-tree-sra.o : tree-sra.c $(CONFIG_H) $(SYSTEM_H) errors.h $(TREE_H) $(RTL_H) \
+tree-sra.o : tree-sra.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(RTL_H) \
$(TM_P_H) $(TREE_FLOW_H) $(DIAGNOSTIC_H) tree-inline.h \
$(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) $(TREE_GIMPLE_H) \
langhooks.h tree-pass.h $(FLAGS_H) $(EXPR_H) $(BASIC_BLOCK_H) \
@@ -2107,14 +2135,20 @@ tree-sra.o : tree-sra.c $(CONFIG_H) $(SYSTEM_H) errors.h $(TREE_H) $(RTL_H) \
tree-complex.o : tree-complex.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \
$(TM_H) $(TREE_FLOW_H) $(TREE_GIMPLE_H) tree-iterator.h tree-pass.h \
$(FLAGS_H) $(OPTABS_H) $(RTL_H) $(MACHMODE_H) $(EXPR_H) \
- langhooks.h $(FLAGS_H) $(DIAGNOSTIC_H) gt-tree-complex.h $(GGC_H) \
+ langhooks.h $(FLAGS_H) $(DIAGNOSTIC_H) $(GGC_H) \
+ coretypes.h insn-codes.h
+tree-vect-generic.o : tree-vect-generic.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \
+ $(TM_H) $(TREE_FLOW_H) $(TREE_GIMPLE_H) tree-iterator.h tree-pass.h \
+ $(FLAGS_H) $(OPTABS_H) $(RTL_H) $(MACHMODE_H) $(EXPR_H) \
+ langhooks.h $(FLAGS_H) $(DIAGNOSTIC_H) gt-tree-vect-generic.h $(GGC_H) \
coretypes.h insn-codes.h
df.o : df.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
insn-config.h $(RECOG_H) function.h $(REGS_H) alloc-pool.h hard-reg-set.h \
$(BASIC_BLOCK_H) $(DF_H) bitmap.h sbitmap.h $(TM_P_H)
var-tracking.o : var-tracking.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(RTL_H) $(TREE_H) hard-reg-set.h insn-config.h reload.h $(FLAGS_H) \
- $(BASIC_BLOCK_H) output.h sbitmap.h alloc-pool.h $(FIBHEAP_H) $(HASHTAB_H)
+ $(BASIC_BLOCK_H) output.h sbitmap.h alloc-pool.h $(FIBHEAP_H) $(HASHTAB_H) \
+ $(REGS_H) $(EXPR_H)
conflict.o : conflict.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(OBSTACK_H) \
$(HASHTAB_H) $(RTL_H) hard-reg-set.h $(BASIC_BLOCK_H)
profile.o : profile.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
@@ -2146,7 +2180,7 @@ flow.o : flow.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(EXPR_H) $(TM_P_H) $(OBSTACK_H) $(SPLAY_TREE_H) $(TIMEVAR_H)
cfg.o : cfg.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(FLAGS_H) \
$(REGS_H) hard-reg-set.h output.h toplev.h function.h except.h $(GGC_H) \
- $(TM_P_H) $(TIMEVAR_H) $(OBSTACK_H) $(TREE_H)
+ $(TM_P_H) $(TIMEVAR_H) $(OBSTACK_H) $(TREE_H) alloc-pool.h $(HASHTAB_H)
cfghooks.o: cfghooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(TREE_H) $(BASIC_BLOCK_H) $(TREE_FLOW_H) $(TIMEVAR_H) toplev.h
cfgexpand.o : cfgexpand.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
@@ -2193,7 +2227,7 @@ loop-unroll.o: loop-unroll.c $(CONFIG_H) $(SYSTEM_H) $(RTL_H) $(TM_H) \
output.h $(EXPR_H) coretypes.h $(TM_H) $(HASHTAB_H) $(RECOG_H) $(VARRAY_H) \
$(OBSTACK_H)
dominance.o : dominance.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
- hard-reg-set.h $(BASIC_BLOCK_H) et-forest.h errors.h $(OBSTACK_H)
+ hard-reg-set.h $(BASIC_BLOCK_H) et-forest.h $(OBSTACK_H) toplev.h
et-forest.o : et-forest.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
et-forest.h alloc-pool.h $(BASIC_BLOCK_H)
combine.o : combine.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
@@ -2207,17 +2241,17 @@ regclass.o : regclass.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(TM_P_H) $(EXPR_H) $(TIMEVAR_H) gt-regclass.h $(HASHTAB_H)
local-alloc.o : local-alloc.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(RTL_H) $(FLAGS_H) $(REGS_H) hard-reg-set.h insn-config.h $(RECOG_H) \
- output.h function.h $(INSN_ATTR_H) toplev.h except.h $(TM_P_H) \
- $(INTEGRATE_H)
+ output.h function.h $(INSN_ATTR_H) toplev.h except.h reload.h $(TM_P_H) \
+ $(GGC_H) $(INTEGRATE_H)
bitmap.o : bitmap.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(FLAGS_H) $(GGC_H) gt-bitmap.h bitmap.h $(OBSTACK_H)
global.o : global.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(FLAGS_H) reload.h function.h $(RECOG_H) $(REGS_H) hard-reg-set.h \
insn-config.h output.h toplev.h $(TM_P_H) $(MACHMODE_H)
varray.o : varray.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(GGC_H) \
- errors.h $(HASHTAB_H) $(BCONFIG_H) $(VARRAY_H)
+ $(HASHTAB_H) $(BCONFIG_H) $(VARRAY_H) toplev.h
vec.o : vec.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) coretypes.h vec.h $(GGC_H) \
- errors.h
+ toplev.h
reload.o : reload.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(FLAGS_H) output.h $(EXPR_H) $(OPTABS_H) reload.h $(RECOG_H) \
hard-reg-set.h insn-config.h $(REGS_H) function.h real.h toplev.h \
@@ -2309,7 +2343,7 @@ lists.o: lists.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) toplev.h \
bb-reorder.o : bb-reorder.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(RTL_H) $(FLAGS_H) $(TIMEVAR_H) output.h $(CFGLAYOUT_H) $(FIBHEAP_H) \
$(TARGET_H) function.h $(TM_P_H) $(OBSTACK_H) $(EXPR_H) $(REGS_H) \
- errors.h $(PARAMS_H)
+ $(PARAMS_H) toplev.h
tracer.o : tracer.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
$(TREE_H) $(BASIC_BLOCK_H) hard-reg-set.h output.h $(CFGLAYOUT_H) \
$(FLAGS_H) $(TIMEVAR_H) $(PARAMS_H) $(COVERAGE_H) $(FIBHEAP_H)
@@ -2330,9 +2364,9 @@ ifcvt.o : ifcvt.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
lambda-mat.o : lambda-mat.c $(LAMBDA_H) $(GGC_H) $(SYSTEM_H) $(CONFIG_H) \
$(TM_H) coretypes.h $(TREE_H) $(VARRAY_H)
lambda-trans.o: lambda-trans.c $(LAMBDA_H) $(GGC_H) $(SYSTEM_H) $(CONFIG_H) \
- $(TM_H) coretypes.h errors.h $(TARGET_H) $(TREE_H) $(VARRAY_H)
+ $(TM_H) coretypes.h $(TARGET_H) $(TREE_H) $(VARRAY_H)
lambda-code.o: lambda-code.c $(LAMBDA_H) $(GGC_H) $(SYSTEM_H) $(CONFIG_H) \
- errors.h $(TM_H) $(OPTABS_H) $(TREE_H) $(RTL_H) $(BASIC_BLOCK_H) \
+ $(TM_H) $(OPTABS_H) $(TREE_H) $(RTL_H) $(BASIC_BLOCK_H) \
$(DIAGNOSTIC_H) $(TREE_FLOW_H) $(TREE_DUMP_H) $(TIMEVAR_H) $(CFGLOOP_H) \
$(TREE_DATA_REF_H) $(SCEV_H) $(EXPR_H) coretypes.h $(TARGET_H) \
tree-chrec.h tree-pass.h vec.h
@@ -2356,13 +2390,13 @@ mips-tfile: mips-tfile.o version.o $(LIBDEPS)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ mips-tfile.o version.o $(LIBS)
mips-tfile.o : mips-tfile.c $(CONFIG_H) $(RTL_H) $(SYSTEM_H) coretypes.h \
- $(TM_H) version.h getopt.h gstab.h intl.h
+ $(TM_H) version.h $(srcdir)/../include/getopt.h gstab.h intl.h
mips-tdump: mips-tdump.o version.o $(LIBDEPS)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ mips-tdump.o version.o $(LIBS)
mips-tdump.o : mips-tdump.c $(CONFIG_H) $(RTL_H) $(SYSTEM_H) coretypes.h \
- $(TM_H) version.h getopt.h stab.def
+ $(TM_H) version.h $(srcdir)/../include/getopt.h stab.def
# FIXME: writing proper dependencies for this is a *LOT* of work.
libbackend.o : $(OBJS-common:.o=.c) $(out_file) \
@@ -2452,7 +2486,8 @@ s-constants : $(MD_DEPS) build/genconstants$(build_exeext)
insn-emit.o : insn-emit.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(RTL_H) $(EXPR_H) real.h output.h insn-config.h $(OPTABS_H) reload.h \
- $(RECOG_H) toplev.h function.h $(FLAGS_H) hard-reg-set.h $(RESOURCE_H) $(TM_P_H)
+ $(RECOG_H) toplev.h function.h $(FLAGS_H) hard-reg-set.h $(RESOURCE_H) \
+ $(TM_P_H) $(BASIC_BLOCK_H)
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-emit.c \
$(OUTPUT_OPTION)
@@ -2598,11 +2633,11 @@ GTFILES = $(srcdir)/input.h $(srcdir)/coretypes.h \
$(srcdir)/stringpool.c $(srcdir)/tree.c $(srcdir)/varasm.c \
$(srcdir)/tree-mudflap.c $(srcdir)/tree-flow.h \
$(srcdir)/c-objc-common.c $(srcdir)/c-common.c $(srcdir)/c-parser.c \
- $(srcdir)/tree-ssanames.c $(srcdir)/tree-eh.c \
+ $(srcdir)/tree-ssanames.c $(srcdir)/tree-eh.c $(srcdir)/tree-ssa-address.c \
$(srcdir)/tree-phinodes.c $(srcdir)/tree-cfg.c \
$(srcdir)/tree-dfa.c $(srcdir)/tree-ssa-propagate.c \
$(srcdir)/tree-iterator.c $(srcdir)/gimplify.c \
- $(srcdir)/tree-chrec.h $(srcdir)/tree-complex.c \
+ $(srcdir)/tree-chrec.h $(srcdir)/tree-vect-generic.c \
$(srcdir)/tree-ssa-operands.h $(srcdir)/tree-ssa-operands.c \
$(srcdir)/tree-profile.c $(srcdir)/rtl-profile.c $(srcdir)/tree-nested.c \
$(out_file) \
@@ -2621,8 +2656,8 @@ gt-expr.h gt-sdbout.h gt-optabs.h gt-bitmap.h gt-dojump.h \
gt-dwarf2out.h gt-reg-stack.h gt-dwarf2asm.h \
gt-dbxout.h gt-c-common.h gt-c-decl.h gt-c-parser.h \
gt-c-pragma.h gtype-c.h gt-cfglayout.h \
-gt-tree-mudflap.h gt-tree-complex.h \
-gt-tree-profile.h \
+gt-tree-mudflap.h gt-tree-vect-generic.h \
+gt-tree-profile.h gt-tree-ssa-address.h \
gt-tree-ssanames.h gt-tree-iterator.h gt-gimplify.h \
gt-tree-phinodes.h gt-tree-nested.h \
gt-tree-ssa-operands.h gt-tree-ssa-propagate.h \
@@ -3392,7 +3427,7 @@ install: install-common $(INSTALL_HEADERS) $(INSTALL_LIBGCC) \
lang.install-normal install-driver
# Handle cpp installation.
-install-cpp: cpp$(exeext)
+install-cpp: installdirs cpp$(exeext)
-rm -f $(DESTDIR)$(bindir)/$(CPP_INSTALL_NAME)$(exeext)
-$(INSTALL_PROGRAM) -m 755 cpp$(exeext) $(DESTDIR)$(bindir)/$(CPP_INSTALL_NAME)$(exeext)
-if [ x$(cpp_install_dir) != x ]; then \
@@ -3504,7 +3539,7 @@ $(DESTDIR)$(infodir)/%.info: doc/%.info installdirs
else true; fi;
# Install the man pages.
-install-man: installdirs lang.install-man \
+install-man: lang.install-man \
$(DESTDIR)$(man1dir)/$(GCC_INSTALL_NAME)$(man1ext) \
$(DESTDIR)$(man1dir)/$(CPP_INSTALL_NAME)$(man1ext) \
$(DESTDIR)$(man1dir)/$(GCOV_INSTALL_NAME)$(man1ext) \
@@ -3512,22 +3547,22 @@ install-man: installdirs lang.install-man \
$(DESTDIR)$(man7dir)/gfdl$(man7ext) \
$(DESTDIR)$(man7dir)/gpl$(man7ext)
-$(DESTDIR)$(man7dir)/%$(man7ext): doc/%.7
+$(DESTDIR)$(man7dir)/%$(man7ext): doc/%.7 installdirs
-rm -f $@
-$(INSTALL_DATA) $< $@
-chmod a-x $@
-$(DESTDIR)$(man1dir)/$(GCC_INSTALL_NAME)$(man1ext): doc/gcc.1
+$(DESTDIR)$(man1dir)/$(GCC_INSTALL_NAME)$(man1ext): doc/gcc.1 installdirs
-rm -f $@
-$(INSTALL_DATA) $< $@
-chmod a-x $@
-$(DESTDIR)$(man1dir)/$(CPP_INSTALL_NAME)$(man1ext): doc/cpp.1
+$(DESTDIR)$(man1dir)/$(CPP_INSTALL_NAME)$(man1ext): doc/cpp.1 installdirs
-rm -f $@
-$(INSTALL_DATA) $< $@
-chmod a-x $@
-$(DESTDIR)$(man1dir)/$(GCOV_INSTALL_NAME)$(man1ext): doc/gcov.1
+$(DESTDIR)$(man1dir)/$(GCOV_INSTALL_NAME)$(man1ext): doc/gcov.1 installdirs
-rm -f $@
-$(INSTALL_DATA) $< $@
-chmod a-x $@
diff --git a/gcc/aclocal.m4 b/gcc/aclocal.m4
index 98c56a47af0..9e7da1f233d 100644
--- a/gcc/aclocal.m4
+++ b/gcc/aclocal.m4
@@ -408,29 +408,6 @@ else
fi
fi])
-dnl Checking for long long.
-dnl By Caolan McNamara <caolan@skynet.ie>
-dnl Added check for __int64, Zack Weinberg <zackw@stanford.edu>
-dnl
-AC_DEFUN([gcc_AC_C_LONG_LONG],
-[AC_CACHE_CHECK(for long long int, ac_cv_c_long_long,
- [AC_TRY_COMPILE(,[long long int i;],
- ac_cv_c_long_long=yes,
- ac_cv_c_long_long=no)])
- if test $ac_cv_c_long_long = yes; then
- AC_DEFINE(HAVE_LONG_LONG, 1,
- [Define if your compiler supports the \`long long' type.])
- fi
-AC_CACHE_CHECK(for __int64, ac_cv_c___int64,
- [AC_TRY_COMPILE(,[__int64 i;],
- ac_cv_c___int64=yes,
- ac_cv_c___int64=no)])
- if test $ac_cv_c___int64 = yes; then
- AC_DEFINE(HAVE___INT64, 1,
- [Define if your compiler supports the \`__int64' type.])
- fi
-])
-
dnl From Bruno Haible.
AC_DEFUN([AM_LANGINFO_CODESET],
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index a08251e21b0..68779b1483a 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,23 @@
+2005-06-03 Andrew Pinski <pinskia@physics.uc.edu>
+
+ * trans.c (gnat_gimplify_expr): Call
+ recompute_tree_invarant_for_addr_expr when we change
+ the operand of the ADDR_EXPR.
+
+2005-05-31 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * misc.c: Don't include errors.h.
+
+2005-05-29 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * raise.c (db): Add ATTRIBUTE_PRINTF_2.
+
+2005-05-29 Kazu Hirata <kazu@cs.umass.edu>
+
+ * cal.c, decl.c, init.c, raise.c, trans.c, utils2.c: Fix
+ comment typos.
+ * gnat_rm.texi, gnat_ugn.texi: Fix typos.
+
2005-05-16 Nathanael Nerode <neroden@gcc.gnu.org>
PR ada/20270
diff --git a/gcc/ada/cal.c b/gcc/ada/cal.c
index 20a631634bb..283a0e6856e 100644
--- a/gcc/ada/cal.c
+++ b/gcc/ada/cal.c
@@ -32,8 +32,8 @@
/* This file contains those routines named by Import pragmas in package */
/* GNAT.Calendar. It is used to do Duration to timeval conversion. */
-/* These are simple wrappers function to abstarct the fact that the C */
-/* struct timeval fields type are not normalized (they are generaly */
+/* These are simple wrappers function to abstract the fact that the C */
+/* struct timeval fields type are not normalized (they are generally */
/* defined as int or long values). */
#if defined(VMS)
diff --git a/gcc/ada/decl.c b/gcc/ada/decl.c
index c881d55b41f..bd9f26017b5 100644
--- a/gcc/ada/decl.c
+++ b/gcc/ada/decl.c
@@ -839,7 +839,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
}
/* If this is a pointer and it does not have an initializing
- expression, initialize it to NULL, unless the obect is
+ expression, initialize it to NULL, unless the object is
imported. */
if (definition
&& (POINTER_TYPE_P (gnu_type) || TYPE_FAT_POINTER_P (gnu_type))
@@ -4223,7 +4223,7 @@ elaborate_entity (Entity_Id gnat_entity)
Node_Id gnat_lb = Type_Low_Bound (gnat_entity);
Node_Id gnat_hb = Type_High_Bound (gnat_entity);
- /* ??? Tests for avoiding static constaint error expression
+ /* ??? Tests for avoiding static constraint error expression
is needed until the front stops generating bogus conversions
on bounds of real types. */
@@ -6322,7 +6322,7 @@ static int
compatible_signatures_p (tree ftype1, tree ftype2)
{
/* As of now, we only perform very trivial tests and consider it's the
- programmer's responsability to ensure the type correctness in the Ada
+ programmer's responsibility to ensure the type correctness in the Ada
declaration, as in the regular Import cases.
Mismatches typically result in either error messages from the builtin
diff --git a/gcc/ada/gnat_rm.texi b/gcc/ada/gnat_rm.texi
index 6471f36a7a1..a985edc42d8 100644
--- a/gcc/ada/gnat_rm.texi
+++ b/gcc/ada/gnat_rm.texi
@@ -4818,7 +4818,7 @@ subprogram yields a value that can be called as long as the subprogram
is in scope (normal Ada 95 accessibility rules restrict this usage).
It is possible to use @code{Unrestricted_Access} for any type, but care
-must be excercised if it is used to create pointers to unconstrained
+must be exercised if it is used to create pointers to unconstrained
objects. In this case, the resulting pointer has the same scope as the
context of the attribute, and may not be returned to some enclosing
scope. For instance, a function cannot use @code{Unrestricted_Access}
@@ -12522,7 +12522,7 @@ collisions occur and each item can be retrieved from the table in one
probe (perfect property). The hash table size corresponds to the exact
size of the key set and no larger (minimal property). The key set has to
be know in advance (static property). The hash functions are also order
-preservering. If w2 is inserted after w1 in the generator, their
+preserving. If w2 is inserted after w1 in the generator, their
hashcode are in the same order. These hashing functions are very
convenient for use with realtime applications.
diff --git a/gcc/ada/gnat_ugn.texi b/gcc/ada/gnat_ugn.texi
index 7f4e0671f87..e27ed3de73c 100644
--- a/gcc/ada/gnat_ugn.texi
+++ b/gcc/ada/gnat_ugn.texi
@@ -12582,7 +12582,7 @@ Additionally, you may define the library-related attributes
@code{Library_Auto_Init}, @code{Library_Options} and @code{Library_GCC}.
The @code{Library_Name} attribute has a string value. There is no restriction
-on the name of a library. It is the responsability of the developer to
+on the name of a library. It is the responsibility of the developer to
choose a name that will be accepted by the platform. It is recommended to
choose names that could be Ada identifiers; such names are almost guaranteed
to be acceptable on all platforms.
@@ -12664,7 +12664,7 @@ if @file{a1.ads}, @file{a2.ads} or @file{a2.adb} includes a statement
@code{"with L1;"}.
To be sure that all the sources in the library associated with @code{L} are
-up to date, and that all the sources of parject @code{A} are also up to date,
+up to date, and that all the sources of project @code{A} are also up to date,
the following two commands needs to be used:
@smallexample
@@ -15221,7 +15221,7 @@ affected cases include:
@noindent
In compact mode (when GNAT style layout or compact layout is set),
the pretty printer uses one level of indentation instead
-of two. This is achived in the record definition and record representation
+of two. This is achieved in the record definition and record representation
clause cases by putting the @code{record} keyword on the same line as the
start of the declaration or representation clause, and in the block and loop
case by putting the block or loop header on the same line as the statement
@@ -16106,7 +16106,7 @@ all upper case). Characters of the other case are folded as required.
@var{length} represents the length of the krunched name. The default
when no argument is given is ^8^39^ characters. A length of zero stands for
unlimited, in other words do not chop except for system files where the
-impled crunching length is always eight characters.
+implied crunching length is always eight characters.
@noindent
The output is the krunched name. The output has an extension only if the
@@ -27062,7 +27062,7 @@ There is nothing specific to Windows in this area. @pxref{Library Projects}.
@end menu
@noindent
-Note that it is prefered to use the built-in GNAT DLL support
+Note that it is preferred to use the built-in GNAT DLL support
(@pxref{Building DLLs with GNAT}) or GNAT Project files
(@pxref{Building DLLs with GNAT Project files}) to build DLLs.
diff --git a/gcc/ada/init.c b/gcc/ada/init.c
index 12a9badafc2..7ca680040bd 100644
--- a/gcc/ada/init.c
+++ b/gcc/ada/init.c
@@ -277,10 +277,10 @@ __gnat_set_globals (int main_priority,
call chain. To evaluate if a handler applies at some point in this chain,
the propagation engine needs to determine what region the corresponding
call instruction pertains to. The return address may not be attached to the
- same region as the call, so the unwinder unconditionally substracts "some"
+ same region as the call, so the unwinder unconditionally subtracts "some"
amount to the return addresses it gets to search the region tables. The
exact amount is computed to ensure that the resulting address is inside the
- call instruction, and is thus target dependant (think about delay slots for
+ call instruction, and is thus target dependent (think about delay slots for
instance).
When we raise an exception from a signal handler, e.g. to transform a
@@ -1794,10 +1794,10 @@ __gnat_initialize (void *eh ATTRIBUTE_UNUSED)
constructor fashion, typically triggered by the VxWorks loader. This is
achieved by way of a special variable declaration in the crt object, the
name of which has been deduced by analyzing the output of the "munching"
- step documented for C++. The de-registration is handled symetrically,
+ step documented for C++. The de-registration is handled symmetrically,
a-la C++ destructor fashion and typically triggered by the dynamic
unloader. Note that since the tables shall be registered against a
- common datastructure, libgcc should be one of the modules (vs beeing
+ common datastructure, libgcc should be one of the modules (vs being
partially linked against all the others at build time) and shall be
loaded first.
@@ -1991,7 +1991,7 @@ __gnat_adjust_context_for_raise (int signo ATTRIBUTE_UNUSED,
{
/* The point is that the interrupted context PC typically is the address
that we should search an EH region for, which is different from the call
- return address case. The target independant part of the GCC unwinder
+ return address case. The target independent part of the GCC unwinder
don't differentiate the two situations, so we compensate here for the
adjustments it will blindly make.
diff --git a/gcc/ada/misc.c b/gcc/ada/misc.c
index b8a3299ef49..8d59496fd17 100644
--- a/gcc/ada/misc.c
+++ b/gcc/ada/misc.c
@@ -41,7 +41,6 @@
#include "tree.h"
#include "real.h"
#include "rtl.h"
-#include "errors.h"
#include "diagnostic.h"
#include "expr.h"
#include "libfuncs.h"
diff --git a/gcc/ada/raise.c b/gcc/ada/raise.c
index d0abc8a79c0..05d19baf218 100644
--- a/gcc/ada/raise.c
+++ b/gcc/ada/raise.c
@@ -204,7 +204,7 @@ db_indent (int requests)
}
-static void
+static void ATTRIBUTE_PRINTF_2
db (int db_code, char * msg_format, ...)
{
if (db_accepted_codes () & db_code)
@@ -264,7 +264,7 @@ db_phases (int phases)
table which heads a list of possible actions to be taken (see below).
If it is determined that indeed an action should be taken, that
- is, if one action filter matches the exception beeing propagated,
+ is, if one action filter matches the exception being propagated,
then control should be transfered to landing-pad.
A null first-action-index indicates that there are only cleanups
@@ -283,7 +283,7 @@ db_phases (int phases)
Non null action-filters provide an index into the ttypes [] table
(see below), from which information may be retrieved to check if it
- matches the exception beeing propagated.
+ matches the exception being propagated.
action-filter > 0 means there is a regular handler to be run,
@@ -302,7 +302,7 @@ db_phases (int phases)
A null value indicates a catch-all handler in C++, and an "others"
handler in Ada.
- Non null values are used to match the exception beeing propagated:
+ Non null values are used to match the exception being propagated:
In C++ this is a pointer to some rtti data, while in Ada this is an
exception id.
@@ -611,7 +611,7 @@ get_region_description_for (_Unwind_Context *uw_context,
typedef enum
{
/* Found some call site base data, but need to analyze further
- before beeing able to decide. */
+ before being able to decide. */
unknown,
/* There is nothing relevant in the context at hand. */
@@ -761,7 +761,7 @@ get_call_site_action_for (_Unwind_Context *uw_context,
{
_Unwind_Ptr ip
= _Unwind_GetIP (uw_context) - 1;
- /* Substract 1 because GetIP yields a call return address while we are
+ /* Subtract 1 because GetIP yields a call return address while we are
interested in information for the call point. This does not always yield
the exact call instruction address but always brings the ip back within
the corresponding region.
diff --git a/gcc/ada/trans.c b/gcc/ada/trans.c
index 869ce3f5603..36b5ba2d3bc 100644
--- a/gcc/ada/trans.c
+++ b/gcc/ada/trans.c
@@ -2316,7 +2316,7 @@ Exception_Handler_to_gnu_zcx (Node_Id gnat_node)
is integer_zero_node. It would not work, however, because GCC's
notion of "catch all" is stronger than our notion of "others". Until
we correctly use the cleanup interface as well, doing that would
- prevent the "all others" handlers from beeing seen, because nothing
+ prevent the "all others" handlers from being seen, because nothing
can be caught beyond a catch all from GCC's point of view. */
gnu_etypes_list = tree_cons (NULL_TREE, gnu_etype, gnu_etypes_list);
}
@@ -2431,7 +2431,7 @@ Compilation_Unit_to_gnu (Node_Id gnat_node)
If this is an expression, return the GCC equivalent of the expression. If
it is a statement, return the statement. In the case when called for a
statement, it may also add statements to the current statement group, in
- which case anything it returns is to be interpreted as occuring after
+ which case anything it returns is to be interpreted as occurring after
anything `it already added. */
tree
@@ -4261,7 +4261,7 @@ add_decl_expr (tree gnu_decl, Entity_Id gnat_entity)
}
}
- /* If this is a DECL_EXPR for a variable with DECL_INITIAl set,
+ /* If this is a DECL_EXPR for a variable with DECL_INITIAL set,
there are two cases we need to handle here. */
if (TREE_CODE (gnu_decl) == VAR_DECL && DECL_INITIAL (gnu_decl))
{
@@ -4526,6 +4526,7 @@ gnat_gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p ATTRIBUTE_UNUSED)
DECL_INITIAL (new_var) = TREE_OPERAND (expr, 0);
TREE_OPERAND (expr, 0) = new_var;
+ recompute_tree_invarant_for_addr_expr (expr);
return GS_ALL_DONE;
}
return GS_UNHANDLED;
diff --git a/gcc/ada/utils2.c b/gcc/ada/utils2.c
index 6ca8b99e50a..ae56b421a32 100644
--- a/gcc/ada/utils2.c
+++ b/gcc/ada/utils2.c
@@ -176,7 +176,7 @@ known_alignment (tree exp)
case PLUS_EXPR:
case MINUS_EXPR:
/* If two address are added, the alignment of the result is the
- minimum of the two aligments. */
+ minimum of the two alignments. */
lhs = known_alignment (TREE_OPERAND (exp, 0));
rhs = known_alignment (TREE_OPERAND (exp, 1));
this_alignment = MIN (lhs, rhs);
diff --git a/gcc/attribs.c b/gcc/attribs.c
index f04dfb97f60..019618cccec 100644
--- a/gcc/attribs.c
+++ b/gcc/attribs.c
@@ -172,7 +172,7 @@ decl_attributes (tree *node, tree attributes, int flags)
if (spec == NULL)
{
- warning (0, "%qs attribute directive ignored",
+ warning (OPT_Wattributes, "%qs attribute directive ignored",
IDENTIFIER_POINTER (name));
continue;
}
@@ -197,7 +197,7 @@ decl_attributes (tree *node, tree attributes, int flags)
}
else
{
- warning (0, "%qs attribute does not apply to types",
+ warning (OPT_Wattributes, "%qs attribute does not apply to types",
IDENTIFIER_POINTER (name));
continue;
}
@@ -243,7 +243,8 @@ decl_attributes (tree *node, tree attributes, int flags)
if (TREE_CODE (*anode) != FUNCTION_TYPE
&& TREE_CODE (*anode) != METHOD_TYPE)
{
- warning (0, "%qs attribute only applies to function types",
+ warning (OPT_Wattributes,
+ "%qs attribute only applies to function types",
IDENTIFIER_POINTER (name));
continue;
}
diff --git a/gcc/basic-block.h b/gcc/basic-block.h
index 4deeb899755..d9244d271fd 100644
--- a/gcc/basic-block.h
+++ b/gcc/basic-block.h
@@ -29,7 +29,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "hard-reg-set.h"
#include "predict.h"
#include "vec.h"
-#include "errors.h"
#include "function.h"
/* Head of register set linked list. */
@@ -183,7 +182,7 @@ struct loop;
struct loops;
/* Declared in tree-flow.h. */
-struct bb_ann_d;
+struct edge_prediction;
/* A basic block is a sequence of instructions with only entry and
only one exit. If any one of the instructions are executed, they
@@ -246,8 +245,11 @@ struct basic_block_def GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb")
/* The data used by basic block copying and reordering functions. */
struct reorder_block_def * rbi;
- /* Annotations used at the tree level. */
- struct bb_ann_d *tree_annotations;
+ /* Chain of PHI nodes for this block. */
+ tree phi_nodes;
+
+ /* A list of predictions. */
+ struct edge_prediction *predictions;
/* Expected number of executions: calculated in profile.c. */
gcov_type count;
@@ -263,9 +265,6 @@ struct basic_block_def GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb")
/* Various flags. See BB_* below. */
int flags;
-
- /* Which section block belongs in, when partitioning basic blocks. */
- int partition;
};
typedef struct basic_block_def *basic_block;
@@ -280,16 +279,6 @@ struct reorder_block_def GTY(())
basic_block next;
- /* These pointers may be unreliable as the first is only used for
- debugging (and should probably be removed, and the second is only
- used by copying. The basic blocks pointed to may be removed and
- that leaves these pointers pointing to garbage. */
- basic_block GTY ((skip (""))) original;
- basic_block GTY ((skip (""))) copy;
-
- int duplicated;
- int copy_number;
-
/* This field is used by the bb-reorder and tracer passes. */
int visited;
};
@@ -333,7 +322,10 @@ enum
BB_HOT_PARTITION = 64,
/* Set on blocks that should be put in a cold section. */
- BB_COLD_PARTITION = 128
+ BB_COLD_PARTITION = 128,
+
+ /* Set on block that was duplicated. */
+ BB_DUPLICATED = 256
};
/* Dummy flag for convenience in the hot/cold partitioning code. */
@@ -447,10 +439,6 @@ extern bool rediscover_loops_after_threading;
#define FOR_ALL_BB_FN(BB, FN) \
for (BB = ENTRY_BLOCK_PTR_FOR_FUNCTION (FN); BB; BB = BB->next_bb)
-/* Special labels found during CFG build. */
-
-extern GTY(()) rtx label_value_list;
-
extern bitmap_obstack reg_obstack;
/* Indexed by n, gives number of basic block that (REG n) is used in.
@@ -870,6 +858,7 @@ extern void tree_predict_edge (edge, enum br_predictor, int);
extern void rtl_predict_edge (edge, enum br_predictor, int);
extern void predict_edge_def (edge, enum br_predictor, enum prediction);
extern void guess_outgoing_edge_probabilities (basic_block);
+extern void remove_predictions_associated_with_edge (edge);
/* In flow.c */
extern void init_flow (void);
@@ -988,6 +977,13 @@ extern void break_superblocks (void);
extern void check_bb_profile (basic_block, FILE *);
extern void update_bb_profile_for_threading (basic_block, int, gcov_type, edge);
+extern void initialize_original_copy_tables (void);
+extern void free_original_copy_tables (void);
+extern void set_bb_original (basic_block, basic_block);
+extern basic_block get_bb_original (basic_block);
+extern void set_bb_copy (basic_block, basic_block);
+extern basic_block get_bb_copy (basic_block);
+
#include "cfghooks.h"
#endif /* GCC_BASIC_BLOCK_H */
diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c
index 547296714ce..e0cba445c67 100644
--- a/gcc/bb-reorder.c
+++ b/gcc/bb-reorder.c
@@ -81,8 +81,8 @@
#include "tm_p.h"
#include "obstack.h"
#include "expr.h"
-#include "errors.h"
#include "params.h"
+#include "toplev.h"
/* The number of rounds. In most cases there will only be 4 rounds, but
when partitioning hot and cold basic blocks into separate sections of
diff --git a/gcc/bt-load.c b/gcc/bt-load.c
index 47ac16a82fb..d58dab7a1f0 100644
--- a/gcc/bt-load.c
+++ b/gcc/bt-load.c
@@ -699,7 +699,8 @@ link_btr_uses (btr_def *def_array, btr_user *use_array, sbitmap *bb_out,
{
/* Find all the reaching defs for this use. */
sbitmap reaching_defs_of_reg = sbitmap_alloc(max_uid);
- int uid;
+ unsigned int uid;
+ sbitmap_iterator sbi;
if (user->use)
sbitmap_a_and_b (
@@ -720,7 +721,7 @@ link_btr_uses (btr_def *def_array, btr_user *use_array, sbitmap *bb_out,
reaching_defs,
btr_defset[reg - first_btr]);
}
- EXECUTE_IF_SET_IN_SBITMAP (reaching_defs_of_reg, 0, uid,
+ EXECUTE_IF_SET_IN_SBITMAP (reaching_defs_of_reg, 0, uid, sbi)
{
btr_def def = def_array[uid];
@@ -752,7 +753,7 @@ link_btr_uses (btr_def *def_array, btr_user *use_array, sbitmap *bb_out,
def->other_btr_uses_after_use = 1;
user->next = def->uses;
def->uses = user;
- });
+ }
sbitmap_free (reaching_defs_of_reg);
}
diff --git a/gcc/builtins.def b/gcc/builtins.def
index 134bf98a129..a4ff77d72d5 100644
--- a/gcc/builtins.def
+++ b/gcc/builtins.def
@@ -397,8 +397,6 @@ DEF_EXT_LIB_BUILTIN (BUILT_IN_YNF, "ynf", BT_FN_FLOAT_INT_FLOAT, ATTR_MATHFN_
DEF_EXT_LIB_BUILTIN (BUILT_IN_YNL, "ynl", BT_FN_LONGDOUBLE_INT_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO)
/* Category: _Complex math builtins. */
-/* The C99 clog function conflicts with C++ iostreams clog, see
- http://gcc.gnu.org/ml/gcc-patches/2003-09/msg00510.html */
DEF_C99_BUILTIN (BUILT_IN_CABS, "cabs", BT_FN_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
DEF_C99_BUILTIN (BUILT_IN_CABSF, "cabsf", BT_FN_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
DEF_C99_BUILTIN (BUILT_IN_CABSL, "cabsl", BT_FN_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
@@ -435,9 +433,9 @@ DEF_C99_BUILTIN (BUILT_IN_CEXPL, "cexpl", BT_FN_COMPLEX_LONGDOUBLE_COMPLE
DEF_C99_BUILTIN (BUILT_IN_CIMAG, "cimag", BT_FN_DOUBLE_COMPLEX_DOUBLE, ATTR_CONST_NOTHROW_LIST)
DEF_C99_BUILTIN (BUILT_IN_CIMAGF, "cimagf", BT_FN_FLOAT_COMPLEX_FLOAT, ATTR_CONST_NOTHROW_LIST)
DEF_C99_BUILTIN (BUILT_IN_CIMAGL, "cimagl", BT_FN_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_CONST_NOTHROW_LIST)
-/*DEF_C99_BUILTIN (BUILT_IN_CLOG, "clog", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)*/
-/*DEF_C99_BUILTIN (BUILT_IN_CLOGF, "clogf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)*/
-/*DEF_C99_BUILTIN (BUILT_IN_CLOGL, "clogl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)*/
+DEF_C99_BUILTIN (BUILT_IN_CLOG, "clog", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_MATHFN_FPROUNDING)
+DEF_C99_BUILTIN (BUILT_IN_CLOGF, "clogf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_MATHFN_FPROUNDING)
+DEF_C99_BUILTIN (BUILT_IN_CLOGL, "clogl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_MATHFN_FPROUNDING)
DEF_C99_BUILTIN (BUILT_IN_CONJ, "conj", BT_FN_COMPLEX_DOUBLE_COMPLEX_DOUBLE, ATTR_CONST_NOTHROW_LIST)
DEF_C99_BUILTIN (BUILT_IN_CONJF, "conjf", BT_FN_COMPLEX_FLOAT_COMPLEX_FLOAT, ATTR_CONST_NOTHROW_LIST)
DEF_C99_BUILTIN (BUILT_IN_CONJL, "conjl", BT_FN_COMPLEX_LONGDOUBLE_COMPLEX_LONGDOUBLE, ATTR_CONST_NOTHROW_LIST)
diff --git a/gcc/c-common.c b/gcc/c-common.c
index c9027463795..b7263aac48a 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -945,8 +945,9 @@ unsigned_conversion_warning (tree result, tree operand)
if (!int_fits_type_p (operand, c_common_signed_type (type)))
/* This detects cases like converting -129 or 256 to unsigned char. */
warning (0, "large integer implicitly truncated to unsigned type");
- else if (warn_conversion)
- warning (0, "negative integer implicitly converted to unsigned type");
+ else
+ warning (OPT_Wconversion,
+ "negative integer implicitly converted to unsigned type");
}
}
@@ -1444,7 +1445,7 @@ check_case_value (tree value)
if the case is not a case range.
The caller has to make sure that we are not called with NULL for
CASE_LOW_P (i.e. the default case).
- Returns true if the case label is in range of ORIG_TYPE (satured or
+ Returns true if the case label is in range of ORIG_TYPE (saturated or
untouched) or false if the label is out of range. */
static bool
@@ -2470,8 +2471,9 @@ c_common_truthvalue_conversion (tree expr)
break;
case MODIFY_EXPR:
- if (warn_parentheses && !TREE_NO_WARNING (expr))
- warning (0, "suggest parentheses around assignment used as truth value");
+ if (!TREE_NO_WARNING (expr))
+ warning (OPT_Wparentheses,
+ "suggest parentheses around assignment used as truth value");
break;
default:
@@ -3725,8 +3727,9 @@ c_do_switch_warnings (splay_tree cases, location_t switch_location,
return;
default_node = splay_tree_lookup (cases, (splay_tree_key) NULL);
- if (warn_switch_default && !default_node)
- warning (0, "%Hswitch missing default case", &switch_location);
+ if (!default_node)
+ warning (OPT_Wswitch_default, "%Hswitch missing default case",
+ &switch_location);
/* If the switch expression was an enumerated type, check that
exactly all enumeration literals are covered by the cases.
@@ -3956,7 +3959,7 @@ handle_packed_attribute (tree *node, tree name, tree ARG_UNUSED (args),
that changes what the typedef is typing. */
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -3975,7 +3978,7 @@ handle_nocommon_attribute (tree *node, tree name,
DECL_COMMON (*node) = 0;
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -3993,7 +3996,7 @@ handle_common_attribute (tree *node, tree name, tree ARG_UNUSED (args),
DECL_COMMON (*node) = 1;
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -4020,7 +4023,7 @@ handle_noreturn_attribute (tree *node, tree name, tree ARG_UNUSED (args),
TYPE_READONLY (TREE_TYPE (type)), 1));
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -4039,7 +4042,7 @@ handle_noinline_attribute (tree *node, tree name,
DECL_UNINLINABLE (*node) = 1;
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -4062,7 +4065,7 @@ handle_always_inline_attribute (tree *node, tree name,
}
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -4086,7 +4089,7 @@ handle_used_attribute (tree *pnode, tree name, tree ARG_UNUSED (args),
}
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -4112,7 +4115,7 @@ handle_unused_attribute (tree *node, tree name, tree ARG_UNUSED (args),
TREE_USED (decl) = 1;
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
}
@@ -4146,7 +4149,7 @@ handle_const_attribute (tree *node, tree name, tree ARG_UNUSED (args),
TREE_THIS_VOLATILE (TREE_TYPE (type))));
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -4190,7 +4193,7 @@ handle_transparent_union_attribute (tree *node, tree name,
DECL_TRANSPARENT_UNION (decl) = 1;
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -4218,7 +4221,7 @@ handle_constructor_attribute (tree *node, tree name,
}
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -4246,7 +4249,7 @@ handle_destructor_attribute (tree *node, tree name,
}
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -4265,7 +4268,7 @@ handle_mode_attribute (tree *node, tree name, tree args,
*no_add_attrs = true;
if (TREE_CODE (TREE_VALUE (args)) != IDENTIFIER_NODE)
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
else
{
int j;
@@ -4323,9 +4326,10 @@ handle_mode_attribute (tree *node, tree name, tree args,
case MODE_VECTOR_INT:
case MODE_VECTOR_FLOAT:
- warning (0, "specifying vector types with __attribute__ ((mode)) "
- "is deprecated");
- warning (0, "use __attribute__ ((vector_size)) instead");
+ warning (OPT_Wattributes, "specifying vector types with "
+ "__attribute__ ((mode)) is deprecated");
+ warning (OPT_Wattributes,
+ "use __attribute__ ((vector_size)) instead");
valid_mode = vector_mode_valid_p (mode);
break;
@@ -4590,7 +4594,7 @@ handle_alias_attribute (tree *node, tree name, tree args,
}
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -4614,13 +4618,14 @@ handle_visibility_attribute (tree *node, tree name, tree args,
{
if (TREE_CODE (*node) != RECORD_TYPE && TREE_CODE (*node) != UNION_TYPE)
{
- warning (0, "%qE attribute ignored on non-class types", name);
+ warning (OPT_Wattributes, "%qE attribute ignored on non-class types",
+ name);
return NULL_TREE;
}
}
else if (decl_function_context (decl) != 0 || !TREE_PUBLIC (decl))
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
return NULL_TREE;
}
@@ -4638,7 +4643,7 @@ handle_visibility_attribute (tree *node, tree name, tree args,
return NULL_TREE;
if (TREE_CODE (decl) == IDENTIFIER_NODE)
{
- warning (0, "%qE attribute ignored on types",
+ warning (OPT_Wattributes, "%qE attribute ignored on types",
name);
return NULL_TREE;
}
@@ -4712,7 +4717,7 @@ handle_tls_model_attribute (tree *node, tree name, tree args,
if (!DECL_THREAD_LOCAL (decl))
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
else
@@ -4779,7 +4784,7 @@ handle_malloc_attribute (tree *node, tree name, tree ARG_UNUSED (args),
DECL_IS_MALLOC (*node) = 1;
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -4797,7 +4802,7 @@ handle_returns_twice_attribute (tree *node, tree name, tree ARG_UNUSED (args),
DECL_IS_RETURNS_TWICE (*node) = 1;
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -4843,7 +4848,7 @@ handle_pure_attribute (tree *node, tree name, tree ARG_UNUSED (args),
/* ??? TODO: Support types. */
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -4911,9 +4916,9 @@ handle_deprecated_attribute (tree *node, tree name,
what = DECL_NAME (TYPE_NAME (type));
}
if (what)
- warning (0, "%qE attribute ignored for %qE", name, what);
+ warning (OPT_Wattributes, "%qE attribute ignored for %qE", name, what);
else
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
}
return NULL_TREE;
@@ -4937,7 +4942,7 @@ handle_vector_size_attribute (tree *node, tree name, tree args,
if (!host_integerp (size, 1))
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
return NULL_TREE;
}
@@ -5215,7 +5220,7 @@ handle_nothrow_attribute (tree *node, tree name, tree ARG_UNUSED (args),
/* ??? TODO: Support types. */
else
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -5238,7 +5243,7 @@ handle_cleanup_attribute (tree *node, tree name, tree args,
we'd be missing too much, since we do have attribute constructor. */
if (TREE_CODE (decl) != VAR_DECL || TREE_STATIC (decl))
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
return NULL_TREE;
}
@@ -5277,7 +5282,7 @@ handle_warn_unused_result_attribute (tree *node, tree name,
/* Ignore the attribute for functions not returning any value. */
if (VOID_TYPE_P (TREE_TYPE (*node)))
{
- warning (0, "%qE attribute ignored", name);
+ warning (OPT_Wattributes, "%qE attribute ignored", name);
*no_add_attrs = true;
}
@@ -5294,7 +5299,8 @@ handle_sentinel_attribute (tree *node, tree name, tree args,
if (!params)
{
- warning (0, "%qE attribute requires prototypes with named arguments", name);
+ warning (OPT_Wattributes,
+ "%qE attribute requires prototypes with named arguments", name);
*no_add_attrs = true;
}
else
@@ -5304,7 +5310,8 @@ handle_sentinel_attribute (tree *node, tree name, tree args,
if (VOID_TYPE_P (TREE_VALUE (params)))
{
- warning (0, "%qE attribute only applies to variadic functions", name);
+ warning (OPT_Wattributes,
+ "%qE attribute only applies to variadic functions", name);
*no_add_attrs = true;
}
}
@@ -5513,51 +5520,51 @@ catenate_strings (const char *lhs, const char *rhs_start, int rhs_size)
return result;
}
-/* Issue the error given by MSGID, indicating that it occurred before
+/* Issue the error given by GMSGID, indicating that it occurred before
TOKEN, which had the associated VALUE. */
void
-c_parse_error (const char *msgid, enum cpp_ttype token, tree value)
+c_parse_error (const char *gmsgid, enum cpp_ttype token, tree value)
{
#define catenate_messages(M1, M2) catenate_strings ((M1), (M2), sizeof (M2))
char *message = NULL;
if (token == CPP_EOF)
- message = catenate_messages (msgid, " at end of input");
+ message = catenate_messages (gmsgid, " at end of input");
else if (token == CPP_CHAR || token == CPP_WCHAR)
{
unsigned int val = TREE_INT_CST_LOW (value);
const char *const ell = (token == CPP_CHAR) ? "" : "L";
if (val <= UCHAR_MAX && ISGRAPH (val))
- message = catenate_messages (msgid, " before %s'%c'");
+ message = catenate_messages (gmsgid, " before %s'%c'");
else
- message = catenate_messages (msgid, " before %s'\\x%x'");
+ message = catenate_messages (gmsgid, " before %s'\\x%x'");
error (message, ell, val);
free (message);
message = NULL;
}
else if (token == CPP_STRING || token == CPP_WSTRING)
- message = catenate_messages (msgid, " before string constant");
+ message = catenate_messages (gmsgid, " before string constant");
else if (token == CPP_NUMBER)
- message = catenate_messages (msgid, " before numeric constant");
+ message = catenate_messages (gmsgid, " before numeric constant");
else if (token == CPP_NAME)
{
- message = catenate_messages (msgid, " before %qE");
+ message = catenate_messages (gmsgid, " before %qE");
error (message, value);
free (message);
message = NULL;
}
else if (token < N_TTYPES)
{
- message = catenate_messages (msgid, " before %qs token");
+ message = catenate_messages (gmsgid, " before %qs token");
error (message, cpp_type2name (token));
free (message);
message = NULL;
}
else
- error (msgid);
+ error (gmsgid);
if (message)
{
@@ -6023,4 +6030,19 @@ resolve_overloaded_builtin (tree function, tree params)
}
}
+/* Ignoring their sign, return true if two scalar types are the same. */
+bool
+same_scalar_type_ignoring_signedness (tree t1, tree t2)
+{
+ enum tree_code c1 = TREE_CODE (t1), c2 = TREE_CODE (t2);
+
+ gcc_assert ((c1 == INTEGER_TYPE || c1 == REAL_TYPE)
+ && (c2 == INTEGER_TYPE || c2 == REAL_TYPE));
+
+ /* Equality works here because c_common_signed_type uses
+ TYPE_MAIN_VARIANT. */
+ return lang_hooks.types.signed_type (t1)
+ == lang_hooks.types.signed_type (t2);
+}
+
#include "gt-c-common.h"
diff --git a/gcc/c-common.h b/gcc/c-common.h
index 962f157539e..2c594605872 100644
--- a/gcc/c-common.h
+++ b/gcc/c-common.h
@@ -31,7 +31,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
IDENTIFIER_MARKED (used by search routines).
DECL_PRETTY_FUNCTION_P (in VAR_DECL)
1: C_DECLARED_LABEL_FLAG (in LABEL_DECL)
- STMT_IS_FULL_EXPR_P (in _STMT)
STATEMENT_LIST_STMT_EXPR (in STATEMENT_LIST)
2: unused
3: STATEMENT_LIST_HAS_LABEL (in STATEMENT_LIST)
@@ -658,6 +657,7 @@ extern tree convert_and_check (tree, tree);
extern void overflow_warning (tree);
extern void unsigned_conversion_warning (tree, tree);
extern bool c_determine_visibility (tree);
+extern bool same_scalar_type_ignoring_signedness (tree, tree);
#define c_sizeof(T) c_sizeof_or_alignof_type (T, true, 1)
#define c_alignof(T) c_sizeof_or_alignof_type (T, false, 1)
@@ -704,12 +704,6 @@ extern void finish_file (void);
/* These macros provide convenient access to the various _STMT nodes. */
-/* Nonzero if this statement should be considered a full-expression,
- i.e., if temporaries created during this statement should have
- their destructors run at the end of this statement. (In C, this
- will always be false, since there are no destructors.) */
-#define STMT_IS_FULL_EXPR_P(NODE) TREE_LANG_FLAG_1 ((NODE))
-
/* Nonzero if a given STATEMENT_LIST represents the outermost binding
if a statement expression. */
#define STATEMENT_LIST_STMT_EXPR(NODE) \
@@ -735,7 +729,6 @@ enum c_tree_code {
#undef DEFTREECODE
-extern int stmts_are_full_exprs_p (void);
extern int anon_aggr_type_p (tree);
/* For a VAR_DECL that is an anonymous union, these are the various
@@ -877,7 +870,9 @@ extern tree objc_is_class_name (tree);
extern tree objc_is_object_ptr (tree);
extern void objc_check_decl (tree);
extern int objc_is_reserved_word (tree);
-extern int objc_comptypes (tree, tree, int);
+extern bool objc_compare_types (tree, tree, int, tree);
+extern void objc_volatilize_decl (tree);
+extern bool objc_type_quals_match (tree, tree);
extern tree objc_rewrite_function_call (tree, tree);
extern tree objc_message_selector (void);
extern tree objc_lookup_ivar (tree, tree);
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index b71838755f8..27d03eb8c3b 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -418,6 +418,31 @@ static tree grokdeclarator (const struct c_declarator *,
static tree grokparms (struct c_arg_info *, bool);
static void layout_array_type (tree);
+/* T is a statement. Add it to the statement-tree. This is the
+ C/ObjC version--C++ has a slightly different version of this
+ function. */
+
+tree
+add_stmt (tree t)
+{
+ enum tree_code code = TREE_CODE (t);
+
+ if (EXPR_P (t) && code != LABEL_EXPR)
+ {
+ if (!EXPR_HAS_LOCATION (t))
+ SET_EXPR_LOCATION (t, input_location);
+ }
+
+ if (code == LABEL_EXPR || code == CASE_LABEL_EXPR)
+ STATEMENT_LIST_HAS_LABEL (cur_stmt_list) = 1;
+
+ /* Add T to the statement-tree. Non-side-effect statements need to be
+ recorded during statement expressions. */
+ append_to_statement_list_force (t, &cur_stmt_list);
+
+ return t;
+}
+
/* States indicating how grokdeclarator() should handle declspecs marked
with __attribute__((deprecated)). An object declared as
__attribute__((deprecated)) suppresses warnings of uses of other
@@ -566,25 +591,7 @@ objc_mark_locals_volatile (void *enclosing_blk)
scope = scope->outer)
{
for (b = scope->bindings; b; b = b->prev)
- {
- tree decl = b->decl;
-
- /* Do not mess with variables that are 'static' or (already)
- 'volatile'. */
- if (!TREE_THIS_VOLATILE (decl) && !TREE_STATIC (decl)
- && (TREE_CODE (decl) == VAR_DECL
- || TREE_CODE (decl) == PARM_DECL))
- {
- TREE_TYPE (decl)
- = build_qualified_type (TREE_TYPE (decl),
- (TYPE_QUALS (TREE_TYPE (decl))
- | TYPE_QUAL_VOLATILE));
- TREE_THIS_VOLATILE (decl) = 1;
- TREE_SIDE_EFFECTS (decl) = 1;
- DECL_REGISTER (decl) = 0;
- C_DECL_REGISTER (decl) = 0;
- }
- }
+ objc_volatilize_decl (b->decl);
/* Do not climb up past the current function. */
if (scope->function_body)
@@ -1124,11 +1131,11 @@ locate_old_decl (tree decl, void (*diag)(const char *, ...))
if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
;
else if (DECL_INITIAL (decl))
- diag (N_("%Jprevious definition of %qD was here"), decl, decl);
+ diag (G_("%Jprevious definition of %qD was here"), decl, decl);
else if (C_DECL_IMPLICIT (decl))
- diag (N_("%Jprevious implicit declaration of %qD was here"), decl, decl);
+ diag (G_("%Jprevious implicit declaration of %qD was here"), decl, decl);
else
- diag (N_("%Jprevious declaration of %qD was here"), decl, decl);
+ diag (G_("%Jprevious declaration of %qD was here"), decl, decl);
}
/* Subroutine of duplicate_decls. Compare NEWDECL to OLDDECL.
@@ -1172,9 +1179,9 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
else if (TREE_PUBLIC (newdecl))
warning (0, "%Jbuilt-in function %qD declared as non-function",
newdecl, newdecl);
- else if (warn_shadow)
- warning (0, "%Jdeclaration of %qD shadows a built-in function",
- newdecl, newdecl);
+ else
+ warning (OPT_Wshadow, "%Jdeclaration of %qD shadows "
+ "a built-in function", newdecl, newdecl);
return false;
}
@@ -1288,9 +1295,8 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
|| (DECL_INITIAL (newdecl)
&& !TYPE_ARG_TYPES (TREE_TYPE (newdecl)))))
{
- if (warn_shadow)
- warning (0, "%Jdeclaration of %qD shadows a built-in function",
- newdecl, newdecl);
+ warning (OPT_Wshadow, "%Jdeclaration of %qD shadows "
+ "a built-in function", newdecl, newdecl);
/* Discard the old built-in function. */
return false;
}
@@ -1499,15 +1505,15 @@ diagnose_mismatched_decls (tree newdecl, tree olddecl,
if (DECL_DECLARED_INLINE_P (newdecl)
&& lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl)))
{
- warning (0, "%Jinline declaration of %qD follows "
+ warning (OPT_Wattributes, "%Jinline declaration of %qD follows "
"declaration with attribute noinline", newdecl, newdecl);
warned = true;
}
else if (DECL_DECLARED_INLINE_P (olddecl)
&& lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl)))
{
- warning (0, "%Jdeclaration of %qD with attribute noinline follows "
- "inline declaration ", newdecl, newdecl);
+ warning (OPT_Wattributes, "%Jdeclaration of %qD with attribute "
+ "noinline follows inline declaration ", newdecl, newdecl);
warned = true;
}
@@ -2286,7 +2292,7 @@ implicit_decl_warning (tree id, tree olddecl)
default: gcc_unreachable ();
}
- diag (N_("implicit declaration of function %qE"), id);
+ diag (G_("implicit declaration of function %qE"), id);
if (olddecl)
locate_old_decl (olddecl, diag);
}
@@ -2561,9 +2567,9 @@ define_label (location_t location, tree name)
/*invisible=*/false, /*nested=*/false);
}
- if (warn_traditional && !in_system_header && lookup_name (name))
- warning (0, "%Htraditional C lacks a separate namespace for labels, "
- "identifier %qE conflicts", &location, name);
+ if (!in_system_header && lookup_name (name))
+ warning (OPT_Wtraditional, "%Htraditional C lacks a separate namespace "
+ "for labels, identifier %qE conflicts", &location, name);
nlist_se = XOBNEW (&parser_obstack, struct c_label_list);
nlist_se->next = label_context_stack_se->labels_def;
@@ -3217,7 +3223,8 @@ start_decl (struct c_declarator *declarator, struct c_declspecs *declspecs,
&& DECL_DECLARED_INLINE_P (decl)
&& DECL_UNINLINABLE (decl)
&& lookup_attribute ("noinline", DECL_ATTRIBUTES (decl)))
- warning (0, "%Jinline function %qD given attribute noinline", decl, decl);
+ warning (OPT_Wattributes, "%Jinline function %qD given attribute noinline",
+ decl, decl);
/* Add this decl to the current scope.
TEM may equal DECL or it may be a previous decl of the same name. */
@@ -4289,8 +4296,9 @@ grokdeclarator (const struct c_declarator *declarator,
them for noreturn functions. */
if (VOID_TYPE_P (type) && really_funcdef)
pedwarn ("function definition has qualified void return type");
- else if (warn_return_type)
- warning (0, "type qualifiers ignored on function return type");
+ else
+ warning (OPT_Wreturn_type,
+ "type qualifiers ignored on function return type");
type = c_build_qualified_type (type, type_quals);
}
@@ -4451,7 +4459,8 @@ grokdeclarator (const struct c_declarator *declarator,
/* We don't yet implement attributes in this context. */
if (array_ptr_attrs != NULL_TREE)
- warning (0, "attributes in parameter array declarator ignored");
+ warning (OPT_Wattributes,
+ "attributes in parameter array declarator ignored");
size_varies = 0;
}
@@ -5793,14 +5802,19 @@ start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
/* If the declarator is not suitable for a function definition,
cause a syntax error. */
if (decl1 == 0)
- return 0;
+ {
+ label_context_stack_se = label_context_stack_se->next;
+ label_context_stack_vm = label_context_stack_vm->next;
+ return 0;
+ }
decl_attributes (&decl1, attributes, 0);
if (DECL_DECLARED_INLINE_P (decl1)
&& DECL_UNINLINABLE (decl1)
&& lookup_attribute ("noinline", DECL_ATTRIBUTES (decl1)))
- warning (0, "%Jinline function %qD given attribute noinline", decl1, decl1);
+ warning (OPT_Wattributes, "%Jinline function %qD given attribute noinline",
+ decl1, decl1);
announce_function (decl1);
@@ -6097,7 +6111,8 @@ store_parm_decls_oldstyle (tree fndecl, const struct c_arg_info *arg_info)
#endif
if (!in_system_header)
- warning (OPT_Wold_style_definition, "%Jold-style function definition", fndecl);
+ warning (OPT_Wold_style_definition, "%Jold-style function definition",
+ fndecl);
/* Match each formal parameter name with its declaration. Save each
decl in the appropriate TREE_PURPOSE slot of the parmids chain. */
@@ -6731,16 +6746,6 @@ c_dup_lang_specific_decl (tree decl)
functions are not called from anywhere in the C front end, but as
these changes continue, that will change. */
-/* 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. */
-
-int
-stmts_are_full_exprs_p (void)
-{
- return 0;
-}
-
/* Returns the stmt_tree (if any) to which statements are currently
being added. If there is no active statement-tree, NULL is
returned. */
diff --git a/gcc/c-errors.c b/gcc/c-errors.c
index fa71b8cfa97..ccdbf7ef7cc 100644
--- a/gcc/c-errors.c
+++ b/gcc/c-errors.c
@@ -32,13 +32,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
/* Issue an ISO C99 pedantic warning MSGID. */
void
-pedwarn_c99 (const char *msgid, ...)
+pedwarn_c99 (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location,
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location,
flag_isoc99 ? pedantic_error_kind () : DK_WARNING);
report_diagnostic (&diagnostic);
va_end (ap);
@@ -50,13 +50,13 @@ pedwarn_c99 (const char *msgid, ...)
(There is no flag_c90.) */
void
-pedwarn_c90 (const char *msgid, ...)
+pedwarn_c90 (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location,
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location,
flag_isoc99 ? DK_WARNING : pedantic_error_kind ());
report_diagnostic (&diagnostic);
va_end (ap);
diff --git a/gcc/c-format.c b/gcc/c-format.c
index daa071e61ab..f27d6d03a11 100644
--- a/gcc/c-format.c
+++ b/gcc/c-format.c
@@ -833,7 +833,8 @@ check_function_format (tree attrs, tree params)
break;
}
if (args != 0)
- warning (0, "function might be possible candidate for %qs format attribute",
+ warning (OPT_Wattributes, "function might be possible "
+ "candidate for %qs format attribute",
format_types[info.format_type].name);
}
}
@@ -1140,8 +1141,8 @@ check_format_info (function_format_info *info, tree params)
{
/* For strftime-like formats, warn for not checking the format
string; but there are no arguments to check. */
- if (warn_format_nonliteral)
- warning (0, "format not a string literal, format string not checked");
+ warning (OPT_Wformat_nonliteral,
+ "format not a string literal, format string not checked");
}
else if (info->first_arg_num != 0)
{
@@ -1154,10 +1155,15 @@ check_format_info (function_format_info *info, tree params)
params = TREE_CHAIN (params);
++arg_num;
}
- if (params == 0 && (warn_format_nonliteral || warn_format_security))
- warning (0, "format not a string literal and no format arguments");
- else if (warn_format_nonliteral)
- warning (0, "format not a string literal, argument types not checked");
+ if (params == 0 && warn_format_security)
+ warning (OPT_Wformat_security,
+ "format not a string literal and no format arguments");
+ else if (params == 0 && warn_format_nonliteral)
+ warning (OPT_Wformat_nonliteral,
+ "format not a string literal and no format arguments");
+ else
+ warning (OPT_Wformat_nonliteral,
+ "format not a string literal, argument types not checked");
}
}
diff --git a/gcc/c-gimplify.c b/gcc/c-gimplify.c
index a82c4a6562b..f7e87bf489e 100644
--- a/gcc/c-gimplify.c
+++ b/gcc/c-gimplify.c
@@ -29,7 +29,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "coretypes.h"
#include "tm.h"
#include "tree.h"
-#include "errors.h"
#include "varray.h"
#include "c-tree.h"
#include "c-common.h"
diff --git a/gcc/c-lex.c b/gcc/c-lex.c
index 990d2bee455..3282dd12f66 100644
--- a/gcc/c-lex.c
+++ b/gcc/c-lex.c
@@ -599,8 +599,9 @@ interpret_integer (const cpp_token *token, unsigned int flags)
itk = itk_u;
warning (0, "this decimal constant is unsigned only in ISO C90");
}
- else if (warn_traditional)
- warning (0, "this decimal constant would be unsigned in ISO C90");
+ else
+ warning (OPT_Wtraditional,
+ "this decimal constant would be unsigned in ISO C90");
}
}
}
@@ -761,10 +762,11 @@ lex_string (const cpp_token *tok, tree *valp, bool objc_string)
/* We have read one more token than we want. */
_cpp_backup_tokens (parse_in, 1);
if (concats)
- strs = (cpp_string *) obstack_finish (&str_ob);
+ strs = XOBFINISH (&str_ob, cpp_string *);
- if (concats && !objc_string && warn_traditional && !in_system_header)
- warning (0, "traditional C rejects string constant concatenation");
+ if (concats && !objc_string && !in_system_header)
+ warning (OPT_Wtraditional,
+ "traditional C rejects string constant concatenation");
if ((c_lex_string_translate
? cpp_interpret_string : cpp_interpret_string_notranslate)
diff --git a/gcc/c-objc-common.c b/gcc/c-objc-common.c
index 0dc8f55ddfc..95a0a3a7130 100644
--- a/gcc/c-objc-common.c
+++ b/gcc/c-objc-common.c
@@ -171,7 +171,7 @@ c_tree_printer (pretty_printer *pp, text_info *text)
switch (*text->format_spec)
{
case 'D':
- if (DECL_DEBUG_EXPR (t) && DECL_DEBUG_EXPR_IS_FROM (t))
+ if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t))
{
t = DECL_DEBUG_EXPR (t);
if (!DECL_P (t))
diff --git a/gcc/c-opts.c b/gcc/c-opts.c
index 62fec1a124a..a79933359fe 100644
--- a/gcc/c-opts.c
+++ b/gcc/c-opts.c
@@ -979,18 +979,21 @@ c_common_post_options (const char **pfilename)
/* Special format checking options don't work without -Wformat; warn if
they are used. */
- if (warn_format_y2k && !warn_format)
- warning (0, "-Wformat-y2k ignored without -Wformat");
- if (warn_format_extra_args && !warn_format)
- warning (0, "-Wformat-extra-args ignored without -Wformat");
- if (warn_format_zero_length && !warn_format)
- warning (0, "-Wformat-zero-length ignored without -Wformat");
- if (warn_format_nonliteral && !warn_format)
- warning (0, "-Wformat-nonliteral ignored without -Wformat");
- if (warn_format_security && !warn_format)
- warning (0, "-Wformat-security ignored without -Wformat");
- if (warn_missing_format_attribute && !warn_format)
- warning (0, "-Wmissing-format-attribute ignored without -Wformat");
+ if (!warn_format)
+ {
+ warning (OPT_Wformat_y2k,
+ "-Wformat-y2k ignored without -Wformat");
+ warning (OPT_Wformat_extra_args,
+ "-Wformat-extra-args ignored without -Wformat");
+ warning (OPT_Wformat_zero_length,
+ "-Wformat-zero-length ignored without -Wformat");
+ warning (OPT_Wformat_nonliteral,
+ "-Wformat-nonliteral ignored without -Wformat");
+ warning (OPT_Wformat_security,
+ "-Wformat-security ignored without -Wformat");
+ warning (OPT_Wmissing_format_attribute,
+ "-Wmissing-format-attribute ignored without -Wformat");
+ }
/* C99 requires special handling of complex multiplication and division;
-ffast-math and -fcx-limited-range are handled in process_options. */
diff --git a/gcc/c-parser.c b/gcc/c-parser.c
index 96bab469f41..88b89e2804f 100644
--- a/gcc/c-parser.c
+++ b/gcc/c-parser.c
@@ -635,18 +635,18 @@ c_parser_new (void)
used. */
static void
-c_parser_error (c_parser *parser, const char *msgid)
+c_parser_error (c_parser *parser, const char *gmsgid)
{
c_token *token = c_parser_peek_token (parser);
if (parser->error)
return;
parser->error = true;
- if (!msgid)
+ if (!gmsgid)
return;
/* This diagnostic makes more sense if it is tagged to the line of
the token we just peeked at. */
c_parser_set_source_position_from_token (token);
- c_parse_error (msgid,
+ c_parse_error (gmsgid,
/* Because c_parse_error does not understand
CPP_KEYWORD, keywords are treated like
identifiers. */
@@ -904,7 +904,7 @@ static void c_parser_while_statement (c_parser *);
static void c_parser_do_statement (c_parser *);
static void c_parser_for_statement (c_parser *);
static tree c_parser_asm_statement (c_parser *);
-static tree c_parser_asm_operands (c_parser *);
+static tree c_parser_asm_operands (c_parser *, bool);
static tree c_parser_asm_clobbers (c_parser *);
static struct c_expr c_parser_expr_no_commas (c_parser *, struct c_expr *);
static struct c_expr c_parser_conditional_expression (c_parser *,
@@ -920,7 +920,8 @@ static struct c_expr c_parser_postfix_expression_after_paren_type (c_parser *,
static struct c_expr c_parser_postfix_expression_after_primary (c_parser *,
struct c_expr);
static struct c_expr c_parser_expression (c_parser *);
-static tree c_parser_expr_list (c_parser *);
+static struct c_expr c_parser_expression_conv (c_parser *);
+static tree c_parser_expr_list (c_parser *, bool);
/* These Objective-C parser functions are only ever called when
compiling Objective-C. */
@@ -2145,7 +2146,7 @@ c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
which is resolved in the direction of treating it as a typedef
name. If a close parenthesis follows, it is also an empty
parameter list, as the syntax does not permit empty abstract
- declarators. Otherwise, it is a parenthesised declarator (in
+ declarators. Otherwise, it is a parenthesized declarator (in
which case the analysis may be repeated inside it, recursively).
??? There is an ambiguity in a parameter declaration "int
@@ -2155,7 +2156,7 @@ c_parser_direct_declarator (c_parser *parser, bool type_seen_p, c_dtr_syn kind,
documenting. At present we follow an accident of the old
parser's implementation, whereby the first parameter must have
some declaration specifiers other than just attributes. Thus as
- a parameter declaration it is treated as a parenthesised
+ a parameter declaration it is treated as a parenthesized
parameter named x, and as an abstract declarator it is
rejected.
@@ -2355,12 +2356,13 @@ c_parser_parms_declarator (c_parser *parser, bool id_list_ok, tree attrs)
&& c_parser_next_token_is (parser, CPP_NAME)
&& c_parser_peek_token (parser)->id_kind == C_ID_ID)
{
- tree list = NULL_TREE;
+ tree list = NULL_TREE, *nextp = &list;
while (c_parser_next_token_is (parser, CPP_NAME)
&& c_parser_peek_token (parser)->id_kind == C_ID_ID)
{
- list = chainon (list, build_tree_list (NULL_TREE,
- c_parser_peek_token (parser)->value));
+ *nextp = build_tree_list (NULL_TREE,
+ c_parser_peek_token (parser)->value);
+ nextp = & TREE_CHAIN (*nextp);
c_parser_consume_token (parser);
if (c_parser_next_token_is_not (parser, CPP_COMMA))
break;
@@ -2748,7 +2750,7 @@ c_parser_attributes (c_parser *parser)
{
c_parser_consume_token (parser);
attr_args = tree_cons (NULL_TREE, arg1,
- c_parser_expr_list (parser));
+ c_parser_expr_list (parser, false));
}
}
else
@@ -2756,7 +2758,7 @@ c_parser_attributes (c_parser *parser)
if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
attr_args = NULL_TREE;
else
- attr_args = c_parser_expr_list (parser);
+ attr_args = c_parser_expr_list (parser, false);
}
attr = build_tree_list (attr_name, attr_args);
if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
@@ -2873,7 +2875,14 @@ c_parser_initializer (c_parser *parser)
if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
return c_parser_braced_init (parser, NULL_TREE, false);
else
- return c_parser_expr_no_commas (parser, NULL);
+ {
+ struct c_expr ret;
+ ret = c_parser_expr_no_commas (parser, NULL);
+ if (TREE_CODE (ret.value) != STRING_CST
+ && TREE_CODE (ret.value) != COMPOUND_LITERAL_EXPR)
+ ret.value = default_function_array_conversion (ret.value);
+ return ret;
+ }
}
/* Parse a braced initializer list. TYPE is the type specified for a
@@ -3030,6 +3039,7 @@ c_parser_initelt (c_parser *parser)
tree next;
c_parser_consume_token (parser);
next = c_parser_expr_no_commas (parser, NULL).value;
+ next = default_function_array_conversion (next);
rec = build_compound_expr (rec, next);
}
parse_message_args:
@@ -3115,7 +3125,13 @@ c_parser_initval (c_parser *parser, struct c_expr *after)
if (c_parser_next_token_is (parser, CPP_OPEN_BRACE) && !after)
init = c_parser_braced_init (parser, NULL_TREE, true);
else
- init = c_parser_expr_no_commas (parser, after);
+ {
+ init = c_parser_expr_no_commas (parser, after);
+ if (init.value != NULL_TREE
+ && TREE_CODE (init.value) != STRING_CST
+ && TREE_CODE (init.value) != COMPOUND_LITERAL_EXPR)
+ init.value = default_function_array_conversion (init.value);
+ }
process_init_element (init);
}
@@ -3497,7 +3513,7 @@ c_parser_statement_after_labels (c_parser *parser)
}
else
{
- stmt = c_finish_return (c_parser_expression (parser).value);
+ stmt = c_finish_return (c_parser_expression_conv (parser).value);
goto expect_semicolon;
}
break;
@@ -3545,7 +3561,7 @@ c_parser_statement_after_labels (c_parser *parser)
break;
default:
expr_stmt:
- stmt = c_finish_expr_stmt (c_parser_expression (parser).value);
+ stmt = c_finish_expr_stmt (c_parser_expression_conv (parser).value);
expect_semicolon:
c_parser_skip_until_found (parser, CPP_SEMICOLON, "expected %<;%>");
break;
@@ -3578,7 +3594,7 @@ c_parser_paren_condition (c_parser *parser)
return error_mark_node;
loc = c_parser_peek_token (parser)->location;
cond = c_objc_common_truthvalue_conversion
- (c_parser_expression (parser).value);
+ (c_parser_expression_conv (parser).value);
if (EXPR_P (cond))
SET_EXPR_LOCATION (cond, loc);
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
@@ -3813,7 +3829,7 @@ c_parser_for_statement (c_parser *parser)
}
else
{
- tree ocond = c_parser_expression (parser).value;
+ tree ocond = c_parser_expression_conv (parser).value;
cond = c_objc_common_truthvalue_conversion (ocond);
if (EXPR_P (cond))
SET_EXPR_LOCATION (cond, loc);
@@ -3909,7 +3925,7 @@ c_parser_asm_statement (c_parser *parser)
|| c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
outputs = NULL_TREE;
else
- outputs = c_parser_asm_operands (parser);
+ outputs = c_parser_asm_operands (parser, false);
if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
{
inputs = NULL_TREE;
@@ -3927,7 +3943,7 @@ c_parser_asm_statement (c_parser *parser)
|| c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
inputs = NULL_TREE;
else
- inputs = c_parser_asm_operands (parser);
+ inputs = c_parser_asm_operands (parser, true);
if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
{
clobbers = NULL_TREE;
@@ -3955,7 +3971,9 @@ c_parser_asm_statement (c_parser *parser)
return ret;
}
-/* Parse asm operands, a GNU extension.
+/* Parse asm operands, a GNU extension. If CONVERT_P (for inputs but
+ not outputs), apply the default conversion of functions and arrays
+ to pointers.
asm-operands:
asm-operand
@@ -3967,7 +3985,7 @@ c_parser_asm_statement (c_parser *parser)
*/
static tree
-c_parser_asm_operands (c_parser *parser)
+c_parser_asm_operands (c_parser *parser, bool convert_p)
{
tree list = NULL_TREE;
while (true)
@@ -4004,6 +4022,8 @@ c_parser_asm_operands (c_parser *parser)
return NULL_TREE;
}
expr = c_parser_expression (parser).value;
+ if (convert_p)
+ expr = default_function_array_conversion (expr);
c_lex_string_translate = 0;
if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
{
@@ -4109,6 +4129,7 @@ c_parser_expr_no_commas (c_parser *parser, struct c_expr *after)
}
c_parser_consume_token (parser);
rhs = c_parser_expr_no_commas (parser, NULL);
+ rhs.value = default_function_array_conversion (rhs.value);
ret.value = build_modify_expr (lhs.value, code, rhs.value);
if (code == NOP_EXPR)
ret.original_code = MODIFY_EXPR;
@@ -4142,6 +4163,7 @@ c_parser_conditional_expression (c_parser *parser, struct c_expr *after)
cond = c_parser_binary_expression (parser, after);
if (c_parser_next_token_is_not (parser, CPP_QUERY))
return cond;
+ cond.value = default_function_array_conversion (cond.value);
c_parser_consume_token (parser);
if (c_parser_next_token_is (parser, CPP_COLON))
{
@@ -4158,7 +4180,7 @@ c_parser_conditional_expression (c_parser *parser, struct c_expr *after)
= c_objc_common_truthvalue_conversion
(default_conversion (cond.value));
skip_evaluation += cond.value == truthvalue_false_node;
- exp1 = c_parser_expression (parser);
+ exp1 = c_parser_expression_conv (parser);
skip_evaluation += ((cond.value == truthvalue_true_node)
- (cond.value == truthvalue_false_node));
}
@@ -4170,6 +4192,7 @@ c_parser_conditional_expression (c_parser *parser, struct c_expr *after)
return ret;
}
exp2 = c_parser_conditional_expression (parser, NULL);
+ exp2.value = default_function_array_conversion (exp2.value);
skip_evaluation -= cond.value == truthvalue_true_node;
ret.value = build_conditional_expr (cond.value, exp1.value, exp2.value);
ret.original_code = ERROR_MARK;
@@ -4293,6 +4316,10 @@ c_parser_binary_expression (c_parser *parser, struct c_expr *after)
default: \
break; \
} \
+ stack[sp - 1].expr.value \
+ = default_function_array_conversion (stack[sp - 1].expr.value); \
+ stack[sp].expr.value \
+ = default_function_array_conversion (stack[sp].expr.value); \
stack[sp - 1].expr = parser_build_binary_op (stack[sp].op, \
stack[sp - 1].expr, \
stack[sp].expr); \
@@ -4393,11 +4420,15 @@ c_parser_binary_expression (c_parser *parser, struct c_expr *after)
switch (ocode)
{
case TRUTH_ANDIF_EXPR:
+ stack[sp].expr.value
+ = default_function_array_conversion (stack[sp].expr.value);
stack[sp].expr.value = c_objc_common_truthvalue_conversion
(default_conversion (stack[sp].expr.value));
skip_evaluation += stack[sp].expr.value == truthvalue_false_node;
break;
case TRUTH_ORIF_EXPR:
+ stack[sp].expr.value
+ = default_function_array_conversion (stack[sp].expr.value);
stack[sp].expr.value = c_objc_common_truthvalue_conversion
(default_conversion (stack[sp].expr.value));
skip_evaluation += stack[sp].expr.value == truthvalue_true_node;
@@ -4455,6 +4486,7 @@ c_parser_cast_expression (c_parser *parser, struct c_expr *after)
return c_parser_postfix_expression_after_paren_type (parser,
type_name);
expr = c_parser_cast_expression (parser, NULL).value;
+ expr = default_function_array_conversion (expr);
ret.value = c_cast_expr (type_name, expr);
ret.original_code = ERROR_MARK;
return ret;
@@ -4494,46 +4526,53 @@ static struct c_expr
c_parser_unary_expression (c_parser *parser)
{
int ext;
- struct c_expr ret;
+ struct c_expr ret, op;
switch (c_parser_peek_token (parser)->type)
{
case CPP_PLUS_PLUS:
c_parser_consume_token (parser);
- return parser_build_unary_op (PREINCREMENT_EXPR,
- c_parser_cast_expression (parser, NULL));
+ op = c_parser_cast_expression (parser, NULL);
+ op.value = default_function_array_conversion (op.value);
+ return parser_build_unary_op (PREINCREMENT_EXPR, op);
case CPP_MINUS_MINUS:
c_parser_consume_token (parser);
- return parser_build_unary_op (PREDECREMENT_EXPR,
- c_parser_cast_expression (parser, NULL));
+ op = c_parser_cast_expression (parser, NULL);
+ op.value = default_function_array_conversion (op.value);
+ return parser_build_unary_op (PREDECREMENT_EXPR, op);
case CPP_AND:
c_parser_consume_token (parser);
return parser_build_unary_op (ADDR_EXPR,
c_parser_cast_expression (parser, NULL));
case CPP_MULT:
c_parser_consume_token (parser);
- ret.value
- = build_indirect_ref (c_parser_cast_expression (parser, NULL).value,
- "unary *");
+ op = c_parser_cast_expression (parser, NULL);
+ op.value = default_function_array_conversion (op.value);
+ ret.value = build_indirect_ref (op.value, "unary *");
ret.original_code = ERROR_MARK;
return ret;
case CPP_PLUS:
c_parser_consume_token (parser);
- if (!c_dialect_objc () && warn_traditional && !in_system_header)
- warning (0, "traditional C rejects the unary plus operator");
- return parser_build_unary_op (CONVERT_EXPR,
- c_parser_cast_expression (parser, NULL));
+ if (!c_dialect_objc () && !in_system_header)
+ warning (OPT_Wtraditional,
+ "traditional C rejects the unary plus operator");
+ op = c_parser_cast_expression (parser, NULL);
+ op.value = default_function_array_conversion (op.value);
+ return parser_build_unary_op (CONVERT_EXPR, op);
case CPP_MINUS:
c_parser_consume_token (parser);
- return parser_build_unary_op (NEGATE_EXPR,
- c_parser_cast_expression (parser, NULL));
+ op = c_parser_cast_expression (parser, NULL);
+ op.value = default_function_array_conversion (op.value);
+ return parser_build_unary_op (NEGATE_EXPR, op);
case CPP_COMPL:
c_parser_consume_token (parser);
- return parser_build_unary_op (BIT_NOT_EXPR,
- c_parser_cast_expression (parser, NULL));
+ op = c_parser_cast_expression (parser, NULL);
+ op.value = default_function_array_conversion (op.value);
+ return parser_build_unary_op (BIT_NOT_EXPR, op);
case CPP_NOT:
c_parser_consume_token (parser);
- return parser_build_unary_op (TRUTH_NOT_EXPR,
- c_parser_cast_expression (parser, NULL));
+ op = c_parser_cast_expression (parser, NULL);
+ op.value = default_function_array_conversion (op.value);
+ return parser_build_unary_op (TRUTH_NOT_EXPR, op);
case CPP_AND_AND:
/* Refer to the address of a label as a pointer. */
c_parser_consume_token (parser);
@@ -4565,14 +4604,14 @@ c_parser_unary_expression (c_parser *parser)
return ret;
case RID_REALPART:
c_parser_consume_token (parser);
- return parser_build_unary_op (REALPART_EXPR,
- c_parser_cast_expression (parser,
- NULL));
+ op = c_parser_cast_expression (parser, NULL);
+ op.value = default_function_array_conversion (op.value);
+ return parser_build_unary_op (REALPART_EXPR, op);
case RID_IMAGPART:
c_parser_consume_token (parser);
- return parser_build_unary_op (IMAGPART_EXPR,
- c_parser_cast_expression (parser,
- NULL));
+ op = c_parser_cast_expression (parser, NULL);
+ op.value = default_function_array_conversion (op.value);
+ return parser_build_unary_op (IMAGPART_EXPR, op);
default:
return c_parser_postfix_expression (parser);
}
@@ -5202,7 +5241,7 @@ c_parser_postfix_expression_after_primary (c_parser *parser,
if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
exprlist = NULL_TREE;
else
- exprlist = c_parser_expr_list (parser);
+ exprlist = c_parser_expr_list (parser, true);
c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
"expected %<)%>");
expr.value = build_function_call (expr.value, exprlist);
@@ -5211,6 +5250,7 @@ c_parser_postfix_expression_after_primary (c_parser *parser,
case CPP_DOT:
/* Structure element reference. */
c_parser_consume_token (parser);
+ expr.value = default_function_array_conversion (expr.value);
if (c_parser_next_token_is (parser, CPP_NAME))
ident = c_parser_peek_token (parser)->value;
else
@@ -5227,6 +5267,7 @@ c_parser_postfix_expression_after_primary (c_parser *parser,
case CPP_DEREF:
/* Structure element reference. */
c_parser_consume_token (parser);
+ expr.value = default_function_array_conversion (expr.value);
if (c_parser_next_token_is (parser, CPP_NAME))
ident = c_parser_peek_token (parser)->value;
else
@@ -5244,12 +5285,14 @@ c_parser_postfix_expression_after_primary (c_parser *parser,
case CPP_PLUS_PLUS:
/* Postincrement. */
c_parser_consume_token (parser);
+ expr.value = default_function_array_conversion (expr.value);
expr.value = build_unary_op (POSTINCREMENT_EXPR, expr.value, 0);
expr.original_code = ERROR_MARK;
break;
case CPP_MINUS_MINUS:
/* Postdecrement. */
c_parser_consume_token (parser);
+ expr.value = default_function_array_conversion (expr.value);
expr.value = build_unary_op (POSTDECREMENT_EXPR, expr.value, 0);
expr.original_code = ERROR_MARK;
break;
@@ -5276,13 +5319,27 @@ c_parser_expression (c_parser *parser)
struct c_expr next;
c_parser_consume_token (parser);
next = c_parser_expr_no_commas (parser, NULL);
+ next.value = default_function_array_conversion (next.value);
expr.value = build_compound_expr (expr.value, next.value);
expr.original_code = COMPOUND_EXPR;
}
return expr;
}
-/* Parse a non-empty list of expressions.
+/* Parse an expression and convert functions or arrays to
+ pointers. */
+
+static struct c_expr
+c_parser_expression_conv (c_parser *parser)
+{
+ struct c_expr expr;
+ expr = c_parser_expression (parser);
+ expr.value = default_function_array_conversion (expr.value);
+ return expr;
+}
+
+/* Parse a non-empty list of expressions. If CONVERT_P, convert
+ functions and arrays to pointers.
nonempty-expr-list:
assignment-expression
@@ -5290,17 +5347,21 @@ c_parser_expression (c_parser *parser)
*/
static tree
-c_parser_expr_list (c_parser *parser)
+c_parser_expr_list (c_parser *parser, bool convert_p)
{
struct c_expr expr;
- tree ret;
+ tree ret, cur;
expr = c_parser_expr_no_commas (parser, NULL);
- ret = build_tree_list (NULL_TREE, expr.value);
+ if (convert_p)
+ expr.value = default_function_array_conversion (expr.value);
+ ret = cur = build_tree_list (NULL_TREE, expr.value);
while (c_parser_next_token_is (parser, CPP_COMMA))
{
c_parser_consume_token (parser);
expr = c_parser_expr_no_commas (parser, NULL);
- ret = chainon (ret, build_tree_list (NULL_TREE, expr.value));
+ if (convert_p)
+ expr.value = default_function_array_conversion (expr.value);
+ cur = TREE_CHAIN (cur) = build_tree_list (NULL_TREE, expr.value);
}
return ret;
}
@@ -5324,7 +5385,7 @@ c_parser_expr_list (c_parser *parser)
"@interface identifier (" must start "@interface identifier (
identifier ) ...": objc-methodprotolist in the first production may
- not start with a parenthesised identifier as a declarator of a data
+ not start with a parenthesized identifier as a declarator of a data
definition with no declaration specifiers if the objc-superclass,
objc-protocol-refs and objc-class-instance-variables are omitted. */
@@ -6160,7 +6221,7 @@ c_parser_objc_message_args (c_parser *parser)
static tree
c_parser_objc_keywordexpr (c_parser *parser)
{
- tree list = c_parser_expr_list (parser);
+ tree list = c_parser_expr_list (parser, true);
if (TREE_CHAIN (list) == NULL_TREE)
{
/* Just return the expression, remove a level of
diff --git a/gcc/c-pch.c b/gcc/c-pch.c
index a1513418578..39cf42c1082 100644
--- a/gcc/c-pch.c
+++ b/gcc/c-pch.c
@@ -1,5 +1,5 @@
/* Precompiled header implementation for the C languages.
- Copyright (C) 2000, 2002, 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
This file is part of GCC.
diff --git a/gcc/c-pragma.c b/gcc/c-pragma.c
index be50856a442..408ecdd1e3c 100644
--- a/gcc/c-pragma.c
+++ b/gcc/c-pragma.c
@@ -34,10 +34,12 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "c-common.h"
#include "output.h"
#include "tm_p.h"
+#include "vec.h"
#include "target.h"
-#define GCC_BAD(msgid) do { warning (0, msgid); return; } while (0)
-#define GCC_BAD2(msgid, arg) do { warning (0, msgid, arg); return; } while (0)
+#define GCC_BAD(gmsgid) do { warning (0, gmsgid); return; } while (0)
+#define GCC_BAD2(gmsgid, arg) \
+ do { warning (0, gmsgid, arg); return; } while (0)
typedef struct align_stack GTY(())
{
@@ -418,7 +420,8 @@ handle_pragma_redefine_extname (cpp_reader * ARG_UNUSED (dummy))
if (!flag_mudflap && !targetm.handle_pragma_redefine_extname)
{
if (warn_unknown_pragmas > in_system_header)
- warning (0, "#pragma redefine_extname not supported on this target");
+ warning (OPT_Wunknown_pragmas,
+ "#pragma redefine_extname not supported on this target");
return;
}
@@ -486,7 +489,8 @@ handle_pragma_extern_prefix (cpp_reader * ARG_UNUSED (dummy))
/* Note that the length includes the null terminator. */
pragma_extern_prefix = (TREE_STRING_LENGTH (prefix) > 1 ? prefix : NULL);
else if (warn_unknown_pragmas > in_system_header)
- warning (0, "#pragma extern_prefix not supported on this target");
+ warning (OPT_Wunknown_pragmas,
+ "#pragma extern_prefix not supported on this target");
}
/* Hook from the front ends to apply the results of one of the preceding
@@ -583,15 +587,20 @@ maybe_apply_renaming_pragma (tree decl, tree asmname)
#ifdef HANDLE_PRAGMA_VISIBILITY
static void handle_pragma_visibility (cpp_reader *);
+typedef enum symbol_visibility visibility;
+DEF_VEC_I (visibility);
+DEF_VEC_ALLOC_I (visibility, heap);
+
/* Sets the default visibility for symbols to something other than that
specified on the command line. */
static void
handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED)
-{ /* Form is #pragma GCC visibility push(hidden)|pop */
- static int visstack [16], visidx;
+{
+ /* Form is #pragma GCC visibility push(hidden)|pop */
tree x;
enum cpp_ttype token;
enum { bad, push, pop } action = bad;
+ static VEC (visibility, heap) *visstack;
token = c_lex (&x);
if (token == CPP_NAME)
@@ -608,14 +617,15 @@ handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED)
{
if (pop == action)
{
- if (!visidx)
+ if (!VEC_length (visibility, visstack))
{
GCC_BAD ("No matching push for %<#pragma GCC visibility pop%>");
}
else
{
- default_visibility = visstack[--visidx];
- visibility_options.inpragma = (visidx>0);
+ default_visibility = VEC_pop (visibility, visstack);
+ visibility_options.inpragma
+ = VEC_length (visibility, visstack) != 0;
}
}
else
@@ -627,14 +637,11 @@ handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED)
{
GCC_BAD ("malformed #pragma GCC visibility push");
}
- else if (visidx >= 16)
- {
- GCC_BAD ("No more than sixteen #pragma GCC visibility pushes allowed at once");
- }
else
{
const char *str = IDENTIFIER_POINTER (x);
- visstack[visidx++] = default_visibility;
+ VEC_safe_push (visibility, heap, visstack,
+ default_visibility);
if (!strcmp (str, "default"))
default_visibility = VISIBILITY_DEFAULT;
else if (!strcmp (str, "internal"))
diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c
index f7757c6ff82..d2f9650a957 100644
--- a/gcc/c-semantics.c
+++ b/gcc/c-semantics.c
@@ -101,33 +101,6 @@ pop_stmt_list (tree t)
return t;
}
-/* T is a statement. Add it to the statement-tree. */
-
-tree
-add_stmt (tree t)
-{
- enum tree_code code = TREE_CODE (t);
-
- if (EXPR_P (t) && code != LABEL_EXPR)
- {
- if (!EXPR_HAS_LOCATION (t))
- SET_EXPR_LOCATION (t, input_location);
-
- /* When we expand a statement-tree, we must know whether or not the
- statements are full-expressions. We record that fact here. */
- STMT_IS_FULL_EXPR_P (t) = stmts_are_full_exprs_p ();
- }
-
- if (code == LABEL_EXPR || code == CASE_LABEL_EXPR)
- STATEMENT_LIST_HAS_LABEL (cur_stmt_list) = 1;
-
- /* Add T to the statement-tree. Non-side-effect statements need to be
- recorded during statement expressions. */
- append_to_statement_list_force (t, &cur_stmt_list);
-
- return t;
-}
-
/* Build a generic statement based on the given type of node and
arguments. Similar to `build_nt', except that we set
EXPR_LOCATION to be the current source location. */
diff --git a/gcc/c-tree.h b/gcc/c-tree.h
index 7af8130a426..e2e3bf8b26c 100644
--- a/gcc/c-tree.h
+++ b/gcc/c-tree.h
@@ -523,6 +523,7 @@ extern bool c_mark_addressable (tree);
extern void c_incomplete_type_error (tree, tree);
extern tree c_type_promotes_to (tree);
extern tree default_conversion (tree);
+extern tree default_function_array_conversion (tree);
extern tree composite_type (tree, tree);
extern tree build_component_ref (tree, tree);
extern tree build_indirect_ref (tree, const char *);
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index e8b2b372e1d..7dcd577f538 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -76,11 +76,10 @@ static int require_constant_elements;
static tree qualify_type (tree, tree);
static int tagged_types_tu_compatible_p (tree, tree);
-static int comp_target_types (tree, tree, int);
+static int comp_target_types (tree, tree);
static int function_types_compatible_p (tree, tree);
static int type_lists_compatible_p (tree, tree);
static tree decl_constant_value_for_broken_optimization (tree);
-static tree default_function_array_conversion (tree);
static tree lookup_field (tree, tree);
static tree convert_arguments (tree, tree, tree, tree);
static tree pointer_diff (tree, tree);
@@ -711,10 +710,6 @@ comptypes (tree type1, tree type2)
switch (TREE_CODE (t1))
{
case POINTER_TYPE:
- /* We must give ObjC the first crack at comparing pointers, since
- protocol qualifiers may be involved. */
- if (c_dialect_objc () && (val = objc_comptypes (t1, t2, 0)) >= 0)
- break;
/* Do not remove mode or aliasing information. */
if (TYPE_MODE (t1) != TYPE_MODE (t2)
|| TYPE_REF_CAN_ALIAS_ALL (t1) != TYPE_REF_CAN_ALIAS_ALL (t2))
@@ -766,13 +761,8 @@ comptypes (tree type1, tree type2)
break;
}
- case RECORD_TYPE:
- /* We are dealing with two distinct structs. In assorted Objective-C
- corner cases, however, these can still be deemed equivalent. */
- if (c_dialect_objc () && objc_comptypes (t1, t2, 0) == 1)
- val = 1;
-
case ENUMERAL_TYPE:
+ case RECORD_TYPE:
case UNION_TYPE:
if (val != 1 && !same_translation_unit_p (t1, t2))
val = tagged_types_tu_compatible_p (t1, t2);
@@ -790,22 +780,14 @@ comptypes (tree type1, tree type2)
}
/* Return 1 if TTL and TTR are pointers to types that are equivalent,
- 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).
-*/
+ ignoring their qualifiers. */
static int
-comp_target_types (tree ttl, tree ttr, int reflexive)
+comp_target_types (tree ttl, tree ttr)
{
int val;
tree mvl, mvr;
- /* Give objc_comptypes a crack at letting these types through. */
- if ((val = objc_comptypes (ttl, ttr, reflexive)) >= 0)
- return val;
-
/* Do not lose qualifiers on element types of array types that are
pointer targets by taking their TYPE_MAIN_VARIANT. */
mvl = TREE_TYPE (ttl);
@@ -1280,9 +1262,9 @@ decl_constant_value_for_broken_optimization (tree decl)
/* Perform the default conversion of arrays and functions to pointers.
Return the result of converting EXP. For any other expression, just
- return EXP. */
+ return EXP after removing NOPs. */
-static tree
+tree
default_function_array_conversion (tree exp)
{
tree orig_exp;
@@ -1427,8 +1409,7 @@ perform_integral_promotions (tree exp)
/* Perform default promotions for C data used in expressions.
- Arrays and functions are converted to pointers;
- enumeral types or short or char, to int.
+ Enumeral types or short or char are converted to int.
In addition, manifest constants symbols are replaced by their values. */
tree
@@ -1438,8 +1419,10 @@ default_conversion (tree exp)
tree type = TREE_TYPE (exp);
enum tree_code code = TREE_CODE (type);
- if (code == FUNCTION_TYPE || code == ARRAY_TYPE)
- return default_function_array_conversion (exp);
+ /* Functions and arrays have been converted during parsing. */
+ gcc_assert (code != FUNCTION_TYPE);
+ if (code == ARRAY_TYPE)
+ return exp;
/* Constants can be used directly unless they're not loadable. */
if (TREE_CODE (exp) == CONST_DECL)
@@ -1655,12 +1638,9 @@ build_indirect_ref (tree ptr, const char *errorstring)
else
{
tree t = TREE_TYPE (type);
- tree mvt = t;
tree ref;
- if (TREE_CODE (mvt) != ARRAY_TYPE)
- mvt = TYPE_MAIN_VARIANT (mvt);
- ref = build1 (INDIRECT_REF, mvt, pointer);
+ ref = build1 (INDIRECT_REF, t, pointer);
if (!COMPLETE_OR_VOID_TYPE_P (t) && TREE_CODE (t) != ARRAY_TYPE)
{
@@ -2010,18 +1990,8 @@ build_function_call (tree function, tree params)
return tem;
name = DECL_NAME (function);
-
- /* Differs from default_conversion by not setting TREE_ADDRESSABLE
- (because calling an inline function does not mean the function
- needs to be separately compiled). */
- fntype = build_type_variant (TREE_TYPE (function),
- TREE_READONLY (function),
- TREE_THIS_VOLATILE (function));
- fundecl = function;
- function = build1 (ADDR_EXPR, build_pointer_type (fntype), function);
}
- else
- function = default_conversion (function);
+ function = default_function_array_conversion (function);
/* For Objective-C, convert any calls via a cast to OBJC_TYPE_REF
expressions, like those used for ObjC messenger dispatches. */
@@ -2049,13 +2019,8 @@ build_function_call (tree function, tree params)
If it is not, replace the call by a trap, wrapped up in a compound
expression if necessary. This has the nice side-effect to prevent
the tree-inliner from generating invalid assignment trees which may
- blow up in the RTL expander later.
-
- ??? This doesn't work for Objective-C because objc_comptypes
- refuses to compare function prototypes, yet the compiler appears
- to build calls that are flagged as invalid by C's comptypes. */
- if (!c_dialect_objc ()
- && TREE_CODE (function) == NOP_EXPR
+ blow up in the RTL expander later. */
+ if (TREE_CODE (function) == NOP_EXPR
&& TREE_CODE (tem = TREE_OPERAND (function, 0)) == ADDR_EXPR
&& TREE_CODE (tem = TREE_OPERAND (tem, 0)) == FUNCTION_DECL
&& !comptypes (fntype, TREE_TYPE (tem)))
@@ -2188,8 +2153,6 @@ convert_arguments (tree typelist, tree values, tree function, tree fundecl)
STRIP_TYPE_NOPS (val);
- val = default_function_array_conversion (val);
-
val = require_complete_type (val);
if (type != 0)
@@ -2614,13 +2577,9 @@ build_unary_op (enum tree_code code, tree xarg, int flag)
break;
case TRUTH_NOT_EXPR:
- /* ??? Why do most validation here but that for non-lvalue arrays
- in c_objc_common_truthvalue_conversion? */
if (typecode != INTEGER_TYPE
&& typecode != REAL_TYPE && typecode != POINTER_TYPE
- && typecode != COMPLEX_TYPE
- /* These will convert to a pointer. */
- && typecode != ARRAY_TYPE && typecode != FUNCTION_TYPE)
+ && typecode != COMPLEX_TYPE)
{
error ("wrong type argument to unary exclamation mark");
return error_mark_node;
@@ -2761,7 +2720,9 @@ build_unary_op (enum tree_code code, tree xarg, int flag)
{
if (!c_mark_addressable (TREE_OPERAND (arg, 0)))
return error_mark_node;
- return build_binary_op (PLUS_EXPR, TREE_OPERAND (arg, 0),
+ return build_binary_op (PLUS_EXPR,
+ default_function_array_conversion
+ (TREE_OPERAND (arg, 0)),
TREE_OPERAND (arg, 1), 1);
}
@@ -2870,20 +2831,20 @@ readonly_error (tree arg, enum lvalue_use use)
if (TYPE_READONLY (TREE_TYPE (TREE_OPERAND (arg, 0))))
readonly_error (TREE_OPERAND (arg, 0), use);
else
- error (READONLY_MSG (N_("assignment of read-only member %qD"),
- N_("increment of read-only member %qD"),
- N_("decrement of read-only member %qD")),
+ error (READONLY_MSG (G_("assignment of read-only member %qD"),
+ G_("increment of read-only member %qD"),
+ G_("decrement of read-only member %qD")),
TREE_OPERAND (arg, 1));
}
else if (TREE_CODE (arg) == VAR_DECL)
- error (READONLY_MSG (N_("assignment of read-only variable %qD"),
- N_("increment of read-only variable %qD"),
- N_("decrement of read-only variable %qD")),
+ error (READONLY_MSG (G_("assignment of read-only variable %qD"),
+ G_("increment of read-only variable %qD"),
+ G_("decrement of read-only variable %qD")),
arg);
else
- error (READONLY_MSG (N_("assignment of read-only location"),
- N_("increment of read-only location"),
- N_("decrement of read-only location")));
+ error (READONLY_MSG (G_("assignment of read-only location"),
+ G_("increment of read-only location"),
+ G_("decrement of read-only location")));
}
@@ -3058,7 +3019,7 @@ build_conditional_expr (tree ifexp, tree op1, tree op2)
}
else if (code1 == POINTER_TYPE && code2 == POINTER_TYPE)
{
- if (comp_target_types (type1, type2, 1))
+ if (comp_target_types (type1, type2))
result_type = common_pointer_type (type1, type2);
else if (integer_zerop (op1) && TREE_TYPE (type1) == void_type_node
&& TREE_CODE (orig_op1) != NOP_EXPR)
@@ -3140,9 +3101,6 @@ build_conditional_expr (tree ifexp, tree op1, tree op2)
tree
build_compound_expr (tree expr1, tree expr2)
{
- /* Convert arrays and functions to pointers. */
- expr2 = default_function_array_conversion (expr2);
-
if (!TREE_SIDE_EFFECTS (expr1))
{
/* The left-hand operand of a comma expression is like an expression
@@ -3214,7 +3172,6 @@ build_c_cast (tree type, tree expr)
else if (TREE_CODE (type) == UNION_TYPE)
{
tree field;
- value = default_function_array_conversion (value);
for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
if (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (field)),
@@ -3242,14 +3199,9 @@ build_c_cast (tree type, tree expr)
{
tree otype, ovalue;
- /* If casting to void, avoid the error that would come
- from default_conversion in the case of a non-lvalue array. */
if (type == void_type_node)
return build1 (CONVERT_EXPR, type, value);
- /* Convert functions and arrays to pointers,
- but don't convert any other types. */
- value = default_function_array_conversion (value);
otype = TREE_TYPE (value);
/* Optionally warn about potentially worrisome casts. */
@@ -3329,14 +3281,15 @@ build_c_cast (tree type, tree expr)
&& !TREE_CONSTANT (value))
warning (0, "cast to pointer from integer of different size");
- if (TREE_CODE (type) == POINTER_TYPE
+ if (flag_strict_aliasing && warn_strict_aliasing
+ && 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
+ && (DECL_P (TREE_OPERAND (expr, 0))
+ || TREE_CODE (TREE_OPERAND (expr, 0)) == COMPONENT_REF)
&& !VOID_TYPE_P (TREE_TYPE (type)))
{
- /* Casting the address of a decl to non void pointer. Warn
+ /* Casting the address of an object to non void pointer. Warn
if the cast breaks type based aliasing. */
if (!COMPLETE_TYPE_P (TREE_TYPE (type)))
warning (0, "type-punning to incomplete type might break strict-aliasing rules");
@@ -3532,6 +3485,7 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
tree rhstype;
enum tree_code coder;
tree rname = NULL_TREE;
+ bool objc_ok = false;
if (errtype == ic_argpass || errtype == ic_argpass_nonproto)
{
@@ -3581,10 +3535,8 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
STRIP_TYPE_NOPS (rhs);
- if (TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
- || TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE)
- rhs = default_conversion (rhs);
- else if (optimize && TREE_CODE (rhs) == VAR_DECL)
+ if (optimize && TREE_CODE (rhs) == VAR_DECL
+ && TREE_CODE (TREE_TYPE (rhs)) != ARRAY_TYPE)
rhs = decl_constant_value_for_broken_optimization (rhs);
rhstype = TREE_TYPE (rhs);
@@ -3593,14 +3545,35 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
if (coder == ERROR_MARK)
return error_mark_node;
+ if (c_dialect_objc ())
+ {
+ int parmno;
+
+ switch (errtype)
+ {
+ case ic_return:
+ parmno = 0;
+ break;
+
+ case ic_assign:
+ parmno = -1;
+ break;
+
+ case ic_init:
+ parmno = -2;
+ break;
+
+ default:
+ parmno = parmnum;
+ break;
+ }
+
+ objc_ok = objc_compare_types (type, rhstype, parmno, rname);
+ }
+
if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (rhstype))
{
overflow_warning (rhs);
- /* Check for Objective-C protocols. This will automatically
- issue a warning if there are protocol violations. No need to
- use the return value. */
- if (c_dialect_objc ())
- objc_comptypes (type, rhstype, 0);
return rhs;
}
@@ -3683,7 +3656,7 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
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, 0))
+ || comp_target_types (memb_type, rhstype))
{
/* If this type won't generate any warnings, use it. */
if (TYPE_QUALS (ttl) == TYPE_QUALS (ttr)
@@ -3731,26 +3704,26 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
function where an ordinary one is wanted, but not
vice-versa. */
if (TYPE_QUALS (ttl) & ~TYPE_QUALS (ttr))
- WARN_FOR_ASSIGNMENT (N_("passing argument %d of %qE "
+ WARN_FOR_ASSIGNMENT (G_("passing argument %d of %qE "
"makes qualified function "
"pointer from unqualified"),
- N_("assignment makes qualified "
+ G_("assignment makes qualified "
"function pointer from "
"unqualified"),
- N_("initialization makes qualified "
+ G_("initialization makes qualified "
"function pointer from "
"unqualified"),
- N_("return makes qualified function "
+ G_("return makes qualified function "
"pointer from unqualified"));
}
else if (TYPE_QUALS (ttr) & ~TYPE_QUALS (ttl))
- WARN_FOR_ASSIGNMENT (N_("passing argument %d of %qE discards "
+ WARN_FOR_ASSIGNMENT (G_("passing argument %d of %qE discards "
"qualifiers from pointer target type"),
- N_("assignment discards qualifiers "
+ G_("assignment discards qualifiers "
"from pointer target type"),
- N_("initialization discards qualifiers "
+ G_("initialization discards qualifiers "
"from pointer target type"),
- N_("return discards qualifiers from "
+ G_("return discards qualifiers from "
"pointer target type"));
}
@@ -3781,12 +3754,23 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
|| targetm.vector_opaque_p (rhstype))
&& TREE_CODE (ttl) == VECTOR_TYPE
&& TREE_CODE (ttr) == VECTOR_TYPE;
+
+ /* C++ does not allow the implicit conversion void* -> T*. However,
+ for the purpose of reducing the number of false positives, we
+ tolerate the special case of
+
+ int *p = NULL;
+
+ where NULL is typically defined in C to be '(void *) 0'. */
+ if (VOID_TYPE_P (ttr) && rhs != null_pointer_node && !VOID_TYPE_P (ttl))
+ warning (OPT_Wc___compat, "request for implicit conversion from "
+ "%qT to %qT not permitted in C++", rhstype, type);
/* Any non-function converts to a [const][volatile] void *
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)
- || (target_cmp = comp_target_types (type, rhstype, 0))
+ || (target_cmp = comp_target_types (type, rhstype))
|| is_opaque_pointer
|| (c_common_unsigned_type (mvl)
== c_common_unsigned_type (mvr)))
@@ -3799,14 +3783,14 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
which are not ANSI null ptr constants. */
&& (!integer_zerop (rhs) || TREE_CODE (rhs) == NOP_EXPR)
&& TREE_CODE (ttl) == FUNCTION_TYPE)))
- WARN_FOR_ASSIGNMENT (N_("ISO C forbids passing argument %d of "
+ WARN_FOR_ASSIGNMENT (G_("ISO C forbids passing argument %d of "
"%qE between function pointer "
"and %<void *%>"),
- N_("ISO C forbids assignment between "
+ G_("ISO C forbids assignment between "
"function pointer and %<void *%>"),
- N_("ISO C forbids initialization between "
+ G_("ISO C forbids initialization between "
"function pointer and %<void *%>"),
- N_("ISO C forbids return between function "
+ G_("ISO C forbids return between function "
"pointer and %<void *%>"));
/* Const and volatile mean something different for function types,
so the usual warnings are not appropriate. */
@@ -3814,14 +3798,20 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
&& TREE_CODE (ttl) != FUNCTION_TYPE)
{
if (TYPE_QUALS (ttr) & ~TYPE_QUALS (ttl))
- WARN_FOR_ASSIGNMENT (N_("passing argument %d of %qE discards "
- "qualifiers from pointer target type"),
- N_("assignment discards qualifiers "
- "from pointer target type"),
- N_("initialization discards qualifiers "
- "from pointer target type"),
- N_("return discards qualifiers from "
- "pointer target type"));
+ {
+ /* Types differing only by the presence of the 'volatile'
+ qualifier are acceptable if the 'volatile' has been added
+ in by the Objective-C EH machinery. */
+ if (!objc_type_quals_match (ttl, ttr))
+ WARN_FOR_ASSIGNMENT (G_("passing argument %d of %qE discards "
+ "qualifiers from pointer target type"),
+ G_("assignment discards qualifiers "
+ "from pointer target type"),
+ G_("initialization discards qualifiers "
+ "from pointer target type"),
+ G_("return discards qualifiers from "
+ "pointer target type"));
+ }
/* If this is not a case of ignoring a mismatch in signedness,
no warning. */
else if (VOID_TYPE_P (ttl) || VOID_TYPE_P (ttr)
@@ -3829,13 +3819,13 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
;
/* If there is a mismatch, do warn. */
else if (warn_pointer_sign)
- WARN_FOR_ASSIGNMENT (N_("pointer targets in passing argument "
+ WARN_FOR_ASSIGNMENT (G_("pointer targets in passing argument "
"%d of %qE differ in signedness"),
- N_("pointer targets in assignment "
+ G_("pointer targets in assignment "
"differ in signedness"),
- N_("pointer targets in initialization "
+ G_("pointer targets in initialization "
"differ in signedness"),
- N_("pointer targets in return differ "
+ G_("pointer targets in return differ "
"in signedness"));
}
else if (TREE_CODE (ttl) == FUNCTION_TYPE
@@ -3846,24 +3836,27 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
it is okay to use a const or volatile function
where an ordinary one is wanted, but not vice-versa. */
if (TYPE_QUALS (ttl) & ~TYPE_QUALS (ttr))
- WARN_FOR_ASSIGNMENT (N_("passing argument %d of %qE makes "
+ WARN_FOR_ASSIGNMENT (G_("passing argument %d of %qE makes "
"qualified function pointer "
"from unqualified"),
- N_("assignment makes qualified function "
+ G_("assignment makes qualified function "
"pointer from unqualified"),
- N_("initialization makes qualified "
+ G_("initialization makes qualified "
"function pointer from unqualified"),
- N_("return makes qualified function "
+ G_("return makes qualified function "
"pointer from unqualified"));
}
}
else
- WARN_FOR_ASSIGNMENT (N_("passing argument %d of %qE from "
- "incompatible pointer type"),
- N_("assignment from incompatible pointer type"),
- N_("initialization from incompatible "
- "pointer type"),
- N_("return from incompatible pointer type"));
+ /* Avoid warning about the volatile ObjC EH puts on decls. */
+ if (!objc_ok)
+ WARN_FOR_ASSIGNMENT (G_("passing argument %d of %qE from "
+ "incompatible pointer type"),
+ G_("assignment from incompatible pointer type"),
+ G_("initialization from incompatible "
+ "pointer type"),
+ G_("return from incompatible pointer type"));
+
return convert (type, rhs);
}
else if (codel == POINTER_TYPE && coder == ARRAY_TYPE)
@@ -3884,26 +3877,26 @@ convert_for_assignment (tree type, tree rhs, enum impl_conv errtype,
&& TREE_CODE (TREE_TYPE (rhs)) == INTEGER_TYPE
&& TREE_CODE (TREE_OPERAND (rhs, 0)) == INTEGER_CST
&& integer_zerop (TREE_OPERAND (rhs, 0))))
- WARN_FOR_ASSIGNMENT (N_("passing argument %d of %qE makes "
+ WARN_FOR_ASSIGNMENT (G_("passing argument %d of %qE makes "
"pointer from integer without a cast"),
- N_("assignment makes pointer from integer "
+ G_("assignment makes pointer from integer "
"without a cast"),
- N_("initialization makes pointer from "
+ G_("initialization makes pointer from "
"integer without a cast"),
- N_("return makes pointer from integer "
+ G_("return makes pointer from integer "
"without a cast"));
return convert (type, rhs);
}
else if (codel == INTEGER_TYPE && coder == POINTER_TYPE)
{
- WARN_FOR_ASSIGNMENT (N_("passing argument %d of %qE makes integer "
+ WARN_FOR_ASSIGNMENT (G_("passing argument %d of %qE makes integer "
"from pointer without a cast"),
- N_("assignment makes integer from pointer "
+ G_("assignment makes integer from pointer "
"without a cast"),
- N_("initialization makes integer from pointer "
+ G_("initialization makes integer from pointer "
"without a cast"),
- N_("return makes integer from pointer "
+ G_("return makes integer from pointer "
"without a cast"));
return convert (type, rhs);
}
@@ -4355,15 +4348,13 @@ digest_init (tree type, tree init, bool strict_string, int require_constant)
|| (code == POINTER_TYPE
&& TREE_CODE (TREE_TYPE (inside_init)) == ARRAY_TYPE
&& comptypes (TREE_TYPE (TREE_TYPE (inside_init)),
- TREE_TYPE (type)))
- || (code == POINTER_TYPE
- && TREE_CODE (TREE_TYPE (inside_init)) == FUNCTION_TYPE
- && comptypes (TREE_TYPE (inside_init),
TREE_TYPE (type)))))
{
if (code == POINTER_TYPE)
{
- inside_init = default_function_array_conversion (inside_init);
+ if (TREE_CODE (inside_init) == STRING_CST
+ || TREE_CODE (inside_init) == COMPOUND_LITERAL_EXPR)
+ inside_init = default_function_array_conversion (inside_init);
if (TREE_CODE (TREE_TYPE (inside_init)) == ARRAY_TYPE)
{
@@ -4430,9 +4421,9 @@ digest_init (tree type, tree init, bool strict_string, int require_constant)
|| code == ENUMERAL_TYPE || code == BOOLEAN_TYPE || code == COMPLEX_TYPE
|| code == VECTOR_TYPE)
{
- /* Note that convert_for_assignment calls default_conversion
- for arrays and functions. We must not call it in the
- case where inside_init is a null pointer constant. */
+ if (TREE_CODE (init) == STRING_CST
+ || TREE_CODE (init) == COMPOUND_LITERAL_EXPR)
+ init = default_function_array_conversion (init);
inside_init
= convert_for_assignment (type, init, ic_init,
NULL_TREE, NULL_TREE, 0);
@@ -4838,19 +4829,27 @@ push_init_level (int implicit)
tree value = NULL_TREE;
/* If we've exhausted any levels that didn't have braces,
- pop them now. */
- while (constructor_stack->implicit)
+ pop them now. If implicit == 1, this will have been done in
+ process_init_element; do not repeat it here because in the case
+ of excess initializers for an empty aggregate this leads to an
+ infinite cycle of popping a level and immediately recreating
+ it. */
+ if (implicit != 1)
{
- if ((TREE_CODE (constructor_type) == RECORD_TYPE
- || TREE_CODE (constructor_type) == UNION_TYPE)
- && constructor_fields == 0)
- process_init_element (pop_init_level (1));
- else if (TREE_CODE (constructor_type) == ARRAY_TYPE
- && constructor_max_index
- && tree_int_cst_lt (constructor_max_index, constructor_index))
- process_init_element (pop_init_level (1));
- else
- break;
+ while (constructor_stack->implicit)
+ {
+ if ((TREE_CODE (constructor_type) == RECORD_TYPE
+ || TREE_CODE (constructor_type) == UNION_TYPE)
+ && constructor_fields == 0)
+ process_init_element (pop_init_level (1));
+ else if (TREE_CODE (constructor_type) == ARRAY_TYPE
+ && constructor_max_index
+ && tree_int_cst_lt (constructor_max_index,
+ constructor_index))
+ process_init_element (pop_init_level (1));
+ else
+ break;
+ }
}
/* Unless this is an explicit brace, we need to preserve previous
@@ -5774,14 +5773,15 @@ output_init_element (tree value, bool strict_string, tree type, tree field,
constructor_erroneous = 1;
return;
}
- if (TREE_CODE (TREE_TYPE (value)) == FUNCTION_TYPE
- || (TREE_CODE (TREE_TYPE (value)) == ARRAY_TYPE
- && !(TREE_CODE (value) == STRING_CST
- && TREE_CODE (type) == ARRAY_TYPE
- && INTEGRAL_TYPE_P (TREE_TYPE (type)))
- && !comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (value)),
- TYPE_MAIN_VARIANT (type))))
- value = default_conversion (value);
+ if (TREE_CODE (TREE_TYPE (value)) == ARRAY_TYPE
+ && (TREE_CODE (value) == STRING_CST
+ || TREE_CODE (value) == COMPOUND_LITERAL_EXPR)
+ && !(TREE_CODE (value) == STRING_CST
+ && TREE_CODE (type) == ARRAY_TYPE
+ && INTEGRAL_TYPE_P (TREE_TYPE (type)))
+ && !comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (value)),
+ TYPE_MAIN_VARIANT (type)))
+ value = default_function_array_conversion (value);
if (TREE_CODE (value) == COMPOUND_LITERAL_EXPR
&& require_constant_value && !flag_isoc99 && pending)
@@ -6493,9 +6493,6 @@ build_asm_expr (tree string, tree outputs, tree inputs, tree clobbers,
TREE_VALUE (tail) = output;
}
- /* Perform default conversions on array and function inputs.
- Don't do this for other types as it would screw up operands
- expected to be in memory. */
for (i = 0, tail = inputs; tail; ++i, tail = TREE_CHAIN (tail))
{
tree input;
@@ -6503,8 +6500,6 @@ build_asm_expr (tree string, tree outputs, tree inputs, tree clobbers,
constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (tail)));
input = TREE_VALUE (tail);
- input = default_function_array_conversion (input);
-
if (parse_input_constraint (&constraint, i, ninputs, noutputs, 0,
oconstraints, &allows_mem, &allows_reg))
{
@@ -6917,7 +6912,7 @@ c_finish_if_stmt (location_t if_locus, tree cond, tree then_block,
}
}
- stmt = build3 (COND_EXPR, NULL_TREE, cond, then_block, else_block);
+ stmt = build3 (COND_EXPR, void_type_node, cond, then_block, else_block);
SET_EXPR_LOCATION (stmt, if_locus);
add_stmt (stmt);
}
@@ -7058,13 +7053,6 @@ c_process_expr_stmt (tree expr)
if (!expr)
return NULL_TREE;
- /* Do default conversion if safe and possibly important,
- in case within ({...}). */
- if ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE
- && (flag_isoc99 || lvalue_p (expr)))
- || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)
- expr = default_conversion (expr);
-
if (warn_sequence_point)
verify_sequence_points (expr);
@@ -7444,6 +7432,9 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
/* Nonzero means set RESULT_TYPE to the common type of the args. */
int common = 0;
+ /* True means types are compatible as far as ObjC is concerned. */
+ bool objc_ok;
+
if (convert_p)
{
op0 = default_conversion (orig_op0);
@@ -7473,6 +7464,8 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
if (code0 == ERROR_MARK || code1 == ERROR_MARK)
return error_mark_node;
+ objc_ok = objc_compare_types (type0, type1, -3, NULL_TREE);
+
switch (code)
{
case PLUS_EXPR:
@@ -7489,7 +7482,7 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
/* 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, 1))
+ && comp_target_types (type0, type1))
return pointer_diff (op0, op1);
/* Handle pointer minus int. Just like pointer plus int. */
else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
@@ -7509,20 +7502,22 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
case EXACT_DIV_EXPR:
/* Floating point division by zero is a legitimate way to obtain
infinities and NaNs. */
- if (warn_div_by_zero && skip_evaluation == 0 && integer_zerop (op1))
- warning (0, "division by zero");
+ if (skip_evaluation == 0 && integer_zerop (op1))
+ warning (OPT_Wdiv_by_zero, "division by zero");
if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
|| code0 == COMPLEX_TYPE || code0 == VECTOR_TYPE)
&& (code1 == INTEGER_TYPE || code1 == REAL_TYPE
|| code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE))
{
+ enum tree_code tcode0 = code0, tcode1 = code1;
+
if (code0 == COMPLEX_TYPE || code0 == VECTOR_TYPE)
- code0 = TREE_CODE (TREE_TYPE (TREE_TYPE (op0)));
+ tcode0 = TREE_CODE (TREE_TYPE (TREE_TYPE (op0)));
if (code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE)
- code1 = TREE_CODE (TREE_TYPE (TREE_TYPE (op1)));
+ tcode1 = TREE_CODE (TREE_TYPE (TREE_TYPE (op1)));
- if (!(code0 == INTEGER_TYPE && code1 == INTEGER_TYPE))
+ if (!(tcode0 == INTEGER_TYPE && tcode1 == INTEGER_TYPE))
resultcode = RDIV_EXPR;
else
/* Although it would be tempting to shorten always here, that
@@ -7548,8 +7543,8 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
case TRUNC_MOD_EXPR:
case FLOOR_MOD_EXPR:
- if (warn_div_by_zero && skip_evaluation == 0 && integer_zerop (op1))
- warning (0, "division by zero");
+ if (skip_evaluation == 0 && integer_zerop (op1))
+ warning (OPT_Wdiv_by_zero, "division by zero");
if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
{
@@ -7641,8 +7636,9 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
case EQ_EXPR:
case NE_EXPR:
- if (warn_float_equal && (code0 == REAL_TYPE || code1 == REAL_TYPE))
- warning (0, "comparing floating point with == or != is unsafe");
+ if (code0 == REAL_TYPE || code1 == REAL_TYPE)
+ warning (OPT_Wfloat_equal,
+ "comparing floating point with == or != is unsafe");
/* Result of comparison is always int,
but don't convert the args to int! */
build_type = integer_type_node;
@@ -7658,7 +7654,7 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
/* 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, 1))
+ if (comp_target_types (type0, type1))
result_type = common_pointer_type (type0, type1);
else if (VOID_TYPE_P (tt0))
{
@@ -7677,7 +7673,9 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
" with function pointer");
}
else
- pedwarn ("comparison of distinct pointer types lacks a cast");
+ /* Avoid warning about the volatile ObjC EH puts on decls. */
+ if (!objc_ok)
+ pedwarn ("comparison of distinct pointer types lacks a cast");
if (result_type == NULL_TREE)
result_type = ptr_type_node;
@@ -7710,7 +7708,7 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
short_compare = 1;
else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
{
- if (comp_target_types (type0, type1, 1))
+ if (comp_target_types (type0, type1))
{
result_type = common_pointer_type (type0, type1);
if (!COMPLETE_TYPE_P (TREE_TYPE (type0))
@@ -7759,6 +7757,15 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
if (code0 == ERROR_MARK || code1 == ERROR_MARK)
return error_mark_node;
+ if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
+ && (!tree_int_cst_equal (TYPE_SIZE (type0), TYPE_SIZE (type1))
+ || !same_scalar_type_ignoring_signedness (TREE_TYPE (type0),
+ TREE_TYPE (type1))))
+ {
+ binary_op_error (code);
+ return error_mark_node;
+ }
+
if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE
|| code0 == VECTOR_TYPE)
&&
@@ -8062,12 +8069,11 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
/* Convert EXPR to be a truth-value, validating its type for this
- purpose. Passes EXPR to default_function_array_conversion. */
+ purpose. */
tree
c_objc_common_truthvalue_conversion (tree expr)
{
- expr = default_function_array_conversion (expr);
switch (TREE_CODE (TREE_TYPE (expr)))
{
case ARRAY_TYPE:
@@ -8082,6 +8088,9 @@ c_objc_common_truthvalue_conversion (tree expr)
error ("used union type value where scalar is required");
return error_mark_node;
+ case FUNCTION_TYPE:
+ gcc_unreachable ();
+
default:
break;
}
diff --git a/gcc/c.opt b/gcc/c.opt
index d06ac94772e..ef8705db2e0 100644
--- a/gcc/c.opt
+++ b/gcc/c.opt
@@ -128,6 +128,11 @@ Wbad-function-cast
C ObjC Var(warn_bad_function_cast)
Warn about casting functions to incompatible types
+Wc++-compat
+C Var(warn_cxx_compat)
+Warn about C constructs that are not in the common subset of C and C++
+
+
Wcast-qual
C ObjC C++ ObjC++ Var(warn_cast_qual)
Warn about casts which discard qualifiers
@@ -339,7 +344,7 @@ C++ ObjC++ Var(warn_reorder)
Warn when the compiler reorders code
Wreturn-type
-C ObjC C++ ObjC++
+C ObjC C++ ObjC++ Var(warn_return_type)
Warn whenever a function's return type defaults to \"int\" (C), or about inconsistent return types (C++)
Wselector
diff --git a/gcc/cfg.c b/gcc/cfg.c
index c1cf389e69f..f33a95061a0 100644
--- a/gcc/cfg.c
+++ b/gcc/cfg.c
@@ -63,6 +63,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "obstack.h"
#include "timevar.h"
#include "ggc.h"
+#include "hashtab.h"
+#include "alloc-pool.h"
/* The obstack on which the flow graph components are allocated. */
@@ -349,6 +351,7 @@ make_single_succ_edge (basic_block src, basic_block dest, int flags)
void
remove_edge (edge e)
{
+ remove_predictions_associated_with_edge (e);
execute_on_shrinking_pred (e);
disconnect_src (e);
@@ -939,3 +942,145 @@ scale_bbs_frequencies_gcov_type (basic_block *bbs, int nbbs, gcov_type num,
e->count = (e->count * num) /den;
}
}
+
+/* Datastructures used to maintain mapping between basic blocks and copies. */
+static htab_t bb_original;
+static htab_t bb_copy;
+static alloc_pool original_copy_bb_pool;
+
+struct htab_bb_copy_original_entry
+{
+ /* Block we are attaching info to. */
+ int index1;
+ /* Index of original or copy (depending on the hashtable) */
+ int index2;
+};
+
+static hashval_t
+bb_copy_original_hash (const void *p)
+{
+ struct htab_bb_copy_original_entry *data
+ = ((struct htab_bb_copy_original_entry *)p);
+
+ return data->index1;
+}
+static int
+bb_copy_original_eq (const void *p, const void *q)
+{
+ struct htab_bb_copy_original_entry *data
+ = ((struct htab_bb_copy_original_entry *)p);
+ struct htab_bb_copy_original_entry *data2
+ = ((struct htab_bb_copy_original_entry *)q);
+
+ return data->index1 == data2->index1;
+}
+
+/* Initialize the datstructures to maintain mapping between blocks and it's copies. */
+void
+initialize_original_copy_tables (void)
+{
+ gcc_assert (!original_copy_bb_pool);
+ original_copy_bb_pool
+ = create_alloc_pool ("original_copy",
+ sizeof (struct htab_bb_copy_original_entry), 10);
+ bb_original = htab_create (10, bb_copy_original_hash,
+ bb_copy_original_eq, NULL);
+ bb_copy = htab_create (10, bb_copy_original_hash, bb_copy_original_eq, NULL);
+}
+
+/* Free the datstructures to maintain mapping between blocks and it's copies. */
+void
+free_original_copy_tables (void)
+{
+ gcc_assert (original_copy_bb_pool);
+ htab_delete (bb_copy);
+ htab_delete (bb_original);
+ free_alloc_pool (original_copy_bb_pool);
+ bb_copy = NULL;
+ bb_original = NULL;
+ original_copy_bb_pool = NULL;
+}
+
+/* Set original for basic block. Do nothing when datstructures are not
+ intialized so passes not needing this don't need to care. */
+void
+set_bb_original (basic_block bb, basic_block original)
+{
+ if (original_copy_bb_pool)
+ {
+ struct htab_bb_copy_original_entry **slot;
+ struct htab_bb_copy_original_entry key;
+
+ key.index1 = bb->index;
+ slot =
+ (struct htab_bb_copy_original_entry **) htab_find_slot (bb_original,
+ &key, INSERT);
+ if (*slot)
+ (*slot)->index2 = original->index;
+ else
+ {
+ *slot = pool_alloc (original_copy_bb_pool);
+ (*slot)->index1 = bb->index;
+ (*slot)->index2 = original->index;
+ }
+ }
+}
+
+/* Get the original basic block. */
+basic_block
+get_bb_original (basic_block bb)
+{
+ struct htab_bb_copy_original_entry *entry;
+ struct htab_bb_copy_original_entry key;
+
+ gcc_assert (original_copy_bb_pool);
+
+ key.index1 = bb->index;
+ entry = (struct htab_bb_copy_original_entry *) htab_find (bb_original, &key);
+ if (entry)
+ return BASIC_BLOCK (entry->index2);
+ else
+ return NULL;
+}
+
+/* Set copy for basic block. Do nothing when datstructures are not
+ intialized so passes not needing this don't need to care. */
+void
+set_bb_copy (basic_block bb, basic_block copy)
+{
+ if (original_copy_bb_pool)
+ {
+ struct htab_bb_copy_original_entry **slot;
+ struct htab_bb_copy_original_entry key;
+
+ key.index1 = bb->index;
+ slot =
+ (struct htab_bb_copy_original_entry **) htab_find_slot (bb_copy,
+ &key, INSERT);
+ if (*slot)
+ (*slot)->index2 = copy->index;
+ else
+ {
+ *slot = pool_alloc (original_copy_bb_pool);
+ (*slot)->index1 = bb->index;
+ (*slot)->index2 = copy->index;
+ }
+ }
+}
+
+/* Get the copy of basic block. */
+basic_block
+get_bb_copy (basic_block bb)
+{
+ struct htab_bb_copy_original_entry *entry;
+ struct htab_bb_copy_original_entry key;
+
+ gcc_assert (original_copy_bb_pool);
+
+ key.index1 = bb->index;
+ entry = (struct htab_bb_copy_original_entry *) htab_find (bb_copy, &key);
+ if (entry)
+ return BASIC_BLOCK (entry->index2);
+ else
+ return NULL;
+}
diff --git a/gcc/cfganal.c b/gcc/cfganal.c
index 6c707729b70..0db040fe8ec 100644
--- a/gcc/cfganal.c
+++ b/gcc/cfganal.c
@@ -521,13 +521,15 @@ find_edge_index (struct edge_list *edge_list, basic_block pred, basic_block succ
void
flow_nodes_print (const char *str, const sbitmap nodes, FILE *file)
{
- int node;
+ unsigned int node;
+ sbitmap_iterator sbi;
if (! nodes)
return;
fprintf (file, "%s { ", str);
- EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, node, {fprintf (file, "%d ", node);});
+ EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, node, sbi)
+ fprintf (file, "%d ", node);
fputs ("}\n", file);
}
diff --git a/gcc/cfgbuild.c b/gcc/cfgbuild.c
index 98910232b5c..d87d6d35de5 100644
--- a/gcc/cfgbuild.c
+++ b/gcc/cfgbuild.c
@@ -225,8 +225,7 @@ enum state {
/* Basic blocks that may need splitting (due to a label appearing in
the middle, etc) belong to this state. After splitting them,
- make_edges will create create edges going out of them as
- needed. */
+ make_edges will create edges going out of them as needed. */
BLOCK_TO_SPLIT
};
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index 10e6f101eed..98c82452ca3 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -2132,8 +2132,6 @@ cleanup_cfg (int mode)
delete_dead_jumptables ();
}
- /* Kill the data we won't maintain. */
- free_EXPR_LIST_list (&label_value_list);
timevar_pop (TV_CLEANUP_CFG);
return changed;
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index cd9829e60de..63a4136f238 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -657,7 +657,7 @@ expand_one_var (tree var, bool toplevel)
lang_hooks.expand_decl (var);
else if (DECL_EXTERNAL (var))
;
- else if (DECL_VALUE_EXPR (var))
+ else if (DECL_HAS_VALUE_EXPR_P (var))
;
else if (TREE_STATIC (var))
expand_one_static_var (var);
@@ -1157,22 +1157,25 @@ static basic_block
construct_init_block (void)
{
basic_block init_block, first_block;
- edge e = NULL, e2;
- edge_iterator ei;
+ edge e = NULL;
+ int flags;
- FOR_EACH_EDGE (e2, ei, ENTRY_BLOCK_PTR->succs)
- {
- /* Clear EDGE_EXECUTABLE. This flag is never used in the backend.
+ /* Multiple entry points not supported yet. */
+ gcc_assert (EDGE_COUNT (ENTRY_BLOCK_PTR->succs) == 1);
- For all other blocks this edge flag is cleared while expanding
- a basic block in expand_gimple_basic_block, but there we never
- looked at the successors of the entry block.
- This caused PR17513. */
- e2->flags &= ~EDGE_EXECUTABLE;
+ e = EDGE_SUCC (ENTRY_BLOCK_PTR, 0);
- if (e2->dest == ENTRY_BLOCK_PTR->next_bb)
- e = e2;
+ /* When entry edge points to first basic block, we don't need jump,
+ otherwise we have to jump into proper target. */
+ if (e && e->dest != ENTRY_BLOCK_PTR->next_bb)
+ {
+ tree label = tree_block_label (e->dest);
+
+ emit_jump (label_rtx (label));
+ flags = 0;
}
+ else
+ flags = EDGE_FALLTHRU;
init_block = create_basic_block (NEXT_INSN (get_insns ()),
get_last_insn (),
@@ -1183,7 +1186,7 @@ construct_init_block (void)
{
first_block = e->dest;
redirect_edge_succ (e, init_block);
- e = make_edge (init_block, first_block, EDGE_FALLTHRU);
+ e = make_edge (init_block, first_block, flags);
}
else
e = make_edge (init_block, EXIT_BLOCK_PTR, EDGE_FALLTHRU);
diff --git a/gcc/cfghooks.c b/gcc/cfghooks.c
index bf7921806b2..2af7c0612cb 100644
--- a/gcc/cfghooks.c
+++ b/gcc/cfghooks.c
@@ -756,8 +756,8 @@ duplicate_block (basic_block bb, edge e)
new_bb->frequency = bb->frequency;
}
- new_bb->rbi->original = bb;
- bb->rbi->copy = new_bb;
+ set_bb_original (new_bb, bb);
+ set_bb_copy (bb, new_bb);
return new_bb;
}
@@ -825,7 +825,7 @@ execute_on_shrinking_pred (edge e)
}
/* This is used inside loop versioning when we want to insert
- stmts/insns on the edges, which have a different behaviour
+ stmts/insns on the edges, which have a different behavior
in tree's and in RTL, so we made a CFG hook. */
void
lv_flush_pending_stmts (edge e)
diff --git a/gcc/cfghooks.h b/gcc/cfghooks.h
index 480c197b597..5867d972774 100644
--- a/gcc/cfghooks.h
+++ b/gcc/cfghooks.h
@@ -119,7 +119,7 @@ struct cfg_hooks
unsigned int *n_to_remove,
int flags);
- /* Add conition to new basic block and update CFG used in loop
+ /* Add condition to new basic block and update CFG used in loop
versioning. */
void (*lv_add_condition_to_bb) (basic_block, basic_block, basic_block,
void *);
diff --git a/gcc/cfglayout.c b/gcc/cfglayout.c
index 3a701001b8c..7cf0dcf2743 100644
--- a/gcc/cfglayout.c
+++ b/gcc/cfglayout.c
@@ -802,9 +802,9 @@ fixup_reorder_chain (void)
bb = bb->rbi->next, index++)
{
fprintf (dump_file, " %i ", index);
- if (bb->rbi->original)
+ if (get_bb_original (bb))
fprintf (dump_file, "duplicate of %i ",
- bb->rbi->original->index);
+ get_bb_original (bb)->index);
else if (forwarder_block_p (bb)
&& !LABEL_P (BB_HEAD (bb)))
fprintf (dump_file, "compensation ");
@@ -1100,6 +1100,8 @@ cfg_layout_initialize (unsigned int flags)
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
initialize_bb_rbi (bb);
+ initialize_original_copy_tables ();
+
cfg_layout_rtl_register_cfg_hooks ();
record_effective_endpoints ();
@@ -1166,6 +1168,8 @@ cfg_layout_finalize (void)
#ifdef ENABLE_CHECKING
verify_flow_info ();
#endif
+
+ free_original_copy_tables ();
}
/* Checks whether all N blocks in BBS array can be copied. */
@@ -1177,7 +1181,7 @@ can_copy_bbs_p (basic_block *bbs, unsigned n)
int ret = true;
for (i = 0; i < n; i++)
- bbs[i]->rbi->duplicated = 1;
+ bbs[i]->flags |= BB_DUPLICATED;
for (i = 0; i < n; i++)
{
@@ -1185,7 +1189,7 @@ can_copy_bbs_p (basic_block *bbs, unsigned n)
edge_iterator ei;
FOR_EACH_EDGE (e, ei, bbs[i]->succs)
if ((e->flags & EDGE_ABNORMAL)
- && e->dest->rbi->duplicated)
+ && (e->dest->flags & BB_DUPLICATED))
{
ret = false;
goto end;
@@ -1200,7 +1204,7 @@ can_copy_bbs_p (basic_block *bbs, unsigned n)
end:
for (i = 0; i < n; i++)
- bbs[i]->rbi->duplicated = 0;
+ bbs[i]->flags &= ~BB_DUPLICATED;
return ret;
}
@@ -1235,7 +1239,7 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
/* Duplicate. */
bb = bbs[i];
new_bb = new_bbs[i] = duplicate_block (bb, NULL);
- bb->rbi->duplicated = 1;
+ bb->flags |= BB_DUPLICATED;
/* Add to loop. */
add_bb_to_loop (new_bb, bb->loop_father->copy);
/* Possibly set header. */
@@ -1253,9 +1257,9 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
new_bb = new_bbs[i];
dom_bb = get_immediate_dominator (CDI_DOMINATORS, bb);
- if (dom_bb->rbi->duplicated)
+ if (dom_bb->flags & BB_DUPLICATED)
{
- dom_bb = dom_bb->rbi->copy;
+ dom_bb = get_bb_copy (dom_bb);
set_immediate_dominator (CDI_DOMINATORS, new_bb, dom_bb);
}
}
@@ -1275,15 +1279,15 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
if (edges[j] && edges[j]->src == bb && edges[j]->dest == e->dest)
new_edges[j] = e;
- if (!e->dest->rbi->duplicated)
+ if (!(e->dest->flags & BB_DUPLICATED))
continue;
- redirect_edge_and_branch_force (e, e->dest->rbi->copy);
+ redirect_edge_and_branch_force (e, get_bb_copy (e->dest));
}
}
/* Clear information about duplicates. */
for (i = 0; i < n; i++)
- bbs[i]->rbi->duplicated = 0;
+ bbs[i]->flags &= ~BB_DUPLICATED;
}
#include "gt-cfglayout.h"
diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h
index f96bf81c9eb..048802bb85a 100644
--- a/gcc/cfgloop.h
+++ b/gcc/cfgloop.h
@@ -289,6 +289,7 @@ extern void verify_loop_structure (struct loops *);
/* Loop analysis. */
extern bool just_once_each_iteration_p (const struct loop *, basic_block);
extern unsigned expected_loop_iterations (const struct loop *);
+extern rtx doloop_condition_get (rtx);
/* Loop manipulation. */
extern bool can_duplicate_loop_p (struct loop *loop);
diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c
index 0a369787ebf..9972378a790 100644
--- a/gcc/cfgloopmanip.c
+++ b/gcc/cfgloopmanip.c
@@ -813,19 +813,19 @@ update_single_exits_after_duplication (basic_block *bbs, unsigned nbbs,
unsigned i;
for (i = 0; i < nbbs; i++)
- bbs[i]->rbi->duplicated = 1;
+ bbs[i]->flags |= BB_DUPLICATED;
for (; loop->outer; loop = loop->outer)
{
if (!loop->single_exit)
continue;
- if (loop->single_exit->src->rbi->duplicated)
+ if (loop->single_exit->src->flags & BB_DUPLICATED)
loop->single_exit = NULL;
}
for (i = 0; i < nbbs; i++)
- bbs[i]->rbi->duplicated = 0;
+ bbs[i]->flags &= ~BB_DUPLICATED;
}
/* Duplicates body of LOOP to given edge E NDUPL times. Takes care of updating
@@ -983,13 +983,16 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e, struct loops *loops,
copy_bbs (bbs, n, new_bbs, spec_edges, 2, new_spec_edges, loop);
for (i = 0; i < n; i++)
- new_bbs[i]->rbi->copy_number = j + 1;
+ {
+ gcc_assert (!new_bbs[i]->aux);
+ new_bbs[i]->aux = (void *)(size_t)(j + 1);
+ }
/* Note whether the blocks and edges belong to an irreducible loop. */
if (add_irreducible_flag)
{
for (i = 0; i < n; i++)
- new_bbs[i]->rbi->duplicated = 1;
+ new_bbs[i]->flags |= BB_DUPLICATED;
for (i = 0; i < n; i++)
{
edge_iterator ei;
@@ -998,13 +1001,13 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e, struct loops *loops,
new_bb->flags |= BB_IRREDUCIBLE_LOOP;
FOR_EACH_EDGE (ae, ei, new_bb->succs)
- if (ae->dest->rbi->duplicated
+ if ((ae->dest->flags & BB_DUPLICATED)
&& (ae->src->loop_father == target
|| ae->dest->loop_father == target))
ae->flags |= EDGE_IRREDUCIBLE_LOOP;
}
for (i = 0; i < n; i++)
- new_bbs[i]->rbi->duplicated = 0;
+ new_bbs[i]->flags &= ~BB_DUPLICATED;
}
/* Redirect the special edges. */
@@ -1064,7 +1067,7 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e, struct loops *loops,
int n_dom_bbs,j;
bb = bbs[i];
- bb->rbi->copy_number = 0;
+ bb->aux = 0;
n_dom_bbs = get_dominated_by (CDI_DOMINATORS, bb, &dom_bbs);
for (j = 0; j < n_dom_bbs; j++)
@@ -1447,18 +1450,18 @@ loop_version (struct loops *loops, struct loop * loop,
return NULL;
}
- latch_edge = single_succ_edge (loop->latch->rbi->copy);
+ latch_edge = single_succ_edge (get_bb_copy (loop->latch));
extract_cond_bb_edges (*condition_bb, &true_edge, &false_edge);
nloop = loopify (loops,
latch_edge,
- single_pred_edge (loop->header->rbi->copy),
+ single_pred_edge (get_bb_copy (loop->header)),
*condition_bb, true_edge, false_edge,
false /* Do not redirect all edges. */);
exit = loop->single_exit;
if (exit)
- nloop->single_exit = find_edge (exit->src->rbi->copy, exit->dest);
+ nloop->single_exit = find_edge (get_bb_copy (exit->src), exit->dest);
/* loopify redirected latch_edge. Update its PENDING_STMTS. */
lv_flush_pending_stmts (latch_edge);
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index 42761cad745..f414def06bd 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -59,11 +59,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "target.h"
#include "cfgloop.h"
-/* The labels mentioned in non-jump rtl. Valid during find_basic_blocks. */
-/* ??? Should probably be using LABEL_NUSES instead. It would take a
- bit of surgery to be able to use or co-opt the routines in jump. */
-rtx label_value_list;
-
static int can_delete_note_p (rtx);
static int can_delete_label_p (rtx);
static void commit_one_edge_insertion (edge, int);
@@ -103,8 +98,7 @@ can_delete_label_p (rtx label)
return (!LABEL_PRESERVE_P (label)
/* User declared labels must be preserved. */
&& LABEL_NAME (label) == 0
- && !in_expr_list_p (forced_labels, label)
- && !in_expr_list_p (label_value_list, label));
+ && !in_expr_list_p (forced_labels, label));
}
/* Delete INSN by patching it out. Return the next insn. */
@@ -1190,7 +1184,7 @@ rtl_tidy_fallthru_edge (edge e)
/* ??? In a late-running flow pass, other folks may have deleted basic
blocks by nopping out blocks, leaving multiple BARRIERs between here
- and the target label. They ought to be chastized and fixed.
+ and the target label. They ought to be chastised and fixed.
We can also wind up with a sequence of undeletable labels between
one block and the next.
@@ -2142,6 +2136,12 @@ rtl_verify_flow_info (void)
edge e;
edge_iterator ei;
+ if (bb->predictions)
+ {
+ error ("bb prediction set for block %i, but it is not used in RTL land", bb->index);
+ err = 1;
+ }
+
FOR_EACH_EDGE (e, ei, bb->succs)
if (e->flags & EDGE_FALLTHRU)
break;
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index c2509ffc033..b9b1b14f646 100644
--- a/gcc/cgraph.c
+++ b/gcc/cgraph.c
@@ -97,6 +97,7 @@ The varpool data structure:
#include "varray.h"
#include "output.h"
#include "intl.h"
+#include "tree-gimple.h"
static void cgraph_node_remove_callers (struct cgraph_node *node);
static inline void cgraph_edge_remove_caller (struct cgraph_edge *e);
@@ -169,6 +170,7 @@ cgraph_create_node (void)
if (cgraph_nodes)
cgraph_nodes->previous = node;
node->previous = NULL;
+ node->global.estimated_growth = INT_MIN;
cgraph_nodes = node;
cgraph_n_nodes++;
return node;
@@ -190,7 +192,12 @@ cgraph_node (tree decl)
slot = (struct cgraph_node **) htab_find_slot (cgraph_hash, &key, INSERT);
if (*slot)
- return *slot;
+ {
+ node = *slot;
+ if (!node->master_clone)
+ node->master_clone = node;
+ return node;
+ }
node = cgraph_create_node ();
node->decl = decl;
@@ -200,6 +207,7 @@ cgraph_node (tree decl)
node->origin = cgraph_node (DECL_CONTEXT (decl));
node->next_nested = node->origin->nested;
node->origin->nested = node;
+ node->master_clone = node;
}
return node;
}
@@ -254,9 +262,9 @@ cgraph_node_for_asm (tree asmname)
return NULL;
}
-/* Return callgraph edge representing CALL_EXPR. */
+/* Return callgraph edge representing CALL_EXPR statement. */
struct cgraph_edge *
-cgraph_edge (struct cgraph_node *node, tree call_expr)
+cgraph_edge (struct cgraph_node *node, tree call_stmt)
{
struct cgraph_edge *e;
@@ -266,7 +274,7 @@ cgraph_edge (struct cgraph_node *node, tree call_expr)
because we want to make possible having multiple cgraph nodes representing
different clones of the same body before the body is actually cloned. */
for (e = node->callees; e; e= e->next_callee)
- if (e->call_expr == call_expr)
+ if (e->call_stmt == call_stmt)
break;
return e;
}
@@ -275,17 +283,17 @@ cgraph_edge (struct cgraph_node *node, tree call_expr)
struct cgraph_edge *
cgraph_create_edge (struct cgraph_node *caller, struct cgraph_node *callee,
- tree call_expr, gcov_type count, int nest)
+ tree call_stmt, gcov_type count, int nest)
{
struct cgraph_edge *edge = ggc_alloc (sizeof (struct cgraph_edge));
#ifdef ENABLE_CHECKING
struct cgraph_edge *e;
for (e = caller->callees; e; e = e->next_callee)
- gcc_assert (e->call_expr != call_expr);
+ gcc_assert (e->call_stmt != call_stmt);
#endif
- gcc_assert (TREE_CODE (call_expr) == CALL_EXPR);
+ gcc_assert (get_call_expr_in (call_stmt));
if (!DECL_SAVED_TREE (callee->decl))
edge->inline_failed = N_("function body not available");
@@ -301,7 +309,7 @@ cgraph_create_edge (struct cgraph_node *caller, struct cgraph_node *callee,
edge->caller = caller;
edge->callee = callee;
- edge->call_expr = call_expr;
+ edge->call_stmt = call_stmt;
edge->prev_caller = NULL;
edge->next_caller = callee->callers;
if (callee->callers)
@@ -434,7 +442,14 @@ cgraph_remove_node (struct cgraph_node *node)
{
if (node->next_clone)
{
- *slot = node->next_clone;
+ struct cgraph_node *new_node = node->next_clone;
+ struct cgraph_node *n;
+
+ /* Make the next clone be the master clone */
+ for (n = new_node; n; n = n->next_clone)
+ n->master_clone = new_node;
+
+ *slot = new_node;
node->next_clone->prev_clone = NULL;
}
else
@@ -551,6 +566,10 @@ cgraph_varpool_node_name (struct cgraph_varpool_node *node)
return lang_hooks.decl_printable_name (node->decl, 2);
}
+/* Names used to print out the availability enum. */
+static const char * const availability_names[] =
+ {"unset", "not_available", "overwrittable", "available", "local"};
+
/* Dump given cgraph node. */
void
dump_cgraph_node (FILE *f, struct cgraph_node *node)
@@ -561,6 +580,11 @@ dump_cgraph_node (FILE *f, struct cgraph_node *node)
fprintf (f, " (inline copy in %s/%i)",
cgraph_node_name (node->global.inlined_to),
node->global.inlined_to->uid);
+ if (cgraph_function_flags_ready)
+ fprintf (f, " availability:%s",
+ availability_names [cgraph_function_body_availability (node)]);
+ if (node->master_clone && node->master_clone->uid != node->uid)
+ fprintf (f, "(%i)", node->master_clone->uid);
if (node->count)
fprintf (f, " executed "HOST_WIDEST_INT_PRINT_DEC"x",
(HOST_WIDEST_INT)node->count);
@@ -580,10 +604,16 @@ dump_cgraph_node (FILE *f, struct cgraph_node *node)
fprintf (f, " output");
if (node->local.local)
fprintf (f, " local");
+ if (node->local.externally_visible)
+ fprintf (f, " externally_visible");
+ if (node->local.finalized)
+ fprintf (f, " finalized");
if (node->local.disregard_inline_limits)
fprintf (f, " always_inline");
else if (node->local.inlinable)
fprintf (f, " inlinable");
+ if (node->local.redefined_extern_inline)
+ fprintf (f, " redefined_extern_inline");
if (TREE_ASM_WRITTEN (node->decl))
fprintf (f, " asm_written");
@@ -606,6 +636,11 @@ dump_cgraph_node (FILE *f, struct cgraph_node *node)
edge->callee->uid);
if (!edge->inline_failed)
fprintf(f, "(inlined) ");
+ if (edge->count)
+ fprintf (f, "("HOST_WIDEST_INT_PRINT_DEC"x) ",
+ (HOST_WIDEST_INT)edge->count);
+ if (edge->loop_nest)
+ fprintf (f, "(nested in %i loops) ", edge->loop_nest);
}
fprintf (f, "\n");
}
@@ -627,6 +662,7 @@ void
dump_cgraph_varpool_node (FILE *f, struct cgraph_varpool_node *node)
{
fprintf (f, "%s:", cgraph_varpool_node_name (node));
+ fprintf (f, " availability:%s", availability_names [cgraph_variable_initializer_availability (node)]);
if (DECL_INITIAL (node->decl))
fprintf (f, " initialized");
if (node->needed)
@@ -637,6 +673,8 @@ dump_cgraph_varpool_node (FILE *f, struct cgraph_varpool_node *node)
fprintf (f, " finalized");
if (node->output)
fprintf (f, " output");
+ if (node->externally_visible)
+ fprintf (f, " externally_visible");
fprintf (f, "\n");
}
@@ -784,8 +822,8 @@ decide_is_variable_needed (struct cgraph_varpool_node *node, tree decl)
if (node->needed)
return true;
- /* Externally visible functions must be output. The exception is
- COMDAT functions that must be output only when they are needed. */
+ /* Externally visible variables must be output. The exception is
+ COMDAT variables that must be output only when they are needed. */
if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl))
return true;
@@ -822,6 +860,11 @@ cgraph_varpool_finalize_decl (tree decl)
if (decide_is_variable_needed (node, decl))
cgraph_varpool_mark_needed_node (node);
+ /* Since we reclaim unreachable nodes at the end of every language
+ level unit, we need to be conservative about possible entry points
+ there. */
+ if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl))
+ cgraph_varpool_mark_needed_node (node);
if (cgraph_global_info_ready || !flag_unit_at_a_time)
cgraph_varpool_assemble_pending_decls ();
}
@@ -838,11 +881,11 @@ cgraph_function_possibly_inlined_p (tree decl)
/* Create clone of E in the node N represented by CALL_EXPR the callgraph. */
struct cgraph_edge *
cgraph_clone_edge (struct cgraph_edge *e, struct cgraph_node *n,
- tree call_expr, int count_scale, int loop_nest)
+ tree call_stmt, int count_scale, int loop_nest)
{
struct cgraph_edge *new;
- new = cgraph_create_edge (n, e->callee, call_expr,
+ new = cgraph_create_edge (n, e->callee, call_stmt,
e->count * count_scale / REG_BR_PROB_BASE,
e->loop_nest + loop_nest);
@@ -871,6 +914,7 @@ cgraph_clone_node (struct cgraph_node *n, gcov_type count, int loop_nest)
new->local = n->local;
new->global = n->global;
new->rtl = n->rtl;
+ new->master_clone = n->master_clone;
new->count = count;
if (n->count)
count_scale = new->count * REG_BR_PROB_BASE / n->count;
@@ -879,7 +923,7 @@ cgraph_clone_node (struct cgraph_node *n, gcov_type count, int loop_nest)
n->count -= count;
for (e = n->callees;e; e=e->next_callee)
- cgraph_clone_edge (e, new, e->call_expr, count_scale, loop_nest);
+ cgraph_clone_edge (e, new, e->call_stmt, count_scale, loop_nest);
new->next_clone = n->next_clone;
new->prev_clone = n;
@@ -890,6 +934,28 @@ cgraph_clone_node (struct cgraph_node *n, gcov_type count, int loop_nest)
return new;
}
+/* Return true if N is an master_clone, (see cgraph_master_clone). */
+
+bool
+cgraph_is_master_clone (struct cgraph_node *n)
+{
+ return (n == cgraph_master_clone (n));
+}
+
+struct cgraph_node *
+cgraph_master_clone (struct cgraph_node *n)
+{
+ enum availability avail = cgraph_function_body_availability (n);
+
+ if (avail == AVAIL_NOT_AVAILABLE || avail == AVAIL_OVERWRITABLE)
+ return NULL;
+
+ if (!n->master_clone)
+ n->master_clone = cgraph_node (n->decl);
+
+ return n->master_clone;
+}
+
/* NODE is no longer nested function; update cgraph accordingly. */
void
cgraph_unnest_node (struct cgraph_node *node)
@@ -902,4 +968,60 @@ cgraph_unnest_node (struct cgraph_node *node)
*node2 = node->next_nested;
node->origin = NULL;
}
+
+/* Return function availability. See cgraph.h for description of individual
+ return values. */
+enum availability
+cgraph_function_body_availability (struct cgraph_node *node)
+{
+ enum availability avail;
+ gcc_assert (cgraph_function_flags_ready);
+ if (!node->local.finalized)
+ avail = AVAIL_NOT_AVAILABLE;
+ else if (node->local.local)
+ avail = AVAIL_LOCAL;
+ else if (node->local.externally_visible)
+ avail = AVAIL_AVAILABLE;
+
+ /* If the function can be overwritten, return OVERWRITABLE. Take
+ care at least of two notable extensions - the COMDAT functions
+ used to share template instantiations in C++ (this is symmetric
+ to code cp_cannot_inline_tree_fn and probably shall be shared and
+ the inlinability hooks completely eliminated).
+
+ ??? Does the C++ one definition rule allow us to always return
+ AVAIL_AVAILABLE here? That would be good reason to preserve this
+ hook Similarly deal with extern inline functions - this is again
+ necessary to get C++ shared functions having keyed templates
+ right and in the C extension documentation we probably should
+ document the requirement of both versions of function (extern
+ inline and offline) having same side effect characteristics as
+ good optimization is what this optimization is about. */
+
+ else if (!(*targetm.binds_local_p) (node->decl)
+ && !DECL_COMDAT (node->decl) && !DECL_EXTERNAL (node->decl))
+ avail = AVAIL_OVERWRITABLE;
+ else avail = AVAIL_AVAILABLE;
+
+ return avail;
+}
+
+/* Return variable availability. See cgraph.h for description of individual
+ return values. */
+enum availability
+cgraph_variable_initializer_availability (struct cgraph_varpool_node *node)
+{
+ gcc_assert (cgraph_function_flags_ready);
+ if (!node->finalized)
+ return AVAIL_NOT_AVAILABLE;
+ if (!TREE_PUBLIC (node->decl))
+ return AVAIL_AVAILABLE;
+ /* If the variable can be overwritten, return OVERWRITABLE. Takes
+ care of at least two notable extensions - the COMDAT variables
+ used to share template instantiations in C++. */
+ if (!(*targetm.binds_local_p) (node->decl) && !DECL_COMDAT (node->decl))
+ return AVAIL_OVERWRITABLE;
+ return AVAIL_AVAILABLE;
+}
+
#include "gt-cgraph.h"
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index 294b690787b..9406e090f33 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -24,6 +24,28 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "tree.h"
#include "basic-block.h"
+enum availability
+{
+ /* Not yet set by cgraph_function_body_availability. */
+ AVAIL_UNSET,
+ /* Function body/variable initializer is unknown. */
+ AVAIL_NOT_AVAILABLE,
+ /* Function body/variable initializer is known but might be replaced
+ by a different one from other compilation unit and thus needs to
+ be dealt with a care. Like AVAIL_NOT_AVAILABLE it can have
+ arbitrary side effects on escaping variables and functions, while
+ like AVAILABLE it might access static variables. */
+ AVAIL_OVERWRITABLE,
+ /* Function body/variable initializer is known and will be used in final
+ program. */
+ AVAIL_AVAILABLE,
+ /* Function body/variable initializer is known and all it's uses are explicitly
+ visible within current unit (ie it's address is never taken and it is not
+ exported to other units).
+ Currently used only for functions. */
+ AVAIL_LOCAL
+};
+
/* Information about the function collected locally.
Available after function is analyzed. */
@@ -36,6 +58,9 @@ struct cgraph_local_info GTY(())
and its address is never taken. */
bool local;
+ /* Set when function is visible by other units. */
+ bool externally_visible;
+
/* Set once it has been finalized so we consider it to be output. */
bool finalized;
@@ -69,6 +94,9 @@ struct cgraph_global_info GTY(())
/* Estimated size of the function after inlining. */
int insns;
+ /* Estimated growth after inlining. INT_MIN if not computed. */
+ int estimated_growth;
+
/* Set iff the function has been inlined at least once. */
bool inlined;
};
@@ -104,6 +132,10 @@ struct cgraph_node GTY((chain_next ("%h.next"), chain_prev ("%h.previous")))
/* Pointer to the next clone. */
struct cgraph_node *next_clone;
struct cgraph_node *prev_clone;
+ /* Pointer to a single unique cgraph node for this function. If the
+ function is to be output, this is the copy that will survive. */
+ struct cgraph_node *master_clone;
+
PTR GTY ((skip)) aux;
struct cgraph_local_info local;
@@ -139,7 +171,7 @@ struct cgraph_edge GTY((chain_next ("%h.next_caller"), chain_prev ("%h.prev_call
struct cgraph_edge *next_caller;
struct cgraph_edge *prev_callee;
struct cgraph_edge *next_callee;
- tree call_expr;
+ tree call_stmt;
PTR GTY ((skip (""))) aux;
/* When NULL, inline this call. When non-NULL, points to the explanation
why function was not inlined. */
@@ -172,8 +204,10 @@ struct cgraph_varpool_node GTY(())
bool analyzed;
/* Set once it has been finalized so we consider it to be output. */
bool finalized;
- /* Set when function is scheduled to be assembled. */
+ /* Set when variable is scheduled to be assembled. */
bool output;
+ /* Set when function is visible by other units. */
+ bool externally_visible;
/* Set for aliases once they got through assemble_alias. */
bool alias;
};
@@ -182,6 +216,7 @@ extern GTY(()) struct cgraph_node *cgraph_nodes;
extern GTY(()) int cgraph_n_nodes;
extern GTY(()) int cgraph_max_uid;
extern bool cgraph_global_info_ready;
+extern bool cgraph_function_flags_ready;
extern GTY(()) struct cgraph_node *cgraph_nodes_queue;
extern GTY(()) struct cgraph_varpool_node *cgraph_varpool_first_unanalyzed_node;
@@ -220,6 +255,11 @@ void cgraph_varpool_enqueue_needed_node (struct cgraph_varpool_node *);
void cgraph_varpool_reset_queue (void);
bool decide_is_variable_needed (struct cgraph_varpool_node *, tree);
+enum availability cgraph_function_body_availability (struct cgraph_node *);
+enum availability cgraph_variable_initializer_availability (struct cgraph_varpool_node *);
+bool cgraph_is_master_clone (struct cgraph_node *);
+struct cgraph_node *cgraph_master_clone (struct cgraph_node *);
+
/* In cgraphunit.c */
bool cgraph_assemble_pending_functions (void);
bool cgraph_varpool_assemble_pending_decls (void);
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 14eb46b22c0..2f993f3d443 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -169,15 +169,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
static void cgraph_expand_all_functions (void);
static void cgraph_mark_functions_to_output (void);
static void cgraph_expand_function (struct cgraph_node *);
-static tree record_call_1 (tree *, int *, void *);
-static void cgraph_mark_local_functions (void);
+static tree record_reference (tree *, int *, void *);
static void cgraph_analyze_function (struct cgraph_node *node);
-static void cgraph_create_edges (struct cgraph_node *node, tree body);
-/* Records tree nodes seen in cgraph_create_edges. Simply using
+/* Records tree nodes seen in record_reference. Simply using
walk_tree_without_duplicates doesn't guarantee each node is visited
once because it gets a new htab upon each recursive call from
- record_calls_1. */
+ record_reference itself. */
static struct pointer_set_t *visited_nodes;
static FILE *cgraph_dump_file;
@@ -192,6 +190,17 @@ decide_is_function_needed (struct cgraph_node *node, tree decl)
{
tree origin;
+ /* If the user told us it is used, then it must be so. */
+ if (lookup_attribute ("used", DECL_ATTRIBUTES (decl)))
+ return true;
+
+ /* ??? If the assembler name is set by hand, it is possible to assemble
+ the name later after finalizing the function and the fact is noticed
+ in assemble_name then. This is arguably a bug. */
+ if (DECL_ASSEMBLER_NAME_SET_P (decl)
+ && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
+ return true;
+
/* If we decided it was needed before, but at the time we didn't have
the body of the function available, then it's still needed. We have
to go back and re-check its dependencies now. */
@@ -208,17 +217,6 @@ decide_is_function_needed (struct cgraph_node *node, tree decl)
if (DECL_STATIC_CONSTRUCTOR (decl) || DECL_STATIC_DESTRUCTOR (decl))
return true;
- /* If the user told us it is used, then it must be so. */
- if (lookup_attribute ("used", DECL_ATTRIBUTES (decl)))
- return true;
-
- /* ??? If the assembler name is set by hand, it is possible to assemble
- the name later after finalizing the function and the fact is noticed
- in assemble_name then. This is arguably a bug. */
- if (DECL_ASSEMBLER_NAME_SET_P (decl)
- && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
- return true;
-
if (flag_unit_at_a_time)
return false;
@@ -265,7 +263,12 @@ cgraph_varpool_analyze_pending_decls (void)
cgraph_varpool_first_unanalyzed_node = cgraph_varpool_first_unanalyzed_node->next_needed;
if (DECL_INITIAL (decl))
- cgraph_create_edges (NULL, DECL_INITIAL (decl));
+ {
+ visited_nodes = pointer_set_create ();
+ walk_tree (&DECL_INITIAL (decl), record_reference, NULL, visited_nodes);
+ pointer_set_destroy (visited_nodes);
+ visited_nodes = NULL;
+ }
changed = true;
}
timevar_pop (TV_CGRAPH);
@@ -275,7 +278,7 @@ cgraph_varpool_analyze_pending_decls (void)
/* Optimization of function bodies might've rendered some variables as
unnecessary so we want to avoid these from being compiled.
- This is done by prunning the queue and keeping only the variables that
+ This is done by pruning the queue and keeping only the variables that
really appear needed (ie they are either externally visible or referenced
by compiled function). Re-doing the reachability analysis on variables
brings back the remaining variables referenced by these. */
@@ -336,6 +339,59 @@ cgraph_assemble_pending_functions (void)
return output;
}
+/* As an GCC extension we allow redefinition of the function. The
+ semantics when both copies of bodies differ is not well defined.
+ We replace the old body with new body so in unit at a time mode
+ we always use new body, while in normal mode we may end up with
+ old body inlined into some functions and new body expanded and
+ inlined in others.
+
+ ??? It may make more sense to use one body for inlining and other
+ body for expanding the function but this is difficult to do. */
+
+static void
+cgraph_reset_node (struct cgraph_node *node)
+{
+ /* If node->output is set, then this is a unit-at-a-time compilation
+ and we have already begun whole-unit analysis. This is *not*
+ testing for whether we've already emitted the function. That
+ case can be sort-of legitimately seen with real function
+ redefinition errors. I would argue that the front end should
+ never present us with such a case, but don't enforce that for now. */
+ gcc_assert (!node->output);
+
+ /* Reset our data structures so we can analyze the function again. */
+ memset (&node->local, 0, sizeof (node->local));
+ memset (&node->global, 0, sizeof (node->global));
+ memset (&node->rtl, 0, sizeof (node->rtl));
+ node->analyzed = false;
+ node->local.redefined_extern_inline = true;
+ node->local.finalized = false;
+
+ if (!flag_unit_at_a_time)
+ {
+ struct cgraph_node *n;
+
+ for (n = cgraph_nodes; n; n = n->next)
+ if (n->global.inlined_to == node)
+ cgraph_remove_node (n);
+ }
+
+ cgraph_node_remove_callees (node);
+
+ /* We may need to re-queue the node for assembling in case
+ we already proceeded it and ignored as not needed. */
+ if (node->reachable && !flag_unit_at_a_time)
+ {
+ struct cgraph_node *n;
+
+ for (n = cgraph_nodes_queue; n; n = n->next_needed)
+ if (n == node)
+ break;
+ if (!n)
+ node->reachable = 0;
+ }
+}
/* DECL has been parsed. Take it, queue it, compile it at the whim of the
logic in effect. If NESTED is true, then our caller cannot stand to have
@@ -348,56 +404,7 @@ cgraph_finalize_function (tree decl, bool nested)
struct cgraph_node *node = cgraph_node (decl);
if (node->local.finalized)
- {
- /* As an GCC extension we allow redefinition of the function. The
- semantics when both copies of bodies differ is not well defined.
- We replace the old body with new body so in unit at a time mode
- we always use new body, while in normal mode we may end up with
- old body inlined into some functions and new body expanded and
- inlined in others.
-
- ??? It may make more sense to use one body for inlining and other
- body for expanding the function but this is difficult to do. */
-
- /* If node->output is set, then this is a unit-at-a-time compilation
- and we have already begun whole-unit analysis. This is *not*
- testing for whether we've already emitted the function. That
- case can be sort-of legitimately seen with real function
- redefinition errors. I would argue that the front end should
- never present us with such a case, but don't enforce that for now. */
- gcc_assert (!node->output);
-
- /* Reset our data structures so we can analyze the function again. */
- memset (&node->local, 0, sizeof (node->local));
- memset (&node->global, 0, sizeof (node->global));
- memset (&node->rtl, 0, sizeof (node->rtl));
- node->analyzed = false;
- node->local.redefined_extern_inline = true;
-
- if (!flag_unit_at_a_time)
- {
- struct cgraph_node *n;
-
- for (n = cgraph_nodes; n; n = n->next)
- if (n->global.inlined_to == node)
- cgraph_remove_node (n);
- }
-
- cgraph_node_remove_callees (node);
-
- /* We may need to re-queue the node for assembling in case
- we already proceeded it and ignored as not needed. */
- if (node->reachable && !flag_unit_at_a_time)
- {
- struct cgraph_node *n;
-
- for (n = cgraph_nodes_queue; n; n = n->next_needed)
- if (n == node)
- break;
- if (!n)
- node->reachable = 0;
- }
- }
+ cgraph_reset_node (node);
notice_global_symbol (decl);
node->decl = decl;
@@ -418,6 +425,12 @@ cgraph_finalize_function (tree decl, bool nested)
if (decide_is_function_needed (node, decl))
cgraph_mark_needed_node (node);
+ /* Since we reclaim unreachable nodes at the end of every language
+ level unit, we need to be conservative about possible entry points
+ there. */
+ if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl))
+ cgraph_mark_reachable_node (node);
+
/* If not unit at a time, go ahead and emit everything we've found
to be reachable at this time. */
if (!nested)
@@ -435,9 +448,6 @@ cgraph_finalize_function (tree decl, bool nested)
do_warn_unused_parameter (decl);
}
-/* Used only while constructing the callgraph. */
-static basic_block current_basic_block;
-
void
cgraph_lower_function (struct cgraph_node *node)
{
@@ -449,7 +459,7 @@ cgraph_lower_function (struct cgraph_node *node)
/* Walk tree and record all calls. Called via walk_tree. */
static tree
-record_call_1 (tree *tp, int *walk_subtrees, void *data)
+record_reference (tree *tp, int *walk_subtrees, void *data)
{
tree t = *tp;
@@ -480,29 +490,6 @@ record_call_1 (tree *tp, int *walk_subtrees, void *data)
}
break;
- case CALL_EXPR:
- {
- tree decl = get_callee_fndecl (*tp);
- if (decl && TREE_CODE (decl) == FUNCTION_DECL)
- {
- cgraph_create_edge (data, cgraph_node (decl), *tp,
- current_basic_block->count,
- current_basic_block->loop_depth);
-
- /* When we see a function call, we don't want to look at the
- function reference in the ADDR_EXPR that is hanging from
- the CALL_EXPR we're examining here, because we would
- conclude incorrectly that the function's address could be
- taken by something that is not a function call. So only
- walk the function parameter list, skip the other subtrees. */
-
- walk_tree (&TREE_OPERAND (*tp, 1), record_call_1, data,
- visited_nodes);
- *walk_subtrees = 0;
- }
- break;
- }
-
default:
/* Save some cycles by not walking types and declaration as we
won't find anything useful there anyway. */
@@ -525,97 +512,55 @@ record_call_1 (tree *tp, int *walk_subtrees, void *data)
static void
cgraph_create_edges (struct cgraph_node *node, tree body)
{
- /* The nodes we're interested in are never shared, so walk
- the tree ignoring duplicates. */
+ basic_block bb;
+
+ struct function *this_cfun = DECL_STRUCT_FUNCTION (body);
+ block_stmt_iterator bsi;
+ tree step;
visited_nodes = pointer_set_create ();
- gcc_assert (current_basic_block == NULL);
- if (TREE_CODE (body) == FUNCTION_DECL)
- {
- struct function *this_cfun = DECL_STRUCT_FUNCTION (body);
- block_stmt_iterator bsi;
- tree step;
-
- /* Reach the trees by walking over the CFG, and note the
- enclosing basic-blocks in the call edges. */
- FOR_EACH_BB_FN (current_basic_block, this_cfun)
- for (bsi = bsi_start (current_basic_block); !bsi_end_p (bsi); bsi_next (&bsi))
- walk_tree (bsi_stmt_ptr (bsi), record_call_1, node, visited_nodes);
- current_basic_block = NULL;
-
- /* Walk over any private statics that may take addresses of functions. */
- if (TREE_CODE (DECL_INITIAL (body)) == BLOCK)
- {
- for (step = BLOCK_VARS (DECL_INITIAL (body));
- step;
- step = TREE_CHAIN (step))
- if (DECL_INITIAL (step))
- walk_tree (&DECL_INITIAL (step), record_call_1, node, visited_nodes);
- }
- /* Also look here for private statics. */
- if (DECL_STRUCT_FUNCTION (body))
- for (step = DECL_STRUCT_FUNCTION (body)->unexpanded_var_list;
- step;
- step = TREE_CHAIN (step))
+ /* Reach the trees by walking over the CFG, and note the
+ enclosing basic-blocks in the call edges. */
+ FOR_EACH_BB_FN (bb, this_cfun)
+ for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
+ {
+ tree stmt = bsi_stmt (bsi);
+ tree call = get_call_expr_in (stmt);
+ tree decl;
+
+ if (call && (decl = get_callee_fndecl (call)))
{
- tree decl = TREE_VALUE (step);
- if (DECL_INITIAL (decl) && TREE_STATIC (decl))
- walk_tree (&DECL_INITIAL (decl), record_call_1, node, visited_nodes);
+ cgraph_create_edge (node, cgraph_node (decl), stmt,
+ bb->count,
+ bb->loop_depth);
+ walk_tree (&TREE_OPERAND (call, 1),
+ record_reference, node, visited_nodes);
+ if (TREE_CODE (stmt) == MODIFY_EXPR)
+ walk_tree (&TREE_OPERAND (stmt, 0),
+ record_reference, node, visited_nodes);
}
+ else
+ walk_tree (bsi_stmt_ptr (bsi), record_reference, node, visited_nodes);
+ }
+
+ /* Look for initializers of constant variables and private statics. */
+ for (step = DECL_STRUCT_FUNCTION (body)->unexpanded_var_list;
+ step;
+ step = TREE_CHAIN (step))
+ {
+ tree decl = TREE_VALUE (step);
+ if (TREE_CODE (decl) == VAR_DECL
+ && (TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
+ && flag_unit_at_a_time)
+ cgraph_varpool_finalize_decl (decl);
+ else if (TREE_CODE (decl) == VAR_DECL && DECL_INITIAL (decl))
+ walk_tree (&DECL_INITIAL (decl), record_reference, node, visited_nodes);
}
- else
- walk_tree (&body, record_call_1, node, visited_nodes);
pointer_set_destroy (visited_nodes);
visited_nodes = NULL;
}
-static bool error_found;
-
-/* Callback of verify_cgraph_node. Check that all call_exprs have
- cgraph nodes. */
-
-static tree
-verify_cgraph_node_1 (tree *tp, int *walk_subtrees, void *data)
-{
- tree t = *tp;
- tree decl;
-
- if (TREE_CODE (t) == CALL_EXPR && (decl = get_callee_fndecl (t)))
- {
- struct cgraph_edge *e = cgraph_edge (data, t);
- if (e)
- {
- if (e->aux)
- {
- error ("Shared call_expr:");
- debug_tree (t);
- error_found = true;
- }
- if (e->callee->decl != cgraph_node (decl)->decl)
- {
- error ("Edge points to wrong declaration:");
- debug_tree (e->callee->decl);
- fprintf (stderr," Instead of:");
- debug_tree (decl);
- }
- e->aux = (void *)1;
- }
- else
- {
- error ("Missing callgraph edge for call expr:");
- debug_tree (t);
- error_found = true;
- }
- }
-
- /* Save some cycles by not walking types and declaration as we
- won't find anything useful there anyway. */
- if (IS_TYPE_OR_DECL_P (*tp))
- *walk_subtrees = 0;
-
- return NULL_TREE;
-}
/* Verify cgraph nodes of given cgraph node. */
void
@@ -626,9 +571,9 @@ verify_cgraph_node (struct cgraph_node *node)
struct function *this_cfun = DECL_STRUCT_FUNCTION (node->decl);
basic_block this_block;
block_stmt_iterator bsi;
+ bool error_found = false;
timevar_push (TV_CGRAPH_VERIFY);
- error_found = false;
for (e = node->callees; e; e = e->next_callee)
if (e->aux)
{
@@ -667,7 +612,7 @@ verify_cgraph_node (struct cgraph_node *node)
}
if (node->global.inlined_to == node)
{
- error ("Inlined_to pointer reffers to itself");
+ error ("Inlined_to pointer refers to itself");
error_found = true;
}
@@ -694,7 +639,38 @@ verify_cgraph_node (struct cgraph_node *node)
enclosing basic-blocks in the call edges. */
FOR_EACH_BB_FN (this_block, this_cfun)
for (bsi = bsi_start (this_block); !bsi_end_p (bsi); bsi_next (&bsi))
- walk_tree (bsi_stmt_ptr (bsi), verify_cgraph_node_1, node, visited_nodes);
+ {
+ tree stmt = bsi_stmt (bsi);
+ tree call = get_call_expr_in (stmt);
+ tree decl;
+ if (call && (decl = get_callee_fndecl (call)))
+ {
+ struct cgraph_edge *e = cgraph_edge (node, stmt);
+ if (e)
+ {
+ if (e->aux)
+ {
+ error ("Shared call_stmt:");
+ debug_generic_stmt (stmt);
+ error_found = true;
+ }
+ if (e->callee->decl != cgraph_node (decl)->decl)
+ {
+ error ("Edge points to wrong declaration:");
+ debug_tree (e->callee->decl);
+ fprintf (stderr," Instead of:");
+ debug_tree (decl);
+ }
+ e->aux = (void *)1;
+ }
+ else
+ {
+ error ("Missing callgraph edge for call stmt:");
+ debug_generic_stmt (stmt);
+ error_found = true;
+ }
+ }
+ }
pointer_set_destroy (visited_nodes);
visited_nodes = NULL;
}
@@ -706,9 +682,10 @@ verify_cgraph_node (struct cgraph_node *node)
{
if (!e->aux)
{
- error ("Edge %s->%s has no corresponding call_expr",
+ error ("Edge %s->%s has no corresponding call_stmt",
cgraph_node_name (e->caller),
cgraph_node_name (e->callee));
+ debug_generic_stmt (e->call_stmt);
error_found = true;
}
e->aux = 0;
@@ -759,6 +736,14 @@ cgraph_varpool_assemble_pending_decls (void)
if (!TREE_ASM_WRITTEN (decl) && !node->alias && !DECL_EXTERNAL (decl))
{
assemble_variable (decl, 0, 1, 0);
+ /* Local static variables are never seen by check_global_declarations
+ so we need to output debug info by hand. */
+ if (decl_function_context (decl) && errorcount == 0 && sorrycount == 0)
+ {
+ timevar_push (TV_SYMOUT);
+ (*debug_hooks->global_decl) (decl);
+ timevar_pop (TV_SYMOUT);
+ }
changed = true;
}
node->next_needed = NULL;
@@ -857,7 +842,10 @@ cgraph_finalize_compilation_unit (void)
weak alias attribute to kill its body. See
gcc.c-torture/compile/20011119-1.c */
if (!DECL_SAVED_TREE (decl))
- continue;
+ {
+ cgraph_reset_node (node);
+ continue;
+ }
gcc_assert (!node->analyzed && node->reachable);
gcc_assert (DECL_SAVED_TREE (decl));
@@ -890,14 +878,20 @@ cgraph_finalize_compilation_unit (void)
{
tree decl = node->decl;
+ if (node->local.finalized && !DECL_SAVED_TREE (decl))
+ cgraph_reset_node (node);
+
if (!node->reachable && DECL_SAVED_TREE (decl))
{
if (cgraph_dump_file)
fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
cgraph_remove_node (node);
+ continue;
}
else
node->next_needed = NULL;
+ gcc_assert (!node->local.finalized || DECL_SAVED_TREE (decl));
+ gcc_assert (node->analyzed == node->local.finalized);
}
if (cgraph_dump_file)
{
@@ -968,6 +962,8 @@ cgraph_expand_function (struct cgraph_node *node)
if (flag_unit_at_a_time)
announce_function (decl);
+ cgraph_lower_function (node);
+
/* Generate RTL for the body of DECL. */
lang_hooks.callgraph.expand_function (decl);
@@ -985,6 +981,8 @@ cgraph_expand_function (struct cgraph_node *node)
points to the dead function body. */
cgraph_node_remove_callees (node);
}
+
+ cgraph_function_flags_ready = true;
}
/* Return true when CALLER_DECL should be inlined into CALLEE_DECL. */
@@ -1039,26 +1037,49 @@ cgraph_expand_all_functions (void)
free (order);
}
-/* Mark all local functions.
+/* Mark visibility of all functions.
A local function is one whose calls can occur only in the current
compilation unit and all its calls are explicit, so we can change
its calling convention. We simply mark all static functions whose
- address is not taken as local. */
+ address is not taken as local.
+
+ We also change the TREE_PUBLIC flag of all declarations that are public
+ in language point of view but we want to overwrite this default
+ via visibilities for the backend point of view. */
static void
-cgraph_mark_local_functions (void)
+cgraph_function_and_variable_visibility (void)
{
struct cgraph_node *node;
+ struct cgraph_varpool_node *vnode;
- /* Figure out functions we want to assemble. */
for (node = cgraph_nodes; node; node = node->next)
{
+ if (node->reachable
+ && (DECL_COMDAT (node->decl)
+ || (TREE_PUBLIC (node->decl) && !DECL_EXTERNAL (node->decl))))
+ node->local.externally_visible = 1;
node->local.local = (!node->needed
- && DECL_SAVED_TREE (node->decl)
- && !TREE_PUBLIC (node->decl));
+ && node->analyzed
+ && !DECL_EXTERNAL (node->decl)
+ && !node->local.externally_visible);
+ }
+ for (vnode = cgraph_varpool_nodes_queue; vnode; vnode = vnode->next_needed)
+ {
+ if (vnode->needed
+ && (DECL_COMDAT (vnode->decl) || TREE_PUBLIC (vnode->decl)))
+ vnode->externally_visible = 1;
+ gcc_assert (TREE_STATIC (vnode->decl));
}
+ /* Because we have to be conservative on the boundaries of source
+ level units, it is possible that we marked some functions in
+ reachable just because they might be used later via external
+ linkage, but after making them local they are really unreachable
+ now. */
+ cgraph_remove_unreachable_nodes (true, cgraph_dump_file);
+
if (cgraph_dump_file)
{
fprintf (cgraph_dump_file, "\nMarking local functions:");
@@ -1066,7 +1087,13 @@ cgraph_mark_local_functions (void)
if (node->local.local)
fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
fprintf (cgraph_dump_file, "\n\n");
+ fprintf (cgraph_dump_file, "\nMarking externally visible functions:");
+ for (node = cgraph_nodes; node; node = node->next)
+ if (node->local.externally_visible)
+ fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
+ fprintf (cgraph_dump_file, "\n\n");
}
+ cgraph_function_flags_ready = true;
}
/* Return true when function body of DECL still needs to be kept around
@@ -1111,13 +1138,16 @@ cgraph_optimize (void)
if (!quiet_flag)
fprintf (stderr, "Performing intraprocedural optimizations\n");
- cgraph_mark_local_functions ();
+ cgraph_function_and_variable_visibility ();
if (cgraph_dump_file)
{
fprintf (cgraph_dump_file, "Marked ");
dump_cgraph (cgraph_dump_file);
}
ipa_passes ();
+ /* This pass remove bodies of extern inline functions we never inlined.
+ Do this later so other IPA passes see what is really going on. */
+ cgraph_remove_unreachable_nodes (false, dump_file);
cgraph_global_info_ready = true;
if (cgraph_dump_file)
{
diff --git a/gcc/collect2.c b/gcc/collect2.c
index 7c8fde6a4c0..98416efb3f2 100644
--- a/gcc/collect2.c
+++ b/gcc/collect2.c
@@ -328,26 +328,26 @@ collect_exit (int status)
/* Notify user of a non-error. */
void
-notice (const char *msgid, ...)
+notice (const char *cmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
- vfprintf (stderr, _(msgid), ap);
+ va_start (ap, cmsgid);
+ vfprintf (stderr, _(cmsgid), ap);
va_end (ap);
}
/* Die when sys call fails. */
void
-fatal_perror (const char * msgid, ...)
+fatal_perror (const char * cmsgid, ...)
{
int e = errno;
va_list ap;
- va_start (ap, msgid);
+ va_start (ap, cmsgid);
fprintf (stderr, "collect2: ");
- vfprintf (stderr, _(msgid), ap);
+ vfprintf (stderr, _(cmsgid), ap);
fprintf (stderr, ": %s\n", xstrerror (e));
va_end (ap);
@@ -357,13 +357,13 @@ fatal_perror (const char * msgid, ...)
/* Just die. */
void
-fatal (const char * msgid, ...)
+fatal (const char * cmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
+ va_start (ap, cmsgid);
fprintf (stderr, "collect2: ");
- vfprintf (stderr, _(msgid), ap);
+ vfprintf (stderr, _(cmsgid), ap);
fprintf (stderr, "\n");
va_end (ap);
@@ -373,13 +373,13 @@ fatal (const char * msgid, ...)
/* Write error message. */
void
-error (const char * msgid, ...)
+error (const char * gmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
+ va_start (ap, gmsgid);
fprintf (stderr, "collect2: ");
- vfprintf (stderr, _(msgid), ap);
+ vfprintf (stderr, _(gmsgid), ap);
fprintf (stderr, "\n");
va_end(ap);
}
@@ -453,7 +453,7 @@ extract_string (const char **pp)
obstack_1grow (&temporary_obstack, '\0');
*pp = p;
- return obstack_finish (&temporary_obstack);
+ return XOBFINISH (&temporary_obstack, char *);
}
void
@@ -474,7 +474,7 @@ dump_file (const char *name, FILE *to)
const char *word, *p;
char *result;
obstack_1grow (&temporary_obstack, '\0');
- word = obstack_finish (&temporary_obstack);
+ word = XOBFINISH (&temporary_obstack, const char *);
if (*word == '.')
++word, putc ('.', to);
@@ -1606,7 +1606,7 @@ static void
maybe_unlink (const char *file)
{
if (!debug)
- unlink (file);
+ unlink_if_ordinary (file);
else
notice ("[Leaving %s]\n", file);
}
diff --git a/gcc/combine.c b/gcc/combine.c
index 251c1eeafb8..2f0b787ee57 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -639,7 +639,9 @@ combine_instructions (rtx f, unsigned int nregs)
rtx prev;
#endif
int i;
+ unsigned int j;
rtx links, nextlinks;
+ sbitmap_iterator sbi;
int new_direct_jump_p = 0;
@@ -884,8 +886,8 @@ combine_instructions (rtx f, unsigned int nregs)
}
clear_bb_flags ();
- EXECUTE_IF_SET_IN_SBITMAP (refresh_blocks, 0, i,
- BASIC_BLOCK (i)->flags |= BB_DIRTY);
+ EXECUTE_IF_SET_IN_SBITMAP (refresh_blocks, 0, j, sbi)
+ BASIC_BLOCK (j)->flags |= BB_DIRTY;
new_direct_jump_p |= purge_all_dead_edges ();
delete_noop_moves ();
@@ -2385,8 +2387,8 @@ try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
|| GET_MODE (*split) == VOIDmode
|| (REGNO (i2dest) < FIRST_PSEUDO_REGISTER
&& HARD_REGNO_MODE_OK (REGNO (i2dest), GET_MODE (*split))
- && (HARD_REGNO_NREGS (REGNO (i2dest), GET_MODE (i2dest))
- == HARD_REGNO_NREGS (REGNO (i2dest), GET_MODE (*split))))
+ && (hard_regno_nregs[REGNO (i2dest)][GET_MODE (i2dest)]
+ == hard_regno_nregs[REGNO (i2dest)][GET_MODE (*split)]))
|| (REGNO (i2dest) >= FIRST_PSEUDO_REGISTER
&& REG_N_SETS (REGNO (i2dest)) == 1 && ! added_sets_2
&& ! REG_USERVAR_P (i2dest)))
diff --git a/gcc/common.opt b/gcc/common.opt
index ab0129fb328..f54eabce8a1 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -57,6 +57,10 @@ Waggregate-return
Common Var(warn_aggregate_return)
Warn about returning structures, unions or arrays
+Wattributes
+Common Var(warn_attributes) Init(1)
+Warn about inappropriate attribute usage
+
Wcast-align
Common Var(warn_cast_align)
Warn about pointer casts which increase alignment
@@ -230,7 +234,6 @@ Common RejectNegative Joined UInteger
; global variables.
; 2 if pointer arguments may not alias each other and may not
; alias global variables. True in Fortran.
-; The value is ignored if flag_alias_check is 0.
fargument-alias
Common Report Var(flag_argument_noalias,0)
Specify that arguments may alias each other and globals
@@ -484,6 +487,10 @@ fivopts
Common Report Var(flag_ivopts) Init(1)
Optimize induction variables on trees
+fjump-tables
+Common Var(flag_jump_tables) Init(1)
+Use jump tables for sufficiently large switch statements
+
fkeep-inline-functions
Common Report Var(flag_keep_inline_functions)
Generate code for functions even if they are fully inlined
diff --git a/gcc/config.gcc b/gcc/config.gcc
index ea3a49c871c..6cf2c8cf797 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -740,12 +740,17 @@ bfin*-elf*)
tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h"
tmake_file=bfin/t-bfin-elf
use_collect2=no
- ;;
+ ;;
+bfin*-uclinux*)
+ tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h bfin/uclinux.h"
+ tmake_file=bfin/t-bfin-elf
+ use_collect2=no
+ ;;
bfin*-*)
tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h"
tmake_file=bfin/t-bfin
use_collect2=no
- ;;
+ ;;
c4x-*-rtems* | tic4x-*-rtems*)
tmake_file="c4x/t-c4x t-rtems c4x/t-rtems"
tm_file="c4x/c4x.h c4x/rtems.h rtems.h"
@@ -1581,6 +1586,9 @@ powerpc64-*-linux*)
test x$with_cpu != x || cpu_is_64bit=yes
test x$cpu_is_64bit != xyes || tm_file="${tm_file} rs6000/default64.h"
tm_file="rs6000/biarch64.h ${tm_file} rs6000/linux64.h"
+ if test x${enable_secureplt} = xyes; then
+ tm_file="rs6000/secureplt.h ${tm_file}"
+ fi
extra_options="${extra_options} rs6000/sysv4.opt rs6000/linux64.opt"
tmake_file="rs6000/t-fprules ${tmake_file} rs6000/t-ppccomm rs6000/t-linux64"
;;
@@ -1690,6 +1698,9 @@ powerpc-*-linux*)
tm_file="${tm_file} rs6000/linux.h"
;;
esac
+ if test x${enable_secureplt} = xyes; then
+ tm_file="rs6000/secureplt.h ${tm_file}"
+ fi
;;
powerpc-*-gnu-gnualtivec*)
tm_file="${cpu_type}/${cpu_type}.h elfos.h svr4.h freebsd-spec.h gnu.h rs6000/sysv4.h rs6000/linux.h rs6000/linuxaltivec.h rs6000/gnu.h"
@@ -2010,13 +2021,14 @@ sparc-*-rtems*)
extra_parts="crti.o crtn.o crtbegin.o crtend.o"
;;
sparc64-*-solaris2* | sparcv9-*-solaris2*)
- tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sol2.h sparc/sol2.h sparc/sol2-64.h sparc/sol2-bi.h tm-dwarf2.h"
+ tm_file="sparc/biarch64.h ${tm_file} dbxelf.h elfos.h svr4.h sparc/sysv4.h sol2.h sparc/sol2.h sparc/sol2-64.h sparc/sol2-bi.h"
if test x$gnu_ld = xyes; then
tm_file="${tm_file} sparc/sol2-gld.h sparc/sol2-gld-bi.h"
fi
if test x$gas = xyes; then
tm_file="${tm_file} sparc/sol2-gas.h sparc/sol2-gas-bi.h"
fi
+ tm_file="${tm_file} tm-dwarf2.h"
tmake_file="t-sol2 sparc/t-sol2 sparc/t-sol2-64 sparc/t-crtfm"
if test x$gnu_ld = xyes; then
tmake_file="$tmake_file t-slibgcc-elf-ver"
@@ -2060,13 +2072,14 @@ sparc-*-solaris2*)
fi
;;
*-*-solaris2.[789] | *-*-solaris2.1[0-9]*)
- tm_file="sparc/biarch64.h ${tm_file} sparc/sol2-bi.h tm-dwarf2.h"
+ tm_file="sparc/biarch64.h ${tm_file} sparc/sol2-bi.h"
if test x$gnu_ld = xyes; then
tm_file="${tm_file} sparc/sol2-gld-bi.h"
fi
if test x$gas = xyes; then
tm_file="${tm_file} sparc/sol2-gas-bi.h"
fi
+ tm_file="${tm_file} tm-dwarf2.h"
tmake_file="$tmake_file sparc/t-sol2-64"
need_64bit_hwint=yes
;;
diff --git a/gcc/config.in b/gcc/config.in
index 8fdf6802377..2d12fd04042 100644
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -185,6 +185,12 @@
#endif
+/* Define if your assembler supports the lituse_jsrdirect relocation. */
+#ifndef USED_FOR_TARGET
+#undef HAVE_AS_JSRDIRECT_RELOCS
+#endif
+
+
/* Define if your assembler supports .sleb128 and .uleb128. */
#ifndef USED_FOR_TARGET
#undef HAVE_AS_LEB128
@@ -227,6 +233,12 @@
#endif
+/* Define if your assembler supports R_PPC_REL16 relocs. */
+#ifndef USED_FOR_TARGET
+#undef HAVE_AS_REL16
+#endif
+
+
/* Define if your assembler supports -relax option. */
#ifndef USED_FOR_TARGET
#undef HAVE_AS_RELAX_OPTION
@@ -296,6 +308,13 @@
#endif
+/* Define to 1 if we found a declaration for 'asprintf', otherwise define to
+ 0. */
+#ifndef USED_FOR_TARGET
+#undef HAVE_DECL_ASPRINTF
+#endif
+
+
/* Define to 1 if we found a declaration for 'atof', otherwise define to 0. */
#ifndef USED_FOR_TARGET
#undef HAVE_DECL_ATOF
@@ -866,7 +885,7 @@
#endif
-/* Define if your compiler supports the \`long long' type. */
+/* Define to 1 if the system has the type `long long'. */
#ifndef USED_FOR_TARGET
#undef HAVE_LONG_LONG
#endif
@@ -1137,7 +1156,7 @@
#endif
-/* Define if your compiler supports the \`__int64' type. */
+/* Define to 1 if the system has the type `__int64'. */
#ifndef USED_FOR_TARGET
#undef HAVE___INT64
#endif
diff --git a/gcc/config/alpha/alpha-protos.h b/gcc/config/alpha/alpha-protos.h
index dc2b027108b..ee14006f0e2 100644
--- a/gcc/config/alpha/alpha-protos.h
+++ b/gcc/config/alpha/alpha-protos.h
@@ -102,6 +102,8 @@ extern int alpha_split_conditional_move (enum rtx_code, rtx, rtx, rtx, rtx);
extern void alpha_emit_xfloating_arith (enum rtx_code, rtx[]);
extern void alpha_emit_xfloating_cvt (enum rtx_code, rtx[]);
extern void alpha_split_atomic_op (enum rtx_code, rtx, rtx, rtx, rtx, rtx);
+extern void alpha_split_compare_and_swap (rtx, rtx, rtx, rtx, rtx);
+extern void alpha_split_lock_test_and_set (rtx, rtx, rtx, rtx);
#endif
extern rtx alpha_need_linkage (const char *, int);
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index 66f9f48ea94..3f78c1600ea 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -79,19 +79,6 @@ enum alpha_fp_rounding_mode alpha_fprm;
enum alpha_fp_trap_mode alpha_fptm;
-/* Specify bit size of immediate TLS offsets. */
-
-int alpha_tls_size = 32;
-
-/* Strings decoded into the above options. */
-
-static const char *alpha_cpu_string; /* -mcpu= */
-static const char *alpha_tune_string; /* -mtune= */
-static const char *alpha_tp_string; /* -mtrap-precision=[p|s|i] */
-static const char *alpha_fprm_string; /* -mfp-rounding-mode=[n|m|c|d] */
-static const char *alpha_fptm_string; /* -mfp-trap-mode=[n|u|su|sui] */
-static const char *alpha_mlat_string; /* -mmemory-latency= */
-
/* Save information from a "cmpxx" operation until the branch or scc is
emitted. */
@@ -239,38 +226,8 @@ alpha_handle_option (size_t code, const char *arg, int value)
target_flags |= MASK_IEEE_CONFORMANT;
break;
- case OPT_mcpu_:
- alpha_cpu_string = arg;
- break;
-
- case OPT_mtune_:
- alpha_tune_string = arg;
- break;
-
- case OPT_mfp_rounding_mode_:
- alpha_fprm_string = arg;
- break;
-
- case OPT_mfp_trap_mode_:
- alpha_fptm_string = arg;
- break;
-
- case OPT_mtrap_precision_:
- alpha_tp_string = arg;
- break;
-
- case OPT_mmemory_latency_:
- alpha_mlat_string = arg;
- break;
-
case OPT_mtls_size_:
- if (strcmp (arg, "16") == 0)
- alpha_tls_size = 16;
- else if (strcmp (arg, "32") == 0)
- alpha_tls_size = 32;
- else if (strcmp (arg, "64") == 0)
- alpha_tls_size = 64;
- else
+ if (value != 16 && value != 32 && value != 64)
error ("bad value %qs for -mtls-size switch", arg);
break;
}
@@ -4448,6 +4405,48 @@ alpha_expand_builtin_vector_binop (rtx (*gen) (rtx, rtx, rtx),
emit_insn ((*gen) (op0, op1, op2));
}
+/* A subroutine of the atomic operation splitters. Jump to LABEL if
+ COND is true. Mark the jump as unlikely to be taken. */
+
+static void
+emit_unlikely_jump (rtx cond, rtx label)
+{
+ rtx very_unlikely = GEN_INT (REG_BR_PROB_BASE / 100 - 1);
+ rtx x;
+
+ x = gen_rtx_IF_THEN_ELSE (VOIDmode, cond, label, pc_rtx);
+ x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
+ REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_BR_PROB, very_unlikely, NULL_RTX);
+}
+
+/* A subroutine of the atomic operation splitters. Emit a load-locked
+ instruction in MODE. */
+
+static void
+emit_load_locked (enum machine_mode mode, rtx reg, rtx mem)
+{
+ rtx (*fn) (rtx, rtx) = NULL;
+ if (mode == SImode)
+ fn = gen_load_locked_si;
+ else if (mode == DImode)
+ fn = gen_load_locked_di;
+ emit_insn (fn (reg, mem));
+}
+
+/* A subroutine of the atomic operation splitters. Emit a store-conditional
+ instruction in MODE. */
+
+static void
+emit_store_conditional (enum machine_mode mode, rtx res, rtx mem, rtx val)
+{
+ rtx (*fn) (rtx, rtx, rtx) = NULL;
+ if (mode == SImode)
+ fn = gen_store_conditional_si;
+ else if (mode == DImode)
+ fn = gen_store_conditional_di;
+ emit_insn (fn (res, mem, val));
+}
+
/* Expand an an atomic fetch-and-operate pattern. CODE is the binary operation
to perform. MEM is the memory on which to operate. VAL is the second
operand of the binary operator. BEFORE and AFTER are optional locations to
@@ -4459,8 +4458,7 @@ alpha_split_atomic_op (enum rtx_code code, rtx mem, rtx val,
rtx before, rtx after, rtx scratch)
{
enum machine_mode mode = GET_MODE (mem);
- rtx label, cond, x;
- rtx very_unlikely = GEN_INT (REG_BR_PROB_BASE / 100 - 1);
+ rtx label, x, cond = gen_rtx_REG (DImode, REGNO (scratch));
emit_insn (gen_memory_barrier ());
@@ -4470,40 +4468,81 @@ alpha_split_atomic_op (enum rtx_code code, rtx mem, rtx val,
if (before == NULL)
before = scratch;
-
- if (mode == SImode)
- emit_insn (gen_load_locked_si (before, mem));
- else if (mode == DImode)
- emit_insn (gen_load_locked_di (before, mem));
- else
- gcc_unreachable ();
+ emit_load_locked (mode, before, mem);
if (code == NOT)
- {
- x = gen_rtx_NOT (mode, before);
- x = gen_rtx_AND (mode, x, val);
- }
+ x = gen_rtx_AND (mode, gen_rtx_NOT (mode, before), val);
else
x = gen_rtx_fmt_ee (code, mode, before, val);
-
if (after)
emit_insn (gen_rtx_SET (VOIDmode, after, copy_rtx (x)));
emit_insn (gen_rtx_SET (VOIDmode, scratch, x));
- cond = gen_rtx_REG (DImode, REGNO (scratch));
- if (mode == SImode)
- emit_insn (gen_store_conditional_si (cond, mem, scratch));
- else if (mode == DImode)
- emit_insn (gen_store_conditional_di (cond, mem, scratch));
+ emit_store_conditional (mode, cond, mem, scratch);
+
+ x = gen_rtx_EQ (DImode, cond, const0_rtx);
+ emit_unlikely_jump (x, label);
+
+ emit_insn (gen_memory_barrier ());
+}
+
+/* Expand a compare and swap operation. */
+
+void
+alpha_split_compare_and_swap (rtx retval, rtx mem, rtx oldval, rtx newval,
+ rtx scratch)
+{
+ enum machine_mode mode = GET_MODE (mem);
+ rtx label1, label2, x, cond = gen_lowpart (DImode, scratch);
+
+ emit_insn (gen_memory_barrier ());
+
+ label1 = gen_rtx_LABEL_REF (DImode, gen_label_rtx ());
+ label2 = gen_rtx_LABEL_REF (DImode, gen_label_rtx ());
+ emit_label (XEXP (label1, 0));
+
+ emit_load_locked (mode, retval, mem);
+
+ x = gen_lowpart (DImode, retval);
+ if (oldval == const0_rtx)
+ x = gen_rtx_NE (DImode, x, const0_rtx);
else
- gcc_unreachable ();
+ {
+ x = gen_rtx_EQ (DImode, x, oldval);
+ emit_insn (gen_rtx_SET (VOIDmode, cond, x));
+ x = gen_rtx_EQ (DImode, cond, const0_rtx);
+ }
+ emit_unlikely_jump (x, label2);
+
+ emit_move_insn (scratch, newval);
+ emit_store_conditional (mode, cond, mem, scratch);
x = gen_rtx_EQ (DImode, cond, const0_rtx);
- x = gen_rtx_IF_THEN_ELSE (VOIDmode, x, label, pc_rtx);
- x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
- REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_BR_PROB, very_unlikely, NULL_RTX);
+ emit_unlikely_jump (x, label1);
emit_insn (gen_memory_barrier ());
+ emit_label (XEXP (label2, 0));
+}
+
+/* Expand an atomic exchange operation. */
+
+void
+alpha_split_lock_test_and_set (rtx retval, rtx mem, rtx val, rtx scratch)
+{
+ enum machine_mode mode = GET_MODE (mem);
+ rtx label, x, cond = gen_lowpart (DImode, scratch);
+
+ emit_insn (gen_memory_barrier ());
+
+ label = gen_rtx_LABEL_REF (DImode, gen_label_rtx ());
+ emit_label (XEXP (label, 0));
+
+ emit_load_locked (mode, retval, mem);
+ emit_move_insn (scratch, val);
+ emit_store_conditional (mode, cond, mem, scratch);
+
+ x = gen_rtx_EQ (DImode, cond, const0_rtx);
+ emit_unlikely_jump (x, label);
}
/* Adjust the cost of a scheduling dependency. Return the new cost of
@@ -4882,6 +4921,20 @@ print_operand (FILE *file, rtx x, int code)
}
break;
+ case 'j':
+ {
+ const char *lituse;
+
+#ifdef HAVE_AS_JSRDIRECT_RELOCS
+ lituse = "lituse_jsrdirect";
+#else
+ lituse = "lituse_jsr";
+#endif
+
+ gcc_assert (INTVAL (x) != 0);
+ fprintf (file, "\t\t!%s!%d", lituse, (int) INTVAL (x));
+ }
+ break;
case 'r':
/* If this operand is the constant zero, write it as "$31". */
if (GET_CODE (x) == REG)
@@ -8921,7 +8974,7 @@ alpha_align_insns (unsigned int max_align,
unsigned int align;
/* OFS is the offset of the current insn in the insn group. */
int ofs;
- int prev_in_use, in_use, len;
+ int prev_in_use, in_use, len, ldgp;
rtx i, next;
/* Let shorten branches care for assigning alignments to code labels. */
@@ -8939,6 +8992,8 @@ alpha_align_insns (unsigned int max_align,
if (GET_CODE (i) == NOTE)
i = next_nonnote_insn (i);
+ ldgp = alpha_function_needs_gp ? 8 : 0;
+
while (i)
{
next = (*next_group) (i, &in_use, &len);
@@ -8994,6 +9049,10 @@ alpha_align_insns (unsigned int max_align,
}
}
+ /* We may not insert padding inside the initial ldgp sequence. */
+ else if (ldgp > 0)
+ ldgp -= len;
+
/* If the group won't fit in the same INT16 as the previous,
we need to add padding to keep the group together. Rather
than simply leaving the insn filling to the assembler, we
diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h
index 8d2974574a1..68508220658 100644
--- a/gcc/config/alpha/alpha.h
+++ b/gcc/config/alpha/alpha.h
@@ -152,7 +152,6 @@ extern int target_flags;
extern enum alpha_trap_precision alpha_tp;
extern enum alpha_fp_rounding_mode alpha_fprm;
extern enum alpha_fp_trap_mode alpha_fptm;
-extern int alpha_tls_size;
/* Invert the easy way to make options work. */
#define TARGET_FP (!TARGET_SOFT_FP)
diff --git a/gcc/config/alpha/alpha.md b/gcc/config/alpha/alpha.md
index def77b4efee..efb6d02f8e4 100644
--- a/gcc/config/alpha/alpha.md
+++ b/gcc/config/alpha/alpha.md
@@ -978,7 +978,7 @@
(clobber (reg:DI 23))
(clobber (reg:DI 28))]
"TARGET_EXPLICIT_RELOCS && ! TARGET_ABI_OPEN_VMS"
- "ldq $27,__%E3($29)\t\t!literal!%#\;jsr $23,($27),__%E3\t\t!lituse_jsr!%#"
+ "#"
"&& reload_completed"
[(parallel [(set (match_dup 0)
(sign_extend:DI (match_dup 3)))
@@ -1023,7 +1023,7 @@
(clobber (reg:DI 23))
(clobber (reg:DI 28))]
"TARGET_EXPLICIT_RELOCS && ! TARGET_ABI_OPEN_VMS"
- "jsr $23,($27),__%E3%J5"
+ "jsr $23,($27),__%E3%j5"
[(set_attr "type" "jsr")
(set_attr "length" "4")])
@@ -1047,7 +1047,7 @@
(clobber (reg:DI 23))
(clobber (reg:DI 28))]
"TARGET_EXPLICIT_RELOCS && ! TARGET_ABI_OPEN_VMS"
- "ldq $27,__%E3($29)\t\t!literal!%#\;jsr $23,($27),__%E3\t\t!lituse_jsr!%#"
+ "#"
"&& reload_completed"
[(parallel [(set (match_dup 0) (match_dup 3))
(use (match_dup 0))
@@ -1091,7 +1091,7 @@
(clobber (reg:DI 23))
(clobber (reg:DI 28))]
"TARGET_EXPLICIT_RELOCS && ! TARGET_ABI_OPEN_VMS"
- "jsr $23,($27),__%E3%J5"
+ "jsr $23,($27),__%E3%j5"
[(set_attr "type" "jsr")
(set_attr "length" "4")])
diff --git a/gcc/config/alpha/alpha.opt b/gcc/config/alpha/alpha.opt
index 0c6ca3c302e..d3bc9044461 100644
--- a/gcc/config/alpha/alpha.opt
+++ b/gcc/config/alpha/alpha.opt
@@ -107,29 +107,29 @@ Target Report RejectNegative InverseMask(LONG_DOUBLE_128)
Use 64-bit long double
mcpu=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(alpha_cpu_string)
Use features of and schedule given CPU
mtune=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(alpha_tune_string)
Schedule given CPU
mfp-rounding-mode=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(alpha_fprm_string)
Control the generated fp rounding mode
mfp-trap-mode=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(alpha_fptm_string)
Control the IEEE trap mode
mtrap-precision=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(alpha_tp_string)
Control the precision given to fp exceptions
mmemory-latency=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(alpha_mlat_string)
Tune expected memory latency
mtls-size=
-Target RejectNegative Joined
+Target RejectNegative Joined UInteger Var(alpha_tls_size) Init(32)
Specify bit size of immediate TLS offsets
diff --git a/gcc/config/alpha/sync.md b/gcc/config/alpha/sync.md
index 8f67a4e255d..2cba9e372f2 100644
--- a/gcc/config/alpha/sync.md
+++ b/gcc/config/alpha/sync.md
@@ -221,49 +221,8 @@
"reload_completed"
[(const_int 0)]
{
- rtx retval, mem, oldval, newval, scratch;
- rtx cond, label1, label2, x;
- rtx very_unlikely = GEN_INT (REG_BR_PROB_BASE / 100 - 1);
-
- retval = operands[0];
- mem = operands[1];
- oldval = operands[2];
- newval = operands[3];
- scratch = operands[4];
- cond = gen_lowpart (DImode, scratch);
-
- emit_insn (gen_memory_barrier ());
-
- label1 = gen_rtx_LABEL_REF (DImode, gen_label_rtx ());
- label2 = gen_rtx_LABEL_REF (DImode, gen_label_rtx ());
- emit_label (XEXP (label1, 0));
-
- emit_insn (gen_load_locked_<mode> (retval, mem));
-
- x = gen_lowpart (DImode, retval);
- if (oldval == const0_rtx)
- x = gen_rtx_NE (DImode, x, const0_rtx);
- else
- {
- x = gen_rtx_EQ (DImode, x, oldval);
- emit_insn (gen_rtx_SET (VOIDmode, cond, x));
- x = gen_rtx_EQ (DImode, cond, const0_rtx);
- }
- x = gen_rtx_IF_THEN_ELSE (VOIDmode, x, label2, pc_rtx);
- x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
- REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_BR_PROB, very_unlikely, NULL_RTX);
-
- emit_move_insn (scratch, newval);
-
- emit_insn (gen_store_conditional_<mode> (cond, mem, scratch));
-
- x = gen_rtx_EQ (DImode, cond, const0_rtx);
- x = gen_rtx_IF_THEN_ELSE (VOIDmode, x, label1, pc_rtx);
- x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
- REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_BR_PROB, very_unlikely, NULL_RTX);
-
- emit_insn (gen_memory_barrier ());
- emit_label (XEXP (label2, 0));
+ alpha_split_compare_and_swap (operands[0], operands[1], operands[2],
+ operands[3], operands[4]);
DONE;
}
[(set_attr "type" "multi")])
@@ -281,32 +240,8 @@
"reload_completed"
[(const_int 0)]
{
- rtx retval, mem, val, scratch;
- rtx cond, label1, x;
- rtx very_unlikely = GEN_INT (REG_BR_PROB_BASE / 100 - 1);
-
- retval = operands[0];
- mem = operands[1];
- val = operands[2];
- scratch = operands[3];
- cond = gen_lowpart (DImode, scratch);
-
- emit_insn (gen_memory_barrier ());
-
- label1 = gen_rtx_LABEL_REF (DImode, gen_label_rtx ());
- emit_label (XEXP (label1, 0));
-
- emit_insn (gen_load_locked_<mode> (retval, mem));
-
- emit_move_insn (scratch, val);
-
- emit_insn (gen_store_conditional_<mode> (cond, mem, scratch));
-
- x = gen_rtx_EQ (DImode, cond, const0_rtx);
- x = gen_rtx_IF_THEN_ELSE (VOIDmode, x, label1, pc_rtx);
- x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
- REG_NOTES (x) = gen_rtx_EXPR_LIST (REG_BR_PROB, very_unlikely, NULL_RTX);
-
+ alpha_split_lock_test_and_set (operands[0], operands[1],
+ operands[2], operands[3]);
DONE;
}
[(set_attr "type" "multi")])
diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
index 52eca9f0f0e..1a7024530a3 100644
--- a/gcc/config/arc/arc.c
+++ b/gcc/config/arc/arc.c
@@ -45,7 +45,6 @@ Boston, MA 02111-1307, USA. */
#include "target-def.h"
/* Which cpu we're compiling for. */
-static const char *arc_cpu_string = "base";
int arc_cpu_type;
/* Name of mangle string to add to symbols to separate code compiled for each
@@ -56,12 +55,6 @@ const char *arc_mangle_cpu;
generate a scc or bcc insn. */
rtx arc_compare_op0, arc_compare_op1;
-/* Name of text, data, and rodata sections, as specified on command line.
- Selected by -m{text,data,rodata} flags. */
-static const char *arc_text_string = ARC_DEFAULT_TEXT_SECTION;
-static const char *arc_data_string = ARC_DEFAULT_DATA_SECTION;
-static const char *arc_rodata_string = ARC_DEFAULT_RODATA_SECTION;
-
/* Name of text, data, and rodata sections used in varasm.c. */
const char *arc_text_section;
const char *arc_data_section;
@@ -163,24 +156,7 @@ arc_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
switch (code)
{
case OPT_mcpu_:
- if (strcmp (arg, "base") == 0 || ARC_EXTENSION_CPU (arg))
- {
- arc_cpu_string = arg;
- return true;
- }
- return false;
-
- case OPT_mtext_:
- arc_text_string = arg;
- return true;
-
- case OPT_mdata_:
- arc_data_string = arg;
- return true;
-
- case OPT_mrodata_:
- arc_rodata_string = arg;
- return true;
+ return strcmp (arg, "base") == 0 || ARC_EXTENSION_CPU (arg);
default:
return true;
@@ -410,14 +386,16 @@ arc_handle_interrupt_attribute (tree *node ATTRIBUTE_UNUSED,
if (TREE_CODE (value) != STRING_CST)
{
- warning (0, "argument of %qs attribute is not a string constant",
+ warning (OPT_Wattributes,
+ "argument of %qs attribute is not a string constant",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
else if (strcmp (TREE_STRING_POINTER (value), "ilink1")
&& strcmp (TREE_STRING_POINTER (value), "ilink2"))
{
- warning (0, "argument of %qs attribute is not \"ilink1\" or \"ilink2\"",
+ warning (OPT_Wattributes,
+ "argument of %qs attribute is not \"ilink1\" or \"ilink2\"",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
diff --git a/gcc/config/arc/arc.opt b/gcc/config/arc/arc.opt
index ffb6b010b7b..919550a2878 100644
--- a/gcc/config/arc/arc.opt
+++ b/gcc/config/arc/arc.opt
@@ -39,17 +39,17 @@ mno-cond-exec
Target Undocumented Report RejectNegative Mask(NO_COND_EXEC)
mcpu=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(arc_cpu_string) Init("base")
-mcpu=CPU Compile code for ARC variant CPU
mtext=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(arc_text_string) Init(ARC_DEFAULT_TEXT_SECTION)
-mtext=SECTION Put functions in SECTION
mdata=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(arc_data_string) Init(ARC_DEFAULT_DATA_SECTION)
-mdata=SECTION Put data in SECTION
mrodata=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(arc_rodata_string) Init(ARC_DEFAULT_RODATA_SECTION)
-mrodata=SECTION Put read-only data in SECTION
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 26fb38cb779..8924a490ff4 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -374,20 +374,7 @@ enum float_abi_type arm_float_abi;
/* Which ABI to use. */
enum arm_abi_type arm_abi;
-/* Set by the -mfpu=... option. */
-static const char * target_fpu_name = NULL;
-
-/* Set by the -mfpe=... option. */
-static const char * target_fpe_name = NULL;
-
-/* Set by the -mfloat-abi=... option. */
-static const char * target_float_abi_name = NULL;
-
-/* Set by the -mabi=... option. */
-static const char * target_abi_name = NULL;
-
/* Used to parse -mstructure_size_boundary command line option. */
-static const char * structure_size_string = NULL;
int arm_structure_size_boundary = DEFAULT_STRUCTURE_SIZE_BOUNDARY;
/* Used for Thumb call_via trampolines. */
@@ -498,7 +485,6 @@ int arm_cpp_interwork = 0;
enum machine_mode output_memory_reference_mode;
/* The register number to be used for the PIC offset register. */
-static const char * arm_pic_register_string = NULL;
int arm_pic_register = INVALID_REGNUM;
/* Set to 1 when a return insn is output, this means that the epilogue
@@ -801,10 +787,6 @@ arm_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
{
switch (code)
{
- case OPT_mabi_:
- target_abi_name = arg;
- return true;
-
case OPT_march_:
arm_select[1].string = arg;
return true;
@@ -813,35 +795,14 @@ arm_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
arm_select[0].string = arg;
return true;
- case OPT_mfloat_abi_:
- target_float_abi_name = arg;
- return true;
-
- case OPT_mfp_:
- case OPT_mfpe_:
- target_fpe_name = arg;
- return true;
-
- case OPT_mfpu_:
- target_fpu_name = arg;
- return true;
-
case OPT_mhard_float:
target_float_abi_name = "hard";
return true;
- case OPT_mpic_register_:
- arm_pic_register_string = arg;
- return true;
-
case OPT_msoft_float:
target_float_abi_name = "soft";
return true;
- case OPT_mstructure_size_boundary_:
- structure_size_string = arg;
- return true;
-
case OPT_mtune_:
arm_select[2].string = arg;
return true;
@@ -2812,7 +2773,7 @@ arm_handle_fndecl_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED,
{
if (TREE_CODE (*node) != FUNCTION_DECL)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -2830,7 +2791,7 @@ arm_handle_isr_attribute (tree *node, tree name, tree args, int flags,
{
if (TREE_CODE (*node) != FUNCTION_DECL)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -2844,7 +2805,8 @@ arm_handle_isr_attribute (tree *node, tree name, tree args, int flags,
{
if (arm_isr_value (args) == ARM_FT_UNKNOWN)
{
- warning (0, "%qs attribute ignored", IDENTIFIER_POINTER (name));
+ warning (OPT_Wattributes, "%qs attribute ignored",
+ IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
}
@@ -2871,7 +2833,8 @@ arm_handle_isr_attribute (tree *node, tree name, tree args, int flags,
}
else
{
- warning (0, "%qs attribute ignored", IDENTIFIER_POINTER (name));
+ warning (OPT_Wattributes, "%qs attribute ignored",
+ IDENTIFIER_POINTER (name));
}
}
}
@@ -7013,7 +6976,7 @@ add_minipool_forward_ref (Mfix *fix)
/* If this fix's address is greater than the address of the first
entry, then we can't put the fix in this pool. We subtract the
size of the current fix to ensure that if the table is fully
- packed we still have enough room to insert this value by suffling
+ packed we still have enough room to insert this value by shuffling
the other fixes forwards. */
if (minipool_vector_head &&
fix->address >= minipool_vector_head->max_address - fix->fix_size)
@@ -13529,7 +13492,7 @@ thumb_output_function_prologue (FILE *f, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
asm_fprintf (f, "\tmov\t%r, %r\t\t%@ Backtrace structure created\n",
ARM_HARD_FRAME_POINTER_REGNUM, work_register);
}
- /* Optimisation: If we are not pushing any low registers but we are going
+ /* Optimization: If we are not pushing any low registers but we are going
to push some high registers then delay our first push. This will just
be a push of LR and we can combine it with the push of the first high
register. */
@@ -14473,7 +14436,7 @@ arm_cxx_guard_type (void)
}
-/* The EABI says test the least significan bit of a guard variable. */
+/* The EABI says test the least significant bit of a guard variable. */
static bool
arm_cxx_guard_mask_bit (void)
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 5c7da904a88..2aadfea671b 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -202,10 +202,14 @@
; even on a machine with an fpa.
; f_load a floating point load from memory
; f_store a floating point store to memory
+; f_load[sd] single/double load from memory
+; f_store[sd] single/double store to memory
+; f_flag a transfer of co-processor flags to the CPSR
; f_mem_r a transfer of a floating point register to a real reg via mem
; r_mem_f the reverse of f_mem_r
; f_2_r fast transfer float to arm (no memory needed)
; r_2_f fast transfer arm to float
+; f_cvt convert floating<->integral
; branch a branch
; call a subroutine call
; load_byte load byte(s) from memory to arm registers
@@ -222,7 +226,7 @@
; mav_dmult Double multiplies (7 cycle)
;
(define_attr "type"
- "alu,alu_shift,alu_shift_reg,mult,block,float,fdivx,fdivd,fdivs,fmul,ffmul,farith,ffarith,float_em,f_load,f_store,f_mem_r,r_mem_f,f_2_r,r_2_f,branch,call,load_byte,load1,load2,load3,load4,store1,store2,store3,store4,mav_farith,mav_dmult"
+ "alu,alu_shift,alu_shift_reg,mult,block,float,fdivx,fdivd,fdivs,fmul,ffmul,farith,ffarith,f_flag,float_em,f_load,f_store,f_loads,f_loadd,f_stores,f_stored,f_mem_r,r_mem_f,f_2_r,r_2_f,f_cvt,branch,call,load_byte,load1,load2,load3,load4,store1,store2,store3,store4,mav_farith,mav_dmult"
(if_then_else
(eq_attr "insn" "smulxy,smlaxy,smlalxy,smulwy,smlawx,mul,muls,mla,mlas,umull,umulls,umlal,umlals,smull,smulls,smlal,smlals")
(const_string "mult")
@@ -313,12 +317,20 @@
(define_attr "generic_sched" "yes,no"
(const (if_then_else
- (eq_attr "tune" "arm926ejs,arm1026ejs,arm1136js,arm1136jfs")
+ (eq_attr "tune" "arm926ejs,arm1020e,arm1026ejs,arm1136js,arm1136jfs")
(const_string "no")
(const_string "yes"))))
+(define_attr "generic_vfp" "yes,no"
+ (const (if_then_else
+ (and (eq_attr "fpu" "vfp")
+ (eq_attr "tune" "!arm1020e,arm1022e"))
+ (const_string "yes")
+ (const_string "no"))))
+
(include "arm-generic.md")
(include "arm926ejs.md")
+(include "arm1020e.md")
(include "arm1026ejs.md")
(include "arm1136jfs.md")
@@ -6963,7 +6975,7 @@
(if_then_else (unordered (match_dup 1) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"operands[1] = arm_gen_compare_reg (UNORDERED, arm_compare_op0,
arm_compare_op1);"
)
@@ -6973,7 +6985,7 @@
(if_then_else (ordered (match_dup 1) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"operands[1] = arm_gen_compare_reg (ORDERED, arm_compare_op0,
arm_compare_op1);"
)
@@ -6983,7 +6995,7 @@
(if_then_else (ungt (match_dup 1) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"operands[1] = arm_gen_compare_reg (UNGT, arm_compare_op0, arm_compare_op1);"
)
@@ -6992,7 +7004,7 @@
(if_then_else (unlt (match_dup 1) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"operands[1] = arm_gen_compare_reg (UNLT, arm_compare_op0, arm_compare_op1);"
)
@@ -7001,7 +7013,7 @@
(if_then_else (unge (match_dup 1) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"operands[1] = arm_gen_compare_reg (UNGE, arm_compare_op0, arm_compare_op1);"
)
@@ -7010,7 +7022,7 @@
(if_then_else (unle (match_dup 1) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"operands[1] = arm_gen_compare_reg (UNLE, arm_compare_op0, arm_compare_op1);"
)
@@ -7021,7 +7033,7 @@
(if_then_else (uneq (match_dup 1) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"operands[1] = arm_gen_compare_reg (UNEQ, arm_compare_op0, arm_compare_op1);"
)
@@ -7030,7 +7042,7 @@
(if_then_else (ltgt (match_dup 1) (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"operands[1] = arm_gen_compare_reg (LTGT, arm_compare_op0, arm_compare_op1);"
)
@@ -7044,7 +7056,7 @@
(if_then_else (uneq (match_operand 1 "cc_register" "") (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"*
gcc_assert (!arm_ccfsm_state);
@@ -7060,7 +7072,7 @@
(if_then_else (ltgt (match_operand 1 "cc_register" "") (const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"*
gcc_assert (!arm_ccfsm_state);
@@ -7095,7 +7107,7 @@
(if_then_else (uneq (match_operand 1 "cc_register" "") (const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"*
gcc_assert (!arm_ccfsm_state);
@@ -7111,7 +7123,7 @@
(if_then_else (ltgt (match_operand 1 "cc_register" "") (const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"*
gcc_assert (!arm_ccfsm_state);
@@ -7217,7 +7229,7 @@
(define_expand "sunordered"
[(set (match_operand:SI 0 "s_register_operand" "")
(unordered:SI (match_dup 1) (const_int 0)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"operands[1] = arm_gen_compare_reg (UNORDERED, arm_compare_op0,
arm_compare_op1);"
)
@@ -7225,7 +7237,7 @@
(define_expand "sordered"
[(set (match_operand:SI 0 "s_register_operand" "")
(ordered:SI (match_dup 1) (const_int 0)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"operands[1] = arm_gen_compare_reg (ORDERED, arm_compare_op0,
arm_compare_op1);"
)
@@ -7233,7 +7245,7 @@
(define_expand "sungt"
[(set (match_operand:SI 0 "s_register_operand" "")
(ungt:SI (match_dup 1) (const_int 0)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"operands[1] = arm_gen_compare_reg (UNGT, arm_compare_op0,
arm_compare_op1);"
)
@@ -7241,7 +7253,7 @@
(define_expand "sunge"
[(set (match_operand:SI 0 "s_register_operand" "")
(unge:SI (match_dup 1) (const_int 0)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"operands[1] = arm_gen_compare_reg (UNGE, arm_compare_op0,
arm_compare_op1);"
)
@@ -7249,7 +7261,7 @@
(define_expand "sunlt"
[(set (match_operand:SI 0 "s_register_operand" "")
(unlt:SI (match_dup 1) (const_int 0)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"operands[1] = arm_gen_compare_reg (UNLT, arm_compare_op0,
arm_compare_op1);"
)
@@ -7257,7 +7269,7 @@
(define_expand "sunle"
[(set (match_operand:SI 0 "s_register_operand" "")
(unle:SI (match_dup 1) (const_int 0)))]
- "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+ "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
"operands[1] = arm_gen_compare_reg (UNLE, arm_compare_op0,
arm_compare_op1);"
)
@@ -7268,14 +7280,14 @@
; (define_expand "suneq"
; [(set (match_operand:SI 0 "s_register_operand" "")
; (uneq:SI (match_dup 1) (const_int 0)))]
-; "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+; "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
; "gcc_unreachable ();"
; )
;
; (define_expand "sltgt"
; [(set (match_operand:SI 0 "s_register_operand" "")
; (ltgt:SI (match_dup 1) (const_int 0)))]
-; "TARGET_ARM && TARGET_HARD_FLOAT && TARGET_FPA"
+; "TARGET_ARM && TARGET_HARD_FLOAT && (TARGET_FPA || TARGET_VFP)"
; "gcc_unreachable ();"
; )
diff --git a/gcc/config/arm/arm.opt b/gcc/config/arm/arm.opt
index 28bec490e38..d03679a2d66 100644
--- a/gcc/config/arm/arm.opt
+++ b/gcc/config/arm/arm.opt
@@ -20,7 +20,7 @@
; 02111-1307, USA.
mabi=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(target_abi_name)
Specify an ABI
mabort-on-noreturn
@@ -73,21 +73,21 @@ Target RejectNegative Joined
Specify the name of the target CPU
mfloat-abi=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(target_float_abi_name)
Specify if floating point hardware should be used
mfp=
-Target RejectNegative Joined Undocumented
+Target RejectNegative Joined Undocumented Var(target_fpe_name) VarExists
;; Now ignored.
mfpe
Target RejectNegative Mask(FPE) Undocumented
mfpe=
-Target RejectNegative Joined Undocumented
+Target RejectNegative Joined Undocumented Var(target_fpe_name)
mfpu=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(target_fpu_name)
Specify the name of the target floating point hardware/format
mhard-float
@@ -103,7 +103,7 @@ Target Report Mask(LONG_CALLS)
Generate call insns as indirect calls, if necessary
mpic-register=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(arm_pic_register_string)
Specify the register to be used for PIC addressing
mpoke-function-name
@@ -123,7 +123,7 @@ Target RejectNegative
Alias for -mfloat-abi=soft
mstructure-size-boundary=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(structure_size_string)
Specify the minimum bit alignment of structures
mthumb
diff --git a/gcc/config/arm/arm1020e.md b/gcc/config/arm/arm1020e.md
new file mode 100644
index 00000000000..215f320ed79
--- /dev/null
+++ b/gcc/config/arm/arm1020e.md
@@ -0,0 +1,388 @@
+;; ARM 1020E & ARM 1022E Pipeline Description
+;; Copyright (C) 2005 Free Software Foundation, Inc.
+;; Contributed by Richard Earnshaw (richard.earnshaw@arm.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. */
+
+;; These descriptions are based on the information contained in the
+;; ARM1020E Technical Reference Manual, Copyright (c) 2003 ARM
+;; Limited.
+;;
+
+;; This automaton provides a pipeline description for the ARM
+;; 1020E core.
+;;
+;; The model given here assumes that the condition for all conditional
+;; instructions is "true", i.e., that all of the instructions are
+;; actually executed.
+
+(define_automaton "arm1020e")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Pipelines
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; There are two pipelines:
+;;
+;; - An Arithmetic Logic Unit (ALU) pipeline.
+;;
+;; The ALU pipeline has fetch, issue, decode, execute, memory, and
+;; write stages. We only need to model the execute, memory and write
+;; stages.
+;;
+;; - A Load-Store Unit (LSU) pipeline.
+;;
+;; The LSU pipeline has decode, execute, memory, and write stages.
+;; We only model the execute, memory and write stages.
+
+(define_cpu_unit "1020a_e,1020a_m,1020a_w" "arm1020e")
+(define_cpu_unit "1020l_e,1020l_m,1020l_w" "arm1020e")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; ALU Instructions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; ALU instructions require three cycles to execute, and use the ALU
+;; pipeline in each of the three stages. The results are available
+;; after the execute stage stage has finished.
+;;
+;; If the destination register is the PC, the pipelines are stalled
+;; for several cycles. That case is not modeled here.
+
+;; ALU operations with no shifted operand
+(define_insn_reservation "1020alu_op" 1
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "type" "alu"))
+ "1020a_e,1020a_m,1020a_w")
+
+;; ALU operations with a shift-by-constant operand
+(define_insn_reservation "1020alu_shift_op" 1
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "type" "alu_shift"))
+ "1020a_e,1020a_m,1020a_w")
+
+;; ALU operations with a shift-by-register operand
+;; These really stall in the decoder, in order to read
+;; the shift value in a second cycle. Pretend we take two cycles in
+;; the execute stage.
+(define_insn_reservation "1020alu_shift_reg_op" 2
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "type" "alu_shift_reg"))
+ "1020a_e*2,1020a_m,1020a_w")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Multiplication Instructions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; Multiplication instructions loop in the execute stage until the
+;; instruction has been passed through the multiplier array enough
+;; times.
+
+;; The result of the "smul" and "smulw" instructions is not available
+;; until after the memory stage.
+(define_insn_reservation "1020mult1" 2
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "insn" "smulxy,smulwy"))
+ "1020a_e,1020a_m,1020a_w")
+
+;; The "smlaxy" and "smlawx" instructions require two iterations through
+;; the execute stage; the result is available immediately following
+;; the execute stage.
+(define_insn_reservation "1020mult2" 2
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "insn" "smlaxy,smlalxy,smlawx"))
+ "1020a_e*2,1020a_m,1020a_w")
+
+;; The "smlalxy", "mul", and "mla" instructions require two iterations
+;; through the execute stage; the result is not available until after
+;; the memory stage.
+(define_insn_reservation "1020mult3" 3
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "insn" "smlalxy,mul,mla"))
+ "1020a_e*2,1020a_m,1020a_w")
+
+;; The "muls" and "mlas" instructions loop in the execute stage for
+;; four iterations in order to set the flags. The value result is
+;; available after three iterations.
+(define_insn_reservation "1020mult4" 3
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "insn" "muls,mlas"))
+ "1020a_e*4,1020a_m,1020a_w")
+
+;; Long multiply instructions that produce two registers of
+;; output (such as umull) make their results available in two cycles;
+;; the least significant word is available before the most significant
+;; word. That fact is not modeled; instead, the instructions are
+;; described.as if the entire result was available at the end of the
+;; cycle in which both words are available.
+
+;; The "umull", "umlal", "smull", and "smlal" instructions all take
+;; three iterations through the execute cycle, and make their results
+;; available after the memory cycle.
+(define_insn_reservation "1020mult5" 4
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "insn" "umull,umlal,smull,smlal"))
+ "1020a_e*3,1020a_m,1020a_w")
+
+;; The "umulls", "umlals", "smulls", and "smlals" instructions loop in
+;; the execute stage for five iterations in order to set the flags.
+;; The value result is available after four iterations.
+(define_insn_reservation "1020mult6" 4
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "insn" "umulls,umlals,smulls,smlals"))
+ "1020a_e*5,1020a_m,1020a_w")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Load/Store Instructions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; The models for load/store instructions do not accurately describe
+;; the difference between operations with a base register writeback
+;; (such as "ldm!"). These models assume that all memory references
+;; hit in dcache.
+
+;; LSU instructions require six cycles to execute. They use the ALU
+;; pipeline in all but the 5th cycle, and the LSU pipeline in cycles
+;; three through six.
+;; Loads and stores which use a scaled register offset or scaled
+;; register pre-indexed addressing mode take three cycles EXCEPT for
+;; those that are base + offset with LSL of 0 or 2, or base - offset
+;; with LSL of zero. The remainder take 1 cycle to execute.
+;; For 4byte loads there is a bypass from the load stage
+
+(define_insn_reservation "1020load1_op" 2
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "type" "load_byte,load1"))
+ "1020a_e+1020l_e,1020l_m,1020l_w")
+
+(define_insn_reservation "1020store1_op" 0
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "type" "store1"))
+ "1020a_e+1020l_e,1020l_m,1020l_w")
+
+;; A load's result can be stored by an immediately following store
+(define_bypass 1 "1020load1_op" "1020store1_op" "arm_no_early_store_addr_dep")
+
+;; On a LDM/STM operation, the LSU pipeline iterates until all of the
+;; registers have been processed.
+;;
+;; The time it takes to load the data depends on whether or not the
+;; base address is 64-bit aligned; if it is not, an additional cycle
+;; is required. This model assumes that the address is always 64-bit
+;; aligned. Because the processor can load two registers per cycle,
+;; that assumption means that we use the same instruction reservations
+;; for loading 2k and 2k - 1 registers.
+;;
+;; The ALU pipeline is decoupled after the first cycle unless there is
+;; a register dependency; the dependency is cleared as soon as the LDM/STM
+;; has dealt with the corresponding register. So for example,
+;; stmia sp, {r0-r3}
+;; add r0, r0, #4
+;; will have one fewer stalls than
+;; stmia sp, {r0-r3}
+;; add r3, r3, #4
+;;
+;; As with ALU operations, if one of the destination registers is the
+;; PC, there are additional stalls; that is not modeled.
+
+(define_insn_reservation "1020load2_op" 2
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "type" "load2"))
+ "1020a_e+1020l_e,1020l_m,1020l_w")
+
+(define_insn_reservation "1020store2_op" 0
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "type" "store2"))
+ "1020a_e+1020l_e,1020l_m,1020l_w")
+
+(define_insn_reservation "1020load34_op" 3
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "type" "load3,load4"))
+ "1020a_e+1020l_e,1020l_e+1020l_m,1020l_m,1020l_w")
+
+(define_insn_reservation "1020store34_op" 0
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "type" "store3,store4"))
+ "1020a_e+1020l_e,1020l_e+1020l_m,1020l_m,1020l_w")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Branch and Call Instructions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; Branch instructions are difficult to model accurately. The ARM
+;; core can predict most branches. If the branch is predicted
+;; correctly, and predicted early enough, the branch can be completely
+;; eliminated from the instruction stream. Some branches can
+;; therefore appear to require zero cycles to execute. We assume that
+;; all branches are predicted correctly, and that the latency is
+;; therefore the minimum value.
+
+(define_insn_reservation "1020branch_op" 0
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "type" "branch"))
+ "1020a_e")
+
+;; The latency for a call is not predictable. Therefore, we use 32 as
+;; roughly equivalent to positive infinity.
+
+(define_insn_reservation "1020call_op" 32
+ (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "type" "call"))
+ "1020a_e*32")
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; VFP
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(define_cpu_unit "v10_fmac" "arm1020e")
+
+(define_cpu_unit "v10_ds" "arm1020e")
+
+(define_cpu_unit "v10_fmstat" "arm1020e")
+
+(define_cpu_unit "v10_ls1,v10_ls2,v10_ls3" "arm1020e")
+
+;; fmstat is a serializing instruction. It will stall the core until
+;; the mac and ds units have completed.
+(exclusion_set "v10_fmac,v10_ds" "v10_fmstat")
+
+(define_attr "vfp10" "yes,no"
+ (const (if_then_else (and (eq_attr "tune" "arm1020e,arm1022e")
+ (eq_attr "fpu" "vfp"))
+ (const_string "yes") (const_string "no"))))
+
+;; The VFP "type" attributes differ from those used in the FPA model.
+;; ffarith Fast floating point insns, e.g. abs, neg, cpy, cmp.
+;; farith Most arithmetic insns.
+;; fmul Double precision multiply.
+;; fdivs Single precision sqrt or division.
+;; fdivd Double precision sqrt or division.
+;; f_flag fmstat operation
+;; f_load Floating point load from memory.
+;; f_store Floating point store to memory.
+;; f_2_r Transfer vfp to arm reg.
+;; r_2_f Transfer arm to vfp reg.
+
+;; Note, no instruction can issue to the VFP if the core is stalled in the
+;; first execute state. We model this by using 1020a_e in the first cycle.
+(define_insn_reservation "v10_ffarith" 5
+ (and (eq_attr "vfp10" "yes")
+ (eq_attr "type" "ffarith"))
+ "1020a_e+v10_fmac")
+
+(define_insn_reservation "v10_farith" 5
+ (and (eq_attr "vfp10" "yes")
+ (eq_attr "type" "farith"))
+ "1020a_e+v10_fmac")
+
+(define_insn_reservation "v10_cvt" 5
+ (and (eq_attr "vfp10" "yes")
+ (eq_attr "type" "f_cvt"))
+ "1020a_e+v10_fmac")
+
+(define_insn_reservation "v10_fmul" 6
+ (and (eq_attr "vfp10" "yes")
+ (eq_attr "type" "fmul"))
+ "1020a_e+v10_fmac*2")
+
+(define_insn_reservation "v10_fdivs" 18
+ (and (eq_attr "vfp10" "yes")
+ (eq_attr "type" "fdivs"))
+ "1020a_e+v10_ds*14")
+
+(define_insn_reservation "v10_fdivd" 32
+ (and (eq_attr "vfp10" "yes")
+ (eq_attr "type" "fdivd"))
+ "1020a_e+v10_fmac+v10_ds*28")
+
+(define_insn_reservation "v10_floads" 4
+ (and (eq_attr "vfp10" "yes")
+ (eq_attr "type" "f_loads"))
+ "1020a_e+1020l_e+v10_ls1,v10_ls2")
+
+;; We model a load of a double as needing all the vfp ls* stage in cycle 1.
+;; This gives the correct mix between single-and double loads where a flds
+;; followed by and fldd will stall for one cycle, but two back-to-back fldd
+;; insns stall for two cycles.
+(define_insn_reservation "v10_floadd" 5
+ (and (eq_attr "vfp10" "yes")
+ (eq_attr "type" "f_loadd"))
+ "1020a_e+1020l_e+v10_ls1+v10_ls2+v10_ls3,v10_ls2+v10_ls3,v10_ls3")
+
+;; Moves to/from arm regs also use the load/store pipeline.
+
+(define_insn_reservation "v10_c2v" 4
+ (and (eq_attr "vfp10" "yes")
+ (eq_attr "type" "r_2_f"))
+ "1020a_e+1020l_e+v10_ls1,v10_ls2")
+
+(define_insn_reservation "v10_fstores" 1
+ (and (eq_attr "vfp10" "yes")
+ (eq_attr "type" "f_stores"))
+ "1020a_e+1020l_e+v10_ls1,v10_ls2")
+
+(define_insn_reservation "v10_fstored" 1
+ (and (eq_attr "vfp10" "yes")
+ (eq_attr "type" "f_stored"))
+ "1020a_e+1020l_e+v10_ls1+v10_ls2+v10_ls3,v10_ls2+v10_ls3,v10_ls3")
+
+(define_insn_reservation "v10_v2c" 1
+ (and (eq_attr "vfp10" "yes")
+ (eq_attr "type" "f_2_r"))
+ "1020a_e+1020l_e,1020l_m,1020l_w")
+
+(define_insn_reservation "v10_to_cpsr" 2
+ (and (eq_attr "vfp10" "yes")
+ (eq_attr "type" "f_flag"))
+ "1020a_e+v10_fmstat,1020a_e+1020l_e,1020l_m,1020l_w")
+
+;; VFP bypasses
+
+;; There are bypasses for most operations other than store
+
+(define_bypass 3
+ "v10_c2v,v10_floads"
+ "v10_ffarith,v10_farith,v10_fmul,v10_fdivs,v10_fdivd,v10_cvt")
+
+(define_bypass 4
+ "v10_floadd"
+ "v10_ffarith,v10_farith,v10_fmul,v10_fdivs,v10_fdivd")
+
+;; Arithmetic to other arithmetic saves a cycle due to forwarding
+(define_bypass 4
+ "v10_ffarith,v10_farith"
+ "v10_ffarith,v10_farith,v10_fmul,v10_fdivs,v10_fdivd")
+
+(define_bypass 5
+ "v10_fmul"
+ "v10_ffarith,v10_farith,v10_fmul,v10_fdivs,v10_fdivd")
+
+(define_bypass 17
+ "v10_fdivs"
+ "v10_ffarith,v10_farith,v10_fmul,v10_fdivs,v10_fdivd")
+
+(define_bypass 31
+ "v10_fdivd"
+ "v10_ffarith,v10_farith,v10_fmul,v10_fdivs,v10_fdivd")
+
+;; VFP anti-dependencies.
+
+;; There is one anti-dependence in the following case (not yet modelled):
+;; - After a store: one extra cycle for both fsts and fstd
+;; Note, back-to-back fstd instructions will overload the load/store datapath
+;; causing a two-cycle stall.
diff --git a/gcc/config/arm/ieee754-df.S b/gcc/config/arm/ieee754-df.S
index 44dab20edc4..e0b6a73c076 100644
--- a/gcc/config/arm/ieee754-df.S
+++ b/gcc/config/arm/ieee754-df.S
@@ -1115,7 +1115,7 @@ ARM_FUNC_ALIAS aeabi_cdcmple aeabi_cdcmpeq
ARM_FUNC_START aeabi_dcmpeq
- str lr, [sp, #-4]!
+ str lr, [sp, #-8]!
ARM_CALL aeabi_cdcmple
moveq r0, #1 @ Equal to.
movne r0, #0 @ Less than, greater than, or unordered.
@@ -1125,7 +1125,7 @@ ARM_FUNC_START aeabi_dcmpeq
ARM_FUNC_START aeabi_dcmplt
- str lr, [sp, #-4]!
+ str lr, [sp, #-8]!
ARM_CALL aeabi_cdcmple
movcc r0, #1 @ Less than.
movcs r0, #0 @ Equal to, greater than, or unordered.
@@ -1135,7 +1135,7 @@ ARM_FUNC_START aeabi_dcmplt
ARM_FUNC_START aeabi_dcmple
- str lr, [sp, #-4]!
+ str lr, [sp, #-8]!
ARM_CALL aeabi_cdcmple
movls r0, #1 @ Less than or equal to.
movhi r0, #0 @ Greater than or unordered.
@@ -1145,7 +1145,7 @@ ARM_FUNC_START aeabi_dcmple
ARM_FUNC_START aeabi_dcmpge
- str lr, [sp, #-4]!
+ str lr, [sp, #-8]!
ARM_CALL aeabi_cdrcmple
movls r0, #1 @ Operand 2 is less than or equal to operand 1.
movhi r0, #0 @ Operand 2 greater than operand 1, or unordered.
@@ -1155,7 +1155,7 @@ ARM_FUNC_START aeabi_dcmpge
ARM_FUNC_START aeabi_dcmpgt
- str lr, [sp, #-4]!
+ str lr, [sp, #-8]!
ARM_CALL aeabi_cdrcmple
movcc r0, #1 @ Operand 2 is less than operand 1.
movcs r0, #0 @ Operand 2 is greater than or equal to operand 1,
diff --git a/gcc/config/arm/ieee754-sf.S b/gcc/config/arm/ieee754-sf.S
index 2d48ff67336..1f9be2950d0 100644
--- a/gcc/config/arm/ieee754-sf.S
+++ b/gcc/config/arm/ieee754-sf.S
@@ -327,7 +327,7 @@ ARM_FUNC_ALIAS aeabi_l2f floatdisf
@ For hard FPA code we want to return via the tail below so that
@ we can return the result in f0 as well as in r0 for backwards
@ compatibility.
- str lr, [sp, #-4]!
+ str lr, [sp, #-8]!
adr lr, LSYM(f0_ret)
#endif
@@ -821,7 +821,7 @@ ARM_FUNC_ALIAS aeabi_cfcmple aeabi_cfcmpeq
ARM_FUNC_START aeabi_fcmpeq
- str lr, [sp, #-4]!
+ str lr, [sp, #-8]!
ARM_CALL aeabi_cfcmple
moveq r0, #1 @ Equal to.
movne r0, #0 @ Less than, greater than, or unordered.
@@ -831,7 +831,7 @@ ARM_FUNC_START aeabi_fcmpeq
ARM_FUNC_START aeabi_fcmplt
- str lr, [sp, #-4]!
+ str lr, [sp, #-8]!
ARM_CALL aeabi_cfcmple
movcc r0, #1 @ Less than.
movcs r0, #0 @ Equal to, greater than, or unordered.
@@ -841,7 +841,7 @@ ARM_FUNC_START aeabi_fcmplt
ARM_FUNC_START aeabi_fcmple
- str lr, [sp, #-4]!
+ str lr, [sp, #-8]!
ARM_CALL aeabi_cfcmple
movls r0, #1 @ Less than or equal to.
movhi r0, #0 @ Greater than or unordered.
@@ -851,7 +851,7 @@ ARM_FUNC_START aeabi_fcmple
ARM_FUNC_START aeabi_fcmpge
- str lr, [sp, #-4]!
+ str lr, [sp, #-8]!
ARM_CALL aeabi_cfrcmple
movls r0, #1 @ Operand 2 is less than or equal to operand 1.
movhi r0, #0 @ Operand 2 greater than operand 1, or unordered.
@@ -861,7 +861,7 @@ ARM_FUNC_START aeabi_fcmpge
ARM_FUNC_START aeabi_fcmpgt
- str lr, [sp, #-4]!
+ str lr, [sp, #-8]!
ARM_CALL aeabi_cfrcmple
movcc r0, #1 @ Operand 2 is less than operand 1.
movcs r0, #0 @ Operand 2 is greater than or equal to operand 1,
diff --git a/gcc/config/arm/semi.h b/gcc/config/arm/semi.h
index 8a3587c91dd..840195f48a7 100644
--- a/gcc/config/arm/semi.h
+++ b/gcc/config/arm/semi.h
@@ -69,7 +69,7 @@
%{mcpu=*:-mcpu=%*} \
%{march=*:-march=%*} \
%{mapcs-float:-mfloat} \
-%{msoft-float:-mfloat-abi=soft} %{mhard-float:mfloat-abi=hard} \
+%{msoft-float:-mfloat-abi=soft} %{mhard-float:-mfloat-abi=hard} \
%{mfloat-abi=*} %{mfpu=*} \
%{mthumb-interwork:-mthumb-interwork} \
%(subtarget_extra_asm_spec)"
diff --git a/gcc/config/arm/t-arm b/gcc/config/arm/t-arm
index 21cab03cf6e..9fcd187865a 100644
--- a/gcc/config/arm/t-arm
+++ b/gcc/config/arm/t-arm
@@ -3,6 +3,7 @@
MD_INCLUDES= $(srcdir)/config/arm/arm-tune.md \
$(srcdir)/config/arm/predicates.md \
$(srcdir)/config/arm/arm-generic.md \
+ $(srcdir)/config/arm/arm1020e.md \
$(srcdir)/config/arm/arm1026ejs.md \
$(srcdir)/config/arm/arm1136jfs.md \
$(srcdir)/config/arm/arm926ejs.md \
diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md
index c6ace731e66..443562b629e 100644
--- a/gcc/config/arm/vfp.md
+++ b/gcc/config/arm/vfp.md
@@ -55,53 +55,63 @@
(define_cpu_unit "vfp_ls" "vfp11")
+(define_cpu_unit "fmstat" "vfp11")
+
+(exclusion_set "fmac,ds" "fmstat")
+
;; The VFP "type" attributes differ from those used in the FPA model.
;; ffarith Fast floating point insns, e.g. abs, neg, cpy, cmp.
;; farith Most arithmetic insns.
;; fmul Double precision multiply.
;; fdivs Single precision sqrt or division.
;; fdivd Double precision sqrt or division.
-;; f_load Floating point load from memory.
-;; f_store Floating point store to memory.
+;; f_flag fmstat operation
+;; f_load[sd] Floating point load from memory.
+;; f_store[sd] Floating point store to memory.
;; f_2_r Transfer vfp to arm reg.
;; r_2_f Transfer arm to vfp reg.
+;; f_cvt Convert floating<->integral
(define_insn_reservation "vfp_ffarith" 4
- (and (eq_attr "fpu" "vfp")
+ (and (eq_attr "generic_vfp" "yes")
(eq_attr "type" "ffarith"))
"fmac")
(define_insn_reservation "vfp_farith" 8
- (and (eq_attr "fpu" "vfp")
- (eq_attr "type" "farith"))
+ (and (eq_attr "generic_vfp" "yes")
+ (eq_attr "type" "farith,f_cvt"))
"fmac")
(define_insn_reservation "vfp_fmul" 9
- (and (eq_attr "fpu" "vfp")
+ (and (eq_attr "generic_vfp" "yes")
(eq_attr "type" "fmul"))
"fmac*2")
(define_insn_reservation "vfp_fdivs" 19
- (and (eq_attr "fpu" "vfp")
+ (and (eq_attr "generic_vfp" "yes")
(eq_attr "type" "fdivs"))
"ds*15")
(define_insn_reservation "vfp_fdivd" 33
- (and (eq_attr "fpu" "vfp")
+ (and (eq_attr "generic_vfp" "yes")
(eq_attr "type" "fdivd"))
"fmac+ds*29")
;; Moves to/from arm regs also use the load/store pipeline.
(define_insn_reservation "vfp_fload" 4
- (and (eq_attr "fpu" "vfp")
- (eq_attr "type" "f_load,r_2_f"))
+ (and (eq_attr "generic_vfp" "yes")
+ (eq_attr "type" "f_loads,f_loadd,r_2_f"))
"vfp_ls")
(define_insn_reservation "vfp_fstore" 4
- (and (eq_attr "fpu" "vfp")
- (eq_attr "type" "f_load,f_2_r"))
+ (and (eq_attr "generic_vfp" "yes")
+ (eq_attr "type" "f_stores,f_stored,f_2_r"))
"vfp_ls")
+(define_insn_reservation "vfp_to_cpsr" 4
+ (and (eq_attr "generic_vfp" "yes")
+ (eq_attr "type" "f_flag"))
+ "fmstat,vfp_ls*3")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Insn pattern
@@ -127,7 +137,7 @@
flds%?\\t%0, %1\\t%@ int
fsts%?\\t%1, %0\\t%@ int"
[(set_attr "predicable" "yes")
- (set_attr "type" "*,*,load1,store1,r_2_f,f_2_r,ffarith,f_load,f_store")
+ (set_attr "type" "*,*,load1,store1,r_2_f,f_2_r,ffarith,f_loads,f_stores")
(set_attr "pool_range" "*,*,4096,*,*,*,*,1020,*")
(set_attr "neg_pool_range" "*,*,4084,*,*,*,*,1008,*")]
)
@@ -161,7 +171,7 @@
gcc_unreachable ();
}
"
- [(set_attr "type" "*,load2,store2,r_2_f,f_2_r,ffarith,f_load,f_store")
+ [(set_attr "type" "*,load2,store2,r_2_f,f_2_r,ffarith,f_loadd,f_stored")
(set_attr "length" "8,8,8,4,4,4,4,4")
(set_attr "pool_range" "*,1020,*,*,*,*,1020,*")
(set_attr "neg_pool_range" "*,1008,*,*,*,*,1008,*")]
@@ -186,7 +196,7 @@
fcpys%?\\t%0, %1
mov%?\\t%0, %1\\t%@ float"
[(set_attr "predicable" "yes")
- (set_attr "type" "r_2_f,f_2_r,ffarith,*,f_load,f_store,load1,store1")
+ (set_attr "type" "r_2_f,f_2_r,ffarith,*,f_loads,f_stores,load1,store1")
(set_attr "pool_range" "*,*,1020,*,4096,*,*,*")
(set_attr "neg_pool_range" "*,*,1008,*,4080,*,*,*")]
)
@@ -221,7 +231,7 @@
}
}
"
- [(set_attr "type" "r_2_f,f_2_r,ffarith,*,load2,store2,f_load,f_store")
+ [(set_attr "type" "r_2_f,f_2_r,ffarith,*,load2,store2,f_loadd,f_stored")
(set_attr "length" "4,4,8,8,4,4,4,8")
(set_attr "pool_range" "*,*,1020,*,1020,*,*,*")
(set_attr "neg_pool_range" "*,*,1008,*,1008,*,*,*")]
@@ -572,7 +582,7 @@
"TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP"
"fcvtds%?\\t%P0, %1"
[(set_attr "predicable" "yes")
- (set_attr "type" "farith")]
+ (set_attr "type" "f_cvt")]
)
(define_insn "*truncdfsf2_vfp"
@@ -581,7 +591,7 @@
"TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP"
"fcvtsd%?\\t%0, %P1"
[(set_attr "predicable" "yes")
- (set_attr "type" "farith")]
+ (set_attr "type" "f_cvt")]
)
(define_insn "*truncsisf2_vfp"
@@ -590,7 +600,7 @@
"TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP"
"ftosizs%?\\t%0, %1"
[(set_attr "predicable" "yes")
- (set_attr "type" "farith")]
+ (set_attr "type" "f_cvt")]
)
(define_insn "*truncsidf2_vfp"
@@ -599,7 +609,7 @@
"TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP"
"ftosizd%?\\t%0, %P1"
[(set_attr "predicable" "yes")
- (set_attr "type" "farith")]
+ (set_attr "type" "f_cvt")]
)
@@ -609,7 +619,7 @@
"TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP"
"ftouizs%?\\t%0, %1"
[(set_attr "predicable" "yes")
- (set_attr "type" "farith")]
+ (set_attr "type" "f_cvt")]
)
(define_insn "fixuns_truncdfsi2"
@@ -618,7 +628,7 @@
"TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP"
"ftouizd%?\\t%0, %P1"
[(set_attr "predicable" "yes")
- (set_attr "type" "farith")]
+ (set_attr "type" "f_cvt")]
)
@@ -628,7 +638,7 @@
"TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP"
"fsitos%?\\t%0, %1"
[(set_attr "predicable" "yes")
- (set_attr "type" "farith")]
+ (set_attr "type" "f_cvt")]
)
(define_insn "*floatsidf2_vfp"
@@ -637,7 +647,7 @@
"TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP"
"fsitod%?\\t%P0, %1"
[(set_attr "predicable" "yes")
- (set_attr "type" "farith")]
+ (set_attr "type" "f_cvt")]
)
@@ -647,7 +657,7 @@
"TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP"
"fuitos%?\\t%0, %1"
[(set_attr "predicable" "yes")
- (set_attr "type" "farith")]
+ (set_attr "type" "f_cvt")]
)
(define_insn "floatunssidf2"
@@ -656,7 +666,7 @@
"TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP"
"fuitod%?\\t%P0, %1"
[(set_attr "predicable" "yes")
- (set_attr "type" "farith")]
+ (set_attr "type" "f_cvt")]
)
@@ -689,7 +699,7 @@
"TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP"
"fmstat%?"
[(set_attr "conds" "set")
- (set_attr "type" "ffarith")]
+ (set_attr "type" "f_flag")]
)
(define_insn_and_split "*cmpsf_split_vfp"
@@ -813,7 +823,7 @@
UNSPEC_PUSH_MULT))])]
"TARGET_ARM && TARGET_HARD_FLOAT && TARGET_VFP"
"* return vfp_output_fstmx (operands);"
- [(set_attr "type" "f_store")]
+ [(set_attr "type" "f_stored")]
)
diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c
index 0be2f1c32f5..3de646b025d 100644
--- a/gcc/config/avr/avr.c
+++ b/gcc/config/avr/avr.c
@@ -48,7 +48,6 @@
/* Maximal allowed offset for an address in the LD command */
#define MAX_LD_OFFSET(MODE) (64 - (signed)GET_MODE_SIZE (MODE))
-static bool avr_handle_option (size_t, const char *, int);
static int avr_naked_function_p (tree);
static int interrupt_function_p (tree);
static int signal_function_p (tree);
@@ -111,12 +110,6 @@ static int epilogue_size;
/* Size of all jump tables in the current function, in words. */
static int jump_tables_size;
-/* Initial stack value specified by the `-minit-stack=' option */
-static const char *avr_init_stack = "__stack";
-
-/* Default MCU name */
-static const char *avr_mcu_name = "avr2";
-
/* Preprocessor macros to define depending on MCU type. */
const char *avr_base_arch_macro;
const char *avr_extra_arch_macro;
@@ -245,8 +238,6 @@ int avr_case_values_threshold = 30000;
#define TARGET_ATTRIBUTE_TABLE avr_attribute_table
#undef TARGET_ASM_FUNCTION_RODATA_SECTION
#define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
-#undef TARGET_HANDLE_OPTION
-#define TARGET_HANDLE_OPTION avr_handle_option
#undef TARGET_INSERT_ATTRIBUTES
#define TARGET_INSERT_ATTRIBUTES avr_insert_attributes
#undef TARGET_SECTION_TYPE_FLAGS
@@ -266,26 +257,6 @@ int avr_case_values_threshold = 30000;
struct gcc_target targetm = TARGET_INITIALIZER;
-/* Implement TARGET_HANDLE_OPTION. */
-
-static bool
-avr_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
-{
- switch (code)
- {
- case OPT_minit_stack_:
- avr_init_stack = arg;
- return true;
-
- case OPT_mmcu_:
- avr_mcu_name = arg;
- return true;
-
- default:
- return true;
- }
-}
-
void
avr_override_options (void)
{
@@ -4676,7 +4647,8 @@ avr_handle_progmem_attribute (tree *node, tree name,
}
else
{
- warning (0, "%qs attribute ignored", IDENTIFIER_POINTER (name));
+ warning (OPT_Wattributes, "%qs attribute ignored",
+ IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
}
@@ -4695,7 +4667,7 @@ avr_handle_fndecl_attribute (tree *node, tree name,
{
if (TREE_CODE (*node) != FUNCTION_DECL)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
diff --git a/gcc/config/avr/avr.opt b/gcc/config/avr/avr.opt
index 8d40f926907..303816a24e9 100644
--- a/gcc/config/avr/avr.opt
+++ b/gcc/config/avr/avr.opt
@@ -24,14 +24,14 @@ Target Report Mask(CALL_PROLOGUES)
Use subroutines for function prologues and epilogues
mmcu=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(avr_mcu_name) Init("avr2")
-mmcu=MCU Select the target MCU
mdeb
Target Report Undocumented Mask(ALL_DEBUG)
minit-stack=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(avr_init_stack) Init("__stack")
-minit-stack=STACK Use STACK as the initial value of the stack pointer
mint8
diff --git a/gcc/config/bfin/bfin.c b/gcc/config/bfin/bfin.c
index 653c2003104..ad31579b745 100644
--- a/gcc/config/bfin/bfin.c
+++ b/gcc/config/bfin/bfin.c
@@ -67,8 +67,6 @@ const char *byte_reg_names[] = BYTE_REGISTER_NAMES;
static int arg_regs[] = FUNCTION_ARG_REGISTERS;
-/* The value passed to -mshared-library-id=. */
-static int bfin_library_id;
/* Nonzero if -mshared-library-id was given. */
static int bfin_lib_id_given;
@@ -1272,18 +1270,8 @@ bfin_return_in_memory (tree type)
if (mode == BLKmode)
return 1;
size = int_size_in_bytes (type);
- if (VECTOR_MODE_P (mode) || mode == TImode)
- {
- /* User-created vectors small enough to fit in REG. */
- if (size < 8)
- return 0;
- if (size == 8 || size == 16)
- return 1;
- }
- if (size > 12)
- return 1;
- return 0;
+ return size > 8;
}
/* Register in which address to store a structure value
@@ -1722,8 +1710,6 @@ bfin_handle_option (size_t code, const char *arg, int value)
if (value > MAX_LIBRARY_ID)
error ("-mshared-library-id=%s is not between 0 and %d",
arg, MAX_LIBRARY_ID);
- else
- bfin_library_id = value;
bfin_lib_id_given = 1;
return true;
@@ -2470,7 +2456,7 @@ bfin_adjust_cost (rtx insn, rtx link, rtx dep_insn, int cost)
which perform the memory reference, are allowed to execute before the
jump condition is evaluated.
Therefore, we must insert additional instructions in all places where this
- could lead to incorrect behaviour. The manual recommends CSYNC, while
+ could lead to incorrect behavior. The manual recommends CSYNC, while
VDSP seems to use NOPs (even though its corresponding compiler option is
named CSYNC).
@@ -2558,7 +2544,7 @@ handle_int_attribute (tree *node, tree name,
if (TREE_CODE (x) != FUNCTION_TYPE)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -2685,6 +2671,67 @@ bfin_output_mi_thunk (FILE *file ATTRIBUTE_UNUSED,
output_asm_insn ("jump.l\t%P0", xops);
}
+/* Codes for all the Blackfin builtins. */
+enum bfin_builtins
+{
+ BFIN_BUILTIN_CSYNC,
+ BFIN_BUILTIN_SSYNC,
+ BFIN_BUILTIN_MAX
+};
+
+#define def_builtin(NAME, TYPE, CODE) \
+do { \
+ builtin_function ((NAME), (TYPE), (CODE), BUILT_IN_MD, \
+ NULL, NULL_TREE); \
+} while (0)
+
+/* Set up all builtin functions for this target. */
+static void
+bfin_init_builtins (void)
+{
+ tree void_ftype_void
+ = build_function_type (void_type_node, void_list_node);
+
+ /* Add the remaining MMX insns with somewhat more complicated types. */
+ def_builtin ("__builtin_bfin_csync", void_ftype_void, BFIN_BUILTIN_CSYNC);
+ def_builtin ("__builtin_bfin_ssync", void_ftype_void, BFIN_BUILTIN_SSYNC);
+}
+
+/* Expand an expression EXP that calls a built-in function,
+ with result going to TARGET if that's convenient
+ (and in mode MODE if that's convenient).
+ SUBTARGET may be used as the target for computing one of EXP's operands.
+ IGNORE is nonzero if the value is to be ignored. */
+
+static rtx
+bfin_expand_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
+ rtx subtarget ATTRIBUTE_UNUSED,
+ enum machine_mode mode ATTRIBUTE_UNUSED,
+ int ignore ATTRIBUTE_UNUSED)
+{
+ tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
+ unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
+
+ switch (fcode)
+ {
+ case BFIN_BUILTIN_CSYNC:
+ emit_insn (gen_csync ());
+ return 0;
+ case BFIN_BUILTIN_SSYNC:
+ emit_insn (gen_ssync ());
+ return 0;
+
+ default:
+ gcc_unreachable ();
+ }
+}
+
+#undef TARGET_INIT_BUILTINS
+#define TARGET_INIT_BUILTINS bfin_init_builtins
+
+#undef TARGET_EXPAND_BUILTIN
+#define TARGET_EXPAND_BUILTIN bfin_expand_builtin
+
#undef TARGET_ASM_GLOBALIZE_LABEL
#define TARGET_ASM_GLOBALIZE_LABEL bfin_globalize_label
diff --git a/gcc/config/bfin/bfin.h b/gcc/config/bfin/bfin.h
index 608188ae882..c31072a6e18 100644
--- a/gcc/config/bfin/bfin.h
+++ b/gcc/config/bfin/bfin.h
@@ -1098,8 +1098,9 @@ do { char __buf[256]; \
} while (0)
#define ASM_OUTPUT_ALIGN(FILE,LOG) \
- do { \
- fprintf (FILE, ".align %d\n", LOG); \
+ do { \
+ if ((LOG) != 0) \
+ fprintf (FILE, "\t.align %d\n", 1 << (LOG)); \
} while (0)
#define ASM_OUTPUT_SKIP(FILE,SIZE) \
diff --git a/gcc/config/bfin/bfin.md b/gcc/config/bfin/bfin.md
index 986e649e3ca..1fc015e5975 100644
--- a/gcc/config/bfin/bfin.md
+++ b/gcc/config/bfin/bfin.md
@@ -120,7 +120,9 @@
(UNSPEC_PUSH_MULTIPLE 5)])
(define_constants
- [(UNSPEC_VOLATILE_EH_RETURN 0)])
+ [(UNSPEC_VOLATILE_EH_RETURN 0)
+ (UNSPEC_VOLATILE_CSYNC 1)
+ (UNSPEC_VOLATILE_SSYNC 2)])
(define_attr "type"
"move,mvi,mcld,mcst,dsp32,mult,alu0,shft,brcc,br,call,misc,compare,dummy"
@@ -1838,6 +1840,18 @@
gcc_unreachable ();
})
+(define_insn "csync"
+ [(unspec_volatile [(const_int 0)] UNSPEC_VOLATILE_CSYNC)]
+ ""
+ "csync;"
+ [(set_attr "type" "misc")])
+
+(define_insn "ssync"
+ [(unspec_volatile [(const_int 0)] UNSPEC_VOLATILE_SSYNC)]
+ ""
+ "ssync;"
+ [(set_attr "type" "misc")])
+
;;; Vector instructions
(define_insn "addv2hi"
diff --git a/gcc/config/bfin/bfin.opt b/gcc/config/bfin/bfin.opt
index 827947d5e6a..e8458907fec 100644
--- a/gcc/config/bfin/bfin.opt
+++ b/gcc/config/bfin/bfin.opt
@@ -36,5 +36,9 @@ Target Report Mask(ID_SHARED_LIBRARY)
Enabled ID based shared library
mshared-library-id=
-Target RejectNegative Joined UInteger
+Target RejectNegative Joined UInteger Var(bfin_library_id)
ID of shared library to build
+
+mlong-calls
+Target Report Mask(LONG_CALLS)
+Avoid generating pc-relative calls; use indirection
diff --git a/gcc/config/bfin/predicates.md b/gcc/config/bfin/predicates.md
index 53448844dda..a1f66daa34d 100644
--- a/gcc/config/bfin/predicates.md
+++ b/gcc/config/bfin/predicates.md
@@ -119,7 +119,7 @@
;; reg + const, which the patterns can't handle.
;; We only allow SYMBOL_REF if !flag_pic.
(define_predicate "call_insn_operand"
- (ior (and (match_test "!flag_pic") (match_code "symbol_ref"))
+ (ior (and (match_test "!flag_pic && !TARGET_LONG_CALLS") (match_code "symbol_ref"))
(match_operand 0 "register_no_elim_operand")))
;; Test for an operator valid in a conditional branch
diff --git a/gcc/config/bfin/uclinux.h b/gcc/config/bfin/uclinux.h
new file mode 100644
index 00000000000..d68008a93ab
--- /dev/null
+++ b/gcc/config/bfin/uclinux.h
@@ -0,0 +1,10 @@
+#undef STARTFILE_SPEC
+#define STARTFILE_SPEC \
+ "crt1%O%s crti%O%s crtbegin%O%s"
+
+#undef ENDFILE_SPEC
+#define ENDFILE_SPEC \
+ "crtend%O%s crtn%O%s"
+
+#undef LIB_SPEC
+#define LIB_SPEC "%{pthread:-lpthread} -lc"
diff --git a/gcc/config/c4x/c4x-c.c b/gcc/config/c4x/c4x-c.c
index fa30b439f39..5118871ac2d 100644
--- a/gcc/config/c4x/c4x-c.c
+++ b/gcc/config/c4x/c4x-c.c
@@ -57,7 +57,7 @@ static int c4x_parse_pragma (const char *, tree *, tree *);
the STRING_CST node of the string. If SECT is null, then this
pragma doesn't take a section string. Returns 0 for a good pragma,
-1 for a malformed pragma. */
-#define BAD(msgid, arg) do { warning (0, msgid, arg); return -1; } while (0)
+#define BAD(gmsgid, arg) do { warning (0, gmsgid, arg); return -1; } while (0)
static int
c4x_parse_pragma (name, func, sect)
diff --git a/gcc/config/c4x/c4x.c b/gcc/config/c4x/c4x.c
index 09985446191..110dfcc00aa 100644
--- a/gcc/config/c4x/c4x.c
+++ b/gcc/config/c4x/c4x.c
@@ -153,7 +153,6 @@ enum machine_mode c4x_caller_save_map[FIRST_PSEUDO_REGISTER] =
rtx c4x_compare_op0;
rtx c4x_compare_op1;
-int c4x_rpts_cycles = 0; /* Max. cycles for RPTS. */
int c4x_cpu_version = 40; /* CPU version C30/31/32/33/40/44. */
/* Pragma definitions. */
@@ -291,10 +290,6 @@ c4x_handle_option (size_t code, const char *arg, int value)
}
return false;
- case OPT_mrpts_:
- c4x_rpts_cycles = value;
- return true;
-
default:
return true;
}
@@ -4486,7 +4481,7 @@ c4x_handle_fntype_attribute (tree *node, tree name,
{
if (TREE_CODE (*node) != FUNCTION_TYPE)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
diff --git a/gcc/config/c4x/c4x.h b/gcc/config/c4x/c4x.h
index 832ed8e4609..10aebc85a02 100644
--- a/gcc/config/c4x/c4x.h
+++ b/gcc/config/c4x/c4x.h
@@ -121,7 +121,6 @@
RPTS blocks interrupts. */
-extern int c4x_rpts_cycles; /* Max cycles for RPTS. */
extern int c4x_cpu_version; /* Cpu version C30/31/32/33/40/44. */
#define TARGET_INLINE (! optimize_size) /* Inline MPYI. */
@@ -1700,8 +1699,7 @@ if (final_sequence != NULL_RTX) \
{"any_operand", {SUBREG, REG, MEM, CONST_INT, CONST_DOUBLE}}, \
{"par_ind_operand", {MEM}}, \
{"parallel_operand", {SUBREG, REG, MEM}}, \
- {"symbolic_address_operand", {SYMBOL_REF, LABEL_REF, CONST}}, \
- {"mem_operand", {MEM}},
+ {"symbolic_address_operand", {SYMBOL_REF, LABEL_REF, CONST}},
/* Define the intrinsic functions for the c3x/c4x. */
diff --git a/gcc/config/c4x/c4x.opt b/gcc/config/c4x/c4x.opt
index a135e632fe4..43288463575 100644
--- a/gcc/config/c4x/c4x.opt
+++ b/gcc/config/c4x/c4x.opt
@@ -128,7 +128,7 @@ Target Report Mask(RPTS)
Enable use of RTPS instruction
mrpts=
-Target RejectNegative Joined UInteger
+Target RejectNegative Joined UInteger Var(c4x_rpts_cycles)
-mrpts=N Set the maximum number of iterations for RPTS to N
msmall
diff --git a/gcc/config/cris/aout.h b/gcc/config/cris/aout.h
index 0b6e61e3cf1..f39676cdaa5 100644
--- a/gcc/config/cris/aout.h
+++ b/gcc/config/cris/aout.h
@@ -94,10 +94,6 @@ Boston, MA 02111-1307, USA. */
+ MASK_ALIGN_BY_32); \
break; \
\
- case OPT_melinux_stacksize_: \
- cris_elinux_stacksize_str = (ARG); \
- break; \
- \
default: \
break; \
} \
diff --git a/gcc/config/cris/aout.opt b/gcc/config/cris/aout.opt
index f51dc2e68fc..b821d576fa0 100644
--- a/gcc/config/cris/aout.opt
+++ b/gcc/config/cris/aout.opt
@@ -27,6 +27,8 @@ melinux
Target Report RejectNegative
Compile for the MMU-less Etrax 100-based elinux system
+;; We don't parse it currently; it's just passed on to the linker.
+;; We might want to do something here someday.
melinux-stacksize=
-Target Report RejectNegative Joined
+Target Report RejectNegative Joined Var(cris_elinux_stacksize_str)
-melinux-stacksize=SIZE For elinux, request a specified stack-size for this program
diff --git a/gcc/config/cris/cris.c b/gcc/config/cris/cris.c
index 81e3ce6fb39..0bc8b8cf8aa 100644
--- a/gcc/config/cris/cris.c
+++ b/gcc/config/cris/cris.c
@@ -132,18 +132,6 @@ static tree cris_md_asm_clobbers (tree, tree, tree);
static bool cris_handle_option (size_t, const char *, int);
-/* This is the argument from the "-max-stack-stackframe=" option. */
-const char *cris_max_stackframe_str;
-
-/* This is the argument from the "-march=" option. */
-const char *cris_cpu_str;
-
-/* This is the argument from the "-mtune=" option. */
-const char *cris_tune_str;
-
-/* This is the argument from the "-melinux-stacksize=" option. */
-const char *cris_elinux_stacksize_str;
-
/* This is the parsed result of the "-max-stack-stackframe=" option. If
it (still) is zero, then there was no such option given. */
int cris_max_stackframe = 0;
@@ -2073,20 +2061,6 @@ cris_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
+ MASK_DATA_ALIGN);
break;
- case OPT_max_stackframe_:
- case OPT_mmax_stackframe_:
- cris_max_stackframe_str = arg;
- break;
-
- case OPT_march_:
- case OPT_mcpu_:
- cris_cpu_str = arg;
- break;
-
- case OPT_mtune_:
- cris_tune_str = arg;
- break;
-
default:
break;
}
diff --git a/gcc/config/cris/cris.h b/gcc/config/cris/cris.h
index bdf48238016..4f998d05fa7 100644
--- a/gcc/config/cris/cris.h
+++ b/gcc/config/cris/cris.h
@@ -75,23 +75,9 @@ Boston, MA 02111-1307, USA. */
((MODE) != BLKmode ? GET_MODE_SIZE (MODE) \
: (unsigned) int_size_in_bytes (TYPE))
-/* Check for max allowed stackframe. A "const char *" to be parsed. */
-extern const char *cris_max_stackframe_str;
-
-/* Which CPU version this is. A "const char *" to be parsed. */
-extern const char *cris_cpu_str;
-
/* Which CPU version this is. The parsed and adjusted cris_cpu_str. */
extern int cris_cpu_version;
-/* Which CPU version to tune for. A "const char *" to be parsed. */
-extern const char *cris_tune_str;
-
-/* The argument to "-melinux-stacksize=". We don't parse it currently;
- it's just passed on to the linker. We might want to do something
- here someday. */
-extern const char *cris_elinux_stacksize_str;
-
/* Changing the order used to be necessary to put the fourth __make_dp
argument (a DImode parameter) in registers, to fit with the libfunc
parameter passing scheme used for intrinsic functions. FIXME: Check
diff --git a/gcc/config/cris/cris.opt b/gcc/config/cris/cris.opt
index 0aad8e7d14c..c828f61f3b0 100644
--- a/gcc/config/cris/cris.opt
+++ b/gcc/config/cris/cris.opt
@@ -159,22 +159,22 @@ Target Report RejectNegative
Override -mbest-lib-options
mcpu=
-Target Report RejectNegative Joined Undocumented
+Target Report RejectNegative Joined Undocumented Var(cris_cpu_str)
march=
-Target Report RejectNegative Joined
+Target Report RejectNegative Joined Var(cris_cpu_str) VarExists
-march=ARCH Generate code for the specified chip or CPU version
mtune=
-Target Report RejectNegative Joined
+Target Report RejectNegative Joined Var(cris_tune_str)
-mtune=ARCH Tune alignment for the specified chip or CPU version
mmax-stackframe=
-Target Report RejectNegative Joined
+Target Report RejectNegative Joined Var(cris_max_stackframe_str)
-mmax-stackframe=SIZE Warn when a stackframe is larger than the specified size
max-stackframe=
-Target Report RejectNegative Joined Undocumented
+Target Report RejectNegative Joined Undocumented Var(cris_max_stackframe_str) VarExists
; TARGET_SVINTO: Currently this just affects alignment. FIXME:
; Redundant with TARGET_ALIGN_BY_32, or put machine stuff here?
diff --git a/gcc/config/darwin-c.c b/gcc/config/darwin-c.c
index db0036a0bf5..6eb8d2ba405 100644
--- a/gcc/config/darwin-c.c
+++ b/gcc/config/darwin-c.c
@@ -35,7 +35,7 @@ Boston, MA 02111-1307, USA. */
/* Pragmas. */
-#define BAD(msgid) do { warning (0, msgid); return; } while (0)
+#define BAD(gmsgid) do { warning (0, gmsgid); return; } while (0)
static bool using_frameworks = false;
diff --git a/gcc/config/darwin-protos.h b/gcc/config/darwin-protos.h
index 43ea4cd3363..9154e5608d2 100644
--- a/gcc/config/darwin-protos.h
+++ b/gcc/config/darwin-protos.h
@@ -134,3 +134,4 @@ extern void darwin_globalize_label (FILE *, const char *);
extern void darwin_assemble_visibility (tree, int);
extern void darwin_asm_output_dwarf_delta (FILE *, int, const char *,
const char *);
+extern bool darwin_binds_local_p (tree);
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index 602df2f7f70..f71c612677e 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -43,7 +43,7 @@ Boston, MA 02111-1307, USA. */
#include "langhooks.h"
#include "target.h"
#include "tm_p.h"
-#include "errors.h"
+#include "toplev.h"
#include "hashtab.h"
/* Darwin supports a feature called fix-and-continue, which is used
@@ -1222,7 +1222,8 @@ darwin_handle_weak_import_attribute (tree *node, tree name,
{
if (TREE_CODE (*node) != FUNCTION_DECL && TREE_CODE (*node) != VAR_DECL)
{
- warning (0, "%qs attribute ignored", IDENTIFIER_POINTER (name));
+ warning (OPT_Wattributes, "%qs attribute ignored",
+ IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
else
@@ -1335,8 +1336,8 @@ darwin_assemble_visibility (tree decl, int vis)
fputs ("\n", asm_out_file);
}
else
- warning (0, "internal and protected visibility attributes not supported "
- "in this configuration; ignored");
+ warning (OPT_Wattributes, "internal and protected visibility attributes "
+ "not supported in this configuration; ignored");
}
/* Output a difference of two labels that will be an assembly time
@@ -1380,4 +1381,13 @@ darwin_file_end (void)
fprintf (asm_out_file, "\t.subsections_via_symbols\n");
}
+/* Cross-module name binding. Darwin does not support overriding
+ functions at dynamic-link time. */
+
+bool
+darwin_binds_local_p (tree decl)
+{
+ return default_binds_local_p_1 (decl, 0);
+}
+
#include "gt-darwin.h"
diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h
index c2a53d0b45e..a1d687ff831 100644
--- a/gcc/config/darwin.h
+++ b/gcc/config/darwin.h
@@ -275,6 +275,7 @@ Boston, MA 02111-1307, USA. */
%{Zseg_addr_table*: -seg_addr_table %*} \
%{Zseg_addr_table_filename*:-seg_addr_table_filename %*} \
%{sub_library*} %{sub_umbrella*} \
+ %{isysroot*:-syslibroot %*} \
%{twolevel_namespace} %{twolevel_namespace_hints} \
%{umbrella*} \
%{undefined*} \
@@ -533,6 +534,8 @@ Boston, MA 02111-1307, USA. */
machopic_validate_stub_or_non_lazy_ptr (xname); \
else if (len > 14 && !strcmp ("$non_lazy_ptr", xname + len - 13)) \
machopic_validate_stub_or_non_lazy_ptr (xname); \
+ else if (len > 15 && !strcmp ("$non_lazy_ptr\"", xname + len - 14)) \
+ machopic_validate_stub_or_non_lazy_ptr (xname); \
if (xname[1] != '"' && name_needs_quotes (&xname[1])) \
fprintf (FILE, "\"%s\"", &xname[1]); \
else \
diff --git a/gcc/config/frv/frv-protos.h b/gcc/config/frv/frv-protos.h
index 89107a022ed..a6f6dc480d5 100644
--- a/gcc/config/frv/frv-protos.h
+++ b/gcc/config/frv/frv-protos.h
@@ -204,7 +204,6 @@ extern int accg_operand (rtx, enum machine_mode);
extern rtx frv_matching_accg_for_acc (rtx);
extern void frv_expand_fdpic_call (rtx *, bool, bool);
extern rtx frv_gen_GPsym2reg (rtx, rtx);
-extern void frv_output_dwarf_dtprel (FILE *, int, rtx);
extern int frv_legitimate_memory_operand (rtx, enum machine_mode, int);
/* Information about a relocation unspec. SYMBOL is the relocation symbol
diff --git a/gcc/config/frv/frv.c b/gcc/config/frv/frv.c
index 679b0b433c8..b54c085858d 100644
--- a/gcc/config/frv/frv.c
+++ b/gcc/config/frv/frv.c
@@ -353,6 +353,8 @@ static rtx frv_struct_value_rtx (tree, int);
static bool frv_must_pass_in_stack (enum machine_mode mode, tree type);
static int frv_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
tree, bool);
+static void frv_output_dwarf_dtprel (FILE *, int, rtx)
+ ATTRIBUTE_UNUSED;
/* Allow us to easily change the default for -malloc-cc. */
#ifndef DEFAULT_NO_ALLOC_CC
@@ -426,6 +428,11 @@ static int frv_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode,
#undef TARGET_MACHINE_DEPENDENT_REORG
#define TARGET_MACHINE_DEPENDENT_REORG frv_reorg
+#if HAVE_AS_TLS
+#undef TARGET_ASM_OUTPUT_DWARF_DTPREL
+#define TARGET_ASM_OUTPUT_DWARF_DTPREL frv_output_dwarf_dtprel
+#endif
+
struct gcc_target targetm = TARGET_INITIALIZER;
#define FRV_SYMBOL_REF_TLS_P(RTX) \
@@ -3415,7 +3422,7 @@ frv_legitimate_address_p (enum machine_mode mode,
static rtx
gen_inlined_tls_plt (rtx addr)
{
- rtx mem, retval, dest;
+ rtx retval, dest;
rtx picreg = get_hard_reg_initial_val (Pmode, FDPIC_REG);
@@ -8197,7 +8204,7 @@ frv_int_to_acc (enum insn_code icode, int opnum, rtx opval)
rtx reg;
int i;
- /* ACCs and ACCGs are implicity global registers if media intrinsics
+ /* ACCs and ACCGs are implicit global registers if media intrinsics
are being used. We set up this lazily to avoid creating lots of
unnecessary call_insn rtl in non-media code. */
for (i = 0; i <= ACC_MASK; i++)
@@ -8292,7 +8299,7 @@ frv_read_iacc_argument (enum machine_mode mode, tree *arglistptr)
op = const0_rtx;
}
- /* IACCs are implicity global registers. We set up this lazily to
+ /* IACCs are implicit global registers. We set up this lazily to
avoid creating lots of unnecessary call_insn rtl when IACCs aren't
being used. */
regno = INTVAL (op) + IACC_FIRST;
@@ -8622,7 +8629,7 @@ frv_expand_mdpackh_builtin (tree arglist, rtx target)
op0 = gen_reg_rtx (DImode);
op1 = gen_reg_rtx (DImode);
- /* The high half of each word is not explicitly initialised, so indicate
+ /* The high half of each word is not explicitly initialized, so indicate
that the input operands are not live before this point. */
emit_insn (gen_rtx_CLOBBER (DImode, op0));
emit_insn (gen_rtx_CLOBBER (DImode, op1));
@@ -9098,10 +9105,10 @@ frv_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED,
#define TLS_BIAS (2048 - 16)
-/* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL.
+/* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
We need to emit DTP-relative relocations. */
-void
+static void
frv_output_dwarf_dtprel (FILE *file, int size, rtx x)
{
gcc_assert (size == 4);
diff --git a/gcc/config/frv/frv.h b/gcc/config/frv/frv.h
index 9961758f611..6f2c22d861a 100644
--- a/gcc/config/frv/frv.h
+++ b/gcc/config/frv/frv.h
@@ -2157,19 +2157,8 @@ do { \
#define HAVE_PRE_MODIFY_REG 1
-/* 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,
- `SELECT_CC_MODE' is defined as (see *note Jump Patterns::. for a
- description of the reason for this definition)
-
- #define SELECT_CC_MODE(OP,X,Y) \
- (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \
- ? ((OP == EQ || OP == NE) ? CCFPmode : CCFPEmode) \
- : ((GET_CODE (X) == PLUS || GET_CODE (X) == MINUS \
- || GET_CODE (X) == NEG) \
- ? CC_NOOVmode : CCmode))
-
- You need not define this macro if `EXTRA_CC_MODES' is not defined. */
+/* We define extra CC modes in frv-modes.def so we need a selector. */
+
#define SELECT_CC_MODE frv_select_cc_mode
/* A C expression whose value is one if it is always safe to reverse a
@@ -2372,13 +2361,6 @@ do { \
assemble_name (STREAM, LABEL); \
} while (0)
-#if HAVE_AS_TLS
-/* Emit a dtp-relative reference to a TLS variable. */
-
-#define ASM_OUTPUT_DWARF_DTPREL(FILE, SIZE, X) \
- frv_output_dwarf_dtprel ((FILE), (SIZE), (X))
-#endif
-
/* Whether to emit the gas specific dwarf2 line number support. */
#define DWARF2_ASM_LINE_DEBUG_INFO (TARGET_DEBUG_LOC)
diff --git a/gcc/config/frv/frv.md b/gcc/config/frv/frv.md
index 2feb6c6a7b9..8514da2221a 100644
--- a/gcc/config/frv/frv.md
+++ b/gcc/config/frv/frv.md
@@ -1669,7 +1669,7 @@
;; Note - it is best to only have one movsi pattern and to handle
;; all the various contingencies by the use of alternatives. This
;; allows reload the greatest amount of flexibility (since reload will
-;; only choose amoungst alternatives for a selected insn, it will not
+;; only choose amongst alternatives for a selected insn, it will not
;; replace the insn with another one).
;; Unfortunately, we do have to separate out load-type moves from the rest,
diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c
index 77a776856ff..45fb514f226 100644
--- a/gcc/config/h8300/h8300.c
+++ b/gcc/config/h8300/h8300.c
@@ -5255,7 +5255,7 @@ h8300_handle_fndecl_attribute (tree *node, tree name,
{
if (TREE_CODE (*node) != FUNCTION_DECL)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -5279,7 +5279,8 @@ h8300_handle_eightbit_data_attribute (tree *node, tree name,
}
else
{
- warning (0, "%qs attribute ignored", IDENTIFIER_POINTER (name));
+ warning (OPT_Wattributes, "%qs attribute ignored",
+ IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -5302,7 +5303,8 @@ h8300_handle_tiny_data_attribute (tree *node, tree name,
}
else
{
- warning (0, "%qs attribute ignored", IDENTIFIER_POINTER (name));
+ warning (OPT_Wattributes, "%qs attribute ignored",
+ IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h
index 6b78909b5e3..4c63729cf10 100644
--- a/gcc/config/i386/cygming.h
+++ b/gcc/config/i386/cygming.h
@@ -403,6 +403,10 @@ extern int i386_pe_dllimport_name_p (const char *);
/* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */ \
{ "selectany", 0, 0, true, false, false, ix86_handle_selectany_attribute }
+/* mcount() does not need a counter variable. */
+#undef NO_PROFILE_COUNTERS
+#define NO_PROFILE_COUNTERS 1
+
#undef TREE
#ifndef BUFSIZ
diff --git a/gcc/config/i386/emmintrin.h b/gcc/config/i386/emmintrin.h
index 45624d20190..81a9b151134 100644
--- a/gcc/config/i386/emmintrin.h
+++ b/gcc/config/i386/emmintrin.h
@@ -51,14 +51,14 @@ typedef __v2df __m128d;
static __inline __m128d
_mm_set_sd (double __F)
{
- return (__m128d){ __F, 0 };
+ return __extension__ (__m128d){ __F, 0 };
}
/* Create a vector with both elements equal to F. */
static __inline __m128d
_mm_set1_pd (double __F)
{
- return (__m128d){ __F, __F };
+ return __extension__ (__m128d){ __F, __F };
}
static __inline __m128d
@@ -71,21 +71,21 @@ _mm_set_pd1 (double __F)
static __inline __m128d
_mm_set_pd (double __W, double __X)
{
- return (__m128d){ __X, __W };
+ return __extension__ (__m128d){ __X, __W };
}
/* Create a vector with the lower value W and upper value X. */
static __inline __m128d
_mm_setr_pd (double __W, double __X)
{
- return (__m128d){ __W, __X };
+ return __extension__ (__m128d){ __W, __X };
}
/* Create a vector of zeros. */
static __inline __m128d
_mm_setzero_pd (void)
{
- return (__m128d){ 0.0, 0.0 };
+ return __extension__ (__m128d){ 0.0, 0.0 };
}
/* Sets the low DPFP value of A from the low value of B. */
@@ -553,7 +553,7 @@ _mm_ucomineq_sd (__m128d __A, __m128d __B)
static __inline __m128i
_mm_set_epi64x (long long __q1, long long __q0)
{
- return (__m128i)(__v2di){ __q0, __q1 };
+ return __extension__ (__m128i)(__v2di){ __q0, __q1 };
}
static __inline __m128i
@@ -565,14 +565,15 @@ _mm_set_epi64 (__m64 __q1, __m64 __q0)
static __inline __m128i
_mm_set_epi32 (int __q3, int __q2, int __q1, int __q0)
{
- return (__m128i)(__v4si){ __q0, __q1, __q2, __q3 };
+ return __extension__ (__m128i)(__v4si){ __q0, __q1, __q2, __q3 };
}
static __inline __m128i
_mm_set_epi16 (short __q7, short __q6, short __q5, short __q4,
short __q3, short __q2, short __q1, short __q0)
{
- return (__m128i)(__v8hi){ __q0, __q1, __q2, __q3, __q4, __q5, __q6, __q7 };
+ return __extension__ (__m128i)(__v8hi){
+ __q0, __q1, __q2, __q3, __q4, __q5, __q6, __q7 };
}
static __inline __m128i
@@ -581,7 +582,7 @@ _mm_set_epi8 (char __q15, char __q14, char __q13, char __q12,
char __q07, char __q06, char __q05, char __q04,
char __q03, char __q02, char __q01, char __q00)
{
- return (__m128i)(__v16qi){
+ return __extension__ (__m128i)(__v16qi){
__q00, __q01, __q02, __q03, __q04, __q05, __q06, __q07,
__q08, __q09, __q10, __q11, __q12, __q13, __q14, __q15
};
@@ -712,7 +713,7 @@ _mm_move_epi64 (__m128i __A)
static __inline __m128i
_mm_setzero_si128 (void)
{
- return (__m128i)(__v4si){ 0, 0, 0, 0 };
+ return __extension__ (__m128i)(__v4si){ 0, 0, 0, 0 };
}
static __inline __m128d
@@ -1356,7 +1357,7 @@ _mm_stream_pd (double *__A, __m128d __B)
static __inline void
_mm_clflush (void const *__A)
{
- return __builtin_ia32_clflush (__A);
+ __builtin_ia32_clflush (__A);
}
static __inline void
@@ -1387,37 +1388,37 @@ _mm_cvtsi64x_si128 (long long __A)
/* Casts between various SP, DP, INT vector types. Note that these do no
conversion of values, they just change the type. */
-static inline __m128
+static __inline __m128
_mm_castpd_ps(__m128d __A)
{
return (__m128) __A;
}
-static inline __m128i
+static __inline __m128i
_mm_castpd_si128(__m128d __A)
{
return (__m128i) __A;
}
-static inline __m128d
+static __inline __m128d
_mm_castps_pd(__m128 __A)
{
return (__m128d) __A;
}
-static inline __m128i
+static __inline __m128i
_mm_castps_si128(__m128 __A)
{
return (__m128i) __A;
}
-static inline __m128
+static __inline __m128
_mm_castsi128_ps(__m128i __A)
{
return (__m128) __A;
}
-static inline __m128d
+static __inline __m128d
_mm_castsi128_pd(__m128i __A)
{
return (__m128d) __A;
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index d8f15da9e4c..142eb5ab1de 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -120,8 +120,6 @@ extern const char *output_387_reg_move (rtx, rtx*);
extern const char *output_fix_trunc (rtx, rtx*, int);
extern const char *output_fp_compare (rtx, rtx*, int, int);
-extern void i386_output_dwarf_dtprel (FILE*, int, rtx);
-
extern void ix86_expand_clear (rtx);
extern void ix86_expand_move (enum machine_mode, rtx[]);
extern void ix86_expand_vector_move (enum machine_mode, rtx[]);
@@ -163,7 +161,7 @@ extern void ix86_split_lshrdi (rtx *, rtx);
extern rtx ix86_find_base_term (rtx);
extern int ix86_check_movabs (rtx, int);
-extern rtx assign_386_stack_local (enum machine_mode, int);
+extern rtx assign_386_stack_local (enum machine_mode, enum ix86_stack_slot);
extern int ix86_attr_length_immediate_default (rtx, int);
extern int ix86_attr_length_address_default (rtx);
@@ -191,7 +189,8 @@ extern bool ix86_cannot_change_mode_class (enum machine_mode,
enum machine_mode, enum reg_class);
extern enum reg_class ix86_preferred_reload_class (rtx, enum reg_class);
extern int ix86_memory_move_cost (enum machine_mode, enum reg_class, int);
-extern void emit_i387_cw_initialization (rtx, rtx, int);
+extern int ix86_mode_needed (int, rtx);
+extern void emit_i387_cw_initialization (int);
extern bool ix86_fp_jump_nontrivial_p (enum rtx_code);
extern void x86_order_regs_for_local_alloc (void);
extern void x86_function_profiler (FILE *, int);
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 2ed8edf7753..dfaac94dff0 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -535,7 +535,6 @@ const int x86_deep_branch = m_PPRO | m_K6 | m_ATHLON_K8 | m_PENT4 | m_NOCONA;
const int x86_branch_hints = 0;
const int x86_use_sahf = m_PPRO | m_K6 | m_PENT4 | m_NOCONA;
const int x86_partial_reg_stall = m_PPRO;
-const int x86_use_loop = m_K6;
const int x86_use_himode_fiop = m_386 | m_486 | m_K6;
const int x86_use_simode_fiop = ~(m_PPRO | m_ATHLON_K8 | m_PENT);
const int x86_use_mov0 = m_K6;
@@ -733,7 +732,6 @@ rtx ix86_compare_op0 = NULL_RTX;
rtx ix86_compare_op1 = NULL_RTX;
rtx ix86_compare_emitted = NULL_RTX;
-#define MAX_386_STACK_LOCALS 3
/* Size of the register save area. */
#define X86_64_VARARGS_SIZE (REGPARM_MAX * UNITS_PER_WORD + SSE_REGPARM_MAX * 16)
@@ -787,15 +785,11 @@ struct ix86_frame
bool save_regs_using_mov;
};
-/* Code model option as passed by user. */
-static const char *ix86_cmodel_string;
-/* Parsed value. */
+/* Code model option. */
enum cmodel ix86_cmodel;
/* Asm dialect. */
-static const char *ix86_asm_string;
enum asm_dialect ix86_asm_dialect = ASM_ATT;
/* TLS dialext. */
-static const char *ix86_tls_dialect_string;
enum tls_dialect ix86_tls_dialect = TLS_DIALECT_GNU;
/* Which unit we are generating floating point math for. */
@@ -806,40 +800,17 @@ enum processor_type ix86_tune;
/* Which instruction set architecture to use. */
enum processor_type ix86_arch;
-/* Strings to hold which cpu and instruction set architecture to use. */
-const char *ix86_tune_string; /* for -mtune=<xxx> */
-const char *ix86_arch_string; /* for -march=<xxx> */
-static const char *ix86_fpmath_string; /* for -mfpmath=<xxx> */
-
-/* # of registers to use to pass arguments. */
-static const char *ix86_regparm_string;
-
/* true if sse prefetch instruction is not NOOP. */
int x86_prefetch_sse;
/* ix86_regparm_string as a number */
static int ix86_regparm;
-/* Alignment to use for loops and jumps: */
-
-/* Power of two alignment for loops. */
-static const char *ix86_align_loops_string;
-
-/* Power of two alignment for non-loop jumps. */
-static const char *ix86_align_jumps_string;
-
-/* Power of two alignment for stack boundary in bytes. */
-static const char *ix86_preferred_stack_boundary_string;
-
/* Preferred alignment for stack boundary in bits. */
unsigned int ix86_preferred_stack_boundary;
/* Values 1-5: see jump.c */
int ix86_branch_cost;
-static const char *ix86_branch_cost_string;
-
-/* Power of two alignment for functions. */
-static const char *ix86_align_funcs_string;
/* Prefix built by ASM_GENERATE_INTERNAL_LABEL. */
char internal_label_prefix[16];
@@ -895,6 +866,8 @@ static int ix86_address_cost (rtx);
static bool ix86_cannot_force_const_mem (rtx);
static rtx ix86_delegitimize_address (rtx);
+static void i386_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
+
struct builtin_description;
static rtx ix86_expand_sse_comi (const struct builtin_description *,
tree, rtx);
@@ -1036,6 +1009,11 @@ static void init_ext_80387_constants (void);
#undef TARGET_MS_BITFIELD_LAYOUT_P
#define TARGET_MS_BITFIELD_LAYOUT_P ix86_ms_bitfield_layout_p
+#if TARGET_MACHO
+#undef TARGET_BINDS_LOCAL_P
+#define TARGET_BINDS_LOCAL_P darwin_binds_local_p
+#endif
+
#undef TARGET_ASM_OUTPUT_MI_THUNK
#define TARGET_ASM_OUTPUT_MI_THUNK x86_output_mi_thunk
#undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
@@ -1090,6 +1068,11 @@ static void init_ext_80387_constants (void);
#undef TARGET_VECTOR_MODE_SUPPORTED_P
#define TARGET_VECTOR_MODE_SUPPORTED_P ix86_vector_mode_supported_p
+#ifdef HAVE_AS_TLS
+#undef TARGET_ASM_OUTPUT_DWARF_DTPREL
+#define TARGET_ASM_OUTPUT_DWARF_DTPREL i386_output_dwarf_dtprel
+#endif
+
#ifdef SUBTARGET_INSERT_ATTRIBUTES
#undef TARGET_INSERT_ATTRIBUTES
#define TARGET_INSERT_ATTRIBUTES SUBTARGET_INSERT_ATTRIBUTES
@@ -1107,7 +1090,7 @@ struct gcc_target targetm = TARGET_INITIALIZER;
/* Implement TARGET_HANDLE_OPTION. */
static bool
-ix86_handle_option (size_t code, const char *arg, int value)
+ix86_handle_option (size_t code, const char *arg ATTRIBUTE_UNUSED, int value)
{
switch (code)
{
@@ -1119,38 +1102,6 @@ ix86_handle_option (size_t code, const char *arg, int value)
}
return true;
- case OPT_malign_functions_:
- ix86_align_funcs_string = arg;
- return true;
-
- case OPT_malign_jumps_:
- ix86_align_jumps_string = arg;
- return true;
-
- case OPT_malign_loops_:
- ix86_align_loops_string = arg;
- return true;
-
- case OPT_march_:
- ix86_arch_string = arg;
- return true;
-
- case OPT_masm_:
- ix86_asm_string = arg;
- return true;
-
- case OPT_mbranch_cost_:
- ix86_branch_cost_string = arg;
- return true;
-
- case OPT_mcmodel_:
- ix86_cmodel_string = arg;
- return true;
-
- case OPT_mfpmath_:
- ix86_fpmath_string = arg;
- return true;
-
case OPT_mmmx:
if (!value)
{
@@ -1159,14 +1110,6 @@ ix86_handle_option (size_t code, const char *arg, int value)
}
return true;
- case OPT_mpreferred_stack_boundary_:
- ix86_preferred_stack_boundary_string = arg;
- return true;
-
- case OPT_mregparm_:
- ix86_regparm_string = arg;
- return true;
-
case OPT_msse:
if (!value)
{
@@ -1183,14 +1126,6 @@ ix86_handle_option (size_t code, const char *arg, int value)
}
return true;
- case OPT_mtls_dialect_:
- ix86_tls_dialect_string = arg;
- return true;
-
- case OPT_mtune_:
- ix86_tune_string = arg;
- return true;
-
default:
return true;
}
@@ -1586,7 +1521,7 @@ override_options (void)
target_flags &= ~MASK_NO_FANCY_MATH_387;
/* Likewise, if the target doesn't have a 387, or we've specified
- software floating point, don't use 387 inline instrinsics. */
+ software floating point, don't use 387 inline intrinsics. */
if (!TARGET_80387)
target_flags |= MASK_NO_FANCY_MATH_387;
@@ -1701,6 +1636,11 @@ optimization_options (int level, int size ATTRIBUTE_UNUSED)
flag_schedule_insns = 0;
#endif
+ if (TARGET_MACHO)
+ /* The Darwin libraries never set errno, so we might as well
+ avoid calling them when that's the only reason we would. */
+ flag_errno_math = 0;
+
/* The default values of these switches depend on the TARGET_64BIT
that is not known at this moment. Mark these values with 2 and
let user the to override these. In case there is no command line option
@@ -1815,7 +1755,7 @@ ix86_handle_cdecl_attribute (tree *node, tree name,
&& TREE_CODE (*node) != FIELD_DECL
&& TREE_CODE (*node) != TYPE_DECL)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -1843,7 +1783,8 @@ ix86_handle_cdecl_attribute (tree *node, tree name,
if (TARGET_64BIT)
{
- warning (0, "%qs attribute ignored", IDENTIFIER_POINTER (name));
+ warning (OPT_Wattributes, "%qs attribute ignored",
+ IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -1861,7 +1802,7 @@ ix86_handle_regparm_attribute (tree *node, tree name, tree args,
&& TREE_CODE (*node) != FIELD_DECL
&& TREE_CODE (*node) != TYPE_DECL)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -1872,13 +1813,14 @@ ix86_handle_regparm_attribute (tree *node, tree name, tree args,
cst = TREE_VALUE (args);
if (TREE_CODE (cst) != INTEGER_CST)
{
- warning (0, "%qs attribute requires an integer constant argument",
+ warning (OPT_Wattributes,
+ "%qs attribute requires an integer constant argument",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
else if (compare_tree_int (cst, REGPARM_MAX) > 0)
{
- warning (0, "argument to %qs attribute larger than %d",
+ warning (OPT_Wattributes, "argument to %qs attribute larger than %d",
IDENTIFIER_POINTER (name), REGPARM_MAX);
*no_add_attrs = true;
}
@@ -1920,7 +1862,7 @@ ix86_comp_type_attributes (tree type1, tree type2)
return 1;
}
-/* Return the regparm value for a fuctio with the indicated TYPE and DECL.
+/* Return the regparm value for a function with the indicated TYPE and DECL.
DECL may be NULL when calling function indirectly
or considering a libcall. */
@@ -3162,6 +3104,7 @@ ix86_function_value_regno_p (int regno)
{
return ((regno) == 0
|| ((regno) == FIRST_FLOAT_REG && TARGET_FLOAT_RETURNS_IN_80387)
+ || ((regno) == FIRST_MMX_REG && TARGET_MMX)
|| ((regno) == FIRST_SSE_REG && TARGET_SSE));
}
return ((regno) == 0 || (regno) == FIRST_FLOAT_REG
@@ -3217,10 +3160,10 @@ ix86_return_in_memory (tree type)
if (size < 8)
return 0;
- /* MMX/3dNow values are returned on the stack, since we've
- got to EMMS/FEMMS before returning. */
+ /* MMX/3dNow values are returned in MM0,
+ except when it doesn't exits. */
if (size == 8)
- return 1;
+ return (TARGET_MMX ? 0 : 1);
/* SSE values are returned in XMM0, except when it doesn't exist. */
if (size == 16)
@@ -3249,18 +3192,32 @@ ix86_return_in_memory (tree type)
static rtx
ix86_struct_value_rtx (tree type, int incoming ATTRIBUTE_UNUSED)
{
- static bool warned;
+ static bool warnedsse, warnedmmx;
- if (!TARGET_SSE && type && !warned)
+ if (type)
{
/* Look at the return type of the function, not the function type. */
enum machine_mode mode = TYPE_MODE (TREE_TYPE (type));
- if (mode == TImode
- || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
+ if (!TARGET_SSE && !warnedsse)
{
- warned = true;
- warning (0, "SSE vector return without SSE enabled changes the ABI");
+ if (mode == TImode
+ || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
+ {
+ warnedsse = true;
+ warning (0, "SSE vector return without SSE enabled "
+ "changes the ABI");
+ }
+ }
+
+ if (!TARGET_MMX && !warnedmmx)
+ {
+ if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8)
+ {
+ warnedmmx = true;
+ warning (0, "MMX vector return without MMX enabled "
+ "changes the ABI");
+ }
}
}
@@ -3302,6 +3259,11 @@ ix86_value_regno (enum machine_mode mode, tree func)
{
gcc_assert (!TARGET_64BIT);
+ /* 8-byte vector modes in %mm0. See ix86_return_in_memory for where
+ we prevent this case when mmx is not available. */
+ if ((VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 8))
+ return FIRST_MMX_REG;
+
/* 16-byte vector modes in %xmm0. See ix86_return_in_memory for where
we prevent this case when sse is not available. */
if (mode == TImode || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 16))
@@ -6182,10 +6144,10 @@ output_pic_addr_const (FILE *file, rtx x, int code)
}
}
-/* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL.
+/* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
We need to emit DTP-relative relocations. */
-void
+static void
i386_output_dwarf_dtprel (FILE *file, int size, rtx x)
{
fputs (ASM_LONG, file);
@@ -7395,41 +7357,103 @@ output_387_binary_op (rtx insn, rtx *operands)
return buf;
}
+/* Return needed mode for entity in optimize_mode_switching pass. */
+
+int
+ix86_mode_needed (int entity, rtx insn)
+{
+ enum attr_i387_cw mode;
+
+ /* The mode UNINITIALIZED is used to store control word after a
+ function call or ASM pattern. The mode ANY specify that function
+ has no requirements on the control word and make no changes in the
+ bits we are interested in. */
+
+ if (CALL_P (insn)
+ || (NONJUMP_INSN_P (insn)
+ && (asm_noperands (PATTERN (insn)) >= 0
+ || GET_CODE (PATTERN (insn)) == ASM_INPUT)))
+ return I387_CW_UNINITIALIZED;
+
+ if (recog_memoized (insn) < 0)
+ return I387_CW_ANY;
+
+ mode = get_attr_i387_cw (insn);
+
+ switch (entity)
+ {
+ case I387_TRUNC:
+ if (mode == I387_CW_TRUNC)
+ return mode;
+ break;
+
+ case I387_FLOOR:
+ if (mode == I387_CW_FLOOR)
+ return mode;
+ break;
+
+ case I387_CEIL:
+ if (mode == I387_CW_CEIL)
+ return mode;
+ break;
+
+ case I387_MASK_PM:
+ if (mode == I387_CW_MASK_PM)
+ return mode;
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+
+ return I387_CW_ANY;
+}
+
/* Output code to initialize control word copies used by trunc?f?i and
rounding patterns. CURRENT_MODE is set to current control word,
while NEW_MODE is set to new control word. */
void
-emit_i387_cw_initialization (rtx current_mode, rtx new_mode, int mode)
+emit_i387_cw_initialization (int mode)
{
+ rtx stored_mode = assign_386_stack_local (HImode, SLOT_CW_STORED);
+ rtx new_mode;
+
+ int slot;
+
rtx reg = gen_reg_rtx (HImode);
- emit_insn (gen_x86_fnstcw_1 (current_mode));
- emit_move_insn (reg, current_mode);
+ emit_insn (gen_x86_fnstcw_1 (stored_mode));
+ emit_move_insn (reg, stored_mode);
- if (!TARGET_PARTIAL_REG_STALL && !optimize_size
- && !TARGET_64BIT)
+ if (TARGET_64BIT || TARGET_PARTIAL_REG_STALL || optimize_size)
{
switch (mode)
{
+ case I387_CW_TRUNC:
+ /* round toward zero (truncate) */
+ emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0c00)));
+ slot = SLOT_CW_TRUNC;
+ break;
+
case I387_CW_FLOOR:
/* round down toward -oo */
- emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x4)));
+ emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
+ emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0400)));
+ slot = SLOT_CW_FLOOR;
break;
case I387_CW_CEIL:
/* round up toward +oo */
- emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x8)));
+ emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
+ emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0800)));
+ slot = SLOT_CW_CEIL;
break;
- case I387_CW_TRUNC:
- /* round toward zero (truncate) */
- emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0xc)));
- break;
-
case I387_CW_MASK_PM:
/* mask precision exception for nearbyint() */
emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
+ slot = SLOT_CW_MASK_PM;
break;
default:
@@ -7440,26 +7464,28 @@ emit_i387_cw_initialization (rtx current_mode, rtx new_mode, int mode)
{
switch (mode)
{
+ case I387_CW_TRUNC:
+ /* round toward zero (truncate) */
+ emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0xc)));
+ slot = SLOT_CW_TRUNC;
+ break;
+
case I387_CW_FLOOR:
/* round down toward -oo */
- emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
- emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0400)));
+ emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x4)));
+ slot = SLOT_CW_FLOOR;
break;
case I387_CW_CEIL:
/* round up toward +oo */
- emit_insn (gen_andhi3 (reg, reg, GEN_INT (~0x0c00)));
- emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0800)));
- break;
-
- case I387_CW_TRUNC:
- /* round toward zero (truncate) */
- emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0c00)));
+ emit_insn (gen_movsi_insv_1 (reg, GEN_INT (0x8)));
+ slot = SLOT_CW_CEIL;
break;
-
+
case I387_CW_MASK_PM:
/* mask precision exception for nearbyint() */
emit_insn (gen_iorhi3 (reg, reg, GEN_INT (0x0020)));
+ slot = SLOT_CW_MASK_PM;
break;
default:
@@ -7467,6 +7493,9 @@ emit_i387_cw_initialization (rtx current_mode, rtx new_mode, int mode)
}
}
+ gcc_assert (slot < MAX_386_STACK_LOCALS);
+
+ new_mode = assign_386_stack_local (HImode, slot);
emit_move_insn (new_mode, reg);
}
@@ -12160,11 +12189,11 @@ ix86_init_machine_status (void)
which slot to use. */
rtx
-assign_386_stack_local (enum machine_mode mode, int n)
+assign_386_stack_local (enum machine_mode mode, enum ix86_stack_slot n)
{
struct stack_local_entry *s;
- gcc_assert (n >= 0 && n < MAX_386_STACK_LOCALS);
+ gcc_assert (n < MAX_386_STACK_LOCALS);
for (s = ix86_stack_locals; s; s = s->next)
if (s->mode == mode && s->n == n)
@@ -14794,13 +14823,13 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
case IX86_BUILTIN_LDMXCSR:
op0 = expand_expr (TREE_VALUE (arglist), NULL_RTX, VOIDmode, 0);
- target = assign_386_stack_local (SImode, 0);
+ target = assign_386_stack_local (SImode, SLOT_TEMP);
emit_move_insn (target, op0);
emit_insn (gen_sse_ldmxcsr (target));
return 0;
case IX86_BUILTIN_STMXCSR:
- target = assign_386_stack_local (SImode, 0);
+ target = assign_386_stack_local (SImode, SLOT_TEMP);
emit_insn (gen_sse_stmxcsr (target));
return copy_to_mode_reg (SImode, target);
@@ -15338,7 +15367,7 @@ ix86_cannot_change_mode_class (enum machine_mode from, enum machine_mode to,
if (from == to)
return false;
- /* x87 registers can't do subreg at all, as all values are reformated
+ /* x87 registers can't do subreg at all, as all values are reformatted
to extended precision. */
if (MAYBE_FLOAT_CLASS_P (class))
return true;
@@ -16054,7 +16083,8 @@ ix86_handle_struct_attribute (tree *node, tree name,
if (!(type && (TREE_CODE (*type) == RECORD_TYPE
|| TREE_CODE (*type) == UNION_TYPE)))
{
- warning (0, "%qs attribute ignored", IDENTIFIER_POINTER (name));
+ warning (OPT_Wattributes, "%qs attribute ignored",
+ IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -16063,7 +16093,7 @@ ix86_handle_struct_attribute (tree *node, tree name,
|| ((is_attribute_p ("gcc_struct", name)
&& lookup_attribute ("ms_struct", TYPE_ATTRIBUTES (*type)))))
{
- warning (0, "%qs incompatible attribute ignored",
+ warning (OPT_Wattributes, "%qs incompatible attribute ignored",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index d65ce49a4c5..c9c4cfc8426 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -146,7 +146,7 @@ extern const int x86_use_leave, x86_push_memory, x86_zero_extend_with_and;
extern const int x86_use_bit_test, x86_cmove, x86_fisttp, x86_deep_branch;
extern const int x86_branch_hints, x86_unroll_strlen;
extern const int x86_double_with_add, x86_partial_reg_stall, x86_movx;
-extern const int x86_use_loop, x86_use_himode_fiop, x86_use_simode_fiop;
+extern const int x86_use_himode_fiop, x86_use_simode_fiop;
extern const int x86_use_mov0, x86_use_cltd, x86_read_modify_write;
extern const int x86_read_modify, x86_split_long_moves;
extern const int x86_promote_QImode, x86_single_stringop, x86_fast_prefix;
@@ -180,7 +180,6 @@ extern int x86_prefetch_sse;
#define TARGET_USE_SAHF ((x86_use_sahf & TUNEMASK) && !TARGET_64BIT)
#define TARGET_MOVX (x86_movx & TUNEMASK)
#define TARGET_PARTIAL_REG_STALL (x86_partial_reg_stall & TUNEMASK)
-#define TARGET_USE_LOOP (x86_use_loop & TUNEMASK)
#define TARGET_USE_HIMODE_FIOP (x86_use_himode_fiop & TUNEMASK)
#define TARGET_USE_SIMODE_FIOP (x86_use_simode_fiop & TUNEMASK)
#define TARGET_USE_MOV0 (x86_use_mov0 & TUNEMASK)
@@ -2072,13 +2071,6 @@ do { \
#define JUMP_TABLES_IN_TEXT_SECTION \
(!TARGET_64BIT && flag_pic && !HAVE_AS_GOTOFF_IN_DATA)
-/* 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. */
@@ -2132,10 +2124,7 @@ enum processor_type
};
extern enum processor_type ix86_tune;
-extern const char *ix86_tune_string;
-
extern enum processor_type ix86_arch;
-extern const char *ix86_arch_string;
enum fpmath_unit
{
@@ -2200,11 +2189,31 @@ extern rtx ix86_compare_emitted;
Post-reload pass may be later used to eliminate the redundant fildcw if
needed. */
+enum ix86_entity
+{
+ I387_TRUNC = 0,
+ I387_FLOOR,
+ I387_CEIL,
+ I387_MASK_PM,
+ MAX_386_ENTITIES
+};
+
+enum ix86_stack_slot
+{
+ SLOT_TEMP = 0,
+ SLOT_CW_STORED,
+ SLOT_CW_TRUNC,
+ SLOT_CW_FLOOR,
+ SLOT_CW_CEIL,
+ SLOT_CW_MASK_PM,
+ MAX_386_STACK_LOCALS
+};
/* Define this macro if the port needs extra instructions inserted
for mode switching in an optimizing compilation. */
-#define OPTIMIZE_MODE_SWITCHING(ENTITY) ix86_optimize_mode_switching
+#define OPTIMIZE_MODE_SWITCHING(ENTITY) \
+ ix86_optimize_mode_switching[(ENTITY)]
/* If you define `OPTIMIZE_MODE_SWITCHING', you have to define this as
initializer for an array of integers. Each initializer element N
@@ -2214,27 +2223,16 @@ extern rtx ix86_compare_emitted;
starting counting at zero - determines the integer that is used to
refer to the mode-switched entity in question. */
-#define NUM_MODES_FOR_MODE_SWITCHING { I387_CW_ANY }
+#define NUM_MODES_FOR_MODE_SWITCHING \
+ { I387_CW_ANY, I387_CW_ANY, I387_CW_ANY, I387_CW_ANY }
/* ENTITY is an integer specifying a mode-switched entity. If
`OPTIMIZE_MODE_SWITCHING' is defined, you must define this macro to
return an integer value not larger than the corresponding element
in `NUM_MODES_FOR_MODE_SWITCHING', to denote the mode that ENTITY
- must be switched into prior to the execution of INSN.
-
- The mode UNINITIALIZED is used to force re-load of possibly previously
- stored control word after function call. The mode ANY specify that
- function has no requirements on the control word and make no changes
- in the bits we are interested in. */
-
-#define MODE_NEEDED(ENTITY, I) \
- (GET_CODE (I) == CALL_INSN \
- || (GET_CODE (I) == INSN && (asm_noperands (PATTERN (I)) >= 0 \
- || GET_CODE (PATTERN (I)) == ASM_INPUT))\
- ? I387_CW_UNINITIALIZED \
- : recog_memoized (I) < 0 \
- ? I387_CW_ANY \
- : get_attr_i387_cw (I))
+ must be switched into prior to the execution of INSN. */
+
+#define MODE_NEEDED(ENTITY, I) ix86_mode_needed ((ENTITY), (I))
/* This macro specifies the order in which modes for ENTITY are
processed. 0 is the highest priority. */
@@ -2247,10 +2245,9 @@ extern rtx ix86_compare_emitted;
#define EMIT_MODE_SET(ENTITY, MODE, HARD_REGS_LIVE) \
((MODE) != I387_CW_ANY && (MODE) != I387_CW_UNINITIALIZED \
- ? emit_i387_cw_initialization (assign_386_stack_local (HImode, 1), \
- assign_386_stack_local (HImode, 2), \
- MODE), 0 \
+ ? emit_i387_cw_initialization (MODE), 0 \
: 0)
+
/* Avoid renaming of stack registers, as doing so in combination with
scheduling just increases amount of live registers at time and in
@@ -2272,7 +2269,7 @@ struct machine_function GTY(())
const char *some_ld_name;
int save_varrargs_registers;
int accesses_prev_frame;
- int optimize_mode_switching;
+ int optimize_mode_switching[MAX_386_ENTITIES];
/* Set by ix86_compute_frame_layout and used by prologue/epilogue expander to
determine the style used. */
int use_fast_prologue_epilogue;
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 9ae0ae9925f..000a18e8092 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -429,7 +429,7 @@
;; Defines rounding mode of an FP operation.
-(define_attr "i387_cw" "floor,ceil,trunc,mask_pm,uninitialized,any"
+(define_attr "i387_cw" "trunc,floor,ceil,mask_pm,uninitialized,any"
(const_string "any"))
;; Describe a user's asm statement.
@@ -1455,7 +1455,7 @@
;; partial register stall can be caused there. Then we use movzx.
(define_insn "*movqi_1"
[(set (match_operand:QI 0 "nonimmediate_operand" "=q,q ,q ,r,r ,?r,m")
- (match_operand:QI 1 "general_operand" " q,qn,qm,q,rn,qm,qn"))]
+ (match_operand:QI 1 "general_operand" " q,qn,qm,q,rn,m ,qn"))]
"GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM"
{
switch (get_attr_type (insn))
@@ -1471,7 +1471,9 @@
}
}
[(set (attr "type")
- (cond [(ne (symbol_ref "optimize_size") (const_int 0))
+ (cond [(eq_attr "alternative" "5")
+ (const_string "imovx")
+ (ne (symbol_ref "optimize_size") (const_int 0))
(const_string "imov")
(and (eq_attr "alternative" "3")
(ior (eq (symbol_ref "TARGET_PARTIAL_REG_STALL")
@@ -1479,7 +1481,7 @@
(eq (symbol_ref "TARGET_QIMODE_MATH")
(const_int 0))))
(const_string "imov")
- (eq_attr "alternative" "3,5")
+ (eq_attr "alternative" "3")
(const_string "imovx")
(and (ne (symbol_ref "TARGET_MOVX")
(const_int 0))
@@ -3664,7 +3666,7 @@
;
else
{
- rtx temp = assign_386_stack_local (SFmode, 0);
+ rtx temp = assign_386_stack_local (SFmode, SLOT_TEMP);
emit_insn (gen_truncdfsf2_with_temp (operands[0], operands[1], temp));
DONE;
}
@@ -3814,7 +3816,7 @@
DONE;
}
else
- operands[2] = assign_386_stack_local (SFmode, 0);
+ operands[2] = assign_386_stack_local (SFmode, SLOT_TEMP);
})
(define_insn "*truncxfsf2_mixed"
@@ -3910,7 +3912,7 @@
DONE;
}
else
- operands[2] = assign_386_stack_local (DFmode, 0);
+ operands[2] = assign_386_stack_local (DFmode, SLOT_TEMP);
})
(define_insn "*truncxfdf2_mixed"
@@ -4151,7 +4153,7 @@
emit_insn (gen_fix_trunc<mode>_i387_fisttp (operands[0], operands[1]));
else
{
- operands[2] = assign_386_stack_local (<MODE>mode, 0);
+ operands[2] = assign_386_stack_local (<MODE>mode, SLOT_TEMP);
emit_insn (gen_fix_trunc<mode>_i387_fisttp_with_temp (operands[0],
operands[1],
operands[2]));
@@ -4227,15 +4229,16 @@
"&& 1"
[(const_int 0)]
{
- ix86_optimize_mode_switching = 1;
- operands[2] = assign_386_stack_local (HImode, 1);
- operands[3] = assign_386_stack_local (HImode, 2);
+ ix86_optimize_mode_switching[I387_TRUNC] = 1;
+
+ operands[2] = assign_386_stack_local (HImode, SLOT_CW_STORED);
+ operands[3] = assign_386_stack_local (HImode, SLOT_CW_TRUNC);
if (memory_operand (operands[0], VOIDmode))
emit_insn (gen_fix_trunc<mode>_i387 (operands[0], operands[1],
operands[2], operands[3]));
else
{
- operands[4] = assign_386_stack_local (<MODE>mode, 0);
+ operands[4] = assign_386_stack_local (<MODE>mode, SLOT_TEMP);
emit_insn (gen_fix_trunc<mode>_i387_with_temp (operands[0], operands[1],
operands[2], operands[3],
operands[4]));
@@ -13066,113 +13069,6 @@
[(set_attr "type" "ibr")
(set_attr "length_immediate" "0")])
-;; Loop instruction
-;;
-;; This is all complicated by the fact that since this is a jump insn
-;; we must handle our own 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
- "!TARGET_64BIT && TARGET_USE_LOOP"
- "
-{
- /* Only use cloop on innermost loops. */
- if (INTVAL (operands[3]) > 1)
- FAIL;
- if (GET_MODE (operands[0]) != SImode)
- FAIL;
- emit_jump_insn (gen_doloop_end_internal (operands[4], operands[0],
- operands[0]));
- DONE;
-}")
-
-(define_insn "doloop_end_internal"
- [(set (pc)
- (if_then_else (ne (match_operand:SI 1 "register_operand" "c,?*r,?*r")
- (const_int 1))
- (label_ref (match_operand 0 "" ""))
- (pc)))
- (set (match_operand:SI 2 "nonimmediate_operand" "=1,1,*m*r")
- (plus:SI (match_dup 1)
- (const_int -1)))
- (clobber (match_scratch:SI 3 "=X,X,r"))
- (clobber (reg:CC FLAGS_REG))]
- "!TARGET_64BIT && TARGET_USE_LOOP
- && (reload_in_progress || reload_completed
- || register_operand (operands[2], VOIDmode))"
-{
- if (which_alternative != 0)
- return "#";
- if (get_attr_length (insn) == 2)
- return "%+loop\t%l0";
- else
- return "dec{l}\t%1\;%+jne\t%l0";
-}
- [(set (attr "length")
- (if_then_else (and (eq_attr "alternative" "0")
- (and (ge (minus (match_dup 0) (pc))
- (const_int -126))
- (lt (minus (match_dup 0) (pc))
- (const_int 128))))
- (const_int 2)
- (const_int 16)))
- ;; We don't know the type before shorten branches. Optimistically expect
- ;; the loop instruction to match.
- (set (attr "type") (const_string "ibr"))])
-
-(define_split
- [(set (pc)
- (if_then_else (ne (match_operand:SI 1 "register_operand" "")
- (const_int 1))
- (match_operand 0 "" "")
- (pc)))
- (set (match_dup 1)
- (plus:SI (match_dup 1)
- (const_int -1)))
- (clobber (match_scratch:SI 2 ""))
- (clobber (reg:CC FLAGS_REG))]
- "!TARGET_64BIT && TARGET_USE_LOOP
- && reload_completed
- && REGNO (operands[1]) != 2"
- [(parallel [(set (reg:CCZ FLAGS_REG)
- (compare:CCZ (plus:SI (match_dup 1) (const_int -1))
- (const_int 0)))
- (set (match_dup 1) (plus:SI (match_dup 1) (const_int -1)))])
- (set (pc) (if_then_else (ne (reg:CCZ FLAGS_REG) (const_int 0))
- (match_dup 0)
- (pc)))]
- "")
-
-(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 FLAGS_REG))]
- "!TARGET_64BIT && TARGET_USE_LOOP
- && reload_completed
- && (! REG_P (operands[2])
- || ! rtx_equal_p (operands[1], operands[2]))"
- [(set (match_dup 3) (match_dup 1))
- (parallel [(set (reg:CCZ FLAGS_REG)
- (compare:CCZ (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:CCZ FLAGS_REG) (const_int 0))
- (match_dup 0)
- (pc)))]
- "")
-
;; Convert setcc + movzbl to xor + setcc if operands don't overlap.
(define_peephole2
@@ -13189,7 +13085,7 @@
(set (strict_low_part (match_dup 5))
(match_dup 2))]
{
- operands[4] = gen_rtx_REG (GET_MODE (operands[0]), 17);
+ operands[4] = gen_rtx_REG (GET_MODE (operands[0]), FLAGS_REG);
operands[5] = gen_lowpart (QImode, operands[3]);
ix86_expand_clear (operands[3]);
})
@@ -13211,7 +13107,7 @@
(set (strict_low_part (match_dup 5))
(match_dup 2))]
{
- operands[4] = gen_rtx_REG (GET_MODE (operands[0]), 17);
+ operands[4] = gen_rtx_REG (GET_MODE (operands[0]), FLAGS_REG);
operands[5] = gen_lowpart (QImode, operands[3]);
ix86_expand_clear (operands[3]);
})
@@ -16316,7 +16212,7 @@
emit_insn (gen_fist<mode>2 (operands[0], operands[1]));
else
{
- operands[2] = assign_386_stack_local (<MODE>mode, 0);
+ operands[2] = assign_386_stack_local (<MODE>mode, SLOT_TEMP);
emit_insn (gen_fist<mode>2_with_temp (operands[0], operands[1],
operands[2]));
}
@@ -16336,10 +16232,10 @@
"&& 1"
[(const_int 0)]
{
- ix86_optimize_mode_switching = 1;
+ ix86_optimize_mode_switching[I387_FLOOR] = 1;
- operands[2] = assign_386_stack_local (HImode, 1);
- operands[3] = assign_386_stack_local (HImode, 2);
+ operands[2] = assign_386_stack_local (HImode, SLOT_CW_STORED);
+ operands[3] = assign_386_stack_local (HImode, SLOT_CW_FLOOR);
emit_insn (gen_frndintxf2_floor_i387 (operands[0], operands[1],
operands[2], operands[3]));
@@ -16418,15 +16314,16 @@
"&& 1"
[(const_int 0)]
{
- ix86_optimize_mode_switching = 1;
- operands[2] = assign_386_stack_local (HImode, 1);
- operands[3] = assign_386_stack_local (HImode, 2);
+ ix86_optimize_mode_switching[I387_FLOOR] = 1;
+
+ operands[2] = assign_386_stack_local (HImode, SLOT_CW_STORED);
+ operands[3] = assign_386_stack_local (HImode, SLOT_CW_FLOOR);
if (memory_operand (operands[0], VOIDmode))
emit_insn (gen_fist<mode>2_floor (operands[0], operands[1],
operands[2], operands[3]));
else
{
- operands[4] = assign_386_stack_local (<MODE>mode, 0);
+ operands[4] = assign_386_stack_local (<MODE>mode, SLOT_TEMP);
emit_insn (gen_fist<mode>2_floor_with_temp (operands[0], operands[1],
operands[2], operands[3],
operands[4]));
@@ -16576,10 +16473,10 @@
"&& 1"
[(const_int 0)]
{
- ix86_optimize_mode_switching = 1;
+ ix86_optimize_mode_switching[I387_CEIL] = 1;
- operands[2] = assign_386_stack_local (HImode, 1);
- operands[3] = assign_386_stack_local (HImode, 2);
+ operands[2] = assign_386_stack_local (HImode, SLOT_CW_STORED);
+ operands[3] = assign_386_stack_local (HImode, SLOT_CW_CEIL);
emit_insn (gen_frndintxf2_ceil_i387 (operands[0], operands[1],
operands[2], operands[3]));
@@ -16658,15 +16555,16 @@
"&& 1"
[(const_int 0)]
{
- ix86_optimize_mode_switching = 1;
- operands[2] = assign_386_stack_local (HImode, 1);
- operands[3] = assign_386_stack_local (HImode, 2);
+ ix86_optimize_mode_switching[I387_CEIL] = 1;
+
+ operands[2] = assign_386_stack_local (HImode, SLOT_CW_STORED);
+ operands[3] = assign_386_stack_local (HImode, SLOT_CW_CEIL);
if (memory_operand (operands[0], VOIDmode))
emit_insn (gen_fist<mode>2_ceil (operands[0], operands[1],
operands[2], operands[3]));
else
{
- operands[4] = assign_386_stack_local (<MODE>mode, 0);
+ operands[4] = assign_386_stack_local (<MODE>mode, SLOT_TEMP);
emit_insn (gen_fist<mode>2_ceil_with_temp (operands[0], operands[1],
operands[2], operands[3],
operands[4]));
@@ -16816,10 +16714,10 @@
"&& 1"
[(const_int 0)]
{
- ix86_optimize_mode_switching = 1;
+ ix86_optimize_mode_switching[I387_TRUNC] = 1;
- operands[2] = assign_386_stack_local (HImode, 1);
- operands[3] = assign_386_stack_local (HImode, 2);
+ operands[2] = assign_386_stack_local (HImode, SLOT_CW_STORED);
+ operands[3] = assign_386_stack_local (HImode, SLOT_CW_TRUNC);
emit_insn (gen_frndintxf2_trunc_i387 (operands[0], operands[1],
operands[2], operands[3]));
@@ -16899,10 +16797,10 @@
"&& 1"
[(const_int 0)]
{
- ix86_optimize_mode_switching = 1;
+ ix86_optimize_mode_switching[I387_MASK_PM] = 1;
- operands[2] = assign_386_stack_local (HImode, 1);
- operands[3] = assign_386_stack_local (HImode, 2);
+ operands[2] = assign_386_stack_local (HImode, SLOT_CW_STORED);
+ operands[3] = assign_386_stack_local (HImode, SLOT_CW_MASK_PM);
emit_insn (gen_frndintxf2_mask_pm_i387 (operands[0], operands[1],
operands[2], operands[3]));
diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
index 5571deebe4e..64337d49e46 100644
--- a/gcc/config/i386/i386.opt
+++ b/gcc/config/i386/i386.opt
@@ -60,15 +60,15 @@ Target Report Mask(ALIGN_DOUBLE)
Align some doubles on dword boundary
malign-functions=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(ix86_align_funcs_string)
Function starts are aligned to this power of 2
malign-jumps=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(ix86_align_jumps_string)
Jump targets are aligned to this power of 2
malign-loops=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(ix86_align_loops_string)
Loop code aligned to this power of 2
malign-stringops
@@ -76,19 +76,19 @@ Target RejectNegative Report InverseMask(NO_ALIGN_STRINGOPS, ALIGN_STRINGOPS)
Align destination of the string operations
march=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(ix86_arch_string)
Generate code for given CPU
masm=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(ix86_asm_string)
Use given assembler dialect
mbranch-cost=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(ix86_branch_cost_string)
Branches are this expensive (1-5, arbitrary units)
mcmodel=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(ix86_cmodel_string)
Use given x86-64 code model
mdebug-addr
@@ -106,7 +106,7 @@ Target Report Mask(FLOAT_RETURNS)
Return values of functions in FPU registers
mfpmath=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(ix86_fpmath_string)
Generate floating point mathematics using given instruction set
mhard-float
@@ -158,7 +158,7 @@ Target RejectNegative Undocumented
;; Deprecated
mpreferred-stack-boundary=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(ix86_preferred_stack_boundary_string)
Attempt to keep stack aligned to this power of 2
mpush-args
@@ -170,7 +170,7 @@ Target RejectNegative Report InverseMask(NO_RED_ZONE, RED_ZONE)
Use red-zone in the x86-64 code
mregparm=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(ix86_regparm_string)
Number of registers used to pass integer arguments
mrtd
@@ -202,7 +202,7 @@ Target Report Mask(STACK_PROBE)
Enable stack probing
mtls-dialect=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(ix86_tls_dialect_string)
Use given thread-local storage dialect
mtls-direct-seg-refs
@@ -210,7 +210,7 @@ Target Report Mask(TLS_DIRECT_SEG_REFS)
Use direct references against %gs when accessing tls data
mtune=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(ix86_tune_string)
Schedule code for given CPU
;; Support Athlon 3Dnow builtins
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 4d664cec10b..48b6cde1692 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -1744,7 +1744,7 @@
(set_attr "mode" "V2DF")])
;; Also define scalar versions. These are used for abs, neg, and
-;; conditional move. Using subregs into vector modes causes regiser
+;; conditional move. Using subregs into vector modes causes register
;; allocation lossage. These patterns do not allow memory operands
;; because the native instructions read the full 128-bits.
diff --git a/gcc/config/i386/winnt.c b/gcc/config/i386/winnt.c
index 74375aa840e..6eae2e74efa 100644
--- a/gcc/config/i386/winnt.c
+++ b/gcc/config/i386/winnt.c
@@ -71,7 +71,7 @@ ix86_handle_shared_attribute (tree *node, tree name,
{
if (TREE_CODE (*node) != VAR_DECL)
{
- warning (0, "%qs attribute only applies to variables",
+ warning (OPT_Wattributes, "%qs attribute only applies to variables",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -466,8 +466,9 @@ i386_pe_encode_section_info (tree decl, rtx rtl, int first)
warning (0, "%J'%D' defined locally after being "
"referenced with dllimport linkage", decl, decl);
else
- warning (0, "%J'%D' redeclared without dllimport attribute "
- "after being referenced with dllimport linkage", decl, decl);
+ warning (OPT_Wattributes, "%J'%D' redeclared without dllimport "
+ "attribute after being referenced with dllimport linkage",
+ decl, decl);
}
}
diff --git a/gcc/config/i386/x86-64.h b/gcc/config/i386/x86-64.h
index 16b06331b98..e900e436b68 100644
--- a/gcc/config/i386/x86-64.h
+++ b/gcc/config/i386/x86-64.h
@@ -1,5 +1,5 @@
/* OS independent definitions for AMD x86-64.
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2005 Free Software Foundation, Inc.
Contributed by Bo Thorsen <bo@suse.de>.
This file is part of GCC.
@@ -49,13 +49,14 @@ Boston, MA 02111-1307, USA. */
#undef ASM_SPEC
#define ASM_SPEC "%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} \
- %{Wa,*:%*} %{m32:--32}"
+ %{Wa,*:%*} %{m32:--32} %{m64:--64}"
#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
/* This is used to align code labels according to Intel recommendations. */
+#ifdef HAVE_GAS_MAX_SKIP_P2ALIGN
#define ASM_OUTPUT_MAX_SKIP_ALIGN(FILE,LOG,MAX_SKIP) \
do { \
if ((LOG) != 0) { \
@@ -63,6 +64,7 @@ Boston, MA 02111-1307, USA. */
else fprintf ((FILE), "\t.p2align %d,,%d\n", (LOG), (MAX_SKIP)); \
} \
} while (0)
+#endif
/* i386 System V Release 4 uses DWARF debugging info.
@@ -70,9 +72,6 @@ Boston, MA 02111-1307, USA. */
#define DWARF2_DEBUGGING_INFO 1
#define DWARF2_UNWIND_INFO 1
-/* Incorrectly autodetected in cross compilation. */
-#undef HAVE_AS_DWARF2_DEBUG_LINE
-#define HAVE_AS_DWARF2_DEBUG_LINE 1
#undef PREFERRED_DEBUGGING_TYPE
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
diff --git a/gcc/config/i386/xmmintrin.h b/gcc/config/i386/xmmintrin.h
index a22b809085e..311ecba581f 100644
--- a/gcc/config/i386/xmmintrin.h
+++ b/gcc/config/i386/xmmintrin.h
@@ -90,7 +90,7 @@ enum _mm_hint
static __inline __m128
_mm_setzero_ps (void)
{
- return (__m128){ 0.0f, 0.0f, 0.0f, 0.0f };
+ return __extension__ (__m128){ 0.0f, 0.0f, 0.0f, 0.0f };
}
/* Perform the respective operation on the lower SPFP (single-precision
@@ -832,14 +832,14 @@ _MM_SET_FLUSH_ZERO_MODE (unsigned int __mode)
static __inline __m128
_mm_set_ss (float __F)
{
- return (__m128)(__v4sf){ __F, 0, 0, 0 };
+ return __extension__ (__m128)(__v4sf){ __F, 0, 0, 0 };
}
/* Create a vector with all four elements equal to F. */
static __inline __m128
_mm_set1_ps (float __F)
{
- return (__m128)(__v4sf){ __F, __F, __F, __F };
+ return __extension__ (__m128)(__v4sf){ __F, __F, __F, __F };
}
static __inline __m128
@@ -894,14 +894,14 @@ _mm_loadr_ps (float const *__P)
static __inline __m128
_mm_set_ps (const float __Z, const float __Y, const float __X, const float __W)
{
- return (__m128)(__v4sf){ __W, __X, __Y, __Z };
+ return __extension__ (__m128)(__v4sf){ __W, __X, __Y, __Z };
}
/* Create the vector [W X Y Z]. */
static __inline __m128
_mm_setr_ps (float __Z, float __Y, float __X, float __W)
{
- return (__m128)(__v4sf){ __Z, __Y, __X, __W };
+ return __extension__ (__m128)(__v4sf){ __Z, __Y, __X, __W };
}
/* Stores the lower SPFP value. */
diff --git a/gcc/config/ia64/ia64-protos.h b/gcc/config/ia64/ia64-protos.h
index 94fa176f7e7..7b097bf56c4 100644
--- a/gcc/config/ia64/ia64-protos.h
+++ b/gcc/config/ia64/ia64-protos.h
@@ -68,7 +68,6 @@ extern void ia64_print_operand (FILE *, rtx, int);
extern enum reg_class ia64_preferred_reload_class (rtx, enum reg_class);
extern enum reg_class ia64_secondary_reload_class (enum reg_class,
enum machine_mode, rtx);
-extern void ia64_output_dwarf_dtprel (FILE*, int, rtx);
extern void process_for_unwind_directive (FILE *, rtx);
extern const char *get_bundle_name (int);
#endif /* RTX_CODE */
@@ -114,3 +113,4 @@ extern enum direction ia64_hpux_function_arg_padding (enum machine_mode, tree);
#endif /* ARGS_SIZE_RTX */
extern void ia64_hpux_handle_builtin_pragma (struct cpp_reader *);
+extern void ia64_output_function_profiler (FILE *, int);
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index c8e0ea398b1..bf9375a4733 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -98,10 +98,6 @@ static const char * const ia64_local_reg_names[80] =
static const char * const ia64_output_reg_names[8] =
{ "out0", "out1", "out2", "out3", "out4", "out5", "out6", "out7" };
-/* Determines whether we use adds, addl, or movl to generate our
- TLS immediate offsets. */
-int ia64_tls_size = 22;
-
/* Which cpu are we scheduling for. */
enum processor_type ia64_tune = PROCESSOR_ITANIUM2;
@@ -236,6 +232,8 @@ static void ia64_file_start (void);
static void ia64_select_rtx_section (enum machine_mode, rtx,
unsigned HOST_WIDE_INT);
+static void ia64_output_dwarf_dtprel (FILE *, int, rtx)
+ ATTRIBUTE_UNUSED;
static void ia64_rwreloc_select_section (tree, int, unsigned HOST_WIDE_INT)
ATTRIBUTE_UNUSED;
static void ia64_rwreloc_unique_section (tree, int)
@@ -373,6 +371,11 @@ static const struct attribute_spec ia64_attribute_table[] =
#undef TARGET_SECTION_TYPE_FLAGS
#define TARGET_SECTION_TYPE_FLAGS ia64_section_type_flags
+#ifdef HAVE_AS_TLS
+#undef TARGET_ASM_OUTPUT_DWARF_DTPREL
+#define TARGET_ASM_OUTPUT_DWARF_DTPREL ia64_output_dwarf_dtprel
+#endif
+
/* ??? ABI doesn't allow us to define this. */
#if 0
#undef TARGET_PROMOTE_FUNCTION_ARGS
@@ -484,7 +487,7 @@ ia64_handle_model_attribute (tree *node, tree name, tree args,
}
else
{
- warning (0, "invalid argument of %qs attribute",
+ warning (OPT_Wattributes, "invalid argument of %qs attribute",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -516,7 +519,8 @@ ia64_handle_model_attribute (tree *node, tree name, tree args,
break;
default:
- warning (0, "%qs attribute ignored", IDENTIFIER_POINTER (name));
+ warning (OPT_Wattributes, "%qs attribute ignored",
+ IDENTIFIER_POINTER (name));
*no_add_attrs = true;
break;
}
@@ -2011,7 +2015,7 @@ mark_reg_gr_used_mask (rtx reg, void *data ATTRIBUTE_UNUSED)
unsigned int regno = REGNO (reg);
if (regno < 32)
{
- unsigned int i, n = HARD_REGNO_NREGS (regno, GET_MODE (reg));
+ unsigned int i, n = hard_regno_nregs[regno][GET_MODE (reg)];
for (i = 0; i < n; ++i)
current_frame_info.gr_used_mask |= 1 << (regno + i);
}
@@ -4154,10 +4158,10 @@ ia64_function_value (tree valtype, tree func ATTRIBUTE_UNUSED)
}
}
-/* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL.
+/* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
We need to emit DTP-relative relocations. */
-void
+static void
ia64_output_dwarf_dtprel (FILE *file, int size, rtx x)
{
gcc_assert (size == 8);
@@ -4821,7 +4825,7 @@ fix_range (const char *const_str)
/* Implement TARGET_HANDLE_OPTION. */
static bool
-ia64_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
+ia64_handle_option (size_t code, const char *arg, int value)
{
switch (code)
{
@@ -4830,15 +4834,9 @@ ia64_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
return true;
case OPT_mtls_size_:
- {
- char *end;
- unsigned long tmp = strtoul (arg, &end, 10);
- if (*end || (tmp != 14 && tmp != 22 && tmp != 64))
- error ("bad value %<%s%> for -mtls-size= switch", arg);
- else
- ia64_tls_size = tmp;
- return true;
- }
+ if (value != 14 && value != 22 && value != 64)
+ error ("bad value %<%s%> for -mtls-size= switch", arg);
+ return true;
case OPT_mtune_:
{
@@ -4874,7 +4872,7 @@ ia64_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
}
}
-/* Handle TARGET_OPTIONS switches. */
+/* Implement OVERRIDE_OPTIONS. */
void
ia64_override_options (void)
@@ -5170,25 +5168,19 @@ update_set_flags (rtx x, struct reg_flags *pflags)
return;
case IF_THEN_ELSE:
- if (SET_DEST (x) == pc_rtx)
- /* X is a conditional branch. */
- return;
- else
- {
- /* X is a conditional move. */
- rtx cond = XEXP (src, 0);
- cond = XEXP (cond, 0);
-
- /* We always split conditional moves into COND_EXEC patterns, so the
- only pattern that can reach here is doloop_end_internal. We don't
- need to do anything special for this pattern. */
- gcc_assert (GET_CODE (cond) == REG && REGNO (cond) == AR_LC_REGNUM);
- return;
- }
+ /* There are three cases here:
+ (1) The destination is (pc), in which case this is a branch,
+ nothing here applies.
+ (2) The destination is ar.lc, in which case this is a
+ doloop_end_internal,
+ (3) The destination is an fp register, in which case this is
+ an fselect instruction.
+ In all cases, nothing we do in this function applies. */
+ return;
default:
if (COMPARISON_P (src)
- && GET_MODE_CLASS (GET_MODE (XEXP (src, 0))) == MODE_FLOAT)
+ && SCALAR_FLOAT_MODE_P (GET_MODE (XEXP (src, 0))))
/* Set pflags->is_fp to 1 so that we know we're dealing
with a floating point comparison when processing the
destination of the SET. */
@@ -7422,7 +7414,9 @@ emit_predicate_relation_info (void)
&& NOTE_LINE_NUMBER (NEXT_INSN (head)) == NOTE_INSN_BASIC_BLOCK)
head = NEXT_INSN (head);
- for (r = PR_REG (0); r < PR_REG (64); r += 2)
+ /* Skip p0, which may be thought to be live due to (reg:DI p0)
+ grabbing the entire block of predicate registers. */
+ for (r = PR_REG (2); r < PR_REG (64); r += 2)
if (REGNO_REG_SET_P (bb->global_live_at_start, r))
{
rtx p = gen_rtx_REG (BImode, r);
@@ -8551,4 +8545,38 @@ ia64_vector_mode_supported_p (enum machine_mode mode)
}
}
+void
+ia64_output_function_profiler (FILE *file, int labelno)
+{
+ if (TARGET_GNU_AS)
+ fputs ("\t.prologue 4, r40\n", file);
+ else
+ fputs ("\t.prologue\n\t.save ar.pfs, r40\n", file);
+ fputs ("\talloc out0 = ar.pfs, 8, 0, 4, 0\n", file);
+
+ if (NO_PROFILE_COUNTERS)
+ fputs ("\tmov out3 = r0\n\t;;\n", file);
+ else
+ {
+ char buf[20];
+ ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
+
+ if (TARGET_AUTO_PIC)
+ fputs ("\tmovl out3 = @gprel(", file);
+ else
+ fputs ("\taddl out3 = @ltoff(", file);
+ assemble_name (file, buf);
+ if (TARGET_AUTO_PIC)
+ fputs (")\n\t;;\n", file);
+ else
+ fputs ("), r1\n\t;;\n", file);
+ }
+
+ fputs ("\t.save rp, r42\n", file);
+ fputs ("\tmov out2 = b0\n", file);
+ fputs ("\t.body\n", file);
+ fputs ("\tmov out1 = r1\n", file);
+ fputs ("\tbr.call.sptk.many b0 = _mcount\n\t;;\n", file);
+}
+
#include "gt-ia64.h"
diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h
index bd32069b171..9753a5dc6c2 100644
--- a/gcc/config/ia64/ia64.h
+++ b/gcc/config/ia64/ia64.h
@@ -67,7 +67,6 @@ extern unsigned int ia64_section_threshold;
#define TARGET_HAVE_TLS true
#endif
-extern int ia64_tls_size;
#define TARGET_TLS14 (ia64_tls_size == 14)
#define TARGET_TLS22 (ia64_tls_size == 22)
#define TARGET_TLS64 (ia64_tls_size == 64)
@@ -506,9 +505,7 @@ while (0)
#define LOCAL_REGNO(REGNO) \
(IN_REGNO_P (REGNO) || LOC_REGNO_P (REGNO))
-/* Given a comparison code (EQ, NE, etc.) and the first operand of a COMPARE,
- return the mode to be used for the comparison. Must be defined if
- EXTRA_CC_MODES is defined. */
+/* We define CCImode in ia64-modes.def so we need a selector. */
#define SELECT_CC_MODE(OP,X,Y) CCmode
@@ -1268,24 +1265,11 @@ do { \
call the profiling subroutine `mcount'. */
#undef FUNCTION_PROFILER
-#define FUNCTION_PROFILER(FILE, LABELNO) \
-do { \
- char buf[20]; \
- ASM_GENERATE_INTERNAL_LABEL (buf, "LP", LABELNO); \
- fputs ("\talloc out0 = ar.pfs, 8, 0, 4, 0\n", FILE); \
- if (TARGET_AUTO_PIC) \
- fputs ("\tmovl out3 = @gprel(", FILE); \
- else \
- fputs ("\taddl out3 = @ltoff(", FILE); \
- assemble_name (FILE, buf); \
- if (TARGET_AUTO_PIC) \
- fputs (");;\n", FILE); \
- else \
- fputs ("), r1;;\n", FILE); \
- fputs ("\tmov out1 = r1\n", FILE); \
- fputs ("\tmov out2 = b0\n", FILE); \
- fputs ("\tbr.call.sptk.many b0 = _mcount;;\n", FILE); \
-} while (0)
+#define FUNCTION_PROFILER(FILE, LABELNO) \
+ ia64_output_function_profiler(FILE, LABELNO)
+
+/* Neither hpux nor linux use profile counters. */
+#define NO_PROFILE_COUNTERS 1
/* Trampolines for Nested Functions. */
@@ -1736,13 +1720,6 @@ do { \
{ "loc79", LOC_REG (79) }, \
}
-/* Emit a dtp-relative reference to a TLS variable. */
-
-#ifdef HAVE_AS_TLS
-#define ASM_OUTPUT_DWARF_DTPREL(FILE, SIZE, X) \
- ia64_output_dwarf_dtprel (FILE, SIZE, X)
-#endif
-
/* A C compound statement to output to stdio stream STREAM the assembler syntax
for an instruction operand X. X is an RTL expression. */
diff --git a/gcc/config/ia64/ia64.opt b/gcc/config/ia64/ia64.opt
index f3790ad1012..25a2cc6a91b 100644
--- a/gcc/config/ia64/ia64.opt
+++ b/gcc/config/ia64/ia64.opt
@@ -89,7 +89,7 @@ Target RejectNegative Joined
Specify range of registers to make fixed
mtls-size=
-Target RejectNegative Joined
+Target RejectNegative Joined UInteger Var(ia64_tls_size) Init(22)
Specify bit size of immediate TLS offsets
mtune=
diff --git a/gcc/config/ia64/ia64intrin.h b/gcc/config/ia64/ia64intrin.h
index 6054219f48a..fba7296aacb 100644
--- a/gcc/config/ia64/ia64intrin.h
+++ b/gcc/config/ia64/ia64intrin.h
@@ -1,91 +1,2 @@
-#ifndef _IA64INTRIN_H_INCLUDED
-#define _IA64INTRIN_H_INCLUDED
-
-/* ??? Overloaded builtins havn't been ported to C++ yet. */
-#ifdef __cplusplus
-
-#define __sync_val_compare_and_swap(PTR, OLD, NEW) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? (__typeof__(*(PTR))) \
- __sync_val_compare_and_swap_4((int *)(void *)(PTR),(int)(OLD),(int)(NEW)) \
- : (__typeof__(*(PTR))) \
- __sync_val_compare_and_swap_8((long *)(void *)(PTR),(long)(OLD),(long)(NEW)))
-
-#define __sync_bool_compare_and_swap(PTR, OLD, NEW) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? __sync_bool_compare_and_swap_4((int *)(void *)(PTR),(int)(OLD),(int)(NEW)) \
- : __sync_bool_compare_and_swap_8((long *)(void *)(PTR),(long)(OLD),(long)(NEW)))
-
-#define __sync_lock_release(PTR) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? __sync_lock_release_4((int *)(void *)(PTR)) \
- : __sync_lock_release_8((long *)(void *)(PTR)))
-
-#define __sync_lock_test_and_set(PTR,VAL) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? (__typeof__(*(PTR))) __sync_lock_test_and_set_4((int *)(void *)(PTR),(int)(VAL)) \
- : (__typeof__(*(PTR))) __sync_lock_test_and_set_8((long *)(void *)(PTR),(long)(VAL)))
-
-#define __sync_fetch_and_add(PTR,VAL) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? (__typeof__(*(PTR))) __sync_fetch_and_add_4((int *)(void *)(PTR),(int)(VAL)) \
- : (__typeof__(*(PTR))) __sync_fetch_and_add_8((long *)(void *)(PTR),(long)(VAL)))
-
-#define __sync_fetch_and_sub(PTR,VAL) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? (__typeof__(*(PTR))) __sync_fetch_and_sub_4((int *)(void *)(PTR),(int)(VAL)) \
- : (__typeof__(*(PTR))) __sync_fetch_and_sub_8((long *)(void *)(PTR),(long)(VAL)))
-
-#define __sync_fetch_and_and(PTR,VAL) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? (__typeof__(*(PTR))) __sync_fetch_and_and_4((int *)(void *)(PTR),(int)(VAL)) \
- : (__typeof__(*(PTR))) __sync_fetch_and_and_8((long *)(void *)(PTR),(long)(VAL)))
-
-#define __sync_fetch_and_or(PTR,VAL) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? (__typeof__(*(PTR))) __sync_fetch_and_or_4((int *)(void *)(PTR),(int)(VAL)) \
- : (__typeof__(*(PTR))) __sync_fetch_and_or_8((long *)(void *)(PTR),(long)(VAL)))
-
-#define __sync_fetch_and_xor(PTR,VAL) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? (__typeof__(*(PTR))) __sync_fetch_and_xor_4((int *)(void *)(PTR),(int)(VAL)) \
- : (__typeof__(*(PTR))) __sync_fetch_and_xor_8((long *)(void *)(PTR),(long)(VAL)))
-
-#define __sync_fetch_and_nand(PTR,VAL) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? (__typeof__(*(PTR))) __sync_fetch_and_nand_4((int *)(void *)(PTR),(int)(VAL)) \
- : (__typeof__(*(PTR))) __sync_fetch_and_nand_8((long *)(void *)(PTR),(long)(VAL)))
-
-#define __sync_add_and_fetch(PTR,VAL) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? (__typeof__(*(PTR))) __sync_add_and_fetch_4((int *)(void *)(PTR),(int)(VAL)) \
- : (__typeof__(*(PTR))) __sync_add_and_fetch_8((long *)(void *)(PTR),(long)(VAL)))
-
-#define __sync_sub_and_fetch(PTR,VAL) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? (__typeof__(*(PTR))) __sync_sub_and_fetch_4((int *)(void *)(PTR),(int)(VAL)) \
- : (__typeof__(*(PTR))) __sync_sub_and_fetch_8((long *)(void *)(PTR),(long)(VAL)))
-
-#define __sync_and_and_fetch(PTR,VAL) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? (__typeof__(*(PTR))) __sync_and_and_fetch_4((int *)(void *)(PTR),(int)(VAL)) \
- : (__typeof__(*(PTR))) __sync_and_and_fetch_8((long *)(void *)(PTR),(long)(VAL)))
-
-#define __sync_or_and_fetch(PTR,VAL) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? (__typeof__(*(PTR))) __sync_or_and_fetch_4((int *)(void *)(PTR),(int)(VAL)) \
- : (__typeof__(*(PTR))) __sync_or_and_fetch_8((long *)(void *)(PTR),(long)(VAL)))
-
-#define __sync_xor_and_fetch(PTR,VAL) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? (__typeof__(*(PTR))) __sync_xor_and_fetch_4((int *)(void *)(PTR),(int)(VAL)) \
- : (__typeof__(*(PTR))) __sync_xor_and_fetch_8((long *)(void *)(PTR),(long)(VAL)))
-
-#define __sync_nand_and_fetch(PTR,VAL) \
- ((sizeof (*(PTR)) == sizeof(int)) \
- ? (__typeof__(*(PTR))) __sync_nand_and_fetch_4((int *)(void *)(PTR),(int)(VAL)) \
- : (__typeof__(*(PTR))) __sync_nand_and_fetch_8((long *)(void *)(PTR),(long)(VAL)))
-
-#endif /* __cplusplus */
-
-#endif /* _IA64INTRIN_H_INCLUDED */
+/* Overloaded builtins have been ported to C++: nothing is needed
+ in the header anymore. This file intentionally left void. */
diff --git a/gcc/config/ia64/vect.md b/gcc/config/ia64/vect.md
index 07e86f9f171..293707d8914 100644
--- a/gcc/config/ia64/vect.md
+++ b/gcc/config/ia64/vect.md
@@ -1,5 +1,5 @@
;; IA-64 machine description for vector operations.
-;; Copyright (C) 2004
+;; Copyright (C) 2004, 2005
;;
;; This file is part of GCC.
;;
@@ -873,30 +873,8 @@
{
rtx x, cmp;
- PUT_MODE (operands[3], V2SFmode);
- switch (GET_CODE (operands[3]))
- {
- case EQ:
- case NE:
- case LT:
- case LE:
- case UNORDERED:
- case ORDERED:
- break;
-
- case GT:
- case GE:
- x = XEXP (operands[3], 0);
- XEXP (operands[3], 0) = XEXP (operands[3], 1);
- XEXP (operands[3], 1) = x;
- PUT_CODE (operands[3], swap_condition (GET_CODE (operands[3])));
- break;
-
- default:
- gcc_unreachable ();
- }
-
cmp = gen_reg_rtx (V2SFmode);
+ PUT_MODE (operands[3], V2SFmode);
emit_insn (gen_rtx_SET (VOIDmode, cmp, operands[3]));
x = gen_rtx_IF_THEN_ELSE (V2SFmode, cmp, operands[1], operands[2]);
@@ -906,12 +884,21 @@
(define_insn "*fpcmp"
[(set (match_operand:V2SF 0 "fr_register_operand" "=f")
+ (match_operator:V2SF 3 "comparison_operator"
+ [(match_operand:V2SF 1 "fr_reg_or_0_operand" "fU")
+ (match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")]))]
+ ""
+ "fpcmp.%D3 %0 = %F1, %F2"
+ [(set_attr "itanium_class" "fmisc")])
+
+(define_insn "*fselect"
+ [(set (match_operand:V2SF 0 "fr_register_operand" "=f")
(if_then_else:V2SF
(match_operand:V2SF 1 "fr_register_operand" "f")
(match_operand:V2SF 2 "fr_reg_or_0_operand" "fU")
(match_operand:V2SF 3 "fr_reg_or_0_operand" "fU")))]
""
- "fselect %0 = %2, %3, %1"
+ "fselect %0 = %F2, %F3, %1"
[(set_attr "itanium_class" "fmisc")])
(define_expand "vec_initv2sf"
diff --git a/gcc/config/ip2k/ip2k.c b/gcc/config/ip2k/ip2k.c
index 314a2c760f8..7542b46b6fe 100644
--- a/gcc/config/ip2k/ip2k.c
+++ b/gcc/config/ip2k/ip2k.c
@@ -3161,7 +3161,8 @@ ip2k_handle_progmem_attribute (tree *node, tree name,
}
else
{
- warning (0, "%qs attribute ignored", IDENTIFIER_POINTER (name));
+ warning (OPT_Wattributes, "%qs attribute ignored",
+ IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
}
@@ -3179,7 +3180,7 @@ ip2k_handle_fndecl_attribute (tree *node, tree name,
{
if (TREE_CODE (*node) != FUNCTION_DECL)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
diff --git a/gcc/config/m32r/m32r-protos.h b/gcc/config/m32r/m32r-protos.h
index 0f72bd7521f..0030f75b147 100644
--- a/gcc/config/m32r/m32r-protos.h
+++ b/gcc/config/m32r/m32r-protos.h
@@ -47,7 +47,7 @@ extern void m32r_initialize_trampoline (rtx, rtx, rtx);
extern int zero_and_one (rtx, rtx);
extern char * emit_cond_move (rtx *, rtx);
extern void m32r_output_block_move (rtx, rtx *);
-extern void m32r_expand_block_move (rtx *);
+extern int m32r_expand_block_move (rtx *);
extern void m32r_print_operand (FILE *, rtx, int);
extern void m32r_print_operand_address (FILE *, rtx);
extern int m32r_not_same_reg (rtx, rtx);
diff --git a/gcc/config/m32r/m32r.c b/gcc/config/m32r/m32r.c
index fbe539433f5..c6c682de97a 100644
--- a/gcc/config/m32r/m32r.c
+++ b/gcc/config/m32r/m32r.c
@@ -64,18 +64,6 @@ enum m32r_sdata m32r_sdata = M32R_SDATA_DEFAULT;
/* For string literals, etc. */
#define LIT_NAME_P(NAME) ((NAME)[0] == '*' && (NAME)[1] == '.')
-/* Cache-flush support. Cache-flush is used at trampoline.
- Default cache-flush is "trap 12".
- default cache-flush function is "_flush_cache" (CACHE_FLUSH_FUNC)
- default cache-flush trap-interrupt number is 12 (CACHE_FLUSH_TRAP)
- You can change how to generate code of cache-flush with following options.
- -mflush-func=FLUSH-FUNC-NAME
- -mno-flush-func (sets m32r_cache_flush_func to NULL)
- -mfluch-trap=TRAP-NUMBER
- -mno-flush-trap. (sets m32r_cache_flush_trap to -1). */
-const char *m32r_cache_flush_func = CACHE_FLUSH_FUNC;
-int m32r_cache_flush_trap = CACHE_FLUSH_TRAP;
-
/* Forward declaration. */
static bool m32r_handle_option (size_t, const char *, int);
static void init_reg_tables (void);
@@ -188,17 +176,12 @@ m32r_handle_option (size_t code, const char *arg, int value)
return false;
return true;
- case OPT_mflush_func_:
- m32r_cache_flush_func = arg;
- return true;
-
case OPT_mno_flush_func:
m32r_cache_flush_func = NULL;
return true;
case OPT_mflush_trap_:
- m32r_cache_flush_trap = value;
- return m32r_cache_flush_trap <= 15;
+ return value <= 15;
case OPT_mno_flush_trap:
m32r_cache_flush_trap = -1;
@@ -387,7 +370,7 @@ m32r_handle_model_attribute (tree *node ATTRIBUTE_UNUSED, tree name,
&& arg != large_ident1
&& arg != large_ident2)
{
- warning (0, "invalid argument of %qs attribute",
+ warning (OPT_Wattributes, "invalid argument of %qs attribute",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -2201,9 +2184,11 @@ block_move_call (rtx dest_reg, rtx src_reg, rtx bytes_rtx)
operands[0] is the pointer to the destination.
operands[1] is the pointer to the source.
operands[2] is the number of bytes to move.
- operands[3] is the alignment. */
+ operands[3] is the alignment.
-void
+ Returns 1 upon success, 0 otherwise. */
+
+int
m32r_expand_block_move (rtx operands[])
{
rtx orig_dst = operands[0];
@@ -2218,7 +2203,7 @@ m32r_expand_block_move (rtx operands[])
rtx dst_reg;
if (constp && bytes <= 0)
- return;
+ return 1;
/* Move the address into scratch registers. */
dst_reg = copy_addr_to_reg (XEXP (orig_dst, 0));
@@ -2233,7 +2218,7 @@ m32r_expand_block_move (rtx operands[])
if (optimize_size || ! constp || align != UNITS_PER_WORD)
{
block_move_call (dst_reg, src_reg, bytes_rtx);
- return;
+ return 0;
}
leftover = bytes % MAX_MOVE_BYTES;
@@ -2290,6 +2275,7 @@ m32r_expand_block_move (rtx operands[])
emit_insn (gen_movmemsi_internal (dst_reg, src_reg, GEN_INT (leftover),
gen_reg_rtx (SImode),
gen_reg_rtx (SImode)));
+ return 1;
}
diff --git a/gcc/config/m32r/m32r.h b/gcc/config/m32r/m32r.h
index a83886f3cef..5747c4491e2 100644
--- a/gcc/config/m32r/m32r.h
+++ b/gcc/config/m32r/m32r.h
@@ -209,10 +209,6 @@
#define TARGET_CPU_DEFAULT 0
#endif
-/* Cache-flush support. */
-extern const char * m32r_cache_flush_func;
-extern int m32r_cache_flush_trap;
-
/* Code Models
Code models are used to select between two choices of two separate
diff --git a/gcc/config/m32r/m32r.md b/gcc/config/m32r/m32r.md
index 20f37d3f36c..817c3c0287a 100644
--- a/gcc/config/m32r/m32r.md
+++ b/gcc/config/m32r/m32r.md
@@ -2542,10 +2542,12 @@
""
"
{
- if (operands[0]) /* avoid unused code messages */
+ if (operands[0]) /* Avoid unused code messages. */
{
- m32r_expand_block_move (operands);
- DONE;
+ if (m32r_expand_block_move (operands))
+ DONE;
+ else
+ FAIL;
}
}")
diff --git a/gcc/config/m32r/m32r.opt b/gcc/config/m32r/m32r.opt
index 73287852bb5..85fb8ede1da 100644
--- a/gcc/config/m32r/m32r.opt
+++ b/gcc/config/m32r/m32r.opt
@@ -48,11 +48,11 @@ Target Mask(DEBUG)
Display compile time statistics
mflush-func=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(m32r_cache_flush_func) Init(CACHE_FLUSH_FUNC)
Specify cache flush function
mflush-trap=
-Target RejectNegative Joined UInteger
+Target RejectNegative Joined UInteger Var(m32r_cache_flush_trap) Init(CACHE_FLUSH_TRAP)
Specify cache flush trap number
missue-rate=1
diff --git a/gcc/config/m68hc11/m68hc11.c b/gcc/config/m68hc11/m68hc11.c
index 6b68d25fdf7..30f2ff9e740 100644
--- a/gcc/config/m68hc11/m68hc11.c
+++ b/gcc/config/m68hc11/m68hc11.c
@@ -1115,7 +1115,8 @@ m68hc11_handle_page0_attribute (tree *node, tree name,
}
else
{
- warning (0, "%qs attribute ignored", IDENTIFIER_POINTER (name));
+ warning (OPT_Wattributes, "%qs attribute ignored",
+ IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -1151,7 +1152,7 @@ m68hc11_handle_fntype_attribute (tree *node, tree name,
&& TREE_CODE (*node) != FIELD_DECL
&& TREE_CODE (*node) != TYPE_DECL)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -1236,13 +1237,14 @@ m68hc11_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
trap_handler = lookup_attribute ("trap", func_attr) != NULL_TREE;
if (trap_handler && is_far)
{
- warning (0, "%<trap%> and %<far%> attributes are not compatible, ignoring %<far%>");
+ warning (OPT_Wattributes, "%<trap%> and %<far%> attributes are "
+ "not compatible, ignoring %<far%>");
trap_handler = 0;
}
if (trap_handler)
{
if (trap_handler_symbol != 0)
- warning (0, "%<trap%> attribute is already used");
+ warning (OPT_Wattributes, "%<trap%> attribute is already used");
else
trap_handler_symbol = XEXP (rtl, 0);
}
@@ -5016,7 +5018,7 @@ m68hc11_reorg (void)
replacement, unshare everything. */
unshare_all_rtl_again (first);
- /* Force a split of all splitable insn. This is necessary for the
+ /* Force a split of all splittable insn. This is necessary for the
Z register replacement mechanism because we end up with basic insns. */
split_all_insns_noflow ();
split_done = 1;
diff --git a/gcc/config/m68hc11/m68hc11.h b/gcc/config/m68hc11/m68hc11.h
index bdbe31ef66f..7ec76bf7cbd 100644
--- a/gcc/config/m68hc11/m68hc11.h
+++ b/gcc/config/m68hc11/m68hc11.h
@@ -450,7 +450,7 @@ SOFT_REG_FIRST+28, SOFT_REG_FIRST+29,SOFT_REG_FIRST+30,SOFT_REG_FIRST+31
For any two classes, it is very desirable that there be another
class that represents their union. */
-/* The M68hc11 has so fiew registers that it's not possible for GCC to
+/* The M68hc11 has so few registers that it's not possible for GCC to
do any register allocation without breaking. We extend the processor
registers by having soft registers. These registers are treated as
hard registers by GCC but they are located in memory and accessed by page0
diff --git a/gcc/config/m68k/m68k-none.h b/gcc/config/m68k/m68k-none.h
index 79463b84abc..378197d8308 100644
--- a/gcc/config/m68k/m68k-none.h
+++ b/gcc/config/m68k/m68k-none.h
@@ -86,8 +86,8 @@ Unrecognized value in TARGET_CPU_DEFAULT.
"
/* cc1/cc1plus always receives all the -m flags. If the specs strings above
- are consistent with the TARGET_OPTIONS flags in m68k.h, there should be no
- need for any further cc1/cc1plus specs. */
+ are consistent with the flags in m68k.opt, there should be no need for
+ any further cc1/cc1plus specs. */
#undef CC1_SPEC
#define CC1_SPEC ""
diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c
index e456317fb1d..9db2ddd7fdd 100644
--- a/gcc/config/m68k/m68k.c
+++ b/gcc/config/m68k/m68k.c
@@ -373,7 +373,7 @@ m68k_handle_fndecl_attribute (tree *node, tree name,
{
if (TREE_CODE (*node) != FUNCTION_DECL)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
diff --git a/gcc/config/mcore/mcore.c b/gcc/config/mcore/mcore.c
index fff8a3e2896..a2c963aac8a 100644
--- a/gcc/config/mcore/mcore.c
+++ b/gcc/config/mcore/mcore.c
@@ -2117,7 +2117,7 @@ mcore_expand_epilog (void)
/* The MCORE cannot load a large constant into a register, constants have to
come from a pc relative load. The reference of a pc relative load
- instruction must be less than 1k infront of the instruction. This
+ instruction must be less than 1k in front of the instruction. This
means that we often have to dump a constant inside a function, and
generate code to branch around it.
@@ -3029,7 +3029,7 @@ mcore_handle_naked_attribute (tree * node, tree name, tree args ATTRIBUTE_UNUSED
}
else
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
diff --git a/gcc/config/mips/mips-protos.h b/gcc/config/mips/mips-protos.h
index 8fa82a72e3b..89afa25f242 100644
--- a/gcc/config/mips/mips-protos.h
+++ b/gcc/config/mips/mips-protos.h
@@ -184,7 +184,7 @@ extern void mips_declare_common_object (FILE *, const char *,
const char *, unsigned HOST_WIDE_INT,
unsigned int, bool);
extern void mips_declare_object (FILE *, const char *, const char *,
- const char *, ...);
+ const char *, ...) ATTRIBUTE_PRINTF_4;
extern void mips_declare_object_name (FILE *, const char *, tree);
extern void mips_finish_declare_object (FILE *, tree, int, int);
@@ -222,5 +222,6 @@ extern rtx mips_prefetch_cookie (rtx, rtx);
extern void irix_asm_output_align (FILE *, unsigned);
extern const char *current_section_name (void);
extern unsigned int current_section_flags (void);
+extern bool mips_use_ins_ext_p (rtx, rtx, rtx);
#endif /* ! GCC_MIPS_PROTOS_H */
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index 9faddde503d..45490fd970e 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -397,6 +397,10 @@ struct machine_function GTY(()) {
refers to GP relative global variables. */
rtx mips16_gp_pseudo_rtx;
+ /* The number of extra stack bytes taken up by register varargs.
+ This area is allocated by the callee at the very top of the frame. */
+ int varargs_size;
+
/* Current frame information, calculated by compute_frame_size. */
struct mips_frame_info frame;
@@ -549,21 +553,18 @@ int mips_isa;
/* Which ABI to use. */
int mips_abi = MIPS_ABI_DEFAULT;
+/* Cost information to use. */
+const struct mips_rtx_cost_data *mips_cost;
+
/* Whether we are generating mips16 hard float code. In mips16 mode
we always set TARGET_SOFT_FLOAT; this variable is nonzero if
-msoft-float was not specified by the user, which means that we
should arrange to call mips32 hard floating point code. */
int mips16_hard_float;
-/* The arguments passed to -march and -mtune. */
-static const char *mips_arch_string;
-static const char *mips_tune_string;
-
/* The architecture selected by -mipsN. */
static const struct mips_cpu_info *mips_isa_info;
-const char *mips_cache_flush_func = CACHE_FLUSH_FUNC;
-
/* If TRUE, we split addresses into their high and low parts in the RTL. */
int mips_split_addresses;
@@ -714,6 +715,256 @@ const struct mips_cpu_info mips_cpu_info_table[] = {
/* End marker */
{ 0, 0, 0 }
};
+
+/* Default costs. If these are used for a processor we should look
+ up the actual costs. */
+#define DEFAULT_COSTS COSTS_N_INSNS (6), /* fp_add */ \
+ COSTS_N_INSNS (7), /* fp_mult_sf */ \
+ COSTS_N_INSNS (8), /* fp_mult_df */ \
+ COSTS_N_INSNS (23), /* fp_div_sf */ \
+ COSTS_N_INSNS (36), /* fp_div_df */ \
+ COSTS_N_INSNS (10), /* int_mult_si */ \
+ COSTS_N_INSNS (10), /* int_mult_di */ \
+ COSTS_N_INSNS (69), /* int_div_si */ \
+ COSTS_N_INSNS (69), /* int_div_di */ \
+ 2, /* branch_cost */ \
+ 4 /* memory_latency */
+
+/* Need to replace these with the costs of calling the appropriate
+ libgcc routine. */
+#define SOFT_FP_COSTS COSTS_N_INSNS (256), /* fp_add */ \
+ COSTS_N_INSNS (256), /* fp_mult_sf */ \
+ COSTS_N_INSNS (256), /* fp_mult_df */ \
+ COSTS_N_INSNS (256), /* fp_div_sf */ \
+ COSTS_N_INSNS (256) /* fp_div_df */
+
+static struct mips_rtx_cost_data const mips_rtx_cost_data[PROCESSOR_MAX] =
+ {
+ { /* R3000 */
+ COSTS_N_INSNS (2), /* fp_add */
+ COSTS_N_INSNS (4), /* fp_mult_sf */
+ COSTS_N_INSNS (5), /* fp_mult_df */
+ COSTS_N_INSNS (12), /* fp_div_sf */
+ COSTS_N_INSNS (19), /* fp_div_df */
+ COSTS_N_INSNS (12), /* int_mult_si */
+ COSTS_N_INSNS (12), /* int_mult_di */
+ COSTS_N_INSNS (35), /* int_div_si */
+ COSTS_N_INSNS (35), /* int_div_di */
+ 1, /* branch_cost */
+ 4 /* memory_latency */
+
+ },
+ { /* 4KC */
+ SOFT_FP_COSTS,
+ COSTS_N_INSNS (6), /* int_mult_si */
+ COSTS_N_INSNS (6), /* int_mult_di */
+ COSTS_N_INSNS (36), /* int_div_si */
+ COSTS_N_INSNS (36), /* int_div_di */
+ 1, /* branch_cost */
+ 4 /* memory_latency */
+ },
+ { /* 4KP */
+ SOFT_FP_COSTS,
+ COSTS_N_INSNS (36), /* int_mult_si */
+ COSTS_N_INSNS (36), /* int_mult_di */
+ COSTS_N_INSNS (37), /* int_div_si */
+ COSTS_N_INSNS (37), /* int_div_di */
+ 1, /* branch_cost */
+ 4 /* memory_latency */
+ },
+ { /* 5KC */
+ DEFAULT_COSTS
+ },
+ { /* 20KC */
+ DEFAULT_COSTS
+ },
+ { /* 24k */
+ COSTS_N_INSNS (8), /* fp_add */
+ COSTS_N_INSNS (8), /* fp_mult_sf */
+ COSTS_N_INSNS (10), /* fp_mult_df */
+ COSTS_N_INSNS (34), /* fp_div_sf */
+ COSTS_N_INSNS (64), /* fp_div_df */
+ COSTS_N_INSNS (5), /* int_mult_si */
+ COSTS_N_INSNS (5), /* int_mult_di */
+ COSTS_N_INSNS (41), /* int_div_si */
+ COSTS_N_INSNS (41), /* int_div_di */
+ 1, /* branch_cost */
+ 4 /* memory_latency */
+ },
+ { /* 24kx */
+ COSTS_N_INSNS (4), /* fp_add */
+ COSTS_N_INSNS (4), /* fp_mult_sf */
+ COSTS_N_INSNS (5), /* fp_mult_df */
+ COSTS_N_INSNS (17), /* fp_div_sf */
+ COSTS_N_INSNS (32), /* fp_div_df */
+ COSTS_N_INSNS (5), /* int_mult_si */
+ COSTS_N_INSNS (5), /* int_mult_di */
+ COSTS_N_INSNS (41), /* int_div_si */
+ COSTS_N_INSNS (41), /* int_div_di */
+ 1, /* branch_cost */
+ 4 /* memory_latency */
+ },
+ { /* M4k */
+ DEFAULT_COSTS
+ },
+ { /* R3900 */
+ COSTS_N_INSNS (2), /* fp_add */
+ COSTS_N_INSNS (4), /* fp_mult_sf */
+ COSTS_N_INSNS (5), /* fp_mult_df */
+ COSTS_N_INSNS (12), /* fp_div_sf */
+ COSTS_N_INSNS (19), /* fp_div_df */
+ COSTS_N_INSNS (2), /* int_mult_si */
+ COSTS_N_INSNS (2), /* int_mult_di */
+ COSTS_N_INSNS (35), /* int_div_si */
+ COSTS_N_INSNS (35), /* int_div_di */
+ 1, /* branch_cost */
+ 4 /* memory_latency */
+ },
+ { /* R6000 */
+ COSTS_N_INSNS (3), /* fp_add */
+ COSTS_N_INSNS (5), /* fp_mult_sf */
+ COSTS_N_INSNS (6), /* fp_mult_df */
+ COSTS_N_INSNS (15), /* fp_div_sf */
+ COSTS_N_INSNS (16), /* fp_div_df */
+ COSTS_N_INSNS (17), /* int_mult_si */
+ COSTS_N_INSNS (17), /* int_mult_di */
+ COSTS_N_INSNS (38), /* int_div_si */
+ COSTS_N_INSNS (38), /* int_div_di */
+ 2, /* branch_cost */
+ 6 /* memory_latency */
+ },
+ { /* R4000 */
+ COSTS_N_INSNS (6), /* fp_add */
+ COSTS_N_INSNS (7), /* fp_mult_sf */
+ COSTS_N_INSNS (8), /* fp_mult_df */
+ COSTS_N_INSNS (23), /* fp_div_sf */
+ COSTS_N_INSNS (36), /* fp_div_df */
+ COSTS_N_INSNS (10), /* int_mult_si */
+ COSTS_N_INSNS (10), /* int_mult_di */
+ COSTS_N_INSNS (69), /* int_div_si */
+ COSTS_N_INSNS (69), /* int_div_di */
+ 2, /* branch_cost */
+ 6 /* memory_latency */
+ },
+ { /* R4100 */
+ DEFAULT_COSTS
+ },
+ { /* R4111 */
+ DEFAULT_COSTS
+ },
+ { /* R4120 */
+ DEFAULT_COSTS
+ },
+ { /* R4130 */
+ /* The only costs that appear to be updated here are
+ integer multiplication. */
+ SOFT_FP_COSTS,
+ COSTS_N_INSNS (4), /* int_mult_si */
+ COSTS_N_INSNS (6), /* int_mult_di */
+ COSTS_N_INSNS (69), /* int_div_si */
+ COSTS_N_INSNS (69), /* int_div_di */
+ 1, /* branch_cost */
+ 4 /* memory_latency */
+ },
+ { /* R4300 */
+ DEFAULT_COSTS
+ },
+ { /* R4600 */
+ DEFAULT_COSTS
+ },
+ { /* R4650 */
+ DEFAULT_COSTS
+ },
+ { /* R5000 */
+ COSTS_N_INSNS (6), /* fp_add */
+ COSTS_N_INSNS (4), /* fp_mult_sf */
+ COSTS_N_INSNS (5), /* fp_mult_df */
+ COSTS_N_INSNS (23), /* fp_div_sf */
+ COSTS_N_INSNS (36), /* fp_div_df */
+ COSTS_N_INSNS (5), /* int_mult_si */
+ COSTS_N_INSNS (5), /* int_mult_di */
+ COSTS_N_INSNS (36), /* int_div_si */
+ COSTS_N_INSNS (36), /* int_div_di */
+ 1, /* branch_cost */
+ 4 /* memory_latency */
+ },
+ { /* R5400 */
+ COSTS_N_INSNS (6), /* fp_add */
+ COSTS_N_INSNS (5), /* fp_mult_sf */
+ COSTS_N_INSNS (6), /* fp_mult_df */
+ COSTS_N_INSNS (30), /* fp_div_sf */
+ COSTS_N_INSNS (59), /* fp_div_df */
+ COSTS_N_INSNS (3), /* int_mult_si */
+ COSTS_N_INSNS (4), /* int_mult_di */
+ COSTS_N_INSNS (42), /* int_div_si */
+ COSTS_N_INSNS (74), /* int_div_di */
+ 1, /* branch_cost */
+ 4 /* memory_latency */
+ },
+ { /* R5500 */
+ COSTS_N_INSNS (6), /* fp_add */
+ COSTS_N_INSNS (5), /* fp_mult_sf */
+ COSTS_N_INSNS (6), /* fp_mult_df */
+ COSTS_N_INSNS (30), /* fp_div_sf */
+ COSTS_N_INSNS (59), /* fp_div_df */
+ COSTS_N_INSNS (5), /* int_mult_si */
+ COSTS_N_INSNS (9), /* int_mult_di */
+ COSTS_N_INSNS (42), /* int_div_si */
+ COSTS_N_INSNS (74), /* int_div_di */
+ 1, /* branch_cost */
+ 4 /* memory_latency */
+ },
+ { /* R7000 */
+ /* The only costs that are changed here are
+ integer multiplication. */
+ COSTS_N_INSNS (6), /* fp_add */
+ COSTS_N_INSNS (7), /* fp_mult_sf */
+ COSTS_N_INSNS (8), /* fp_mult_df */
+ COSTS_N_INSNS (23), /* fp_div_sf */
+ COSTS_N_INSNS (36), /* fp_div_df */
+ COSTS_N_INSNS (5), /* int_mult_si */
+ COSTS_N_INSNS (9), /* int_mult_di */
+ COSTS_N_INSNS (69), /* int_div_si */
+ COSTS_N_INSNS (69), /* int_div_di */
+ 1, /* branch_cost */
+ 4 /* memory_latency */
+ },
+ { /* R8000 */
+ DEFAULT_COSTS
+ },
+ { /* R9000 */
+ /* The only costs that are changed here are
+ integer multiplication. */
+ COSTS_N_INSNS (6), /* fp_add */
+ COSTS_N_INSNS (7), /* fp_mult_sf */
+ COSTS_N_INSNS (8), /* fp_mult_df */
+ COSTS_N_INSNS (23), /* fp_div_sf */
+ COSTS_N_INSNS (36), /* fp_div_df */
+ COSTS_N_INSNS (3), /* int_mult_si */
+ COSTS_N_INSNS (8), /* int_mult_di */
+ COSTS_N_INSNS (69), /* int_div_si */
+ COSTS_N_INSNS (69), /* int_div_di */
+ 1, /* branch_cost */
+ 4 /* memory_latency */
+ },
+ { /* SB1 */
+ COSTS_N_INSNS (4), /* fp_add */
+ COSTS_N_INSNS (4), /* fp_mult_sf */
+ COSTS_N_INSNS (4), /* fp_mult_df */
+ COSTS_N_INSNS (24), /* fp_div_sf */
+ COSTS_N_INSNS (32), /* fp_div_df */
+ COSTS_N_INSNS (3), /* int_mult_si */
+ COSTS_N_INSNS (4), /* int_mult_di */
+ COSTS_N_INSNS (36), /* int_div_si */
+ COSTS_N_INSNS (68), /* int_div_di */
+ 1, /* branch_cost */
+ 4 /* memory_latency */
+ },
+ { /* SR71000 */
+ DEFAULT_COSTS
+ },
+ };
+
/* Nonzero if -march should decide the default value of MASK_SOFT_FLOAT. */
#ifndef MIPS_MARCH_CONTROLS_SOFT_FLOAT
@@ -2090,75 +2341,78 @@ static bool
mips_rtx_costs (rtx x, int code, int outer_code, int *total)
{
enum machine_mode mode = GET_MODE (x);
+ bool float_mode_p = FLOAT_MODE_P (mode);
switch (code)
{
case CONST_INT:
- if (!TARGET_MIPS16)
- {
- /* Always return 0, since we don't have different sized
- instructions, hence different costs according to Richard
- Kenner */
- *total = 0;
- return true;
- }
-
- /* A number between 1 and 8 inclusive is efficient for a shift.
- Otherwise, we will need an extended instruction. */
- if ((outer_code) == ASHIFT || (outer_code) == ASHIFTRT
- || (outer_code) == LSHIFTRT)
+ if (TARGET_MIPS16)
{
- if (INTVAL (x) >= 1 && INTVAL (x) <= 8)
- *total = 0;
- else
- *total = COSTS_N_INSNS (1);
- return true;
- }
+ /* A number between 1 and 8 inclusive is efficient for a shift.
+ Otherwise, we will need an extended instruction. */
+ if ((outer_code) == ASHIFT || (outer_code) == ASHIFTRT
+ || (outer_code) == LSHIFTRT)
+ {
+ if (INTVAL (x) >= 1 && INTVAL (x) <= 8)
+ *total = 0;
+ else
+ *total = COSTS_N_INSNS (1);
+ return true;
+ }
- /* We can use cmpi for an xor with an unsigned 16 bit value. */
- if ((outer_code) == XOR
- && INTVAL (x) >= 0 && INTVAL (x) < 0x10000)
- {
- *total = 0;
- return true;
- }
+ /* We can use cmpi for an xor with an unsigned 16 bit value. */
+ if ((outer_code) == XOR
+ && INTVAL (x) >= 0 && INTVAL (x) < 0x10000)
+ {
+ *total = 0;
+ return true;
+ }
- /* We may be able to use slt or sltu for a comparison with a
- signed 16 bit value. (The boundary conditions aren't quite
- right, but this is just a heuristic anyhow.) */
- if (((outer_code) == LT || (outer_code) == LE
- || (outer_code) == GE || (outer_code) == GT
- || (outer_code) == LTU || (outer_code) == LEU
- || (outer_code) == GEU || (outer_code) == GTU)
- && INTVAL (x) >= -0x8000 && INTVAL (x) < 0x8000)
- {
- *total = 0;
- return true;
- }
+ /* We may be able to use slt or sltu for a comparison with a
+ signed 16 bit value. (The boundary conditions aren't quite
+ right, but this is just a heuristic anyhow.) */
+ if (((outer_code) == LT || (outer_code) == LE
+ || (outer_code) == GE || (outer_code) == GT
+ || (outer_code) == LTU || (outer_code) == LEU
+ || (outer_code) == GEU || (outer_code) == GTU)
+ && INTVAL (x) >= -0x8000 && INTVAL (x) < 0x8000)
+ {
+ *total = 0;
+ return true;
+ }
- /* Equality comparisons with 0 are cheap. */
- if (((outer_code) == EQ || (outer_code) == NE)
- && INTVAL (x) == 0)
- {
- *total = 0;
- return true;
- }
+ /* Equality comparisons with 0 are cheap. */
+ if (((outer_code) == EQ || (outer_code) == NE)
+ && INTVAL (x) == 0)
+ {
+ *total = 0;
+ return true;
+ }
- /* Constants in the range 0...255 can be loaded with an unextended
- instruction. They are therefore as cheap as a register move.
+ /* Constants in the range 0...255 can be loaded with an unextended
+ instruction. They are therefore as cheap as a register move.
- Given the choice between "li R1,0...255" and "move R1,R2"
- (where R2 is a known constant), it is usually better to use "li",
- since we do not want to unnecessarily extend the lifetime of R2. */
- if (outer_code == SET
- && INTVAL (x) >= 0
- && INTVAL (x) < 256)
+ Given the choice between "li R1,0...255" and "move R1,R2"
+ (where R2 is a known constant), it is usually better to use "li",
+ since we do not want to unnecessarily extend the lifetime
+ of R2. */
+ if (outer_code == SET
+ && INTVAL (x) >= 0
+ && INTVAL (x) < 256)
+ {
+ *total = 0;
+ return true;
+ }
+ }
+ else
{
+ /* These can be used anywhere. */
*total = 0;
return true;
}
- /* Otherwise fall through to the handling below. */
+ /* Otherwise fall through to the handling below because
+ we'll need to construct the constant. */
case CONST:
case SYMBOL_REF:
@@ -2178,15 +2432,15 @@ mips_rtx_costs (rtx x, int code, int outer_code, int *total)
case MEM:
{
- /* If the address is legitimate, return the number of
- instructions it needs, otherwise use the default handling. */
- int n = mips_address_insns (XEXP (x, 0), GET_MODE (x));
- if (n > 0)
- {
- *total = COSTS_N_INSNS (1 + n);
- return true;
- }
- return false;
+ /* If the address is legitimate, return the number of
+ instructions it needs, otherwise use the default handling. */
+ int n = mips_address_insns (XEXP (x, 0), GET_MODE (x));
+ if (n > 0)
+ {
+ *total = COSTS_N_INSNS (n + 1);
+ return true;
+ }
+ return false;
}
case FFS:
@@ -2219,7 +2473,7 @@ mips_rtx_costs (rtx x, int code, int outer_code, int *total)
return false;
case ABS:
- if (mode == SFmode || mode == DFmode)
+ if (float_mode_p)
*total = COSTS_N_INSNS (1);
else
*total = COSTS_N_INSNS (4);
@@ -2231,19 +2485,13 @@ mips_rtx_costs (rtx x, int code, int outer_code, int *total)
case PLUS:
case MINUS:
- if (mode == SFmode || mode == DFmode)
- {
- if (TUNE_MIPS3000 || TUNE_MIPS3900)
- *total = COSTS_N_INSNS (2);
- else if (TUNE_MIPS6000)
- *total = COSTS_N_INSNS (3);
- else if (TUNE_SB1)
- *total = COSTS_N_INSNS (4);
- else
- *total = COSTS_N_INSNS (6);
- return true;
- }
- if (mode == DImode && !TARGET_64BIT)
+ if (float_mode_p)
+ {
+ *total = mips_cost->fp_add;
+ return true;
+ }
+
+ else if (mode == DImode && !TARGET_64BIT)
{
*total = COSTS_N_INSNS (4);
return true;
@@ -2253,115 +2501,46 @@ mips_rtx_costs (rtx x, int code, int outer_code, int *total)
case NEG:
if (mode == DImode && !TARGET_64BIT)
{
- *total = 4;
+ *total = COSTS_N_INSNS (4);
return true;
}
return false;
case MULT:
if (mode == SFmode)
- {
- if (TUNE_MIPS3000
- || TUNE_MIPS3900
- || TUNE_MIPS5000
- || TUNE_SB1)
- *total = COSTS_N_INSNS (4);
- else if (TUNE_MIPS6000
- || TUNE_MIPS5400
- || TUNE_MIPS5500)
- *total = COSTS_N_INSNS (5);
- else
- *total = COSTS_N_INSNS (7);
- return true;
- }
+ *total = mips_cost->fp_mult_sf;
- if (mode == DFmode)
- {
- if (TUNE_SB1)
- *total = COSTS_N_INSNS (4);
- else if (TUNE_MIPS3000
- || TUNE_MIPS3900
- || TUNE_MIPS5000)
- *total = COSTS_N_INSNS (5);
- else if (TUNE_MIPS6000
- || TUNE_MIPS5400
- || TUNE_MIPS5500)
- *total = COSTS_N_INSNS (6);
- else
- *total = COSTS_N_INSNS (8);
- return true;
- }
+ else if (mode == DFmode)
+ *total = mips_cost->fp_mult_df;
+
+ else if (mode == SImode)
+ *total = mips_cost->int_mult_si;
- if (TUNE_MIPS3000)
- *total = COSTS_N_INSNS (12);
- else if (TUNE_MIPS3900)
- *total = COSTS_N_INSNS (2);
- else if (TUNE_MIPS4130)
- *total = COSTS_N_INSNS (mode == DImode ? 6 : 4);
- else if (TUNE_MIPS5400 || TUNE_SB1)
- *total = COSTS_N_INSNS (mode == DImode ? 4 : 3);
- else if (TUNE_MIPS5500 || TUNE_MIPS7000)
- *total = COSTS_N_INSNS (mode == DImode ? 9 : 5);
- else if (TUNE_MIPS9000)
- *total = COSTS_N_INSNS (mode == DImode ? 8 : 3);
- else if (TUNE_MIPS6000)
- *total = COSTS_N_INSNS (17);
- else if (TUNE_MIPS5000)
- *total = COSTS_N_INSNS (5);
else
- *total = COSTS_N_INSNS (10);
+ *total = mips_cost->int_mult_di;
+
return true;
case DIV:
case MOD:
- if (mode == SFmode)
- {
- if (TUNE_MIPS3000
- || TUNE_MIPS3900)
- *total = COSTS_N_INSNS (12);
- else if (TUNE_MIPS6000)
- *total = COSTS_N_INSNS (15);
- else if (TUNE_SB1)
- *total = COSTS_N_INSNS (24);
- else if (TUNE_MIPS5400 || TUNE_MIPS5500)
- *total = COSTS_N_INSNS (30);
- else
- *total = COSTS_N_INSNS (23);
- return true;
- }
+ if (float_mode_p)
+ {
+ if (mode == SFmode)
+ *total = mips_cost->fp_div_sf;
+ else
+ *total = mips_cost->fp_div_df;
- if (mode == DFmode)
- {
- if (TUNE_MIPS3000
- || TUNE_MIPS3900)
- *total = COSTS_N_INSNS (19);
- else if (TUNE_MIPS5400 || TUNE_MIPS5500)
- *total = COSTS_N_INSNS (59);
- else if (TUNE_MIPS6000)
- *total = COSTS_N_INSNS (16);
- else if (TUNE_SB1)
- *total = COSTS_N_INSNS (32);
- else
- *total = COSTS_N_INSNS (36);
- return true;
- }
+ return true;
+ }
/* Fall through. */
case UDIV:
case UMOD:
- if (TUNE_MIPS3000
- || TUNE_MIPS3900)
- *total = COSTS_N_INSNS (35);
- else if (TUNE_MIPS6000)
- *total = COSTS_N_INSNS (38);
- else if (TUNE_MIPS5000)
- *total = COSTS_N_INSNS (36);
- else if (TUNE_SB1)
- *total = COSTS_N_INSNS ((mode == SImode) ? 36 : 68);
- else if (TUNE_MIPS5400 || TUNE_MIPS5500)
- *total = COSTS_N_INSNS ((mode == SImode) ? 42 : 74);
+ if (mode == DImode)
+ *total = mips_cost->int_div_di;
else
- *total = COSTS_N_INSNS (69);
+ *total = mips_cost->int_div_si;
+
return true;
case SIGN_EXTEND:
@@ -2383,6 +2562,15 @@ mips_rtx_costs (rtx x, int code, int outer_code, int *total)
*total = COSTS_N_INSNS (1);
return true;
+ case FLOAT:
+ case UNSIGNED_FLOAT:
+ case FIX:
+ case FLOAT_EXTEND:
+ case FLOAT_TRUNCATE:
+ case SQRT:
+ *total = mips_cost->fp_add;
+ return true;
+
default:
return false;
}
@@ -3601,7 +3789,8 @@ mips_pad_reg_upward (enum machine_mode mode, tree type)
static void
mips_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
- tree type, int *pretend_size, int no_rtl)
+ tree type, int *pretend_size ATTRIBUTE_UNUSED,
+ int no_rtl)
{
CUMULATIVE_ARGS local_cum;
int gp_saved, fp_saved;
@@ -3625,18 +3814,9 @@ mips_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
{
rtx ptr, mem;
- ptr = virtual_incoming_args_rtx;
- switch (mips_abi)
- {
- case ABI_32:
- case ABI_O64:
- ptr = plus_constant (ptr, local_cum.num_gprs * UNITS_PER_WORD);
- break;
-
- case ABI_EABI:
- ptr = plus_constant (ptr, -gp_saved * UNITS_PER_WORD);
- break;
- }
+ ptr = plus_constant (virtual_incoming_args_rtx,
+ REG_PARM_STACK_SPACE (cfun->decl)
+ - gp_saved * UNITS_PER_WORD);
mem = gen_rtx_MEM (BLKmode, ptr);
set_mem_alias_set (mem, get_varargs_alias_set ());
@@ -3671,14 +3851,9 @@ mips_setup_incoming_varargs (CUMULATIVE_ARGS *cum, enum machine_mode mode,
}
}
}
- if (TARGET_OLDABI)
- {
- /* No need for pretend arguments: the register parameter area was
- allocated by the caller. */
- *pretend_size = 0;
- return;
- }
- *pretend_size = (gp_saved * UNITS_PER_WORD) + (fp_saved * UNITS_PER_FPREG);
+ if (REG_PARM_STACK_SPACE (cfun->decl) == 0)
+ cfun->machine->varargs_size = (gp_saved * UNITS_PER_WORD
+ + fp_saved * UNITS_PER_FPREG);
}
/* Create the va_list data type.
@@ -3758,101 +3933,84 @@ mips_build_builtin_va_list (void)
void
mips_va_start (tree valist, rtx nextarg)
{
- const CUMULATIVE_ARGS *cum = &current_function_args_info;
-
- /* ARG_POINTER_REGNUM is initialized to STACK_POINTER_BOUNDARY, but
- since the stack is aligned for a pair of argument-passing slots,
- and the beginning of a variable argument list may be an odd slot,
- we have to decrease its alignment. */
- if (cfun && cfun->emit->regno_pointer_align)
- while (((current_function_pretend_args_size * BITS_PER_UNIT)
- & (REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) - 1)) != 0)
- REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) /= 2;
-
- if (mips_abi == ABI_EABI)
+ if (EABI_FLOAT_VARARGS_P)
{
+ const CUMULATIVE_ARGS *cum;
+ tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
+ tree ovfl, gtop, ftop, goff, foff;
+ tree t;
int gpr_save_area_size;
+ int fpr_save_area_size;
+ int fpr_offset;
+ cum = &current_function_args_info;
gpr_save_area_size
= (MAX_ARGS_IN_REGISTERS - cum->num_gprs) * UNITS_PER_WORD;
+ fpr_save_area_size
+ = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
- if (EABI_FLOAT_VARARGS_P)
- {
- tree f_ovfl, f_gtop, f_ftop, f_goff, f_foff;
- tree ovfl, gtop, ftop, goff, foff;
- tree t;
- int fpr_offset;
- int fpr_save_area_size;
-
- f_ovfl = TYPE_FIELDS (va_list_type_node);
- f_gtop = TREE_CHAIN (f_ovfl);
- f_ftop = TREE_CHAIN (f_gtop);
- f_goff = TREE_CHAIN (f_ftop);
- f_foff = TREE_CHAIN (f_goff);
-
- ovfl = build (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
- NULL_TREE);
- gtop = build (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
- NULL_TREE);
- ftop = build (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
- NULL_TREE);
- goff = build (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
- NULL_TREE);
- foff = build (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
- NULL_TREE);
-
- /* Emit code to initialize OVFL, which points to the next varargs
- stack argument. CUM->STACK_WORDS gives the number of stack
- words used by named arguments. */
- t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
- if (cum->stack_words > 0)
- t = build (PLUS_EXPR, TREE_TYPE (ovfl), t,
- build_int_cst (NULL_TREE,
- cum->stack_words * UNITS_PER_WORD));
- t = build (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
- expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
-
- /* Emit code to initialize GTOP, the top of the GPR save area. */
- t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
- t = build (MODIFY_EXPR, TREE_TYPE (gtop), gtop, t);
- expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
-
- /* Emit code to initialize FTOP, the top of the FPR save area.
- This address is gpr_save_area_bytes below GTOP, rounded
- down to the next fp-aligned boundary. */
- t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
- fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
- fpr_offset &= ~(UNITS_PER_FPVALUE - 1);
- if (fpr_offset)
- t = build (PLUS_EXPR, TREE_TYPE (ftop), t,
- build_int_cst (NULL_TREE, -fpr_offset));
- t = build (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
- expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
-
- /* Emit code to initialize GOFF, the offset from GTOP of the
- next GPR argument. */
- t = build (MODIFY_EXPR, TREE_TYPE (goff), goff,
- build_int_cst (NULL_TREE, gpr_save_area_size));
- expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
-
- /* Likewise emit code to initialize FOFF, the offset from FTOP
- of the next FPR argument. */
- fpr_save_area_size
- = (MAX_ARGS_IN_REGISTERS - cum->num_fprs) * UNITS_PER_FPREG;
- t = build (MODIFY_EXPR, TREE_TYPE (foff), foff,
- build_int_cst (NULL_TREE, fpr_save_area_size));
- expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
- }
- else
- {
- /* Everything is in the GPR save area, or in the overflow
- area which is contiguous with it. */
- nextarg = plus_constant (nextarg, -gpr_save_area_size);
- std_expand_builtin_va_start (valist, nextarg);
- }
+ f_ovfl = TYPE_FIELDS (va_list_type_node);
+ f_gtop = TREE_CHAIN (f_ovfl);
+ f_ftop = TREE_CHAIN (f_gtop);
+ f_goff = TREE_CHAIN (f_ftop);
+ f_foff = TREE_CHAIN (f_goff);
+
+ ovfl = build (COMPONENT_REF, TREE_TYPE (f_ovfl), valist, f_ovfl,
+ NULL_TREE);
+ gtop = build (COMPONENT_REF, TREE_TYPE (f_gtop), valist, f_gtop,
+ NULL_TREE);
+ ftop = build (COMPONENT_REF, TREE_TYPE (f_ftop), valist, f_ftop,
+ NULL_TREE);
+ goff = build (COMPONENT_REF, TREE_TYPE (f_goff), valist, f_goff,
+ NULL_TREE);
+ foff = build (COMPONENT_REF, TREE_TYPE (f_foff), valist, f_foff,
+ NULL_TREE);
+
+ /* Emit code to initialize OVFL, which points to the next varargs
+ stack argument. CUM->STACK_WORDS gives the number of stack
+ words used by named arguments. */
+ t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
+ if (cum->stack_words > 0)
+ t = build (PLUS_EXPR, TREE_TYPE (ovfl), t,
+ build_int_cst (NULL_TREE,
+ cum->stack_words * UNITS_PER_WORD));
+ t = build (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
+ expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+
+ /* Emit code to initialize GTOP, the top of the GPR save area. */
+ t = make_tree (TREE_TYPE (gtop), virtual_incoming_args_rtx);
+ t = build (MODIFY_EXPR, TREE_TYPE (gtop), gtop, t);
+ expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+
+ /* Emit code to initialize FTOP, the top of the FPR save area.
+ This address is gpr_save_area_bytes below GTOP, rounded
+ down to the next fp-aligned boundary. */
+ t = make_tree (TREE_TYPE (ftop), virtual_incoming_args_rtx);
+ fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
+ fpr_offset &= ~(UNITS_PER_FPVALUE - 1);
+ if (fpr_offset)
+ t = build (PLUS_EXPR, TREE_TYPE (ftop), t,
+ build_int_cst (NULL_TREE, -fpr_offset));
+ t = build (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
+ expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+
+ /* Emit code to initialize GOFF, the offset from GTOP of the
+ next GPR argument. */
+ t = build (MODIFY_EXPR, TREE_TYPE (goff), goff,
+ build_int_cst (NULL_TREE, gpr_save_area_size));
+ expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+
+ /* Likewise emit code to initialize FOFF, the offset from FTOP
+ of the next FPR argument. */
+ t = build (MODIFY_EXPR, TREE_TYPE (foff), foff,
+ build_int_cst (NULL_TREE, fpr_save_area_size));
+ expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
}
else
- std_expand_builtin_va_start (valist, nextarg);
+ {
+ nextarg = plus_constant (nextarg, -cfun->machine->varargs_size);
+ std_expand_builtin_va_start (valist, nextarg);
+ }
}
/* Implement va_arg. */
@@ -4048,7 +4206,7 @@ mips_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
left-side instructions (lwl, swl, ldl, sdl).
*RIGHT is a QImode reference to the opposite end of the field and
- can be used in the parterning right-side instruction. */
+ can be used in the patterning right-side instruction. */
static bool
mips_get_unaligned_mem (rtx *op, unsigned int width, int bitpos,
@@ -4164,7 +4322,39 @@ mips_expand_unaligned_store (rtx dest, rtx src, unsigned int width, int bitpos)
}
return true;
}
-
+
+/* Return true if (zero_extract OP SIZE POSITION) can be used as the
+ source of an "ext" instruction or the destination of an "ins"
+ instruction. OP must be a register operand and the following
+ conditions must hold:
+
+ 0 <= POSITION < GET_MODE_BITSIZE (GET_MODE (op))
+ 0 < SIZE <= GET_MODE_BITSIZE (GET_MODE (op))
+ 0 < POSITION + SIZE <= GET_MODE_BITSIZE (GET_MODE (op))
+
+ Also reject lengths equal to a word as they are better handled
+ by the move patterns. */
+
+bool
+mips_use_ins_ext_p (rtx op, rtx size, rtx position)
+{
+ HOST_WIDE_INT len, pos;
+
+ if (!ISA_HAS_EXT_INS
+ || !register_operand (op, VOIDmode)
+ || GET_MODE_BITSIZE (GET_MODE (op)) > BITS_PER_WORD)
+ return false;
+
+ len = INTVAL (size);
+ pos = INTVAL (position);
+
+ if (len <= 0 || len >= GET_MODE_BITSIZE (GET_MODE (op))
+ || pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (op)))
+ return false;
+
+ return true;
+}
+
/* Set up globals to generate code for the ISA or processor
described by INFO. */
@@ -4215,21 +4405,13 @@ mips_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
return true;
case OPT_march_:
- mips_arch_string = arg;
- return mips_parse_cpu (arg) != 0;
-
case OPT_mtune_:
- mips_tune_string = arg;
return mips_parse_cpu (arg) != 0;
case OPT_mips:
mips_isa_info = mips_parse_cpu (ACONCAT (("mips", arg, NULL)));
return mips_isa_info != 0;
- case OPT_mflush_func_:
- mips_cache_flush_func = arg;
- return true;
-
case OPT_mno_flush_func:
mips_cache_flush_func = NULL;
return true;
@@ -4288,6 +4470,9 @@ override_options (void)
if (mips_tune_info == 0)
mips_set_tune (mips_arch_info);
+ /* Set cost structure for the processor. */
+ mips_cost = &mips_rtx_cost_data[mips_tune];
+
if ((target_flags_explicit & MASK_64BIT) != 0)
{
/* The user specified the size of the integer registers. Make sure
@@ -5609,7 +5794,7 @@ mips_declare_object_name (FILE *stream, const char *name,
ASM_OUTPUT_SIZE_DIRECTIVE (stream, name, size);
}
- mips_declare_object (stream, name, "", ":\n", 0);
+ mips_declare_object (stream, name, "", ":\n");
}
/* Implement ASM_FINISH_DECLARE_OBJECT. This is generic ELF stuff. */
@@ -5961,10 +6146,9 @@ compute_frame_size (HOST_WIDE_INT size)
gp_reg_rounded = MIPS_STACK_ALIGN (gp_reg_size);
total_size += gp_reg_rounded + MIPS_STACK_ALIGN (fp_reg_size);
- /* Add in space reserved on the stack by the callee for storing arguments
- passed in registers. */
- if (!TARGET_OLDABI)
- total_size += MIPS_STACK_ALIGN (current_function_pretend_args_size);
+ /* Add in the space required for saving incoming register arguments. */
+ total_size += current_function_pretend_args_size;
+ total_size += MIPS_STACK_ALIGN (cfun->machine->varargs_size);
/* Save other computed information. */
cfun->machine->frame.total_size = total_size;
@@ -6033,9 +6217,8 @@ mips_initial_elimination_offset (int from, int to)
break;
case ARG_POINTER_REGNUM:
- offset = cfun->machine->frame.total_size;
- if (TARGET_NEWABI)
- offset -= current_function_pretend_args_size;
+ offset = (cfun->machine->frame.total_size
+ - current_function_pretend_args_size);
break;
default:
@@ -8668,7 +8851,7 @@ mips_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
{
return 5;
}
- } /* GR_REG_CLASS_P (from) */
+ }
else if (from == FP_REGS)
{
if (GR_REG_CLASS_P (to))
@@ -8677,7 +8860,7 @@ mips_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
return 2;
else if (to == ST_REGS)
return 8;
- } /* from == FP_REGS */
+ }
else if (from == HI_REG || from == LO_REG || from == MD_REGS)
{
if (GR_REG_CLASS_P (to))
@@ -8687,15 +8870,16 @@ mips_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
else
return 6;
}
- } /* from == HI_REG, etc. */
+ }
else if (from == ST_REGS && GR_REG_CLASS_P (to))
return 4;
else if (COP_REG_CLASS_P (from))
{
return 5;
- } /* COP_REG_CLASS_P (from) */
+ }
- /* Fall through. */
+ /* Fall through.
+ ??? What cases are these? Shouldn't we return 2 here? */
return 12;
}
@@ -9691,13 +9875,13 @@ struct bdesc_map
unsigned int size;
/* The target processor that supports these builtin functions.
- PROCESSOR_DEFAULT means we enable them for all processors. */
+ PROCESSOR_MAX means we enable them for all processors. */
enum processor_type proc;
};
static const struct bdesc_map bdesc_arrays[] =
{
- { mips_bdesc, ARRAY_SIZE (mips_bdesc), PROCESSOR_DEFAULT },
+ { mips_bdesc, ARRAY_SIZE (mips_bdesc), PROCESSOR_MAX },
{ sb1_bdesc, ARRAY_SIZE (sb1_bdesc), PROCESSOR_SB1 }
};
@@ -9872,7 +10056,7 @@ mips_init_builtins (void)
offset = 0;
for (m = bdesc_arrays; m < &bdesc_arrays[ARRAY_SIZE (bdesc_arrays)]; m++)
{
- if (m->proc == PROCESSOR_DEFAULT || (m->proc == mips_arch))
+ if (m->proc == PROCESSOR_MAX || (m->proc == mips_arch))
for (d = m->bdesc; d < &m->bdesc[m->size]; d++)
if ((d->target_flags & target_flags) == d->target_flags)
lang_hooks.builtin_function (d->name, types[d->function_type],
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index aeadac30fa8..6eb4f4aabdd 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -32,7 +32,7 @@ Boston, MA 02111-1307, USA. */
the cpu attribute in the mips.md machine description. */
enum processor_type {
- PROCESSOR_DEFAULT,
+ PROCESSOR_R3000,
PROCESSOR_4KC,
PROCESSOR_4KP,
PROCESSOR_5KC,
@@ -40,7 +40,6 @@ enum processor_type {
PROCESSOR_24K,
PROCESSOR_24KX,
PROCESSOR_M4K,
- PROCESSOR_R3000,
PROCESSOR_R3900,
PROCESSOR_R6000,
PROCESSOR_R4000,
@@ -58,7 +57,25 @@ enum processor_type {
PROCESSOR_R8000,
PROCESSOR_R9000,
PROCESSOR_SB1,
- PROCESSOR_SR71000
+ PROCESSOR_SR71000,
+ PROCESSOR_MAX
+};
+
+/* Costs of various operations on the different architectures. */
+
+struct mips_rtx_cost_data
+{
+ unsigned short fp_add;
+ unsigned short fp_mult_sf;
+ unsigned short fp_mult_df;
+ unsigned short fp_div_sf;
+ unsigned short fp_div_df;
+ unsigned short int_mult_si;
+ unsigned short int_mult_di;
+ unsigned short int_div_si;
+ unsigned short int_div_di;
+ unsigned short branch_cost;
+ unsigned short memory_latency;
};
/* Which ABI to use. ABI_32 (original 32, or o32), ABI_N32 (n32),
@@ -105,10 +122,10 @@ extern enum processor_type mips_tune; /* which cpu to schedule for */
extern int mips_isa; /* architectural level */
extern int mips_abi; /* which ABI to use */
extern int mips16_hard_float; /* mips16 without -msoft-float */
-extern const char *mips_cache_flush_func;/* for -mflush-func= and -mno-flush-func */
extern const struct mips_cpu_info mips_cpu_info_table[];
extern const struct mips_cpu_info *mips_arch_info;
extern const struct mips_cpu_info *mips_tune_info;
+extern const struct mips_rtx_cost_data *mips_cost;
/* Macros to silence warnings about numbers being signed in traditional
C and unsigned in ISO C when compiled on 32-bit hosts. */
@@ -151,8 +168,10 @@ extern const struct mips_cpu_info *mips_tune_info;
We therefore disable GP-relative switch tables for n64 on IRIX targets. */
#define TARGET_GPWORD (TARGET_ABICALLS && !(mips_abi == ABI_64 && TARGET_IRIX))
- /* Generate mips16 code */
+/* Generate mips16 code */
#define TARGET_MIPS16 ((target_flags & MASK_MIPS16) != 0)
+/* Generate mips16e code. Default 16bit ASE for mips32/mips32r2/mips64 */
+#define GENERATE_MIPS16E (TARGET_MIPS16 && mips_isa >= 32)
/* Generic ISA defines. */
#define ISA_MIPS1 (mips_isa == 1)
@@ -671,6 +690,11 @@ extern const struct mips_cpu_info *mips_tune_info;
&& (ISA_MIPS32R2 \
))
+/* ISA includes the MIPS32/64 rev 2 ext and ins instructions. */
+#define ISA_HAS_EXT_INS (!TARGET_MIPS16 \
+ && (ISA_MIPS32R2 \
+ ))
+
/* True if the result of a load is not available to the next instruction.
A nop will then be needed between instructions like "lw $4,..."
and "addiu $4,$4,1". */
@@ -2295,9 +2319,8 @@ typedef struct mips_args {
#define REGISTER_MOVE_COST(MODE, FROM, TO) \
mips_register_move_cost (MODE, FROM, TO)
-/* ??? Fix this to be right for the R8000. */
#define MEMORY_MOVE_COST(MODE,CLASS,TO_P) \
- (((TUNE_MIPS4000 || TUNE_MIPS6000) ? 6 : 4) \
+ (mips_cost->memory_latency \
+ memory_move_secondary_cost ((MODE), (CLASS), (TO_P)))
/* Define if copies to/from condition code registers should be avoided.
@@ -2310,11 +2333,8 @@ typedef struct mips_args {
/* A C expression for the cost of a branch instruction. A value of
1 is the default; other values are interpreted relative to that. */
-/* ??? Fix this to be right for the R8000. */
-#define BRANCH_COST \
- ((! TARGET_MIPS16 \
- && (TUNE_MIPS4000 || TUNE_MIPS6000)) \
- ? 2 : 1)
+#define BRANCH_COST mips_cost->branch_cost
+#define LOGICAL_OP_NON_SHORT_CIRCUIT 0
/* If defined, modifies the length assigned to instruction INSN as a
function of the context in which it is used. LENGTH is an lvalue
diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md
index 5d58b735503..84f0767d395 100644
--- a/gcc/config/mips/mips.md
+++ b/gcc/config/mips/mips.md
@@ -266,7 +266,7 @@
;; Attribute describing the processor. This attribute must match exactly
;; with the processor_type enumeration in mips.h.
(define_attr "cpu"
- "default,4kc,4kp,5kc,20kc,24k,24kx,m4k,r3000,r3900,r6000,r4000,r4100,r4111,r4120,r4130,r4300,r4600,r4650,r5000,r5400,r5500,r7000,r8000,r9000,sb1,sr71000"
+ "r3000,4kc,4kp,5kc,20kc,24k,24kx,m4k,r3900,r6000,r4000,r4100,r4111,r4120,r4130,r4300,r4600,r4650,r5000,r5400,r5500,r7000,r8000,r9000,sb1,sr71000"
(const (symbol_ref "mips_tune")))
;; The type of hardware hazard associated with this instruction.
@@ -2319,7 +2319,8 @@ beq\t%2,%.,1b\;\
(zero_extend:GPR (match_operand:SHORT 1 "nonimmediate_operand")))]
""
{
- if (TARGET_MIPS16 && !memory_operand (operands[1], <SHORT:MODE>mode))
+ if (TARGET_MIPS16 && !GENERATE_MIPS16E
+ && !memory_operand (operands[1], <SHORT:MODE>mode))
{
emit_insn (gen_and<GPR:mode>3 (operands[0],
gen_lowpart (<GPR:MODE>mode, operands[1]),
@@ -2340,6 +2341,14 @@ beq\t%2,%.,1b\;\
[(set_attr "type" "arith,load")
(set_attr "mode" "<GPR:MODE>")])
+(define_insn "*zero_extend<SHORT:mode><GPR:mode>2_mips16e"
+ [(set (match_operand:GPR 0 "register_operand" "=d")
+ (zero_extend:GPR (match_operand:SHORT 1 "register_operand" "0")))]
+ "GENERATE_MIPS16E"
+ "ze<SHORT:size>\t%0"
+ [(set_attr "type" "arith")
+ (set_attr "mode" "<GPR:MODE>")])
+
(define_insn "*zero_extend<SHORT:mode><GPR:mode>2_mips16"
[(set (match_operand:GPR 0 "register_operand" "=d")
(zero_extend:GPR (match_operand:SHORT 1 "memory_operand" "m")))]
@@ -2418,11 +2427,21 @@ beq\t%2,%.,1b\;\
(sign_extend:GPR (match_operand:SHORT 1 "nonimmediate_operand")))]
"")
+(define_insn "*extend<SHORT:mode><GPR:mode>2_mips16e"
+ [(set (match_operand:GPR 0 "register_operand" "=d,d")
+ (sign_extend:GPR (match_operand:SHORT 1 "nonimmediate_operand" "0,m")))]
+ "GENERATE_MIPS16E"
+ "@
+ se<SHORT:size>\t%0
+ l<SHORT:size>\t%0,%1"
+ [(set_attr "type" "arith,load")
+ (set_attr "mode" "<GPR:MODE>")])
+
(define_insn_and_split "*extend<SHORT:mode><GPR:mode>2"
[(set (match_operand:GPR 0 "register_operand" "=d,d")
(sign_extend:GPR
(match_operand:SHORT 1 "nonimmediate_operand" "d,m")))]
- "!ISA_HAS_SEB_SEH"
+ "!ISA_HAS_SEB_SEH && !GENERATE_MIPS16E"
"@
#
l<SHORT:size>\t%0,%1"
@@ -2818,7 +2837,7 @@ beq\t%2,%.,1b\;\
(define_expand "extzv"
[(set (match_operand 0 "register_operand")
- (zero_extract (match_operand:QI 1 "memory_operand")
+ (zero_extract (match_operand 1 "nonimmediate_operand")
(match_operand 2 "immediate_operand")
(match_operand 3 "immediate_operand")))]
"!TARGET_MIPS16"
@@ -2827,12 +2846,33 @@ beq\t%2,%.,1b\;\
INTVAL (operands[2]),
INTVAL (operands[3])))
DONE;
+ else if (mips_use_ins_ext_p (operands[1], operands[2], operands[3]))
+ {
+ if (GET_MODE (operands[0]) == DImode)
+ emit_insn (gen_extzvdi (operands[0], operands[1], operands[2],
+ operands[3]));
+ else
+ emit_insn (gen_extzvsi (operands[0], operands[1], operands[2],
+ operands[3]));
+ DONE;
+ }
else
FAIL;
})
+(define_insn "extzv<mode>"
+ [(set (match_operand:GPR 0 "register_operand" "=d")
+ (zero_extract:GPR (match_operand:GPR 1 "register_operand" "d")
+ (match_operand:SI 2 "immediate_operand" "I")
+ (match_operand:SI 3 "immediate_operand" "I")))]
+ "mips_use_ins_ext_p (operands[1], operands[2], operands[3])"
+ "<d>ext\t%0,%1,%3,%2"
+ [(set_attr "type" "arith")
+ (set_attr "mode" "<MODE>")])
+
+
(define_expand "insv"
- [(set (zero_extract (match_operand:QI 0 "memory_operand")
+ [(set (zero_extract (match_operand 0 "nonimmediate_operand")
(match_operand 1 "immediate_operand")
(match_operand 2 "immediate_operand"))
(match_operand 3 "reg_or_0_operand"))]
@@ -2842,10 +2882,30 @@ beq\t%2,%.,1b\;\
INTVAL (operands[1]),
INTVAL (operands[2])))
DONE;
- else
- FAIL;
+ else if (mips_use_ins_ext_p (operands[0], operands[1], operands[2]))
+ {
+ if (GET_MODE (operands[0]) == DImode)
+ emit_insn (gen_insvdi (operands[0], operands[1], operands[2],
+ operands[3]));
+ else
+ emit_insn (gen_insvsi (operands[0], operands[1], operands[2],
+ operands[3]));
+ DONE;
+ }
+ else
+ FAIL;
})
+(define_insn "insv<mode>"
+ [(set (zero_extract:GPR (match_operand:GPR 0 "register_operand" "+d")
+ (match_operand:SI 1 "immediate_operand" "I")
+ (match_operand:SI 2 "immediate_operand" "I"))
+ (match_operand:GPR 3 "reg_or_0_operand" "dJ"))]
+ "mips_use_ins_ext_p (operands[0], operands[1], operands[2])"
+ "<d>ins\t%0,%z3,%2,%1"
+ [(set_attr "type" "arith")
+ (set_attr "mode" "<MODE>")])
+
;; Unaligned word moves generated by the bit field patterns.
;;
;; As far as the rtl is concerned, both the left-part and right-part
@@ -5326,7 +5386,7 @@ beq\t%2,%.,1b\;\
; Thread-Local Storage
-; The TLS base pointer is acessed via "rdhwr $v1, $29". No current
+; The TLS base pointer is accessed via "rdhwr $v1, $29". No current
; MIPS architecture defines this register, and no current
; implementation provides it; instead, any OS which supports TLS is
; expected to trap and emulate this instruction. rdhwr is part of the
diff --git a/gcc/config/mips/mips.opt b/gcc/config/mips/mips.opt
index cb78b8e7b40..fe9a0b8467c 100644
--- a/gcc/config/mips/mips.opt
+++ b/gcc/config/mips/mips.opt
@@ -32,7 +32,7 @@ Target Report Var(TARGET_MAD)
Use PMC-style 'mad' instructions
march=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(mips_arch_string)
-march=ISA Generate code for the given ISA
mbranch-likely
@@ -44,11 +44,11 @@ Target Report Mask(CHECK_ZERO_DIV)
Trap on integer divide by zero
mdivide-breaks
-Target Report Mask(DIVIDE_BREAKS)
+Target Report RejectNegative Mask(DIVIDE_BREAKS)
Use branch-and-break sequences to check for integer divide by zero
mdivide-traps
-Target Report InverseMask(DIVIDE_BREAKS, DIVIDE_TRAPS)
+Target Report RejectNegative InverseMask(DIVIDE_BREAKS, DIVIDE_TRAPS)
Use trap instructions to check for integer divide by zero
mdouble-float
@@ -114,7 +114,7 @@ Target Report RejectNegative Mask(FLOAT64)
Use 64-bit floating-point registers
mflush-func=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(mips_cache_flush_func) Init(CACHE_FLUSH_FUNC)
-mflush-func=FUNC Use FUNC to flush the cache before calling stack trampolines
mfused-madd
@@ -198,7 +198,7 @@ Target Report Var(TARGET_SYM32)
Assume all symbols have 32-bit values
mtune=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(mips_tune_string)
-mtune=PROCESSOR Optimize the output for PROCESSOR
muninit-const-in-rodata
diff --git a/gcc/config/mmix/mmix.h b/gcc/config/mmix/mmix.h
index a5feb38fc7a..92f2d3a66bb 100644
--- a/gcc/config/mmix/mmix.h
+++ b/gcc/config/mmix/mmix.h
@@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler, for MMIX.
- Copyright (C) 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc.
Contributed by Hans-Peter Nilsson (hp@bitrange.com)
This file is part of GCC.
diff --git a/gcc/config/mmix/mmix.md b/gcc/config/mmix/mmix.md
index 75e1446b4ab..af1409d7d9e 100644
--- a/gcc/config/mmix/mmix.md
+++ b/gcc/config/mmix/mmix.md
@@ -762,7 +762,7 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
[(set (match_operand:DI 0 "register_operand" "=r,r,r,r")
(if_then_else:DI
(match_operator 2 "mmix_foldable_comparison_operator"
- [(match_operand 3 "register_operand" "r,r,r,r")
+ [(match_operand:DI 3 "register_operand" "r,r,r,r")
(const_int 0)])
(match_operand:DI 1 "mmix_reg_or_8bit_operand" "rI,0 ,rI,GM")
(match_operand:DI 4 "mmix_reg_or_8bit_operand" "0 ,rI,GM,rI")))]
@@ -811,7 +811,7 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
(if_then_else:DF
(match_operator
2 "mmix_foldable_comparison_operator"
- [(match_operand 3 "register_operand" "r ,r ,r ,r")
+ [(match_operand:DI 3 "register_operand" "r ,r ,r ,r")
(const_int 0)])
(match_operand:DF 1 "mmix_reg_or_0_operand" "rGM,0 ,rGM,GM")
(match_operand:DF 4 "mmix_reg_or_0_operand" "0 ,rGM,GM ,rGM")))]
@@ -1032,7 +1032,7 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
[(set (pc)
(if_then_else
(match_operator 1 "mmix_foldable_comparison_operator"
- [(match_operand 2 "register_operand" "r")
+ [(match_operand:DI 2 "register_operand" "r")
(const_int 0)])
(label_ref (match_operand 0 "" ""))
(pc)))]
@@ -1054,7 +1054,7 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
[(set (pc)
(if_then_else
(match_operator 1 "mmix_foldable_comparison_operator"
- [(match_operand 2 "register_operand" "r")
+ [(match_operand:DI 2 "register_operand" "r")
(const_int 0)])
(pc)
(label_ref (match_operand 0 "" ""))))]
diff --git a/gcc/config/ns32k/ns32k.c b/gcc/config/ns32k/ns32k.c
index f15e5dcc418..e4448efac65 100644
--- a/gcc/config/ns32k/ns32k.c
+++ b/gcc/config/ns32k/ns32k.c
@@ -1106,7 +1106,7 @@ ns32k_handle_fntype_attribute (tree *node, tree name,
&& TREE_CODE (*node) != FIELD_DECL
&& TREE_CODE (*node) != TYPE_DECL)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
diff --git a/gcc/config/rs6000/aix52.h b/gcc/config/rs6000/aix52.h
index ed2614089f3..eb00ac9f7a6 100644
--- a/gcc/config/rs6000/aix52.h
+++ b/gcc/config/rs6000/aix52.h
@@ -60,6 +60,7 @@ do { \
%{!mpower64: %(asm_default)}}} \
%{mcpu=power3: -m620} \
%{mcpu=power4: -m620} \
+%{mcpu=power5: -m620} \
%{mcpu=powerpc: -mppc} \
%{mcpu=rs64a: -mppc} \
%{mcpu=603: -m603} \
diff --git a/gcc/config/rs6000/darwin-ldouble.c b/gcc/config/rs6000/darwin-ldouble.c
index b394d5d99bf..9ac9a8a0e8f 100644
--- a/gcc/config/rs6000/darwin-ldouble.c
+++ b/gcc/config/rs6000/darwin-ldouble.c
@@ -68,7 +68,7 @@ extern long double __gcc_qmul (double, double, double, double);
extern long double __gcc_qdiv (double, double, double, double);
#if defined __ELF__ && defined SHARED
-/* Provide definitions of the old symbol names to statisfy apps and
+/* Provide definitions of the old symbol names to satisfy apps and
shared libs built against an older libgcc. To access the _xlq
symbols an explicit version reference is needed, so these won't
satisfy an unadorned reference like _xlqadd. If dot symbols are
diff --git a/gcc/config/rs6000/eabispe.h b/gcc/config/rs6000/eabispe.h
index 54d8ce4f2c7..9afb3df5cfb 100644
--- a/gcc/config/rs6000/eabispe.h
+++ b/gcc/config/rs6000/eabispe.h
@@ -1,6 +1,6 @@
/* Core target definitions for GNU compiler
for PowerPC embedded targeted systems with SPE support.
- Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by Aldy Hernandez (aldyh@redhat.com).
This file is part of GCC.
diff --git a/gcc/config/rs6000/host-darwin.c b/gcc/config/rs6000/host-darwin.c
index ca32cffb465..ac46e5871f4 100644
--- a/gcc/config/rs6000/host-darwin.c
+++ b/gcc/config/rs6000/host-darwin.c
@@ -73,7 +73,7 @@ segv_handler (int sig ATTRIBUTE_UNUSED,
this. */
if ((faulting_insn & 0xFFFF8000) == 0x94218000 /* stwu %r1, -xxx(%r1) */
- || (faulting_insn & 0xFFFF03FF) == 0x7C21016E /* stwux %r1, xxx, %r1 */
+ || (faulting_insn & 0xFC1F03FF) == 0x7C01016E /* stwux xxx, %r1, xxx */
|| (faulting_insn & 0xFC1F8000) == 0x90018000 /* stw xxx, -yyy(%r1) */
|| (faulting_insn & 0xFC1F8000) == 0xD8018000 /* stfd xxx, -yyy(%r1) */
|| (faulting_insn & 0xFC1F8000) == 0xBC018000 /* stmw xxx, -yyy(%r1) */)
diff --git a/gcc/config/rs6000/linux.h b/gcc/config/rs6000/linux.h
index e35f03347e1..c7edf500a7e 100644
--- a/gcc/config/rs6000/linux.h
+++ b/gcc/config/rs6000/linux.h
@@ -1,6 +1,6 @@
/* Definitions of target machine for GNU compiler,
for PowerPC machines running Linux.
- Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+ Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
Contributed by Michael Meissner (meissner@cygnus.com).
@@ -28,6 +28,9 @@
process. */
#define OS_MISSING_POWERPC64 1
+/* We use glibc _mcount for profiling. */
+#define NO_PROFILE_COUNTERS 1
+
/* glibc has float and long double forms of math functions. */
#undef TARGET_C99_FUNCTIONS
#define TARGET_C99_FUNCTIONS 1
diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h
index d2ab9bf65ae..18c2db941c5 100644
--- a/gcc/config/rs6000/linux64.h
+++ b/gcc/config/rs6000/linux64.h
@@ -207,7 +207,7 @@ extern int dot_symbols;
#endif
/* We use glibc _mcount for profiling. */
-#define NO_PROFILE_COUNTERS TARGET_64BIT
+#define NO_PROFILE_COUNTERS 1
#define PROFILE_HOOK(LABEL) \
do { if (TARGET_64BIT) output_profile_hook (LABEL); } while (0)
@@ -228,13 +228,11 @@ extern int dot_symbols;
the first field is an FP double, only if in power alignment mode. */
#undef ROUND_TYPE_ALIGN
#define ROUND_TYPE_ALIGN(STRUCT, COMPUTED, SPECIFIED) \
- ((TARGET_ALTIVEC && TREE_CODE (STRUCT) == VECTOR_TYPE) \
- ? MAX (MAX ((COMPUTED), (SPECIFIED)), 128) \
- : (TARGET_64BIT \
- && (TREE_CODE (STRUCT) == RECORD_TYPE \
- || TREE_CODE (STRUCT) == UNION_TYPE \
- || TREE_CODE (STRUCT) == QUAL_UNION_TYPE) \
- && TARGET_ALIGN_NATURAL == 0) \
+ ((TARGET_64BIT \
+ && (TREE_CODE (STRUCT) == RECORD_TYPE \
+ || TREE_CODE (STRUCT) == UNION_TYPE \
+ || TREE_CODE (STRUCT) == QUAL_UNION_TYPE) \
+ && TARGET_ALIGN_NATURAL == 0) \
? rs6000_special_round_type_align (STRUCT, COMPUTED, SPECIFIED) \
: MAX ((COMPUTED), (SPECIFIED)))
diff --git a/gcc/config/rs6000/linuxspe.h b/gcc/config/rs6000/linuxspe.h
index f4e02ebf624..be48fe29acc 100644
--- a/gcc/config/rs6000/linuxspe.h
+++ b/gcc/config/rs6000/linuxspe.h
@@ -47,16 +47,16 @@
#define SUBSUBTARGET_OVERRIDE_OPTIONS \
if (rs6000_select[1].string == NULL) \
rs6000_cpu = PROCESSOR_PPC8540; \
- if (rs6000_abi_string == NULL || strstr (rs6000_abi_string, "spe") == NULL) \
+ if (!rs6000_explicit_options.abi) \
rs6000_spe_abi = 1; \
- if (rs6000_float_gprs_string == NULL) \
+ if (!rs6000_explicit_options.float_gprs) \
rs6000_float_gprs = 1; \
/* See note below. */ \
- /*if (rs6000_long_double_size_string == NULL)*/ \
+ /*if (!rs6000_explicit_options.long_double)*/ \
/* rs6000_long_double_type_size = 128;*/ \
- if (rs6000_spe_string == NULL) \
+ if (!rs6000_explicit_options.spe) \
rs6000_spe = 1; \
- if (rs6000_isel_string == NULL) \
+ if (!rs6000_explicit_options.isel) \
rs6000_isel = 1; \
if (target_flags & MASK_64BIT) \
error ("-m64 not supported in this configuration")
diff --git a/gcc/config/rs6000/lynx.h b/gcc/config/rs6000/lynx.h
index fa4cc773f5c..a7f6f6f6578 100644
--- a/gcc/config/rs6000/lynx.h
+++ b/gcc/config/rs6000/lynx.h
@@ -1,5 +1,5 @@
/* Definitions for Rs6000 running LynxOS.
- Copyright (C) 1995, 1996, 2000, 2002, 2003, 2004
+ Copyright (C) 1995, 1996, 2000, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
Contributed by David Henkel-Wallace, Cygnus Support (gumby@cygnus.com)
Rewritten by Adam Nemet, LynuxWorks Inc.
@@ -49,7 +49,7 @@
#define CC1_SPEC \
"%{G*} %{mno-sdata:-msdata=none} \
%{maltivec:-mabi=altivec} \
- -mno-svr4-struct-return"
+ -maix-struct-return"
#undef ASM_SPEC
#define ASM_SPEC \
diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
index 570f59d3f0c..664c7f0b05d 100644
--- a/gcc/config/rs6000/predicates.md
+++ b/gcc/config/rs6000/predicates.md
@@ -132,30 +132,25 @@
(ior (match_code "const_int")
(match_operand 0 "gpc_reg_operand")))
-;; Return 1 if op is a 32-bit signed constant integer valid for arithmetic
+;; Return 1 if op is a constant integer valid for addition
;; or non-special register.
-(define_predicate "reg_or_arith_cint_operand"
+(define_predicate "reg_or_add_cint_operand"
(if_then_else (match_code "const_int")
- (match_test "HOST_BITS_PER_WIDE_INT == 32
- || ((unsigned HOST_WIDE_INT) (INTVAL (op) + 0x80000000)
- < (unsigned HOST_WIDE_INT) 0x100000000ll)")
- (match_operand 0 "gpc_reg_operand")))
-
-;; Return 1 if op is a 32-bit signed constant integer valid for 64-bit addition
-;; or non-special register.
-(define_predicate "reg_or_add_cint64_operand"
- (if_then_else (match_code "const_int")
- (match_test "(HOST_BITS_PER_WIDE_INT == 32 && INTVAL (op) < 0x7fff8000)
+ (match_test "(HOST_BITS_PER_WIDE_INT == 32
+ && (mode == SImode || INTVAL (op) < 0x7fff8000))
|| ((unsigned HOST_WIDE_INT) (INTVAL (op) + 0x80008000)
< (unsigned HOST_WIDE_INT) 0x100000000ll)")
(match_operand 0 "gpc_reg_operand")))
-;; Return 1 if op is a 32-bit constant integer valid for 64-bit subtraction
+;; Return 1 if op is a constant integer valid for subtraction
;; or non-special register.
-(define_predicate "reg_or_sub_cint64_operand"
+(define_predicate "reg_or_sub_cint_operand"
(if_then_else (match_code "const_int")
- (match_test "(HOST_BITS_PER_WIDE_INT == 32 && INTVAL (op) < 0x7fff8000)
- || ((unsigned HOST_WIDE_INT) ((- INTVAL (op)) + 0x80008000)
+ (match_test "(HOST_BITS_PER_WIDE_INT == 32
+ && (mode == SImode || - INTVAL (op) < 0x7fff8000))
+ || ((unsigned HOST_WIDE_INT) (- INTVAL (op)
+ + (mode == SImode
+ ? 0x80000000 : 0x80008000))
< (unsigned HOST_WIDE_INT) 0x100000000ll)")
(match_operand 0 "gpc_reg_operand")))
@@ -428,10 +423,14 @@
(and (not (match_operand 0 "logical_operand"))
(match_operand 0 "reg_or_logical_cint_operand"))))
-;; Return 1 if op is a constant that can be encoded in a 32-bit mask (no
-;; more than two 1->0 or 0->1 transitions). Reject all ones and all
-;; zeros, since these should have been optimized away and confuse the
-;; making of MB and ME.
+;; For SImode, return 1 if op is a constant that can be encoded in a
+;; 32-bit mask (no more than two 1->0 or 0->1 transitions). Reject
+;; all ones and all zeros, since these should have been optimized away
+;; and confuse the making of MB and ME.
+;; For DImode, return 1 if the operand is a constant that is a
+;; PowerPC64 mask (no more than one 1->0 or 0->1 transitions). Reject
+;; all zeros, since zero should have been optimized away and confuses
+;; the making of MB and ME.
(define_predicate "mask_operand"
(match_code "const_int")
{
@@ -441,7 +440,11 @@
/* Fail in 64-bit mode if the mask wraps around because the upper
32-bits of the mask will all be 1s, contrary to GCC's internal view. */
- if (TARGET_POWERPC64 && (c & 0x80000001) == 0x80000001)
+ if (mode == SImode && TARGET_POWERPC64 && (c & 0x80000001) == 0x80000001)
+ return 0;
+
+ /* Reject all zeros or all ones in 32-bit mode. */
+ if (c == 0 || (mode == SImode && c == -1))
return 0;
/* We don't change the number of transitions by inverting,
@@ -449,21 +452,20 @@
if (c & 1)
c = ~c;
- /* Reject all zeros or all ones. */
- if (c == 0)
- return 0;
-
/* Find the first transition. */
lsb = c & -c;
- /* Invert to look for a second transition. */
- c = ~c;
+ if (mode == SImode)
+ {
+ /* Invert to look for a second transition. */
+ c = ~c;
- /* Erase first transition. */
- c &= -lsb;
+ /* Erase first transition. */
+ c &= -lsb;
- /* Find the second transition (if any). */
- lsb = c & -c;
+ /* Find the second transition (if any). */
+ lsb = c & -c;
+ }
/* Match if all the bits above are 1's (or c is zero). */
return c == -lsb;
@@ -491,33 +493,7 @@
return c == -lsb;
})
-;; Return 1 if the operand is a constant that is a PowerPC64 mask (no more
-;; than one 1->0 or 0->1 transitions). Reject all zeros, since zero
-;; should have been optimized away and confuses the making of MB and ME.
-(define_predicate "mask64_operand"
- (match_code "const_int")
-{
- HOST_WIDE_INT c, lsb;
-
- c = INTVAL (op);
-
- /* Reject all zeros. */
- if (c == 0)
- return 0;
-
- /* We don't change the number of transitions by inverting,
- so make sure we start with the LS bit zero. */
- if (c & 1)
- c = ~c;
-
- /* Find the transition, and check that all bits above are 1's. */
- lsb = c & -c;
-
- /* Match if all the bits above are 1's (or c is zero). */
- return c == -lsb;
-})
-
-;; Like mask64_operand, but allow up to three transitions. This
+;; Like mask_operand, but allow up to three transitions. This
;; predicate is used by insn patterns that generate two rldicl or
;; rldicr machine insns.
(define_predicate "mask64_2_operand"
@@ -526,15 +502,7 @@
return mask64_1or2_operand (op, mode, false);
})
-;; Return 1 if the operand is either a non-special register or a constant
-;; that can be used as the operand of a PowerPC64 logical AND insn.
-(define_predicate "and64_operand"
- (ior (match_operand 0 "mask64_operand")
- (if_then_else (match_test "fixed_regs[CR0_REGNO]")
- (match_operand 0 "gpc_reg_operand")
- (match_operand 0 "logical_operand"))))
-
-;; Like and64_operand, but also match constants that can be implemented
+;; Like and_operand, but also match constants that can be implemented
;; with two rldicl or rldicr insns.
(define_predicate "and64_2_operand"
(ior (and (match_code "const_int")
@@ -551,6 +519,11 @@
(match_operand 0 "gpc_reg_operand")
(match_operand 0 "logical_operand"))))
+;; Return 1 if the operand is either a logical operand or a short cint operand.
+(define_predicate "scc_eq_operand"
+ (ior (match_operand 0 "logical_operand")
+ (match_operand 0 "short_cint_operand")))
+
;; Return 1 if the operand is a general non-special register or memory operand.
(define_predicate "reg_or_mem_operand"
(if_then_else (match_code "mem")
diff --git a/gcc/config/rs6000/rs6000-c.c b/gcc/config/rs6000/rs6000-c.c
index 50c994104ee..74826918349 100644
--- a/gcc/config/rs6000/rs6000-c.c
+++ b/gcc/config/rs6000/rs6000-c.c
@@ -31,7 +31,7 @@
#include "c-common.h"
#include "c-pragma.h"
#include "c-tree.h"
-#include "errors.h"
+#include "toplev.h"
#include "tm_p.h"
#include "target.h"
#include "langhooks.h"
@@ -50,8 +50,8 @@ static tree altivec_resolve_overloaded_builtin (tree, tree);
whether or not new function declarations receive a longcall
attribute by default. */
-#define SYNTAX_ERROR(msgid) do { \
- warning (0, msgid); \
+#define SYNTAX_ERROR(gmsgid) do { \
+ warning (0, gmsgid); \
warning (0, "ignoring malformed #pragma longcall"); \
return; \
} while (0)
@@ -140,6 +140,10 @@ rs6000_cpu_cpp_builtins (cpp_reader *pfile)
break;
}
+ /* Let the compiled code know if 'f' class registers will not be available. */
+ if (TARGET_SOFT_FLOAT || !TARGET_FPRS)
+ builtin_define ("__NO_FPRS__");
+
targetm.resolve_overloaded_builtin = altivec_resolve_overloaded_builtin;
}
diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h
index 63ffe4fb9fc..c67f559ef72 100644
--- a/gcc/config/rs6000/rs6000-protos.h
+++ b/gcc/config/rs6000/rs6000-protos.h
@@ -82,6 +82,8 @@ extern int rs6000_emit_vector_cond_expr (rtx, rtx, rtx, rtx, rtx, rtx);
extern void rs6000_emit_minmax (rtx, enum rtx_code, rtx, rtx);
extern void rs6000_emit_sync (enum rtx_code, enum machine_mode,
rtx, rtx, rtx, rtx, bool);
+extern void rs6000_emit_swdivsf (rtx, rtx, rtx);
+extern void rs6000_emit_swdivdf (rtx, rtx, rtx);
extern void output_toc (FILE *, rtx, int, enum machine_mode);
extern void rs6000_initialize_trampoline (rtx, rtx, rtx);
extern rtx rs6000_longcall_ref (rtx);
@@ -151,7 +153,6 @@ extern int rs6000_register_move_cost (enum machine_mode,
enum reg_class, enum reg_class);
extern int rs6000_memory_move_cost (enum machine_mode, enum reg_class, int);
extern bool rs6000_tls_referenced_p (rtx);
-extern void rs6000_output_dwarf_dtprel (FILE*, int, rtx);
extern int rs6000_hard_regno_nregs (int, enum machine_mode);
extern void rs6000_conditional_register_usage (void);
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index bcf38e1aa3a..db7f851a5ac 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -552,6 +552,7 @@ struct processor_costs power4_cost = {
static bool rs6000_function_ok_for_sibcall (tree, tree);
+static const char *rs6000_invalid_within_doloop (rtx);
static rtx rs6000_generate_compare (enum rtx_code);
static void rs6000_maybe_dead (rtx);
static void rs6000_emit_stack_tie (void);
@@ -572,6 +573,7 @@ static bool legitimate_indexed_address_p (rtx, int);
static bool legitimate_lo_sum_address_p (enum machine_mode, rtx, int);
static struct machine_function * rs6000_init_machine_status (void);
static bool rs6000_assemble_integer (rtx, unsigned int, int);
+static bool no_global_regs_above (int);
#ifdef HAVE_GAS_HIDDEN
static void rs6000_assemble_visibility (tree, int);
#endif
@@ -614,9 +616,6 @@ static unsigned int rs6000_xcoff_section_type_flags (tree, const char *, int);
static void rs6000_xcoff_file_start (void);
static void rs6000_xcoff_file_end (void);
#endif
-#if TARGET_MACHO
-static bool rs6000_binds_local_p (tree);
-#endif
static int rs6000_variable_issue (FILE *, int, rtx, int);
static bool rs6000_rtx_costs (rtx, int, int, int *);
static int rs6000_adjust_cost (rtx, rtx, rtx, int);
@@ -681,6 +680,7 @@ int easy_vector_constant (rtx, enum machine_mode);
static bool rs6000_is_opaque_type (tree);
static rtx rs6000_dwarf_register_span (rtx);
static rtx rs6000_legitimize_tls_address (rtx, enum tls_model);
+static void rs6000_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
static rtx rs6000_tls_get_addr (void);
static rtx rs6000_got_sym (void);
static int rs6000_tls_symbol_ref_1 (rtx *, void *);
@@ -894,7 +894,7 @@ static const char alt_reg_names[][8] =
#if TARGET_MACHO
#undef TARGET_BINDS_LOCAL_P
-#define TARGET_BINDS_LOCAL_P rs6000_binds_local_p
+#define TARGET_BINDS_LOCAL_P darwin_binds_local_p
#endif
#undef TARGET_ASM_OUTPUT_MI_THUNK
@@ -906,6 +906,9 @@ static const char alt_reg_names[][8] =
#undef TARGET_FUNCTION_OK_FOR_SIBCALL
#define TARGET_FUNCTION_OK_FOR_SIBCALL rs6000_function_ok_for_sibcall
+#undef TARGET_INVALID_WITHIN_DOLOOP
+#define TARGET_INVALID_WITHIN_DOLOOP rs6000_invalid_within_doloop
+
#undef TARGET_RTX_COSTS
#define TARGET_RTX_COSTS rs6000_rtx_costs
#undef TARGET_ADDRESS_COST
@@ -977,6 +980,11 @@ static const char alt_reg_names[][8] =
#undef TARGET_RELAXED_ORDERING
#define TARGET_RELAXED_ORDERING true
+#ifdef HAVE_AS_TLS
+#undef TARGET_ASM_OUTPUT_DWARF_DTPREL
+#define TARGET_ASM_OUTPUT_DWARF_DTPREL rs6000_output_dwarf_dtprel
+#endif
+
struct gcc_target targetm = TARGET_INITIALIZER;
@@ -1535,6 +1543,10 @@ rs6000_parse_tls_size_option (void)
void
optimization_options (int level ATTRIBUTE_UNUSED, int size ATTRIBUTE_UNUSED)
{
+ if (DEFAULT_ABI == ABI_DARWIN)
+ /* The Darwin libraries never set errno, so we might as well
+ avoid calling them when that's the only reason we would. */
+ flag_errno_math = 0;
}
/* Implement TARGET_HANDLE_OPTION. */
@@ -1936,7 +1948,7 @@ num_insns_constant (rtx op, enum machine_mode mode)
case CONST_INT:
#if HOST_BITS_PER_WIDE_INT == 64
if ((INTVAL (op) >> 31) != 0 && (INTVAL (op) >> 31) != -1
- && mask64_operand (op, mode))
+ && mask_operand (op, mode))
return 2;
else
#endif
@@ -1978,7 +1990,7 @@ num_insns_constant (rtx op, enum machine_mode mode)
|| (high == -1 && low < 0))
return num_insns_constant_wide (low);
- else if (mask64_operand (op, mode))
+ else if (mask_operand (op, mode))
return 2;
else if (low == 0)
@@ -2725,10 +2737,10 @@ rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
return NULL_RTX;
}
-/* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL.
+/* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
We need to emit DTP-relative relocations. */
-void
+static void
rs6000_output_dwarf_dtprel (FILE *file, int size, rtx x)
{
switch (size)
@@ -3283,7 +3295,7 @@ rs6000_conditional_register_usage (void)
if (! TARGET_POWER)
fixed_regs[64] = 1;
- /* 64-bit AIX reserves GPR13 for thread-private data. */
+ /* 64-bit AIX and Linux reserve GPR13 for thread-private data. */
if (TARGET_64BIT)
fixed_regs[13] = call_used_regs[13]
= call_really_used_regs[13] = 1;
@@ -3294,6 +3306,11 @@ rs6000_conditional_register_usage (void)
fixed_regs[i] = call_used_regs[i]
= call_really_used_regs[i] = 1;
+ /* The TOC register is not killed across calls in a way that is
+ visible to the compiler. */
+ if (DEFAULT_ABI == ABI_AIX)
+ call_really_used_regs[2] = 0;
+
if (DEFAULT_ABI == ABI_V4
&& PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
&& flag_pic == 2)
@@ -3308,8 +3325,7 @@ rs6000_conditional_register_usage (void)
if (DEFAULT_ABI == ABI_DARWIN
&& PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
- global_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
- = fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
+ fixed_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
= call_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM]
= call_really_used_regs[RS6000_PIC_OFFSET_TABLE_REGNUM] = 1;
@@ -9864,7 +9880,7 @@ print_operand (FILE *file, rtx x, int code)
/* PowerPC64 mask position. All 0's is excluded.
CONST_INT 32-bit mask is considered sign-extended so any
transition must occur within the CONST_INT, not on the boundary. */
- if (! mask64_operand (x, DImode))
+ if (! mask_operand (x, DImode))
output_operand_lossage ("invalid %%S value");
uval = INT_LOWPART (x);
@@ -11409,13 +11425,15 @@ rs6000_emit_sync (enum rtx_code code, enum machine_mode mode,
else
{
rtx addrSI, aligned_addr;
+ int shift_mask = mode == QImode ? 0x18 : 0x10;
addrSI = force_reg (SImode, gen_lowpart_common (SImode,
XEXP (used_m, 0)));
shift = gen_reg_rtx (SImode);
emit_insn (gen_rlwinm (shift, addrSI, GEN_INT (3),
- GEN_INT (0x18)));
+ GEN_INT (shift_mask)));
+ emit_insn (gen_xorsi3 (shift, shift, GEN_INT (shift_mask)));
aligned_addr = expand_binop (Pmode, and_optab,
XEXP (used_m, 0),
@@ -11453,7 +11471,7 @@ rs6000_emit_sync (enum rtx_code code, enum machine_mode mode,
newop = expand_binop (SImode, ior_optab,
oldop, GEN_INT (~imask), NULL_RTX,
1, OPTAB_LIB_WIDEN);
- emit_insn (gen_ashlsi3 (newop, newop, shift));
+ emit_insn (gen_rotlsi3 (newop, newop, shift));
break;
case PLUS:
@@ -11482,6 +11500,19 @@ rs6000_emit_sync (enum rtx_code code, enum machine_mode mode,
gcc_unreachable ();
}
+ if (GET_CODE (m) == NOT)
+ {
+ rtx mask, xorm;
+
+ mask = gen_reg_rtx (SImode);
+ emit_move_insn (mask, GEN_INT (imask));
+ emit_insn (gen_ashlsi3 (mask, mask, shift));
+
+ xorm = gen_rtx_XOR (SImode, used_m, mask);
+ /* Depending on the value of 'op', the XOR or the operation might
+ be able to be simplified away. */
+ newop = simplify_gen_binary (code, SImode, xorm, newop);
+ }
op = newop;
used_mode = SImode;
before = gen_reg_rtx (used_mode);
@@ -11499,7 +11530,7 @@ rs6000_emit_sync (enum rtx_code code, enum machine_mode mode,
after = gen_reg_rtx (used_mode);
}
- if (code == PLUS && used_mode != mode)
+ if ((code == PLUS || GET_CODE (m) == NOT) && used_mode != mode)
the_op = op; /* Computed above. */
else if (GET_CODE (op) == NOT && GET_CODE (m) != NOT)
the_op = gen_rtx_fmt_ee (code, used_mode, op, m);
@@ -11562,7 +11593,7 @@ rs6000_split_multireg_move (rtx dst, rtx src)
reg = REG_P (dst) ? REGNO (dst) : REGNO (src);
mode = GET_MODE (dst);
- nregs = HARD_REGNO_NREGS (reg, mode);
+ nregs = hard_regno_nregs[reg][mode];
if (FP_REGNO_P (reg))
reg_mode = DFmode;
else if (ALTIVEC_REGNO_P (reg))
@@ -12023,9 +12054,6 @@ rs6000_stack_info (void)
&& !FP_SAVE_INLINE (info_ptr->first_fp_reg_save))
|| info_ptr->first_altivec_reg_save <= LAST_ALTIVEC_REGNO
|| (DEFAULT_ABI == ABI_V4 && current_function_calls_alloca)
- || (DEFAULT_ABI == ABI_DARWIN
- && flag_pic
- && current_function_uses_pic_offset_table)
|| info_ptr->calls_p)
{
info_ptr->lr_save_p = 1;
@@ -12505,6 +12533,24 @@ rs6000_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
return false;
}
+/* NULL if INSN insn is valid within a low-overhead loop.
+ Otherwise return why doloop cannot be applied.
+ PowerPC uses the COUNT register for branch on table instructions. */
+
+static const char *
+rs6000_invalid_within_doloop (rtx insn)
+{
+ if (CALL_P (insn))
+ return "Function call in the loop.";
+
+ if (JUMP_P (insn)
+ && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
+ || GET_CODE (PATTERN (insn)) == ADDR_VEC))
+ return "Computed branch in the loop.";
+
+ return NULL;
+}
+
static int
rs6000_ra_ever_killed (void)
{
@@ -12572,15 +12618,49 @@ rs6000_emit_load_toc_table (int fromprolog)
rtx dest, insn;
dest = gen_rtx_REG (Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
- if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
+ if (TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic)
{
- rtx temp = (fromprolog
- ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
- : gen_reg_rtx (Pmode));
- insn = emit_insn (gen_load_toc_v4_pic_si (temp));
+ char buf[30];
+ rtx lab, tmp1, tmp2, got, tempLR;
+
+ ASM_GENERATE_INTERNAL_LABEL (buf, "LCF", rs6000_pic_labelno);
+ lab = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
+ if (flag_pic == 2)
+ got = gen_rtx_SYMBOL_REF (Pmode, toc_label_name);
+ else
+ got = rs6000_got_sym ();
+ tmp1 = tmp2 = dest;
+ if (!fromprolog)
+ {
+ tmp1 = gen_reg_rtx (Pmode);
+ tmp2 = gen_reg_rtx (Pmode);
+ }
+ tempLR = (fromprolog
+ ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
+ : gen_reg_rtx (Pmode));
+ insn = emit_insn (gen_load_toc_v4_PIC_1 (tempLR, lab));
+ if (fromprolog)
+ rs6000_maybe_dead (insn);
+ insn = emit_move_insn (tmp1, tempLR);
+ if (fromprolog)
+ rs6000_maybe_dead (insn);
+ insn = emit_insn (gen_load_toc_v4_PIC_3b (tmp2, tmp1, got, lab));
if (fromprolog)
rs6000_maybe_dead (insn);
- insn = emit_move_insn (dest, temp);
+ insn = emit_insn (gen_load_toc_v4_PIC_3c (dest, tmp2, got, lab));
+ if (fromprolog)
+ rs6000_maybe_dead (insn);
+ }
+ else if (TARGET_ELF && DEFAULT_ABI == ABI_V4 && flag_pic == 1)
+ {
+ rtx tempLR = (fromprolog
+ ? gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM)
+ : gen_reg_rtx (Pmode));
+
+ insn = emit_insn (gen_load_toc_v4_pic_si (tempLR));
+ if (fromprolog)
+ rs6000_maybe_dead (insn);
+ insn = emit_move_insn (dest, tempLR);
if (fromprolog)
rs6000_maybe_dead (insn);
}
@@ -13154,6 +13234,19 @@ gen_frame_mem_offset (enum machine_mode mode, rtx reg, int offset)
return gen_rtx_MEM (mode, gen_rtx_PLUS (Pmode, reg, offset_rtx));
}
+/* Look for user-defined global regs. We should not save and restore these,
+ and cannot use stmw/lmw if there are any in its range. */
+
+static bool
+no_global_regs_above (int first_greg)
+{
+ int i;
+ for (i = 0; i < 32 - first_greg; i++)
+ if (global_regs[first_greg + i])
+ return false;
+ return true;
+}
+
#ifndef TARGET_FIX_AND_CONTINUE
#define TARGET_FIX_AND_CONTINUE 0
#endif
@@ -13198,7 +13291,8 @@ rs6000_emit_prologue (void)
using_store_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
&& (!TARGET_SPE_ABI
|| info->spe_64bit_regs_used == 0)
- && info->first_gp_reg_save < 31);
+ && info->first_gp_reg_save < 31
+ && no_global_regs_above (info->first_gp_reg_save));
saving_FPRs_inline = (info->first_fp_reg_save == 64
|| FP_SAVE_INLINE (info->first_fp_reg_save)
|| current_function_calls_eh_return
@@ -13522,12 +13616,12 @@ rs6000_emit_prologue (void)
{
int i;
for (i = 0; i < 32 - info->first_gp_reg_save; i++)
- if ((regs_ever_live[info->first_gp_reg_save+i]
- && (! call_used_regs[info->first_gp_reg_save+i]
- || (i+info->first_gp_reg_save
+ if ((regs_ever_live[info->first_gp_reg_save + i]
+ && (!call_used_regs[info->first_gp_reg_save + i]
+ || (i + info->first_gp_reg_save
== RS6000_PIC_OFFSET_TABLE_REGNUM
&& TARGET_TOC && TARGET_MINIMAL_TOC)))
- || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
+ || (i + info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
&& ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
|| (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
{
@@ -13674,7 +13768,8 @@ rs6000_emit_prologue (void)
/* If we are using RS6000_PIC_OFFSET_TABLE_REGNUM, we need to set it up. */
if ((TARGET_TOC && TARGET_MINIMAL_TOC && get_pool_size () != 0)
- || (DEFAULT_ABI == ABI_V4 && flag_pic == 1
+ || (DEFAULT_ABI == ABI_V4
+ && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT))
&& regs_ever_live[RS6000_PIC_OFFSET_TABLE_REGNUM]))
{
/* If emit_load_toc_table will use the link register, we need to save
@@ -13711,12 +13806,19 @@ rs6000_emit_prologue (void)
rtx lr = gen_rtx_REG (Pmode, LINK_REGISTER_REGNUM);
rtx src = machopic_function_base_sym ();
+ /* Save and restore LR locally around this call (in R0). */
+ if (!info->lr_save_p)
+ rs6000_maybe_dead (emit_move_insn (gen_rtx_REG (Pmode, 0), lr));
+
rs6000_maybe_dead (emit_insn (gen_load_macho_picbase (lr, src)));
insn = emit_move_insn (gen_rtx_REG (Pmode,
RS6000_PIC_OFFSET_TABLE_REGNUM),
lr);
rs6000_maybe_dead (insn);
+
+ if (!info->lr_save_p)
+ rs6000_maybe_dead (emit_move_insn (lr, gen_rtx_REG (Pmode, 0)));
}
#endif
}
@@ -13816,7 +13918,8 @@ rs6000_emit_epilogue (int sibcall)
using_load_multiple = (TARGET_MULTIPLE && ! TARGET_POWERPC64
&& (!TARGET_SPE_ABI
|| info->spe_64bit_regs_used == 0)
- && info->first_gp_reg_save < 31);
+ && info->first_gp_reg_save < 31
+ && no_global_regs_above (info->first_gp_reg_save));
restoring_FPRs_inline = (sibcall
|| current_function_calls_eh_return
|| info->first_fp_reg_save == 64
@@ -14080,11 +14183,11 @@ rs6000_emit_epilogue (int sibcall)
}
else
for (i = 0; i < 32 - info->first_gp_reg_save; i++)
- if ((regs_ever_live[info->first_gp_reg_save+i]
- && (! call_used_regs[info->first_gp_reg_save+i]
- || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
+ if ((regs_ever_live[info->first_gp_reg_save + i]
+ && (!call_used_regs[info->first_gp_reg_save + i]
+ || (i + info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
&& TARGET_TOC && TARGET_MINIMAL_TOC)))
- || (i+info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
+ || (i + info->first_gp_reg_save == RS6000_PIC_OFFSET_TABLE_REGNUM
&& ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
|| (DEFAULT_ABI == ABI_DARWIN && flag_pic))))
{
@@ -15330,7 +15433,6 @@ void
output_function_profiler (FILE *file, int labelno)
{
char buf[100];
- int save_lr = 8;
switch (DEFAULT_ABI)
{
@@ -15338,7 +15440,6 @@ output_function_profiler (FILE *file, int labelno)
gcc_unreachable ();
case ABI_V4:
- save_lr = 4;
if (!TARGET_32BIT)
{
warning (0, "no profiling of 64-bit code for this ABI");
@@ -15346,11 +15447,28 @@ output_function_profiler (FILE *file, int labelno)
}
ASM_GENERATE_INTERNAL_LABEL (buf, "LP", labelno);
fprintf (file, "\tmflr %s\n", reg_names[0]);
- if (flag_pic == 1)
+ if (NO_PROFILE_COUNTERS)
+ {
+ asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
+ reg_names[0], reg_names[1]);
+ }
+ else if (TARGET_SECURE_PLT && flag_pic)
+ {
+ asm_fprintf (file, "\tbcl 20,31,1f\n1:\n\t{st|stw} %s,4(%s)\n",
+ reg_names[0], reg_names[1]);
+ asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
+ asm_fprintf (file, "\t{cau|addis} %s,%s,",
+ reg_names[12], reg_names[12]);
+ assemble_name (file, buf);
+ asm_fprintf (file, "-1b@ha\n\t{cal|la} %s,", reg_names[0]);
+ assemble_name (file, buf);
+ asm_fprintf (file, "-1b@l(%s)\n", reg_names[12]);
+ }
+ else if (flag_pic == 1)
{
fputs ("\tbl _GLOBAL_OFFSET_TABLE_@local-4\n", file);
- asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
- reg_names[0], save_lr, reg_names[1]);
+ asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
+ reg_names[0], reg_names[1]);
asm_fprintf (file, "\tmflr %s\n", reg_names[12]);
asm_fprintf (file, "\t{l|lwz} %s,", reg_names[0]);
assemble_name (file, buf);
@@ -15358,10 +15476,10 @@ output_function_profiler (FILE *file, int labelno)
}
else if (flag_pic > 1)
{
- asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
- reg_names[0], save_lr, reg_names[1]);
+ asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
+ reg_names[0], reg_names[1]);
/* Now, we need to get the address of the label. */
- fputs ("\tbl 1f\n\t.long ", file);
+ fputs ("\tbcl 20,31,1f\n\t.long ", file);
assemble_name (file, buf);
fputs ("-.\n1:", file);
asm_fprintf (file, "\tmflr %s\n", reg_names[11]);
@@ -15375,8 +15493,8 @@ output_function_profiler (FILE *file, int labelno)
asm_fprintf (file, "\t{liu|lis} %s,", reg_names[12]);
assemble_name (file, buf);
fputs ("@ha\n", file);
- asm_fprintf (file, "\t{st|stw} %s,%d(%s)\n",
- reg_names[0], save_lr, reg_names[1]);
+ asm_fprintf (file, "\t{st|stw} %s,4(%s)\n",
+ reg_names[0], reg_names[1]);
asm_fprintf (file, "\t{cal|la} %s,", reg_names[0]);
assemble_name (file, buf);
asm_fprintf (file, "@l(%s)\n", reg_names[12]);
@@ -16120,7 +16238,7 @@ force_new_group (int sched_verbose, FILE *dump, rtx *group_insns,
between the insns.
The function estimates the group boundaries that the processor will form as
- folllows: It keeps track of how many vacant issue slots are available after
+ follows: It keeps track of how many vacant issue slots are available after
each insn. A subsequent insn will start a new group if one of the following
4 cases applies:
- no more vacant issue slots remain in the current dispatch group.
@@ -16527,7 +16645,7 @@ rs6000_handle_longcall_attribute (tree *node, tree name,
&& TREE_CODE (*node) != FIELD_DECL
&& TREE_CODE (*node) != TYPE_DECL)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -17204,6 +17322,7 @@ rs6000_elf_declare_function_name (FILE *file, const char *name, tree decl)
}
if (TARGET_RELOCATABLE
+ && !TARGET_SECURE_PLT
&& (get_pool_size () != 0 || current_function_profile)
&& uses_TOC ())
{
@@ -17420,17 +17539,6 @@ rs6000_xcoff_file_end (void)
}
#endif /* TARGET_XCOFF */
-#if TARGET_MACHO
-/* Cross-module name binding. Darwin does not support overriding
- functions at dynamic-link time. */
-
-static bool
-rs6000_binds_local_p (tree decl)
-{
- return default_binds_local_p_1 (decl, 0);
-}
-#endif
-
/* Compute a (partial) cost for rtx X. Return true if the complete
cost has been computed, and false if subexpressions should be
scanned. In either case, *TOTAL contains the cost result. */
@@ -17486,9 +17594,9 @@ rs6000_rtx_costs (rtx x, int code, int outer_code, int *total)
return true;
}
else if ((outer_code == PLUS
- && reg_or_add_cint64_operand (x, VOIDmode))
+ && reg_or_add_cint_operand (x, VOIDmode))
|| (outer_code == MINUS
- && reg_or_sub_cint64_operand (x, VOIDmode))
+ && reg_or_sub_cint_operand (x, VOIDmode))
|| ((outer_code == SET
|| outer_code == IOR
|| outer_code == XOR)
@@ -17505,7 +17613,7 @@ rs6000_rtx_costs (rtx x, int code, int outer_code, int *total)
&& ((outer_code == AND
&& (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
|| CONST_OK_FOR_LETTER_P (INTVAL (x), 'L')
- || mask64_operand (x, DImode)))
+ || mask_operand (x, DImode)))
|| ((outer_code == IOR || outer_code == XOR)
&& CONST_DOUBLE_HIGH (x) == 0
&& (CONST_DOUBLE_LOW (x)
@@ -17829,7 +17937,7 @@ rs6000_register_move_cost (enum machine_mode mode,
else
/* A move will cost one instruction per GPR moved. */
- return 2 * HARD_REGNO_NREGS (0, mode);
+ return 2 * hard_regno_nregs[0][mode];
}
/* Moving between two similar registers is just one instruction. */
@@ -17850,15 +17958,118 @@ rs6000_memory_move_cost (enum machine_mode mode, enum reg_class class,
int in ATTRIBUTE_UNUSED)
{
if (reg_classes_intersect_p (class, GENERAL_REGS))
- return 4 * HARD_REGNO_NREGS (0, mode);
+ return 4 * hard_regno_nregs[0][mode];
else if (reg_classes_intersect_p (class, FLOAT_REGS))
- return 4 * HARD_REGNO_NREGS (32, mode);
+ return 4 * hard_regno_nregs[32][mode];
else if (reg_classes_intersect_p (class, ALTIVEC_REGS))
- return 4 * HARD_REGNO_NREGS (FIRST_ALTIVEC_REGNO, mode);
+ return 4 * hard_regno_nregs[FIRST_ALTIVEC_REGNO][mode];
else
return 4 + rs6000_register_move_cost (mode, class, GENERAL_REGS);
}
+/* Newton-Raphson approximation of single-precision floating point divide n/d.
+ Assumes no trapping math and finite arguments. */
+
+void
+rs6000_emit_swdivsf (rtx res, rtx n, rtx d)
+{
+ rtx x0, e0, e1, y1, u0, v0, one;
+
+ x0 = gen_reg_rtx (SFmode);
+ e0 = gen_reg_rtx (SFmode);
+ e1 = gen_reg_rtx (SFmode);
+ y1 = gen_reg_rtx (SFmode);
+ u0 = gen_reg_rtx (SFmode);
+ v0 = gen_reg_rtx (SFmode);
+ one = force_reg (SFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconst1, SFmode));
+
+ /* x0 = 1./d estimate */
+ emit_insn (gen_rtx_SET (VOIDmode, x0,
+ gen_rtx_UNSPEC (SFmode, gen_rtvec (1, d),
+ UNSPEC_FRES)));
+ /* e0 = 1. - d * x0 */
+ emit_insn (gen_rtx_SET (VOIDmode, e0,
+ gen_rtx_MINUS (SFmode, one,
+ gen_rtx_MULT (SFmode, d, x0))));
+ /* e1 = e0 + e0 * e0 */
+ emit_insn (gen_rtx_SET (VOIDmode, e1,
+ gen_rtx_PLUS (SFmode,
+ gen_rtx_MULT (SFmode, e0, e0), e0)));
+ /* y1 = x0 + e1 * x0 */
+ emit_insn (gen_rtx_SET (VOIDmode, y1,
+ gen_rtx_PLUS (SFmode,
+ gen_rtx_MULT (SFmode, e1, x0), x0)));
+ /* u0 = n * y1 */
+ emit_insn (gen_rtx_SET (VOIDmode, u0,
+ gen_rtx_MULT (SFmode, n, y1)));
+ /* v0 = n - d * u0 */
+ emit_insn (gen_rtx_SET (VOIDmode, v0,
+ gen_rtx_MINUS (SFmode, n,
+ gen_rtx_MULT (SFmode, d, u0))));
+ /* res = u0 + v0 * y1 */
+ emit_insn (gen_rtx_SET (VOIDmode, res,
+ gen_rtx_PLUS (SFmode,
+ gen_rtx_MULT (SFmode, v0, y1), u0)));
+}
+
+/* Newton-Raphson approximation of double-precision floating point divide n/d.
+ Assumes no trapping math and finite arguments. */
+
+void
+rs6000_emit_swdivdf (rtx res, rtx n, rtx d)
+{
+ rtx x0, e0, e1, e2, y1, y2, y3, u0, v0, one;
+
+ x0 = gen_reg_rtx (DFmode);
+ e0 = gen_reg_rtx (DFmode);
+ e1 = gen_reg_rtx (DFmode);
+ e2 = gen_reg_rtx (DFmode);
+ y1 = gen_reg_rtx (DFmode);
+ y2 = gen_reg_rtx (DFmode);
+ y3 = gen_reg_rtx (DFmode);
+ u0 = gen_reg_rtx (DFmode);
+ v0 = gen_reg_rtx (DFmode);
+ one = force_reg (DFmode, CONST_DOUBLE_FROM_REAL_VALUE (dconst1, DFmode));
+
+ /* x0 = 1./d estimate */
+ emit_insn (gen_rtx_SET (VOIDmode, x0,
+ gen_rtx_UNSPEC (DFmode, gen_rtvec (1, d),
+ UNSPEC_FRES)));
+ /* e0 = 1. - d * x0 */
+ emit_insn (gen_rtx_SET (VOIDmode, e0,
+ gen_rtx_MINUS (DFmode, one,
+ gen_rtx_MULT (SFmode, d, x0))));
+ /* y1 = x0 + e0 * x0 */
+ emit_insn (gen_rtx_SET (VOIDmode, y1,
+ gen_rtx_PLUS (DFmode,
+ gen_rtx_MULT (DFmode, e0, x0), x0)));
+ /* e1 = e0 * e0 */
+ emit_insn (gen_rtx_SET (VOIDmode, e1,
+ gen_rtx_MULT (DFmode, e0, e0)));
+ /* y2 = y1 + e1 * y1 */
+ emit_insn (gen_rtx_SET (VOIDmode, y2,
+ gen_rtx_PLUS (DFmode,
+ gen_rtx_MULT (DFmode, e1, y1), y1)));
+ /* e2 = e1 * e1 */
+ emit_insn (gen_rtx_SET (VOIDmode, e2,
+ gen_rtx_MULT (DFmode, e1, e1)));
+ /* y3 = y2 + e2 * y2 */
+ emit_insn (gen_rtx_SET (VOIDmode, y3,
+ gen_rtx_PLUS (DFmode,
+ gen_rtx_MULT (DFmode, e2, y2), y2)));
+ /* u0 = n * y3 */
+ emit_insn (gen_rtx_SET (VOIDmode, u0,
+ gen_rtx_MULT (DFmode, n, y3)));
+ /* v0 = n - d * u0 */
+ emit_insn (gen_rtx_SET (VOIDmode, v0,
+ gen_rtx_MINUS (DFmode, n,
+ gen_rtx_MULT (DFmode, d, u0))));
+ /* res = u0 + v0 * y3 */
+ emit_insn (gen_rtx_SET (VOIDmode, res,
+ gen_rtx_PLUS (DFmode,
+ gen_rtx_MULT (DFmode, v0, y3), u0)));
+}
+
/* Return an RTX representing where to find the function value of a
function returning MODE. */
static rtx
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index 25e48498f2d..1e970283e15 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -136,7 +136,7 @@
#define TARGET_MFCRF 0
#endif
-/* Define TARGET_POPCNTB if the target assembler does not suppport the
+/* Define TARGET_POPCNTB if the target assembler does not support the
popcount byte instruction. */
#ifndef HAVE_AS_POPCNTB
@@ -144,15 +144,12 @@
#define TARGET_POPCNTB 0
#endif
-#define TARGET_32BIT (! TARGET_64BIT)
-
-/* Emit a dtp-relative reference to a TLS variable. */
-
-#ifdef HAVE_AS_TLS
-#define ASM_OUTPUT_DWARF_DTPREL(FILE, SIZE, X) \
- rs6000_output_dwarf_dtprel (FILE, SIZE, X)
+#ifndef TARGET_SECURE_PLT
+#define TARGET_SECURE_PLT 0
#endif
+#define TARGET_32BIT (! TARGET_64BIT)
+
#ifndef HAVE_AS_TLS
#define HAVE_AS_TLS 0
#endif
@@ -267,7 +264,6 @@ extern struct rs6000_cpu_select rs6000_select[];
/* Debug support */
extern const char *rs6000_debug_name; /* Name for -mdebug-xxxx option */
-extern const char *rs6000_abi_string; /* for -mabi={sysv,darwin,eabi,aix,altivec} */
extern int rs6000_debug_stack; /* debug stack applications */
extern int rs6000_debug_arg; /* debug argument handling */
@@ -278,17 +274,11 @@ extern const char *rs6000_traceback_name; /* Type of traceback table. */
/* These are separate from target_flags because we've run out of bits
there. */
-extern const char *rs6000_long_double_size_string;
extern int rs6000_long_double_type_size;
extern int rs6000_altivec_abi;
extern int rs6000_spe_abi;
-extern int rs6000_isel;
-extern int rs6000_spe;
extern int rs6000_float_gprs;
-extern const char* rs6000_alignment_string;
extern int rs6000_alignment_flags;
-extern const char *rs6000_sched_restricted_insns_priority_str;
-extern int rs6000_sched_restricted_insns_priority;
extern const char *rs6000_sched_insert_nops_str;
extern enum rs6000_nop_insertion rs6000_sched_insert_nops;
@@ -1109,14 +1099,14 @@ enum reg_class
#define EXTRA_CONSTRAINT(OP, C) \
((C) == 'Q' ? GET_CODE (OP) == MEM && GET_CODE (XEXP (OP, 0)) == REG \
: (C) == 'R' ? legitimate_constant_pool_address_p (OP) \
- : (C) == 'S' ? mask64_operand (OP, DImode) \
+ : (C) == 'S' ? mask_operand (OP, DImode) \
: (C) == 'T' ? mask_operand (OP, SImode) \
: (C) == 'U' ? (DEFAULT_ABI == ABI_V4 \
&& small_data_operand (OP, GET_MODE (OP))) \
: (C) == 't' ? (mask64_2_operand (OP, DImode) \
&& (fixed_regs[CR0_REGNO] \
|| !logical_operand (OP, DImode)) \
- && !mask64_operand (OP, DImode)) \
+ && !mask_operand (OP, DImode)) \
: (C) == 'W' ? (easy_vector_constant (OP, GET_MODE (OP))) \
: (C) == 'Y' ? (word_offset_memref_operand (OP, GET_MODE (OP))) \
: (C) == 'Z' ? (indexed_or_indirect_operand (OP, GET_MODE (OP))) \
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 2c0b0491abe..eee241010af 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -58,6 +58,7 @@
(UNSPEC_LWSYNC 36)
(UNSPEC_ISYNC 37)
(UNSPEC_POPCNTB 38)
+ (UNSPEC_FRES 39)
])
;;
@@ -133,6 +134,12 @@
; (one with a '.') will compare.
(define_mode_macro P [(SI "TARGET_32BIT") (DI "TARGET_64BIT")])
+; Any hardware-supported floating-point mode
+(define_mode_macro FP [(SF "TARGET_HARD_FLOAT")
+ (DF "TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)")
+ (TF "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
+ && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128")])
+
; Various instructions that come in SI and DI forms.
(define_mode_attr larx [(SI "lwarx") (DI "ldarx")])
(define_mode_attr stcx [(SI "stwcx.") (DI "stdcx.")])
@@ -1006,13 +1013,10 @@
;; Fixed-point arithmetic insns.
-(define_mode_attr add_op2 [(SI "reg_or_arith_cint_operand")
- (DI "reg_or_add_cint64_operand")])
-
(define_expand "add<mode>3"
[(set (match_operand:SDI 0 "gpc_reg_operand" "")
(plus:SDI (match_operand:SDI 1 "gpc_reg_operand" "")
- (match_operand:SDI 2 "<add_op2>" "")))]
+ (match_operand:SDI 2 "reg_or_add_cint_operand" "")))]
""
"
{
@@ -1320,13 +1324,10 @@
(const_int 0)))]
"")
-(define_mode_attr sub_op2 [(SI "reg_or_arith_cint_operand")
- (DI "reg_or_sub_cint64_operand")])
-
(define_expand "sub<mode>3"
[(set (match_operand:SDI 0 "gpc_reg_operand" "")
(minus:SDI (match_operand:SDI 1 "reg_or_short_operand" "")
- (match_operand:SDI 2 "<sub_op2>" "")))]
+ (match_operand:SDI 2 "reg_or_sub_cint_operand" "")))]
""
"
{
@@ -1672,7 +1673,7 @@
(const_int 0)))
(set (match_operand:P 0 "gpc_reg_operand" "")
(neg:P (match_dup 1)))]
- "TARGET_32BIT && reload_completed"
+ "reload_completed"
[(set (match_dup 0)
(neg:P (match_dup 1)))
(set (match_dup 2)
@@ -1944,10 +1945,10 @@
"divs %0,%1,%2"
[(set_attr "type" "idiv")])
-(define_expand "udivsi3"
- [(set (match_operand:SI 0 "gpc_reg_operand" "")
- (udiv:SI (match_operand:SI 1 "gpc_reg_operand" "")
- (match_operand:SI 2 "gpc_reg_operand" "")))]
+(define_expand "udiv<mode>3"
+ [(set (match_operand:GPR 0 "gpc_reg_operand" "")
+ (udiv:GPR (match_operand:GPR 1 "gpc_reg_operand" "")
+ (match_operand:GPR 2 "gpc_reg_operand" "")))]
"TARGET_POWERPC || (! TARGET_POWER && ! TARGET_POWERPC)"
"
{
@@ -1976,21 +1977,21 @@
[(set_attr "type" "idiv")])
(define_insn "*udivsi3_no_mq"
- [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
- (udiv:SI (match_operand:SI 1 "gpc_reg_operand" "r")
- (match_operand:SI 2 "gpc_reg_operand" "r")))]
+ [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
+ (udiv:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")
+ (match_operand:GPR 2 "gpc_reg_operand" "r")))]
"TARGET_POWERPC && ! TARGET_POWER"
- "divwu %0,%1,%2"
+ "div<wd>u %0,%1,%2"
[(set_attr "type" "idiv")])
;; For powers of two we can do srai/aze for divide and then adjust for
;; modulus. If it isn't a power of two, FAIL on POWER so divmodsi4 will be
;; used; for PowerPC, force operands into register and do a normal divide;
;; for AIX common-mode, use quoss call on register operands.
-(define_expand "divsi3"
- [(set (match_operand:SI 0 "gpc_reg_operand" "")
- (div:SI (match_operand:SI 1 "gpc_reg_operand" "")
- (match_operand:SI 2 "reg_or_cint_operand" "")))]
+(define_expand "div<mode>3"
+ [(set (match_operand:GPR 0 "gpc_reg_operand" "")
+ (div:GPR (match_operand:GPR 1 "gpc_reg_operand" "")
+ (match_operand:GPR 2 "reg_or_cint_operand" "")))]
""
"
{
@@ -2028,18 +2029,18 @@
"divw %0,%1,%2"
[(set_attr "type" "idiv")])
-(define_insn "*divsi3_no_mq"
- [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
- (div:SI (match_operand:SI 1 "gpc_reg_operand" "r")
- (match_operand:SI 2 "gpc_reg_operand" "r")))]
+(define_insn "*div<mode>3_no_mq"
+ [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
+ (div:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")
+ (match_operand:GPR 2 "gpc_reg_operand" "r")))]
"TARGET_POWERPC && ! TARGET_POWER"
- "divw %0,%1,%2"
+ "div<wd> %0,%1,%2"
[(set_attr "type" "idiv")])
-(define_expand "modsi3"
- [(use (match_operand:SI 0 "gpc_reg_operand" ""))
- (use (match_operand:SI 1 "gpc_reg_operand" ""))
- (use (match_operand:SI 2 "reg_or_cint_operand" ""))]
+(define_expand "mod<mode>3"
+ [(use (match_operand:GPR 0 "gpc_reg_operand" ""))
+ (use (match_operand:GPR 1 "gpc_reg_operand" ""))
+ (use (match_operand:GPR 2 "reg_or_cint_operand" ""))]
""
"
{
@@ -2052,46 +2053,47 @@
|| (i = exact_log2 (INTVAL (operands[2]))) < 0)
FAIL;
- temp1 = gen_reg_rtx (SImode);
- temp2 = gen_reg_rtx (SImode);
+ temp1 = gen_reg_rtx (<MODE>mode);
+ temp2 = gen_reg_rtx (<MODE>mode);
- emit_insn (gen_divsi3 (temp1, operands[1], operands[2]));
- emit_insn (gen_ashlsi3 (temp2, temp1, GEN_INT (i)));
- emit_insn (gen_subsi3 (operands[0], operands[1], temp2));
+ emit_insn (gen_div<mode>3 (temp1, operands[1], operands[2]));
+ emit_insn (gen_ashl<mode>3 (temp2, temp1, GEN_INT (i)));
+ emit_insn (gen_sub<mode>3 (operands[0], operands[1], temp2));
DONE;
}")
(define_insn ""
- [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
- (div:SI (match_operand:SI 1 "gpc_reg_operand" "r")
- (match_operand:SI 2 "exact_log2_cint_operand" "N")))]
+ [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
+ (div:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")
+ (match_operand:GPR 2 "exact_log2_cint_operand" "N")))]
""
- "{srai|srawi} %0,%1,%p2\;{aze|addze} %0,%0"
+ "{srai|sra<wd>i} %0,%1,%p2\;{aze|addze} %0,%0"
[(set_attr "type" "two")
(set_attr "length" "8")])
(define_insn ""
[(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
- (compare:CC (div:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
- (match_operand:SI 2 "exact_log2_cint_operand" "N,N"))
+ (compare:CC (div:P (match_operand:P 1 "gpc_reg_operand" "r,r")
+ (match_operand:P 2 "exact_log2_cint_operand" "N,N"))
(const_int 0)))
- (clobber (match_scratch:SI 3 "=r,r"))]
+ (clobber (match_scratch:P 3 "=r,r"))]
""
"@
- {srai|srawi} %3,%1,%p2\;{aze.|addze.} %3,%3
+ {srai|sra<wd>i} %3,%1,%p2\;{aze.|addze.} %3,%3
#"
[(set_attr "type" "compare")
(set_attr "length" "8,12")])
(define_split
[(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
- (compare:CC (div:SI (match_operand:SI 1 "gpc_reg_operand" "")
- (match_operand:SI 2 "exact_log2_cint_operand" ""))
+ (compare:CC (div:GPR (match_operand:GPR 1 "gpc_reg_operand" "")
+ (match_operand:GPR 2 "exact_log2_cint_operand"
+ ""))
(const_int 0)))
- (clobber (match_scratch:SI 3 ""))]
+ (clobber (match_scratch:GPR 3 ""))]
"reload_completed"
[(set (match_dup 3)
- (div:SI (match_dup 1) (match_dup 2)))
+ (div:<MODE> (match_dup 1) (match_dup 2)))
(set (match_dup 0)
(compare:CC (match_dup 3)
(const_int 0)))]
@@ -2099,28 +2101,29 @@
(define_insn ""
[(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
- (compare:CC (div:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")
- (match_operand:SI 2 "exact_log2_cint_operand" "N,N"))
+ (compare:CC (div:P (match_operand:P 1 "gpc_reg_operand" "r,r")
+ (match_operand:P 2 "exact_log2_cint_operand" "N,N"))
(const_int 0)))
- (set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
- (div:SI (match_dup 1) (match_dup 2)))]
+ (set (match_operand:P 0 "gpc_reg_operand" "=r,r")
+ (div:P (match_dup 1) (match_dup 2)))]
""
"@
- {srai|srawi} %0,%1,%p2\;{aze.|addze.} %0,%0
+ {srai|sra<wd>i} %0,%1,%p2\;{aze.|addze.} %0,%0
#"
[(set_attr "type" "compare")
(set_attr "length" "8,12")])
(define_split
[(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
- (compare:CC (div:SI (match_operand:SI 1 "gpc_reg_operand" "")
- (match_operand:SI 2 "exact_log2_cint_operand" ""))
+ (compare:CC (div:GPR (match_operand:GPR 1 "gpc_reg_operand" "")
+ (match_operand:GPR 2 "exact_log2_cint_operand"
+ ""))
(const_int 0)))
- (set (match_operand:SI 0 "gpc_reg_operand" "")
- (div:SI (match_dup 1) (match_dup 2)))]
+ (set (match_operand:GPR 0 "gpc_reg_operand" "")
+ (div:GPR (match_dup 1) (match_dup 2)))]
"reload_completed"
[(set (match_dup 0)
- (div:SI (match_dup 1) (match_dup 2)))
+ (div:<MODE> (match_dup 1) (match_dup 2)))
(set (match_dup 3)
(compare:CC (match_dup 0)
(const_int 0)))]
@@ -2361,15 +2364,15 @@
(define_split
[(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
- (compare:CC (and:SI (match_operand:SI 1 "gpc_reg_operand" "")
- (match_operand:SI 2 "and_operand" ""))
+ (compare:CC (and:GPR (match_operand:GPR 1 "gpc_reg_operand" "")
+ (match_operand:GPR 2 "and_operand" ""))
(const_int 0)))
- (clobber (match_scratch:SI 3 ""))
+ (clobber (match_scratch:GPR 3 ""))
(clobber (match_scratch:CC 4 ""))]
"reload_completed"
[(parallel [(set (match_dup 3)
- (and:SI (match_dup 1)
- (match_dup 2)))
+ (and:<MODE> (match_dup 1)
+ (match_dup 2)))
(clobber (match_dup 4))])
(set (match_dup 0)
(compare:CC (match_dup 3)
@@ -3004,7 +3007,7 @@
[(set (zero_extract:SI (match_operand:SI 0 "gpc_reg_operand" "+r")
(match_operand:SI 1 "const_int_operand" "i")
(match_operand:SI 2 "const_int_operand" "i"))
- (ashift:SI (match_operand:SI 3 "gpc_reg_operand" "r")
+ (rotate:SI (match_operand:SI 3 "gpc_reg_operand" "r")
(match_operand:SI 4 "const_int_operand" "i")))]
"(32 - (INTVAL (operands[4]) & 31)) >= INTVAL (operands[1])"
"*
@@ -3014,7 +3017,7 @@
int size = INTVAL (operands[1]) & 31;
operands[4] = GEN_INT (shift - start - size);
- operands[1] = GEN_INT (start + size - 1 - shift);
+ operands[1] = GEN_INT (start + size - 1);
return \"{rlimi|rlwimi} %0,%3,%h4,%h2,%h1\";
}"
[(set_attr "type" "insert_word")])
@@ -4640,12 +4643,26 @@
"{fm|fmul} %0,%1,%2"
[(set_attr "type" "dmul")])
+(define_insn "fres"
+ [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
+ (unspec:SF [(match_operand:SF 1 "gpc_reg_operand" "f")] UNSPEC_FRES))]
+ "TARGET_PPC_GFXOPT && flag_finite_math_only"
+ "fres %0,%1"
+ [(set_attr "type" "fp")])
+
(define_expand "divsf3"
[(set (match_operand:SF 0 "gpc_reg_operand" "")
(div:SF (match_operand:SF 1 "gpc_reg_operand" "")
(match_operand:SF 2 "gpc_reg_operand" "")))]
"TARGET_HARD_FLOAT"
- "")
+{
+ if (swdiv && !optimize_size && TARGET_PPC_GFXOPT
+ && flag_finite_math_only && !flag_trapping_math)
+ {
+ rs6000_emit_swdivsf (operands[0], operands[1], operands[2]);
+ DONE;
+ }
+})
(define_insn ""
[(set (match_operand:SF 0 "gpc_reg_operand" "=f")
@@ -5028,12 +5045,26 @@
"{fm|fmul} %0,%1,%2"
[(set_attr "type" "dmul")])
+(define_insn "fred"
+ [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
+ (unspec:DF [(match_operand:DF 1 "gpc_reg_operand" "f")] UNSPEC_FRES))]
+ "TARGET_POPCNTB && flag_finite_math_only"
+ "fre %0,%1"
+ [(set_attr "type" "fp")])
+
(define_expand "divdf3"
[(set (match_operand:DF 0 "gpc_reg_operand" "")
(div:DF (match_operand:DF 1 "gpc_reg_operand" "")
(match_operand:DF 2 "gpc_reg_operand" "")))]
"TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)"
- "")
+{
+ if (swdiv && !optimize_size && TARGET_POPCNTB
+ && flag_finite_math_only && !flag_trapping_math)
+ {
+ rs6000_emit_swdivdf (operands[0], operands[1], operands[2]);
+ DONE;
+ }
+})
(define_insn "*divdf3_fpr"
[(set (match_operand:DF 0 "gpc_reg_operand" "=f")
@@ -6004,127 +6035,6 @@
"mulhdu %0,%1,%2"
[(set_attr "type" "lmul")])
-(define_expand "divdi3"
- [(set (match_operand:DI 0 "gpc_reg_operand" "")
- (div:DI (match_operand:DI 1 "gpc_reg_operand" "")
- (match_operand:DI 2 "reg_or_cint_operand" "")))]
- "TARGET_POWERPC64"
- "
-{
- if (GET_CODE (operands[2]) == CONST_INT
- && INTVAL (operands[2]) > 0
- && exact_log2 (INTVAL (operands[2])) >= 0)
- ;
- else
- operands[2] = force_reg (DImode, operands[2]);
-}")
-
-(define_expand "moddi3"
- [(use (match_operand:DI 0 "gpc_reg_operand" ""))
- (use (match_operand:DI 1 "gpc_reg_operand" ""))
- (use (match_operand:DI 2 "reg_or_cint_operand" ""))]
- "TARGET_POWERPC64"
- "
-{
- int i;
- rtx temp1;
- rtx temp2;
-
- if (GET_CODE (operands[2]) != CONST_INT
- || INTVAL (operands[2]) <= 0
- || (i = exact_log2 (INTVAL (operands[2]))) < 0)
- FAIL;
-
- temp1 = gen_reg_rtx (DImode);
- temp2 = gen_reg_rtx (DImode);
-
- emit_insn (gen_divdi3 (temp1, operands[1], operands[2]));
- emit_insn (gen_ashldi3 (temp2, temp1, GEN_INT (i)));
- emit_insn (gen_subdi3 (operands[0], operands[1], temp2));
- DONE;
-}")
-
-(define_insn ""
- [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
- (div:DI (match_operand:DI 1 "gpc_reg_operand" "r")
- (match_operand:DI 2 "exact_log2_cint_operand" "N")))]
- "TARGET_POWERPC64"
- "sradi %0,%1,%p2\;addze %0,%0"
- [(set_attr "type" "two")
- (set_attr "length" "8")])
-
-(define_insn ""
- [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y")
- (compare:CC (div:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
- (match_operand:DI 2 "exact_log2_cint_operand" "N,N"))
- (const_int 0)))
- (clobber (match_scratch:DI 3 "=r,r"))]
- "TARGET_64BIT"
- "@
- sradi %3,%1,%p2\;addze. %3,%3
- #"
- [(set_attr "type" "compare")
- (set_attr "length" "8,12")])
-
-(define_split
- [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
- (compare:CC (div:DI (match_operand:DI 1 "gpc_reg_operand" "")
- (match_operand:DI 2 "exact_log2_cint_operand" ""))
- (const_int 0)))
- (clobber (match_scratch:DI 3 ""))]
- "TARGET_POWERPC64 && reload_completed"
- [(set (match_dup 3)
- (div:DI (match_dup 1) (match_dup 2)))
- (set (match_dup 0)
- (compare:CC (match_dup 3)
- (const_int 0)))]
- "")
-
-(define_insn ""
- [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
- (compare:CC (div:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
- (match_operand:DI 2 "exact_log2_cint_operand" "N,N"))
- (const_int 0)))
- (set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
- (div:DI (match_dup 1) (match_dup 2)))]
- "TARGET_64BIT"
- "@
- sradi %0,%1,%p2\;addze. %0,%0
- #"
- [(set_attr "type" "compare")
- (set_attr "length" "8,12")])
-
-(define_split
- [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
- (compare:CC (div:DI (match_operand:DI 1 "gpc_reg_operand" "")
- (match_operand:DI 2 "exact_log2_cint_operand" ""))
- (const_int 0)))
- (set (match_operand:DI 0 "gpc_reg_operand" "")
- (div:DI (match_dup 1) (match_dup 2)))]
- "TARGET_POWERPC64 && reload_completed"
- [(set (match_dup 0)
- (div:DI (match_dup 1) (match_dup 2)))
- (set (match_dup 3)
- (compare:CC (match_dup 0)
- (const_int 0)))]
- "")
-
-(define_insn ""
- [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
- (div:DI (match_operand:DI 1 "gpc_reg_operand" "r")
- (match_operand:DI 2 "gpc_reg_operand" "r")))]
- "TARGET_POWERPC64"
- "divd %0,%1,%2"
- [(set_attr "type" "ldiv")])
-
-(define_insn "udivdi3"
- [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
- (udiv:DI (match_operand:DI 1 "gpc_reg_operand" "r")
- (match_operand:DI 2 "gpc_reg_operand" "r")))]
- "TARGET_POWERPC64"
- "divdu %0,%1,%2"
- [(set_attr "type" "ldiv")])
-
(define_insn "rotldi3"
[(set (match_operand:DI 0 "gpc_reg_operand" "=r")
(rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r")
@@ -6192,7 +6102,7 @@
[(set (match_operand:DI 0 "gpc_reg_operand" "=r")
(and:DI (rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r")
(match_operand:DI 2 "reg_or_cint_operand" "ri"))
- (match_operand:DI 3 "mask64_operand" "n")))]
+ (match_operand:DI 3 "mask_operand" "n")))]
"TARGET_POWERPC64"
"rld%I2c%B3 %0,%1,%H2,%S3")
@@ -6201,7 +6111,7 @@
(compare:CC (and:DI
(rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
(match_operand:DI 2 "reg_or_cint_operand" "ri,ri"))
- (match_operand:DI 3 "mask64_operand" "n,n"))
+ (match_operand:DI 3 "mask_operand" "n,n"))
(const_int 0)))
(clobber (match_scratch:DI 4 "=r,r"))]
"TARGET_64BIT"
@@ -6216,7 +6126,7 @@
(compare:CC (and:DI
(rotate:DI (match_operand:DI 1 "gpc_reg_operand" "")
(match_operand:DI 2 "reg_or_cint_operand" ""))
- (match_operand:DI 3 "mask64_operand" ""))
+ (match_operand:DI 3 "mask_operand" ""))
(const_int 0)))
(clobber (match_scratch:DI 4 ""))]
"TARGET_POWERPC64 && reload_completed"
@@ -6234,7 +6144,7 @@
(compare:CC (and:DI
(rotate:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
(match_operand:DI 2 "reg_or_cint_operand" "ri,ri"))
- (match_operand:DI 3 "mask64_operand" "n,n"))
+ (match_operand:DI 3 "mask_operand" "n,n"))
(const_int 0)))
(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
(and:DI (rotate:DI (match_dup 1) (match_dup 2)) (match_dup 3)))]
@@ -6250,7 +6160,7 @@
(compare:CC (and:DI
(rotate:DI (match_operand:DI 1 "gpc_reg_operand" "")
(match_operand:DI 2 "reg_or_cint_operand" ""))
- (match_operand:DI 3 "mask64_operand" ""))
+ (match_operand:DI 3 "mask_operand" ""))
(const_int 0)))
(set (match_operand:DI 0 "gpc_reg_operand" "")
(and:DI (rotate:DI (match_dup 1) (match_dup 2)) (match_dup 3)))]
@@ -6648,7 +6558,7 @@
[(set (match_operand:DI 0 "gpc_reg_operand" "=r")
(and:DI (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r")
(match_operand:SI 2 "const_int_operand" "i"))
- (match_operand:DI 3 "mask64_operand" "n")))]
+ (match_operand:DI 3 "mask_operand" "n")))]
"TARGET_POWERPC64 && includes_rldicr_lshift_p (operands[2], operands[3])"
"rldicr %0,%1,%H2,%S3")
@@ -6657,7 +6567,7 @@
(compare:CC
(and:DI (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
(match_operand:SI 2 "const_int_operand" "i,i"))
- (match_operand:DI 3 "mask64_operand" "n,n"))
+ (match_operand:DI 3 "mask_operand" "n,n"))
(const_int 0)))
(clobber (match_scratch:DI 4 "=r,r"))]
"TARGET_64BIT && includes_rldicr_lshift_p (operands[2], operands[3])"
@@ -6672,7 +6582,7 @@
(compare:CC
(and:DI (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "")
(match_operand:SI 2 "const_int_operand" ""))
- (match_operand:DI 3 "mask64_operand" ""))
+ (match_operand:DI 3 "mask_operand" ""))
(const_int 0)))
(clobber (match_scratch:DI 4 ""))]
"TARGET_POWERPC64 && reload_completed
@@ -6690,7 +6600,7 @@
(compare:CC
(and:DI (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
(match_operand:SI 2 "const_int_operand" "i,i"))
- (match_operand:DI 3 "mask64_operand" "n,n"))
+ (match_operand:DI 3 "mask_operand" "n,n"))
(const_int 0)))
(set (match_operand:DI 0 "gpc_reg_operand" "=r,r")
(and:DI (ashift:DI (match_dup 1) (match_dup 2)) (match_dup 3)))]
@@ -6706,7 +6616,7 @@
(compare:CC
(and:DI (ashift:DI (match_operand:DI 1 "gpc_reg_operand" "")
(match_operand:SI 2 "const_int_operand" ""))
- (match_operand:DI 3 "mask64_operand" ""))
+ (match_operand:DI 3 "mask_operand" ""))
(const_int 0)))
(set (match_operand:DI 0 "gpc_reg_operand" "")
(and:DI (ashift:DI (match_dup 1) (match_dup 2)) (match_dup 3)))]
@@ -6911,7 +6821,7 @@
(clobber (match_scratch:CC 3 ""))]
"TARGET_POWERPC64
&& (fixed_regs[CR0_REGNO] || !logical_operand (operands[2], DImode))
- && !mask64_operand (operands[2], DImode)"
+ && !mask_operand (operands[2], DImode)"
[(set (match_dup 0)
(and:DI (rotate:DI (match_dup 1)
(match_dup 4))
@@ -6947,23 +6857,6 @@
(set_attr "length" "4,4,4,4,8,8,8,8,8,12")])
(define_split
- [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "")
- (compare:CC (and:DI (match_operand:DI 1 "gpc_reg_operand" "")
- (match_operand:DI 2 "and64_operand" ""))
- (const_int 0)))
- (clobber (match_scratch:DI 3 ""))
- (clobber (match_scratch:CC 4 ""))]
- "TARGET_POWERPC64 && reload_completed"
- [(parallel [(set (match_dup 3)
- (and:DI (match_dup 1)
- (match_dup 2)))
- (clobber (match_dup 4))])
- (set (match_dup 0)
- (compare:CC (match_dup 3)
- (const_int 0)))]
- "")
-
-(define_split
[(set (match_operand:CC 0 "cc_reg_operand" "")
(compare:CC (and:DI (match_operand:DI 1 "gpc_reg_operand" "")
(match_operand:DI 2 "mask64_2_operand" ""))
@@ -6972,7 +6865,7 @@
(clobber (match_scratch:CC 4 ""))]
"TARGET_POWERPC64 && reload_completed
&& (fixed_regs[CR0_REGNO] || !logical_operand (operands[2], DImode))
- && !mask64_operand (operands[2], DImode)"
+ && !mask_operand (operands[2], DImode)"
[(set (match_dup 3)
(and:DI (rotate:DI (match_dup 1)
(match_dup 5))
@@ -7014,7 +6907,7 @@
(define_split
[(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "")
(compare:CC (and:DI (match_operand:DI 1 "gpc_reg_operand" "")
- (match_operand:DI 2 "and64_operand" ""))
+ (match_operand:DI 2 "and_operand" ""))
(const_int 0)))
(set (match_operand:DI 0 "gpc_reg_operand" "")
(and:DI (match_dup 1) (match_dup 2)))
@@ -7038,7 +6931,7 @@
(clobber (match_scratch:CC 4 ""))]
"TARGET_POWERPC64 && reload_completed
&& (fixed_regs[CR0_REGNO] || !logical_operand (operands[2], DImode))
- && !mask64_operand (operands[2], DImode)"
+ && !mask_operand (operands[2], DImode)"
[(set (match_dup 0)
(and:DI (rotate:DI (match_dup 1)
(match_dup 5))
@@ -7360,26 +7253,6 @@
;; Now define ways of moving data around.
-;; Elf specific ways of loading addresses for non-PIC code.
-;; The output of this could be r0, but we make a very strong
-;; preference for a base register because it will usually
-;; be needed there.
-(define_insn "elf_high"
- [(set (match_operand:SI 0 "gpc_reg_operand" "=b*r")
- (high:SI (match_operand 1 "" "")))]
- "TARGET_ELF && ! TARGET_64BIT"
- "{liu|lis} %0,%1@ha")
-
-(define_insn "elf_low"
- [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
- (lo_sum:SI (match_operand:SI 1 "gpc_reg_operand" "b,!*r")
- (match_operand 2 "" "")))]
- "TARGET_ELF && ! TARGET_64BIT"
- "@
- {cal|la} %0,%2@l(%1)
- {ai|addic} %0,%1,%K2")
-
-
;; Set up a register with a value from the GOT table
(define_expand "movsi_got"
@@ -7436,12 +7309,6 @@
;; do the load 16-bits at a time. We could do this by loading from memory,
;; and this is even supposed to be faster, but it is simpler not to get
;; integers in the TOC.
-(define_expand "movsi"
- [(set (match_operand:SI 0 "general_operand" "")
- (match_operand:SI 1 "any_operand" ""))]
- ""
- "{ rs6000_emit_move (operands[0], operands[1], SImode); DONE; }")
-
(define_insn "movsi_low"
[(set (match_operand:SI 0 "gpc_reg_operand" "=r")
(mem:SI (lo_sum:SI (match_operand:SI 1 "gpc_reg_operand" "b")
@@ -7495,14 +7362,14 @@
FAIL;
}")
-(define_insn "*movsi_internal2"
+(define_insn "*mov<mode>_internal2"
[(set (match_operand:CC 2 "cc_reg_operand" "=y,x,?y")
- (compare:CC (match_operand:SI 1 "gpc_reg_operand" "0,r,r")
+ (compare:CC (match_operand:P 1 "gpc_reg_operand" "0,r,r")
(const_int 0)))
- (set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r") (match_dup 1))]
- "TARGET_32BIT"
+ (set (match_operand:P 0 "gpc_reg_operand" "=r,r,r") (match_dup 1))]
+ ""
"@
- {cmpi|cmpwi} %2,%0,0
+ {cmpi|cmp<wd>i} %2,%0,0
mr. %0,%1
#"
[(set_attr "type" "cmp,compare,cmp")
@@ -7510,22 +7377,16 @@
(define_split
[(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "")
- (compare:CC (match_operand:SI 1 "gpc_reg_operand" "")
+ (compare:CC (match_operand:P 1 "gpc_reg_operand" "")
(const_int 0)))
- (set (match_operand:SI 0 "gpc_reg_operand" "") (match_dup 1))]
- "TARGET_32BIT && reload_completed"
+ (set (match_operand:P 0 "gpc_reg_operand" "") (match_dup 1))]
+ "reload_completed"
[(set (match_dup 0) (match_dup 1))
(set (match_dup 2)
(compare:CC (match_dup 0)
(const_int 0)))]
"")
-(define_expand "movhi"
- [(set (match_operand:HI 0 "general_operand" "")
- (match_operand:HI 1 "any_operand" ""))]
- ""
- "{ rs6000_emit_move (operands[0], operands[1], HImode); DONE; }")
-
(define_insn "*movhi_internal"
[(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,m,r,r,*q,*c*l,*h")
(match_operand:HI 1 "input_operand" "r,m,r,i,*h,r,r,0"))]
@@ -7542,11 +7403,11 @@
{cror 0,0,0|nop}"
[(set_attr "type" "*,load,store,*,mfjmpr,*,mtjmpr,*")])
-(define_expand "movqi"
- [(set (match_operand:QI 0 "general_operand" "")
- (match_operand:QI 1 "any_operand" ""))]
+(define_expand "mov<mode>"
+ [(set (match_operand:INT 0 "general_operand" "")
+ (match_operand:INT 1 "any_operand" ""))]
""
- "{ rs6000_emit_move (operands[0], operands[1], QImode); DONE; }")
+ "{ rs6000_emit_move (operands[0], operands[1], <MODE>mode); DONE; }")
(define_insn "*movqi_internal"
[(set (match_operand:QI 0 "nonimmediate_operand" "=r,r,m,r,r,*q,*c*l,*h")
@@ -8195,11 +8056,6 @@
;; Next come the multi-word integer load and store and the load and store
;; multiple insns.
-(define_expand "movdi"
- [(set (match_operand:DI 0 "general_operand" "")
- (match_operand:DI 1 "any_operand" ""))]
- ""
- "{ rs6000_emit_move (operands[0], operands[1], DImode); DONE; }")
; List r->r after r->"o<>", otherwise reload will try to reload a
; non-offsettable address by using r->r which won't make progress.
@@ -8289,7 +8145,7 @@
;; Use (and:DI (rotate:DI ...)) to avoid anddi3 unnecessary clobber.
(define_split
[(set (match_operand:DI 0 "gpc_reg_operand" "")
- (match_operand:DI 1 "mask64_operand" ""))]
+ (match_operand:DI 1 "mask_operand" ""))]
"TARGET_POWERPC64 && num_insns_constant (operands[1], DImode) > 1"
[(set (match_dup 0) (const_int -1))
(set (match_dup 0)
@@ -8331,41 +8187,10 @@
else
FAIL;
}")
-
-(define_insn "*movdi_internal2"
- [(set (match_operand:CC 2 "cc_reg_operand" "=y,x,?y")
- (compare:CC (match_operand:DI 1 "gpc_reg_operand" "0,r,r")
- (const_int 0)))
- (set (match_operand:DI 0 "gpc_reg_operand" "=r,r,r") (match_dup 1))]
- "TARGET_64BIT"
- "@
- cmpdi %2,%0,0
- mr. %0,%1
- #"
- [(set_attr "type" "cmp,compare,cmp")
- (set_attr "length" "4,4,8")])
-
-(define_split
- [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "")
- (compare:CC (match_operand:DI 1 "gpc_reg_operand" "")
- (const_int 0)))
- (set (match_operand:DI 0 "gpc_reg_operand" "") (match_dup 1))]
- "TARGET_POWERPC64 && reload_completed"
- [(set (match_dup 0) (match_dup 1))
- (set (match_dup 2)
- (compare:CC (match_dup 0)
- (const_int 0)))]
- "")
;; TImode is similar, except that we usually want to compute the address into
;; a register and use lsi/stsi (the exception is during reload). MQ is also
;; clobbered in stsi for POWER, so we need a SCRATCH for it.
-(define_expand "movti"
- [(parallel [(set (match_operand:TI 0 "general_operand" "")
- (match_operand:TI 1 "general_operand" ""))
- (clobber (scratch:SI))])]
- ""
- "{ rs6000_emit_move (operands[0], operands[1], TImode); DONE; }")
;; We say that MQ is clobbered in the last alternative because the first
;; alternative would never get used otherwise since it would need a reload
@@ -8869,8 +8694,8 @@
(set_attr "length" "8")])
(define_insn ""
- [(set (mem:BLK (match_operand:SI 0 "gpc_reg_operand" "b"))
- (mem:BLK (match_operand:SI 1 "gpc_reg_operand" "b")))
+ [(set (mem:BLK (match_operand:P 0 "gpc_reg_operand" "b"))
+ (mem:BLK (match_operand:P 1 "gpc_reg_operand" "b")))
(use (match_operand:SI 2 "immediate_operand" "i"))
(use (match_operand:SI 3 "immediate_operand" "i"))
(clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
@@ -8892,30 +8717,6 @@
[(set_attr "type" "load")
(set_attr "length" "8")])
-(define_insn ""
- [(set (mem:BLK (match_operand:DI 0 "gpc_reg_operand" "b"))
- (mem:BLK (match_operand:DI 1 "gpc_reg_operand" "b")))
- (use (match_operand:SI 2 "immediate_operand" "i"))
- (use (match_operand:SI 3 "immediate_operand" "i"))
- (clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
- (clobber (reg:SI 6))
- (clobber (reg:SI 7))
- (clobber (reg:SI 8))
- (clobber (reg:SI 9))
- (clobber (reg:SI 10))
- (clobber (reg:SI 11))
- (clobber (reg:SI 12))
- (clobber (match_scratch:SI 5 "X"))]
- "TARGET_STRING && TARGET_POWERPC64
- && ((INTVAL (operands[2]) > 24 && INTVAL (operands[2]) < 32)
- || INTVAL (operands[2]) == 0)
- && (REGNO (operands[0]) < 5 || REGNO (operands[0]) > 12)
- && (REGNO (operands[1]) < 5 || REGNO (operands[1]) > 12)
- && REGNO (operands[4]) == 5"
- "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
- [(set_attr "type" "load")
- (set_attr "length" "8")])
-
;; Move up to 24 bytes at a time. The fixed registers are needed because the
;; register allocator doesn't have a clue about allocating 6 word registers.
;; rD/rS = r5 is preferred, efficient form.
@@ -8956,8 +8757,8 @@
(set_attr "length" "8")])
(define_insn ""
- [(set (mem:BLK (match_operand:SI 0 "gpc_reg_operand" "b"))
- (mem:BLK (match_operand:SI 1 "gpc_reg_operand" "b")))
+ [(set (mem:BLK (match_operand:P 0 "gpc_reg_operand" "b"))
+ (mem:BLK (match_operand:P 1 "gpc_reg_operand" "b")))
(use (match_operand:SI 2 "immediate_operand" "i"))
(use (match_operand:SI 3 "immediate_operand" "i"))
(clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
@@ -8976,27 +8777,6 @@
[(set_attr "type" "load")
(set_attr "length" "8")])
-(define_insn ""
- [(set (mem:BLK (match_operand:DI 0 "gpc_reg_operand" "b"))
- (mem:BLK (match_operand:DI 1 "gpc_reg_operand" "b")))
- (use (match_operand:SI 2 "immediate_operand" "i"))
- (use (match_operand:SI 3 "immediate_operand" "i"))
- (clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
- (clobber (reg:SI 6))
- (clobber (reg:SI 7))
- (clobber (reg:SI 8))
- (clobber (reg:SI 9))
- (clobber (reg:SI 10))
- (clobber (match_scratch:SI 5 "X"))]
- "TARGET_STRING && TARGET_POWERPC64
- && INTVAL (operands[2]) > 16 && INTVAL (operands[2]) <= 32
- && (REGNO (operands[0]) < 5 || REGNO (operands[0]) > 10)
- && (REGNO (operands[1]) < 5 || REGNO (operands[1]) > 10)
- && REGNO (operands[4]) == 5"
- "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
- [(set_attr "type" "load")
- (set_attr "length" "8")])
-
;; Move up to 16 bytes at a time, using 4 fixed registers to avoid spill
;; problems with TImode.
;; rD/rS = r5 is preferred, efficient form.
@@ -9033,8 +8813,8 @@
(set_attr "length" "8")])
(define_insn ""
- [(set (mem:BLK (match_operand:SI 0 "gpc_reg_operand" "b"))
- (mem:BLK (match_operand:SI 1 "gpc_reg_operand" "b")))
+ [(set (mem:BLK (match_operand:P 0 "gpc_reg_operand" "b"))
+ (mem:BLK (match_operand:P 1 "gpc_reg_operand" "b")))
(use (match_operand:SI 2 "immediate_operand" "i"))
(use (match_operand:SI 3 "immediate_operand" "i"))
(clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
@@ -9051,25 +8831,6 @@
[(set_attr "type" "load")
(set_attr "length" "8")])
-(define_insn ""
- [(set (mem:BLK (match_operand:DI 0 "gpc_reg_operand" "b"))
- (mem:BLK (match_operand:DI 1 "gpc_reg_operand" "b")))
- (use (match_operand:SI 2 "immediate_operand" "i"))
- (use (match_operand:SI 3 "immediate_operand" "i"))
- (clobber (match_operand:SI 4 "gpc_reg_operand" "=r"))
- (clobber (reg:SI 6))
- (clobber (reg:SI 7))
- (clobber (reg:SI 8))
- (clobber (match_scratch:SI 5 "X"))]
- "TARGET_STRING && TARGET_POWERPC64
- && INTVAL (operands[2]) > 8 && INTVAL (operands[2]) <= 16
- && (REGNO (operands[0]) < 5 || REGNO (operands[0]) > 8)
- && (REGNO (operands[1]) < 5 || REGNO (operands[1]) > 8)
- && REGNO (operands[4]) == 5"
- "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
- [(set_attr "type" "load")
- (set_attr "length" "8")])
-
;; Move up to 8 bytes at a time.
(define_expand "movmemsi_2reg"
[(parallel [(set (match_operand 0 "" "")
@@ -9132,8 +8893,8 @@
(set_attr "length" "8")])
(define_insn ""
- [(set (mem:BLK (match_operand:SI 0 "gpc_reg_operand" "b"))
- (mem:BLK (match_operand:SI 1 "gpc_reg_operand" "b")))
+ [(set (mem:BLK (match_operand:P 0 "gpc_reg_operand" "b"))
+ (mem:BLK (match_operand:P 1 "gpc_reg_operand" "b")))
(use (match_operand:SI 2 "immediate_operand" "i"))
(use (match_operand:SI 3 "immediate_operand" "i"))
(clobber (match_scratch:SI 4 "=&r"))
@@ -9143,20 +8904,6 @@
"{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
[(set_attr "type" "load")
(set_attr "length" "8")])
-
-(define_insn ""
- [(set (mem:BLK (match_operand:DI 0 "gpc_reg_operand" "b"))
- (mem:BLK (match_operand:DI 1 "gpc_reg_operand" "b")))
- (use (match_operand:SI 2 "immediate_operand" "i"))
- (use (match_operand:SI 3 "immediate_operand" "i"))
- (clobber (match_scratch:SI 4 "=&r"))
- (clobber (match_scratch:SI 5 "X"))]
- "TARGET_STRING && TARGET_POWERPC64
- && INTVAL (operands[2]) > 0 && INTVAL (operands[2]) <= 4"
- "{lsi|lswi} %4,%1,%2\;{stsi|stswi} %4,%0,%2"
- [(set_attr "type" "load")
- (set_attr "length" "8")])
-
;; Define insns that do load or store with update. Some of these we can
;; get by using pre-decrement or pre-increment, but the hardware can also
@@ -9810,7 +9557,8 @@
[(set (match_operand:SI 0 "register_operand" "=l")
(match_operand:SI 1 "immediate_operand" "s"))
(use (unspec [(match_dup 1)] UNSPEC_TOC))]
- "TARGET_ELF && DEFAULT_ABI != ABI_AIX && flag_pic == 2"
+ "TARGET_ELF && DEFAULT_ABI != ABI_AIX
+ && (flag_pic == 2 || (flag_pic && TARGET_SECURE_PLT))"
"bcl 20,31,%1\\n%1:"
[(set_attr "type" "branch")
(set_attr "length" "4")])
@@ -9833,6 +9581,22 @@
"{l|lwz} %0,%2-%3(%1)"
[(set_attr "type" "load")])
+(define_insn "load_toc_v4_PIC_3b"
+ [(set (match_operand:SI 0 "gpc_reg_operand" "=b")
+ (plus:SI (match_operand:SI 1 "gpc_reg_operand" "r")
+ (high:SI
+ (minus:SI (match_operand:SI 2 "symbol_ref_operand" "s")
+ (match_operand:SI 3 "symbol_ref_operand" "s")))))]
+ "TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic"
+ "{cau|addis} %0,%1,%2-%3@ha")
+
+(define_insn "load_toc_v4_PIC_3c"
+ [(set (match_operand:SI 0 "gpc_reg_operand" "=r")
+ (lo_sum:SI (match_operand:SI 1 "gpc_reg_operand" "b")
+ (minus:SI (match_operand:SI 2 "symbol_ref_operand" "s")
+ (match_operand:SI 3 "symbol_ref_operand" "s"))))]
+ "TARGET_ELF && TARGET_SECURE_PLT && DEFAULT_ABI != ABI_AIX && flag_pic"
+ "{cal|addi} %0,%1,%2-%3@l")
;; 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
@@ -9867,6 +9631,25 @@
rs6000_emit_load_toc_table (FALSE);
DONE;
}")
+
+;; Elf specific ways of loading addresses for non-PIC code.
+;; The output of this could be r0, but we make a very strong
+;; preference for a base register because it will usually
+;; be needed there.
+(define_insn "elf_high"
+ [(set (match_operand:SI 0 "gpc_reg_operand" "=b*r")
+ (high:SI (match_operand 1 "" "")))]
+ "TARGET_ELF && ! TARGET_64BIT"
+ "{liu|lis} %0,%1@ha")
+
+(define_insn "elf_low"
+ [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r")
+ (lo_sum:SI (match_operand:SI 1 "gpc_reg_operand" "b,!*r")
+ (match_operand 2 "" "")))]
+ "TARGET_ELF && ! TARGET_64BIT"
+ "@
+ {cal|la} %0,%2@l(%1)
+ {ai|addic} %0,%1,%K2")
;; A function pointer under AIX is a pointer to a data area whose first word
;; contains the actual address of the function, whose second word contains a
@@ -9983,6 +9766,25 @@
operands[0] = XEXP (operands[0], 0);
+ if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT
+ && flag_pic
+ && GET_CODE (operands[0]) == SYMBOL_REF
+ && !SYMBOL_REF_LOCAL_P (operands[0]))
+ {
+ rtx call;
+ rtvec tmp;
+
+ tmp = gen_rtvec (3,
+ gen_rtx_CALL (VOIDmode,
+ gen_rtx_MEM (SImode, operands[0]),
+ operands[1]),
+ gen_rtx_USE (VOIDmode, operands[2]),
+ gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (SImode)));
+ call = emit_call_insn (gen_rtx_PARALLEL (VOIDmode, tmp));
+ use_reg (&CALL_INSN_FUNCTION_USAGE (call), pic_offset_table_rtx);
+ DONE;
+ }
+
if (GET_CODE (operands[0]) != SYMBOL_REF
|| (DEFAULT_ABI == ABI_AIX && !SYMBOL_REF_FUNCTION_P (operands[0]))
|| (DEFAULT_ABI != ABI_DARWIN && (INTVAL (operands[2]) & CALL_LONG) != 0))
@@ -10034,6 +9836,28 @@
operands[1] = XEXP (operands[1], 0);
+ if (DEFAULT_ABI == ABI_V4 && TARGET_SECURE_PLT
+ && flag_pic
+ && GET_CODE (operands[1]) == SYMBOL_REF
+ && !SYMBOL_REF_LOCAL_P (operands[1]))
+ {
+ rtx call;
+ rtvec tmp;
+
+ tmp = gen_rtvec (3,
+ gen_rtx_SET (VOIDmode,
+ operands[0],
+ gen_rtx_CALL (VOIDmode,
+ gen_rtx_MEM (SImode,
+ operands[1]),
+ operands[2])),
+ gen_rtx_USE (VOIDmode, operands[3]),
+ gen_rtx_CLOBBER (VOIDmode, gen_rtx_SCRATCH (SImode)));
+ call = emit_call_insn (gen_rtx_PARALLEL (VOIDmode, tmp));
+ use_reg (&CALL_INSN_FUNCTION_USAGE (call), pic_offset_table_rtx);
+ DONE;
+ }
+
if (GET_CODE (operands[1]) != SYMBOL_REF
|| (DEFAULT_ABI == ABI_AIX && !SYMBOL_REF_FUNCTION_P (operands[1]))
|| (DEFAULT_ABI != ABI_DARWIN && (INTVAL (operands[3]) & CALL_LONG) != 0))
@@ -10161,13 +9985,13 @@
;; and < 0 if they were not.
(define_insn "*call_indirect_nonlocal_aix32"
- [(call (mem:SI (match_operand:SI 0 "register_operand" "cl"))
- (match_operand 1 "" "g"))
+ [(call (mem:SI (match_operand:SI 0 "register_operand" "c,*l"))
+ (match_operand 1 "" "g,g"))
(use (reg:SI 2))
(use (reg:SI 11))
(set (reg:SI 2)
(mem:SI (plus:SI (reg:SI 1) (const_int 20))))
- (clobber (match_scratch:SI 2 "=l"))]
+ (clobber (match_scratch:SI 2 "=l,l"))]
"TARGET_32BIT && DEFAULT_ABI == ABI_AIX"
"b%T0l\;{l|lwz} 2,20(1)"
[(set_attr "type" "jmpreg")
@@ -10186,13 +10010,13 @@
(set_attr "length" "8")])
(define_insn "*call_indirect_nonlocal_aix64"
- [(call (mem:SI (match_operand:DI 0 "register_operand" "cl"))
- (match_operand 1 "" "g"))
+ [(call (mem:SI (match_operand:DI 0 "register_operand" "c,*l"))
+ (match_operand 1 "" "g,g"))
(use (reg:DI 2))
(use (reg:DI 11))
(set (reg:DI 2)
(mem:DI (plus:DI (reg:DI 1) (const_int 40))))
- (clobber (match_scratch:SI 2 "=l"))]
+ (clobber (match_scratch:SI 2 "=l,l"))]
"TARGET_64BIT && DEFAULT_ABI == ABI_AIX"
"b%T0l\;ld 2,40(1)"
[(set_attr "type" "jmpreg")
@@ -10212,13 +10036,13 @@
(define_insn "*call_value_indirect_nonlocal_aix32"
[(set (match_operand 0 "" "")
- (call (mem:SI (match_operand:SI 1 "register_operand" "cl"))
- (match_operand 2 "" "g")))
+ (call (mem:SI (match_operand:SI 1 "register_operand" "c,*l"))
+ (match_operand 2 "" "g,g")))
(use (reg:SI 2))
(use (reg:SI 11))
(set (reg:SI 2)
(mem:SI (plus:SI (reg:SI 1) (const_int 20))))
- (clobber (match_scratch:SI 3 "=l"))]
+ (clobber (match_scratch:SI 3 "=l,l"))]
"TARGET_32BIT && DEFAULT_ABI == ABI_AIX"
"b%T1l\;{l|lwz} 2,20(1)"
[(set_attr "type" "jmpreg")
@@ -10239,13 +10063,13 @@
(define_insn "*call_value_indirect_nonlocal_aix64"
[(set (match_operand 0 "" "")
- (call (mem:SI (match_operand:DI 1 "register_operand" "cl"))
- (match_operand 2 "" "g")))
+ (call (mem:SI (match_operand:DI 1 "register_operand" "c,*l"))
+ (match_operand 2 "" "g,g")))
(use (reg:DI 2))
(use (reg:DI 11))
(set (reg:DI 2)
(mem:DI (plus:DI (reg:DI 1) (const_int 40))))
- (clobber (match_scratch:SI 3 "=l"))]
+ (clobber (match_scratch:SI 3 "=l,l"))]
"TARGET_64BIT && DEFAULT_ABI == ABI_AIX"
"b%T1l\;ld 2,40(1)"
[(set_attr "type" "jmpreg")
@@ -10271,10 +10095,10 @@
;; which indicates how to set cr1
(define_insn "*call_indirect_nonlocal_sysv"
- [(call (mem:SI (match_operand:SI 0 "register_operand" "cl,cl"))
- (match_operand 1 "" "g,g"))
- (use (match_operand:SI 2 "immediate_operand" "O,n"))
- (clobber (match_scratch:SI 3 "=l,l"))]
+ [(call (mem:SI (match_operand:SI 0 "register_operand" "c,*l,c,*l"))
+ (match_operand 1 "" "g,g,g,g"))
+ (use (match_operand:SI 2 "immediate_operand" "O,O,n,n"))
+ (clobber (match_scratch:SI 3 "=l,l,l,l"))]
"DEFAULT_ABI == ABI_V4
|| DEFAULT_ABI == ABI_DARWIN"
{
@@ -10286,8 +10110,8 @@
return "b%T0l";
}
- [(set_attr "type" "jmpreg,jmpreg")
- (set_attr "length" "4,8")])
+ [(set_attr "type" "jmpreg,jmpreg,jmpreg,jmpreg")
+ (set_attr "length" "4,4,8,8")])
(define_insn "*call_nonlocal_sysv"
[(call (mem:SI (match_operand:SI 0 "symbol_ref_operand" "s,s"))
@@ -10307,7 +10131,18 @@
#if TARGET_MACHO
return output_call(insn, operands, 0, 2);
#else
- return (DEFAULT_ABI == ABI_V4 && flag_pic) ? "bl %z0@plt" : "bl %z0";
+ if (DEFAULT_ABI == ABI_V4 && flag_pic)
+ {
+ if (TARGET_SECURE_PLT && flag_pic == 2)
+ /* The magic 32768 offset here and in the other sysv call insns
+ corresponds to the offset of r30 in .got2, as given by LCTOC1.
+ See sysv4.h:toc_section. */
+ return "bl %z0+32768@plt";
+ else
+ return "bl %z0@plt";
+ }
+ else
+ return "bl %z0";
#endif
}
[(set_attr "type" "branch,branch")
@@ -10315,10 +10150,10 @@
(define_insn "*call_value_indirect_nonlocal_sysv"
[(set (match_operand 0 "" "")
- (call (mem:SI (match_operand:SI 1 "register_operand" "cl,cl"))
- (match_operand 2 "" "g,g")))
- (use (match_operand:SI 3 "immediate_operand" "O,n"))
- (clobber (match_scratch:SI 4 "=l,l"))]
+ (call (mem:SI (match_operand:SI 1 "register_operand" "c,*l,c,*l"))
+ (match_operand 2 "" "g,g,g,g")))
+ (use (match_operand:SI 3 "immediate_operand" "O,O,n,n"))
+ (clobber (match_scratch:SI 4 "=l,l,l,l"))]
"DEFAULT_ABI == ABI_V4
|| DEFAULT_ABI == ABI_DARWIN"
{
@@ -10330,8 +10165,8 @@
return "b%T1l";
}
- [(set_attr "type" "jmpreg,jmpreg")
- (set_attr "length" "4,8")])
+ [(set_attr "type" "jmpreg,jmpreg,jmpreg,jmpreg")
+ (set_attr "length" "4,4,8,8")])
(define_insn "*call_value_nonlocal_sysv"
[(set (match_operand 0 "" "")
@@ -10352,7 +10187,15 @@
#if TARGET_MACHO
return output_call(insn, operands, 1, 3);
#else
- return (DEFAULT_ABI == ABI_V4 && flag_pic) ? "bl %z1@plt" : "bl %z1";
+ if (DEFAULT_ABI == ABI_V4 && flag_pic)
+ {
+ if (TARGET_SECURE_PLT && flag_pic == 2)
+ return "bl %z1+32768@plt";
+ else
+ return "bl %z1@plt";
+ }
+ else
+ return "bl %z1";
#endif
}
[(set_attr "type" "branch,branch")
@@ -10567,7 +10410,15 @@
else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
output_asm_insn (\"creqv 6,6,6\", operands);
- return (DEFAULT_ABI == ABI_V4 && flag_pic) ? \"b %z0@plt\" : \"b %z0\";
+ if (DEFAULT_ABI == ABI_V4 && flag_pic)
+ {
+ if (TARGET_SECURE_PLT && flag_pic == 2)
+ return \"b %z0+32768@plt\";
+ else
+ return \"b %z0@plt\";
+ }
+ else
+ return \"b %z0\";
}"
[(set_attr "type" "branch,branch")
(set_attr "length" "4,8")])
@@ -10613,7 +10464,15 @@
else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
output_asm_insn (\"creqv 6,6,6\", operands);
- return (DEFAULT_ABI == ABI_V4 && flag_pic) ? \"b %z1@plt\" : \"b %z1\";
+ if (DEFAULT_ABI == ABI_V4 && flag_pic)
+ {
+ if (TARGET_SECURE_PLT && flag_pic == 2)
+ return \"b %z1+32768@plt\";
+ else
+ return \"b %z1@plt\";
+ }
+ else
+ return \"b %z1\";
}"
[(set_attr "type" "branch,branch")
(set_attr "length" "4,8")])
@@ -10641,10 +10500,10 @@
;; Start with the DEFINE_EXPANDs to generate the rtl for compares, scc
;; insns, and branches. We store the operands of compares until we see
;; how it is used.
-(define_expand "cmpsi"
+(define_expand "cmp<mode>"
[(set (cc0)
- (compare (match_operand:SI 0 "gpc_reg_operand" "")
- (match_operand:SI 1 "reg_or_short_operand" "")))]
+ (compare (match_operand:GPR 0 "gpc_reg_operand" "")
+ (match_operand:GPR 1 "reg_or_short_operand" "")))]
""
"
{
@@ -10652,26 +10511,7 @@
this might be a logical operation. That insn doesn't exist. */
if (GET_CODE (operands[1]) == CONST_INT
&& INTVAL (operands[1]) < 0)
- operands[1] = force_reg (SImode, operands[1]);
-
- rs6000_compare_op0 = operands[0];
- rs6000_compare_op1 = operands[1];
- rs6000_compare_fp_p = 0;
- DONE;
-}")
-
-(define_expand "cmpdi"
- [(set (cc0)
- (compare (match_operand:DI 0 "gpc_reg_operand" "")
- (match_operand:DI 1 "reg_or_short_operand" "")))]
- "TARGET_POWERPC64"
- "
-{
- /* Take care of the possibility that operands[1] might be negative but
- this might be a logical operation. That insn doesn't exist. */
- if (GET_CODE (operands[1]) == CONST_INT
- && INTVAL (operands[1]) < 0)
- operands[1] = force_reg (DImode, operands[1]);
+ operands[1] = force_reg (<MODE>mode, operands[1]);
rs6000_compare_op0 = operands[0];
rs6000_compare_op1 = operands[1];
@@ -10679,35 +10519,10 @@
DONE;
}")
-(define_expand "cmpsf"
- [(set (cc0) (compare (match_operand:SF 0 "gpc_reg_operand" "")
- (match_operand:SF 1 "gpc_reg_operand" "")))]
- "TARGET_HARD_FLOAT"
- "
-{
- rs6000_compare_op0 = operands[0];
- rs6000_compare_op1 = operands[1];
- rs6000_compare_fp_p = 1;
- DONE;
-}")
-
-(define_expand "cmpdf"
- [(set (cc0) (compare (match_operand:DF 0 "gpc_reg_operand" "")
- (match_operand:DF 1 "gpc_reg_operand" "")))]
- "TARGET_HARD_FLOAT && (TARGET_FPRS || TARGET_E500_DOUBLE)"
- "
-{
- rs6000_compare_op0 = operands[0];
- rs6000_compare_op1 = operands[1];
- rs6000_compare_fp_p = 1;
- DONE;
-}")
-
-(define_expand "cmptf"
- [(set (cc0) (compare (match_operand:TF 0 "gpc_reg_operand" "")
- (match_operand:TF 1 "gpc_reg_operand" "")))]
- "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
- && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
+(define_expand "cmp<mode>"
+ [(set (cc0) (compare (match_operand:FP 0 "gpc_reg_operand" "")
+ (match_operand:FP 1 "gpc_reg_operand" "")))]
+ ""
"
{
rs6000_compare_op0 = operands[0];
@@ -10942,20 +10757,12 @@
;; Here are the actual compare insns.
-(define_insn "*cmpsi_internal1"
+(define_insn "*cmp<mode>_internal1"
[(set (match_operand:CC 0 "cc_reg_operand" "=y")
- (compare:CC (match_operand:SI 1 "gpc_reg_operand" "r")
- (match_operand:SI 2 "reg_or_short_operand" "rI")))]
+ (compare:CC (match_operand:GPR 1 "gpc_reg_operand" "r")
+ (match_operand:GPR 2 "reg_or_short_operand" "rI")))]
""
- "{cmp%I2|cmpw%I2} %0,%1,%2"
- [(set_attr "type" "cmp")])
-
-(define_insn "*cmpdi_internal1"
- [(set (match_operand:CC 0 "cc_reg_operand" "=y")
- (compare:CC (match_operand:DI 1 "gpc_reg_operand" "r")
- (match_operand:DI 2 "reg_or_short_operand" "rI")))]
- "TARGET_POWERPC64"
- "cmpd%I2 %0,%1,%2"
+ "{cmp%I2|cmp<wd>%I2} %0,%1,%2"
[(set_attr "type" "cmp")])
;; If we are comparing a register for equality with a large constant,
@@ -11347,119 +11154,79 @@
;; otherwise won't accept constants. We do this because it is faster than
;; the cmp/mfcr sequence we would otherwise generate.
-(define_insn ""
- [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r,r")
- (eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r")
- (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,L,I")))
- (clobber (match_scratch:SI 3 "=r,&r,r,r,r"))]
- "TARGET_32BIT"
- "@
- xor %0,%1,%2\;{sfi|subfic} %3,%0,0\;{ae|adde} %0,%3,%0
- {sfi|subfic} %3,%1,0\;{ae|adde} %0,%3,%1
- {xoril|xori} %0,%1,%b2\;{sfi|subfic} %3,%0,0\;{ae|adde} %0,%3,%0
- {xoriu|xoris} %0,%1,%u2\;{sfi|subfic} %3,%0,0\;{ae|adde} %0,%3,%0
- {sfi|subfic} %0,%1,%2\;{sfi|subfic} %3,%0,0\;{ae|adde} %0,%3,%0"
- [(set_attr "type" "three,two,three,three,three")
- (set_attr "length" "12,8,12,12,12")])
-
-(define_insn ""
- [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,r,r,r")
- (eq:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r,r,r,r")
- (match_operand:DI 2 "reg_or_cint_operand" "r,O,K,J,I")))
- (clobber (match_scratch:DI 3 "=r,&r,r,r,r"))]
- "TARGET_64BIT"
- "@
- xor %0,%1,%2\;subfic %3,%0,0\;adde %0,%3,%0
- subfic %3,%1,0\;adde %0,%3,%1
- xori %0,%1,%b2\;subfic %3,%0,0\;adde %0,%3,%0
- xoris %0,%1,%u2\;subfic %3,%0,0\;adde %0,%3,%0
- subfic %0,%1,%2\;subfic %3,%0,0\;adde %0,%3,%0"
- [(set_attr "type" "three,two,three,three,three")
- (set_attr "length" "12,8,12,12,12")])
-
-(define_insn ""
- [(set (match_operand:CC 4 "cc_reg_operand" "=x,x,x,x,x,?y,?y,?y,?y,?y")
- (compare:CC
- (eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r,r,r,r,r,r")
- (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,L,I,r,O,K,L,I"))
- (const_int 0)))
- (set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r,r,r,r,r,r,r")
- (eq:SI (match_dup 1) (match_dup 2)))
- (clobber (match_scratch:SI 3 "=r,&r,r,r,r,r,&r,r,r,r"))]
- "TARGET_32BIT"
- "@
- xor %0,%1,%2\;{sfi|subfic} %3,%0,0\;{ae.|adde.} %0,%3,%0
- {sfi|subfic} %3,%1,0\;{ae.|adde.} %0,%3,%1
- {xoril|xori} %0,%1,%b2\;{sfi|subfic} %3,%0,0\;{ae.|adde.} %0,%3,%0
- {xoriu|xoris} %0,%1,%u2\;{sfi|subfic} %3,%0,0\;{ae.|adde.} %0,%3,%0
- {sfi|subfic} %0,%1,%2\;{sfi|subfic} %3,%0,0\;{ae.|adde.} %0,%3,%0
- #
- #
- #
- #
- #"
- [(set_attr "type" "compare")
- (set_attr "length" "12,8,12,12,12,16,12,16,16,16")])
+(define_mode_attr scc_eq_op2 [(SI "rKLI")
+ (DI "rKJI")])
-(define_split
- [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
- (compare:CC
- (eq:SI (match_operand:SI 1 "gpc_reg_operand" "")
- (match_operand:SI 2 "reg_or_cint_operand" ""))
- (const_int 0)))
- (set (match_operand:SI 0 "gpc_reg_operand" "")
- (eq:SI (match_dup 1) (match_dup 2)))
- (clobber (match_scratch:SI 3 ""))]
- "TARGET_32BIT && reload_completed"
- [(parallel [(set (match_dup 0)
- (eq:SI (match_dup 1) (match_dup 2)))
- (clobber (match_dup 3))])
- (set (match_dup 4)
- (compare:CC (match_dup 0)
- (const_int 0)))]
- "")
-
-(define_insn ""
- [(set (match_operand:CC 4 "cc_reg_operand" "=x,x,x,x,x,?y,?y,?y,?y,?y")
- (compare:CC
- (eq:DI (match_operand:DI 1 "gpc_reg_operand" "%r,r,r,r,r,r,r,r,r,r")
- (match_operand:DI 2 "reg_or_cint_operand" "r,O,K,J,I,r,O,K,J,I"))
- (const_int 0)))
- (set (match_operand:DI 0 "gpc_reg_operand" "=r,r,r,r,r,r,r,r,r,r")
- (eq:DI (match_dup 1) (match_dup 2)))
- (clobber (match_scratch:DI 3 "=r,&r,r,r,r,r,&r,r,r,r"))]
- "TARGET_64BIT"
- "@
- xor %0,%1,%2\;subfic %3,%0,0\;adde. %0,%3,%0
- subfic %3,%1,0\;adde. %0,%3,%1
- xori %0,%1,%b2\;subfic %3,%0,0\;adde. %0,%3,%0
- xoris %0,%1,%u2\;subfic %3,%0,0\;adde. %0,%3,%0
- subfic %0,%1,%2\;subfic %3,%0,0\;adde. %0,%3,%0
- #
- #
- #
- #
- #"
- [(set_attr "type" "compare")
- (set_attr "length" "12,8,12,12,12,16,12,16,16,16")])
+(define_insn_and_split "*eq<mode>"
+ [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
+ (eq:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")
+ (match_operand:GPR 2 "scc_eq_operand" "<scc_eq_op2>")))
+ (clobber (match_scratch:GPR 3 "=r"))
+ (clobber (match_scratch:GPR 4 "=r"))]
+ ""
+ "#"
+ "reload_completed"
+ [(set (match_dup 3)
+ (clz:GPR (match_dup 4)))
+ (set (match_dup 0)
+ (lshiftrt:GPR (match_dup 3) (match_dup 5)))]
+ {
+ if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != 0)
+ {
+ if (logical_operand (operands[2], <MODE>mode))
+ emit_insn (gen_rtx_SET (VOIDmode, operands[4],
+ gen_rtx_XOR (<MODE>mode,
+ operands[1], operands[2])));
+ else
+ emit_insn (gen_rtx_SET (VOIDmode, operands[4],
+ gen_rtx_PLUS (<MODE>mode, operands[1],
+ negate_rtx (<MODE>mode,
+ operands[2]))));
+ }
+ else
+ operands[4] = operands[1];
+
+ operands[5] = GEN_INT (exact_log2 (GET_MODE_BITSIZE (<MODE>mode)));
+ })
-(define_split
- [(set (match_operand:CC 4 "cc_reg_not_cr0_operand" "")
+(define_insn_and_split "*eq<mode>_compare"
+ [(set (match_operand:CC 5 "cc_reg_operand" "=y")
(compare:CC
- (eq:DI (match_operand:DI 1 "gpc_reg_operand" "")
- (match_operand:DI 2 "reg_or_cint_operand" ""))
+ (eq:P (match_operand:P 1 "gpc_reg_operand" "=r")
+ (match_operand:P 2 "scc_eq_operand" "<scc_eq_op2>"))
(const_int 0)))
- (set (match_operand:DI 0 "gpc_reg_operand" "")
- (eq:DI (match_dup 1) (match_dup 2)))
- (clobber (match_scratch:DI 3 ""))]
- "TARGET_64BIT && reload_completed"
- [(parallel [(set (match_dup 0)
- (eq:DI (match_dup 1) (match_dup 2)))
- (clobber (match_dup 3))])
- (set (match_dup 4)
- (compare:CC (match_dup 0)
- (const_int 0)))]
- "")
+ (set (match_operand:P 0 "gpc_reg_operand" "=r")
+ (eq:P (match_dup 1) (match_dup 2)))
+ (clobber (match_scratch:P 3 "=r"))
+ (clobber (match_scratch:P 4 "=r"))]
+ ""
+ "#"
+ "reload_completed"
+ [(set (match_dup 3)
+ (clz:P (match_dup 4)))
+ (parallel [(set (match_dup 5)
+ (compare:CC (lshiftrt:P (match_dup 3) (match_dup 6))
+ (const_int 0)))
+ (set (match_dup 0)
+ (lshiftrt:P (match_dup 3) (match_dup 6)))])]
+ {
+ if (GET_CODE (operands[2]) != CONST_INT || INTVAL (operands[2]) != 0)
+ {
+ if (logical_operand (operands[2], <MODE>mode))
+ emit_insn (gen_rtx_SET (VOIDmode, operands[4],
+ gen_rtx_XOR (<MODE>mode,
+ operands[1], operands[2])));
+ else
+ emit_insn (gen_rtx_SET (VOIDmode, operands[4],
+ gen_rtx_PLUS (<MODE>mode, operands[1],
+ negate_rtx (<MODE>mode,
+ operands[2]))));
+ }
+ else
+ operands[4] = operands[1];
+
+ operands[6] = GEN_INT (exact_log2 (GET_MODE_BITSIZE (<MODE>mode)));
+ })
;; We have insns of the form shown by the first define_insn below. If
;; there is something inside the comparison operation, we must split it.
@@ -11479,7 +11246,7 @@
(define_insn ""
[(set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r,&r,&r,&r")
(plus:SI (eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r")
- (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,L,I"))
+ (match_operand:SI 2 "scc_eq_operand" "r,O,K,L,I"))
(match_operand:SI 3 "gpc_reg_operand" "r,r,r,r,r")))]
"TARGET_32BIT"
"@
@@ -11496,7 +11263,7 @@
(compare:CC
(plus:SI
(eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r,r,r,r,r,r")
- (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,L,I,r,O,K,L,I"))
+ (match_operand:SI 2 "scc_eq_operand" "r,O,K,L,I,r,O,K,L,I"))
(match_operand:SI 3 "gpc_reg_operand" "r,r,r,r,r,r,r,r,r,r"))
(const_int 0)))
(clobber (match_scratch:SI 4 "=&r,&r,&r,&r,&r,&r,&r,&r,&r,&r"))]
@@ -11520,7 +11287,7 @@
(compare:CC
(plus:SI
(eq:SI (match_operand:SI 1 "gpc_reg_operand" "")
- (match_operand:SI 2 "reg_or_cint_operand" ""))
+ (match_operand:SI 2 "scc_eq_operand" ""))
(match_operand:SI 3 "gpc_reg_operand" ""))
(const_int 0)))
(clobber (match_scratch:SI 4 ""))]
@@ -11539,7 +11306,7 @@
(compare:CC
(plus:SI
(eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r,r,r,r,r,r")
- (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,L,I,r,O,K,L,I"))
+ (match_operand:SI 2 "scc_eq_operand" "r,O,K,L,I,r,O,K,L,I"))
(match_operand:SI 3 "gpc_reg_operand" "r,r,r,r,r,r,r,r,r,r"))
(const_int 0)))
(set (match_operand:SI 0 "gpc_reg_operand" "=&r,&r,&r,&r,&r,&r,&r,&r,&r,&r")
@@ -11564,7 +11331,7 @@
(compare:CC
(plus:SI
(eq:SI (match_operand:SI 1 "gpc_reg_operand" "")
- (match_operand:SI 2 "reg_or_cint_operand" ""))
+ (match_operand:SI 2 "scc_eq_operand" ""))
(match_operand:SI 3 "gpc_reg_operand" ""))
(const_int 0)))
(set (match_operand:SI 0 "gpc_reg_operand" "")
@@ -11580,7 +11347,7 @@
(define_insn ""
[(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r,r")
(neg:SI (eq:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r,r")
- (match_operand:SI 2 "reg_or_cint_operand" "r,O,K,L,I"))))]
+ (match_operand:SI 2 "scc_eq_operand" "r,O,K,L,I"))))]
"TARGET_32BIT"
"@
xor %0,%1,%2\;{ai|addic} %0,%0,-1\;{sfe|subfe} %0,%0,%0
@@ -13684,33 +13451,16 @@
[(set_attr "type" "jmpreg")])
(define_expand "indirect_jump"
- [(set (pc) (match_operand 0 "register_operand" ""))]
- ""
- "
-{
- if (TARGET_32BIT)
- emit_jump_insn (gen_indirect_jumpsi (operands[0]));
- else
- emit_jump_insn (gen_indirect_jumpdi (operands[0]));
- DONE;
-}")
+ [(set (pc) (match_operand 0 "register_operand" ""))])
-(define_insn "indirect_jumpsi"
- [(set (pc) (match_operand:SI 0 "register_operand" "c,*l"))]
- "TARGET_32BIT"
+(define_insn "*indirect_jump<mode>"
+ [(set (pc) (match_operand:P 0 "register_operand" "c,*l"))]
+ ""
"@
bctr
{br|blr}"
[(set_attr "type" "jmpreg")])
-(define_insn "indirect_jumpdi"
- [(set (pc) (match_operand:DI 0 "register_operand" "c,*l"))]
- "TARGET_64BIT"
- "@
- bctr
- blr"
- [(set_attr "type" "jmpreg")])
-
;; Table jump for switch statements:
(define_expand "tablejump"
[(use (match_operand 0 "" ""))
@@ -13755,24 +13505,14 @@
(define_insn ""
[(set (pc)
- (match_operand:SI 0 "register_operand" "c,*l"))
+ (match_operand:P 0 "register_operand" "c,*l"))
(use (label_ref (match_operand 1 "" "")))]
- "TARGET_32BIT"
+ ""
"@
bctr
{br|blr}"
[(set_attr "type" "jmpreg")])
-(define_insn ""
- [(set (pc)
- (match_operand:DI 0 "register_operand" "c,*l"))
- (use (label_ref (match_operand 1 "" "")))]
- "TARGET_64BIT"
- "@
- bctr
- blr"
- [(set_attr "type" "jmpreg")])
-
(define_insn "nop"
[(const_int 0)]
""
@@ -13808,32 +13548,18 @@
DONE;
}")
-(define_expand "ctrsi"
- [(parallel [(set (pc)
- (if_then_else (ne (match_operand:SI 0 "register_operand" "")
- (const_int 1))
- (label_ref (match_operand 1 "" ""))
- (pc)))
- (set (match_dup 0)
- (plus:SI (match_dup 0)
- (const_int -1)))
- (clobber (match_scratch:CC 2 ""))
- (clobber (match_scratch:SI 3 ""))])]
- "TARGET_32BIT"
- "")
-
-(define_expand "ctrdi"
+(define_expand "ctr<mode>"
[(parallel [(set (pc)
- (if_then_else (ne (match_operand:DI 0 "register_operand" "")
+ (if_then_else (ne (match_operand:P 0 "register_operand" "")
(const_int 1))
(label_ref (match_operand 1 "" ""))
(pc)))
(set (match_dup 0)
- (plus:DI (match_dup 0)
+ (plus:P (match_dup 0)
(const_int -1)))
(clobber (match_scratch:CC 2 ""))
- (clobber (match_scratch:DI 3 ""))])]
- "TARGET_64BIT"
+ (clobber (match_scratch:P 3 ""))])]
+ ""
"")
;; We need to be able to do this for any operand, including MEM, or we
@@ -13842,66 +13568,18 @@
;; For the length attribute to be calculated correctly, the
;; label MUST be operand 0.
-(define_insn "*ctrsi_internal1"
- [(set (pc)
- (if_then_else (ne (match_operand:SI 1 "register_operand" "c,*r,*r,*r")
- (const_int 1))
- (label_ref (match_operand 0 "" ""))
- (pc)))
- (set (match_operand:SI 2 "nonimmediate_operand" "=1,*r,m,*q*c*l")
- (plus:SI (match_dup 1)
- (const_int -1)))
- (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
- (clobber (match_scratch:SI 4 "=X,X,&r,r"))]
- "TARGET_32BIT"
- "*
-{
- if (which_alternative != 0)
- return \"#\";
- else if (get_attr_length (insn) == 4)
- return \"{bdn|bdnz} %l0\";
- else
- return \"bdz $+8\;b %l0\";
-}"
- [(set_attr "type" "branch")
- (set_attr "length" "*,12,16,16")])
-
-(define_insn "*ctrsi_internal2"
+(define_insn "*ctr<mode>_internal1"
[(set (pc)
- (if_then_else (ne (match_operand:SI 1 "register_operand" "c,*r,*r,*r")
- (const_int 1))
- (pc)
- (label_ref (match_operand 0 "" ""))))
- (set (match_operand:SI 2 "nonimmediate_operand" "=1,*r,m,*q*c*l")
- (plus:SI (match_dup 1)
- (const_int -1)))
- (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
- (clobber (match_scratch:SI 4 "=X,X,&r,r"))]
- "TARGET_32BIT"
- "*
-{
- if (which_alternative != 0)
- return \"#\";
- else if (get_attr_length (insn) == 4)
- return \"bdz %l0\";
- else
- return \"{bdn|bdnz} $+8\;b %l0\";
-}"
- [(set_attr "type" "branch")
- (set_attr "length" "*,12,16,16")])
-
-(define_insn "*ctrdi_internal1"
- [(set (pc)
- (if_then_else (ne (match_operand:DI 1 "register_operand" "c,*r,*r,*r")
+ (if_then_else (ne (match_operand:P 1 "register_operand" "c,*r,*r,*r")
(const_int 1))
(label_ref (match_operand 0 "" ""))
(pc)))
- (set (match_operand:DI 2 "nonimmediate_operand" "=1,*r,m,*c*l")
- (plus:DI (match_dup 1)
+ (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*q*c*l")
+ (plus:P (match_dup 1)
(const_int -1)))
(clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
- (clobber (match_scratch:DI 4 "=X,X,&r,r"))]
- "TARGET_64BIT"
+ (clobber (match_scratch:P 4 "=X,X,&r,r"))]
+ ""
"*
{
if (which_alternative != 0)
@@ -13914,18 +13592,18 @@
[(set_attr "type" "branch")
(set_attr "length" "*,12,16,16")])
-(define_insn "*ctrdi_internal2"
+(define_insn "*ctr<mode>_internal2"
[(set (pc)
- (if_then_else (ne (match_operand:DI 1 "register_operand" "c,*r,*r,*r")
+ (if_then_else (ne (match_operand:P 1 "register_operand" "c,*r,*r,*r")
(const_int 1))
(pc)
(label_ref (match_operand 0 "" ""))))
- (set (match_operand:DI 2 "nonimmediate_operand" "=1,*r,m,*c*l")
- (plus:DI (match_dup 1)
+ (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*q*c*l")
+ (plus:P (match_dup 1)
(const_int -1)))
(clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
- (clobber (match_scratch:DI 4 "=X,X,&r,r"))]
- "TARGET_64BIT"
+ (clobber (match_scratch:P 4 "=X,X,&r,r"))]
+ ""
"*
{
if (which_alternative != 0)
@@ -13940,66 +13618,18 @@
;; Similar but use EQ
-(define_insn "*ctrsi_internal5"
+(define_insn "*ctr<mode>_internal5"
[(set (pc)
- (if_then_else (eq (match_operand:SI 1 "register_operand" "c,*r,*r,*r")
+ (if_then_else (eq (match_operand:P 1 "register_operand" "c,*r,*r,*r")
(const_int 1))
(label_ref (match_operand 0 "" ""))
(pc)))
- (set (match_operand:SI 2 "nonimmediate_operand" "=1,*r,m,*q*c*l")
- (plus:SI (match_dup 1)
- (const_int -1)))
- (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
- (clobber (match_scratch:SI 4 "=X,X,&r,r"))]
- "TARGET_32BIT"
- "*
-{
- if (which_alternative != 0)
- return \"#\";
- else if (get_attr_length (insn) == 4)
- return \"bdz %l0\";
- else
- return \"{bdn|bdnz} $+8\;b %l0\";
-}"
- [(set_attr "type" "branch")
- (set_attr "length" "*,12,16,16")])
-
-(define_insn "*ctrsi_internal6"
- [(set (pc)
- (if_then_else (eq (match_operand:SI 1 "register_operand" "c,*r,*r,*r")
- (const_int 1))
- (pc)
- (label_ref (match_operand 0 "" ""))))
- (set (match_operand:SI 2 "nonimmediate_operand" "=1,*r,m,*q*c*l")
- (plus:SI (match_dup 1)
- (const_int -1)))
- (clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
- (clobber (match_scratch:SI 4 "=X,X,&r,r"))]
- "TARGET_32BIT"
- "*
-{
- if (which_alternative != 0)
- return \"#\";
- else if (get_attr_length (insn) == 4)
- return \"{bdn|bdnz} %l0\";
- else
- return \"bdz $+8\;b %l0\";
-}"
- [(set_attr "type" "branch")
- (set_attr "length" "*,12,16,16")])
-
-(define_insn "*ctrdi_internal5"
- [(set (pc)
- (if_then_else (eq (match_operand:DI 1 "register_operand" "c,*r,*r,*r")
- (const_int 1))
- (label_ref (match_operand 0 "" ""))
- (pc)))
- (set (match_operand:DI 2 "nonimmediate_operand" "=1,*r,m,*c*l")
- (plus:DI (match_dup 1)
+ (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*q*c*l")
+ (plus:P (match_dup 1)
(const_int -1)))
(clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
- (clobber (match_scratch:DI 4 "=X,X,&r,r"))]
- "TARGET_64BIT"
+ (clobber (match_scratch:P 4 "=X,X,&r,r"))]
+ ""
"*
{
if (which_alternative != 0)
@@ -14012,18 +13642,18 @@
[(set_attr "type" "branch")
(set_attr "length" "*,12,16,16")])
-(define_insn "*ctrdi_internal6"
+(define_insn "*ctr<mode>_internal6"
[(set (pc)
- (if_then_else (eq (match_operand:DI 1 "register_operand" "c,*r,*r,*r")
+ (if_then_else (eq (match_operand:P 1 "register_operand" "c,*r,*r,*r")
(const_int 1))
(pc)
(label_ref (match_operand 0 "" ""))))
- (set (match_operand:DI 2 "nonimmediate_operand" "=1,*r,m,*c*l")
- (plus:DI (match_dup 1)
+ (set (match_operand:P 2 "nonimmediate_operand" "=1,*r,m,*q*c*l")
+ (plus:P (match_dup 1)
(const_int -1)))
(clobber (match_scratch:CC 3 "=X,&x,&x,&x"))
- (clobber (match_scratch:DI 4 "=X,X,&r,r"))]
- "TARGET_64BIT"
+ (clobber (match_scratch:P 4 "=X,X,&r,r"))]
+ ""
"*
{
if (which_alternative != 0)
@@ -14041,77 +13671,21 @@
(define_split
[(set (pc)
(if_then_else (match_operator 2 "comparison_operator"
- [(match_operand:SI 1 "gpc_reg_operand" "")
- (const_int 1)])
- (match_operand 5 "" "")
- (match_operand 6 "" "")))
- (set (match_operand:SI 0 "gpc_reg_operand" "")
- (plus:SI (match_dup 1)
- (const_int -1)))
- (clobber (match_scratch:CC 3 ""))
- (clobber (match_scratch:SI 4 ""))]
- "TARGET_32BIT && reload_completed"
- [(parallel [(set (match_dup 3)
- (compare:CC (plus:SI (match_dup 1)
- (const_int -1))
- (const_int 0)))
- (set (match_dup 0)
- (plus:SI (match_dup 1)
- (const_int -1)))])
- (set (pc) (if_then_else (match_dup 7)
- (match_dup 5)
- (match_dup 6)))]
- "
-{ operands[7] = gen_rtx_fmt_ee (GET_CODE (operands[2]), VOIDmode,
- operands[3], const0_rtx); }")
-
-(define_split
- [(set (pc)
- (if_then_else (match_operator 2 "comparison_operator"
- [(match_operand:SI 1 "gpc_reg_operand" "")
+ [(match_operand:P 1 "gpc_reg_operand" "")
(const_int 1)])
(match_operand 5 "" "")
(match_operand 6 "" "")))
- (set (match_operand:SI 0 "nonimmediate_operand" "")
- (plus:SI (match_dup 1) (const_int -1)))
- (clobber (match_scratch:CC 3 ""))
- (clobber (match_scratch:SI 4 ""))]
- "TARGET_32BIT && reload_completed
- && ! gpc_reg_operand (operands[0], SImode)"
- [(parallel [(set (match_dup 3)
- (compare:CC (plus:SI (match_dup 1)
- (const_int -1))
- (const_int 0)))
- (set (match_dup 4)
- (plus:SI (match_dup 1)
- (const_int -1)))])
- (set (match_dup 0)
- (match_dup 4))
- (set (pc) (if_then_else (match_dup 7)
- (match_dup 5)
- (match_dup 6)))]
- "
-{ operands[7] = gen_rtx_fmt_ee (GET_CODE (operands[2]), VOIDmode,
- operands[3], const0_rtx); }")
-(define_split
- [(set (pc)
- (if_then_else (match_operator 2 "comparison_operator"
- [(match_operand:DI 1 "gpc_reg_operand" "")
- (const_int 1)])
- (match_operand 5 "" "")
- (match_operand 6 "" "")))
- (set (match_operand:DI 0 "gpc_reg_operand" "")
- (plus:DI (match_dup 1)
- (const_int -1)))
+ (set (match_operand:P 0 "gpc_reg_operand" "")
+ (plus:P (match_dup 1) (const_int -1)))
(clobber (match_scratch:CC 3 ""))
- (clobber (match_scratch:DI 4 ""))]
- "TARGET_64BIT && reload_completed"
+ (clobber (match_scratch:P 4 ""))]
+ "reload_completed"
[(parallel [(set (match_dup 3)
- (compare:CC (plus:DI (match_dup 1)
+ (compare:CC (plus:P (match_dup 1)
(const_int -1))
(const_int 0)))
(set (match_dup 0)
- (plus:DI (match_dup 1)
+ (plus:P (match_dup 1)
(const_int -1)))])
(set (pc) (if_then_else (match_dup 7)
(match_dup 5)
@@ -14123,22 +13697,21 @@
(define_split
[(set (pc)
(if_then_else (match_operator 2 "comparison_operator"
- [(match_operand:DI 1 "gpc_reg_operand" "")
+ [(match_operand:P 1 "gpc_reg_operand" "")
(const_int 1)])
(match_operand 5 "" "")
(match_operand 6 "" "")))
- (set (match_operand:DI 0 "nonimmediate_operand" "")
- (plus:DI (match_dup 1) (const_int -1)))
+ (set (match_operand:P 0 "nonimmediate_operand" "")
+ (plus:P (match_dup 1) (const_int -1)))
(clobber (match_scratch:CC 3 ""))
- (clobber (match_scratch:DI 4 ""))]
- "TARGET_64BIT && reload_completed
- && ! gpc_reg_operand (operands[0], DImode)"
+ (clobber (match_scratch:P 4 ""))]
+ "reload_completed && ! gpc_reg_operand (operands[0], SImode)"
[(parallel [(set (match_dup 3)
- (compare:CC (plus:DI (match_dup 1)
+ (compare:CC (plus:P (match_dup 1)
(const_int -1))
(const_int 0)))
(set (match_dup 4)
- (plus:DI (match_dup 1)
+ (plus:P (match_dup 1)
(const_int -1)))])
(set (match_dup 0)
(match_dup 4))
@@ -14165,19 +13738,11 @@
(define_insn ""
[(trap_if (match_operator 0 "trap_comparison_operator"
- [(match_operand:SI 1 "register_operand" "r")
- (match_operand:SI 2 "reg_or_short_operand" "rI")])
+ [(match_operand:GPR 1 "register_operand" "r")
+ (match_operand:GPR 2 "reg_or_short_operand" "rI")])
(const_int 0))]
""
- "{t|tw}%V0%I2 %1,%2")
-
-(define_insn ""
- [(trap_if (match_operator 0 "trap_comparison_operator"
- [(match_operand:DI 1 "register_operand" "r")
- (match_operand:DI 2 "reg_or_short_operand" "rI")])
- (const_int 0))]
- "TARGET_POWERPC64"
- "td%V0%I2 %1,%2")
+ "{t|t<wd>}%V0%I2 %1,%2")
;; Insns related to generating the function prologue and epilogue.
@@ -14227,24 +13792,13 @@
"TARGET_MULTIPLE"
"{stm|stmw} %2,%1")
-(define_insn "*save_fpregs_si"
+(define_insn "*save_fpregs_<mode>"
[(match_parallel 0 "any_parallel_operand"
- [(clobber (match_operand:SI 1 "register_operand" "=l"))
- (use (match_operand:SI 2 "call_operand" "s"))
+ [(clobber (match_operand:P 1 "register_operand" "=l"))
+ (use (match_operand:P 2 "call_operand" "s"))
(set (match_operand:DF 3 "memory_operand" "=m")
(match_operand:DF 4 "gpc_reg_operand" "f"))])]
- "TARGET_32BIT"
- "bl %z2"
- [(set_attr "type" "branch")
- (set_attr "length" "4")])
-
-(define_insn "*save_fpregs_di"
- [(match_parallel 0 "any_parallel_operand"
- [(clobber (match_operand:DI 1 "register_operand" "=l"))
- (use (match_operand:DI 2 "call_operand" "s"))
- (set (match_operand:DF 3 "memory_operand" "=m")
- (match_operand:DF 4 "gpc_reg_operand" "f"))])]
- "TARGET_64BIT"
+ ""
"bl %z2"
[(set_attr "type" "branch")
(set_attr "length" "4")])
@@ -14320,41 +13874,24 @@
"TARGET_MULTIPLE"
"{lm|lmw} %1,%2")
-(define_insn "*return_internal_si"
- [(return)
- (use (match_operand:SI 0 "register_operand" "lc"))]
- "TARGET_32BIT"
- "b%T0"
- [(set_attr "type" "jmpreg")])
-
-(define_insn "*return_internal_di"
+(define_insn "*return_internal_<mode>"
[(return)
- (use (match_operand:DI 0 "register_operand" "lc"))]
- "TARGET_64BIT"
+ (use (match_operand:P 0 "register_operand" "lc"))]
+ ""
"b%T0"
[(set_attr "type" "jmpreg")])
; FIXME: This would probably be somewhat simpler if the Cygnus sibcall
; stuff was in GCC. Oh, and "any_parallel_operand" is a bit flexible...
-(define_insn "*return_and_restore_fpregs_si"
+(define_insn "*return_and_restore_fpregs_<mode>"
[(match_parallel 0 "any_parallel_operand"
[(return)
- (use (match_operand:SI 1 "register_operand" "l"))
- (use (match_operand:SI 2 "call_operand" "s"))
+ (use (match_operand:P 1 "register_operand" "l"))
+ (use (match_operand:P 2 "call_operand" "s"))
(set (match_operand:DF 3 "gpc_reg_operand" "=f")
(match_operand:DF 4 "memory_operand" "m"))])]
- "TARGET_32BIT"
- "b %z2")
-
-(define_insn "*return_and_restore_fpregs_di"
- [(match_parallel 0 "any_parallel_operand"
- [(return)
- (use (match_operand:DI 1 "register_operand" "l"))
- (use (match_operand:DI 2 "call_operand" "s"))
- (set (match_operand:DF 3 "gpc_reg_operand" "=f")
- (match_operand:DF 4 "memory_operand" "m"))])]
- "TARGET_64BIT"
+ ""
"b %z2")
; This is used in compiling the unwind routines.
@@ -14371,18 +13908,11 @@
}")
; We can't expand this before we know where the link register is stored.
-(define_insn "eh_set_lr_si"
- [(unspec_volatile [(match_operand:SI 0 "register_operand" "r")]
+(define_insn "eh_set_lr_<mode>"
+ [(unspec_volatile [(match_operand:P 0 "register_operand" "r")]
UNSPECV_EH_RR)
- (clobber (match_scratch:SI 1 "=&b"))]
- "TARGET_32BIT"
- "#")
-
-(define_insn "eh_set_lr_di"
- [(unspec_volatile [(match_operand:DI 0 "register_operand" "r")]
- UNSPECV_EH_RR)
- (clobber (match_scratch:DI 1 "=&b"))]
- "TARGET_64BIT"
+ (clobber (match_scratch:P 1 "=&b"))]
+ ""
"#")
(define_split
@@ -14776,6 +14306,23 @@
"<larx> %3,%y0\n\t%q4 %2,%1,%3\n\t<stcx> %2,%y0\n\tbne- $-12"
[(set_attr "length" "16")])
+; This pattern could also take immediate values of operand 1,
+; since the non-NOT version of the operator is used; but this is not
+; very useful, since in practice operand 1 is a full 32-bit value.
+; Likewise, operand 5 is in practice either <= 2^16 or it is a register.
+(define_insn "*sync_boolcshort_internal"
+ [(set (match_operand:SI 2 "gpc_reg_operand" "=&r")
+ (match_operator:SI 4 "boolean_operator"
+ [(xor:SI (match_operand:SI 0 "memory_operand" "+Z")
+ (match_operand:SI 5 "logical_operand" "rK"))
+ (match_operand:SI 1 "gpc_reg_operand" "r")]))
+ (set (match_operand:SI 3 "gpc_reg_operand" "=&b") (match_dup 0))
+ (set (match_dup 0) (unspec:SI [(match_dup 4)] UNSPEC_SYNC_OP))
+ (clobber (match_scratch:CC 6 "=&x"))]
+ "TARGET_POWERPC"
+ "lwarx %3,%y0\n\txor%I2 %2,%3,%5\n\t%q4 %2,%2,%1\n\tstwcx. %2,%y0\n\tbne- $-16"
+ [(set_attr "length" "20")])
+
(define_insn "*sync_boolc<mode>_internal2"
[(set (match_operand:GPR 2 "gpc_reg_operand" "=&r")
(match_operator:GPR 4 "boolean_operator"
diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt
index 84ceba07012..7a08c678462 100644
--- a/gcc/config/rs6000/rs6000.opt
+++ b/gcc/config/rs6000/rs6000.opt
@@ -123,6 +123,10 @@ mxl-compat
Target Report Var(TARGET_XL_COMPAT)
Conform more closely to IBM XLC semantics
+mswdiv
+Target Report Var(swdiv)
+Generate software floating point divide for better throughput
+
mno-fp-in-toc
Target Report RejectNegative Mask(NO_FP_IN_TOC)
Do not place floating point constants in TOC
@@ -227,5 +231,5 @@ Target RejectNegative Joined
Specify alignment of structure fields default/natural
mprioritize-restricted-insns=
-Target RejectNegative Joined Uinteger Var(rs6000_sched_restricted_insns_priority)
+Target RejectNegative Joined UInteger Var(rs6000_sched_restricted_insns_priority)
Specify scheduling priority for dispatch slot restricted insns
diff --git a/gcc/config/rs6000/secureplt.h b/gcc/config/rs6000/secureplt.h
new file mode 100644
index 00000000000..91aea5634bb
--- /dev/null
+++ b/gcc/config/rs6000/secureplt.h
@@ -0,0 +1,21 @@
+/* Default to -msecure-plt.
+ Copyright (C) 2005 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. */
+
+#define CC1_SECURE_PLT_DEFAULT_SPEC "-msecure-plt"
diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h
index a8b06aedb16..d18607e3ceb 100644
--- a/gcc/config/rs6000/sysv4.h
+++ b/gcc/config/rs6000/sysv4.h
@@ -59,6 +59,11 @@ extern enum rs6000_sdata_type rs6000_sdata;
#define TARGET_NO_TOC (! TARGET_TOC)
#define TARGET_NO_EABI (! TARGET_EABI)
+#ifdef HAVE_AS_REL16
+#undef TARGET_SECURE_PLT
+#define TARGET_SECURE_PLT secure_plt
+#endif
+
extern const char *rs6000_abi_name;
extern const char *rs6000_sdata_name;
extern const char *rs6000_tls_size_string; /* For -mtls-size= */
@@ -205,6 +210,11 @@ do { \
error ("-mcall-aixdesc must be big endian"); \
} \
\
+ if (TARGET_SECURE_PLT != secure_plt) \
+ { \
+ error ("-msecure-plt not supported by your assembler"); \
+ } \
+ \
/* Treat -fPIC the same as -mrelocatable. */ \
if (flag_pic > 1 && DEFAULT_ABI != ABI_AIX) \
target_flags |= MASK_RELOCATABLE | MASK_MINIMAL_TOC | MASK_NO_FP_IN_TOC; \
@@ -325,15 +335,6 @@ do { \
((TARGET_ALTIVEC && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE) \
? 128 : COMPUTED)
-/* Define this macro as an expression for the alignment of a type
- (given by TYPE as a tree node) if the alignment computed in the
- usual way is COMPUTED and the alignment explicitly specified was
- SPECIFIED. */
-#define ROUND_TYPE_ALIGN(TYPE, COMPUTED, SPECIFIED) \
- ((TARGET_ALTIVEC && TREE_CODE (TYPE) == VECTOR_TYPE) \
- ? MAX (MAX ((COMPUTED), (SPECIFIED)), 128) \
- : MAX (COMPUTED, SPECIFIED))
-
#undef BIGGEST_FIELD_ALIGNMENT
/* Use ELF style section commands. */
@@ -750,6 +751,10 @@ extern int fixuplabelno;
#define CC1_ENDIAN_DEFAULT_SPEC "%(cc1_endian_big)"
+#ifndef CC1_SECURE_PLT_DEFAULT_SPEC
+#define CC1_SECURE_PLT_DEFAULT_SPEC ""
+#endif
+
/* Pass -G xxx to the compiler and set correct endian mode. */
#define CC1_SPEC "%{G*} \
%{mlittle|mlittle-endian: %(cc1_endian_little); \
@@ -762,7 +767,6 @@ extern int fixuplabelno;
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: \
%{mrelocatable: -meabi } \
@@ -774,6 +778,7 @@ extern int fixuplabelno;
%{mcall-openbsd: -mno-eabi }}} \
%{msdata: -msdata=default} \
%{mno-sdata: -msdata=none} \
+%{!mbss-plt: %{!msecure-plt: %(cc1_secure_plt_default)}} \
%{profile: -p}"
/* Don't put -Y P,<path> for cross compilers. */
@@ -1214,6 +1219,7 @@ ncrtn.o%s"
{ "cc1_endian_big", CC1_ENDIAN_BIG_SPEC }, \
{ "cc1_endian_little", CC1_ENDIAN_LITTLE_SPEC }, \
{ "cc1_endian_default", CC1_ENDIAN_DEFAULT_SPEC }, \
+ { "cc1_secure_plt_default", CC1_SECURE_PLT_DEFAULT_SPEC }, \
{ "cpp_os_ads", CPP_OS_ADS_SPEC }, \
{ "cpp_os_yellowknife", CPP_OS_YELLOWKNIFE_SPEC }, \
{ "cpp_os_mvme", CPP_OS_MVME_SPEC }, \
diff --git a/gcc/config/rs6000/sysv4.opt b/gcc/config/rs6000/sysv4.opt
index d826c55dd72..289c6e19e21 100644
--- a/gcc/config/rs6000/sysv4.opt
+++ b/gcc/config/rs6000/sysv4.opt
@@ -139,3 +139,11 @@ Generate 32-bit code
mnewlib
Target RejectNegative
no description yet
+
+msecure-plt
+Target Report RejectNegative Var(secure_plt, 1)
+Generate code to use a non-exec PLT and GOT
+
+mbss-plt
+Target Report RejectNegative Var(secure_plt, 0)
+Generate code for old exec BSS PLT
diff --git a/gcc/config/rs6000/t-rtems b/gcc/config/rs6000/t-rtems
index fe266272a5e..b3db9498a23 100644
--- a/gcc/config/rs6000/t-rtems
+++ b/gcc/config/rs6000/t-rtems
@@ -1,13 +1,11 @@
# Multilibs for powerpc RTEMS targets.
MULTILIB_OPTIONS = \
-D_OLD_EXCEPTIONS \
mcpu=403/mcpu=505/mcpu=601/mcpu=603e/mcpu=604/mcpu=860/mcpu=7400 \
Dmpc8260 \
msoft-float
MULTILIB_DIRNAMES = \
-roe \
m403 m505 m601 m603e m604 m860 m7400 \
mpc8260 \
nof
@@ -33,38 +31,6 @@ MULTILIB_MATCHES += mcpu?7400=mcpu?7450
# Map 750 to .
MULTILIB_MATCHES += mcpu?750=
-
-#
-# RTEMS old/new-exceptions handling
-#
-# old-exception processing is depredicated, therefore
-#
-# * Cpu-variants supporting new exception processing are build
-# with new exception processing only
-# * Cpu-variants not having been ported to new exception processing are
-# build with old and new exception processing
-#
-
-# Cpu-variants supporting new exception processing only
-MULTILIB_NEW_EXCEPTIONS_ONLY = \
-D_OLD_EXCEPTIONS \
-D_OLD_EXCEPTIONS/msoft-float \
-D_OLD_EXCEPTIONS/mcpu=505 \
-D_OLD_EXCEPTIONS/mcpu=505/* \
-D_OLD_EXCEPTIONS/mcpu=601 \
-D_OLD_EXCEPTIONS/mcpu=601/* \
-D_OLD_EXCEPTIONS/mcpu=603e \
-D_OLD_EXCEPTIONS/mcpu=603e/* \
-D_OLD_EXCEPTIONS/mcpu=604 \
-D_OLD_EXCEPTIONS/mcpu=604/* \
-D_OLD_EXCEPTIONS/mcpu=750 \
-D_OLD_EXCEPTIONS/mcpu=750/* \
-D_OLD_EXCEPTIONS/mcpu=860 \
-D_OLD_EXCEPTIONS/mcpu=860/* \
-D_OLD_EXCEPTIONS/mcpu=7400 \
-D_OLD_EXCEPTIONS/mcpu=7400/* \
-D_OLD_EXCEPTIONS/*Dmpc*
-
# Soft-float only, default implies msoft-float
# NOTE: Must match with MULTILIB_MATCHES_FLOAT and MULTILIB_MATCHES
MULTILIB_SOFTFLOAT_ONLY = \
@@ -86,7 +52,6 @@ MULTILIB_EXCEPTIONS =
MULTILIB_EXCEPTIONS += Dppc* Dmpc*
MULTILIB_EXCEPTIONS += \
-${MULTILIB_NEW_EXCEPTIONS_ONLY} \
${MULTILIB_SOFTFLOAT_ONLY} \
${MULTILIB_HARDFLOAT_ONLY}
diff --git a/gcc/config/rs6000/tramp.asm b/gcc/config/rs6000/tramp.asm
index 284f9386074..0c6127d567b 100644
--- a/gcc/config/rs6000/tramp.asm
+++ b/gcc/config/rs6000/tramp.asm
@@ -44,7 +44,7 @@
.align 2
trampoline_initial:
mflr r0
- bl 1f
+ bcl 20,31,1f
.Lfunc = .-trampoline_initial
.long 0 /* will be replaced with function address */
.Lchain = .-trampoline_initial
@@ -67,7 +67,7 @@ trampoline_size = .-trampoline_initial
FUNC_START(__trampoline_setup)
mflr r0 /* save return address */
- bl .LCF0 /* load up __trampoline_initial into r7 */
+ bcl 20,31,.LCF0 /* load up __trampoline_initial into r7 */
.LCF0:
mflr r11
addi r7,r11,trampoline_initial-4-.LCF0 /* trampoline address -4 */
@@ -105,6 +105,12 @@ FUNC_START(__trampoline_setup)
blr
.Labort:
+#if defined SHARED && defined HAVE_AS_REL16
+ bcl 20,31,1f
+1: mflr r30
+ addis r30,r30,_GLOBAL_OFFSET_TABLE_-1b@ha
+ addi r30,r30,_GLOBAL_OFFSET_TABLE_-1b@l
+#endif
bl JUMP_TARGET(abort)
FUNC_END(__trampoline_setup)
diff --git a/gcc/config/s390/2064.md b/gcc/config/s390/2064.md
index 04564eb86f3..4c757acf1ef 100644
--- a/gcc/config/s390/2064.md
+++ b/gcc/config/s390/2064.md
@@ -67,6 +67,11 @@
(eq_attr "type" "store"))
"z_e1,z_wr")
+(define_insn_reservation "z_sem" 2
+ (and (eq_attr "cpu" "z900,g5,g6")
+ (eq_attr "type" "sem"))
+ "z_e1*2,z_wr")
+
(define_insn_reservation "z_call" 5
(and (eq_attr "cpu" "z900,g5,g6")
(eq_attr "type" "jsr"))
diff --git a/gcc/config/s390/2084.md b/gcc/config/s390/2084.md
index 05681c5b9dc..ca106c0f680 100644
--- a/gcc/config/s390/2084.md
+++ b/gcc/config/s390/2084.md
@@ -123,6 +123,11 @@
(eq_attr "type" "idiv"))
"x-e1-np*10,x-wr-np")
+(define_insn_reservation "x_sem" 17
+ (and (eq_attr "cpu" "z990")
+ (eq_attr "type" "sem"))
+ "x-e1-np+x-mem,x-e1-np*16,x-wr-st")
+
;;
;; Multicycle insns
;;
diff --git a/gcc/config/s390/s390-protos.h b/gcc/config/s390/s390-protos.h
index 3d3ca0cc3e5..1d470a24a39 100644
--- a/gcc/config/s390/s390-protos.h
+++ b/gcc/config/s390/s390-protos.h
@@ -88,7 +88,6 @@ extern void s390_output_pool_entry (rtx, enum machine_mode, unsigned int);
extern void s390_trampoline_template (FILE *);
extern void s390_initialize_trampoline (rtx, rtx, rtx);
extern rtx s390_gen_rtx_const_DI (int, int);
-extern void s390_output_dwarf_dtprel (FILE*, int, rtx);
extern int s390_agen_dep_p (rtx, rtx);
extern rtx s390_load_got (void);
extern void s390_emit_tpf_eh_return (rtx);
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 7cf56cc13a3..fa8a8830eb4 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -163,6 +163,10 @@ static int s390_sr_alias_set = 0;
emitted. */
rtx s390_compare_op0, s390_compare_op1;
+/* Save the result of a compare_and_swap until the branch or scc is
+ emitted. */
+rtx s390_compare_emitted = NULL_RTX;
+
/* Structure used to hold the components of a S/390 memory
address. A legitimate address on S/390 is of the general
form
@@ -186,7 +190,6 @@ enum processor_flags s390_tune_flags;
/* Which instruction set architecture to use. */
enum processor_type s390_arch;
enum processor_flags s390_arch_flags;
-static const char *s390_arch_string;
HOST_WIDE_INT s390_warn_framesize = 0;
HOST_WIDE_INT s390_stack_size = 0;
@@ -255,6 +258,11 @@ struct machine_function GTY(())
#define cfun_fpr_bit_p(BITNUM) (!!(cfun->machine->frame_layout.fpr_bitmap & \
(1 << (BITNUM))))
+/* Number of GPRs and FPRs used for argument passing. */
+#define GP_ARG_NUM_REG 5
+#define FP_ARG_NUM_REG (TARGET_64BIT? 4 : 2)
+
+
/* Return true if SET either doesn't set the CC register, or else
the source and destination have matching CC modes and that
CC mode is at least as constrained as REQ_MODE. */
@@ -605,10 +613,21 @@ rtx
s390_emit_compare (enum rtx_code code, rtx op0, rtx op1)
{
enum machine_mode mode = s390_select_ccmode (code, op0, op1);
- rtx cc = gen_rtx_REG (mode, CC_REGNUM);
+ rtx ret = NULL_RTX;
- emit_insn (gen_rtx_SET (VOIDmode, cc, gen_rtx_COMPARE (mode, op0, op1)));
- return gen_rtx_fmt_ee (code, VOIDmode, cc, const0_rtx);
+ /* Do not output a redundant compare instruction if a compare_and_swap
+ pattern already computed the result and the machine modes match. */
+ if (s390_compare_emitted && GET_MODE (s390_compare_emitted) == mode)
+ ret = gen_rtx_fmt_ee (code, VOIDmode, s390_compare_emitted, const0_rtx);
+ else
+ {
+ rtx cc = gen_rtx_REG (mode, CC_REGNUM);
+
+ emit_insn (gen_rtx_SET (VOIDmode, cc, gen_rtx_COMPARE (mode, op0, op1)));
+ ret = gen_rtx_fmt_ee (code, VOIDmode, cc, const0_rtx);
+ }
+ s390_compare_emitted = NULL_RTX;
+ return ret;
}
/* Emit a jump instruction to TARGET. If COND is NULL_RTX, emit an
@@ -1123,7 +1142,6 @@ s390_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
switch (code)
{
case OPT_march_:
- s390_arch_string = arg;
return s390_handle_arch_option (arg, &s390_arch, &s390_arch_flags);
case OPT_mstack_guard_:
@@ -3543,10 +3561,12 @@ s390_expand_addcc (enum rtx_code cmp_code, rtx cmp_op0, rtx cmp_op1,
}
-/* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL.
+/* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
We need to emit DTP-relative relocations. */
-void
+static void s390_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
+
+static void
s390_output_dwarf_dtprel (FILE *file, int size, rtx x)
{
switch (size)
@@ -4669,15 +4689,12 @@ s390_add_execute (struct constant_pool *pool, rtx insn)
if (c == NULL)
{
- rtx label = s390_execute_label (insn);
- gcc_assert (label);
-
c = (struct constant *) xmalloc (sizeof *c);
c->value = insn;
- c->label = label == const0_rtx ? gen_label_rtx () : XEXP (label, 0);
+ c->label = gen_label_rtx ();
c->next = pool->execute;
pool->execute = c;
- pool->size += label == const0_rtx ? 6 : 0;
+ pool->size += 6;
}
}
@@ -4729,28 +4746,6 @@ s390_execute_target (rtx insn)
return pattern;
}
-/* Dump out the out-of-pool execute template insns in POOL
- at the end of the instruction stream. */
-
-static void
-s390_dump_execute (struct constant_pool *pool)
-{
- struct constant *c;
- rtx insn;
-
- for (c = pool->execute; c; c = c->next)
- {
- if (s390_execute_label (c->value) == const0_rtx)
- continue;
-
- insn = emit_label (c->label);
- INSN_ADDRESSES_NEW (insn, -1);
-
- insn = emit_insn (s390_execute_target (c->value));
- INSN_ADDRESSES_NEW (insn, -1);
- }
-}
-
/* Indicate that INSN cannot be duplicated. This is the case for
execute insns that carry a unique label. */
@@ -4826,9 +4821,6 @@ s390_dump_pool (struct constant_pool *pool, bool remote_label)
/* Output in-pool execute template insns. */
for (c = pool->execute; c; c = c->next)
{
- if (s390_execute_label (c->value) != const0_rtx)
- continue;
-
insn = emit_label_after (c->label, insn);
INSN_ADDRESSES_NEW (insn, -1);
@@ -4848,9 +4840,6 @@ s390_dump_pool (struct constant_pool *pool, bool remote_label)
/* Remove placeholder insn. */
remove_insn (pool->pool_insn);
-
- /* Output out-of-pool execute template isns. */
- s390_dump_execute (pool);
}
/* Free all memory used by POOL. */
@@ -4900,7 +4889,7 @@ s390_mainpool_start (void)
pool->pool_insn = insn;
}
- if (s390_execute_label (insn))
+ if (!TARGET_CPU_ZARCH && s390_execute_label (insn))
{
s390_add_execute (pool, insn);
}
@@ -4945,9 +4934,6 @@ s390_mainpool_finish (struct constant_pool *pool)
/* If the pool is empty, we're done. */
if (pool->size == 0)
{
- /* However, we may have out-of-pool execute templates. */
- s390_dump_execute (pool);
-
/* We don't actually need a base register after all. */
cfun->machine->base_reg = NULL_RTX;
@@ -5100,7 +5086,7 @@ s390_chunkify_start (void)
}
}
- if (s390_execute_label (insn))
+ if (!TARGET_CPU_ZARCH && s390_execute_label (insn))
{
if (!curr_pool)
curr_pool = s390_start_pool (&pool_list, insn);
@@ -5659,18 +5645,40 @@ s390_register_info (int live_regs[])
if (current_function_stdarg)
{
/* Varargs functions need to save gprs 2 to 6. */
- if (cfun_frame_layout.first_save_gpr == -1
- || cfun_frame_layout.first_save_gpr > 2)
- cfun_frame_layout.first_save_gpr = 2;
-
- if (cfun_frame_layout.last_save_gpr == -1
- || cfun_frame_layout.last_save_gpr < 6)
- cfun_frame_layout.last_save_gpr = 6;
+ if (cfun->va_list_gpr_size
+ && current_function_args_info.gprs < GP_ARG_NUM_REG)
+ {
+ int min_gpr = current_function_args_info.gprs;
+ int max_gpr = min_gpr + cfun->va_list_gpr_size;
+ if (max_gpr > GP_ARG_NUM_REG)
+ max_gpr = GP_ARG_NUM_REG;
+
+ if (cfun_frame_layout.first_save_gpr == -1
+ || cfun_frame_layout.first_save_gpr > 2 + min_gpr)
+ cfun_frame_layout.first_save_gpr = 2 + min_gpr;
+
+ if (cfun_frame_layout.last_save_gpr == -1
+ || cfun_frame_layout.last_save_gpr < 2 + max_gpr - 1)
+ cfun_frame_layout.last_save_gpr = 2 + max_gpr - 1;
+ }
/* Mark f0, f2 for 31 bit and f0-f4 for 64 bit to be saved. */
- if (TARGET_HARD_FLOAT)
- for (i = 0; i < (TARGET_64BIT ? 4 : 2); i++)
- cfun_set_fpr_bit (i);
+ if (TARGET_HARD_FLOAT && cfun->va_list_fpr_size
+ && current_function_args_info.fprs < FP_ARG_NUM_REG)
+ {
+ int min_fpr = current_function_args_info.fprs;
+ int max_fpr = min_fpr + cfun->va_list_fpr_size;
+ if (max_fpr > FP_ARG_NUM_REG)
+ max_fpr = FP_ARG_NUM_REG;
+
+ /* ??? This is currently required to ensure proper location
+ of the fpr save slots within the va_list save area. */
+ if (TARGET_PACKED_STACK)
+ min_fpr = 0;
+
+ for (i = min_fpr; i < max_fpr; i++)
+ cfun_set_fpr_bit (i);
+ }
}
if (!TARGET_64BIT)
@@ -6714,7 +6722,7 @@ s390_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
{
if (s390_function_arg_float (mode, type))
{
- if (cum->fprs + 1 > (TARGET_64BIT? 4 : 2))
+ if (cum->fprs + 1 > FP_ARG_NUM_REG)
return 0;
else
return gen_rtx_REG (mode, cum->fprs + 16);
@@ -6724,7 +6732,7 @@ s390_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
int size = s390_function_arg_size (mode, type);
int n_gprs = (size + UNITS_PER_WORD-1) / UNITS_PER_WORD;
- if (cum->gprs + n_gprs > 5)
+ if (cum->gprs + n_gprs > GP_ARG_NUM_REG)
return 0;
else
return gen_rtx_REG (mode, cum->gprs + 2);
@@ -6832,6 +6840,9 @@ s390_build_builtin_va_list (void)
f_sav = build_decl (FIELD_DECL, get_identifier ("__reg_save_area"),
ptr_type_node);
+ va_list_gpr_counter_field = f_gpr;
+ va_list_fpr_counter_field = f_fpr;
+
DECL_FIELD_CONTEXT (f_gpr) = record;
DECL_FIELD_CONTEXT (f_fpr) = record;
DECL_FIELD_CONTEXT (f_ovf) = record;
@@ -6887,39 +6898,53 @@ s390_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED)
n_gpr = current_function_args_info.gprs;
n_fpr = current_function_args_info.fprs;
- t = build (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
- build_int_cst (NULL_TREE, n_gpr));
- TREE_SIDE_EFFECTS (t) = 1;
- expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+ if (cfun->va_list_gpr_size)
+ {
+ t = build (MODIFY_EXPR, TREE_TYPE (gpr), gpr,
+ build_int_cst (NULL_TREE, n_gpr));
+ TREE_SIDE_EFFECTS (t) = 1;
+ expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+ }
- t = build (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
- build_int_cst (NULL_TREE, n_fpr));
- TREE_SIDE_EFFECTS (t) = 1;
- expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+ if (cfun->va_list_fpr_size)
+ {
+ t = build (MODIFY_EXPR, TREE_TYPE (fpr), fpr,
+ build_int_cst (NULL_TREE, n_fpr));
+ TREE_SIDE_EFFECTS (t) = 1;
+ expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+ }
/* Find the overflow area. */
- t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
+ if (n_gpr + cfun->va_list_gpr_size > GP_ARG_NUM_REG
+ || n_fpr + cfun->va_list_fpr_size > FP_ARG_NUM_REG)
+ {
+ t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
- off = INTVAL (current_function_arg_offset_rtx);
- off = off < 0 ? 0 : off;
- if (TARGET_DEBUG_ARG)
- fprintf (stderr, "va_start: n_gpr = %d, n_fpr = %d off %d\n",
- (int)n_gpr, (int)n_fpr, off);
+ off = INTVAL (current_function_arg_offset_rtx);
+ off = off < 0 ? 0 : off;
+ if (TARGET_DEBUG_ARG)
+ fprintf (stderr, "va_start: n_gpr = %d, n_fpr = %d off %d\n",
+ (int)n_gpr, (int)n_fpr, off);
- t = build (PLUS_EXPR, TREE_TYPE (ovf), t, build_int_cst (NULL_TREE, off));
+ t = build (PLUS_EXPR, TREE_TYPE (ovf), t, build_int_cst (NULL_TREE, off));
- t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
- TREE_SIDE_EFFECTS (t) = 1;
- expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+ t = build (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
+ TREE_SIDE_EFFECTS (t) = 1;
+ expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+ }
/* Find the register save area. */
- t = make_tree (TREE_TYPE (sav), return_address_pointer_rtx);
- t = build (PLUS_EXPR, TREE_TYPE (sav), t,
- build_int_cst (NULL_TREE, -RETURN_REGNUM * UNITS_PER_WORD));
+ if ((cfun->va_list_gpr_size && n_gpr < GP_ARG_NUM_REG)
+ || (cfun->va_list_fpr_size && n_fpr < FP_ARG_NUM_REG))
+ {
+ t = make_tree (TREE_TYPE (sav), return_address_pointer_rtx);
+ t = build (PLUS_EXPR, TREE_TYPE (sav), t,
+ build_int_cst (NULL_TREE, -RETURN_REGNUM * UNITS_PER_WORD));
- t = build (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
- TREE_SIDE_EFFECTS (t) = 1;
- expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+ t = build (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
+ TREE_SIDE_EFFECTS (t) = 1;
+ expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
+ }
}
/* Implement va_arg by updating the va_list structure
@@ -6987,7 +7012,7 @@ s390_gimplify_va_arg (tree valist, tree type, tree *pre_p,
sav_ofs = 2 * UNITS_PER_WORD;
sav_scale = UNITS_PER_WORD;
size = UNITS_PER_WORD;
- max_reg = 4;
+ max_reg = GP_ARG_NUM_REG - n_reg;
}
else if (s390_function_arg_float (TYPE_MODE (type), type))
{
@@ -7003,8 +7028,7 @@ s390_gimplify_va_arg (tree valist, tree type, tree *pre_p,
n_reg = 1;
sav_ofs = 16 * UNITS_PER_WORD;
sav_scale = 8;
- /* TARGET_64BIT has up to 4 parameter in fprs */
- max_reg = TARGET_64BIT ? 3 : 1;
+ max_reg = FP_ARG_NUM_REG - n_reg;
}
else
{
@@ -7028,10 +7052,7 @@ s390_gimplify_va_arg (tree valist, tree type, tree *pre_p,
sav_ofs += UNITS_PER_WORD - size;
sav_scale = UNITS_PER_WORD;
- if (n_reg > 1)
- max_reg = 3;
- else
- max_reg = 4;
+ max_reg = GP_ARG_NUM_REG - n_reg;
}
/* Pull the value out of the saved registers ... */
@@ -7951,6 +7972,10 @@ s390_optimize_prologue (void)
if (GET_CODE (base) != REG || off < 0)
continue;
+ if (cfun_frame_layout.first_save_gpr != -1
+ && (cfun_frame_layout.first_save_gpr < first
+ || cfun_frame_layout.last_save_gpr > last))
+ continue;
if (REGNO (base) != STACK_POINTER_REGNUM
&& REGNO (base) != HARD_FRAME_POINTER_REGNUM)
continue;
@@ -7972,7 +7997,8 @@ s390_optimize_prologue (void)
continue;
}
- if (GET_CODE (PATTERN (insn)) == SET
+ if (cfun_frame_layout.first_save_gpr == -1
+ && GET_CODE (PATTERN (insn)) == SET
&& GET_CODE (SET_SRC (PATTERN (insn))) == REG
&& (REGNO (SET_SRC (PATTERN (insn))) == BASE_REGNUM
|| (!TARGET_CPU_ZARCH
@@ -7990,16 +8016,6 @@ s390_optimize_prologue (void)
if (REGNO (base) != STACK_POINTER_REGNUM
&& REGNO (base) != HARD_FRAME_POINTER_REGNUM)
continue;
- if (cfun_frame_layout.first_save_gpr != -1)
- {
- new_insn = save_gprs (base,
- off + (cfun_frame_layout.first_save_gpr
- - first) * UNITS_PER_WORD,
- cfun_frame_layout.first_save_gpr,
- cfun_frame_layout.last_save_gpr);
- new_insn = emit_insn_before (new_insn, insn);
- INSN_ADDRESSES_NEW (new_insn, -1);
- }
remove_insn (insn);
continue;
@@ -8017,6 +8033,10 @@ s390_optimize_prologue (void)
if (GET_CODE (base) != REG || off < 0)
continue;
+ if (cfun_frame_layout.first_restore_gpr != -1
+ && (cfun_frame_layout.first_restore_gpr < first
+ || cfun_frame_layout.last_restore_gpr > last))
+ continue;
if (REGNO (base) != STACK_POINTER_REGNUM
&& REGNO (base) != HARD_FRAME_POINTER_REGNUM)
continue;
@@ -8038,7 +8058,8 @@ s390_optimize_prologue (void)
continue;
}
- if (GET_CODE (PATTERN (insn)) == SET
+ if (cfun_frame_layout.first_restore_gpr == -1
+ && GET_CODE (PATTERN (insn)) == SET
&& GET_CODE (SET_DEST (PATTERN (insn))) == REG
&& (REGNO (SET_DEST (PATTERN (insn))) == BASE_REGNUM
|| (!TARGET_CPU_ZARCH
@@ -8056,16 +8077,6 @@ s390_optimize_prologue (void)
if (REGNO (base) != STACK_POINTER_REGNUM
&& REGNO (base) != HARD_FRAME_POINTER_REGNUM)
continue;
- if (cfun_frame_layout.first_restore_gpr != -1)
- {
- new_insn = restore_gprs (base,
- off + (cfun_frame_layout.first_restore_gpr
- - first) * UNITS_PER_WORD,
- cfun_frame_layout.first_restore_gpr,
- cfun_frame_layout.last_restore_gpr);
- new_insn = emit_insn_before (new_insn, insn);
- INSN_ADDRESSES_NEW (new_insn, -1);
- }
remove_insn (insn);
continue;
@@ -8160,6 +8171,28 @@ s390_reorg (void)
break;
}
+ /* Generate out-of-pool execute target insns. */
+ if (TARGET_CPU_ZARCH)
+ {
+ rtx insn, label, target;
+
+ for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
+ {
+ label = s390_execute_label (insn);
+ if (!label)
+ continue;
+
+ gcc_assert (label != const0_rtx);
+
+ target = emit_label (XEXP (label, 0));
+ INSN_ADDRESSES_NEW (target, -1);
+
+ target = emit_insn (s390_execute_target (insn));
+ INSN_ADDRESSES_NEW (target, -1);
+ }
+ }
+
+ /* Try to optimize prologue and epilogue further. */
s390_optimize_prologue ();
}
@@ -8251,6 +8284,14 @@ s390_reorg (void)
#undef TARGET_CC_MODES_COMPATIBLE
#define TARGET_CC_MODES_COMPATIBLE s390_cc_modes_compatible
+#undef TARGET_INVALID_WITHIN_DOLOOP
+#define TARGET_INVALID_WITHIN_DOLOOP hook_constcharptr_rtx_null
+
+#ifdef HAVE_AS_TLS
+#undef TARGET_ASM_OUTPUT_DWARF_DTPREL
+#define TARGET_ASM_OUTPUT_DWARF_DTPREL s390_output_dwarf_dtprel
+#endif
+
struct gcc_target targetm = TARGET_INITIALIZER;
#include "gt-s390.h"
diff --git a/gcc/config/s390/s390.h b/gcc/config/s390/s390.h
index 84d035357b7..1141d3b2e96 100644
--- a/gcc/config/s390/s390.h
+++ b/gcc/config/s390/s390.h
@@ -799,7 +799,7 @@ do { \
/* Define the information needed to generate branch and scc insns. This is
stored from the compare operation. Note that we can't use "rtx" here
since it hasn't been defined! */
-extern struct rtx_def *s390_compare_op0, *s390_compare_op1;
+extern struct rtx_def *s390_compare_op0, *s390_compare_op1, *s390_compare_emitted;
/* Relative costs of operations. */
@@ -918,13 +918,6 @@ extern int flag_pic;
"%ap", "%cc", "%fp", "%rp", "%a0", "%a1" \
}
-/* Emit a dtp-relative reference to a TLS variable. */
-
-#ifdef HAVE_AS_TLS
-#define ASM_OUTPUT_DWARF_DTPREL(FILE, SIZE, X) \
- s390_output_dwarf_dtprel (FILE, SIZE, X)
-#endif
-
/* 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)
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index 93f805ed7f9..34ecc7ccd60 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -146,6 +146,10 @@
; TLS support
(UNSPECV_SET_TP 500)
+
+ ; Atomic Support
+ (UNSPECV_MB 700)
+ (UNSPECV_CAS 701)
])
;;
@@ -177,7 +181,7 @@
;; Instruction type attribute used for scheduling.
(define_attr "type" "none,integer,load,lr,la,larl,lm,stm,
- cs,vs,store,idiv,
+ cs,vs,store,sem,idiv,
imulhi,imulsi,imuldi,
branch,jsr,fsimpdf,fsimpsf,
floaddf,floadsf,fstoredf,fstoresf,
@@ -6692,6 +6696,86 @@
(set_attr "atype" "agen")])
;;
+;;- Atomic operations
+;;
+
+;
+; memory barrier pattern.
+;
+
+(define_expand "memory_barrier"
+ [(set (mem:BLK (match_dup 0))
+ (unspec_volatile:BLK [(mem:BLK (match_dup 0))] UNSPECV_MB))]
+ ""
+{
+ operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (DImode));
+ MEM_VOLATILE_P (operands[0]) = 1;
+})
+
+(define_insn "*memory_barrier"
+ [(set (match_operand:BLK 0 "" "")
+ (unspec_volatile:BLK [(match_operand:BLK 1 "" "")] UNSPECV_MB))]
+ ""
+ "bcr\t15,0"
+ [(set_attr "op_type" "RR")])
+
+;
+; compare and swap patterns.
+;
+
+(define_insn "sync_compare_and_swap<mode>"
+ [(set (match_operand:GPR 0 "register_operand" "=r")
+ (match_operand:GPR 1 "memory_operand" "+Q"))
+ (set (match_dup 1)
+ (unspec_volatile:GPR
+ [(match_dup 1)
+ (match_operand:GPR 2 "register_operand" "0")
+ (match_operand:GPR 3 "register_operand" "r")]
+ UNSPECV_CAS))
+ (clobber (reg:CC CC_REGNUM))]
+ ""
+ "cs<g>\t%0,%3,%S1"
+ [(set_attr "op_type" "RS<E>")
+ (set_attr "type" "sem")])
+
+(define_expand "sync_compare_and_swap_cc<mode>"
+ [(parallel
+ [(set (match_operand:GPR 0 "register_operand" "")
+ (match_operand:GPR 1 "memory_operand" ""))
+ (set (match_dup 1)
+ (unspec_volatile:GPR
+ [(match_dup 1)
+ (match_operand:GPR 2 "register_operand" "")
+ (match_operand:GPR 3 "register_operand" "")]
+ UNSPECV_CAS))
+ (set (match_dup 4)
+ (compare:CCZ (match_dup 1) (match_dup 2)))])]
+ ""
+{
+ operands[4] = gen_rtx_REG (CCZmode, CC_REGNUM);
+ s390_compare_op0 = operands[1];
+ s390_compare_op1 = operands[2];
+ s390_compare_emitted = operands[4];
+})
+
+(define_insn "*sync_compare_and_swap_cc<mode>"
+ [(set (match_operand:GPR 0 "register_operand" "=r")
+ (match_operand:GPR 1 "memory_operand" "+Q"))
+ (set (match_dup 1)
+ (unspec_volatile:GPR
+ [(match_dup 1)
+ (match_operand:GPR 2 "register_operand" "0")
+ (match_operand:GPR 3 "register_operand" "r")]
+ UNSPECV_CAS))
+ (set (reg:CCZ CC_REGNUM)
+ (compare:CCZ (match_dup 1) (match_dup 2)))]
+ ""
+ "cs<g>\t%0,%3,%S1"
+ [(set_attr "op_type" "RS<E>")
+ (set_attr "type" "sem")])
+
+
+;;
;;- Miscellaneous instructions.
;;
diff --git a/gcc/config/s390/s390.opt b/gcc/config/s390/s390.opt
index 9ece6f13a3c..e020e63f221 100644
--- a/gcc/config/s390/s390.opt
+++ b/gcc/config/s390/s390.opt
@@ -28,7 +28,7 @@ Target Report RejectNegative Mask(64BIT)
64 bit ABI
march=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(s390_arch_string)
Generate code for given CPU
mbackchain
diff --git a/gcc/config/sh/elf.h b/gcc/config/sh/elf.h
index 52d0727eb64..c53c4be54ff 100644
--- a/gcc/config/sh/elf.h
+++ b/gcc/config/sh/elf.h
@@ -1,5 +1,5 @@
/* Definitions of target machine for gcc for Renesas / SuperH SH using ELF.
- Copyright (C) 1996, 1997, 2000, 2001, 2002, 2004
+ Copyright (C) 1996, 1997, 2000, 2001, 2002, 2004, 2005
Free Software Foundation, Inc.
Contributed by Ian Lance Taylor <ian@cygnus.com>.
diff --git a/gcc/config/sh/linux-unwind.h b/gcc/config/sh/linux-unwind.h
index 6ca9d567886..ab149d33d42 100644
--- a/gcc/config/sh/linux-unwind.h
+++ b/gcc/config/sh/linux-unwind.h
@@ -35,18 +35,11 @@ Boston, MA 02111-1307, USA. */
# if defined (__SH5__)
#define SH_DWARF_FRAME_GP0 0
-#define SH_DWARF_FRAME_FP0 (__SH5__ == 32 ? 245 : 77)
-#define SH_DWARF_FRAME_XD0 289
+#define SH_DWARF_FRAME_FP0 77
#define SH_DWARF_FRAME_BT0 68
-#define SH_DWARF_FRAME_PR 241
#define SH_DWARF_FRAME_PR_MEDIA 18
-#define SH_DWARF_FRAME_GBR 238
-#define SH_DWARF_FRAME_MACH 239
-#define SH_DWARF_FRAME_MACL 240
-#define SH_DWARF_FRAME_PC 64
#define SH_DWARF_FRAME_SR 65
-#define SH_DWARF_FRAME_FPUL 244
-#define SH_DWARF_FRAME_FPSCR 243
+#define SH_DWARF_FRAME_FPSCR 76
#else
#define SH_DWARF_FRAME_GP0 0
#define SH_DWARF_FRAME_FP0 25
@@ -62,7 +55,88 @@ Boston, MA 02111-1307, USA. */
#endif /* defined (__SH5__) */
#if defined (__SH5__)
-/* MD_FALLBACK_FRAME_STATE_FOR is not yet defined for SHMEDIA. */
+
+#define MD_FALLBACK_FRAME_STATE_FOR shmedia_fallback_frame_state
+
+static _Unwind_Reason_Code
+shmedia_fallback_frame_state (struct _Unwind_Context *context,
+ _Unwind_FrameState *fs)
+{
+ unsigned char *pc = context->ra;
+ struct sigcontext *sc;
+ long new_cfa;
+ int i, r;
+
+ /* movi 0x10,r9; shori 0x77,r9; trapa r9; nop (sigreturn) */
+ /* movi 0x10,r9; shori 0xad,r9; trapa r9; nop (rt_sigreturn) */
+ if ((*(unsigned long *) (pc-1) == 0xcc004090)
+ && (*(unsigned long *) (pc+3) == 0xc801dc90)
+ && (*(unsigned long *) (pc+7) == 0x6c91fff0)
+ && (*(unsigned long *) (pc+11) == 0x6ff0fff0))
+ sc = context->cfa;
+ else if ((*(unsigned long *) (pc-1) == 0xcc004090)
+ && (*(unsigned long *) (pc+3) == 0xc802b490)
+ && (*(unsigned long *) (pc+7) == 0x6c91fff0)
+ && (*(unsigned long *) (pc+11) == 0x6ff0fff0))
+ {
+ struct rt_sigframe {
+ struct siginfo *pinfo;
+ void *puc;
+ struct siginfo info;
+ struct ucontext uc;
+ } *rt_ = context->cfa;
+ sc = (struct sigcontext *) &rt_->uc.uc_mcontext;
+ }
+ else
+ return _URC_END_OF_STACK;
+
+ new_cfa = sc->sc_regs[15];
+ fs->cfa_how = CFA_REG_OFFSET;
+ fs->cfa_reg = 15;
+ fs->cfa_offset = new_cfa - (long) context->cfa;
+
+ for (i = 0; i < 63; i++)
+ {
+ if (i == 15)
+ continue;
+
+ fs->regs.reg[i].how = REG_SAVED_OFFSET;
+ fs->regs.reg[i].loc.offset
+ = (long)&(sc->sc_regs[i]) - new_cfa;
+ }
+
+ fs->regs.reg[SH_DWARF_FRAME_SR].how = REG_SAVED_OFFSET;
+ fs->regs.reg[SH_DWARF_FRAME_SR].loc.offset
+ = (long)&(sc->sc_sr) - new_cfa;
+
+ r = SH_DWARF_FRAME_BT0;
+ for (i = 0; i < 8; i++)
+ {
+ fs->regs.reg[r+i].how = REG_SAVED_OFFSET;
+ fs->regs.reg[r+i].loc.offset
+ = (long)&(sc->sc_tregs[i]) - new_cfa;
+ }
+
+ r = SH_DWARF_FRAME_FP0;
+ for (i = 0; i < 32; i++)
+ {
+ fs->regs.reg[r+i].how = REG_SAVED_OFFSET;
+ fs->regs.reg[r+i].loc.offset
+ = (long)&(sc->sc_fpregs[i]) - new_cfa;
+ }
+
+ fs->regs.reg[SH_DWARF_FRAME_FPSCR].how = REG_SAVED_OFFSET;
+ fs->regs.reg[SH_DWARF_FRAME_FPSCR].loc.offset
+ = (long)&(sc->sc_fpscr) - new_cfa;
+
+ /* We use the slot for the zero register to save return address. */
+ fs->regs.reg[63].how = REG_SAVED_OFFSET;
+ fs->regs.reg[63].loc.offset
+ = (long)&(sc->sc_pc) - new_cfa;
+ fs->retaddr_column = 63;
+ return _URC_NO_REASON;
+}
+
#else /* defined (__SH5__) */
#define MD_FALLBACK_FRAME_STATE_FOR sh_fallback_frame_state
diff --git a/gcc/config/sh/linux.h b/gcc/config/sh/linux.h
index fe48d0ca0b1..51d52ebfcc4 100644
--- a/gcc/config/sh/linux.h
+++ b/gcc/config/sh/linux.h
@@ -68,29 +68,56 @@ Boston, MA 02111-1307, USA. */
#undef FUNCTION_PROFILER
#define FUNCTION_PROFILER(STREAM,LABELNO) \
do { \
- if (flag_pic) \
+ if (TARGET_SHMEDIA) \
{ \
- fprintf (STREAM, "\tmov.l\t3f,r1\n"); \
- fprintf (STREAM, "\tmova\t3f,r0\n"); \
- fprintf (STREAM, "\tadd\tr1,r0\n"); \
- fprintf (STREAM, "\tmov.l\t1f,r1\n"); \
- fprintf (STREAM, "\tmov.l\t@(r0,r1),r1\n"); \
+ fprintf (STREAM, "\tpt\t1f,tr1\n"); \
+ fprintf (STREAM, "\taddi.l\tr15,-8,r15\n"); \
+ fprintf (STREAM, "\tst.l\tr15,0,r18\n"); \
+ if (flag_pic) \
+ { \
+ char *gofs = "(datalabel _GLOBAL_OFFSET_TABLE_-(0f-.))"; \
+ fprintf (STREAM, "\tmovi\t((%s>>16)&0xffff),r21\n", gofs); \
+ fprintf (STREAM, "\tshori\t(%s & 0xffff),r21\n", gofs); \
+ fprintf (STREAM, "0:\tptrel/u\tr21,tr0\n"); \
+ fprintf (STREAM, "\tmovi\t((mcount@GOTPLT)&0xffff),r22\n"); \
+ fprintf (STREAM, "\tgettr\ttr0,r21\n"); \
+ fprintf (STREAM, "\tadd.l\tr21,r22,r21\n"); \
+ fprintf (STREAM, "\tld.l\tr21,0,r21\n"); \
+ fprintf (STREAM, "\tptabs\tr21,tr0\n"); \
+ } \
+ else \
+ fprintf (STREAM, "\tpt\tmcount,tr0\n"); \
+ fprintf (STREAM, "\tgettr\ttr1,r18\n"); \
+ fprintf (STREAM, "\tblink\ttr0,r63\n"); \
+ fprintf (STREAM, "1:\tld.l\tr15,0,r18\n"); \
+ fprintf (STREAM, "\taddi.l\tr15,8,r15\n"); \
} \
else \
- fprintf (STREAM, "\tmov.l\t1f,r1\n"); \
- fprintf (STREAM, "\tsts.l\tpr,@-r15\n"); \
- fprintf (STREAM, "\tmova\t2f,r0\n"); \
- fprintf (STREAM, "\tjmp\t@r1\n"); \
- fprintf (STREAM, "\tlds\tr0,pr\n"); \
- fprintf (STREAM, "\t.align\t2\n"); \
- if (flag_pic) \
{ \
- fprintf (STREAM, "1:\t.long\tmcount@GOT\n"); \
- fprintf (STREAM, "3:\t.long\t_GLOBAL_OFFSET_TABLE_\n"); \
+ if (flag_pic) \
+ { \
+ fprintf (STREAM, "\tmov.l\t3f,r1\n"); \
+ fprintf (STREAM, "\tmova\t3f,r0\n"); \
+ fprintf (STREAM, "\tadd\tr1,r0\n"); \
+ fprintf (STREAM, "\tmov.l\t1f,r1\n"); \
+ fprintf (STREAM, "\tmov.l\t@(r0,r1),r1\n"); \
+ } \
+ else \
+ fprintf (STREAM, "\tmov.l\t1f,r1\n"); \
+ fprintf (STREAM, "\tsts.l\tpr,@-r15\n"); \
+ fprintf (STREAM, "\tmova\t2f,r0\n"); \
+ fprintf (STREAM, "\tjmp\t@r1\n"); \
+ fprintf (STREAM, "\tlds\tr0,pr\n"); \
+ fprintf (STREAM, "\t.align\t2\n"); \
+ if (flag_pic) \
+ { \
+ fprintf (STREAM, "1:\t.long\tmcount@GOT\n"); \
+ fprintf (STREAM, "3:\t.long\t_GLOBAL_OFFSET_TABLE_\n"); \
+ } \
+ else \
+ fprintf (STREAM, "1:\t.long\tmcount\n"); \
+ fprintf (STREAM, "2:\tlds.l\t@r15+,pr\n"); \
} \
- else \
- fprintf (STREAM, "1:\t.long\tmcount\n"); \
- fprintf (STREAM, "2:\tlds.l\t@r15+,pr\n"); \
} while (0)
#define MD_UNWIND_SUPPORT "config/sh/linux-unwind.h"
diff --git a/gcc/config/sh/predicates.md b/gcc/config/sh/predicates.md
index 981cc8f10f5..324d30da802 100644
--- a/gcc/config/sh/predicates.md
+++ b/gcc/config/sh/predicates.md
@@ -1,3 +1,25 @@
+;; Predicate definitions for Renesas / SuperH SH.
+;; Copyright (C) 2005 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.
+
+;; TODO: Add a comment here.
+
(define_predicate "trapping_target_operand"
(match_code "if_then_else")
{
@@ -36,3 +58,861 @@
&& INTVAL (XEXP (and, 1)) == 3
&& INTVAL (XEXP (cond, 1)) == 3);
})
+
+;; TODO: Add a comment here.
+
+(define_predicate "and_operand"
+ (match_code "subreg,reg,const_int")
+{
+ if (logical_operand (op, mode))
+ return 1;
+
+ /* Check mshflo.l / mshflhi.l opportunities. */
+ if (TARGET_SHMEDIA
+ && mode == DImode
+ && GET_CODE (op) == CONST_INT
+ && CONST_OK_FOR_J16 (INTVAL (op)))
+ return 1;
+
+ return 0;
+})
+
+;; Like arith_reg_dest, but this predicate belongs to
+;; SPECIAL_MODE_PREDICATES.
+
+(define_special_predicate "any_arith_reg_dest"
+ (match_code "subreg,reg")
+{
+ return arith_reg_dest (op, mode);
+})
+
+;; Like register_operand, but this predicate belongs to
+;; SPECIAL_MODE_PREDICATES.
+
+(define_special_predicate "any_register_operand"
+ (match_code "subreg,reg")
+{
+ return register_operand (op, mode);
+})
+
+;; Returns 1 if OP is a valid source operand for an arithmetic insn.
+
+(define_predicate "arith_operand"
+ (match_code "subreg,reg,const_int,truncate")
+{
+ if (arith_reg_operand (op, mode))
+ return 1;
+
+ if (TARGET_SHMEDIA)
+ {
+ /* FIXME: We should be checking whether the CONST_INT fits in a
+ CONST_OK_FOR_I16 here, but this causes reload_cse to crash when
+ attempting to transform a sequence of two 64-bit sets of the
+ same register from literal constants into a set and an add,
+ when the difference is too wide for an add. */
+ if (GET_CODE (op) == CONST_INT
+ || EXTRA_CONSTRAINT_C16 (op))
+ return 1;
+ else if (GET_CODE (op) == TRUNCATE
+ && ! system_reg_operand (XEXP (op, 0), VOIDmode)
+ && (mode == VOIDmode || mode == GET_MODE (op))
+ && (GET_MODE_SIZE (GET_MODE (op))
+ < GET_MODE_SIZE (GET_MODE (XEXP (op, 0))))
+ && (! FP_REGISTER_P (REGNO (XEXP (op, 0)))
+ || GET_MODE_SIZE (GET_MODE (op)) == 4))
+ return register_operand (XEXP (op, 0), VOIDmode);
+ else
+ return 0;
+ }
+ else if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_I08 (INTVAL (op)))
+ return 1;
+
+ return 0;
+})
+
+;; Like above, but for DImode destinations: forbid paradoxical DImode
+;; subregs, because this would lead to missing sign extensions when
+;; truncating from DImode to SImode.
+
+(define_predicate "arith_reg_dest"
+ (match_code "subreg,reg")
+{
+ if (mode == DImode && GET_CODE (op) == SUBREG
+ && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) < 8
+ && TARGET_SHMEDIA)
+ return 0;
+ return arith_reg_operand (op, mode);
+})
+
+;; Returns 1 if OP is a normal arithmetic register.
+
+(define_predicate "arith_reg_operand"
+ (match_code "subreg,reg,sign_extend")
+{
+ if (register_operand (op, mode))
+ {
+ int regno;
+
+ if (GET_CODE (op) == REG)
+ regno = REGNO (op);
+ else if (GET_CODE (op) == SUBREG && GET_CODE (SUBREG_REG (op)) == REG)
+ regno = REGNO (SUBREG_REG (op));
+ else
+ return 1;
+
+ return (regno != T_REG && regno != PR_REG
+ && ! TARGET_REGISTER_P (regno)
+ && (regno != FPUL_REG || TARGET_SH4)
+ && regno != MACH_REG && regno != MACL_REG);
+ }
+ /* Allow a no-op sign extension - compare LOAD_EXTEND_OP.
+ We allow SImode here, as not using an FP register is just a matter of
+ proper register allocation. */
+ if (TARGET_SHMEDIA
+ && GET_MODE (op) == DImode && GET_CODE (op) == SIGN_EXTEND
+ && GET_MODE (XEXP (op, 0)) == SImode
+ && GET_CODE (XEXP (op, 0)) != SUBREG)
+ return register_operand (XEXP (op, 0), VOIDmode);
+#if 0 /* Can't do this because of PROMOTE_MODE for unsigned vars. */
+ if (GET_MODE (op) == SImode && GET_CODE (op) == SIGN_EXTEND
+ && GET_MODE (XEXP (op, 0)) == HImode
+ && GET_CODE (XEXP (op, 0)) == REG
+ && REGNO (XEXP (op, 0)) <= LAST_GENERAL_REG)
+ return register_operand (XEXP (op, 0), VOIDmode);
+#endif
+ if (GET_MODE_CLASS (GET_MODE (op)) == MODE_VECTOR_INT
+ && GET_CODE (op) == SUBREG
+ && GET_MODE (SUBREG_REG (op)) == DImode
+ && GET_CODE (SUBREG_REG (op)) == SIGN_EXTEND
+ && GET_MODE (XEXP (SUBREG_REG (op), 0)) == SImode
+ && GET_CODE (XEXP (SUBREG_REG (op), 0)) != SUBREG)
+ return register_operand (XEXP (SUBREG_REG (op), 0), VOIDmode);
+ return 0;
+})
+
+;; Returns 1 if OP is a valid source operand for a compare insn.
+
+(define_predicate "arith_reg_or_0_operand"
+ (match_code "subreg,reg,const_int,const_vector")
+{
+ if (arith_reg_operand (op, mode))
+ return 1;
+
+ if (EXTRA_CONSTRAINT_Z (op))
+ return 1;
+
+ return 0;
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "binary_float_operator"
+ (match_code "plus,minus,mult,div")
+{
+ if (GET_MODE (op) != mode)
+ return 0;
+ switch (GET_CODE (op))
+ {
+ case PLUS:
+ case MINUS:
+ case MULT:
+ case DIV:
+ return 1;
+ default:
+ break;
+ }
+ return 0;
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "binary_logical_operator"
+ (match_code "and,ior,xor")
+{
+ if (GET_MODE (op) != mode)
+ return 0;
+ switch (GET_CODE (op))
+ {
+ case IOR:
+ case AND:
+ case XOR:
+ return 1;
+ default:
+ break;
+ }
+ return 0;
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "cache_address_operand"
+ (match_code "plus,reg")
+{
+ if (GET_CODE (op) == PLUS)
+ {
+ if (GET_CODE (XEXP (op, 0)) != REG)
+ return 0;
+ if (GET_CODE (XEXP (op, 1)) != CONST_INT
+ || (INTVAL (XEXP (op, 1)) & 31))
+ return 0;
+ }
+ else if (GET_CODE (op) != REG)
+ return 0;
+ return address_operand (op, mode);
+})
+
+;; Return 1 if OP is a valid source operand for shmedia cmpgt / cmpgtu.
+
+(define_predicate "cmp_operand"
+ (match_code "subreg,reg,const_int")
+{
+ if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_N (INTVAL (op)))
+ return 1;
+ if (TARGET_SHMEDIA
+ && mode != DImode && GET_CODE (op) == SUBREG
+ && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4)
+ return 0;
+ return arith_reg_operand (op, mode);
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "cmpsi_operand"
+ (match_code "subreg,reg,const_int")
+{
+ if (GET_CODE (op) == REG && REGNO (op) == T_REG
+ && GET_MODE (op) == SImode
+ && TARGET_SH1)
+ return 1;
+ return arith_operand (op, mode);
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "commutative_float_operator"
+ (match_code "plus,mult")
+{
+ if (GET_MODE (op) != mode)
+ return 0;
+ switch (GET_CODE (op))
+ {
+ case PLUS:
+ case MULT:
+ return 1;
+ default:
+ break;
+ }
+ return 0;
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "equality_comparison_operator"
+ (match_code "eq,ne")
+{
+ return ((mode == VOIDmode || GET_MODE (op) == mode)
+ && (GET_CODE (op) == EQ || GET_CODE (op) == NE));
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "extend_reg_operand"
+ (match_code "subreg,reg,truncate")
+{
+ return (GET_CODE (op) == TRUNCATE
+ ? arith_operand
+ : arith_reg_operand) (op, mode);
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "extend_reg_or_0_operand"
+ (match_code "subreg,reg,truncate,const_int")
+{
+ return (GET_CODE (op) == TRUNCATE
+ ? arith_operand
+ : arith_reg_or_0_operand) (op, mode);
+})
+
+;; Like arith_reg_operand, but this predicate does not accept SIGN_EXTEND.
+
+(define_predicate "ext_dest_operand"
+ (match_code "subreg,reg")
+{
+ return arith_reg_operand (op, mode);
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "fp_arith_reg_dest"
+ (match_code "subreg,reg")
+{
+ if (mode == DImode && GET_CODE (op) == SUBREG
+ && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) < 8)
+ return 0;
+ return fp_arith_reg_operand (op, mode);
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "fp_arith_reg_operand"
+ (match_code "subreg,reg")
+{
+ if (register_operand (op, mode))
+ {
+ int regno;
+
+ if (GET_CODE (op) == REG)
+ regno = REGNO (op);
+ else if (GET_CODE (op) == SUBREG && GET_CODE (SUBREG_REG (op)) == REG)
+ regno = REGNO (SUBREG_REG (op));
+ else
+ return 1;
+
+ return (regno >= FIRST_PSEUDO_REGISTER
+ || FP_REGISTER_P (regno));
+ }
+ return 0;
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "fpscr_operand"
+ (match_code "reg")
+{
+ return (GET_CODE (op) == REG
+ && (REGNO (op) == FPSCR_REG
+ || (REGNO (op) >= FIRST_PSEUDO_REGISTER
+ && !(reload_in_progress || reload_completed)))
+ && GET_MODE (op) == PSImode);
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "fpul_operand"
+ (match_code "reg")
+{
+ if (TARGET_SHMEDIA)
+ return fp_arith_reg_operand (op, mode);
+
+ return (GET_CODE (op) == REG
+ && (REGNO (op) == FPUL_REG || REGNO (op) >= FIRST_PSEUDO_REGISTER)
+ && GET_MODE (op) == mode);
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "general_extend_operand"
+ (match_code "subreg,reg,mem,truncate")
+{
+ return (GET_CODE (op) == TRUNCATE
+ ? arith_operand
+ : nonimmediate_operand) (op, mode);
+})
+
+;; Returns 1 if OP can be source of a simple move operation. Same as
+;; general_operand, but a LABEL_REF is valid, PRE_DEC is invalid as
+;; are subregs of system registers.
+
+(define_predicate "general_movsrc_operand"
+ (match_code "subreg,reg,const_int,const_double,mem,symbol_ref,label_ref,const,const_vector")
+{
+ if (GET_CODE (op) == MEM)
+ {
+ rtx inside = XEXP (op, 0);
+ if (GET_CODE (inside) == CONST)
+ inside = XEXP (inside, 0);
+
+ if (GET_CODE (inside) == LABEL_REF)
+ return 1;
+
+ if (GET_CODE (inside) == PLUS
+ && GET_CODE (XEXP (inside, 0)) == LABEL_REF
+ && GET_CODE (XEXP (inside, 1)) == CONST_INT)
+ return 1;
+
+ /* Only post inc allowed. */
+ if (GET_CODE (inside) == PRE_DEC)
+ return 0;
+ }
+
+ if ((mode == QImode || mode == HImode)
+ && (GET_CODE (op) == SUBREG
+ && GET_CODE (XEXP (op, 0)) == REG
+ && system_reg_operand (XEXP (op, 0), mode)))
+ return 0;
+
+ if (TARGET_SHMEDIA
+ && (GET_CODE (op) == PARALLEL || GET_CODE (op) == CONST_VECTOR)
+ && sh_rep_vec (op, mode))
+ return 1;
+ if (TARGET_SHMEDIA && 1
+ && GET_CODE (op) == SUBREG && GET_MODE (op) == mode
+ && SUBREG_REG (op) == const0_rtx && subreg_lowpart_p (op))
+ /* FIXME */ abort (); /* return 1; */
+ return general_operand (op, mode);
+})
+
+;; Returns 1 if OP can be a destination of a move. Same as
+;; general_operand, but no preinc allowed.
+
+(define_predicate "general_movdst_operand"
+ (match_code "subreg,reg,mem")
+{
+ /* Only pre dec allowed. */
+ if (GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == POST_INC)
+ return 0;
+ if (mode == DImode && TARGET_SHMEDIA && GET_CODE (op) == SUBREG
+ && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) < 8
+ && ! (high_life_started || reload_completed))
+ return 0;
+
+ return general_operand (op, mode);
+})
+
+;; Returns 1 if OP is a MEM that can be source of a simple move operation.
+
+(define_predicate "unaligned_load_operand"
+ (match_code "mem")
+{
+ rtx inside;
+
+ if (GET_CODE (op) != MEM || GET_MODE (op) != mode)
+ return 0;
+
+ inside = XEXP (op, 0);
+
+ if (GET_CODE (inside) == POST_INC)
+ inside = XEXP (inside, 0);
+
+ if (GET_CODE (inside) == REG)
+ return 1;
+
+ return 0;
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "greater_comparison_operator"
+ (match_code "gt,ge,gtu,geu")
+{
+ if (mode != VOIDmode && GET_MODE (op) != mode)
+ return 0;
+ switch (GET_CODE (op))
+ {
+ case GT:
+ case GE:
+ case GTU:
+ case GEU:
+ return 1;
+ default:
+ return 0;
+ }
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "inqhi_operand"
+ (match_code "truncate")
+{
+ if (GET_CODE (op) != TRUNCATE || mode != GET_MODE (op))
+ return 0;
+ op = XEXP (op, 0);
+ /* Can't use true_regnum here because copy_cost wants to know about
+ SECONDARY_INPUT_RELOAD_CLASS. */
+ return GET_CODE (op) == REG && FP_REGISTER_P (REGNO (op));
+})
+
+;; TODO: Add a comment here.
+
+(define_special_predicate "int_gpr_dest"
+ (match_code "subreg,reg")
+{
+ enum machine_mode op_mode = GET_MODE (op);
+
+ if (GET_MODE_CLASS (op_mode) != MODE_INT
+ || GET_MODE_SIZE (op_mode) >= UNITS_PER_WORD)
+ return 0;
+ if (! reload_completed)
+ return 0;
+ return true_regnum (op) <= LAST_GENERAL_REG;
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "less_comparison_operator"
+ (match_code "lt,le,ltu,leu")
+{
+ if (mode != VOIDmode && GET_MODE (op) != mode)
+ return 0;
+ switch (GET_CODE (op))
+ {
+ case LT:
+ case LE:
+ case LTU:
+ case LEU:
+ return 1;
+ default:
+ return 0;
+ }
+})
+
+;; Returns 1 if OP is a valid source operand for a logical operation.
+
+(define_predicate "logical_operand"
+ (match_code "subreg,reg,const_int")
+{
+ if (TARGET_SHMEDIA
+ && mode != DImode && GET_CODE (op) == SUBREG
+ && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4)
+ return 0;
+
+ if (arith_reg_operand (op, mode))
+ return 1;
+
+ if (TARGET_SHMEDIA)
+ {
+ if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_I10 (INTVAL (op)))
+ return 1;
+ else
+ return 0;
+ }
+ else if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_K08 (INTVAL (op)))
+ return 1;
+
+ return 0;
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "logical_operator"
+ (match_code "and,ior,xor")
+{
+ if (mode != VOIDmode && GET_MODE (op) != mode)
+ return 0;
+ switch (GET_CODE (op))
+ {
+ case AND:
+ case IOR:
+ case XOR:
+ return 1;
+ default:
+ return 0;
+ }
+})
+
+;; Like arith_reg_operand, but for register source operands of narrow
+;; logical SHMEDIA operations: forbid subregs of DImode / TImode regs.
+
+(define_predicate "logical_reg_operand"
+ (match_code "subreg,reg")
+{
+ if (TARGET_SHMEDIA
+ && GET_CODE (op) == SUBREG
+ && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4
+ && mode != DImode)
+ return 0;
+ return arith_reg_operand (op, mode);
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "mextr_bit_offset"
+ (match_code "const_int")
+{
+ HOST_WIDE_INT i;
+
+ if (GET_CODE (op) != CONST_INT)
+ return 0;
+ i = INTVAL (op);
+ return i >= 1 * 8 && i <= 7 * 8 && (i & 7) == 0;
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "minuend_operand"
+ (match_code "subreg,reg,truncate,const_int")
+{
+ return op == constm1_rtx || extend_reg_or_0_operand (op, mode);
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "noncommutative_float_operator"
+ (match_code "minus,div")
+{
+ if (GET_MODE (op) != mode)
+ return 0;
+ switch (GET_CODE (op))
+ {
+ case MINUS:
+ case DIV:
+ return 1;
+ default:
+ break;
+ }
+ return 0;
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "sh_const_vec"
+ (match_code "const_vector")
+{
+ int i;
+
+ if (GET_CODE (op) != CONST_VECTOR
+ || (GET_MODE (op) != mode && mode != VOIDmode))
+ return 0;
+ i = XVECLEN (op, 0) - 1;
+ for (; i >= 0; i--)
+ if (GET_CODE (XVECEXP (op, 0, i)) != CONST_INT)
+ return 0;
+ return 1;
+})
+
+;; Determine if OP is a constant vector matching MODE with only one
+;; element that is not a sign extension. Two byte-sized elements
+;; count as one.
+
+(define_predicate "sh_1el_vec"
+ (match_code "const_vector")
+{
+ int unit_size;
+ int i, last, least, sign_ix;
+ rtx sign;
+
+ if (GET_CODE (op) != CONST_VECTOR
+ || (GET_MODE (op) != mode && mode != VOIDmode))
+ return 0;
+ /* Determine numbers of last and of least significant elements. */
+ last = XVECLEN (op, 0) - 1;
+ least = TARGET_LITTLE_ENDIAN ? 0 : last;
+ if (GET_CODE (XVECEXP (op, 0, least)) != CONST_INT)
+ return 0;
+ sign_ix = least;
+ if (GET_MODE_UNIT_SIZE (mode) == 1)
+ sign_ix = TARGET_LITTLE_ENDIAN ? 1 : last - 1;
+ if (GET_CODE (XVECEXP (op, 0, sign_ix)) != CONST_INT)
+ return 0;
+ unit_size = GET_MODE_UNIT_SIZE (GET_MODE (op));
+ sign = (INTVAL (XVECEXP (op, 0, sign_ix)) >> (unit_size * BITS_PER_UNIT - 1)
+ ? constm1_rtx : const0_rtx);
+ i = XVECLEN (op, 0) - 1;
+ do
+ if (i != least && i != sign_ix && XVECEXP (op, 0, i) != sign)
+ return 0;
+ while (--i);
+ return 1;
+})
+
+;; Like register_operand, but take into account that SHMEDIA can use
+;; the constant zero like a general register.
+
+(define_predicate "sh_register_operand"
+ (match_code "reg,subreg,const_int")
+{
+ if (op == CONST0_RTX (mode) && TARGET_SHMEDIA)
+ return 1;
+ return register_operand (op, mode);
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "sh_rep_vec"
+ (match_code "const_vector")
+{
+ int i;
+ rtx x, y;
+
+ if ((GET_CODE (op) != CONST_VECTOR && GET_CODE (op) != PARALLEL)
+ || (GET_MODE (op) != mode && mode != VOIDmode))
+ return 0;
+ i = XVECLEN (op, 0) - 2;
+ x = XVECEXP (op, 0, i + 1);
+ if (GET_MODE_UNIT_SIZE (mode) == 1)
+ {
+ y = XVECEXP (op, 0, i);
+ for (i -= 2; i >= 0; i -= 2)
+ if (! rtx_equal_p (XVECEXP (op, 0, i + 1), x)
+ || ! rtx_equal_p (XVECEXP (op, 0, i), y))
+ return 0;
+ }
+ else
+ for (; i >= 0; i--)
+ if (XVECEXP (op, 0, i) != x)
+ return 0;
+ return 1;
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "shift_count_operand"
+ (match_code "const_int,const_double,const,symbol_ref,label_ref,subreg,reg,zero_extend,sign_extend")
+{
+ return (CONSTANT_P (op)
+ ? (GET_CODE (op) == CONST_INT
+ ? (unsigned) INTVAL (op) < GET_MODE_BITSIZE (mode)
+ : nonmemory_operand (op, mode))
+ : shift_count_reg_operand (op, mode));
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "shift_count_reg_operand"
+ (match_code "subreg,reg,zero_extend,sign_extend")
+{
+ if ((GET_CODE (op) == ZERO_EXTEND || GET_CODE (op) == SIGN_EXTEND
+ || (GET_CODE (op) == SUBREG && SUBREG_BYTE (op) == 0))
+ && (mode == VOIDmode || mode == GET_MODE (op))
+ && GET_MODE_BITSIZE (GET_MODE (XEXP (op, 0))) >= 6
+ && GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_INT)
+ {
+ mode = VOIDmode;
+ do
+ op = XEXP (op, 0);
+ while ((GET_CODE (op) == ZERO_EXTEND || GET_CODE (op) == SIGN_EXTEND
+ || GET_CODE (op) == TRUNCATE)
+ && GET_MODE_BITSIZE (GET_MODE (XEXP (op, 0))) >= 6
+ && GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_INT);
+
+ }
+ return arith_reg_operand (op, mode);
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "shift_operator"
+ (match_code "ashift,ashiftrt,lshiftrt")
+{
+ if (mode != VOIDmode && GET_MODE (op) != mode)
+ return 0;
+ switch (GET_CODE (op))
+ {
+ case ASHIFT:
+ case ASHIFTRT:
+ case LSHIFTRT:
+ return 1;
+ default:
+ return 0;
+ }
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "symbol_ref_operand"
+ (match_code "symbol_ref")
+{
+ return (GET_CODE (op) == SYMBOL_REF);
+})
+
+;; Same as target_reg_operand, except that label_refs and symbol_refs
+;; are accepted before reload.
+
+(define_special_predicate "target_operand"
+ (match_code "subreg,reg,label_ref,symbol_ref,const,unspec")
+{
+ if (mode != VOIDmode && mode != Pmode)
+ return 0;
+
+ if ((GET_MODE (op) == Pmode || GET_MODE (op) == VOIDmode)
+ && EXTRA_CONSTRAINT_Csy (op))
+ return ! reload_completed;
+
+ return target_reg_operand (op, mode);
+})
+
+;; Accept pseudos and branch target registers.
+
+(define_special_predicate "target_reg_operand"
+ (match_code "subreg,reg")
+{
+ if (mode == VOIDmode
+ ? GET_MODE (op) != Pmode && GET_MODE (op) != PDImode
+ : mode != GET_MODE (op))
+ return 0;
+
+ if (GET_CODE (op) == SUBREG)
+ op = XEXP (op, 0);
+
+ if (GET_CODE (op) != REG)
+ return 0;
+
+ /* We must protect ourselves from matching pseudos that are virtual
+ register, because they will eventually be replaced with hardware
+ registers that aren't branch-target registers. */
+ if (REGNO (op) > LAST_VIRTUAL_REGISTER
+ || TARGET_REGISTER_P (REGNO (op)))
+ return 1;
+
+ return 0;
+})
+
+;; TODO: Add a comment here.
+
+(define_special_predicate "trunc_hi_operand"
+ (match_code "subreg,reg,truncate")
+{
+ enum machine_mode op_mode = GET_MODE (op);
+
+ if (op_mode != SImode && op_mode != DImode
+ && op_mode != V4HImode && op_mode != V2SImode)
+ return 0;
+ return extend_reg_operand (op, mode);
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "ua_address_operand"
+ (match_code "subreg,reg,plus")
+{
+ if (GET_CODE (op) == PLUS
+ && (GET_CODE (XEXP (op, 1)) != CONST_INT
+ || ! CONST_OK_FOR_I06 (INTVAL (XEXP (op, 1)))))
+ return 0;
+ return address_operand (op, QImode);
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "ua_offset"
+ (match_code "const_int")
+{
+ return GET_CODE (op) == CONST_INT && CONST_OK_FOR_I06 (INTVAL (op));
+})
+
+;; TODO: Add a comment here.
+
+(define_predicate "unary_float_operator"
+ (match_code "abs,neg,sqrt")
+{
+ if (GET_MODE (op) != mode)
+ return 0;
+ switch (GET_CODE (op))
+ {
+ case ABS:
+ case NEG:
+ case SQRT:
+ return 1;
+ default:
+ break;
+ }
+ return 0;
+})
+
+;; Return 1 if OP is a valid source operand for xor.
+
+(define_predicate "xor_operand"
+ (match_code "subreg,reg,const_int")
+{
+ if (GET_CODE (op) == CONST_INT)
+ return (TARGET_SHMEDIA
+ ? (CONST_OK_FOR_I06 (INTVAL (op))
+ || (no_new_pseudos && INTVAL (op) == 0xff))
+ : CONST_OK_FOR_K08 (INTVAL (op)));
+ if (TARGET_SHMEDIA
+ && mode != DImode && GET_CODE (op) == SUBREG
+ && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4)
+ return 0;
+ return arith_reg_operand (op, mode);
+})
diff --git a/gcc/config/sh/sh-protos.h b/gcc/config/sh/sh-protos.h
index d3644d87805..dd9d5c29540 100644
--- a/gcc/config/sh/sh-protos.h
+++ b/gcc/config/sh/sh-protos.h
@@ -159,7 +159,6 @@ extern rtx sh_function_arg (CUMULATIVE_ARGS *, enum machine_mode, tree, int);
extern void sh_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode, tree, int);
extern int sh_pass_in_reg_p (CUMULATIVE_ARGS *, enum machine_mode, tree);
extern void sh_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree, signed int, enum machine_mode);
-extern const char *sh_pch_valid_p (const void *data_p, size_t sz);
extern bool sh_promote_prototypes (tree);
extern rtx replace_n_hard_rtx (rtx, rtx *, int , int);
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index a0b7862299f..91fa5e9ce52 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -228,6 +228,7 @@ static tree sh_handle_trap_exit_attribute (tree *, tree, tree, int, bool *);
static tree sh_handle_renesas_attribute (tree *, tree, tree, int, bool *);
static void sh_output_function_epilogue (FILE *, HOST_WIDE_INT);
static void sh_insert_attributes (tree, tree *);
+static const char *sh_check_pch_target_flags (int);
static int sh_adjust_cost (rtx, rtx, rtx, int);
static int sh_issue_rate (void);
static int sh_dfa_new_cycle (FILE *, int, rtx, int, int, int *sort_p);
@@ -467,8 +468,8 @@ static int hard_regs_intersect_p (HARD_REG_SET *, HARD_REG_SET *);
#undef TARGET_VECTOR_MODE_SUPPORTED_P
#define TARGET_VECTOR_MODE_SUPPORTED_P sh_vector_mode_supported_p
-#undef TARGET_PCH_VALID_P
-#define TARGET_PCH_VALID_P sh_pch_valid_p
+#undef TARGET_CHECK_PCH_TARGET_FLAGS
+#define TARGET_CHECK_PCH_TARGET_FLAGS sh_check_pch_target_flags
#undef TARGET_DWARF_CALLING_CONVENTION
#define TARGET_DWARF_CALLING_CONVENTION sh_dwarf_calling_convention
@@ -1964,8 +1965,8 @@ addsubcosts (rtx x)
static inline int
multcosts (rtx x ATTRIBUTE_UNUSED)
{
- if (*sh_multcost_str)
- return atoi (sh_multcost_str);
+ if (sh_multcost >= 0)
+ return sh_multcost;
if (TARGET_SHMEDIA)
/* ??? We have a mul insn, but it has a latency of three, and doesn't
accept constants. Ideally, we would use a cost of one or two and
@@ -2909,7 +2910,7 @@ gen_datalabel_ref (rtx sym)
/* The SH cannot load a large constant into a register, constants have to
come from a pc relative load. The reference of a pc relative load
- instruction must be less than 1k infront of the instruction. This
+ instruction must be less than 1k in front of the instruction. This
means that we often have to dump a constant inside a function, and
generate code to branch around it.
@@ -7393,7 +7394,7 @@ sh_handle_interrupt_handler_attribute (tree *node, tree name,
{
if (TREE_CODE (*node) != FUNCTION_DECL)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -7414,21 +7415,21 @@ sh_handle_sp_switch_attribute (tree *node, tree name, tree args,
{
if (TREE_CODE (*node) != FUNCTION_DECL)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
else if (!pragma_interrupt)
{
/* The sp_switch attribute only has meaning for interrupt functions. */
- warning (0, "%qs attribute only applies to interrupt functions",
- IDENTIFIER_POINTER (name));
+ warning (OPT_Wattributes, "%qs attribute only applies to "
+ "interrupt functions", IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
else if (TREE_CODE (TREE_VALUE (args)) != STRING_CST)
{
/* The argument must be a constant string. */
- warning (0, "%qs attribute argument not a string constant",
+ warning (OPT_Wattributes, "%qs attribute argument not a string constant",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -7449,22 +7450,22 @@ sh_handle_trap_exit_attribute (tree *node, tree name, tree args,
{
if (TREE_CODE (*node) != FUNCTION_DECL)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
else if (!pragma_interrupt)
{
/* The trap_exit attribute only has meaning for interrupt functions. */
- warning (0, "%qs attribute only applies to interrupt functions",
- IDENTIFIER_POINTER (name));
+ warning (OPT_Wattributes, "%qs attribute only applies to "
+ "interrupt functions", IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
else if (TREE_CODE (TREE_VALUE (args)) != INTEGER_CST)
{
/* The argument must be a constant integer. */
- warning (0, "%qs attribute argument not an integer constant",
- IDENTIFIER_POINTER (name));
+ warning (OPT_Wattributes, "%qs attribute argument not an "
+ "integer constant", IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
else
@@ -7515,36 +7516,11 @@ sh_cfun_interrupt_handler_p (void)
!= NULL_TREE);
}
-/* Like default_pch_valid_p, but only check certain target_flags. */
-const char *
-sh_pch_valid_p (const void *data_p, size_t len)
-{
-#ifdef TARGET_OPTIONS
- /* ??? We have a copy of this in toplev.c, but it is static. */
- static const struct
- {
- const char *const prefix;
- const char **const variable;
- const char *const description;
- const char *const value;
- }
- target_options[] = TARGET_OPTIONS;
-#endif
-
- const char *data = (const char *)data_p;
- const char *flag_that_differs = NULL;
- size_t i;
- int old_flags;
+/* Implement TARGET_CHECK_PCH_TARGET_FLAGS. */
- /* -fpic and -fpie also usually make a PCH invalid. */
- if (data[0] != flag_pic)
- return _("created and used with different settings of -fpic");
- if (data[1] != flag_pie)
- return _("created and used with different settings of -fpie");
- data += 2;
-
- /* Check target_flags. */
- memcpy (&old_flags, data, sizeof (target_flags));
+static const char *
+sh_check_pch_target_flags (int old_flags)
+{
if ((old_flags ^ target_flags) & (MASK_SH1 | MASK_SH2 | MASK_SH3
| MASK_SH_E | MASK_HARD_SH4
| MASK_FPU_SINGLE | MASK_SH4))
@@ -7553,40 +7529,7 @@ sh_pch_valid_p (const void *data_p, size_t len)
return _("created and used with different ABIs");
if ((old_flags ^ target_flags) & MASK_LITTLE_ENDIAN)
return _("created and used with different endianness");
-
- data += sizeof (target_flags);
- len -= sizeof (target_flags);
-
- /* Check string options. */
-#ifdef TARGET_OPTIONS
- for (i = 0; i < ARRAY_SIZE (target_options); i++)
- {
- const char *str = *target_options[i].variable;
- size_t l;
- if (! str)
- str = "";
- l = strlen (str) + 1;
- if (len < l || memcmp (data, str, l) != 0)
- {
- flag_that_differs = target_options[i].prefix;
- goto make_message;
- }
- data += l;
- len -= l;
- }
-#endif
-
return NULL;
-
- make_message:
- {
- char *r;
- asprintf (&r, _("created and used with differing settings of '-m%s'"),
- flag_that_differs);
- if (r == NULL)
- return _("out of memory");
- return r;
- }
}
/* Predicates used by the templates. */
@@ -7607,301 +7550,6 @@ system_reg_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
return 0;
}
-/* Returns 1 if OP can be source of a simple move operation.
- Same as general_operand, but a LABEL_REF is valid, PRE_DEC is
- invalid as are subregs of system registers. */
-
-int
-general_movsrc_operand (rtx op, enum machine_mode mode)
-{
- if (GET_CODE (op) == MEM)
- {
- rtx inside = XEXP (op, 0);
- if (GET_CODE (inside) == CONST)
- inside = XEXP (inside, 0);
-
- if (GET_CODE (inside) == LABEL_REF)
- return 1;
-
- if (GET_CODE (inside) == PLUS
- && GET_CODE (XEXP (inside, 0)) == LABEL_REF
- && GET_CODE (XEXP (inside, 1)) == CONST_INT)
- return 1;
-
- /* Only post inc allowed. */
- if (GET_CODE (inside) == PRE_DEC)
- return 0;
- }
-
- if ((mode == QImode || mode == HImode)
- && (GET_CODE (op) == SUBREG
- && GET_CODE (XEXP (op, 0)) == REG
- && system_reg_operand (XEXP (op, 0), mode)))
- return 0;
-
- if (TARGET_SHMEDIA
- && (GET_CODE (op) == PARALLEL || GET_CODE (op) == CONST_VECTOR)
- && sh_rep_vec (op, mode))
- return 1;
- if (TARGET_SHMEDIA && 1
- && GET_CODE (op) == SUBREG && GET_MODE (op) == mode
- && SUBREG_REG (op) == const0_rtx && subreg_lowpart_p (op))
- /* FIXME */ abort (); /* return 1; */
- return general_operand (op, mode);
-}
-
-/* Returns 1 if OP can be a destination of a move.
- Same as general_operand, but no preinc allowed. */
-
-int
-general_movdst_operand (rtx op, enum machine_mode mode)
-{
- /* Only pre dec allowed. */
- if (GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == POST_INC)
- return 0;
- if (mode == DImode && TARGET_SHMEDIA && GET_CODE (op) == SUBREG
- && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) < 8
- && ! (high_life_started || reload_completed))
- return 0;
-
- return general_operand (op, mode);
-}
-
-/* Returns 1 if OP is a normal arithmetic register. */
-
-int
-arith_reg_operand (rtx op, enum machine_mode mode)
-{
- if (register_operand (op, mode))
- {
- int regno;
-
- if (GET_CODE (op) == REG)
- regno = REGNO (op);
- else if (GET_CODE (op) == SUBREG && GET_CODE (SUBREG_REG (op)) == REG)
- regno = REGNO (SUBREG_REG (op));
- else
- return 1;
-
- return (regno != T_REG && regno != PR_REG
- && ! TARGET_REGISTER_P (regno)
- && (regno != FPUL_REG || TARGET_SH4)
- && regno != MACH_REG && regno != MACL_REG);
- }
- /* Allow a no-op sign extension - compare LOAD_EXTEND_OP.
- We allow SImode here, as not using an FP register is just a matter of
- proper register allocation. */
- if (TARGET_SHMEDIA
- && GET_MODE (op) == DImode && GET_CODE (op) == SIGN_EXTEND
- && GET_MODE (XEXP (op, 0)) == SImode
- && GET_CODE (XEXP (op, 0)) != SUBREG)
- return register_operand (XEXP (op, 0), VOIDmode);
-#if 0 /* Can't do this because of PROMOTE_MODE for unsigned vars. */
- if (GET_MODE (op) == SImode && GET_CODE (op) == SIGN_EXTEND
- && GET_MODE (XEXP (op, 0)) == HImode
- && GET_CODE (XEXP (op, 0)) == REG
- && REGNO (XEXP (op, 0)) <= LAST_GENERAL_REG)
- return register_operand (XEXP (op, 0), VOIDmode);
-#endif
- if (GET_MODE_CLASS (GET_MODE (op)) == MODE_VECTOR_INT
- && GET_CODE (op) == SUBREG
- && GET_MODE (SUBREG_REG (op)) == DImode
- && GET_CODE (SUBREG_REG (op)) == SIGN_EXTEND
- && GET_MODE (XEXP (SUBREG_REG (op), 0)) == SImode
- && GET_CODE (XEXP (SUBREG_REG (op), 0)) != SUBREG)
- return register_operand (XEXP (SUBREG_REG (op), 0), VOIDmode);
- return 0;
-}
-
-/* Like above, but for DImode destinations: forbid paradoxical DImode subregs,
- because this would lead to missing sign extensions when truncating from
- DImode to SImode. */
-int
-arith_reg_dest (rtx op, enum machine_mode mode)
-{
- if (mode == DImode && GET_CODE (op) == SUBREG
- && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) < 8
- && TARGET_SHMEDIA)
- return 0;
- return arith_reg_operand (op, mode);
-}
-
-/* Like arith_reg_operand, but for register source operands of narrow
- logical SHMEDIA operations: forbid subregs of DImode / TImode regs. */
-int
-logical_reg_operand (rtx op, enum machine_mode mode)
-{
- if (TARGET_SHMEDIA
- && GET_CODE (op) == SUBREG
- && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4
- && mode != DImode)
- return 0;
- return arith_reg_operand (op, mode);
-}
-
-int
-int_gpr_dest (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
- enum machine_mode op_mode = GET_MODE (op);
-
- if (GET_MODE_CLASS (op_mode) != MODE_INT
- || GET_MODE_SIZE (op_mode) >= UNITS_PER_WORD)
- return 0;
- if (! reload_completed)
- return 0;
- return true_regnum (op) <= LAST_GENERAL_REG;
-}
-
-int
-fp_arith_reg_operand (rtx op, enum machine_mode mode)
-{
- if (register_operand (op, mode))
- {
- int regno;
-
- if (GET_CODE (op) == REG)
- regno = REGNO (op);
- else if (GET_CODE (op) == SUBREG && GET_CODE (SUBREG_REG (op)) == REG)
- regno = REGNO (SUBREG_REG (op));
- else
- return 1;
-
- return (regno >= FIRST_PSEUDO_REGISTER
- || FP_REGISTER_P (regno));
- }
- return 0;
-}
-
-int
-fp_arith_reg_dest (rtx op, enum machine_mode mode)
-{
- if (mode == DImode && GET_CODE (op) == SUBREG
- && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) < 8)
- return 0;
- return fp_arith_reg_operand (op, mode);
-}
-
-/* Returns 1 if OP is a valid source operand for an arithmetic insn. */
-
-int
-arith_operand (rtx op, enum machine_mode mode)
-{
- if (arith_reg_operand (op, mode))
- return 1;
-
- if (TARGET_SHMEDIA)
- {
- /* FIXME: We should be checking whether the CONST_INT fits in a
- CONST_OK_FOR_I16 here, but this causes reload_cse to crash when
- attempting to transform a sequence of two 64-bit sets of the
- same register from literal constants into a set and an add,
- when the difference is too wide for an add. */
- if (GET_CODE (op) == CONST_INT
- || EXTRA_CONSTRAINT_C16 (op))
- return 1;
- else if (GET_CODE (op) == TRUNCATE
- && ! system_reg_operand (XEXP (op, 0), VOIDmode)
- && (mode == VOIDmode || mode == GET_MODE (op))
- && (GET_MODE_SIZE (GET_MODE (op))
- < GET_MODE_SIZE (GET_MODE (XEXP (op, 0))))
- && (! FP_REGISTER_P (REGNO (XEXP (op, 0)))
- || GET_MODE_SIZE (GET_MODE (op)) == 4))
- return register_operand (XEXP (op, 0), VOIDmode);
- else
- return 0;
- }
- else if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_I08 (INTVAL (op)))
- return 1;
-
- return 0;
-}
-
-/* Returns 1 if OP is a valid source operand for a compare insn. */
-
-int
-arith_reg_or_0_operand (rtx op, enum machine_mode mode)
-{
- if (arith_reg_operand (op, mode))
- return 1;
-
- if (EXTRA_CONSTRAINT_Z (op))
- return 1;
-
- return 0;
-}
-
-/* Return 1 if OP is a valid source operand for xor. */
-
-int
-xor_operand (rtx op, enum machine_mode mode)
-{
- if (GET_CODE (op) == CONST_INT)
- return (TARGET_SHMEDIA
- ? (CONST_OK_FOR_I06 (INTVAL (op))
- || (no_new_pseudos && INTVAL (op) == 0xff))
- : CONST_OK_FOR_K08 (INTVAL (op)));
- if (TARGET_SHMEDIA
- && mode != DImode && GET_CODE (op) == SUBREG
- && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4)
- return 0;
- return arith_reg_operand (op, mode);
-}
-
-/* Return 1 if OP is a valid source operand for shmedia cmpgt / cmpgtu. */
-int
-cmp_operand (rtx op, enum machine_mode mode)
-{
- if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_N (INTVAL (op)))
- return 1;
- if (TARGET_SHMEDIA
- && mode != DImode && GET_CODE (op) == SUBREG
- && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4)
- return 0;
- return arith_reg_operand (op, mode);
-}
-
-/* Returns 1 if OP is a valid source operand for a logical operation. */
-
-int
-logical_operand (rtx op, enum machine_mode mode)
-{
- if (TARGET_SHMEDIA
- && mode != DImode && GET_CODE (op) == SUBREG
- && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4)
- return 0;
-
- if (arith_reg_operand (op, mode))
- return 1;
-
- if (TARGET_SHMEDIA)
- {
- if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_I10 (INTVAL (op)))
- return 1;
- else
- return 0;
- }
- else if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_K08 (INTVAL (op)))
- return 1;
-
- return 0;
-}
-
-int
-and_operand (rtx op, enum machine_mode mode)
-{
- if (logical_operand (op, mode))
- return 1;
-
- /* Check mshflo.l / mshflhi.l opportunities. */
- if (TARGET_SHMEDIA
- && mode == DImode
- && GET_CODE (op) == CONST_INT
- && CONST_OK_FOR_J16 (INTVAL (op)))
- return 1;
-
- return 0;
-}
-
/* Nonzero if OP is a floating point value with value 0.0. */
int
@@ -7950,33 +7598,6 @@ tertiary_reload_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
return code == MEM || (TARGET_SH4 && code == CONST_DOUBLE);
}
-int
-fpscr_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
- return (GET_CODE (op) == REG
- && (REGNO (op) == FPSCR_REG
- || (REGNO (op) >= FIRST_PSEUDO_REGISTER
- && !(reload_in_progress || reload_completed)))
- && GET_MODE (op) == PSImode);
-}
-
-int
-fpul_operand (rtx op, enum machine_mode mode)
-{
- if (TARGET_SHMEDIA)
- return fp_arith_reg_operand (op, mode);
-
- return (GET_CODE (op) == REG
- && (REGNO (op) == FPUL_REG || REGNO (op) >= FIRST_PSEUDO_REGISTER)
- && GET_MODE (op) == mode);
-}
-
-int
-symbol_ref_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
- return (GET_CODE (op) == SYMBOL_REF);
-}
-
/* Return the TLS type for TLS symbols, 0 for otherwise. */
int
tls_symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
@@ -7985,366 +7606,6 @@ tls_symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
return 0;
return SYMBOL_REF_TLS_MODEL (op);
}
-
-int
-commutative_float_operator (rtx op, enum machine_mode mode)
-{
- if (GET_MODE (op) != mode)
- return 0;
- switch (GET_CODE (op))
- {
- case PLUS:
- case MULT:
- return 1;
- default:
- break;
- }
- return 0;
-}
-
-int
-noncommutative_float_operator (rtx op, enum machine_mode mode)
-{
- if (GET_MODE (op) != mode)
- return 0;
- switch (GET_CODE (op))
- {
- case MINUS:
- case DIV:
- return 1;
- default:
- break;
- }
- return 0;
-}
-
-int
-unary_float_operator (rtx op, enum machine_mode mode)
-{
- if (GET_MODE (op) != mode)
- return 0;
- switch (GET_CODE (op))
- {
- case ABS:
- case NEG:
- case SQRT:
- return 1;
- default:
- break;
- }
- return 0;
-}
-
-int
-binary_float_operator (rtx op, enum machine_mode mode)
-{
- if (GET_MODE (op) != mode)
- return 0;
- switch (GET_CODE (op))
- {
- case PLUS:
- case MINUS:
- case MULT:
- case DIV:
- return 1;
- default:
- break;
- }
- return 0;
-}
-
-int
-binary_logical_operator (rtx op, enum machine_mode mode)
-{
- if (GET_MODE (op) != mode)
- return 0;
- switch (GET_CODE (op))
- {
- case IOR:
- case AND:
- case XOR:
- return 1;
- default:
- break;
- }
- return 0;
-}
-
-int
-equality_comparison_operator (rtx op, enum machine_mode mode)
-{
- return ((mode == VOIDmode || GET_MODE (op) == mode)
- && (GET_CODE (op) == EQ || GET_CODE (op) == NE));
-}
-
-int
-greater_comparison_operator (rtx op, enum machine_mode mode)
-{
- if (mode != VOIDmode && GET_MODE (op) != mode)
- return 0;
- switch (GET_CODE (op))
- {
- case GT:
- case GE:
- case GTU:
- case GEU:
- return 1;
- default:
- return 0;
- }
-}
-
-int
-less_comparison_operator (rtx op, enum machine_mode mode)
-{
- if (mode != VOIDmode && GET_MODE (op) != mode)
- return 0;
- switch (GET_CODE (op))
- {
- case LT:
- case LE:
- case LTU:
- case LEU:
- return 1;
- default:
- return 0;
- }
-}
-
-int
-shift_operator (rtx op, enum machine_mode mode)
-{
- if (mode != VOIDmode && GET_MODE (op) != mode)
- return 0;
- switch (GET_CODE (op))
- {
- case ASHIFT:
- case ASHIFTRT:
- case LSHIFTRT:
- return 1;
- default:
- return 0;
- }
-}
-
-int
-logical_operator (rtx op, enum machine_mode mode)
-{
- if (mode != VOIDmode && GET_MODE (op) != mode)
- return 0;
- switch (GET_CODE (op))
- {
- case AND:
- case IOR:
- case XOR:
- return 1;
- default:
- return 0;
- }
-}
-
-/* Accept pseudos and branch target registers. */
-int
-target_reg_operand (rtx op, enum machine_mode mode)
-{
- if (mode == VOIDmode
- ? GET_MODE (op) != Pmode && GET_MODE (op) != PDImode
- : mode != GET_MODE (op))
- return 0;
-
- if (GET_CODE (op) == SUBREG)
- op = XEXP (op, 0);
-
- if (GET_CODE (op) != REG)
- return 0;
-
- /* We must protect ourselves from matching pseudos that are virtual
- register, because they will eventually be replaced with hardware
- registers that aren't branch-target registers. */
- if (REGNO (op) > LAST_VIRTUAL_REGISTER
- || TARGET_REGISTER_P (REGNO (op)))
- return 1;
-
- return 0;
-}
-
-/* Same as target_reg_operand, except that label_refs and symbol_refs
- are accepted before reload. */
-int
-target_operand (rtx op, enum machine_mode mode)
-{
- if (mode != VOIDmode && mode != Pmode)
- return 0;
-
- if ((GET_MODE (op) == Pmode || GET_MODE (op) == VOIDmode)
- && EXTRA_CONSTRAINT_Csy (op))
- return ! reload_completed;
-
- return target_reg_operand (op, mode);
-}
-
-int
-mextr_bit_offset (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
- HOST_WIDE_INT i;
-
- if (GET_CODE (op) != CONST_INT)
- return 0;
- i = INTVAL (op);
- return i >= 1 * 8 && i <= 7 * 8 && (i & 7) == 0;
-}
-
-int
-extend_reg_operand (rtx op, enum machine_mode mode)
-{
- return (GET_CODE (op) == TRUNCATE
- ? arith_operand
- : arith_reg_operand) (op, mode);
-}
-
-int
-trunc_hi_operand (rtx op, enum machine_mode mode)
-{
- enum machine_mode op_mode = GET_MODE (op);
-
- if (op_mode != SImode && op_mode != DImode
- && op_mode != V4HImode && op_mode != V2SImode)
- return 0;
- return extend_reg_operand (op, mode);
-}
-
-int
-extend_reg_or_0_operand (rtx op, enum machine_mode mode)
-{
- return (GET_CODE (op) == TRUNCATE
- ? arith_operand
- : arith_reg_or_0_operand) (op, mode);
-}
-
-int
-minuend_operand (rtx op, enum machine_mode mode)
-{
- return op == constm1_rtx || extend_reg_or_0_operand (op, mode);
-}
-
-int
-general_extend_operand (rtx op, enum machine_mode mode)
-{
- return (GET_CODE (op) == TRUNCATE
- ? arith_operand
- : nonimmediate_operand) (op, mode);
-}
-
-int
-ua_address_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
- if (GET_CODE (op) == PLUS
- && (GET_CODE (XEXP (op, 1)) != CONST_INT
- || ! CONST_OK_FOR_I06 (INTVAL (XEXP (op, 1)))))
- return 0;
- return address_operand (op, QImode);
-}
-
-int
-cache_address_operand (rtx op, enum machine_mode mode)
-{
- if (GET_CODE (op) == PLUS)
- {
- if (GET_CODE (XEXP (op, 0)) != REG)
- return 0;
- if (GET_CODE (XEXP (op, 1)) != CONST_INT
- || (INTVAL (XEXP (op, 1)) & 31))
- return 0;
- }
- else if (GET_CODE (op) != REG)
- return 0;
- return address_operand (op, mode);
-}
-
-int
-inqhi_operand (rtx op, enum machine_mode mode)
-{
- if (GET_CODE (op) != TRUNCATE || mode != GET_MODE (op))
- return 0;
- op = XEXP (op, 0);
- /* Can't use true_regnum here because copy_cost wants to know about
- SECONDARY_INPUT_RELOAD_CLASS. */
- return GET_CODE (op) == REG && FP_REGISTER_P (REGNO (op));
-}
-
-int
-sh_rep_vec (rtx v, enum machine_mode mode)
-{
- int i;
- rtx x, y;
-
- if ((GET_CODE (v) != CONST_VECTOR && GET_CODE (v) != PARALLEL)
- || (GET_MODE (v) != mode && mode != VOIDmode))
- return 0;
- i = XVECLEN (v, 0) - 2;
- x = XVECEXP (v, 0, i + 1);
- if (GET_MODE_UNIT_SIZE (mode) == 1)
- {
- y = XVECEXP (v, 0, i);
- for (i -= 2; i >= 0; i -= 2)
- if (! rtx_equal_p (XVECEXP (v, 0, i + 1), x)
- || ! rtx_equal_p (XVECEXP (v, 0, i), y))
- return 0;
- }
- else
- for (; i >= 0; i--)
- if (XVECEXP (v, 0, i) != x)
- return 0;
- return 1;
-}
-
-/* Determine if V is a constant vector matching MODE with only one element
- that is not a sign extension. Two byte-sized elements count as one. */
-int
-sh_1el_vec (rtx v, enum machine_mode mode)
-{
- int unit_size;
- int i, last, least, sign_ix;
- rtx sign;
-
- if (GET_CODE (v) != CONST_VECTOR
- || (GET_MODE (v) != mode && mode != VOIDmode))
- return 0;
- /* Determine numbers of last and of least significant elements. */
- last = XVECLEN (v, 0) - 1;
- least = TARGET_LITTLE_ENDIAN ? 0 : last;
- if (GET_CODE (XVECEXP (v, 0, least)) != CONST_INT)
- return 0;
- sign_ix = least;
- if (GET_MODE_UNIT_SIZE (mode) == 1)
- sign_ix = TARGET_LITTLE_ENDIAN ? 1 : last - 1;
- if (GET_CODE (XVECEXP (v, 0, sign_ix)) != CONST_INT)
- return 0;
- unit_size = GET_MODE_UNIT_SIZE (GET_MODE (v));
- sign = (INTVAL (XVECEXP (v, 0, sign_ix)) >> (unit_size * BITS_PER_UNIT - 1)
- ? constm1_rtx : const0_rtx);
- i = XVECLEN (v, 0) - 1;
- do
- if (i != least && i != sign_ix && XVECEXP (v, 0, i) != sign)
- return 0;
- while (--i);
- return 1;
-}
-
-int
-sh_const_vec (rtx v, enum machine_mode mode)
-{
- int i;
-
- if (GET_CODE (v) != CONST_VECTOR
- || (GET_MODE (v) != mode && mode != VOIDmode))
- return 0;
- i = XVECLEN (v, 0) - 1;
- for (; i >= 0; i--)
- if (GET_CODE (XVECEXP (v, 0, i)) != CONST_INT)
- return 0;
- return 1;
-}
/* Return the destination address of a branch. */
@@ -8856,12 +8117,6 @@ mark_constant_pool_use (rtx x)
return lab;
}
-
-int
-ua_offset (rtx c, enum machine_mode mode ATTRIBUTE_UNUSED)
-{
- return GET_CODE (c) == CONST_INT && CONST_OK_FOR_I06 (INTVAL (c));
-}
/* Return true if it's possible to redirect BRANCH1 to the destination
of an unconditional jump BRANCH2. We only want to do this if the
@@ -10126,8 +9381,8 @@ sh_register_move_cost (enum machine_mode mode,
if (TARGET_SHMEDIA
&& ((srcclass) == TARGET_REGS || (srcclass) == SIBCALL_REGS))
{
- if (*sh_gettrcost_str)
- return atoi (sh_gettrcost_str);
+ if (sh_gettrcost >= 0)
+ return sh_gettrcost;
else if (!TARGET_PT_FIXED)
return 100;
}
@@ -10145,57 +9400,6 @@ sh_register_move_cost (enum machine_mode mode,
return 2 * ((GET_MODE_SIZE (mode) + 3) / 4U);
}
-/* Like register_operand, but take into account that SHMEDIA can use
- the constant zero like a general register. */
-int
-sh_register_operand (rtx op, enum machine_mode mode)
-{
- if (op == CONST0_RTX (mode) && TARGET_SHMEDIA)
- return 1;
- return register_operand (op, mode);
-}
-
-int
-cmpsi_operand (rtx op, enum machine_mode mode)
-{
- if (GET_CODE (op) == REG && REGNO (op) == T_REG
- && GET_MODE (op) == SImode
- && TARGET_SH1)
- return 1;
- return arith_operand (op, mode);
-}
-
-int
-shift_count_reg_operand (rtx op, enum machine_mode mode)
-{
- if ((GET_CODE (op) == ZERO_EXTEND || GET_CODE (op) == SIGN_EXTEND
- || (GET_CODE (op) == SUBREG && SUBREG_BYTE (op) == 0))
- && (mode == VOIDmode || mode == GET_MODE (op))
- && GET_MODE_BITSIZE (GET_MODE (XEXP (op, 0))) >= 6
- && GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_INT)
- {
- mode = VOIDmode;
- do
- op = XEXP (op, 0);
- while ((GET_CODE (op) == ZERO_EXTEND || GET_CODE (op) == SIGN_EXTEND
- || GET_CODE (op) == TRUNCATE)
- && GET_MODE_BITSIZE (GET_MODE (XEXP (op, 0))) >= 6
- && GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_INT);
-
- }
- return arith_reg_operand (op, mode);
-}
-
-int
-shift_count_operand (rtx op, enum machine_mode mode)
-{
- return (CONSTANT_P (op)
- ? (GET_CODE (op) == CONST_INT
- ? (unsigned) INTVAL (op) < GET_MODE_BITSIZE (mode)
- : nonmemory_operand (op, mode))
- : shift_count_reg_operand (op, mode));
-}
-
static rtx emit_load_ptr (rtx, rtx);
static rtx
@@ -10598,27 +9802,6 @@ check_use_sfunc_addr (rtx insn, rtx reg)
gcc_unreachable ();
}
-/* Returns 1 if OP is a MEM that can be source of a simple move operation. */
-
-int
-unaligned_load_operand (rtx op, enum machine_mode mode)
-{
- rtx inside;
-
- if (GET_CODE (op) != MEM || GET_MODE (op) != mode)
- return 0;
-
- inside = XEXP (op, 0);
-
- if (GET_CODE (inside) == POST_INC)
- inside = XEXP (inside, 0);
-
- if (GET_CODE (inside) == REG)
- return 1;
-
- return 0;
-}
-
/* This function returns a constant rtx that represents pi / 2**15 in
SFmode. it's used to scale SFmode angles, in radians, to a
fixed-point signed 16.16-bit fraction of a full circle, i.e., 2*pi
@@ -11290,11 +10473,6 @@ shmedia_prepare_call_address (rtx fnaddr, int is_sibcall)
return fnaddr;
}
-const char *sh_multcost_str = "";
-const char *sh_gettrcost_str = "";
-const char *sh_div_str = "";
-const char *sh_divsi3_libfunc = "";
-const char *cut2_workaround_str = "";
enum sh_divide_strategy_e sh_div_strategy = SH_DIV_STRATEGY_DEFAULT;
/* This defines the storage for the variable part of a -mboard= option.
diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h
index 92d8ce00696..e194759d388 100644
--- a/gcc/config/sh/sh.h
+++ b/gcc/config/sh/sh.h
@@ -174,7 +174,8 @@ do { \
#define TARGET_HARVARD (TARGET_HARD_SH4 || TARGET_SH5)
/* Nonzero if a double-precision FPU is available. */
-#define TARGET_FPU_DOUBLE (TARGET_SH4 || TARGET_SH2A_DOUBLE)
+#define TARGET_FPU_DOUBLE \
+ ((target_flags & MASK_SH4) != 0 || TARGET_SH2A_DOUBLE)
/* Nonzero if an FPU is available. */
#define TARGET_FPU_ANY (TARGET_SH2E || TARGET_FPU_DOUBLE)
@@ -334,26 +335,6 @@ do { \
#define TARGET_DEFAULT \
(TARGET_CPU_DEFAULT | TARGET_ENDIAN_DEFAULT | TARGET_OPT_DEFAULT)
-#ifndef SUBTARGET_OPTIONS
-#define SUBTARGET_OPTIONS
-#endif
-
-#define TARGET_OPTIONS \
-{ { "ultcost=", &sh_multcost_str, \
- N_("Cost to assume for a multiply insn"), 0 }, \
- { "gettrcost=", &sh_gettrcost_str, \
- N_("Cost to assume for gettr insn"), 0 }, \
- { "div=", &sh_div_str, \
- N_("division strategy, one of: call, call2, fp, inv, inv:minlat, inv20u, inv20l, inv:call, inv:call2, inv:fp"), 0 }, \
- { "divsi3_libfunc=", &sh_divsi3_libfunc, \
- N_("Specify name for 32 bit signed division function"), 0 }, \
- { "cut2-workaround", &cut2_workaround_str, \
- N_("Enable SH5 cut2 workaround"), "\1" }, \
- SUBTARGET_OPTIONS \
-}
-
-#define TARGET_SH5_CUT2_WORKAROUND (*cut2_workaround_str)
-
#ifndef SH_MULTILIB_CPU_DEFAULT
#define SH_MULTILIB_CPU_DEFAULT "m1"
#endif
@@ -3265,73 +3246,6 @@ extern struct rtx_def *sp_switch;
#define ADJUST_INSN_LENGTH(X, LENGTH) \
(LENGTH) += sh_insn_length_adjustment (X);
-/* Define the codes that are matched by predicates in sh.c. */
-#define PREDICATE_CODES \
- {"and_operand", {SUBREG, REG, CONST_INT}}, \
- {"any_arith_reg_dest", {SUBREG, REG}}, \
- {"any_register_operand", {SUBREG, REG}}, \
- {"arith_operand", {SUBREG, REG, CONST_INT}}, \
- {"arith_reg_dest", {SUBREG, REG}}, \
- {"arith_reg_operand", {SUBREG, REG, SIGN_EXTEND}}, \
- {"arith_reg_or_0_operand", {SUBREG, REG, CONST_INT, CONST_VECTOR}}, \
- {"binary_float_operator", {PLUS, MINUS, MULT, DIV}}, \
- {"binary_logical_operator", {AND, IOR, XOR}}, \
- {"cache_address_operand", {PLUS, REG}}, \
- {"cmp_operand", {SUBREG, REG, CONST_INT}}, \
- {"cmpsi_operand", {SUBREG, REG, CONST_INT}}, \
- {"commutative_float_operator", {PLUS, MULT}}, \
- {"equality_comparison_operator", {EQ,NE}}, \
- {"extend_reg_operand", {SUBREG, REG, TRUNCATE}}, \
- {"extend_reg_or_0_operand", {SUBREG, REG, TRUNCATE, CONST_INT}}, \
- {"ext_dest_operand", {SUBREG, REG}}, \
- {"fp_arith_reg_dest", {SUBREG, REG}}, \
- {"fp_arith_reg_operand", {SUBREG, REG}}, \
- {"fpscr_operand", {REG}}, \
- {"fpul_operand", {REG}}, \
- {"general_extend_operand", {SUBREG, REG, MEM, TRUNCATE}}, \
- {"general_movsrc_operand", {SUBREG, REG, CONST_INT, CONST_DOUBLE, MEM, CONST }}, \
- {"general_movdst_operand", {SUBREG, REG, MEM}}, \
- {"unaligned_load_operand", {MEM}}, \
- {"greater_comparison_operator", {GT,GE,GTU,GEU}}, \
- {"inqhi_operand", {TRUNCATE}}, \
- {"int_gpr_dest", {SUBREG, REG}}, \
- {"less_comparison_operator", {LT,LE,LTU,LEU}}, \
- {"logical_operand", {SUBREG, REG, CONST_INT}}, \
- {"logical_operator", {AND,IOR,XOR}}, \
- {"logical_reg_operand", {SUBREG, REG}}, \
- {"mextr_bit_offset", {CONST_INT}}, \
- {"minuend_operand", {SUBREG, REG, TRUNCATE, CONST_INT}}, \
- {"noncommutative_float_operator", {MINUS, DIV}}, \
- {"sh_const_vec", {CONST_VECTOR}}, \
- {"sh_1el_vec", {CONST_VECTOR}}, \
- {"sh_register_operand", {REG, SUBREG, CONST_INT}}, \
- {"sh_rep_vec", {CONST_VECTOR}}, \
- {"shift_count_operand", {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF, \
- LABEL_REF, SUBREG, REG, ZERO_EXTEND, SIGN_EXTEND}},\
- {"shift_count_reg_operand", {SUBREG, REG, ZERO_EXTEND, SIGN_EXTEND}}, \
- {"shift_operator", {ASHIFT, ASHIFTRT, LSHIFTRT}}, \
- {"symbol_ref_operand", {SYMBOL_REF}}, \
- {"target_operand", {SUBREG, REG, LABEL_REF, SYMBOL_REF, CONST, UNSPEC}},\
- {"target_reg_operand", {SUBREG, REG}}, \
- {"trunc_hi_operand", {SUBREG, REG, TRUNCATE}}, \
- {"ua_address_operand", {SUBREG, REG, PLUS}}, \
- {"ua_offset", {CONST_INT}}, \
- {"unary_float_operator", {ABS, NEG, SQRT}}, \
- {"xor_operand", {SUBREG, REG, CONST_INT}}, \
-
-#define SPECIAL_MODE_PREDICATES \
- "any_arith_reg_dest", \
- "any_register_operand", \
- "int_gpr_dest", \
- "target_operand", \
- "target_reg_operand", \
- "trunc_hi_operand", \
- /* This line intentionally left blank. */
-
-#define any_register_operand register_operand
-#define any_arith_reg_dest arith_reg_dest
-#define ext_dest_operand arith_reg_operand
-
/* Define this macro if it is advisable to hold scalars in registers
in a wider mode than that declared by the program. In such cases,
the value is constrained to be within the bounds of the declared
@@ -3460,12 +3374,6 @@ extern struct rtx_def *sp_switch;
#define SIMULTANEOUS_PREFETCHES 2
-extern const char *sh_multcost_str;
-extern const char *sh_gettrcost_str;
-extern const char *sh_div_str;
-extern const char *sh_divsi3_libfunc;
-extern const char *cut2_workaround_str;
-
/* FIXME: middle-end support for highpart optimizations is missing. */
#define high_life_started reload_in_progress
diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md
index f05be16d92d..4b53129a419 100644
--- a/gcc/config/sh/sh.md
+++ b/gcc/config/sh/sh.md
@@ -1106,7 +1106,7 @@
rtx set1, set2;
rtx replacements[4];
- /* We want to replace occurences of operands[0] with operands[1] and
+ /* We want to replace occurrences of operands[0] with operands[1] and
operands[2] with operands[0] in operands[4]/operands[5].
Doing just two replace_rtx calls naively would result in the second
replacement undoing all that the first did if operands[1] and operands[2]
@@ -11613,7 +11613,7 @@ mov.l\\t1f,r0\\n\\
"TARGET_SHMEDIA && INTVAL (operands[3]) + INTVAL (operands[4]) == 64"
"*
{
- static char templ[16];
+ static char templ[21];
sprintf (templ, \"mextr%d\\t%%N1, %%N2, %%0\",
(int) INTVAL (operands[3]) >> 3);
@@ -11630,7 +11630,7 @@ mov.l\\t1f,r0\\n\\
"TARGET_SHMEDIA && INTVAL (operands[3]) + INTVAL (operands[4]) == 64"
"*
{
- static char templ[16];
+ static char templ[21];
sprintf (templ, \"mextr%d\\t%%N2, %%N1, %%0\",
(int) INTVAL (operands[4]) >> 3);
diff --git a/gcc/config/sh/sh.opt b/gcc/config/sh/sh.opt
index c3c659f95d2..553a5576eb0 100644
--- a/gcc/config/sh/sh.opt
+++ b/gcc/config/sh/sh.opt
@@ -148,13 +148,29 @@ mbigtable
Target Report RejectNegative Mask(BIGTABLE)
Generate 32-bit offsets in switch tables
+mcut2-workaround
+Target RejectNegative Var(TARGET_SH5_CUT2_WORKAROUND)
+Enable SH5 cut2 workaround
+
mdalign
Target Report RejectNegative Mask(ALIGN_DOUBLE)
Align doubles at 64-bit boundaries
+mdiv=
+Target RejectNegative Joined Var(sh_div_str) Init("")
+Division strategy, one of: call, call2, fp, inv, inv:minlat, inv20u, inv20l, inv:call, inv:call2, inv:fp
+
+mdivsi3_libfunc=
+Target RejectNegative Joined Var(sh_divsi3_libfunc) Init("")
+Specify name for 32 bit signed division function
+
mfmovd
Target RejectNegative Mask(FMOVD) Undocumented
+mgettrcost=
+Target RejectNegative Joined UInteger Var(sh_gettrcost) Init(-1)
+Cost to assume for gettr insn
+
mhitachi
Target Report RejectNegative Mask(HITACHI)
Follow Renesas (formerly Hitachi) / SuperH calling conventions
@@ -209,6 +225,10 @@ mspace
Target Report RejectNegative Mask(SMALLCODE)
Deprecated. Use -Os instead
+multcost=
+Target RejectNegative Joined UInteger Var(sh_multcost) Init(-1)
+Cost to assume for a multiply insn
+
musermode
Target Report RejectNegative Mask(USERMODE)
Generate library function call to invalidate instruction cache entries after fixing trampoline
diff --git a/gcc/config/sh/symbian-pre.h b/gcc/config/sh/symbian-pre.h
index 1d882bec0c3..b1f7ab69061 100644
--- a/gcc/config/sh/symbian-pre.h
+++ b/gcc/config/sh/symbian-pre.h
@@ -1,7 +1,7 @@
/* Definitions for the Symbian OS running on an SH part.
This file is included before any other target specific headers.
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005 Free Software Foundation, Inc.
Contributed by Red Hat.
This file is part of GCC.
diff --git a/gcc/config/sh/symbian.c b/gcc/config/sh/symbian.c
index b3e8287a66b..cc518419792 100644
--- a/gcc/config/sh/symbian.c
+++ b/gcc/config/sh/symbian.c
@@ -144,7 +144,8 @@ sh_symbian_dllimport_p (tree decl)
{
/* Don't warn about artificial methods. */
if (!DECL_ARTIFICIAL (decl))
- warning (0, "%H function '%D' is defined after prior declaration as dllimport: attribute ignored",
+ warning (OPT_Wattributes, "%H function '%D' is defined after prior "
+ "declaration as dllimport: attribute ignored",
& DECL_SOURCE_LOCATION (decl), decl);
return false;
}
@@ -155,7 +156,8 @@ sh_symbian_dllimport_p (tree decl)
else if (TREE_CODE (decl) == FUNCTION_DECL && DECL_INLINE (decl))
{
if (extra_warnings)
- warning (0, "%Hinline function '%D' is declared as dllimport: attribute ignored.",
+ warning (OPT_Wattributes, "%Hinline function '%D' is declared as "
+ "dllimport: attribute ignored.",
& DECL_SOURCE_LOCATION (decl), decl);
return false;
}
@@ -403,14 +405,14 @@ sh_symbian_handle_dll_attribute (tree *pnode, tree name, tree args,
| (int) ATTR_FLAG_FUNCTION_NEXT
| (int) ATTR_FLAG_ARRAY_NEXT))
{
- warning (0, "%qs attribute ignored", attr);
+ warning (OPT_Wattributes, "%qs attribute ignored", attr);
*no_add_attrs = true;
return tree_cons (name, args, NULL_TREE);
}
if (TREE_CODE (node) != RECORD_TYPE && TREE_CODE (node) != UNION_TYPE)
{
- warning (0, "%qs attribute ignored", attr);
+ warning (OPT_Wattributes, "%qs attribute ignored", attr);
*no_add_attrs = true;
}
diff --git a/gcc/config/sh/ushmedia.h b/gcc/config/sh/ushmedia.h
index 514ddff35b5..98e9a5bd365 100644
--- a/gcc/config/sh/ushmedia.h
+++ b/gcc/config/sh/ushmedia.h
@@ -720,14 +720,14 @@ sh_media_ADDZ_L (unsigned int mm, unsigned int mn)
return mm + mn;
}
-/* NOP and Synchronization instrinsics not implemented here. */
+/* NOP and Synchronization intrinsics not implemented here. */
static __inline__ void sh_media_PREFO(void *mm, int s)
{
__builtin_sh_media_PREFO (mm + s, 0, 0);
}
-/* Event Handling instrinsics not implemented here. */
+/* Event Handling intrinsics not implemented here. */
/* Old asm stuff */
diff --git a/gcc/config/sol2-c.c b/gcc/config/sol2-c.c
index 330f1ca3c2f..e0fb26252d7 100644
--- a/gcc/config/sol2-c.c
+++ b/gcc/config/sol2-c.c
@@ -66,7 +66,7 @@ static const format_char_info cmn_err_char_table[] =
{ "c", 0, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "w", "", NULL },
{ "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "w", "c", NULL },
{ "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "w", "cR", NULL },
- { "b", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "", &bitfield_string_type },
+ { "b", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "w", "", &bitfield_string_type },
{ NULL, 0, 0, NOLENGTHS, NULL, NULL, NULL }
};
diff --git a/gcc/config/sparc/predicates.md b/gcc/config/sparc/predicates.md
index b56ae65af35..a0e9b04fad3 100644
--- a/gcc/config/sparc/predicates.md
+++ b/gcc/config/sparc/predicates.md
@@ -120,22 +120,22 @@
;; Return true if OP is a symbolic operand for the TLS Global Dynamic model.
(define_predicate "tgd_symbolic_operand"
(and (match_code "symbol_ref")
- (match_test "tls_symbolic_operand (op) == TLS_MODEL_GLOBAL_DYNAMIC")))
+ (match_test "SYMBOL_REF_TLS_MODEL (op) == TLS_MODEL_GLOBAL_DYNAMIC")))
;; Return true if OP is a symbolic operand for the TLS Local Dynamic model.
(define_predicate "tld_symbolic_operand"
(and (match_code "symbol_ref")
- (match_test "tls_symbolic_operand (op) == TLS_MODEL_LOCAL_DYNAMIC")))
+ (match_test "SYMBOL_REF_TLS_MODEL (op) == TLS_MODEL_LOCAL_DYNAMIC")))
;; Return true if OP is a symbolic operand for the TLS Initial Exec model.
(define_predicate "tie_symbolic_operand"
(and (match_code "symbol_ref")
- (match_test "tls_symbolic_operand (op) == TLS_MODEL_INITIAL_EXEC")))
+ (match_test "SYMBOL_REF_TLS_MODEL (op) == TLS_MODEL_INITIAL_EXEC")))
;; Return true if OP is a symbolic operand for the TLS Local Exec model.
(define_predicate "tle_symbolic_operand"
(and (match_code "symbol_ref")
- (match_test "tls_symbolic_operand (op) == TLS_MODEL_LOCAL_EXEC")))
+ (match_test "SYMBOL_REF_TLS_MODEL (op) == TLS_MODEL_LOCAL_EXEC")))
;; Return true if the operand is an argument used in generating PIC references
;; in either the medium/low or embedded medium/anywhere code models on V9.
@@ -380,8 +380,10 @@
if (mode != VOIDmode && GET_MODE (op) != VOIDmode && mode != GET_MODE (op))
return false;
+ mclass = GET_MODE_CLASS (mode);
+
/* Allow any 1-instruction integer constant. */
- if (GET_MODE_CLASS (mode) == MODE_INT
+ if (mclass == MODE_INT
&& (small_int_operand (op, mode) || const_high_operand (op, mode)))
return true;
@@ -392,16 +394,14 @@
&& (GET_CODE (op) == CONST_DOUBLE || GET_CODE (op) == CONST_INT))
return true;
- if (register_operand (op, mode))
- return true;
-
- mclass = GET_MODE_CLASS (mode);
if ((mclass == MODE_FLOAT && GET_CODE (op) == CONST_DOUBLE)
|| (mclass == MODE_VECTOR_INT && GET_CODE (op) == CONST_VECTOR))
return true;
- /* If this is a SUBREG, look inside so that we handle
- paradoxical ones. */
+ if (register_operand (op, mode))
+ return true;
+
+ /* If this is a SUBREG, look inside so that we handle paradoxical ones. */
if (GET_CODE (op) == SUBREG)
op = SUBREG_REG (op);
diff --git a/gcc/config/sparc/sol2-gas.h b/gcc/config/sparc/sol2-gas.h
index 7e808f7acaf..942e39de8a4 100644
--- a/gcc/config/sparc/sol2-gas.h
+++ b/gcc/config/sparc/sol2-gas.h
@@ -3,3 +3,11 @@
/* Undefine this so that BNSYM/ENSYM pairs are emitted by STABS+. */
#undef NO_DBX_BNSYM_ENSYM
+
+/* Use GNU extensions to TLS support. */
+#ifdef HAVE_AS_TLS
+#undef TARGET_SUN_TLS
+#undef TARGET_GNU_TLS
+#define TARGET_SUN_TLS 0
+#define TARGET_GNU_TLS 1
+#endif
diff --git a/gcc/config/sparc/sol2.h b/gcc/config/sparc/sol2.h
index 1c68133a8c9..9b548c2d34c 100644
--- a/gcc/config/sparc/sol2.h
+++ b/gcc/config/sparc/sol2.h
@@ -72,7 +72,7 @@ Boston, MA 02111-1307, USA. */
#undef ASM_GENERATE_INTERNAL_LABEL
#define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \
- sprintf ((LABEL), "*.L%s%ld", (PREFIX), (long)(NUM))
+ sprintf ((LABEL), "*.L%s%lu", (PREFIX), (unsigned long)(NUM))
/* The native TLS-enabled assembler requires the directive #tls_object
to be put on objects in TLS sections (as of v7.1). This is not
diff --git a/gcc/config/sparc/sparc-protos.h b/gcc/config/sparc/sparc-protos.h
index 74fba0c3408..c743f55c000 100644
--- a/gcc/config/sparc/sparc-protos.h
+++ b/gcc/config/sparc/sparc-protos.h
@@ -1,5 +1,5 @@
/* Prototypes of target machine for SPARC.
- Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by Michael Tiemann (tiemann@cygnus.com).
64-bit SPARC-V9 support by Michael Tiemann, Jim Wilson, and Doug Evans,
at Cygnus Support.
@@ -74,6 +74,7 @@ extern rtx legitimize_pic_address (rtx, enum machine_mode, rtx);
extern rtx legitimize_tls_address (rtx);
extern rtx legitimize_address (rtx, rtx, enum machine_mode);
extern void sparc_defer_case_vector (rtx, rtx, int);
+extern bool sparc_expand_move (enum machine_mode, rtx *);
extern void sparc_emit_set_const32 (rtx, rtx);
extern void sparc_emit_set_const64 (rtx, rtx);
extern void sparc_emit_set_symbolic_const64 (rtx, rtx, rtx);
@@ -93,7 +94,6 @@ extern int arith_4096_operand (rtx, enum machine_mode);
extern int zero_operand (rtx, enum machine_mode);
extern int fp_zero_operand (rtx, enum machine_mode);
extern int reg_or_0_operand (rtx, enum machine_mode);
-extern int tls_symbolic_operand (rtx);
extern int empty_delay_slot (rtx);
extern int eligible_for_return_delay (rtx);
extern int eligible_for_sibcall_delay (rtx);
@@ -102,6 +102,7 @@ extern int emit_move_sequence (rtx, enum machine_mode);
extern int fp_sethi_p (rtx);
extern int fp_mov_p (rtx);
extern int fp_high_losum_p (rtx);
+extern bool sparc_tls_referenced_p (rtx);
extern int mem_min_alignment (rtx, int);
extern int pic_address_needs_scratch (rtx);
extern int reg_unused_after (rtx, rtx);
@@ -113,7 +114,6 @@ extern int v9_regcmp_p (enum rtx_code);
extern int sparc_check_64 (rtx, rtx);
extern rtx gen_df_reg (rtx, int);
extern int sparc_extra_constraint_check (rtx, int, int);
-extern void sparc_output_dwarf_dtprel (FILE*, int, rtx);
#endif /* RTX_CODE */
#endif /* __SPARC_PROTOS_H__ */
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index 2ab08fde5d6..edbde43da66 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -341,6 +341,9 @@ static void sparc_init_libfuncs (void);
static void sparc_init_builtins (void);
static void sparc_vis_init_builtins (void);
static rtx sparc_expand_builtin (tree, rtx, rtx, enum machine_mode, int);
+static tree sparc_fold_builtin (tree, tree, bool);
+static int sparc_vis_mul8x16 (int, int);
+static tree sparc_handle_vis_mul8x16 (int, tree, tree, tree);
static void sparc_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
HOST_WIDE_INT, tree);
static bool sparc_can_output_mi_thunk (tree, HOST_WIDE_INT,
@@ -363,6 +366,7 @@ static bool sparc_pass_by_reference (CUMULATIVE_ARGS *,
static int sparc_arg_partial_bytes (CUMULATIVE_ARGS *,
enum machine_mode, tree, bool);
static void sparc_dwarf_handle_frame_unspec (const char *, rtx, int);
+static void sparc_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
static void sparc_file_end (void);
#ifdef SUBTARGET_ATTRIBUTE_TABLE
const struct attribute_spec sparc_attribute_table[];
@@ -370,9 +374,6 @@ const struct attribute_spec sparc_attribute_table[];
/* Option handling. */
-/* Code model option as passed by user. */
-const char *sparc_cmodel_string;
-
/* Parsed value. */
enum cmodel sparc_cmodel;
@@ -439,11 +440,14 @@ static bool fpu_option_set = false;
#undef TARGET_EXPAND_BUILTIN
#define TARGET_EXPAND_BUILTIN sparc_expand_builtin
+#undef TARGET_FOLD_BUILTIN
+#define TARGET_FOLD_BUILTIN sparc_fold_builtin
-#ifdef HAVE_AS_TLS
+#if TARGET_TLS
#undef TARGET_HAVE_TLS
#define TARGET_HAVE_TLS true
#endif
+
#undef TARGET_CANNOT_FORCE_CONST_MEM
#define TARGET_CANNOT_FORCE_CONST_MEM sparc_cannot_force_const_mem
@@ -515,6 +519,11 @@ static bool fpu_option_set = false;
#undef TARGET_HANDLE_OPTION
#define TARGET_HANDLE_OPTION sparc_handle_option
+#if TARGET_GNU_TLS
+#undef TARGET_ASM_OUTPUT_DWARF_DTPREL
+#define TARGET_ASM_OUTPUT_DWARF_DTPREL sparc_output_dwarf_dtprel
+#endif
+
#undef TARGET_ASM_FILE_END
#define TARGET_ASM_FILE_END sparc_file_end
@@ -540,10 +549,6 @@ sparc_handle_option (size_t code, const char *arg, int value ATTRIBUTE_UNUSED)
case OPT_mtune_:
sparc_select[2].string = arg;
break;
-
- case OPT_mcmodel_:
- sparc_cmodel_string = arg;
- break;
}
return true;
@@ -801,9 +806,6 @@ v9_regcmp_p (enum rtx_code code)
|| code == LE || code == GT);
}
-
-/* Operand constraints. */
-
/* Nonzero if OP is a floating point constant which can
be loaded into an integer register using a single
sethi instruction. */
@@ -867,19 +869,148 @@ fp_high_losum_p (rtx op)
return 0;
}
-/* If OP is a SYMBOL_REF of a thread-local symbol, return its TLS mode,
- otherwise return 0. */
+/* Expand a move instruction. Return true if all work is done. */
-int
-tls_symbolic_operand (rtx op)
+bool
+sparc_expand_move (enum machine_mode mode, rtx *operands)
{
- if (GET_CODE (op) != SYMBOL_REF)
- return 0;
- return SYMBOL_REF_TLS_MODEL (op);
+ /* Handle sets of MEM first. */
+ if (GET_CODE (operands[0]) == MEM)
+ {
+ /* 0 is a register (or a pair of registers) on SPARC. */
+ if (register_or_zero_operand (operands[1], mode))
+ return false;
+
+ if (!reload_in_progress)
+ {
+ operands[0] = validize_mem (operands[0]);
+ operands[1] = force_reg (mode, operands[1]);
+ }
+ }
+
+ /* Fixup TLS cases. */
+ if (TARGET_HAVE_TLS
+ && CONSTANT_P (operands[1])
+ && GET_CODE (operands[1]) != HIGH
+ && sparc_tls_referenced_p (operands [1]))
+ {
+ rtx sym = operands[1];
+ rtx addend = NULL;
+
+ if (GET_CODE (sym) == CONST && GET_CODE (XEXP (sym, 0)) == PLUS)
+ {
+ addend = XEXP (XEXP (sym, 0), 1);
+ sym = XEXP (XEXP (sym, 0), 0);
+ }
+
+ gcc_assert (SPARC_SYMBOL_REF_TLS_P (sym));
+
+ sym = legitimize_tls_address (sym);
+ if (addend)
+ {
+ sym = gen_rtx_PLUS (mode, sym, addend);
+ sym = force_operand (sym, operands[0]);
+ }
+ operands[1] = sym;
+ }
+
+ /* Fixup PIC cases. */
+ if (flag_pic && CONSTANT_P (operands[1]))
+ {
+ if (pic_address_needs_scratch (operands[1]))
+ operands[1] = legitimize_pic_address (operands[1], mode, 0);
+
+ if (GET_CODE (operands[1]) == LABEL_REF && mode == SImode)
+ {
+ emit_insn (gen_movsi_pic_label_ref (operands[0], operands[1]));
+ return true;
+ }
+
+ if (GET_CODE (operands[1]) == LABEL_REF && mode == DImode)
+ {
+ gcc_assert (TARGET_ARCH64);
+ emit_insn (gen_movdi_pic_label_ref (operands[0], operands[1]));
+ return true;
+ }
+
+ if (symbolic_operand (operands[1], mode))
+ {
+ operands[1] = legitimize_pic_address (operands[1],
+ mode,
+ (reload_in_progress ?
+ operands[0] :
+ NULL_RTX));
+ return false;
+ }
+ }
+
+ /* If we are trying to toss an integer constant into FP registers,
+ or loading a FP or vector constant, force it into memory. */
+ if (CONSTANT_P (operands[1])
+ && REG_P (operands[0])
+ && (SPARC_FP_REG_P (REGNO (operands[0]))
+ || SCALAR_FLOAT_MODE_P (mode)
+ || VECTOR_MODE_P (mode)))
+ {
+ /* emit_group_store will send such bogosity to us when it is
+ not storing directly into memory. So fix this up to avoid
+ crashes in output_constant_pool. */
+ if (operands [1] == const0_rtx)
+ operands[1] = CONST0_RTX (mode);
+
+ /* We can clear FP registers if TARGET_VIS, and always other regs. */
+ if ((TARGET_VIS || REGNO (operands[0]) < SPARC_FIRST_FP_REG)
+ && const_zero_operand (operands[1], mode))
+ return false;
+
+ if (REGNO (operands[0]) < SPARC_FIRST_FP_REG
+ /* We are able to build any SF constant in integer registers
+ with at most 2 instructions. */
+ && (mode == SFmode
+ /* And any DF constant in integer registers. */
+ || (mode == DFmode
+ && (reload_completed || reload_in_progress))))
+ return false;
+
+ operands[1] = force_const_mem (mode, operands[1]);
+ if (!reload_in_progress)
+ operands[1] = validize_mem (operands[1]);
+ return false;
+ }
+
+ /* Accept non-constants and valid constants unmodified. */
+ if (!CONSTANT_P (operands[1])
+ || GET_CODE (operands[1]) == HIGH
+ || input_operand (operands[1], mode))
+ return false;
+
+ switch (mode)
+ {
+ case QImode:
+ /* All QImode constants require only one insn, so proceed. */
+ break;
+
+ case HImode:
+ case SImode:
+ sparc_emit_set_const32 (operands[0], operands[1]);
+ return true;
+
+ case DImode:
+ /* input_operand should have filtered out 32-bit mode. */
+ sparc_emit_set_const64 (operands[0], operands[1]);
+ return true;
+
+ default:
+ gcc_unreachable ();
+ }
+
+ return false;
}
-
-/* We know it can't be done in one insn when we get here,
- the movsi expander guarantees this. */
+
+/* Load OP1, a 32-bit constant, into OP0, a register.
+ We know it can't be done in one insn when we get
+ here, the move expander guarantees this. */
+
void
sparc_emit_set_const32 (rtx op0, rtx op1)
{
@@ -918,13 +1049,13 @@ sparc_emit_set_const32 (rtx op0, rtx op1)
}
}
-
/* Load OP1, a symbolic 64-bit constant, into OP0, a DImode register.
If TEMP is nonzero, we are forbidden to use any other scratch
registers. Otherwise, we are allowed to generate them as needed.
Note that TEMP may have TImode if the code model is TARGET_CM_MEDANY
or TARGET_CM_EMBMEDANY (see the reload_indi and reload_outdi patterns). */
+
void
sparc_emit_set_symbolic_const64 (rtx op0, rtx op1, rtx temp)
{
@@ -1488,14 +1619,9 @@ sparc_emit_set_const64 (rtx op0, rtx op1)
rtx temp = 0;
/* Sanity check that we know what we are working with. */
- gcc_assert (TARGET_ARCH64);
-
- if (GET_CODE (op0) != SUBREG)
- {
- gcc_assert (GET_CODE (op0) == REG
- && (REGNO (op0) < SPARC_FIRST_FP_REG
- || REGNO (op0) > SPARC_LAST_V9_FP_REG));
- }
+ gcc_assert (TARGET_ARCH64
+ && (GET_CODE (op0) == SUBREG
+ || (REG_P (op0) && ! SPARC_FP_REG_P (REGNO (op0)))));
if (reload_in_progress || reload_completed)
temp = op0;
@@ -2615,7 +2741,7 @@ legitimate_constant_p (rtx x)
/* Offsets of TLS symbols are never valid.
Discourage CSE from creating them. */
if (GET_CODE (inner) == PLUS
- && tls_symbolic_operand (XEXP (inner, 0)))
+ && SPARC_SYMBOL_REF_TLS_P (XEXP (inner, 0)))
return false;
break;
@@ -2626,9 +2752,16 @@ legitimate_constant_p (rtx x)
/* Floating point constants are generally not ok.
The only exception is 0.0 in VIS. */
if (TARGET_VIS
- && (GET_MODE (x) == SFmode
- || GET_MODE (x) == DFmode
- || GET_MODE (x) == TFmode)
+ && SCALAR_FLOAT_MODE_P (GET_MODE (x))
+ && const_zero_operand (x, GET_MODE (x)))
+ return true;
+
+ return false;
+
+ case CONST_VECTOR:
+ /* Vector constants are generally not ok.
+ The only exception is 0 in VIS. */
+ if (TARGET_VIS
&& const_zero_operand (x, GET_MODE (x)))
return true;
@@ -2675,10 +2808,10 @@ legitimate_pic_operand_p (rtx x)
{
if (pic_address_needs_scratch (x))
return false;
- if (tls_symbolic_operand (x)
+ if (SPARC_SYMBOL_REF_TLS_P (x)
|| (GET_CODE (x) == CONST
&& GET_CODE (XEXP (x, 0)) == PLUS
- && tls_symbolic_operand (XEXP (XEXP (x, 0), 0))))
+ && SPARC_SYMBOL_REF_TLS_P (XEXP (XEXP (x, 0), 0))))
return false;
return true;
}
@@ -2716,7 +2849,7 @@ legitimate_address_p (enum machine_mode mode, rtx addr, int strict)
&& GET_CODE (rs2) != SUBREG
&& GET_CODE (rs2) != LO_SUM
&& GET_CODE (rs2) != MEM
- && !tls_symbolic_operand (rs2)
+ && ! SPARC_SYMBOL_REF_TLS_P (rs2)
&& (! symbolic_operand (rs2, VOIDmode) || mode == Pmode)
&& (GET_CODE (rs2) != CONST_INT || SMALL_INT (rs2)))
|| ((REG_P (rs1)
@@ -2756,7 +2889,7 @@ legitimate_address_p (enum machine_mode mode, rtx addr, int strict)
rs2 = NULL;
imm1 = XEXP (rs1, 1);
rs1 = XEXP (rs1, 0);
- if (! CONSTANT_P (imm1) || tls_symbolic_operand (rs1))
+ if (! CONSTANT_P (imm1) || SPARC_SYMBOL_REF_TLS_P (rs1))
return 0;
}
}
@@ -2765,7 +2898,7 @@ legitimate_address_p (enum machine_mode mode, rtx addr, int strict)
rs1 = XEXP (addr, 0);
imm1 = XEXP (addr, 1);
- if (! CONSTANT_P (imm1) || tls_symbolic_operand (rs1))
+ if (! CONSTANT_P (imm1) || SPARC_SYMBOL_REF_TLS_P (rs1))
return 0;
/* We can't allow TFmode in 32-bit mode, because an offset greater
@@ -2814,6 +2947,7 @@ legitimate_address_p (enum machine_mode mode, rtx addr, int strict)
/* Construct the SYMBOL_REF for the tls_get_offset function. */
static GTY(()) rtx sparc_tls_symbol;
+
static rtx
sparc_tls_get_addr (void)
{
@@ -2840,6 +2974,24 @@ sparc_tls_got (void)
return temp;
}
+/* Return 1 if *X is a thread-local symbol. */
+
+static int
+sparc_tls_symbol_ref_1 (rtx *x, void *data ATTRIBUTE_UNUSED)
+{
+ return SPARC_SYMBOL_REF_TLS_P (*x);
+}
+
+/* Return 1 if X contains a thread-local symbol. */
+
+bool
+sparc_tls_referenced_p (rtx x)
+{
+ if (!TARGET_HAVE_TLS)
+ return false;
+
+ return for_each_rtx (&x, &sparc_tls_symbol_ref_1, 0);
+}
/* ADDR contains a thread-local SYMBOL_REF. Generate code to compute
this (thread-local) address. */
@@ -3007,15 +3159,15 @@ legitimize_pic_address (rtx orig, enum machine_mode mode ATTRIBUTE_UNUSED,
won't get confused into thinking that these two instructions
are loading in the true address of the symbol. If in the
future a PIC rtx exists, that should be used instead. */
- if (Pmode == SImode)
+ if (TARGET_ARCH64)
{
- emit_insn (gen_movsi_high_pic (temp_reg, orig));
- emit_insn (gen_movsi_lo_sum_pic (temp_reg, temp_reg, orig));
+ emit_insn (gen_movdi_high_pic (temp_reg, orig));
+ emit_insn (gen_movdi_lo_sum_pic (temp_reg, temp_reg, orig));
}
else
{
- emit_insn (gen_movdi_high_pic (temp_reg, orig));
- emit_insn (gen_movdi_lo_sum_pic (temp_reg, temp_reg, orig));
+ emit_insn (gen_movsi_high_pic (temp_reg, orig));
+ emit_insn (gen_movsi_lo_sum_pic (temp_reg, temp_reg, orig));
}
address = temp_reg;
}
@@ -3102,7 +3254,7 @@ legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, enum machine_mode mode)
if (x != orig_x && legitimate_address_p (mode, x, FALSE))
return x;
- if (tls_symbolic_operand (x))
+ if (SPARC_SYMBOL_REF_TLS_P (x))
x = legitimize_tls_address (x);
else if (flag_pic)
x = legitimize_pic_address (x, mode, 0);
@@ -5805,7 +5957,7 @@ sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
if (GET_CODE (x) != MEM)
{
slot0 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot0, x));
+ emit_move_insn (slot0, x);
}
else
slot0 = x;
@@ -5813,7 +5965,7 @@ sparc_emit_float_lib_cmp (rtx x, rtx y, enum rtx_code comparison)
if (GET_CODE (y) != MEM)
{
slot1 = assign_stack_temp (TFmode, GET_MODE_SIZE(TFmode), 0);
- emit_insn (gen_rtx_SET (VOIDmode, slot1, y));
+ emit_move_insn (slot1, y);
}
else
slot1 = y;
@@ -7699,7 +7851,7 @@ sparc_vis_init_builtins (void)
}
/* Handle TARGET_EXPAND_BUILTIN target hook.
- Expand builtin functions for sparc instrinsics. */
+ Expand builtin functions for sparc intrinsics. */
static rtx
sparc_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
@@ -7757,6 +7909,204 @@ sparc_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
return op[0];
}
+
+static int
+sparc_vis_mul8x16 (int e8, int e16)
+{
+ return (e8 * e16 + 128) / 256;
+}
+
+/* Multiply the vector elements in ELTS0 to the elements in ELTS1 as specified
+ by FNCODE. All of the elements in ELTS0 and ELTS1 lists must be integer
+ constants. A tree list with the results of the multiplications is returned,
+ and each element in the list is of INNER_TYPE. */
+
+static tree
+sparc_handle_vis_mul8x16 (int fncode, tree inner_type, tree elts0, tree elts1)
+{
+ tree n_elts = NULL_TREE;
+ int scale;
+
+ switch (fncode)
+ {
+ case CODE_FOR_fmul8x16_vis:
+ for (; elts0 && elts1;
+ elts0 = TREE_CHAIN (elts0), elts1 = TREE_CHAIN (elts1))
+ {
+ int val
+ = sparc_vis_mul8x16 (TREE_INT_CST_LOW (TREE_VALUE (elts0)),
+ TREE_INT_CST_LOW (TREE_VALUE (elts1)));
+ n_elts = tree_cons (NULL_TREE,
+ build_int_cst (inner_type, val),
+ n_elts);
+ }
+ break;
+
+ case CODE_FOR_fmul8x16au_vis:
+ scale = TREE_INT_CST_LOW (TREE_VALUE (elts1));
+
+ for (; elts0; elts0 = TREE_CHAIN (elts0))
+ {
+ int val
+ = sparc_vis_mul8x16 (TREE_INT_CST_LOW (TREE_VALUE (elts0)),
+ scale);
+ n_elts = tree_cons (NULL_TREE,
+ build_int_cst (inner_type, val),
+ n_elts);
+ }
+ break;
+
+ case CODE_FOR_fmul8x16al_vis:
+ scale = TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (elts1)));
+
+ for (; elts0; elts0 = TREE_CHAIN (elts0))
+ {
+ int val
+ = sparc_vis_mul8x16 (TREE_INT_CST_LOW (TREE_VALUE (elts0)),
+ scale);
+ n_elts = tree_cons (NULL_TREE,
+ build_int_cst (inner_type, val),
+ n_elts);
+ }
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+
+ return nreverse (n_elts);
+
+}
+/* Handle TARGET_FOLD_BUILTIN target hook.
+ Fold builtin functions for SPARC intrinsics. If IGNORE is true the
+ result of the function call is ignored. NULL_TREE is returned if the
+ function could not be folded. */
+
+static tree
+sparc_fold_builtin (tree fndecl, tree arglist, bool ignore)
+{
+ tree arg0, arg1, arg2;
+ tree rtype = TREE_TYPE (TREE_TYPE (fndecl));
+
+
+ if (ignore && DECL_FUNCTION_CODE (fndecl) != CODE_FOR_alignaddrsi_vis
+ && DECL_FUNCTION_CODE (fndecl) != CODE_FOR_alignaddrdi_vis)
+ return build_int_cst (rtype, 0);
+
+ switch (DECL_FUNCTION_CODE (fndecl))
+ {
+ case CODE_FOR_fexpand_vis:
+ arg0 = TREE_VALUE (arglist);
+ STRIP_NOPS (arg0);
+
+ if (TREE_CODE (arg0) == VECTOR_CST)
+ {
+ tree inner_type = TREE_TYPE (rtype);
+ tree elts = TREE_VECTOR_CST_ELTS (arg0);
+ tree n_elts = NULL_TREE;
+
+ for (; elts; elts = TREE_CHAIN (elts))
+ {
+ unsigned int val = TREE_INT_CST_LOW (TREE_VALUE (elts)) << 4;
+ n_elts = tree_cons (NULL_TREE,
+ build_int_cst (inner_type, val),
+ n_elts);
+ }
+ return build_vector (rtype, nreverse (n_elts));
+ }
+ break;
+
+ case CODE_FOR_fmul8x16_vis:
+ case CODE_FOR_fmul8x16au_vis:
+ case CODE_FOR_fmul8x16al_vis:
+ arg0 = TREE_VALUE (arglist);
+ arg1 = TREE_VALUE (TREE_CHAIN (arglist));
+ STRIP_NOPS (arg0);
+ STRIP_NOPS (arg1);
+
+ if (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST)
+ {
+ tree inner_type = TREE_TYPE (rtype);
+ tree elts0 = TREE_VECTOR_CST_ELTS (arg0);
+ tree elts1 = TREE_VECTOR_CST_ELTS (arg1);
+ tree n_elts = sparc_handle_vis_mul8x16 (DECL_FUNCTION_CODE (fndecl),
+ inner_type, elts0, elts1);
+
+ return build_vector (rtype, n_elts);
+ }
+ break;
+
+ case CODE_FOR_fpmerge_vis:
+ arg0 = TREE_VALUE (arglist);
+ arg1 = TREE_VALUE (TREE_CHAIN (arglist));
+ STRIP_NOPS (arg0);
+ STRIP_NOPS (arg1);
+
+ if (TREE_CODE (arg0) == VECTOR_CST && TREE_CODE (arg1) == VECTOR_CST)
+ {
+ tree elts0 = TREE_VECTOR_CST_ELTS (arg0);
+ tree elts1 = TREE_VECTOR_CST_ELTS (arg1);
+ tree n_elts = NULL_TREE;
+
+ for (; elts0 && elts1;
+ elts0 = TREE_CHAIN (elts0), elts1 = TREE_CHAIN (elts1))
+ {
+ n_elts = tree_cons (NULL_TREE, TREE_VALUE (elts0), n_elts);
+ n_elts = tree_cons (NULL_TREE, TREE_VALUE (elts1), n_elts);
+ }
+
+ return build_vector (rtype, nreverse (n_elts));
+ }
+ break;
+
+ case CODE_FOR_pdist_vis:
+ arg0 = TREE_VALUE (arglist);
+ arg1 = TREE_VALUE (TREE_CHAIN (arglist));
+ arg2 = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist)));
+ STRIP_NOPS (arg0);
+ STRIP_NOPS (arg1);
+ STRIP_NOPS (arg2);
+
+ if (TREE_CODE (arg0) == VECTOR_CST
+ && TREE_CODE (arg1) == VECTOR_CST
+ && TREE_CODE (arg2) == INTEGER_CST)
+ {
+ int overflow = 0;
+ unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (arg2);
+ HOST_WIDE_INT high = TREE_INT_CST_HIGH (arg2);
+ tree elts0 = TREE_VECTOR_CST_ELTS (arg0);
+ tree elts1 = TREE_VECTOR_CST_ELTS (arg1);
+
+ for (; elts0 && elts1;
+ elts0 = TREE_CHAIN (elts0), elts1 = TREE_CHAIN (elts1))
+ {
+ unsigned HOST_WIDE_INT
+ low0 = TREE_INT_CST_LOW (TREE_VALUE (elts0)),
+ low1 = TREE_INT_CST_LOW (TREE_VALUE (elts1));
+ HOST_WIDE_INT high0 = TREE_INT_CST_HIGH (TREE_VALUE (elts0));
+ HOST_WIDE_INT high1 = TREE_INT_CST_HIGH (TREE_VALUE (elts1));
+
+ unsigned HOST_WIDE_INT l;
+ HOST_WIDE_INT h;
+
+ overflow |= neg_double (low1, high1, &l, &h);
+ overflow |= add_double (low0, high0, l, h, &l, &h);
+ if (h < 0)
+ overflow |= neg_double (l, h, &l, &h);
+
+ overflow |= add_double (low, high, l, h, &low, &high);
+ }
+
+ gcc_assert (overflow == 0);
+
+ return build_int_cst_wide (rtype, low, high);
+ }
+
+ default:
+ break;
+ }
+ return NULL_TREE;
+}
int
sparc_extra_constraint_check (rtx op, int c, int strict)
@@ -8311,10 +8661,10 @@ sparc_dwarf_handle_frame_unspec (const char *label,
dwarf2out_window_save (label);
}
-/* This is called from dwarf2out.c via ASM_OUTPUT_DWARF_DTPREL.
+/* This is called from dwarf2out.c via TARGET_ASM_OUTPUT_DWARF_DTPREL.
We need to emit DTP-relative relocations. */
-void
+static void
sparc_output_dwarf_dtprel (FILE *file, int size, rtx x)
{
switch (size)
@@ -8332,8 +8682,10 @@ sparc_output_dwarf_dtprel (FILE *file, int size, rtx x)
fputs (")", file);
}
-static
-void sparc_file_end (void)
+/* Do whatever processing is required at the end of a file. */
+
+static void
+sparc_file_end (void)
{
/* If we haven't emitted the special PIC helper function, do so now. */
if (pic_helper_symbol_name[0] && !pic_helper_emitted_p)
diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h
index 0e0aea211ff..73a64ca9463 100644
--- a/gcc/config/sparc/sparc.h
+++ b/gcc/config/sparc/sparc.h
@@ -191,8 +191,6 @@ enum cmodel {
CM_EMBMEDANY
};
-/* Value of -mcmodel specified by user. */
-extern const char *sparc_cmodel_string;
/* One of CM_FOO. */
extern enum cmodel sparc_cmodel;
@@ -2351,12 +2349,8 @@ extern int sparc_indent_opcode;
} \
} while (0)
-/* Emit a dtp-relative reference to a TLS variable. */
-
-#ifdef HAVE_AS_TLS
-#define ASM_OUTPUT_DWARF_DTPREL(FILE, SIZE, X) \
- sparc_output_dwarf_dtprel (FILE, SIZE, X)
-#endif
+#define SPARC_SYMBOL_REF_TLS_P(RTX) \
+ (GET_CODE (RTX) == SYMBOL_REF && SYMBOL_REF_TLS_MODEL (RTX) != 0)
#define PRINT_OPERAND_PUNCT_VALID_P(CHAR) \
((CHAR) == '#' || (CHAR) == '*' || (CHAR) == '(' \
@@ -2446,11 +2440,14 @@ extern int sparc_indent_opcode;
} \
}
+/* TLS support defaulting to original Sun flavor. GNU extensions
+ must be activated in separate configuration files. */
#ifdef HAVE_AS_TLS
#define TARGET_TLS 1
#else
#define TARGET_TLS 0
#endif
+
#define TARGET_SUN_TLS TARGET_TLS
#define TARGET_GNU_TLS 0
diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md
index f40d59cd58b..cea956624df 100644
--- a/gcc/config/sparc/sparc.md
+++ b/gcc/config/sparc/sparc.md
@@ -854,7 +854,7 @@
;; The SEQ and SNE patterns are special because they can be done
;; without any branching and do not involve a COMPARE. We want
-;; them to always use the splitz below so the results can be
+;; them to always use the splits below so the results can be
;; scheduled.
(define_insn_and_split "*snesi_zero"
@@ -1723,54 +1723,12 @@
;; Integer move instructions
(define_expand "movqi"
- [(set (match_operand:QI 0 "general_operand" "")
+ [(set (match_operand:QI 0 "nonimmediate_operand" "")
(match_operand:QI 1 "general_operand" ""))]
""
{
- /* Working with CONST_INTs is easier, so convert
- a double if needed. */
- if (GET_CODE (operands[1]) == CONST_DOUBLE)
- operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), QImode);
-
- /* Handle sets of MEM first. */
- if (GET_CODE (operands[0]) == MEM)
- {
- if (register_or_zero_operand (operands[1], QImode))
- goto movqi_is_ok;
-
- if (! reload_in_progress)
- {
- operands[0] = validize_mem (operands[0]);
- operands[1] = force_reg (QImode, operands[1]);
- }
- }
-
- /* Fixup TLS cases. */
- if (tls_symbolic_operand (operands [1]))
- operands[1] = legitimize_tls_address (operands[1]);
-
- /* Fixup PIC cases. */
- if (flag_pic)
- {
- if (CONSTANT_P (operands[1])
- && pic_address_needs_scratch (operands[1]))
- operands[1] = legitimize_pic_address (operands[1], QImode, 0);
-
- if (symbolic_operand (operands[1], QImode))
- {
- operands[1] = legitimize_pic_address (operands[1],
- QImode,
- (reload_in_progress ?
- operands[0] :
- NULL_RTX));
- goto movqi_is_ok;
- }
- }
-
- /* All QI constants require only one insn, so proceed. */
-
- movqi_is_ok:
- ;
+ if (sparc_expand_move (QImode, operands))
+ DONE;
})
(define_insn "*movqi_insn"
@@ -1786,62 +1744,12 @@
(set_attr "us3load_type" "*,3cycle,*")])
(define_expand "movhi"
- [(set (match_operand:HI 0 "general_operand" "")
+ [(set (match_operand:HI 0 "nonimmediate_operand" "")
(match_operand:HI 1 "general_operand" ""))]
""
{
- /* Working with CONST_INTs is easier, so convert
- a double if needed. */
- if (GET_CODE (operands[1]) == CONST_DOUBLE)
- operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), HImode);
-
- /* Handle sets of MEM first. */
- if (GET_CODE (operands[0]) == MEM)
- {
- if (register_or_zero_operand (operands[1], HImode))
- goto movhi_is_ok;
-
- if (! reload_in_progress)
- {
- operands[0] = validize_mem (operands[0]);
- operands[1] = force_reg (HImode, operands[1]);
- }
- }
-
- /* Fixup TLS cases. */
- if (tls_symbolic_operand (operands [1]))
- operands[1] = legitimize_tls_address (operands[1]);
-
- /* Fixup PIC cases. */
- if (flag_pic)
- {
- if (CONSTANT_P (operands[1])
- && pic_address_needs_scratch (operands[1]))
- operands[1] = legitimize_pic_address (operands[1], HImode, 0);
-
- if (symbolic_operand (operands[1], HImode))
- {
- operands[1] = legitimize_pic_address (operands[1],
- HImode,
- (reload_in_progress ?
- operands[0] :
- NULL_RTX));
- goto movhi_is_ok;
- }
- }
-
- /* This makes sure we will not get rematched due to splittage. */
- if (! CONSTANT_P (operands[1]) || input_operand (operands[1], HImode))
- ;
- else if (GET_CODE (operands[1]) != HIGH
- && GET_CODE (operands[1]) != LO_SUM)
- {
- sparc_emit_set_const32 (operands[0], operands[1]);
- DONE;
- }
-
- movhi_is_ok:
- ;
+ if (sparc_expand_move (HImode, operands))
+ DONE;
})
(define_insn "*movhi_insn"
@@ -1866,77 +1774,12 @@
"or\t%1, %2, %0")
(define_expand "movsi"
- [(set (match_operand:SI 0 "general_operand" "")
+ [(set (match_operand:SI 0 "nonimmediate_operand" "")
(match_operand:SI 1 "general_operand" ""))]
""
{
- /* Working with CONST_INTs is easier, so convert
- a double if needed. */
- if (GET_CODE (operands[1]) == CONST_DOUBLE)
- operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), SImode);
-
- /* Handle sets of MEM first. */
- if (GET_CODE (operands[0]) == MEM)
- {
- if (register_or_zero_operand (operands[1], SImode))
- goto movsi_is_ok;
-
- if (! reload_in_progress)
- {
- operands[0] = validize_mem (operands[0]);
- operands[1] = force_reg (SImode, operands[1]);
- }
- }
-
- /* Fixup TLS cases. */
- if (tls_symbolic_operand (operands [1]))
- operands[1] = legitimize_tls_address (operands[1]);
-
- /* Fixup PIC cases. */
- if (flag_pic)
- {
- if (CONSTANT_P (operands[1])
- && pic_address_needs_scratch (operands[1]))
- operands[1] = legitimize_pic_address (operands[1], SImode, 0);
-
- if (GET_CODE (operands[1]) == LABEL_REF)
- {
- emit_insn (gen_movsi_pic_label_ref (operands[0], operands[1]));
- DONE;
- }
-
- if (symbolic_operand (operands[1], SImode))
- {
- operands[1] = legitimize_pic_address (operands[1],
- SImode,
- (reload_in_progress ?
- operands[0] :
- NULL_RTX));
- goto movsi_is_ok;
- }
- }
-
- /* If we are trying to toss an integer constant into the
- FPU registers, force it into memory. */
- if (GET_CODE (operands[0]) == REG
- && REGNO (operands[0]) >= SPARC_FIRST_FP_REG
- && REGNO (operands[0]) <= SPARC_LAST_V9_FP_REG
- && CONSTANT_P (operands[1]))
- operands[1] = validize_mem (force_const_mem (GET_MODE (operands[0]),
- operands[1]));
-
- /* This makes sure we will not get rematched due to splittage. */
- if (! CONSTANT_P (operands[1]) || input_operand (operands[1], SImode))
- ;
- else if (GET_CODE (operands[1]) != HIGH
- && GET_CODE (operands[1]) != LO_SUM)
- {
- sparc_emit_set_const32 (operands[0], operands[1]);
- DONE;
- }
-
- movsi_is_ok:
- ;
+ if (sparc_expand_move (SImode, operands))
+ DONE;
})
(define_insn "*movsi_insn"
@@ -2025,85 +1868,12 @@
"or\t%1, %%lo(%a3-(%a2-.)), %0")
(define_expand "movdi"
- [(set (match_operand:DI 0 "general_operand" "")
+ [(set (match_operand:DI 0 "nonimmediate_operand" "")
(match_operand:DI 1 "general_operand" ""))]
""
{
- /* Working with CONST_INTs is easier, so convert
- a double if needed. */
- if (GET_CODE (operands[1]) == CONST_DOUBLE
-#if HOST_BITS_PER_WIDE_INT == 32
- && ((CONST_DOUBLE_HIGH (operands[1]) == 0
- && (CONST_DOUBLE_LOW (operands[1]) & 0x80000000) == 0)
- || (CONST_DOUBLE_HIGH (operands[1]) == (HOST_WIDE_INT) 0xffffffff
- && (CONST_DOUBLE_LOW (operands[1]) & 0x80000000) != 0))
-#endif
- )
- operands[1] = gen_int_mode (CONST_DOUBLE_LOW (operands[1]), DImode);
-
- /* Handle MEM cases first. */
- if (GET_CODE (operands[0]) == MEM)
- {
- if (register_or_zero_operand (operands[1], DImode))
- goto movdi_is_ok;
-
- if (! reload_in_progress)
- {
- operands[0] = validize_mem (operands[0]);
- operands[1] = force_reg (DImode, operands[1]);
- }
- }
-
- /* Fixup TLS cases. */
- if (tls_symbolic_operand (operands [1]))
- operands[1] = legitimize_tls_address (operands[1]);
-
- if (flag_pic)
- {
- if (CONSTANT_P (operands[1])
- && pic_address_needs_scratch (operands[1]))
- operands[1] = legitimize_pic_address (operands[1], DImode, 0);
-
- if (GET_CODE (operands[1]) == LABEL_REF)
- {
- gcc_assert (TARGET_ARCH64);
- emit_insn (gen_movdi_pic_label_ref (operands[0], operands[1]));
- DONE;
- }
-
- if (symbolic_operand (operands[1], DImode))
- {
- operands[1] = legitimize_pic_address (operands[1],
- DImode,
- (reload_in_progress ?
- operands[0] :
- NULL_RTX));
- goto movdi_is_ok;
- }
- }
-
- /* If we are trying to toss an integer constant into the
- FPU registers, force it into memory. */
- if (GET_CODE (operands[0]) == REG
- && REGNO (operands[0]) >= SPARC_FIRST_FP_REG
- && REGNO (operands[0]) <= SPARC_LAST_V9_FP_REG
- && CONSTANT_P (operands[1]))
- operands[1] = validize_mem (force_const_mem (GET_MODE (operands[0]),
- operands[1]));
-
- /* This makes sure we will not get rematched due to splittage. */
- if (! CONSTANT_P (operands[1]) || input_operand (operands[1], DImode))
- ;
- else if (TARGET_ARCH64
- && GET_CODE (operands[1]) != HIGH
- && GET_CODE (operands[1]) != LO_SUM)
- {
- sparc_emit_set_const64 (operands[0], operands[1]);
- DONE;
- }
-
- movdi_is_ok:
- ;
+ if (sparc_expand_move (DImode, operands))
+ DONE;
})
;; Be careful, fmovd does not exist when !v9.
@@ -2552,65 +2322,12 @@
;; Yes, you guessed it right, the former movsf expander.
(define_expand "mov<V32:mode>"
- [(set (match_operand:V32 0 "general_operand" "")
+ [(set (match_operand:V32 0 "nonimmediate_operand" "")
(match_operand:V32 1 "general_operand" ""))]
"<V32:MODE>mode == SFmode || TARGET_VIS"
{
- /* Force constants into memory. */
- if (GET_CODE (operands[0]) == REG && CONSTANT_P (operands[1]))
- {
- /* emit_group_store will send such bogosity to us when it is
- not storing directly into memory. So fix this up to avoid
- crashes in output_constant_pool. */
- if (operands [1] == const0_rtx)
- operands[1] = CONST0_RTX (<V32:MODE>mode);
-
- if ((TARGET_VIS || REGNO (operands[0]) < 32)
- && const_zero_operand (operands[1], <V32:MODE>mode))
- goto movsf_is_ok;
-
- /* We are able to build any SF constant in integer registers
- with at most 2 instructions. */
- if (REGNO (operands[0]) < 32
- && <V32:MODE>mode == SFmode)
- goto movsf_is_ok;
-
- operands[1] = validize_mem (force_const_mem (GET_MODE (operands[0]),
- operands[1]));
- }
-
- /* Handle sets of MEM first. */
- if (GET_CODE (operands[0]) == MEM)
- {
- if (register_or_zero_operand (operands[1], <V32:MODE>mode))
- goto movsf_is_ok;
-
- if (! reload_in_progress)
- {
- operands[0] = validize_mem (operands[0]);
- operands[1] = force_reg (<V32:MODE>mode, operands[1]);
- }
- }
-
- /* Fixup PIC cases. */
- if (flag_pic)
- {
- if (CONSTANT_P (operands[1])
- && pic_address_needs_scratch (operands[1]))
- operands[1] = legitimize_pic_address (operands[1], <V32:MODE>mode, 0);
-
- if (symbolic_operand (operands[1], <V32:MODE>mode))
- {
- operands[1] = legitimize_pic_address (operands[1],
- <V32:MODE>mode,
- (reload_in_progress ?
- operands[0] :
- NULL_RTX));
- }
- }
-
- movsf_is_ok:
- ;
+ if (sparc_expand_move (<V32:MODE>mode, operands))
+ DONE;
})
(define_insn "*movsf_insn"
@@ -2741,65 +2458,12 @@
;; Yes, you again guessed it right, the former movdf expander.
(define_expand "mov<V64:mode>"
- [(set (match_operand:V64 0 "general_operand" "")
+ [(set (match_operand:V64 0 "nonimmediate_operand" "")
(match_operand:V64 1 "general_operand" ""))]
"<V64:MODE>mode == DFmode || TARGET_VIS"
{
- /* Force constants into memory. */
- if (GET_CODE (operands[0]) == REG && CONSTANT_P (operands[1]))
- {
- /* emit_group_store will send such bogosity to us when it is
- not storing directly into memory. So fix this up to avoid
- crashes in output_constant_pool. */
- if (operands [1] == const0_rtx)
- operands[1] = CONST0_RTX (<V64:MODE>mode);
-
- if ((TARGET_VIS || REGNO (operands[0]) < 32)
- && const_zero_operand (operands[1], <V64:MODE>mode))
- goto movdf_is_ok;
-
- /* We are able to build any DF constant in integer registers. */
- if (REGNO (operands[0]) < 32
- && <V64:MODE>mode == DFmode
- && (reload_completed || reload_in_progress))
- goto movdf_is_ok;
-
- operands[1] = validize_mem (force_const_mem (GET_MODE (operands[0]),
- operands[1]));
- }
-
- /* Handle MEM cases first. */
- if (GET_CODE (operands[0]) == MEM)
- {
- if (register_or_zero_operand (operands[1], <V64:MODE>mode))
- goto movdf_is_ok;
-
- if (! reload_in_progress)
- {
- operands[0] = validize_mem (operands[0]);
- operands[1] = force_reg (<V64:MODE>mode, operands[1]);
- }
- }
-
- /* Fixup PIC cases. */
- if (flag_pic)
- {
- if (CONSTANT_P (operands[1])
- && pic_address_needs_scratch (operands[1]))
- operands[1] = legitimize_pic_address (operands[1], <V64:MODE>mode, 0);
-
- if (symbolic_operand (operands[1], <V64:MODE>mode))
- {
- operands[1] = legitimize_pic_address (operands[1],
- <V64:MODE>mode,
- (reload_in_progress ?
- operands[0] :
- NULL_RTX));
- }
- }
-
- movdf_is_ok:
- ;
+ if (sparc_expand_move (<V64:MODE>mode, operands))
+ DONE;
})
;; Be careful, fmovd does not exist when !v9.
@@ -3137,60 +2801,12 @@
})
(define_expand "movtf"
- [(set (match_operand:TF 0 "general_operand" "")
+ [(set (match_operand:TF 0 "nonimmediate_operand" "")
(match_operand:TF 1 "general_operand" ""))]
""
{
- /* Force TFmode constants into memory. */
- if (GET_CODE (operands[0]) == REG
- && CONSTANT_P (operands[1]))
- {
- /* emit_group_store will send such bogosity to us when it is
- not storing directly into memory. So fix this up to avoid
- crashes in output_constant_pool. */
- if (operands [1] == const0_rtx)
- operands[1] = CONST0_RTX (TFmode);
-
- if (TARGET_VIS && const_zero_operand (operands[1], TFmode))
- goto movtf_is_ok;
-
- operands[1] = validize_mem (force_const_mem (GET_MODE (operands[0]),
- operands[1]));
- }
-
- /* Handle MEM cases first, note that only v9 guarantees
- full 16-byte alignment for quads. */
- if (GET_CODE (operands[0]) == MEM)
- {
- if (register_or_zero_operand (operands[1], TFmode))
- goto movtf_is_ok;
-
- if (! reload_in_progress)
- {
- operands[0] = validize_mem (operands[0]);
- operands[1] = force_reg (TFmode, operands[1]);
- }
- }
-
- /* Fixup PIC cases. */
- if (flag_pic)
- {
- if (CONSTANT_P (operands[1])
- && pic_address_needs_scratch (operands[1]))
- operands[1] = legitimize_pic_address (operands[1], TFmode, 0);
-
- if (symbolic_operand (operands[1], TFmode))
- {
- operands[1] = legitimize_pic_address (operands[1],
- TFmode,
- (reload_in_progress ?
- operands[0] :
- NULL_RTX));
- }
- }
-
- movtf_is_ok:
- ;
+ if (sparc_expand_move (TFmode, operands))
+ DONE;
})
(define_insn "*movtf_insn_sp32"
@@ -8747,7 +8363,7 @@
(set_attr "fptype" "double")])
;; Using faligndata only makes sense after an alignaddr since the choice of
-;; bytes to take out of each operand is dependant on the results of the last
+;; bytes to take out of each operand is dependent on the results of the last
;; alignaddr.
(define_insn "faligndata<V64I:mode>_vis"
[(set (match_operand:V64I 0 "register_operand" "=e")
diff --git a/gcc/config/sparc/sparc.opt b/gcc/config/sparc/sparc.opt
index 88a603c6f56..6bee67d8d25 100644
--- a/gcc/config/sparc/sparc.opt
+++ b/gcc/config/sparc/sparc.opt
@@ -96,7 +96,7 @@ Target RejectNegative Joined
Schedule code for given CPU
mcmodel=
-Target RejectNegative Joined
+Target RejectNegative Joined Var(sparc_cmodel_string)
Use given SPARC-V9 code model
diff --git a/gcc/config/stormy16/stormy-abi b/gcc/config/stormy16/stormy-abi
index 01d15796f4e..8c6d590d4ec 100644
--- a/gcc/config/stormy16/stormy-abi
+++ b/gcc/config/stormy16/stormy-abi
@@ -159,7 +159,7 @@ the reloc refers, 'A' is the addend, and 'P' represents the place of
the storage unit being relocated.
In the 'Overflow' column, 'none' means that any overflow of the
-computation perfomed in the 'Calculation' column is ignored.
+computation performed in the 'Calculation' column is ignored.
'signed' means that the overflow is only reported if it happens when
the values are treated as signed quantities. 'unsigned' is the same,
except that the values are treated as unsigned quantities. 'either'
diff --git a/gcc/config/stormy16/stormy16.c b/gcc/config/stormy16/stormy16.c
index 79d35def779..469ecf58966 100644
--- a/gcc/config/stormy16/stormy16.c
+++ b/gcc/config/stormy16/stormy16.c
@@ -2276,7 +2276,7 @@ xstormy16_handle_interrupt_attribute (tree *node, tree name,
{
if (TREE_CODE (*node) != FUNCTION_TYPE)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -2297,14 +2297,16 @@ xstormy16_handle_below100_attribute (tree *node,
&& TREE_CODE (*node) != POINTER_TYPE
&& TREE_CODE (*node) != TYPE_DECL)
{
- warning (0, "%<__BELOW100__%> attribute only applies to variables");
+ warning (OPT_Wattributes,
+ "%<__BELOW100__%> attribute only applies to variables");
*no_add_attrs = true;
}
else if (args == NULL_TREE && TREE_CODE (*node) == VAR_DECL)
{
if (! (TREE_PUBLIC (*node) || TREE_STATIC (*node)))
{
- warning (0, "__BELOW100__ attribute not allowed with auto storage class.");
+ warning (OPT_Wattributes, "__BELOW100__ attribute not allowed "
+ "with auto storage class.");
*no_add_attrs = true;
}
}
diff --git a/gcc/config/v850/v850.c b/gcc/config/v850/v850.c
index 06e26db0e1e..f67c4e734cd 100644
--- a/gcc/config/v850/v850.c
+++ b/gcc/config/v850/v850.c
@@ -2101,7 +2101,7 @@ v850_handle_interrupt_attribute (tree * node,
{
if (TREE_CODE (*node) != FUNCTION_DECL)
{
- warning (0, "%qs attribute only applies to functions",
+ warning (OPT_Wattributes, "%qs attribute only applies to functions",
IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
diff --git a/gcc/configure b/gcc/configure
index 5a57cdb1b97..d258e444d30 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -891,6 +891,7 @@ Optional Features:
--enable-initfini-array use .init_array/.fini_array sections
--enable-sjlj-exceptions
arrange to use setjmp/longjmp exception handling
+ --enable-secureplt enable -msecure-plt by default for PowerPC
--disable-win32-registry
disable lookup of installation paths in the
Registry on Windows hosts
@@ -1033,7 +1034,7 @@ esac
else
echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi
- cd "$ac_popdir"
+ cd $ac_popdir
done
fi
@@ -2387,7 +2388,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2445,7 +2447,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2561,7 +2564,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2615,7 +2619,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2660,7 +2665,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -2704,7 +2710,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3126,7 +3133,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3168,126 +3176,6 @@ _ACEOF
esac
-echo "$as_me:$LINENO: checking for long long int" >&5
-echo $ECHO_N "checking for long long int... $ECHO_C" >&6
-if test "${ac_cv_c_long_long+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-long long int i;
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_c_long_long=yes
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_c_long_long=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_c_long_long" >&5
-echo "${ECHO_T}$ac_cv_c_long_long" >&6
- if test $ac_cv_c_long_long = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_LONG_LONG 1
-_ACEOF
-
- fi
-echo "$as_me:$LINENO: checking for __int64" >&5
-echo $ECHO_N "checking for __int64... $ECHO_C" >&6
-if test "${ac_cv_c___int64+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h. */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h. */
-
-int
-main ()
-{
-__int64 i;
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>conftest.er1
- ac_status=$?
- grep -v '^ *+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_c___int64=yes
-else
- echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-ac_cv_c___int64=no
-fi
-rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_c___int64" >&5
-echo "${ECHO_T}$ac_cv_c___int64" >&6
- if test $ac_cv_c___int64 = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE___INT64 1
-_ACEOF
-
- fi
-
-
# sizeof(char) is 1 by definition.
echo "$as_me:$LINENO: checking for egrep" >&5
@@ -3338,7 +3226,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3508,7 +3397,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3573,7 +3463,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3635,7 +3526,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3675,7 +3567,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3731,7 +3624,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3771,7 +3665,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3835,7 +3730,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -3866,8 +3762,10 @@ See \`config.log' for more details." >&2;}
esac
else
if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: internal error: not reached in cross-compile" >&5
-echo "$as_me: error: internal error: not reached in cross-compile" >&2;}
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }
else
cat >conftest.$ac_ext <<_ACEOF
@@ -3979,7 +3877,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4041,7 +3940,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4081,7 +3981,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4137,7 +4038,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4177,7 +4079,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4241,7 +4144,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4272,8 +4176,10 @@ See \`config.log' for more details." >&2;}
esac
else
if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: internal error: not reached in cross-compile" >&5
-echo "$as_me: error: internal error: not reached in cross-compile" >&2;}
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }
else
cat >conftest.$ac_ext <<_ACEOF
@@ -4385,7 +4291,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4447,7 +4354,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4487,7 +4395,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4543,7 +4452,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4583,7 +4493,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4647,7 +4558,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4678,8 +4590,10 @@ See \`config.log' for more details." >&2;}
esac
else
if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: internal error: not reached in cross-compile" >&5
-echo "$as_me: error: internal error: not reached in cross-compile" >&2;}
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }
else
cat >conftest.$ac_ext <<_ACEOF
@@ -4791,7 +4705,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4853,7 +4768,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4893,7 +4809,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4949,7 +4866,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -4989,7 +4907,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5053,7 +4972,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5084,8 +5004,10 @@ See \`config.log' for more details." >&2;}
esac
else
if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: internal error: not reached in cross-compile" >&5
-echo "$as_me: error: internal error: not reached in cross-compile" >&2;}
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }
else
cat >conftest.$ac_ext <<_ACEOF
@@ -5165,8 +5087,7 @@ cat >>confdefs.h <<_ACEOF
_ACEOF
-if test $ac_cv_c_long_long = yes; then
- echo "$as_me:$LINENO: checking for long long" >&5
+echo "$as_me:$LINENO: checking for long long" >&5
echo $ECHO_N "checking for long long... $ECHO_C" >&6
if test "${ac_cv_type_long_long+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -5198,7 +5119,70 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_long_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_long_long=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5
+echo "${ECHO_T}$ac_cv_type_long_long" >&6
+if test $ac_cv_type_long_long = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_LONG_LONG 1
+_ACEOF
+
+echo "$as_me:$LINENO: checking for long long" >&5
+echo $ECHO_N "checking for long long... $ECHO_C" >&6
+if test "${ac_cv_type_long_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((long long *) 0)
+ return 0;
+if (sizeof (long long))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5260,7 +5244,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5300,7 +5285,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5356,7 +5342,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5396,7 +5383,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5460,7 +5448,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5491,8 +5480,10 @@ See \`config.log' for more details." >&2;}
esac
else
if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: internal error: not reached in cross-compile" >&5
-echo "$as_me: error: internal error: not reached in cross-compile" >&2;}
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }
else
cat >conftest.$ac_ext <<_ACEOF
@@ -5573,8 +5564,70 @@ _ACEOF
fi
-if test $ac_cv_c___int64 = yes; then
- echo "$as_me:$LINENO: checking for __int64" >&5
+
+echo "$as_me:$LINENO: checking for __int64" >&5
+echo $ECHO_N "checking for __int64... $ECHO_C" >&6
+if test "${ac_cv_type___int64+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((__int64 *) 0)
+ return 0;
+if (sizeof (__int64))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type___int64=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type___int64=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type___int64" >&5
+echo "${ECHO_T}$ac_cv_type___int64" >&6
+if test $ac_cv_type___int64 = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE___INT64 1
+_ACEOF
+
+echo "$as_me:$LINENO: checking for __int64" >&5
echo $ECHO_N "checking for __int64... $ECHO_C" >&6
if test "${ac_cv_type___int64+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
@@ -5606,7 +5659,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5668,7 +5722,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5708,7 +5763,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5764,7 +5820,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5804,7 +5861,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5868,7 +5926,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -5899,8 +5958,10 @@ See \`config.log' for more details." >&2;}
esac
else
if test "$cross_compiling" = yes; then
- { { echo "$as_me:$LINENO: error: internal error: not reached in cross-compile" >&5
-echo "$as_me: error: internal error: not reached in cross-compile" >&2;}
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
{ (exit 1); exit 1; }; }
else
cat >conftest.$ac_ext <<_ACEOF
@@ -5982,6 +6043,7 @@ _ACEOF
fi
+
# ---------------------
# Warnings and checking
# ---------------------
@@ -6016,7 +6078,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -6066,7 +6129,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -6124,7 +6188,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -6367,7 +6432,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -7337,7 +7403,7 @@ if test "${gcc_cv_prog_makeinfo_modern+set}" = set; then
else
ac_prog_version=`$MAKEINFO --version 2>&1 |
sed -n 's/^.*GNU texinfo.* \([0-9][0-9.]*\).*$/\1/p'`
- echo "configure:7340: version of makeinfo is $ac_prog_version" >&5
+ echo "configure:7406: version of makeinfo is $ac_prog_version" >&5
case $ac_prog_version in
'') gcc_cv_prog_makeinfo_modern=no;;
4.[2-9]*)
@@ -7592,7 +7658,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -7662,7 +7729,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -7827,7 +7895,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -7888,7 +7957,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -7958,7 +8028,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -8233,7 +8304,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -8306,7 +8378,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -8348,7 +8421,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -8405,7 +8479,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -8568,7 +8643,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -8642,7 +8718,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -8696,7 +8773,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -8774,7 +8852,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -8828,7 +8907,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -8896,7 +8976,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -9037,7 +9118,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -9158,7 +9240,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -9509,7 +9592,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -9626,7 +9710,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -9738,7 +9823,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -9896,7 +9982,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -10768,7 +10855,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -10818,7 +10906,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -10908,7 +10997,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -10977,7 +11067,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -11040,7 +11131,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -11114,7 +11206,8 @@ CFLAGS="$CFLAGS -I${srcdir} -I${srcdir}/../include"
-for ac_func in getenv atol sbrk abort atof getcwd getwd strsignal \
+
+for ac_func in getenv atol asprintf sbrk abort atof getcwd getwd strsignal \
strstr errno snprintf vsnprintf vasprintf malloc realloc calloc \
free basename getopt clock getpagesize clearerr_unlocked feof_unlocked ferror_unlocked fflush_unlocked fgetc_unlocked fgets_unlocked fileno_unlocked fprintf_unlocked fputc_unlocked fputs_unlocked fread_unlocked fwrite_unlocked getchar_unlocked getc_unlocked putchar_unlocked putc_unlocked
do
@@ -11155,7 +11248,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -11240,7 +11334,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -11309,7 +11404,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -11384,7 +11480,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -11467,7 +11564,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -11543,7 +11641,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -11609,7 +11708,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -11745,7 +11845,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -12054,7 +12155,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -12261,6 +12363,12 @@ case "$LIBINTL" in *$LIBICONV*)
LIBICONV= ;;
esac
+# Check whether --enable-secureplt or --disable-secureplt was given.
+if test "${enable_secureplt+set}" = set; then
+ enableval="$enable_secureplt"
+
+fi;
+
# Windows32 Registry support for specifying GCC installation paths.
# Check whether --enable-win32-registry or --disable-win32-registry was given.
if test "${enable_win32_registry+set}" = set; then
@@ -12309,7 +12417,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -12363,7 +12472,8 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
cat conftest.err >&5
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } &&
- { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
@@ -14050,6 +14160,45 @@ cat >>confdefs.h <<\_ACEOF
_ACEOF
fi
+ echo "$as_me:$LINENO: checking assembler for jsrdirect relocation support" >&5
+echo $ECHO_N "checking assembler for jsrdirect relocation support... $ECHO_C" >&6
+if test "${gcc_cv_as_alpha_jsrdirect_relocs+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ gcc_cv_as_alpha_jsrdirect_relocs=no
+ if test $in_tree_gas = yes; then
+ if test $gcc_cv_gas_vers -ge `expr \( \( 2 \* 1000 \) + 16 \) \* 1000 + 90`
+ then gcc_cv_as_alpha_jsrdirect_relocs=yes
+fi
+ elif test x$gcc_cv_as != x; then
+ echo ' .set nomacro
+ .text
+ ldq $27, a($29) !literal!1
+ jsr $26, ($27), a !lituse_jsrdirect!1' > conftest.s
+ if { ac_try='$gcc_cv_as -o conftest.o conftest.s >&5'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }
+ then
+ gcc_cv_as_alpha_jsrdirect_relocs=yes
+ else
+ echo "configure: failed program was" >&5
+ cat conftest.s >&5
+ fi
+ rm -f conftest.o conftest.s
+ fi
+fi
+echo "$as_me:$LINENO: result: $gcc_cv_as_alpha_jsrdirect_relocs" >&5
+echo "${ECHO_T}$gcc_cv_as_alpha_jsrdirect_relocs" >&6
+if test $gcc_cv_as_alpha_jsrdirect_relocs = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_AS_JSRDIRECT_RELOCS 1
+_ACEOF
+
+fi
;;
cris-*-*)
@@ -14627,6 +14776,55 @@ _ACEOF
fi
+ case $target in
+ *-*-aix*) conftest_s=' .csect .text[PR]
+LCF..0:
+ addis 11,30,_GLOBAL_OFFSET_TABLE_-LCF..0@ha';;
+ *-*-darwin*)
+ conftest_s=' .text
+LCF0:
+ addis r11,r30,_GLOBAL_OFFSET_TABLE_-LCF0@ha';;
+ *) conftest_s=' .text
+.LCF0:
+ addis 11,30,_GLOBAL_OFFSET_TABLE_-.LCF0@ha';;
+ esac
+
+ echo "$as_me:$LINENO: checking assembler for rel16 relocs" >&5
+echo $ECHO_N "checking assembler for rel16 relocs... $ECHO_C" >&6
+if test "${gcc_cv_as_powerpc_rel16+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ gcc_cv_as_powerpc_rel16=no
+ if test $in_tree_gas = yes; then
+ if test $gcc_cv_gas_vers -ge `expr \( \( 2 \* 1000 \) + 17 \) \* 1000 + 0`
+ then gcc_cv_as_powerpc_rel16=yes
+fi
+ elif test x$gcc_cv_as != x; then
+ echo "$conftest_s" > conftest.s
+ if { ac_try='$gcc_cv_as -a32 -o conftest.o conftest.s >&5'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }
+ then
+ gcc_cv_as_powerpc_rel16=yes
+ else
+ echo "configure: failed program was" >&5
+ cat conftest.s >&5
+ fi
+ rm -f conftest.o conftest.s
+ fi
+fi
+echo "$as_me:$LINENO: result: $gcc_cv_as_powerpc_rel16" >&5
+echo "${ECHO_T}$gcc_cv_as_powerpc_rel16" >&6
+if test $gcc_cv_as_powerpc_rel16 = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_AS_REL16 1
+_ACEOF
+
+fi
;;
mips*-*-*)
@@ -16388,6 +16586,11 @@ esac
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
# Let's still pretend it is `configure' which instantiates (i.e., don't
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
@@ -16426,12 +16629,6 @@ echo "$as_me: error: cannot find input file: $f" >&2;}
fi;;
esac
done` || { (exit 1); exit 1; }
-
- if test x"$ac_file" != x-; then
- { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
- rm -f "$ac_file"
- fi
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF
sed "$ac_vpsub
diff --git a/gcc/configure.ac b/gcc/configure.ac
index da325274e1e..f5ac726501b 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -283,19 +283,13 @@ AC_SUBST(OUTPUT_OPTION)
AC_PROG_CPP
AC_C_INLINE
-gcc_AC_C_LONG_LONG
-
# sizeof(char) is 1 by definition.
AC_CHECK_SIZEOF(void *)
AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
-if test $ac_cv_c_long_long = yes; then
- AC_CHECK_SIZEOF(long long)
-fi
-if test $ac_cv_c___int64 = yes; then
- AC_CHECK_SIZEOF(__int64)
-fi
+AC_CHECK_TYPES([long long], [AC_CHECK_SIZEOF(long long)])
+AC_CHECK_TYPES([__int64], [AC_CHECK_SIZEOF(__int64)])
# ---------------------
# Warnings and checking
@@ -1053,7 +1047,7 @@ AM_LANGINFO_CODESET
# We will need to find libiberty.h and ansidecl.h
saved_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -I${srcdir} -I${srcdir}/../include"
-gcc_AC_CHECK_DECLS(getenv atol sbrk abort atof getcwd getwd strsignal \
+gcc_AC_CHECK_DECLS(getenv atol asprintf sbrk abort atof getcwd getwd strsignal \
strstr errno snprintf vsnprintf vasprintf malloc realloc calloc \
free basename getopt clock getpagesize gcc_UNLOCKED_FUNCS, , ,[
#include "ansidecl.h"
@@ -1447,6 +1441,10 @@ case "$LIBINTL" in *$LIBICONV*)
LIBICONV= ;;
esac
+AC_ARG_ENABLE(secureplt,
+[ --enable-secureplt enable -msecure-plt by default for PowerPC],
+[], [])
+
# Windows32 Registry support for specifying GCC installation paths.
AC_ARG_ENABLE(win32-registry,
[ --disable-win32-registry
@@ -2643,6 +2641,14 @@ case "$target" in
lda $29, 0($29) !gpdisp!3],,
[AC_DEFINE(HAVE_AS_EXPLICIT_RELOCS, 1,
[Define if your assembler supports explicit relocations.])])
+ gcc_GAS_CHECK_FEATURE([jsrdirect relocation support],
+ gcc_cv_as_alpha_jsrdirect_relocs, [2,16,90],,
+[ .set nomacro
+ .text
+ ldq $27, a($29) !literal!1
+ jsr $26, ($27), a !lituse_jsrdirect!1],,
+ [AC_DEFINE(HAVE_AS_JSRDIRECT_RELOCS, 1,
+ [Define if your assembler supports the lituse_jsrdirect relocation.])])
;;
cris-*-*)
@@ -2828,6 +2834,24 @@ foo: nop
[AC_DEFINE(HAVE_AS_POPCNTB, 1,
[Define if your assembler supports popcntb field.])])
+ case $target in
+ *-*-aix*) conftest_s=' .csect .text[[PR]]
+LCF..0:
+ addis 11,30,_GLOBAL_OFFSET_TABLE_-LCF..0@ha';;
+ *-*-darwin*)
+ conftest_s=' .text
+LCF0:
+ addis r11,r30,_GLOBAL_OFFSET_TABLE_-LCF0@ha';;
+ *) conftest_s=' .text
+.LCF0:
+ addis 11,30,_GLOBAL_OFFSET_TABLE_-.LCF0@ha';;
+ esac
+
+ gcc_GAS_CHECK_FEATURE([rel16 relocs],
+ gcc_cv_as_powerpc_rel16, [2,17,0], -a32,
+ [$conftest_s],,
+ [AC_DEFINE(HAVE_AS_REL16, 1,
+ [Define if your assembler supports R_PPC_REL16 relocs.])])
;;
mips*-*-*)
diff --git a/gcc/convert.c b/gcc/convert.c
index 97705a2926a..dc9f41f648a 100644
--- a/gcc/convert.c
+++ b/gcc/convert.c
@@ -42,10 +42,7 @@ tree
convert_to_pointer (tree type, tree expr)
{
if (integer_zerop (expr))
- {
- expr = build_int_cst (type, 0);
- return expr;
- }
+ return build_int_cst (type, 0);
switch (TREE_CODE (TREE_TYPE (expr)))
{
@@ -57,13 +54,12 @@ convert_to_pointer (tree type, tree expr)
case ENUMERAL_TYPE:
case BOOLEAN_TYPE:
case CHAR_TYPE:
- if (TYPE_PRECISION (TREE_TYPE (expr)) == POINTER_SIZE)
- return build1 (CONVERT_EXPR, type, expr);
+ if (TYPE_PRECISION (TREE_TYPE (expr)) != POINTER_SIZE)
+ expr = fold_build1 (NOP_EXPR,
+ lang_hooks.types.type_for_size (POINTER_SIZE, 0),
+ expr);
+ return fold_build1 (CONVERT_EXPR, type, expr);
- return
- convert_to_pointer (type,
- convert (lang_hooks.types.type_for_size
- (POINTER_SIZE, 0), expr));
default:
error ("cannot convert to a pointer type");
@@ -411,13 +407,14 @@ convert_to_integer (tree type, tree expr)
case POINTER_TYPE:
case REFERENCE_TYPE:
if (integer_zerop (expr))
- expr = integer_zero_node;
- else
- expr = fold (build1 (CONVERT_EXPR,
- lang_hooks.types.type_for_size (POINTER_SIZE, 0),
- expr));
-
- return convert_to_integer (type, expr);
+ return build_int_cst (type, 0);
+
+ /* Convert to an unsigned integer of the correct width first,
+ and from there widen/truncate to the required type. */
+ expr = fold_build1 (CONVERT_EXPR,
+ lang_hooks.types.type_for_size (POINTER_SIZE, 0),
+ expr);
+ return fold_build1 (NOP_EXPR, type, expr);
case INTEGER_TYPE:
case ENUMERAL_TYPE:
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0fd719d9e77..996664a19c1 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,333 @@
+2005-06-15 Aldy Hernandez <aldyh@redhat.com>
+
+ * typeck.c (build_binary_op): Same.
+ * testsuite/g++.dg/conversion/simd3.C: New.
+
+2005-06-15 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/20678
+ * error.c (dump_expr) <COMPONENT_REF case>: Check DECL_NAME is not
+ null.
+
+ * Make-lang.in: Reformat some long lines.
+ (gt-cp-rtti.h): New target.
+ (cp/rtti.o): Add dependency.
+ * config-lang.in (gtfiles): Add cp/rtti.c.
+ * cp-tree.h (CPTI_TI_DESC_TYPE, CPTI_BLTN_DESC_TYPE,
+ CPTI_PTR_DESC_TYPE, CPTI_ARY_DESC_TYPE, CPTI_FUNC_DESC_TYPE,
+ CPTI_ENUM_DESC_TYPE, CPTI_CLASS_DESC_TYPE,
+ CPTI_SI_CLASS_DESC_TYPE, CPTI_VMI_CLASS_DESC_TYPE,
+ CPTI_PTM_DESC_TYPE, CPTI_BASE_DESC_TYPE): Remove.
+ (ti_desc_type_node, bltn_desc_type_node, ptr_desc_type_node,
+ ary_desc_type_node, func_desc_type_node, enum_desc_type_node,
+ class_desc_type_node, si_class_desc_type_node,
+ vmi_class_desc_type_node, ptm_desc_type_node,
+ base_desc_type_node): Remove.
+ * decl.c: Adjust documentation of global trees.
+ * rtti.c (TINFO_PSEUDO_TYPE, TINFO_VTABLE_DECL,
+ TINFO_REAL_NAME): Remove.
+ (struct tinfo_s): New.
+ (enum tinfo_kind): New.
+ (tinfo_descs): New.
+ (get_tinfo_decl): Adjust use of tinfo descriptor.
+ (tinfo_base_init, generic_initializer, ptr_initializer,
+ ptm_initializer, class_initializer): Likewise.
+ (get_pseudo_ti_init): Take descriptor index. Adjust.
+ (create_pseudo_type_info): Likewise.
+ (get_pseudo_ti_desc): Return descriptor index. Adjust.
+ (create_tinfo_types): Adjust use of create_pseudo_type_info.
+ (emit_tinfo_decl): Adjust use of tinfo descriptor.
+
+2005-06-14 Roger Sayle <roger@eyesopen.com>
+
+ * decl.c (grokdeclarator): Only check TREE_OVERFLOW on INTEGER_CST.
+
+2005-06-13 Geoffrey Keating <geoffk@apple.com>
+
+ * Make-lang.in (c++.install-man): Doesn't really depend on installdirs.
+ (rule for installing g++.1 manpage): Does depend on installdirs.
+
+2005-06-13 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/20789
+ * decl.c (cp_finish_decl): Clear runtime runtime initialization if
+ in-class decl's initializer is bad.
+
+ PR c++/21929
+ * parser.c (struct cp_parser): Document that scope could be
+ error_mark.
+ (cp_parser_diagnose_invalid_type_name): Cope with error_mark for
+ scope.
+ (cp_parser_nested_name_specifier): Return NULL_TREE on error.
+ (cp_parser_postfix_expression): Deal with null or error_mark
+ scope.
+ (cp_parser_elaborated_type_specifier): Adjust
+ cp_parser_nested_name_specifier call.
+
+ * parser (cp_parser_skip_to_end_of_block_or_statement): Cleanup.
+
+2005-06-12 Roger Sayle <roger@eyesopen.com>
+
+ PR c++/21930
+ * error.c (dump_expr): UNARY_PLUS_EXPR need not handle void types.
+ Treat CONVERT_EXPR identically to NOP_EXPR.
+
+2005-06-10 Aldy Hernandez <aldyh@redhat.com>
+
+ PR c++/10611
+ * cvt.c (build_expr_type_conversion): Same.
+ * typeck.c (build_binary_op): Handle vectors.
+ (common_type): Same.
+ (type_after_usual_arithmetic_conversions): Same.
+ * testsuite/g++.dg/conversion/simd2.C: New.
+
+2005-06-08 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/19497
+ * cp-tree.def (USING_DECL): Update documentation.
+ * cp-tree.h (DECL_DEPENDENT_P): New.
+ (USING_DECL_DECLS, USING_DECL_SCOPE): New.
+ * class.c (handle_using_decl): Move most of the processing to ...
+ * name-lookup.c (do_class_using_decl): ... here. Make stricter.
+ (push_using_decl): Use USING_DECL_SCOPE.
+ (cp_emit_debug_info_for_using): Make extern.
+ * cxx-pretty-print.c (pp_cxx_statement) <USING_DECL case>: Adjust.
+ * name-lookup.h (cp_emit_debug_info_for_using): Declare.
+ * pt.c (tsubst_decl) <USING_DECL case>: Use do_class_using_decl
+ when tsubsting.
+ (tsubst_expr): Use USING_DECL_SCOPE.
+ * search.c (lookup_field_1): Use DECL_DEPENDENT_P.
+ * semantics.c (finish_member_declaration): Likewise.
+
+2005-06-08 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ PR c++/19894
+ * pt.c (tsubst): Reject pointer-to-member of type void.
+
+ PR c++/20563
+ * parser.c (cp_parser_label_declaration): Deal with invalid/missing
+ identifiers.
+
+2005-06-07 Nathan Sidwell <nathan@codesourcery.com>
+
+ * cp-tree.def (DEFAULT_ARG): Adjust documentation.
+ * cp-tree.h (DEFARG_INSTANTIATIONS): New.
+ (struct tree_default_arg): Add instantiations member.
+ * parser.c (cp_parser_late_parsing_default_args): Adjust to use a
+ VEC.
+ * pt.c (tsubst_arg_types): Likewise.
+
+ * parser.c (cp_parser_late_parsing_default_args): Fix overeager
+ assert in previous patch.
+
+2005-06-06 Jakub Jelinek <jakub@redhat.com>
+
+ * error.c (locate_error): Use gmsgid instead of msgid for argument
+ name.
+ (cp_error_at, cp_warning_at, cp_pedwarn_at): Likewise.
+
+2005-06-06 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR 21903
+ * cp-tree.def (DEFAULT_ARG): Document TREE_CHAIN use.
+ * parser.c (cp_parser_late_parsing_default_args): Propagate parsed
+ argument to any early instantiations.
+ * pt.c (tsubst_arg_types): Chain early instantiation of default arg.
+
+ PR c++/20637
+ * cp-tree.h (add_method): Add using_decl parameter.
+ * class.c (add_method): Add using_decl parameter. Adjust error
+ messages.
+ (handle_using_decl): Pass the using decl to add_method.
+ (clone_function_decl): Adjust add_member calls.
+ * decl2.c (check_classfn): Likewise.
+ * method.c (lazily_declare_fn): Likewise.
+ * semantics.c (finish_member_declaration): Likewise.
+
+ * method.c (synthesize_method): Use inform, not warning.
+
+2005-06-06 Hans-Peter Nilsson <hp@axis.se>
+
+ * config-lang.in (target_libs): Remove target-gperf.
+
+2005-06-05 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/21619
+ * cp-tree.h (DECL_IS_BUILTIN_CONSTANT_P): New macro.
+ * parser.c (cp_parser_postfix_expression): Allow non-constant
+ expressions as arguments to __builtin_constant_p.
+ * tree.c (builtin_valid_in_constant_expr_p): Use
+ DECL_IS_BUILTIN_CONSTANT_P.
+
+2005-06-03 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/21853
+ * typeck.c (casts_away_constness_r): Do not drop cv-qualifiers on
+ the pointed-to type for a pointer-to-member.
+
+ PR c++/21336
+ * cp-tree.h (grok_op_properties): Remove friendp parameter.
+ * decl.c (grokfndecl): Adjust call.
+ (grok_op_properties): Determine the class of which the function is
+ a member by looking at its DECL_CONTEXT, not current_class_type.
+ * pt.c (tsubst_decl): Adjust call to grok_op_properties.
+
+2005-06-02 Nathan Sidwell <nathan@codesourcery.com>
+
+ * method.c (synthesize_method): Add addtional arg to warning call.
+
+ PR c++/21280
+ * Make-lang.in (method.o): Add diagnostic.h
+ * decl.c (start_preparsed_function): Use decl's location for file
+ info.
+ * decl2.c (cp_finish_file): Set input_location before synthesizing
+ a function.
+ (mark_used): When deferring a synthesized function, save current
+ location. Do not set function's location when actually
+ synthesizing it.
+ * method.c: #include diagnostic.h.
+ (synthesize_method): Set the functions source location. Show
+ needed location if errors are emitted.
+
+ * decl.c (start_decl): Simplify specialization handling. Remove
+ unneeded CLASSTYPE_TEMPLATE_INSTANTIATION check.
+ * mangle.c (discriminator_for_local_entity): Use VEC_index.
+
+ PR c++/20350
+ * decl.c (duplicate_decls): Copy all of DECL_USE_TEMPLATE.
+
+ PR c++/21151
+ * name-lookup.c (pushtag): Push local class even in a template.
+
+2005-05-31 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/21165
+ * init.c (integral_constant_value): Check the type of the
+ initializer, not the decl.
+
+2005-05-30 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/21784
+ * name-lookup.c (do_nonmember_using_decl): Ignore builtin
+ functions, even when the used name is not a function.
+
+2005-05-30 Kazu Hirata <kazu@cs.umass.edu>
+
+ * operators.def, optimize.c: Update copyright.
+
+2005-05-28 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/21210
+ * call.c (standard_conversion): Permit conversions to complex
+ types if conversion to the corresponding scalar type would be
+ permitted.
+
+ PR c++/21340
+ * method.c (implicitly_declare_fn): Clear processing_template_decl
+ when generating implicit declaration.
+
+2005-05-27 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/21614
+ * typeck.c (get_member_function_from_ptrfunc): Do not attempt
+ conversions to base classes of incomplete types.
+
+2005-05-27 Ian Lance Taylor <ian@airs.com>
+
+ * semantics.c (add_stmt): Add C++ frontend specific version.
+ * cp-tree.h (STMT_IS_FULL_EXPR_P): Define.
+ (stmts_are_full_exprs_p): Declare.
+
+2005-05-27 Roger Sayle <roger@eyesopen.com>
+ Giovanni Bajo <giovannibajo@gcc.gnu.org>
+
+ * cp-tree.def (UNARY_PLUS_EXPR): New C++ unary tree code.
+ * parser.c (cp_parser_unary_expression): Use UNARY_PLUS_EXPR instead
+ of CONVERT_EXPR.
+ (cp_parser_unary_expression): Likewise.
+ * typeck.c (build_unary_op): Likewise.
+ * call.c (add_builtin_candidate, build_new_op): Likewise.
+ * error.c (dump_expr): Likewise.
+ * pt.c (tsubst_copy, tsubst_copy_and_build): Likewise.
+ * decl.c (ambi_op_p, grok_op_properties): Likewise.
+ * dump.c (dump_op): Likewise.
+ * lex.c (init_operators): Likewise.
+ * operators.def ("+"): Likewise.
+ * cp-gimplify.c (cp_gimplify_expr): Handle UNARY_PLUS_EXPR like a
+ conversion, if the result and argument types differ.
+ * tree.c (fold_if_not_in_template): Fold UNARY_PLUS_EXPR much
+ like a NOP_EXPR when !processing_template_decl.
+
+ * cxx-pretty-print.c (pp_cxx_cast_expression): Prototype.
+ (pp_cxx_unary_expression): Handle new UNARY_PLUS_EXPR tree code.
+
+2005-05-27 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/21455
+ * typeck.c (get_delta_difference): Cope with incomplete but equal
+ classes. Reorder if.
+
+ PR c++/21681
+ * parser.c (cp_parser_late_parsing_for_member): Disable access
+ checking for template functions.
+
+2005-05-26 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ PR c++/21768
+ * pt.c (redeclare_class_template): Change error message according
+ to coding conventions.
+
+2005-05-26 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ * call.c (build_op_delete_call): Fix quoting in error message.
+
+2005-05-25 Richard Henderson <rth@redhat.com>
+
+ PR libgcj/21692
+ * cp-tree.h (make_alias_for): Declare.
+ * decl2.c (build_java_method_aliases): New.
+ (cp_finish_file): Call it.
+ * method.c (make_alias_for): Split out from ...
+ (make_alias_for_thunk): ... here.
+
+2005-05-25 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ PR c++/21686
+ * semantics.c (finish_id_expression): Fix quoting in error message.
+
+2005-05-25 DJ Delorie <dj@redhat.com>
+
+ * decl.c (duplicate_decls): Move warning control from if() to
+ warning(OPT_*).
+ * name-lookup.c (parse_using_directive): Likewise.
+ * parser.c (cp_parser_elaborated_type_specifier): Likewise.
+ (cp_parser_init_declarator): Likewise.
+ * tree.c (handle_com_interface_attribute): Likewise.
+
+2005-05-24 Ziemowit Laski <zlaski@apple.com>
+
+ * class.c (layout_class_type): Do not issue C++ ABI warnings
+ for ObjC structs.
+ * decl.c (objc_mark_locals_volatile): Streamline by calling
+ objc_volatilize_decl().
+ * parser.c (cp_parser_objc_message_expression): Allow simple
+ type specifiers (instead of merely type names) as message
+ receivers.
+ * pt.c (template_args_equal): Do not call objc_comptypes().
+ * typeck.c (composite_pointer_type): If both pointers are
+ ObjC-esque, arbitrarily choose the first; do not call
+ objc_comptypes().
+ (comptypes): Do not call objc_comptypes().
+ (convert_for_assignment): Call objc_compare_types().
+ (comp_ptr_ttypes_real): Call objc_type_quals_match() before
+ concluding that types do not match.
+
+2005-05-24 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR C++/21645
+ * optimize.c (update_cloned_parm): Copy the TYPE also from the
+ original one.
+
2005-05-19 Jakub Jelinek <jakub@redhat.com>
PR c++/21495
@@ -21,10 +351,11 @@
* decl2.c (determine_visibility): Don't set visibility to
hidden if it has been set explicitly by user.
-2005-05-17 Mike Stump <mrs@apple.com>
+2005-05-17 Ziemowit Laski <zlaski@apple.com>
+ Mike Stump <mrs@apple.com>
Yet more Objective-C++...
-
+
* cp-objcp-common.h (cxx_get_alias_set): Move from
here...
(cxx_warn_unused_global_decl): Likewise.
@@ -131,7 +462,7 @@
* typeck.c (build_unary_op): Do not resort to address arithmetic
when taking the address of a COMPONENT_REF.
-
+
2005-05-08 Kazu Hirata <kazu@cs.umass.edu>
* class.c (vtbl_init_data_s): Change the type of fns to
@@ -209,8 +540,8 @@
2005-05-02 Paolo Bonzini <bonzini@gnu.org>
- * semantics.c (finish_call_expr): Call resolve_overloaded_builtin
- for BUILT_IN_MD built-ins.
+ * semantics.c (finish_call_expr): Call resolve_overloaded_builtin
+ for BUILT_IN_MD built-ins.
2005-05-02 Michael Matz <matz@suse.de>
@@ -271,7 +602,7 @@
2005-04-22 Per Bothner <per@bothner.com>
* decl.c (make_rtl_for_nonlocal_decl): Don't try get_fileinfo if
- input_filename is NULL, as it is for (say) __PRETTY_FUNCTION__.
+ input_filename is NULL, as it is for (say) __PRETTY_FUNCTION__.
2005-04-22 Alexandre Oliva <aoliva@redhat.com>
@@ -302,7 +633,7 @@
* decl2.c (check_classfn): Adjust.
* init.c (sort_mem_initializers, push_base_cleanups): Adjust.
* method.c (do_build_copy_constructor): Adjust.
- * name-lookup.c (new_class_binding, store_binding,
+ * name-lookup.c (new_class_binding, store_binding,
store_bindings, store_class_bindings): Adjust.
* name-lookup.h: Define VEC(cxx_saved_binding,gc),
VEC(cp_class_binding,gc).
@@ -358,7 +689,7 @@
* typeck.c (cxx_sizeof_or_alignof_type): Check whether the type to
which sizeof/alignof is dependent, rather than just whether we are
processing_template_decl.
-
+
2005-04-17 Kazu Hirata <kazu@cs.umass.edu>
* cp-tree.h (LOOKUP_GLOBAL): Remove.
@@ -388,7 +719,7 @@
* decl2.c (determine_visibility): Don't use export_class_data.
(import_export_decl): Honor TARGET_CXX_CLASS_DATA_ALWAYS_WEAK and
- TARGET_CXX_DETERMINE_CLASS_DATA_VISIBILITY.
+ TARGET_CXX_DETERMINE_CLASS_DATA_VISIBILITY.
2005-04-09 Kazu Hirata <kazu@cs.umass.edu>
@@ -447,7 +778,7 @@
(cp_parser_type_specifier_seq): In a condition, do not allow
invalid type-specifier combinations.
(cp_parser_exception_declaration): Adjust call to
- cp_parser_type_specifier_seq.
+ cp_parser_type_specifier_seq.
* cp-tree.def (TINST_LEVEL): Document TINST_IN_SYSTEM_HEADER_P.
* cp-tree.h (struct tinst_level): Add in_system_header_p.
@@ -730,14 +1061,14 @@
(lookup_template_class, instantiate_class_template): Adjust call
to pushtag.
* semantics.c (begin_class_definition): Likewise.
- * rtti.c (init_rtti_processing, build_dynamic_cast_1,
+ * rtti.c (init_rtti_processing, build_dynamic_cast_1,
tinfo_base_init, emit_support_tinfos): Use ts_current instead of
ts_global.
2005-03-13 Mark Mitchell <mark@codesourcery.com>
PR c++/20157
- * pt.c (determine_specialization): Reject non-specializations.
+ * pt.c (determine_specialization): Reject non-specializations.
2005-03-11 Per Bothner <per@bothner.com>
@@ -763,7 +1094,7 @@
2005-03-09 Paolo Carlini <pcarlini@suse.de>
- PR c++/16859
+ PR c++/16859
* decl.c (complete_array_type): In pedantic mode, return
3 for an empty initializer list as the initializer for an
array of unknown bound (8.5.1/4).
@@ -784,7 +1115,7 @@
(cp_finish_decl): Remove dead code.
* init.c (build_vec_init): When determining whether or not the
element type has an asignment operator, look through all array
- dimensions.
+ dimensions.
* typeck.c (target_type): Remove.
2005-03-07 Mark Mitchell <mark@codesourcery.com>
@@ -818,7 +1149,7 @@
PR c++/20232
* class.c (update_vtable_entry_for_fn): Don't crash on invalid
- covariancy.
+ covariancy.
* cp-tree.g (THUNK_TARGET): Expand comment.
* method.c (use_thunk): Make sure we also use the target, if that
@@ -873,7 +1204,7 @@
PR c++/20152
* parser.c (cp_parser_class_head): Check for redefintions here.
* semantics.c (begin_class_definition): Not here.
-
+
PR c++/20153
* decl2.c (build_anon_union_vars): Add type parameter.
(finish_anon_union): Pass it.
@@ -886,15 +1217,15 @@
* parser.c (cp_parser_direct_declarator): Always complain about
non-constant array bounds when in a function scope.
* semantics.c (finish_id_expression): Do not mark dependent names
- as non-constant.
+ as non-constant.
2005-02-21 Douglas Gregor <dgregor@cs.indiana.edu>
-
+
PR c++/19076
PR c++/6628
* cp-tree.h (cp_apply_type_quals_to_decl): Declared.
* decl.c (grokdeclarator): Pedwarn about qualifying a function
- type.
+ type.
Add qualifiers when declaring a typedef of a function type.
Member function pointers pick up the qualifiers of the typedef
used to declare them.
@@ -905,7 +1236,7 @@
(start_preparsed_function): Use cp_apply_type_quals_to_decl.
(grokclassfn): Use cp_apply_type_quals_to_decl.
* error.c (dump_type_suffix): Print qualifiers for function
- types.
+ types.
* pt.c (tsubst_decl): Use cp_apply_type_quals_to_decl.
(tsubst): When substituting a function type into a member
pointer type, pass along the qualifiers.
@@ -6087,7 +6418,7 @@
(cp_parser_direct_declarator): Likewise.
* pt.c (tsubst): Likewise.
(tsubst_copy, tsubst_copy_and_build): Likewise; also add new operand
- for COMPONENT_REF.
+ for COMPONENT_REF.
* semantics.c (finish_non_static_data_member): Add new operand
for COMPONENT_REF.
* typeck.c (build_class_member_access_expr): Likewise.
diff --git a/gcc/cp/ChangeLog-1994 b/gcc/cp/ChangeLog-1994
index 1ec125fa86d..24d635df7d3 100644
--- a/gcc/cp/ChangeLog-1994
+++ b/gcc/cp/ChangeLog-1994
@@ -805,7 +805,7 @@ Sat Oct 1 15:18:49 1994 Jason Merrill <jason@phydeaux.cygnus.com>
push_c_function_context.
(pop_cp_function_context): Similarly.
(finish_function): Reverse order of poplevel and pop_nested_class so
- that current_class_decl is restored properly.
+ that current_class_decl is restored properly.
(start_function): Likewise.
(finish_function): Add parameter 'nested'. Don't call
permanent_allocation if (nested).
diff --git a/gcc/cp/ChangeLog-1999 b/gcc/cp/ChangeLog-1999
index b89cd350ae9..4b17345d166 100644
--- a/gcc/cp/ChangeLog-1999
+++ b/gcc/cp/ChangeLog-1999
@@ -7,7 +7,7 @@
(determine_primary_base): ... this. Simplify.
(create_vtable_ptr): Tweak accordingly.
(finish_struct_1): Simplify.
-
+
* cp-tree.h (CLASSTYPE_VBASECLASSES): Update documentation.
(CLASSTYPE_N_BASECLASSES): Likewise.
(BINFO_FOR_VBASE): New macro.
@@ -27,7 +27,7 @@
(get_vbase_types): Don't return a value. Set
CLASSTYPE_VBASECLASSES here.
* typeck.c (get_delta_difference): Use BINFO_FOR_VBASE.
-
+
1999-12-30 Mark Mitchell <mark@codesourcery.com>
* class.c (fixup_inline_methods): Clear CLASSTYPE_INLINE_FRIENDS.
@@ -56,10 +56,10 @@
(fixup_inline_methods): New function.
* method.c (fixup_pending_inline): Remove.
(do_inline_function_hair): Likewise.
-
+
* decl.c (BOOL_TYPE_SIZE): Bools always have size `1' under the
new ABI.
-
+
* cp-tree.h (lang_type): Replace abstract_virtuals with pure_virtuals.
(CLASSTYPE_ABSTRACT_VIRTUALS): Rename to ...
(CLASSTYPE_PURE_VIRTUALS): ... this.
@@ -86,7 +86,7 @@
* typeck2.c (abstract_virtuals_error): Likewise.
* xref.c (GNU_xref_member): Likewise.
* search.c (get_abstract_virtuals): Rename to get_pure_virtuals.
-
+
1999-12-26 Zack Weinberg <zack@wolery.cumb.org>
* cp-tree.h: Replace ENABLE_CHECKING with ENABLE_TREE_CHECKING
@@ -98,7 +98,7 @@
DECL_RESULT, not the mode of DECL_RESULT itself.
* semantics.c (finish_named_return_value): Set DECL_UNINLINABLE
for functions that used named return values.
-
+
1999-12-24 Mark Mitchell <mark@codesourcery.com>
* semantics.c (expand_body): Use
@@ -127,7 +127,7 @@
the first field in the class.
* tree.c (layout_basetypes): Use CLASSTYPE_N_BASECLASSES. Handle
seeing TYPE_VFIELD as the first field in the class.
-
+
* cp-tree.h (TYPE_VIRTUAL_P): Rename to ...
(TYPE_POLYMORPHIC_P): ... this.
(TYPE_USES_COMPLEX_INHERITANCE): Rename to ...
@@ -160,7 +160,7 @@
* typeck.c (build_component_ref): Likewise.
(build_component_addr): Likewise.
* typeck2.c (process_init_constructor): Likewise.
-
+
1999-12-20 Nathan Sidwell <nathan@acm.org>
* typeck.c (strip_all_pointer_quals): New static function.
@@ -196,7 +196,7 @@
(avoid_overlap): Moved here from tree.c.
(build_base_fields): Likewise.
(check_bases): New function, split out from finish_base_struct.
- (check_bases_and_members): New function, split out from
+ (check_bases_and_members): New function, split out from
finish_struct_1.
(struct base_info): Remove cant_have_default_ctor,
cant_have_const_ctor, cant_have_asn_ref.
@@ -209,7 +209,7 @@
(build_base_fields): Don't declare.
* tree.c (avoid_overlap): Remove.
(build_base_fields): Likewise.
-
+
* optimize.c (struct inline_data): Remove scope_stmt.
(remap_block): Don't use insert_block_after_note. Don't update
scope_stmt.
@@ -244,7 +244,7 @@
* method.c (fixup_pending_inline): New function, split out from ...
(do_inline_function_hair): ... here.
* tree.c (build_vbase_pointer_fields): Remove.
-
+
1999-12-15 Jason Merrill <jason@casey.cygnus.com>
* tree.c (walk_tree): Walk operand subtrees in forward order.
@@ -367,7 +367,7 @@
(expand_body): Use it.
* tree.c (walk_tree): Special-case TARGET_EXPRs since they
sometimes present the same sub-tree twice.
-
+
* dump.c (dequeue_and_dump): Abbreviate `class' as `cls', not
`csl'.
@@ -375,7 +375,7 @@
* typeck.c (c_expand_start_case): Here.
* semantics.c (do_poplevel): Remove unused variable.
-
+
1999-12-06 Mark Mitchell <mark@codesourcery.com>
* tree.c (walk_tree): Don't recurse into DECL_INITIAL or DECL_SIZE
@@ -418,7 +418,7 @@
parameters of the inlined function.
(optimize_function): Prevent recursion into partially complete
functions.
-
+
* cp-tree.def (SCOPE_STMT): Take one operand.
* cp-tree.h (SCOPE_STMT_BLOCK): New macro.
(SCOPE_NULLIFIED_P): Redefine.
@@ -441,7 +441,7 @@
* tree.c (copy_tree_r): Clear SCOPE_STMT_BLOCK rather than setting
SCOPE_NULLIFIED_P.
* Makefile.in (semantics.o): Depend on RTL_H.
-
+
* decl2.c (pending_statics_used): Make it a macro.
(saved_inlines_used): Likewise.
(finish_static_data_member_decl): Use VARRAY_PUSH_TREE.
@@ -449,13 +449,13 @@
(ssdf_decls_used): Remove.
(start_static_storage_duration_function): Use VARRAY_PUSH_TREE.
(generate_ctor_or_dtor_function): Adjust accordingly.
-
+
1999-11-24 Geoffrey Keating <geoffk@cygnus.com>
Greg McGary <gkm@gnu.org>
* decl.c (duplicate_decls): Merge
- DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT,
- DECL_NO_CHECK_MEMORY_USAGE, DECL_NO_LIMIT_STACK.
+ DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT,
+ DECL_NO_CHECK_MEMORY_USAGE, DECL_NO_LIMIT_STACK.
1999-12-02 Mike Stump <mrs@wrs.com>
@@ -483,7 +483,7 @@
* typeck.c (build_component_ref): Don't use scratch_ovl_cons.
(build_x_function_call): Likewise.
(build_c_cast): Don't use min_tree_cons.
-
+
1999-11-29 Mark Mitchell <mark@codesourcery.com>
* pt.c (tsubst_decl): Robustify.
@@ -497,7 +497,7 @@
1999-11-25 Mark Mitchell <mark@codesourcery.com>
- * Make-lang.in (CXX_SRCS): Add optimize.c.
+ * Make-lang.in (CXX_SRCS): Add optimize.c.
* Makefile.in (CXX_OBJS): Add optimize.o.
(CXX_TREE_H): Add splay-tree.h, system.h, and $(CONFIG_H).
(spew.o, lex.o, decl.o, decl2.o, typeck2.o, typeck.o): Adjust.
@@ -505,9 +505,9 @@
(search.o, tree.o, ptree.o, rtti.o, except.o, expr.o): Likewise.
(xref.o, pt.o, error.o, errfn.o, repo.o, semantics.o): Likewise.
(dump.o): Likewise.
- (optimize.o): New target.
+ (optimize.o): New target.
* class.c: Don't include splay-tree.h.
- * cp-tree.def (CTOR_COMPLETE): Rename to CTOR_STMT.
+ * cp-tree.def (CTOR_COMPLETE): Rename to CTOR_STMT.
* cp-tree.h: Include splay-tree.h.
(DECL_UNINLINABLE): New macro.
(CTOR_BEGIN_P, CTOR_END_P): New macros.
@@ -517,7 +517,7 @@
(optimize_function): Likewise.
(cplus_unsave_expr_now): Remove.
(copy_tree_r): Declare.
- (remap_save_expr): Likewise.
+ (remap_save_expr): Likewise.
* decl.c (local_variable_p): Don't
make it static.
(local_variable_p_walkfn): New function.
@@ -530,19 +530,19 @@
(start_function): Set the DECL_CONTEXT for automatically generated
labels.
(finish_constructor_body): Use CTOR_STMT to mark the end of a
- constructor.
+ constructor.
* decl2.c: Don't include splay-tree.h.
- (flag_inline_trees): Define.
+ (flag_inline_trees): Define.
* dump.c: Don't include
- splay-tree.h.
+ splay-tree.h.
* except.c (expand_end_catch_block): Fix comment formatting.
(expand_end_eh_spec): Set DECL_CONTEXT on temporary variables.
- (expand_throw): Tidy comment.
- * init.c (build_vec_delete_1): Use create_temporary_var.
+ (expand_throw): Tidy comment.
+ * init.c (build_vec_delete_1): Use create_temporary_var.
* lex.c (cplus_tree_code_type): Make it static.
(cplus_tree_code_length): Likewise.
- (cplus_tree_code_name): Likewise.
- * optimize.c: New file.
+ (cplus_tree_code_name): Likewise.
+ * optimize.c: New file.
* semantics.c (finish_goto_stmt): Set DECL_UNLINABLE for functions
with computed gotos.
(setup_vtbl_ptr): Mark the beginnings of constructors with
@@ -564,11 +564,11 @@
(init_tree): Set lang_unsave to cp_unsave.
(remap_save_expr): Define.
* ir.texi: Document CTOR_STMT.
-
+
1999-11-24 Jason Merrill <jason@casey.cygnus.com>
* search.c (note_debug_info_needed): Do perform this optimization
- for dwarf2.
+ for dwarf2.
(maybe_suppress_debug_info): Likewise. Start by clearing
TYPE_DECL_SUPPRESS_DEBUG.
@@ -599,7 +599,7 @@
(finish_function): Don't call end_protect_partials here.
* ir.texi (CTOR_COMPLETE): Document it.
* semantics.c (expand_stmt): Handle it.
-
+
* cp-tree.def (FUNCTION_NAME): New tree node.
* cp-tree.h (current_function_name_declared): Tweak documentation.
(lang_decl_flags): Add pretty_function_p, adjust dummy.
@@ -617,7 +617,7 @@
even in template functions.
(setup_vtbl_ptr): Don't declare __PRETTY_FUNCTION in the
conditional scope at the top of a destructor.
-
+
* error.c (dump_function_decl): Use `[ with ... ]' syntax for
specializations too.
@@ -659,7 +659,7 @@
1999-11-15 Jason Merrill <jason@casey.cygnus.com>
* cp-tree.h, decl.c (compute_array_index_type): Make nonstatic.
- * pt.c (tsubst, case INTEGER_TYPE): Call it.
+ * pt.c (tsubst, case INTEGER_TYPE): Call it.
Check uses_template_parms.
* class.c (finish_struct): If we're a local class in a template
@@ -674,7 +674,7 @@
* cp-tree.h: Declare it.
* decl2.c (finish_vtable_vardecl): Override TYPE_DECL_SUPPRESS_DEBUG
if we're writing out the vtable.
- * decl.c, search.c (dfs_debug_mark, dfs_debug_unmarked_p,
+ * decl.c, search.c (dfs_debug_mark, dfs_debug_unmarked_p,
note_debug_info_needed): #if 0 out.
1999-11-14 Mark Mitchell <mark@codesourcery.com>
@@ -684,7 +684,7 @@
TREE_PERMANENT.
* decl.c (pushdecl): Set DECL_LOCAL_FUNCTION_P.
* decl2.c (lookup_arg_dependent): Use it.
-
+
* cp-tree.h (cp_finish_decl): Change prototype.
(finish_static_data_member_decl): Likewise.
(push_permanent_obstack): Remove declaration.
@@ -779,7 +779,7 @@
(push_expression_obstack): Remove.
(push_permanent_obstack): Likewise.
* typeck.c (mark_addressable): Likewise.
-
+
1999-11-13 Mark Mitchell <mark@codesourcery.com>
* call.c (build_conditional_expr): Use build_target_expr_with_type.
@@ -858,9 +858,9 @@ Thu Nov 11 12:42:11 MST 1999 Diego Novillo <dnovillo@cygnus.com>
(structsp): Adjust.
* parse.c: Regenerated.
* pt.c (tsubst_enum): Adjust according to build_enumerator changes.
-
+
Wed Nov 10 12:43:21 1999 Philippe De Muyter <phdm@macqel.be>
- Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+ Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* cp-tree.h: Test `GCC_VERSION', not `HAVE_GCC_VERSION'.
@@ -913,7 +913,7 @@ Wed Nov 10 12:43:21 1999 Philippe De Muyter <phdm@macqel.be>
* pt.c (tsubst_expr): Don't suspend_momentary or resume_momentary.
* semantics.c (begin_new_placement): Remove.
(finish_new_placement): Likewise.
-
+
1999-11-05 Martin v. Löwis <loewis@informatik.hu-berlin.de>
* cp-tree.h (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK): New macro.
@@ -933,7 +933,7 @@ Wed Nov 10 12:43:21 1999 Philippe De Muyter <phdm@macqel.be>
* pt.c (tinst_level_tick): Make it static.
(last_template_error_tick): Likewise.
-
+
* cp-tree.h (mapcar): Remove declaration.
(search_tree): Likewise.
(walk_tree_fn): New typedef.
@@ -953,7 +953,7 @@ Wed Nov 10 12:43:21 1999 Philippe De Muyter <phdm@macqel.be>
(check_default_argument): Use walk_tree.
* pt.c (for_each_template_parm_r): New function, split out from ...
(for_each_template_parm): Here. Use it, via walk_tree.
-
+
1999-11-03 Mark Mitchell <mark@codesourcery.com>
* class.c (check_bitfield_decl): New function, split out from
@@ -962,7 +962,7 @@ Wed Nov 10 12:43:21 1999 Philippe De Muyter <phdm@macqel.be>
anonymous structs.
(finish_struct_1): Use them.
* cp-tree.h (ANON_UNION_TYPE_P): New macro.
-
+
1999-11-02 Mark Mitchell <mark@codesourcery.com>
* decl.c (grokfndecl): Remove dead code.
@@ -1002,7 +1002,7 @@ Sat Oct 30 22:42:50 1999 Stephen L Moshier <moshier@mediaone.net>
function. Clear DECL_SAVED_TREE after generating RTL for a
function.
* Makefile.in (semantics.o): Depend on ggc.h.
-
+
1999-10-29 Mark Mitchell <mark@codesourcery.com>
* cp-tree.h (make_typename_type): Change prototype.
@@ -1014,7 +1014,7 @@ Sat Oct 30 22:42:50 1999 Stephen L Moshier <moshier@mediaone.net>
* pt.c (convert_template_argument): Pass complain to
make_typename_type.
(tsubst): Likewise.
-
+
1999-10-28 Mark Mitchell <mark@codesourcery.com>
* semantics.c (finish_handler): End the scope of the handler
@@ -1059,7 +1059,7 @@ Sat Oct 30 22:42:50 1999 Stephen L Moshier <moshier@mediaone.net>
(do_pushlevel): Likewise.
(do_poplevel): Likewise.
* tree.c (make_temp_vec): Remove.
-
+
* dump.c (dequeue_and_dump): Dump HANDLERs and SAVE_EXPRs. Dump
CLEANUP_P for a TRY_BLOCK.
* ir.texi: Document SAVE_EXPR.
@@ -1068,7 +1068,7 @@ Tue Oct 26 23:29:56 1999 Jeffrey A Law (law@cygnus.com)
* call.c (build_over_call): Check that the built-in function is
of class BUILT_IN_NORMAL before trying to recongize it as BUILT_IN_ABS.
- * typeck.c (build_function_call_real): Similarly.
+ * typeck.c (build_function_call_real): Similarly.
1999-10-26 Mark Mitchell <mark@codesourcery.com>
@@ -1078,7 +1078,7 @@ Tue Oct 26 23:29:56 1999 Jeffrey A Law (law@cygnus.com)
1999-10-24 Mark Mitchell <mark@codesourcery.com>
* decl.c (push_overloaded_decl_1): Use pushdecl.
-
+
* decl.c (auto_function): Replace #ifdef'd __inline with just
plain inline.
* lex.c (my_get_run_time): Likeise.
@@ -1092,7 +1092,7 @@ Tue Oct 26 23:29:56 1999 Jeffrey A Law (law@cygnus.com)
(issue_ktype): Likewise.
* parse.y (empty_parms): Likewise.
* parse.c: Regenerated.
-
+
1999-10-21 Mark Mitchell <mark@codesourcery.com>
* dump.c (dequeue_and_dump): Replace several uses of
@@ -1114,12 +1114,12 @@ Tue Oct 26 23:29:56 1999 Jeffrey A Law (law@cygnus.com)
(do_pushlevel): Use it.
(do_poplevel): Use it.
(expand_stmt): Check SCOPE_PARTIAL_P.
-
+
* cp-tree.def (EMPTY_CLASS_EXPR): New tree node.
* call.c (build_call): Use EMPTY_CLASS_EXPR instead of RTL_EXPR.
* expr.c (cplus_expand_expr): Expand it.
* ir.texi: Document EMPTY_CLASS_EXPR.
-
+
1999-10-20 Mark Mitchell <mark@codesourcery.com>
* cp-tree.h (DECL_NAMESPACE_SCOPE_P): Don't treat template
@@ -1147,7 +1147,7 @@ Tue Oct 26 23:29:56 1999 Jeffrey A Law (law@cygnus.com)
* dump.c (dequeue_and_dump): Handle CLEANUP_POINT_EXPR.
* ir.texi: Clean up documentation of RETURN_INIT.
-
+
1999-10-15 Greg McGary <gkm@gnu.org>
* lex.c (lang_init_options): Set flag_bounds_check as "unspecified".
@@ -1179,7 +1179,7 @@ Wed Oct 13 22:01:35 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
* cp-tree.h (build_x_va_arg): Prototype new function.
* call.c (build_x_va_arg): Define it.
* parse.y (unary_expr): Call build_x_va_arg.
-
+
* cp-tree.h (convert_type_from_ellipsis): Prototype new function.
* call.c (convert_type_from_ellipsis): Define it.
* decl.c (init_decl_processing): Set lang_type_promotes_to.
@@ -1197,12 +1197,12 @@ Wed Oct 13 22:01:35 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
1999-10-09 Mark Mitchell <mark@codesourcery.com>
- * cp-tree.h (make_rtl_for_local_static): New function.
+ * cp-tree.h (make_rtl_for_local_static): New function.
* decl.c (make_rtl_for_nonlocal_decl): Move code to create RTL for
local statics ...
(make_rtl_for_local_static): Here.
* semantics.c (expand_stmt): Use make_rtl_for_local_static.
-
+
1999-10-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* method.c: Include tm_p.h.
@@ -1212,12 +1212,12 @@ Wed Oct 13 22:01:35 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
* cp-tree.h (cp_make_lake_type): Renamed from make_lang_type.
* lex.c (cp_make_lake_type): Likewise.
* tree.c (init_tree): Init make_lang_type_fn.
-
+
1999-10-07 Mark Mitchell <mark@codesourcery.com>
* pt.c (tsubst_expr): Set DECL_TEMPLATE_INSTANTIATED for a catch
parameter.
-
+
* semantics.c (expand_stmt): Don't pretend to have asmspecs for
local statics if we don't really have them.
@@ -1258,7 +1258,7 @@ Wed Oct 13 22:01:35 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
(expand_upcast_fixups): Likewise.
* typeck.c (build_component_ref): Likewise.
(build_binary_op_nodefault): Likewise.
-
+
* dump.c (dqueue_and_dump): Dump TYPE_VFIELD.
* ir.texi: Document TYPE_VFIELD.
@@ -1283,21 +1283,21 @@ Wed Oct 13 22:01:35 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
(dequeue_and_dump): Unconditionally print children. Adjust calls
to functions mentioned above.
(dump_node): Pass DUMP_NONE, instead of DUMP_CHILDREN to queue.
-
+
* ir.texi: Document BIND_EXPR, LOOP_EXPR, and EXIT_EXPR.
* dump.c (dequeue_and_dump): Dump them.
-
+
* method.c (synthesize_method): Call setup_vtbl_ptr for destructors.
* decl.c (start_function): Set current_in_charge_parm for
constructors, too, where appropriate.
* search.c (fixup_all_virtual_upcast_offsets): New function.
(expand_indirect_vtbls_init): Use it.
-
+
1999-10-04 Nathan Sidwell <nathan@acm.org>
* decl2.c (grok_alignof): Don't decay lvalues.
-
+
* init.c (build_new): Remove unused variable.
1999-10-04 Mark Mitchell <mark@codesourcery.com>
@@ -1306,7 +1306,7 @@ Wed Oct 13 22:01:35 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
(static_labelno): Remove macro.
* method.c (build_overload_nested_name): Make static_labelno
static here.
-
+
* pt.c (instantiate_decl): Use DECL_SAVED_TREE, not DECL_INITIAL,
to decide whether or not a function is defined.
@@ -1350,7 +1350,7 @@ Wed Oct 13 22:01:35 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
(building_stmt_tree): Simplify.
* decl.c (mark_stmt_tree): New function.
(mark_saved_scope): Use it.
- (start_function): Rearrange slightly to call begin_stmt_tree
+ (start_function): Rearrange slightly to call begin_stmt_tree
earlier.
(save_function_data): Tweak.
(finish_function): Adjust call to finish_stmt_tree.
@@ -1372,17 +1372,17 @@ Wed Oct 13 22:01:35 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
(finish_stmt_tree): Likewise.
* tree.c (search_tree): Don't handle VEC_INIT_EXPR.
(mapcar): Likewise.
-
+
* parse.y (simple_stmt): Don't call finish_stmt unnecessarily.
* parse.c: Regenerated.
-
+
* dump.c (dqueue_and_dump): Dump bitfieldness.
-
+
* tree.c (lvalue_p_1): Use DECL_C_BIT_FIELD to check for
bitfields, rather than DECL_BIT_FIELD.
* ir.texi: Document how to tell whether or not a field is a
bitfield.
-
+
* lex.c (make_lang_type): Fix typo in comment.
1999-10-01 Jason Merrill <jason@yorick.cygnus.com>
@@ -1410,7 +1410,7 @@ Wed Oct 13 22:01:35 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
(DECL_GLOBAL_CTOR_P, DECL_GLOBAL_DTOR_P): New macros.
(GLOBAL_INIT_PRIORITY): Likewise.
* decl.c (lang_mark_tree): Adjust accordingly.
- (start_objects): Set DECL_GLOBAL_CTOR_P, DECL_GLOBAL_DTOR_P,
+ (start_objects): Set DECL_GLOBAL_CTOR_P, DECL_GLOBAL_DTOR_P,
and GLOBAL_INIT_PRIORITY.
* dump.c (dequeue_and_dump): Print them.
* ir.texi: Document them.
@@ -1432,7 +1432,7 @@ Wed Oct 13 22:01:35 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
(prune_vars_needing_no_initialization): New function.
(write_out_vars): Likewise.
(finish_file): Use the various new functions instead of the old.
-
+
Thu Sep 30 00:13:27 1999 Dirk Zoller <duz@rtsffm.com>
* cp-tree.h (warn_float_equal): Declare.
@@ -1492,7 +1492,7 @@ Thu Sep 30 00:13:27 1999 Dirk Zoller <duz@rtsffm.com>
(TMPL_ARG, SET_TMPL_ARG, NUM_TMPL_ARGS, TMPL_PARMS_DEPTH): Likewise.
(tsubst_copy): Clarify variable name.
(most_general_template): Robustify.
-
+
1999-09-29 Nathan Sidwell <nathan@acm.org>
* error.c (dump_template_parms): Don't use TS_PEDANTIC_NAME
@@ -1513,7 +1513,7 @@ Thu Sep 30 00:13:27 1999 Dirk Zoller <duz@rtsffm.com>
* semantics.c: Include flags.h.
(expand_body): Don't do RTL generation if -fsyntax-only.
* Makefile.in (semantics.o): Depends on flags.h.
-
+
1999-09-28 Gabriel Dos Reis <gdr@codesourcery.com>
* pt.c (most_general_template): Adjust declaration.
@@ -1613,7 +1613,7 @@ Thu Sep 30 00:13:27 1999 Dirk Zoller <duz@rtsffm.com>
(cplus_expand_expr): Don't call expand_throw here.
* Makefile.in (expr.o): Depend on except.h.
* ir.texi: Update documentation for THROW_EXPR.
-
+
* decl.c (start_function): Set x_dont_save_pending_sizes rather
than calling get_pending_sizes.
* init.c (build_new): Don't save and restore
@@ -1645,7 +1645,7 @@ Thu Sep 30 00:13:27 1999 Dirk Zoller <duz@rtsffm.com>
function split out from c_expand_return.
(check_return_expr): Likewise.
(c_expand_return): Just generate the RTL for the return.
-
+
1999-09-24 Mark Mitchell <mark@codesourcery.com>
* cp-tree.h (CPTI_CLEANUP_TYPE): New macro.
@@ -1692,7 +1692,7 @@ Fri Sep 24 10:48:10 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(make_rtl_for_nonlocal_decl): Don't fuss with obstacks. Simplify.
Don't accidentally make RTL for local declarations.
(emit_local_var): Handle declarations with asm-specifiers here.
-
+
1999-09-23 Mark Mitchell <mark@codesourcery.com>
* ir.texi: Improve documentation for TARGET_EXPRs. Discuss
@@ -1706,21 +1706,21 @@ Fri Sep 24 10:48:10 1999 Bernd Schmidt <bernds@cygnus.co.uk>
in function-at-a-time mode.
(finish_objects): Likewise.
(generate_ctor_or_dtor_function): Adjust accordingly.
-
+
* cp-tree.h (DECL_ANON_UNION_ELEMS): New macro.
* decl2.c (finish_anon_union): Set DECL_ANON_UNION_ELEMS.
Don't call expand_anon_union_decl here
* semantics.c (exapnd_stmt): Call it here, instead.
* typeck.c (mark_addressable): Addressed variables are implicitly
used.
-
+
1999-09-23 Martin v. Löwis <loewis@informatik.hu-berlin.de>
* cp-tree.h (VAR_OR_FUNCTION_DECL_CHECK): New macro.
(RECORD_OR_UNION_TYPE_CHECK, LANG_IDENTIFIER_CAST): Likewise.
(DEFARG_NODE_CHECK): Remove; replace with DEFAULT_ARG_CHECK.
* cp-tree.h: Add tree checking macros to various tree access
- macros.
+ macros.
* ptree.c (print_lang_decl): Test for function or variable
before accessing template info.
@@ -1730,7 +1730,7 @@ Fri Sep 24 10:48:10 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* lang-specs.h: If -fshort-wchar, override __WCHAR_TYPE__.
* decl2.c (lang_f_options): Add -fshort-wchar.
* cp-tree.h: Declare flag_short_wchar.
- * decl.c (init_decl_processing): If -fshort-wchar, use 'short unsigned
+ * decl.c (init_decl_processing): If -fshort-wchar, use 'short unsigned
int' for wchar_t.
1999-09-23 Martin v. Löwis <loewis@informatik.hu-berlin.de>
@@ -1870,7 +1870,7 @@ Fri Sep 24 10:48:10 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* typeck.c (build_modify_expr): Don't check for assignments to
this.
(c_expand_return): Don't suggest assigning to `this'.
-
+
* Makefile.in (decl.o): Depend on RTL_H.
(decl2.o): Likewise.
(class.o): Likewise.
@@ -1885,7 +1885,7 @@ Fri Sep 24 10:48:10 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* ir.texi (CTOR_INITIALIZER): Remove mention. Fix typo. Add
detail about the statement-tree.
-
+
1999-09-20 Nathan Sidwell <nathan@acm.org>
* parse.y (primary): Use build_functional_cast for CV_QUALIFIER.
@@ -1909,7 +1909,7 @@ Mon Sep 20 10:49:05 1999 Bernd Schmidt <bernds@cygnus.co.uk>
1999-09-18 Paul Burchard <burchard@pobox.com>
* gxxint.texi: G++ now implements namespaces.
-
+
1999-09-18 Mark Mitchell <mark@codesourcery.com>
* decl.c (pop_label): Don't warn about unused labels more than
@@ -1929,7 +1929,7 @@ Mon Sep 20 10:49:05 1999 Bernd Schmidt <bernds@cygnus.co.uk>
1999-09-17 Mark Mitchell <mark@codesourcery.com>
- Turn on function-at-a-time processing.
+ Turn on function-at-a-time processing.
* cp-tree.h (doing_semantic_analysis_p): New macro.
(SF_DEFAULT): Define to zero, not SF_EXPAND.
(start_handler_parms): Change prototype.
@@ -1941,7 +1941,7 @@ Mon Sep 20 10:49:05 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(begin_catch_block): Declare.
(finish_handler): Change prototype.
(do_pushlevel): Declare.
- (do_poplevel): Likewise.
+ (do_poplevel): Likewise.
* decl.c (pushlevel): Don't create
binding levels when not doing semantic analysis.
(poplevel): Don't pop them.
@@ -1965,7 +1965,7 @@ Mon Sep 20 10:49:05 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(push_cp_function_context): Don't expand functions without an
explicit call to expand_body.
(mark_lang_function): Make eh_spec_try_block and
- x_scope_stmt_stack.
+ x_scope_stmt_stack.
* except.c (expand_end_eh_spec): Don't
declare.
(process_start_catch_block): Likewise.
@@ -1979,13 +1979,13 @@ Mon Sep 20 10:49:05 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(expand_exception_blocks): Simplify.
(start_anon_func): Use do_pushlevel.
(end_anon_func): Use do_poplvel. Call expand_body for the
- function.
- * expr.c (do_case): Don't call define_case_label.
+ function.
+ * expr.c (do_case): Don't call define_case_label.
* init.c (create_temporary_var): Set DECL_CONTEXT for local
- variables.
+ variables.
* method.c (emit_thunk): Call expand_body for the
thunk.
- (sythesize_method): Likewise.
+ (sythesize_method): Likewise.
* parse.y (handler_args): Give it ttype.
(eat_saved_input): Call expand_body.
(base_init): Use do_pushlevel.
@@ -1995,7 +1995,7 @@ Mon Sep 20 10:49:05 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(handler_args): Don't call expand_start_catch_block. Return the
catch parameter. * pt.c (tsubst_expr): Adjust HANDLER handling.
* parse.c: Regenerated.
- * rtti.c (synthesize_tinfo_fn): Call finish_function.
+ * rtti.c (synthesize_tinfo_fn): Call finish_function.
* semantics.c (do_pushlevel): Give it external linkage. Build
SCOPE_STMTs.
(do_poplevel): Likewise.
@@ -2018,7 +2018,7 @@ Mon Sep 20 10:49:05 1999 Bernd Schmidt <bernds@cygnus.co.uk>
HANDLERs. Handle SCOPE_STMT, CTOR_INITIALIZER, and RETURN_INIT.
(expand_body): Let expand_stmt handle CTOR_INITIALIZER,
RETURN_INIT and function try blocks.
-
+
* cp-tree.h (language_function): Add x_eh_spec_try_block. Add
x_scope_stmt_stack. Add x_in_charge_parm.
(current_eh_spec_try_block): New macro.
@@ -2087,7 +2087,7 @@ Mon Sep 20 10:49:05 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* Makefile.in (CONFLICTS): Adjust.
1999-09-17 Gabriel Dos Reis <gdr@codesourcery.com>
-
+
* error.c: Reduce code duplication.
(dump_template_value): New function.
(dump_type_real): Use it.
@@ -2122,7 +2122,7 @@ Mon Sep 20 10:49:05 1999 Bernd Schmidt <bernds@cygnus.co.uk>
problems with extern "C" functions redeclared as static.
(duplicate_decls): When a builtin is redeclared static, make the
new function have internal linkage.
-
+
1999-09-15 Mark Mitchell <mark@codesourcery.com>
* decl2.c (build_expr_from_tree): Handle VA_ARG_EXPR.
@@ -2141,14 +2141,14 @@ Mon Sep 20 10:49:05 1999 Bernd Schmidt <bernds@cygnus.co.uk>
1999-09-14 Mark Mitchell <mark@codesourcery.com>
- * decl.c (build_target_expr): Set TREE_SIDE_EFFECTS on the
+ * decl.c (build_target_expr): Set TREE_SIDE_EFFECTS on the
TARGET_EXPR.
* call.c (build_over_call): Don't set TREE_SIDE_EFFECTS on
the TARGET_EXPR.
* cvt.c (build_up_reference): Likewise.
* tree.c (build_cplus_new): Likewise.
(get_target_expr): Likewise.
-
+
Tue Sep 14 01:45:10 1999 Marc Espie <espie@cvs.openbsd.org>
* Makefile.in: Prepend $(SHELL) to move-if-change calls.
@@ -2183,8 +2183,8 @@ Sun Sep 12 23:29:07 1999 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* g++spec.c: Include gcc.h.
(lang_specific_driver): Constify a char*. Call xcalloc, not
- xmalloc/bzero. All calls to the function pointer parameter now
- explicitly call `fatal'.
+ xmalloc/bzero. All calls to the function pointer parameter now
+ explicitly call `fatal'.
1999-09-12 Mark Mitchell <mark@codesourcery.com>
@@ -2195,7 +2195,7 @@ Sun Sep 12 23:29:07 1999 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* error.c (dump_expr): Handle OVERLOADs.
* spew.c (probe_obstack): Remove.
* typeck.c (condition_conversion): Use perform_implicit_conversion.
-
+
1999-09-12 Bernd Schmidt <bernds@cygnus.co.uk>
* cp-tree.h (auto_function, define_function): Adjust prototypes.
@@ -2223,7 +2223,7 @@ Sun Sep 12 23:29:07 1999 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
non-permanent CONSTANTs and STRINGs.
* tree.c (build_cplus_array_type_1): Don't fuss with
TREE_PERMANENT on ARRAY_TYPEs.
-
+
* cp-tree.def (CLEANUP_STMT): New node.
* cp-tree.h (language_function): Add name_declared.
(current_function_name_declared): New macro.
@@ -2254,9 +2254,9 @@ Sun Sep 12 23:29:07 1999 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* semantics.c (begin_compound_stmt): Call declare_function_name,
if appropriate.
(finish_decl_cleanup): New function.
- (expand_stmt): Use emit_local_var to output variables.
+ (expand_stmt): Use emit_local_var to output variables.
(expand_body): Set current_function_name_declared.
-
+
1999-09-10 Mark Mitchell <mark@codesourcery.com>
* cp-tree.h (finish_cleanup_try_block): New function.
@@ -2301,7 +2301,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(finish_do_stmt): Likewise.
(finish_for_cond): Likewise.
(expand_cond): Adjust.
-
+
* cp-tree.h (FN_TRY_BLOCK_P): New macro.
* init.c (perform_member_init): Remove obstack machinations.
(expand_cleanup_for_base): Likewise.
@@ -2314,7 +2314,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* pt.c (tsubst_expr): Handle various kinds of try blocks.
* semantics.c (expand_stmts): Remove.
(begin_function_try_block): Set FN_TRY_BLOCK_P.
- (finish_function_try_block): Be careful rechaining
+ (finish_function_try_block): Be careful rechaining
function try blocks.
(expand_stmt): Loop through all the statements at a given level.
(exapnd_body): Be careful with line-numbers here too. Prepare for
@@ -2345,7 +2345,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* semantics.c (RECHAIN_STMTS): Remove `last' parameter.
(RECHAIN_STMTS_FROM_LAST): Remove. Replace all uses with
- RECHAIN_STMTS.
+ RECHAIN_STMTS.
(RECHAIN_STMST_FROM_CHAIN): Likewise.
* parse.y (simple_stmt): Fix typo in last change.
@@ -2366,7 +2366,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(finish_stmt_tree): Tweak line-number handling.
(prep_stmt): New function.
(expand_stmt): Use it.
-
+
* cp-tree.h (begin_switch_stmt): Adjust prototype.
(finish_switch_cond): Likewise.
* parse.y (simple_stmt): Adjust accordingly.
@@ -2393,10 +2393,10 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(language_function): Rename binding_level to bindings.
(cp_function_chain): Use the current_function, not the
outer_function_chain.
- (current_class_ptr): Make it work, even when there's no
+ (current_class_ptr): Make it work, even when there's no
current function.
(current_class_ref): Likewise.
- (SF_DEFAULT, SF_PRE_PARSED, SF_INCLASS_INLINE, SF_EXPAND): New
+ (SF_DEFAULT, SF_PRE_PARSED, SF_INCLASS_INLINE, SF_EXPAND): New
macros.
(clear_temp_name): Remove.
* decl.c (check_function_type): New function, broken out from
@@ -2422,11 +2422,11 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* decl2.c (clear_temp_name): Remove.
(start_objects): Use SF flags to start_function.
(start_static_storage_duration_function): Likewise.
- * except.c (start_anon_func): Remove redundant calls to
+ * except.c (start_anon_func): Remove redundant calls to
push_function_context_to. Use SF flags to start function.
(end_anon_func): Remove redundant call to pop_function_context
from.
- * lex.c (reinit_parse_for_function): Don't initialize per-function
+ * lex.c (reinit_parse_for_function): Don't initialize per-function
data.
* method.c (emit_thunk): Clear current_function after calling
assemble_end_function. Use SF flags for start_function.
@@ -2442,7 +2442,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* rtti.c (sythesize_tinfo_fn): Use SF flags to start_function.
* semantics.c (begin_function_definition): Likewise.
(expand_body): Likewise.
-
+
1999-09-09 Nathan Sidwell <nathan@acm.org>
* cp-tree.h (convert_to_void): Prototype new function.
@@ -2456,7 +2456,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(build_static_cast): Likewise.
(build_c_cast): Likewise.
* semantics.c (finish_expr_stmt): Do not decay full expressions.
-
+
* typeck.c (build_x_compound_expr): Add FIXME.
1999-09-08 Mark Mitchell <mark@codesourcery.com>
@@ -2480,7 +2480,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* typeck.c: Likewise.
* parse.c: Regenerated.
* tree.c (build_srcloc): Simplify.
-
+
1999-09-08 Bruce Korb autogen@linuxbox.com
* Makefile.in: Give the gperf user a hint about why "gperf -F" fails.
@@ -2498,7 +2498,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(retrofit_lang_decl): Likewise.
(copy_lang_decl): Likewise.
- * cp-tree.h (saved_scope): Remove old_binding_level and
+ * cp-tree.h (saved_scope): Remove old_binding_level and
function_decl. Tidy up.
* decl.c (mark_saved_scope): Don't set them.
(maybe_push_to_top_level): Clear memory.
@@ -2511,7 +2511,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(grokvardecl): Don't complete types here.
* decl.c (start_function): Clear last_dtor_insn and
- last_parm_cleanup_insn.
+ last_parm_cleanup_insn.
(push_cp_function_context): Just copy over a little of
the old context, not all of it.
@@ -2555,7 +2555,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* typeckc.c (build_static_cast): Likewise.
(build_reinterpret_cast): Likewise.
(build_const_cast): Likewise.
-
+
1999-09-07 Mark Mitchell <mark@codesourcery.com>
* decl.c (ggc_p): Set it to 1.
@@ -2635,7 +2635,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(binding_init): Remove.
(init_cplus_unsave): Rename to ...
(init_tree): This. Add GC roots.
-
+
1999-09-05 Mark Mitchell <mark@codesourcery.com>
Get ready for garbage collection.
@@ -2678,7 +2678,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(cp_global_trees): Add access_default, access_public,
access_protected, access_private, access_default_virtual,
access_public_virtual, access_protected_virtual,
- access_private_virtual, ctor_identifier, delta2_identifier,
+ access_private_virtual, ctor_identifier, delta2_identifier,
delta_identifier, dtor_identifier, in_charge_identifier,
index_identifier, nelts_identifier, this_identifier,
pfn_identifier, pfn_or_delta2_identifier, vptr_identifier,
@@ -2717,7 +2717,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* decl2.c: Don't include varray.h.
(current_namespace): Remove.
(init_decl2): Add GC roots.
- * except.c (Terminate): Remove.
+ * except.c (Terminate): Remove.
(init_exception_processing): Use terminate_node instead.
(build_terminate_handler): Likewise.
* init.c (nc_nelts_field_id): Remove.
@@ -2752,7 +2752,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(expand_indirect_vtbls_init): Remove redundant declaration of
in_charge_identifier.
(init_search_processing): Use vptr_identifier.
-
+
1999-09-05 Richard Henderson <rth@cygnus.com>
Bernd Schmidt <bernds@cygnus.co.uk>
Mark Mitchell <mark@codesourcery.com>
@@ -2773,7 +2773,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(init_init_processing): Add GC roots.
* parse.y: Include ggc.h.
(cp_parse_init): New function.
-
+
1999-09-04 Mark Mitchell <mark@codesourcery.com>
* decl.c (init_decl_processing): Set mark_lang_status.
@@ -2793,7 +2793,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
x_base_init_list, x_member_init_list, x_base_init_expr,
x_current_class_ptr, x_current_class_ref, x_last_tree,
x_last_expr_type, x_last_dtor_insn, x_last_parm_cleanup_insn, and
- x_result_rtx.
+ x_result_rtx.
(dtor_label, ctor_label, current_base_init_list,
current_member_init_list, base_init_expr, current_class_ptr,
current_class_ref, last_tree, last_expr_type): Adjust accordingly.
@@ -2807,7 +2807,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(mark_false_label_stack): Likewise.
(lang_mark_tree): Likewise.
(lang_cleanup_tree): Likewise.
-
+
1999-09-03 Mark Mitchell <mark@codesourcery.com>
* Makefile.in (CXX_TREE_H): Include function.h.
@@ -2841,7 +2841,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
pop_cp_function_context.
* init.c: Don't include function.h.
* lex.c (begin_definition_of_inclass_inline): Call
- push_function_context_to, not push_cp_function_context.
+ push_function_context_to, not push_cp_function_context.
(process_next_inline): Call pop_function_context_from, not
pop_cp_function_context.
* method.c: Don't include function.h.
@@ -2849,7 +2849,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
push_cp_function_context. Call pop_function_context_from, not
pop_cp_function_context.
* typeck.c: Don't include function.h.
-
+
* decl.c (expand_static_init): Tweak handling of static
initializations for objects without constructors.
@@ -2915,12 +2915,12 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(last_expr_type): Likewise.
* typeck.c (dtor_label): Likewise.
(ctor_label): Likewise.
-
+
1999-09-01 Alex Samuel <samuel@codesourcery.com>
* decl2.c (arg_assoc_template_arg): New prototype. New function.
(arg_assoc_class): Use arg_assoc_template_arg for template
- arguments.
+ arguments.
(arg_assoc): Likewise.
* pt.c (mangle_class_name_for_template): Allow member template
template arguments.
@@ -2992,7 +2992,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(tsubst_expr): Adjust calls to expand_start_catch_block
appropriately.
* semantics.c (expand_stmt): Likewise.
-
+
1999-08-29 Alex Samuel <samuel@codesourcery.com>
* pt.c (push_template_decl_real): Use template declaration from
@@ -3020,7 +3020,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* pt.c (tsbust_expr): Fix indentation. Call cp_finish_decl here.
* semantics.c (expand_stmt): Don't call cp_finish_decl here. Just
call initialize_local_var to generate initialization code.
-
+
1999-08-29 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* cp-tree.h (fndecl_as_string, type_as_string,
@@ -3057,7 +3057,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(make_rtl_for_nonlocal_decl): Likewise.
(cp_finish_decl): Use them.
* typeck.c (strip_array_types): New function.
-
+
* cp-tree.def (LABEL_STMT): New tree node.
* cp-tree.h (LABEL_STMT_LABEL): New macro.
(shadow_label): Remove.
@@ -3090,7 +3090,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
building_stmt_tree.
(finish_label_decl): New function.
(expand_stmt): Handle LABEL_STMTs and local label declarations.
-
+
1999-08-26 Mark Mitchell <mark@codesourcery.com>
* decl.c (lookup_label): Build labels on the permanent obstack
@@ -3102,15 +3102,15 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
(expand_stmt): Adjust accordingly.
* pt.c (tsubst_expr); Likewise.
(do_decl_instantiation): Robustify.
-
+
* cp-tree.h (AGGR_INIT_VIA_CTOR_P): New macro.
* tree.c (build_cplus_new): Set it.
* expr.c (cplus_expand_expr): Use it.
* dump.c (deque_and_dump): Handle AGGR_INIT_EXPR.
-
+
* decl.c (store_parm_decls): Reset immediate_size_expand.
(finish_function): Likewise.
-
+
* tree.c (cplus_unsave_expr_now): Don't return a value.
* semantics.c (do_poplevel): Always initialize the return value.
@@ -3209,7 +3209,7 @@ Fri Sep 10 10:32:32 1999 Bernd Schmidt <bernds@cygnus.co.uk>
* typeck.c (build_modify_expr): Don't build an RTL_EXPR.
* typeck2.c (store_init_value): Change expand_aggr_init to
build_aggr_init in comment.
-
+
1999-08-25 Mark Mitchell <mark@codesourcery.com>
* dump.c (dequeue_and_dump): Dump TARGET_EXPRs.
@@ -3254,12 +3254,12 @@ Mon Aug 23 22:17:20 1999 Mumit Khan <khan@xraylith.wisc.edu>
* dump.c (dump_next_stmt): New function.
(dequeue_and_dump): Use it.
-
+
* pt.c (tsubst_copy): Make sure to initialize return value for a
STMT_EXPR, even when processing_template_decl.
* semantics.c (finish_stmt_expr): A statement-expression whose
- last statement is not an expression-statement has type `void'.
-
+ last statement is not an expression-statement has type `void'.
+
1999-08-20 Mark Mitchell <mark@codesourcery.com>
* semantics.c (finish_stmt_expr): Fix typo in comment.
@@ -3269,7 +3269,7 @@ Mon Aug 23 22:17:20 1999 Mumit Khan <khan@xraylith.wisc.edu>
BIND_EXPR permanent.
* pt.c (register_specialization): Don't register a specialization
more than once.
-
+
1999-08-18 Andrew Haley <aph@cygnus.com>
* method.c (process_overload_item): Call build_mangled_C9x_name ()
@@ -3305,7 +3305,7 @@ Mon Aug 23 22:17:20 1999 Mumit Khan <khan@xraylith.wisc.edu>
(tsubst_copy): Likewise.
* tree.c (search_tree): Likewise.
* semantics.c (finish_pseudo_destructor_call): Create it.
-
+
1999-08-18 Mark Mitchell <mark@codesourcery.com>
* search.c (setup_class_bindings): Robustify.
@@ -3388,7 +3388,7 @@ Mon Aug 23 22:17:20 1999 Mumit Khan <khan@xraylith.wisc.edu>
(build_lang_field_decl): Likewise.
(copy_lang_decl): Use CAN_HAVE_FULLLANG_DECL_P to decide how much
to copy.
-
+
* cp-tree.def (STMT_EXPR): New tree node.
* cp-tree.h (STMT_EXPR_STMT): New macro.
(store_return_init): Change prototype.
@@ -3484,7 +3484,7 @@ Mon Aug 23 22:17:20 1999 Mumit Khan <khan@xraylith.wisc.edu>
sorry, if an unsupported node is encountered.
* typeck.c (require_complete_type_in_void): Handle BIND_EXPR.
(c_expand_return): Don't call add_tree here.
-
+
1999-08-15 Mark Mitchell <mark@codesourcery.com>
* pt.c (check_default_tmpl_args): Don't check in local scopes.
@@ -3492,7 +3492,7 @@ Mon Aug 23 22:17:20 1999 Mumit Khan <khan@xraylith.wisc.edu>
obstack. Clear DECL_DEAD_FOR_LOCAL when making a copy of a local
variable.
(tsubst_expr): Adjust now that DECL_STMTs really contain DECLs.
-
+
1999-08-14 Jason Merrill <jason@yorick.cygnus.com>
Speed up Koenig lookup.
@@ -3500,7 +3500,7 @@ Mon Aug 23 22:17:20 1999 Mumit Khan <khan@xraylith.wisc.edu>
to return namespaces we've looked at.
* decl2.c (lookup_using_namespace): Likewise.
(add_function): Don't call ovl_member.
- (lookup_arg_dependent): Initialize k.namespaces to the list of
+ (lookup_arg_dependent): Initialize k.namespaces to the list of
namespaces seen in unqualified lookup.
* call.c (equal_functions): Move here from tree.c.
(joust): Use it to handle duplicate candidates.
@@ -3580,7 +3580,7 @@ Mon Aug 23 22:17:20 1999 Mumit Khan <khan@xraylith.wisc.edu>
(push_permanent_obstack): Define.
(mark_addressable): Use it.
* typeck.c (mark_addressable): Likewise.
-
+
1999-08-13 Gavin Romig-Koch <gavin@cygnus.com>
* cp-tree.h (init_cplus_unsave): New.
@@ -3627,11 +3627,11 @@ Mon Aug 23 22:17:20 1999 Mumit Khan <khan@xraylith.wisc.edu>
* dump.c (queue): Be careful when computing bitmasks.
(dequeue_and_dump): Describe binfos as binfos, not as
vectors.
-
+
* parse.y (pedantic): Give it itype. Adjust usage accordingly
- throughout.
+ throughout.
* parse.c: Regenerated.
-
+
* Make-lang.in (CXX_SRCS): Remove sig.c.
* Makefile.in (CXX_OBJS): Remove sig.o.
(sig.o): Remove.
@@ -3718,12 +3718,12 @@ Mon Aug 23 22:17:20 1999 Mumit Khan <khan@xraylith.wisc.edu>
* hash.h: Regenerated.
* init.c (build_new_1): Remove support for signatures.
* lang-options.h: Remove -fhandle-signatures,
- -fno-handle-signatures.
+ -fno-handle-signatures.
* lex.c (init_parse): Remove support for signatures.
(yyprint): Likewise.
* lex.h (rid): Remove RID_SIGNATURE.
* method.c (build_decl_overload_real): Remove support for
- signatures.
+ signatures.
(hack_identifier): Likewise.
* parse.y (base_class): Likewise.
(base_class.1): Likewise.
@@ -3750,7 +3750,7 @@ Mon Aug 23 22:17:20 1999 Mumit Khan <khan@xraylith.wisc.edu>
(build_x_arrow): Likewise.
(build_functional_cast): Likewise.
* xref.c (GNU_xref_decl): Likewise.
-
+
1999-08-10 Martin v. Loewis <martin@mira.isdn.cs.tu-berlin.de>
* lex.c (do_identifier): Remove unnecessary lookup of class field.
@@ -3869,7 +3869,7 @@ Mon Aug 23 22:17:20 1999 Mumit Khan <khan@xraylith.wisc.edu>
* search.c (binfo_from_vbase): New fn.
* cp-tree.h: Declare it.
* cvt.c (cp_convert_to_pointer): Use it to diagnose conversion
- from pointer to member of virtual base.
+ from pointer to member of virtual base.
* typeck.c (get_delta_difference): Likewise.
1999-08-06 Alexandre Oliva <oliva@dcc.unicamp.br>
@@ -3892,13 +3892,13 @@ Mon Aug 23 22:17:20 1999 Mumit Khan <khan@xraylith.wisc.edu>
`1', `2', and `<'; handle them generically. Don't be sorry about
"unrecognized tree codes"; just abort.
(no_linkage_check): Don't do linkage checks for templates.
-
+
* tree.c (cp_build_qualified_type_real): Handle
pointer-to-member-function types correctly.
1999-08-05 Jason Merrill <jason@yorick.cygnus.com>
- * decl.c (pushdecl): Only give an error for shadowing a parm
+ * decl.c (pushdecl): Only give an error for shadowing a parm
from *this* function.
Thu Aug 5 02:40:42 1999 Jeffrey A Law (law@cygnus.com)
@@ -3932,7 +3932,7 @@ Thu Aug 5 02:40:42 1999 Jeffrey A Law (law@cygnus.com)
specifiers.
(comptypes): Adjust for comp_except_specs.
* typeck2.c (add_exception_specifier): New global function.
-
+
* class.c (check_for_override): Reword error message.
1999-08-03 Nathan Sidwell <nathan@acm.org>
@@ -3995,7 +3995,7 @@ Thu Aug 5 02:40:42 1999 Jeffrey A Law (law@cygnus.com)
(tsubst_expr): Use STMT_LINENO.
* semantics.c (finish_asm_stmt): Eliminate duplicate code. Check
for invalid cv-qualifiers even while building templates.
-
+
1999-08-02 Richard Henderson <rth@cygnus.com>
* call.c: Include defaults.h instead of expr.h.
@@ -4059,7 +4059,7 @@ Thu Aug 5 02:40:42 1999 Jeffrey A Law (law@cygnus.com)
(build_conditional_expr): Tweak.
(convert_like): Some BASE_CONVs really do require the generation
of code.
-
+
* init.c (perform_member_init): Don't go through build_modify_expr
for simple initializations.
@@ -4101,7 +4101,7 @@ Thu Aug 5 02:40:42 1999 Jeffrey A Law (law@cygnus.com)
* tree.c (debug_binfo): Likewise.
* decl2.c (mark_vtable_entries): Don't bash abstract virtuals to
__pure_virtual here.
-
+
1999-07-26 Mark Mitchell <mark@codesourcery.com>
* tree.c (build_cplus_new): Adjust call to abstract_virtuals_error
@@ -4165,7 +4165,7 @@ Thu Aug 5 02:40:42 1999 Jeffrey A Law (law@cygnus.com)
(build_binary_op_nodefault): Use null_ptr_cst_p.
(build_conditional_expr): Remove.
(convert_for_assignment): Use new conversion functions.
-
+
* cp-tree.h (abstract_virtuals_error): Change declaration.
* typeck2.c (abstract_virtuals_error): Check to see if an error
occurred, and return a boolean value accordingly.
@@ -4181,7 +4181,7 @@ Thu Aug 5 02:40:42 1999 Jeffrey A Law (law@cygnus.com)
* pt.c (unify): Don't get confused by pointers-to-member functions.
* search.c (build_cplus_new): Robustify.
-
+
1999-07-24 Richard Henderson <rth@cygnus.com>
* gxx.gperf (__builtin_va_arg): New.
@@ -4251,7 +4251,7 @@ Sun Jul 25 15:24:21 1999 Jeffrey A Law (law@cygnus.com)
(lvalue_p): Likewise.
(build_cplus_new): Don't allow the creation of an abstract class.
* typeck.c (convert_for_initialization): Use initialize_reference.
-
+
1999-07-21 Gavin Romig-Koch <gavin@cygnus.com>
* lex.c (real_yylex) : Correct the test for overflow when lexing
@@ -4361,7 +4361,7 @@ Sat Jul 17 23:51:30 1999 Jeffrey A Law (law@cygnus.com)
* Makefile.in (INTERFACE): Bump to 2.
1999-07-17 Alexandre Oliva <oliva@dcc.unicamp.br>
-
+
* typeck2.c (my_friendly_abort): Updated URL with bug reporting
instructions to gcc.gnu.org. Removed e-mail address.
@@ -4385,7 +4385,7 @@ Sat Jul 17 23:51:30 1999 Jeffrey A Law (law@cygnus.com)
* class.c (method_name_cmp): New function.
(finish_struct_methods): Modified to support sorting and searching
methods.
- (finish_struct_anon): Changed code in inner loop to use ELT rather
+ (finish_struct_anon): Changed code in inner loop to use ELT rather
than UELT (which required an extra indirection for every reference).
(field_decl_cmp): New function to support sorting FIELD_DECLs.
(finish_struct_1): Sort fields.
@@ -4430,7 +4430,7 @@ Sat Jul 17 23:51:30 1999 Jeffrey A Law (law@cygnus.com)
initial declaration, then don't save the inline info and by all
means don't mark the function as a builtin function.
- * decl.c (lookup_name_real): Set NONCLASS to 1 if
+ * decl.c (lookup_name_real): Set NONCLASS to 1 if
CURRENT_CLASS_TYPE is 0.
* class.c (duplicate_tag_error): Set TYPE_NONCOPIED_PARTS to
@@ -4469,7 +4469,7 @@ Wed Jul 7 01:26:47 1999 Alexandre Oliva <oliva@dcc.unicamp.br>
(init_decl_processing): Handle/use the two new types.
* lex.c (real_yylex): Same.
* typeck.c (unsigned_type,signed_type,signed_or_unsigned_type) :
- Same.
+ Same.
1999-07-01 Mark Mitchell <mark@codesourcery.com>
@@ -4491,7 +4491,7 @@ Wed Jul 7 01:26:47 1999 Alexandre Oliva <oliva@dcc.unicamp.br>
* error.c (dump_type_real): Handle TREE_LIST again.
- * typeck.c (comp_target_parms): Don't complain about
+ * typeck.c (comp_target_parms): Don't complain about
converting from () to (...) if !flag_strict_prototype.
* decl.c (grokdeclarator): Update the names of all variants when
@@ -4500,7 +4500,7 @@ Wed Jul 7 01:26:47 1999 Alexandre Oliva <oliva@dcc.unicamp.br>
1999-06-21 Mark Mitchell <mark@codesourcery.com>
* init.c (expand_aggr_vbase_init): Rename to
- construct_virtual_bases. Conditionalize construction here,
+ construct_virtual_bases. Conditionalize construction here,
rather than ...
(emit_base_init): Here.
@@ -4515,16 +4515,16 @@ Wed Jul 7 01:26:47 1999 Alexandre Oliva <oliva@dcc.unicamp.br>
* error.c (dump_expr): Handle BIND_EXPR, LOOP_EXPR, and
EXIT_EXPR.
-
+
1999-06-18 Mark Mitchell <mark@codesourcery.com>
* init.c (expand_aggr_vbase_init): Add flag parameter.
(build_partial_cleanup_for): Remove, inlining into ..
(expand_cleanup_for_base): ... here. Take flag parameter.
(emit_base_init): Pass the in_chrg parameter to
- emit_aggr_vbase_init.
+ emit_aggr_vbase_init.
(emit_aggr_vbase_init): Pass it to expand_cleanup_for_base.
-
+
1999-06-16 Mark Mitchell <mark@codesourcery.com>
* decl2.c (import_export_decl): Use same_type_p, rather than
@@ -4558,7 +4558,7 @@ Wed Jul 7 01:26:47 1999 Alexandre Oliva <oliva@dcc.unicamp.br>
(push_class_level_binding): Use push_cache_obstack, not
maybe_push_cache_obstack.
* search.c (push_class_decls): Likewise.
-
+
1999-06-14 Martin von Löwis <loewis@informatik.hu-berlin.de>
* pt.c (tsubst_friend_function): Push into namespace of friend
@@ -4637,7 +4637,7 @@ Wed Jul 7 01:26:47 1999 Alexandre Oliva <oliva@dcc.unicamp.br>
* tree.c (build_cplus_array_type_1): Use push_obstacks_nochange
and friends rather than messing with current_obstack directly.
(cp_build_qualified_type_real): Rework ARRAY_TYPE
- allocation to match practice throughout the rest of the
+ allocation to match practice throughout the rest of the
compiler.
1999-05-30 Mark Mitchell <mark@codesourcery.com>
@@ -4679,7 +4679,7 @@ Wed Jul 7 01:26:47 1999 Alexandre Oliva <oliva@dcc.unicamp.br>
(DECL_SAVED_TREE): Document.
(DECL_TEMPLATE_INJECT): Remove.
* class.c (finish_struct): Remove code to deal with
- DECL_TEMPLATE_INJECT.
+ DECL_TEMPLATE_INJECT.
* decl.c (maybe_process_template_type_declaration): Handle all new
types in templates uniformly.
@@ -4689,7 +4689,7 @@ Wed Jul 7 01:26:47 1999 Alexandre Oliva <oliva@dcc.unicamp.br>
forward-declarations.
(instantiate_class_template): Remove code processing
DECL_TEMPLATE_INJECT.
-
+
* pt.c (lookup_template_class): Tweak lookup to find member
templates.
@@ -4697,7 +4697,7 @@ Wed Jul 7 01:26:47 1999 Alexandre Oliva <oliva@dcc.unicamp.br>
ASM_CV_QUAL.
* semantics.c (finish_asm_stmt): Make strings permanent if they're
used in a template.
-
+
1999-05-25 Jason Merrill <jason@yorick.cygnus.com>
* typeck.c (casts_away_constness, casts_away_constness_r): Strip both
@@ -4707,7 +4707,7 @@ Wed Jul 7 01:26:47 1999 Alexandre Oliva <oliva@dcc.unicamp.br>
* decl2.c (mark_vtable_entries): Don't make a copy of a function,
and then make it look like `abort'. Just use `abort' instead.
-
+
* typeck.c (build_static_cast): Don't allow static_casts that cast
away constness.
(casts_away_constness_r): New function.
@@ -4720,12 +4720,12 @@ Wed Jul 7 01:26:47 1999 Alexandre Oliva <oliva@dcc.unicamp.br>
* lex.c (is_global): A template parameter isn't global.
* parse.y (class_head): Robustify.
* parse.c: Regenerated.
-
+
1999-05-22 Mark Mitchell <mark@codesourcery.com>
* pt.c (for_each_template_parm): Walk into TYPENAME_TYPEs,
INDIRECT_REFs, and COMPONENT_REFs. Handle FIELD_DECLs.
-
+
* cp-tree.h (push_nested_namespace): Declare.
(pop_nested_namespace): Likewise.
* decl.c (push_nested_namespace): New function.
@@ -4746,7 +4746,7 @@ Wed Jul 7 01:26:47 1999 Alexandre Oliva <oliva@dcc.unicamp.br>
1999-05-21 Mark Mitchell <mark@codesourcery.com>
Nathan Sidwell <nathan@acm.org>
-
+
* Make-lang.in (cc1plus): Make it depend on gxx.gperf.
* cp-tree.h: Fix typo in documentation on pointers-to-members.
(cp_build_qualified_type): Make it a macro.
@@ -4768,7 +4768,7 @@ Wed Jul 7 01:26:47 1999 Alexandre Oliva <oliva@dcc.unicamp.br>
(cp_build_qualified_type): Rename to ...
(cp_build_qualified_type_real): Add additional COMPLAIN parameter
and modify appropriately.
-
+
* typeck.c (build_ptrmemfunc): Handle PTRMEM_CSTs carefully to
reveal optimization opportunities.
@@ -4791,7 +4791,7 @@ Wed Jul 7 01:26:47 1999 Alexandre Oliva <oliva@dcc.unicamp.br>
(pt.c): Or CP_TYPE_QUALS for an ERROR_MARK.
(typeck.c): Or TYPE_MAIN_VARIANT for a type.
- * pt.c (for_each_template_parm): Rework to match documentation.
+ * pt.c (for_each_template_parm): Rework to match documentation.
Don't be fooled by a COMPONENT_REF with no TREE_TYPE.
1999-05-20 Jason Merrill <jason@yorick.cygnus.com>
@@ -4883,7 +4883,7 @@ Tue May 18 00:21:34 1999 Zack Weinberg <zack@rabi.phys.columbia.edu>
* search.c (marked_pushdecls_p): Don't descend into
TEMPLATE_TYPE_PARMs and the like.
(unmarked_pushdecls_p): Likewise.
-
+
* call.c (build_over_call): Don't throw away
initializations/copies of empty classes; use MODIFY_EXPR and
INIT_EXPR as for non-empty classes.
@@ -4935,7 +4935,7 @@ Tue May 18 00:21:34 1999 Zack Weinberg <zack@rabi.phys.columbia.edu>
convert_for_initialization): Likewise.
* class.c (instantiate_type): Handle seeing a baselink under an
OFFSET_REF.
- * error.c (dump_expr): Likewise.
+ * error.c (dump_expr): Likewise.
* pt.c (for_each_template_parm): Likewise.
(resolve_overloaded_unification): Likewise.
* tree.c (is_overloaded_fn, really_overloaded_fn): Likewise.
@@ -4986,7 +4986,7 @@ Tue May 18 00:21:34 1999 Zack Weinberg <zack@rabi.phys.columbia.edu>
TREE_LIST for ambiguous lookups.
(setup_class_bindings): Adjust accordingly.
(push_class_decls): Revise out-of-date comments.
-
+
* typeck.c (build_const_cast): Tighten checks for legality.
1999-05-02 Martin von Löwis <loewis@informatik.hu-berlin.de>
diff --git a/gcc/cp/ChangeLog-2003 b/gcc/cp/ChangeLog-2003
index f0500f4b147..1cd19fa8e20 100644
--- a/gcc/cp/ChangeLog-2003
+++ b/gcc/cp/ChangeLog-2003
@@ -85,12 +85,12 @@
2003-12-22 Andrew Pinski <pinskia@physics.uc.edu>
PR c++/5050
- * tree.c (cp_start_inlining): Remove.
- (cp_end_inlining): Remove.
- * cp-lang.c (LANG_HOOKS_TREE_INLINING_START_INLINING): Do not define.
- (LANG_HOOKS_TREE_INLINING_END_INLINING): Do not define.
- * cp-tree.h (cp_start_inlining): Do not declare.
- (cp_end_inlining): Do not declare.
+ * tree.c (cp_start_inlining): Remove.
+ (cp_end_inlining): Remove.
+ * cp-lang.c (LANG_HOOKS_TREE_INLINING_START_INLINING): Do not define.
+ (LANG_HOOKS_TREE_INLINING_END_INLINING): Do not define.
+ * cp-tree.h (cp_start_inlining): Do not declare.
+ (cp_end_inlining): Do not declare.
2003-12-22 Mark Mitchell <mark@codesourcery.com>
@@ -190,7 +190,7 @@
other parsing fails.
(cp_parser_enclosed_template_argument_list): If the argument list is
parsed correctly, but the next token is '>>', emit a diagnostic.
- (cp_parser_next_token_ends_template_argument): Accept '>>' as
+ (cp_parser_next_token_ends_template_argument): Accept '>>' as
delimiter of template argument, it will be later detected as a typo.
2003-12-17 Kelley Cook <kcook@gcc.gnu.org>
@@ -304,7 +304,7 @@
* decl.c (xref_basetypes): Check java class inheritance.
* decl2.c (check_java_method): Skip artificial params.
- PR c++/13241
+ PR c++/13241
C++ ABI change. Mangling of symbols in expressions.
* mangle.c (write_mangled_name): Add top_level flag. Rework for
nested and unnested mangling. Deal with abi version 1 and version
@@ -396,7 +396,7 @@
PR c/13134
* decl.c (duplicate_decls): Copy visibility flag when appropriate.
-
+
2003-12-09 Giovanni Bajo <giovannibajo@gcc.gnu.org>
* init.c (build_new_1): Deal with an OVERLOAD set when
@@ -414,7 +414,7 @@
PR c++/11929
* call.c (magic_varargs_p): New fn.
- (build_over_call): Do no ellipsis conversions for arguments to
+ (build_over_call): Do no ellipsis conversions for arguments to
functions with magic varargs.
* name-lookup.c, init.c, except.c: Revert Giovanni's patch from
@@ -460,7 +460,7 @@
PR c++/13305
* parser.c (cp_parser_elaborated_type_specifier): Accept
attributes.
-
+
2003-12-05 Mark Mitchell <mark@codesourcery.com>
PR c++/13314
@@ -514,8 +514,8 @@
2003-12-02 Richard Henderson <rth@redhat.com>
* name-lookup.h (struct cp_binding_level): Use ENUM_BITFIELD.
- * parser.c (struct cp_token): Likewise.
- (struct cp_parser_token_tree_map_node): Likewise.
+ * parser.c (struct cp_token): Likewise.
+ (struct cp_parser_token_tree_map_node): Likewise.
* lex.c (struct resword): Move const after ENUM_BITFIELD.
2003-11-30 Mark Mitchell <mark@codesourcery.com>
@@ -630,11 +630,11 @@
2003-11-14 Giovanni Bajo <giovannibajo@libero.it>
- PR c++/2294
- * name-lookup.c (push_overloaded_decl): Always construct an OVERLOAD
- unless the declaration is a built-in.
- (set_namespace_binding): While binding OVERLOADs with only one
- declaration, we still need to call supplement_binding.
+ PR c++/2294
+ * name-lookup.c (push_overloaded_decl): Always construct an OVERLOAD
+ unless the declaration is a built-in.
+ (set_namespace_binding): While binding OVERLOADs with only one
+ declaration, we still need to call supplement_binding.
2003-11-14 Mark Mitchell <mark@codesourcery.com>
@@ -647,9 +647,9 @@
2003-11-14 Giovanni Bajo <giovannibajo@libero.it>
- PR c++/2094
- * pt.c (unify): Add support for PTRMEM_CST and
- FIELD_DECL unification.
+ PR c++/2094
+ * pt.c (unify): Add support for PTRMEM_CST and
+ FIELD_DECL unification.
2003-11-13 Richard Earnshaw <rearnsha@arm.com>
@@ -709,7 +709,7 @@
* decl.c (duplicate_decls): copy DECL_VISIBILITY field.
* method.c (use_thunk): give thunk same visibility as function.
* optimize.c (maybe_clone_body): copy DECL_VISIBILITY field.
-
+
2003-11-05 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/11616
@@ -799,8 +799,9 @@
mangle a non-existant middle operator to the ?: operator.
2003-10-21 Robert Bowdidge <bowdidge@apple.com>
- * decl.c (cp_finish_decl): Remove clause intended for asm directives
- in struct or class fields: this code is never executed.
+
+ * decl.c (cp_finish_decl): Remove clause intended for asm directives
+ in struct or class fields: this code is never executed.
2003-10-22 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
@@ -961,7 +962,7 @@
2003-10-13 Gabriel Dos Reis <gdr@integrable-solutions.net>
- Break out decl.c (2/n)
+ Break out decl.c (2/n)
* name-lookup.c: Include diagnostic.h
(cxx_binding_free): Make static.
(cxx_binding_make): Likewise.
@@ -1056,7 +1057,7 @@
(maybe_process_template_type_declaration): Likewise.
(pop_binding): Likewise.
* cp-tree.h: Move corresponding declarations to name-lookup.h
-
+
2003-10-12 Steven Bosscher <steven@gcc.gnu.org>
* cvt.c (ocp_convert): Move warning to C common code.
@@ -1096,7 +1097,7 @@
pp_cxx_flag_qualified_id and pp_cxx_flag_global_scope.
* cxx-pretty-print.c (pp_cxx_id_expression): Always display
qualified entities using qualified names.
-
+
PR c++/12337
* init.c (build_new_1): Make sure that the expression returned is
not an lvalue.
@@ -1122,7 +1123,7 @@
2003-10-03 Gabriel Dos Reis <gdr@integrable-solutions.net>
* name-lookup.c (binding_entry_free): Nullify name and type
- fields.
+ fields.
2003-10-02 Mark Mitchell <mark@codesourcery.com>
@@ -1143,7 +1144,7 @@
2003-09-30 Gabriel Dos Reis <gdr@integrable-solutions.net>
* decl.c (pop_binding): Don't mess with nullifying binding->scope
- here.
+ here.
* name-lookup.c: Re-format.
(cxx_binding_free): Nullify binding->scope.
@@ -1193,7 +1194,7 @@
2003-09-27 Gabriel Dos Reis <gdr@integrable-solutions.net>
* cp-tree.h, name-lookup.h, decl.c, decl2.c: Remove reference to
- macros BINDING_SCOPE, BINDING_VALUE and BINDING_TYPE.
+ macros BINDING_SCOPE, BINDING_VALUE and BINDING_TYPE.
2003-09-26 Gabriel Dos Reis <gdr@integrable-solutions.net>
@@ -1286,7 +1287,7 @@
2003-09-19 Gabriel Dos Reis <gdr@integrable-solutions.net>
* decl.c (cxx_scope_descriptor): Fix thinko.
- (struct cp_binding_level): Adjust type of binding_depth field.
+ (struct cp_binding_level): Adjust type of binding_depth field.
2003-09-18 Danny Smith <dannysmith@users.sourceforge.net>
@@ -1317,7 +1318,7 @@
2003-09-18 Gabriel Dos Reis <gdr@integrable-solutions.net>
* error.c (dump_type): Simplify. Use pp_type_specifier_seq for
- "C" types.
+ "C" types.
* cxx-pretty-print.c (pp_cxx_type_specifier_seq): Fix thinko.
2003-09-17 Richard Henderson <rth@redhat.com>
@@ -1343,7 +1344,7 @@
2003-09-17 Richard Henderson <rth@redhat.com>
PR c++/12316
- * semantics.c (expand_or_defer_fn): Inc/dec function_depth.
+ * semantics.c (expand_or_defer_fn): Inc/dec function_depth.
2003-09-16 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
@@ -1397,7 +1398,7 @@
the various flags.
(set_block): Remove check for doing_semantic_analysis_p.
(pushlevel_class): Use "kind" field in binding_level, not
- the various flags.
+ the various flags.
(poplevel_class): Likewise.
(initial_push_namespace_scope): Likewise.
(maybe_push_to_top_level): Likewise.
@@ -1427,7 +1428,7 @@
(save_function-data): Do not set expanding_p.
(cxx_push_function_context): Do not clear expanding_p.
* semantics.c (cxx_expand_function_start): Do not set expanding_p.
-
+
2003-09-14 Mark Mitchell <mark@codesourcery.com>
* class.c (layout_class_type): Make DECL_MODE match TYPE_MODE for
@@ -1487,7 +1488,7 @@
2003-09-09 Richard Henderson <rth@redhat.com>
- * semantics.c (expand_or_defer_fn): Update call to
+ * semantics.c (expand_or_defer_fn): Update call to
cgraph_finalize_function.
* semantics.c (expand_or_defer_fn): Use cgraph_finalize_function
@@ -1540,7 +1541,7 @@
* error.c (dump_decl): Handle namespace-alias-definition.
* decl.c (warn_extern_redeclared_static): There is no point in
checking changes in storage class specifier for a namespace
- declaration.
+ declaration.
(duplicate_decls): Tidy diagnostic message.
* cxx-pretty-print.c (pp_cxx_left_brace): New macro.
(pp_cxx_right_brace): Likewise.
@@ -1571,7 +1572,7 @@
(push_class_binding): Likewise.
(set_identifier_type_value_with_scope): Likewise.
* name-lookup.c (supplement_binding): Rename from add_binding.
- Return a bool. Improve documentation.
+ Return a bool. Improve documentation.
(set_namespace_binding): Adjust.
* Make-lang.in (cp/name-lookup.o): Depend on toplev.h
@@ -1785,7 +1786,7 @@
PR c++/11811
* cxx-pretty-print.c (pp_cxx_canonical_template_parameter): New
- function.
+ function.
* cxx-pretty-print.h: Declare.
* error.c (dump_template_parameter): Use it.
(dump_type): Likewise.
diff --git a/gcc/cp/ChangeLog-2004 b/gcc/cp/ChangeLog-2004
index 7dd4e26d4cb..dc4636bf3be 100644
--- a/gcc/cp/ChangeLog-2004
+++ b/gcc/cp/ChangeLog-2004
@@ -4631,7 +4631,7 @@
(cp_parser_direct_declarator): Likewise.
* pt.c (tsubst): Likewise.
(tsubst_copy, tsubst_copy_and_build): Likewise; also add new operand
- for COMPONENT_REF.
+ for COMPONENT_REF.
* semantics.c (finish_non_static_data_member): Add new operand
for COMPONENT_REF.
* typeck.c (build_class_member_access_expr): Likewise.
diff --git a/gcc/cp/ChangeLog.tree-ssa b/gcc/cp/ChangeLog.tree-ssa
index a52dea67450..e02c76515e4 100644
--- a/gcc/cp/ChangeLog.tree-ssa
+++ b/gcc/cp/ChangeLog.tree-ssa
@@ -49,7 +49,7 @@
* init.c (build_vec_delete_1): Convert 2nd argument to NE_EXPR to
the proper type.
-
+
2004-02-24 Jason Merrill <jason@redhat.com>
PR c++/13944
@@ -89,7 +89,7 @@
* call.c, cvt.c, init.c, typeck.c: Use TREE_NO_WARNING instead
of TREE_NO_UNUSED_WARNING.
* cvt.c (convert_to_void): Also use it for "has no effect" warning.
-
+
2004-01-30 Frank Ch. Eigler <fche@redhat.com>
* cp-mudflap.c (mflang_flush_calls): Mark static ctor as TREE_USED.
@@ -138,7 +138,7 @@
* cp-lang.c (LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR): Kill.
* cp-tree.h (cxx_callgraph_analyze_expr): Kill.
* decl2.c (cxx_callgraph_analyze_expr): Kill.
-
+
2003-12-14 Jan Hubicka <jh@suse.cz>
* cp-lang.c (LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR): Kill.
@@ -261,8 +261,8 @@
2003-09-03 Richard Henderson <rth@redhat.com>
- * decl.c (finish_function): Fix misapplied patch. Don't
- free_after_parsing or free_after_compilation. For real this time.
+ * decl.c (finish_function): Fix misapplied patch. Don't
+ free_after_parsing or free_after_compilation. For real this time.
2003-08-22 Jason Merrill <jason@redhat.com>
@@ -314,7 +314,7 @@
2003-06-05 Frank Ch. Eigler <fche@redhat.com>
- * cp-mudflap.c (mx_flag): Remove. Update callers to use mf_mark.
+ * cp-mudflap.c (mx_flag): Remove. Update callers to use mf_mark.
2003-05-24 Diego Novillo <dnovillo@redhat.com>
diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in
index 9b33211e6f1..e1664dcc281 100644
--- a/gcc/cp/Make-lang.in
+++ b/gcc/cp/Make-lang.in
@@ -60,7 +60,7 @@ g++spec.o: $(srcdir)/cp/g++spec.c $(SYSTEM_H) coretypes.h $(TM_H) $(GCC_H) $(CON
$(INCLUDES) $(srcdir)/cp/g++spec.c)
# Create the compiler driver for g++.
-GXX_OBJS = gcc.o g++spec.o intl.o prefix.o version.o
+GXX_OBJS = gcc.o g++spec.o intl.o prefix.o version.o
g++$(exeext): $(GXX_OBJS) $(EXTRA_GCC_OBJS) $(LIBDEPS)
$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
$(GXX_OBJS) $(EXTRA_GCC_OBJS) $(LIBS)
@@ -112,6 +112,7 @@ $(srcdir)/cp/cfns.h: $(srcdir)/cp/cfns.gperf
gtype-cp.h gt-cp-call.h gt-cp-decl.h gt-cp-decl2.h : s-gtype; @true
gt-cp-pt.h gt-cp-repo.h gt-cp-parser.h gt-cp-method.h : s-gtype; @true
gt-cp-tree.h gt-cp-mangle.h gt-cp-name-lookup.h gt-cp-typeck2.h: s-gtype; @true
+gt-cp-rtti.h: s-gtype ; @true
#
# Build hooks:
@@ -164,7 +165,7 @@ c++.install-common: installdirs
$(INSTALL_PROGRAM) g++-cross$(exeext) $(DESTDIR)$(gcc_tooldir)/bin/g++$(exeext); \
rm -f $(DESTDIR)$(gcc_tooldir)/bin/c++$(exeext); \
( cd $(DESTDIR)$(gcc_tooldir)/bin && \
- $(LN) g++$(exeext) c++$(exeext) ); \
+ $(LN) g++$(exeext) c++$(exeext) ); \
else true; fi; \
else \
rm -f $(DESTDIR)$(bindir)/$(GXX_TARGET_INSTALL_NAME)$(exeext); \
@@ -181,9 +182,9 @@ c++.install-common: installdirs
doc/g++.1: doc/gcc.1
cp doc/gcc.1 doc/g++.1
-c++.install-man: installdirs $(DESTDIR)$(man1dir)/$(GXX_INSTALL_NAME)$(man1ext)
+c++.install-man: $(DESTDIR)$(man1dir)/$(GXX_INSTALL_NAME)$(man1ext)
-$(DESTDIR)$(man1dir)/$(GXX_INSTALL_NAME)$(man1ext): doc/g++.1
+$(DESTDIR)$(man1dir)/$(GXX_INSTALL_NAME)$(man1ext): doc/g++.1 installdirs
-rm -f $@
-$(INSTALL_DATA) $< $@
-chmod a-x $@
@@ -235,8 +236,8 @@ CXX_PRETTY_PRINT_H = cp/cxx-pretty-print.h $(C_PRETTY_PRINT_H)
cp/lex.o: cp/lex.c $(CXX_TREE_H) $(TM_H) flags.h \
c-pragma.h toplev.h output.h input.h cp/operators.def $(TM_P_H)
cp/cp-lang.o: cp/cp-lang.c $(CXX_TREE_H) $(TM_H) toplev.h debug.h langhooks.h \
- $(LANGHOOKS_DEF_H) c-common.h gtype-cp.h $(CXX_PRETTY_PRINT_H) $(DIAGNOSTIC_H) \
- cp/cp-objcp-common.h
+ $(LANGHOOKS_DEF_H) c-common.h gtype-cp.h $(CXX_PRETTY_PRINT_H) \
+ $(DIAGNOSTIC_H) cp/cp-objcp-common.h
cp/decl.o: cp/decl.c $(CXX_TREE_H) $(TM_H) flags.h cp/decl.h \
output.h $(EXPR_H) except.h toplev.h $(HASHTAB_H) $(RTL_H) \
cp/operators.def $(TM_P_H) tree-inline.h diagnostic.h c-pragma.h \
@@ -244,33 +245,36 @@ cp/decl.o: cp/decl.c $(CXX_TREE_H) $(TM_H) flags.h cp/decl.h \
cp/decl2.o: cp/decl2.c $(CXX_TREE_H) $(TM_H) flags.h cp/decl.h $(EXPR_H) \
output.h except.h toplev.h $(RTL_H) c-common.h gt-cp-decl2.h cgraph.h \
c-pragma.h
-cp/cp-objcp-common.o : cp/cp-objcp-common.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
- $(TM_H) $(TREE_H) $(CXX_TREE_H) c-common.h toplev.h langhooks.h \
+cp/cp-objcp-common.o : cp/cp-objcp-common.c $(CONFIG_H) $(SYSTEM_H) \
+ coretypes.h $(TM_H) $(TREE_H) $(CXX_TREE_H) c-common.h toplev.h langhooks.h \
$(LANGHOOKS_DEF_H) $(DIAGNOSTIC_H) debug.h $(CXX_PRETTY_PRINT_H) \
cp/cp-objcp-common.h
-cp/typeck2.o: cp/typeck2.c $(CXX_TREE_H) $(TM_H) flags.h toplev.h output.h $(TM_P_H) \
- diagnostic.h gt-cp-typeck2.h
-cp/typeck.o: cp/typeck.c $(CXX_TREE_H) $(TM_H) flags.h $(RTL_H) $(EXPR_H) toplev.h \
- diagnostic.h convert.h c-common.h
-cp/class.o: cp/class.c $(CXX_TREE_H) $(TM_H) flags.h toplev.h $(RTL_H) $(TARGET_H) \
- convert.h $(CGRAPH_H)
-cp/call.o: cp/call.c $(CXX_TREE_H) $(TM_H) flags.h toplev.h $(RTL_H) $(EXPR_H) \
- diagnostic.h intl.h gt-cp-call.h convert.h target.h
-cp/friend.o: cp/friend.c $(CXX_TREE_H) $(TM_H) flags.h $(RTL_H) toplev.h $(EXPR_H)
-cp/init.o: cp/init.c $(CXX_TREE_H) $(TM_H) flags.h $(RTL_H) $(EXPR_H) toplev.h \
- except.h $(TARGET_H)
+cp/typeck2.o: cp/typeck2.c $(CXX_TREE_H) $(TM_H) flags.h toplev.h output.h \
+ $(TM_P_H) diagnostic.h gt-cp-typeck2.h
+cp/typeck.o: cp/typeck.c $(CXX_TREE_H) $(TM_H) flags.h $(RTL_H) $(EXPR_H) \
+ toplev.h diagnostic.h convert.h c-common.h
+cp/class.o: cp/class.c $(CXX_TREE_H) $(TM_H) flags.h toplev.h $(RTL_H) \
+ $(TARGET_H) convert.h $(CGRAPH_H)
+cp/call.o: cp/call.c $(CXX_TREE_H) $(TM_H) flags.h toplev.h $(RTL_H) \
+ $(EXPR_H) diagnostic.h intl.h gt-cp-call.h convert.h target.h
+cp/friend.o: cp/friend.c $(CXX_TREE_H) $(TM_H) flags.h $(RTL_H) toplev.h \
+ $(EXPR_H)
+cp/init.o: cp/init.c $(CXX_TREE_H) $(TM_H) flags.h $(RTL_H) $(EXPR_H) \
+ toplev.h except.h $(TARGET_H)
cp/method.o: cp/method.c $(CXX_TREE_H) $(TM_H) toplev.h $(RTL_H) $(EXPR_H) \
- $(TM_P_H) $(TARGET_H) gt-cp-method.h
+ $(TM_P_H) $(TARGET_H) diagnostic.h gt-cp-method.h
cp/cvt.o: cp/cvt.c $(CXX_TREE_H) $(TM_H) cp/decl.h flags.h toplev.h convert.h
cp/search.o: cp/search.c $(CXX_TREE_H) $(TM_H) flags.h toplev.h $(RTL_H)
cp/tree.o: cp/tree.c $(CXX_TREE_H) $(TM_H) flags.h toplev.h $(RTL_H) \
- insn-config.h integrate.h tree-inline.h real.h gt-cp-tree.h $(TARGET_H) debug.h
+ insn-config.h integrate.h tree-inline.h real.h gt-cp-tree.h $(TARGET_H) \
+ debug.h
cp/ptree.o: cp/ptree.c $(CXX_TREE_H) $(TM_H)
-cp/rtti.o: cp/rtti.c $(CXX_TREE_H) $(TM_H) flags.h toplev.h convert.h
-cp/except.o: cp/except.c $(CXX_TREE_H) $(TM_H) flags.h $(RTL_H) except.h toplev.h \
- cp/cfns.h $(EXPR_H) libfuncs.h tree-inline.h
-cp/expr.o: cp/expr.c $(CXX_TREE_H) $(TM_H) $(RTL_H) flags.h $(EXPR_H) toplev.h \
- except.h $(TM_P_H)
+cp/rtti.o: cp/rtti.c $(CXX_TREE_H) $(TM_H) flags.h toplev.h convert.h \
+ gt-cp-rtti.h
+cp/except.o: cp/except.c $(CXX_TREE_H) $(TM_H) flags.h $(RTL_H) except.h \
+ toplev.h cp/cfns.h $(EXPR_H) libfuncs.h tree-inline.h
+cp/expr.o: cp/expr.c $(CXX_TREE_H) $(TM_H) $(RTL_H) flags.h $(EXPR_H) \
+ toplev.h except.h $(TM_P_H)
cp/pt.o: cp/pt.c $(CXX_TREE_H) $(TM_H) cp/decl.h cp/cp-objcp-common.h \
toplev.h $(RTL_H) except.h tree-inline.h pointer-set.h gt-cp-pt.h
cp/error.o: cp/error.c $(CXX_TREE_H) $(TM_H) toplev.h $(DIAGNOSTIC_H) \
@@ -281,11 +285,11 @@ cp/semantics.o: cp/semantics.c $(CXX_TREE_H) $(TM_H) except.h toplev.h \
flags.h debug.h output.h $(RTL_H) $(TIMEVAR_H) $(EXPR_H) \
tree-inline.h cgraph.h $(TARGET_H) c-common.h
cp/dump.o: cp/dump.c $(CXX_TREE_H) $(TM_H) tree-dump.h
-cp/optimize.o: cp/optimize.c $(CXX_TREE_H) $(TM_H) rtl.h integrate.h insn-config.h \
- input.h $(PARAMS_H) debug.h tree-inline.h tree-gimple.h $(TARGET_H)
+cp/optimize.o: cp/optimize.c $(CXX_TREE_H) $(TM_H) rtl.h integrate.h \
+ insn-config.h input.h $(PARAMS_H) debug.h tree-inline.h tree-gimple.h \
+ $(TARGET_H)
cp/mangle.o: cp/mangle.c $(CXX_TREE_H) $(TM_H) toplev.h real.h gt-cp-mangle.h \
$(TARGET_H) $(TM_P_H)
-
cp/parser.o: cp/parser.c $(CXX_TREE_H) $(TM_H) diagnostic.h gt-cp-parser.h \
output.h
cp/cp-gimplify.o: cp/cp-gimplify.c $(CXX_TREE_H) toplev.h c-common.h \
diff --git a/gcc/cp/NEWS b/gcc/cp/NEWS
index 75a5823fc96..6825b9e3cfe 100644
--- a/gcc/cp/NEWS
+++ b/gcc/cp/NEWS
@@ -9,15 +9,15 @@
* G++ no longer allows in-class initializations of static data members
that do not have arithmetic or enumeration type. For example:
- struct S {
+ struct S {
static const char* const p = "abc";
};
- is no longer accepted.
+ is no longer accepted.
Use the standards-conformant form:
- struct S {
+ struct S {
static const char* const p;
};
@@ -39,12 +39,12 @@
pointer to cv-qualified member function types.
* The C++ ABI has been changed to correctly handle this code:
-
+
struct A {
void operator delete[] (void *, size_t);
};
- struct B : public A {
+ struct B : public A {
};
new B[10];
@@ -52,17 +52,17 @@
The amount of storage allocated for the array will be greater than
it was in 3.0, in order to store the number of elements in the
array, so that the correct size can be passed to `operator delete[]'
- when the array is deleted. Previously, the value passed to
+ when the array is deleted. Previously, the value passed to
`operator delete[]' was unpredictable.
This change will only affect code that declares a two-argument
`operator delete[]' with a second parameter of type `size_t'
- in a base class, and does not override that definition in a
+ in a base class, and does not override that definition in a
derived class.
* The C++ ABI has been changed so that:
- struct A {
+ struct A {
void operator delete[] (void *, size_t);
void operator delete[] (void *);
};
@@ -109,7 +109,7 @@
are those whose types involve non-type template arguments whose
mangled representations require more than one digit.
-* Support for assignment to `this' has been removed. This idiom
+* Support for assignment to `this' has been removed. This idiom
was used in the very early days of C++, before users were allowed
to overload `operator new'; it is no longer allowed by the C++
standard.
@@ -124,15 +124,15 @@
* G++ previously allowed `sizeof (X::Y)' where Y was a non-static
member of X, even if the `sizeof' expression occurred outside
- of a non-static member function of X (or one of its derived classes,
+ of a non-static member function of X (or one of its derived classes,
or a member-initializer for X or one of its derived classes.) This
extension has been removed.
-* G++ no longer allows you to overload the conditional operator (i.e.,
+* G++ no longer allows you to overload the conditional operator (i.e.,
the `?:' operator.)
* The "named return value" extension:
-
+
int f () return r { r = 3; }
has been deprecated, and will be removed in a future version of G++.
@@ -175,7 +175,7 @@
*** Changes in EGCS 1.1:
-* Namespaces are fully supported. The library has not yet been converted
+* Namespaces are fully supported. The library has not yet been converted
to use namespace std, however, and the old std-faking code is still on by
default. To turn it off, you can use -fhonor-std.
@@ -250,9 +250,9 @@
but not all, the compiler will tell you where you need to add
'typename'. For more information, see
- http://www.cygnus.com/misc/wp/dec96pub/template.html#temp.res
+ http://www.cygnus.com/misc/wp/dec96pub/template.html#temp.res
- + Guiding declarations are no longer supported. Function declarations,
+ + Guiding declarations are no longer supported. Function declarations,
including friend declarations, do not refer to template instantiations.
You can restore the old behavior with -fguiding-decls until you fix
your code.
@@ -269,7 +269,7 @@
+ Explicit instantiation of template constructors and destructors is
now supported. For instance:
- template A<int>::A(const A&);
+ template A<int>::A(const A&);
Still not supported:
@@ -315,7 +315,7 @@
converting from a bound member function pointer to function
pointer).
- + A flag -Weffc++ has been added for violations of some of the style
+ + A flag -Weffc++ has been added for violations of some of the style
guidelines in Scott Meyers' _Effective C++_ books.
+ -Woverloaded-virtual now warns if a virtual function in a base
@@ -324,9 +324,9 @@
signatures are overridden) as it did before.
+ -Wall no longer implies -W. The new warning flag, -Wsign-compare,
- included in -Wall, warns about dangerous comparisons of signed and
- unsigned values. Only the flag is new; it was previously part of
- -W.
+ included in -Wall, warns about dangerous comparisons of signed and
+ unsigned values. Only the flag is new; it was previously part of
+ -W.
+ The new flag, -fno-weak, disables the use of weak symbols.
@@ -336,13 +336,13 @@
* __FUNCTION__ and __PRETTY_FUNCTION__ are now treated as variables by the
parser; previously they were treated as string constants. So code like
- `printf (__FUNCTION__ ": foo")' must be rewritten to
+ `printf (__FUNCTION__ ": foo")' must be rewritten to
`printf ("%s: foo", __FUNCTION__)'. This is necessary for templates.
* local static variables in extern inline functions will be shared between
translation units.
-* -fvtable-thunks is supported for all targets, and is the default for
+* -fvtable-thunks is supported for all targets, and is the default for
Linux with glibc 2.x (also called libc 6.x).
* bool is now always the same size as another built-in type. Previously,
@@ -377,12 +377,12 @@
supported. For instance:
struct A {
- struct B;
- B* bp;
+ struct B;
+ B* bp;
};
struct A::B {
- int member;
+ int member;
};
* On the HPPA, some classes that do not define a copy constructor
@@ -395,7 +395,7 @@
* Joe Buck <jbuck@synopsys.com>, the maintainer of the g++ FAQ.
* Brendan Kehoe <brendan@cygnus.com>, who coordinates testing of g++.
* Jason Merrill <jason@cygnus.com>, the g++ maintainer.
-* Mark Mitchell <mmitchell@usa.net>, who implemented member function
+* Mark Mitchell <mmitchell@usa.net>, who implemented member function
templates and explicit qualification of function templates.
* Mike Stump <mrs@wrs.com>, the previous g++ maintainer, who did most of
the exception handling work.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index e40e61f0aae..d245171a915 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -1,5 +1,5 @@
/* Functions related to invoking methods and overloaded functions.
- Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+ Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by Michael Tiemann (tiemann@cygnus.com) and
modified by Brendan Kehoe (brendan@cygnus.com).
@@ -42,7 +42,7 @@ Boston, MA 02111-1307, USA. */
/* The various kinds of conversion. */
-typedef enum conversion_kind {
+typedef enum conversion_kind {
ck_identity,
ck_lvalue,
ck_qual,
@@ -93,7 +93,7 @@ struct conversion {
used. */
BOOL_BITFIELD check_copy_constructor_p : 1;
/* If KIND is ck_ptr or ck_pmem, true to indicate that a conversion
- from a pointer-to-derived to pointer-to-base is being performed. */
+ from a pointer-to-derived to pointer-to-base is being performed. */
BOOL_BITFIELD base_p : 1;
/* The type of the expression resulting from the conversion. */
tree type;
@@ -134,11 +134,11 @@ static tree build_java_interface_fn_ref (tree, tree);
#define convert_like_with_context(CONV, EXPR, FN, ARGNO) \
convert_like_real ((CONV), (EXPR), (FN), (ARGNO), 0, \
/*issue_conversion_warnings=*/true, \
- /*c_cast_p=*/false)
+ /*c_cast_p=*/false)
static tree convert_like_real (conversion *, tree, tree, int, int, bool,
bool);
static void op_error (enum tree_code, enum tree_code, tree, tree,
- tree, const char *);
+ tree, const char *);
static tree build_object_call (tree, tree);
static tree resolve_args (tree);
static struct z_candidate *build_user_type_conversion_1 (tree, tree, int);
@@ -148,26 +148,26 @@ static tree build_this (tree);
static struct z_candidate *splice_viable (struct z_candidate *, bool, bool *);
static bool any_strictly_viable (struct z_candidate *);
static struct z_candidate *add_template_candidate
- (struct z_candidate **, tree, tree, tree, tree, tree,
- tree, tree, int, unification_kind_t);
+ (struct z_candidate **, tree, tree, tree, tree, tree,
+ tree, tree, int, unification_kind_t);
static struct z_candidate *add_template_candidate_real
- (struct z_candidate **, tree, tree, tree, tree, tree,
- tree, tree, int, tree, unification_kind_t);
-static struct z_candidate *add_template_conv_candidate
- (struct z_candidate **, tree, tree, tree, tree, tree, tree);
+ (struct z_candidate **, tree, tree, tree, tree, tree,
+ tree, tree, int, tree, unification_kind_t);
+static struct z_candidate *add_template_conv_candidate
+ (struct z_candidate **, tree, tree, tree, tree, tree, tree);
static void add_builtin_candidates
(struct z_candidate **, enum tree_code, enum tree_code,
- tree, tree *, int);
+ tree, tree *, int);
static void add_builtin_candidate
(struct z_candidate **, enum tree_code, enum tree_code,
- tree, tree, tree, tree *, tree *, int);
+ tree, tree, tree, tree *, tree *, int);
static bool is_complete (tree);
-static void build_builtin_candidate
+static void build_builtin_candidate
(struct z_candidate **, tree, tree, tree, tree *, tree *,
- int);
-static struct z_candidate *add_conv_candidate
+ int);
+static struct z_candidate *add_conv_candidate
(struct z_candidate **, tree, tree, tree, tree, tree);
-static struct z_candidate *add_function_candidate
+static struct z_candidate *add_function_candidate
(struct z_candidate **, tree, tree, tree, tree, tree, int);
static conversion *implicit_conversion (tree, tree, tree, int);
static conversion *standard_conversion (tree, tree, tree, int);
@@ -176,8 +176,8 @@ static conversion *build_conv (conversion_kind, tree, conversion *);
static bool is_subseq (conversion *, conversion *);
static tree maybe_handle_ref_bind (conversion **);
static void maybe_handle_implicit_object (conversion **);
-static struct z_candidate *add_candidate
- (struct z_candidate **, tree, tree, size_t,
+static struct z_candidate *add_candidate
+ (struct z_candidate **, tree, tree, size_t,
conversion **, tree, tree, int);
static tree source_type (conversion *);
static void add_warning (struct z_candidate *, struct z_candidate *);
@@ -226,12 +226,12 @@ check_dtor_name (tree basetype, tree name)
else
{
/* In the case of:
-
- template <class T> struct S { ~S(); };
- int i;
- i.~S();
-
- NAME will be a class template. */
+
+ template <class T> struct S { ~S(); };
+ int i;
+ i.~S();
+
+ NAME will be a class template. */
gcc_assert (DECL_CLASS_TEMPLATE_P (name));
return false;
}
@@ -340,7 +340,7 @@ build_call (tree function, tree parms)
function = build3 (CALL_EXPR, result_type, function, parms, NULL_TREE);
TREE_HAS_CONSTRUCTOR (function) = is_constructor;
TREE_NOTHROW (function) = nothrow;
-
+
return function;
}
@@ -485,7 +485,7 @@ void
validate_conversion_obstack (void)
{
if (conversion_obstack_initialized)
- gcc_assert ((obstack_next_free (&conversion_obstack)
+ gcc_assert ((obstack_next_free (&conversion_obstack)
== obstack_base (&conversion_obstack)));
}
@@ -544,7 +544,7 @@ static conversion *
build_identity_conv (tree type, tree expr)
{
conversion *c;
-
+
c = alloc_conversion (ck_identity);
c->type = type;
c->u.expr = expr;
@@ -628,18 +628,18 @@ standard_conversion (tree to, tree from, tree expr, int flags)
if (tcode == COMPLEX_TYPE && fcode == COMPLEX_TYPE)
{
/* The standard conversion sequence to convert FROM to TO is
- the standard conversion sequence to perform componentwise
- conversion. */
+ the standard conversion sequence to perform componentwise
+ conversion. */
conversion *part_conv = standard_conversion
- (TREE_TYPE (to), TREE_TYPE (from), NULL_TREE, flags);
-
+ (TREE_TYPE (to), TREE_TYPE (from), NULL_TREE, flags);
+
if (part_conv)
- {
+ {
conv = build_conv (part_conv->kind, to, conv);
conv->rank = part_conv->rank;
- }
+ }
else
- conv = NULL;
+ conv = NULL;
return conv;
}
@@ -680,7 +680,7 @@ standard_conversion (tree to, tree from, tree expr, int flags)
&& TREE_CODE (TREE_TYPE (from)) != FUNCTION_TYPE)
{
from = build_pointer_type
- (cp_build_qualified_type (void_type_node,
+ (cp_build_qualified_type (void_type_node,
cp_type_quals (TREE_TYPE (from))));
conv = build_conv (ck_ptr, from, conv);
}
@@ -694,7 +694,7 @@ standard_conversion (tree to, tree from, tree expr, int flags)
(TYPE_PTRMEM_POINTED_TO_TYPE (from),
TYPE_PTRMEM_POINTED_TO_TYPE (to))))
{
- from = build_ptrmem_type (tbase,
+ from = build_ptrmem_type (tbase,
TYPE_PTRMEM_POINTED_TO_TYPE (from));
conv = build_conv (ck_pmem, from, conv);
}
@@ -704,19 +704,19 @@ standard_conversion (tree to, tree from, tree expr, int flags)
else if (IS_AGGR_TYPE (TREE_TYPE (from))
&& IS_AGGR_TYPE (TREE_TYPE (to))
/* [conv.ptr]
-
- An rvalue of type "pointer to cv D," where D is a
+
+ An rvalue of type "pointer to cv D," where D is a
class type, can be converted to an rvalue of type
"pointer to cv B," where B is a base class (clause
_class.derived_) of D. If B is an inaccessible
(clause _class.access_) or ambiguous
(_class.member.lookup_) base class of D, a program
that necessitates this conversion is ill-formed.
- Therefore, we use DERIVED_FROM_P, and do not check
- access or uniqueness. */
+ Therefore, we use DERIVED_FROM_P, and do not check
+ access or uniqueness. */
&& DERIVED_FROM_P (TREE_TYPE (to), TREE_TYPE (from)))
{
- from =
+ from =
cp_build_qualified_type (TREE_TYPE (to),
cp_type_quals (TREE_TYPE (from)));
from = build_pointer_type (from);
@@ -767,7 +767,7 @@ standard_conversion (tree to, tree from, tree expr, int flags)
return 0;
from = cp_build_qualified_type (tbase, cp_type_quals (fbase));
- from = build_method_type_directly (from,
+ from = build_method_type_directly (from,
TREE_TYPE (fromfn),
TREE_CHAIN (TYPE_ARG_TYPES (fromfn)));
from = build_ptrmemfunc_type (build_pointer_type (from));
@@ -778,7 +778,7 @@ standard_conversion (tree to, tree from, tree expr, int flags)
{
/* [conv.bool]
- An rvalue of arithmetic, enumeration, pointer, or pointer to
+ An rvalue of arithmetic, enumeration, pointer, or pointer to
member type can be converted to an rvalue of type bool. */
if (ARITHMETIC_TYPE_P (from)
|| fcode == ENUMERAL_TYPE
@@ -788,12 +788,12 @@ standard_conversion (tree to, tree from, tree expr, int flags)
conv = build_conv (ck_std, to, conv);
if (fcode == POINTER_TYPE
|| TYPE_PTRMEM_P (from)
- || (TYPE_PTRMEMFUNC_P (from)
+ || (TYPE_PTRMEMFUNC_P (from)
&& conv->rank < cr_pbool))
conv->rank = cr_pbool;
return conv;
}
-
+
return NULL;
}
/* We don't check for ENUMERAL_TYPE here because there are no standard
@@ -917,11 +917,11 @@ convert_class_to_reference (tree t, tree s, tree expr)
{
tree f = OVL_CURRENT (fns);
tree t2 = TREE_TYPE (TREE_TYPE (f));
-
+
cand = NULL;
/* If this is a template function, try to get an exact
- match. */
+ match. */
if (TREE_CODE (f) == TEMPLATE_DECL)
{
cand = add_template_candidate (&candidates,
@@ -933,7 +933,7 @@ convert_class_to_reference (tree t, tree s, tree expr)
TREE_PURPOSE (conversions),
LOOKUP_NORMAL,
DEDUCE_CONV);
-
+
if (cand)
{
/* Now, see if the conversion function really returns
@@ -952,23 +952,23 @@ convert_class_to_reference (tree t, tree s, tree expr)
}
else if (TREE_CODE (t2) == REFERENCE_TYPE
&& reference_compatible_p (t, TREE_TYPE (t2)))
- cand = add_function_candidate (&candidates, f, s, arglist,
- TYPE_BINFO (s),
+ cand = add_function_candidate (&candidates, f, s, arglist,
+ TYPE_BINFO (s),
TREE_PURPOSE (conversions),
LOOKUP_NORMAL);
-
+
if (cand)
{
conversion *identity_conv;
/* Build a standard conversion sequence indicating the
binding from the reference type returned by the
function to the desired REFERENCE_TYPE. */
- identity_conv
- = build_identity_conv (TREE_TYPE (TREE_TYPE
+ identity_conv
+ = build_identity_conv (TREE_TYPE (TREE_TYPE
(TREE_TYPE (cand->fn))),
NULL_TREE);
cand->second_conv
- = (direct_reference_binding
+ = (direct_reference_binding
(reference_type, identity_conv));
cand->second_conv->bad_p |= cand->convs[0]->bad_p;
}
@@ -1005,7 +1005,7 @@ convert_class_to_reference (tree t, tree s, tree expr)
if (cand->viable == -1)
conv->bad_p = true;
-
+
return cand->second_conv;
}
@@ -1023,15 +1023,15 @@ direct_reference_binding (tree type, conversion *conv)
t = TREE_TYPE (type);
- /* [over.ics.rank]
-
+ /* [over.ics.rank]
+
When a parameter of reference type binds directly
(_dcl.init.ref_) to an argument expression, the implicit
conversion sequence is the identity conversion, unless the
argument expression has a type that is a derived class of the
parameter type, in which case the implicit conversion sequence is
a derived-to-base Conversion.
-
+
If the parameter binds directly to the result of applying a
conversion function to the argument expression, the implicit
conversion sequence is a user-defined conversion sequence
@@ -1094,11 +1094,11 @@ reference_binding (tree rto, tree rfrom, tree expr, int flags)
{
/* [dcl.init.ref]
- If the initializer expression
-
+ If the initializer expression
+
-- is an lvalue (but not an lvalue for a bit-field), and "cv1 T1"
is reference-compatible with "cv2 T2,"
-
+
the reference is bound directly to the initializer expression
lvalue. */
conv = build_identity_conv (from, expr);
@@ -1117,7 +1117,7 @@ reference_binding (tree rto, tree rfrom, tree expr, int flags)
a temporary, so we just issue an error when the conversion
actually occurs. */
conv->need_temporary_p = true;
-
+
return conv;
}
else if (CLASS_TYPE_P (from) && !(flags & LOOKUP_NO_CONVERSION))
@@ -1131,9 +1131,9 @@ reference_binding (tree rto, tree rfrom, tree expr, int flags)
"cv1 T1" is reference-compatible with "cv3 T3". (this
conversion is selected by enumerating the applicable
conversion functions (_over.match.ref_) and choosing the
- best one through overload resolution. (_over.match_).
+ best one through overload resolution. (_over.match_).
- the reference is bound to the lvalue result of the conversion
+ the reference is bound to the lvalue result of the conversion
in the second case. */
conv = convert_class_to_reference (to, from, expr);
if (conv)
@@ -1146,7 +1146,7 @@ reference_binding (tree rto, tree rfrom, tree expr, int flags)
return NULL;
/* [over.ics.rank]
-
+
When a parameter of reference type is not bound directly to an
argument expression, the conversion sequence is the one required
to convert the argument expression to the underlying type of the
@@ -1163,16 +1163,16 @@ reference_binding (tree rto, tree rfrom, tree expr, int flags)
return NULL;
/* [dcl.init.ref]
-
+
If the initializer expression is an rvalue, with T2 a class type,
and "cv1 T1" is reference-compatible with "cv2 T2", the reference
is bound in one of the following ways:
-
+
-- The reference is bound to the object represented by the rvalue
- or to a sub-object within that object.
+ or to a sub-object within that object.
-- ...
-
+
We use the first alternative. The implicit conversion sequence
is supposed to be same as we would obtain by generating a
temporary. Fortunately, if the types are reference compatible,
@@ -1256,13 +1256,13 @@ implicit_conversion (tree to, tree from, tree expr, int flags)
functions. */
static struct z_candidate *
-add_candidate (struct z_candidate **candidates,
- tree fn, tree args,
- size_t num_convs, conversion **convs,
- tree access_path, tree conversion_path,
+add_candidate (struct z_candidate **candidates,
+ tree fn, tree args,
+ size_t num_convs, conversion **convs,
+ tree access_path, tree conversion_path,
int viable)
{
- struct z_candidate *cand
+ struct z_candidate *cand
= conversion_obstack_alloc (sizeof (struct z_candidate));
cand->fn = fn;
@@ -1286,8 +1286,8 @@ add_candidate (struct z_candidate **candidates,
comes from for purposes of overload resolution. */
static struct z_candidate *
-add_function_candidate (struct z_candidate **candidates,
- tree fn, tree ctype, tree arglist,
+add_function_candidate (struct z_candidate **candidates,
+ tree fn, tree ctype, tree arglist,
tree access_path, tree conversion_path,
int flags)
{
@@ -1311,7 +1311,7 @@ add_function_candidate (struct z_candidate **candidates,
orig_arglist = arglist;
arglist = skip_artificial_parms_for (fn, arglist);
}
- else
+ else
orig_arglist = arglist;
len = list_length (arglist);
@@ -1410,7 +1410,7 @@ add_function_candidate (struct z_candidate **candidates,
}
out:
- return add_candidate (candidates, fn, orig_arglist, len, convs,
+ return add_candidate (candidates, fn, orig_arglist, len, convs,
access_path, conversion_path, viable);
}
@@ -1427,7 +1427,7 @@ add_function_candidate (struct z_candidate **candidates,
static struct z_candidate *
add_conv_candidate (struct z_candidate **candidates, tree fn, tree obj,
- tree arglist, tree access_path, tree conversion_path)
+ tree arglist, tree access_path, tree conversion_path)
{
tree totype = TREE_TYPE (TREE_TYPE (fn));
int i, len, viable, flags;
@@ -1488,14 +1488,14 @@ add_conv_candidate (struct z_candidate **candidates, tree fn, tree obj,
if (!sufficient_parms_p (parmnode))
viable = 0;
- return add_candidate (candidates, totype, arglist, len, convs,
+ return add_candidate (candidates, totype, arglist, len, convs,
access_path, conversion_path, viable);
}
static void
build_builtin_candidate (struct z_candidate **candidates, tree fnname,
- tree type1, tree type2, tree *args, tree *argtypes,
- int flags)
+ tree type1, tree type2, tree *args, tree *argtypes,
+ int flags)
{
conversion *t;
conversion **convs;
@@ -1536,10 +1536,10 @@ build_builtin_candidate (struct z_candidate **candidates, tree fnname,
convs[0] = t;
else
viable = 0;
- }
+ }
- add_candidate (candidates, fnname, /*args=*/NULL_TREE,
- num_convs, convs,
+ add_candidate (candidates, fnname, /*args=*/NULL_TREE,
+ num_convs, convs,
/*access_path=*/NULL_TREE,
/*conversion_path=*/NULL_TREE,
viable);
@@ -1571,17 +1571,17 @@ promoted_arithmetic_type_p (tree type)
/* Create any builtin operator overload candidates for the operator in
question given the converted operand types TYPE1 and TYPE2. The other
args are passed through from add_builtin_candidates to
- build_builtin_candidate.
-
- TYPE1 and TYPE2 may not be permissible, and we must filter them.
+ build_builtin_candidate.
+
+ TYPE1 and TYPE2 may not be permissible, and we must filter them.
If CODE is requires candidates operands of the same type of the kind
of which TYPE1 and TYPE2 are, we add both candidates
CODE (TYPE1, TYPE1) and CODE (TYPE2, TYPE2). */
static void
add_builtin_candidate (struct z_candidate **candidates, enum tree_code code,
- enum tree_code code2, tree fnname, tree type1,
- tree type2, tree *args, tree *argtypes, int flags)
+ enum tree_code code2, tree fnname, tree type1,
+ tree type2, tree *args, tree *argtypes, int flags)
{
switch (code)
{
@@ -1642,7 +1642,7 @@ add_builtin_candidate (struct z_candidate **candidates, enum tree_code code,
&& (TYPE_PTROB_P (type1)
|| TREE_CODE (TREE_TYPE (type1)) == FUNCTION_TYPE))
break;
- return;
+ return;
/* 9 For every type T, there exist candidate operator functions of the form
T* operator+(T*);
@@ -1652,7 +1652,7 @@ add_builtin_candidate (struct z_candidate **candidates, enum tree_code code,
T operator+(T);
T operator-(T); */
- case CONVERT_EXPR: /* unary + */
+ case UNARY_PLUS_EXPR: /* unary + */
if (TREE_CODE (type1) == POINTER_TYPE)
break;
case NEGATE_EXPR:
@@ -1769,11 +1769,11 @@ add_builtin_candidate (struct z_candidate **candidates, enum tree_code code,
case MAX_EXPR:
case MIN_EXPR:
if (ARITHMETIC_TYPE_P (type1) && ARITHMETIC_TYPE_P (type2))
- break;
+ break;
if (TYPE_PTR_P (type1) && TYPE_PTR_P (type2))
break;
if (TREE_CODE (type1) == ENUMERAL_TYPE && TREE_CODE (type2) == ENUMERAL_TYPE)
- break;
+ break;
if (TYPE_PTR_P (type1) && null_ptr_cst_p (args[1]))
{
type2 = type1;
@@ -1910,9 +1910,9 @@ add_builtin_candidate (struct z_candidate **candidates, enum tree_code code,
/* [over.built]
For every pair of promoted arithmetic types L and R, there
- exist candidate operator functions of the form
+ exist candidate operator functions of the form
- LR operator?(bool, L, R);
+ LR operator?(bool, L, R);
where LR is the result of the usual arithmetic conversions
between types L and R.
@@ -1930,7 +1930,7 @@ add_builtin_candidate (struct z_candidate **candidates, enum tree_code code,
if (!(TYPE_PTR_P (type1) || TYPE_PTR_TO_MEMBER_P (type1))
|| !(TYPE_PTR_P (type2) || TYPE_PTR_TO_MEMBER_P (type2)))
return;
-
+
/* We don't check that the two types are the same; the logic
below will actually create two candidates; one in which both
parameter types are TYPE1, and one in which both parameter
@@ -1980,7 +1980,7 @@ type_decays_to (tree type)
one of the input types converts to.
3) arithmetic candidates. According to the standard, we should generate
all of these, but I'm trying not to...
-
+
Here we generate a superset of the possible candidates for this particular
case. That is a subset of the full set the standard defines, plus some
other cases which the standard disallows. add_builtin_candidate will
@@ -1988,8 +1988,8 @@ type_decays_to (tree type)
static void
add_builtin_candidates (struct z_candidate **candidates, enum tree_code code,
- enum tree_code code2, tree fnname, tree *args,
- int flags)
+ enum tree_code code2, tree fnname, tree *args,
+ int flags)
{
int ref1, i;
int enum_p = 0;
@@ -2055,7 +2055,7 @@ add_builtin_candidates (struct z_candidate **candidates, enum tree_code code,
case GE_EXPR:
enum_p = 1;
/* Fall through. */
-
+
default:
ref1 = 0;
}
@@ -2104,8 +2104,8 @@ add_builtin_candidates (struct z_candidate **candidates, enum tree_code code,
if (i != 0 || ! ref1)
{
type = TYPE_MAIN_VARIANT (type_decays_to (type));
- if (enum_p && TREE_CODE (type) == ENUMERAL_TYPE)
- types[i] = tree_cons (NULL_TREE, type, types[i]);
+ if (enum_p && TREE_CODE (type) == ENUMERAL_TYPE)
+ types[i] = tree_cons (NULL_TREE, type, types[i]);
if (INTEGRAL_TYPE_P (type))
type = type_promotes_to (type);
}
@@ -2124,7 +2124,7 @@ add_builtin_candidates (struct z_candidate **candidates, enum tree_code code,
{
type = TYPE_MAIN_VARIANT (type_decays_to (type));
if (enum_p && TREE_CODE (type) == ENUMERAL_TYPE)
- types[i] = tree_cons (NULL_TREE, type, types[i]);
+ types[i] = tree_cons (NULL_TREE, type, types[i]);
if (INTEGRAL_TYPE_P (type))
type = type_promotes_to (type);
}
@@ -2163,10 +2163,10 @@ add_builtin_candidates (struct z_candidate **candidates, enum tree_code code,
static struct z_candidate*
add_template_candidate_real (struct z_candidate **candidates, tree tmpl,
- tree ctype, tree explicit_targs, tree arglist,
- tree return_type, tree access_path,
+ tree ctype, tree explicit_targs, tree arglist,
+ tree return_type, tree access_path,
tree conversion_path, int flags, tree obj,
- unification_kind_t strict)
+ unification_kind_t strict)
{
int ntparms = DECL_NTPARMS (tmpl);
tree targs = make_tree_vec (ntparms);
@@ -2199,26 +2199,26 @@ add_template_candidate_real (struct z_candidate **candidates, tree tmpl,
/* In [class.copy]:
A member function template is never instantiated to perform the
- copy of a class object to an object of its class type.
+ copy of a class object to an object of its class type.
It's a little unclear what this means; the standard explicitly
does allow a template to be used to copy a class. For example,
in:
struct A {
- A(A&);
+ A(A&);
template <class T> A(const T&);
};
const A f ();
void g () { A a (f ()); }
-
+
the member template will be used to make the copy. The section
quoted above appears in the paragraph that forbids constructors
whose only parameter is (a possibly cv-qualified variant of) the
class type, and a logical interpretation is that the intent was
to forbid the instantiation of member templates which would then
have that form. */
- if (DECL_CONSTRUCTOR_P (fn) && list_length (arglist) == 2)
+ if (DECL_CONSTRUCTOR_P (fn) && list_length (arglist) == 2)
{
tree arg_types = FUNCTION_FIRST_USER_PARMTYPE (fn);
if (arg_types && same_type_p (TYPE_MAIN_VARIANT (TREE_VALUE (arg_types)),
@@ -2232,7 +2232,7 @@ add_template_candidate_real (struct z_candidate **candidates, tree tmpl,
conversion_path, arglist);
else
cand = add_function_candidate (candidates, fn, ctype,
- arglist, access_path,
+ arglist, access_path,
conversion_path, flags);
if (DECL_TI_TEMPLATE (fn) != tmpl)
/* This situation can occur if a member template of a template
@@ -2262,13 +2262,13 @@ add_template_candidate_real (struct z_candidate **candidates, tree tmpl,
static struct z_candidate *
add_template_candidate (struct z_candidate **candidates, tree tmpl, tree ctype,
- tree explicit_targs, tree arglist, tree return_type,
- tree access_path, tree conversion_path, int flags,
- unification_kind_t strict)
+ tree explicit_targs, tree arglist, tree return_type,
+ tree access_path, tree conversion_path, int flags,
+ unification_kind_t strict)
{
- return
+ return
add_template_candidate_real (candidates, tmpl, ctype,
- explicit_targs, arglist, return_type,
+ explicit_targs, arglist, return_type,
access_path, conversion_path,
flags, NULL_TREE, strict);
}
@@ -2276,10 +2276,10 @@ add_template_candidate (struct z_candidate **candidates, tree tmpl, tree ctype,
static struct z_candidate *
add_template_conv_candidate (struct z_candidate **candidates, tree tmpl,
- tree obj, tree arglist, tree return_type,
+ tree obj, tree arglist, tree return_type,
tree access_path, tree conversion_path)
{
- return
+ return
add_template_candidate_real (candidates, tmpl, NULL_TREE, NULL_TREE,
arglist, return_type, access_path,
conversion_path, 0, obj, DEDUCE_CONV);
@@ -2304,8 +2304,8 @@ splice_viable (struct z_candidate *cands,
last_viable = &viable;
*any_viable_p = false;
- cand = &cands;
- while (*cand)
+ cand = &cands;
+ while (*cand)
{
struct z_candidate *c = *cand;
if (strict_p ? c->viable == 1 : c->viable)
@@ -2460,7 +2460,7 @@ merge_conversion_sequences (conversion *user_seq, conversion *std_seq)
gcc_assert (user_seq->kind == ck_user);
/* Find the end of the second conversion sequence. */
- t = &(std_seq);
+ t = &(std_seq);
while ((*t)->kind != ck_identity)
t = &((*t)->u.next);
@@ -2526,18 +2526,18 @@ build_user_type_conversion_1 (tree totype, tree expr, int flags)
if (DECL_NONCONVERTING_P (ctor))
continue;
- if (TREE_CODE (ctor) == TEMPLATE_DECL)
+ if (TREE_CODE (ctor) == TEMPLATE_DECL)
cand = add_template_candidate (&candidates, ctor, totype,
- NULL_TREE, args, NULL_TREE,
+ NULL_TREE, args, NULL_TREE,
TYPE_BINFO (totype),
TYPE_BINFO (totype),
flags,
DEDUCE_CALL);
- else
+ else
cand = add_function_candidate (&candidates, ctor, totype,
- args, TYPE_BINFO (totype),
+ args, TYPE_BINFO (totype),
TYPE_BINFO (totype),
- flags);
+ flags);
if (cand)
cand->second_conv = build_identity_conv (totype, NULL_TREE);
@@ -2558,11 +2558,11 @@ build_user_type_conversion_1 (tree totype, tree expr, int flags)
look for a temporary binding. */
if (TREE_CODE (totype) == REFERENCE_TYPE)
convflags |= LOOKUP_NO_TEMP_BIND;
-
+
for (fns = TREE_VALUE (conv_fns); fns; fns = OVL_NEXT (fns))
{
tree fn = OVL_CURRENT (fns);
-
+
/* [over.match.funcs] For conversion functions, the function
is considered to be a member of the class of the implicit
object argument for the purpose of defining the type of
@@ -2571,29 +2571,29 @@ build_user_type_conversion_1 (tree totype, tree expr, int flags)
So we pass fromtype as CTYPE to add_*_candidate. */
if (TREE_CODE (fn) == TEMPLATE_DECL)
- cand = add_template_candidate (&candidates, fn, fromtype,
+ cand = add_template_candidate (&candidates, fn, fromtype,
NULL_TREE,
- args, totype,
- TYPE_BINFO (fromtype),
+ args, totype,
+ TYPE_BINFO (fromtype),
conversion_path,
flags,
DEDUCE_CONV);
- else
+ else
cand = add_function_candidate (&candidates, fn, fromtype,
args,
TYPE_BINFO (fromtype),
conversion_path,
- flags);
+ flags);
if (cand)
{
conversion *ics
- = implicit_conversion (totype,
+ = implicit_conversion (totype,
TREE_TYPE (TREE_TYPE (cand->fn)),
0, convflags);
cand->second_conv = ics;
-
+
if (!ics)
cand->viable = 0;
else if (candidates->viable == 1 && ics->bad_p)
@@ -2671,7 +2671,7 @@ resolve_args (tree args)
for (t = args; t; t = TREE_CHAIN (t))
{
tree arg = TREE_VALUE (t);
-
+
if (arg == error_mark_node)
return error_mark_node;
else if (VOID_TYPE_P (TREE_TYPE (arg)))
@@ -2690,14 +2690,14 @@ resolve_args (tree args)
that overload resolution fails, *CANDIDATES will be the set of
candidates considered, and ANY_VIABLE_P will be set to true or
false to indicate whether or not any of the candidates were
- viable.
+ viable.
The ARGS should already have gone through RESOLVE_ARGS before this
function is called. */
static struct z_candidate *
-perform_overload_resolution (tree fn,
- tree args,
+perform_overload_resolution (tree fn,
+ tree args,
struct z_candidate **candidates,
bool *any_viable_p)
{
@@ -2709,7 +2709,7 @@ perform_overload_resolution (tree fn,
*any_viable_p = true;
/* Check FN and ARGS. */
- gcc_assert (TREE_CODE (fn) == FUNCTION_DECL
+ gcc_assert (TREE_CODE (fn) == FUNCTION_DECL
|| TREE_CODE (fn) == TEMPLATE_DECL
|| TREE_CODE (fn) == OVERLOAD
|| TREE_CODE (fn) == TEMPLATE_ID_EXPR);
@@ -2739,7 +2739,7 @@ perform_overload_resolution (tree fn,
/* Return an expression for a call to FN (a namespace-scope function,
or a static member function) with the ARGS. */
-
+
tree
build_new_function_call (tree fn, tree args)
{
@@ -2816,7 +2816,7 @@ build_operator_new_call (tree fnname, tree args, tree *size, tree *cookie_size)
/* Figure out what function is being called. */
cand = perform_overload_resolution (fns, args, &candidates, &any_viable_p);
-
+
/* If no suitable function could be found, issue an error message
and give up. */
if (!cand)
@@ -2857,7 +2857,7 @@ build_operator_new_call (tree fnname, tree args, tree *size, tree *cookie_size)
/* Skip the size_t parameter. */
arg_types = TREE_CHAIN (arg_types);
/* Check the remaining parameters (if any). */
- if (arg_types
+ if (arg_types
&& TREE_CHAIN (arg_types) == void_list_node
&& same_type_p (TREE_VALUE (arg_types),
ptr_type_node))
@@ -2919,7 +2919,7 @@ build_object_call (tree obj, tree args)
tree fn = OVL_CURRENT (fns);
if (TREE_CODE (fn) == TEMPLATE_DECL)
add_template_candidate (&candidates, fn, base, NULL_TREE,
- mem_args, NULL_TREE,
+ mem_args, NULL_TREE,
TYPE_BINFO (type),
TYPE_BINFO (type),
LOOKUP_NORMAL, DEDUCE_CALL);
@@ -2947,8 +2947,8 @@ build_object_call (tree obj, tree args)
for (; fns; fns = OVL_NEXT (fns))
{
tree fn = OVL_CURRENT (fns);
- if (TREE_CODE (fn) == TEMPLATE_DECL)
- add_template_conv_candidate
+ if (TREE_CODE (fn) == TEMPLATE_DECL)
+ add_template_conv_candidate
(&candidates, fn, obj, args, totype,
/*access_path=*/NULL_TREE,
/*conversion_path=*/NULL_TREE);
@@ -2997,7 +2997,7 @@ build_object_call (tree obj, tree args)
static void
op_error (enum tree_code code, enum tree_code code2,
- tree arg1, tree arg2, tree arg3, const char *problem)
+ tree arg1, tree arg2, tree arg3, const char *problem)
{
const char *opname;
@@ -3010,14 +3010,14 @@ op_error (enum tree_code code, enum tree_code code2,
{
case COND_EXPR:
error ("%s for ternary %<operator?:%> in %<%E ? %E : %E%>",
- problem, arg1, arg2, arg3);
+ problem, arg1, arg2, arg3);
break;
-
+
case POSTINCREMENT_EXPR:
case POSTDECREMENT_EXPR:
error ("%s for %<operator%s%> in %<%E%s%>", problem, opname, arg1, opname);
break;
-
+
case ARRAY_REF:
error ("%s for %<operator[]%> in %<%E[%E]%>", problem, arg1, arg2);
break;
@@ -3026,14 +3026,14 @@ op_error (enum tree_code code, enum tree_code code2,
case IMAGPART_EXPR:
error ("%s for %qs in %<%s %E%>", problem, opname, opname, arg1);
break;
-
+
default:
if (arg2)
error ("%s for %<operator%s%> in %<%E %s %E%>",
- problem, opname, arg1, opname, arg2);
+ problem, opname, arg1, opname, arg2);
else
error ("%s for %<operator%s%> in %<%s%E%>",
- problem, opname, opname, arg1);
+ problem, opname, opname, arg1);
break;
}
}
@@ -3057,7 +3057,7 @@ conditional_conversion (tree e1, tree e2)
reference must bind directly (_dcl.init.ref_) to E1. */
if (real_lvalue_p (e2))
{
- conv = implicit_conversion (build_reference_type (t2),
+ conv = implicit_conversion (build_reference_type (t2),
t1,
e1,
LOOKUP_NO_TEMP_BIND);
@@ -3081,7 +3081,7 @@ conditional_conversion (tree e1, tree e2)
if (good_base && at_least_as_qualified_p (t2, t1))
{
conv = build_identity_conv (t1, e1);
- if (!same_type_p (TYPE_MAIN_VARIANT (t1),
+ if (!same_type_p (TYPE_MAIN_VARIANT (t1),
TYPE_MAIN_VARIANT (t2)))
conv = build_conv (ck_base, t2, conv);
else
@@ -3132,7 +3132,7 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
}
/* [expr.cond]
-
+
The first expr ession is implicitly converted to bool (clause
_conv_). */
arg1 = perform_implicit_conversion (boolean_type_node, arg1);
@@ -3174,12 +3174,12 @@ build_conditional_expr (tree arg1, tree arg2, tree 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.
- We must avoid calling force_rvalue for expressions of type
+ We must avoid calling force_rvalue for expressions of type
"void" because it will complain that their value is being
used. */
- if (TREE_CODE (arg2) == THROW_EXPR
+ if (TREE_CODE (arg2) == THROW_EXPR
&& TREE_CODE (arg3) != THROW_EXPR)
{
if (!VOID_TYPE_P (arg3_type))
@@ -3187,7 +3187,7 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
arg3_type = TREE_TYPE (arg3);
result_type = arg3_type;
}
- else if (TREE_CODE (arg2) != THROW_EXPR
+ else if (TREE_CODE (arg2) != THROW_EXPR
&& TREE_CODE (arg3) == THROW_EXPR)
{
if (!VOID_TYPE_P (arg2_type))
@@ -3217,7 +3217,7 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
{
conversion *conv2;
conversion *conv3;
-
+
/* Get the high-water mark for the CONVERSION_OBSTACK. */
p = conversion_obstack_alloc (0);
@@ -3262,7 +3262,7 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
/* If, after the conversion, both operands have class type,
treat the cv-qualification of both operands as if it were the
- union of the cv-qualification of the operands.
+ union of the cv-qualification of the operands.
The standard is not clear about what to do in this
circumstance. For example, if the first operand has type
@@ -3278,7 +3278,7 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
if ((conv2 || conv3)
&& CLASS_TYPE_P (arg2_type)
&& TYPE_QUALS (arg2_type) != TYPE_QUALS (arg3_type))
- arg2_type = arg3_type =
+ arg2_type = arg3_type =
cp_build_qualified_type (arg2_type,
TYPE_QUALS (arg2_type)
| TYPE_QUALS (arg3_type));
@@ -3288,8 +3288,8 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
If the second and third operands are lvalues and have the same
type, the result is of that type and is an lvalue. */
- if (real_lvalue_p (arg2)
- && real_lvalue_p (arg3)
+ if (real_lvalue_p (arg2)
+ && real_lvalue_p (arg3)
&& same_type_p (arg2_type, arg3_type))
{
result_type = arg2_type;
@@ -3317,8 +3317,8 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
args[0] = arg2;
args[1] = arg3;
args[2] = arg1;
- add_builtin_candidates (&candidates,
- COND_EXPR,
+ add_builtin_candidates (&candidates,
+ COND_EXPR,
NOP_EXPR,
ansi_opname (COND_EXPR),
args,
@@ -3377,9 +3377,9 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
if (arg2 == error_mark_node || arg3 == error_mark_node)
return error_mark_node;
-
+
/* [expr.cond]
-
+
After those conversions, one of the following shall hold:
--The second and third operands have the same type; the result is of
@@ -3391,26 +3391,26 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
--The second and third operands have arithmetic or enumeration
type; the usual arithmetic conversions are performed to bring
them to a common type, and the result is of that type. */
- else if ((ARITHMETIC_TYPE_P (arg2_type)
+ else if ((ARITHMETIC_TYPE_P (arg2_type)
|| TREE_CODE (arg2_type) == ENUMERAL_TYPE)
&& (ARITHMETIC_TYPE_P (arg3_type)
|| TREE_CODE (arg3_type) == ENUMERAL_TYPE))
{
/* In this case, there is always a common type. */
- result_type = type_after_usual_arithmetic_conversions (arg2_type,
+ result_type = type_after_usual_arithmetic_conversions (arg2_type,
arg3_type);
-
+
if (TREE_CODE (arg2_type) == ENUMERAL_TYPE
- && TREE_CODE (arg3_type) == ENUMERAL_TYPE)
- warning (0, "enumeral mismatch in conditional expression: %qT vs %qT",
- arg2_type, arg3_type);
+ && TREE_CODE (arg3_type) == ENUMERAL_TYPE)
+ warning (0, "enumeral mismatch in conditional expression: %qT vs %qT",
+ arg2_type, arg3_type);
else if (extra_warnings
- && ((TREE_CODE (arg2_type) == ENUMERAL_TYPE
- && !same_type_p (arg3_type, type_promotes_to (arg2_type)))
- || (TREE_CODE (arg3_type) == ENUMERAL_TYPE
- && !same_type_p (arg2_type, type_promotes_to (arg3_type)))))
- warning (0, "enumeral and non-enumeral type in conditional expression");
-
+ && ((TREE_CODE (arg2_type) == ENUMERAL_TYPE
+ && !same_type_p (arg3_type, type_promotes_to (arg2_type)))
+ || (TREE_CODE (arg3_type) == ENUMERAL_TYPE
+ && !same_type_p (arg2_type, type_promotes_to (arg3_type)))))
+ warning (0, "enumeral and non-enumeral type in conditional expression");
+
arg2 = perform_implicit_conversion (result_type, arg2);
arg3 = perform_implicit_conversion (result_type, arg3);
}
@@ -3430,9 +3430,9 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
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. */
- else if ((null_ptr_cst_p (arg2)
+ else if ((null_ptr_cst_p (arg2)
&& (TYPE_PTR_P (arg3_type) || TYPE_PTR_TO_MEMBER_P (arg3_type)))
- || (null_ptr_cst_p (arg3)
+ || (null_ptr_cst_p (arg3)
&& (TYPE_PTR_P (arg2_type) || TYPE_PTR_TO_MEMBER_P (arg2_type)))
|| (TYPE_PTR_P (arg2_type) && TYPE_PTR_P (arg3_type))
|| (TYPE_PTRMEM_P (arg2_type) && TYPE_PTRMEM_P (arg3_type))
@@ -3453,7 +3453,7 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
}
valid_operands:
- result = fold_if_not_in_template (build3 (COND_EXPR, result_type, arg1,
+ result = fold_if_not_in_template (build3 (COND_EXPR, result_type, arg1,
arg2, arg3));
/* We can't use result_type below, as fold might have returned a
throw_expr. */
@@ -3463,7 +3463,7 @@ build_conditional_expr (tree arg1, tree arg2, tree arg3)
sometimes wrap them in NOP_EXPRs so the test would fail. */
if (!lvalue_p && CLASS_TYPE_P (TREE_TYPE (result)))
result = get_target_expr (result);
-
+
/* If this expression is an rvalue, but might be mistaken for an
lvalue, we must add a NON_LVALUE_EXPR. */
if (!lvalue_p && real_lvalue_p (result))
@@ -3499,7 +3499,7 @@ prep_operand (tree operand)
ACCESS_PATH, and FLAGS are as for add_function_candidate. */
static void
-add_candidates (tree fns, tree args,
+add_candidates (tree fns, tree args,
tree explicit_targs, bool template_only,
tree conversion_path, tree access_path,
int flags,
@@ -3512,7 +3512,7 @@ add_candidates (tree fns, tree args,
/* Delay creating the implicit this parameter until it is needed. */
non_static_args = NULL_TREE;
- while (fns)
+ while (fns)
{
tree fn;
tree fn_args;
@@ -3534,8 +3534,8 @@ add_candidates (tree fns, tree args,
fn_args = args;
if (TREE_CODE (fn) == TEMPLATE_DECL)
- add_template_candidate (candidates,
- fn,
+ add_template_candidate (candidates,
+ fn,
ctype,
explicit_targs,
fn_args,
@@ -3571,8 +3571,8 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
bool strict_p;
bool any_viable_p;
- if (error_operand_p (arg1)
- || error_operand_p (arg2)
+ if (error_operand_p (arg1)
+ || error_operand_p (arg2)
|| error_operand_p (arg3))
return error_mark_node;
@@ -3586,7 +3586,7 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
fnname = ansi_opname (code);
arg1 = prep_operand (arg1);
-
+
switch (code)
{
case NEW_EXPR:
@@ -3605,7 +3605,7 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
arg2 = prep_operand (arg2);
arg3 = prep_operand (arg3);
-
+
if (code == COND_EXPR)
{
if (arg2 == NULL_TREE
@@ -3649,7 +3649,7 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
goto user_defined_result_ready;
}
if (fns)
- add_candidates (BASELINK_FUNCTIONS (fns), arglist,
+ add_candidates (BASELINK_FUNCTIONS (fns), arglist,
NULL_TREE, false,
BASELINK_BINFO (fns),
TYPE_BINFO (TREE_TYPE (arg1)),
@@ -3691,7 +3691,7 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
default:
strict_p = pedantic;
break;
- }
+ }
candidates = splice_viable (candidates, strict_p, &any_viable_p);
if (!any_viable_p)
@@ -3704,13 +3704,13 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
one, then we fall back to the old way of doing things. */
if (flags & LOOKUP_COMPLAIN)
pedwarn ("no %<%D(int)%> declared for postfix %qs, "
- "trying prefix operator instead",
- fnname,
- operator_name_info[code].name);
+ "trying prefix operator instead",
+ fnname,
+ operator_name_info[code].name);
if (code == POSTINCREMENT_EXPR)
code = PREINCREMENT_EXPR;
else
- code = PREDECREMENT_EXPR;
+ code = PREDECREMENT_EXPR;
result = build_new_op (code, flags, arg1, NULL_TREE, NULL_TREE,
overloaded_p);
break;
@@ -3771,13 +3771,13 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
case LE_EXPR:
case EQ_EXPR:
case NE_EXPR:
- if (TREE_CODE (TREE_TYPE (arg1)) == ENUMERAL_TYPE
- && TREE_CODE (TREE_TYPE (arg2)) == ENUMERAL_TYPE
+ if (TREE_CODE (TREE_TYPE (arg1)) == ENUMERAL_TYPE
+ && TREE_CODE (TREE_TYPE (arg2)) == ENUMERAL_TYPE
&& (TYPE_MAIN_VARIANT (TREE_TYPE (arg1))
!= TYPE_MAIN_VARIANT (TREE_TYPE (arg2))))
{
- warning (0, "comparison between %q#T and %q#T",
- TREE_TYPE (arg1), TREE_TYPE (arg2));
+ warning (0, "comparison between %q#T and %q#T",
+ TREE_TYPE (arg1), TREE_TYPE (arg2));
}
break;
default:
@@ -3848,7 +3848,7 @@ build_new_op (enum tree_code code, int flags, tree arg1, tree arg2, tree arg3,
case TRUTH_ORIF_EXPR:
return cp_build_binary_op (code, arg1, arg2);
- case CONVERT_EXPR:
+ case UNARY_PLUS_EXPR:
case NEGATE_EXPR:
case BIT_NOT_EXPR:
case TRUTH_NOT_EXPR:
@@ -3909,7 +3909,7 @@ build_op_delete_call (enum tree_code code, tree addr, tree size,
fnname = ansi_opname (code);
- if (CLASS_TYPE_P (type)
+ if (CLASS_TYPE_P (type)
&& COMPLETE_TYPE_P (complete_type (type))
&& !global_p)
/* In [class.free]
@@ -3917,7 +3917,7 @@ build_op_delete_call (enum tree_code code, tree addr, tree size,
If the result of the lookup is ambiguous or inaccessible, or if
the lookup selects a placement deallocation function, the
program is ill-formed.
-
+
Therefore, we ask lookup_fnfields to complain about ambiguity. */
{
fns = lookup_fnfields (TYPE_BINFO (type), fnname, 1);
@@ -3959,12 +3959,12 @@ build_op_delete_call (enum tree_code code, tree addr, tree size,
the first pass, we look for a one-operator (or placement)
operator delete. If we're not doing placement delete, then on
the second pass we look for a two-argument delete. */
- for (pass = 0; pass < (placement ? 1 : 2); ++pass)
+ for (pass = 0; pass < (placement ? 1 : 2); ++pass)
{
/* Go through the `operator delete' functions looking for one
with a matching type. */
- for (fn = BASELINK_P (fns) ? BASELINK_FUNCTIONS (fns) : fns;
- fn;
+ for (fn = BASELINK_P (fns) ? BASELINK_FUNCTIONS (fns) : fns;
+ fn;
fn = OVL_NEXT (fn))
{
tree t;
@@ -4016,7 +4016,7 @@ build_op_delete_call (enum tree_code code, tree addr, tree size,
if (pass == 0)
args = tree_cons (NULL_TREE, addr, args);
else
- args = tree_cons (NULL_TREE, addr,
+ args = tree_cons (NULL_TREE, addr,
build_tree_list (NULL_TREE, size));
if (placement)
@@ -4035,7 +4035,7 @@ build_op_delete_call (enum tree_code code, tree addr, tree size,
if (placement)
return NULL_TREE;
- error ("no suitable %<operator %s> for %qT",
+ error ("no suitable %<operator %s%> for %qT",
operator_name_info[(int)code].name, type);
return error_mark_node;
}
@@ -4048,7 +4048,7 @@ bool
enforce_access (tree basetype_path, tree decl)
{
gcc_assert (TREE_CODE (basetype_path) == TREE_BINFO);
-
+
if (!accessible_p (basetype_path, decl, true))
{
if (TREE_PRIVATE (decl))
@@ -4072,7 +4072,7 @@ check_constructor_callable (tree type, tree expr)
{
build_special_member_call (NULL_TREE,
complete_ctor_identifier,
- build_tree_list (NULL_TREE, expr),
+ build_tree_list (NULL_TREE, expr),
type,
LOOKUP_NORMAL | LOOKUP_ONLYCONVERTING
| LOOKUP_NO_CONVERSION
@@ -4086,15 +4086,15 @@ check_constructor_callable (tree type, tree expr)
to NULL. */
static tree
-build_temp (tree expr, tree type, int flags,
+build_temp (tree expr, tree type, int flags,
void (**diagnostic_fn)(const char *, ...))
{
int savew, savee;
-
+
savew = warningcount, savee = errorcount;
expr = build_special_member_call (NULL_TREE,
complete_ctor_identifier,
- build_tree_list (NULL_TREE, expr),
+ build_tree_list (NULL_TREE, expr),
type, flags);
if (warningcount > savew)
*diagnostic_fn = warning0;
@@ -4104,7 +4104,7 @@ build_temp (tree expr, tree type, int flags,
*diagnostic_fn = NULL;
return expr;
}
-
+
/* Perform the conversions in CONVS on the expression EXPR. FN and
ARGNUM are used for diagnostics. ARGNUM is zero based, -1
@@ -4117,7 +4117,7 @@ build_temp (tree expr, tree type, int flags,
conversions to inaccessible bases are permitted. */
static tree
-convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
+convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
int inner, bool issue_conversion_warnings,
bool c_cast_p)
{
@@ -4151,7 +4151,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
pedwarn (" initializing argument %P of %qD", argnum, fn);
return cp_convert (totype, expr);
}
-
+
if (issue_conversion_warnings)
{
tree t = non_reference (totype);
@@ -4180,7 +4180,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
variable. */
else if (TYPE_UNSIGNED (t) && TREE_CODE (t) != BOOLEAN_TYPE)
{
- if (TREE_CODE (expr) == INTEGER_CST && TREE_NEGATED_INT (expr))
+ if (TREE_CODE (expr) == INTEGER_CST && TREE_NEGATED_INT (expr))
{
if (fn)
warning (0, "passing negative value %qE for argument %P to %qD",
@@ -4188,7 +4188,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
else
warning (0, "converting negative value %qE to %qT", expr, t);
}
-
+
overflow_warning (expr);
}
}
@@ -4233,23 +4233,23 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
if (IS_AGGR_TYPE (totype)
&& (inner >= 0 || !lvalue_p (expr)))
{
- expr = (build_temp
- (expr, totype,
+ expr = (build_temp
+ (expr, totype,
/* Core issue 84, now a DR, says that we don't
allow UDCs for these args (which deliberately
breaks copy-init of an auto_ptr<Base> from an
auto_ptr<Derived>). */
LOOKUP_NORMAL|LOOKUP_ONLYCONVERTING|LOOKUP_NO_CONVERSION,
&diagnostic_fn));
-
+
if (diagnostic_fn)
{
if (fn)
- diagnostic_fn
+ diagnostic_fn
(" initializing argument %P of %qD from result of %qD",
argnum, fn, convfn);
else
- diagnostic_fn
+ diagnostic_fn
(" initializing temporary from result of %qD", convfn);
}
expr = build_cplus_new (totype, expr);
@@ -4343,8 +4343,8 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
copy constructor, and we'll end up with an infinite
loop. If we can use a bitwise copy, then we'll be
OK. */
- if ((lvalue & clk_packed)
- && CLASS_TYPE_P (type)
+ if ((lvalue & clk_packed)
+ && CLASS_TYPE_P (type)
&& !TYPE_HAS_TRIVIAL_INIT_REF (type))
{
error ("cannot bind packed field %qE to %qT",
@@ -4363,7 +4363,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
/* Convert it to a pointer to the type referred to by the
reference. This will adjust the pointer if a derived to
base conversion is being performed. */
- expr = cp_convert (build_pointer_type (TREE_TYPE (ref_type)),
+ expr = cp_convert (build_pointer_type (TREE_TYPE (ref_type)),
expr);
/* Convert the pointer to the desired reference type. */
return build_nop (ref_type, expr);
@@ -4432,19 +4432,19 @@ convert_arg_to_ellipsis (tree arg)
arg = perform_integral_promotions (arg);
arg = require_complete_type (arg);
-
+
if (arg != error_mark_node
&& !pod_type_p (TREE_TYPE (arg)))
{
/* 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.
- If the call appears in the context of a sizeof expression,
- there is no need to emit a warning, since the expression won't be
+ try to do that.
+ If the call appears in the context of a sizeof expression,
+ there is no need to emit a warning, since the expression won't be
evaluated. We keep the builtin_trap just as a safety check. */
if (!skip_evaluation)
warning (0, "cannot pass objects of non-POD type %q#T through %<...%>; "
- "call will abort at runtime", TREE_TYPE (arg));
+ "call will abort at runtime", TREE_TYPE (arg));
arg = call_builtin_trap ();
arg = build2 (COMPOUND_EXPR, integer_type_node, arg,
integer_zero_node);
@@ -4460,24 +4460,24 @@ build_x_va_arg (tree expr, tree type)
{
if (processing_template_decl)
return build_min (VA_ARG_EXPR, type, expr);
-
+
type = complete_type_or_else (type, NULL_TREE);
if (expr == error_mark_node || !type)
return error_mark_node;
-
+
if (! pod_type_p (type))
{
/* Undefined behavior [expr.call] 5.2.2/7. */
warning (0, "cannot receive objects of non-POD type %q#T through %<...%>; "
- "call will abort at runtime", type);
+ "call will abort at runtime", type);
expr = convert (build_pointer_type (type), null_node);
expr = build2 (COMPOUND_EXPR, TREE_TYPE (expr),
call_builtin_trap (), expr);
expr = build_indirect_ref (expr, NULL);
return expr;
}
-
+
return build_va_arg (expr, type);
}
@@ -4497,7 +4497,7 @@ cxx_type_promotes_to (tree type)
promote = type_promotes_to (type);
if (same_type_p (type, promote))
promote = type;
-
+
return promote;
}
@@ -4699,7 +4699,7 @@ build_over_call (struct z_candidate *cand, int flags)
parm = TREE_CHAIN (parm);
/* We should never try to call the abstract constructor. */
gcc_assert (!DECL_HAS_IN_CHARGE_PARM_P (fn));
-
+
if (DECL_HAS_VTT_PARM_P (fn))
{
converted_args = tree_cons
@@ -4707,7 +4707,7 @@ build_over_call (struct z_candidate *cand, int flags)
arg = TREE_CHAIN (arg);
parm = TREE_CHAIN (parm);
}
- }
+ }
/* Bypass access control for 'this' parameter. */
else if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE)
{
@@ -4715,16 +4715,16 @@ build_over_call (struct z_candidate *cand, int flags)
tree argtype = TREE_TYPE (TREE_VALUE (arg));
tree converted_arg;
tree base_binfo;
-
+
if (convs[i]->bad_p)
pedwarn ("passing %qT as %<this%> argument of %q#D discards qualifiers",
- TREE_TYPE (argtype), fn);
+ TREE_TYPE (argtype), fn);
/* [class.mfct.nonstatic]: If a nonstatic member function of a class
X is called for an object that is not of type X, or of a type
derived from X, the behavior is undefined.
- So we can assume that anything passed as 'this' is non-null, and
+ So we can assume that anything passed as 'this' is non-null, and
optimize accordingly. */
gcc_assert (TREE_CODE (parmtype) == POINTER_TYPE);
/* Convert to the base in which the function was declared. */
@@ -4734,19 +4734,19 @@ build_over_call (struct z_candidate *cand, int flags)
cand->conversion_path,
1);
/* Check that the base class is accessible. */
- if (!accessible_base_p (TREE_TYPE (argtype),
+ if (!accessible_base_p (TREE_TYPE (argtype),
BINFO_TYPE (cand->conversion_path), true))
error ("%qT is not an accessible base of %qT",
BINFO_TYPE (cand->conversion_path),
TREE_TYPE (argtype));
/* 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. */
+ 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_unique, 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);
@@ -4769,9 +4769,9 @@ build_over_call (struct z_candidate *cand, int flags)
/* Default arguments */
for (; parm && parm != void_list_node; parm = TREE_CHAIN (parm), i++)
- converted_args
- = tree_cons (NULL_TREE,
- convert_default_arg (TREE_VALUE (parm),
+ converted_args
+ = tree_cons (NULL_TREE,
+ convert_default_arg (TREE_VALUE (parm),
TREE_PURPOSE (parm),
fn, i - is_method),
converted_args);
@@ -4812,7 +4812,7 @@ build_over_call (struct z_candidate *cand, int flags)
if (TREE_CODE (targ) == ADDR_EXPR)
{
targ = TREE_OPERAND (targ, 0);
- if (!same_type_ignoring_top_level_qualifiers_p
+ if (!same_type_ignoring_top_level_qualifiers_p
(TREE_TYPE (TREE_TYPE (arg)), TREE_TYPE (targ)))
targ = NULL_TREE;
}
@@ -4830,10 +4830,10 @@ build_over_call (struct z_candidate *cand, int flags)
mark_used (fn);
/* If we're creating a temp and we already have one, don't create a
- new one. If we're not creating a temp but we get one, use
- INIT_EXPR to collapse the temp into our target. Otherwise, if the
- ctor is trivial, do a bitwise copy with a simple TARGET_EXPR for a
- temp or an INIT_EXPR otherwise. */
+ new one. If we're not creating a temp but we get one, use
+ INIT_EXPR to collapse the temp into our target. Otherwise, if the
+ ctor is trivial, do a bitwise copy with a simple TARGET_EXPR for a
+ temp or an INIT_EXPR otherwise. */
if (integer_zerop (TREE_VALUE (args)))
{
if (TREE_CODE (arg) == TARGET_EXPR)
@@ -4883,7 +4883,7 @@ build_over_call (struct z_candidate *cand, int flags)
t = convert (TREE_TYPE (TREE_VALUE (args)), t);
val = build_indirect_ref (t, 0);
}
-
+
return val;
}
@@ -4896,7 +4896,7 @@ build_over_call (struct z_candidate *cand, int flags)
DECL_CONTEXT (fn),
ba_any, NULL);
gcc_assert (binfo && binfo != error_mark_node);
-
+
*p = build_base_path (PLUS_EXPR, *p, binfo, 1);
if (TREE_SIDE_EFFECTS (*p))
*p = save_expr (*p);
@@ -4928,7 +4928,7 @@ build_cxx_call (tree fn, tree args)
/* If this call might throw an exception, note that fact. */
fndecl = get_callee_fndecl (fn);
- if ((!fndecl || !TREE_NOTHROW (fndecl))
+ if ((!fndecl || !TREE_NOTHROW (fndecl))
&& at_function_scope_p ()
&& cfun)
cp_function_chain->can_throw = 1;
@@ -4961,7 +4961,7 @@ build_java_interface_fn_ref (tree fn, tree instance)
tree lookup_args, lookup_fn, method, idx;
tree klass_ref, iface, iface_ref;
int i;
-
+
if (!java_iface_lookup_fn)
{
tree endlink = build_void_list_node ();
@@ -4969,15 +4969,15 @@ build_java_interface_fn_ref (tree fn, tree instance)
tree_cons (NULL_TREE, ptr_type_node,
tree_cons (NULL_TREE, java_int_type_node,
endlink)));
- java_iface_lookup_fn
+ java_iface_lookup_fn
= builtin_function ("_Jv_LookupInterfaceMethodIdx",
build_function_type (ptr_type_node, t),
0, NOT_BUILT_IN, NULL, NULL_TREE);
}
- /* Look up the pointer to the runtime java.lang.Class object for `instance'.
+ /* Look up the pointer to the runtime java.lang.Class object for `instance'.
This is the first entry in the vtable. */
- klass_ref = build_vtbl_ref (build_indirect_ref (instance, 0),
+ klass_ref = build_vtbl_ref (build_indirect_ref (instance, 0),
integer_zero_node);
/* Get the java.lang.Class pointer for the interface being called. */
@@ -4986,29 +4986,29 @@ build_java_interface_fn_ref (tree fn, tree instance)
if (!iface_ref || TREE_CODE (iface_ref) != VAR_DECL
|| DECL_CONTEXT (iface_ref) != iface)
{
- error ("could not find class$ field in java interface type %qT",
+ error ("could not find class$ field in java interface type %qT",
iface);
return error_mark_node;
}
iface_ref = build_address (iface_ref);
iface_ref = convert (build_pointer_type (iface), iface_ref);
-
+
/* Determine the itable index of FN. */
i = 1;
for (method = TYPE_METHODS (iface); method; method = TREE_CHAIN (method))
{
if (!DECL_VIRTUAL_P (method))
- continue;
+ continue;
if (fn == method)
- break;
+ break;
i++;
}
idx = build_int_cst (NULL_TREE, i);
- lookup_args = tree_cons (NULL_TREE, klass_ref,
+ lookup_args = tree_cons (NULL_TREE, klass_ref,
tree_cons (NULL_TREE, iface_ref,
build_tree_list (NULL_TREE, idx)));
- lookup_fn = build1 (ADDR_EXPR,
+ lookup_fn = build1 (ADDR_EXPR,
build_pointer_type (TREE_TYPE (java_iface_lookup_fn)),
java_iface_lookup_fn);
return build3 (CALL_EXPR, ptr_type_node, lookup_fn, lookup_args, NULL_TREE);
@@ -5016,7 +5016,7 @@ build_java_interface_fn_ref (tree fn, tree instance)
/* Returns the value to use for the in-charge parameter when making a
call to a function with the indicated NAME.
-
+
FIXME:Can't we find a neater way to do this mapping? */
tree
@@ -5051,7 +5051,7 @@ in_charge_arg_for_name (tree name)
store the newly constructed object into a VAR_DECL. */
tree
-build_special_member_call (tree instance, tree name, tree args,
+build_special_member_call (tree instance, tree name, tree args,
tree binfo, int flags)
{
tree fns;
@@ -5072,7 +5072,7 @@ build_special_member_call (tree instance, tree name, tree args,
binfo = TYPE_BINFO (binfo);
}
-
+
gcc_assert (binfo != NULL_TREE);
class_type = BINFO_TYPE (binfo);
@@ -5085,13 +5085,13 @@ build_special_member_call (tree instance, tree name, tree args,
}
else
{
- if (name == complete_dtor_identifier
+ if (name == complete_dtor_identifier
|| name == base_dtor_identifier
|| name == deleting_dtor_identifier)
gcc_assert (args == NULL_TREE);
/* Convert to the base class, if necessary. */
- if (!same_type_ignoring_top_level_qualifiers_p
+ if (!same_type_ignoring_top_level_qualifiers_p
(TREE_TYPE (instance), BINFO_TYPE (binfo)))
{
if (name != ansi_assopname (NOP_EXPR))
@@ -5108,11 +5108,11 @@ build_special_member_call (tree instance, tree name, tree args,
binfo, /*nonnull=*/1);
}
}
-
+
gcc_assert (instance != NULL_TREE);
fns = lookup_fnfields (binfo, name, 1);
-
+
/* When making a call to a constructor or destructor for a subobject
that uses virtual base classes, pass down a pointer to a VTT for
the subobject. */
@@ -5140,14 +5140,14 @@ build_special_member_call (tree instance, tree name, tree args,
args = tree_cons (NULL_TREE, sub_vtt, args);
}
- return build_new_method_call (instance, fns, args,
- TYPE_BINFO (BINFO_TYPE (binfo)),
+ return build_new_method_call (instance, fns, args,
+ TYPE_BINFO (BINFO_TYPE (binfo)),
flags);
}
/* Return the NAME, as a C string. The NAME indicates a function that
is a member of TYPE. *FREE_P is set to true if the caller must
- free the memory returned.
+ free the memory returned.
Rather than go through all of this, we should simply set the names
of constructors and destructors appropriately, and dispense with
@@ -5163,7 +5163,7 @@ name_as_c_string (tree name, tree type, bool *free_p)
/* Constructors and destructors are special. */
if (IDENTIFIER_CTOR_OR_DTOR_P (name))
{
- pretty_name
+ pretty_name
= (char *) IDENTIFIER_POINTER (constructor_name (type));
/* For a destructor, add the '~'. */
if (name == complete_dtor_identifier
@@ -5193,7 +5193,7 @@ name_as_c_string (tree name, tree type, bool *free_p)
/* Build a call to "INSTANCE.FN (ARGS)". */
tree
-build_new_method_call (tree instance, tree fns, tree args,
+build_new_method_call (tree instance, tree fns, tree args,
tree conversion_path, int flags)
{
struct z_candidate *candidates = 0, *cand;
@@ -5216,7 +5216,7 @@ build_new_method_call (tree instance, tree fns, tree args,
gcc_assert (instance != NULL_TREE);
- if (error_operand_p (instance)
+ if (error_operand_p (instance)
|| error_operand_p (fns)
|| args == error_mark_node)
return error_mark_node;
@@ -5272,7 +5272,7 @@ build_new_method_call (tree instance, tree fns, tree args,
{
if ((flags & LOOKUP_COMPLAIN) && basetype != error_mark_node)
error ("request for member %qD in %qE, which is of non-aggregate "
- "type %qT",
+ "type %qT",
fns, instance, basetype);
return error_mark_node;
@@ -5322,16 +5322,16 @@ build_new_method_call (tree instance, tree fns, tree args,
if (TREE_CODE (t) == TEMPLATE_DECL)
/* A member template. */
- add_template_candidate (&candidates, t,
+ add_template_candidate (&candidates, t,
class_type,
explicit_targs,
this_arglist, optype,
- access_binfo,
+ access_binfo,
conversion_path,
flags,
DEDUCE_CALL);
else if (! template_only)
- add_function_candidate (&candidates, t,
+ add_function_candidate (&candidates, t,
class_type,
this_arglist,
access_binfo,
@@ -5384,15 +5384,15 @@ build_new_method_call (tree instance, tree fns, tree args,
|| DECL_DESTRUCTOR_P (current_function_decl)))
/* This is not an error, it is runtime undefined
behavior. */
- warning (0, (DECL_CONSTRUCTOR_P (current_function_decl) ?
+ warning (0, (DECL_CONSTRUCTOR_P (current_function_decl) ?
"abstract virtual %q#D called from constructor"
: "abstract virtual %q#D called from destructor"),
cand->fn);
-
+
if (TREE_CODE (TREE_TYPE (cand->fn)) == METHOD_TYPE
&& is_dummy_object (instance_ptr))
{
- error ("cannot call member function %qD without object",
+ error ("cannot call member function %qD without object",
cand->fn);
call = error_mark_node;
}
@@ -5408,9 +5408,9 @@ build_new_method_call (tree instance, tree fns, tree args,
out to be a static member function, `a' is
none-the-less evaluated. */
if (TREE_CODE (TREE_TYPE (cand->fn)) != METHOD_TYPE
- && !is_dummy_object (instance_ptr)
+ && !is_dummy_object (instance_ptr)
&& TREE_SIDE_EFFECTS (instance))
- call = build2 (COMPOUND_EXPR, TREE_TYPE (call),
+ call = build2 (COMPOUND_EXPR, TREE_TYPE (call),
instance, call);
}
}
@@ -5461,7 +5461,7 @@ is_subseq (conversion *ics1, conversion *ics2)
if (ics2->kind == ics1->kind
&& same_type_p (ics2->type, ics1->type)
- && same_type_p (ics2->u.next->type,
+ && same_type_p (ics2->u.next->type,
ics1->u.next->type))
return true;
}
@@ -5495,7 +5495,7 @@ maybe_handle_implicit_object (conversion **ics)
if ((*ics)->this_p)
{
/* [over.match.funcs]
-
+
For non-static member functions, the type of the
implicit object parameter is "reference to cv X"
where X is the class of which the function is a
@@ -5515,7 +5515,7 @@ maybe_handle_implicit_object (conversion **ics)
if (t->kind == ck_ptr)
t = t->u.next;
t = build_identity_conv (TREE_TYPE (t->type), NULL_TREE);
- t = direct_reference_binding (reference_type, t);
+ t = direct_reference_binding (reference_type, t);
*ics = t;
}
}
@@ -5582,13 +5582,13 @@ compare_ics (conversion *ics1, conversion *ics2)
--a standard conversion sequence (_over.ics.scs_) is a better
conversion sequence than a user-defined conversion sequence
or an ellipsis conversion sequence, and
-
+
--a user-defined conversion sequence (_over.ics.user_) is a
better conversion sequence than an ellipsis conversion sequence
(_over.ics.ellipsis_). */
rank1 = CONVERSION_RANK (ics1);
rank2 = CONVERSION_RANK (ics2);
-
+
if (rank1 > rank2)
return -1;
else if (rank1 < rank2)
@@ -5644,24 +5644,24 @@ compare_ics (conversion *ics1, conversion *ics2)
conversion *t1;
conversion *t2;
- /* We're dealing with two standard conversion sequences.
+ /* We're dealing with two standard conversion sequences.
[over.ics.rank]
-
+
Standard conversion sequence S1 is a better conversion
sequence than standard conversion sequence S2 if
-
+
--S1 is a proper subsequence of S2 (comparing the conversion
sequences in the canonical form defined by _over.ics.scs_,
excluding any Lvalue Transformation; the identity
conversion sequence is considered to be a subsequence of
any non-identity conversion sequence */
-
+
t1 = ics1;
while (t1->kind != ck_identity)
t1 = t1->u.next;
from_type1 = t1->type;
-
+
t2 = ics2;
while (t2->kind != ck_identity)
t2 = t2->u.next;
@@ -5696,7 +5696,7 @@ compare_ics (conversion *ics1, conversion *ics2)
--A conversion that is not a conversion of a pointer, or pointer
to member, to bool is better than another conversion that is such
- a conversion.
+ a conversion.
The ICS_STD_RANK automatically handles the pointer-to-bool rule,
so that we do not have to check it explicitly. */
@@ -5739,10 +5739,10 @@ compare_ics (conversion *ics1, conversion *ics2)
&& IS_AGGR_TYPE_CODE (TREE_CODE (deref_from_type1))
&& IS_AGGR_TYPE_CODE (TREE_CODE (deref_from_type2)))
{
- /* This was one of the pointer or pointer-like conversions.
+ /* This was one of the pointer or pointer-like conversions.
[over.ics.rank]
-
+
--If class B is derived directly or indirectly from class A,
conversion of B* to A* is better than conversion of B* to
void*, and conversion of A* to void* is better than
@@ -5781,10 +5781,10 @@ compare_ics (conversion *ics1, conversion *ics2)
--If class B is derived directly or indirectly from class A
and class C is derived directly or indirectly from B,
-
+
--conversion of C* to B* is better than conversion of C* to
- A*,
-
+ A*,
+
--conversion of B* to A* is better than conversion of C* to
A* */
if (same_type_p (deref_from_type1, deref_from_type2))
@@ -5813,7 +5813,7 @@ compare_ics (conversion *ics1, conversion *ics2)
tree from = non_reference (from_type1);
/* [over.ics.rank]
-
+
--binding of an expression of type C to a reference of type
B& is better than binding an expression of type C to a
reference of type A&
@@ -5837,7 +5837,7 @@ compare_ics (conversion *ics1, conversion *ics2)
--binding of an expression of type B to a reference of type
A& is better than binding an expression of type C to a
- reference of type A&,
+ reference of type A&,
--conversion of B to A is better than conversion of C to A */
if (is_properly_derived_from (from_type1, to)
@@ -5862,13 +5862,13 @@ compare_ics (conversion *ics1, conversion *ics2)
return comp_cv_qual_signature (to_type1, to_type2);
/* [over.ics.rank]
-
+
--S1 and S2 are reference bindings (_dcl.init.ref_), and the
types to which the references refer are the same type except for
top-level cv-qualifiers, and the type to which the reference
initialized by S2 refers is more cv-qualified than the type to
which the reference initialized by S1 refers */
-
+
if (target_type1 && target_type2
&& same_type_ignoring_top_level_qualifiers_p (to_type1, to_type2))
return comp_cv_qualification (target_type2, target_type1);
@@ -5954,7 +5954,7 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn)
int static_2 = DECL_STATIC_FUNCTION_P (cand2->fn);
gcc_assert (static_1 != static_2);
-
+
if (static_1)
off2 = 1;
else
@@ -6023,12 +6023,12 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn)
{
struct z_candidate *w, *l;
bool give_warning = false;
-
+
if (winner == 1)
w = cand1, l = cand2;
else
w = cand2, l = cand1;
-
+
/* We don't want to complain about `X::operator T1 ()'
beating `X::operator T2 () const', when T2 is a no less
cv-qualified version of T1. */
@@ -6037,7 +6037,7 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn)
{
tree t = TREE_TYPE (TREE_TYPE (l->fn));
tree f = TREE_TYPE (TREE_TYPE (w->fn));
-
+
if (TREE_CODE (t) == TREE_CODE (f) && POINTER_TYPE_P (t))
{
t = TREE_TYPE (t);
@@ -6048,7 +6048,7 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn)
}
else
give_warning = true;
-
+
if (!give_warning)
/*NOP*/;
else if (warn)
@@ -6071,23 +6071,23 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn)
/* or, if not that,
F1 is a non-template function and F2 is a template function
specialization. */
-
+
if (!cand1->template_decl && cand2->template_decl)
return 1;
else if (cand1->template_decl && !cand2->template_decl)
return -1;
-
+
/* or, if not that,
F1 and F2 are template functions and the function template for F1 is
more specialized than the template for F2 according to the partial
ordering rules. */
-
+
if (cand1->template_decl && cand2->template_decl)
{
winner = more_specialized_fn
- (TI_TEMPLATE (cand1->template_decl),
- TI_TEMPLATE (cand2->template_decl),
- /* Tell the deduction code how many real function arguments
+ (TI_TEMPLATE (cand1->template_decl),
+ TI_TEMPLATE (cand2->template_decl),
+ /* Tell the deduction code how many real function arguments
we saw, not counting the implicit 'this' argument. But,
add_function_candidate() suppresses the "this" argument
for constructors.
@@ -6099,7 +6099,7 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn)
- (DECL_NONSTATIC_MEMBER_FUNCTION_P (cand1->fn)
- DECL_CONSTRUCTOR_P (cand1->fn)));
if (winner)
- return winner;
+ return winner;
}
/* or, if not that,
@@ -6114,20 +6114,20 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn)
{
winner = compare_ics (cand1->second_conv, cand2->second_conv);
if (winner)
- return winner;
+ return winner;
}
-
+
/* Check whether we can discard a builtin candidate, either because we
have two identical ones or matching builtin and non-builtin candidates.
(Pedantically in the latter case the builtin which matched the user
function should not be added to the overload set, but we spot it here.
-
+
[over.match.oper]
... the builtin candidates include ...
- do not have the same parameter type list as any non-template
non-member candidate. */
-
+
if (TREE_CODE (cand1->fn) == IDENTIFIER_NODE
|| TREE_CODE (cand2->fn) == IDENTIFIER_NODE)
{
@@ -6154,7 +6154,7 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn)
if (DECL_P (cand1->fn) && DECL_P (cand2->fn)
&& equal_functions (cand1->fn, cand2->fn))
return 1;
-
+
tweak:
/* Extension: If the worst conversion for one candidate is worse than the
@@ -6176,7 +6176,7 @@ tweak:
if (rank1 > rank2)
winner = -1, w = cand2, l = cand1;
if (winner)
- {
+ {
if (warn)
{
pedwarn ("\
@@ -6188,8 +6188,8 @@ the worst conversion for the second:");
}
else
add_warning (w, l);
- return winner;
- }
+ return winner;
+ }
}
gcc_assert (!winner);
@@ -6238,8 +6238,8 @@ tourney (struct z_candidate *candidates)
/* Make sure the champ is better than all the candidates it hasn't yet
been compared to. */
- for (challenger = candidates;
- challenger != champ
+ for (challenger = candidates;
+ challenger != champ
&& !(champ_compared_to_predecessor && challenger->next == champ);
challenger = challenger->next)
{
@@ -6341,7 +6341,7 @@ perform_implicit_conversion (tree type, tree expr)
cast. */
tree
-perform_direct_initialization_if_possible (tree type,
+perform_direct_initialization_if_possible (tree type,
tree expr,
bool c_cast_p)
{
@@ -6374,7 +6374,7 @@ perform_direct_initialization_if_possible (tree type,
if (!conv || conv->bad_p)
expr = NULL_TREE;
else
- expr = convert_like_real (conv, expr, NULL_TREE, 0, 0,
+ expr = convert_like_real (conv, expr, NULL_TREE, 0, 0,
/*issue_conversion_warnings=*/false,
c_cast_p);
@@ -6389,7 +6389,7 @@ perform_direct_initialization_if_possible (tree type,
with the indicated TYPE; this variable will store the value to
which the reference is bound. */
-tree
+tree
make_temporary_var_for_ref_to_temp (tree decl, tree type)
{
tree var;
@@ -6450,13 +6450,13 @@ initialize_reference (tree type, tree expr, tree decl, tree *cleanup)
if (!conv || conv->bad_p)
{
if (!(TYPE_QUALS (TREE_TYPE (type)) & TYPE_QUAL_CONST)
- && !real_lvalue_p (expr))
- error ("invalid initialization of non-const reference of "
- "type %qT from a temporary of type %qT",
- type, TREE_TYPE (expr));
+ && !real_lvalue_p (expr))
+ error ("invalid initialization of non-const reference of "
+ "type %qT from a temporary of type %qT",
+ type, TREE_TYPE (expr));
else
- error ("invalid initialization of reference of type "
- "%qT from expression of type %qT", type,
+ error ("invalid initialization of reference of type "
+ "%qT from expression of type %qT", type,
TREE_TYPE (expr));
return error_mark_node;
}
@@ -6475,12 +6475,12 @@ initialize_reference (tree type, tree expr, tree decl, tree *cleanup)
full-expression in which they are created.
In that case, we store the converted expression into a new
- VAR_DECL in a new scope.
+ VAR_DECL in a new scope.
However, we want to be careful not to create temporaries when
they are not required. For example, given:
- struct B {};
+ struct B {};
struct D : public B {};
D f();
const B& b = f();
@@ -6508,7 +6508,7 @@ initialize_reference (tree type, tree expr, tree decl, tree *cleanup)
if (conv->kind == ck_base)
{
if (conv->check_copy_constructor_p)
- check_constructor_callable (TREE_TYPE (expr), expr);
+ check_constructor_callable (TREE_TYPE (expr), expr);
base_conv_type = conv->type;
conv = conv->u.next;
}
@@ -6580,7 +6580,7 @@ initialize_reference (tree type, tree expr, tree decl, tree *cleanup)
/* Use its address to initialize the reference variable. */
expr = build_address (var);
if (base_conv_type)
- expr = convert_to_base (expr,
+ expr = convert_to_base (expr,
build_pointer_type (base_conv_type),
/*check_access=*/true,
/*nonnull=*/true);
@@ -6591,7 +6591,7 @@ initialize_reference (tree type, tree expr, tree decl, tree *cleanup)
expr = build_unary_op (ADDR_EXPR, expr, 0);
/* If a BASE_CONV was required, perform it now. */
if (base_conv_type)
- expr = (perform_implicit_conversion
+ expr = (perform_implicit_conversion
(build_pointer_type (base_conv_type), expr));
expr = build_nop (type, expr);
}
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index b70fb1f2165..520442f953e 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -227,9 +227,9 @@ int n_inner_fields_searched = 0;
tree
build_base_path (enum tree_code code,
- tree expr,
- tree binfo,
- int nonnull)
+ tree expr,
+ tree binfo,
+ int nonnull)
{
tree v_binfo = NULL_TREE;
tree d_binfo = NULL_TREE;
@@ -263,7 +263,7 @@ build_base_path (enum tree_code code,
&& SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), probe))
|| (code == PLUS_EXPR
&& SAME_BINFO_TYPE_P (BINFO_TYPE (d_binfo), probe)));
-
+
if (binfo == d_binfo)
/* Nothing to do. */
return expr;
@@ -318,8 +318,8 @@ build_base_path (enum tree_code code,
if (virtual_access)
{
/* Going via virtual base V_BINFO. We need the static offset
- from V_BINFO to BINFO, and the dynamic offset from D_BINFO to
- V_BINFO. That offset is an entry in D_BINFO's vtable. */
+ from V_BINFO to BINFO, and the dynamic offset from D_BINFO to
+ V_BINFO. That offset is an entry in D_BINFO's vtable. */
tree v_offset;
if (fixed_type_p < 0 && in_base_initializer)
@@ -339,10 +339,10 @@ build_base_path (enum tree_code code,
else
v_offset = build_vfield_ref (build_indirect_ref (expr, NULL),
TREE_TYPE (TREE_TYPE (expr)));
-
+
v_offset = build2 (PLUS_EXPR, TREE_TYPE (v_offset),
v_offset, BINFO_VPTR_FIELD (v_binfo));
- v_offset = build1 (NOP_EXPR,
+ v_offset = build1 (NOP_EXPR,
build_pointer_type (ptrdiff_type_node),
v_offset);
v_offset = build_indirect_ref (v_offset, NULL);
@@ -350,7 +350,7 @@ build_base_path (enum tree_code code,
TREE_INVARIANT (v_offset) = 1;
offset = convert_to_integer (ptrdiff_type_node,
- size_diffop (offset,
+ size_diffop (offset,
BINFO_OFFSET (v_binfo)));
if (!integer_zerop (offset))
@@ -370,20 +370,20 @@ build_base_path (enum tree_code code,
}
target_type = code == PLUS_EXPR ? BINFO_TYPE (binfo) : BINFO_TYPE (d_binfo);
-
+
target_type = cp_build_qualified_type
(target_type, cp_type_quals (TREE_TYPE (TREE_TYPE (expr))));
ptr_target_type = build_pointer_type (target_type);
if (want_pointer)
target_type = ptr_target_type;
-
+
expr = build1 (NOP_EXPR, ptr_target_type, expr);
if (!integer_zerop (offset))
expr = build2 (code, ptr_target_type, expr, offset);
else
null_test = NULL;
-
+
if (!want_pointer)
expr = build_indirect_ref (expr, NULL);
@@ -410,13 +410,13 @@ build_simple_base_path (tree expr, tree binfo)
if (d_binfo == NULL_TREE)
{
tree temp;
-
+
gcc_assert (TYPE_MAIN_VARIANT (TREE_TYPE (expr)) == type);
-
+
/* Transform `(a, b).x' into `(*(a, &b)).x', `(a ? b : c).x'
- into `(*(a ? &b : &c)).x', and so on. A COND_EXPR is only
- an lvalue in the frontend; only _DECLs and _REFs are lvalues
- in the backend. */
+ into `(*(a ? &b : &c)).x', and so on. A COND_EXPR is only
+ an lvalue in the frontend; only _DECLs and _REFs are lvalues
+ in the backend. */
temp = unary_complex_lvalue (ADDR_EXPR, expr);
if (temp)
expr = build_indirect_ref (temp, NULL);
@@ -443,7 +443,7 @@ build_simple_base_path (tree expr, tree binfo)
cp_build_qualified_type (type, type_quals),
expr, field, NULL_TREE);
expr = fold_if_not_in_template (expr);
-
+
/* Mark the expression const or volatile, as appropriate.
Even though we've dealt with the type above, we still have
to mark the expression itself. */
@@ -451,7 +451,7 @@ build_simple_base_path (tree expr, tree binfo)
TREE_READONLY (expr) = 1;
if (type_quals & TYPE_QUAL_VOLATILE)
TREE_THIS_VOLATILE (expr) = 1;
-
+
return expr;
}
@@ -481,7 +481,7 @@ convert_to_base (tree object, tree type, bool check_access, bool nonnull)
object_type = TREE_TYPE (object);
binfo = lookup_base (object_type, type,
- check_access ? ba_check : ba_unique,
+ check_access ? ba_check : ba_unique,
NULL);
if (!binfo || binfo == error_mark_node)
return error_mark_node;
@@ -507,7 +507,7 @@ convert_to_base_statically (tree expr, tree base)
pointer_type = build_pointer_type (expr_type);
expr = build_unary_op (ADDR_EXPR, expr, /*noconvert=*/1);
if (!integer_zerop (BINFO_OFFSET (base)))
- expr = build2 (PLUS_EXPR, pointer_type, expr,
+ expr = build2 (PLUS_EXPR, pointer_type, expr,
build_nop (pointer_type, BINFO_OFFSET (base)));
expr = build_nop (build_pointer_type (BINFO_TYPE (base)), expr);
expr = build1 (INDIRECT_REF, BINFO_TYPE (base), expr);
@@ -576,7 +576,7 @@ build_vtbl_ref_1 (tree instance, tree idx)
if (!vtbl)
vtbl = build_vfield_ref (instance, basetype);
-
+
assemble_external (vtbl);
aref = build_array_ref (vtbl, idx);
@@ -694,10 +694,10 @@ build_vtable (tree class_type, tree name, tree vtable_type)
is rather important that such things be ignored because any
effort to actually generate DWARF for them will run into
trouble when/if we encounter code like:
-
+
#pragma interface
struct S { virtual void member (); };
-
+
because the artificial declaration of the vtable itself (as
manufactured by the g++ front end) will say that the vtable is
a static member of `S' but only *after* the debug output for
@@ -720,14 +720,14 @@ build_vtable (tree class_type, tree name, tree vtable_type)
impossible to actually build the vtable, but is useful to get at those
which are known to exist in the runtime. */
-tree
+tree
get_vtable_decl (tree type, int complete)
{
tree decl;
if (CLASSTYPE_VTABLES (type))
return CLASSTYPE_VTABLES (type);
-
+
decl = build_vtable (type, get_vtable_name (type), vtbl_type_node);
CLASSTYPE_VTABLES (type) = decl;
@@ -753,14 +753,14 @@ build_primary_vtable (tree binfo, tree type)
tree virtuals;
decl = get_vtable_decl (type, /*complete=*/0);
-
+
if (binfo)
{
if (BINFO_NEW_VTABLE_MARKED (binfo))
/* We have already created a vtable for this base, so there's
no need to do it again. */
return 0;
-
+
virtuals = copy_list (BINFO_VIRTUALS (binfo));
TREE_TYPE (decl) = TREE_TYPE (get_vtbl_decl_for_binfo (binfo));
DECL_SIZE (decl) = TYPE_SIZE (TREE_TYPE (decl));
@@ -810,7 +810,7 @@ build_secondary_vtable (tree binfo)
/* Remember that we've created a vtable for this BINFO, so that we
don't try to do so again. */
SET_BINFO_NEW_VTABLE_MARKED (binfo);
-
+
/* Make fresh virtual list, so we can smash it later. */
BINFO_VIRTUALS (binfo) = copy_list (BINFO_VIRTUALS (binfo));
@@ -847,10 +847,10 @@ make_new_vtable (tree t, tree binfo)
static void
modify_vtable_entry (tree t,
- tree binfo,
- tree fndecl,
- tree delta,
- tree *virtuals)
+ tree binfo,
+ tree fndecl,
+ tree delta,
+ tree *virtuals)
{
tree v;
@@ -878,12 +878,12 @@ modify_vtable_entry (tree t,
}
-/* Add method METHOD to class TYPE. */
+/* Add method METHOD to class TYPE. If USING_DECL is non-null, it is
+ the USING_DECL naming METHOD. */
void
-add_method (tree type, tree method)
+add_method (tree type, tree method, tree using_decl)
{
- int using;
unsigned slot;
tree overload;
bool template_conv_p = false;
@@ -897,7 +897,6 @@ add_method (tree type, tree method)
return;
complete_p = COMPLETE_TYPE_P (type);
- using = (DECL_CONTEXT (method) != type);
conv_p = DECL_CONV_FN_P (method);
if (conv_p)
template_conv_p = (TREE_CODE (method) == TEMPLATE_DECL
@@ -923,7 +922,7 @@ add_method (tree type, tree method)
else if (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (method))
{
slot = CLASSTYPE_DESTRUCTOR_SLOT;
-
+
if (TYPE_FOR_JAVA (type))
{
if (!DECL_ARTIFICIAL (method))
@@ -940,7 +939,7 @@ add_method (tree type, tree method)
insert_p = true;
/* See if we already have an entry with this name. */
- for (slot = CLASSTYPE_FIRST_CONVERSION_SLOT;
+ for (slot = CLASSTYPE_FIRST_CONVERSION_SLOT;
VEC_iterate (tree, method_vec, slot, m);
++slot)
{
@@ -966,7 +965,7 @@ add_method (tree type, tree method)
}
}
current_fns = insert_p ? NULL_TREE : VEC_index (tree, method_vec, slot);
-
+
if (processing_template_decl)
/* TYPE is a template class. Don't issue any errors now; wait
until instantiation time to complain. */
@@ -1007,45 +1006,52 @@ add_method (tree type, tree method)
&& (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))
parms2 = TREE_CHAIN (parms2);
- if (same && compparms (parms1, parms2)
- && (!DECL_CONV_FN_P (fn)
+ if (same && compparms (parms1, parms2)
+ && (!DECL_CONV_FN_P (fn)
|| same_type_p (TREE_TYPE (TREE_TYPE (fn)),
TREE_TYPE (TREE_TYPE (method)))))
{
- if (using && DECL_CONTEXT (fn) == type)
- /* Defer to the local function. */
- return;
+ if (using_decl)
+ {
+ if (DECL_CONTEXT (fn) == type)
+ /* Defer to the local function. */
+ return;
+ if (DECL_CONTEXT (fn) == DECL_CONTEXT (method))
+ cp_error_at ("repeated using declaration %qD", using_decl);
+ else
+ cp_error_at ("using declaration %qD conflicts with a previous using declaration",
+ using_decl);
+ }
else
{
- cp_error_at ("%q#D and %q#D cannot be overloaded",
- method, fn);
-
- /* We don't call duplicate_decls here to merge
- the declarations because that will confuse
- things if the methods have inline
- definitions. In particular, we will crash
- while processing the definitions. */
- return;
+ cp_error_at ("%q#D cannot be overloaded", method);
+ cp_error_at ("with %q#D", fn);
}
+
+ /* We don't call duplicate_decls here to merge the
+ declarations because that will confuse things if the
+ methods have inline definitions. In particular, we
+ will crash while processing the definitions. */
+ return;
}
}
}
- /* Add the new binding. */
+ /* Add the new binding. */
overload = build_overload (method, current_fns);
-
+
if (!conv_p && slot >= CLASSTYPE_FIRST_CONVERSION_SLOT && !complete_p)
push_class_level_binding (DECL_NAME (method), overload);
@@ -1087,7 +1093,7 @@ alter_access (tree t, tree fdecl, tree access)
{
if (TREE_CODE (TREE_TYPE (fdecl)) == FUNCTION_DECL)
cp_error_at ("conflicting access specifications for method"
- " %qD, ignored", TREE_TYPE (fdecl));
+ " %qD, ignored", TREE_TYPE (fdecl));
else
error ("conflicting access specifications for field %qE, ignored",
DECL_NAME (fdecl));
@@ -1113,52 +1119,16 @@ alter_access (tree t, tree fdecl, tree access)
static void
handle_using_decl (tree using_decl, tree t)
{
- tree ctype = DECL_INITIAL (using_decl);
+ tree decl = USING_DECL_DECLS (using_decl);
tree name = DECL_NAME (using_decl);
tree access
= TREE_PRIVATE (using_decl) ? access_private_node
: TREE_PROTECTED (using_decl) ? access_protected_node
: access_public_node;
- tree fdecl, binfo;
tree flist = NULL_TREE;
tree old_value;
- if (ctype == error_mark_node)
- return;
-
- binfo = lookup_base (t, ctype, ba_any, NULL);
- if (! binfo)
- {
- location_t saved_loc = input_location;
-
- input_location = DECL_SOURCE_LOCATION (using_decl);
- error_not_base_type (ctype, t);
- input_location = saved_loc;
- return;
- }
-
- if (constructor_name_p (name, ctype))
- {
- cp_error_at ("%qD names constructor", using_decl);
- return;
- }
- if (constructor_name_p (name, t))
- {
- cp_error_at ("%qD invalid in %qT", using_decl, t);
- return;
- }
-
- fdecl = lookup_member (binfo, name, 0, false);
-
- if (!fdecl)
- {
- cp_error_at ("no members matching %qD in %q#T", using_decl, ctype);
- return;
- }
-
- if (BASELINK_P (fdecl))
- /* Ignore base type this came from. */
- fdecl = BASELINK_FUNCTIONS (fdecl);
+ gcc_assert (!processing_template_decl && decl);
old_value = lookup_member (t, name, /*protect=*/0, /*want_type=*/false);
if (old_value)
@@ -1172,8 +1142,10 @@ handle_using_decl (tree using_decl, tree t)
old_value = NULL_TREE;
}
- if (is_overloaded_fn (fdecl))
- flist = fdecl;
+ cp_emit_debug_info_for_using (decl, current_class_type);
+
+ if (is_overloaded_fn (decl))
+ flist = decl;
if (! old_value)
;
@@ -1196,16 +1168,16 @@ handle_using_decl (tree using_decl, tree t)
cp_error_at (" because of local member %q#D with same name", old_value);
return;
}
-
+
/* Make type T see field decl FDECL with access ACCESS. */
if (flist)
for (; flist; flist = OVL_NEXT (flist))
{
- add_method (t, OVL_CURRENT (flist));
+ add_method (t, OVL_CURRENT (flist), using_decl);
alter_access (t, OVL_CURRENT (flist), access);
}
else
- alter_access (t, fdecl, access);
+ alter_access (t, decl, access);
}
/* Run through the base classes of T, updating CANT_HAVE_CONST_CTOR_P,
@@ -1214,8 +1186,8 @@ handle_using_decl (tree using_decl, tree t)
static void
check_bases (tree t,
- int* cant_have_const_ctor_p,
- int* no_const_asn_ref_p)
+ int* cant_have_const_ctor_p,
+ int* no_const_asn_ref_p)
{
int i;
int seen_non_virtual_nearly_empty_base_p;
@@ -1230,7 +1202,7 @@ check_bases (tree t,
tree basetype = TREE_TYPE (base_binfo);
gcc_assert (COMPLETE_TYPE_P (basetype));
-
+
/* Effective C++ rule 14. We only need to check TYPE_POLYMORPHIC_P
here because the case of virtual functions but non-virtual
dtor is handled in finish_struct_1. */
@@ -1268,13 +1240,13 @@ check_bases (tree t,
/* A lot of properties from the bases also apply to the derived
class. */
TYPE_NEEDS_CONSTRUCTING (t) |= TYPE_NEEDS_CONSTRUCTING (basetype);
- TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)
+ TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)
|= TYPE_HAS_NONTRIVIAL_DESTRUCTOR (basetype);
- TYPE_HAS_COMPLEX_ASSIGN_REF (t)
+ TYPE_HAS_COMPLEX_ASSIGN_REF (t)
|= TYPE_HAS_COMPLEX_ASSIGN_REF (basetype);
TYPE_HAS_COMPLEX_INIT_REF (t) |= TYPE_HAS_COMPLEX_INIT_REF (basetype);
TYPE_POLYMORPHIC_P (t) |= TYPE_POLYMORPHIC_P (basetype);
- CLASSTYPE_CONTAINS_EMPTY_CLASS_P (t)
+ CLASSTYPE_CONTAINS_EMPTY_CLASS_P (t)
|= CLASSTYPE_CONTAINS_EMPTY_CLASS_P (basetype);
}
}
@@ -1305,7 +1277,7 @@ determine_primary_bases (tree t)
{
tree parent = BINFO_INHERITANCE_CHAIN (base_binfo);
tree parent_primary = CLASSTYPE_PRIMARY_BINFO (BINFO_TYPE (parent));
-
+
if (parent_primary
&& SAME_BINFO_TYPE_P (BINFO_TYPE (base_binfo),
BINFO_TYPE (parent_primary)))
@@ -1324,18 +1296,18 @@ determine_primary_bases (tree t)
else
{
tree delta;
-
+
BINFO_PRIMARY_P (this_primary) = 1;
BINFO_INHERITANCE_CHAIN (this_primary) = base_binfo;
-
+
/* A virtual binfo might have been copied from within
- another hierarchy. As we're about to use it as a
- primary base, make sure the offsets match. */
+ another hierarchy. As we're about to use it as a
+ primary base, make sure the offsets match. */
delta = size_diffop (convert (ssizetype,
BINFO_OFFSET (base_binfo)),
convert (ssizetype,
BINFO_OFFSET (this_primary)));
-
+
propagate_binfo_offsets (this_primary, delta);
}
}
@@ -1374,13 +1346,13 @@ determine_primary_bases (tree t)
/* Remember the first candidate. */
primary = base_binfo;
}
-
+
found:
/* If we've got a primary base, use it. */
if (primary)
{
tree basetype = BINFO_TYPE (primary);
-
+
CLASSTYPE_PRIMARY_BINFO (t) = primary;
if (BINFO_PRIMARY_P (primary))
/* We are stealing a primary base. */
@@ -1392,16 +1364,16 @@ determine_primary_bases (tree t)
BINFO_INHERITANCE_CHAIN (primary) = type_binfo;
/* A virtual binfo might have been copied from within
- another hierarchy. As we're about to use it as a primary
- base, make sure the offsets match. */
+ another hierarchy. As we're about to use it as a primary
+ base, make sure the offsets match. */
delta = size_diffop (ssize_int (0),
convert (ssizetype, BINFO_OFFSET (primary)));
-
+
propagate_binfo_offsets (primary, delta);
}
-
+
primary = TYPE_BINFO (basetype);
-
+
TYPE_VFIELD (t) = TYPE_VFIELD (basetype);
BINFO_VTABLE (type_binfo) = BINFO_VTABLE (primary);
BINFO_VIRTUALS (type_binfo) = BINFO_VIRTUALS (primary);
@@ -1415,7 +1387,7 @@ static void
finish_struct_bits (tree t)
{
tree variants;
-
+
/* Fix up variants (if any). */
for (variants = TYPE_NEXT_VARIANT (t);
variants;
@@ -1425,11 +1397,11 @@ finish_struct_bits (tree t)
the TYPE_LANG_SPECIFIC component, so they are not shared. */
TYPE_HAS_CONSTRUCTOR (variants) = TYPE_HAS_CONSTRUCTOR (t);
TYPE_NEEDS_CONSTRUCTING (variants) = TYPE_NEEDS_CONSTRUCTING (t);
- TYPE_HAS_NONTRIVIAL_DESTRUCTOR (variants)
+ TYPE_HAS_NONTRIVIAL_DESTRUCTOR (variants)
= TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t);
TYPE_POLYMORPHIC_P (variants) = TYPE_POLYMORPHIC_P (t);
-
+
TYPE_BINFO (variants) = TYPE_BINFO (t);
/* Copy whatever these are holding today. */
@@ -1450,7 +1422,7 @@ finish_struct_bits (tree t)
recalculate what's really an abstract virtual at this point (by
looking in the vtables). */
get_pure_virtuals (t);
-
+
/* If this type has a copy constructor or a destructor, force its
mode to be BLKmode, and force its TREE_ADDRESSABLE bit to be
nonzero. This will cause it to be passed by invisible reference
@@ -1468,7 +1440,7 @@ finish_struct_bits (tree t)
}
/* Issue warnings about T having private constructors, but no friends,
- and so forth.
+ and so forth.
HAS_NONPRIVATE_METHOD is nonzero if T has any non-private methods or
static members. HAS_NONPRIVATE_STATIC_FN is nonzero if T has any
@@ -1489,10 +1461,10 @@ maybe_warn_about_overly_private_class (tree t)
/* We will have warned when the template was declared; there's
no need to warn on every instantiation. */
|| CLASSTYPE_TEMPLATE_INSTANTIATION (t))
- /* There's no reason to even consider warning about this
+ /* There's no reason to even consider warning about this
class. */
return;
-
+
/* We only issue one warning, if more than one applies, because
otherwise, on code like:
@@ -1512,25 +1484,25 @@ maybe_warn_about_overly_private_class (tree t)
for (fn = TYPE_METHODS (t); fn; fn = TREE_CHAIN (fn))
/* We're not interested in compiler-generated methods; they don't
provide any way to call private members. */
- if (!DECL_ARTIFICIAL (fn))
+ if (!DECL_ARTIFICIAL (fn))
{
if (!TREE_PRIVATE (fn))
{
- if (DECL_STATIC_FUNCTION_P (fn))
+ if (DECL_STATIC_FUNCTION_P (fn))
/* A non-private static member function is just like a
friend; it can create and invoke private member
functions, and be accessed without a class
instance. */
return;
-
+
has_nonprivate_method = 1;
/* Keep searching for a static member function. */
}
else if (!DECL_CONSTRUCTOR_P (fn) && !DECL_DESTRUCTOR_P (fn))
has_member_fn = 1;
- }
+ }
- if (!has_nonprivate_method && has_member_fn)
+ if (!has_nonprivate_method && has_member_fn)
{
/* There are no non-private methods, and there's at least one
private member function that isn't a constructor or
@@ -1540,14 +1512,14 @@ maybe_warn_about_overly_private_class (tree t)
constructors/destructors.) */
unsigned i;
tree binfo = TYPE_BINFO (t);
-
+
for (i = 0; i != BINFO_N_BASE_BINFOS (binfo); i++)
if (BINFO_BASE_ACCESS (binfo, i) != access_private_node)
{
has_nonprivate_method = 1;
break;
}
- if (!has_nonprivate_method)
+ if (!has_nonprivate_method)
{
warning (0, "all member functions in class %qT are private", t);
return;
@@ -1568,21 +1540,21 @@ maybe_warn_about_overly_private_class (tree t)
if (TYPE_HAS_CONSTRUCTOR (t))
{
int nonprivate_ctor = 0;
-
+
/* If a non-template class does not define a copy
constructor, one is defined for it, enabling it to avoid
this warning. For a template class, this does not
happen, and so we would normally get a warning on:
- template <class T> class C { private: C(); };
-
+ template <class T> class C { private: C(); };
+
To avoid this asymmetry, we check TYPE_HAS_INIT_REF. All
complete non-template or fully instantiated classes have this
flag set. */
if (!TYPE_HAS_INIT_REF (t))
nonprivate_ctor = 1;
- else
- for (fn = CLASSTYPE_CONSTRUCTORS (t); fn; fn = OVL_NEXT (fn))
+ else
+ for (fn = CLASSTYPE_CONSTRUCTORS (t); fn; fn = OVL_NEXT (fn))
{
tree ctor = OVL_CURRENT (fn);
/* Ideally, we wouldn't count copy constructors (or, in
@@ -1601,7 +1573,7 @@ maybe_warn_about_overly_private_class (tree t)
if (nonprivate_ctor == 0)
{
warning (0, "%q#T only defines private constructors and has no friends",
- t);
+ t);
return;
}
}
@@ -1619,7 +1591,7 @@ method_name_cmp (const void* m1_p, const void* m2_p)
{
const tree *const m1 = m1_p;
const tree *const m2 = m2_p;
-
+
if (*m1 == NULL_TREE && *m2 == NULL_TREE)
return 0;
if (*m1 == NULL_TREE)
@@ -1658,11 +1630,11 @@ resort_method_name_cmp (const void* m1_p, const void* m2_p)
/* Resort TYPE_METHOD_VEC because pointers have been reordered. */
-void
+void
resort_type_method_vec (void* obj,
- void* orig_obj ATTRIBUTE_UNUSED ,
- gt_pointer_operator new_value,
- void* cookie)
+ void* orig_obj ATTRIBUTE_UNUSED ,
+ gt_pointer_operator new_value,
+ void* cookie)
{
VEC(tree,gc) *method_vec = (VEC(tree,gc) *) obj;
int len = VEC_length (tree, method_vec);
@@ -1706,7 +1678,7 @@ finish_struct_methods (tree t)
len = VEC_length (tree, method_vec);
/* Clear DECL_IN_AGGR_P for all functions. */
- for (fn_fields = TYPE_METHODS (t); fn_fields;
+ for (fn_fields = TYPE_METHODS (t); fn_fields;
fn_fields = TREE_CHAIN (fn_fields))
DECL_IN_AGGR_P (fn_fields) = 0;
@@ -1736,7 +1708,7 @@ layout_vtable_decl (tree binfo, int n)
tree atype;
tree vtable;
- atype = build_cplus_array_type (vtable_entry_type,
+ atype = build_cplus_array_type (vtable_entry_type,
build_index_type (size_int (n - 1)));
layout_type (atype);
@@ -1787,7 +1759,7 @@ same_signature_p (tree fndecl, tree base_fndecl)
/* Returns TRUE if DERIVED is a binfo containing the binfo BASE as a
subobject. */
-
+
static bool
base_derived_from (tree derived, tree base)
{
@@ -1822,7 +1794,7 @@ typedef struct find_final_overrider_data_s {
Returns true if an overrider was found; false otherwise. */
static bool
-dfs_find_final_overrider_1 (tree binfo,
+dfs_find_final_overrider_1 (tree binfo,
find_final_overrider_data *ffod,
unsigned depth)
{
@@ -1842,7 +1814,7 @@ dfs_find_final_overrider_1 (tree binfo,
if (method)
{
tree *candidate = &ffod->candidates;
-
+
/* Remove any candidates overridden by this new function. */
while (*candidate)
{
@@ -1856,7 +1828,7 @@ dfs_find_final_overrider_1 (tree binfo,
else
candidate = &TREE_CHAIN (*candidate);
}
-
+
/* Add the new function. */
ffod->candidates = tree_cons (method, binfo, ffod->candidates);
return true;
@@ -1904,7 +1876,7 @@ find_final_overrider (tree derived, tree binfo, tree fn)
struct T { virtual void f (); };
struct U : public S, public T { };
- even though calling `f' in `U' is ambiguous. But,
+ even though calling `f' in `U' is ambiguous. But,
struct R { virtual void f(); };
struct S : virtual public R { virtual void f (); };
@@ -1912,8 +1884,8 @@ find_final_overrider (tree derived, tree binfo, tree fn)
struct U : public S, public T { };
is not -- there's no way to decide whether to put `S::f' or
- `T::f' in the vtable for `R'.
-
+ `T::f' in the vtable for `R'.
+
The solution is to look at all paths to BINFO. If we find
different overriders along any two, then there is a problem. */
if (DECL_THUNK_P (fn))
@@ -1929,11 +1901,11 @@ find_final_overrider (tree derived, tree binfo, tree fn)
dfs_find_final_overrider_post, &ffod);
VEC_free (tree, heap, ffod.path);
-
+
/* If there was no winner, issue an error message. */
if (!ffod.candidates || TREE_CHAIN (ffod.candidates))
{
- error ("no unique final overrider for %qD in %qT", fn,
+ error ("no unique final overrider for %qD in %qT", fn,
BINFO_TYPE (derived));
return error_mark_node;
}
@@ -1998,25 +1970,25 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals,
if (overrider == error_mark_node)
return;
overrider_target = overrider_fn = TREE_PURPOSE (overrider);
-
+
/* Check for adjusting covariant return types. */
over_return = TREE_TYPE (TREE_TYPE (overrider_target));
base_return = TREE_TYPE (TREE_TYPE (target_fn));
-
+
if (POINTER_TYPE_P (over_return)
&& TREE_CODE (over_return) == TREE_CODE (base_return)
&& CLASS_TYPE_P (TREE_TYPE (over_return))
&& CLASS_TYPE_P (TREE_TYPE (base_return)))
{
/* If FN is a covariant thunk, we must figure out the adjustment
- to the final base FN was converting to. As OVERRIDER_TARGET might
- also be converting to the return type of FN, we have to
- combine the two conversions here. */
+ to the final base FN was converting to. As OVERRIDER_TARGET might
+ also be converting to the return type of FN, we have to
+ combine the two conversions here. */
tree fixed_offset, virtual_offset;
over_return = TREE_TYPE (over_return);
base_return = TREE_TYPE (base_return);
-
+
if (DECL_THUNK_P (fn))
{
gcc_assert (DECL_RESULT_THUNK_P (fn));
@@ -2059,14 +2031,14 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals,
if (SAME_BINFO_TYPE_P (BINFO_TYPE (thunk_binfo),
BINFO_TYPE (base_binfo)))
break;
-
+
/* See if virtual inheritance is involved. */
for (virtual_offset = thunk_binfo;
virtual_offset;
virtual_offset = BINFO_INHERITANCE_CHAIN (virtual_offset))
if (BINFO_VIRTUAL_P (virtual_offset))
break;
-
+
if (virtual_offset
|| (thunk_binfo && !BINFO_OFFSET_ZEROP (thunk_binfo)))
{
@@ -2089,7 +2061,7 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals,
fixed_offset = offset;
}
}
-
+
if (fixed_offset || virtual_offset)
/* Replace the overriding function with a covariant thunk. We
will emit the overriding function in its own slot as
@@ -2099,7 +2071,7 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals,
}
else
gcc_assert (!DECL_THUNK_P (fn));
-
+
/* Assume that we will produce a thunk that convert all the way to
the final overrider, and not to an intermediate virtual base. */
virtual_base = NULL_TREE;
@@ -2127,33 +2099,33 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals,
if (overrider_fn != overrider_target && !virtual_base)
{
/* The ABI specifies that a covariant thunk includes a mangling
- for a this pointer adjustment. This-adjusting thunks that
- override a function from a virtual base have a vcall
- adjustment. When the virtual base in question is a primary
- virtual base, we know the adjustments are zero, (and in the
- non-covariant case, we would not use the thunk).
- Unfortunately we didn't notice this could happen, when
- designing the ABI and so never mandated that such a covariant
- thunk should be emitted. Because we must use the ABI mandated
- name, we must continue searching from the binfo where we
- found the most recent definition of the function, towards the
- primary binfo which first introduced the function into the
- vtable. If that enters a virtual base, we must use a vcall
- this-adjusting thunk. Bleah! */
+ for a this pointer adjustment. This-adjusting thunks that
+ override a function from a virtual base have a vcall
+ adjustment. When the virtual base in question is a primary
+ virtual base, we know the adjustments are zero, (and in the
+ non-covariant case, we would not use the thunk).
+ Unfortunately we didn't notice this could happen, when
+ designing the ABI and so never mandated that such a covariant
+ thunk should be emitted. Because we must use the ABI mandated
+ name, we must continue searching from the binfo where we
+ found the most recent definition of the function, towards the
+ primary binfo which first introduced the function into the
+ vtable. If that enters a virtual base, we must use a vcall
+ this-adjusting thunk. Bleah! */
tree probe = first_defn;
while ((probe = get_primary_binfo (probe))
&& (unsigned) list_length (BINFO_VIRTUALS (probe)) > ix)
if (BINFO_VIRTUAL_P (probe))
virtual_base = probe;
-
+
if (virtual_base)
/* Even if we find a virtual base, the correct delta is
between the overrider and the binfo we're building a vtable
for. */
goto virtual_covariant;
}
-
+
/* Compute the constant adjustment to the `this' pointer. The
`this' pointer, when this function is called, will point at BINFO
(or one of its primary bases, which are at the same offset). */
@@ -2180,7 +2152,7 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals,
modify_vtable_entry (t, binfo, overrider_fn, delta, virtuals);
if (virtual_base)
- BV_VCALL_INDEX (*virtuals)
+ BV_VCALL_INDEX (*virtuals)
= get_vcall_index (overrider_target, BINFO_TYPE (virtual_base));
else
BV_VCALL_INDEX (*virtuals) = NULL_TREE;
@@ -2200,7 +2172,7 @@ dfs_modify_vtables (tree binfo, void* data)
/* A base without a vtable needs no modification, and its bases
are uninteresting. */
return dfs_skip_bases;
-
+
if (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), t)
&& !CLASSTYPE_HAS_PRIMARY_BASE_P (t))
/* Don't do the primary vtable, if it's new. */
@@ -2214,7 +2186,7 @@ dfs_modify_vtables (tree binfo, void* data)
return NULL_TREE;
make_new_vtable (t, binfo);
-
+
/* Now, go through each of the virtual functions in the virtual
function table for BINFO. Find the final overrider, and update
the BINFO_VIRTUALS list appropriately. */
@@ -2223,8 +2195,8 @@ dfs_modify_vtables (tree binfo, void* data)
virtuals;
ix++, virtuals = TREE_CHAIN (virtuals),
old_virtuals = TREE_CHAIN (old_virtuals))
- update_vtable_entry_for_fn (t,
- binfo,
+ update_vtable_entry_for_fn (t,
+ binfo,
BV_FN (old_virtuals),
&virtuals, ix);
@@ -2324,8 +2296,8 @@ check_for_override (tree decl, tree ctype)
if (TREE_CODE (decl) == TEMPLATE_DECL)
/* In [temp.mem] we have:
- A specialization of a member function template does not
- override a virtual function from a base class. */
+ A specialization of a member function template does not
+ override a virtual function from a base class. */
return;
if ((DECL_DESTRUCTOR_P (decl)
|| IDENTIFIER_VIRTUAL_P (DECL_NAME (decl))
@@ -2356,7 +2328,7 @@ warn_hidden (tree t)
size_t i;
/* We go through each separately named virtual function. */
- for (i = CLASSTYPE_FIRST_CONVERSION_SLOT;
+ for (i = CLASSTYPE_FIRST_CONVERSION_SLOT;
VEC_iterate (tree, method_vec, i, fns);
++i)
{
@@ -2394,8 +2366,8 @@ warn_hidden (tree t)
if (DECL_VINDEX (fndecl))
{
tree *prev = &base_fndecls;
-
- while (*prev)
+
+ while (*prev)
/* If the method from the base class has the same
signature as the method from the derived class, it
has been overridden. */
@@ -2408,7 +2380,7 @@ warn_hidden (tree t)
/* Now give a warning for all base functions without overriders,
as they are hidden. */
- while (base_fndecls)
+ while (base_fndecls)
{
/* Here we know it is a hider, and no overrider exists. */
cp_warning_at ("%qD was hidden", TREE_VALUE (base_fndecls));
@@ -2446,7 +2418,7 @@ finish_struct_anon (tree t)
though, so we explicitly tolerate that. We use
TYPE_ANONYMOUS_P rather than ANON_AGGR_TYPE_P so that
we also allow unnamed types used for defining fields. */
- if (DECL_ARTIFICIAL (elt)
+ if (DECL_ARTIFICIAL (elt)
&& (!DECL_IMPLICIT_TYPEDEF_P (elt)
|| TYPE_ANONYMOUS_P (TREE_TYPE (elt))))
continue;
@@ -2454,7 +2426,7 @@ finish_struct_anon (tree t)
if (TREE_CODE (elt) != FIELD_DECL)
{
cp_pedwarn_at ("%q#D invalid; an anonymous union can "
- "only have non-static data members",
+ "only have non-static data members",
elt);
continue;
}
@@ -2477,7 +2449,7 @@ finish_struct_anon (tree t)
will be used later during class template instantiation.
When FRIEND_P is zero, T can be a static member data (VAR_DECL),
a non-static member data (FIELD_DECL), a member function
- (FUNCTION_DECL), a nested type (RECORD_TYPE, ENUM_TYPE),
+ (FUNCTION_DECL), a nested type (RECORD_TYPE, ENUM_TYPE),
a typedef (TYPE_DECL) or a member class template (TEMPLATE_DECL)
When FRIEND_P is nonzero, T is either a friend class
(RECORD_TYPE, TEMPLATE_DECL) or a friend function
@@ -2501,7 +2473,7 @@ maybe_add_class_template_decl_list (tree type, tree t, int friend_p)
a const reference, respectively. */
static void
-add_implicitly_declared_members (tree t,
+add_implicitly_declared_members (tree t,
int cant_have_const_cctor,
int cant_have_const_assignment)
{
@@ -2547,7 +2519,7 @@ add_implicitly_declared_members (tree t,
}
/* If we can't get away with being lazy, generate the destructor
- now. */
+ now. */
if (!lazy_p)
lazily_declare_fn (sfk_destructor, t);
}
@@ -2676,7 +2648,7 @@ check_bitfield_decl (tree field)
cp_warning_at ("%qD is too small to hold all values of %q#T",
field, type);
}
-
+
/* Remove the bit-field width indicator so that the rest of the
compiler does not treat that value as an initializer. */
DECL_INITIAL (field) = NULL_TREE;
@@ -2700,9 +2672,9 @@ check_bitfield_decl (tree field)
static void
check_field_decl (tree field,
- tree t,
- int* cant_have_const_ctor,
- int* no_const_asn_ref,
+ tree t,
+ int* cant_have_const_ctor,
+ int* no_const_asn_ref,
int* any_default_members)
{
tree type = strip_array_types (TREE_TYPE (field));
@@ -2729,7 +2701,7 @@ check_field_decl (tree field,
/* Never let anything with uninheritable virtuals
make it through without complaint. */
abstract_virtuals_error (field, type);
-
+
if (TREE_CODE (t) == UNION_TYPE)
{
if (TYPE_NEEDS_CONSTRUCTING (type))
@@ -2745,7 +2717,7 @@ check_field_decl (tree field,
else
{
TYPE_NEEDS_CONSTRUCTING (t) |= TYPE_NEEDS_CONSTRUCTING (type);
- TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)
+ TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)
|= TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type);
TYPE_HAS_COMPLEX_ASSIGN_REF (t) |= TYPE_HAS_COMPLEX_ASSIGN_REF (type);
TYPE_HAS_COMPLEX_INIT_REF (t) |= TYPE_HAS_COMPLEX_INIT_REF (type);
@@ -2844,7 +2816,7 @@ check_field_decls (tree t, tree *access_decls,
/* If one of the data members contains an empty class,
so does T. */
element_type = strip_array_types (type);
- if (CLASS_TYPE_P (element_type)
+ if (CLASS_TYPE_P (element_type)
&& CLASSTYPE_CONTAINS_EMPTY_CLASS_P (element_type))
CLASSTYPE_CONTAINS_EMPTY_CLASS_P (t) = 1;
}
@@ -2889,7 +2861,7 @@ check_field_decls (tree t, tree *access_decls,
if (TREE_CODE (type) == REFERENCE_TYPE)
{
cp_error_at ("%qD may not have reference type %qT because"
- " it is a member of a union",
+ " it is a member of a union",
x, type);
continue;
}
@@ -2916,7 +2888,7 @@ check_field_decls (tree t, tree *access_decls,
if (type == error_mark_node)
continue;
-
+
if (TREE_CODE (x) == CONST_DECL || TREE_CODE (x) == VAR_DECL)
continue;
@@ -2928,7 +2900,7 @@ check_field_decls (tree t, tree *access_decls,
/* If this is of reference type, check if it needs an init.
Also do a little ANSI jig if necessary. */
if (TREE_CODE (type) == REFERENCE_TYPE)
- {
+ {
CLASSTYPE_NON_POD_P (t) = 1;
if (DECL_INITIAL (x) == NULL_TREE)
SET_CLASSTYPE_REF_FIELDS_NEED_INIT (t, 1);
@@ -2941,7 +2913,7 @@ check_field_decls (tree t, tree *access_decls,
if (! TYPE_HAS_CONSTRUCTOR (t) && CLASSTYPE_NON_AGGREGATE (t)
&& extra_warnings)
- cp_warning_at ("non-static reference %q#D in class without a constructor", x);
+ cp_warning_at ("non-static reference %q#D in class without a constructor", x);
}
type = strip_array_types (type);
@@ -2966,8 +2938,8 @@ check_field_decls (tree t, tree *access_decls,
CLASSTYPE_HAS_MUTABLE (t) = 1;
if (! pod_type_p (type))
- /* DR 148 now allows pointers to members (which are POD themselves),
- to be allowed in POD structs. */
+ /* DR 148 now allows pointers to members (which are POD themselves),
+ to be allowed in POD structs. */
CLASSTYPE_NON_POD_P (t) = 1;
if (! zero_init_p (type))
@@ -2988,7 +2960,7 @@ check_field_decls (tree t, tree *access_decls,
if (! TYPE_HAS_CONSTRUCTOR (t) && CLASSTYPE_NON_AGGREGATE (t)
&& extra_warnings)
- cp_warning_at ("non-static const member %q#D in class without a constructor", x);
+ cp_warning_at ("non-static const member %q#D in class without a constructor", x);
}
/* A field that is pseudo-const makes the structure likewise. */
else if (CLASS_TYPE_P (type))
@@ -3028,7 +3000,7 @@ check_field_decls (tree t, tree *access_decls,
-- Warn only if there is a non-trivial destructor. We assume that the
user at least implemented the cleanup correctly, and a destructor
is needed to free dynamic memory.
-
+
This seems enough for practical purposes. */
if (warn_ecpp
&& has_pointers
@@ -3037,7 +3009,7 @@ check_field_decls (tree t, tree *access_decls,
&& !(TYPE_HAS_INIT_REF (t) && TYPE_HAS_ASSIGN_REF (t)))
{
warning (0, "%q#T has pointer data members", t);
-
+
if (! TYPE_HAS_INIT_REF (t))
{
warning (0, " but does not override %<%T(const %T&)%>", t, t);
@@ -3071,10 +3043,10 @@ record_subobject_offset (tree type, tree offset, splay_tree offsets)
/* Record the location of this empty object in OFFSETS. */
n = splay_tree_lookup (offsets, (splay_tree_key) offset);
if (!n)
- n = splay_tree_insert (offsets,
+ n = splay_tree_insert (offsets,
(splay_tree_key) offset,
(splay_tree_value) NULL_TREE);
- n->value = ((splay_tree_value)
+ n->value = ((splay_tree_value)
tree_cons (NULL_TREE,
type,
(tree) n->value));
@@ -3118,12 +3090,12 @@ check_subobject_offset (tree type, tree offset, splay_tree offsets)
is returned. Otherwise, returns zero. */
static int
-walk_subobject_offsets (tree type,
- subobject_offset_fn f,
- tree offset,
- splay_tree offsets,
- tree max_offset,
- int vbases_p)
+walk_subobject_offsets (tree type,
+ subobject_offset_fn f,
+ tree offset,
+ splay_tree offsets,
+ tree max_offset,
+ int vbases_p)
{
int r = 0;
tree type_binfo = NULL_TREE;
@@ -3133,7 +3105,7 @@ walk_subobject_offsets (tree type,
if (max_offset && INT_CST_LT (max_offset, offset))
return 0;
- if (!TYPE_P (type))
+ if (!TYPE_P (type))
{
if (abi_version_at_least (2))
type_binfo = type;
@@ -3162,12 +3134,12 @@ walk_subobject_offsets (tree type,
{
tree binfo_offset;
- if (abi_version_at_least (2)
+ if (abi_version_at_least (2)
&& BINFO_VIRTUAL_P (binfo))
continue;
- if (!vbases_p
- && BINFO_VIRTUAL_P (binfo)
+ if (!vbases_p
+ && BINFO_VIRTUAL_P (binfo)
&& !BINFO_PRIMARY_P (binfo))
continue;
@@ -3182,7 +3154,7 @@ walk_subobject_offsets (tree type,
class yet, but the offsets for direct non-virtual
bases can be calculated by going back to the TYPE. */
orig_binfo = BINFO_BASE_BINFO (TYPE_BINFO (type), i);
- binfo_offset = size_binop (PLUS_EXPR,
+ binfo_offset = size_binop (PLUS_EXPR,
offset,
BINFO_OFFSET (orig_binfo));
}
@@ -3192,7 +3164,7 @@ walk_subobject_offsets (tree type,
binfo_offset,
offsets,
max_offset,
- (abi_version_at_least (2)
+ (abi_version_at_least (2)
? /*vbases_p=*/0 : vbases_p));
if (r)
return r;
@@ -3229,12 +3201,12 @@ walk_subobject_offsets (tree type,
virtual. (If it is non-virtual, then it was walked
above.) */
tree vbase = get_primary_binfo (type_binfo);
-
+
if (vbase && BINFO_VIRTUAL_P (vbase)
&& BINFO_PRIMARY_P (vbase)
&& BINFO_INHERITANCE_CHAIN (vbase) == type_binfo)
{
- r = (walk_subobject_offsets
+ r = (walk_subobject_offsets
(vbase, f, offset,
offsets, max_offset, /*vbases_p=*/0));
if (r)
@@ -3281,7 +3253,7 @@ walk_subobject_offsets (tree type,
/* Step through each of the elements in the array. */
for (index = size_zero_node;
/* G++ 3.2 had an off-by-one error here. */
- (abi_version_at_least (2)
+ (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))
@@ -3294,7 +3266,7 @@ walk_subobject_offsets (tree type,
/*vbases_p=*/1);
if (r)
return r;
- offset = size_binop (PLUS_EXPR, offset,
+ offset = size_binop (PLUS_EXPR, offset,
TYPE_SIZE_UNIT (TREE_TYPE (type)));
/* If this new OFFSET is bigger than the MAX_OFFSET, then
there's no point in iterating through the remaining
@@ -3312,10 +3284,10 @@ walk_subobject_offsets (tree type,
examined. */
static void
-record_subobject_offsets (tree type,
- tree offset,
- splay_tree offsets,
- int vbases_p)
+record_subobject_offsets (tree type,
+ tree offset,
+ splay_tree offsets,
+ int vbases_p)
{
walk_subobject_offsets (type, record_subobject_offset, offset,
offsets, /*max_offset=*/NULL_TREE, vbases_p);
@@ -3327,9 +3299,9 @@ record_subobject_offsets (tree type,
static int
layout_conflict_p (tree type,
- tree offset,
- splay_tree offsets,
- int vbases_p)
+ tree offset,
+ splay_tree offsets,
+ int vbases_p)
{
splay_tree_node max_node;
@@ -3353,15 +3325,15 @@ layout_conflict_p (tree type,
the position of the DECL. */
static void
-layout_nonempty_base_or_field (record_layout_info rli,
- tree decl,
- tree binfo,
+layout_nonempty_base_or_field (record_layout_info rli,
+ tree decl,
+ tree binfo,
splay_tree offsets)
{
tree offset = NULL_TREE;
bool field_p;
tree type;
-
+
if (binfo)
{
/* For the purposes of determining layout conflicts, we want to
@@ -3391,11 +3363,11 @@ layout_nonempty_base_or_field (record_layout_info rli,
/* We have to check to see whether or not there is already
something of the same type at the offset we're about to use.
For example, consider:
-
+
struct S {};
struct T : public S { int i; };
struct U : public S, public T {};
-
+
Here, we put S at offset zero in U. Then, we can't put T at
offset zero -- its S component would be at the same address
as the S we already allocated. So, we have to skip ahead.
@@ -3411,7 +3383,7 @@ layout_nonempty_base_or_field (record_layout_info rli,
virtual base. */
if (!abi_version_at_least (2) && binfo && BINFO_VIRTUAL_P (binfo))
break;
- if (layout_conflict_p (field_p ? type : binfo, offset,
+ if (layout_conflict_p (field_p ? type : binfo, offset,
offsets, field_p))
{
/* Strip off the size allocated to this field. That puts us
@@ -3421,8 +3393,8 @@ layout_nonempty_base_or_field (record_layout_info rli,
/* Bump up by the alignment required for the type. */
rli->bitpos
- = size_binop (PLUS_EXPR, rli->bitpos,
- bitsize_int (binfo
+ = size_binop (PLUS_EXPR, rli->bitpos,
+ bitsize_int (binfo
? CLASSTYPE_ALIGN (type)
: TYPE_ALIGN (type)));
normalize_rli (rli);
@@ -3439,9 +3411,9 @@ layout_nonempty_base_or_field (record_layout_info rli,
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,
+ propagate_binfo_offsets (binfo,
size_diffop (convert (ssizetype, offset),
- convert (ssizetype,
+ convert (ssizetype,
BINFO_OFFSET (binfo))));
}
@@ -3482,22 +3454,22 @@ layout_empty_base (tree binfo, tree eoc, splay_tree offsets)
"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. */
if (layout_conflict_p (binfo,
BINFO_OFFSET (binfo),
- offsets,
+ offsets,
/*vbases_p=*/0))
{
/* That didn't work. Now, we move forward from the next
available spot in the class. */
atend = true;
propagate_binfo_offsets (binfo, convert (ssizetype, eoc));
- while (1)
+ while (1)
{
if (!layout_conflict_p (binfo,
- BINFO_OFFSET (binfo),
+ BINFO_OFFSET (binfo),
offsets,
/*vbases_p=*/0))
/* We finally found a spot where there's no overlap. */
@@ -3515,7 +3487,7 @@ layout_empty_base (tree binfo, tree eoc, splay_tree offsets)
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.
+ *NEXT_FIELD, unless BINFO is for an empty base class.
Returns the location at which the next field should be inserted. */
@@ -3530,7 +3502,7 @@ build_base_field (record_layout_info rli, tree binfo,
/* This error is now reported in xref_tag, thus giving better
location information. */
return next_field;
-
+
/* Place the base class. */
if (!is_empty_class (basetype))
{
@@ -3539,7 +3511,7 @@ build_base_field (record_layout_info rli, tree binfo,
/* The containing class is non-empty because it has a non-empty
base class. */
CLASSTYPE_EMPTY_P (t) = 0;
-
+
/* Create the FIELD_DECL. */
decl = build_decl (FIELD_DECL, NULL_TREE, CLASSTYPE_AS_BASE (basetype));
DECL_ARTIFICIAL (decl) = 1;
@@ -3580,7 +3552,7 @@ build_base_field (record_layout_info rli, tree binfo,
/* The check above (used in G++ 3.2) is insufficient because
an empty class placed at offset zero might itself have an
empty base at a nonzero offset. */
- else if (walk_subobject_offsets (basetype,
+ else if (walk_subobject_offsets (basetype,
empty_base_at_nonzero_offset_p,
size_zero_node,
/*offsets=*/NULL,
@@ -3594,7 +3566,7 @@ build_base_field (record_layout_info rli, tree binfo,
"future version of GCC", t);
}
}
-
+
/* 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
@@ -3610,7 +3582,7 @@ build_base_field (record_layout_info rli, tree binfo,
/* Record the offsets of BINFO and its base subobjects. */
record_subobject_offsets (binfo,
BINFO_OFFSET (binfo),
- offsets,
+ offsets,
/*vbases_p=*/0);
return next_field;
@@ -3740,14 +3712,14 @@ build_clone (tree fn, tree name)
parmtypes = TREE_CHAIN (parmtypes);
/* If this is subobject constructor or destructor, add the vtt
parameter. */
- TREE_TYPE (clone)
+ TREE_TYPE (clone)
= build_method_type_directly (basetype,
TREE_TYPE (TREE_TYPE (clone)),
parmtypes);
if (exceptions)
TREE_TYPE (clone) = build_exception_variant (TREE_TYPE (clone),
exceptions);
- TREE_TYPE (clone)
+ TREE_TYPE (clone)
= cp_build_type_attribute_variant (TREE_TYPE (clone),
TYPE_ATTRIBUTES (TREE_TYPE (fn)));
}
@@ -3787,7 +3759,7 @@ build_clone (tree fn, tree name)
/* Create the RTL for this function. */
SET_DECL_RTL (clone, NULL_RTX);
rest_of_decl_compilation (clone, /*top_level=*/1, at_eof);
-
+
/* Make it easy to find the CLONE given the FN. */
TREE_CHAIN (clone) = TREE_CHAIN (fn);
TREE_CHAIN (fn) = clone;
@@ -3797,7 +3769,7 @@ build_clone (tree fn, tree name)
{
tree result;
- DECL_TEMPLATE_RESULT (clone)
+ DECL_TEMPLATE_RESULT (clone)
= build_clone (DECL_TEMPLATE_RESULT (clone), name);
result = DECL_TEMPLATE_RESULT (clone);
DECL_TEMPLATE_INFO (result) = copy_node (DECL_TEMPLATE_INFO (result));
@@ -3829,10 +3801,10 @@ clone_function_decl (tree fn, int update_method_vec_p)
and a not-in-charge version. */
clone = build_clone (fn, complete_ctor_identifier);
if (update_method_vec_p)
- add_method (DECL_CONTEXT (clone), clone);
+ add_method (DECL_CONTEXT (clone), clone, NULL_TREE);
clone = build_clone (fn, base_ctor_identifier);
if (update_method_vec_p)
- add_method (DECL_CONTEXT (clone), clone);
+ add_method (DECL_CONTEXT (clone), clone, NULL_TREE);
}
else
{
@@ -3843,22 +3815,22 @@ clone_function_decl (tree fn, int update_method_vec_p)
version. We clone the deleting version first because that
means it will go second on the TYPE_METHODS list -- and that
corresponds to the correct layout order in the virtual
- function table.
+ function table.
- For a non-virtual destructor, we do not build a deleting
+ For a non-virtual destructor, we do not build a deleting
destructor. */
if (DECL_VIRTUAL_P (fn))
{
clone = build_clone (fn, deleting_dtor_identifier);
if (update_method_vec_p)
- add_method (DECL_CONTEXT (clone), clone);
+ add_method (DECL_CONTEXT (clone), clone, NULL_TREE);
}
clone = build_clone (fn, complete_dtor_identifier);
if (update_method_vec_p)
- add_method (DECL_CONTEXT (clone), clone);
+ add_method (DECL_CONTEXT (clone), clone, NULL_TREE);
clone = build_clone (fn, base_dtor_identifier);
if (update_method_vec_p)
- add_method (DECL_CONTEXT (clone), clone);
+ add_method (DECL_CONTEXT (clone), clone, NULL_TREE);
}
/* Note that this is an abstract function that is never emitted. */
@@ -3876,7 +3848,7 @@ void
adjust_clone_args (tree decl)
{
tree clone;
-
+
for (clone = TREE_CHAIN (decl); clone && DECL_CLONED_FUNCTION (clone);
clone = TREE_CHAIN (clone))
{
@@ -3885,7 +3857,7 @@ adjust_clone_args (tree decl)
tree decl_parms, clone_parms;
clone_parms = orig_clone_parms;
-
+
/* Skip the 'this' parameter. */
orig_clone_parms = TREE_CHAIN (orig_clone_parms);
orig_decl_parms = TREE_CHAIN (orig_decl_parms);
@@ -3894,18 +3866,18 @@ adjust_clone_args (tree decl)
orig_decl_parms = TREE_CHAIN (orig_decl_parms);
if (DECL_HAS_VTT_PARM_P (decl))
orig_decl_parms = TREE_CHAIN (orig_decl_parms);
-
+
clone_parms = orig_clone_parms;
if (DECL_HAS_VTT_PARM_P (clone))
clone_parms = TREE_CHAIN (clone_parms);
-
+
for (decl_parms = orig_decl_parms; decl_parms;
decl_parms = TREE_CHAIN (decl_parms),
clone_parms = TREE_CHAIN (clone_parms))
{
gcc_assert (same_type_p (TREE_TYPE (decl_parms),
TREE_TYPE (clone_parms)));
-
+
if (TREE_PURPOSE (decl_parms) && !TREE_PURPOSE (clone_parms))
{
/* A default parameter has been added. Adjust the
@@ -3929,7 +3901,7 @@ adjust_clone_args (tree decl)
if (exceptions)
type = build_exception_variant (type, exceptions);
TREE_TYPE (clone) = type;
-
+
clone_parms = NULL_TREE;
break;
}
@@ -3964,11 +3936,11 @@ remove_zero_width_bit_fields (tree t)
{
tree *fieldsp;
- fieldsp = &TYPE_FIELDS (t);
+ fieldsp = &TYPE_FIELDS (t);
while (*fieldsp)
{
if (TREE_CODE (*fieldsp) == FIELD_DECL
- && DECL_C_BIT_FIELD (*fieldsp)
+ && DECL_C_BIT_FIELD (*fieldsp)
&& DECL_INITIAL (*fieldsp))
*fieldsp = TREE_CHAIN (*fieldsp);
else
@@ -3997,7 +3969,7 @@ type_requires_array_cookie (tree type)
argument is of type `size_t', then we have to pass the size of
the array to the deallocation function, so we will need to store
a cookie. */
- fns = lookup_fnfields (TYPE_BINFO (type),
+ fns = lookup_fnfields (TYPE_BINFO (type),
ansi_opname (VEC_DELETE_EXPR),
/*protect=*/0);
/* If there are no `operator []' members, or the lookup is
@@ -4079,7 +4051,7 @@ check_bases_and_members (tree t)
CLASSTYPE_NON_AGGREGATE (t)
|= (TYPE_HAS_CONSTRUCTOR (t) || TYPE_POLYMORPHIC_P (t));
CLASSTYPE_NON_POD_P (t)
- |= (CLASSTYPE_NON_AGGREGATE (t)
+ |= (CLASSTYPE_NON_AGGREGATE (t)
|| TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)
|| TYPE_HAS_ASSIGN_REF (t));
TYPE_HAS_COMPLEX_ASSIGN_REF (t)
@@ -4125,7 +4097,7 @@ create_vtable_ptr (tree t, tree* virtuals_p)
&& TREE_CODE (DECL_VINDEX (fn)) != INTEGER_CST)
{
tree new_virtual = make_node (TREE_LIST);
-
+
BV_FN (new_virtual) = fn;
BV_DELTA (new_virtual) = integer_zero_node;
BV_VCALL_INDEX (new_virtual) = NULL_TREE;
@@ -4133,7 +4105,7 @@ create_vtable_ptr (tree t, tree* virtuals_p)
TREE_CHAIN (new_virtual) = *virtuals_p;
*virtuals_p = new_virtual;
}
-
+
/* If we couldn't find an appropriate base class, create a new field
here. Even if there weren't any new virtual functions, we might need a
new virtual function table if we're supposed to include vptrs in
@@ -4152,9 +4124,9 @@ create_vtable_ptr (tree t, tree* virtuals_p)
the derived class vtable pointer, since they have different
types. Thus, in a derived class destructor, where the base
class constructor was inlined, we could generate bad code for
- setting up the vtable pointer.
+ setting up the vtable pointer.
- Therefore, we use one type for all vtable pointers. We still
+ Therefore, we use one type for all vtable pointers. We still
use a type-correct type; it's just doesn't indicate the array
bounds. That's better than using `void*' or some such; it's
cleaner, and it let's the alias analysis code know that these
@@ -4167,9 +4139,9 @@ create_vtable_ptr (tree t, tree* virtuals_p)
DECL_ARTIFICIAL (field) = 1;
DECL_FIELD_CONTEXT (field) = t;
DECL_FCONTEXT (field) = t;
-
+
TYPE_VFIELD (t) = field;
-
+
/* This class is non-empty. */
CLASSTYPE_EMPTY_P (t) = 0;
@@ -4241,7 +4213,7 @@ propagate_binfo_offsets (tree binfo, tree offset)
/* Update BINFO's offset. */
BINFO_OFFSET (binfo)
- = convert (sizetype,
+ = convert (sizetype,
size_binop (PLUS_EXPR,
convert (ssizetype, BINFO_OFFSET (binfo)),
offset));
@@ -4251,7 +4223,7 @@ propagate_binfo_offsets (tree binfo, tree offset)
if (primary_binfo && BINFO_INHERITANCE_CHAIN (primary_binfo) == binfo)
propagate_binfo_offsets (primary_binfo, offset);
-
+
/* Scan all of the bases, pushing the BINFO_OFFSET adjust
downwards. */
for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
@@ -4329,14 +4301,14 @@ layout_virtual_bases (record_layout_info rli, splay_tree offsets)
the results which is not particularly tractable. */
if (warn_abi
&& first_vbase
- && (tree_int_cst_lt
+ && (tree_int_cst_lt
(size_binop (CEIL_DIV_EXPR,
round_up (CLASSTYPE_SIZE (t),
CLASSTYPE_ALIGN (basetype)),
bitsize_unit_node),
BINFO_OFFSET (vbase))))
warning (0, "offset of virtual base %qT is not ABI-compliant and "
- "may change in a future version of GCC",
+ "may change in a future version of GCC",
basetype);
first_vbase = false;
@@ -4426,7 +4398,7 @@ warn_about_ambiguous_bases (tree t)
/* If there are no repeated bases, nothing can be ambiguous. */
if (!CLASSTYPE_REPEATED_BASE_P (t))
return;
-
+
/* Check direct bases. */
for (binfo = TYPE_BINFO (t), i = 0;
BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
@@ -4444,7 +4416,7 @@ warn_about_ambiguous_bases (tree t)
VEC_iterate (tree, vbases, i, binfo); i++)
{
basetype = BINFO_TYPE (binfo);
-
+
if (!lookup_base (t, basetype, ba_unique | ba_quiet, NULL))
warning (0, "virtual base %qT inaccessible in %qT due to ambiguity",
basetype, t);
@@ -4473,7 +4445,7 @@ include_empty_classes (record_layout_info rli)
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,
+ eoc = end_of_class (rli->t,
CLASSTYPE_AS_BASE (rli->t) != NULL_TREE);
rli_size = rli_size_unit_so_far (rli);
if (TREE_CODE (rli_size) == INTEGER_CST
@@ -4490,8 +4462,8 @@ include_empty_classes (record_layout_info rli)
/* The size should have been rounded to a whole byte. */
gcc_assert (tree_int_cst_equal
(rli->bitpos, round_down (rli->bitpos, BITS_PER_UNIT)));
- rli->bitpos
- = size_binop (PLUS_EXPR,
+ rli->bitpos
+ = size_binop (PLUS_EXPR,
rli->bitpos,
size_binop (MULT_EXPR,
convert (bitsizetype,
@@ -4547,10 +4519,10 @@ layout_class_type (tree t, tree *virtuals_p)
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,
+ empty_base_offsets = splay_tree_new (splay_tree_compare_integer_csts,
NULL, NULL);
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))
{
@@ -4563,14 +4535,14 @@ layout_class_type (tree t, tree *virtuals_p)
{
place_field (rli, field);
/* If the static data member has incomplete type, keep track
- of it so that it can be completed later. (The handling
+ of it so that it can be completed later. (The handling
of pending statics in finish_record_layout is
insufficient; consider:
struct S1;
struct S2 { static S1 s1; };
-
- At this point, finish_record_layout will be called, but
+
+ At this point, finish_record_layout will be called, but
S1 is still incomplete.) */
if (TREE_CODE (field) == VAR_DECL)
{
@@ -4584,7 +4556,7 @@ layout_class_type (tree t, tree *virtuals_p)
}
type = TREE_TYPE (field);
-
+
padding = NULL_TREE;
/* If this field is a bit-field whose width is greater than its
@@ -4601,7 +4573,7 @@ layout_class_type (tree t, tree *virtuals_p)
of the field. Then, we are supposed to use the left over
bits as additional padding. */
for (itk = itk_char; itk != itk_none; ++itk)
- if (INT_CST_LT (DECL_SIZE (field),
+ if (INT_CST_LT (DECL_SIZE (field),
TYPE_SIZE (integer_types[itk])))
break;
@@ -4625,7 +4597,7 @@ layout_class_type (tree t, tree *virtuals_p)
if (warn_abi && TREE_CODE (t) == UNION_TYPE)
warning (0, "size assigned to %qT may not be "
"ABI-compliant and may change in a future "
- "version of GCC",
+ "version of GCC",
t);
padding = size_binop (MINUS_EXPR, DECL_SIZE (field),
TYPE_SIZE (integer_type));
@@ -4671,7 +4643,7 @@ layout_class_type (tree t, tree *virtuals_p)
/* Remember the location of any empty classes in FIELD. */
if (abi_version_at_least (2))
- record_subobject_offsets (TREE_TYPE (field),
+ record_subobject_offsets (TREE_TYPE (field),
byte_position(field),
empty_base_offsets,
/*vbases_p=*/1);
@@ -4680,18 +4652,23 @@ layout_class_type (tree t, tree *virtuals_p)
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)
+ && DECL_C_BIT_FIELD (field)
+ /* The TREE_NO_WARNING flag gets set by Objective-C when
+ laying out an Objective-C class. The ObjC ABI differs
+ from the C++ ABI, and so we do not want a warning
+ here. */
+ && !TREE_NO_WARNING (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 %qD is not ABI-compliant and may "
- "change in a future version of GCC",
+ "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
+ if (warn_abi
&& !tree_int_cst_equal (DECL_FIELD_OFFSET (field),
byte_position (field))
&& contains_empty_class_p (TREE_TYPE (field)))
@@ -4706,16 +4683,16 @@ layout_class_type (tree t, tree *virtuals_p)
{
tree padding_field;
- padding_field = build_decl (FIELD_DECL,
+ padding_field = build_decl (FIELD_DECL,
NULL_TREE,
- char_type_node);
+ char_type_node);
DECL_BIT_FIELD (padding_field) = 1;
DECL_SIZE (padding_field) = padding;
DECL_CONTEXT (padding_field) = t;
DECL_ARTIFICIAL (padding_field) = 1;
DECL_IGNORED_P (padding_field) = 1;
layout_nonempty_base_or_field (rli, padding_field,
- NULL_TREE,
+ NULL_TREE,
empty_base_offsets);
}
@@ -4746,7 +4723,7 @@ layout_class_type (tree t, tree *virtuals_p)
if (CLASSTYPE_NON_POD_P (t) || CLASSTYPE_EMPTY_P (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. */
@@ -4771,14 +4748,14 @@ layout_class_type (tree t, tree *virtuals_p)
rli_size_so_far, rather than rli_size_unit_so_far, is
used to compute TYPE_SIZE_UNIT. */
eoc = end_of_class (t, /*include_virtuals_p=*/0);
- TYPE_SIZE_UNIT (base_t)
+ TYPE_SIZE_UNIT (base_t)
= size_binop (MAX_EXPR,
convert (sizetype,
size_binop (CEIL_DIV_EXPR,
rli_size_so_far (rli),
bitsize_int (BITS_PER_UNIT))),
eoc);
- TYPE_SIZE (base_t)
+ TYPE_SIZE (base_t)
= size_binop (MAX_EXPR,
rli_size_so_far (rli),
size_binop (MULT_EXPR,
@@ -4794,7 +4771,7 @@ layout_class_type (tree t, tree *virtuals_p)
if (TREE_CODE (field) == FIELD_DECL)
{
*next_field = build_decl (FIELD_DECL,
- DECL_NAME (field),
+ DECL_NAME (field),
TREE_TYPE (field));
DECL_CONTEXT (*next_field) = base_t;
DECL_FIELD_OFFSET (*next_field) = DECL_FIELD_OFFSET (field);
@@ -4827,13 +4804,13 @@ layout_class_type (tree t, tree *virtuals_p)
base subobject fields. */
layout_virtual_bases (rli, empty_base_offsets);
- /* Make sure that empty classes are reflected in RLI at this
+ /* 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,
+ place_field (rli,
build_decl (FIELD_DECL, NULL_TREE, char_type_node));
/* Let the back-end lay out the type. */
@@ -4907,7 +4884,7 @@ finish_struct_1 (tree t)
CLASSTYPE_PRIMARY_BINFO (t) = NULL_TREE;
fixup_inline_methods (t);
-
+
/* Make assumptions about the class; we'll reset the flags if
necessary. */
CLASSTYPE_EMPTY_P (t) = 1;
@@ -4974,9 +4951,9 @@ finish_struct_1 (tree t)
= chainon (BINFO_VIRTUALS (TYPE_BINFO (t)), virtuals);
/* Set DECL_VINDEX for all functions declared in this class. */
- for (vindex = 0, fn = BINFO_VIRTUALS (TYPE_BINFO (t));
- fn;
- fn = TREE_CHAIN (fn),
+ for (vindex = 0, fn = BINFO_VIRTUALS (TYPE_BINFO (t));
+ fn;
+ fn = TREE_CHAIN (fn),
vindex += (TARGET_VTABLE_USES_DESCRIPTORS
? TARGET_VTABLE_USES_DESCRIPTORS : 1))
{
@@ -5012,8 +4989,8 @@ finish_struct_1 (tree t)
if (n_fields > 7)
{
struct sorted_fields_type *field_vec = GGC_NEWVAR
- (struct sorted_fields_type,
- sizeof (struct sorted_fields_type) + n_fields * sizeof (tree));
+ (struct sorted_fields_type,
+ sizeof (struct sorted_fields_type) + n_fields * sizeof (tree));
field_vec->len = n_fields;
add_fields_to_record_type (TYPE_FIELDS (t), field_vec, 0);
qsort (field_vec->elts, n_fields, sizeof (tree),
@@ -5026,7 +5003,7 @@ finish_struct_1 (tree t)
/* Make the rtl for any new vtables we have created, and unmark
the base types we marked. */
finish_vtbls (t);
-
+
/* Build the VTT for T. */
build_vtt (t);
@@ -5043,10 +5020,10 @@ finish_struct_1 (tree t)
if it were virtual, we would have created it by now. */
!dtor
|| (!DECL_VINDEX (dtor)
- && (!TREE_PRIVATE (dtor)
- || CLASSTYPE_FRIEND_CLASSES (t)
+ && (!TREE_PRIVATE (dtor)
+ || CLASSTYPE_FRIEND_CLASSES (t)
|| DECL_FRIENDLIST (TYPE_MAIN_DECL (t)))))
- warning (0, "%q#T has virtual functions but non-virtual destructor",
+ warning (0, "%q#T has virtual functions but non-virtual destructor",
t);
}
@@ -5058,7 +5035,7 @@ finish_struct_1 (tree t)
maybe_suppress_debug_info (t);
dump_class_hierarchy (t);
-
+
/* Finish debugging output for this type. */
rest_of_type_compilation (t, ! LOCAL_CLASS_P (t));
}
@@ -5081,8 +5058,8 @@ unreverse_member_declarations (tree t)
/* Actually, for the TYPE_FIELDS, only the non TYPE_DECLs are in
reverse order, so we can't just use nreverse. */
prev = NULL_TREE;
- for (x = TYPE_FIELDS (t);
- x && TREE_CODE (x) != TYPE_DECL;
+ for (x = TYPE_FIELDS (t);
+ x && TREE_CODE (x) != TYPE_DECL;
x = next)
{
next = TREE_CHAIN (x);
@@ -5221,7 +5198,7 @@ fixed_type_or_null (tree instance, int* nonnull, int* cdtorp)
/* If this component is really a base class reference, then the field
itself isn't definitive. */
if (DECL_FIELD_IS_BASE (TREE_OPERAND (instance, 1)))
- return fixed_type_or_null (TREE_OPERAND (instance, 0), nonnull, cdtorp);
+ return fixed_type_or_null (TREE_OPERAND (instance, 0), nonnull, cdtorp);
return fixed_type_or_null (TREE_OPERAND (instance, 1), nonnull, cdtorp);
case VAR_DECL:
@@ -5244,30 +5221,30 @@ fixed_type_or_null (tree instance, int* nonnull, int* cdtorp)
return TREE_TYPE (instance);
}
else if (instance == current_class_ptr)
- {
- if (nonnull)
- *nonnull = 1;
-
- /* 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)))
- {
- if (cdtorp)
- *cdtorp = 1;
- return TREE_TYPE (TREE_TYPE (instance));
- }
- }
+ {
+ if (nonnull)
+ *nonnull = 1;
+
+ /* 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)))
+ {
+ if (cdtorp)
+ *cdtorp = 1;
+ return TREE_TYPE (TREE_TYPE (instance));
+ }
+ }
else if (TREE_CODE (TREE_TYPE (instance)) == REFERENCE_TYPE)
- {
- /* Reference variables should be references to objects. */
- if (nonnull)
+ {
+ /* Reference variables should be references to objects. */
+ if (nonnull)
*nonnull = 1;
-
+
/* DECL_VAR_MARKED_P is used to prevent recursion; a
variable's initializer may refer to the variable
itself. */
- if (TREE_CODE (instance) == VAR_DECL
+ if (TREE_CODE (instance) == VAR_DECL
&& DECL_INITIAL (instance)
&& !DECL_VAR_MARKED_P (instance))
{
@@ -5305,7 +5282,7 @@ resolves_to_fixed_type_p (tree instance, int* nonnull)
{
tree t = TREE_TYPE (instance);
int cdtorp = 0;
-
+
tree fixed = fixed_type_or_null (instance, nonnull, &cdtorp);
if (fixed == NULL_TREE)
return 0;
@@ -5322,7 +5299,7 @@ init_class_processing (void)
{
current_class_depth = 0;
current_class_stack_size = 10;
- current_class_stack
+ current_class_stack
= xmalloc (current_class_stack_size * sizeof (struct class_stack_node));
local_classes = VEC_alloc (tree, gc, 8);
@@ -5345,8 +5322,8 @@ restore_class_cache (void)
push_binding_level (previous_class_level);
class_binding_level = previous_class_level;
/* Restore IDENTIFIER_TYPE_VALUE. */
- for (type = class_binding_level->type_shadowed;
- type;
+ for (type = class_binding_level->type_shadowed;
+ type;
type = TREE_CHAIN (type))
SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (type), TREE_TYPE (type));
}
@@ -5366,7 +5343,7 @@ pushclass (tree type)
type = TYPE_MAIN_VARIANT (type);
/* Make sure there is enough room for the new entry on the stack. */
- if (current_class_depth + 1 >= current_class_stack_size)
+ if (current_class_depth + 1 >= current_class_stack_size)
{
current_class_stack_size *= 2;
current_class_stack
@@ -5390,8 +5367,8 @@ pushclass (tree type)
/* By default, things in classes are private, while things in
structures or unions are public. */
- current_access_specifier = (CLASSTYPE_DECLARED_CLASS (type)
- ? access_private_node
+ current_access_specifier = (CLASSTYPE_DECLARED_CLASS (type)
+ ? access_private_node
: access_public_node);
if (previous_class_level
@@ -5402,7 +5379,7 @@ pushclass (tree type)
invalidate_class_lookup_cache ();
}
- if (!previous_class_level
+ if (!previous_class_level
|| type != previous_class_level->this_entity
|| current_class_depth > 1)
pushlevel_class ();
@@ -5419,7 +5396,7 @@ invalidate_class_lookup_cache (void)
{
previous_class_level = NULL;
}
-
+
/* Get out of the current class scope. If we were in a class scope
previously, that is the one popped to. */
@@ -5491,14 +5468,14 @@ push_nested_class (tree type)
tree context;
/* A namespace might be passed in error cases, like A::B:C. */
- if (type == NULL_TREE
- || type == error_mark_node
+ if (type == NULL_TREE
+ || type == error_mark_node
|| TREE_CODE (type) == NAMESPACE_DECL
|| ! IS_AGGR_TYPE (type)
|| TREE_CODE (type) == TEMPLATE_TYPE_PARM
|| TREE_CODE (type) == BOUND_TEMPLATE_TEMPLATE_PARM)
return;
-
+
context = DECL_CONTEXT (TYPE_MAIN_DECL (type));
if (context && CLASS_TYPE_P (context))
@@ -5561,7 +5538,7 @@ push_lang_context (tree name)
else
error ("language string %<\"%E\"%> not recognized", name);
}
-
+
/* Get out of the current language scope. */
void
@@ -5581,14 +5558,14 @@ pop_lang_context (void)
template arguments. */
static tree
-resolve_address_of_overloaded_function (tree target_type,
+resolve_address_of_overloaded_function (tree target_type,
tree overload,
tsubst_flags_t flags,
bool template_only,
tree explicit_targs)
{
/* Here's what the standard says:
-
+
[over.over]
If the name is a function template, template argument deduction
@@ -5628,7 +5605,7 @@ resolve_address_of_overloaded_function (tree target_type,
|| TREE_CODE (TREE_TYPE (target_type)) != METHOD_TYPE);
gcc_assert (is_overloaded_fn (overload));
-
+
/* Check that the TARGET_TYPE is reasonable. */
if (TYPE_PTRFN_P (target_type))
/* This is OK. */;
@@ -5642,15 +5619,15 @@ resolve_address_of_overloaded_function (tree target_type,
target_type = build_reference_type (target_type);
is_reference = 1;
}
- else
+ else
{
if (flags & tf_error)
error ("cannot resolve overloaded function %qD based on"
- " conversion to type %qT",
- DECL_NAME (OVL_FUNCTION (overload)), target_type);
+ " conversion to type %qT",
+ DECL_NAME (OVL_FUNCTION (overload)), target_type);
return error_mark_node;
}
-
+
/* If we can find a non-template function that matches, we can just
use it. There's no point in generating template instantiations
if we're just going to throw them out anyhow. But, of course, we
@@ -5693,7 +5670,7 @@ resolve_address_of_overloaded_function (tree target_type,
/* Now, if we've already got a match (or matches), there's no need
to proceed to the template functions. But, if we don't have a
match we need to look at them, too. */
- if (!matches)
+ if (!matches)
{
tree target_fn_type;
tree target_arg_types;
@@ -5711,7 +5688,7 @@ resolve_address_of_overloaded_function (tree target_type,
/* Never do unification on the 'this' parameter. */
if (TREE_CODE (target_fn_type) == METHOD_TYPE)
target_arg_types = TREE_CHAIN (target_arg_types);
-
+
for (fns = overload; fns; fns = OVL_NEXT (fns))
{
tree fn = OVL_CURRENT (fns);
@@ -5746,7 +5723,7 @@ resolve_address_of_overloaded_function (tree target_type,
/* See if there's a match. */
instantiation_type = TREE_TYPE (instantiation);
if (is_ptrmem)
- instantiation_type =
+ instantiation_type =
build_ptrmemfunc_type (build_pointer_type (instantiation_type));
else if (!is_reference)
instantiation_type = build_pointer_type (instantiation_type);
@@ -5770,17 +5747,17 @@ resolve_address_of_overloaded_function (tree target_type,
/* There were *no* matches. */
if (flags & tf_error)
{
- error ("no matches converting function %qD to type %q#T",
- DECL_NAME (OVL_FUNCTION (overload)),
- target_type);
+ error ("no matches converting function %qD to type %q#T",
+ DECL_NAME (OVL_FUNCTION (overload)),
+ target_type);
/* print_candidates expects a chain with the functions in
- TREE_VALUE slots, so we cons one up here (we're losing anyway,
- so why be clever?). */
- for (; overload; overload = OVL_NEXT (overload))
- matches = tree_cons (NULL_TREE, OVL_CURRENT (overload),
+ TREE_VALUE slots, so we cons one up here (we're losing anyway,
+ so why be clever?). */
+ for (; overload; overload = OVL_NEXT (overload))
+ matches = tree_cons (NULL_TREE, OVL_CURRENT (overload),
matches);
-
+
print_candidates (matches);
}
return error_mark_node;
@@ -5793,7 +5770,7 @@ resolve_address_of_overloaded_function (tree target_type,
{
tree match;
- error ("converting overloaded function %qD to type %q#T is ambiguous",
+ error ("converting overloaded function %qD to type %q#T is ambiguous",
DECL_NAME (OVL_FUNCTION (overload)),
target_type);
@@ -5804,7 +5781,7 @@ resolve_address_of_overloaded_function (tree target_type,
print_candidates (matches);
}
-
+
return error_mark_node;
}
@@ -5815,16 +5792,16 @@ resolve_address_of_overloaded_function (tree target_type,
&& !(flags & tf_ptrmem_ok) && !flag_ms_extensions)
{
static int explained;
-
+
if (!(flags & tf_error))
- return error_mark_node;
+ return error_mark_node;
pedwarn ("assuming pointer to member %qD", fn);
if (!explained)
- {
- pedwarn ("(a pointer to member can only be formed with %<&%E%>)", fn);
- explained = 1;
- }
+ {
+ pedwarn ("(a pointer to member can only be formed with %<&%E%>)", fn);
+ explained = 1;
+ }
}
/* If we're doing overload resolution purely for the purpose of
@@ -5853,7 +5830,7 @@ resolve_address_of_overloaded_function (tree target_type,
we complain on errors. If we are not complaining, never modify rhs,
as overload resolution wants to try many possible instantiations, in
the hope that at least one will work.
-
+
For non-recursive calls, LHSTYPE should be a function, pointer to
function, or a pointer to member function. */
@@ -5861,9 +5838,9 @@ tree
instantiate_type (tree lhstype, tree rhs, tsubst_flags_t flags)
{
tsubst_flags_t flags_in = flags;
-
+
flags &= ~tf_ptrmem_ok;
-
+
if (TREE_CODE (lhstype) == UNKNOWN_TYPE)
{
if (flags & tf_error)
@@ -5875,7 +5852,7 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t flags)
{
if (same_type_p (lhstype, TREE_TYPE (rhs)))
return rhs;
- if (flag_ms_extensions
+ if (flag_ms_extensions
&& TYPE_PTRMEMFUNC_P (lhstype)
&& !TYPE_PTRMEMFUNC_P (TREE_TYPE (rhs)))
/* Microsoft allows `A::f' to be resolved to a
@@ -5977,7 +5954,7 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t flags)
case OVERLOAD:
case FUNCTION_DECL:
- return
+ return
resolve_address_of_overloaded_function (lhstype, rhs, flags_in,
/*template_only=*/false,
/*explicit_targs=*/NULL_TREE);
@@ -6080,12 +6057,12 @@ instantiate_type (tree lhstype, tree rhs, tsubst_flags_t flags)
TREE_TYPE (rhs) = lhstype;
return rhs;
-
+
case ADDR_EXPR:
{
if (PTRMEM_OK_P (rhs))
- flags |= tf_ptrmem_ok;
-
+ flags |= tf_ptrmem_ok;
+
return instantiate_type (lhstype, TREE_OPERAND (rhs, 0), flags);
}
@@ -6120,7 +6097,7 @@ get_vfield_name (tree type)
|| !TYPE_CONTAINS_VPTR_P (BINFO_TYPE (base_binfo)))
break;
}
-
+
type = BINFO_TYPE (binfo);
buf = alloca (sizeof (VFIELD_NAME_FORMAT) + TYPE_NAME_LENGTH (type) + 2);
sprintf (buf, VFIELD_NAME_FORMAT,
@@ -6146,7 +6123,7 @@ print_class_statistics (void)
/* Build a dummy reference to ourselves so Derived::Base (and A::A) works,
according to [class]:
- The class-name is also inserted
+ The class-name is also inserted
into the scope of the class itself. For purposes of access checking,
the inserted class name is treated as if it were a public member name. */
@@ -6231,10 +6208,10 @@ maybe_note_name_used_in_class (tree name, tree decl)
if (!(innermost_scope_kind() == sk_class
&& TYPE_BEING_DEFINED (current_class_type)))
return;
-
+
/* If there's already a binding for this NAME, then we don't have
anything to worry about. */
- if (lookup_member (current_class_type, name,
+ if (lookup_member (current_class_type, name,
/*protect=*/0, /*want_type=*/false))
return;
@@ -6244,7 +6221,7 @@ maybe_note_name_used_in_class (tree name, tree decl)
names_used = current_class_stack[current_class_depth - 1].names_used;
splay_tree_insert (names_used,
- (splay_tree_key) name,
+ (splay_tree_key) name,
(splay_tree_value) decl);
}
@@ -6258,7 +6235,7 @@ note_name_declared_in_class (tree name, tree decl)
splay_tree_node n;
/* Look to see if we ever used this name. */
- names_used
+ names_used
= current_class_stack[current_class_depth - 1].names_used;
if (!names_used)
return;
@@ -6267,12 +6244,12 @@ note_name_declared_in_class (tree name, tree decl)
if (n)
{
/* [basic.scope.class]
-
+
A name N used in a class S shall refer to the same declaration
in its context and when re-evaluated in the completed scope of
S. */
error ("declaration of %q#D", decl);
- cp_error_at ("changes meaning of %qD from %q+#D",
+ cp_error_at ("changes meaning of %qD from %q+#D",
DECL_NAME (OVL_CURRENT (decl)),
(tree) n->value);
}
@@ -6310,7 +6287,7 @@ get_primary_binfo (tree binfo)
{
tree primary_base;
tree result;
-
+
primary_base = CLASSTYPE_PRIMARY_BINFO (BINFO_TYPE (binfo));
if (!primary_base)
return NULL_TREE;
@@ -6336,15 +6313,15 @@ maybe_indent_hierarchy (FILE * stream, int indent, int indented_p)
static tree
dump_class_hierarchy_r (FILE *stream,
- int flags,
- tree binfo,
- tree igo,
- int indent)
+ int flags,
+ tree binfo,
+ tree igo,
+ int indent)
{
int indented = 0;
tree base_binfo;
int i;
-
+
indented = maybe_indent_hierarchy (stream, indent, 0);
fprintf (stream, "%s (0x%lx) ",
type_as_string (BINFO_TYPE (binfo), TFF_PLAIN_IDENTIFIER),
@@ -6355,7 +6332,7 @@ dump_class_hierarchy_r (FILE *stream,
return igo;
}
igo = TREE_CHAIN (binfo);
-
+
fprintf (stream, HOST_WIDE_INT_PRINT_DEC,
tree_low_cst (BINFO_OFFSET (binfo), 0));
if (is_empty_class (BINFO_TYPE (binfo)))
@@ -6386,7 +6363,7 @@ dump_class_hierarchy_r (FILE *stream,
if (!(flags & TDF_SLIM))
{
int indented = 0;
-
+
if (BINFO_SUBVTT_INDEX (binfo))
{
indented = maybe_indent_hierarchy (stream, indent + 3, indented);
@@ -6415,14 +6392,14 @@ dump_class_hierarchy_r (FILE *stream,
expr_as_string (BINFO_VTABLE (binfo),
TFF_PLAIN_IDENTIFIER));
}
-
+
if (indented)
fprintf (stream, "\n");
}
for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
igo = dump_class_hierarchy_r (stream, flags, base_binfo, igo, indent + 2);
-
+
return igo;
}
@@ -6499,7 +6476,7 @@ dump_vtable (tree t, tree binfo, tree vtable)
if (!(flags & TDF_SLIM))
{
int ctor_vtbl_p = TYPE_BINFO (t) != binfo;
-
+
fprintf (stream, "%s for %s",
ctor_vtbl_p ? "Construction vtable" : "Vtable",
type_as_string (BINFO_TYPE (binfo), TFF_PLAIN_IDENTIFIER));
@@ -6513,7 +6490,7 @@ dump_vtable (tree t, tree binfo, tree vtable)
dump_array (stream, vtable);
fprintf (stream, "\n");
}
-
+
dump_end (TDI_class, stream);
}
@@ -6533,7 +6510,7 @@ dump_vtt (tree t, tree vtt)
dump_array (stream, vtt);
fprintf (stream, "\n");
}
-
+
dump_end (TDI_class, stream);
}
@@ -6545,7 +6522,7 @@ dump_thunk (FILE *stream, int indent, tree thunk)
static const char spaces[] = " ";
tree name = DECL_NAME (thunk);
tree thunks;
-
+
fprintf (stream, "%.*s%p %s %s", indent, spaces,
(void *)thunk,
!DECL_THUNK_P (thunk) ? "function"
@@ -6598,7 +6575,7 @@ finish_vtbls (tree t)
list = build_tree_list (BINFO_VTABLE (TYPE_BINFO (t)), NULL_TREE);
accumulate_vtbl_inits (TYPE_BINFO (t), TYPE_BINFO (t),
TYPE_BINFO (t), t, list);
-
+
/* Then come the virtual bases, also in inheritance graph order. */
for (vbase = TYPE_BINFO (t); vbase; vbase = TREE_CHAIN (vbase))
{
@@ -6626,7 +6603,7 @@ initialize_vtable (tree binfo, tree inits)
/* Build the VTT (virtual table table) for T.
A class requires a VTT if it has virtual bases.
-
+
This holds
1 - primary virtual pointer for complete object T
2 - secondary VTTs for each direct non-virtual base of T which requires a
@@ -6634,7 +6611,7 @@ initialize_vtable (tree binfo, tree inits)
3 - secondary virtual pointers for each direct or indirect base of T which
has virtual bases or is reachable via a virtual path from T.
4 - secondary VTTs for each direct or indirect virtual base of T.
-
+
Secondary VTTs look like complete object VTTs without part 4. */
static void
@@ -6657,7 +6634,7 @@ build_vtt (tree t)
/* Figure out the type of the VTT. */
type = build_index_type (size_int (list_length (inits) - 1));
type = build_cplus_array_type (const_ptr_type_node, type);
-
+
/* Now, build the VTT object itself. */
vtt = build_vtable (t, get_vtt_name (t), type);
initialize_artificial_var (vtt, inits);
@@ -6750,12 +6727,12 @@ build_vtt_inits (tree binfo, tree t, tree *inits, tree *index)
BINFO_VPTR_INDEX (binfo) = *index;
}
*index = size_binop (PLUS_EXPR, *index, TYPE_SIZE_UNIT (ptr_type_node));
-
+
/* Recursively add the secondary VTTs for non-virtual bases. */
for (i = 0; BINFO_BASE_ITERATE (binfo, i, b); ++i)
if (!BINFO_VIRTUAL_P (b))
inits = build_vtt_inits (b, t, inits, index);
-
+
/* Add secondary virtual pointers for all subobjects of BINFO with
either virtual bases or reachable along a virtual path, except
subobjects that are non-virtual primary bases. */
@@ -6763,7 +6740,7 @@ build_vtt_inits (tree binfo, tree t, tree *inits, tree *index)
data.index = *index;
data.inits = NULL;
data.type_being_constructed = BINFO_TYPE (binfo);
-
+
dfs_walk_once (binfo, dfs_build_secondary_vptr_vtt_inits, NULL, &data);
*index = data.index;
@@ -6786,7 +6763,7 @@ build_vtt_inits (tree binfo, tree t, tree *inits, tree *index)
{
if (!BINFO_VIRTUAL_P (b))
continue;
-
+
inits = build_vtt_inits (b, t, inits, index);
}
else
@@ -6818,11 +6795,11 @@ dfs_build_secondary_vptr_vtt_inits (tree binfo, void *data_)
if (!(CLASSTYPE_VBASECLASSES (BINFO_TYPE (binfo))
|| binfo_via_virtual (binfo, data->type_being_constructed)))
return dfs_skip_bases;
-
+
/* We're not interested in non-virtual primary bases. */
if (!BINFO_VIRTUAL_P (binfo) && BINFO_PRIMARY_P (binfo))
return NULL_TREE;
-
+
/* Record the index where this secondary vptr can be found. */
if (data->top_level_p)
{
@@ -6831,15 +6808,15 @@ dfs_build_secondary_vptr_vtt_inits (tree binfo, void *data_)
if (BINFO_VIRTUAL_P (binfo))
{
- /* It's a primary virtual base, and this is not a
- construction vtable. Find the base this is primary of in
- the inheritance graph, and use that base's vtable
- now. */
+ /* It's a primary virtual base, and this is not a
+ construction vtable. Find the base this is primary of in
+ the inheritance graph, and use that base's vtable
+ now. */
while (BINFO_PRIMARY_P (binfo))
binfo = BINFO_INHERITANCE_CHAIN (binfo);
}
}
-
+
/* Add the initializer for the secondary vptr itself. */
data->inits = tree_cons (NULL_TREE, binfo_ctor_vtable (binfo), data->inits);
@@ -6863,12 +6840,12 @@ dfs_fixup_binfo_vtbls (tree binfo, void* data)
if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo)))
/* If this class has no vtable, none of its bases do. */
return dfs_skip_bases;
-
+
if (!vtable)
/* This might be a primary base, so have no vtable in this
hierarchy. */
return NULL_TREE;
-
+
/* If we scribbled the construction vtable vptr into BINFO, clear it
out now. */
if (TREE_CODE (vtable) == TREE_LIST
@@ -6908,8 +6885,8 @@ build_ctor_vtbl_group (tree binfo, tree t)
/* Add the vtables for each of our virtual bases using the vbase in T
binfo. */
- for (vbase = TYPE_BINFO (BINFO_TYPE (binfo));
- vbase;
+ for (vbase = TYPE_BINFO (BINFO_TYPE (binfo));
+ vbase;
vbase = TREE_CHAIN (vbase))
{
tree b;
@@ -6917,7 +6894,7 @@ build_ctor_vtbl_group (tree binfo, tree t)
if (!BINFO_VIRTUAL_P (vbase))
continue;
b = copied_binfo (vbase, binfo);
-
+
accumulate_vtbl_inits (b, vbase, binfo, t, list);
}
inits = TREE_VALUE (list);
@@ -6945,10 +6922,10 @@ build_ctor_vtbl_group (tree binfo, tree t)
static void
accumulate_vtbl_inits (tree binfo,
- tree orig_binfo,
- tree rtti_binfo,
- tree t,
- tree inits)
+ tree orig_binfo,
+ tree rtti_binfo,
+ tree t,
+ tree inits)
{
int i;
tree base_binfo;
@@ -6959,20 +6936,20 @@ accumulate_vtbl_inits (tree binfo,
/* If it doesn't have a vptr, we don't do anything. */
if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo)))
return;
-
+
/* If we're building a construction vtable, we're not interested in
subobjects that don't require construction vtables. */
- if (ctor_vtbl_p
+ if (ctor_vtbl_p
&& !CLASSTYPE_VBASECLASSES (BINFO_TYPE (binfo))
&& !binfo_via_virtual (orig_binfo, BINFO_TYPE (rtti_binfo)))
return;
/* Build the initializers for the BINFO-in-T vtable. */
- TREE_VALUE (inits)
+ TREE_VALUE (inits)
= chainon (TREE_VALUE (inits),
dfs_accumulate_vtbl_inits (binfo, orig_binfo,
rtti_binfo, t, inits));
-
+
/* Walk the BINFO and its bases. We walk in preorder so that as we
initialize each vtable we can figure out at what offset the
secondary vtable lies from the primary vtable. We can't use
@@ -6995,10 +6972,10 @@ accumulate_vtbl_inits (tree binfo,
static tree
dfs_accumulate_vtbl_inits (tree binfo,
- tree orig_binfo,
- tree rtti_binfo,
- tree t,
- tree l)
+ tree orig_binfo,
+ tree rtti_binfo,
+ tree t,
+ tree l)
{
tree inits = NULL_TREE;
tree vtbl = NULL_TREE;
@@ -7014,14 +6991,14 @@ dfs_accumulate_vtbl_inits (tree binfo,
primary, we still need a VTT entry for the vtable, but it
should point to the ctor vtable for the base it is a
primary for within the sub-hierarchy of RTTI_BINFO.
-
+
There are three possible cases:
-
+
1) We are in the same place.
2) We are a primary base within a lost primary virtual base of
RTTI_BINFO.
3) We are primary to something not a base of RTTI_BINFO. */
-
+
tree b;
tree last = NULL_TREE;
@@ -7041,7 +7018,7 @@ dfs_accumulate_vtbl_inits (tree binfo,
if (BINFO_VIRTUAL_P (b) || b == rtti_binfo)
break;
found:
-
+
/* If we found RTTI_BINFO, this is case 1. If we found a virtual
base B and it is a base of RTTI_BINFO, this is case 2. In
either case, we share our vtable with LAST, i.e. the
@@ -7109,7 +7086,7 @@ static GTY(()) tree abort_fndecl_addr;
The value returned is a TREE_LIST suitable for wrapping in a
CONSTRUCTOR to use as the DECL_INITIAL for a vtable. If
NON_FN_ENTRIES_P is not NULL, *NON_FN_ENTRIES_P is set to the
- number of non-function entries in the vtable.
+ number of non-function entries in the vtable.
It might seem that this function should never be called with a
BINFO for which BINFO_PRIMARY_P holds, the vtable for such a
@@ -7120,10 +7097,10 @@ static GTY(()) tree abort_fndecl_addr;
static tree
build_vtbl_initializer (tree binfo,
- tree orig_binfo,
- tree t,
- tree rtti_binfo,
- int* non_fn_entries_p)
+ tree orig_binfo,
+ tree t,
+ tree rtti_binfo,
+ int* non_fn_entries_p)
{
tree v, b;
tree vfun_inits;
@@ -7131,7 +7108,7 @@ build_vtbl_initializer (tree binfo,
unsigned ix;
tree vbinfo;
VEC(tree,gc) *vbases;
-
+
/* Initialize VID. */
memset (&vid, 0, sizeof (vid));
vid.binfo = binfo;
@@ -7153,7 +7130,7 @@ build_vtbl_initializer (tree binfo,
vid.fns = VEC_alloc (tree, gc, 32);
/* Add the vcall and vbase offset entries. */
build_vcall_and_vbase_vtbl_entries (binfo, &vid);
-
+
/* Clear BINFO_VTABLE_PATH_MARKED; it's set by
build_vbase_offset_vtbl_entries. */
for (vbases = CLASSTYPE_VBASECLASSES (t), ix = 0;
@@ -7191,7 +7168,7 @@ build_vtbl_initializer (tree binfo,
tree vcall_index;
tree fn, fn_original;
tree init = NULL_TREE;
-
+
fn = BV_FN (v);
fn_original = fn;
if (DECL_THUNK_P (fn))
@@ -7205,7 +7182,7 @@ build_vtbl_initializer (tree binfo,
}
fn_original = THUNK_TARGET (fn);
}
-
+
/* If the only definition of this function signature along our
primary base chain is from a lost primary, this vtable slot will
never be used, so just zero it out. This is important to avoid
@@ -7284,13 +7261,13 @@ build_vtbl_initializer (tree binfo,
}
}
else
- vfun_inits = tree_cons (NULL_TREE, init, vfun_inits);
+ vfun_inits = tree_cons (NULL_TREE, init, vfun_inits);
}
/* The initializers for virtual functions were built up in reverse
order; straighten them out now. */
vfun_inits = nreverse (vfun_inits);
-
+
/* The negative offset initializers are also in reverse order. */
vid.inits = nreverse (vid.inits);
@@ -7336,7 +7313,7 @@ build_vbase_offset_vtbl_entries (tree binfo, vtbl_init_data* vid)
return;
t = vid->derived;
-
+
/* We might be a primary base class. Go up the inheritance hierarchy
until we find the most derived class of which we are a primary base:
it is the offset of that which we need to use. */
@@ -7368,7 +7345,7 @@ build_vbase_offset_vtbl_entries (tree binfo, vtbl_init_data* vid)
{
tree b;
tree delta;
-
+
if (!BINFO_VIRTUAL_P (vbase))
continue;
@@ -7383,7 +7360,7 @@ build_vbase_offset_vtbl_entries (tree binfo, vtbl_init_data* vid)
BINFO_VTABLE_PATH_MARKED (b) = 1;
/* Figure out where we can find this vbase offset. */
- delta = size_binop (MULT_EXPR,
+ delta = size_binop (MULT_EXPR,
vid->index,
convert (ssizetype,
TYPE_SIZE_UNIT (vtable_entry_type)));
@@ -7403,10 +7380,10 @@ build_vbase_offset_vtbl_entries (tree binfo, vtbl_init_data* vid)
we are walking in inheritance graph order so these end up in
the right order. */
delta = size_diffop (BINFO_OFFSET (b), BINFO_OFFSET (non_primary_binfo));
-
- *vid->last_init
+
+ *vid->last_init
= build_tree_list (NULL_TREE,
- fold_build1 (NOP_EXPR,
+ fold_build1 (NOP_EXPR,
vtable_entry_type,
delta));
vid->last_init = &TREE_CHAIN (*vid->last_init);
@@ -7468,7 +7445,7 @@ add_vcall_offset_vtbl_entries_r (tree binfo, vtbl_init_data* vid)
through the recursion in build_vcall_and_vbase_vtbl_entries. */
if (BINFO_VIRTUAL_P (binfo) && vid->vbase != binfo)
return;
-
+
/* If BINFO has a primary base, process it first. */
primary_binfo = get_primary_binfo (binfo);
if (primary_binfo)
@@ -7542,7 +7519,7 @@ add_vcall_offset_vtbl_entries_1 (tree binfo, vtbl_init_data* vid)
where rtti_binfo is the most derived type. */
non_primary_binfo
= original_binfo (non_primary_binfo, vid->rtti_binfo);
-
+
for (base_virtuals = BINFO_VIRTUALS (binfo),
derived_virtuals = BINFO_VIRTUALS (non_primary_binfo),
orig_virtuals = BINFO_VIRTUALS (TYPE_BINFO (BINFO_TYPE (binfo)));
@@ -7581,7 +7558,7 @@ add_vcall_offset (tree orig_fn, tree binfo, vtbl_init_data *vid)
signature as FN, then we do not need a second vcall offset.
Check the list of functions already present in the derived
class vtable. */
- for (i = 0; VEC_iterate (tree, vid->fns, i, derived_entry); ++i)
+ for (i = 0; VEC_iterate (tree, vid->fns, i, derived_entry); ++i)
{
if (same_signature_p (derived_entry, orig_fn)
/* We only use one vcall offset for virtual destructors,
@@ -7602,7 +7579,7 @@ add_vcall_offset (tree orig_fn, tree binfo, vtbl_init_data *vid)
elt->purpose = orig_fn;
elt->value = vid->index;
}
-
+
/* The next vcall offset will be found at a more negative
offset. */
vid->index = size_binop (MINUS_EXPR, vid->index,
@@ -7661,7 +7638,7 @@ build_rtti_vtbl_entries (tree binfo, vtbl_init_data* vid)
primary base, and then add the offset in the vtbl to that value. */
b = binfo;
while (CLASSTYPE_HAS_PRIMARY_BASE_P (BINFO_TYPE (b))
- && !BINFO_LOST_PRIMARY_P (b))
+ && !BINFO_LOST_PRIMARY_P (b))
{
tree primary_base;
@@ -7677,7 +7654,7 @@ build_rtti_vtbl_entries (tree binfo, vtbl_init_data* vid)
decl = build_address (get_tinfo_decl (t));
else
decl = integer_zero_node;
-
+
/* Convert the declaration to a type that can be stored in the
vtable. */
init = build_nop (vfunc_ptr_type_node, decl);
diff --git a/gcc/cp/config-lang.in b/gcc/cp/config-lang.in
index 7243f4d6ac9..5614ca4b7bb 100644
--- a/gcc/cp/config-lang.in
+++ b/gcc/cp/config-lang.in
@@ -32,6 +32,6 @@ compilers="cc1plus\$(exeext)"
stagestuff="g++\$(exeext) g++-cross\$(exeext) cc1plus\$(exeext)"
-target_libs="target-libstdc++-v3 target-gperf"
+target_libs="target-libstdc++-v3"
-gtfiles="\$(srcdir)/cp/mangle.c \$(srcdir)/cp/name-lookup.h \$(srcdir)/cp/name-lookup.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.h \$(srcdir)/cp/call.c \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/semantics.c \$(srcdir)/cp/tree.c \$(srcdir)/cp/parser.c \$(srcdir)/cp/method.c \$(srcdir)/cp/typeck2.c \$(srcdir)/c-common.c \$(srcdir)/c-common.h \$(srcdir)/c-lex.c \$(srcdir)/c-pragma.c \$(srcdir)/cp/class.c"
+gtfiles="\$(srcdir)/cp/rtti.c \$(srcdir)/cp/mangle.c \$(srcdir)/cp/name-lookup.h \$(srcdir)/cp/name-lookup.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.h \$(srcdir)/cp/call.c \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/semantics.c \$(srcdir)/cp/tree.c \$(srcdir)/cp/parser.c \$(srcdir)/cp/method.c \$(srcdir)/cp/typeck2.c \$(srcdir)/c-common.c \$(srcdir)/c-common.h \$(srcdir)/c-lex.c \$(srcdir)/c-pragma.c \$(srcdir)/cp/class.c"
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index fc8c1af2d21..785498b9e90 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -409,7 +409,7 @@ cp_gimplify_init_expr (tree *expr_p, tree *pre_p, tree *post_p)
*expr_p = from;
/* The initialization is now a side-effect, so the container can
- become void. */
+ become void. */
if (from != sub)
TREE_TYPE (from) = void_type_node;
}
@@ -557,6 +557,16 @@ cp_gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p)
ret = GS_OK;
break;
+ case UNARY_PLUS_EXPR:
+ {
+ tree arg = TREE_OPERAND (*expr_p, 0);
+ tree type = TREE_TYPE (*expr_p);
+ *expr_p = (TREE_TYPE (arg) != type) ? fold_convert (type, arg)
+ : arg;
+ ret = GS_OK;
+ }
+ break;
+
default:
ret = c_gimplify_expr (expr_p, pre_p, post_p);
break;
@@ -625,7 +635,7 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
CLEANUP_EXPR (stmt));
pointer_set_insert (p_set, *stmt_p);
-
+
return NULL;
}
diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c
index d43c159c01f..3bbe56be32b 100644
--- a/gcc/cp/cp-objcp-common.c
+++ b/gcc/cp/cp-objcp-common.c
@@ -89,17 +89,17 @@ cp_expr_size (tree exp)
/* And, the gimplifier will sometimes make a copy of
an aggregate. In particular, for a case like:
- struct S { S(); };
- struct X { int a; S s; };
- X x = { 0 };
-
- the gimplifier will create a temporary with
- static storage duration, perform static
- initialization of the temporary, and then copy
- the result. Since the "s" subobject is never
- constructed, this is a valid transformation. */
+ struct S { S(); };
+ struct X { int a; S s; };
+ X x = { 0 };
+
+ the gimplifier will create a temporary with
+ static storage duration, perform static
+ initialization of the temporary, and then copy
+ the result. Since the "s" subobject is never
+ constructed, this is a valid transformation. */
|| CP_AGGREGATE_TYPE_P (type));
-
+
/* This would be wrong for a type with virtual bases, but they are
caught by the assert above. */
return (is_empty_class (type)
@@ -118,9 +118,9 @@ cp_tree_size (enum tree_code code)
switch (code)
{
case TINST_LEVEL: return sizeof (struct tinst_level_s);
- case PTRMEM_CST: return sizeof (struct ptrmem_cst);
+ case PTRMEM_CST: return sizeof (struct ptrmem_cst);
case BASELINK: return sizeof (struct tree_baselink);
- case TEMPLATE_PARM_INDEX: return sizeof (template_parm_index);
+ case TEMPLATE_PARM_INDEX: return sizeof (template_parm_index);
case DEFAULT_ARG: return sizeof (struct tree_default_arg);
case OVERLOAD: return sizeof (struct tree_overload);
default:
diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def
index 705517a2e4a..82e39390b56 100644
--- a/gcc/cp/cp-tree.def
+++ b/gcc/cp/cp-tree.def
@@ -1,7 +1,7 @@
/* This file contains the definitions and documentation for the
additional tree codes used in the GNU C++ compiler (see tree.def
for the standard codes).
- Copyright (C) 1987, 1988, 1990, 1993, 1997, 1998, 2003, 2004, 2005,
+ Copyright (C) 1987, 1988, 1990, 1993, 1997, 1998, 2003, 2004, 2005,
1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Hacked by Michael Tiemann (tiemann@cygnus.com)
@@ -22,7 +22,7 @@ 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. */
-
+
/* An OFFSET_REF is used in two situations:
1. An expression of the form `A::m' where `A' is a class and `m' is
@@ -33,7 +33,7 @@ Boston, MA 02111-1307, USA. */
The expression is a pointer-to-member if its address is taken,
but simply denotes a member of the object if its address is not
taken.
-
+
This form is only used during the parsing phase; once semantic
analysis has taken place they are eliminated.
@@ -97,7 +97,7 @@ DEFTREECODE (ALIAS_DECL, "alias_decl", tcc_declaration, 0)
functions. BASELINK_BINFO gives the base from which the functions
come, i.e., the base to which the `this' pointer must be converted
before the functions are called. BASELINK_ACCESS_BINFO gives the
- base used to name the functions.
+ base used to name the functions.
A BASELINK is an expression; the TREE_TYPE of the BASELINK gives
the type of the expression. This type is either a FUNCTION_TYPE,
@@ -108,17 +108,17 @@ DEFTREECODE (BASELINK, "baselink", tcc_exceptional, 0)
/* Template definition. The following fields have the specified uses,
although there are other macros in cp-tree.h that should be used for
accessing this data.
- DECL_ARGUMENTS template parm vector
- DECL_TEMPLATE_INFO template text &c
+ DECL_ARGUMENTS template parm vector
+ DECL_TEMPLATE_INFO template text &c
DECL_VINDEX list of instantiations already produced;
only done for functions so far
For class template:
- DECL_INITIAL associated templates (methods &c)
- DECL_TEMPLATE_RESULT null
+ DECL_INITIAL associated templates (methods &c)
+ DECL_TEMPLATE_RESULT null
For non-class templates:
TREE_TYPE type of object to be constructed
- DECL_TEMPLATE_RESULT decl for object to be created
- (e.g., FUNCTION_DECL with tmpl parms used)
+ DECL_TEMPLATE_RESULT decl for object to be created
+ (e.g., FUNCTION_DECL with tmpl parms used)
*/
DEFTREECODE (TEMPLATE_DECL, "template_decl", tcc_declaration, 0)
@@ -127,14 +127,14 @@ DEFTREECODE (TEMPLATE_DECL, "template_decl", tcc_declaration, 0)
gives the level (from 1) of the parameter.
Here's an example:
-
+
template <class T> // Index 0, Level 1.
struct S
{
template <class U, // Index 0, Level 2.
- class V> // Index 1, Level 2.
+ class V> // Index 1, Level 2.
void f();
- };
+ };
The DESCENDANTS will be a chain of TEMPLATE_PARM_INDEXs descended
from this one. The first descendant will have the same IDX, but
@@ -148,20 +148,20 @@ DEFTREECODE (TEMPLATE_DECL, "template_decl", tcc_declaration, 0)
struct S<int>
{
template <class U, // Index 0, Level 1, Orig Level 2
- class V> // Index 1, Level 1, Orig Level 2
+ class V> // Index 1, Level 1, Orig Level 2
void f();
};
-
+
The LEVEL is the level of the parameter when we are worrying about
the types of things; the ORIG_LEVEL is the level when we are
worrying about instantiating things. */
DEFTREECODE (TEMPLATE_PARM_INDEX, "template_parm_index", tcc_exceptional, 0)
/* Index into a template parameter list for template template parameters.
- This parameter must be a type. The TYPE_FIELDS value will be a
+ This parameter must be a type. The TYPE_FIELDS value will be a
TEMPLATE_PARM_INDEX.
- It is used without template arguments like TT in C<TT>,
+ It is used without template arguments like TT in C<TT>,
TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO is NULL_TREE
and TYPE_NAME is a TEMPLATE_DECL. */
DEFTREECODE (TEMPLATE_TEMPLATE_PARM, "template_template_parm", tcc_type, 0)
@@ -170,7 +170,7 @@ DEFTREECODE (TEMPLATE_TEMPLATE_PARM, "template_template_parm", tcc_type, 0)
macros in tree.h. Changing the order will degrade the speed of the
compiler. TEMPLATE_TYPE_PARM, TYPENAME_TYPE, TYPEOF_TYPE,
BOUND_TEMPLATE_TEMPLATE_PARM. */
-
+
/* Index into a template parameter list. This parameter must be a type.
The type.value field will be a TEMPLATE_PARM_INDEX. */
DEFTREECODE (TEMPLATE_TYPE_PARM, "template_type_parm", tcc_type, 0)
@@ -185,7 +185,7 @@ DEFTREECODE (TYPENAME_TYPE, "typename_type", tcc_type, 0)
expression in question. */
DEFTREECODE (TYPEOF_TYPE, "typeof_type", tcc_type, 0)
-/* Like TEMPLATE_TEMPLATE_PARM it is used with bound template arguments
+/* Like TEMPLATE_TEMPLATE_PARM it is used with bound template arguments
like TT<int>.
In this case, TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO contains the
template name and its bound arguments. TYPE_NAME is a TYPE_DECL. */
@@ -197,16 +197,18 @@ DEFTREECODE (BOUND_TEMPLATE_TEMPLATE_PARM, "bound_template_template_parm",
TYPE_NAME is an IDENTIFIER_NODE for `C', the member class template. */
DEFTREECODE (UNBOUND_CLASS_TEMPLATE, "unbound_class_template", tcc_type, 0)
-/* A using declaration. DECL_INITIAL contains the specified scope.
- This is not an alias, but is later expanded into multiple aliases.
- The decl will have a NULL_TYPE iff the scope is a dependent scope,
- otherwise it will have a void type. */
+/* A using declaration. USING_DECL_SCOPE contains the specified
+ scope. In a member using decl, unless DECL_DEPENDENT_P is true,
+ USING_DECL_DECLS contains the _DECL or OVERLOAD so named. This is
+ not an alias, but is later expanded into multiple aliases. */
DEFTREECODE (USING_DECL, "using_decl", tcc_declaration, 0)
-/* A using directive. The operand is USING_STMT_NAMESPACE. */
+/* A using directive. The operand is USING_STMT_NAMESPACE. */
DEFTREECODE (USING_STMT, "using_directive", tcc_statement, 1)
-/* An un-parsed default argument. Looks like an IDENTIFIER_NODE. */
+/* An un-parsed default argument. Holds a vector of input tokens and
+ a vector of places where the argument was instantiated before
+ parsing had occurred. */
DEFTREECODE (DEFAULT_ARG, "default_arg", tcc_exceptional, 0)
/* A template-id, like foo<int>. The first operand is the template.
@@ -216,7 +218,7 @@ DEFTREECODE (DEFAULT_ARG, "default_arg", tcc_exceptional, 0)
member template, the template may be an IDENTIFIER_NODE. */
DEFTREECODE (TEMPLATE_ID_EXPR, "template_id_expr", tcc_expression, 2)
-/* A list-like node for chaining overloading candidates. TREE_TYPE is
+/* A list-like node for chaining overloading candidates. TREE_TYPE is
the original name, and the parameter is the FUNCTION_DECL. */
DEFTREECODE (OVERLOAD, "overload", tcc_exceptional, 0)
@@ -224,12 +226,12 @@ DEFTREECODE (OVERLOAD, "overload", tcc_exceptional, 0)
"OBJECT.SCOPE::~DESTRUCTOR. The first operand is the OBJECT. The
second operand (if non-NULL) is the SCOPE. The third operand is
the TYPE node corresponding to the DESTRUCTOR. The type of the
- first operand will always be a scalar type.
+ first operand will always be a scalar type.
The type of a PSEUDO_DTOR_EXPR is always "void", even though it can
be used as if it were a zero-argument function. We handle the
function-call case specially, and giving it "void" type prevents it
- being used in expressions in ways that are not permitted. */
+ being used in expressions in ways that are not permitted. */
DEFTREECODE (PSEUDO_DTOR_EXPR, "pseudo_dtor_expr", tcc_expression, 3)
/* A whole bunch of tree codes for the initial, superficial parsing of
@@ -279,7 +281,7 @@ DEFTREECODE (CLEANUP_STMT, "cleanup_stmt", tcc_statement, 3)
/* Represents an 'if' statement. The operands are IF_COND,
THEN_CLAUSE, and ELSE_CLAUSE, respectively. */
-/* ??? It is currently still necessary to distinguish between IF_STMT
+/* ??? It is currently still necessary to distinguish between IF_STMT
and COND_EXPR for the benefit of templates. */
DEFTREECODE (IF_STMT, "if_stmt", tcc_statement, 3)
@@ -340,6 +342,10 @@ DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", tcc_unary, 1)
STMT_EXPR_STMT is the statement given by the expression. */
DEFTREECODE (STMT_EXPR, "stmt_expr", tcc_expression, 1)
+/* Unary plus. Operand 0 is the expression to which the unary plus
+ is applied. */
+DEFTREECODE (UNARY_PLUS_EXPR, "unary_plus_expr", tcc_unary, 1)
+
/*
Local variables:
mode:c
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 1a2399b878f..ef67f6b61b2 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -59,6 +59,7 @@ struct diagnostic_context;
ICS_ELLIPSIS_FLAG (in _CONV)
DECL_INITIALIZED_P (in VAR_DECL)
TYPENAME_IS_CLASS_P (in TYPENAME_TYPE)
+ STMT_IS_FULL_EXPR_P (in _STMT)
2: IDENTIFIER_OPNAME_P (in IDENTIFIER_NODE)
ICS_THIS_FLAG (in _CONV)
DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (in VAR_DECL)
@@ -69,7 +70,7 @@ struct diagnostic_context;
IDENTIFIER_CTOR_OR_DTOR_P (in IDENTIFIER_NODE)
BIND_EXPR_BODY_BLOCK (in BIND_EXPR)
4: TREE_HAS_CONSTRUCTOR (in INDIRECT_REF, SAVE_EXPR, CONSTRUCTOR,
- or FIELD_DECL).
+ or FIELD_DECL).
IDENTIFIER_TYPENAME_P (in IDENTIFIER_NODE)
DECL_TINFO_P (in VAR_DECL)
5: C_IS_RESERVED_WORD (in IDENTIFIER_NODE)
@@ -92,6 +93,7 @@ struct diagnostic_context;
DECL_TEMPLATE_PARM_P (in PARM_DECL, CONST_DECL, TYPE_DECL, or TEMPLATE_DECL)
DECL_LOCAL_FUNCTION_P (in FUNCTION_DECL)
DECL_MUTABLE_P (in FIELD_DECL)
+ DECL_DEPENDENT_P (in USING_DECL)
1: C_TYPEDEF_EXPLICITLY_SIGNED (in TYPE_DECL).
DECL_TEMPLATE_INSTANTIATED (in a VAR_DECL or a FUNCTION_DECL)
DECL_MEMBER_TEMPLATE_P (in TEMPLATE_DECL)
@@ -172,7 +174,7 @@ struct diagnostic_context;
#define NON_THUNK_FUNCTION_CHECK(NODE) __extension__ \
({ const tree __t = (NODE); \
if (TREE_CODE (__t) != FUNCTION_DECL && \
- TREE_CODE (__t) != TEMPLATE_DECL && __t->decl.lang_specific \
+ TREE_CODE (__t) != TEMPLATE_DECL && __t->decl.lang_specific \
&& __t->decl.lang_specific->decl_flags.thunk_p) \
tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, 0); \
__t; })
@@ -180,7 +182,7 @@ struct diagnostic_context;
({ const tree __t = (NODE); \
if (TREE_CODE (__t) != FUNCTION_DECL || !__t->decl.lang_specific \
|| !__t->decl.lang_specific->decl_flags.thunk_p) \
- tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, 0); \
+ tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, 0); \
__t; })
#else
#define NON_THUNK_FUNCTION_CHECK(NODE) (NODE)
@@ -245,7 +247,7 @@ typedef struct ptrmem_cst * ptrmem_cst_t;
#define SET_IDENTIFIER_NAMESPACE_VALUE(NODE, VAL) \
set_namespace_binding ((NODE), current_namespace, (VAL))
-#define CLEANUP_P(NODE) TREE_LANG_FLAG_0 (TRY_BLOCK_CHECK (NODE))
+#define CLEANUP_P(NODE) TREE_LANG_FLAG_0 (TRY_BLOCK_CHECK (NODE))
#define BIND_EXPR_TRY_BLOCK(NODE) \
TREE_LANG_FLAG_0 (BIND_EXPR_CHECK (NODE))
@@ -259,6 +261,11 @@ typedef struct ptrmem_cst * ptrmem_cst_t;
#define STATEMENT_LIST_TRY_BLOCK(NODE) \
TREE_LANG_FLAG_2 (STATEMENT_LIST_CHECK (NODE))
+/* Nonzero if this statement should be considered a full-expression,
+ i.e., if temporaries created during this statement should have
+ their destructors run at the end of this statement. */
+#define STMT_IS_FULL_EXPR_P(NODE) TREE_LANG_FLAG_1 ((NODE))
+
/* Marks the result of a statement expression. */
#define EXPR_STMT_STMT_EXPR_RESULT(NODE) \
TREE_LANG_FLAG_0 (EXPR_STMT_CHECK (NODE))
@@ -284,7 +291,7 @@ typedef struct ptrmem_cst * ptrmem_cst_t;
/* Returns nonzero iff NODE is a declaration for the global function
`main'. */
#define DECL_MAIN_P(NODE) \
- (DECL_EXTERN_C_FUNCTION_P (NODE) \
+ (DECL_EXTERN_C_FUNCTION_P (NODE) \
&& DECL_NAME (NODE) != NULL_TREE \
&& MAIN_NAME_P (DECL_NAME (NODE)))
@@ -293,14 +300,14 @@ typedef struct ptrmem_cst * ptrmem_cst_t;
(((struct tree_overload*)OVERLOAD_CHECK (NODE))->function)
#define OVL_CHAIN(NODE) TREE_CHAIN (NODE)
/* Polymorphic access to FUNCTION and CHAIN. */
-#define OVL_CURRENT(NODE) \
+#define OVL_CURRENT(NODE) \
((TREE_CODE (NODE) == OVERLOAD) ? OVL_FUNCTION (NODE) : (NODE))
-#define OVL_NEXT(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. */
-#define OVL_USED(NODE) TREE_USED (NODE)
+#define OVL_USED(NODE) TREE_USED (NODE)
struct tree_overload GTY(())
{
@@ -418,11 +425,14 @@ typedef enum cp_id_kind
#define DEFARG_TOKENS(NODE) \
(((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->tokens)
+#define DEFARG_INSTANTIATIONS(NODE) \
+ (((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->instantiations)
struct tree_default_arg GTY (())
{
struct tree_common common;
struct cp_token_cache *tokens;
+ VEC(tree,gc) *instantiations;
};
enum cp_tree_node_structure_enum {
@@ -473,18 +483,6 @@ enum cp_tree_index
CPTI_CLEANUP_TYPE,
CPTI_VTT_PARM_TYPE,
- CPTI_TI_DESC_TYPE,
- CPTI_BLTN_DESC_TYPE,
- CPTI_PTR_DESC_TYPE,
- CPTI_ARY_DESC_TYPE,
- CPTI_FUNC_DESC_TYPE,
- CPTI_ENUM_DESC_TYPE,
- CPTI_CLASS_DESC_TYPE,
- CPTI_SI_CLASS_DESC_TYPE,
- CPTI_VMI_CLASS_DESC_TYPE,
- CPTI_PTM_DESC_TYPE,
- CPTI_BASE_DESC_TYPE,
-
CPTI_CLASS_TYPE,
CPTI_UNKNOWN_TYPE,
CPTI_VTBL_TYPE,
@@ -547,26 +545,14 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX];
pointer in pointer-to-member types. */
#define delta_type_node cp_global_trees[CPTI_DELTA_TYPE]
/* The type used to represent an index into the vtable. */
-#define vtable_index_type cp_global_trees[CPTI_VTABLE_INDEX_TYPE]
-
-#define ti_desc_type_node cp_global_trees[CPTI_TI_DESC_TYPE]
-#define bltn_desc_type_node cp_global_trees[CPTI_BLTN_DESC_TYPE]
-#define ptr_desc_type_node cp_global_trees[CPTI_PTR_DESC_TYPE]
-#define ary_desc_type_node cp_global_trees[CPTI_ARY_DESC_TYPE]
-#define func_desc_type_node cp_global_trees[CPTI_FUNC_DESC_TYPE]
-#define enum_desc_type_node cp_global_trees[CPTI_ENUM_DESC_TYPE]
-#define class_desc_type_node cp_global_trees[CPTI_CLASS_DESC_TYPE]
-#define si_class_desc_type_node cp_global_trees[CPTI_SI_CLASS_DESC_TYPE]
-#define vmi_class_desc_type_node cp_global_trees[CPTI_VMI_CLASS_DESC_TYPE]
-#define ptm_desc_type_node cp_global_trees[CPTI_PTM_DESC_TYPE]
-#define base_desc_type_node cp_global_trees[CPTI_BASE_DESC_TYPE]
+#define vtable_index_type cp_global_trees[CPTI_VTABLE_INDEX_TYPE]
#define class_type_node cp_global_trees[CPTI_CLASS_TYPE]
#define unknown_type_node cp_global_trees[CPTI_UNKNOWN_TYPE]
#define vtbl_type_node cp_global_trees[CPTI_VTBL_TYPE]
#define vtbl_ptr_type_node cp_global_trees[CPTI_VTBL_PTR_TYPE]
#define std_node cp_global_trees[CPTI_STD]
-#define abi_node cp_global_trees[CPTI_ABI]
+#define abi_node cp_global_trees[CPTI_ABI]
#define const_type_info_type_node cp_global_trees[CPTI_CONST_TYPE_INFO_TYPE]
#define type_info_ptr_type cp_global_trees[CPTI_TYPE_INFO_PTR_TYPE]
#define abort_fndecl cp_global_trees[CPTI_ABORT_FNDECL]
@@ -578,70 +564,70 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX];
/* The name of a constructor that takes an in-charge parameter to
decide whether or not to construct virtual base classes. */
-#define ctor_identifier cp_global_trees[CPTI_CTOR_IDENTIFIER]
+#define ctor_identifier cp_global_trees[CPTI_CTOR_IDENTIFIER]
/* The name of a constructor that constructs virtual base classes. */
-#define complete_ctor_identifier cp_global_trees[CPTI_COMPLETE_CTOR_IDENTIFIER]
+#define complete_ctor_identifier cp_global_trees[CPTI_COMPLETE_CTOR_IDENTIFIER]
/* The name of a constructor that does not construct virtual base classes. */
-#define base_ctor_identifier cp_global_trees[CPTI_BASE_CTOR_IDENTIFIER]
+#define base_ctor_identifier cp_global_trees[CPTI_BASE_CTOR_IDENTIFIER]
/* The name of a destructor that takes an in-charge parameter to
decide whether or not to destroy virtual base classes and whether
or not to delete the object. */
-#define dtor_identifier cp_global_trees[CPTI_DTOR_IDENTIFIER]
+#define dtor_identifier cp_global_trees[CPTI_DTOR_IDENTIFIER]
/* The name of a destructor that destroys virtual base classes. */
-#define complete_dtor_identifier cp_global_trees[CPTI_COMPLETE_DTOR_IDENTIFIER]
+#define complete_dtor_identifier cp_global_trees[CPTI_COMPLETE_DTOR_IDENTIFIER]
/* The name of a destructor that does not destroy virtual base
classes. */
-#define base_dtor_identifier cp_global_trees[CPTI_BASE_DTOR_IDENTIFIER]
+#define base_dtor_identifier cp_global_trees[CPTI_BASE_DTOR_IDENTIFIER]
/* The name of a destructor that destroys virtual base classes, and
then deletes the entire object. */
-#define deleting_dtor_identifier cp_global_trees[CPTI_DELETING_DTOR_IDENTIFIER]
-#define delta_identifier cp_global_trees[CPTI_DELTA_IDENTIFIER]
-#define in_charge_identifier cp_global_trees[CPTI_IN_CHARGE_IDENTIFIER]
+#define deleting_dtor_identifier cp_global_trees[CPTI_DELETING_DTOR_IDENTIFIER]
+#define delta_identifier cp_global_trees[CPTI_DELTA_IDENTIFIER]
+#define in_charge_identifier cp_global_trees[CPTI_IN_CHARGE_IDENTIFIER]
/* The name of the parameter that contains a pointer to the VTT to use
for this subobject constructor or destructor. */
-#define vtt_parm_identifier cp_global_trees[CPTI_VTT_PARM_IDENTIFIER]
-#define nelts_identifier cp_global_trees[CPTI_NELTS_IDENTIFIER]
-#define this_identifier cp_global_trees[CPTI_THIS_IDENTIFIER]
-#define pfn_identifier cp_global_trees[CPTI_PFN_IDENTIFIER]
-#define vptr_identifier cp_global_trees[CPTI_VPTR_IDENTIFIER]
+#define vtt_parm_identifier cp_global_trees[CPTI_VTT_PARM_IDENTIFIER]
+#define nelts_identifier cp_global_trees[CPTI_NELTS_IDENTIFIER]
+#define this_identifier cp_global_trees[CPTI_THIS_IDENTIFIER]
+#define pfn_identifier cp_global_trees[CPTI_PFN_IDENTIFIER]
+#define vptr_identifier cp_global_trees[CPTI_VPTR_IDENTIFIER]
/* The name of the std namespace. */
-#define std_identifier cp_global_trees[CPTI_STD_IDENTIFIER]
-#define lang_name_c cp_global_trees[CPTI_LANG_NAME_C]
-#define lang_name_cplusplus cp_global_trees[CPTI_LANG_NAME_CPLUSPLUS]
-#define lang_name_java cp_global_trees[CPTI_LANG_NAME_JAVA]
+#define std_identifier cp_global_trees[CPTI_STD_IDENTIFIER]
+#define lang_name_c cp_global_trees[CPTI_LANG_NAME_C]
+#define lang_name_cplusplus cp_global_trees[CPTI_LANG_NAME_CPLUSPLUS]
+#define lang_name_java cp_global_trees[CPTI_LANG_NAME_JAVA]
/* Exception specifier used for throw(). */
-#define empty_except_spec cp_global_trees[CPTI_EMPTY_EXCEPT_SPEC]
+#define empty_except_spec cp_global_trees[CPTI_EMPTY_EXCEPT_SPEC]
/* If non-NULL, a POINTER_TYPE equivalent to (java::lang::Class*). */
-#define jclass_node cp_global_trees[CPTI_JCLASS]
+#define jclass_node cp_global_trees[CPTI_JCLASS]
/* The declaration for `std::terminate'. */
-#define terminate_node cp_global_trees[CPTI_TERMINATE]
+#define terminate_node cp_global_trees[CPTI_TERMINATE]
/* The declaration for "__cxa_call_unexpected". */
-#define call_unexpected_node cp_global_trees[CPTI_CALL_UNEXPECTED]
+#define call_unexpected_node cp_global_trees[CPTI_CALL_UNEXPECTED]
/* A pointer to `std::atexit'. */
-#define atexit_node cp_global_trees[CPTI_ATEXIT]
+#define atexit_node cp_global_trees[CPTI_ATEXIT]
/* A pointer to `__dso_handle'. */
-#define dso_handle_node cp_global_trees[CPTI_DSO_HANDLE]
+#define dso_handle_node cp_global_trees[CPTI_DSO_HANDLE]
/* The declaration of the dynamic_cast runtime. */
-#define dynamic_cast_node cp_global_trees[CPTI_DCAST]
+#define dynamic_cast_node cp_global_trees[CPTI_DCAST]
/* The type of a destructor. */
-#define cleanup_type cp_global_trees[CPTI_CLEANUP_TYPE]
+#define cleanup_type cp_global_trees[CPTI_CLEANUP_TYPE]
/* The type of the vtt parameter passed to subobject constructors and
destructors. */
-#define vtt_parm_type cp_global_trees[CPTI_VTT_PARM_TYPE]
+#define vtt_parm_type cp_global_trees[CPTI_VTT_PARM_TYPE]
/* A TREE_LIST of the dynamic classes whose vtables may have to be
emitted in this translation unit. */
-#define keyed_classes cp_global_trees[CPTI_KEYED_CLASSES]
+#define keyed_classes cp_global_trees[CPTI_KEYED_CLASSES]
/* Node to indicate default access. This must be distinct from the
access nodes in tree.h. */
@@ -818,9 +804,9 @@ struct language_function GTY(())
/* True if NAME is the IDENTIFIER_NODE for an overloaded "operator
new" or "operator delete". */
#define NEW_DELETE_OPNAME_P(NAME) \
- ((NAME) == ansi_opname (NEW_EXPR) \
- || (NAME) == ansi_opname (VEC_NEW_EXPR) \
- || (NAME) == ansi_opname (DELETE_EXPR) \
+ ((NAME) == ansi_opname (NEW_EXPR) \
+ || (NAME) == ansi_opname (VEC_NEW_EXPR) \
+ || (NAME) == ansi_opname (DELETE_EXPR) \
|| (NAME) == ansi_opname (VEC_DELETE_EXPR))
#define ansi_opname(CODE) \
@@ -831,7 +817,7 @@ struct language_function GTY(())
/* True if NODE is an erroneous expression. */
#define error_operand_p(NODE) \
- ((NODE) == error_mark_node \
+ ((NODE) == error_mark_node \
|| ((NODE) && TREE_TYPE ((NODE)) == error_mark_node))
/* C++ language-specific tree codes. */
@@ -953,7 +939,7 @@ enum languages { lang_c, lang_cplusplus, lang_java };
/* Nonzero iff TYPE is publicly & uniquely derived from PARENT. */
#define PUBLICLY_UNIQUELY_DERIVED_P(PARENT, TYPE) \
(lookup_base ((TYPE), (PARENT), ba_ignore_scope | ba_check | ba_quiet, \
- NULL) != NULL_TREE)
+ NULL) != NULL_TREE)
/* Gives the visibility specification for a class type. */
#define CLASSTYPE_VISIBILITY(TYPE) \
@@ -1031,7 +1017,7 @@ struct lang_type_class GTY(())
unsigned java_interface : 1;
unsigned debug_requested : 1;
unsigned fields_readonly : 1;
-
+
unsigned use_template : 2;
unsigned ptrmemfunc_flag : 1;
unsigned was_anonymous : 1;
@@ -1160,7 +1146,7 @@ struct lang_type GTY(())
it has not yet been declared. */
#define CLASSTYPE_LAZY_DESTRUCTOR(NODE) \
(LANG_TYPE_CLASS_CHECK (NODE)->lazy_destructor)
-
+
/* Nonzero means that this _CLASSTYPE node overloads operator=(X&). */
#define TYPE_HAS_ASSIGN_REF(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_assign_ref)
@@ -1519,7 +1505,7 @@ struct lang_decl_flags GTY(())
unsigned initialized_in_class : 1;
unsigned assignment_operator_p : 1;
unsigned u1sel : 1;
-
+
unsigned u2sel : 1;
unsigned can_be_full : 1;
unsigned thunk_p : 1;
@@ -1568,10 +1554,10 @@ struct lang_decl GTY(())
unsigned u3sel : 1;
unsigned pending_inline_p : 1;
unsigned spare : 22;
-
+
/* For a non-thunk function decl, this is a tree list of
- friendly classes. For a thunk function decl, it is the
- thunked to function decl. */
+ friendly classes. For a thunk function decl, it is the
+ thunked to function decl. */
tree befriending_classes;
/* For a non-virtual FUNCTION_DECL, this is
@@ -1587,17 +1573,17 @@ struct lang_decl GTY(())
/* In a non-thunk FUNCTION_DECL or TEMPLATE_DECL, this is
DECL_CLONED_FUNCTION. */
tree GTY ((tag ("0"))) cloned_function;
-
+
/* In a FUNCTION_DECL for which THUNK_P holds this is the
THUNK_FIXED_OFFSET. */
HOST_WIDE_INT GTY ((tag ("1"))) fixed_offset;
} GTY ((desc ("%0.decl_flags.thunk_p"))) u5;
-
+
union lang_decl_u3
{
struct sorted_fields_type * GTY ((tag ("0"), reorder ("resort_sorted_fields")))
sorted_fields;
- struct cp_token_cache * GTY ((tag ("2"))) pending_inline_info;
+ struct cp_token_cache * GTY ((tag ("2"))) pending_inline_info;
struct language_function * GTY ((tag ("1")))
saved_language_function;
} GTY ((desc ("%1.u3sel + %1.pending_inline_p"))) u;
@@ -1629,8 +1615,8 @@ struct lang_decl GTY(())
created by language-independent code, and has C linkage. Most
VAR_DECLs have C++ linkage, and do not have DECL_LANG_SPECIFIC, but
we do create DECL_LANG_SPECIFIC for variables with non-C++ linkage. */
-#define DECL_LANGUAGE(NODE) \
- (DECL_LANG_SPECIFIC (NODE) \
+#define DECL_LANGUAGE(NODE) \
+ (DECL_LANG_SPECIFIC (NODE) \
? DECL_LANG_SPECIFIC (NODE)->decl_flags.language \
: (TREE_CODE (NODE) == FUNCTION_DECL \
? lang_c : lang_cplusplus))
@@ -1711,7 +1697,7 @@ struct lang_decl GTY(())
clones. This macro should be used like:
FOR_EACH_CLONE (clone, fn)
- { ... }
+ { ... }
*/
#define FOR_EACH_CLONE(CLONE, FN) \
@@ -1781,6 +1767,12 @@ struct lang_decl GTY(())
#define DECL_HAS_IN_CHARGE_PARM_P(NODE) \
(DECL_LANG_SPECIFIC (NODE)->decl_flags.has_in_charge_parm_p)
+/* Nonzero if DECL is a declaration of __builtin_constant_p. */
+#define DECL_IS_BUILTIN_CONSTANT_P(NODE) \
+ (TREE_CODE (NODE) == FUNCTION_DECL \
+ && DECL_BUILT_IN_CLASS (NODE) == BUILT_IN_NORMAL \
+ && DECL_FUNCTION_CODE (NODE) == BUILT_IN_CONSTANT_P)
+
/* Nonzero for _DECL means that this decl appears in (or will appear
in) as a member in a RECORD_TYPE or UNION_TYPE node. It is also for
detecting circularity in case members are multiply defined. In the
@@ -1895,7 +1887,7 @@ struct lang_decl GTY(())
(TREE_CODE (NODE) == FUNCTION_DECL \
&& DECL_LANG_SPECIFIC (NODE) \
&& DECL_LANG_SPECIFIC (NODE)->decl_flags.thunk_p)
-
+
/* Set DECL_THUNK_P for node. */
#define SET_DECL_THUNK_P(NODE, THIS_ADJUSTING) \
(DECL_LANG_SPECIFIC (NODE)->decl_flags.thunk_p = 1, \
@@ -2024,6 +2016,15 @@ struct lang_decl GTY(())
directives */
#define TREE_INDIRECT_USING(NODE) (TREE_LIST_CHECK (NODE)->common.lang_flag_0)
+/* Non zero if this is a using decl for a dependent scope. */
+#define DECL_DEPENDENT_P(NODE) DECL_LANG_FLAG_0 (USING_DECL_CHECK (NODE))
+
+/* The scope named in a using decl. */
+#define USING_DECL_SCOPE(NODE) TREE_TYPE (USING_DECL_CHECK (NODE))
+
+/* The decls named by a using decl. */
+#define USING_DECL_DECLS(NODE) DECL_INITIAL (USING_DECL_CHECK (NODE))
+
/* In a VAR_DECL for a variable declared in a for statement,
this is the shadowed (local) variable. */
#define DECL_SHADOWED_FOR_VAR(NODE) DECL_RESULT_FLD(VAR_DECL_CHECK (NODE))
@@ -2111,7 +2112,7 @@ struct lang_decl GTY(())
/* Nonzero if the template arguments is actually a vector of vectors,
rather than just a vector. */
-#define TMPL_ARGS_HAVE_MULTIPLE_LEVELS(NODE) \
+#define TMPL_ARGS_HAVE_MULTIPLE_LEVELS(NODE) \
(NODE && TREE_VEC_ELT (NODE, 0) \
&& TREE_CODE (TREE_VEC_ELT (NODE, 0)) == TREE_VEC)
@@ -2176,7 +2177,7 @@ struct lang_decl GTY(())
DECL_TI_TEMPLATE, the DECL_TI_ARGS will be {int, double}. These
are always the full set of arguments required to instantiate this
declaration from the most general template specialized here. */
-#define DECL_TI_ARGS(NODE) TI_ARGS (DECL_TEMPLATE_INFO (NODE))
+#define DECL_TI_ARGS(NODE) TI_ARGS (DECL_TEMPLATE_INFO (NODE))
#define CLASSTYPE_TI_TEMPLATE(NODE) TI_TEMPLATE (CLASSTYPE_TEMPLATE_INFO (NODE))
#define CLASSTYPE_TI_ARGS(NODE) TI_ARGS (CLASSTYPE_TEMPLATE_INFO (NODE))
@@ -2314,7 +2315,7 @@ struct lang_decl GTY(())
/* Keep these codes in ascending code order. CHAR_TYPE is used here
to completely fill the range. */
-#define INTEGRAL_CODE_P(CODE) \
+#define INTEGRAL_CODE_P(CODE) \
((CODE) == ENUMERAL_TYPE || (CODE) == BOOLEAN_TYPE \
|| (CODE) == CHAR_TYPE || (CODE) == INTEGER_TYPE)
@@ -2414,10 +2415,10 @@ struct lang_decl GTY(())
destructor and if:
- all of the direct base classes of its class have trivial
- destructors,
+ destructors,
- for all of the non-static data members of its class that are
- of class type (or array thereof), each such class has a
+ of class type (or array thereof), each such class has a
trivial destructor. */
#define TYPE_HAS_TRIVIAL_DESTRUCTOR(NODE) \
(!TYPE_HAS_NONTRIVIAL_DESTRUCTOR (NODE))
@@ -2448,23 +2449,23 @@ struct lang_decl GTY(())
/* Returns true if NODE is a pointer to an object. Keep these checks
in ascending tree code order. */
#define TYPE_PTROB_P(NODE) \
- (TYPE_PTR_P (NODE) \
+ (TYPE_PTR_P (NODE) \
&& !(TREE_CODE (TREE_TYPE (NODE)) == VOID_TYPE \
- || TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE \
- || TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE))
+ || TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE \
+ || TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE))
/* Returns true if NODE is a reference to an object. Keep these checks
in ascending tree code order. */
#define TYPE_REF_OBJ_P(NODE) \
(TREE_CODE (NODE) == REFERENCE_TYPE \
&& !(TREE_CODE (TREE_TYPE (NODE)) == VOID_TYPE \
- || TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE \
- || TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE))
+ || TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE \
+ || TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE))
/* Returns true if NODE is a pointer to an object, or a pointer to
void. Keep these checks in ascending tree code order. */
#define TYPE_PTROBV_P(NODE) \
- (TYPE_PTR_P (NODE) \
+ (TYPE_PTR_P (NODE) \
&& !(TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE \
- || TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE))
+ || TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE))
/* Returns true if NODE is a pointer to function. */
#define TYPE_PTRFN_P(NODE) \
(TREE_CODE (NODE) == POINTER_TYPE \
@@ -2511,8 +2512,8 @@ struct lang_decl GTY(())
do { \
if (TYPE_LANG_SPECIFIC (NODE) == NULL) \
{ \
- TYPE_LANG_SPECIFIC (NODE) = GGC_CNEWVAR \
- (struct lang_type, sizeof (struct lang_type_ptrmem)); \
+ TYPE_LANG_SPECIFIC (NODE) = GGC_CNEWVAR \
+ (struct lang_type, sizeof (struct lang_type_ptrmem)); \
TYPE_LANG_SPECIFIC (NODE)->u.ptrmem.h.is_lang_type_class = 0; \
} \
TYPE_LANG_SPECIFIC (NODE)->u.ptrmem.record = (VALUE); \
@@ -2643,7 +2644,7 @@ struct lang_decl GTY(())
arguments are always complete. For example, given:
template <class T> struct S1 {
- template <class U> struct S2 {};
+ template <class U> struct S2 {};
template <class U> struct S2<U*> {};
};
@@ -2662,7 +2663,7 @@ struct lang_decl GTY(())
partial instantiation. For example, given:
template <class T> struct S {
- template <class U> void f(U);
+ template <class U> void f(U);
template <> void f(T);
};
@@ -2892,18 +2893,18 @@ struct lang_decl GTY(())
/* These macros provide convenient access to the various _STMT nodes
created when parsing template declarations. */
-#define TRY_STMTS(NODE) TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 0)
-#define TRY_HANDLERS(NODE) TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 1)
+#define TRY_STMTS(NODE) TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 0)
+#define TRY_HANDLERS(NODE) TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 1)
-#define EH_SPEC_STMTS(NODE) TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 0)
-#define EH_SPEC_RAISES(NODE) TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 1)
+#define EH_SPEC_STMTS(NODE) TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 0)
+#define EH_SPEC_RAISES(NODE) TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 1)
#define USING_STMT_NAMESPACE(NODE) TREE_OPERAND (USING_STMT_CHECK (NODE), 0)
/* Nonzero if this try block is a function try block. */
-#define FN_TRY_BLOCK_P(NODE) TREE_LANG_FLAG_3 (TRY_BLOCK_CHECK (NODE))
-#define HANDLER_PARMS(NODE) TREE_OPERAND (HANDLER_CHECK (NODE), 0)
-#define HANDLER_BODY(NODE) TREE_OPERAND (HANDLER_CHECK (NODE), 1)
+#define FN_TRY_BLOCK_P(NODE) TREE_LANG_FLAG_3 (TRY_BLOCK_CHECK (NODE))
+#define HANDLER_PARMS(NODE) TREE_OPERAND (HANDLER_CHECK (NODE), 0)
+#define HANDLER_BODY(NODE) TREE_OPERAND (HANDLER_CHECK (NODE), 1)
#define HANDLER_TYPE(NODE) TREE_TYPE (HANDLER_CHECK (NODE))
/* CLEANUP_STMT accessors. The statement(s) covered, the cleanup to run
@@ -2915,38 +2916,38 @@ struct lang_decl GTY(())
/* IF_STMT accessors. These give access to the condition of the if
statement, the then block of the if statement, and the else block
of the if statement if it exists. */
-#define IF_COND(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 0)
-#define THEN_CLAUSE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 1)
-#define ELSE_CLAUSE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 2)
+#define IF_COND(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 0)
+#define THEN_CLAUSE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 1)
+#define ELSE_CLAUSE(NODE) TREE_OPERAND (IF_STMT_CHECK (NODE), 2)
/* WHILE_STMT accessors. These give access to the condition of the
while statement and the body of the while statement, respectively. */
-#define WHILE_COND(NODE) TREE_OPERAND (WHILE_STMT_CHECK (NODE), 0)
-#define WHILE_BODY(NODE) TREE_OPERAND (WHILE_STMT_CHECK (NODE), 1)
+#define WHILE_COND(NODE) TREE_OPERAND (WHILE_STMT_CHECK (NODE), 0)
+#define WHILE_BODY(NODE) TREE_OPERAND (WHILE_STMT_CHECK (NODE), 1)
/* DO_STMT accessors. These give access to the condition of the do
statement and the body of the do statement, respectively. */
-#define DO_COND(NODE) TREE_OPERAND (DO_STMT_CHECK (NODE), 0)
-#define DO_BODY(NODE) TREE_OPERAND (DO_STMT_CHECK (NODE), 1)
+#define DO_COND(NODE) TREE_OPERAND (DO_STMT_CHECK (NODE), 0)
+#define DO_BODY(NODE) TREE_OPERAND (DO_STMT_CHECK (NODE), 1)
/* FOR_STMT accessors. These give access to the init statement,
condition, update expression, and body of the for statement,
respectively. */
-#define FOR_INIT_STMT(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 0)
-#define FOR_COND(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 1)
-#define FOR_EXPR(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 2)
-#define FOR_BODY(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 3)
+#define FOR_INIT_STMT(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 0)
+#define FOR_COND(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 1)
+#define FOR_EXPR(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 2)
+#define FOR_BODY(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 3)
#define SWITCH_STMT_COND(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 0)
#define SWITCH_STMT_BODY(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 1)
#define SWITCH_STMT_TYPE(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 2)
/* STMT_EXPR accessor. */
-#define STMT_EXPR_STMT(NODE) TREE_OPERAND (STMT_EXPR_CHECK (NODE), 0)
+#define STMT_EXPR_STMT(NODE) TREE_OPERAND (STMT_EXPR_CHECK (NODE), 0)
/* EXPR_STMT accessor. This gives the expression associated with an
expression statement. */
-#define EXPR_STMT_EXPR(NODE) TREE_OPERAND (EXPR_STMT_CHECK (NODE), 0)
+#define EXPR_STMT_EXPR(NODE) TREE_OPERAND (EXPR_STMT_CHECK (NODE), 0)
/* An enumeration of the kind of tags that C++ accepts. */
enum tag_types {
@@ -2969,20 +2970,20 @@ typedef enum cp_lvalue_kind {
/* Various kinds of template specialization, instantiation, etc. */
typedef enum tmpl_spec_kind {
- tsk_none, /* Not a template at all. */
+ tsk_none, /* Not a template at all. */
tsk_invalid_member_spec, /* An explicit member template
specialization, but the enclosing
classes have not all been explicitly
specialized. */
tsk_invalid_expl_inst, /* An explicit instantiation containing
template parameter lists. */
- tsk_excessive_parms, /* A template declaration with too many
+ tsk_excessive_parms, /* A template declaration with too many
template parameter lists. */
tsk_insufficient_parms, /* A template declaration with too few
parameter lists. */
- tsk_template, /* A template declaration. */
- tsk_expl_spec, /* An explicit specialization. */
- tsk_expl_inst /* An explicit instantiation. */
+ tsk_template, /* A template declaration. */
+ tsk_expl_spec, /* An explicit specialization. */
+ tsk_expl_inst /* An explicit instantiation. */
} tmpl_spec_kind;
/* The various kinds of access. BINFO_ACCESS depends on these being
@@ -2990,28 +2991,28 @@ typedef enum tmpl_spec_kind {
used to initialize RTTI data structures, so changing them changes
the ABI. */
typedef enum access_kind {
- ak_none = 0, /* Inaccessible. */
- ak_public = 1, /* Accessible, as a `public' thing. */
- ak_protected = 2, /* Accessible, as a `protected' thing. */
- ak_private = 3 /* Accessible, as a `private' thing. */
+ ak_none = 0, /* Inaccessible. */
+ ak_public = 1, /* Accessible, as a `public' thing. */
+ ak_protected = 2, /* Accessible, as a `protected' thing. */
+ ak_private = 3 /* Accessible, as a `private' thing. */
} access_kind;
/* The various kinds of special functions. If you add to this list,
you should update special_function_p as well. */
typedef enum special_function_kind {
- sfk_none = 0, /* Not a special function. This enumeral
+ sfk_none = 0, /* Not a special function. This enumeral
must have value zero; see
special_function_p. */
- sfk_constructor, /* A constructor. */
+ sfk_constructor, /* A constructor. */
sfk_copy_constructor, /* A copy constructor. */
sfk_assignment_operator, /* An assignment operator. */
- sfk_destructor, /* A destructor. */
+ sfk_destructor, /* A destructor. */
sfk_complete_destructor, /* A destructor for complete objects. */
sfk_base_destructor, /* A destructor for base subobjects. */
sfk_deleting_destructor, /* A destructor for complete objects that
deletes the object after it has been
destroyed. */
- sfk_conversion /* A conversion operator. */
+ sfk_conversion /* A conversion operator. */
} special_function_kind;
/* The various kinds of linkage. From [basic.link],
@@ -3021,35 +3022,35 @@ typedef enum special_function_kind {
as a name introduced in another scope:
-- When a name has external linkage, the entity it denotes can
- be referred to from scopes of other translation units or from
+ be referred to from scopes of other translation units or from
other scopes of the same translation unit.
-- When a name has internal linkage, the entity it denotes can
- be referred to by names from other scopes in the same
+ be referred to by names from other scopes in the same
translation unit.
-- When a name has no linkage, the entity it denotes cannot be
- referred to by names from other scopes. */
+ referred to by names from other scopes. */
typedef enum linkage_kind {
- lk_none, /* No linkage. */
- lk_internal, /* Internal linkage. */
- lk_external /* External linkage. */
+ lk_none, /* No linkage. */
+ lk_internal, /* Internal linkage. */
+ lk_external /* External linkage. */
} linkage_kind;
/* Bitmask flags to control type substitution. */
typedef enum tsubst_flags_t {
- tf_none = 0, /* nothing special */
- tf_error = 1 << 0, /* give error messages */
- tf_warning = 1 << 1, /* give warnings too */
- tf_ignore_bad_quals = 1 << 2, /* ignore bad cvr qualifiers */
+ tf_none = 0, /* nothing special */
+ tf_error = 1 << 0, /* give error messages */
+ tf_warning = 1 << 1, /* give warnings too */
+ tf_ignore_bad_quals = 1 << 2, /* ignore bad cvr qualifiers */
tf_keep_type_decl = 1 << 3, /* retain typedef type decls
(make_typename_type use) */
- tf_ptrmem_ok = 1 << 4, /* pointers to member ok (internal
+ tf_ptrmem_ok = 1 << 4, /* pointers to member ok (internal
instantiate_type use) */
tf_user = 1 << 5, /* found template must be a user template
(lookup_template_class use) */
- tf_conv = 1 << 6 /* We are determining what kind of
+ tf_conv = 1 << 6 /* We are determining what kind of
conversion might be permissible,
not actually performing the
conversion. */
@@ -3077,11 +3078,11 @@ typedef enum deferring_kind {
Values <0 indicate we failed. */
typedef enum base_kind {
bk_inaccessible = -3, /* The base is inaccessible */
- bk_ambig = -2, /* The base is ambiguous */
- bk_not_base = -1, /* It is not a base */
- bk_same_type = 0, /* It is the same type */
- bk_proper_base = 1, /* It is a proper base */
- bk_via_virtual = 2 /* It is a proper base, but via a virtual
+ bk_ambig = -2, /* The base is ambiguous */
+ bk_not_base = -1, /* It is not a base */
+ bk_same_type = 0, /* It is the same type */
+ 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. */
} base_kind;
@@ -3224,7 +3225,7 @@ extern GTY(()) VEC(tree,gc) *local_classes;
/* Returns nonzero iff NODE is a declaration for the global function
`main'. */
#define DECL_MAIN_P(NODE) \
- (DECL_EXTERN_C_FUNCTION_P (NODE) \
+ (DECL_EXTERN_C_FUNCTION_P (NODE) \
&& DECL_NAME (NODE) != NULL_TREE \
&& MAIN_NAME_P (DECL_NAME (NODE)))
@@ -3328,27 +3329,27 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG };
/* Used with comptypes, and related functions, to guide type
comparison. */
-#define COMPARE_STRICT 0 /* Just check if the types are the
+#define COMPARE_STRICT 0 /* Just check if the types are the
same. */
-#define COMPARE_BASE 1 /* Check to see if the second type is
+#define COMPARE_BASE 1 /* Check to see if the second type is
derived from the first. */
-#define COMPARE_DERIVED 2 /* Like COMPARE_BASE, but in
+#define COMPARE_DERIVED 2 /* Like COMPARE_BASE, but in
reverse. */
#define COMPARE_REDECLARATION 4 /* The comparison is being done when
another declaration of an existing
entity is seen. */
/* Used with push_overloaded_decl. */
-#define PUSH_GLOBAL 0 /* Push the DECL into namespace scope,
+#define PUSH_GLOBAL 0 /* Push the DECL into namespace scope,
regardless of the current scope. */
-#define PUSH_LOCAL 1 /* Push the DECL into the current
+#define PUSH_LOCAL 1 /* Push the DECL into the current
scope. */
-#define PUSH_USING 2 /* We are pushing this DECL as the
+#define PUSH_USING 2 /* We are pushing this DECL as the
result of a using declaration. */
/* Used with start function. */
-#define SF_DEFAULT 0 /* No flags. */
-#define SF_PRE_PARSED 1 /* The function declaration has
+#define SF_DEFAULT 0 /* No flags. */
+#define SF_PRE_PARSED 1 /* The function declaration has
already been parsed. */
#define SF_INCLASS_INLINE 2 /* The function is an inline, defined
in the class body. */
@@ -3399,18 +3400,18 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG };
TFF_EXPR_IN_PARENS: parenthesize expressions.
TFF_NO_FUNCTION_ARGUMENTS: don't show function arguments. */
-#define TFF_PLAIN_IDENTIFIER (0)
-#define TFF_SCOPE (1)
-#define TFF_CHASE_TYPEDEF (1 << 1)
-#define TFF_DECL_SPECIFIERS (1 << 2)
-#define TFF_CLASS_KEY_OR_ENUM (1 << 3)
-#define TFF_RETURN_TYPE (1 << 4)
-#define TFF_FUNCTION_DEFAULT_ARGUMENTS (1 << 5)
-#define TFF_EXCEPTION_SPECIFICATION (1 << 6)
-#define TFF_TEMPLATE_HEADER (1 << 7)
-#define TFF_TEMPLATE_NAME (1 << 8)
-#define TFF_EXPR_IN_PARENS (1 << 9)
-#define TFF_NO_FUNCTION_ARGUMENTS (1 << 10)
+#define TFF_PLAIN_IDENTIFIER (0)
+#define TFF_SCOPE (1)
+#define TFF_CHASE_TYPEDEF (1 << 1)
+#define TFF_DECL_SPECIFIERS (1 << 2)
+#define TFF_CLASS_KEY_OR_ENUM (1 << 3)
+#define TFF_RETURN_TYPE (1 << 4)
+#define TFF_FUNCTION_DEFAULT_ARGUMENTS (1 << 5)
+#define TFF_EXCEPTION_SPECIFICATION (1 << 6)
+#define TFF_TEMPLATE_HEADER (1 << 7)
+#define TFF_TEMPLATE_NAME (1 << 8)
+#define TFF_EXPR_IN_PARENS (1 << 9)
+#define TFF_NO_FUNCTION_ARGUMENTS (1 << 10)
/* Returns the TEMPLATE_DECL associated to a TEMPLATE_TEMPLATE_PARM
node. */
@@ -3567,7 +3568,7 @@ struct cp_declarator {
/* For identifiers. */
struct {
/* If non-NULL, the qualifying scope (a NAMESPACE_DECL or
- *_TYPE) for this identifier. */
+ *_TYPE) for this identifier. */
tree qualifying_scope;
/* The unqualified name of the entity -- an IDENTIFIER_NODE,
BIT_NOT_EXPR, or TEMPLATE_ID_EXPR. */
@@ -3608,54 +3609,55 @@ extern cp_declarator *cp_error_declarator;
extern cp_parameter_declarator *no_parameters;
/* in call.c */
-extern bool check_dtor_name (tree, tree);
+extern bool check_dtor_name (tree, tree);
extern tree build_vfield_ref (tree, tree);
extern tree build_conditional_expr (tree, tree, tree);
-extern tree build_addr_func (tree);
-extern tree build_call (tree, tree);
-extern bool null_ptr_cst_p (tree);
-extern bool sufficient_parms_p (tree);
-extern tree type_decays_to (tree);
-extern tree build_user_type_conversion (tree, tree, int);
-extern tree build_new_function_call (tree, tree);
-extern tree build_operator_new_call (tree, tree, tree *, tree *);
-extern tree build_new_method_call (tree, tree, tree, tree, int);
-extern tree build_special_member_call (tree, tree, tree, tree, int);
-extern tree build_new_op (enum tree_code, int, tree, tree, tree, bool *);
-extern tree build_op_delete_call (enum tree_code, tree, tree, bool, tree);
-extern bool can_convert (tree, tree);
-extern bool can_convert_arg (tree, tree, tree);
-extern bool can_convert_arg_bad (tree, tree, tree);
-extern bool enforce_access (tree, tree);
-extern tree convert_default_arg (tree, tree, tree, int);
-extern tree convert_arg_to_ellipsis (tree);
-extern tree build_x_va_arg (tree, tree);
-extern tree cxx_type_promotes_to (tree);
-extern tree type_passed_as (tree);
-extern tree convert_for_arg_passing (tree, tree);
-extern bool is_properly_derived_from (tree, tree);
-extern tree initialize_reference (tree, tree, tree, tree *);
-extern tree make_temporary_var_for_ref_to_temp (tree, tree);
-extern tree strip_top_quals (tree);
-extern tree perform_implicit_conversion (tree, tree);
+extern tree build_addr_func (tree);
+extern tree build_call (tree, tree);
+extern bool null_ptr_cst_p (tree);
+extern bool sufficient_parms_p (tree);
+extern tree type_decays_to (tree);
+extern tree build_user_type_conversion (tree, tree, int);
+extern tree build_new_function_call (tree, tree);
+extern tree build_operator_new_call (tree, tree, tree *, tree *);
+extern tree build_new_method_call (tree, tree, tree, tree, int);
+extern tree build_special_member_call (tree, tree, tree, tree, int);
+extern tree build_new_op (enum tree_code, int, tree, tree, tree, bool *);
+extern tree build_op_delete_call (enum tree_code, tree, tree, bool, tree);
+extern bool can_convert (tree, tree);
+extern bool can_convert_arg (tree, tree, tree);
+extern bool can_convert_arg_bad (tree, tree, tree);
+extern bool enforce_access (tree, tree);
+extern tree convert_default_arg (tree, tree, tree, int);
+extern tree convert_arg_to_ellipsis (tree);
+extern tree build_x_va_arg (tree, tree);
+extern tree cxx_type_promotes_to (tree);
+extern tree type_passed_as (tree);
+extern tree convert_for_arg_passing (tree, tree);
+extern bool is_properly_derived_from (tree, tree);
+extern tree initialize_reference (tree, tree, tree, tree *);
+extern tree make_temporary_var_for_ref_to_temp (tree, tree);
+extern tree strip_top_quals (tree);
+extern tree perform_implicit_conversion (tree, tree);
extern tree perform_direct_initialization_if_possible (tree, tree, bool);
-extern tree in_charge_arg_for_name (tree);
-extern tree build_cxx_call (tree, tree);
+extern tree in_charge_arg_for_name (tree);
+extern tree build_cxx_call (tree, tree);
#ifdef ENABLE_CHECKING
-extern void validate_conversion_obstack (void);
+extern void validate_conversion_obstack (void);
#endif /* ENABLE_CHECKING */
/* in class.c */
-extern tree build_base_path (enum tree_code, tree, tree, int);
-extern tree convert_to_base (tree, tree, bool, bool);
-extern tree convert_to_base_statically (tree, tree);
+extern tree build_base_path (enum tree_code, tree,
+ tree, int);
+extern tree convert_to_base (tree, tree, bool, bool);
+extern tree convert_to_base_statically (tree, tree);
extern tree build_vtbl_ref (tree, tree);
extern tree build_vfn_ref (tree, tree);
-extern tree get_vtable_decl (tree, int);
-extern void resort_type_method_vec
- (void *, void *, gt_pointer_operator, void *);
-extern void add_method (tree, tree);
+extern tree get_vtable_decl (tree, int);
+extern void resort_type_method_vec (void *, void *,
+ gt_pointer_operator, void *);
+extern void add_method (tree, tree, tree);
extern int currently_open_class (tree);
extern tree currently_open_derived_class (tree);
extern tree finish_struct (tree, tree);
@@ -3671,45 +3673,45 @@ extern int current_lang_depth (void);
extern void push_lang_context (tree);
extern void pop_lang_context (void);
extern tree instantiate_type (tree, tree, tsubst_flags_t);
-extern void print_class_statistics (void);
+extern void print_class_statistics (void);
extern void cxx_print_statistics (void);
-extern void cxx_print_xnode (FILE *, tree, int);
-extern void cxx_print_decl (FILE *, tree, int);
-extern void cxx_print_type (FILE *, tree, int);
-extern void cxx_print_identifier (FILE *, tree, int);
+extern void cxx_print_xnode (FILE *, tree, int);
+extern void cxx_print_decl (FILE *, tree, int);
+extern void cxx_print_type (FILE *, tree, int);
+extern void cxx_print_identifier (FILE *, tree, int);
extern void cxx_print_error_function (struct diagnostic_context *,
const char *);
extern void build_self_reference (void);
extern int same_signature_p (tree, tree);
extern void warn_hidden (tree);
extern void maybe_add_class_template_decl_list (tree, tree, int);
-extern void unreverse_member_declarations (tree);
-extern void invalidate_class_lookup_cache (void);
-extern void maybe_note_name_used_in_class (tree, tree);
-extern void note_name_declared_in_class (tree, tree);
-extern tree get_vtbl_decl_for_binfo (tree);
-extern tree get_vtt_name (tree);
-extern tree get_primary_binfo (tree);
+extern void unreverse_member_declarations (tree);
+extern void invalidate_class_lookup_cache (void);
+extern void maybe_note_name_used_in_class (tree, tree);
+extern void note_name_declared_in_class (tree, tree);
+extern tree get_vtbl_decl_for_binfo (tree);
+extern tree get_vtt_name (tree);
+extern tree get_primary_binfo (tree);
extern void debug_class (tree);
-extern void debug_thunks (tree);
+extern void debug_thunks (tree);
extern tree cp_fold_obj_type_ref (tree, tree);
-extern void set_linkage_according_to_type (tree, tree);
-extern void determine_key_method (tree);
-extern void check_for_override (tree, tree);
+extern void set_linkage_according_to_type (tree, tree);
+extern void determine_key_method (tree);
+extern void check_for_override (tree, tree);
/* in cvt.c */
-extern tree convert_to_reference (tree, tree, int, int, tree);
-extern tree convert_from_reference (tree);
-extern tree force_rvalue (tree);
-extern tree ocp_convert (tree, tree, int, int);
-extern tree cp_convert (tree, tree);
-extern tree convert_to_void (tree, const char */*implicit context*/);
-extern tree convert_force (tree, tree, int);
-extern tree build_type_conversion (tree, tree);
-extern tree build_expr_type_conversion (int, tree, bool);
-extern tree type_promotes_to (tree);
-extern tree perform_qualification_conversions (tree, tree);
-extern void clone_function_decl (tree, int);
+extern tree convert_to_reference (tree, tree, int, int, tree);
+extern tree convert_from_reference (tree);
+extern tree force_rvalue (tree);
+extern tree ocp_convert (tree, tree, int, int);
+extern tree cp_convert (tree, tree);
+extern tree convert_to_void (tree, const char */*implicit context*/);
+extern tree convert_force (tree, tree, int);
+extern tree build_type_conversion (tree, tree);
+extern tree build_expr_type_conversion (int, tree, bool);
+extern tree type_promotes_to (tree);
+extern tree perform_qualification_conversions (tree, tree);
+extern void clone_function_decl (tree, int);
extern void adjust_clone_args (tree);
/* decl.c */
@@ -3718,12 +3720,12 @@ extern void insert_block (tree);
extern tree pushdecl (tree);
extern void cxx_init_decl_processing (void);
enum cp_tree_node_structure_enum cp_tree_node_structure
- (union lang_tree_node *);
+ (union lang_tree_node *);
extern bool cxx_mark_addressable (tree);
extern void cxx_push_function_context (struct function *);
extern void cxx_pop_function_context (struct function *);
-extern void maybe_push_cleanup_level (tree);
-extern void finish_scope (void);
+extern void maybe_push_cleanup_level (tree);
+extern void finish_scope (void);
extern void push_switch (tree);
extern void pop_switch (void);
extern tree pushtag (tree, tree, tag_scope);
@@ -3731,14 +3733,14 @@ extern tree make_anon_name (void);
extern int decls_match (tree, tree);
extern tree duplicate_decls (tree, tree);
extern tree pushdecl_top_level (tree);
-extern tree pushdecl_top_level_and_finish (tree, tree);
-extern tree push_using_decl (tree, tree);
-extern tree declare_local_label (tree);
+extern tree pushdecl_top_level_and_finish (tree, tree);
+extern tree push_using_decl (tree, tree);
+extern tree declare_local_label (tree);
extern tree define_label (location_t, tree);
extern void check_goto (tree);
extern tree make_typename_type (tree, tree, enum tag_types, tsubst_flags_t);
extern tree make_unbound_class_template (tree, tree, tree, tsubst_flags_t);
-extern tree check_for_out_of_scope_variable (tree);
+extern tree check_for_out_of_scope_variable (tree);
extern tree build_library_fn (tree, tree);
extern tree build_library_fn_ptr (const char *, tree);
extern tree build_cp_library_fn_ptr (const char *, tree);
@@ -3754,95 +3756,100 @@ extern void cp_finish_decl (tree, tree, tree, int);
extern void finish_decl (tree, tree, tree);
extern int cp_complete_array_type (tree *, tree, bool);
extern tree build_ptrmemfunc_type (tree);
-extern tree build_ptrmem_type (tree, tree);
+extern tree build_ptrmem_type (tree, tree);
/* the grokdeclarator prototype is in decl.h */
extern int copy_fn_p (tree);
-extern tree get_scope_of_declarator (const cp_declarator *);
+extern tree get_scope_of_declarator (const cp_declarator *);
extern void grok_special_member_properties (tree);
extern int grok_ctor_properties (tree, tree);
-extern void grok_op_properties (tree, int, bool);
+extern void grok_op_properties (tree, bool);
extern tree xref_tag (enum tag_types, tree, tag_scope, bool);
extern tree xref_tag_from_type (tree, tree, tag_scope);
extern void xref_basetypes (tree, tree);
extern tree start_enum (tree);
extern void finish_enum (tree);
extern void build_enumerator (tree, tree, tree);
-extern void start_preparsed_function (tree, tree, int);
+extern void start_preparsed_function (tree, tree, int);
extern int start_function (cp_decl_specifier_seq *, const cp_declarator *, tree);
extern tree begin_function_body (void);
extern void finish_function_body (tree);
extern tree finish_function (int);
extern tree start_method (cp_decl_specifier_seq *, const cp_declarator *, tree);
extern tree finish_method (tree);
-extern void maybe_register_incomplete_var (tree);
+extern void maybe_register_incomplete_var (tree);
extern void complete_vars (tree);
extern void finish_stmt (void);
extern void print_other_binding_stack (struct cp_binding_level *);
-extern void revert_static_member_fn (tree);
-extern void fixup_anonymous_aggr (tree);
-extern int check_static_variable_definition (tree, tree);
+extern void revert_static_member_fn (tree);
+extern void fixup_anonymous_aggr (tree);
+extern int check_static_variable_definition (tree, tree);
extern tree compute_array_index_type (tree, tree);
-extern tree check_default_argument (tree, tree);
-typedef int (*walk_namespaces_fn) (tree, void *);
-extern int walk_namespaces (walk_namespaces_fn,
- void *);
-extern int wrapup_globals_for_namespace (tree, void *);
-extern tree create_implicit_typedef (tree, tree);
-extern tree maybe_push_decl (tree);
+extern tree check_default_argument (tree, tree);
+typedef int (*walk_namespaces_fn) (tree, void *);
+extern int walk_namespaces (walk_namespaces_fn,
+ void *);
+extern int wrapup_globals_for_namespace (tree, void *);
+extern tree create_implicit_typedef (tree, tree);
+extern tree maybe_push_decl (tree);
extern tree force_target_expr (tree, tree);
-extern tree build_target_expr_with_type (tree, tree);
-extern int local_variable_p (tree);
-extern int nonstatic_local_decl_p (tree);
-extern tree declare_global_var (tree, tree);
-extern tree register_dtor_fn (tree);
-extern tmpl_spec_kind current_tmpl_spec_kind (int);
+extern tree build_target_expr_with_type (tree, tree);
+extern int local_variable_p (tree);
+extern int nonstatic_local_decl_p (tree);
+extern tree declare_global_var (tree, tree);
+extern tree register_dtor_fn (tree);
+extern tmpl_spec_kind current_tmpl_spec_kind (int);
extern tree cp_fname_init (const char *, tree *);
-extern tree builtin_function (const char *name, tree type,
- int code,
- enum built_in_class cl,
- const char *libname, tree attrs);
-extern tree check_elaborated_type_specifier (enum tag_types, tree, bool);
-extern void warn_extern_redeclared_static (tree, tree);
-extern const char *cxx_comdat_group (tree);
+extern tree builtin_function (const char *name, tree type,
+ int code,
+ enum built_in_class cl,
+ const char *libname,
+ tree attrs);
+extern tree check_elaborated_type_specifier (enum tag_types, tree, bool);
+extern void warn_extern_redeclared_static (tree, tree);
+extern const char *cxx_comdat_group (tree);
extern bool cp_missing_noreturn_ok_p (tree);
-extern void initialize_artificial_var (tree, tree);
-extern tree check_var_type (tree, tree);
+extern void initialize_artificial_var (tree, tree);
+extern tree check_var_type (tree, tree);
extern bool have_extern_spec;
/* in decl2.c */
-extern bool check_java_method (tree);
-extern cp_cv_quals grok_method_quals (tree, tree, cp_cv_quals);
-extern void maybe_retrofit_in_chrg (tree);
-extern void maybe_make_one_only (tree);
-extern void grokclassfn (tree, tree, enum overload_flags, cp_cv_quals);
-extern tree grok_array_decl (tree, tree);
-extern tree delete_sanity (tree, tree, bool, int);
-extern tree check_classfn (tree, tree, tree);
-extern void check_member_template (tree);
-extern tree grokfield (const cp_declarator *, cp_decl_specifier_seq *, tree, tree, tree);
-extern tree grokbitfield (const cp_declarator *, cp_decl_specifier_seq *, tree);
-extern void cplus_decl_attributes (tree *, tree, int);
-extern void finish_anon_union (tree);
-extern void cp_finish_file (void);
-extern tree coerce_new_type (tree);
-extern tree coerce_delete_type (tree);
-extern void comdat_linkage (tree);
-extern void determine_visibility (tree);
-extern void import_export_decl (tree);
+extern bool check_java_method (tree);
+extern cp_cv_quals grok_method_quals (tree, tree, cp_cv_quals);
+extern void maybe_retrofit_in_chrg (tree);
+extern void maybe_make_one_only (tree);
+extern void grokclassfn (tree, tree,
+ enum overload_flags,
+ cp_cv_quals);
+extern tree grok_array_decl (tree, tree);
+extern tree delete_sanity (tree, tree, bool, int);
+extern tree check_classfn (tree, tree, tree);
+extern void check_member_template (tree);
+extern tree grokfield (const cp_declarator *, cp_decl_specifier_seq *,
+ tree, tree, tree);
+extern tree grokbitfield (const cp_declarator *, cp_decl_specifier_seq *,
+ tree);
+extern void cplus_decl_attributes (tree *, tree, int);
+extern void finish_anon_union (tree);
+extern void cp_finish_file (void);
+extern tree coerce_new_type (tree);
+extern tree coerce_delete_type (tree);
+extern void comdat_linkage (tree);
+extern void determine_visibility (tree);
+extern void import_export_decl (tree);
extern tree build_cleanup (tree);
-extern tree build_offset_ref_call_from_tree (tree, tree);
-extern void check_default_args (tree);
-extern void mark_used (tree);
-extern void finish_static_data_member_decl (tree, tree, tree, int);
-extern tree cp_build_parm_decl (tree, tree);
-extern tree get_guard (tree);
-extern tree get_guard_cond (tree);
-extern tree set_guard (tree);
-extern tree cxx_callgraph_analyze_expr (tree *, int *, tree);
-extern void mark_needed (tree);
-extern bool decl_needed_p (tree);
-extern void note_vague_linkage_fn (tree);
+extern tree build_offset_ref_call_from_tree (tree, tree);
+extern void check_default_args (tree);
+extern void mark_used (tree);
+extern void finish_static_data_member_decl (tree, tree, tree, int);
+extern tree cp_build_parm_decl (tree, tree);
+extern tree get_guard (tree);
+extern tree get_guard_cond (tree);
+extern tree set_guard (tree);
+extern tree cxx_callgraph_analyze_expr (tree *, int *, tree);
+extern void mark_needed (tree);
+extern bool decl_needed_p (tree);
+extern void note_vague_linkage_fn (tree);
/* in error.c */
extern void init_error (void);
@@ -3850,9 +3857,9 @@ extern const char *type_as_string (tree, int);
extern const char *decl_as_string (tree, int);
extern const char *expr_as_string (tree, int);
extern const char *lang_decl_name (tree, int);
-extern const char *language_to_string (enum languages);
-extern const char *class_key_or_enum_as_string (tree);
-extern void print_instantiation_context (void);
+extern const char *language_to_string (enum languages);
+extern const char *class_key_or_enum_as_string (tree);
+extern void print_instantiation_context (void);
/* in except.c */
extern void init_exception_processing (void);
@@ -3869,12 +3876,12 @@ extern tree eh_type_info (tree);
extern rtx cxx_expand_expr (tree, rtx,
enum machine_mode,
int, rtx *);
-extern tree cplus_expand_constant (tree);
+extern tree cplus_expand_constant (tree);
/* friend.c */
extern int is_friend (tree, tree);
extern void make_friend_class (tree, tree, bool);
-extern void add_friend (tree, tree, bool);
+extern void add_friend (tree, tree, bool);
extern tree do_friend (tree, tree, tree, tree, enum overload_flags, cp_cv_quals, int);
/* in init.c */
@@ -3884,76 +3891,84 @@ extern tree build_aggr_init (tree, tree, int);
extern tree build_init (tree, tree, int);
extern int is_aggr_type (tree, int);
extern tree get_type_value (tree);
-extern tree build_zero_init (tree, tree, bool);
+extern tree build_zero_init (tree, tree, bool);
extern tree build_offset_ref (tree, tree, bool);
extern tree build_new (tree, tree, tree, tree, int);
extern tree build_vec_init (tree, tree, tree, int);
extern tree build_x_delete (tree, int, tree);
-extern tree build_delete (tree, tree, special_function_kind, int, int);
+extern tree build_delete (tree, tree,
+ special_function_kind,
+ int, int);
extern void push_base_cleanups (void);
-extern tree build_vec_delete (tree, tree, special_function_kind, int);
-extern tree create_temporary_var (tree);
-extern void initialize_vtbl_ptrs (tree);
-extern tree build_java_class_ref (tree);
-extern tree integral_constant_value (tree);
+extern tree build_vec_delete (tree, tree,
+ special_function_kind, int);
+extern tree create_temporary_var (tree);
+extern void initialize_vtbl_ptrs (tree);
+extern tree build_java_class_ref (tree);
+extern tree integral_constant_value (tree);
/* in lex.c */
extern void cxx_dup_lang_specific_decl (tree);
extern void yyungetc (int, int);
-extern tree unqualified_name_lookup_error (tree);
-extern tree unqualified_fn_lookup_error (tree);
+extern tree unqualified_name_lookup_error (tree);
+extern tree unqualified_fn_lookup_error (tree);
extern tree build_lang_decl (enum tree_code, tree, tree);
extern void retrofit_lang_decl (tree);
-extern tree copy_decl (tree);
-extern tree copy_type (tree);
+extern tree copy_decl (tree);
+extern tree copy_type (tree);
extern tree cxx_make_type (enum tree_code);
extern tree make_aggr_type (enum tree_code);
extern void yyerror (const char *);
extern void yyhook (int);
extern bool cxx_init (void);
-extern void cxx_finish (void);
+extern void cxx_finish (void);
/* in method.c */
-extern void init_method (void);
-extern tree make_thunk (tree, bool, tree, tree);
-extern void finish_thunk (tree);
-extern void use_thunk (tree, bool);
-extern void synthesize_method (tree);
-extern tree implicitly_declare_fn (special_function_kind, tree, bool);
-extern tree lazily_declare_fn (special_function_kind, tree);
-extern tree skip_artificial_parms_for (tree, tree);
+extern void init_method (void);
+extern tree make_thunk (tree, bool, tree, tree);
+extern void finish_thunk (tree);
+extern void use_thunk (tree, bool);
+extern void synthesize_method (tree);
+extern tree implicitly_declare_fn (special_function_kind,
+ tree, bool);
+extern tree lazily_declare_fn (special_function_kind,
+ tree);
+extern tree skip_artificial_parms_for (tree, tree);
+extern tree make_alias_for (tree, tree);
/* In optimize.c */
-extern bool maybe_clone_body (tree);
+extern bool maybe_clone_body (tree);
/* in pt.c */
extern void check_template_shadow (tree);
-extern tree get_innermost_template_args (tree, int);
+extern tree get_innermost_template_args (tree, int);
extern void maybe_begin_member_template_processing (tree);
extern void maybe_end_member_template_processing (void);
-extern tree finish_member_template_decl (tree);
+extern tree finish_member_template_decl (tree);
extern void begin_template_parm_list (void);
-extern void begin_specialization (void);
-extern void reset_specialization (void);
-extern void end_specialization (void);
-extern void begin_explicit_instantiation (void);
-extern void end_explicit_instantiation (void);
-extern tree check_explicit_specialization (tree, tree, int, int);
+extern void begin_specialization (void);
+extern void reset_specialization (void);
+extern void end_specialization (void);
+extern void begin_explicit_instantiation (void);
+extern void end_explicit_instantiation (void);
+extern tree check_explicit_specialization (tree, tree, int, int);
extern tree process_template_parm (tree, tree, bool);
extern tree end_template_parm_list (tree);
extern void end_template_decl (void);
extern tree current_template_args (void);
extern tree push_template_decl (tree);
-extern tree push_template_decl_real (tree, int);
-extern void redeclare_class_template (tree, tree);
-extern tree lookup_template_class (tree, tree, tree, tree, int, tsubst_flags_t);
-extern tree lookup_template_function (tree, tree);
+extern tree push_template_decl_real (tree, int);
+extern void redeclare_class_template (tree, tree);
+extern tree lookup_template_class (tree, tree, tree, tree,
+ int, tsubst_flags_t);
+extern tree lookup_template_function (tree, tree);
extern int uses_template_parms (tree);
extern int uses_template_parms_level (tree, int);
extern tree instantiate_class_template (tree);
extern tree instantiate_template (tree, tree, tsubst_flags_t);
-extern int fn_type_unification (tree, tree, tree, tree, tree, unification_kind_t);
+extern int fn_type_unification (tree, tree, tree, tree,
+ tree, unification_kind_t);
extern void mark_decl_instantiated (tree, int);
extern int more_specialized_fn (tree, tree, int);
extern void mark_class_instantiated (tree, int);
@@ -3963,78 +3978,80 @@ extern tree instantiate_decl (tree, int, int);
extern int push_tinst_level (tree);
extern void pop_tinst_level (void);
extern int more_specialized_class (tree, tree, tree);
-extern int comp_template_parms (tree, tree);
-extern int template_class_depth (tree);
-extern int is_specialization_of (tree, tree);
-extern bool is_specialization_of_friend (tree, tree);
-extern int comp_template_args (tree, tree);
+extern int comp_template_parms (tree, tree);
+extern int template_class_depth (tree);
+extern int is_specialization_of (tree, tree);
+extern bool is_specialization_of_friend (tree, tree);
+extern int comp_template_args (tree, tree);
extern void maybe_process_partial_specialization (tree);
-extern tree most_specialized_instantiation (tree);
-extern void print_candidates (tree);
-extern void instantiate_pending_templates (int);
-extern tree tsubst_default_argument (tree, tree, tree);
-extern tree tsubst_copy_and_build (tree, tree, tsubst_flags_t, tree, bool);
+extern tree most_specialized_instantiation (tree);
+extern void print_candidates (tree);
+extern void instantiate_pending_templates (int);
+extern tree tsubst_default_argument (tree, tree, tree);
+extern tree tsubst_copy_and_build (tree, tree, tsubst_flags_t,
+ tree, bool);
extern tree most_general_template (tree);
extern tree get_mostly_instantiated_function_type (tree);
-extern int problematic_instantiation_changed (void);
+extern int problematic_instantiation_changed (void);
extern void record_last_problematic_instantiation (void);
-extern tree current_instantiation (void);
+extern tree current_instantiation (void);
extern tree maybe_get_template_decl_from_type_decl (tree);
extern int processing_template_parmlist;
-extern bool dependent_type_p (tree);
+extern bool dependent_type_p (tree);
extern bool any_dependent_template_arguments_p (tree);
-extern bool dependent_template_p (tree);
-extern bool dependent_template_id_p (tree, tree);
-extern bool type_dependent_expression_p (tree);
+extern bool dependent_template_p (tree);
+extern bool dependent_template_id_p (tree, tree);
+extern bool type_dependent_expression_p (tree);
extern bool any_type_dependent_arguments_p (tree);
-extern bool value_dependent_expression_p (tree);
-extern tree resolve_typename_type (tree, bool);
-extern tree template_for_substitution (tree);
-extern tree build_non_dependent_expr (tree);
-extern tree build_non_dependent_args (tree);
-extern bool reregister_specialization (tree, tree, tree);
-extern tree fold_non_dependent_expr (tree);
-extern tree fold_decl_constant_value (tree);
+extern bool value_dependent_expression_p (tree);
+extern tree resolve_typename_type (tree, bool);
+extern tree template_for_substitution (tree);
+extern tree build_non_dependent_expr (tree);
+extern tree build_non_dependent_args (tree);
+extern bool reregister_specialization (tree, tree, tree);
+extern tree fold_non_dependent_expr (tree);
+extern tree fold_decl_constant_value (tree);
/* in repo.c */
-extern void init_repo (void);
-extern int repo_emit_p (tree);
-extern bool repo_export_class_p (tree);
-extern void finish_repo (void);
+extern void init_repo (void);
+extern int repo_emit_p (tree);
+extern bool repo_export_class_p (tree);
+extern void finish_repo (void);
/* in rtti.c */
/* A vector of all tinfo decls that haven't been emitted yet. */
extern GTY(()) VEC(tree,gc) *unemitted_tinfo_decls;
-extern void init_rtti_processing (void);
-extern tree build_typeid (tree);
-extern tree get_tinfo_decl (tree);
-extern tree get_typeid (tree);
-extern tree build_dynamic_cast (tree, tree);
-extern void emit_support_tinfos (void);
-extern bool emit_tinfo_decl (tree);
+extern void init_rtti_processing (void);
+extern tree build_typeid (tree);
+extern tree get_tinfo_decl (tree);
+extern tree get_typeid (tree);
+extern tree build_dynamic_cast (tree, tree);
+extern void emit_support_tinfos (void);
+extern bool emit_tinfo_decl (tree);
/* in search.c */
-extern bool accessible_base_p (tree, tree, bool);
-extern tree lookup_base (tree, tree, base_access, base_kind *);
-extern tree dcast_base_hint (tree, tree);
-extern int accessible_p (tree, tree, bool);
-extern tree lookup_field_1 (tree, tree, bool);
+extern bool accessible_base_p (tree, tree, bool);
+extern tree lookup_base (tree, tree, base_access,
+ base_kind *);
+extern tree dcast_base_hint (tree, tree);
+extern int accessible_p (tree, tree, bool);
+extern tree lookup_field_1 (tree, tree, bool);
extern tree lookup_field (tree, tree, int, bool);
-extern int lookup_fnfields_1 (tree, tree);
-extern int class_method_index_for_fn (tree, tree);
+extern int lookup_fnfields_1 (tree, tree);
+extern int class_method_index_for_fn (tree, tree);
extern tree lookup_fnfields (tree, tree, int);
extern tree lookup_member (tree, tree, int, bool);
extern int look_for_overrides (tree, tree);
-extern void get_pure_virtuals (tree);
+extern void get_pure_virtuals (tree);
extern void maybe_suppress_debug_info (tree);
extern void note_debug_info_needed (tree);
extern void print_search_statistics (void);
extern void reinit_search_statistics (void);
extern tree current_scope (void);
-extern int at_function_scope_p (void);
-extern bool at_class_scope_p (void);
-extern bool at_namespace_scope_p (void);
+extern int at_function_scope_p (void);
+extern bool at_class_scope_p (void);
+extern bool at_namespace_scope_p (void);
extern tree context_for_name_lookup (tree);
extern tree lookup_conversions (tree);
extern tree binfo_from_vbase (tree);
@@ -4045,13 +4062,13 @@ extern tree dfs_walk_all (tree, tree (*) (tree, void *),
tree (*) (tree, void *), void *);
extern tree dfs_walk_once (tree, tree (*) (tree, void *),
tree (*) (tree, void *), void *);
-extern tree binfo_via_virtual (tree, tree);
-extern tree build_baselink (tree, tree, tree, tree);
+extern tree binfo_via_virtual (tree, tree);
+extern tree build_baselink (tree, tree, tree, tree);
extern tree adjust_result_of_qualified_name_lookup
- (tree, tree, tree);
+ (tree, tree, tree);
extern tree copied_binfo (tree, tree);
extern tree original_binfo (tree, tree);
-extern int shared_member_p (tree);
+extern int shared_member_p (tree);
/* in semantics.c */
extern void push_deferring_access_checks (deferring_kind);
@@ -4059,118 +4076,119 @@ extern void resume_deferring_access_checks (void);
extern void stop_deferring_access_checks (void);
extern void pop_deferring_access_checks (void);
extern tree get_deferred_access_checks (void);
-extern void pop_to_parent_deferring_access_checks (void);
+extern void pop_to_parent_deferring_access_checks (void);
extern void perform_deferred_access_checks (void);
extern void perform_or_defer_access_check (tree, tree);
-extern void init_cp_semantics (void);
+extern int stmts_are_full_exprs_p (void);
+extern void init_cp_semantics (void);
extern tree do_poplevel (tree);
extern void add_decl_expr (tree);
-extern tree finish_expr_stmt (tree);
-extern tree begin_if_stmt (void);
-extern void finish_if_stmt_cond (tree, tree);
-extern tree finish_then_clause (tree);
+extern tree finish_expr_stmt (tree);
+extern tree begin_if_stmt (void);
+extern void finish_if_stmt_cond (tree, tree);
+extern tree finish_then_clause (tree);
extern void begin_else_clause (tree);
-extern void finish_else_clause (tree);
-extern void finish_if_stmt (tree);
-extern tree begin_while_stmt (void);
-extern void finish_while_stmt_cond (tree, tree);
-extern void finish_while_stmt (tree);
-extern tree begin_do_stmt (void);
-extern void finish_do_body (tree);
-extern void finish_do_stmt (tree, tree);
-extern tree finish_return_stmt (tree);
-extern tree begin_for_stmt (void);
-extern void finish_for_init_stmt (tree);
-extern void finish_for_cond (tree, tree);
-extern void finish_for_expr (tree, tree);
-extern void finish_for_stmt (tree);
-extern tree finish_break_stmt (void);
-extern tree finish_continue_stmt (void);
-extern tree begin_switch_stmt (void);
-extern void finish_switch_cond (tree, tree);
-extern void finish_switch_stmt (tree);
-extern tree finish_case_label (tree, tree);
-extern tree finish_goto_stmt (tree);
-extern tree begin_try_block (void);
-extern void finish_try_block (tree);
+extern void finish_else_clause (tree);
+extern void finish_if_stmt (tree);
+extern tree begin_while_stmt (void);
+extern void finish_while_stmt_cond (tree, tree);
+extern void finish_while_stmt (tree);
+extern tree begin_do_stmt (void);
+extern void finish_do_body (tree);
+extern void finish_do_stmt (tree, tree);
+extern tree finish_return_stmt (tree);
+extern tree begin_for_stmt (void);
+extern void finish_for_init_stmt (tree);
+extern void finish_for_cond (tree, tree);
+extern void finish_for_expr (tree, tree);
+extern void finish_for_stmt (tree);
+extern tree finish_break_stmt (void);
+extern tree finish_continue_stmt (void);
+extern tree begin_switch_stmt (void);
+extern void finish_switch_cond (tree, tree);
+extern void finish_switch_stmt (tree);
+extern tree finish_case_label (tree, tree);
+extern tree finish_goto_stmt (tree);
+extern tree begin_try_block (void);
+extern void finish_try_block (tree);
extern tree begin_eh_spec_block (void);
extern void finish_eh_spec_block (tree, tree);
-extern void finish_handler_sequence (tree);
-extern tree begin_function_try_block (void);
-extern void finish_function_try_block (tree);
+extern void finish_handler_sequence (tree);
+extern tree begin_function_try_block (void);
+extern void finish_function_try_block (tree);
extern void finish_function_handler_sequence (tree);
-extern void finish_cleanup_try_block (tree);
-extern tree begin_handler (void);
-extern void finish_handler_parms (tree, tree);
-extern void finish_handler (tree);
-extern void finish_cleanup (tree, tree);
+extern void finish_cleanup_try_block (tree);
+extern tree begin_handler (void);
+extern void finish_handler_parms (tree, tree);
+extern void finish_handler (tree);
+extern void finish_cleanup (tree, tree);
enum {
BCS_NO_SCOPE = 1,
BCS_TRY_BLOCK = 2,
BCS_FN_BODY = 4
};
-extern tree begin_compound_stmt (unsigned int);
+extern tree begin_compound_stmt (unsigned int);
-extern void finish_compound_stmt (tree);
-extern tree finish_asm_stmt (int, tree, tree, tree, tree);
-extern tree finish_label_stmt (tree);
-extern void finish_label_decl (tree);
-extern tree finish_parenthesized_expr (tree);
+extern void finish_compound_stmt (tree);
+extern tree finish_asm_stmt (int, tree, tree, tree, tree);
+extern tree finish_label_stmt (tree);
+extern void finish_label_decl (tree);
+extern tree finish_parenthesized_expr (tree);
extern tree finish_non_static_data_member (tree, tree, tree);
-extern tree begin_stmt_expr (void);
-extern tree finish_stmt_expr_expr (tree, tree);
-extern tree finish_stmt_expr (tree, bool);
-extern tree perform_koenig_lookup (tree, tree);
-extern tree finish_call_expr (tree, tree, bool, bool);
-extern tree finish_increment_expr (tree, enum tree_code);
-extern tree finish_this_expr (void);
+extern tree begin_stmt_expr (void);
+extern tree finish_stmt_expr_expr (tree, tree);
+extern tree finish_stmt_expr (tree, bool);
+extern tree perform_koenig_lookup (tree, tree);
+extern tree finish_call_expr (tree, tree, bool, bool);
+extern tree finish_increment_expr (tree, enum tree_code);
+extern tree finish_this_expr (void);
extern tree finish_pseudo_destructor_expr (tree, tree, tree);
-extern tree finish_unary_op_expr (enum tree_code, tree);
-extern tree finish_compound_literal (tree, tree);
-extern tree finish_fname (tree);
-extern void finish_translation_unit (void);
-extern tree finish_template_type_parm (tree, tree);
+extern tree finish_unary_op_expr (enum tree_code, tree);
+extern tree finish_compound_literal (tree, tree);
+extern tree finish_fname (tree);
+extern void finish_translation_unit (void);
+extern tree finish_template_type_parm (tree, tree);
extern tree finish_template_template_parm (tree, tree);
-extern tree begin_class_definition (tree);
-extern void finish_template_decl (tree);
-extern tree finish_template_type (tree, tree, int);
-extern tree finish_base_specifier (tree, tree, bool);
-extern void finish_member_declaration (tree);
+extern tree begin_class_definition (tree);
+extern void finish_template_decl (tree);
+extern tree finish_template_type (tree, tree, int);
+extern tree finish_base_specifier (tree, tree, bool);
+extern void finish_member_declaration (tree);
extern void qualified_name_lookup_error (tree, tree, tree);
-extern tree finish_id_expression (tree, tree, tree,
+extern tree finish_id_expression (tree, tree, tree,
cp_id_kind *, tree *,
bool, bool, bool *,
const char **);
extern tree finish_typeof (tree);
-extern void finish_decl_cleanup (tree, tree);
-extern void finish_eh_cleanup (tree);
-extern void expand_body (tree);
-extern void finish_mem_initializers (tree);
+extern void finish_decl_cleanup (tree, tree);
+extern void finish_eh_cleanup (tree);
+extern void expand_body (tree);
+extern void finish_mem_initializers (tree);
extern tree check_template_template_default_arg (tree);
extern void expand_or_defer_fn (tree);
extern void check_accessibility_of_qualified_id (tree, tree, tree);
-extern tree finish_qualified_id_expr (tree, tree, bool, bool);
+extern tree finish_qualified_id_expr (tree, tree, bool, bool);
extern void simplify_aggr_init_expr (tree *);
extern void finalize_nrv (tree *, tree, tree);
-extern void note_decl_for_pch (tree);
+extern void note_decl_for_pch (tree);
/* in tree.c */
extern void lang_check_failed (const char *, int,
- const char *);
+ const char *);
extern tree stabilize_expr (tree, tree *);
extern void stabilize_call (tree, tree *);
extern bool stabilize_init (tree, tree *);
extern tree add_stmt_to_compound (tree, tree);
extern tree cxx_maybe_build_cleanup (tree);
-extern void init_tree (void);
+extern void init_tree (void);
extern int pod_type_p (tree);
extern int zero_init_p (tree);
-extern tree canonical_type_variant (tree);
+extern tree canonical_type_variant (tree);
extern tree copy_binfo (tree, tree, tree,
tree *, int);
extern int member_p (tree);
-extern cp_lvalue_kind real_lvalue_p (tree);
+extern cp_lvalue_kind real_lvalue_p (tree);
extern bool builtin_valid_in_constant_expr_p (tree);
extern tree build_min (enum tree_code, tree, ...);
extern tree build_min_nt (enum tree_code, ...);
@@ -4182,8 +4200,8 @@ extern tree hash_tree_cons (tree, tree, tree);
extern tree hash_tree_chain (tree, tree);
extern int is_overloaded_fn (tree);
extern tree get_first_fn (tree);
-extern tree ovl_cons (tree, tree);
-extern tree build_overload (tree, tree);
+extern tree ovl_cons (tree, tree);
+extern tree build_overload (tree, tree);
extern const char *cxx_printable_name (tree, int);
extern tree build_exception_variant (tree, tree);
extern tree bind_template_template_parm (tree, tree);
@@ -4203,23 +4221,23 @@ extern tree build_dummy_object (tree);
extern tree maybe_dummy_object (tree, tree *);
extern int is_dummy_object (tree);
extern const struct attribute_spec cxx_attribute_table[];
-extern tree make_ptrmem_cst (tree, tree);
+extern tree make_ptrmem_cst (tree, tree);
extern tree cp_build_type_attribute_variant (tree, tree);
-extern tree cp_build_qualified_type_real (tree, int, tsubst_flags_t);
+extern tree cp_build_qualified_type_real (tree, int, tsubst_flags_t);
#define cp_build_qualified_type(TYPE, QUALS) \
cp_build_qualified_type_real ((TYPE), (QUALS), tf_error | tf_warning)
extern special_function_kind special_function_p (tree);
-extern int count_trees (tree);
-extern int char_type_p (tree);
-extern void verify_stmt_tree (tree);
-extern tree find_tree (tree, tree);
-extern linkage_kind decl_linkage (tree);
+extern int count_trees (tree);
+extern int char_type_p (tree);
+extern void verify_stmt_tree (tree);
+extern tree find_tree (tree, tree);
+extern linkage_kind decl_linkage (tree);
extern tree cp_walk_subtrees (tree*, int*, walk_tree_fn,
- void*, struct pointer_set_t*);
-extern int cp_cannot_inline_tree_fn (tree*);
-extern tree cp_add_pending_fn_decls (void*,tree);
-extern int cp_auto_var_in_fn_p (tree,tree);
-extern tree fold_if_not_in_template (tree);
+ void*, struct pointer_set_t*);
+extern int cp_cannot_inline_tree_fn (tree*);
+extern tree cp_add_pending_fn_decls (void*,tree);
+extern int cp_auto_var_in_fn_p (tree,tree);
+extern tree fold_if_not_in_template (tree);
/* in typeck.c */
extern int string_conv_p (tree, tree, int);
@@ -4233,14 +4251,14 @@ extern tree original_type (tree);
extern bool comp_except_specs (tree, tree, bool);
extern bool comptypes (tree, tree, int);
extern bool compparms (tree, tree);
-extern int comp_cv_qualification (tree, tree);
-extern int comp_cv_qual_signature (tree, tree);
-extern tree cxx_sizeof_or_alignof_expr (tree, enum tree_code);
-extern tree cxx_sizeof_or_alignof_type (tree, enum tree_code, bool);
+extern int comp_cv_qualification (tree, tree);
+extern int comp_cv_qual_signature (tree, tree);
+extern tree cxx_sizeof_or_alignof_expr (tree, enum tree_code);
+extern tree cxx_sizeof_or_alignof_type (tree, enum tree_code, bool);
#define cxx_sizeof_nowarn(T) cxx_sizeof_or_alignof_type (T, SIZEOF_EXPR, false)
extern tree inline_conversion (tree);
extern tree decay_conversion (tree);
-extern tree default_conversion (tree);
+extern tree default_conversion (tree);
extern tree build_class_member_access_expr (tree, tree, tree, bool);
extern tree finish_class_member_access_expr (tree, tree);
extern tree build_x_indirect_ref (tree, const char *);
@@ -4252,7 +4270,7 @@ extern tree build_x_binary_op (enum tree_code, tree, tree,
extern tree build_x_unary_op (enum tree_code, tree);
extern tree unary_complex_lvalue (enum tree_code, tree);
extern tree build_x_conditional_expr (tree, tree, tree);
-extern tree build_x_compound_expr_from_list (tree, const char *);
+extern tree build_x_compound_expr_from_list (tree, const char *);
extern tree build_x_compound_expr (tree, tree);
extern tree build_compound_expr (tree, tree);
extern tree build_static_cast (tree, tree);
@@ -4261,35 +4279,36 @@ extern tree build_const_cast (tree, tree);
extern tree build_c_cast (tree, tree);
extern tree build_x_modify_expr (tree, enum tree_code, tree);
extern tree build_modify_expr (tree, enum tree_code, tree);
-extern tree convert_for_initialization (tree, tree, tree, int, const char *, tree, int);
+extern tree convert_for_initialization (tree, tree, tree, int,
+ const char *, tree, int);
extern int comp_ptr_ttypes (tree, tree);
extern int ptr_reasonably_similar (tree, tree);
extern tree build_ptrmemfunc (tree, tree, int, bool);
-extern int cp_type_quals (tree);
-extern bool cp_has_mutable_p (tree);
-extern bool at_least_as_qualified_p (tree, tree);
-extern void cp_apply_type_quals_to_decl (int, tree);
-extern tree build_ptrmemfunc1 (tree, tree, tree);
-extern void expand_ptrmemfunc_cst (tree, tree *, tree *);
-extern tree pfn_from_ptrmemfunc (tree);
+extern int cp_type_quals (tree);
+extern bool cp_has_mutable_p (tree);
+extern bool at_least_as_qualified_p (tree, tree);
+extern void cp_apply_type_quals_to_decl (int, tree);
+extern tree build_ptrmemfunc1 (tree, tree, tree);
+extern void expand_ptrmemfunc_cst (tree, tree *, tree *);
+extern tree pfn_from_ptrmemfunc (tree);
extern tree type_after_usual_arithmetic_conversions (tree, tree);
-extern tree composite_pointer_type (tree, tree, tree, tree,
- const char*);
+extern tree composite_pointer_type (tree, tree, tree, tree,
+ const char*);
extern tree merge_types (tree, tree);
-extern tree check_return_expr (tree);
+extern tree check_return_expr (tree);
#define cp_build_binary_op(code, arg1, arg2) \
build_binary_op(code, arg1, arg2, 1)
#define cxx_sizeof(T) cxx_sizeof_or_alignof_type (T, SIZEOF_EXPR, true)
-extern tree build_ptrmemfunc_access_expr (tree, tree);
-extern tree build_address (tree);
-extern tree build_nop (tree, tree);
-extern tree non_reference (tree);
-extern tree lookup_anon_field (tree, tree);
-extern bool invalid_nonstatic_memfn_p (tree);
-extern tree convert_member_func_to_ptr (tree, tree);
-extern tree convert_ptrmem (tree, tree, bool, bool);
-extern int lvalue_or_else (tree, enum lvalue_use);
-extern int lvalue_p (tree);
+extern tree build_ptrmemfunc_access_expr (tree, tree);
+extern tree build_address (tree);
+extern tree build_nop (tree, tree);
+extern tree non_reference (tree);
+extern tree lookup_anon_field (tree, tree);
+extern bool invalid_nonstatic_memfn_p (tree);
+extern tree convert_member_func_to_ptr (tree, tree);
+extern tree convert_ptrmem (tree, tree, bool, bool);
+extern int lvalue_or_else (tree, enum lvalue_use);
+extern int lvalue_p (tree);
/* in typeck2.c */
extern void require_complete_eh_spec_types (tree, tree);
@@ -4310,38 +4329,38 @@ extern tree build_scoped_ref (tree, tree, tree *);
extern tree build_x_arrow (tree);
extern tree build_m_component_ref (tree, tree);
extern tree build_functional_cast (tree, tree);
-extern tree add_exception_specifier (tree, tree, int);
-extern tree merge_exception_specifiers (tree, tree);
+extern tree add_exception_specifier (tree, tree, int);
+extern tree merge_exception_specifiers (tree, tree);
/* in mangle.c */
-extern void init_mangle (void);
-extern void mangle_decl (tree);
-extern const char *mangle_type_string (tree);
-extern tree mangle_typeinfo_for_type (tree);
-extern tree mangle_typeinfo_string_for_type (tree);
-extern tree mangle_vtbl_for_type (tree);
-extern tree mangle_vtt_for_type (tree);
-extern tree mangle_ctor_vtbl_for_type (tree, tree);
-extern tree mangle_thunk (tree, int, tree, tree);
-extern tree mangle_conv_op_name_for_type (tree);
-extern tree mangle_guard_variable (tree);
-extern tree mangle_ref_init_variable (tree);
+extern void init_mangle (void);
+extern void mangle_decl (tree);
+extern const char *mangle_type_string (tree);
+extern tree mangle_typeinfo_for_type (tree);
+extern tree mangle_typeinfo_string_for_type (tree);
+extern tree mangle_vtbl_for_type (tree);
+extern tree mangle_vtt_for_type (tree);
+extern tree mangle_ctor_vtbl_for_type (tree, tree);
+extern tree mangle_thunk (tree, int, tree, tree);
+extern tree mangle_conv_op_name_for_type (tree);
+extern tree mangle_guard_variable (tree);
+extern tree mangle_ref_init_variable (tree);
/* in dump.c */
-extern bool cp_dump_tree (void *, tree);
+extern bool cp_dump_tree (void *, tree);
/* In cp/cp-objcp-common.c. */
-extern HOST_WIDE_INT cxx_get_alias_set (tree);
-extern bool cxx_warn_unused_global_decl (tree);
-extern tree cp_expr_size (tree);
-extern size_t cp_tree_size (enum tree_code);
-extern bool cp_var_mod_type_p (tree, tree);
-extern void cxx_initialize_diagnostics (struct diagnostic_context *);
-extern int cxx_types_compatible_p (tree, tree);
+extern HOST_WIDE_INT cxx_get_alias_set (tree);
+extern bool cxx_warn_unused_global_decl (tree);
+extern tree cp_expr_size (tree);
+extern size_t cp_tree_size (enum tree_code);
+extern bool cp_var_mod_type_p (tree, tree);
+extern void cxx_initialize_diagnostics (struct diagnostic_context *);
+extern int cxx_types_compatible_p (tree, tree);
/* in cp-gimplify.c */
-extern int cp_gimplify_expr (tree *, tree *, tree *);
+extern int cp_gimplify_expr (tree *, tree *, tree *);
extern void cp_genericize (tree);
/* -- end of C++ */
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index 5150fcf5548..c1eafe79f7c 100644
--- a/gcc/cp/cvt.c
+++ b/gcc/cp/cvt.c
@@ -54,7 +54,7 @@ static void warn_ref_binding (tree, tree, tree);
narrowing is always done with a NOP_EXPR:
In convert.c, convert_to_integer.
In c-typeck.c, build_binary_op_nodefault (boolean ops),
- and c_common_truthvalue_conversion.
+ and c_common_truthvalue_conversion.
In expr.c: expand_expr, for operands of a MULT_EXPR.
In fold-const.c: fold.
In tree.c: get_narrower and get_unwidened.
@@ -88,7 +88,7 @@ cp_convert_to_pointer (tree type, tree expr, bool force)
if (!COMPLETE_TYPE_P (intype))
{
error ("can't convert from incomplete type %qT to %qT",
- intype, type);
+ intype, type);
return error_mark_node;
}
@@ -97,7 +97,7 @@ cp_convert_to_pointer (tree type, tree expr, bool force)
{
if (rval == error_mark_node)
error ("conversion of %qE from %qT to %qT is ambiguous",
- expr, intype, type);
+ expr, intype, type);
return rval;
}
}
@@ -140,7 +140,7 @@ cp_convert_to_pointer (tree type, tree expr, bool force)
intype_class = TREE_TYPE (intype);
type_class = TREE_TYPE (type);
- same_p = same_type_p (TYPE_MAIN_VARIANT (intype_class),
+ same_p = same_type_p (TYPE_MAIN_VARIANT (intype_class),
TYPE_MAIN_VARIANT (type_class));
binfo = NULL_TREE;
/* Try derived to base conversion. */
@@ -166,7 +166,7 @@ cp_convert_to_pointer (tree type, tree expr, bool force)
if (TYPE_PTRMEMFUNC_P (type))
{
error ("cannot convert %qE from type %qT to type %qT",
- expr, intype, type);
+ expr, intype, type);
return error_mark_node;
}
@@ -174,7 +174,7 @@ cp_convert_to_pointer (tree type, tree expr, bool force)
}
else if (TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
{
- tree b1;
+ tree b1;
tree b2;
tree binfo;
enum tree_code code = PLUS_EXPR;
@@ -195,11 +195,11 @@ cp_convert_to_pointer (tree type, tree expr, bool force)
{
if (force)
warning (0, "pointer to member cast from %qT to %qT is via"
- " virtual base", intype, type);
+ " virtual base", intype, type);
else
{
error ("pointer to member cast from %qT to %qT is"
- " via virtual base", intype, type);
+ " via virtual base", intype, type);
return error_mark_node;
}
/* This is a reinterpret cast, whose result is unspecified.
@@ -211,7 +211,7 @@ cp_convert_to_pointer (tree type, tree expr, bool force)
expr = cplus_expand_constant (expr);
if (binfo && !integer_zerop (BINFO_OFFSET (binfo)))
- expr = size_binop (code,
+ expr = size_binop (code,
build_nop (sizetype, expr),
BINFO_OFFSET (binfo));
return build_nop (type, expr);
@@ -235,7 +235,7 @@ cp_convert_to_pointer (tree type, tree expr, bool force)
}
}
error ("cannot convert %qE from type %qT to type %qT",
- expr, intype, type);
+ expr, intype, type);
return error_mark_node;
}
@@ -255,7 +255,7 @@ cp_convert_to_pointer (tree type, tree expr, bool force)
}
else
expr = build_int_cst (type, 0);
-
+
return expr;
}
else if (TYPE_PTR_TO_MEMBER_P (type) && INTEGRAL_CODE_P (form))
@@ -274,7 +274,7 @@ cp_convert_to_pointer (tree type, tree expr, bool force)
as a pointer. */
gcc_assert (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (expr)))
== GET_MODE_SIZE (TYPE_MODE (type)));
-
+
return convert_to_pointer (type, expr);
}
@@ -282,7 +282,7 @@ cp_convert_to_pointer (tree type, tree expr, bool force)
return instantiate_type (type, expr, tf_error | tf_warning);
error ("cannot convert %qE from type %qT to type %qT",
- expr, intype, type);
+ expr, intype, type);
return error_mark_node;
}
@@ -295,7 +295,7 @@ convert_to_pointer_force (tree type, tree expr)
{
tree intype = TREE_TYPE (expr);
enum tree_code form = TREE_CODE (intype);
-
+
if (form == POINTER_TYPE)
{
intype = TYPE_MAIN_VARIANT (intype);
@@ -322,8 +322,8 @@ convert_to_pointer_force (tree type, tree expr)
if (binfo)
{
expr = build_base_path (code, expr, binfo, 0);
- if (expr == error_mark_node)
- return error_mark_node;
+ if (expr == error_mark_node)
+ return error_mark_node;
/* Add any qualifier conversions. */
if (!same_type_p (TREE_TYPE (TREE_TYPE (expr)),
TREE_TYPE (type)))
@@ -363,7 +363,7 @@ build_up_reference (tree type, tree arg, int flags, tree decl)
/* Process the initializer for the declaration. */
DECL_INITIAL (arg) = targ;
- cp_finish_decl (arg, targ, NULL_TREE,
+ cp_finish_decl (arg, targ, NULL_TREE,
LOOKUP_ONLYCONVERTING|DIRECT_BIND);
}
else if (!(flags & DIRECT_BIND) && ! lvalue_p (arg))
@@ -398,7 +398,7 @@ build_up_reference (tree type, tree arg, int flags, tree decl)
/* Subroutine of convert_to_reference. REFTYPE is the target reference type.
INTYPE is the original rvalue type and DECL is an optional _DECL node
for diagnostics.
-
+
[dcl.init.ref] says that if an rvalue is used to
initialize a reference, then the reference must be to a
non-volatile const type. */
@@ -407,23 +407,23 @@ static void
warn_ref_binding (tree reftype, tree intype, tree decl)
{
tree ttl = TREE_TYPE (reftype);
-
+
if (!CP_TYPE_CONST_NON_VOLATILE_P (ttl))
{
const char *msg;
if (CP_TYPE_VOLATILE_P (ttl) && decl)
msg = "initialization of volatile reference type %q#T from"
- " rvalue of type %qT";
+ " rvalue of type %qT";
else if (CP_TYPE_VOLATILE_P (ttl))
msg = "conversion to volatile reference type %q#T "
- " from rvalue of type %qT";
+ " from rvalue of type %qT";
else if (decl)
msg = "initialization of non-const reference type %q#T from"
- " rvalue of type %qT";
+ " rvalue of type %qT";
else
msg = "conversion to non-const reference type %q#T from"
- " rvalue of type %qT";
+ " rvalue of type %qT";
pedwarn (msg, reftype, intype);
}
@@ -438,7 +438,7 @@ warn_ref_binding (tree reftype, tree intype, tree decl)
tree
convert_to_reference (tree reftype, tree expr, int convtype,
- int flags, tree decl)
+ int flags, tree decl)
{
tree type = TYPE_MAIN_VARIANT (TREE_TYPE (reftype));
tree intype;
@@ -446,9 +446,9 @@ convert_to_reference (tree reftype, tree expr, int convtype,
tree rval_as_conversion = NULL_TREE;
bool can_convert_intype_to_type;
- if (TREE_CODE (type) == FUNCTION_TYPE
+ if (TREE_CODE (type) == FUNCTION_TYPE
&& TREE_TYPE (expr) == unknown_type_node)
- expr = instantiate_type (type, expr,
+ expr = instantiate_type (type, expr,
(flags & LOOKUP_COMPLAIN)
? tf_error | tf_warning : tf_none);
@@ -491,11 +491,11 @@ convert_to_reference (tree reftype, tree expr, int convtype,
if (! real_lvalue_p (expr))
warn_ref_binding (reftype, intype, decl);
-
+
if (! (convtype & CONV_CONST)
&& !at_least_as_qualified_p (ttl, ttr))
pedwarn ("conversion from %qT to %qT discards qualifiers",
- ttr, reftype);
+ ttr, reftype);
}
return build_up_reference (reftype, expr, flags, decl);
@@ -508,13 +508,13 @@ convert_to_reference (tree reftype, tree expr, int convtype,
should be done directly (jason). (int &)ri ---> *(int*)&ri */
/* B* bp; A& ar = (A&)bp; is valid, but it's probably not what they
- meant. */
+ meant. */
if (TREE_CODE (intype) == POINTER_TYPE
&& (comptypes (TREE_TYPE (intype), type,
COMPARE_BASE | COMPARE_DERIVED)))
warning (0, "casting %qT to %qT does not dereference pointer",
intype, reftype);
-
+
rval = build_unary_op (ADDR_EXPR, expr, 0);
if (rval != error_mark_node)
rval = convert_force (build_pointer_type (TREE_TYPE (reftype)),
@@ -554,7 +554,7 @@ convert_from_reference (tree val)
{
tree t = canonical_type_variant (TREE_TYPE (TREE_TYPE (val)));
tree ref = build1 (INDIRECT_REF, t, val);
-
+
/* We *must* set TREE_READONLY when dereferencing a pointer to const,
so that we get the proper error message if the result is used
to assign to. Also, &* is supposed to be a no-op. */
@@ -565,7 +565,7 @@ convert_from_reference (tree val)
REFERENCE_REF_P (ref) = 1;
val = ref;
}
-
+
return val;
}
@@ -627,9 +627,9 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
convert, which will call ocp_convert, etc. */
return e;
/* For complex data types, we need to perform componentwise
- conversion. */
+ conversion. */
else if (TREE_CODE (type) == COMPLEX_TYPE)
- return fold_if_not_in_template (convert_to_complex (type, e));
+ return fold_if_not_in_template (convert_to_complex (type, e));
else if (TREE_CODE (e) == TARGET_EXPR)
{
/* Don't build a NOP_EXPR of class type. Instead, change the
@@ -659,10 +659,10 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
{
tree intype = TREE_TYPE (e);
/* enum = enum, enum = int, enum = float, (enum)pointer are all
- errors. */
+ errors. */
if (TREE_CODE (type) == ENUMERAL_TYPE
&& (((INTEGRAL_OR_ENUMERATION_TYPE_P (intype)
- || TREE_CODE (intype) == REAL_TYPE)
+ || TREE_CODE (intype) == REAL_TYPE)
&& ! (convtype & CONV_STATIC))
|| TREE_CODE (intype) == POINTER_TYPE))
{
@@ -696,11 +696,11 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
{
tree ret_val;
ret_val = build_type_conversion (type, e);
- if (ret_val)
- return ret_val;
- if (flags & LOOKUP_COMPLAIN)
- error ("%q#T used where a %qT was expected", in_vtype, type);
- return error_mark_node;
+ if (ret_val)
+ return ret_val;
+ if (flags & LOOKUP_COMPLAIN)
+ error ("%q#T used where a %qT was expected", in_vtype, type);
+ return error_mark_node;
}
return fold_if_not_in_template (convert_to_vector (type, e));
}
@@ -752,7 +752,7 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
the target with the temp (see [dcl.init]). */
ctor = build_user_type_conversion (type, ctor, flags);
else
- ctor = build_special_member_call (NULL_TREE,
+ ctor = build_special_member_call (NULL_TREE,
complete_ctor_identifier,
build_tree_list (NULL_TREE, ctor),
type, flags);
@@ -762,7 +762,7 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
if (flags & LOOKUP_COMPLAIN)
error ("conversion from %qT to non-scalar type %qT requested",
- TREE_TYPE (expr), type);
+ TREE_TYPE (expr), type);
return error_mark_node;
}
@@ -780,13 +780,13 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
volatile references we do not do this interpretation, because that would
make it impossible to ignore the reference return value from functions. We
issue warnings in the confusing cases.
-
+
IMPLICIT is tells us the context of an implicit void conversion. */
tree
convert_to_void (tree expr, const char *implicit)
{
- if (expr == error_mark_node
+ if (expr == error_mark_node
|| TREE_TYPE (expr) == error_mark_node)
return error_mark_node;
if (!TREE_TYPE (expr))
@@ -804,85 +804,85 @@ convert_to_void (tree expr, const char *implicit)
{
case COND_EXPR:
{
- /* The two parts of a cond expr might be separate lvalues. */
- tree op1 = TREE_OPERAND (expr,1);
- tree op2 = TREE_OPERAND (expr,2);
- tree new_op1 = convert_to_void
+ /* The two parts of a cond expr might be separate lvalues. */
+ tree op1 = TREE_OPERAND (expr,1);
+ tree op2 = TREE_OPERAND (expr,2);
+ tree new_op1 = convert_to_void
(op1, (implicit && !TREE_SIDE_EFFECTS (op2)
? "second operand of conditional" : NULL));
- tree new_op2 = convert_to_void
+ tree new_op2 = convert_to_void
(op2, (implicit && !TREE_SIDE_EFFECTS (op1)
? "third operand of conditional" : NULL));
-
+
expr = build3 (COND_EXPR, TREE_TYPE (new_op1),
TREE_OPERAND (expr, 0), new_op1, new_op2);
- break;
+ break;
}
-
+
case COMPOUND_EXPR:
{
- /* The second part of a compound expr contains the value. */
- tree op1 = TREE_OPERAND (expr,1);
- tree new_op1 = convert_to_void
+ /* The second part of a compound expr contains the value. */
+ tree op1 = TREE_OPERAND (expr,1);
+ tree new_op1 = convert_to_void
(op1, (implicit && !TREE_NO_WARNING (expr)
? "right-hand operand of comma" : NULL));
-
- if (new_op1 != op1)
+
+ if (new_op1 != op1)
{
tree t = build2 (COMPOUND_EXPR, TREE_TYPE (new_op1),
TREE_OPERAND (expr, 0), new_op1);
expr = t;
}
- break;
+ break;
}
-
+
case NON_LVALUE_EXPR:
case NOP_EXPR:
/* These have already decayed to rvalue. */
break;
-
+
case CALL_EXPR: /* We have a special meaning for volatile void fn(). */
break;
-
+
case INDIRECT_REF:
{
- tree type = TREE_TYPE (expr);
- int is_reference = TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0)))
- == REFERENCE_TYPE;
- int is_volatile = TYPE_VOLATILE (type);
- int is_complete = COMPLETE_TYPE_P (complete_type (type));
-
- if (is_volatile && !is_complete)
- warning (0, "object of incomplete type %qT will not be accessed in %s",
- type, implicit ? implicit : "void context");
- else if (is_reference && is_volatile)
- warning (0, "object of type %qT will not be accessed in %s",
- TREE_TYPE (TREE_OPERAND (expr, 0)),
- implicit ? implicit : "void context");
- if (is_reference || !is_volatile || !is_complete)
- expr = TREE_OPERAND (expr, 0);
-
- break;
+ tree type = TREE_TYPE (expr);
+ int is_reference = TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0)))
+ == REFERENCE_TYPE;
+ int is_volatile = TYPE_VOLATILE (type);
+ int is_complete = COMPLETE_TYPE_P (complete_type (type));
+
+ if (is_volatile && !is_complete)
+ warning (0, "object of incomplete type %qT will not be accessed in %s",
+ type, implicit ? implicit : "void context");
+ else if (is_reference && is_volatile)
+ warning (0, "object of type %qT will not be accessed in %s",
+ TREE_TYPE (TREE_OPERAND (expr, 0)),
+ implicit ? implicit : "void context");
+ if (is_reference || !is_volatile || !is_complete)
+ expr = TREE_OPERAND (expr, 0);
+
+ break;
}
-
+
case VAR_DECL:
{
- /* External variables might be incomplete. */
- tree type = TREE_TYPE (expr);
- int is_complete = COMPLETE_TYPE_P (complete_type (type));
-
- if (TYPE_VOLATILE (type) && !is_complete)
- warning (0, "object %qE of incomplete type %qT will not be accessed in %s",
- expr, type, implicit ? implicit : "void context");
- break;
+ /* External variables might be incomplete. */
+ tree type = TREE_TYPE (expr);
+ int is_complete = COMPLETE_TYPE_P (complete_type (type));
+
+ if (TYPE_VOLATILE (type) && !is_complete)
+ warning (0, "object %qE of incomplete type %qT will not be accessed in %s",
+ expr, type, implicit ? implicit : "void context");
+ break;
}
default:;
}
{
tree probe = expr;
-
+
if (TREE_CODE (probe) == ADDR_EXPR)
probe = TREE_OPERAND (expr, 0);
if (type_unknown_p (probe))
@@ -898,7 +898,7 @@ convert_to_void (tree expr, const char *implicit)
warning (0, "%s is a reference, not call, to function %qE",
implicit, expr);
}
-
+
if (expr != error_mark_node && !VOID_TYPE_P (TREE_TYPE (expr)))
{
if (implicit && warn_unused_value && !TREE_NO_WARNING (expr))
@@ -907,12 +907,12 @@ convert_to_void (tree expr, const char *implicit)
been explicitly cast to void, so we must do so here. */
if (!TREE_SIDE_EFFECTS (expr))
warning (0, "%s has no effect", implicit);
- else
- {
+ else
+ {
tree e;
enum tree_code code;
enum tree_code_class class;
-
+
e = expr;
/* We might like to warn about (say) "(int) f()", as the
cast has no effect, but the compiler itself will
@@ -931,7 +931,7 @@ convert_to_void (tree expr, const char *implicit)
class = TREE_CODE_CLASS (code);
if (class == tcc_comparison
|| class == tcc_unary
- || (class == tcc_binary
+ || (class == tcc_binary
&& !(code == MODIFY_EXPR
|| code == INIT_EXPR
|| code == PREDECREMENT_EXPR
@@ -991,7 +991,7 @@ convert_force (tree type, tree expr, int convtype)
enum tree_code code = TREE_CODE (type);
if (code == REFERENCE_TYPE)
- return (fold_if_not_in_template
+ return (fold_if_not_in_template
(convert_to_reference (type, e, CONV_C_CAST, LOOKUP_COMPLAIN,
NULL_TREE)));
@@ -1043,11 +1043,11 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
tree conv = NULL_TREE;
tree winner = NULL_TREE;
- if (expr == null_node
- && (desires & WANT_INT)
+ if (expr == null_node
+ && (desires & WANT_INT)
&& !(desires & WANT_NULL))
warning (0, "converting NULL to non-pointer type");
-
+
basetype = TREE_TYPE (expr);
if (basetype == error_mark_node)
@@ -1061,6 +1061,7 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
return expr;
/* else fall through... */
+ case VECTOR_TYPE:
case BOOLEAN_TYPE:
return (desires & WANT_INT) ? expr : NULL_TREE;
case ENUMERAL_TYPE:
@@ -1069,11 +1070,11 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
return (desires & WANT_FLOAT) ? expr : NULL_TREE;
case POINTER_TYPE:
return (desires & WANT_POINTER) ? expr : NULL_TREE;
-
+
case FUNCTION_TYPE:
case ARRAY_TYPE:
return (desires & WANT_POINTER) ? decay_conversion (expr)
- : NULL_TREE;
+ : NULL_TREE;
default:
return NULL_TREE;
}
@@ -1119,9 +1120,9 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
if (complain)
{
error ("ambiguous default type conversion from %qT",
- basetype);
+ basetype);
error (" candidate conversions include %qD and %qD",
- winner, cand);
+ winner, cand);
}
return error_mark_node;
}
@@ -1179,7 +1180,7 @@ type_promotes_to (tree type)
}
else if (type == float_type_node)
type = double_type_node;
-
+
return type;
}
@@ -1192,7 +1193,7 @@ type_promotes_to (tree type)
to TYPE. Return the resulting expression, or error_mark_node if
the conversion was impossible. */
-tree
+tree
perform_qualification_conversions (tree type, tree expr)
{
tree expr_type;
diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c
index 0ad1e9a4025..61adb81dd1b 100644
--- a/gcc/cp/cxx-pretty-print.c
+++ b/gcc/cp/cxx-pretty-print.c
@@ -43,6 +43,7 @@ static void pp_cxx_parameter_declaration_clause (cxx_pretty_printer *, tree);
static void pp_cxx_abstract_declarator (cxx_pretty_printer *, tree);
static void pp_cxx_statement (cxx_pretty_printer *, tree);
static void pp_cxx_template_parameter (cxx_pretty_printer *, tree);
+static void pp_cxx_cast_expression (cxx_pretty_printer *, tree);
static inline void
@@ -146,7 +147,7 @@ pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
break;
case OVERLOAD:
- t = OVL_CURRENT (t);
+ t = OVL_CURRENT (t);
case VAR_DECL:
case PARM_DECL:
case CONST_DECL:
@@ -158,23 +159,23 @@ pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
case USING_DECL:
case TEMPLATE_DECL:
t = DECL_NAME (t);
-
+
case IDENTIFIER_NODE:
if (t == NULL)
- pp_cxx_identifier (pp, "<unnamed>");
+ pp_cxx_identifier (pp, "<unnamed>");
else if (IDENTIFIER_TYPENAME_P (t))
- pp_cxx_conversion_function_id (pp, t);
+ pp_cxx_conversion_function_id (pp, t);
else
- {
- if (is_destructor_name (t))
- {
- pp_complement (pp);
- /* FIXME: Why is this necessary? */
- if (TREE_TYPE (t))
- t = constructor_name (TREE_TYPE (t));
- }
- pp_cxx_tree_identifier (pp, t);
- }
+ {
+ if (is_destructor_name (t))
+ {
+ pp_complement (pp);
+ /* FIXME: Why is this necessary? */
+ if (TREE_TYPE (t))
+ t = constructor_name (TREE_TYPE (t));
+ }
+ pp_cxx_tree_identifier (pp, t);
+ }
break;
case TEMPLATE_ID_EXPR:
@@ -194,9 +195,9 @@ pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t)
case TEMPLATE_TYPE_PARM:
case TEMPLATE_TEMPLATE_PARM:
if (TYPE_IDENTIFIER (t))
- pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
+ pp_cxx_unqualified_id (pp, TYPE_IDENTIFIER (t));
else
- pp_cxx_canonical_template_parameter (pp, t);
+ pp_cxx_canonical_template_parameter (pp, t);
break;
case TEMPLATE_PARM_INDEX:
@@ -254,20 +255,20 @@ pp_cxx_qualified_id (cxx_pretty_printer *pp, tree t)
break;
/* In Standard C++, functions cannot possibly be used as
- nested-name-specifiers. However, there are situations where
- is "makes sense" to output the surrounding function name for the
- purpose of emphasizing on the scope kind. Just printing the
- function name might not be sufficient as it may be overloaded; so,
- we decorate the function with its signature too.
- FIXME: This is probably the wrong pretty-printing for conversion
- functions and some function templates. */
+ nested-name-specifiers. However, there are situations where
+ is "makes sense" to output the surrounding function name for the
+ purpose of emphasizing on the scope kind. Just printing the
+ function name might not be sufficient as it may be overloaded; so,
+ we decorate the function with its signature too.
+ FIXME: This is probably the wrong pretty-printing for conversion
+ functions and some function templates. */
case OVERLOAD:
t = OVL_CURRENT (t);
case FUNCTION_DECL:
if (DECL_FUNCTION_MEMBER_P (t))
- pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
+ pp_cxx_nested_name_specifier (pp, DECL_CONTEXT (t));
pp_cxx_unqualified_id
- (pp, DECL_CONSTRUCTOR_P (t) ? DECL_CONTEXT (t) : t);
+ (pp, DECL_CONSTRUCTOR_P (t) ? DECL_CONTEXT (t) : t);
pp_cxx_parameter_declaration_clause (pp, TREE_TYPE (t));
break;
@@ -279,13 +280,13 @@ pp_cxx_qualified_id (cxx_pretty_printer *pp, tree t)
default:
{
- tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
- if (scope != pp->enclosing_scope)
- {
- pp_cxx_nested_name_specifier (pp, scope);
- pp_cxx_template_keyword_if_needed (pp, scope, t);
- }
- pp_cxx_unqualified_id (pp, t);
+ tree scope = TYPE_P (t) ? TYPE_CONTEXT (t) : DECL_CONTEXT (t);
+ if (scope != pp->enclosing_scope)
+ {
+ pp_cxx_nested_name_specifier (pp, scope);
+ pp_cxx_template_keyword_if_needed (pp, scope, t);
+ }
+ pp_cxx_unqualified_id (pp, t);
}
break;
}
@@ -364,7 +365,7 @@ pp_cxx_primary_expression (cxx_pretty_printer *pp, tree t)
simple-type-specifier ( expression-list(opt) )
typename ::(opt) nested-name-specifier identifier ( expression-list(opt) )
typename ::(opt) nested-name-specifier template(opt)
- template-id ( expression-list(opt) )
+ template-id ( expression-list(opt) )
postfix-expression . template(opt) ::(opt) id-expression
postfix-expression -> template(opt) ::(opt) id-expression
postfix-expression . pseudo-destructor-name
@@ -382,60 +383,60 @@ static void
pp_cxx_postfix_expression (cxx_pretty_printer *pp, tree t)
{
enum tree_code code = TREE_CODE (t);
-
+
switch (code)
{
case AGGR_INIT_EXPR:
case CALL_EXPR:
{
- tree fun = TREE_OPERAND (t, 0);
- tree args = TREE_OPERAND (t, 1);
- tree saved_scope = pp->enclosing_scope;
-
- if (TREE_CODE (fun) == ADDR_EXPR)
- fun = TREE_OPERAND (fun, 0);
-
- /* In templates, where there is no way to tell whether a given
- call uses an actual member function. So the parser builds
- FUN as a COMPONENT_REF or a plain IDENTIFIER_NODE until
- instantiation time. */
- if (TREE_CODE (fun) != FUNCTION_DECL)
- ;
- else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun))
- {
- tree object = code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t)
- ? TREE_OPERAND (t, 2)
- : TREE_VALUE (args);
-
- while (TREE_CODE (object) == NOP_EXPR)
- object = TREE_OPERAND (object, 0);
-
- if (TREE_CODE (object) == ADDR_EXPR)
- object = TREE_OPERAND (object, 0);
-
- if (TREE_CODE (TREE_TYPE (object)) != POINTER_TYPE)
- {
- pp_cxx_postfix_expression (pp, object);
- pp_cxx_dot (pp);
- }
- else
- {
- pp_cxx_postfix_expression (pp, object);
- pp_cxx_arrow (pp);
- }
- args = TREE_CHAIN (args);
- pp->enclosing_scope = strip_pointer_operator (TREE_TYPE (object));
- }
-
- pp_cxx_postfix_expression (pp, fun);
- pp->enclosing_scope = saved_scope;
- pp_cxx_call_argument_list (pp, args);
+ tree fun = TREE_OPERAND (t, 0);
+ tree args = TREE_OPERAND (t, 1);
+ tree saved_scope = pp->enclosing_scope;
+
+ if (TREE_CODE (fun) == ADDR_EXPR)
+ fun = TREE_OPERAND (fun, 0);
+
+ /* In templates, where there is no way to tell whether a given
+ call uses an actual member function. So the parser builds
+ FUN as a COMPONENT_REF or a plain IDENTIFIER_NODE until
+ instantiation time. */
+ if (TREE_CODE (fun) != FUNCTION_DECL)
+ ;
+ else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fun))
+ {
+ tree object = code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t)
+ ? TREE_OPERAND (t, 2)
+ : TREE_VALUE (args);
+
+ while (TREE_CODE (object) == NOP_EXPR)
+ object = TREE_OPERAND (object, 0);
+
+ if (TREE_CODE (object) == ADDR_EXPR)
+ object = TREE_OPERAND (object, 0);
+
+ if (TREE_CODE (TREE_TYPE (object)) != POINTER_TYPE)
+ {
+ pp_cxx_postfix_expression (pp, object);
+ pp_cxx_dot (pp);
+ }
+ else
+ {
+ pp_cxx_postfix_expression (pp, object);
+ pp_cxx_arrow (pp);
+ }
+ args = TREE_CHAIN (args);
+ pp->enclosing_scope = strip_pointer_operator (TREE_TYPE (object));
+ }
+
+ pp_cxx_postfix_expression (pp, fun);
+ pp->enclosing_scope = saved_scope;
+ pp_cxx_call_argument_list (pp, args);
}
if (code == AGGR_INIT_EXPR && AGGR_INIT_VIA_CTOR_P (t))
- {
- pp_cxx_separate_with (pp, ',');
- pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 2));
- }
+ {
+ pp_cxx_separate_with (pp, ',');
+ pp_cxx_postfix_expression (pp, TREE_OPERAND (t, 2));
+ }
break;
case BASELINK:
@@ -455,13 +456,13 @@ pp_cxx_postfix_expression (cxx_pretty_printer *pp, tree t)
case REINTERPRET_CAST_EXPR:
case CONST_CAST_EXPR:
if (code == DYNAMIC_CAST_EXPR)
- pp_cxx_identifier (pp, "dynamic_cast");
+ pp_cxx_identifier (pp, "dynamic_cast");
else if (code == STATIC_CAST_EXPR)
- pp_cxx_identifier (pp, "static_cast");
+ pp_cxx_identifier (pp, "static_cast");
else if (code == REINTERPRET_CAST_EXPR)
- pp_cxx_identifier (pp, "reinterpret_cast");
+ pp_cxx_identifier (pp, "reinterpret_cast");
else
- pp_cxx_identifier (pp, "const_cast");
+ pp_cxx_identifier (pp, "const_cast");
pp_cxx_begin_template_argument_list (pp);
pp_cxx_type_id (pp, TREE_TYPE (t));
pp_cxx_end_template_argument_list (pp);
@@ -481,9 +482,9 @@ pp_cxx_postfix_expression (cxx_pretty_printer *pp, tree t)
pp_cxx_identifier (pp, "typeid");
pp_left_paren (pp);
if (TYPE_P (t))
- pp_cxx_type_id (pp, t);
+ pp_cxx_type_id (pp, t);
else
- pp_cxx_expression (pp, t);
+ pp_cxx_expression (pp, t);
pp_right_paren (pp);
break;
@@ -537,27 +538,27 @@ pp_cxx_new_expression (cxx_pretty_printer *pp, tree t)
case NEW_EXPR:
case VEC_NEW_EXPR:
if (NEW_EXPR_USE_GLOBAL (t))
- pp_cxx_colon_colon (pp);
+ pp_cxx_colon_colon (pp);
pp_cxx_identifier (pp, "new");
if (TREE_OPERAND (t, 0))
- {
- pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
- pp_space (pp);
- }
+ {
+ pp_cxx_call_argument_list (pp, TREE_OPERAND (t, 0));
+ pp_space (pp);
+ }
/* FIXME: array-types are built with one more element. */
pp_cxx_type_id (pp, TREE_OPERAND (t, 1));
if (TREE_OPERAND (t, 2))
- {
- pp_left_paren (pp);
- t = TREE_OPERAND (t, 2);
- if (TREE_CODE (t) == TREE_LIST)
- pp_c_expression_list (pp_c_base (pp), t);
- else if (t == void_zero_node)
- ; /* OK, empty initializer list. */
- else
- pp_cxx_expression (pp, t);
- pp_right_paren (pp);
- }
+ {
+ pp_left_paren (pp);
+ t = TREE_OPERAND (t, 2);
+ if (TREE_CODE (t) == TREE_LIST)
+ pp_c_expression_list (pp_c_base (pp), t);
+ else if (t == void_zero_node)
+ ; /* OK, empty initializer list. */
+ else
+ pp_cxx_expression (pp, t);
+ pp_right_paren (pp);
+ }
break;
default:
@@ -578,16 +579,16 @@ pp_cxx_delete_expression (cxx_pretty_printer *pp, tree t)
case DELETE_EXPR:
case VEC_DELETE_EXPR:
if (DELETE_EXPR_USE_GLOBAL (t))
- pp_cxx_colon_colon (pp);
+ pp_cxx_colon_colon (pp);
pp_cxx_identifier (pp, "delete");
if (code == VEC_DELETE_EXPR)
- {
- pp_left_bracket (pp);
- pp_right_bracket (pp);
- }
+ {
+ pp_left_bracket (pp);
+ pp_right_bracket (pp);
+ }
pp_c_cast_expression (pp_c_base (pp), TREE_OPERAND (t, 0));
- break;
-
+ break;
+
default:
pp_unsupported_tree (pp, t);
}
@@ -625,7 +626,7 @@ pp_cxx_unary_expression (cxx_pretty_printer *pp, tree t)
case VEC_DELETE_EXPR:
pp_cxx_delete_expression (pp, t);
break;
-
+
case SIZEOF_EXPR:
case ALIGNOF_EXPR:
pp_cxx_identifier (pp, code == SIZEOF_EXPR ? "sizeof" : "__alignof__");
@@ -640,6 +641,11 @@ pp_cxx_unary_expression (cxx_pretty_printer *pp, tree t)
pp_unary_expression (pp, TREE_OPERAND (t, 0));
break;
+ case UNARY_PLUS_EXPR:
+ pp_plus (pp);
+ pp_cxx_cast_expression (pp, TREE_OPERAND (t, 0));
+ break;
+
default:
pp_c_unary_expression (pp_c_base (pp), t);
break;
@@ -679,10 +685,10 @@ pp_cxx_pm_expression (cxx_pretty_printer *pp, tree t)
/* Handle unfortunate OFFESET_REF overloading here. */
case OFFSET_REF:
if (TYPE_P (TREE_OPERAND (t, 0)))
- {
- pp_cxx_qualified_id (pp, t);
- break;
- }
+ {
+ pp_cxx_qualified_id (pp, t);
+ break;
+ }
/* Else fall through. */
case MEMBER_REF:
case DOTSTAR_EXPR:
@@ -819,7 +825,7 @@ pp_cxx_assignment_expression (cxx_pretty_printer *pp, tree e)
case THROW_EXPR:
pp_cxx_identifier (pp, "throw");
if (TREE_OPERAND (e, 0))
- pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 0));
+ pp_cxx_assignment_expression (pp, TREE_OPERAND (e, 0));
break;
case MODOP_EXPR:
@@ -849,9 +855,9 @@ pp_cxx_expression (cxx_pretty_printer *pp, tree t)
pp_cxx_unqualified_id (pp, t);
break;
-#if 0
+#if 0
case OFFSET_REF:
-#endif
+#endif
case SCOPE_REF:
case PTRMEM_CST:
pp_cxx_qualified_id (pp, t);
@@ -878,9 +884,9 @@ pp_cxx_expression (cxx_pretty_printer *pp, tree t)
case STATIC_CAST_EXPR:
case REINTERPRET_CAST_EXPR:
case CONST_CAST_EXPR:
-#if 0
+#if 0
case MEMBER_REF:
-#endif
+#endif
case EMPTY_CLASS_EXPR:
case TYPEID_EXPR:
case PSEUDO_DTOR_EXPR:
@@ -938,7 +944,7 @@ pp_cxx_expression (cxx_pretty_printer *pp, tree t)
default:
pp_c_expression (pp_c_base (pp), t);
- break;
+ break;
}
}
@@ -957,11 +963,11 @@ pp_cxx_function_specifier (cxx_pretty_printer *pp, tree t)
{
case FUNCTION_DECL:
if (DECL_VIRTUAL_P (t))
- pp_cxx_identifier (pp, "virtual");
+ pp_cxx_identifier (pp, "virtual");
else if (DECL_CONSTRUCTOR_P (t) && DECL_NONCONVERTING_P (t))
- pp_cxx_identifier (pp, "explicit");
+ pp_cxx_identifier (pp, "explicit");
else
- pp_c_function_specifier (pp_c_base (pp), t);
+ pp_c_function_specifier (pp_c_base (pp), t);
default:
break;
@@ -990,7 +996,7 @@ pp_cxx_decl_specifier_seq (cxx_pretty_printer *pp, tree t)
pp_cxx_storage_class_specifier (pp, t);
pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
break;
-
+
case TYPE_DECL:
pp_cxx_identifier (pp, "typedef");
pp_cxx_decl_specifier_seq (pp, TREE_TYPE (t));
@@ -998,23 +1004,23 @@ pp_cxx_decl_specifier_seq (cxx_pretty_printer *pp, tree t)
case RECORD_TYPE:
if (TYPE_PTRMEMFUNC_P (t))
- {
- tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t);
- pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (pfm)));
- pp_cxx_whitespace (pp);
- pp_cxx_ptr_operator (pp, t);
- }
+ {
+ tree pfm = TYPE_PTRMEMFUNC_FN_TYPE (t);
+ pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (pfm)));
+ pp_cxx_whitespace (pp);
+ pp_cxx_ptr_operator (pp, t);
+ }
break;
case FUNCTION_DECL:
/* Constructors don't have return types. And conversion functions
- do not have a type-specifier in their return types. */
+ do not have a type-specifier in their return types. */
if (DECL_CONSTRUCTOR_P (t) || DECL_CONV_FN_P (t))
- pp_cxx_function_specifier (pp, t);
+ pp_cxx_function_specifier (pp, t);
else if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
- pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (t)));
+ pp_cxx_decl_specifier_seq (pp, TREE_TYPE (TREE_TYPE (t)));
else
- default:
+ default:
pp_c_declaration_specifiers (pp_c_base (pp), t);
break;
}
@@ -1096,7 +1102,7 @@ pp_cxx_type_specifier_seq (cxx_pretty_printer *pp, tree t)
default:
if (!(TREE_CODE (t) == FUNCTION_DECL && DECL_CONSTRUCTOR_P (t)))
- pp_c_specifier_qualifier_list (pp_c_base (pp), t);
+ pp_c_specifier_qualifier_list (pp_c_base (pp), t);
}
}
@@ -1115,35 +1121,35 @@ pp_cxx_ptr_operator (cxx_pretty_printer *pp, tree t)
case REFERENCE_TYPE:
case POINTER_TYPE:
if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE
- || TYPE_PTR_TO_MEMBER_P (TREE_TYPE (t)))
- pp_cxx_ptr_operator (pp, TREE_TYPE (t));
+ || TYPE_PTR_TO_MEMBER_P (TREE_TYPE (t)))
+ pp_cxx_ptr_operator (pp, TREE_TYPE (t));
if (TREE_CODE (t) == POINTER_TYPE)
- {
- pp_star (pp);
- pp_cxx_cv_qualifier_seq (pp, t);
- }
+ {
+ pp_star (pp);
+ pp_cxx_cv_qualifier_seq (pp, t);
+ }
else
- pp_ampersand (pp);
+ pp_ampersand (pp);
break;
case RECORD_TYPE:
if (TYPE_PTRMEMFUNC_P (t))
- {
- pp_cxx_left_paren (pp);
- pp_cxx_nested_name_specifier (pp, TYPE_PTRMEMFUNC_OBJECT_TYPE (t));
- pp_star (pp);
- break;
- }
+ {
+ pp_cxx_left_paren (pp);
+ pp_cxx_nested_name_specifier (pp, TYPE_PTRMEMFUNC_OBJECT_TYPE (t));
+ pp_star (pp);
+ break;
+ }
case OFFSET_TYPE:
if (TYPE_PTR_TO_MEMBER_P (t))
- {
- if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
- pp_cxx_left_paren (pp);
- pp_cxx_nested_name_specifier (pp, TYPE_PTRMEM_CLASS_TYPE (t));
- pp_star (pp);
- pp_cxx_cv_qualifier_seq (pp, t);
- break;
- }
+ {
+ if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
+ pp_cxx_left_paren (pp);
+ pp_cxx_nested_name_specifier (pp, TYPE_PTRMEM_CLASS_TYPE (t));
+ pp_star (pp);
+ pp_cxx_cv_qualifier_seq (pp, t);
+ break;
+ }
/* else fall through. */
default:
@@ -1187,7 +1193,7 @@ static void
pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
{
tree args = TYPE_P (t) ? NULL : FUNCTION_FIRST_USER_PARM (t);
- tree types =
+ tree types =
TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t);
const bool abstract = args == NULL
|| pp_c_base (pp)->flags & pp_c_flag_abstract;
@@ -1201,16 +1207,16 @@ pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
for (; args; args = TREE_CHAIN (args), types = TREE_CHAIN (types))
{
if (!first)
- pp_cxx_separate_with (pp, ',');
+ pp_cxx_separate_with (pp, ',');
first = false;
pp_cxx_parameter_declaration (pp, abstract ? TREE_VALUE (types) : args);
if (!abstract && pp_c_base (pp)->flags & pp_cxx_flag_default_argument)
- {
- pp_cxx_whitespace (pp);
- pp_equal (pp);
- pp_cxx_whitespace (pp);
- pp_cxx_assignment_expression (pp, TREE_PURPOSE (types));
- }
+ {
+ pp_cxx_whitespace (pp);
+ pp_equal (pp);
+ pp_cxx_whitespace (pp);
+ pp_cxx_assignment_expression (pp, TREE_PURPOSE (types));
+ }
}
pp_cxx_right_paren (pp);
}
@@ -1235,7 +1241,7 @@ pp_cxx_exception_specification (cxx_pretty_printer *pp, tree t)
{
pp_cxx_type_id (pp, TREE_VALUE (ex_spec));
if (TREE_CHAIN (ex_spec))
- pp_cxx_separate_with (pp, ',');
+ pp_cxx_separate_with (pp, ',');
}
pp_cxx_right_paren (pp);
}
@@ -1243,7 +1249,7 @@ pp_cxx_exception_specification (cxx_pretty_printer *pp, tree t)
/* direct-declarator:
declarator-id
direct-declarator ( parameter-declaration-clause ) cv-qualifier-seq(opt)
- exception-specification(opt)
+ exception-specification(opt)
direct-declaration [ constant-expression(opt) ]
( declarator ) */
@@ -1257,23 +1263,23 @@ pp_cxx_direct_declarator (cxx_pretty_printer *pp, tree t)
case CONST_DECL:
case FIELD_DECL:
if (DECL_NAME (t))
- {
- pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
- pp_cxx_id_expression (pp, DECL_NAME (t));
- }
+ {
+ pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (t));
+ pp_cxx_id_expression (pp, DECL_NAME (t));
+ }
pp_cxx_abstract_declarator (pp, TREE_TYPE (t));
break;
-
+
case FUNCTION_DECL:
pp_cxx_space_for_pointer_operator (pp, TREE_TYPE (TREE_TYPE (t)));
pp_cxx_id_expression (pp, t);
pp_cxx_parameter_declaration_clause (pp, t);
-
+
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (t))
- {
- pp_base (pp)->padding = pp_before;
- pp_cxx_cv_qualifier_seq (pp, pp_cxx_implicit_parameter_type (t));
- }
+ {
+ pp_base (pp)->padding = pp_before;
+ pp_cxx_cv_qualifier_seq (pp, pp_cxx_implicit_parameter_type (t));
+ }
pp_cxx_exception_specification (pp, TREE_TYPE (t));
break;
@@ -1327,7 +1333,7 @@ pp_cxx_ctor_initializer (cxx_pretty_printer *pp, tree t)
pp_cxx_primary_expression (pp, TREE_PURPOSE (t));
pp_cxx_call_argument_list (pp, TREE_VALUE (t));
if (TREE_CHAIN (t))
- pp_cxx_separate_with (pp, ',');
+ pp_cxx_separate_with (pp, ',');
}
}
@@ -1366,8 +1372,8 @@ pp_cxx_abstract_declarator (cxx_pretty_printer *pp, tree t)
else if (POINTER_TYPE_P (t))
{
if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
- || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
- pp_cxx_right_paren (pp);
+ || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
+ pp_cxx_right_paren (pp);
t = TREE_TYPE (t);
}
pp_cxx_direct_abstract_declarator (pp, t);
@@ -1375,7 +1381,7 @@ pp_cxx_abstract_declarator (cxx_pretty_printer *pp, tree t)
/* direct-abstract-declarator:
direct-abstract-declarator(opt) ( parameter-declaration-clause )
- cv-qualifier-seq(opt) exception-specification(opt)
+ cv-qualifier-seq(opt) exception-specification(opt)
direct-abstract-declarator(opt) [ constant-expression(opt) ]
( abstract-declarator ) */
@@ -1390,7 +1396,7 @@ pp_cxx_direct_abstract_declarator (cxx_pretty_printer *pp, tree t)
case RECORD_TYPE:
if (TYPE_PTRMEMFUNC_P (t))
- pp_cxx_direct_abstract_declarator (pp, TYPE_PTRMEMFUNC_FN_TYPE (t));
+ pp_cxx_direct_abstract_declarator (pp, TYPE_PTRMEMFUNC_FN_TYPE (t));
break;
case METHOD_TYPE:
@@ -1398,11 +1404,11 @@ pp_cxx_direct_abstract_declarator (cxx_pretty_printer *pp, tree t)
pp_cxx_parameter_declaration_clause (pp, t);
pp_cxx_direct_abstract_declarator (pp, TREE_TYPE (t));
if (TREE_CODE (t) == METHOD_TYPE)
- {
- pp_base (pp)->padding = pp_before;
- pp_cxx_cv_qualifier_seq
- (pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
- }
+ {
+ pp_base (pp)->padding = pp_before;
+ pp_cxx_cv_qualifier_seq
+ (pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
+ }
pp_cxx_exception_specification (pp, t);
break;
@@ -1415,7 +1421,7 @@ pp_cxx_direct_abstract_declarator (cxx_pretty_printer *pp, tree t)
default:
pp_c_direct_abstract_declarator (pp_c_base (pp), t);
- break;
+ break;
}
}
@@ -1473,12 +1479,12 @@ pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t)
{
tree arg = TREE_VEC_ELT (t, i);
if (i != 0)
- pp_cxx_separate_with (pp, ',');
+ pp_cxx_separate_with (pp, ',');
if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL
&& TYPE_P (DECL_TEMPLATE_RESULT (arg))))
- pp_cxx_type_id (pp, arg);
+ pp_cxx_type_id (pp, arg);
else
- pp_cxx_expression (pp, arg);
+ pp_cxx_expression (pp, arg);
}
}
@@ -1513,7 +1519,7 @@ pp_cxx_statement (cxx_pretty_printer *pp, tree t)
case USING_DECL:
pp_cxx_identifier (pp, "using");
- pp_cxx_nested_name_specifier (pp, DECL_INITIAL (t));
+ pp_cxx_nested_name_specifier (pp, USING_DECL_SCOPE (t));
pp_cxx_unqualified_id (pp, DECL_NAME (t));
break;
@@ -1521,7 +1527,7 @@ pp_cxx_statement (cxx_pretty_printer *pp, tree t)
break;
/* try-block:
- try compound-statement handler-seq */
+ try compound-statement handler-seq */
case TRY_BLOCK:
pp_maybe_newline_and_indent (pp, 0);
pp_cxx_identifier (pp, "try");
@@ -1529,22 +1535,22 @@ pp_cxx_statement (cxx_pretty_printer *pp, tree t)
pp_cxx_statement (pp, TRY_STMTS (t));
pp_newline_and_indent (pp, -3);
if (CLEANUP_P (t))
- ;
+ ;
else
- pp_cxx_statement (pp, TRY_HANDLERS (t));
+ pp_cxx_statement (pp, TRY_HANDLERS (t));
break;
/*
- handler-seq:
- handler handler-seq(opt)
+ handler-seq:
+ handler handler-seq(opt)
- handler:
- catch ( exception-declaration ) compound-statement
+ handler:
+ catch ( exception-declaration ) compound-statement
- exception-declaration:
- type-specifier-seq declarator
- type-specifier-seq abstract-declarator
- ... */
+ exception-declaration:
+ type-specifier-seq declarator
+ type-specifier-seq abstract-declarator
+ ... */
case HANDLER:
pp_cxx_identifier (pp, "catch");
pp_cxx_left_paren (pp);
@@ -1558,8 +1564,8 @@ pp_cxx_statement (cxx_pretty_printer *pp, tree t)
break;
/* selection-statement:
- if ( expression ) statement
- if ( expression ) statement else statement */
+ if ( expression ) statement
+ if ( expression ) statement else statement */
case IF_STMT:
pp_cxx_identifier (pp, "if");
pp_cxx_whitespace (pp);
@@ -1596,10 +1602,10 @@ pp_cxx_statement (cxx_pretty_printer *pp, tree t)
break;
/* iteration-statement:
- while ( expression ) statement
- do statement while ( expression ) ;
- for ( expression(opt) ; expression(opt) ; expression(opt) ) statement
- for ( declaration expression(opt) ; expression(opt) ) statement */
+ while ( expression ) statement
+ do statement while ( expression ) ;
+ for ( expression(opt) ; expression(opt) ; expression(opt) ) statement
+ for ( declaration expression(opt) ; expression(opt) ) statement */
case WHILE_STMT:
pp_cxx_identifier (pp, "while");
pp_space (pp);
@@ -1631,9 +1637,9 @@ pp_cxx_statement (cxx_pretty_printer *pp, tree t)
pp_space (pp);
pp_cxx_left_paren (pp);
if (FOR_INIT_STMT (t))
- pp_cxx_statement (pp, FOR_INIT_STMT (t));
+ pp_cxx_statement (pp, FOR_INIT_STMT (t));
else
- pp_cxx_semicolon (pp);
+ pp_cxx_semicolon (pp);
pp_needs_newline (pp) = false;
pp_cxx_whitespace (pp);
if (FOR_COND (t))
@@ -1651,9 +1657,9 @@ pp_cxx_statement (cxx_pretty_printer *pp, tree t)
break;
/* jump-statement:
- goto identifier;
- continue ;
- return expression(opt) ; */
+ goto identifier;
+ continue ;
+ return expression(opt) ; */
case BREAK_STMT:
case CONTINUE_STMT:
pp_identifier (pp, TREE_CODE (t) == BREAK_STMT ? "break" : "continue");
@@ -1662,7 +1668,7 @@ pp_cxx_statement (cxx_pretty_printer *pp, tree t)
break;
/* expression-statement:
- expression(opt) ; */
+ expression(opt) ; */
case EXPR_STMT:
pp_cxx_expression (pp, EXPR_STMT_EXPR (t));
pp_cxx_semicolon (pp);
@@ -1750,7 +1756,7 @@ pp_cxx_template_parameter_list (cxx_pretty_printer *pp, tree t)
for (i = 0; i < n; ++i)
{
if (i)
- pp_cxx_separate_with (pp, ',');
+ pp_cxx_separate_with (pp, ',');
pp_cxx_template_parameter (pp, TREE_VEC_ELT (t, i));
}
}
@@ -1777,7 +1783,7 @@ pp_cxx_template_parameter (cxx_pretty_printer *pp, tree t)
case TYPE_DECL:
pp_cxx_identifier (pp, "class");
if (DECL_NAME (parameter))
- pp_cxx_tree_identifier (pp, DECL_NAME (parameter));
+ pp_cxx_tree_identifier (pp, DECL_NAME (parameter));
/* FIXME: Chech if we should print also default argument. */
break;
@@ -1806,7 +1812,7 @@ pp_cxx_canonical_template_parameter (cxx_pretty_printer *pp, tree parm)
if (code == TEMPLATE_TYPE_PARM || code == TEMPLATE_TEMPLATE_PARM
|| code == BOUND_TEMPLATE_TEMPLATE_PARM)
parm = TEMPLATE_TYPE_PARM_INDEX (parm);
-
+
pp_cxx_begin_template_argument_list (pp);
pp_cxx_identifier (pp, "template-parameter-");
pp_wide_integer (pp, TEMPLATE_PARM_LEVEL (parm));
@@ -1879,19 +1885,19 @@ pp_cxx_declaration (cxx_pretty_printer *pp, tree t)
switch (DECL_USE_TEMPLATE (t))
{
case 1:
- pp_cxx_template_declaration (pp, t);
- break;
-
+ pp_cxx_template_declaration (pp, t);
+ break;
+
case 2:
- pp_cxx_explicit_specialization (pp, t);
- break;
+ pp_cxx_explicit_specialization (pp, t);
+ break;
case 3:
- pp_cxx_explicit_instantiation (pp, t);
- break;
+ pp_cxx_explicit_instantiation (pp, t);
+ break;
default:
- break;
+ break;
}
else switch (TREE_CODE (t))
{
@@ -1899,19 +1905,19 @@ pp_cxx_declaration (cxx_pretty_printer *pp, tree t)
case TYPE_DECL:
pp_cxx_simple_declaration (pp, t);
break;
-
+
case FUNCTION_DECL:
if (DECL_SAVED_TREE (t))
- pp_cxx_function_definition (pp, t);
+ pp_cxx_function_definition (pp, t);
else
- pp_cxx_simple_declaration (pp, t);
+ pp_cxx_simple_declaration (pp, t);
break;
case NAMESPACE_DECL:
if (DECL_NAMESPACE_ALIAS (t))
- pp_cxx_namespace_alias_definition (pp, t);
+ pp_cxx_namespace_alias_definition (pp, t);
else
- pp_cxx_original_namespace_definition (pp, t);
+ pp_cxx_original_namespace_definition (pp, t);
break;
default:
diff --git a/gcc/cp/cxx-pretty-print.h b/gcc/cp/cxx-pretty-print.h
index 4793de7a954..a489279de44 100644
--- a/gcc/cp/cxx-pretty-print.h
+++ b/gcc/cp/cxx-pretty-print.h
@@ -31,7 +31,7 @@ typedef enum
{
/* Ask for an qualified-id. */
pp_cxx_flag_default_argument = 1 << pp_c_flag_last_bit
-
+
} cxx_pretty_printer_flags;
typedef struct
@@ -44,21 +44,21 @@ typedef struct
#define pp_cxx_cv_qualifier_seq(PP, T) \
pp_c_type_qualifier_list (pp_c_base (PP), T)
-#define pp_cxx_whitespace(PP) pp_c_whitespace (pp_c_base (PP))
-#define pp_cxx_left_paren(PP) pp_c_left_paren (pp_c_base (PP))
-#define pp_cxx_right_paren(PP) pp_c_right_paren (pp_c_base (PP))
-#define pp_cxx_left_brace(PP) pp_c_left_brace (pp_c_base (PP))
-#define pp_cxx_right_brace(PP) pp_c_right_brace (pp_c_base (PP))
-#define pp_cxx_left_bracket(PP) pp_c_left_bracket (pp_c_base (PP))
-#define pp_cxx_right_bracket(PP) pp_c_right_bracket (pp_c_base (PP))
-#define pp_cxx_dot(PP) pp_c_dot (pp_c_base (PP))
-#define pp_cxx_ampersand(PP) pp_c_ampersand (pp_c_base (PP))
-#define pp_cxx_star(PP) pp_c_star (pp_c_base (PP))
-#define pp_cxx_arrow(PP) pp_c_arrow (pp_c_base (PP))
-#define pp_cxx_semicolon(PP) pp_c_semicolon (pp_c_base (PP))
-#define pp_cxx_complement(PP) pp_c_complement (pp_c_base (PP))
-
-#define pp_cxx_identifier(PP, I) pp_c_identifier (pp_c_base (PP), I)
+#define pp_cxx_whitespace(PP) pp_c_whitespace (pp_c_base (PP))
+#define pp_cxx_left_paren(PP) pp_c_left_paren (pp_c_base (PP))
+#define pp_cxx_right_paren(PP) pp_c_right_paren (pp_c_base (PP))
+#define pp_cxx_left_brace(PP) pp_c_left_brace (pp_c_base (PP))
+#define pp_cxx_right_brace(PP) pp_c_right_brace (pp_c_base (PP))
+#define pp_cxx_left_bracket(PP) pp_c_left_bracket (pp_c_base (PP))
+#define pp_cxx_right_bracket(PP) pp_c_right_bracket (pp_c_base (PP))
+#define pp_cxx_dot(PP) pp_c_dot (pp_c_base (PP))
+#define pp_cxx_ampersand(PP) pp_c_ampersand (pp_c_base (PP))
+#define pp_cxx_star(PP) pp_c_star (pp_c_base (PP))
+#define pp_cxx_arrow(PP) pp_c_arrow (pp_c_base (PP))
+#define pp_cxx_semicolon(PP) pp_c_semicolon (pp_c_base (PP))
+#define pp_cxx_complement(PP) pp_c_complement (pp_c_base (PP))
+
+#define pp_cxx_identifier(PP, I) pp_c_identifier (pp_c_base (PP), I)
#define pp_cxx_tree_identifier(PP, T) \
pp_c_tree_identifier (pp_c_base (PP), T)
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index eb8db9121c8..3edb40a301e 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -66,7 +66,7 @@ static tree grokvardecl (tree, tree, const cp_decl_specifier_seq *,
static void record_unknown_type (tree, const char *);
static tree builtin_function_1 (const char *, tree, tree,
enum built_in_function code,
- enum built_in_class cl, const char *,
+ enum built_in_class cl, const char *,
tree);
static tree build_library_fn_1 (tree, enum tree_code, tree);
static int member_function_or_else (tree, tree, enum overload_flags);
@@ -128,12 +128,6 @@ tree error_mark_list;
tree vtable_entry_type;
tree delta_type_node;
tree __t_desc_type_node;
- tree ti_desc_type_node;
- tree bltn_desc_type_node, ptr_desc_type_node;
- tree ary_desc_type_node, func_desc_type_node, enum_desc_type_node;
- tree class_desc_type_node, si_class_desc_type_node, vmi_class_desc_type_node;
- tree ptm_desc_type_node;
- tree base_desc_type_node;
tree class_type_node;
tree unknown_type_node;
@@ -306,7 +300,7 @@ current_tmpl_spec_kind (int n_class_scopes)
/* We've not seen enough template headers to match all the
specialized classes present. For example:
- template <class T> void R<T>::S<T>::f(int);
+ template <class T> void R<T>::S<T>::f(int);
This is invalid; there needs to be one set of template
parameters for each class. */
@@ -315,7 +309,7 @@ current_tmpl_spec_kind (int n_class_scopes)
/* We're processing a non-template declaration (even though it may
be a member of a template class.) For example:
- template <class T> void S<T>::f(int);
+ template <class T> void S<T>::f(int);
The `class T' maches the `S<T>', leaving no template headers
corresponding to the `f'. */
@@ -323,14 +317,14 @@ current_tmpl_spec_kind (int n_class_scopes)
else if (n_template_parm_scopes > n_class_scopes + 1)
/* We've got too many template headers. For example:
- template <> template <class T> void f (T);
+ template <> template <class T> void f (T);
There need to be more enclosing classes. */
return tsk_excessive_parms;
else
/* This must be a template. It's of the form:
- template <class T> template <class U> void S<T>::f(U);
+ template <class T> template <class U> void S<T>::f(U);
This is a specialization if the innermost level was a
specialization; otherwise it's just a definition of the
@@ -362,7 +356,7 @@ pop_label (tree label, tree old_value)
#ifdef USE_MAPPED_LOCATION
location = input_location; /* FIXME want (input_filename, (line)0) */
#else
- location.file = input_filename;
+ location.file = input_filename;
location.line = 0;
#endif
/* Avoid crashing later. */
@@ -425,22 +419,7 @@ objc_mark_locals_volatile (void *enclosing_blk)
tree decl;
for (decl = scope->names; decl; decl = TREE_CHAIN (decl))
- {
- /* Do not mess with variables that are 'static' or (already)
- 'volatile'. */
- if (!TREE_THIS_VOLATILE (decl) && !TREE_STATIC (decl)
- && (TREE_CODE (decl) == VAR_DECL
- || TREE_CODE (decl) == PARM_DECL))
- {
- TREE_TYPE (decl)
- = build_qualified_type (TREE_TYPE (decl),
- (TYPE_QUALS (TREE_TYPE (decl))
- | TYPE_QUAL_VOLATILE));
- TREE_THIS_VOLATILE (decl) = 1;
- TREE_SIDE_EFFECTS (decl) = 1;
- DECL_REGISTER (decl) = 0;
- }
- }
+ objc_volatilize_decl (decl);
/* Do not climb up past the current function. */
if (scope->kind == sk_function_parms)
@@ -584,7 +563,7 @@ poplevel (int keep, int reverse, int functionbody)
for (link = decls; link; link = TREE_CHAIN (link))
{
if (leaving_for_scope && TREE_CODE (link) == VAR_DECL
- && DECL_NAME (link))
+ && DECL_NAME (link))
{
tree name = DECL_NAME (link);
cxx_binding *ob;
@@ -601,8 +580,8 @@ poplevel (int keep, int reverse, int functionbody)
if (ob && ob->scope == current_binding_level->level_chain)
/* We have something like:
- int i;
- for (int i; ;);
+ int i;
+ for (int i; ;);
and we are leaving the `for' scope. There's no reason to
keep the binding of the inner `i' in this case. */
@@ -648,14 +627,14 @@ poplevel (int keep, int reverse, int functionbody)
else
{
tree name;
-
+
/* Remove the binding. */
decl = link;
if (TREE_CODE (decl) == TREE_LIST)
decl = TREE_VALUE (decl);
name = decl;
-
+
if (TREE_CODE (name) == OVERLOAD)
name = OVL_FUNCTION (name);
@@ -905,15 +884,15 @@ decls_match (tree newdecl, tree olddecl)
return 0;
if (TREE_CODE (f1) != TREE_CODE (f2))
- return 0;
+ return 0;
if (same_type_p (TREE_TYPE (f1), TREE_TYPE (f2)))
{
if (p2 == NULL_TREE && DECL_EXTERN_C_P (olddecl)
&& (DECL_BUILT_IN (olddecl)
#ifndef NO_IMPLICIT_EXTERN_C
- || (DECL_IN_SYSTEM_HEADER (newdecl) && !DECL_CLASS_SCOPE_P (newdecl))
- || (DECL_IN_SYSTEM_HEADER (olddecl) && !DECL_CLASS_SCOPE_P (olddecl))
+ || (DECL_IN_SYSTEM_HEADER (newdecl) && !DECL_CLASS_SCOPE_P (newdecl))
+ || (DECL_IN_SYSTEM_HEADER (olddecl) && !DECL_CLASS_SCOPE_P (olddecl))
#endif
))
{
@@ -924,11 +903,11 @@ decls_match (tree newdecl, tree olddecl)
#ifndef NO_IMPLICIT_EXTERN_C
else if (p1 == NULL_TREE
&& (DECL_EXTERN_C_P (olddecl)
- && DECL_IN_SYSTEM_HEADER (olddecl)
- && !DECL_CLASS_SCOPE_P (olddecl))
+ && DECL_IN_SYSTEM_HEADER (olddecl)
+ && !DECL_CLASS_SCOPE_P (olddecl))
&& (DECL_EXTERN_C_P (newdecl)
- && DECL_IN_SYSTEM_HEADER (newdecl)
- && !DECL_CLASS_SCOPE_P (newdecl)))
+ && DECL_IN_SYSTEM_HEADER (newdecl)
+ && !DECL_CLASS_SCOPE_P (newdecl)))
{
types_match = self_promoting_args_p (p2);
TREE_TYPE (newdecl) = TREE_TYPE (olddecl);
@@ -1066,17 +1045,18 @@ duplicate_decls (tree newdecl, tree olddecl)
&& DECL_UNINLINABLE (olddecl)
&& lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl)))
{
- warning (0, "%Jfunction %qD redeclared as inline", newdecl, newdecl);
- warning (0, "%Jprevious declaration of %qD with attribute noinline",
- olddecl, olddecl);
+ warning (OPT_Wattributes, "%Jfunction %qD redeclared as inline",
+ newdecl, newdecl);
+ warning (OPT_Wattributes, "%Jprevious declaration of %qD "
+ "with attribute noinline", olddecl, olddecl);
}
else if (DECL_DECLARED_INLINE_P (olddecl)
&& DECL_UNINLINABLE (newdecl)
&& lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl)))
{
- warning (0, "%Jfunction %qD redeclared with attribute noinline",
- newdecl, newdecl);
- warning (0, "%Jprevious declaration of %qD was inline",
+ warning (OPT_Wattributes, "%Jfunction %qD redeclared with "
+ "attribute noinline", newdecl, newdecl);
+ warning (OPT_Wattributes, "%Jprevious declaration of %qD was inline",
olddecl, olddecl);
}
}
@@ -1087,9 +1067,9 @@ duplicate_decls (tree newdecl, tree olddecl)
{
if (TREE_CODE (newdecl) != FUNCTION_DECL)
{
- /* Avoid warnings redeclaring anticipated built-ins. */
- if (DECL_ANTICIPATED (olddecl))
- return NULL_TREE;
+ /* Avoid warnings redeclaring anticipated built-ins. */
+ if (DECL_ANTICIPATED (olddecl))
+ return NULL_TREE;
/* If you declare a built-in or predefined function name as static,
the old definition is overridden, but optionally warn this was a
@@ -1097,9 +1077,9 @@ duplicate_decls (tree newdecl, tree olddecl)
if (! TREE_PUBLIC (newdecl))
{
if (warn_shadow)
- warning (0, "shadowing %s function %q#D",
- DECL_BUILT_IN (olddecl) ? "built-in" : "library",
- olddecl);
+ warning (0, "shadowing %s function %q#D",
+ DECL_BUILT_IN (olddecl) ? "built-in" : "library",
+ olddecl);
/* Discard the old built-in function. */
return NULL_TREE;
}
@@ -1107,19 +1087,19 @@ duplicate_decls (tree newdecl, tree olddecl)
it even globally without an error. */
else if (! DECL_BUILT_IN (olddecl))
warning (0, "library function %q#D redeclared as non-function %q#D",
- olddecl, newdecl);
+ olddecl, newdecl);
else
{
error ("declaration of %q#D", newdecl);
error ("conflicts with built-in declaration %q#D",
- olddecl);
+ olddecl);
}
return NULL_TREE;
}
else if (!types_match)
{
- /* Avoid warnings redeclaring anticipated built-ins. */
- if (DECL_ANTICIPATED (olddecl))
+ /* Avoid warnings redeclaring anticipated built-ins. */
+ if (DECL_ANTICIPATED (olddecl))
{
/* Deal with fileptr_type_node. FILE type is not known
at the time we create the builtins. */
@@ -1165,12 +1145,12 @@ duplicate_decls (tree newdecl, tree olddecl)
{
warning (0, "new declaration %q#D", newdecl);
warning (0, "ambiguates built-in declaration %q#D",
- olddecl);
+ olddecl);
}
else if (warn_shadow)
warning (0, "shadowing %s function %q#D",
- DECL_BUILT_IN (olddecl) ? "built-in" : "library",
- olddecl);
+ DECL_BUILT_IN (olddecl) ? "built-in" : "library",
+ olddecl);
}
else
/* Discard the old built-in function. */
@@ -1282,7 +1262,7 @@ duplicate_decls (tree newdecl, tree olddecl)
if (DECL_EXTERN_C_P (newdecl) && DECL_EXTERN_C_P (olddecl))
{
error ("declaration of C function %q#D conflicts with",
- newdecl);
+ newdecl);
cp_error_at ("previous declaration %q#D here", olddecl);
}
else if (compparms (TYPE_ARG_TYPES (TREE_TYPE (newdecl)),
@@ -1298,8 +1278,8 @@ duplicate_decls (tree newdecl, tree olddecl)
{
error ("conflicting declaration %q#D", newdecl);
cp_error_at ("%qD has a previous declaration as %q#D",
- olddecl, olddecl);
- return error_mark_node;
+ olddecl, olddecl);
+ return error_mark_node;
}
}
else if (TREE_CODE (newdecl) == FUNCTION_DECL
@@ -1331,21 +1311,21 @@ duplicate_decls (tree newdecl, tree olddecl)
else if (TREE_CODE (newdecl) == NAMESPACE_DECL)
{
/* In [namespace.alias] we have:
-
- In a declarative region, a namespace-alias-definition can be
+
+ In a declarative region, a namespace-alias-definition can be
used to redefine a namespace-alias declared in that declarative
region to refer only to the namespace to which it already
refers.
-
+
Therefore, if we encounter a second alias directive for the same
alias, we can just ignore the second directive. */
if (DECL_NAMESPACE_ALIAS (newdecl)
- && (DECL_NAMESPACE_ALIAS (newdecl)
+ && (DECL_NAMESPACE_ALIAS (newdecl)
== DECL_NAMESPACE_ALIAS (olddecl)))
return olddecl;
/* [namespace.alias]
- A namespace-name or namespace-alias shall not be declared as
+ A namespace-name or namespace-alias shall not be declared as
the name of any other entity in the same declarative region.
A namespace-name defined at global scope shall not be
declared as the name of any other entity in any global scope
@@ -1389,7 +1369,7 @@ duplicate_decls (tree newdecl, tree olddecl)
cp_error_at ("previous declaration of %q#D with %qL linkage",
olddecl, DECL_LANGUAGE (olddecl));
error ("conflicts with new declaration with %qL linkage",
- DECL_LANGUAGE (newdecl));
+ DECL_LANGUAGE (newdecl));
}
}
@@ -1414,12 +1394,12 @@ duplicate_decls (tree newdecl, tree olddecl)
pedwarn ("default argument given for parameter %d of %q#D",
i, newdecl);
cp_pedwarn_at ("after previous specification in %q#D",
- olddecl);
+ olddecl);
}
else
{
error ("default argument given for parameter %d of %q#D",
- i, newdecl);
+ i, newdecl);
cp_error_at ("after previous specification in %q#D",
olddecl);
}
@@ -1473,8 +1453,8 @@ duplicate_decls (tree newdecl, tree olddecl)
new_defines_function = DECL_INITIAL (newdecl) != NULL_TREE;
/* Optionally warn about more than one declaration for the same
- name, but don't warn about a function declaration followed by a
- definition. */
+ name, but don't warn about a function declaration followed by a
+ 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. */
@@ -1574,10 +1554,10 @@ duplicate_decls (tree newdecl, tree olddecl)
&& ! DECL_IS_BUILTIN (olddecl)
&& flag_exceptions
&& !comp_except_specs (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (newdecl)),
- TYPE_RAISES_EXCEPTIONS (TREE_TYPE (olddecl)), 1))
+ TYPE_RAISES_EXCEPTIONS (TREE_TYPE (olddecl)), 1))
{
error ("declaration of %qF throws different exceptions",
- newdecl);
+ newdecl);
cp_error_at ("than previous declaration %qF", olddecl);
}
}
@@ -1625,7 +1605,7 @@ duplicate_decls (tree newdecl, tree olddecl)
}
/* Merge the section attribute.
- We want to issue an error if the sections conflict but that must be
+ We want to issue an error if the sections conflict but that must be
done later in decl_attributes since we are called before attributes
are assigned. */
if (DECL_SECTION_NAME (newdecl) == NULL_TREE)
@@ -1686,13 +1666,14 @@ duplicate_decls (tree newdecl, tree olddecl)
DECL_COMDAT (newdecl) |= DECL_COMDAT (olddecl);
DECL_TEMPLATE_INSTANTIATED (newdecl)
|= DECL_TEMPLATE_INSTANTIATED (olddecl);
- /* If the OLDDECL is an implicit instantiation, then the NEWDECL
- must be too. But, it may not yet be marked as such if the
- caller has created NEWDECL, but has not yet figured out that
- it is a redeclaration. */
- if (DECL_IMPLICIT_INSTANTIATION (olddecl)
- && !DECL_USE_TEMPLATE (newdecl))
- SET_DECL_IMPLICIT_INSTANTIATION (newdecl);
+
+ /* If the OLDDECL is an instantiation and/or specialization,
+ then the NEWDECL must be too. But, it may not yet be marked
+ as such if the caller has created NEWDECL, but has not yet
+ figured out that it is a redeclaration. */
+ if (!DECL_USE_TEMPLATE (newdecl))
+ DECL_USE_TEMPLATE (newdecl) = DECL_USE_TEMPLATE (olddecl);
+
/* Don't really know how much of the language-specific
values we should copy from old to new. */
DECL_IN_AGGR_P (newdecl) = DECL_IN_AGGR_P (olddecl);
@@ -1702,7 +1683,7 @@ duplicate_decls (tree newdecl, tree olddecl)
DECL_REPO_AVAILABLE_P (newdecl) = DECL_REPO_AVAILABLE_P (olddecl);
DECL_TEMPLATE_INFO (newdecl) = DECL_TEMPLATE_INFO (olddecl);
DECL_INITIALIZED_IN_CLASS_P (newdecl)
- |= DECL_INITIALIZED_IN_CLASS_P (olddecl);
+ |= DECL_INITIALIZED_IN_CLASS_P (olddecl);
olddecl_friend = DECL_FRIEND_P (olddecl);
/* Only functions have DECL_BEFRIENDING_CLASSES. */
@@ -1813,13 +1794,14 @@ duplicate_decls (tree newdecl, tree olddecl)
COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl);
/* Warn about conflicting visibility specifications. */
- if (DECL_VISIBILITY_SPECIFIED (olddecl)
+ if (DECL_VISIBILITY_SPECIFIED (olddecl)
&& DECL_VISIBILITY_SPECIFIED (newdecl)
&& DECL_VISIBILITY (newdecl) != DECL_VISIBILITY (olddecl))
{
- warning (0, "%J%qD: visibility attribute ignored because it",
- newdecl, newdecl);
- warning (0, "%Jconflicts with previous declaration here", olddecl);
+ warning (OPT_Wattributes, "%J%qD: visibility attribute ignored "
+ "because it", newdecl, newdecl);
+ warning (OPT_Wattributes, "%Jconflicts with previous "
+ "declaration here", olddecl);
}
/* Choose the declaration which specified visibility. */
if (DECL_VISIBILITY_SPECIFIED (olddecl))
@@ -1832,7 +1814,7 @@ duplicate_decls (tree newdecl, tree olddecl)
with that from NEWDECL below. */
if (DECL_LANG_SPECIFIC (olddecl))
{
- gcc_assert (DECL_LANG_SPECIFIC (olddecl)
+ gcc_assert (DECL_LANG_SPECIFIC (olddecl)
!= DECL_LANG_SPECIFIC (newdecl));
ggc_free (DECL_LANG_SPECIFIC (olddecl));
}
@@ -1942,7 +1924,7 @@ redeclaration_error_message (tree newdecl, tree olddecl)
return "%qD conflicts with used function";
/* We'll complain about linkage mismatches in
- warn_extern_redeclared_static. */
+ warn_extern_redeclared_static. */
/* Defining the same name twice is no good. */
if (DECL_INITIAL (olddecl) != NULL_TREE
@@ -2139,8 +2121,8 @@ decl_jump_unsafe (tree decl)
static void
check_previous_goto_1 (tree decl,
- struct cp_binding_level* level,
- tree names, const location_t *locus)
+ struct cp_binding_level* level,
+ tree names, const location_t *locus)
{
int identified = 0;
int saw_eh = 0;
@@ -2477,7 +2459,7 @@ typename_compare (const void * k1, const void * k2)
/* Build a TYPENAME_TYPE. If the type is `typename T::t', CONTEXT is
the type of `T', NAME is the IDENTIFIER_NODE for `t'.
-
+
Returns the new TYPENAME_TYPE. */
static GTY ((param_is (union tree_node))) htab_t typename_htab;
@@ -2496,7 +2478,7 @@ build_typename_type (tree context, tree name, tree fullname,
typename_htab = htab_create_ggc (61, &typename_hash,
&typename_compare, NULL);
- ti.scope = FROB_CONTEXT (context);
+ ti.scope = FROB_CONTEXT (context);
ti.name = name;
ti.template_id = fullname;
ti.enum_p = tag_type == enum_type;
@@ -2518,7 +2500,7 @@ build_typename_type (tree context, tree name, tree fullname,
TYPENAME_TYPE_FULLNAME (t) = ti.template_id;
TYPENAME_IS_ENUM_P (t) = ti.enum_p;
TYPENAME_IS_CLASS_P (t) = ti.class_p;
-
+
/* Build the corresponding TYPE_DECL. */
d = build_decl (TYPE_DECL, name, t);
TYPE_NAME (TREE_TYPE (d)) = d;
@@ -2529,7 +2511,7 @@ build_typename_type (tree context, tree name, tree fullname,
/* Store it in the hash table. */
*e = t;
}
-
+
return t;
}
@@ -2595,7 +2577,7 @@ make_typename_type (tree context, tree name, enum tag_types tag_type,
{
if (complain & tf_error)
error ("no class template named %q#T in %q#T",
- name, context);
+ name, context);
return error_mark_node;
}
@@ -2606,11 +2588,11 @@ make_typename_type (tree context, tree name, enum tag_types tag_type,
TREE_OPERAND (fullname, 1),
NULL_TREE, context,
/*entering_scope=*/0,
- tf_error | tf_warning | tf_user);
+ tf_error | tf_warning | tf_user);
}
else
{
- tree t;
+ tree t;
if (!IS_AGGR_TYPE (context))
{
@@ -2653,7 +2635,7 @@ make_typename_type (tree context, tree name, enum tag_types tag_type,
}
/* Resolve `CONTEXT::template NAME'. Returns a TEMPLATE_DECL if the name
- can be resolved or an UNBOUND_CLASS_TEMPLATE, unless an error occurs,
+ can be resolved or an UNBOUND_CLASS_TEMPLATE, unless an error occurs,
in which case error_mark_node is returned.
If PARM_LIST is non-NULL, also make sure that the template parameter
@@ -2731,8 +2713,8 @@ make_unbound_class_template (tree context, tree name, tree parm_list,
void
record_builtin_type (enum rid rid_index,
- const char* name,
- tree type)
+ const char* name,
+ tree type)
{
tree rname = NULL_TREE, tname = NULL_TREE;
tree tdecl = NULL_TREE;
@@ -2897,7 +2879,7 @@ cxx_init_decl_processing (void)
/* Enter the global namespace. */
gcc_assert (global_namespace == NULL_TREE);
global_namespace = build_lang_decl (NAMESPACE_DECL, global_scope_name,
- void_type_node);
+ void_type_node);
begin_scope (sk_namespace, global_namespace);
current_lang_name = NULL_TREE;
@@ -3153,12 +3135,12 @@ cp_make_fname_decl (tree id, int type_dep)
static tree
builtin_function_1 (const char* name,
- tree type,
- tree context,
+ tree type,
+ tree context,
enum built_in_function code,
- enum built_in_class class,
- const char* libname,
- tree attrs)
+ enum built_in_class class,
+ const char* libname,
+ tree attrs)
{
tree decl = build_library_fn_1 (get_identifier (name), ERROR_MARK, type);
DECL_BUILT_IN_CLASS (decl) = class;
@@ -3205,11 +3187,11 @@ builtin_function_1 (const char* name,
tree
builtin_function (const char* name,
- tree type,
- int code,
- enum built_in_class cl,
- const char* libname,
- tree attrs)
+ tree type,
+ int code,
+ enum built_in_class cl,
+ const char* libname,
+ tree attrs)
{
/* All builtins that don't begin with an '_' should additionally
go in the 'std' namespace. */
@@ -3384,17 +3366,17 @@ fixup_anonymous_aggr (tree t)
type = TREE_TYPE (field);
if (CLASS_TYPE_P (type))
{
- if (TYPE_NEEDS_CONSTRUCTING (type))
+ if (TYPE_NEEDS_CONSTRUCTING (type))
cp_error_at ("member %q#D with constructor not allowed "
- "in anonymous aggregate",
+ "in anonymous aggregate",
field);
if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
cp_error_at ("member %q#D with destructor not allowed "
- "in anonymous aggregate",
+ "in anonymous aggregate",
field);
if (TYPE_HAS_COMPLEX_ASSIGN_REF (type))
cp_error_at ("member %q#D with copy assignment operator "
- "not allowed in anonymous aggregate",
+ "not allowed in anonymous aggregate",
field);
}
}
@@ -3443,26 +3425,26 @@ check_tag_decl (cp_decl_specifier_seq *declspecs)
&& TYPE_ANONYMOUS_P (declared_type))
{
/* 7/3 In a simple-declaration, the optional init-declarator-list
- can be omitted only when declaring a class (clause 9) or
- enumeration (7.2), that is, when the decl-specifier-seq contains
- either a class-specifier, an elaborated-type-specifier with
- a class-key (9.1), or an enum-specifier. In these cases and
- whenever a class-specifier or enum-specifier is present in the
- decl-specifier-seq, the identifiers in these specifiers are among
- the names being declared by the declaration (as class-name,
- enum-names, or enumerators, depending on the syntax). In such
- cases, and except for the declaration of an unnamed bit-field (9.6),
- the decl-specifier-seq shall introduce one or more names into the
- program, or shall redeclare a name introduced by a previous
- declaration. [Example:
- enum { }; // ill-formed
- typedef class { }; // ill-formed
- --end example] */
+ can be omitted only when declaring a class (clause 9) or
+ enumeration (7.2), that is, when the decl-specifier-seq contains
+ either a class-specifier, an elaborated-type-specifier with
+ a class-key (9.1), or an enum-specifier. In these cases and
+ whenever a class-specifier or enum-specifier is present in the
+ decl-specifier-seq, the identifiers in these specifiers are among
+ the names being declared by the declaration (as class-name,
+ enum-names, or enumerators, depending on the syntax). In such
+ cases, and except for the declaration of an unnamed bit-field (9.6),
+ the decl-specifier-seq shall introduce one or more names into the
+ program, or shall redeclare a name introduced by a previous
+ declaration. [Example:
+ enum { }; // ill-formed
+ typedef class { }; // ill-formed
+ --end example] */
if (saw_typedef)
- {
- error ("missing type-name in typedef-declaration");
- return NULL_TREE;
- }
+ {
+ error ("missing type-name in typedef-declaration");
+ return NULL_TREE;
+ }
/* Anonymous unions are objects, so they can have specifiers. */;
SET_ANON_AGGR_TYPE_P (declared_type);
@@ -3584,9 +3566,9 @@ groktypename (cp_decl_specifier_seq *type_specifiers,
tree
start_decl (const cp_declarator *declarator,
cp_decl_specifier_seq *declspecs,
- int initialized,
- tree attributes,
- tree prefix_attributes,
+ int initialized,
+ tree attributes,
+ tree prefix_attributes,
tree *pushed_scope_p)
{
tree decl;
@@ -3594,7 +3576,7 @@ start_decl (const cp_declarator *declarator,
tree context;
*pushed_scope_p = NULL_TREE;
-
+
/* This should only be done once on the top most decl. */
if (have_extern_spec)
{
@@ -3627,7 +3609,7 @@ start_decl (const cp_declarator *declarator,
if (context)
{
*pushed_scope_p = push_scope (context);
-
+
/* We are only interested in class contexts, later. */
if (TREE_CODE (context) == NAMESPACE_DECL)
context = NULL_TREE;
@@ -3658,7 +3640,7 @@ start_decl (const cp_declarator *declarator,
if (! toplevel_bindings_p ()
&& DECL_EXTERNAL (decl))
warning (0, "declaration of %q#D has %<extern%> and is initialized",
- decl);
+ decl);
DECL_EXTERNAL (decl) = 0;
if (toplevel_bindings_p ())
TREE_STATIC (decl) = 1;
@@ -3694,7 +3676,7 @@ start_decl (const cp_declarator *declarator,
{
if (!same_type_p (DECL_CONTEXT (field), context))
pedwarn ("ISO C++ does not permit %<%T::%D%> "
- "to be defined as %<%T::%D%>",
+ "to be defined as %<%T::%D%>",
DECL_CONTEXT (field), DECL_NAME (decl),
context, DECL_NAME (decl));
DECL_CONTEXT (decl) = DECL_CONTEXT (field);
@@ -3728,28 +3710,28 @@ start_decl (const cp_declarator *declarator,
/* cp_finish_decl sets DECL_EXTERNAL if DECL_IN_AGGR_P is set. */
DECL_IN_AGGR_P (decl) = 0;
- if ((DECL_LANG_SPECIFIC (decl) && DECL_USE_TEMPLATE (decl))
- || CLASSTYPE_TEMPLATE_INSTANTIATION (context))
- {
- /* Do not mark DECL as an explicit specialization if it was
- not already marked as an instantiation; a declaration
- should never be marked as a specialization unless we know
- what template is being specialized. */
- if (DECL_LANG_SPECIFIC (decl) && DECL_USE_TEMPLATE (decl))
- SET_DECL_TEMPLATE_SPECIALIZATION (decl);
+ /* Do not mark DECL as an explicit specialization if it was not
+ already marked as an instantiation; a declaration should
+ never be marked as a specialization unless we know what
+ template is being specialized. */
+ if (DECL_LANG_SPECIFIC (decl) && DECL_USE_TEMPLATE (decl))
+ {
+ SET_DECL_TEMPLATE_SPECIALIZATION (decl);
+
/* [temp.expl.spec] An explicit specialization of a static data
member of a template is a definition if the declaration
includes an initializer; otherwise, it is a declaration.
We check for processing_specialization so this only applies
to the new specialization syntax. */
- if (DECL_INITIAL (decl) == NULL_TREE && processing_specialization)
+ if (!DECL_INITIAL (decl)
+ && processing_specialization)
DECL_EXTERNAL (decl) = 1;
}
if (DECL_EXTERNAL (decl) && ! DECL_TEMPLATE_SPECIALIZATION (decl))
pedwarn ("declaration of %q#D outside of class is not definition",
- decl);
+ decl);
}
/* Enter this declaration into the symbol table. */
@@ -3877,7 +3859,7 @@ grok_reference_init (tree decl, tree type, tree init, tree *cleanup)
if (TREE_CODE (init) == CONSTRUCTOR)
{
error ("ISO C++ forbids use of initializer list to "
- "initialize reference %qD", decl);
+ "initialize reference %qD", decl);
return NULL_TREE;
}
@@ -4064,10 +4046,10 @@ maybe_commonize_var (tree decl)
TREE_PUBLIC (decl) = 0;
DECL_COMMON (decl) = 0;
cp_warning_at ("sorry: semantics of inline function static "
- "data %q#D are wrong (you'll wind up "
- "with multiple copies)", decl);
+ "data %q#D are wrong (you'll wind up "
+ "with multiple copies)", decl);
warning (0, "%J you can work around this by removing "
- "the initializer",
+ "the initializer",
decl);
}
}
@@ -4374,7 +4356,7 @@ reshape_init (tree type, tree *initp)
}
/* If there are more initializers than necessary, issue a
- diagnostic. */
+ diagnostic. */
if (*initp)
{
if (brace_enclosed_p)
@@ -4485,7 +4467,7 @@ check_initializer (tree decl, tree init, int flags, tree *cleanup)
if (TYPE_NON_AGGREGATE_CLASS (type))
{
error ("%qD must be initialized by constructor, "
- "not by %<{...}%>",
+ "not by %<{...}%>",
decl);
init = error_mark_node;
}
@@ -4783,7 +4765,7 @@ cp_finish_decl (tree decl, tree init, tree asmspec_tree, int flags)
&& !DECL_PRETTY_FUNCTION_P (decl)
&& !dependent_type_p (TREE_TYPE (decl)))
maybe_deduce_size_from_array_init (decl, init);
-
+
goto finish_end;
}
@@ -4814,7 +4796,7 @@ cp_finish_decl (tree decl, tree init, tree asmspec_tree, int flags)
}
/* A reference will be modified here, as it is initialized. */
- if (! DECL_EXTERNAL (decl)
+ if (! DECL_EXTERNAL (decl)
&& TREE_READONLY (decl)
&& TREE_CODE (type) == REFERENCE_TYPE)
{
@@ -4846,6 +4828,16 @@ cp_finish_decl (tree decl, tree init, tree asmspec_tree, int flags)
"initialized", decl);
init = NULL_TREE;
}
+ if (DECL_EXTERNAL (decl) && init)
+ {
+ /* The static data member cannot be initialized by a
+ non-constant when being declared. */
+ error ("%qD cannot be initialized by a non-constant expression"
+ " when being declared", decl);
+ DECL_INITIALIZED_IN_CLASS_P (decl) = 0;
+ init = NULL_TREE;
+ }
+
/* Handle:
[dcl.init]
@@ -4935,7 +4927,7 @@ cp_finish_decl (tree decl, tree init, tree asmspec_tree, int flags)
else if (!TREE_STATIC (decl))
initialize_local_var (decl, init);
}
-
+
/* If a variable is defined, and then a subsequent
definition with external linkage is encountered, we will
get here twice for the same variable. We want to avoid
@@ -4945,8 +4937,8 @@ cp_finish_decl (tree decl, tree init, tree asmspec_tree, int flags)
initializer. It is not legal to redeclare a static data
member, so this issue does not arise in that case. */
if (var_definition_p && TREE_STATIC (decl))
- expand_static_init (decl, init);
- }
+ expand_static_init (decl, init);
+ }
}
/* If a CLEANUP_STMT was created to destroy a temporary bound to a
@@ -5056,7 +5048,7 @@ get_atexit_node (void)
{
/* The declaration for `atexit' is:
- int atexit (void (*)());
+ int atexit (void (*)());
We build up the argument types and then then function type
itself. */
@@ -5255,16 +5247,16 @@ expand_static_init (tree decl, tree init)
/* Emit code to perform this initialization but once. This code
looks like:
- static <type> guard;
- if (!guard.first_byte) {
+ static <type> guard;
+ if (!guard.first_byte) {
if (__cxa_guard_acquire (&guard)) {
bool flag = false;
try {
- // Do initialization.
- flag = true; __cxa_guard_release (&guard);
- // Register variable for destruction at end of program.
+ // Do initialization.
+ flag = true; __cxa_guard_release (&guard);
+ // Register variable for destruction at end of program.
} catch {
- if (!flag) __cxa_guard_abort (&guard);
+ if (!flag) __cxa_guard_abort (&guard);
}
}
@@ -5275,11 +5267,11 @@ expand_static_init (tree decl, tree init)
[stmt.dcl]
- If the initialization exits by throwing an exception, the
+ If the initialization exits by throwing an exception, the
initialization is not complete, so it will be tried again
the next time control enters the declaration.
- This process should be thread-safe, too; multiple threads
+ This process should be thread-safe, too; multiple threads
should not be able to initialize the variable more than
once. */
@@ -5438,12 +5430,12 @@ member_function_or_else (tree ctype, tree cur_type, enum overload_flags flags)
static void
bad_specifiers (tree object,
- const char* type,
- int virtualp,
- int quals,
- int inlinep,
- int friendp,
- int raises)
+ const char* type,
+ int virtualp,
+ int quals,
+ int inlinep,
+ int friendp,
+ int raises)
{
if (virtualp)
error ("%qD declared as a %<virtual%> %s", object, type);
@@ -5451,8 +5443,8 @@ bad_specifiers (tree object,
error ("%qD declared as an %<inline%> %s", object, type);
if (quals)
error ("%<const%> and %<volatile%> function specifiers on "
- "%qD invalid in %s declaration",
- object, type);
+ "%qD invalid in %s declaration",
+ object, type);
if (friendp)
cp_error_at ("%qD declared as a friend", object);
if (raises
@@ -5483,22 +5475,22 @@ bad_specifiers (tree object,
static tree
grokfndecl (tree ctype,
- tree type,
- tree declarator,
+ tree type,
+ tree declarator,
tree parms,
- tree orig_declarator,
- int virtualp,
- enum overload_flags flags,
+ tree orig_declarator,
+ int virtualp,
+ enum overload_flags flags,
cp_cv_quals quals,
- tree raises,
- int check,
- int friendp,
- int publicp,
- int inlinep,
+ tree raises,
+ int check,
+ int friendp,
+ int publicp,
+ int inlinep,
special_function_kind sfk,
- int funcdef_flag,
- int template_count,
- tree in_namespace,
+ int funcdef_flag,
+ int template_count,
+ tree in_namespace,
tree* attrlist)
{
tree decl;
@@ -5588,8 +5580,8 @@ grokfndecl (tree ctype,
decl);
if (DECL_ORIGINAL_TYPE (TYPE_NAME (t)))
cp_pedwarn_at ("%q#D does not refer to the unqualified "
- "type, so it is not used for linkage",
- TYPE_NAME (t));
+ "type, so it is not used for linkage",
+ TYPE_NAME (t));
}
}
else
@@ -5622,7 +5614,7 @@ grokfndecl (tree ctype,
}
if (IDENTIFIER_OPNAME_P (DECL_NAME (decl)))
- grok_op_properties (decl, friendp, /*complain=*/true);
+ grok_op_properties (decl, /*complain=*/true);
if (ctype && decl_function_context (decl))
DECL_NO_STATIC_CHAIN (decl) = 1;
@@ -5651,8 +5643,8 @@ grokfndecl (tree ctype,
{
/* Something like `template <class T> friend void f<T>()'. */
error ("invalid use of template-id %qD in declaration "
- "of primary template",
- orig_declarator);
+ "of primary template",
+ orig_declarator);
return NULL_TREE;
}
@@ -5661,17 +5653,17 @@ grokfndecl (tree ctype,
the information in the TEMPLATE_ID_EXPR. */
SET_DECL_IMPLICIT_INSTANTIATION (decl);
- if (TREE_CODE (fns) == COMPONENT_REF)
- {
- /* 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. */
+ if (TREE_CODE (fns) == COMPONENT_REF)
+ {
+ /* 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. */
- gcc_assert (TREE_TYPE (TREE_OPERAND (fns, 0))
+ gcc_assert (TREE_TYPE (TREE_OPERAND (fns, 0))
== current_class_type);
- fns = TREE_OPERAND (fns, 1);
- }
+ fns = TREE_OPERAND (fns, 1);
+ }
gcc_assert (TREE_CODE (fns) == IDENTIFIER_NODE
|| TREE_CODE (fns) == OVERLOAD);
DECL_TEMPLATE_INFO (decl) = tree_cons (fns, args, NULL_TREE);
@@ -5679,16 +5671,16 @@ grokfndecl (tree ctype,
if (has_default_arg)
{
error ("default arguments are not allowed in declaration "
- "of friend template specialization %qD",
- decl);
+ "of friend template specialization %qD",
+ decl);
return NULL_TREE;
}
if (inlinep)
{
error ("%<inline%> is not allowed in declaration of friend "
- "template specialization %qD",
- decl);
+ "template specialization %qD",
+ decl);
return NULL_TREE;
}
}
@@ -5737,7 +5729,7 @@ grokfndecl (tree ctype,
(processing_template_decl
> template_class_depth (ctype))
? current_template_parms
- : NULL_TREE);
+ : NULL_TREE);
if (old_decl && TREE_CODE (old_decl) == TEMPLATE_DECL)
/* Because grokfndecl is always supposed to return a
@@ -5819,11 +5811,11 @@ set_linkage_for_static_data_member (tree decl)
static tree
grokvardecl (tree type,
- tree name,
+ tree name,
const cp_decl_specifier_seq *declspecs,
- int initialized,
- int constp,
- tree scope)
+ int initialized,
+ int constp,
+ tree scope)
{
tree decl;
tree explicit_scope;
@@ -6047,7 +6039,7 @@ check_static_variable_definition (tree decl, tree type)
if (!ARITHMETIC_TYPE_P (type) && TREE_CODE (type) != ENUMERAL_TYPE)
{
error ("invalid in-class initialization of static data member "
- "of non-integral type %qT",
+ "of non-integral type %qT",
type);
/* If we just return the declaration, crashes will sometimes
occur. We therefore return void_type_node, as if this were a
@@ -6057,11 +6049,11 @@ check_static_variable_definition (tree decl, tree type)
}
else if (!CP_TYPE_CONST_P (type))
error ("ISO C++ forbids in-class initialization of non-const "
- "static member %qD",
- decl);
+ "static member %qD",
+ decl);
else if (pedantic && !INTEGRAL_TYPE_P (type))
pedwarn ("ISO C++ forbids initialization of member constant "
- "%qD of non-integral type %qT", decl, type);
+ "%qD of non-integral type %qT", decl, type);
return 0;
}
@@ -6138,7 +6130,7 @@ compute_array_index_type (tree name, tree size)
/* `(int) &fn' is not a valid array bound. */
if (name)
error ("size of array %qD is not an integral constant-expression",
- name);
+ name);
else
error ("size of array is not an integral constant-expression");
}
@@ -6158,9 +6150,9 @@ compute_array_index_type (tree name, tree size)
HOST_WIDE_INT saved_processing_template_decl;
/* Compute the index of the largest element in the array. It is
- one less than the number of elements in the array. We save
- and restore PROCESSING_TEMPLATE_DECL so that computations in
- cp_build_binary_op will be appropriately folded. */
+ one less than the number of elements in the array. We save
+ and restore PROCESSING_TEMPLATE_DECL so that computations in
+ cp_build_binary_op will be appropriately folded. */
saved_processing_template_decl = processing_template_decl;
processing_template_decl = 0;
itype = cp_build_binary_op (MINUS_EXPR,
@@ -6173,8 +6165,8 @@ compute_array_index_type (tree name, tree size)
/* A variable sized array. */
itype = variable_size (itype);
/* Make sure that there was no overflow when creating to a signed
- index type. (For example, on a 32-bit machine, an array with
- size 2^32 - 1 is too big.) */
+ index type. (For example, on a 32-bit machine, an array with
+ size 2^32 - 1 is too big.) */
else if (TREE_OVERFLOW (itype))
{
error ("overflow in array dimension");
@@ -6266,11 +6258,11 @@ create_array_type_for_decl (tree name, tree type, tree size)
{
if (name)
error ("declaration of %qD as multidimensional array must "
- "have bounds for all dimensions except the first",
- name);
+ "have bounds for all dimensions except the first",
+ name);
else
error ("multidimensional array must have bounds for all "
- "dimensions except the first");
+ "dimensions except the first");
return error_mark_node;
}
@@ -6297,8 +6289,8 @@ create_array_type_for_decl (tree name, tree type, tree size)
static tree
check_special_function_return_type (special_function_kind sfk,
- tree type,
- tree optype)
+ tree type,
+ tree optype)
{
switch (sfk)
{
@@ -6361,7 +6353,7 @@ check_var_type (tree identifier, tree type)
error ("variable or field declared void");
type = integer_type_node;
}
-
+
return type;
}
@@ -6407,9 +6399,9 @@ check_var_type (tree identifier, tree type)
tree
grokdeclarator (const cp_declarator *declarator,
const cp_decl_specifier_seq *declspecs,
- enum decl_context decl_context,
- int initialized,
- tree* attrlist)
+ enum decl_context decl_context,
+ int initialized,
+ tree* attrlist)
{
tree type = NULL_TREE;
int longlong = 0;
@@ -6536,13 +6528,13 @@ grokdeclarator (const cp_declarator *declarator,
error ("declaration of %qD as non-function", decl);
return error_mark_node;
}
- else if (!qualifying_scope
+ else if (!qualifying_scope
&& !(current_class_type && at_class_scope_p ()))
{
error ("declaration of %qD as non-member", decl);
return error_mark_node;
}
-
+
type = TREE_OPERAND (decl, 0);
name = IDENTIFIER_POINTER (constructor_name (type));
}
@@ -6899,26 +6891,26 @@ grokdeclarator (const cp_declarator *declarator,
type_quals |= TYPE_QUAL_RESTRICT;
if (sfk == sfk_conversion && type_quals != TYPE_UNQUALIFIED)
error ("qualifiers are not allowed on declaration of %<operator %T%>",
- ctor_return_type);
+ ctor_return_type);
- if (TREE_CODE (type) == FUNCTION_TYPE
+ if (TREE_CODE (type) == FUNCTION_TYPE
&& type_quals != TYPE_UNQUALIFIED)
{
/* This was an error in C++98 (cv-qualifiers cannot be added to
- a function type), but DR 295 makes the code well-formed by
- dropping the extra qualifiers. */
+ a function type), but DR 295 makes the code well-formed by
+ dropping the extra qualifiers. */
if (pedantic)
- {
- tree bad_type = build_qualified_type (type, type_quals);
- pedwarn ("ignoring %qV qualifiers added to function type %qT",
- bad_type, type);
- }
+ {
+ tree bad_type = build_qualified_type (type, type_quals);
+ pedwarn ("ignoring %qV qualifiers added to function type %qT",
+ bad_type, type);
+ }
type_quals = TYPE_UNQUALIFIED;
}
type_quals |= cp_type_quals (type);
type = cp_build_qualified_type_real
(type, type_quals, ((typedef_decl && !DECL_ARTIFICIAL (typedef_decl)
- ? tf_ignore_bad_quals : 0) | tf_error | tf_warning));
+ ? tf_ignore_bad_quals : 0) | tf_error | tf_warning));
/* We might have ignored or rejected some of the qualifiers. */
type_quals = cp_type_quals (type);
@@ -7126,7 +7118,7 @@ grokdeclarator (const cp_declarator *declarator,
Make sure we have a valid type for the function to return. */
/* We now know that the TYPE_QUALS don't apply to the
- decl, but to its return type. */
+ decl, but to its return type. */
type_quals = TYPE_UNQUALIFIED;
/* Warn about some types functions can't return. */
@@ -7188,7 +7180,7 @@ grokdeclarator (const cp_declarator *declarator,
return void_type_node;
}
}
- else /* It's a constructor. */
+ else /* It's a constructor. */
{
if (explicitp == 1)
explicitp = 2;
@@ -7236,8 +7228,8 @@ grokdeclarator (const cp_declarator *declarator,
error ("friend declaration not in class definition");
if (current_function_decl && funcdef_flag)
error ("can't define friend function %qs in a local "
- "class definition",
- name);
+ "class definition",
+ name);
}
arg_types = grokparms (declarator->u.function.parameters,
@@ -7254,7 +7246,7 @@ grokdeclarator (const cp_declarator *declarator,
}
type = build_function_type (type, arg_types);
- type = cp_build_qualified_type (type, quals);
+ type = cp_build_qualified_type (type, quals);
}
break;
@@ -7288,12 +7280,12 @@ grokdeclarator (const cp_declarator *declarator,
|| (quals && TREE_CODE (type) == METHOD_TYPE)))
{
tree dummy;
-
- /* If the type is a FUNCTION_TYPE, pick up the
- qualifiers from that function type. No other
- qualifiers may be supplied. */
- if (TREE_CODE (type) == FUNCTION_TYPE)
- quals = cp_type_quals (type);
+
+ /* If the type is a FUNCTION_TYPE, pick up the
+ qualifiers from that function type. No other
+ qualifiers may be supplied. */
+ if (TREE_CODE (type) == FUNCTION_TYPE)
+ quals = cp_type_quals (type);
dummy = build_decl (TYPE_DECL, NULL_TREE, type);
grok_method_quals (declarator->u.pointer.class_type,
@@ -7421,7 +7413,7 @@ grokdeclarator (const cp_declarator *declarator,
else
{
error ("cannot declare member function %<%T::%s%> within %<%T%>",
- ctype, name, current_class_type);
+ ctype, name, current_class_type);
return error_mark_node;
}
}
@@ -7461,6 +7453,7 @@ grokdeclarator (const cp_declarator *declarator,
if (TREE_CODE (type) == ARRAY_TYPE
&& COMPLETE_TYPE_P (type)
+ && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
&& TREE_OVERFLOW (TYPE_SIZE (type)))
{
error ("size of array %qs is too large", name);
@@ -7483,7 +7476,7 @@ grokdeclarator (const cp_declarator *declarator,
if (explicitp == 1 || (explicitp && friendp))
{
/* [dcl.fct.spec] The explicit specifier shall only be used in
- declarations of constructors within a class definition. */
+ declarations of constructors within a class definition. */
error ("only declarations of constructors can be %<explicit%>");
explicitp = 0;
}
@@ -7491,21 +7484,21 @@ grokdeclarator (const cp_declarator *declarator,
if (storage_class == sc_mutable)
{
if (decl_context != FIELD || friendp)
- {
+ {
error ("non-member %qs cannot be declared %<mutable%>", name);
storage_class = sc_none;
- }
+ }
else if (decl_context == TYPENAME || declspecs->specs[(int)ds_typedef])
{
error ("non-object member %qs cannot be declared %<mutable%>", name);
storage_class = sc_none;
}
else if (TREE_CODE (type) == FUNCTION_TYPE
- || TREE_CODE (type) == METHOD_TYPE)
- {
+ || TREE_CODE (type) == METHOD_TYPE)
+ {
error ("function %qs cannot be declared %<mutable%>", name);
storage_class = sc_none;
- }
+ }
else if (staticp)
{
error ("static %qs cannot be declared %<mutable%>", name);
@@ -7540,7 +7533,7 @@ grokdeclarator (const cp_declarator *declarator,
if (!current_function_decl)
DECL_CONTEXT (decl) = FROB_CONTEXT (current_namespace);
else if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (current_function_decl)
- || (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P
+ || (DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P
(current_function_decl)))
/* The TYPE_DECL is "abstract" because there will be
clones of this constructor/destructor, and there will
@@ -7592,12 +7585,12 @@ grokdeclarator (const cp_declarator *declarator,
{
if (ctype == NULL_TREE)
{
- if (TREE_CODE (type) == METHOD_TYPE)
+ if (TREE_CODE (type) == METHOD_TYPE)
ctype = TYPE_METHOD_BASETYPE (type);
- /* Any qualifiers on a function type typedef have
- already been dealt with. */
- else if (TREE_CODE (type) == FUNCTION_TYPE)
- quals = TYPE_UNQUALIFIED;
+ /* Any qualifiers on a function type typedef have
+ already been dealt with. */
+ else if (TREE_CODE (type) == FUNCTION_TYPE)
+ quals = TYPE_UNQUALIFIED;
}
if (ctype != NULL_TREE)
grok_method_quals (ctype, decl, quals);
@@ -7642,21 +7635,21 @@ grokdeclarator (const cp_declarator *declarator,
parms = nreverse (decls);
if (decl_context != TYPENAME)
- {
- /* A cv-qualifier-seq shall only be part of the function type
- for a non-static member function. [8.3.5/4 dcl.fct] */
- if (cp_type_quals (type) != TYPE_UNQUALIFIED
- && (current_class_type == NULL_TREE || staticp) )
- {
- error ("qualified function types cannot be used to declare %s functions",
- (staticp? "static member" : "free"));
- type = TYPE_MAIN_VARIANT (type);
- }
-
- /* The qualifiers on the function type become the qualifiers on
- the non-static member function. */
- quals |= cp_type_quals (type);
- }
+ {
+ /* A cv-qualifier-seq shall only be part of the function type
+ for a non-static member function. [8.3.5/4 dcl.fct] */
+ if (cp_type_quals (type) != TYPE_UNQUALIFIED
+ && (current_class_type == NULL_TREE || staticp) )
+ {
+ error ("qualified function types cannot be used to declare %s functions",
+ (staticp? "static member" : "free"));
+ type = TYPE_MAIN_VARIANT (type);
+ }
+
+ /* The qualifiers on the function type become the qualifiers on
+ the non-static member function. */
+ quals |= cp_type_quals (type);
+ }
}
/* If this is a type name (such as, in a cast or sizeof),
@@ -7689,11 +7682,11 @@ grokdeclarator (const cp_declarator *declarator,
if (TREE_CODE (type) == TEMPLATE_TYPE_PARM)
pedwarn ("template parameters cannot be friends");
else if (TREE_CODE (type) == TYPENAME_TYPE)
- pedwarn ("friend declaration requires class-key, "
+ pedwarn ("friend declaration requires class-key, "
"i.e. %<friend class %T::%D%>",
TYPE_CONTEXT (type), TYPENAME_TYPE_FULLNAME (type));
else
- pedwarn ("friend declaration requires class-key, "
+ pedwarn ("friend declaration requires class-key, "
"i.e. %<friend %#T%>",
type);
}
@@ -7707,7 +7700,7 @@ grokdeclarator (const cp_declarator *declarator,
/*complain=*/true);
else
error ("trying to make class %qT a friend of global scope",
- type);
+ type);
type = void_type_node;
}
@@ -7717,9 +7710,9 @@ grokdeclarator (const cp_declarator *declarator,
if (ctype == NULL_TREE)
{
if (TREE_CODE (type) != METHOD_TYPE)
- error ("invalid qualifiers on non-member function type");
+ error ("invalid qualifiers on non-member function type");
else
- ctype = TYPE_METHOD_BASETYPE (type);
+ ctype = TYPE_METHOD_BASETYPE (type);
}
if (ctype)
{
@@ -7840,7 +7833,7 @@ grokdeclarator (const cp_declarator *declarator,
if (virtualp)
{
error ("%qD cannot be declared virtual, since it "
- "is always static",
+ "is always static",
unqualified_id);
virtualp = 0;
}
@@ -7853,11 +7846,11 @@ grokdeclarator (const cp_declarator *declarator,
/* Check that the name used for a destructor makes sense. */
if (sfk == sfk_destructor
- && !same_type_p (TREE_OPERAND
+ && !same_type_p (TREE_OPERAND
(id_declarator->u.id.unqualified_name, 0),
ctype))
{
- error ("declaration of %qD as member of %qT",
+ error ("declaration of %qD as member of %qT",
id_declarator->u.id.unqualified_name,
ctype);
return error_mark_node;
@@ -7923,8 +7916,8 @@ grokdeclarator (const cp_declarator *declarator,
unqualified_id,
virtualp, flags, quals, raises,
friendp ? -1 : 0, friendp, 1, 0, sfk,
- funcdef_flag, template_count, in_namespace,
- attrlist);
+ funcdef_flag, template_count, in_namespace,
+ attrlist);
if (decl == NULL_TREE)
return NULL_TREE;
}
@@ -7945,7 +7938,7 @@ grokdeclarator (const cp_declarator *declarator,
&& declspecs->type
&& declspecs->type == type)
error (" in instantiation of template %qT",
- current_class_type);
+ current_class_type);
type = error_mark_node;
decl = NULL_TREE;
@@ -7955,7 +7948,7 @@ grokdeclarator (const cp_declarator *declarator,
if (friendp)
{
error ("%qE is neither function nor member function; "
- "cannot be declared friend", unqualified_id);
+ "cannot be declared friend", unqualified_id);
friendp = 0;
}
decl = NULL_TREE;
@@ -7966,7 +7959,7 @@ grokdeclarator (const cp_declarator *declarator,
/* Friends are treated specially. */
if (ctype == current_class_type)
warning (0, "member functions are implicitly friends of their class");
- else if (decl && DECL_NAME (decl))
+ else if (decl && DECL_NAME (decl))
{
if (template_class_depth (current_class_type) == 0)
{
@@ -8081,10 +8074,10 @@ grokdeclarator (const cp_declarator *declarator,
{
if (storage_class == sc_static)
pedwarn ("%<static%> specified invalid for function %qs "
- "declared out of global scope", name);
+ "declared out of global scope", name);
else
pedwarn ("%<inline%> specifier invalid for function %qs "
- "declared out of global scope", name);
+ "declared out of global scope", name);
}
if (ctype == NULL_TREE)
@@ -8123,7 +8116,7 @@ grokdeclarator (const cp_declarator *declarator,
if (TREE_CODE (type) == METHOD_TYPE)
{
pedwarn ("cannot declare member function %qD to have "
- "static linkage", decl);
+ "static linkage", decl);
invalid_static = 1;
}
else if (current_function_decl)
@@ -8158,9 +8151,9 @@ grokdeclarator (const cp_declarator *declarator,
DECL_CONTEXT (decl) = ctype;
if (staticp == 1)
{
- pedwarn ("%<static%> may not be used when defining "
- "(as opposed to declaring) a static data member");
- staticp = 0;
+ pedwarn ("%<static%> may not be used when defining "
+ "(as opposed to declaring) a static data member");
+ staticp = 0;
storage_class = sc_none;
}
if (storage_class == sc_register && TREE_STATIC (decl))
@@ -8170,9 +8163,9 @@ grokdeclarator (const cp_declarator *declarator,
}
if (storage_class == sc_extern && pedantic)
{
- pedwarn ("cannot explicitly declare member %q#D to have "
- "extern linkage",
- decl);
+ pedwarn ("cannot explicitly declare member %q#D to have "
+ "extern linkage",
+ decl);
storage_class = sc_none;
}
}
@@ -8210,8 +8203,8 @@ require_complete_types_for_parms (tree parms)
if (dependent_type_p (TREE_TYPE (parms)))
continue;
if (VOID_TYPE_P (TREE_TYPE (parms)))
- /* grokparms will have already issued an error. */
- TREE_TYPE (parms) = error_mark_node;
+ /* grokparms will have already issued an error. */
+ TREE_TYPE (parms) = error_mark_node;
else if (complete_type_or_else (TREE_TYPE (parms), parms))
{
layout_decl (parms, 0);
@@ -8314,10 +8307,10 @@ check_default_argument (tree decl, tree arg)
{
if (decl)
error ("default argument for %q#D has type %qT",
- decl, TREE_TYPE (arg));
+ decl, TREE_TYPE (arg));
else
error ("default argument for parameter of type %qT has type %qT",
- decl_type, TREE_TYPE (arg));
+ decl_type, TREE_TYPE (arg));
return error_mark_node;
}
@@ -8367,32 +8360,32 @@ grokparms (cp_parameter_declarator *first_parm, tree *parms)
tree decl;
if (parm == no_parameters)
- break;
+ break;
attrs = parm->decl_specifiers.attributes;
parm->decl_specifiers.attributes = NULL_TREE;
decl = grokdeclarator (parm->declarator, &parm->decl_specifiers,
PARM, init != NULL_TREE, &attrs);
if (! decl || TREE_TYPE (decl) == error_mark_node)
- continue;
+ continue;
if (attrs)
cplus_decl_attributes (&decl, attrs, 0);
type = TREE_TYPE (decl);
if (VOID_TYPE_P (type))
- {
- if (same_type_p (type, void_type_node)
- && !DECL_NAME (decl) && !result && !parm->next && !ellipsis)
- /* this is a parmlist of `(void)', which is ok. */
- break;
- cxx_incomplete_type_error (decl, type);
+ {
+ if (same_type_p (type, void_type_node)
+ && !DECL_NAME (decl) && !result && !parm->next && !ellipsis)
+ /* this is a parmlist of `(void)', which is ok. */
+ break;
+ cxx_incomplete_type_error (decl, type);
/* It's not a good idea to actually create parameters of
type `void'; other parts of the compiler assume that a
void type terminates the parameter list. */
type = error_mark_node;
TREE_TYPE (decl) = error_mark_node;
- }
+ }
if (type != error_mark_node)
{
@@ -8414,20 +8407,20 @@ grokparms (cp_parameter_declarator *first_parm, tree *parms)
tree t = TREE_TYPE (type);
int ptr = TYPE_PTR_P (type);
- while (1)
- {
- if (TYPE_PTR_P (t))
- ptr = 1;
- else if (TREE_CODE (t) != ARRAY_TYPE)
- break;
- else if (!TYPE_DOMAIN (t))
- break;
- t = TREE_TYPE (t);
- }
+ while (1)
+ {
+ if (TYPE_PTR_P (t))
+ ptr = 1;
+ else if (TREE_CODE (t) != ARRAY_TYPE)
+ break;
+ else if (!TYPE_DOMAIN (t))
+ break;
+ t = TREE_TYPE (t);
+ }
if (TREE_CODE (t) == ARRAY_TYPE)
error ("parameter %qD includes %s to array of unknown "
- "bound %qT",
- decl, ptr ? "pointer" : "reference", t);
+ "bound %qT",
+ decl, ptr ? "pointer" : "reference", t);
}
if (!any_error && init)
@@ -8477,7 +8470,7 @@ copy_fn_p (tree d)
gcc_assert (DECL_FUNCTION_MEMBER_P (d));
- if (DECL_TEMPLATE_INFO (d)
+ if (DECL_TEMPLATE_INFO (d)
&& DECL_MEMBER_TEMPLATE_P (DECL_TI_TEMPLATE (d)))
/* Instantiations of template member functions are never copy
functions. Note that member functions of templated classes are
@@ -8528,11 +8521,11 @@ void grok_special_member_properties (tree decl)
{
/* [class.copy]
- A non-template constructor for class X is a copy
- constructor if its first parameter is of type X&, const
- X&, volatile X& or const volatile X&, and either there
- are no other parameters or else all other parameters have
- default arguments. */
+ A non-template constructor for class X is a copy
+ constructor if its first parameter is of type X&, const
+ X&, volatile X& or const volatile X&, and either there
+ are no other parameters or else all other parameters have
+ default arguments. */
TYPE_HAS_INIT_REF (DECL_CONTEXT (decl)) = 1;
if (ctor > 1)
TYPE_HAS_CONST_INIT_REF (DECL_CONTEXT (decl)) = 1;
@@ -8544,9 +8537,9 @@ void grok_special_member_properties (tree decl)
{
/* [class.copy]
- A non-template assignment operator for class X is a copy
- assignment operator if its parameter is of type X, X&, const
- X&, volatile X& or const volatile X&. */
+ A non-template assignment operator for class X is a copy
+ assignment operator if its parameter is of type X, X&, const
+ X&, volatile X& or const volatile X&. */
int assop = copy_fn_p (decl);
@@ -8571,19 +8564,19 @@ grok_ctor_properties (tree ctype, tree decl)
{
/* [class.copy]
- A declaration of a constructor for a class X is ill-formed if
- its first parameter is of type (optionally cv-qualified) X
- and either there are no other parameters or else all other
- parameters have default arguments.
-
- We *don't* complain about member template instantiations that
- have this form, though; they can occur as we try to decide
- what constructor to use during overload resolution. Since
- overload resolution will never prefer such a constructor to
- the non-template copy constructor (which is either explicitly
- or implicitly defined), there's no need to worry about their
- existence. Theoretically, they should never even be
- instantiated, but that's hard to forestall. */
+ A declaration of a constructor for a class X is ill-formed if
+ its first parameter is of type (optionally cv-qualified) X
+ and either there are no other parameters or else all other
+ parameters have default arguments.
+
+ We *don't* complain about member template instantiations that
+ have this form, though; they can occur as we try to decide
+ what constructor to use during overload resolution. Since
+ overload resolution will never prefer such a constructor to
+ the non-template copy constructor (which is either explicitly
+ or implicitly defined), there's no need to worry about their
+ existence. Theoretically, they should never even be
+ instantiated, but that's hard to forestall. */
error ("invalid constructor; you probably meant %<%T (const %T&)%>",
ctype, ctype);
return 0;
@@ -8599,7 +8592,7 @@ ambi_op_p (enum tree_code code)
{
return (code == INDIRECT_REF
|| code == ADDR_EXPR
- || code == CONVERT_EXPR
+ || code == UNARY_PLUS_EXPR
|| code == NEGATE_EXPR
|| code == PREINCREMENT_EXPR
|| code == PREDECREMENT_EXPR);
@@ -8620,7 +8613,7 @@ unary_op_p (enum tree_code code)
errors are issued for invalid declarations. */
void
-grok_op_properties (tree decl, int friendp, bool complain)
+grok_op_properties (tree decl, bool complain)
{
tree argtypes = TYPE_ARG_TYPES (TREE_TYPE (decl));
tree argtype;
@@ -8628,6 +8621,7 @@ grok_op_properties (tree decl, int friendp, bool complain)
tree name = DECL_NAME (decl);
enum tree_code operator_code;
int arity;
+ tree class_type;
/* Count the number of arguments. */
for (argtype = argtypes, arity = 0;
@@ -8635,8 +8629,9 @@ grok_op_properties (tree decl, int friendp, bool complain)
argtype = TREE_CHAIN (argtype))
++arity;
- if (current_class_type == NULL_TREE)
- friendp = 1;
+ class_type = DECL_CONTEXT (decl);
+ if (class_type && !CLASS_TYPE_P (class_type))
+ class_type = NULL_TREE;
if (DECL_CONV_FN_P (decl))
operator_code = TYPE_EXPR;
@@ -8665,30 +8660,28 @@ grok_op_properties (tree decl, int friendp, bool complain)
gcc_assert (operator_code != LAST_CPLUS_TREE_CODE);
SET_OVERLOADED_OPERATOR_CODE (decl, operator_code);
- if (! friendp)
- {
- switch (operator_code)
- {
- case NEW_EXPR:
- TYPE_HAS_NEW_OPERATOR (current_class_type) = 1;
- break;
+ if (class_type)
+ switch (operator_code)
+ {
+ case NEW_EXPR:
+ TYPE_HAS_NEW_OPERATOR (class_type) = 1;
+ break;
- case DELETE_EXPR:
- TYPE_GETS_DELETE (current_class_type) |= 1;
- break;
+ case DELETE_EXPR:
+ TYPE_GETS_DELETE (class_type) |= 1;
+ break;
- case VEC_NEW_EXPR:
- TYPE_HAS_ARRAY_NEW_OPERATOR (current_class_type) = 1;
- break;
+ case VEC_NEW_EXPR:
+ TYPE_HAS_ARRAY_NEW_OPERATOR (class_type) = 1;
+ break;
- case VEC_DELETE_EXPR:
- TYPE_GETS_DELETE (current_class_type) |= 2;
- break;
+ case VEC_DELETE_EXPR:
+ TYPE_GETS_DELETE (class_type) |= 2;
+ break;
- default:
- break;
- }
- }
+ default:
+ break;
+ }
/* [basic.std.dynamic.allocation]/1:
@@ -8767,32 +8760,38 @@ grok_op_properties (tree decl, int friendp, bool complain)
if (operator_code == CALL_EXPR)
return;
- if (IDENTIFIER_TYPENAME_P (name) && ! DECL_TEMPLATE_INFO (decl))
+ /* Warn about conversion operators that will never be used. */
+ if (IDENTIFIER_TYPENAME_P (name)
+ && ! DECL_TEMPLATE_INFO (decl)
+ && warn_conversion
+ /* Warn only declaring the function; there is no need to
+ warn again about out-of-class definitions. */
+ && class_type == current_class_type)
{
tree t = TREE_TYPE (name);
- if (! friendp)
- {
- int ref = (TREE_CODE (t) == REFERENCE_TYPE);
- const char *what = 0;
+ int ref = (TREE_CODE (t) == REFERENCE_TYPE);
+ const char *what = 0;
- if (ref)
- t = TYPE_MAIN_VARIANT (TREE_TYPE (t));
+ if (ref)
+ t = TYPE_MAIN_VARIANT (TREE_TYPE (t));
- if (TREE_CODE (t) == VOID_TYPE)
- what = "void";
- else if (t == current_class_type)
+ if (TREE_CODE (t) == VOID_TYPE)
+ what = "void";
+ else if (class_type)
+ {
+ if (t == class_type)
what = "the same type";
/* Don't force t to be complete here. */
else if (IS_AGGR_TYPE (t)
&& COMPLETE_TYPE_P (t)
- && DERIVED_FROM_P (t, current_class_type))
+ && DERIVED_FROM_P (t, class_type))
what = "a base class";
-
- if (what && warn_conversion)
- warning (0, "conversion to %s%s will never use a type "
- "conversion operator",
- ref ? "a reference to " : "", what);
}
+
+ if (what)
+ warning (0, "conversion to %s%s will never use a type "
+ "conversion operator",
+ ref ? "a reference to " : "", what);
}
if (operator_code == COND_EXPR)
{
@@ -8819,7 +8818,7 @@ grok_op_properties (tree decl, int friendp, bool complain)
operator_code = BIT_AND_EXPR;
break;
- case CONVERT_EXPR:
+ case UNARY_PLUS_EXPR:
operator_code = PLUS_EXPR;
break;
@@ -8882,7 +8881,7 @@ grok_op_properties (tree decl, int friendp, bool complain)
|| !same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (ret)),
arg))
warning (0, "prefix %qD should return %qT", decl,
- build_reference_type (arg));
+ build_reference_type (arg));
}
else
{
@@ -8917,7 +8916,7 @@ grok_op_properties (tree decl, int friendp, bool complain)
|| operator_code == TRUTH_ORIF_EXPR
|| operator_code == COMPOUND_EXPR))
warning (0, "user-defined %qD always evaluates both arguments",
- decl);
+ decl);
}
/* Effective C++ rule 23. */
@@ -8934,19 +8933,19 @@ grok_op_properties (tree decl, int friendp, bool complain)
/* [over.oper]/8 */
for (; argtypes && argtypes != void_list_node;
- argtypes = TREE_CHAIN (argtypes))
- if (TREE_PURPOSE (argtypes))
- {
- TREE_PURPOSE (argtypes) = NULL_TREE;
- if (operator_code == POSTINCREMENT_EXPR
+ argtypes = TREE_CHAIN (argtypes))
+ if (TREE_PURPOSE (argtypes))
+ {
+ TREE_PURPOSE (argtypes) = NULL_TREE;
+ if (operator_code == POSTINCREMENT_EXPR
|| operator_code == POSTDECREMENT_EXPR)
- {
- if (pedantic)
- pedwarn ("%qD cannot have default arguments", decl);
- }
- else
- error ("%qD cannot have default arguments", decl);
- }
+ {
+ if (pedantic)
+ pedwarn ("%qD cannot have default arguments", decl);
+ }
+ else
+ error ("%qD cannot have default arguments", decl);
+ }
}
@@ -9269,7 +9268,7 @@ xref_tag (enum tag_types tag_code, tree name,
DECL_ANTICIPATED (TYPE_TI_TEMPLATE (t)) = 0;
DECL_FRIEND_P (TYPE_TI_TEMPLATE (t)) = 0;
}
- }
+ }
}
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t);
@@ -9420,7 +9419,7 @@ xref_basetypes (tree ref, tree base_list)
CLASSTYPE_REPEATED_BASE_P (ref)
|= CLASSTYPE_REPEATED_BASE_P (basetype);
}
-
+
/* We must do this test after we've seen through a typedef
type. */
if (TYPE_MARKED_P (basetype))
@@ -9683,7 +9682,7 @@ finish_enum (tree enumtype)
/* Do not clobber shared ints. */
value = copy_node (value);
-
+
TREE_TYPE (value) = enumtype;
DECL_INITIAL (decl) = value;
TREE_VALUE (values) = value;
@@ -9758,7 +9757,7 @@ build_enumerator (tree name, tree value, tree enumtype)
bool overflowed;
/* The next value is the previous value plus one. We can
- safely assume that the previous value is an INTEGER_CST.
+ safely assume that the previous value is an INTEGER_CST.
add_double doesn't know the type of the target expression,
so we must check with int_fits_type_p as well. */
prev_value = DECL_INITIAL (TREE_VALUE (TYPE_VALUES (enumtype)));
@@ -9891,7 +9890,8 @@ start_preparsed_function (tree decl1, tree attrs, int flags)
int doing_friend = 0;
struct cp_binding_level *bl;
tree current_function_parms;
- struct c_fileinfo *finfo = get_fileinfo (lbasename (input_filename));
+ struct c_fileinfo *finfo
+ = get_fileinfo (lbasename (LOCATION_FILE (DECL_SOURCE_LOCATION (decl1))));
/* Sanity check. */
gcc_assert (TREE_CODE (TREE_VALUE (void_list_node)) == VOID_TYPE);
@@ -9975,7 +9975,7 @@ start_preparsed_function (tree decl1, tree attrs, int flags)
/* FIXME: Handle error_mark_node more gracefully. */
tree newdecl1 = push_template_decl (decl1);
if (newdecl1 != error_mark_node)
- decl1 = newdecl1;
+ decl1 = newdecl1;
}
/* We are now in the scope of the function being defined. */
@@ -10143,7 +10143,7 @@ start_preparsed_function (tree decl1, tree attrs, int flags)
DECL_NOT_REALLY_EXTERN (decl1) = 0;
DECL_INTERFACE_KNOWN (decl1) = 1;
/* If this function is in an interface implemented in this file,
- make sure that the backend knows to emit this function
+ make sure that the backend knows to emit this function
here. */
if (!DECL_EXTERNAL (decl1))
mark_needed (decl1);
@@ -10618,7 +10618,7 @@ finish_function (int flags)
gcc_assert (errorcount);
/* Throw away the broken statement tree and extra binding
- levels. */
+ levels. */
DECL_SAVED_TREE (fndecl) = alloc_stmt_list ();
while (current_binding_level->kind != sk_function_parms)
@@ -10766,7 +10766,7 @@ finish_function (int flags)
tree
start_method (cp_decl_specifier_seq *declspecs,
- const cp_declarator *declarator, tree attrlist)
+ const cp_declarator *declarator, tree attrlist)
{
tree fndecl = grokdeclarator (declarator, declspecs, MEMFUNCDEF, 0,
&attrlist);
@@ -11069,7 +11069,7 @@ cp_tree_node_structure (union lang_tree_node * t)
case TEMPLATE_PARM_INDEX: return TS_CP_TPI;
case TINST_LEVEL: return TS_CP_TINST_LEVEL;
case PTRMEM_CST: return TS_CP_PTRMEM;
- case BASELINK: return TS_CP_BASELINK;
+ case BASELINK: return TS_CP_BASELINK;
default: return TS_CP_GENERIC;
}
}
diff --git a/gcc/cp/decl.h b/gcc/cp/decl.h
index b852c504113..a05fbef2ac6 100644
--- a/gcc/cp/decl.h
+++ b/gcc/cp/decl.h
@@ -31,6 +31,6 @@ enum decl_context
};
/* We need this in here to get the decl_context definition. */
-extern tree grokdeclarator (const cp_declarator *,
- const cp_decl_specifier_seq *,
+extern tree grokdeclarator (const cp_declarator *,
+ const cp_decl_specifier_seq *,
enum decl_context, int, tree*);
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 970c6381cc6..1fe54a1a915 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -77,7 +77,7 @@ static tree start_static_initialization_or_destruction (tree, int);
static void finish_static_initialization_or_destruction (tree);
static void generate_ctor_or_dtor_function (bool, int, location_t *);
static int generate_ctor_and_dtor_functions_for_priority (splay_tree_node,
- void *);
+ void *);
static tree prune_vars_needing_no_initialization (tree *);
static void write_out_vars (tree);
static void import_export_class (tree);
@@ -256,7 +256,7 @@ maybe_retrofit_in_chrg (tree fn)
QUALS are the qualifiers for the this pointer. */
void
-grokclassfn (tree ctype, tree function, enum overload_flags flags,
+grokclassfn (tree ctype, tree function, enum overload_flags flags,
cp_cv_quals quals)
{
tree fn_name = DECL_NAME (function);
@@ -355,9 +355,9 @@ grok_array_decl (tree array_expr, tree index_exp)
else
p2 = build_expr_type_conversion (WANT_POINTER, index_exp, false);
- i1 = build_expr_type_conversion (WANT_INT | WANT_ENUM, array_expr,
+ i1 = build_expr_type_conversion (WANT_INT | WANT_ENUM, array_expr,
false);
- i2 = build_expr_type_conversion (WANT_INT | WANT_ENUM, index_exp,
+ i2 = build_expr_type_conversion (WANT_INT | WANT_ENUM, index_exp,
false);
if ((p1 && i2) && (i1 && p2))
@@ -370,7 +370,7 @@ grok_array_decl (tree array_expr, tree index_exp)
else
{
error ("invalid types %<%T[%T]%> for array subscript",
- type, TREE_TYPE (index_exp));
+ type, TREE_TYPE (index_exp));
return error_mark_node;
}
@@ -419,7 +419,7 @@ delete_sanity (tree exp, tree size, bool doing_vec, int use_global_delete)
if (t == NULL_TREE || t == error_mark_node)
{
error ("type %q#T argument given to %<delete%>, expected pointer",
- TREE_TYPE (exp));
+ TREE_TYPE (exp));
return error_mark_node;
}
@@ -431,7 +431,7 @@ delete_sanity (tree exp, tree size, bool doing_vec, int use_global_delete)
if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
{
error ("cannot delete a function. Only pointer-to-objects are "
- "valid arguments to %<delete%>");
+ "valid arguments to %<delete%>");
return error_mark_node;
}
@@ -447,7 +447,7 @@ delete_sanity (tree exp, tree size, bool doing_vec, int use_global_delete)
return build1 (NOP_EXPR, void_type_node, t);
if (doing_vec)
- return build_vec_delete (t, /*maxindex=*/NULL_TREE,
+ return build_vec_delete (t, /*maxindex=*/NULL_TREE,
sfk_deleting_destructor,
use_global_delete);
else
@@ -472,26 +472,26 @@ check_member_template (tree tmpl)
{
if (current_function_decl)
/* 14.5.2.2 [temp.mem]
-
+
A local class shall not have member templates. */
error ("invalid declaration of member template %q#D in local class",
- decl);
-
+ decl);
+
if (TREE_CODE (decl) == FUNCTION_DECL && DECL_VIRTUAL_P (decl))
{
/* 14.5.2.3 [temp.mem]
A member function template shall not be virtual. */
- error
+ error
("invalid use of %<virtual%> in template declaration of %q#D",
decl);
DECL_VIRTUAL_P (decl) = 0;
}
/* The debug-information generating code doesn't know what to do
- with member templates. */
+ with member templates. */
DECL_IGNORED_P (tmpl) = 1;
- }
+ }
else
error ("template declaration of %q#D", decl);
}
@@ -543,7 +543,7 @@ check_java_method (tree method)
if (!acceptable_java_type (ret_type))
{
error ("Java method %qD has non-Java return type %qT",
- method, ret_type);
+ method, ret_type);
jerr = true;
}
@@ -552,14 +552,14 @@ check_java_method (tree method)
arg_types = TREE_CHAIN (arg_types);
if (DECL_HAS_VTT_PARM_P (method))
arg_types = TREE_CHAIN (arg_types);
-
+
for (; arg_types != NULL_TREE; arg_types = TREE_CHAIN (arg_types))
{
tree type = TREE_VALUE (arg_types);
if (!acceptable_java_type (type))
{
- error ("Java method %qD has non-Java parameter type %qT",
- method, type);
+ error ("Java method %qD has non-Java parameter type %qT",
+ method, type);
jerr = true;
}
}
@@ -569,7 +569,7 @@ check_java_method (tree method)
/* Sanity check: report error if this function FUNCTION is not
really a member of the class (CTYPE) it is supposed to belong to.
TEMPLATE_PARMS is used to specify the template parameters of a member
- template passed as FUNCTION_DECL. If the member template is passed as a
+ template passed as FUNCTION_DECL. If the member template is passed as a
TEMPLATE_DECL, it can be NULL since the parameters can be extracted
from the declaration. If the function is not a function template, it
must be NULL.
@@ -581,7 +581,7 @@ check_classfn (tree ctype, tree function, tree template_parms)
{
int ix;
bool is_template;
-
+
if (DECL_USE_TEMPLATE (function)
&& !(TREE_CODE (function) == TEMPLATE_DECL
&& DECL_TEMPLATE_SPECIALIZATION (function))
@@ -589,10 +589,10 @@ check_classfn (tree ctype, tree function, tree template_parms)
/* Since this is a specialization of a member template,
we're not going to find the declaration in the class.
For example, in:
-
- struct S { template <typename T> void f(T); };
- template <> void S::f(int);
-
+
+ struct S { template <typename T> void f(T); };
+ template <> void S::f(int);
+
we're not going to find `S::f(int)', but there's no
reason we should, either. We let our callers know we didn't
find the method, but we don't complain. */
@@ -602,8 +602,8 @@ check_classfn (tree ctype, tree function, tree template_parms)
either were not passed, or they are the same of DECL_TEMPLATE_PARMS. */
if (TREE_CODE (function) == TEMPLATE_DECL)
{
- gcc_assert (!template_parms
- || comp_template_parms (template_parms,
+ gcc_assert (!template_parms
+ || comp_template_parms (template_parms,
DECL_TEMPLATE_PARMS (function)));
template_parms = DECL_TEMPLATE_PARMS (function);
}
@@ -619,13 +619,13 @@ check_classfn (tree ctype, tree function, tree template_parms)
bool is_conv_op;
tree pushed_scope;
const char *format = NULL;
-
+
pushed_scope = push_scope (ctype);
for (fndecls = VEC_index (tree, methods, ix);
fndecls; fndecls = OVL_NEXT (fndecls))
{
tree p1, p2;
-
+
fndecl = OVL_CURRENT (fndecls);
p1 = TYPE_ARG_TYPES (TREE_TYPE (function));
p2 = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
@@ -633,8 +633,8 @@ check_classfn (tree ctype, tree function, tree template_parms)
/* We cannot simply call decls_match because this doesn't
work for static member functions that are pretending to
be methods, and because the name may have been changed by
- asm("new_name"). */
-
+ asm("new_name"). */
+
/* Get rid of the this parameter on functions that become
static. */
if (DECL_STATIC_FUNCTION_P (fndecl)
@@ -645,17 +645,17 @@ check_classfn (tree ctype, tree function, tree template_parms)
declaration. */
if (is_template != (TREE_CODE (fndecl) == TEMPLATE_DECL))
continue;
-
+
if (same_type_p (TREE_TYPE (TREE_TYPE (function)),
TREE_TYPE (TREE_TYPE (fndecl)))
&& compparms (p1, p2)
&& (!is_template
- || comp_template_parms (template_parms,
+ || comp_template_parms (template_parms,
DECL_TEMPLATE_PARMS (fndecl)))
&& (DECL_TEMPLATE_SPECIALIZATION (function)
== DECL_TEMPLATE_SPECIALIZATION (fndecl))
&& (!DECL_TEMPLATE_SPECIALIZATION (function)
- || (DECL_TI_TEMPLATE (function)
+ || (DECL_TI_TEMPLATE (function)
== DECL_TI_TEMPLATE (fndecl))))
break;
}
@@ -709,7 +709,7 @@ check_classfn (tree ctype, tree function, tree template_parms)
case we'll only confuse ourselves when the function is declared
properly within the class. */
if (COMPLETE_TYPE_P (ctype))
- add_method (ctype, function);
+ add_method (ctype, function, NULL_TREE);
return NULL_TREE;
}
@@ -743,7 +743,7 @@ note_vague_linkage_var (tree var)
void
finish_static_data_member_decl (tree decl, tree init, tree asmspec_tree,
- int flags)
+ int flags)
{
gcc_assert (TREE_PUBLIC (decl));
@@ -767,10 +767,10 @@ finish_static_data_member_decl (tree decl, tree init, tree asmspec_tree,
if (init != NULL_TREE && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
{
static int explained = 0;
-
+
error ("initializer invalid for static member with constructor");
if (!explained)
- {
+ {
error ("(an out of class initialization is required)");
explained = 1;
}
@@ -805,10 +805,10 @@ finish_static_data_member_decl (tree decl, tree init, tree asmspec_tree,
CHANGES TO CODE IN `start_method'. */
tree
-grokfield (const cp_declarator *declarator,
- cp_decl_specifier_seq *declspecs,
+grokfield (const cp_declarator *declarator,
+ cp_decl_specifier_seq *declspecs,
tree init, tree asmspec_tree,
- tree attrlist)
+ tree attrlist)
{
tree value;
const char *asmspec = 0;
@@ -816,7 +816,7 @@ grokfield (const cp_declarator *declarator,
if (!declspecs->any_specifiers_p
&& declarator->kind == cdk_id
- && declarator->u.id.qualifying_scope
+ && declarator->u.id.qualifying_scope
&& TREE_CODE (declarator->u.id.unqualified_name) == IDENTIFIER_NODE)
/* Access declaration */
return do_class_using_decl (declarator->u.id.qualifying_scope,
@@ -853,7 +853,7 @@ grokfield (const cp_declarator *declarator,
&& IDENTIFIER_POINTER (DECL_NAME (value))[0] == '_'
&& ! strcmp (IDENTIFIER_POINTER (DECL_NAME (value)), "_vptr"))
error ("member %qD conflicts with virtual function table field name",
- value);
+ value);
/* Stash away type declarations. */
if (TREE_CODE (value) == TYPE_DECL)
@@ -904,7 +904,7 @@ grokfield (const cp_declarator *declarator,
else
{
/* We allow initializers to become parameters to base
- initializers. */
+ initializers. */
if (TREE_CODE (init) == TREE_LIST)
{
if (TREE_CHAIN (init) == NULL_TREE)
@@ -919,7 +919,7 @@ grokfield (const cp_declarator *declarator,
init = digest_init (TREE_TYPE (value), init, (tree *)0);
else
init = integral_constant_value (init);
-
+
if (init != error_mark_node && ! TREE_CONSTANT (init))
{
/* We can allow references to things that are effectively
@@ -951,7 +951,7 @@ grokfield (const cp_declarator *declarator,
switch (TREE_CODE (value))
{
case VAR_DECL:
- finish_static_data_member_decl (value, init, asmspec_tree,
+ finish_static_data_member_decl (value, init, asmspec_tree,
flags);
return value;
@@ -970,7 +970,7 @@ grokfield (const cp_declarator *declarator,
set_user_assembler_name (value, asmspec);
if (!DECL_FRIEND_P (value))
grok_special_member_properties (value);
-
+
cp_finish_decl (value, init, asmspec_tree, flags);
/* Pass friends back this way. */
@@ -979,7 +979,7 @@ grokfield (const cp_declarator *declarator,
DECL_IN_AGGR_P (value) = 1;
return value;
-
+
default:
gcc_unreachable ();
}
@@ -990,7 +990,7 @@ grokfield (const cp_declarator *declarator,
WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node. */
tree
-grokbitfield (const cp_declarator *declarator,
+grokbitfield (const cp_declarator *declarator,
cp_decl_specifier_seq *declspecs, tree width)
{
tree value = grokdeclarator (declarator, declspecs, BITFIELD, 0, NULL);
@@ -1021,7 +1021,7 @@ grokbitfield (const cp_declarator *declarator,
if (DECL_IN_AGGR_P (value))
{
error ("%qD is already defined in the class %qT", value,
- DECL_CONTEXT (value));
+ DECL_CONTEXT (value));
return void_type_node;
}
@@ -1074,8 +1074,8 @@ build_anon_union_vars (tree type, tree object)
if (TREE_CODE (type) != UNION_TYPE)
error ("anonymous struct not inside named type");
- for (field = TYPE_FIELDS (type);
- field != NULL_TREE;
+ for (field = TYPE_FIELDS (type);
+ field != NULL_TREE;
field = TREE_CHAIN (field))
{
tree decl;
@@ -1086,7 +1086,7 @@ build_anon_union_vars (tree type, tree object)
if (TREE_CODE (field) != FIELD_DECL)
{
cp_pedwarn_at ("%q#D invalid; an anonymous union can only "
- "have non-static data members",
+ "have non-static data members",
field);
continue;
}
@@ -1106,7 +1106,7 @@ build_anon_union_vars (tree type, tree object)
if (DECL_NAME (field))
{
decl = build_decl (ALIAS_DECL, DECL_NAME (field), TREE_TYPE (field));
- DECL_INITIAL (decl) = ref;
+ DECL_INITIAL (decl) = ref;
TREE_PUBLIC (decl) = 0;
TREE_STATIC (decl) = 0;
DECL_EXTERNAL (decl) = 1;
@@ -1143,7 +1143,7 @@ finish_anon_union (tree anon_union_decl)
/* 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)
return;
@@ -1188,7 +1188,7 @@ coerce_new_type (tree type)
tree args = TYPE_ARG_TYPES (type);
gcc_assert (TREE_CODE (type) == FUNCTION_TYPE);
-
+
if (!same_type_p (TREE_TYPE (type), ptr_type_node))
{
e = 1;
@@ -1200,9 +1200,9 @@ coerce_new_type (tree type)
{
e = 2;
if (args && args != void_list_node)
- args = TREE_CHAIN (args);
+ args = TREE_CHAIN (args);
pedwarn ("%<operator new%> takes type %<size_t%> (%qT) "
- "as first parameter", size_type_node);
+ "as first parameter", size_type_node);
}
switch (e)
{
@@ -1211,8 +1211,8 @@ coerce_new_type (tree type)
/* Fall through. */
case 1:
type = build_exception_variant
- (build_function_type (ptr_type_node, args),
- TYPE_RAISES_EXCEPTIONS (type));
+ (build_function_type (ptr_type_node, args),
+ TYPE_RAISES_EXCEPTIONS (type));
/* Fall through. */
default:;
}
@@ -1224,7 +1224,7 @@ coerce_delete_type (tree type)
{
int e = 0;
tree args = TYPE_ARG_TYPES (type);
-
+
gcc_assert (TREE_CODE (type) == FUNCTION_TYPE);
if (!same_type_p (TREE_TYPE (type), void_type_node))
@@ -1238,9 +1238,9 @@ coerce_delete_type (tree type)
{
e = 2;
if (args && args != void_list_node)
- args = TREE_CHAIN (args);
+ args = TREE_CHAIN (args);
error ("%<operator delete%> takes type %qT as first parameter",
- ptr_type_node);
+ ptr_type_node);
}
switch (e)
{
@@ -1249,8 +1249,8 @@ coerce_delete_type (tree type)
/* Fall through. */
case 1:
type = build_exception_variant
- (build_function_type (void_type_node, args),
- TYPE_RAISES_EXCEPTIONS (type));
+ (build_function_type (void_type_node, args),
+ TYPE_RAISES_EXCEPTIONS (type));
/* Fall through. */
default:;
}
@@ -1282,7 +1282,7 @@ mark_vtable_entries (tree decl)
we output the vtables that contain them. With vcall offsets,
we know all the thunks we'll need when we emit a virtual
function, so we emit the thunks there instead. */
- if (DECL_THUNK_P (fn))
+ if (DECL_THUNK_P (fn))
use_thunk (fn, /*emit_p=*/0);
mark_used (fn);
}
@@ -1296,17 +1296,17 @@ comdat_linkage (tree decl)
{
if (flag_weak)
make_decl_one_only (decl);
- else if (TREE_CODE (decl) == FUNCTION_DECL
+ else if (TREE_CODE (decl) == FUNCTION_DECL
|| (TREE_CODE (decl) == VAR_DECL && DECL_ARTIFICIAL (decl)))
/* We can just emit function and compiler-generated variables
statically; having multiple copies is (for the most part) only
- a waste of space.
+ a waste of space.
There are two correctness issues, however: the address of a
template instantiation with external linkage should be the
same, independent of what translation unit asks for the
address, and this will not hold when we emit multiple copies of
- the function. However, there's little else we can do.
+ the function. However, there's little else we can do.
Also, by default, the typeinfo implementation assumes that
there will be only one copy of the string used as the name for
@@ -1342,8 +1342,8 @@ comdat_linkage (tree decl)
/* For win32 we also want to put explicit instantiations in
linkonce sections, so that they will be merged with implicit
- instantiations; otherwise we get duplicate symbol errors.
- For Darwin we do not want explicit instantiations to be
+ instantiations; otherwise we get duplicate symbol errors.
+ For Darwin we do not want explicit instantiations to be
linkonce. */
void
@@ -1490,7 +1490,7 @@ decl_needed_p (tree decl)
return true;
/* If this entity was used, let the back-end see it; it will decide
whether or not to emit it into the object file. */
- if (TREE_USED (decl)
+ if (TREE_USED (decl)
|| (DECL_ASSEMBLER_NAME_SET_P (decl)
&& TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
return true;
@@ -1536,7 +1536,7 @@ maybe_emit_vtables (tree ctype)
/* If the references to this class' vtables are optimized away,
still emit the appropriate debugging information. See
dfs_debug_mark. */
- if (DECL_COMDAT (primary_vtbl)
+ if (DECL_COMDAT (primary_vtbl)
&& CLASSTYPE_DEBUG_REQUESTED (ctype))
note_debug_info_needed (ctype);
return false;
@@ -1552,7 +1552,7 @@ maybe_emit_vtables (tree ctype)
if (TREE_TYPE (DECL_INITIAL (vtbl)) == 0)
{
tree expr = store_init_value (vtbl, DECL_INITIAL (vtbl));
-
+
/* It had better be all done at compile-time. */
gcc_assert (!expr);
}
@@ -1778,7 +1778,7 @@ import_export_decl (tree decl)
else if (CLASSTYPE_INTERFACE_KNOWN (class_type))
{
/* CLASS_TYPE is being exported from this translation unit,
- so DECL should be defined here. */
+ so DECL should be defined here. */
if (!flag_weak && CLASSTYPE_EXPLICIT_INSTANTIATION (class_type))
/* If a class is declared in a header with the "extern
template" extension, then it will not be instantiated,
@@ -1829,7 +1829,7 @@ import_export_decl (tree decl)
wherever it is used. */
&& flag_rtti)
import_p = true;
- else
+ else
{
if (CLASSTYPE_INTERFACE_KNOWN (type)
&& !CLASSTYPE_INTERFACE_ONLY (type))
@@ -1856,7 +1856,7 @@ import_export_decl (tree decl)
data member. */
if (flag_implicit_templates
|| (flag_implicit_inline_templates
- && TREE_CODE (decl) == FUNCTION_DECL
+ && TREE_CODE (decl) == FUNCTION_DECL
&& DECL_DECLARED_INLINE_P (decl)))
comdat_p = true;
else
@@ -1874,7 +1874,7 @@ import_export_decl (tree decl)
{
DECL_NOT_REALLY_EXTERN (decl)
= ! (CLASSTYPE_INTERFACE_ONLY (ctype)
- || (DECL_DECLARED_INLINE_P (decl)
+ || (DECL_DECLARED_INLINE_P (decl)
&& ! flag_implement_inlines
&& !DECL_VINDEX (decl)));
@@ -1922,7 +1922,7 @@ import_export_decl (tree decl)
&& DECL_VISIBILITY_SPECIFIED (decl)
&& (!class_type || !CLASSTYPE_VISIBILITY_SPECIFIED (class_type)))
targetm.cxx.determine_class_data_visibility (decl);
-
+
DECL_INTERFACE_KNOWN (decl) = 1;
}
@@ -1976,15 +1976,15 @@ get_guard (tree decl)
as an integer counter. */
guard_type = targetm.cxx.guard_type ();
guard = build_decl (VAR_DECL, sname, guard_type);
-
+
/* 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);
DECL_ONE_ONLY (guard) = DECL_ONE_ONLY (decl);
if (TREE_PUBLIC (decl))
- DECL_WEAK (guard) = DECL_WEAK (decl);
-
+ DECL_WEAK (guard) = DECL_WEAK (decl);
+
DECL_ARTIFICIAL (guard) = 1;
DECL_IGNORED_P (guard) = 1;
TREE_USED (guard) = 1;
@@ -2003,11 +2003,11 @@ get_guard_bits (tree guard)
{
/* We only set the first byte of the guard, in order to leave room
for a mutex in the high-order bits. */
- guard = build1 (ADDR_EXPR,
+ guard = build1 (ADDR_EXPR,
build_pointer_type (TREE_TYPE (guard)),
guard);
- guard = build1 (NOP_EXPR,
- build_pointer_type (char_type_node),
+ guard = build1 (NOP_EXPR,
+ build_pointer_type (char_type_node),
guard);
guard = build1 (INDIRECT_REF, char_type_node, guard);
}
@@ -2084,7 +2084,7 @@ start_objects (int method_type, int initp)
else
sprintf (type, "%c", method_type);
- fndecl = build_lang_decl (FUNCTION_DECL,
+ fndecl = build_lang_decl (FUNCTION_DECL,
get_file_function_name_long (type),
build_function_type (void_type_node,
void_list_node));
@@ -2181,7 +2181,7 @@ static splay_tree priority_info_map;
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.
+ returns no value.
It is assumed that this function will only be called once per
translation unit. */
@@ -2205,7 +2205,7 @@ start_static_storage_duration_function (unsigned count)
type = build_function_type (void_type_node, parm_types);
/* Create the FUNCTION_DECL itself. */
- ssdf_decl = build_lang_decl (FUNCTION_DECL,
+ ssdf_decl = build_lang_decl (FUNCTION_DECL,
get_identifier (id),
type);
TREE_PUBLIC (ssdf_decl) = 0;
@@ -2253,7 +2253,7 @@ start_static_storage_duration_function (unsigned count)
function as:
static void __ssdf (int __initialize_p, init __priority_p);
-
+
It is static because we only need to call this function from the
various constructor and destructor functions for this module. */
start_preparsed_function (ssdf_decl,
@@ -2293,7 +2293,7 @@ get_priority_info (int priority)
priority_info pi;
splay_tree_node n;
- n = splay_tree_lookup (priority_info_map,
+ n = splay_tree_lookup (priority_info_map,
(splay_tree_key) priority);
if (!n)
{
@@ -2353,7 +2353,7 @@ start_static_initialization_or_destruction (tree decl, int initp)
the conversion functions, or the destructor called to
create and destroy a static data member is performed as
if these calls appeared in the scope of the member's
- class.
+ class.
we pretend we are in a static member function of the class of
which the DECL is a member. */
@@ -2362,7 +2362,7 @@ start_static_initialization_or_destruction (tree decl, int initp)
DECL_CONTEXT (current_function_decl) = DECL_CONTEXT (decl);
DECL_STATIC_FUNCTION_P (current_function_decl) = 1;
}
-
+
/* Conditionalize this initialization on being in the right priority
and being initializing/finalizing appropriately. */
guard_if_stmt = begin_if_stmt ();
@@ -2381,7 +2381,7 @@ start_static_initialization_or_destruction (tree decl, int initp)
might be initialized in more than one place. (For example, a
static data member of a template, when the data member requires
construction.) */
- if (TREE_PUBLIC (decl) && (DECL_COMMON (decl)
+ if (TREE_PUBLIC (decl) && (DECL_COMMON (decl)
|| DECL_ONE_ONLY (decl)
|| DECL_WEAK (decl)))
{
@@ -2406,14 +2406,14 @@ start_static_initialization_or_destruction (tree decl, int initp)
destructions only if the GUARD is one, i.e., if we are the
last to destroy the variable. */
else if (initp)
- guard_cond
+ guard_cond
= cp_build_binary_op (EQ_EXPR,
build_unary_op (PREINCREMENT_EXPR,
guard,
/*noconvert=*/1),
integer_one_node);
else
- guard_cond
+ guard_cond
= cp_build_binary_op (EQ_EXPR,
build_unary_op (PREDECREMENT_EXPR,
guard,
@@ -2540,7 +2540,7 @@ prune_vars_needing_no_initialization (tree *vars)
/* Also, if the initializer already contains errors, we can bail
out now. */
- if (init && TREE_CODE (init) == TREE_LIST
+ if (init && TREE_CODE (init) == TREE_LIST
&& value_member (error_mark_node, init))
{
var = &TREE_CHAIN (t);
@@ -2596,7 +2596,7 @@ generate_ctor_or_dtor_function (bool constructor_p, int priority,
#else
locus->line++;
#endif
-
+
/* We use `I' to indicate initialization and `D' to indicate
destruction. */
function_key = constructor_p ? 'I' : 'D';
@@ -2616,7 +2616,7 @@ generate_ctor_or_dtor_function (bool constructor_p, int priority,
/* Call the static storage duration function with appropriate
arguments. */
- for (i = 0; VEC_iterate (tree, ssdf_decls, i, fndecl); ++i)
+ for (i = 0; VEC_iterate (tree, ssdf_decls, i, fndecl); ++i)
{
/* Calls to pure or const functions will expand to nothing. */
if (! (flags_from_decl_or_type (fndecl) & (ECF_CONST | ECF_PURE)))
@@ -2625,7 +2625,7 @@ generate_ctor_or_dtor_function (bool constructor_p, int priority,
body = start_objects (function_key, priority);
arguments = tree_cons (NULL_TREE,
- build_int_cst (NULL_TREE, priority),
+ build_int_cst (NULL_TREE, priority),
NULL_TREE);
arguments = tree_cons (NULL_TREE,
build_int_cst (NULL_TREE, constructor_p),
@@ -2641,7 +2641,7 @@ generate_ctor_or_dtor_function (bool constructor_p, int priority,
{
tree fns;
- for (fns = constructor_p ? static_ctors : static_dtors;
+ for (fns = constructor_p ? static_ctors : static_dtors;
fns;
fns = TREE_CHAIN (fns))
{
@@ -2718,7 +2718,7 @@ cxx_callgraph_analyze_expr (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
vtbl = TREE_CHAIN (vtbl))
mark_decl_referenced (vtbl);
}
- else if (DECL_CONTEXT (t)
+ else if (DECL_CONTEXT (t)
&& TREE_CODE (DECL_CONTEXT (t)) == FUNCTION_DECL)
/* If we need a static variable in a function, then we
need the containing function. */
@@ -2731,6 +2731,50 @@ cxx_callgraph_analyze_expr (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
return NULL;
}
+/* Java requires that we be able to reference a local address for a
+ method, and not be confused by PLT entries. If hidden aliases are
+ supported, emit one for each java function that we've emitted. */
+
+static void
+build_java_method_aliases (void)
+{
+ struct cgraph_node *node;
+
+#ifndef HAVE_GAS_HIDDEN
+ return;
+#endif
+
+ for (node = cgraph_nodes; node ; node = node->next)
+ {
+ tree fndecl = node->decl;
+
+ if (TREE_ASM_WRITTEN (fndecl)
+ && DECL_CONTEXT (fndecl)
+ && TYPE_P (DECL_CONTEXT (fndecl))
+ && TYPE_FOR_JAVA (DECL_CONTEXT (fndecl))
+ && TARGET_USE_LOCAL_THUNK_ALIAS_P (fndecl))
+ {
+ /* Mangle the name in a predictable way; we need to reference
+ this from a java compiled object file. */
+ tree oid, nid, alias;
+ const char *oname;
+ char *nname;
+
+ oid = DECL_ASSEMBLER_NAME (fndecl);
+ oname = IDENTIFIER_POINTER (oid);
+ gcc_assert (oname[0] == '_' && oname[1] == 'Z');
+ nname = ACONCAT (("_ZGA", oname+2, NULL));
+ nid = get_identifier (nname);
+
+ alias = make_alias_for (fndecl, nid);
+ TREE_PUBLIC (alias) = 1;
+ DECL_VISIBILITY (alias) = VISIBILITY_HIDDEN;
+
+ assemble_alias (alias, oid);
+ }
+ }
+}
+
/* This routine is called from the last rule in yyparse ().
Its job is to create all the code needed to initialize and
destroy the global aggregates. We do the destruction
@@ -2769,12 +2813,12 @@ cp_finish_file (void)
These include:
o Template specializations that we have not yet instantiated,
- but which are needed.
+ but which are needed.
o Initialization and destruction for non-local objects with
- static storage duration. (Local objects with static storage
+ static storage duration. (Local objects with static storage
duration are initialized when their scope is first entered,
and are cleaned up via atexit.)
- o Virtual function tables.
+ o Virtual function tables.
All of these may cause others to be needed. For example,
instantiating one function may cause another to be needed, and
@@ -2785,7 +2829,7 @@ cp_finish_file (void)
emit_support_tinfos ();
- do
+ do
{
tree t;
tree decl;
@@ -2798,42 +2842,42 @@ cp_finish_file (void)
ggc_collect ();
/* 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 we write out
- vtables then we remove the class from our list so we don't
- have to look at it again. */
+ the virtual table for a template class may cause the
+ instantiation of members of that class. If we write out
+ vtables then we remove the class from our list so we don't
+ have to look at it again. */
while (keyed_classes != NULL_TREE
- && maybe_emit_vtables (TREE_VALUE (keyed_classes)))
- {
- reconsider = true;
- keyed_classes = TREE_CHAIN (keyed_classes);
- }
-
+ && maybe_emit_vtables (TREE_VALUE (keyed_classes)))
+ {
+ reconsider = true;
+ keyed_classes = TREE_CHAIN (keyed_classes);
+ }
+
t = keyed_classes;
if (t != NULL_TREE)
- {
- tree next = TREE_CHAIN (t);
-
- while (next)
- {
- if (maybe_emit_vtables (TREE_VALUE (next)))
- {
- reconsider = true;
- TREE_CHAIN (t) = TREE_CHAIN (next);
- }
- else
- t = next;
-
- next = TREE_CHAIN (t);
- }
- }
+ {
+ tree next = TREE_CHAIN (t);
+
+ while (next)
+ {
+ if (maybe_emit_vtables (TREE_VALUE (next)))
+ {
+ reconsider = true;
+ TREE_CHAIN (t) = TREE_CHAIN (next);
+ }
+ else
+ t = next;
+
+ next = TREE_CHAIN (t);
+ }
+ }
/* Write out needed type info variables. We have to be careful
- looping through unemitted decls, because emit_tinfo_decl may
- cause other variables to be needed. New elements will be
- appended, and we remove from the vector those that actually
- get emitted. */
+ looping through unemitted decls, because emit_tinfo_decl may
+ cause other variables to be needed. New elements will be
+ appended, and we remove from the vector those that actually
+ get emitted. */
for (i = VEC_length (tree, unemitted_tinfo_decls);
VEC_iterate (tree, unemitted_tinfo_decls, --i, t);)
if (emit_tinfo_decl (t))
@@ -2906,7 +2950,7 @@ cp_finish_file (void)
locus.line++;
#endif
}
-
+
/* Go through the set of inline functions whose bodies have not
been emitted yet. If out-of-line copies of these functions
are required, emit them. */
@@ -2922,6 +2966,10 @@ cp_finish_file (void)
finish_function doesn't clean things up, and we end
up with CURRENT_FUNCTION_DECL set. */
push_to_top_level ();
+ /* The decl's location will mark where it was first
+ needed. Save that so synthesize method can indicate
+ where it was needed from, in case of error */
+ input_location = DECL_SOURCE_LOCATION (decl);
synthesize_method (decl);
pop_from_top_level ();
reconsider = true;
@@ -2975,7 +3023,7 @@ cp_finish_file (void)
reconsider = true;
/* Static data members are just like namespace-scope globals. */
- for (i = 0; VEC_iterate (tree, pending_statics, i, decl); ++i)
+ for (i = 0; VEC_iterate (tree, pending_statics, i, decl); ++i)
{
if (var_finalized_p (decl) || DECL_REALLY_EXTERN (decl))
continue;
@@ -2991,7 +3039,7 @@ cp_finish_file (void)
reconsider = true;
retries++;
- }
+ }
while (reconsider);
/* All used inline functions must have a definition at this point. */
@@ -3020,19 +3068,19 @@ cp_finish_file (void)
TREE_PUBLIC (decl) = 1;
}
}
-
+
/* We give C linkage to static constructors and destructors. */
push_lang_context (lang_name_c);
/* Generate initialization and destruction functions for all
priorities for which they are required. */
if (priority_info_map)
- splay_tree_foreach (priority_info_map,
+ splay_tree_foreach (priority_info_map,
generate_ctor_and_dtor_functions_for_priority,
/*data=*/&locus);
else
{
-
+
if (static_ctors)
generate_ctor_or_dtor_function (/*constructor_p=*/true,
DEFAULT_INIT_PRIORITY, &locus);
@@ -3062,6 +3110,9 @@ cp_finish_file (void)
check_global_declarations (VEC_address (tree, pending_statics),
VEC_length (tree, pending_statics));
+ /* Generate hidden aliases for Java. */
+ build_java_method_aliases ();
+
finish_repo ();
/* The entire file is now complete. If requested, dump everything
@@ -3076,7 +3127,7 @@ cp_finish_file (void)
dump_end (TDI_tu, stream);
}
}
-
+
timevar_pop (TV_VARCONST);
if (flag_detailed_statistics)
@@ -3147,7 +3198,7 @@ build_offset_ref_call_from_tree (tree fn, tree args)
return build_min_non_dep (CALL_EXPR, expr, orig_fn, orig_args, NULL_TREE);
return expr;
}
-
+
void
check_default_args (tree x)
@@ -3181,15 +3232,23 @@ mark_used (tree decl)
{
if (DECL_DEFERRED_FN (decl))
return;
+
+ /* Remember the current location for a function we will end up
+ synthesizing. Then we can inform the user where it was
+ required in the case of error. */
+ if (DECL_ARTIFICIAL (decl) && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
+ && !DECL_THUNK_P (decl))
+ DECL_SOURCE_LOCATION (decl) = input_location;
+
note_vague_linkage_fn (decl);
}
-
+
assemble_external (decl);
/* Is it a synthesized method that needs to be synthesized? */
if (TREE_CODE (decl) == FUNCTION_DECL
&& DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
- && DECL_ARTIFICIAL (decl)
+ && DECL_ARTIFICIAL (decl)
&& !DECL_THUNK_P (decl)
&& ! DECL_INITIAL (decl)
/* Kludge: don't synthesize for default args. Unfortunately this
@@ -3198,14 +3257,6 @@ mark_used (tree decl)
pointing to the class location. */
&& current_function_decl)
{
- /* Put the function definition at the position where it is needed,
- rather than within the body of the class. That way, an error
- 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. */
- DECL_SOURCE_LOCATION (decl) = input_location;
-
synthesize_method (decl);
/* If we've already synthesized the method we don't need to
instantiate it, so we can return right away. */
@@ -3219,8 +3270,8 @@ mark_used (tree decl)
if ((DECL_NON_THUNK_FUNCTION_P (decl) || TREE_CODE (decl) == VAR_DECL)
&& DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl)
&& (!DECL_EXPLICIT_INSTANTIATION (decl)
- || (TREE_CODE (decl) == FUNCTION_DECL
- && DECL_INLINE (DECL_TEMPLATE_RESULT
+ || (TREE_CODE (decl) == FUNCTION_DECL
+ && DECL_INLINE (DECL_TEMPLATE_RESULT
(template_for_substitution (decl))))))
/* We put off instantiating functions in order to improve compile
times. Maintaining a stack of active functions is expensive,
diff --git a/gcc/cp/dump.c b/gcc/cp/dump.c
index 6b93045e02f..81b6be7badf 100644
--- a/gcc/cp/dump.c
+++ b/gcc/cp/dump.c
@@ -65,7 +65,7 @@ dump_op (dump_info_p di, tree t)
case VEC_DELETE_EXPR:
dump_string (di, "vecdelete");
break;
- case CONVERT_EXPR:
+ case UNARY_PLUS_EXPR:
dump_string (di, "pos");
break;
case NEGATE_EXPR:
@@ -91,63 +91,63 @@ dump_op (dump_info_p di, tree t)
break;
case PLUS_EXPR:
if (DECL_ASSIGNMENT_OPERATOR_P (t))
- dump_string (di, "plusassign");
+ dump_string (di, "plusassign");
else
- dump_string(di, "plus");
+ dump_string(di, "plus");
break;
case MINUS_EXPR:
if (DECL_ASSIGNMENT_OPERATOR_P (t))
- dump_string (di, "minusassign");
+ dump_string (di, "minusassign");
else
- dump_string(di, "minus");
+ dump_string(di, "minus");
break;
case MULT_EXPR:
if (DECL_ASSIGNMENT_OPERATOR_P (t))
- dump_string (di, "multassign");
+ dump_string (di, "multassign");
else
- dump_string (di, "mult");
+ dump_string (di, "mult");
break;
case TRUNC_DIV_EXPR:
if (DECL_ASSIGNMENT_OPERATOR_P (t))
- dump_string (di, "divassign");
+ dump_string (di, "divassign");
else
- dump_string (di, "div");
+ dump_string (di, "div");
break;
case TRUNC_MOD_EXPR:
if (DECL_ASSIGNMENT_OPERATOR_P (t))
- dump_string (di, "modassign");
+ dump_string (di, "modassign");
else
- dump_string (di, "mod");
+ dump_string (di, "mod");
break;
case BIT_AND_EXPR:
if (DECL_ASSIGNMENT_OPERATOR_P (t))
- dump_string (di, "andassign");
+ dump_string (di, "andassign");
else
- dump_string (di, "and");
+ dump_string (di, "and");
break;
case BIT_IOR_EXPR:
if (DECL_ASSIGNMENT_OPERATOR_P (t))
- dump_string (di, "orassign");
+ dump_string (di, "orassign");
else
- dump_string (di, "or");
+ dump_string (di, "or");
break;
case BIT_XOR_EXPR:
if (DECL_ASSIGNMENT_OPERATOR_P (t))
- dump_string (di, "xorassign");
+ dump_string (di, "xorassign");
else
- dump_string (di, "xor");
+ dump_string (di, "xor");
break;
case LSHIFT_EXPR:
if (DECL_ASSIGNMENT_OPERATOR_P (t))
- dump_string (di, "lshiftassign");
+ dump_string (di, "lshiftassign");
else
- dump_string (di, "lshift");
+ dump_string (di, "lshift");
break;
case RSHIFT_EXPR:
if (DECL_ASSIGNMENT_OPERATOR_P (t))
- dump_string (di, "rshiftassign");
+ dump_string (di, "rshiftassign");
else
- dump_string (di, "rshift");
+ dump_string (di, "rshift");
break;
case EQ_EXPR:
dump_string (di, "eq");
@@ -186,7 +186,7 @@ dump_op (dump_info_p di, tree t)
dump_string (di, "subs");
break;
case POSTINCREMENT_EXPR:
- dump_string (di, "postinc");
+ dump_string (di, "postinc");
break;
case POSTDECREMENT_EXPR:
dump_string (di, "postdec");
@@ -196,7 +196,7 @@ dump_op (dump_info_p di, tree t)
break;
case NOP_EXPR:
if (DECL_ASSIGNMENT_OPERATOR_P (t))
- dump_string (di, "assign");
+ dump_string (di, "assign");
break;
default:
break;
@@ -257,25 +257,25 @@ cp_dump_tree (void* dump_info, tree t)
dump_child ("bfld", TYPE_CONTEXT (t));
return true;
}
-
+
if (! IS_AGGR_TYPE (t))
break;
dump_child ("vfld", TYPE_VFIELD (t));
if (CLASSTYPE_TEMPLATE_SPECIALIZATION(t))
- dump_string(di, "spec");
+ dump_string(di, "spec");
if (!dump_flag (di, TDF_SLIM, t) && TYPE_BINFO (t))
{
int i;
tree binfo;
tree base_binfo;
-
+
for (binfo = TYPE_BINFO (t), i = 0;
BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
{
dump_child ("base", BINFO_TYPE (base_binfo));
- if (BINFO_VIRTUAL_P (base_binfo))
+ if (BINFO_VIRTUAL_P (base_binfo))
dump_string (di, "virtual");
dump_access (di, base_binfo);
}
@@ -285,32 +285,32 @@ cp_dump_tree (void* dump_info, tree t)
case FIELD_DECL:
dump_access (di, t);
if (DECL_MUTABLE_P (t))
- dump_string(di, "mutable");
+ dump_string(di, "mutable");
break;
case VAR_DECL:
if (TREE_CODE (CP_DECL_CONTEXT (t)) == RECORD_TYPE)
- dump_access (di, t);
+ dump_access (di, t);
if (TREE_STATIC (t) && !TREE_PUBLIC (t))
- dump_string (di, "static");
- break;
+ dump_string (di, "static");
+ break;
case FUNCTION_DECL:
if (!DECL_THUNK_P (t))
{
- if (DECL_OVERLOADED_OPERATOR_P (t)) {
+ if (DECL_OVERLOADED_OPERATOR_P (t)) {
dump_string (di, "operator");
- dump_op (di, t);
- }
- if (DECL_FUNCTION_MEMBER_P (t))
+ dump_op (di, t);
+ }
+ if (DECL_FUNCTION_MEMBER_P (t))
{
dump_string (di, "member");
dump_access (di, t);
}
- if (DECL_PURE_VIRTUAL_P (t))
- dump_string (di, "pure");
- if (DECL_VIRTUAL_P (t))
- dump_string (di, "virtual");
+ if (DECL_PURE_VIRTUAL_P (t))
+ dump_string (di, "pure");
+ if (DECL_VIRTUAL_P (t))
+ dump_string (di, "virtual");
if (DECL_CONSTRUCTOR_P (t))
dump_string (di, "constructor");
if (DECL_DESTRUCTOR_P (t))
@@ -327,7 +327,7 @@ cp_dump_tree (void* dump_info, tree t)
else
{
tree virt = THUNK_VIRTUAL_OFFSET (t);
-
+
dump_string (di, "thunk");
if (DECL_THIS_THUNK_P (t))
dump_string (di, "this adjusting");
@@ -393,7 +393,7 @@ cp_dump_tree (void* dump_info, tree t)
dump_child ("args", TREE_OPERAND (t, 1));
dump_child ("decl", TREE_OPERAND (t, 2));
break;
-
+
case HANDLER:
dump_stmt (di, t);
dump_child ("parm", HANDLER_PARMS (t));
diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index 1748fe0aa69..3d202d6f636 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -81,7 +81,7 @@ static const char *function_category (tree);
static void maybe_print_instantiation_context (diagnostic_context *);
static void print_instantiation_full_context (diagnostic_context *);
static void print_instantiation_partial_context (diagnostic_context *,
- tree, location_t);
+ tree, location_t);
static void cp_diagnostic_starter (diagnostic_context *, diagnostic_info *);
static void cp_diagnostic_finalizer (diagnostic_context *, diagnostic_info *);
static void cp_print_error_function (diagnostic_context *, diagnostic_info *);
@@ -114,10 +114,10 @@ dump_scope (tree scope, int flags)
if (TREE_CODE (scope) == NAMESPACE_DECL)
{
if (scope != global_namespace)
- {
- dump_decl (scope, f);
- pp_cxx_colon_colon (cxx_pp);
- }
+ {
+ dump_decl (scope, f);
+ pp_cxx_colon_colon (cxx_pp);
+ }
}
else if (AGGREGATE_TYPE_P (scope))
{
@@ -155,7 +155,7 @@ dump_template_argument_list (tree args, int flags)
for (i = 0; i< n; ++i)
{
if (need_comma)
- pp_separate_with_comma (cxx_pp);
+ pp_separate_with_comma (cxx_pp);
dump_template_argument (TREE_VEC_ELT (args, i), flags);
need_comma = 1;
}
@@ -172,15 +172,15 @@ dump_template_parameter (tree parm, int flags)
if (TREE_CODE (p) == TYPE_DECL)
{
if (flags & TFF_DECL_SPECIFIERS)
- {
- pp_cxx_identifier (cxx_pp, "class");
- if (DECL_NAME (p))
- pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
- }
+ {
+ pp_cxx_identifier (cxx_pp, "class");
+ if (DECL_NAME (p))
+ pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
+ }
else if (DECL_NAME (p))
- pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
+ pp_cxx_tree_identifier (cxx_pp, DECL_NAME (p));
else
- pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
+ pp_cxx_canonical_template_parameter (cxx_pp, TREE_TYPE (p));
}
else
dump_decl (p, flags | TFF_DECL_SPECIFIERS);
@@ -191,9 +191,9 @@ dump_template_parameter (tree parm, int flags)
pp_equal (cxx_pp);
pp_cxx_whitespace (cxx_pp);
if (TREE_CODE (p) == TYPE_DECL || TREE_CODE (p) == TEMPLATE_DECL)
- dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
+ dump_type (a, flags & ~TFF_CHASE_TYPEDEF);
else
- dump_expr (a, flags | TFF_EXPR_IN_PARENS);
+ dump_expr (a, flags | TFF_EXPR_IN_PARENS);
}
}
@@ -228,9 +228,9 @@ dump_template_bindings (tree parms, tree args)
if (need_comma)
pp_separate_with_comma (cxx_pp);
dump_template_parameter (TREE_VEC_ELT (p, i), TFF_PLAIN_IDENTIFIER);
- pp_cxx_whitespace (cxx_pp);
- pp_equal (cxx_pp);
- pp_cxx_whitespace (cxx_pp);
+ pp_cxx_whitespace (cxx_pp);
+ pp_equal (cxx_pp);
+ pp_cxx_whitespace (cxx_pp);
if (arg)
dump_template_argument (arg, TFF_PLAIN_IDENTIFIER);
else
@@ -283,11 +283,11 @@ dump_type (tree t, int flags)
case TYPE_DECL:
if (flags & TFF_CHASE_TYPEDEF)
- {
- dump_type (DECL_ORIGINAL_TYPE (t)
- ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
- break;
- }
+ {
+ dump_type (DECL_ORIGINAL_TYPE (t)
+ ? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t), flags);
+ break;
+ }
/* Else fall through. */
case TEMPLATE_DECL:
@@ -309,7 +309,7 @@ dump_type (tree t, int flags)
if (TYPE_IDENTIFIER (t))
pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
else
- pp_cxx_canonical_template_parameter (cxx_pp, t);
+ pp_cxx_canonical_template_parameter (cxx_pp, t);
break;
case BOUND_TEMPLATE_TEMPLATE_PARM:
@@ -318,7 +318,7 @@ dump_type (tree t, int flags)
pp_cxx_cv_qualifier_seq (cxx_pp, t);
pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
pp_cxx_begin_template_argument_list (cxx_pp);
- dump_template_argument_list (args, flags);
+ dump_template_argument_list (args, flags);
pp_cxx_end_template_argument_list (cxx_pp);
}
break;
@@ -328,8 +328,8 @@ dump_type (tree t, int flags)
if (TYPE_IDENTIFIER (t))
pp_cxx_tree_identifier (cxx_pp, TYPE_IDENTIFIER (t));
else
- pp_cxx_canonical_template_parameter
- (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
+ pp_cxx_canonical_template_parameter
+ (cxx_pp, TEMPLATE_TYPE_PARM_INDEX (t));
break;
/* This is not always necessary for pointers and such, but doing this
@@ -348,8 +348,8 @@ dump_type (tree t, int flags)
}
case TYPENAME_TYPE:
pp_cxx_cv_qualifier_seq (cxx_pp, t);
- pp_cxx_identifier (cxx_pp,
- TYPENAME_IS_ENUM_P (t) ? "enum"
+ pp_cxx_identifier (cxx_pp,
+ TYPENAME_IS_ENUM_P (t) ? "enum"
: TYPENAME_IS_CLASS_P (t) ? "class"
: "typename");
dump_typename (t, flags);
@@ -436,38 +436,38 @@ dump_aggr_type (tree t, int flags)
{
typdef = !DECL_ARTIFICIAL (name);
tmplate = !typdef && TREE_CODE (t) != ENUMERAL_TYPE
- && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
- && (CLASSTYPE_TEMPLATE_SPECIALIZATION (t)
- || TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
- || DECL_TEMPLATE_SPECIALIZATION (CLASSTYPE_TI_TEMPLATE (t))
- || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
+ && TYPE_LANG_SPECIFIC (t) && CLASSTYPE_TEMPLATE_INFO (t)
+ && (CLASSTYPE_TEMPLATE_SPECIALIZATION (t)
+ || TREE_CODE (CLASSTYPE_TI_TEMPLATE (t)) != TEMPLATE_DECL
+ || DECL_TEMPLATE_SPECIALIZATION (CLASSTYPE_TI_TEMPLATE (t))
+ || PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (t)));
dump_scope (CP_DECL_CONTEXT (name), flags | TFF_SCOPE);
if (tmplate)
- {
- /* Because the template names are mangled, we have to locate
- the most general template, and use that name. */
- tree tpl = CLASSTYPE_TI_TEMPLATE (t);
-
- while (DECL_TEMPLATE_INFO (tpl))
- tpl = DECL_TI_TEMPLATE (tpl);
- name = tpl;
- }
+ {
+ /* Because the template names are mangled, we have to locate
+ the most general template, and use that name. */
+ tree tpl = CLASSTYPE_TI_TEMPLATE (t);
+
+ while (DECL_TEMPLATE_INFO (tpl))
+ tpl = DECL_TI_TEMPLATE (tpl);
+ name = tpl;
+ }
name = DECL_NAME (name);
}
if (name == 0 || ANON_AGGRNAME_P (name))
{
if (flags & TFF_CLASS_KEY_OR_ENUM)
- pp_identifier (cxx_pp, "<anonymous>");
+ pp_identifier (cxx_pp, "<anonymous>");
else
- pp_printf (pp_base (cxx_pp), "<anonymous %s>", variety);
+ pp_printf (pp_base (cxx_pp), "<anonymous %s>", variety);
}
else
pp_cxx_tree_identifier (cxx_pp, name);
if (tmplate)
dump_template_parms (TYPE_TEMPLATE_INFO (t),
- !CLASSTYPE_USE_TEMPLATE (t),
- flags & ~TFF_TEMPLATE_HEADER);
+ !CLASSTYPE_USE_TEMPLATE (t),
+ flags & ~TFF_TEMPLATE_HEADER);
}
/* Dump into the obstack the initial part of the output for a given type.
@@ -481,7 +481,7 @@ dump_aggr_type (tree t, int flags)
Arrays must also do this for DECL nodes, like int a[], and for things like
int *[]&. */
-static void
+static void
dump_type_prefix (tree t, int flags)
{
if (TYPE_PTRMEMFUNC_P (t))
@@ -504,8 +504,8 @@ dump_type_prefix (tree t, int flags)
pp_cxx_left_paren (cxx_pp);
}
pp_character (cxx_pp, "&*"[TREE_CODE (t) == POINTER_TYPE]);
- pp_base (cxx_pp)->padding = pp_before;
- pp_cxx_cv_qualifier_seq (cxx_pp, t);
+ pp_base (cxx_pp)->padding = pp_before;
+ pp_cxx_cv_qualifier_seq (cxx_pp, t);
}
break;
@@ -514,9 +514,9 @@ dump_type_prefix (tree t, int flags)
dump_type_prefix (TREE_TYPE (t), flags);
if (TREE_CODE (t) == OFFSET_TYPE) /* pmfs deal with this in d_t_p */
{
- pp_maybe_space (cxx_pp);
- if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
- pp_cxx_left_paren (cxx_pp);
+ pp_maybe_space (cxx_pp);
+ if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
+ pp_cxx_left_paren (cxx_pp);
dump_type (TYPE_OFFSET_BASETYPE (t), flags);
pp_cxx_colon_colon (cxx_pp);
}
@@ -526,7 +526,7 @@ dump_type_prefix (tree t, int flags)
break;
/* Can only be reached through function pointer -- this would not be
- correct if FUNCTION_DECLs used it. */
+ correct if FUNCTION_DECLs used it. */
case FUNCTION_TYPE:
dump_type_prefix (TREE_TYPE (t), flags);
pp_maybe_space (cxx_pp);
@@ -601,7 +601,7 @@ dump_type_suffix (tree t, int flags)
case METHOD_TYPE:
{
tree arg;
- pp_cxx_right_paren (cxx_pp);
+ pp_cxx_right_paren (cxx_pp);
arg = TYPE_ARG_TYPES (t);
if (TREE_CODE (t) == METHOD_TYPE)
arg = TREE_CHAIN (arg);
@@ -611,10 +611,10 @@ dump_type_suffix (tree t, int flags)
dump_parameters (arg, flags & ~TFF_FUNCTION_DEFAULT_ARGUMENTS);
if (TREE_CODE (t) == METHOD_TYPE)
- pp_cxx_cv_qualifier_seq
- (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
- else
- pp_cxx_cv_qualifier_seq(cxx_pp, t);
+ pp_cxx_cv_qualifier_seq
+ (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))));
+ else
+ pp_cxx_cv_qualifier_seq(cxx_pp, t);
dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
dump_type_suffix (TREE_TYPE (t), flags);
break;
@@ -627,15 +627,15 @@ dump_type_suffix (tree t, int flags)
{
if (host_integerp (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0))
pp_wide_integer
- (cxx_pp, tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0) + 1);
+ (cxx_pp, tree_low_cst (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0) + 1);
else if (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (t))) == MINUS_EXPR)
dump_expr (TREE_OPERAND (TYPE_MAX_VALUE (TYPE_DOMAIN (t)), 0),
- flags & ~TFF_EXPR_IN_PARENS);
+ flags & ~TFF_EXPR_IN_PARENS);
else
dump_expr (fold (cp_build_binary_op
(PLUS_EXPR, TYPE_MAX_VALUE (TYPE_DOMAIN (t)),
integer_one_node)),
- flags & ~TFF_EXPR_IN_PARENS);
+ flags & ~TFF_EXPR_IN_PARENS);
}
pp_cxx_right_bracket (cxx_pp);
dump_type_suffix (TREE_TYPE (t), flags);
@@ -666,7 +666,7 @@ dump_type_suffix (tree t, int flags)
pp_unsupported_tree (cxx_pp, t);
case ERROR_MARK:
/* Don't mark it here, we should have already done in
- dump_type_prefix. */
+ dump_type_prefix. */
break;
}
}
@@ -722,7 +722,7 @@ dump_decl (tree t, int flags)
&& TREE_CODE (TREE_TYPE (t)) == TEMPLATE_TYPE_PARM)
/* Say `class T' not just `T'. */
pp_cxx_identifier (cxx_pp, "class");
-
+
dump_type (TREE_TYPE (t), flags);
break;
}
@@ -730,7 +730,7 @@ dump_decl (tree t, int flags)
pp_cxx_identifier (cxx_pp, "typedef");
dump_simple_decl (t, DECL_ORIGINAL_TYPE (t)
? DECL_ORIGINAL_TYPE (t) : TREE_TYPE (t),
- flags);
+ flags);
break;
case VAR_DECL:
@@ -755,15 +755,15 @@ dump_decl (tree t, int flags)
case NAMESPACE_DECL:
if (flags & TFF_DECL_SPECIFIERS)
- pp_cxx_declaration (cxx_pp, t);
+ pp_cxx_declaration (cxx_pp, t);
else
- {
- dump_scope (CP_DECL_CONTEXT (t), flags);
- if (DECL_NAME (t) == NULL_TREE)
- pp_identifier (cxx_pp, "<unnamed>");
- else
- pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
- }
+ {
+ dump_scope (CP_DECL_CONTEXT (t), flags);
+ if (DECL_NAME (t) == NULL_TREE)
+ pp_identifier (cxx_pp, "<unnamed>");
+ else
+ pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
+ }
break;
case SCOPE_REF:
@@ -786,7 +786,7 @@ dump_decl (tree t, int flags)
case BIT_NOT_EXPR:
/* This is a pseudo destructor call which has not been folded into
- a PSEUDO_DTOR_EXPR yet. */
+ a PSEUDO_DTOR_EXPR yet. */
pp_cxx_complement (cxx_pp);
dump_type (TREE_OPERAND (t, 0), flags);
break;
@@ -816,17 +816,17 @@ dump_decl (tree t, int flags)
if (DECL_CLASS_SCOPE_P (t))
{
dump_type (DECL_CONTEXT (t), flags);
- pp_cxx_colon_colon (cxx_pp);
+ pp_cxx_colon_colon (cxx_pp);
}
else if (DECL_CONTEXT (t))
{
dump_decl (DECL_CONTEXT (t), flags);
- pp_cxx_colon_colon (cxx_pp);
+ pp_cxx_colon_colon (cxx_pp);
}
dump_decl (DECL_NAME (t), flags);
break;
}
-
+
/* If there's only one function, just treat it like an ordinary
FUNCTION_DECL. */
t = OVL_CURRENT (t);
@@ -838,7 +838,7 @@ dump_decl (tree t, int flags)
else if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
dump_global_iord (t);
else
- dump_function_decl (t, flags);
+ dump_function_decl (t, flags);
break;
case TEMPLATE_DECL:
@@ -848,7 +848,7 @@ dump_decl (tree t, int flags)
case TEMPLATE_ID_EXPR:
{
tree name = TREE_OPERAND (t, 0);
-
+
if (is_overloaded_fn (name))
name = DECL_NAME (get_first_fn (name));
dump_decl (name, flags);
@@ -893,9 +893,9 @@ dump_decl (tree t, int flags)
case TEMPLATE_TYPE_PARM:
if (flags & TFF_DECL_SPECIFIERS)
- pp_cxx_declaration (cxx_pp, t);
+ pp_cxx_declaration (cxx_pp, t);
else
- pp_type_id (cxx_pp, t);
+ pp_type_id (cxx_pp, t);
break;
default:
@@ -921,28 +921,28 @@ dump_template_decl (tree t, int flags)
if (flags & TFF_TEMPLATE_HEADER)
{
for (parms = orig_parms = nreverse (orig_parms);
- parms;
- parms = TREE_CHAIN (parms))
- {
+ parms;
+ parms = TREE_CHAIN (parms))
+ {
tree inner_parms = INNERMOST_TEMPLATE_PARMS (parms);
- int len = TREE_VEC_LENGTH (inner_parms);
+ int len = TREE_VEC_LENGTH (inner_parms);
- pp_cxx_identifier (cxx_pp, "template");
- pp_cxx_begin_template_argument_list (cxx_pp);
+ pp_cxx_identifier (cxx_pp, "template");
+ pp_cxx_begin_template_argument_list (cxx_pp);
/* If we've shown the template prefix, we'd better show the
parameters' and decl's type too. */
flags |= TFF_DECL_SPECIFIERS;
- for (i = 0; i < len; i++)
- {
- if (i)
- pp_separate_with_comma (cxx_pp);
- dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
- }
- pp_cxx_end_template_argument_list (cxx_pp);
- pp_cxx_whitespace (cxx_pp);
- }
+ for (i = 0; i < len; i++)
+ {
+ if (i)
+ pp_separate_with_comma (cxx_pp);
+ dump_template_parameter (TREE_VEC_ELT (inner_parms, i), flags);
+ }
+ pp_cxx_end_template_argument_list (cxx_pp);
+ pp_cxx_whitespace (cxx_pp);
+ }
nreverse(orig_parms);
if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
@@ -952,8 +952,8 @@ dump_template_decl (tree t, int flags)
if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
dump_type (TREE_TYPE (t),
- ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
- | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
+ ((flags & ~TFF_CLASS_KEY_OR_ENUM) | TFF_TEMPLATE_NAME
+ | (flags & TFF_DECL_SPECIFIERS ? TFF_CLASS_KEY_OR_ENUM : 0)));
else if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == VAR_DECL)
dump_decl (DECL_TEMPLATE_RESULT (t), flags | TFF_TEMPLATE_NAME);
else
@@ -1026,7 +1026,7 @@ dump_function_decl (tree t, int flags)
/* Print the return type? */
if (show_return)
show_return = !DECL_CONV_FN_P (t) && !DECL_CONSTRUCTOR_P (t)
- && !DECL_DESTRUCTOR_P (t);
+ && !DECL_DESTRUCTOR_P (t);
if (show_return)
dump_type_prefix (TREE_TYPE (fntype), flags);
@@ -1046,17 +1046,17 @@ dump_function_decl (tree t, int flags)
dump_parameters (parmtypes, flags);
if (TREE_CODE (fntype) == METHOD_TYPE)
- {
- pp_base (cxx_pp)->padding = pp_before;
- pp_cxx_cv_qualifier_seq
- (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))));
- }
+ {
+ pp_base (cxx_pp)->padding = pp_before;
+ pp_cxx_cv_qualifier_seq
+ (cxx_pp, TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))));
+ }
if (flags & TFF_EXCEPTION_SPECIFICATION)
- {
- pp_base (cxx_pp)->padding = pp_before;
- dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
- }
+ {
+ pp_base (cxx_pp)->padding = pp_before;
+ dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
+ }
if (show_return)
dump_type_suffix (TREE_TYPE (fntype), flags);
@@ -1089,22 +1089,22 @@ dump_parameters (tree parmtypes, int flags)
parmtypes = TREE_CHAIN (parmtypes))
{
if (!first)
- pp_separate_with_comma (cxx_pp);
+ pp_separate_with_comma (cxx_pp);
first = 0;
if (!parmtypes)
- {
- pp_cxx_identifier (cxx_pp, "...");
- break;
- }
+ {
+ pp_cxx_identifier (cxx_pp, "...");
+ break;
+ }
dump_type (TREE_VALUE (parmtypes), flags);
if ((flags & TFF_FUNCTION_DEFAULT_ARGUMENTS) && TREE_PURPOSE (parmtypes))
- {
- pp_cxx_whitespace (cxx_pp);
- pp_equal (cxx_pp);
- pp_cxx_whitespace (cxx_pp);
- dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
- }
+ {
+ pp_cxx_whitespace (cxx_pp);
+ pp_equal (cxx_pp);
+ pp_cxx_whitespace (cxx_pp);
+ dump_expr (TREE_PURPOSE (parmtypes), flags | TFF_EXPR_IN_PARENS);
+ }
}
pp_cxx_right_paren (cxx_pp);
@@ -1121,14 +1121,14 @@ dump_exception_spec (tree t, int flags)
pp_cxx_whitespace (cxx_pp);
pp_cxx_left_paren (cxx_pp);
if (TREE_VALUE (t) != NULL_TREE)
- while (1)
- {
- dump_type (TREE_VALUE (t), flags);
- t = TREE_CHAIN (t);
- if (!t)
- break;
- pp_separate_with_comma (cxx_pp);
- }
+ while (1)
+ {
+ dump_type (TREE_VALUE (t), flags);
+ t = TREE_CHAIN (t);
+ if (!t)
+ break;
+ pp_separate_with_comma (cxx_pp);
+ }
pp_cxx_right_paren (cxx_pp);
}
}
@@ -1214,21 +1214,21 @@ dump_template_parms (tree info, int primary, int flags)
if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (args))
args = TREE_VEC_ELT (args, TREE_VEC_LENGTH (args) - 1);
-
+
len = TREE_VEC_LENGTH (args);
for (ix = 0; ix != len; ix++)
- {
- tree arg = TREE_VEC_ELT (args, ix);
-
- if (ix)
- pp_separate_with_comma (cxx_pp);
-
- if (!arg)
- pp_identifier (cxx_pp, "<template parameter error>");
- else
- dump_template_argument (arg, flags);
- }
+ {
+ tree arg = TREE_VEC_ELT (args, ix);
+
+ if (ix)
+ pp_separate_with_comma (cxx_pp);
+
+ if (!arg)
+ pp_identifier (cxx_pp, "<template parameter error>");
+ else
+ dump_template_argument (arg, flags);
+ }
}
else if (primary)
{
@@ -1240,14 +1240,14 @@ dump_template_parms (tree info, int primary, int flags)
len = parms ? TREE_VEC_LENGTH (parms) : 0;
for (ix = 0; ix != len; ix++)
- {
- tree parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
+ {
+ tree parm = TREE_VALUE (TREE_VEC_ELT (parms, ix));
- if (ix)
- pp_separate_with_comma (cxx_pp);
+ if (ix)
+ pp_separate_with_comma (cxx_pp);
- dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
- }
+ dump_decl (parm, flags & ~TFF_DECL_SPECIFIERS);
+ }
}
pp_cxx_end_template_argument_list (cxx_pp);
}
@@ -1273,7 +1273,7 @@ dump_expr (tree t, int flags)
{
if (t == 0)
return;
-
+
switch (TREE_CODE (t))
{
case VAR_DECL:
@@ -1295,7 +1295,7 @@ dump_expr (tree t, int flags)
if (PAREN_STRING_LITERAL_P (t))
pp_cxx_right_paren (cxx_pp);
break;
-
+
case INTEGER_CST:
case REAL_CST:
pp_c_constant (pp_c_base (cxx_pp), t);
@@ -1335,11 +1335,11 @@ dump_expr (tree t, int flags)
if (TREE_HAS_CONSTRUCTOR (t))
{
pp_cxx_identifier (cxx_pp, "new");
- pp_cxx_whitespace (cxx_pp);
+ pp_cxx_whitespace (cxx_pp);
dump_type (TREE_TYPE (TREE_TYPE (t)), flags);
}
else
- dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
+ dump_expr (TREE_OPERAND (t, 0), flags | TFF_EXPR_IN_PARENS);
break;
case AGGR_INIT_EXPR:
@@ -1401,14 +1401,14 @@ dump_expr (tree t, int flags)
tree type = TREE_OPERAND (t, 1);
tree init = TREE_OPERAND (t, 2);
if (NEW_EXPR_USE_GLOBAL (t))
- pp_cxx_colon_colon (cxx_pp);
+ pp_cxx_colon_colon (cxx_pp);
pp_cxx_identifier (cxx_pp, "new");
if (TREE_OPERAND (t, 0))
{
pp_cxx_left_paren (cxx_pp);
dump_expr_list (TREE_OPERAND (t, 0), flags);
- pp_cxx_right_paren (cxx_pp);
- pp_cxx_whitespace (cxx_pp);
+ pp_cxx_right_paren (cxx_pp);
+ pp_cxx_whitespace (cxx_pp);
}
if (TREE_CODE (type) == ARRAY_REF)
type = build_cplus_array_type
@@ -1489,7 +1489,8 @@ dump_expr (tree t, int flags)
{
ob = TREE_OPERAND (ob, 0);
if (TREE_CODE (ob) != PARM_DECL
- || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this"))
+ || (DECL_NAME (ob)
+ && strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")))
{
dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
pp_cxx_arrow (cxx_pp);
@@ -1511,16 +1512,8 @@ dump_expr (tree t, int flags)
pp_cxx_right_bracket (cxx_pp);
break;
- case CONVERT_EXPR:
- if (TREE_TYPE (t) && VOID_TYPE_P (TREE_TYPE (t)))
- {
- pp_cxx_left_paren (cxx_pp);
- dump_type (TREE_TYPE (t), flags);
- pp_cxx_right_paren (cxx_pp);
- dump_expr (TREE_OPERAND (t, 0), flags);
- }
- else
- dump_unary_op ("+", t, flags);
+ case UNARY_PLUS_EXPR:
+ dump_unary_op ("+", t, flags);
break;
case ADDR_EXPR:
@@ -1587,11 +1580,11 @@ dump_expr (tree t, int flags)
if (TREE_CODE (next) == FUNCTION_TYPE)
{
if (flags & TFF_EXPR_IN_PARENS)
- pp_cxx_left_paren (cxx_pp);
+ pp_cxx_left_paren (cxx_pp);
pp_cxx_star (cxx_pp);
dump_expr (TREE_OPERAND (t, 0), flags & ~TFF_EXPR_IN_PARENS);
if (flags & TFF_EXPR_IN_PARENS)
- pp_cxx_right_paren (cxx_pp);
+ pp_cxx_right_paren (cxx_pp);
break;
}
/* Else fall through. */
@@ -1600,9 +1593,10 @@ dump_expr (tree t, int flags)
break;
case NOP_EXPR:
+ case CONVERT_EXPR:
{
tree op = TREE_OPERAND (t, 0);
-
+
if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t)))
{
/* It is a cast, but we cannot tell whether it is a
@@ -1620,7 +1614,7 @@ dump_expr (tree t, int flags)
dump_expr (op, flags);
break;
}
-
+
case CONSTRUCTOR:
if (TREE_TYPE (t) && TYPE_PTRMEMFUNC_P (TREE_TYPE (t)))
{
@@ -1629,12 +1623,12 @@ dump_expr (tree t, int flags)
if (integer_zerop (idx))
{
/* A NULL pointer-to-member constant. */
- pp_cxx_left_paren (cxx_pp);
- pp_cxx_left_paren (cxx_pp);
+ pp_cxx_left_paren (cxx_pp);
+ pp_cxx_left_paren (cxx_pp);
dump_type (TREE_TYPE (t), flags);
- pp_cxx_right_paren (cxx_pp);
- pp_character (cxx_pp, '0');
- pp_cxx_right_paren (cxx_pp);
+ pp_cxx_right_paren (cxx_pp);
+ pp_character (cxx_pp, '0');
+ pp_cxx_right_paren (cxx_pp);
break;
}
else if (host_integerp (idx, 0))
@@ -1660,7 +1654,7 @@ dump_expr (tree t, int flags)
if (virtuals)
{
dump_expr (BV_FN (virtuals),
- flags | TFF_EXPR_IN_PARENS);
+ flags | TFF_EXPR_IN_PARENS);
break;
}
}
@@ -1668,16 +1662,16 @@ dump_expr (tree t, int flags)
if (TREE_TYPE (t) && !CONSTRUCTOR_ELTS (t))
{
dump_type (TREE_TYPE (t), 0);
- pp_cxx_left_paren (cxx_pp);
- pp_cxx_right_paren (cxx_pp);
+ pp_cxx_left_paren (cxx_pp);
+ pp_cxx_right_paren (cxx_pp);
}
else
{
- pp_cxx_left_brace (cxx_pp);
+ pp_cxx_left_brace (cxx_pp);
dump_expr_list (CONSTRUCTOR_ELTS (t), flags);
- pp_cxx_right_brace (cxx_pp);
+ pp_cxx_right_brace (cxx_pp);
}
-
+
break;
case OFFSET_REF:
@@ -1690,7 +1684,7 @@ dump_expr (tree t, int flags)
/* A::f */
dump_expr (t, flags | TFF_EXPR_IN_PARENS);
else if (BASELINK_P (t))
- dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
+ dump_expr (OVL_CURRENT (BASELINK_FUNCTIONS (t)),
flags | TFF_EXPR_IN_PARENS);
else
dump_decl (t, flags);
@@ -1700,14 +1694,14 @@ dump_expr (tree t, int flags)
if (TREE_CODE (ob) == INDIRECT_REF)
{
dump_expr (TREE_OPERAND (ob, 0), flags | TFF_EXPR_IN_PARENS);
- pp_cxx_arrow (cxx_pp);
- pp_cxx_star (cxx_pp);
+ pp_cxx_arrow (cxx_pp);
+ pp_cxx_star (cxx_pp);
}
else
{
dump_expr (ob, flags | TFF_EXPR_IN_PARENS);
- pp_cxx_dot (cxx_pp);
- pp_cxx_star (cxx_pp);
+ pp_cxx_dot (cxx_pp);
+ pp_cxx_star (cxx_pp);
}
dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS);
}
@@ -1735,8 +1729,8 @@ dump_expr (tree t, int flags)
{
pp_cxx_left_paren (cxx_pp);
dump_type (TREE_TYPE (t), flags);
- pp_cxx_right_paren (cxx_pp);
- pp_cxx_left_paren (cxx_pp);
+ pp_cxx_right_paren (cxx_pp);
+ pp_cxx_left_paren (cxx_pp);
dump_expr_list (TREE_OPERAND (t, 0), flags);
pp_cxx_right_paren (cxx_pp);
}
@@ -1770,7 +1764,7 @@ dump_expr (tree t, int flags)
case SIZEOF_EXPR:
case ALIGNOF_EXPR:
if (TREE_CODE (t) == SIZEOF_EXPR)
- pp_cxx_identifier (cxx_pp, "sizeof");
+ pp_cxx_identifier (cxx_pp, "sizeof");
else
{
gcc_assert (TREE_CODE (t) == ALIGNOF_EXPR);
@@ -1781,7 +1775,7 @@ dump_expr (tree t, int flags)
if (TYPE_P (TREE_OPERAND (t, 0)))
dump_type (TREE_OPERAND (t, 0), flags);
else
- dump_expr (TREE_OPERAND (t, 0), flags);
+ dump_expr (TREE_OPERAND (t, 0), flags);
pp_cxx_right_paren (cxx_pp);
break;
@@ -1957,7 +1951,7 @@ location_of (tree t)
t = TYPE_MAIN_DECL (t);
else if (TREE_CODE (t) == OVERLOAD)
t = OVL_FUNCTION (t);
-
+
return DECL_SOURCE_LOCATION (t);
}
@@ -2118,7 +2112,7 @@ cxx_print_error_function (diagnostic_context *context, const char *file)
static void
cp_diagnostic_starter (diagnostic_context *context,
- diagnostic_info *diagnostic)
+ diagnostic_info *diagnostic)
{
diagnostic_report_current_module (context);
cp_print_error_function (context, diagnostic);
@@ -2128,7 +2122,7 @@ cp_diagnostic_starter (diagnostic_context *context,
static void
cp_diagnostic_finalizer (diagnostic_context *context,
- diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
+ diagnostic_info *diagnostic ATTRIBUTE_UNUSED)
{
pp_base_destroy_prefix (context->printer);
}
@@ -2137,7 +2131,7 @@ cp_diagnostic_finalizer (diagnostic_context *context,
a diagnostic message. Called from cp_diagnostic_starter. */
static void
cp_print_error_function (diagnostic_context *context,
- diagnostic_info *diagnostic)
+ diagnostic_info *diagnostic)
{
if (diagnostic_last_function_changed (context))
{
@@ -2148,11 +2142,11 @@ cp_print_error_function (diagnostic_context *context,
pp_base_set_prefix (context->printer, new_prefix);
if (current_function_decl == NULL)
- pp_base_string (context->printer, "At global scope:");
+ pp_base_string (context->printer, "At global scope:");
else
- pp_printf (context->printer, "In %s %qs:",
- function_category (current_function_decl),
- cxx_printable_name (current_function_decl, 2));
+ pp_printf (context->printer, "In %s %qs:",
+ function_category (current_function_decl),
+ cxx_printable_name (current_function_decl, 2));
pp_base_newline (context->printer);
diagnostic_set_last_function (context);
@@ -2168,15 +2162,15 @@ function_category (tree fn)
if (DECL_FUNCTION_MEMBER_P (fn))
{
if (DECL_STATIC_FUNCTION_P (fn))
- return "static member function";
+ return "static member function";
else if (DECL_COPY_CONSTRUCTOR_P (fn))
- return "copy constructor";
+ return "copy constructor";
else if (DECL_CONSTRUCTOR_P (fn))
- return "constructor";
+ return "constructor";
else if (DECL_DESTRUCTOR_P (fn))
- return "destructor";
+ return "destructor";
else
- return "member function";
+ return "member function";
}
else
return "function";
@@ -2189,7 +2183,7 @@ print_instantiation_full_context (diagnostic_context *context)
{
tree p = current_instantiation ();
location_t location = input_location;
-
+
if (p)
{
if (current_function_decl != TINST_DECL (p)
@@ -2204,10 +2198,10 @@ print_instantiation_full_context (diagnostic_context *context)
/* Avoid redundancy with the "In function" line. */;
else
pp_verbatim (context->printer,
- "%s: In instantiation of %qs:\n",
+ "%s: In instantiation of %qs:\n",
LOCATION_FILE (location),
- decl_as_string (TINST_DECL (p),
- TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
+ decl_as_string (TINST_DECL (p),
+ TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
location = TINST_LOCATION (p);
p = TREE_CHAIN (p);
@@ -2220,7 +2214,7 @@ print_instantiation_full_context (diagnostic_context *context)
/* Same as above but less verbose. */
static void
print_instantiation_partial_context (diagnostic_context *context,
- tree t, location_t loc)
+ tree t, location_t loc)
{
expanded_location xloc;
for (; ; t = TREE_CHAIN (t))
@@ -2229,13 +2223,13 @@ print_instantiation_partial_context (diagnostic_context *context,
if (t == NULL_TREE)
break;
pp_verbatim (context->printer, "%s:%d: instantiated from %qs\n",
- xloc.file, xloc.line,
- decl_as_string (TINST_DECL (t),
- TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
+ xloc.file, xloc.line,
+ decl_as_string (TINST_DECL (t),
+ TFF_DECL_SPECIFIERS | TFF_RETURN_TYPE));
loc = TINST_LOCATION (t);
}
pp_verbatim (context->printer, "%s:%d: instantiated from here\n",
- xloc.file, xloc.line);
+ xloc.file, xloc.line);
}
/* Called from cp_thing to print the template context for an error. */
@@ -2292,17 +2286,17 @@ cp_printer (pretty_printer *pp, text_info *text)
switch (*text->format_spec)
{
case 'A': result = args_to_string (next_tree, verbose); break;
- case 'C': result = code_to_string (next_tcode); break;
+ case 'C': result = code_to_string (next_tcode); break;
case 'D': result = decl_to_string (next_tree, verbose); break;
- case 'E': result = expr_to_string (next_tree); break;
+ case 'E': result = expr_to_string (next_tree); break;
case 'F': result = fndecl_to_string (next_tree, verbose); break;
- case 'L': result = language_to_string (next_lang); break;
- case 'O': result = op_to_string (next_tcode); break;
- case 'P': result = parm_to_string (next_int); break;
- case 'Q': result = assop_to_string (next_tcode); break;
+ case 'L': result = language_to_string (next_lang); break;
+ case 'O': result = op_to_string (next_tcode); break;
+ case 'P': result = parm_to_string (next_int); break;
+ case 'Q': result = assop_to_string (next_tcode); break;
case 'T': result = type_to_string (next_tree, verbose); break;
case 'V': result = cv_to_string (next_tree, verbose); break;
-
+
default:
return false;
}
@@ -2319,25 +2313,25 @@ cp_printer (pretty_printer *pp, text_info *text)
behavior of cp_*_at. */
static tree
-locate_error (const char *msgid, va_list ap)
+locate_error (const char *gmsgid, va_list ap)
{
tree here = 0, t;
int plus = 0;
const char *f;
- for (f = msgid; *f; f++)
+ for (f = gmsgid; *f; f++)
{
plus = 0;
if (*f == '%')
{
- if (*++f == 'q')
- ++f; /* ignore quoting flag. */
+ if (*++f == 'q')
+ ++f; /* ignore quoting flag. */
if (*f == '+')
- {
- ++f;
- plus = 1;
- }
+ {
+ ++f;
+ plus = 1;
+ }
if (*f == '#')
f++;
@@ -2381,58 +2375,58 @@ locate_error (const char *msgid, va_list ap)
void
-cp_error_at (const char *msgid, ...)
+cp_error_at (const char *gmsgid, ...)
{
tree here;
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- here = locate_error (msgid, ap);
+ va_start (ap, gmsgid);
+ here = locate_error (gmsgid, ap);
va_end (ap);
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap,
- input_location, DK_ERROR);
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap,
+ input_location, DK_ERROR);
cp_diagnostic_starter (global_dc, &diagnostic);
- diagnostic_set_info (&diagnostic, msgid, &ap,
- location_of (here), DK_ERROR);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap,
+ location_of (here), DK_ERROR);
report_diagnostic (&diagnostic);
va_end (ap);
}
void
-cp_warning_at (const char *msgid, ...)
+cp_warning_at (const char *gmsgid, ...)
{
tree here;
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- here = locate_error (msgid, ap);
+ va_start (ap, gmsgid);
+ here = locate_error (gmsgid, ap);
va_end (ap);
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap,
- location_of (here), DK_WARNING);
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap,
+ location_of (here), DK_WARNING);
report_diagnostic (&diagnostic);
va_end (ap);
}
void
-cp_pedwarn_at (const char *msgid, ...)
+cp_pedwarn_at (const char *gmsgid, ...)
{
tree here;
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- here = locate_error (msgid, ap);
+ va_start (ap, gmsgid);
+ here = locate_error (gmsgid, ap);
va_end (ap);
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap,
- location_of (here), pedantic_error_kind());
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap,
+ location_of (here), pedantic_error_kind());
report_diagnostic (&diagnostic);
va_end (ap);
}
diff --git a/gcc/cp/except.c b/gcc/cp/except.c
index 60db762924e..6f97312666d 100644
--- a/gcc/cp/except.c
+++ b/gcc/cp/except.c
@@ -95,7 +95,7 @@ cp_protect_cleanup_actions (void)
When the destruction of an object during stack unwinding exits
using an exception ... void terminate(); is called. */
return build_call (terminate_node, NULL_TREE);
-}
+}
static tree
prepare_eh_type (tree type)
@@ -260,7 +260,7 @@ decl_is_java_type (tree decl, int err)
{
/* Can't throw a reference. */
error ("type %qT is disallowed in Java %<throw%> or %<catch%>",
- decl);
+ decl);
}
if (r)
@@ -278,7 +278,7 @@ decl_is_java_type (tree decl, int err)
{
/* Thrown object must be a Throwable. */
error ("type %qT is not derived from %<java::lang::Throwable%>",
- TREE_TYPE (decl));
+ TREE_TYPE (decl));
}
}
}
@@ -346,7 +346,7 @@ choose_personality_routine (enum languages lang)
/* Initialize the catch parameter DECL. */
-static void
+static void
initialize_handler_parm (tree decl, tree exp)
{
tree init;
@@ -357,7 +357,7 @@ initialize_handler_parm (tree decl, tree exp)
TREE_USED (decl) = 1;
/* Figure out the type that the initializer is. Pointers are returned
- adjusted by value from __cxa_begin_catch. Others are returned by
+ adjusted by value from __cxa_begin_catch. Others are returned by
reference. */
init_type = TREE_TYPE (decl);
if (!POINTER_TYPE_P (init_type))
@@ -528,7 +528,7 @@ do_allocate_exception (tree type)
tree tmp = tree_cons (NULL_TREE, size_type_node, void_list_node);
fn = push_library_fn (fn, build_function_type (ptr_type_node, tmp));
}
-
+
return build_function_call (fn, tree_cons (NULL_TREE, size_in_bytes (type),
NULL_TREE));
}
@@ -557,7 +557,7 @@ do_free_exception (tree ptr)
static tree
wrap_cleanups_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
- void *data ATTRIBUTE_UNUSED)
+ void *data ATTRIBUTE_UNUSED)
{
tree exp = *tp;
tree cleanup;
@@ -600,11 +600,11 @@ build_throw (tree exp)
if (exp == null_node)
warning (0, "throwing NULL, which has integral, not pointer type");
-
+
if (exp != NULL_TREE)
{
if (!is_admissible_throw_operand (exp))
- return error_mark_node;
+ return error_mark_node;
}
if (! doing_eh (1))
@@ -645,7 +645,7 @@ build_throw (tree exp)
tmp = build_function_type (void_type_node, tmp);
cleanup_type = build_pointer_type (tmp);
}
-
+
fn = get_identifier ("__cxa_throw");
if (!get_global_value_if_present (fn, &fn))
{
@@ -658,7 +658,7 @@ build_throw (tree exp)
tmp = build_function_type (void_type_node, tmp);
fn = push_throw_library_fn (fn, tmp);
}
-
+
/* throw expression */
/* First, decay it. */
exp = decay_conversion (exp);
@@ -697,20 +697,23 @@ build_throw (tree exp)
the space first we would have to deal with cleaning it up if
evaluating this expression throws.
- The case where EXP the initializer is a call to a constructor or a
- function returning a class is a bit of a grey area in the
- standard; it's unclear whether or not it should be allowed to
- throw. We used to say no, as that allowed us to optimize this
- case without worrying about deallocating the exception object if
- it does. But that conflicted with expectations (PR 13944) and the
- EDG compiler; now we wrap the initialization in a TRY_CATCH_EXPR
- to call do_free_exception rather than in a MUST_NOT_THROW_EXPR,
- for this case only.
-
- Note that we don't check the return value from stabilize_init
- because it will only return false in cases where elided is true,
- and therefore we don't need to work around the failure to
- preevaluate. */
+ The case where EXP the initializer is a cast or a function
+ returning a class is a bit of a grey area in the standard; it's
+ unclear whether or not it should be allowed to throw. We used to
+ say no, as that allowed us to optimize this case without worrying
+ about deallocating the exception object if it does. But that
+ conflicted with expectations (PR 13944) and the EDG compiler; now
+ we wrap the initialization in a TRY_CATCH_EXPR to call
+ do_free_exception rather than in a MUST_NOT_THROW_EXPR, for this
+ case only.
+
+ BUT: Issue 475 may do away with this inconsistency by removing the
+ terminate() in this situation.
+
+ Note that we don't check the return value from stabilize_init
+ because it will only return false in cases where elided is true,
+ and therefore we don't need to work around the failure to
+ preevaluate. */
temp_expr = NULL_TREE;
stabilize_init (exp, &temp_expr);
@@ -748,7 +751,7 @@ build_throw (tree exp)
}
else
cleanup = build_int_cst (cleanup_type, 0);
-
+
tmp = tree_cons (NULL_TREE, cleanup, NULL_TREE);
tmp = tree_cons (NULL_TREE, throw_type, tmp);
tmp = tree_cons (NULL_TREE, ptr, tmp);
@@ -771,7 +774,7 @@ build_throw (tree exp)
}
/* ??? Indicate that this function call allows exceptions of the type
- of the enclosing catch block (if known). */
+ of the enclosing catch block (if known). */
exp = build_function_call (fn, NULL_TREE);
}
@@ -789,22 +792,22 @@ static int
complete_ptr_ref_or_void_ptr_p (tree type, tree from)
{
int is_ptr;
-
+
/* Check complete. */
type = complete_type_or_else (type, from);
if (!type)
return 0;
-
+
/* Or a pointer or ref to one, or cv void *. */
is_ptr = TREE_CODE (type) == POINTER_TYPE;
if (is_ptr || TREE_CODE (type) == REFERENCE_TYPE)
{
tree core = TREE_TYPE (type);
-
+
if (is_ptr && VOID_TYPE_P (core))
- /* OK */;
+ /* OK */;
else if (!complete_type_or_else (core, from))
- return 0;
+ return 0;
}
return 1;
}
@@ -819,22 +822,22 @@ is_admissible_throw_operand (tree expr)
tree type = TREE_TYPE (expr);
/* 15.1/4 [...] The type of the throw-expression shall not be an
- incomplete type, or a pointer or a reference to an incomplete
- type, other than void*, const void*, volatile void*, or
- const volatile void*. Except for these restriction and the
- restrictions on type matching mentioned in 15.3, the operand
- of throw is treated exactly as a function argument in a call
- (5.2.2) or the operand of a return statement. */
+ incomplete type, or a pointer or a reference to an incomplete
+ type, other than void*, const void*, volatile void*, or
+ const volatile void*. Except for these restriction and the
+ restrictions on type matching mentioned in 15.3, the operand
+ of throw is treated exactly as a function argument in a call
+ (5.2.2) or the operand of a return statement. */
if (!complete_ptr_ref_or_void_ptr_p (type, expr))
return false;
/* 10.4/3 An abstract class shall not be used as a parameter type,
- as a function return type or as type of an explicit
- conversion. */
+ as a function return type or as type of an explicit
+ conversion. */
else if (CLASS_TYPE_P (type) && CLASSTYPE_PURE_VIRTUALS (type))
{
error ("expression %qE of abstract class type %qT cannot "
- "be used in throw-expression", expr, type);
+ "be used in throw-expression", expr, type);
return false;
}
@@ -923,7 +926,7 @@ check_handlers_1 (tree master, tree_stmt_iterator i)
warning (0, "%H by earlier handler for %qT",
EXPR_LOCUS (master), type);
break;
- }
+ }
}
}
@@ -943,7 +946,7 @@ check_handlers (tree handlers)
if (!tsi_end_p (i))
while (1)
{
- tree handler = tsi_stmt (i);
+ tree handler = tsi_stmt (i);
tsi_next (&i);
/* No more handlers; nothing to shadow. */
diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c
index 466d984642b..efa5c9ae555 100644
--- a/gcc/cp/expr.c
+++ b/gcc/cp/expr.c
@@ -46,11 +46,11 @@ cplus_expand_constant (tree cst)
{
tree type = TREE_TYPE (cst);
tree member;
-
+
/* Find the member. */
member = PTRMEM_CST_MEMBER (cst);
- if (TREE_CODE (member) == FIELD_DECL)
+ if (TREE_CODE (member) == FIELD_DECL)
{
/* Find the offset for the field. */
cst = byte_position (member);
diff --git a/gcc/cp/friend.c b/gcc/cp/friend.c
index 3f7a2606246..5086f63fa02 100644
--- a/gcc/cp/friend.c
+++ b/gcc/cp/friend.c
@@ -85,18 +85,18 @@ is_friend (tree type, tree supplicant)
context = TYPE_CONTEXT (context))
if (type == context)
return 1;
-
+
list = CLASSTYPE_FRIEND_CLASSES (TREE_TYPE (TYPE_MAIN_DECL (type)));
for (; list ; list = TREE_CHAIN (list))
{
tree t = TREE_VALUE (list);
- if (TREE_CODE (t) == TEMPLATE_DECL ?
+ if (TREE_CODE (t) == TEMPLATE_DECL ?
is_specialization_of_friend (TYPE_MAIN_DECL (supplicant), t) :
same_type_p (supplicant, t))
return 1;
}
- }
+ }
if (declp && DECL_FUNCTION_MEMBER_P (supplicant))
context = DECL_CONTEXT (supplicant);
@@ -174,7 +174,7 @@ add_friend (tree type, tree decl, bool complain)
= tree_cons (DECL_NAME (decl), build_tree_list (NULL_TREE, decl),
DECL_FRIENDLIST (typedecl));
if (!uses_template_parms (type))
- DECL_BEFRIENDING_CLASSES (decl)
+ DECL_BEFRIENDING_CLASSES (decl)
= tree_cons (NULL_TREE, type,
DECL_BEFRIENDING_CLASSES (decl));
}
@@ -375,8 +375,8 @@ make_friend_class (tree type, tree friend_type, bool complain)
}
}
}
-
- if (!classes)
+
+ if (!classes)
{
maybe_add_class_template_decl_list (type, friend_type, /*friend_p=*/1);
@@ -386,12 +386,12 @@ make_friend_class (tree type, tree friend_type, bool complain)
friend_type = TREE_TYPE (friend_type);
if (!uses_template_parms (type))
CLASSTYPE_BEFRIENDING_CLASSES (friend_type)
- = tree_cons (NULL_TREE, type,
- CLASSTYPE_BEFRIENDING_CLASSES (friend_type));
+ = tree_cons (NULL_TREE, type,
+ CLASSTYPE_BEFRIENDING_CLASSES (friend_type));
}
}
-/* Main friend processor.
+/* Main friend processor.
CTYPE is the class this friend belongs to.
@@ -406,7 +406,7 @@ make_friend_class (tree type, tree friend_type, bool complain)
tree
do_friend (tree ctype, tree declarator, tree decl,
- tree attrlist, enum overload_flags flags,
+ tree attrlist, enum overload_flags flags,
cp_cv_quals quals,
int funcdef_flag)
{
@@ -482,8 +482,8 @@ do_friend (tree ctype, tree declarator, tree decl,
validity of the declaration later. */
decl = push_template_decl_real (decl, /*is_friend=*/1);
else
- decl = check_classfn (ctype, decl,
- template_member_p
+ decl = check_classfn (ctype, decl,
+ template_member_p
? current_template_parms
: NULL_TREE);
@@ -527,7 +527,7 @@ do_friend (tree ctype, tree declarator, tree decl,
general, such a declaration depends on template
parameters. Instead, we call pushdecl when the class
is instantiated. */
- decl = push_template_decl_real (decl, /*is_friend=*/1);
+ decl = push_template_decl_real (decl, /*is_friend=*/1);
else if (current_function_decl)
/* This must be a local class, so pushdecl will be ok, and
insert an unqualified friend into the local scope
@@ -537,11 +537,11 @@ do_friend (tree ctype, tree declarator, tree 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. */
+ class specialization, and pushdecl will insert an
+ unqualified friend decl into the template parameter
+ scope, rather than the namespace containing it. */
tree ns = decl_namespace_context (decl);
-
+
push_nested_namespace (ns);
decl = pushdecl_namespace_level (decl);
pop_nested_namespace (ns);
@@ -551,13 +551,13 @@ do_friend (tree ctype, tree declarator, tree decl,
{
static int explained;
warning (0, "friend declaration %q#D declares a non-template "
- "function", decl);
+ "function", decl);
if (! explained)
{
warning (0, "(if this is not what you intended, make sure "
- "the function template has already been declared "
- "and add <> after the function name here) "
- "-Wno-non-template-friend disables this warning");
+ "the function template has already been declared "
+ "and add <> after the function name here) "
+ "-Wno-non-template-friend disables this warning");
explained = 1;
}
}
@@ -565,8 +565,8 @@ do_friend (tree ctype, tree declarator, tree decl,
if (decl == error_mark_node)
return error_mark_node;
-
- add_friend (current_class_type,
+
+ add_friend (current_class_type,
is_friend_template ? DECL_TI_TEMPLATE (decl) : decl,
/*complain=*/true);
DECL_FRIEND_P (decl) = 1;
diff --git a/gcc/cp/g++spec.c b/gcc/cp/g++spec.c
index 2210ccc1eac..6390574d800 100644
--- a/gcc/cp/g++spec.c
+++ b/gcc/cp/g++spec.c
@@ -190,7 +190,7 @@ lang_specific_driver (int *in_argc, const char *const **in_argv,
cause a warning. */
library = -1;
}
- else if (strcmp (argv[i], "-static-libgcc") == 0
+ else if (strcmp (argv[i], "-static-libgcc") == 0
|| strcmp (argv[i], "-static") == 0)
shared_libgcc = 0;
else if (DEFAULT_WORD_SWITCH_TAKES_ARG (&argv[i][1]))
@@ -201,7 +201,7 @@ lang_specific_driver (int *in_argc, const char *const **in_argv,
}
else
{
- int len;
+ int len;
if (saw_speclang)
{
@@ -213,7 +213,7 @@ lang_specific_driver (int *in_argc, const char *const **in_argv,
But not if a specified -x option is currently active. */
len = strlen (argv[i]);
if (len > 2
- && (argv[i][len - 1] == 'c'
+ && (argv[i][len - 1] == 'c'
|| argv[i][len - 1] == 'i'
|| argv[i][len - 1] == 'h')
&& argv[i][len - 2] == '.')
@@ -221,7 +221,7 @@ lang_specific_driver (int *in_argc, const char *const **in_argv,
args[i] |= LANGSPEC;
added += 2;
}
-
+
/* If we don't know that this is a header file, we might
need to be linking in the libraries. */
if (library == 0)
@@ -256,7 +256,7 @@ lang_specific_driver (int *in_argc, const char *const **in_argv,
i = 0;
j = 0;
-
+
/* Copy the 0th argument, i.e., the name of the program itself. */
arglist[i++] = argv[j++];
@@ -344,7 +344,7 @@ int lang_specific_pre_link (void) /* 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++. */
-/* Table of language-specific spec functions. */
+/* Table of language-specific spec functions. */
const struct spec_function lang_specific_spec_functions[] =
{
{ 0, 0 }
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 99891cb2922..1ceb9b29471 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -70,7 +70,7 @@ static bool
begin_init_stmts (tree *stmt_expr_p, tree *compound_stmt_p)
{
bool is_global = !building_stmt_tree ();
-
+
*stmt_expr_p = begin_stmt_expr ();
*compound_stmt_p = begin_compound_stmt (BCS_NO_SCOPE);
@@ -82,13 +82,13 @@ begin_init_stmts (tree *stmt_expr_p, tree *compound_stmt_p)
static tree
finish_init_stmts (bool is_global, tree stmt_expr, tree compound_stmt)
-{
+{
finish_compound_stmt (compound_stmt);
-
+
stmt_expr = finish_stmt_expr (stmt_expr, true);
gcc_assert (!building_stmt_tree () == is_global);
-
+
return stmt_expr;
}
@@ -103,7 +103,7 @@ dfs_initialize_vtbl_ptrs (tree binfo, void *data)
{
if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo)))
return dfs_skip_bases;
-
+
if (!BINFO_PRIMARY_P (binfo) || BINFO_VIRTUAL_P (binfo))
{
tree base_ptr = TREE_VALUE ((tree) data);
@@ -156,16 +156,16 @@ build_zero_init (tree type, tree nelts, bool static_storage_p)
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.
+ 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.
+ 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.
+ zero-initialized.
-- if T is an array type, the storage for each element is
- zero-initialized.
+ zero-initialized.
-- if T is a reference type, no initialization is performed. */
@@ -200,7 +200,7 @@ build_zero_init (tree type, tree nelts, bool static_storage_p)
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,
+ inits = tree_cons (field,
build_zero_init (TREE_TYPE (field),
/*nelts=*/NULL_TREE,
static_storage_p),
@@ -236,16 +236,16 @@ build_zero_init (tree type, tree nelts, bool static_storage_p)
/*nelts=*/NULL_TREE,
static_storage_p);
tree range;
-
+
/* If this is a one element array, we just use a regular init. */
if (tree_int_cst_equal (size_zero_node, max_index))
range = size_zero_node;
else
range = build2 (RANGE_EXPR, sizetype, size_zero_node, max_index);
-
+
inits = tree_cons (range, elt_init, inits);
}
-
+
CONSTRUCTOR_ELTS (init) = nreverse (inits);
}
else
@@ -292,7 +292,7 @@ build_default_init (tree type, tree nelts)
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].
+ 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
@@ -301,7 +301,7 @@ build_default_init (tree type, tree nelts)
if (TYPE_NEEDS_CONSTRUCTING (type)
|| (nelts && TREE_CODE (nelts) != INTEGER_CST))
return NULL_TREE;
-
+
/* At this point, TYPE is either a POD class type, an array of POD
classes, or something even more innocuous. */
return build_zero_init (type, nelts, /*static_storage_p=*/false);
@@ -409,7 +409,7 @@ perform_member_init (tree member, tree init)
/* Returns a TREE_LIST containing (as the TREE_PURPOSE of each node) all
the FIELD_DECLs on the TYPE_FIELDS list for T, in reverse order. */
-static tree
+static tree
build_field_list (tree t, tree list, int *uses_unions_p)
{
tree fields;
@@ -425,7 +425,7 @@ build_field_list (tree t, tree list, int *uses_unions_p)
/* Skip CONST_DECLs for enumeration constants and so forth. */
if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields))
continue;
-
+
/* Keep track of whether or not any fields are unions. */
if (TREE_CODE (TREE_TYPE (fields)) == UNION_TYPE)
*uses_unions_p = 1;
@@ -439,7 +439,7 @@ build_field_list (tree t, tree list, int *uses_unions_p)
initialize the entire aggregate. */
list = tree_cons (fields, NULL_TREE, list);
/* And now add the fields in the anonymous aggregate. */
- list = build_field_list (TREE_TYPE (fields), list,
+ list = build_field_list (TREE_TYPE (fields), list,
uses_unions_p);
}
/* Add this field. */
@@ -474,12 +474,12 @@ sort_mem_initializers (tree t, tree mem_inits)
TREE_VALUE will be the constructor arguments, or NULL if no
explicit initialization was provided. */
sorted_inits = NULL_TREE;
-
+
/* Process the virtual bases. */
for (vbases = CLASSTYPE_VBASECLASSES (t), i = 0;
VEC_iterate (tree, vbases, i, base); i++)
sorted_inits = tree_cons (base, NULL_TREE, sorted_inits);
-
+
/* Process the direct bases. */
for (binfo = TYPE_BINFO (t), i = 0;
BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
@@ -508,17 +508,17 @@ sort_mem_initializers (tree t, tree mem_inits)
subobject = TREE_PURPOSE (init);
/* If the explicit initializers are in sorted order, then
- SUBOBJECT will be NEXT_SUBOBJECT, or something following
+ SUBOBJECT will be NEXT_SUBOBJECT, or something following
it. */
- for (subobject_init = next_subobject;
- subobject_init;
+ for (subobject_init = next_subobject;
+ subobject_init;
subobject_init = TREE_CHAIN (subobject_init))
if (TREE_PURPOSE (subobject_init) == subobject)
break;
/* Issue a warning if the explicit initializer order does not
match that which will actually occur.
- ??? Are all these on the correct lines? */
+ ??? Are all these on the correct lines? */
if (warn_reorder && !subobject_init)
{
if (TREE_CODE (TREE_PURPOSE (next_subobject)) == FIELD_DECL)
@@ -541,7 +541,7 @@ sort_mem_initializers (tree t, tree mem_inits)
while (TREE_PURPOSE (subobject_init) != subobject)
subobject_init = TREE_CHAIN (subobject_init);
}
-
+
/* It is invalid to initialize the same subobject more than
once. */
if (TREE_VALUE (subobject_init))
@@ -550,7 +550,7 @@ sort_mem_initializers (tree t, tree mem_inits)
error ("%Jmultiple initializations given for %qD",
current_function_decl, subobject);
else
- error ("%Jmultiple initializations given for base %qT",
+ error ("%Jmultiple initializations given for base %qT",
current_function_decl, subobject);
}
@@ -574,7 +574,7 @@ sort_mem_initializers (tree t, tree mem_inits)
int done;
/* Skip uninitialized members and base classes. */
- if (!TREE_VALUE (init)
+ 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
@@ -628,7 +628,7 @@ sort_mem_initializers (tree t, tree mem_inits)
last_field_type = TYPE_CONTEXT (last_field_type);
}
-
+
/* If we've reached the outermost class, then we're
done. */
if (same_type_p (field_type, t))
@@ -659,15 +659,15 @@ emit_mem_initializers (tree mem_inits)
the type is incomplete. */
if (!COMPLETE_TYPE_P (current_class_type))
return;
-
+
/* Sort the mem-initializers into the order in which the
initializations should be performed. */
mem_inits = sort_mem_initializers (current_class_type, mem_inits);
in_base_initializer = 1;
-
+
/* Initialize base classes. */
- while (mem_inits
+ while (mem_inits
&& TREE_CODE (TREE_PURPOSE (mem_inits)) != FIELD_DECL)
{
tree subobject = TREE_PURPOSE (mem_inits);
@@ -676,7 +676,7 @@ emit_mem_initializers (tree mem_inits)
/* If these initializations are taking place in a copy
constructor, the base class should probably be explicitly
initialized. */
- if (extra_warnings && !arguments
+ if (extra_warnings && !arguments
&& DECL_COPY_CONSTRUCTOR_P (current_function_decl)
&& TYPE_NEEDS_CONSTRUCTING (BINFO_TYPE (subobject)))
warning (0, "%Jbase class %q#T should be explicitly initialized in the "
@@ -694,11 +694,11 @@ emit_mem_initializers (tree mem_inits)
else
{
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),
+ build_indirect_ref (base_addr, NULL),
arguments,
LOOKUP_NORMAL);
expand_cleanup_for_base (subobject, NULL_TREE);
@@ -710,7 +710,7 @@ emit_mem_initializers (tree mem_inits)
/* Initialize the vptrs. */
initialize_vtbl_ptrs (current_class_ptr);
-
+
/* Initialize the data members. */
while (mem_inits)
{
@@ -777,8 +777,8 @@ expand_virtual_init (tree binfo, tree decl)
/* Compute the value to use, when there's a VTT. */
vtt_parm = current_vtt_parm;
- vtbl2 = build2 (PLUS_EXPR,
- TREE_TYPE (vtt_parm),
+ vtbl2 = build2 (PLUS_EXPR,
+ TREE_TYPE (vtt_parm),
vtt_parm,
vtt_index);
vtbl2 = build_indirect_ref (vtbl2, NULL);
@@ -787,11 +787,11 @@ expand_virtual_init (tree binfo, tree decl)
/* The actual initializer is the VTT value only in the subobject
constructor. In maybe_clone_body we'll substitute NULL for
the vtt_parm in the case of the non-subobject constructor. */
- vtbl = build3 (COND_EXPR,
- TREE_TYPE (vtbl),
+ vtbl = build3 (COND_EXPR,
+ TREE_TYPE (vtbl),
build2 (EQ_EXPR, boolean_type_node,
current_in_charge_parm, integer_zero_node),
- vtbl2,
+ vtbl2,
vtbl);
}
@@ -820,7 +820,7 @@ expand_cleanup_for_base (tree binfo, tree flag)
return;
/* Call the destructor. */
- expr = build_special_member_call (current_class_ref,
+ expr = build_special_member_call (current_class_ref,
base_dtor_identifier,
NULL_TREE,
binfo,
@@ -841,7 +841,7 @@ construct_virtual_base (tree vbase, tree arguments)
{
tree inner_if_stmt;
tree exp;
- tree flag;
+ tree flag;
/* If there are virtual base classes with destructors, we need to
emit cleanups to destroy them if an exception is thrown during
@@ -867,7 +867,7 @@ construct_virtual_base (tree vbase, tree arguments)
we already know where it is. */
exp = convert_to_base_statically (current_class_ref, vbase);
- expand_aggr_init_1 (vbase, current_class_ref, exp, arguments,
+ expand_aggr_init_1 (vbase, current_class_ref, exp, arguments,
LOOKUP_COMPLAIN);
finish_then_clause (inner_if_stmt);
finish_if_stmt (inner_if_stmt);
@@ -893,7 +893,7 @@ initializing_context (tree field)
is erroneous. FIELD is the member we decided to initialize.
TYPE is the type for which the initialization is being performed.
FIELD must be a member of TYPE.
-
+
MEMBER_NAME is the name of the member. */
static int
@@ -1003,8 +1003,8 @@ expand_member_init (tree name)
virtual_binfo = binfo_for_vbase (basetype, current_class_type);
/* [class.base.init]
-
- If a mem-initializer-id is ambiguous because it designates
+
+ If a mem-initializer-id is ambiguous because it designates
both a direct non-virtual base class and an inherited virtual
base class, the mem-initializer is ill-formed. */
if (direct_binfo && virtual_binfo)
@@ -1366,15 +1366,15 @@ build_offset_ref (tree type, tree name, bool address_p)
if (type == NULL_TREE)
return error_mark_node;
-
+
/* Handle namespace names fully here. */
if (TREE_CODE (type) == NAMESPACE_DECL)
{
tree t = lookup_namespace_name (type, name);
if (t == error_mark_node)
- return t;
+ return t;
if (TREE_CODE (orig_name) == TEMPLATE_ID_EXPR)
- /* Reconstruct the TEMPLATE_ID_EXPR. */
+ /* Reconstruct the TEMPLATE_ID_EXPR. */
t = build2 (TEMPLATE_ID_EXPR, TREE_TYPE (t),
t, TREE_OPERAND (orig_name, 1));
if (! type_unknown_p (t))
@@ -1411,7 +1411,7 @@ build_offset_ref (tree type, tree name, bool address_p)
else
{
member = lookup_member (basebinfo, name, 1, 0);
-
+
if (member == error_mark_node)
return error_mark_node;
}
@@ -1462,12 +1462,12 @@ build_offset_ref (tree type, tree name, bool address_p)
expects to encounter OVERLOADs, not raw functions. */
t = ovl_cons (t, NULL_TREE);
- t = build2 (TEMPLATE_ID_EXPR, TREE_TYPE (t), t,
+ t = build2 (TEMPLATE_ID_EXPR, TREE_TYPE (t), t,
TREE_OPERAND (orig_name, 1));
t = build2 (OFFSET_REF, unknown_type_node, decl, t);
-
- PTRMEM_OK_P (t) = 1;
-
+
+ PTRMEM_OK_P (t) = 1;
+
return t;
}
@@ -1539,7 +1539,7 @@ build_offset_ref (tree type, tree name, bool address_p)
PTRMEM_OK_P (member) = 1;
return build_unary_op (ADDR_EXPR, member, 0);
}
- error ("invalid use of non-static member function %qD",
+ error ("invalid use of non-static member function %qD",
TREE_OPERAND (member, 1));
return member;
}
@@ -1573,7 +1573,7 @@ integral_constant_value (tree decl)
&& DECL_INITIAL (decl)
&& DECL_INITIAL (decl) != error_mark_node
&& TREE_TYPE (DECL_INITIAL (decl))
- && INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (decl)))
+ && INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (DECL_INITIAL (decl))))
decl = DECL_INITIAL (decl);
return decl;
}
@@ -1588,16 +1588,16 @@ decl_constant_value (tree decl)
if ((TREE_CODE (decl) == CONST_DECL
|| (TREE_CODE (decl) == VAR_DECL
/* And so are variables with a 'const' type -- unless they
- are also 'volatile'. */
+ are also 'volatile'. */
&& CP_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (decl))))
&& DECL_INITIAL (decl)
&& DECL_INITIAL (decl) != error_mark_node
/* This is invalid if initial value is not constant. If it has
- either a function call, a memory reference, or a variable,
- then re-evaluating it could give different results. */
+ either a function call, a memory reference, or a variable,
+ then re-evaluating it could give different results. */
&& TREE_CONSTANT (DECL_INITIAL (decl)))
return DECL_INITIAL (decl);
-
+
return decl;
}
@@ -1622,7 +1622,7 @@ build_builtin_delete_call (tree addr)
explicitly wrote "::new" rather than just "new". */
tree
-build_new (tree placement, tree type, tree nelts, tree init,
+build_new (tree placement, tree type, tree nelts, tree init,
int use_global_new)
{
tree rval;
@@ -1632,7 +1632,7 @@ build_new (tree placement, tree type, tree nelts, tree init,
if (processing_template_decl)
{
- rval = build_min (NEW_EXPR, build_pointer_type (type),
+ rval = build_min (NEW_EXPR, build_pointer_type (type),
placement, type, nelts, init);
NEW_EXPR_USE_GLOBAL (rval) = use_global_new;
TREE_SIDE_EFFECTS (rval) = 1;
@@ -1735,13 +1735,13 @@ build_new_1 (tree exp)
tree placement, init;
tree size, rval;
/* True iff this is a call to "operator new[]" instead of just
- "operator new". */
+ "operator new". */
bool array_p = false;
/* True iff ARRAY_P is true and the bound of the array type is
not necessarily a compile time constant. For example, VLA_P is
true for "new int[f()]". */
bool vla_p = false;
- /* The type being allocated. If ARRAY_P is true, this will be an
+ /* The type being allocated. If ARRAY_P is true, this will be an
ARRAY_TYPE. */
tree full_type;
/* If ARRAY_P is true, the element type of the array. This is an
@@ -1801,7 +1801,7 @@ build_new_1 (tree exp)
outer_nelts = nelts;
array_p = true;
- /* ??? The middle-end will error on us for building a VLA outside a
+ /* ??? The middle-end will error on us for building a VLA outside a
function context. Methinks that's not it's purvey. So we'll do
our own VLA layout later. */
vla_p = true;
@@ -1827,7 +1827,7 @@ build_new_1 (tree exp)
for (elt_type = type;
TREE_CODE (elt_type) == ARRAY_TYPE;
elt_type = TREE_TYPE (elt_type))
- nelts = cp_build_binary_op (MULT_EXPR, nelts,
+ nelts = cp_build_binary_op (MULT_EXPR, nelts,
array_type_nelts_top (elt_type));
if (!complete_type_or_else (elt_type, exp))
@@ -1876,7 +1876,7 @@ build_new_1 (tree exp)
use_java_new = 1;
alloc_decl = NULL;
- if (!get_global_value_if_present (get_identifier (alloc_name),
+ if (!get_global_value_if_present (get_identifier (alloc_name),
&alloc_decl))
{
error ("call to Java constructor with %qs undefined", alloc_name);
@@ -1900,7 +1900,7 @@ build_new_1 (tree exp)
fnname = ansi_opname (array_p ? VEC_NEW_EXPR : NEW_EXPR);
- if (!globally_qualified_p
+ if (!globally_qualified_p
&& CLASS_TYPE_P (elt_type)
&& (array_p
? TYPE_HAS_ARRAY_NEW_OPERATOR (elt_type)
@@ -1937,7 +1937,7 @@ build_new_1 (tree exp)
else
cookie_size = NULL_TREE;
- alloc_call = build_operator_new_call (fnname, placement,
+ alloc_call = build_operator_new_call (fnname, placement,
&size, &cookie_size);
}
}
@@ -1958,7 +1958,7 @@ build_new_1 (tree exp)
alloc_node = TARGET_EXPR_SLOT (alloc_expr);
/* Strip any COMPOUND_EXPRs from ALLOC_CALL. */
- while (TREE_CODE (alloc_call) == COMPOUND_EXPR)
+ while (TREE_CODE (alloc_call) == COMPOUND_EXPR)
alloc_call = TREE_OPERAND (alloc_call, 1);
alloc_fn = get_callee_fndecl (alloc_call);
gcc_assert (alloc_fn != NULL_TREE);
@@ -1973,8 +1973,8 @@ build_new_1 (tree exp)
there is no explicit placement argument. If there is more than
one argument, or there are variable arguments, then this is a
placement allocation function. */
- placement_allocation_fn_p
- = (type_num_arguments (TREE_TYPE (alloc_fn)) > 1
+ placement_allocation_fn_p
+ = (type_num_arguments (TREE_TYPE (alloc_fn)) > 1
|| varargs_function_p (alloc_fn));
/* Preevaluate the placement args so that we don't reevaluate them for a
@@ -2069,7 +2069,7 @@ build_new_1 (tree exp)
}
else if (TYPE_NEEDS_CONSTRUCTING (type))
{
- init_expr = build_special_member_call (init_expr,
+ init_expr = build_special_member_call (init_expr,
complete_ctor_identifier,
init, elt_type,
LOOKUP_NORMAL);
@@ -2110,9 +2110,9 @@ build_new_1 (tree exp)
/* The Standard is unclear here, but the right thing to do
is to use the same method for finding deallocation
functions that we use for finding allocation functions. */
- cleanup = build_op_delete_call (dcode, alloc_node, size,
+ cleanup = build_op_delete_call (dcode, alloc_node, size,
globally_qualified_p,
- (placement_allocation_fn_p
+ (placement_allocation_fn_p
? alloc_call : NULL_TREE));
if (!cleanup)
@@ -2153,7 +2153,7 @@ build_new_1 (tree exp)
build2 (COMPOUND_EXPR, void_type_node, init_expr,
end));
}
-
+
}
}
else
@@ -2277,10 +2277,10 @@ build_vec_delete_1 (tree base, tree maxindex, tree type,
tree cookie_size;
cookie_size = targetm.cxx.get_cookie_size (type);
- base_tbd
+ base_tbd
= cp_convert (ptype,
cp_build_binary_op (MINUS_EXPR,
- cp_convert (string_type_node,
+ cp_convert (string_type_node,
base),
cookie_size));
/* True size with header. */
@@ -2300,10 +2300,10 @@ build_vec_delete_1 (tree base, tree maxindex, tree type,
body = deallocate_expr;
else
body = build_compound_expr (body, deallocate_expr);
-
+
if (!body)
body = integer_zero_node;
-
+
/* Outermost wrapper: If pointer is null, punt. */
body = fold_build3 (COND_EXPR, void_type_node,
fold_build2 (NE_EXPR, boolean_type_node, base,
@@ -2325,13 +2325,13 @@ build_vec_delete_1 (tree base, tree maxindex, tree type,
return convert_to_void (body, /*implicit=*/NULL);
}
-/* Create an unnamed variable of the indicated TYPE. */
+/* Create an unnamed variable of the indicated TYPE. */
tree
create_temporary_var (tree type)
{
tree decl;
-
+
decl = build_decl (VAR_DECL, NULL_TREE, type);
TREE_USED (decl) = 1;
DECL_ARTIFICIAL (decl) = 1;
@@ -2356,7 +2356,7 @@ get_temp_regvar (tree type, tree init)
decl = create_temporary_var (type);
add_decl_expr (decl);
-
+
finish_expr_stmt (build_modify_expr (decl, INIT_EXPR, init));
return decl;
@@ -2390,7 +2390,7 @@ build_vec_init (tree base, tree maxindex, tree init, int from_array)
tree atype = TREE_TYPE (base);
/* The type of an element in the array. */
tree type = TREE_TYPE (atype);
- /* The element type reached after removing all outer array
+ /* The element type reached after removing all outer array
types. */
tree inner_elt_type;
/* The type of a pointer to an element in the array. */
@@ -2401,7 +2401,7 @@ build_vec_init (tree base, tree maxindex, tree init, int from_array)
tree try_block = NULL_TREE;
int num_initialized_elts = 0;
bool is_global;
-
+
if (TYPE_DOMAIN (atype))
maxindex = array_type_nelts (atype);
@@ -2411,7 +2411,7 @@ build_vec_init (tree base, tree maxindex, tree init, int from_array)
inner_elt_type = strip_array_types (atype);
if (init
&& (from_array == 2
- ? (!CLASS_TYPE_P (inner_elt_type)
+ ? (!CLASS_TYPE_P (inner_elt_type)
|| !TYPE_HAS_COMPLEX_ASSIGN_REF (inner_elt_type))
: !TYPE_NEEDS_CONSTRUCTING (type))
&& ((TREE_CODE (init) == CONSTRUCTOR
@@ -2446,18 +2446,18 @@ build_vec_init (tree base, tree maxindex, tree init, int from_array)
++t1;
}
} catch (...) {
- ... destroy elements that were constructed ...
+ ... destroy elements that were constructed ...
}
rval;
})
-
+
We can omit the try and catch blocks if we know that the
initialization will never throw an exception, or if the array
elements do not have destructors. We can omit the loop completely if
- the elements of the array do not have constructors.
+ the elements of the array do not have constructors.
We actually wrap the entire body of the above in a STMT_EXPR, for
- tidiness.
+ tidiness.
When copying from array to another, when the array elements have
only trivial copy constructors, we should use __builtin_memcpy
@@ -2515,7 +2515,7 @@ build_vec_init (tree base, tree maxindex, tree init, int from_array)
{
/* If initializing one array from another, initialize element by
element. We rely upon the below calls the do argument
- checking. */
+ checking. */
if (init)
{
base2 = decay_conversion (init);
@@ -2585,9 +2585,9 @@ build_vec_init (tree base, tree maxindex, tree init, int from_array)
0, 0, 0);
}
else
- elt_init = build_aggr_init (build1 (INDIRECT_REF, type, base),
+ elt_init = build_aggr_init (build1 (INDIRECT_REF, type, base),
init, 0);
-
+
current_stmt_tree ()->stmts_are_full_exprs_p = 1;
finish_expr_stmt (elt_init);
current_stmt_tree ()->stmts_are_full_exprs_p = 0;
@@ -2613,7 +2613,7 @@ build_vec_init (tree base, tree maxindex, tree init, int from_array)
array_type_nelts_total (type));
finish_cleanup_try_block (try_block);
- e = build_vec_delete_1 (rval, m,
+ e = build_vec_delete_1 (rval, m,
inner_elt_type, sfk_base_destructor,
/*use_global_delete=*/0);
finish_cleanup (e, try_block);
@@ -2629,7 +2629,7 @@ build_vec_init (tree base, tree maxindex, tree init, int from_array)
atype = build_pointer_type (atype);
stmt_expr = build1 (NOP_EXPR, atype, stmt_expr);
stmt_expr = build_indirect_ref (stmt_expr, NULL);
-
+
current_stmt_tree ()->stmts_are_full_exprs_p = destroy_temps;
return stmt_expr;
}
@@ -2655,7 +2655,7 @@ build_x_delete (tree addr, int which_delete, tree virtual_size)
int use_vec_delete = !!(which_delete & 2);
enum tree_code code = use_vec_delete ? VEC_DELETE_EXPR : DELETE_EXPR;
- return build_op_delete_call (code, addr, virtual_size, use_global_delete,
+ return build_op_delete_call (code, addr, virtual_size, use_global_delete,
NULL_TREE);
}
@@ -2685,7 +2685,7 @@ build_dtor_call (tree exp, special_function_kind dtor_kind, int flags)
gcc_unreachable ();
}
fn = lookup_fnfields (TREE_TYPE (exp), name, /*protect=*/2);
- return build_new_method_call (exp, fn,
+ return build_new_method_call (exp, fn,
/*args=*/NULL_TREE,
/*conversion_path=*/NULL_TREE,
flags);
@@ -2756,7 +2756,7 @@ build_delete (tree type, tree addr, special_function_kind auto_delete,
else if (TREE_CODE (type) == ARRAY_TYPE)
{
handle_array:
-
+
if (TYPE_DOMAIN (type) == NULL_TREE)
{
error ("unknown array size in delete");
@@ -2884,11 +2884,11 @@ push_base_cleanups (void)
{
if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (BINFO_TYPE (base_binfo)))
{
- expr = build_special_member_call (current_class_ref,
+ expr = build_special_member_call (current_class_ref,
base_dtor_identifier,
NULL_TREE,
base_binfo,
- (LOOKUP_NORMAL
+ (LOOKUP_NORMAL
| LOOKUP_NONVIRTUAL));
expr = build3 (COND_EXPR, void_type_node, cond,
expr, void_zero_node);
@@ -2905,9 +2905,9 @@ push_base_cleanups (void)
|| BINFO_VIRTUAL_P (base_binfo))
continue;
- expr = build_special_member_call (current_class_ref,
+ expr = build_special_member_call (current_class_ref,
base_dtor_identifier,
- NULL_TREE, base_binfo,
+ NULL_TREE, base_binfo,
LOOKUP_NORMAL | LOOKUP_NONVIRTUAL);
finish_decl_cleanup (NULL_TREE, expr);
}
@@ -2919,8 +2919,8 @@ push_base_cleanups (void)
continue;
if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (member)))
{
- tree this_member = (build_class_member_access_expr
- (current_class_ref, member,
+ tree this_member = (build_class_member_access_expr
+ (current_class_ref, member,
/*access_path=*/NULL_TREE,
/*preserve_reference=*/false));
tree this_type = TREE_TYPE (member);
diff --git a/gcc/cp/lang-specs.h b/gcc/cp/lang-specs.h
index 9adda3d5edd..dfa4ce3302f 100644
--- a/gcc/cp/lang-specs.h
+++ b/gcc/cp/lang-specs.h
@@ -43,7 +43,7 @@ Boston, MA 02111-1307, USA. */
cc1plus %{save-temps|no-integrated-cpp:-fpreprocessed %{save-temps:%b.ii} %{!save-temps:%g.ii}}\
%{!save-temps:%{!no-integrated-cpp:%(cpp_unique_options)}}\
%(cc1_options) %2 %{+e1*}\
- -o %g.s %{!o*:--output-pch=%i.gch} %W{o*:--output-pch=%*}%V}}}",
+ -o %g.s %{!o*:--output-pch=%i.gch} %W{o*:--output-pch=%*}%V}}}",
CPLUSPLUS_CPP_SPEC, 0, 0},
{"@c++",
"%{E|M|MM:cc1plus -E %(cpp_options) %2 %(cpp_debug_options)}\
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
index 21fe2a13581..92334ea809c 100644
--- a/gcc/cp/lex.c
+++ b/gcc/cp/lex.c
@@ -117,7 +117,7 @@ init_operators (void)
: &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"
@@ -145,7 +145,7 @@ init_operators (void)
operator_name_info [(int) TRUTH_AND_EXPR].name = "strict &&";
operator_name_info [(int) TRUTH_OR_EXPR].name = "strict ||";
operator_name_info [(int) RANGE_EXPR].name = "...";
- operator_name_info [(int) CONVERT_EXPR].name = "+";
+ operator_name_info [(int) UNARY_PLUS_EXPR].name = "+";
assignment_operator_name_info [(int) EXACT_DIV_EXPR].name
= "(exact /=)";
@@ -184,7 +184,7 @@ static const struct resword reswords[] =
{ "_Complex", RID_COMPLEX, 0 },
{ "__FUNCTION__", RID_FUNCTION_NAME, 0 },
{ "__PRETTY_FUNCTION__", RID_PRETTY_FUNCTION_NAME, 0 },
- { "__alignof", RID_ALIGNOF, 0 },
+ { "__alignof", RID_ALIGNOF, 0 },
{ "__alignof__", RID_ALIGNOF, 0 },
{ "__asm", RID_ASM, 0 },
{ "__asm__", RID_ASM, 0 },
@@ -277,7 +277,7 @@ static const struct resword reswords[] =
{ "virtual", RID_VIRTUAL, 0 },
{ "void", RID_VOID, 0 },
{ "volatile", RID_VOLATILE, 0 },
- { "wchar_t", RID_WCHAR, 0 },
+ { "wchar_t", RID_WCHAR, 0 },
{ "while", RID_WHILE, 0 },
/* The remaining keywords are specific to Objective-C++. NB:
@@ -553,7 +553,7 @@ handle_pragma_implementation (cpp_reader* dfile ATTRIBUTE_UNUSED )
filename = ggc_strdup (TREE_STRING_POINTER (fname));
#if 0
/* We currently cannot give this diagnostic, as we reach this point
- only after cpplib has scanned the entire translation unit, so
+ only after cpplib has scanned the entire translation unit, so
cpp_included always returns true. A plausible fix is to compare
the current source-location cookie with the first source-location
cookie (if any) of the filename, but this requires completing the
@@ -633,16 +633,16 @@ unqualified_fn_lookup_error (tree name)
declaration of "f" is available. Historically, G++ and most
other compilers accepted that usage since they deferred all name
lookup until instantiation time rather than doing unqualified
- name lookup at template definition time; explain to the user what
+ name lookup at template definition time; explain to the user what
is going wrong.
Note that we have the exact wording of the following message in
the manual (trouble.texi, node "Name lookup"), so they need to
be kept in synch. */
pedwarn ("there are no arguments to %qD that depend on a template "
- "parameter, so a declaration of %qD must be available",
+ "parameter, so a declaration of %qD must be available",
name, name);
-
+
if (!flag_permissive)
{
static bool hint;
@@ -670,7 +670,7 @@ build_lang_decl (enum tree_code code, tree name, tree type)
/* All nesting of C++ functions is lexical; there is never a "static
chain" in the sense of GNU C nested functions. */
- if (code == FUNCTION_DECL)
+ if (code == FUNCTION_DECL)
DECL_NO_STATIC_CHAIN (t) = 1;
return t;
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
index a2fefd0c238..f6448b094de 100644
--- a/gcc/cp/mangle.c
+++ b/gcc/cp/mangle.c
@@ -39,12 +39,12 @@
particular constructs when the appropriate decl for that construct
is not available. These are:
- mangle_typeinfo_for_type: typeinfo data
- mangle_typeinfo_string_for_type: typeinfo type name
- mangle_vtbl_for_type: virtual table data
- mangle_vtt_for_type: VTT data
- mangle_ctor_vtbl_for_type: `C-in-B' constructor virtual table data
- mangle_thunk: thunk function or entry
+ mangle_typeinfo_for_type: typeinfo data
+ mangle_typeinfo_string_for_type: typeinfo type name
+ mangle_vtbl_for_type: virtual table data
+ mangle_vtt_for_type: VTT data
+ mangle_ctor_vtbl_for_type: `C-in-B' constructor virtual table data
+ mangle_thunk: thunk function or entry
*/
@@ -75,7 +75,7 @@
fprintf (stderr, " %-24s: %-24s\n", (FN), (INPUT))
# define MANGLE_TRACE_TREE(FN, NODE) \
fprintf (stderr, " %-24s: %-24s (%p)\n", \
- (FN), tree_code_name[TREE_CODE (NODE)], (void *) (NODE))
+ (FN), tree_code_name[TREE_CODE (NODE)], (void *) (NODE))
#else
# define MANGLE_TRACE(FN, INPUT)
# define MANGLE_TRACE_TREE(FN, NODE)
@@ -234,32 +234,32 @@ static void write_java_integer_type_codes (const tree);
/* Append a single character to the end of the mangled
representation. */
-#define write_char(CHAR) \
+#define write_char(CHAR) \
obstack_1grow (mangle_obstack, (CHAR))
/* Append a sized buffer to the end of the mangled representation. */
-#define write_chars(CHAR, LEN) \
+#define write_chars(CHAR, LEN) \
obstack_grow (mangle_obstack, (CHAR), (LEN))
/* Append a NUL-terminated string to the end of the mangled
representation. */
-#define write_string(STRING) \
+#define write_string(STRING) \
obstack_grow (mangle_obstack, (STRING), strlen (STRING))
/* 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. */
-#define NESTED_TEMPLATE_MATCH(NODE1, NODE2) \
- (TREE_CODE (NODE1) == TREE_LIST \
- && TREE_CODE (NODE2) == TREE_LIST \
- && ((TYPE_P (TREE_PURPOSE (NODE1)) \
- && same_type_p (TREE_PURPOSE (NODE1), TREE_PURPOSE (NODE2)))\
- || TREE_PURPOSE (NODE1) == TREE_PURPOSE (NODE2)) \
+#define NESTED_TEMPLATE_MATCH(NODE1, NODE2) \
+ (TREE_CODE (NODE1) == TREE_LIST \
+ && TREE_CODE (NODE2) == TREE_LIST \
+ && ((TYPE_P (TREE_PURPOSE (NODE1)) \
+ && same_type_p (TREE_PURPOSE (NODE1), TREE_PURPOSE (NODE2))) \
+ || TREE_PURPOSE (NODE1) == TREE_PURPOSE (NODE2)) \
&& TREE_VALUE (NODE1) == TREE_VALUE (NODE2))
/* Write out an unsigned quantity in base 10. */
-#define write_unsigned_number(NUMBER) \
+#define write_unsigned_number(NUMBER) \
write_number ((NUMBER), /*unsigned_p=*/1, 10)
/* Save the current (incomplete) mangled name and release the obstack
@@ -319,7 +319,7 @@ decl_is_template_id (const tree decl, tree* const template_info)
*template_info = TYPE_TEMPLATE_INFO (type);
return 1;
}
- }
+ }
else
{
/* Check if this is a primary template. */
@@ -362,12 +362,12 @@ dump_substitution_candidates (void)
else if (TYPE_NAME (el))
name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (el)));
fprintf (stderr, " S%d_ = ", i - 1);
- if (TYPE_P (el) &&
- (CP_TYPE_RESTRICT_P (el)
- || CP_TYPE_VOLATILE_P (el)
+ if (TYPE_P (el) &&
+ (CP_TYPE_RESTRICT_P (el)
+ || CP_TYPE_VOLATILE_P (el)
|| CP_TYPE_CONST_P (el)))
fprintf (stderr, "CV-");
- fprintf (stderr, "%s (%s at %p)\n",
+ fprintf (stderr, "%s (%s at %p)\n",
name, tree_code_name[TREE_CODE (el)], (void *) el);
}
}
@@ -400,7 +400,7 @@ add_substitution (tree node)
tree c;
if (DEBUG_MANGLE)
- fprintf (stderr, " ++ add_substitution (%s at %10p)\n",
+ fprintf (stderr, " ++ add_substitution (%s at %10p)\n",
tree_code_name[TREE_CODE (node)], (void *) node);
/* Get the canonicalized substitution candidate for NODE. */
@@ -419,7 +419,7 @@ add_substitution (tree node)
for (i = 0; VEC_iterate (tree, G.substitutions, i, candidate); i++)
{
gcc_assert (!(DECL_P (node) && node == candidate));
- gcc_assert (!(TYPE_P (node) && TYPE_P (candidate)
+ gcc_assert (!(TYPE_P (node) && TYPE_P (candidate)
&& same_type_p (node, candidate)));
}
}
@@ -436,7 +436,7 @@ add_substitution (tree 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. */
-static inline int
+static inline int
is_std_substitution (const tree node,
const substitution_identifier_index_t index)
{
@@ -453,14 +453,14 @@ is_std_substitution (const tree node,
type = node;
decl = TYPE_NAME (node);
}
- else
+ else
/* These are not the droids you're looking for. */
return 0;
return (DECL_NAMESPACE_STD_P (CP_DECL_CONTEXT (decl))
- && TYPE_LANG_SPECIFIC (type)
+ && TYPE_LANG_SPECIFIC (type)
&& TYPE_TEMPLATE_INFO (type)
- && (DECL_NAME (TYPE_TI_TEMPLATE (type))
+ && (DECL_NAME (TYPE_TI_TEMPLATE (type))
== subst_identifiers[index]));
}
@@ -479,14 +479,14 @@ is_std_substitution_char (const tree node,
return 0;
/* Figure out its template args. */
if (DECL_P (node))
- args = DECL_TI_ARGS (node);
+ args = DECL_TI_ARGS (node);
else if (CLASS_TYPE_P (node))
args = CLASSTYPE_TI_ARGS (node);
else
/* Oops, not a template. */
return 0;
/* NODE's template arg list should be <char>. */
- return
+ return
TREE_VEC_LENGTH (args) == 1
&& TREE_VEC_ELT (args, 0) == char_type_node;
}
@@ -496,28 +496,28 @@ is_std_substitution_char (const tree node,
First, check standard special-case substitutions.
- <substitution> ::= St
- # ::std
+ <substitution> ::= St
+ # ::std
- ::= Sa
+ ::= Sa
# ::std::allocator
- ::= Sb
- # ::std::basic_string
+ ::= Sb
+ # ::std::basic_string
- ::= Ss
- # ::std::basic_string<char,
+ ::= Ss
+ # ::std::basic_string<char,
::std::char_traits<char>,
::std::allocator<char> >
- ::= Si
- # ::std::basic_istream<char, ::std::char_traits<char> >
+ ::= Si
+ # ::std::basic_istream<char, ::std::char_traits<char> >
- ::= So
- # ::std::basic_ostream<char, ::std::char_traits<char> >
+ ::= So
+ # ::std::basic_ostream<char, ::std::char_traits<char> >
- ::= Sd
- # ::std::basic_iostream<char, ::std::char_traits<char> >
+ ::= Sd
+ # ::std::basic_iostream<char, ::std::char_traits<char> >
Then examine the stack of currently available substitution
candidates for entities appearing earlier in the same mangling
@@ -547,7 +547,7 @@ find_substitution (tree node)
type = TYPE_P (node) ? node : TREE_TYPE (node);
/* Check for std::allocator. */
- if (decl
+ if (decl
&& is_std_substitution (decl, SUBID_ALLOCATOR)
&& !CLASSTYPE_USE_TEMPLATE (TREE_TYPE (decl)))
{
@@ -560,10 +560,10 @@ find_substitution (tree node)
{
if (TYPE_P (node))
{
- /* If this is a type (i.e. a fully-qualified template-id),
- check for
- std::basic_string <char,
- std::char_traits<char>,
+ /* If this is a type (i.e. a fully-qualified template-id),
+ check for
+ std::basic_string <char,
+ std::char_traits<char>,
std::allocator<char> > . */
if (cp_type_quals (type) == TYPE_UNQUALIFIED
&& CLASSTYPE_USE_TEMPLATE (type))
@@ -596,7 +596,7 @@ find_substitution (tree node)
&& CLASSTYPE_USE_TEMPLATE (type)
&& CLASSTYPE_TEMPLATE_INFO (type) != NULL)
{
- /* First, check for the template
+ /* First, check for the template
args <char, std::char_traits<char> > . */
tree args = CLASSTYPE_TI_ARGS (type);
if (TREE_VEC_LENGTH (args) == 2
@@ -659,7 +659,7 @@ find_substitution (tree node)
/* TOP_LEVEL is true, if this is being called at outermost level of
mangling. It should be false when mangling a decl appearing in an
expression within some other mangling.
-
+
<mangled-name> ::= _Z <encoding> */
static void
@@ -673,16 +673,16 @@ write_mangled_name (const tree decl, bool top_level)
&& !DECL_OVERLOADED_OPERATOR_P (decl))
{
unmangled_name:;
-
+
if (top_level)
write_string (IDENTIFIER_POINTER (DECL_NAME (decl)));
else
{
/* The standard notes: "The <encoding> of an extern "C"
- function is treated like global-scope data, i.e. as its
- <source-name> without a type." We cannot write
- overloaded operators that way though, because it contains
- characters invalid in assembler. */
+ function is treated like global-scope data, i.e. as its
+ <source-name> without a type." We cannot write
+ overloaded operators that way though, because it contains
+ characters invalid in assembler. */
if (abi_version_at_least (2))
write_string ("_Z");
else
@@ -761,7 +761,7 @@ write_encoding (const tree decl)
d = decl;
}
- write_bare_function_type (fn_type,
+ write_bare_function_type (fn_type,
(!DECL_CONSTRUCTOR_P (decl)
&& !DECL_DESTRUCTOR_P (decl)
&& !DECL_CONV_FN_P (decl)
@@ -771,9 +771,9 @@ write_encoding (const tree decl)
}
/* <name> ::= <unscoped-name>
- ::= <unscoped-template-name> <template-args>
+ ::= <unscoped-template-name> <template-args>
::= <nested-name>
- ::= <local-name>
+ ::= <local-name>
If IGNORE_LOCAL_SCOPE is nonzero, this production of <name> is
called from <local-name>, which mangles the enclosing scope
@@ -803,8 +803,8 @@ write_name (tree decl, const int ignore_local_scope)
latter with a special substitution. Also, a name that is
directly in a local function scope is also mangled with
<unscoped-name> rather than a full <nested-name>. */
- if (context == NULL
- || context == global_namespace
+ if (context == NULL
+ || context == global_namespace
|| DECL_NAMESPACE_STD_P (context)
|| (ignore_local_scope && TREE_CODE (context) == FUNCTION_DECL))
{
@@ -823,10 +823,10 @@ write_name (tree decl, const int ignore_local_scope)
else
{
/* Handle local names, unless we asked not to (that is, invoked
- under <local-name>, to handle only the part of the name under
- the local scope). */
+ under <local-name>, to handle only the part of the name under
+ the local scope). */
if (!ignore_local_scope)
- {
+ {
/* Scan up the list of scope context, looking for a
function. If we find one, this entity is in local
function scope. local_entity tracks context one scope
@@ -861,7 +861,7 @@ write_name (tree decl, const int ignore_local_scope)
}
/* <unscoped-name> ::= <unqualified-name>
- ::= St <unqualified-name> # ::std:: */
+ ::= St <unqualified-name> # ::std:: */
static void
write_unscoped_name (const tree decl)
@@ -879,17 +879,17 @@ write_unscoped_name (const tree decl)
else
{
/* If not, it should be either in the global namespace, or directly
- in a local function scope. */
- gcc_assert (context == global_namespace
+ in a local function scope. */
+ gcc_assert (context == global_namespace
|| context == NULL
|| TREE_CODE (context) == FUNCTION_DECL);
-
+
write_unqualified_name (decl);
}
}
/* <unscoped-template-name> ::= <unscoped-name>
- ::= <substitution> */
+ ::= <substitution> */
static void
write_unscoped_template_name (const tree decl)
@@ -904,8 +904,8 @@ write_unscoped_template_name (const tree decl)
/* Write the nested name, including CV-qualifiers, of DECL.
- <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
- ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
+ <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
+ ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
<CV-qualifiers> ::= [r] [V] [K] */
@@ -917,9 +917,9 @@ write_nested_name (const tree decl)
MANGLE_TRACE_TREE ("nested-name", decl);
write_char ('N');
-
+
/* Write CV-qualifiers, if this is a member function. */
- if (TREE_CODE (decl) == FUNCTION_DECL
+ if (TREE_CODE (decl) == FUNCTION_DECL
&& DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
{
if (DECL_VOLATILE_MEMFUNC_P (decl))
@@ -945,8 +945,8 @@ write_nested_name (const tree decl)
}
/* <prefix> ::= <prefix> <unqualified-name>
- ::= <template-param>
- ::= <template-prefix> <template-args>
+ ::= <template-param>
+ ::= <template-prefix> <template-args>
::= # empty
::= <substitution> */
@@ -988,7 +988,7 @@ write_prefix (const tree node)
}
/* In G++ 3.2, the name of the template parameter was used. */
- if (TREE_CODE (node) == TEMPLATE_TYPE_PARM
+ if (TREE_CODE (node) == TEMPLATE_TYPE_PARM
&& !abi_version_at_least (2))
G.need_abi_warning = true;
@@ -1012,8 +1012,8 @@ write_prefix (const tree node)
}
/* <template-prefix> ::= <prefix> <template component>
- ::= <template-param>
- ::= <substitution> */
+ ::= <template-param>
+ ::= <substitution> */
static void
write_template_prefix (const tree node)
@@ -1033,7 +1033,7 @@ write_template_prefix (const tree node)
else
{
gcc_assert (CLASSTYPE_TEMPLATE_ID_P (type));
-
+
template = TYPE_TI_TEMPLATE (type);
}
@@ -1085,10 +1085,10 @@ write_template_prefix (const tree node)
}
/* We don't need to handle thunks, vtables, or VTTs here. Those are
- mangled through special entry points.
+ mangled through special entry points.
<unqualified-name> ::= <operator-name>
- ::= <special-name>
+ ::= <special-name>
::= <source-name> */
static void
@@ -1102,10 +1102,10 @@ write_unqualified_name (const tree decl)
write_special_name_destructor (decl);
else if (DECL_NAME (decl) == NULL_TREE)
write_source_name (DECL_ASSEMBLER_NAME (decl));
- else if (DECL_CONV_FN_P (decl))
+ else if (DECL_CONV_FN_P (decl))
{
- /* Conversion operator. Handle it right here.
- <operator> ::= cv <type> */
+ /* Conversion operator. Handle it right here.
+ <operator> ::= cv <type> */
tree type;
if (decl_is_template_id (decl, NULL))
{
@@ -1126,7 +1126,7 @@ write_unqualified_name (const tree decl)
oni = assignment_operator_name_info;
else
oni = operator_name_info;
-
+
write_string (oni[DECL_OVERLOADED_OPERATOR_P (decl)].mangled_name);
}
else
@@ -1142,7 +1142,7 @@ write_conversion_operator_name (const tree type)
write_type (type);
}
-/* Non-terminal <source-name>. IDENTIFIER is an IDENTIFIER_NODE.
+/* Non-terminal <source-name>. IDENTIFIER is an IDENTIFIER_NODE.
<source-name> ::= </length/ number> <identifier> */
@@ -1172,11 +1172,11 @@ hwint_to_ascii (unsigned HOST_WIDE_INT number, const unsigned int base,
{
static const char base_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
unsigned digits = 0;
-
+
while (number)
{
unsigned HOST_WIDE_INT d = number / base;
-
+
*--buffer = base_digits[number - d * base];
digits++;
number = d;
@@ -1234,14 +1234,14 @@ write_integer_cst (const tree cst)
representable. */
chunk = 1000000000;
chunk_digits = 9;
-
+
if (sizeof (HOST_WIDE_INT) >= 8)
{
/* It is at least 64 bits, so 10^18 is representable. */
chunk_digits = 18;
chunk *= chunk;
}
-
+
type = c_common_signed_or_unsigned_type (1, TREE_TYPE (cst));
base = build_int_cstu (type, chunk);
n = build_int_cst_wide (type,
@@ -1269,11 +1269,11 @@ write_integer_cst (const tree cst)
while (!done);
write_chars (ptr, count);
}
- else
+ else
{
/* A small num. */
unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (cst);
-
+
if (sign < 0)
{
write_char ('n');
@@ -1283,8 +1283,8 @@ write_integer_cst (const tree cst)
}
}
-/* Write out a floating-point literal.
-
+/* Write out a floating-point literal.
+
"Floating-point literals are encoded using the bit pattern of the
target processor's internal representation of that number, as a
fixed-length lowercase hexadecimal string, high-order bytes first
@@ -1296,11 +1296,11 @@ write_integer_cst (const tree cst)
for floating point numbers. (Spaces are for readability, not
part of the encoding.)
- 1.0f Lf 3f80 0000 E
- -1.0f Lf bf80 0000 E
- 1.17549435e-38f Lf 0080 0000 E
- 1.40129846e-45f Lf 0000 0001 E
- 0.0f Lf 0000 0000 E"
+ 1.0f Lf 3f80 0000 E
+ -1.0f Lf bf80 0000 E
+ 1.17549435e-38f Lf 0080 0000 E
+ 1.40129846e-45f Lf 0000 0001 E
+ 0.0f Lf 0000 0000 E"
Caller is responsible for the Lx and the E. */
static void
@@ -1319,7 +1319,7 @@ write_real_cst (const tree value)
TYPE_MODE (type));
/* The value in target_real is in the target word order,
- so we must write it out backward if that happens to be
+ so we must write it out backward if that happens to be
little-endian. write_number cannot be used, it will
produce uppercase. */
if (FLOAT_WORDS_BIG_ENDIAN)
@@ -1341,7 +1341,7 @@ write_real_cst (const tree value)
format for REAL_VALUE_TYPE. */
size_t i;
for (i = 0; i < sizeof (TREE_REAL_CST (value)); ++i)
- write_number (((unsigned char *) &TREE_REAL_CST (value))[i],
+ write_number (((unsigned char *) &TREE_REAL_CST (value))[i],
/*unsigned_p*/ 1,
/*base*/ 16);
G.need_abi_warning = 1;
@@ -1360,13 +1360,13 @@ write_identifier (const char *identifier)
}
/* Handle constructor productions of non-terminal <special-name>.
- CTOR is a constructor FUNCTION_DECL.
+ CTOR is a constructor FUNCTION_DECL.
<special-name> ::= C1 # complete object constructor
- ::= C2 # base object constructor
- ::= C3 # complete object allocating constructor
+ ::= C2 # base object constructor
+ ::= C3 # complete object allocating constructor
- Currently, allocating constructors are never used.
+ Currently, allocating constructors are never used.
We also need to provide mangled names for the maybe-in-charge
constructor, so we treat it here too. mangle_decl_string will
@@ -1390,11 +1390,11 @@ write_special_name_constructor (const tree ctor)
}
/* Handle destructor productions of non-terminal <special-name>.
- DTOR is a destructor FUNCTION_DECL.
+ DTOR is a destructor FUNCTION_DECL.
<special-name> ::= D0 # deleting (in-charge) destructor
- ::= D1 # complete object (in-charge) destructor
- ::= D2 # base object (not-in-charge) destructor
+ ::= D1 # complete object (in-charge) destructor
+ ::= D2 # base object (not-in-charge) destructor
We also need to provide mangled names for the maybe-incharge
destructor, so we treat it here too. mangle_decl_string will
@@ -1411,9 +1411,9 @@ write_special_name_destructor (const tree dtor)
{
gcc_assert (DECL_COMPLETE_DESTRUCTOR_P (dtor)
/* Even though we don't ever emit a definition of
- the old-style destructor, we still have to
- consider entities (like static variables) nested
- inside it. */
+ the old-style destructor, we still have to
+ consider entities (like static variables) nested
+ inside it. */
|| DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (dtor));
write_string ("D1");
}
@@ -1426,8 +1426,6 @@ write_special_name_destructor (const tree dtor)
static int
discriminator_for_local_entity (tree entity)
{
- tree *type;
-
/* Assume this is the only local entity with this name. */
int discriminator = 0;
@@ -1435,13 +1433,20 @@ discriminator_for_local_entity (tree entity)
discriminator = DECL_DISCRIMINATOR (entity);
else if (TREE_CODE (entity) == TYPE_DECL)
{
+ int ix;
+
/* Scan the list of local classes. */
entity = TREE_TYPE (entity);
- for (type = VEC_address (tree, local_classes); *type != entity; ++type)
- if (TYPE_IDENTIFIER (*type) == TYPE_IDENTIFIER (entity)
- && TYPE_CONTEXT (*type) == TYPE_CONTEXT (entity))
- ++discriminator;
- }
+ for (ix = 0; ; ix++)
+ {
+ tree type = VEC_index (tree, local_classes, ix);
+ if (type == entity)
+ break;
+ if (TYPE_IDENTIFIER (type) == TYPE_IDENTIFIER (entity)
+ && TYPE_CONTEXT (type) == TYPE_CONTEXT (entity))
+ ++discriminator;
+ }
+ }
return discriminator;
}
@@ -1458,7 +1463,7 @@ discriminator_for_string_literal (tree function ATTRIBUTE_UNUSED,
return 0;
}
-/* <discriminator> := _ <number>
+/* <discriminator> := _ <number>
The discriminator is used only for the second and later occurrences
of the same name within a single function. In this case <number> is
@@ -1482,7 +1487,7 @@ write_discriminator (const int discriminator)
of ENTITY.
<local-name> := Z <function encoding> E <entity name> [<discriminator>]
- := Z <function encoding> E s [<discriminator>] */
+ := Z <function encoding> E s [<discriminator>] */
static void
write_local_name (const tree function, const tree local_entity,
@@ -1496,7 +1501,7 @@ write_local_name (const tree function, const tree local_entity,
if (TREE_CODE (entity) == STRING_CST)
{
write_char ('s');
- write_discriminator (discriminator_for_string_literal (function,
+ write_discriminator (discriminator_for_string_literal (function,
entity));
}
else
@@ -1509,25 +1514,25 @@ write_local_name (const tree function, const tree local_entity,
}
}
-/* Non-terminals <type> and <CV-qualifier>.
+/* Non-terminals <type> and <CV-qualifier>.
<type> ::= <builtin-type>
- ::= <function-type>
- ::= <class-enum-type>
- ::= <array-type>
- ::= <pointer-to-member-type>
- ::= <template-param>
- ::= <substitution>
- ::= <CV-qualifier>
- ::= P <type> # pointer-to
- ::= R <type> # reference-to
- ::= C <type> # complex pair (C 2000)
- ::= G <type> # imaginary (C 2000) [not supported]
- ::= U <source-name> <type> # vendor extended type qualifier
+ ::= <function-type>
+ ::= <class-enum-type>
+ ::= <array-type>
+ ::= <pointer-to-member-type>
+ ::= <template-param>
+ ::= <substitution>
+ ::= <CV-qualifier>
+ ::= P <type> # pointer-to
+ ::= R <type> # reference-to
+ ::= C <type> # complex pair (C 2000)
+ ::= G <type> # imaginary (C 2000) [not supported]
+ ::= U <source-name> <type> # vendor extended type qualifier
TYPE is a type node. */
-static void
+static void
write_type (tree type)
{
/* This gets set to nonzero if TYPE turns out to be a (possibly
@@ -1541,7 +1546,7 @@ write_type (tree type)
if (find_substitution (type))
return;
-
+
if (write_CV_qualifiers_for_type (type) > 0)
/* If TYPE was CV-qualified, we just wrote the qualifiers; now
mangle the unqualified type. The recursive call is needed here
@@ -1634,7 +1639,7 @@ write_type (tree type)
case BOUND_TEMPLATE_TEMPLATE_PARM:
write_template_template_param (type);
- write_template_args
+ write_template_args
(TI_ARGS (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (type)));
break;
@@ -1667,7 +1672,7 @@ write_CV_qualifiers_for_type (const tree type)
"In cases where multiple order-insensitive qualifiers are
present, they should be ordered 'K' (closest to the base type),
- 'V', 'r', and 'U' (farthest from the base type) ..."
+ 'V', 'r', and 'U' (farthest from the base type) ..."
Note that we do not use cp_type_quals below; given "const
int[3]", the "const" is emitted with the "int", not with the
@@ -1692,31 +1697,31 @@ write_CV_qualifiers_for_type (const tree type)
return num_qualifiers;
}
-/* Non-terminal <builtin-type>.
-
- <builtin-type> ::= v # void
- ::= b # bool
- ::= w # wchar_t
- ::= c # char
- ::= a # signed char
- ::= h # unsigned char
- ::= s # short
- ::= t # unsigned short
- ::= i # int
- ::= j # unsigned int
- ::= l # long
- ::= m # unsigned long
- ::= x # long long, __int64
- ::= y # unsigned long long, __int64
- ::= n # __int128
- ::= o # unsigned __int128
- ::= f # float
- ::= d # double
- ::= e # long double, __float80
- ::= g # __float128 [not supported]
- ::= u <source-name> # vendor extended type */
-
-static void
+/* Non-terminal <builtin-type>.
+
+ <builtin-type> ::= v # void
+ ::= b # bool
+ ::= w # wchar_t
+ ::= c # char
+ ::= a # signed char
+ ::= h # unsigned char
+ ::= s # short
+ ::= t # unsigned short
+ ::= i # int
+ ::= j # unsigned int
+ ::= l # long
+ ::= m # unsigned long
+ ::= x # long long, __int64
+ ::= y # unsigned long long, __int64
+ ::= n # __int128
+ ::= o # unsigned __int128
+ ::= f # float
+ ::= d # double
+ ::= e # long double, __float80
+ ::= g # __float128 [not supported]
+ ::= u <source-name> # vendor extended type */
+
+static void
write_builtin_type (tree type)
{
switch (TREE_CODE (type))
@@ -1838,13 +1843,13 @@ write_function_type (const tree type)
extern "C" typedef void function_t();
function_t f; // f has C++ linkage, but its type is
- // `extern "C"'
+ // `extern "C"'
typedef void function_t();
extern "C" function_t f; // Vice versa.
See [dcl.link]. */
- write_bare_function_type (type, /*include_return_type_p=*/1,
+ write_bare_function_type (type, /*include_return_type_p=*/1,
/*decl=*/NULL);
write_char ('E');
}
@@ -1867,7 +1872,7 @@ write_bare_function_type (const tree type, const int include_return_type_p,
write_type (TREE_TYPE (type));
/* Now mangle the types of the arguments. */
- write_method_parms (TYPE_ARG_TYPES (type),
+ write_method_parms (TYPE_ARG_TYPES (type),
TREE_CODE (type) == METHOD_TYPE,
decl);
}
@@ -1889,10 +1894,10 @@ write_method_parms (tree parm_types, const int method_p, const tree decl)
int varargs_p = 1;
/* If this is a member function, skip the first arg, which is the
- this pointer.
+ this pointer.
"Member functions do not encode the type of their implicit this
- parameter."
-
+ parameter."
+
Similarly, there's no need to mangle artificial parameters, like
the VTT parameters for constructors and destructors. */
if (method_p)
@@ -1907,8 +1912,8 @@ write_method_parms (tree parm_types, const int method_p, const tree decl)
}
}
- for (first_parm_type = parm_types;
- parm_types;
+ for (first_parm_type = parm_types;
+ parm_types;
parm_types = TREE_CHAIN (parm_types))
{
tree parm = TREE_VALUE (parm_types);
@@ -1936,7 +1941,7 @@ write_method_parms (tree parm_types, const int method_p, const tree decl)
/* <class-enum-type> ::= <name> */
-static void
+static void
write_class_enum_type (const tree type)
{
write_name (TYPE_NAME (type), /*ignore_local_scope=*/0);
@@ -1952,7 +1957,7 @@ write_template_args (tree args)
{
int i;
int length = TREE_VEC_LENGTH (args);
-
+
MANGLE_TRACE_TREE ("template-args", args);
write_char ('I');
@@ -1968,7 +1973,7 @@ write_template_args (tree args)
}
for (i = 0; i < length; ++i)
write_template_arg (TREE_VEC_ELT (args, i));
-
+
write_char ('E');
}
@@ -1977,10 +1982,10 @@ write_template_args (tree args)
::= <expr-primary>
<expr-primary> ::= <template-param>
- ::= L <type> <value number> E # literal
- ::= L <mangled-name> E # external name
- ::= sr <type> <unqualified-name>
- ::= sr <type> <unqualified-name> <template-args> */
+ ::= L <type> <value number> E # literal
+ ::= L <mangled-name> E # external name
+ ::= sr <type> <unqualified-name>
+ ::= sr <type> <unqualified-name> <template-args> */
static void
write_expression (tree expr)
@@ -2011,7 +2016,7 @@ write_expression (tree expr)
}
/* Handle template parameters. */
- if (code == TEMPLATE_TYPE_PARM
+ if (code == TEMPLATE_TYPE_PARM
|| code == TEMPLATE_TEMPLATE_PARM
|| code == BOUND_TEMPLATE_TEMPLATE_PARM
|| code == TEMPLATE_PARM_INDEX)
@@ -2030,7 +2035,7 @@ write_expression (tree expr)
write_mangled_name (expr, false);
write_char ('E');
}
- else if (TREE_CODE (expr) == SIZEOF_EXPR
+ else if (TREE_CODE (expr) == SIZEOF_EXPR
&& TYPE_P (TREE_OPERAND (expr, 0)))
{
write_string ("st");
@@ -2090,7 +2095,7 @@ write_expression (tree expr)
else if (assignment_operator_name_info[i].identifier
== member)
{
- mangled_name
+ mangled_name
= assignment_operator_name_info[i].mangled_name;
break;
}
@@ -2130,9 +2135,9 @@ write_expression (tree expr)
switch (code)
{
- case CALL_EXPR:
- sorry ("call_expr cannot be mangled due to a defect in the C++ ABI");
- break;
+ case CALL_EXPR:
+ sorry ("call_expr cannot be mangled due to a defect in the C++ ABI");
+ break;
case CAST_EXPR:
write_type (TREE_TYPE (expr));
@@ -2151,7 +2156,7 @@ write_expression (tree expr)
write_expression (TREE_OPERAND (expr, 0));
break;
-
+
/* Handle pointers-to-members specially. */
case SCOPE_REF:
write_type (TREE_OPERAND (expr, 0));
@@ -2199,7 +2204,7 @@ write_expression (tree expr)
}
}
-/* Literal subcase of non-terminal <template-arg>.
+/* Literal subcase of non-terminal <template-arg>.
"Literal arguments, e.g. "A<42L>", are encoded with their type
and value. Negative integer values are preceded with "n"; for
@@ -2217,7 +2222,7 @@ write_template_arg_literal (const tree value)
case CONST_DECL:
write_integer_cst (DECL_INITIAL (value));
break;
-
+
case INTEGER_CST:
gcc_assert (!same_type_p (TREE_TYPE (value), boolean_type_node)
|| integer_zerop (value) || integer_onep (value));
@@ -2231,16 +2236,16 @@ write_template_arg_literal (const tree value)
default:
gcc_unreachable ();
}
-
+
write_char ('E');
}
-/* Non-terminal <template-arg>.
+/* Non-terminal <template-arg>.
- <template-arg> ::= <type> # type
- ::= L <type> </value/ number> E # literal
- ::= LZ <name> E # external name
- ::= X <expression> E # expression */
+ <template-arg> ::= <type> # type
+ ::= L <type> </value/ number> E # literal
+ ::= LZ <name> E # external name
+ ::= X <expression> E # expression */
static void
write_template_arg (tree node)
@@ -2261,7 +2266,7 @@ write_template_arg (tree node)
code = TREE_CODE (node);
}
}
-
+
if (TREE_CODE (node) == NOP_EXPR
&& TREE_CODE (TREE_TYPE (node)) == REFERENCE_TYPE)
{
@@ -2286,7 +2291,7 @@ write_template_arg (tree node)
else if (DECL_P (node))
{
/* Until ABI version 2, non-type template arguments of
- enumeration type were mangled using their names. */
+ enumeration type were mangled using their names. */
if (code == CONST_DECL && !abi_version_at_least (2))
G.need_abi_warning = 1;
write_char ('L');
@@ -2327,10 +2332,10 @@ write_template_template_arg (const tree decl)
}
-/* Non-terminal <array-type>. TYPE is an ARRAY_TYPE.
+/* Non-terminal <array-type>. TYPE is an ARRAY_TYPE.
- <array-type> ::= A [</dimension/ number>] _ </element/ type>
- ::= A <expression> _ </element/ type>
+ <array-type> ::= A [</dimension/ number>] _ </element/ type>
+ ::= A <expression> _ </element/ type>
"Array types encode the dimension (number of elements) and the
element type. For variable length arrays, the dimension (but not
@@ -2362,7 +2367,7 @@ write_array_type (const tree type)
if (!abi_version_at_least (2))
{
/* value_dependent_expression_p presumes nothing is
- dependent when PROCESSING_TEMPLATE_DECL is zero. */
+ dependent when PROCESSING_TEMPLATE_DECL is zero. */
++processing_template_decl;
if (!value_dependent_expression_p (max))
G.need_abi_warning = 1;
@@ -2370,7 +2375,7 @@ write_array_type (const tree type)
}
write_expression (max);
}
-
+
}
write_char ('_');
write_type (TREE_TYPE (type));
@@ -2432,7 +2437,7 @@ write_template_param (const tree parm)
}
/* <template-template-param>
- ::= <template-param>
+ ::= <template-param>
::= <substitution> */
static void
@@ -2445,7 +2450,7 @@ write_template_template_param (const tree parm)
only the template. */
if (TREE_CODE (parm) == BOUND_TEMPLATE_TEMPLATE_PARM)
{
- template
+ template
= TI_TEMPLATE (TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (parm));
if (find_substitution (template))
return;
@@ -2458,10 +2463,10 @@ write_template_template_param (const tree parm)
add_substitution (template);
}
-/* Non-terminal <substitution>.
+/* Non-terminal <substitution>.
<substitution> ::= S <seq-id> _
- ::= S_ */
+ ::= S_ */
static void
write_substitution (const int seq_id)
@@ -2481,7 +2486,7 @@ start_mangling (const tree entity, const bool ident_p)
{
G.entity = entity;
G.need_abi_warning = false;
- if (!ident_p)
+ if (!ident_p)
{
obstack_free (&name_obstack, name_base);
mangle_obstack = &name_obstack;
@@ -2544,7 +2549,7 @@ mangle_decl_string (const tree decl)
write_type (TREE_TYPE (decl));
else
write_mangled_name (decl, true);
-
+
result = finish_mangling (/*warn=*/true);
if (DEBUG_MANGLE)
fprintf (stderr, "mangle_decl_string = '%s'\n\n", result);
@@ -2557,7 +2562,7 @@ mangle_decl_string (const tree decl)
static inline tree
get_identifier_nocopy (const char *name)
{
- hashnode ht_node = ht_lookup (ident_hash, (const unsigned char *) name,
+ hashnode ht_node = ht_lookup (ident_hash, (const unsigned char *) name,
strlen (name), HT_ALLOCED);
return HT_IDENT_TO_GCC_IDENT (ht_node);
}
@@ -2567,7 +2572,7 @@ get_identifier_nocopy (const char *name)
void
mangle_decl (const tree decl)
{
- SET_DECL_ASSEMBLER_NAME (decl,
+ SET_DECL_ASSEMBLER_NAME (decl,
get_identifier_nocopy (mangle_decl_string (decl)));
}
@@ -2649,13 +2654,13 @@ mangle_vtt_for_type (const tree type)
/* Return an identifier for a construction vtable group. TYPE is
the most derived class in the hierarchy; BINFO is the base
- subobject for which this construction vtable group will be used.
+ subobject for which this construction vtable group will be used.
This mangling isn't part of the ABI specification; in the ABI
specification, the vtable group is dumped in the same COMDAT as the
main vtable, and is referenced only from that vtable, so it doesn't
need an external name. For binary formats without COMDAT sections,
- though, we need external names for the vtable groups.
+ though, we need external names for the vtable groups.
We use the production
@@ -2682,10 +2687,10 @@ mangle_ctor_vtbl_for_type (const tree type, const tree binfo)
}
/* Mangle a this pointer or result pointer adjustment.
-
+
<call-offset> ::= h <fixed offset number> _
::= v <fixed offset number> _ <virtual offset number> _ */
-
+
static void
mangle_call_offset (const tree fixed_offset, const tree virtual_offset)
{
@@ -2713,8 +2718,8 @@ mangle_call_offset (const tree fixed_offset, const tree virtual_offset)
for the this pointer, even if there is none.
<special-name> ::= T <call-offset> <base encoding>
- ::= Tc <this_adjust call-offset> <result_adjust call-offset>
- <base encoding>
+ ::= Tc <this_adjust call-offset> <result_adjust call-offset>
+ <base encoding>
*/
tree
@@ -2722,12 +2727,12 @@ mangle_thunk (tree fn_decl, const int this_adjusting, tree fixed_offset,
tree virtual_offset)
{
const char *result;
-
+
start_mangling (fn_decl, /*ident_p=*/true);
write_string ("_Z");
write_char ('T');
-
+
if (!this_adjusting)
{
/* Covariant thunk with no this adjustment */
@@ -2792,16 +2797,16 @@ mangle_conv_op_name_for_type (const tree type)
void **slot;
tree identifier;
- if (conv_type_names == NULL)
+ if (conv_type_names == NULL)
conv_type_names = htab_create_ggc (31, &hash_type, &compare_type, NULL);
- slot = htab_find_slot_with_hash (conv_type_names, type,
+ slot = htab_find_slot_with_hash (conv_type_names, type,
(hashval_t) TYPE_UID (type), INSERT);
identifier = (tree)*slot;
if (!identifier)
{
char buffer[64];
-
+
/* Create a unique name corresponding to TYPE. */
sprintf (buffer, "operator %lu",
(unsigned long) htab_elements (conv_type_names));
@@ -2816,7 +2821,7 @@ mangle_conv_op_name_for_type (const tree type)
IDENTIFIER_OPNAME_P (identifier) = 1;
IDENTIFIER_TYPENAME_P (identifier) = 1;
}
-
+
return identifier;
}
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index 9470cd5997d..2f5e1f67e81 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -1,11 +1,11 @@
/* Handle the hair of processing (but not expanding) inline functions.
Also manage function and variable name overloading.
- Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+ Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by Michael Tiemann (tiemann@cygnus.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)
@@ -37,6 +37,7 @@ Boston, MA 02111-1307, USA. */
#include "tm_p.h"
#include "target.h"
#include "tree-pass.h"
+#include "diagnostic.h"
/* Various flags to control the mangling process. */
@@ -88,22 +89,22 @@ make_thunk (tree function, bool this_adjusting,
{
HOST_WIDE_INT d;
tree thunk;
-
+
gcc_assert (TREE_CODE (function) == FUNCTION_DECL);
/* We can have this thunks to covariant thunks, but not vice versa. */
gcc_assert (!DECL_THIS_THUNK_P (function));
gcc_assert (!DECL_RESULT_THUNK_P (function) || this_adjusting);
-
+
/* Scale the VIRTUAL_OFFSET to be in terms of bytes. */
if (this_adjusting && virtual_offset)
- virtual_offset
+ virtual_offset
= size_binop (MULT_EXPR,
- virtual_offset,
- convert (ssizetype,
- TYPE_SIZE_UNIT (vtable_entry_type)));
-
+ virtual_offset,
+ convert (ssizetype,
+ TYPE_SIZE_UNIT (vtable_entry_type)));
+
d = tree_low_cst (fixed_offset, 0);
-
+
/* See if we already have the thunk in question. For this_adjusting
thunks VIRTUAL_OFFSET will be an INTEGER_CST, for covariant thunks it
will be a BINFO. */
@@ -117,7 +118,7 @@ make_thunk (tree function, bool this_adjusting,
virtual_offset)
: THUNK_VIRTUAL_OFFSET (thunk) == virtual_offset)))
return thunk;
-
+
/* All thunks must be created before FUNCTION is actually emitted;
the ABI requires that all thunks be emitted together with the
function to which they transfer control. */
@@ -131,7 +132,7 @@ make_thunk (tree function, bool this_adjusting,
DECL_LANG_SPECIFIC (thunk) = DECL_LANG_SPECIFIC (function);
cxx_dup_lang_specific_decl (thunk);
DECL_THUNKS (thunk) = NULL_TREE;
-
+
DECL_CONTEXT (thunk) = DECL_CONTEXT (function);
TREE_READONLY (thunk) = TREE_READONLY (function);
TREE_THIS_VOLATILE (thunk) = TREE_THIS_VOLATILE (function);
@@ -143,7 +144,7 @@ make_thunk (tree function, bool this_adjusting,
THUNK_FIXED_OFFSET (thunk) = d;
THUNK_VIRTUAL_OFFSET (thunk) = virtual_offset;
THUNK_ALIAS (thunk) = NULL_TREE;
-
+
/* The thunk itself is not a constructor or destructor, even if
the thing it is thunking to is. */
DECL_INTERFACE_KNOWN (thunk) = 1;
@@ -162,7 +163,7 @@ make_thunk (tree function, bool this_adjusting,
DECL_DECLARED_INLINE_P (thunk) = 0;
/* Nor has it been deferred. */
DECL_DEFERRED_FN (thunk) = 0;
-
+
/* Add it to the list of thunks associated with FUNCTION. */
TREE_CHAIN (thunk) = DECL_THUNKS (function);
DECL_THUNKS (function) = thunk;
@@ -205,7 +206,7 @@ finish_thunk (tree thunk)
break;
}
}
-
+
DECL_NAME (thunk) = name;
SET_DECL_ASSEMBLER_NAME (thunk, name);
}
@@ -233,7 +234,7 @@ thunk_adjust (tree ptr, bool this_adjusting,
ptr = save_expr (ptr);
/* The vptr is always at offset zero in the object. */
vtable = build1 (NOP_EXPR,
- build_pointer_type (build_pointer_type
+ build_pointer_type (build_pointer_type
(vtable_entry_type)),
ptr);
/* Form the vtable address. */
@@ -245,7 +246,7 @@ thunk_adjust (tree ptr, bool this_adjusting,
/* Adjust the `this' pointer. */
ptr = fold_build2 (PLUS_EXPR, TREE_TYPE (ptr), ptr, vtable);
}
-
+
if (!this_adjusting)
/* Adjust the pointer by the constant. */
ptr = fold_build2 (PLUS_EXPR, TREE_TYPE (ptr), ptr,
@@ -258,16 +259,10 @@ static GTY (()) int thunk_labelno;
/* Create a static alias to function. */
-static tree
-make_alias_for_thunk (tree function)
+tree
+make_alias_for (tree function, tree newid)
{
- tree alias;
- char buf[256];
-
- ASM_GENERATE_INTERNAL_LABEL (buf, "LTHUNK", thunk_labelno);
- thunk_labelno++;
- alias = build_decl (FUNCTION_DECL, get_identifier (buf),
- TREE_TYPE (function));
+ tree alias = build_decl (FUNCTION_DECL, newid, TREE_TYPE (function));
DECL_LANG_SPECIFIC (alias) = DECL_LANG_SPECIFIC (function);
cxx_dup_lang_specific_decl (alias);
DECL_CONTEXT (alias) = NULL;
@@ -296,8 +291,23 @@ make_alias_for_thunk (tree function)
TREE_USED (alias) = 1;
SET_DECL_ASSEMBLER_NAME (alias, DECL_NAME (alias));
TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias)) = 1;
+ return alias;
+}
+
+static tree
+make_alias_for_thunk (tree function)
+{
+ tree alias;
+ char buf[256];
+
+ ASM_GENERATE_INTERNAL_LABEL (buf, "LTHUNK", thunk_labelno);
+ thunk_labelno++;
+
+ alias = make_alias_for (function, get_identifier (buf));
+
if (!flag_syntax_only)
assemble_alias (alias, DECL_ASSEMBLER_NAME (function));
+
return alias;
}
@@ -322,7 +332,7 @@ use_thunk (tree thunk_fndecl, bool emit_p)
if (TREE_ASM_WRITTEN (thunk_fndecl))
return;
-
+
function = THUNK_TARGET (thunk_fndecl);
if (DECL_RESULT (thunk_fndecl))
/* We already turned this thunk into an ordinary function.
@@ -332,7 +342,7 @@ use_thunk (tree thunk_fndecl, bool emit_p)
if (DECL_THUNK_P (function))
/* The target is itself a thunk, process it now. */
use_thunk (function, emit_p);
-
+
/* Thunks are always addressable; they only appear in vtables. */
TREE_ADDRESSABLE (thunk_fndecl) = 1;
@@ -360,7 +370,7 @@ use_thunk (tree thunk_fndecl, bool emit_p)
}
else
virtual_value = 0;
-
+
/* And, if we need to emit the thunk, it's used. */
mark_used (thunk_fndecl);
/* This thunk is actually defined. */
@@ -369,7 +379,7 @@ use_thunk (tree thunk_fndecl, bool emit_p)
rewrite. */
TREE_PUBLIC (thunk_fndecl) = TREE_PUBLIC (function);
DECL_VISIBILITY (thunk_fndecl) = DECL_VISIBILITY (function);
- DECL_VISIBILITY_SPECIFIED (thunk_fndecl)
+ DECL_VISIBILITY_SPECIFIED (thunk_fndecl)
= DECL_VISIBILITY_SPECIFIED (function);
if (flag_weak && TREE_PUBLIC (thunk_fndecl))
comdat_linkage (thunk_fndecl);
@@ -413,7 +423,7 @@ use_thunk (tree thunk_fndecl, bool emit_p)
a = nreverse (t);
DECL_ARGUMENTS (thunk_fndecl) = a;
BLOCK_VARS (DECL_INITIAL (thunk_fndecl)) = a;
-
+
if (this_adjusting
&& targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset,
virtual_value, alias))
@@ -458,7 +468,7 @@ use_thunk (tree thunk_fndecl, bool emit_p)
if (this_adjusting)
t = thunk_adjust (t, /*this_adjusting=*/1,
fixed_offset, virtual_offset);
-
+
/* Build up the call to the real function. */
t = tree_cons (NULL_TREE, t, NULL_TREE);
for (a = TREE_CHAIN (a); a; a = TREE_CHAIN (a))
@@ -466,7 +476,7 @@ use_thunk (tree thunk_fndecl, bool emit_p)
t = nreverse (t);
t = build_call (alias, t);
CALL_FROM_THUNK_P (t) = 1;
-
+
if (VOID_TYPE_P (TREE_TYPE (t)))
finish_expr_stmt (t);
else
@@ -484,7 +494,7 @@ use_thunk (tree thunk_fndecl, bool emit_p)
t = save_expr (t);
cond = cp_convert (boolean_type_node, t);
}
-
+
t = thunk_adjust (t, /*this_adjusting=*/0,
fixed_offset, virtual_offset);
if (cond)
@@ -550,7 +560,7 @@ do_build_copy_constructor (tree fndecl)
for (vbases = CLASSTYPE_VBASECLASSES (current_class_type), i = 0;
VEC_iterate (tree, vbases, i, binfo); i++)
{
- member_init_list
+ member_init_list
= tree_cons (binfo,
build_tree_list (NULL_TREE,
build_base_path (PLUS_EXPR, parm,
@@ -562,9 +572,9 @@ do_build_copy_constructor (tree fndecl)
BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
{
if (BINFO_VIRTUAL_P (base_binfo))
- continue;
+ continue;
- member_init_list
+ member_init_list
= tree_cons (base_binfo,
build_tree_list (NULL_TREE,
build_base_path (PLUS_EXPR, parm,
@@ -601,12 +611,12 @@ do_build_copy_constructor (tree fndecl)
if (TREE_CODE (expr_type) != REFERENCE_TYPE)
{
int quals = cvquals;
-
+
if (DECL_MUTABLE_P (field))
quals &= ~TYPE_QUAL_CONST;
expr_type = cp_build_qualified_type (expr_type, quals);
}
-
+
init = build3 (COMPONENT_REF, expr_type, init, field, NULL_TREE);
init = build_tree_list (NULL_TREE, init);
@@ -651,18 +661,18 @@ do_build_assign_ref (tree fndecl)
explicitly since the base class may be ambiguous. */
converted_parm = build_base_path (PLUS_EXPR, parm, base_binfo, 1);
/* Call the base class assignment operator. */
- finish_expr_stmt
- (build_special_member_call (current_class_ref,
+ finish_expr_stmt
+ (build_special_member_call (current_class_ref,
ansi_assopname (NOP_EXPR),
- build_tree_list (NULL_TREE,
+ build_tree_list (NULL_TREE,
converted_parm),
base_binfo,
LOOKUP_NORMAL | LOOKUP_NONVIRTUAL));
}
/* Assign to each of the non-static data members. */
- for (fields = TYPE_FIELDS (current_class_type);
- fields;
+ for (fields = TYPE_FIELDS (current_class_type);
+ fields;
fields = TREE_CHAIN (fields))
{
tree comp = current_class_ref;
@@ -675,17 +685,17 @@ do_build_assign_ref (tree fndecl)
continue;
expr_type = TREE_TYPE (field);
-
+
if (CP_TYPE_CONST_P (expr_type))
{
- error ("non-static const member %q#D, can't use default "
- "assignment operator", field);
+ error ("non-static const member %q#D, can't use default "
+ "assignment operator", field);
continue;
}
else if (TREE_CODE (expr_type) == REFERENCE_TYPE)
{
error ("non-static reference member %q#D, can't use "
- "default assignment operator", field);
+ "default assignment operator", field);
continue;
}
@@ -702,13 +712,13 @@ do_build_assign_ref (tree fndecl)
continue;
comp = build3 (COMPONENT_REF, expr_type, comp, field, NULL_TREE);
-
+
/* Compute the type of init->field */
quals = cvquals;
if (DECL_MUTABLE_P (field))
quals &= ~TYPE_QUAL_CONST;
expr_type = cp_build_qualified_type (expr_type, quals);
-
+
init = build3 (COMPONENT_REF, expr_type, init, field, NULL_TREE);
if (DECL_NAME (field))
@@ -722,6 +732,8 @@ do_build_assign_ref (tree fndecl)
finish_compound_stmt (compound_stmt);
}
+/* Synthesize FNDECL, a non-static member function. */
+
void
synthesize_method (tree fndecl)
{
@@ -730,17 +742,19 @@ synthesize_method (tree fndecl)
bool need_body = true;
tree stmt;
location_t save_input_location = input_location;
+ int error_count = errorcount;
+ int warning_count = warningcount;
+
+ /* Reset the source location, we might have been previously
+ deferred, and thus have saved where we were first needed. */
+ DECL_SOURCE_LOCATION (fndecl)
+ = DECL_SOURCE_LOCATION (TYPE_NAME (DECL_CONTEXT (fndecl)));
/* If we've been asked to synthesize a clone, just synthesize the
cloned function instead. Doing so will automatically fill in the
body for the clone. */
if (DECL_CLONED_FUNCTION_P (fndecl))
- {
- DECL_SOURCE_LOCATION (DECL_CLONED_FUNCTION (fndecl)) =
- DECL_SOURCE_LOCATION (fndecl);
- synthesize_method (DECL_CLONED_FUNCTION (fndecl));
- return;
- }
+ fndecl = DECL_CLONED_FUNCTION (fndecl);
/* We may be in the middle of deferred access check. Disable
it now. */
@@ -790,6 +804,10 @@ synthesize_method (tree fndecl)
pop_function_context_from (context);
pop_deferring_access_checks ();
+
+ if (error_count != errorcount || warning_count != warningcount)
+ inform ("%Hsynthesized method %qD first required here ",
+ &input_location, fndecl);
}
/* Use EXTRACTOR to locate the relevant function called for each base &
@@ -800,7 +818,7 @@ synthesize_method (tree fndecl)
static tree
synthesize_exception_spec (tree type, tree (*extractor) (tree, void*),
- void *client)
+ void *client)
{
tree raises = empty_except_spec;
tree fields = TYPE_FIELDS (type);
@@ -812,31 +830,31 @@ synthesize_exception_spec (tree type, tree (*extractor) (tree, void*),
{
tree fn = (*extractor) (BINFO_TYPE (base_binfo), client);
if (fn)
- {
- tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
-
- raises = merge_exception_specifiers (raises, fn_raises);
- }
+ {
+ tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
+
+ raises = merge_exception_specifiers (raises, fn_raises);
+ }
}
for (; fields; fields = TREE_CHAIN (fields))
{
tree type = TREE_TYPE (fields);
tree fn;
-
+
if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields))
- continue;
+ continue;
while (TREE_CODE (type) == ARRAY_TYPE)
- type = TREE_TYPE (type);
+ type = TREE_TYPE (type);
if (TREE_CODE (type) != RECORD_TYPE)
- continue;
-
+ continue;
+
fn = (*extractor) (type, client);
if (fn)
- {
- tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
-
- raises = merge_exception_specifiers (raises, fn_raises);
- }
+ {
+ tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
+
+ raises = merge_exception_specifiers (raises, fn_raises);
+ }
}
return raises;
}
@@ -855,7 +873,7 @@ static tree
locate_ctor (tree type, void *client ATTRIBUTE_UNUSED)
{
tree fns;
-
+
if (!TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
return NULL_TREE;
@@ -868,9 +886,9 @@ locate_ctor (tree type, void *client ATTRIBUTE_UNUSED)
{
tree fn = OVL_CURRENT (fns);
tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
-
+
if (sufficient_parms_p (TREE_CHAIN (parms)))
- return fn;
+ return fn;
}
return NULL_TREE;
}
@@ -892,7 +910,7 @@ locate_copy (tree type, void *client_)
tree fns;
tree best = NULL_TREE;
bool excess_p = false;
-
+
if (client->name)
{
int ix;
@@ -918,27 +936,27 @@ locate_copy (tree type, void *client_)
tree src_type;
int excess;
int quals;
-
+
parms = TREE_CHAIN (parms);
if (!parms)
- continue;
+ continue;
src_type = non_reference (TREE_VALUE (parms));
if (!same_type_ignoring_top_level_qualifiers_p (src_type, type))
- continue;
+ continue;
if (!sufficient_parms_p (TREE_CHAIN (parms)))
- continue;
+ continue;
quals = cp_type_quals (src_type);
if (client->quals & ~quals)
- continue;
+ continue;
excess = quals & ~client->quals;
if (!best || (excess_p && !excess))
- {
- best = fn;
- excess_p = excess;
- }
+ {
+ best = fn;
+ excess_p = excess;
+ }
else
- /* Ambiguous */
- return NULL_TREE;
+ /* Ambiguous */
+ return NULL_TREE;
}
return best;
}
@@ -959,6 +977,19 @@ implicitly_declare_fn (special_function_kind kind, tree type, bool const_p)
tree raises = empty_except_spec;
tree rhs_parm_type = NULL_TREE;
tree name;
+ HOST_WIDE_INT saved_processing_template_decl;
+
+ /* Because we create declarations for implictly declared functions
+ lazily, we may be creating the declaration for a member of TYPE
+ while in some completely different context. However, TYPE will
+ never be a dependent class (because we never want to do lookups
+ for implicitly defined functions in a dependent class).
+ Furthermore, we must set PROCESSING_TEMPLATE_DECL to zero here
+ because we only create clones for constructors and destructors
+ when not in a template. */
+ gcc_assert (!dependent_type_p (type));
+ saved_processing_template_decl = processing_template_decl;
+ processing_template_decl = 0;
type = TYPE_MAIN_VARIANT (type);
@@ -991,23 +1022,23 @@ implicitly_declare_fn (special_function_kind kind, tree type, bool const_p)
case sfk_assignment_operator:
{
struct copy_data data;
-
+
data.name = NULL;
data.quals = 0;
if (kind == sfk_assignment_operator)
- {
+ {
return_type = build_reference_type (type);
- name = ansi_assopname (NOP_EXPR);
- data.name = name;
- }
+ name = ansi_assopname (NOP_EXPR);
+ data.name = name;
+ }
else
name = constructor_name (type);
if (const_p)
- {
- data.quals = TYPE_QUAL_CONST;
+ {
+ data.quals = TYPE_QUAL_CONST;
rhs_parm_type = build_qualified_type (type, TYPE_QUAL_CONST);
- }
+ }
else
rhs_parm_type = type;
rhs_parm_type = build_reference_type (rhs_parm_type);
@@ -1057,6 +1088,9 @@ implicitly_declare_fn (special_function_kind kind, tree type, bool const_p)
DECL_INLINE (fn) = 1;
gcc_assert (!TREE_USED (fn));
+ /* Restore PROCESSING_TEMPLATE_DECL. */
+ processing_template_decl = saved_processing_template_decl;
+
return fn;
}
@@ -1085,9 +1119,9 @@ lazily_declare_fn (special_function_kind sfk, tree type)
if (sfk == sfk_destructor)
check_for_override (fn, type);
/* Add it to CLASSTYPE_METHOD_VEC. */
- add_method (type, fn);
+ add_method (type, fn, NULL_TREE);
/* Add it to TYPE_METHODS. */
- if (sfk == sfk_destructor
+ if (sfk == sfk_destructor
&& DECL_VIRTUAL_P (fn)
&& abi_version_at_least (2))
/* The ABI requires that a virtual destructor go at the end of the
@@ -1097,7 +1131,7 @@ lazily_declare_fn (special_function_kind sfk, tree type)
{
/* G++ 3.2 put the implicit destructor at the *beginning* of the
TYPE_METHODS list, which cause the destructor to be emitted
- in an incorrect location in the vtable. */
+ in an incorrect location in the vtable. */
if (warn_abi && DECL_VIRTUAL_P (fn))
warning (0, "vtable layout for class %qT may not be ABI-compliant"
"and may change in a future version of GCC due to "
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 0bb8888e8a3..b76b8aff8d2 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -46,12 +46,11 @@ static cxx_binding *binding_for_name (cxx_scope *, tree);
static tree lookup_name_innermost_nonclass_level (tree);
static tree push_overloaded_decl (tree, int);
static bool lookup_using_namespace (tree, struct scope_binding *, tree,
- tree, int);
+ tree, int);
static bool qualified_lookup_using_namespace (tree, tree,
struct scope_binding *, int);
static tree lookup_type_current_level (tree);
static tree push_using_directive (tree);
-static void cp_emit_debug_info_for_using (tree, tree);
/* The :: namespace. */
@@ -146,11 +145,11 @@ binding_table_free (binding_table table)
{
binding_entry temp = table->chain[i];
while (temp != NULL)
- {
- binding_entry entry = temp;
- temp = entry->chain;
- binding_entry_free (entry);
- }
+ {
+ binding_entry entry = temp;
+ temp = entry->chain;
+ binding_entry_free (entry);
+ }
table->chain[i] = NULL;
}
table->entry_count = 0;
@@ -184,14 +183,14 @@ binding_table_expand (binding_table table)
{
binding_entry entry = old_chains[i];
for (; entry != NULL; entry = old_chains[i])
- {
- const unsigned int hash = IDENTIFIER_HASH_VALUE (entry->name);
- const size_t j = ENTRY_INDEX (hash, new_chain_count);
-
- old_chains[i] = entry->chain;
- entry->chain = table->chain[j];
- table->chain[j] = entry;
- }
+ {
+ const unsigned int hash = IDENTIFIER_HASH_VALUE (entry->name);
+ const size_t j = ENTRY_INDEX (hash, new_chain_count);
+
+ old_chains[i] = entry->chain;
+ entry->chain = table->chain[j];
+ table->chain[j] = entry;
+ }
}
table->entry_count = old_entry_count;
}
@@ -239,7 +238,7 @@ binding_table_foreach (binding_table table, bt_foreach_proc proc, void *data)
{
binding_entry entry = table->chain[i];
for (; entry != NULL; entry = entry->chain)
- proc (entry, data);
+ proc (entry, data);
}
}
@@ -301,7 +300,7 @@ new_class_binding (tree name, tree value, tree type, cxx_scope *scope)
{
cp_class_binding *cb;
cxx_binding *binding;
-
+
if (VEC_length (cp_class_binding, scope->class_shadowed))
{
cp_class_binding *old_base;
@@ -310,7 +309,7 @@ new_class_binding (tree name, tree value, tree type, cxx_scope *scope)
{
/* Fixup the current bindings, as they might have moved. */
size_t i;
-
+
for (i = 0;
VEC_iterate (cp_class_binding, scope->class_shadowed, i, cb);
i++)
@@ -326,7 +325,7 @@ new_class_binding (tree name, tree value, tree type, cxx_scope *scope)
}
else
cb = VEC_safe_push (cp_class_binding, gc, scope->class_shadowed, NULL);
-
+
cb->identifier = name;
binding = &cb->base;
binding->scope = scope;
@@ -349,7 +348,7 @@ push_binding (tree id, tree decl, cxx_scope* level)
}
else
binding = new_class_binding (id, decl, /*type=*/NULL_TREE, level);
-
+
/* Now, fill in the binding information. */
binding->previous = IDENTIFIER_BINDING (id);
INHERITED_VALUE_BINDING_P (binding) = 0;
@@ -431,7 +430,7 @@ supplement_binding (cxx_binding *binding, tree decl)
else if (/* BVAL is null when push_class_level_binding moves an
inherited type-binding out of the way to make room for a
new value binding. */
- !bval
+ !bval
/* BVAL is error_mark_node when DECL's name has been used
in a non-class scope prior declaration. In that case,
we should have already issued a diagnostic; for graceful
@@ -466,11 +465,11 @@ supplement_binding (cxx_binding *binding, tree decl)
/* We have two typedef-names, both naming the same type to have
the same name. In general, this is OK because of:
- [dcl.typedef]
+ [dcl.typedef]
In a given scope, a typedef specifier can be used to redefine
the name of any type declared in that scope to refer to the
- type to which it already refers.
+ type to which it already refers.
However, in class scopes, this rule does not apply due to the
stricter language in [class.mem] prohibiting redeclarations of
@@ -497,7 +496,7 @@ supplement_binding (cxx_binding *binding, tree decl)
&& DECL_NAMESPACE_ALIAS (bval)
&& ORIGINAL_NAMESPACE (bval) == ORIGINAL_NAMESPACE (decl))
/* [namespace.alias]
-
+
In a declarative region, a namespace-alias-definition can be
used to redefine a namespace-alias declared in that declarative
region to refer only to the namespace to which it already
@@ -518,7 +517,7 @@ supplement_binding (cxx_binding *binding, tree decl)
static void
add_decl_to_level (tree decl, cxx_scope *b)
{
- if (TREE_CODE (decl) == NAMESPACE_DECL
+ if (TREE_CODE (decl) == NAMESPACE_DECL
&& !DECL_NAMESPACE_ALIAS (decl))
{
TREE_CHAIN (decl) = b->namespaces;
@@ -529,16 +528,16 @@ add_decl_to_level (tree decl, cxx_scope *b)
TREE_CHAIN (decl) = b->vtables;
b->vtables = decl;
}
- else
+ else
{
/* We build up the list in reverse order, and reverse it later if
- necessary. */
+ necessary. */
TREE_CHAIN (decl) = b->names;
b->names = decl;
b->names_size++;
/* If appropriate, add decl to separate list of statics. We
- include extern variables because they might turn out to be
+ include extern variables because they might turn out to be
static later. It's OK for this list to contain a few false
positives. */
if (b->kind == sk_namespace)
@@ -577,7 +576,7 @@ pushdecl (tree x)
{
if (current_function_decl && x != current_function_decl
/* A local declaration for a function doesn't constitute
- nesting. */
+ nesting. */
&& TREE_CODE (x) != FUNCTION_DECL
/* A local declaration for an `extern' variable is in the
scope of the current namespace, not the current
@@ -691,7 +690,7 @@ pushdecl (tree x)
{
if (pedantic && ! DECL_IN_SYSTEM_HEADER (x))
pedwarn ("redeclaration of %<wchar_t%> as %qT",
- TREE_TYPE (x));
+ TREE_TYPE (x));
/* Throw away the redeclaration. */
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t);
@@ -699,7 +698,7 @@ pushdecl (tree x)
else
{
tree olddecl = duplicate_decls (x, t);
-
+
/* If the redeclaration failed, we can stop at this
point. */
if (olddecl == error_mark_node)
@@ -718,9 +717,9 @@ pushdecl (tree x)
{
/* A redeclaration of main, but not a duplicate of the
previous one.
-
+
[basic.start.main]
-
+
This function shall not be overloaded. */
cp_error_at ("invalid redeclaration of %qD", t);
error ("as %qD", x);
@@ -767,28 +766,28 @@ pushdecl (tree x)
{
tree type = TREE_TYPE (x);
if (DECL_IS_BUILTIN (x))
- {
+ {
if (TYPE_NAME (type) == 0)
- TYPE_NAME (type) = x;
- }
- else if (type != error_mark_node && TYPE_NAME (type) != x
+ TYPE_NAME (type) = x;
+ }
+ else if (type != error_mark_node && TYPE_NAME (type) != x
/* We don't want to copy the type when all we're
doing is making a TYPE_DECL for the purposes of
inlining. */
&& (!TYPE_NAME (type)
|| TYPE_NAME (type) != DECL_ABSTRACT_ORIGIN (x)))
- {
+ {
DECL_ORIGINAL_TYPE (x) = type;
- type = build_variant_type_copy (type);
+ type = build_variant_type_copy (type);
TYPE_STUB_DECL (type) = TYPE_STUB_DECL (DECL_ORIGINAL_TYPE (x));
- TYPE_NAME (type) = x;
- TREE_TYPE (x) = type;
- }
+ TYPE_NAME (type) = x;
+ TREE_TYPE (x) = type;
+ }
if (type != error_mark_node
&& TYPE_NAME (type)
&& TYPE_IDENTIFIER (type))
- set_identifier_type_value (DECL_NAME (x), x);
+ set_identifier_type_value (DECL_NAME (x), x);
}
/* Multiple external decls of the same identifier ought to match.
@@ -827,16 +826,16 @@ pushdecl (tree x)
if (IDENTIFIER_GLOBAL_VALUE (name) == NULL_TREE && TREE_PUBLIC (x))
TREE_PUBLIC (name) = 1;
- /* Bind the name for the entity. */
- if (!(TREE_CODE (x) == TYPE_DECL && DECL_ARTIFICIAL (x)
- && t != NULL_TREE)
- && (TREE_CODE (x) == TYPE_DECL
- || TREE_CODE (x) == VAR_DECL
- || TREE_CODE (x) == ALIAS_DECL
- || TREE_CODE (x) == NAMESPACE_DECL
- || TREE_CODE (x) == CONST_DECL
- || TREE_CODE (x) == TEMPLATE_DECL))
- SET_IDENTIFIER_NAMESPACE_VALUE (name, x);
+ /* Bind the name for the entity. */
+ if (!(TREE_CODE (x) == TYPE_DECL && DECL_ARTIFICIAL (x)
+ && t != NULL_TREE)
+ && (TREE_CODE (x) == TYPE_DECL
+ || TREE_CODE (x) == VAR_DECL
+ || TREE_CODE (x) == ALIAS_DECL
+ || TREE_CODE (x) == NAMESPACE_DECL
+ || TREE_CODE (x) == CONST_DECL
+ || TREE_CODE (x) == TEMPLATE_DECL))
+ SET_IDENTIFIER_NAMESPACE_VALUE (name, x);
/* If new decl is `static' and an `extern' was seen previously,
warn about it. */
@@ -959,7 +958,7 @@ pushdecl (tree x)
/*want_type=*/false);
else
member = NULL_TREE;
-
+
if (member && !TREE_STATIC (member))
{
/* Location of previous decl is not useful in this case. */
@@ -1116,7 +1115,7 @@ check_for_out_of_scope_variable (tree decl)
error ("name lookup of %qD changed for new ISO %<for%> scoping",
DECL_NAME (decl));
cp_error_at (" cannot use obsolete binding at %qD because "
- "it has a destructor", decl);
+ "it has a destructor", decl);
return error_mark_node;
}
else
@@ -1177,7 +1176,7 @@ cxx_scope_debug (cxx_scope *scope, int line, const char *action)
const char *desc = cxx_scope_descriptor (scope);
if (scope->this_entity)
verbatim ("%s %s(%E) %p %d\n", action, desc,
- scope->this_entity, (void *) scope, line);
+ scope->this_entity, (void *) scope, line);
else
verbatim ("%s %s %p %d\n", action, desc, (void *) scope, line);
}
@@ -1229,7 +1228,7 @@ cxx_scope *
begin_scope (scope_kind kind, tree entity)
{
cxx_scope *scope;
-
+
/* Reuse or create a struct for this binding level. */
if (!ENABLE_SCOPE_CHECKING && free_binding_level)
{
@@ -1247,7 +1246,7 @@ begin_scope (scope_kind kind, tree entity)
case sk_cleanup:
scope->keep = true;
break;
-
+
case sk_template_spec:
scope->explicit_spec_p = true;
kind = sk_template_parms;
@@ -1297,16 +1296,16 @@ leave_scope (void)
/* We cannot leave a scope, if there are none left. */
if (NAMESPACE_LEVEL (global_namespace))
gcc_assert (!global_scope_p (scope));
-
+
if (ENABLE_SCOPE_CHECKING)
{
indent (--binding_depth);
cxx_scope_debug (scope, input_line, "leave");
if (is_class_level != (scope == class_binding_level))
- {
- indent (binding_depth);
- verbatim ("XXX is_class_level != (current_scope == class_scope)\n");
- }
+ {
+ indent (binding_depth);
+ verbatim ("XXX is_class_level != (current_scope == class_scope)\n");
+ }
is_class_level = 0;
}
@@ -1433,7 +1432,7 @@ kept_level_p (void)
{
return (current_binding_level->blocks != NULL_TREE
|| current_binding_level->keep
- || current_binding_level->kind == sk_cleanup
+ || current_binding_level->kind == sk_cleanup
|| current_binding_level->names != NULL_TREE);
}
@@ -1518,16 +1517,16 @@ print_binding_level (struct cp_binding_level* lvl)
break;
}
if (i)
- fprintf (stderr, "\n");
+ fprintf (stderr, "\n");
}
if (VEC_length (cp_class_binding, lvl->class_shadowed))
{
size_t i;
cp_class_binding *b;
fprintf (stderr, " class-shadowed:");
- for (i = 0;
+ for (i = 0;
VEC_iterate(cp_class_binding, lvl->class_shadowed, i, b);
- ++i)
+ ++i)
fprintf (stderr, " %s ", IDENTIFIER_POINTER (b->identifier));
fprintf (stderr, "\n");
}
@@ -1535,9 +1534,9 @@ print_binding_level (struct cp_binding_level* lvl)
{
fprintf (stderr, " type-shadowed:");
for (t = lvl->type_shadowed; t; t = TREE_CHAIN (t))
- {
+ {
fprintf (stderr, " %s ", IDENTIFIER_POINTER (TREE_PURPOSE (t)));
- }
+ }
fprintf (stderr, "\n");
}
}
@@ -1561,7 +1560,7 @@ print_binding_stack (void)
"\nclass_binding_level=" HOST_PTR_PRINTF
"\nNAMESPACE_LEVEL (global_namespace)=" HOST_PTR_PRINTF "\n",
(void *) current_binding_level, (void *) class_binding_level,
- (void *) NAMESPACE_LEVEL (global_namespace));
+ (void *) NAMESPACE_LEVEL (global_namespace));
if (class_binding_level)
{
for (b = class_binding_level; b; b = b->level_chain)
@@ -1636,7 +1635,7 @@ set_identifier_type_value_with_scope (tree id, tree decl, cxx_scope *b)
supplement_binding (binding, decl);
else
binding->value = decl;
-
+
/* Store marker instead of real type. */
type = global_type_node;
}
@@ -1685,10 +1684,10 @@ constructor_name_p (tree name, tree type)
if (!name)
return false;
-
+
if (TREE_CODE (name) != IDENTIFIER_NODE)
return false;
-
+
ctor_name = constructor_name_full (type);
if (name == ctor_name)
return true;
@@ -1714,7 +1713,7 @@ make_anon_name (void)
return get_identifier (buf);
}
-/* Return (from the stack of) the BINDING, if any, established at SCOPE. */
+/* Return (from the stack of) the BINDING, if any, established at SCOPE. */
static inline cxx_binding *
find_binding (cxx_scope *scope, cxx_binding *binding)
@@ -1738,7 +1737,7 @@ cxx_scope_find_binding_for_name (cxx_scope *scope, tree name)
{
/* Fold-in case where NAME is used only once. */
if (scope == b->scope && b->previous == NULL)
- return b;
+ return b;
return find_binding (scope, b);
}
return NULL;
@@ -1779,13 +1778,13 @@ push_using_decl (tree scope, tree name)
gcc_assert (TREE_CODE (scope) == NAMESPACE_DECL);
gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
for (decl = current_binding_level->usings; decl; decl = TREE_CHAIN (decl))
- if (DECL_INITIAL (decl) == scope && DECL_NAME (decl) == name)
+ if (USING_DECL_SCOPE (decl) == scope && DECL_NAME (decl) == name)
break;
if (decl)
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP,
- namespace_bindings_p () ? decl : NULL_TREE);
- decl = build_lang_decl (USING_DECL, name, void_type_node);
- DECL_INITIAL (decl) = scope;
+ namespace_bindings_p () ? decl : NULL_TREE);
+ decl = build_lang_decl (USING_DECL, name, NULL_TREE);
+ USING_DECL_SCOPE (decl) = scope;
TREE_CHAIN (decl) = current_binding_level->usings;
current_binding_level->usings = decl;
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl);
@@ -1831,9 +1830,9 @@ pushdecl_with_scope (tree x, cxx_scope *level)
FLAGS is a bitwise-or of the following values:
PUSH_LOCAL: Bind DECL in the current scope, rather than at
- namespace scope.
+ namespace scope.
PUSH_USING: DECL is being pushed as the result of a using
- declaration.
+ declaration.
The value returned may be a previous declaration if we guessed wrong
about what language DECL should belong to (C or C++). Otherwise,
@@ -1865,8 +1864,8 @@ push_overloaded_decl (tree decl, int flags)
old = NULL_TREE;
}
else if (is_overloaded_fn (old))
- {
- tree tmp;
+ {
+ tree tmp;
for (tmp = old; tmp; tmp = OVL_NEXT (tmp))
{
@@ -1878,7 +1877,7 @@ push_overloaded_decl (tree decl, int flags)
TYPE_ARG_TYPES (TREE_TYPE (decl)))
&& ! decls_match (fn, decl))
error ("%q#D conflicts with previous using declaration %q#D",
- decl, fn);
+ decl, fn);
if (duplicate_decls (decl, fn) == fn)
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, fn);
@@ -1986,7 +1985,7 @@ validate_nonmember_using_decl (tree decl, tree scope, tree name)
/* 7.3.3/5
A using-declaration shall not name a template-id. */
error ("a using-declaration cannot specify a template-id. "
- "Try %<using %D%>", name);
+ "Try %<using %D%>", name);
return NULL_TREE;
}
@@ -2017,7 +2016,7 @@ validate_nonmember_using_decl (tree decl, tree scope, tree name)
static void
do_nonmember_using_decl (tree scope, tree name, tree oldval, tree oldtype,
- tree *newval, tree *newtype)
+ tree *newval, tree *newtype)
{
struct scope_binding decls = EMPTY_SCOPE_BINDING;
@@ -2032,6 +2031,14 @@ do_nonmember_using_decl (tree scope, tree name, tree oldval, tree oldtype,
return;
}
+ /* It is impossible to overload a built-in function; any explicit
+ declaration eliminates the built-in declaration. So, if OLDVAL
+ is a built-in, then we can just pretend it isn't there. */
+ if (oldval
+ && TREE_CODE (oldval) == FUNCTION_DECL
+ && DECL_ANTICIPATED (oldval))
+ oldval = NULL_TREE;
+
/* Check for using functions. */
if (decls.value && is_overloaded_fn (decls.value))
{
@@ -2044,15 +2051,6 @@ do_nonmember_using_decl (tree scope, tree name, tree oldval, tree oldtype,
oldval = NULL_TREE;
}
- /* It is impossible to overload a built-in function; any
- explicit declaration eliminates the built-in declaration.
- So, if OLDVAL is a built-in, then we can just pretend it
- isn't there. */
- if (oldval
- && TREE_CODE (oldval) == FUNCTION_DECL
- && DECL_ANTICIPATED (oldval))
- oldval = NULL_TREE;
-
*newval = oldval;
for (tmp = decls.value; tmp; tmp = OVL_NEXT (tmp))
{
@@ -2068,23 +2066,23 @@ do_nonmember_using_decl (tree scope, tree name, tree oldval, tree oldtype,
{
tree old_fn = OVL_CURRENT (tmp1);
- if (new_fn == old_fn)
- /* The function already exists in the current namespace. */
- break;
+ if (new_fn == old_fn)
+ /* The function already exists in the current namespace. */
+ break;
else if (OVL_USED (tmp1))
- continue; /* this is a using decl */
+ continue; /* this is a using decl */
else if (compparms (TYPE_ARG_TYPES (TREE_TYPE (new_fn)),
- TYPE_ARG_TYPES (TREE_TYPE (old_fn))))
+ TYPE_ARG_TYPES (TREE_TYPE (old_fn))))
{
gcc_assert (!DECL_ANTICIPATED (old_fn));
- /* There was already a non-using declaration in
+ /* There was already a non-using declaration in
this scope with the same parameter types. If both
- are the same extern "C" functions, that's ok. */
- if (decls_match (new_fn, old_fn))
+ are the same extern "C" functions, that's ok. */
+ if (decls_match (new_fn, old_fn))
break;
else
- {
+ {
error ("%qD is already declared in this scope", name);
break;
}
@@ -2096,7 +2094,7 @@ do_nonmember_using_decl (tree scope, tree name, tree oldval, tree oldtype,
scope. */
if (tmp1)
continue;
-
+
/* If we are adding to an existing OVERLOAD, then we no
longer know the type of the set of functions. */
if (*newval && TREE_CODE (*newval) == OVERLOAD)
@@ -2115,7 +2113,7 @@ do_nonmember_using_decl (tree scope, tree name, tree oldval, tree oldtype,
OVL_USED (*newval) = 1;
}
}
- else
+ else
{
*newval = decls.value;
if (oldval && !decls_match (*newval, oldval))
@@ -2126,7 +2124,7 @@ do_nonmember_using_decl (tree scope, tree name, tree oldval, tree oldtype,
if (oldtype && *newtype && !same_type_p (oldtype, *newtype))
{
error ("using declaration %qD introduced ambiguous type %qT",
- name, oldtype);
+ name, oldtype);
return;
}
}
@@ -2166,9 +2164,9 @@ do_local_using_decl (tree decl, tree scope, tree name)
term = OVL_FUNCTION (oldval);
else
term = oldval;
- for (fn = newval; fn && OVL_CURRENT (fn) != term;
+ for (fn = newval; fn && OVL_CURRENT (fn) != term;
fn = OVL_NEXT (fn))
- push_overloaded_decl (OVL_CURRENT (fn),
+ push_overloaded_decl (OVL_CURRENT (fn),
PUSH_LOCAL | PUSH_USING);
}
else
@@ -2196,7 +2194,7 @@ is_ancestor (tree root, tree child)
|| CLASS_TYPE_P (root)));
gcc_assert ((TREE_CODE (child) == NAMESPACE_DECL
|| CLASS_TYPE_P (child)));
-
+
/* The global namespace encloses everything. */
if (root == global_namespace)
return true;
@@ -2301,7 +2299,7 @@ push_inner_scope_r (tree outer, tree inner)
pushing name into scope. In case a template parameter scope is present,
namespace is pushed under the template parameter scope according to
name lookup rule in 14.6.1/6.
-
+
Return the former current scope suitable for pop_inner_scope. */
tree
@@ -2517,7 +2515,7 @@ get_class_binding (tree name, cxx_scope *scope)
;
else if (value_binding)
{
- if (TREE_CODE (value_binding) == TREE_LIST
+ if (TREE_CODE (value_binding) == TREE_LIST
&& TREE_TYPE (value_binding) == error_mark_node)
/* NAME is ambiguous. */
;
@@ -2530,8 +2528,8 @@ get_class_binding (tree name, cxx_scope *scope)
new binding object. */
if (type_binding || value_binding)
{
- binding = new_class_binding (name,
- value_binding,
+ binding = new_class_binding (name,
+ value_binding,
type_binding,
scope);
/* This is a class-scope binding, not a block-scope binding. */
@@ -2543,7 +2541,7 @@ get_class_binding (tree name, cxx_scope *scope)
return binding;
}
-
+
/* Make the declaration(s) of X appear in CLASS scope under the name
NAME. Returns true if the binding is valid. */
@@ -2565,7 +2563,7 @@ push_class_level_binding (tree name, tree x)
/* We could have been passed a tree list if this is an ambiguous
declaration. If so, pull the declaration out because
check_template_shadow will not handle a TREE_LIST. */
- if (TREE_CODE (decl) == TREE_LIST
+ if (TREE_CODE (decl) == TREE_LIST
&& TREE_TYPE (decl) == error_mark_node)
decl = TREE_VALUE (decl);
@@ -2631,9 +2629,9 @@ push_class_level_binding (tree name, tree x)
if (INHERITED_VALUE_BINDING_P (binding))
{
/* If the old binding was from a base class, and was for a
- tag name, slide it over to make room for the new binding.
- The old binding is still visible if explicitly qualified
- with a class-key. */
+ tag name, slide it over to make room for the new binding.
+ The old binding is still visible if explicitly qualified
+ with a class-key. */
if (TREE_CODE (bval) == TYPE_DECL && DECL_ARTIFICIAL (bval)
&& !(TREE_CODE (x) == TYPE_DECL && DECL_ARTIFICIAL (x)))
{
@@ -2692,35 +2690,80 @@ push_class_level_binding (tree name, tree x)
tree
do_class_using_decl (tree scope, tree name)
{
- tree value, type;
-
+ tree value, decl, binfo;
+ base_kind b_kind;
+ bool dependent_p;
+
if (!scope || !TYPE_P (scope))
{
error ("using-declaration for non-member at class scope");
return NULL_TREE;
}
- if (TREE_CODE (name) == BIT_NOT_EXPR)
+
+ /* Make sure the scope is a base. */
+ dependent_p = dependent_type_p (scope);
+ if (!dependent_p)
+ binfo = lookup_base (current_class_type, scope, ba_any, &b_kind);
+ else
{
- error ("using-declaration cannot name destructor");
+ binfo = NULL;
+ if (same_type_p (current_class_type, scope))
+ b_kind = bk_same_type;
+ else
+ b_kind = bk_proper_base;
+ }
+
+ if (b_kind < bk_proper_base)
+ {
+ error_not_base_type (scope, current_class_type);
return NULL_TREE;
}
- gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
+ /* Make sure the name is not invalid */
+ if (TREE_CODE (name) == BIT_NOT_EXPR)
+ {
+ error ("%<%T::%D%> names destructor", scope, name);
+ return NULL_TREE;
+ }
+ if (constructor_name_p (name, scope))
+ {
+ error ("%<%T::%D%> names constructor", scope, name);
+ return NULL_TREE;
+ }
+ if (constructor_name_p (name, current_class_type))
+ {
+ error ("%<%T::%D%> names constructor in %qT",
+ scope, name, current_class_type);
+ return NULL_TREE;
+ }
- /* Dependent using decls have a NULL type, non-dependent ones have a
- void type. */
- type = dependent_type_p (scope) ? NULL_TREE : void_type_node;
- value = build_lang_decl (USING_DECL, name, type);
- DECL_INITIAL (value) = scope;
+ if (!dependent_p
+ && IDENTIFIER_OPNAME_P (name) && dependent_type_p (TREE_TYPE (name)))
+ dependent_p = 1;
- if (scope && !processing_template_decl)
+ /* See if there are any members of the base. */
+ if (!dependent_p)
{
- tree r;
+ decl = lookup_member (binfo, name, 0, false);
+
+ if (!decl)
+ {
+ error ("no members matching %<%T::%D%> in %q#T", scope, name, scope);
+ return NULL_TREE;
+ }
+
+ if (BASELINK_P (decl))
+ /* Ignore base type this came from. */
+ decl = BASELINK_FUNCTIONS (decl);
+ }
+ else
+ decl = NULL_TREE;
+
+ value = build_lang_decl (USING_DECL, name, NULL_TREE);
+ USING_DECL_DECLS (value) = decl;
+ USING_DECL_SCOPE (value) = scope;
+ DECL_DEPENDENT_P (value) = dependent_p;
- r = lookup_qualified_name (scope, name, false, false);
- if (r && (DECL_P (r) || TREE_CODE (r) == OVERLOAD))
- cp_emit_debug_info_for_using (r, scope);
- }
return value;
}
@@ -2768,18 +2811,18 @@ void
set_decl_namespace (tree decl, tree scope, bool friendp)
{
tree old;
-
+
/* Get rid of namespace aliases. */
scope = ORIGINAL_NAMESPACE (scope);
-
+
/* It is ok for friends to be qualified in parallel space. */
if (!friendp && !is_ancestor (current_namespace, scope))
error ("declaration of %qD not in a namespace surrounding %qD",
- decl, scope);
+ decl, scope);
DECL_CONTEXT (decl) = FROB_CONTEXT (scope);
- /* Writing "int N::i" to declare a variable within "N" is invalid. */
- if (scope == current_namespace)
+ /* Writing "int N::i" to declare a variable within "N" is invalid. */
+ if (scope == current_namespace)
{
if (at_namespace_scope_p ())
error ("explicit qualification in declaration of `%D'",
@@ -2819,7 +2862,7 @@ set_decl_namespace (tree decl, tree scope, bool friendp)
return;
complain:
error ("%qD should have been declared inside %qD", decl, scope);
-}
+}
/* Return the namespace where the current declaration is declared. */
@@ -2835,7 +2878,7 @@ current_decl_namespace (void)
result = decl_namespace_context (current_class_type);
else if (current_function_decl)
result = decl_namespace_context (current_function_decl);
- else
+ else
result = current_namespace;
return result;
}
@@ -2852,7 +2895,7 @@ push_namespace (tree name)
bool anon = !name;
timevar_push (TV_NAME_LOOKUP);
-
+
/* We should not get here if the global_namespace is not yet constructed
nor if NAME designates the global namespace: The global scope is
constructed elsewhere. */
@@ -2861,14 +2904,14 @@ push_namespace (tree name)
if (anon)
{
/* The name of anonymous namespace is unique for the translation
- unit. */
+ unit. */
if (!anonymous_namespace_name)
- anonymous_namespace_name = get_file_function_name ('N');
+ anonymous_namespace_name = get_file_function_name ('N');
name = anonymous_namespace_name;
d = IDENTIFIER_NAMESPACE_VALUE (name);
if (d)
- /* Reopening anonymous namespace. */
- need_new = 0;
+ /* Reopening anonymous namespace. */
+ need_new = 0;
implicit_use = 1;
}
else
@@ -2876,15 +2919,15 @@ push_namespace (tree name)
/* Check whether this is an extended namespace definition. */
d = IDENTIFIER_NAMESPACE_VALUE (name);
if (d != NULL_TREE && TREE_CODE (d) == NAMESPACE_DECL)
- {
- need_new = 0;
- if (DECL_NAMESPACE_ALIAS (d))
- {
- error ("namespace alias %qD not allowed here, assuming %qD",
- d, DECL_NAMESPACE_ALIAS (d));
- d = DECL_NAMESPACE_ALIAS (d);
- }
- }
+ {
+ need_new = 0;
+ if (DECL_NAMESPACE_ALIAS (d))
+ {
+ error ("namespace alias %qD not allowed here, assuming %qD",
+ d, DECL_NAMESPACE_ALIAS (d));
+ d = DECL_NAMESPACE_ALIAS (d);
+ }
+ }
}
if (need_new)
@@ -2963,7 +3006,7 @@ push_decl_namespace (tree decl)
if (TREE_CODE (decl) != NAMESPACE_DECL)
decl = decl_namespace_context (decl);
decl_namespace_list = tree_cons (ORIGINAL_NAMESPACE (decl),
- NULL_TREE, decl_namespace_list);
+ NULL_TREE, decl_namespace_list);
}
/* [namespace.memdef]/2 */
@@ -2974,7 +3017,7 @@ pop_decl_namespace (void)
decl_namespace_list = TREE_CHAIN (decl_namespace_list);
}
-/* Return the namespace that is the common ancestor
+/* Return the namespace that is the common ancestor
of two given namespaces. */
static tree
@@ -2984,7 +3027,7 @@ namespace_ancestor (tree ns1, tree ns2)
if (is_ancestor (ns1, ns2))
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, ns1);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP,
- namespace_ancestor (CP_DECL_CONTEXT (ns1), ns2));
+ namespace_ancestor (CP_DECL_CONTEXT (ns1), ns2));
}
/* Process a namespace-alias declaration. */
@@ -3002,7 +3045,7 @@ do_namespace_alias (tree alias, tree namespace)
namespace = ORIGINAL_NAMESPACE (namespace);
/* Build the alias. */
- alias = build_lang_decl (NAMESPACE_DECL, alias, void_type_node);
+ alias = build_lang_decl (NAMESPACE_DECL, alias, void_type_node);
DECL_NAMESPACE_ALIAS (alias) = namespace;
DECL_EXTERNAL (alias) = 1;
DECL_CONTEXT (alias) = FROB_CONTEXT (current_scope ());
@@ -3032,28 +3075,28 @@ pushdecl_namespace_level (tree x)
tree newval;
tree *ptr = (tree *)0;
for (; !global_scope_p (b); b = b->level_chain)
- {
- tree shadowed = b->type_shadowed;
- for (; shadowed; shadowed = TREE_CHAIN (shadowed))
- if (TREE_PURPOSE (shadowed) == name)
- {
+ {
+ tree shadowed = b->type_shadowed;
+ for (; shadowed; shadowed = TREE_CHAIN (shadowed))
+ if (TREE_PURPOSE (shadowed) == name)
+ {
ptr = &TREE_VALUE (shadowed);
/* Can't break out of the loop here because sometimes
a binding level will have duplicate bindings for
PT names. It's gross, but I haven't time to fix it. */
- }
- }
+ }
+ }
newval = TREE_TYPE (t);
if (ptr == (tree *)0)
- {
- /* @@ This shouldn't be needed. My test case "zstring.cc" trips
- up here if this is changed to an assertion. --KR */
+ {
+ /* @@ This shouldn't be needed. My test case "zstring.cc" trips
+ up here if this is changed to an assertion. --KR */
SET_IDENTIFIER_TYPE_VALUE (name, t);
}
else
- {
+ {
*ptr = newval;
- }
+ }
}
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, t);
}
@@ -3061,7 +3104,7 @@ pushdecl_namespace_level (tree x)
/* Insert USED into the using list of USER. Set INDIRECT_flag if this
directive is not directly from the source. Also find the common
ancestor and let our users know about the new namespace */
-static void
+static void
add_using_namespace (tree user, tree used, bool indirect)
{
tree t;
@@ -3086,8 +3129,8 @@ add_using_namespace (tree user, tree used, bool indirect)
}
/* Add used to the user's using list. */
- DECL_NAMESPACE_USING (user)
- = tree_cons (used, namespace_ancestor (user, used),
+ DECL_NAMESPACE_USING (user)
+ = tree_cons (used, namespace_ancestor (user, used),
DECL_NAMESPACE_USING (user));
TREE_INDIRECT_USING (DECL_NAMESPACE_USING (user)) = indirect;
@@ -3119,7 +3162,7 @@ do_toplevel_using_decl (tree decl, tree scope, tree name)
decl = validate_nonmember_using_decl (decl, scope, name);
if (decl == NULL_TREE)
return;
-
+
binding = binding_for_name (NAMESPACE_LEVEL (current_namespace), name);
oldval = binding->value;
@@ -3148,7 +3191,7 @@ do_using_directive (tree namespace)
if (building_stmt_tree ())
add_stmt (build_stmt (USING_STMT, namespace));
-
+
/* using namespace A::B::C; */
if (TREE_CODE (namespace) == SCOPE_REF)
namespace = TREE_OPERAND (namespace, 1);
@@ -3178,7 +3221,7 @@ do_using_directive (tree namespace)
if (current_namespace != global_namespace)
context = current_namespace;
}
-
+
/* Emit debugging info. */
if (!processing_template_decl)
(*debug_hooks->imported_module_or_decl) (namespace, context);
@@ -3207,7 +3250,7 @@ parse_using_directive (tree namespace, tree attribs)
DECL_NAMESPACE_ASSOCIATIONS (namespace));
}
else
- warning (0, "%qD attribute directive ignored", name);
+ warning (OPT_Wattributes, "%qD attribute directive ignored", name);
}
}
@@ -3268,12 +3311,12 @@ merge_functions (tree s1, tree s2)
need to add it again. For `extern "C"' functions, we
might have two FUNCTION_DECLs for the same function, in
different namespaces; again, we only need one of them. */
- if (fn1 == fn2
+ if (fn1 == fn2
|| (DECL_EXTERN_C_P (fn1) && DECL_EXTERN_C_P (fn2)
&& DECL_NAME (fn1) == DECL_NAME (fn2)))
break;
}
-
+
/* If we exhausted all of the functions in S1, FN2 is new. */
if (!fns1)
s1 = build_overload (fn2, s1);
@@ -3301,42 +3344,42 @@ ambiguous_decl (tree name, struct scope_binding *old, cxx_binding *new,
switch (TREE_CODE (val))
{
case TEMPLATE_DECL:
- /* If we expect types or namespaces, and not templates,
- or this is not a template class. */
- if ((LOOKUP_QUALIFIERS_ONLY (flags)
+ /* If we expect types or namespaces, and not templates,
+ or this is not a template class. */
+ if ((LOOKUP_QUALIFIERS_ONLY (flags)
&& !DECL_CLASS_TEMPLATE_P (val))
|| hidden_name_p (val))
- val = NULL_TREE;
- break;
+ val = NULL_TREE;
+ break;
case TYPE_DECL:
- if (LOOKUP_NAMESPACES_ONLY (flags) || hidden_name_p (val))
- val = NULL_TREE;
- break;
+ if (LOOKUP_NAMESPACES_ONLY (flags) || hidden_name_p (val))
+ val = NULL_TREE;
+ break;
case NAMESPACE_DECL:
- if (LOOKUP_TYPES_ONLY (flags))
- val = NULL_TREE;
- break;
+ if (LOOKUP_TYPES_ONLY (flags))
+ val = NULL_TREE;
+ break;
case FUNCTION_DECL:
- /* Ignore built-in functions that are still anticipated. */
- if (LOOKUP_QUALIFIERS_ONLY (flags) || hidden_name_p (val))
- val = NULL_TREE;
- break;
+ /* Ignore built-in functions that are still anticipated. */
+ if (LOOKUP_QUALIFIERS_ONLY (flags) || hidden_name_p (val))
+ val = NULL_TREE;
+ break;
default:
- if (LOOKUP_QUALIFIERS_ONLY (flags))
- val = NULL_TREE;
+ if (LOOKUP_QUALIFIERS_ONLY (flags))
+ val = NULL_TREE;
}
-
+
if (!old->value)
old->value = val;
else if (val && val != old->value)
{
if (is_overloaded_fn (old->value) && is_overloaded_fn (val))
- old->value = merge_functions (old->value, val);
+ old->value = merge_functions (old->value, val);
else
{
/* Some declarations are functions, some are not. */
- if (flags & LOOKUP_COMPLAIN)
- {
+ if (flags & LOOKUP_COMPLAIN)
+ {
/* If we've already given this error for this lookup,
old->value is error_mark_node, so let's not
repeat ourselves. */
@@ -3345,8 +3388,8 @@ ambiguous_decl (tree name, struct scope_binding *old, cxx_binding *new,
error ("use of %qD is ambiguous", name);
cp_error_at (" first declared as %q#D here", old->value);
}
- cp_error_at (" also declared as %q#D here", val);
- }
+ cp_error_at (" also declared as %q#D here", val);
+ }
old->value = error_mark_node;
}
}
@@ -3359,11 +3402,11 @@ ambiguous_decl (tree name, struct scope_binding *old, cxx_binding *new,
else if (type && old->type != type)
{
if (flags & LOOKUP_COMPLAIN)
- {
- error ("%qD denotes an ambiguous type",name);
- error ("%J first type here", TYPE_MAIN_DECL (old->type));
- error ("%J other type here", TYPE_MAIN_DECL (type));
- }
+ {
+ error ("%qD denotes an ambiguous type",name);
+ error ("%J first type here", TYPE_MAIN_DECL (old->type));
+ error ("%J other type here", TYPE_MAIN_DECL (type));
+ }
}
}
@@ -3408,7 +3451,7 @@ qualify_lookup (tree val, int flags)
return true;
}
-/* Given a lookup that returned VAL, decide if we want to ignore it or
+/* Given a lookup that returned VAL, decide if we want to ignore it or
not based on DECL_ANTICIPATED_P. */
bool
@@ -3473,7 +3516,7 @@ lookup_namespace_name (tree namespace, tree name)
/*in_decl=*/NULL_TREE,
/*context=*/NULL_TREE,
/*entering_scope=*/0,
- tf_error | tf_warning);
+ tf_error | tf_warning);
else if (DECL_FUNCTION_TEMPLATE_P (val)
|| TREE_CODE (val) == OVERLOAD)
val = lookup_template_function (val,
@@ -3492,7 +3535,7 @@ lookup_namespace_name (tree namespace, tree name)
/* Ignore built-in functions and friends that haven't been declared
yet. */
if (!val || !hidden_name_p (val))
- POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, val);
+ POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, val);
}
error ("%qD undeclared in namespace %qD", name, namespace);
@@ -3512,7 +3555,7 @@ select_decl (const struct scope_binding *binding, int flags)
{
/* We are not interested in types. */
if (val && TREE_CODE (val) == NAMESPACE_DECL)
- POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, val);
+ POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, val);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE);
}
@@ -3521,7 +3564,7 @@ select_decl (const struct scope_binding *binding, int flags)
if (binding->type && (!val || (flags & LOOKUP_PREFER_TYPES)))
val = binding->type;
/* Don't return non-types if we really prefer types. */
- else if (val && LOOKUP_TYPES_ONLY (flags)
+ else if (val && LOOKUP_TYPES_ONLY (flags)
&& ! DECL_DECLARES_TYPE_P (val))
val = NULL_TREE;
@@ -3546,7 +3589,7 @@ unqualified_namespace_lookup (tree name, int flags)
for (; !val; scope = CP_DECL_CONTEXT (scope))
{
cxx_binding *b =
- cxx_scope_find_binding_for_name (NAMESPACE_LEVEL (scope), name);
+ cxx_scope_find_binding_for_name (NAMESPACE_LEVEL (scope), name);
if (b)
{
@@ -3563,7 +3606,7 @@ unqualified_namespace_lookup (tree name, int flags)
level->kind != sk_namespace;
level = level->level_chain)
if (!lookup_using_namespace (name, &binding, level->using_directives,
- scope, flags))
+ scope, flags))
/* Give up because of error. */
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
@@ -3573,7 +3616,7 @@ unqualified_namespace_lookup (tree name, int flags)
while (1)
{
if (!lookup_using_namespace (name, &binding,
- DECL_NAMESPACE_USING (siter),
+ DECL_NAMESPACE_USING (siter),
scope, flags))
/* Give up because of error. */
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
@@ -3590,7 +3633,7 @@ unqualified_namespace_lookup (tree name, int flags)
/* Look up NAME (an IDENTIFIER_NODE) in SCOPE (either a NAMESPACE_DECL
or a class TYPE). If IS_TYPE_P is TRUE, then ignore non-type
- bindings.
+ bindings.
Returns a DECL (or OVERLOAD, or BASELINK) representing the
declaration found. If no suitable declaration can be found,
@@ -3641,12 +3684,12 @@ lookup_using_namespace (tree name, struct scope_binding *val,
for (iter = usings; iter; iter = TREE_CHAIN (iter))
if (TREE_VALUE (iter) == scope)
{
- tree used = ORIGINAL_NAMESPACE (TREE_PURPOSE (iter));
- cxx_binding *val1 =
- cxx_scope_find_binding_for_name (NAMESPACE_LEVEL (used), name);
- /* Resolve ambiguities. */
- if (val1)
- ambiguous_decl (name, val, val1, flags);
+ tree used = ORIGINAL_NAMESPACE (TREE_PURPOSE (iter));
+ cxx_binding *val1 =
+ cxx_scope_find_binding_for_name (NAMESPACE_LEVEL (used), name);
+ /* Resolve ambiguities. */
+ if (val1)
+ ambiguous_decl (name, val, val1, flags);
}
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, val->value != error_mark_node);
}
@@ -3675,7 +3718,7 @@ qualified_lookup_using_namespace (tree name, tree scope,
cxx_scope_find_binding_for_name (NAMESPACE_LEVEL (scope), name);
seen = tree_cons (scope, NULL_TREE, seen);
if (binding)
- ambiguous_decl (name, result, binding, flags);
+ ambiguous_decl (name, result, binding, flags);
/* Consider strong using directives always, and non-strong ones
if we haven't found a binding yet. ??? Shouldn't we consider
@@ -3725,7 +3768,7 @@ qualified_lookup_using_namespace (tree name, tree scope,
CLASS_P is false, then class bindings are ignored. */
cxx_binding *
-outer_binding (tree name,
+outer_binding (tree name,
cxx_binding *binding,
bool class_p)
{
@@ -3752,10 +3795,10 @@ outer_binding (tree name,
if (class_p)
while (scope && scope != outer_scope && scope->kind != sk_namespace)
{
- if (scope->kind == sk_class)
+ if (scope->kind == sk_class)
{
cxx_binding *class_binding;
-
+
class_binding = get_class_binding (name, scope);
if (class_binding)
{
@@ -3813,22 +3856,22 @@ lookup_name_real (tree name, int prefer_type, int nonclass, bool block_p,
/* Conversion operators are handled specially because ordinary
unqualified name lookup will not find template conversion
operators. */
- if (IDENTIFIER_TYPENAME_P (name))
+ if (IDENTIFIER_TYPENAME_P (name))
{
struct cp_binding_level *level;
- for (level = current_binding_level;
+ for (level = current_binding_level;
level && level->kind != sk_namespace;
level = level->level_chain)
{
tree class_type;
tree operators;
-
- /* A conversion operator can only be declared in a class
+
+ /* A conversion operator can only be declared in a class
scope. */
if (level->kind != sk_class)
continue;
-
+
/* Lookup the conversion operator in the class. */
class_type = level->this_entity;
operators = lookup_fnfields (class_type, name, /*protect=*/0);
@@ -3852,11 +3895,11 @@ lookup_name_real (tree name, int prefer_type, int nonclass, bool block_p,
iter = outer_binding (name, iter, !nonclass))
{
tree binding;
-
+
/* Skip entities we don't want. */
if (LOCAL_BINDING_P (iter) ? !block_p : nonclass)
continue;
-
+
/* If this is the kind of thing we're looking for, we're done. */
if (qualify_lookup (iter->value, flags)
&& !hidden_name_p (iter->value))
@@ -3867,7 +3910,7 @@ lookup_name_real (tree name, int prefer_type, int nonclass, bool block_p,
binding = iter->type;
else
binding = NULL_TREE;
-
+
if (binding)
{
val = binding;
@@ -3898,9 +3941,9 @@ lookup_name_nonclass (tree name)
tree
lookup_function_nonclass (tree name, tree args, bool block_p)
{
- return
- lookup_arg_dependent (name,
- lookup_name_real (name, 0, 1, block_p, 0,
+ return
+ lookup_arg_dependent (name,
+ lookup_name_real (name, 0, 1, block_p, 0,
LOOKUP_COMPLAIN),
args);
}
@@ -3908,7 +3951,7 @@ lookup_function_nonclass (tree name, tree args, bool block_p)
tree
lookup_name (tree name, int prefer_type)
{
- return lookup_name_real (name, prefer_type, 0, /*block_p=*/true,
+ return lookup_name_real (name, prefer_type, 0, /*block_p=*/true,
0, LOOKUP_COMPLAIN);
}
@@ -3921,7 +3964,7 @@ lookup_name (tree name, int prefer_type)
Unlike lookup_name_real, we make sure that NAME is actually
declared in the desired scope, not from inheritance, nor using
directive. For using declaration, there is DR138 still waiting
- to be resolved. Hidden name coming from earlier an friend
+ to be resolved. Hidden name coming from earlier an friend
declaration is also returned.
A TYPE_DECL best matching the NAME is returned. Catching error
@@ -3941,9 +3984,9 @@ lookup_type_scope (tree name, tag_scope scope)
for (; iter; iter = outer_binding (name, iter, /*class_p=*/ true))
{
/* Check if this is the kind of thing we're looking for.
- If SCOPE is TS_CURRENT, also make sure it doesn't come from
+ If SCOPE is TS_CURRENT, also make sure it doesn't come from
base class. For ITER->VALUE, we can simply use
- INHERITED_VALUE_BINDING_P. For ITER->TYPE, we have to use
+ INHERITED_VALUE_BINDING_P. For ITER->TYPE, we have to use
our own check.
We check ITER->TYPE before ITER->VALUE in order to handle
@@ -3978,7 +4021,7 @@ lookup_type_scope (tree name, tag_scope scope)
else if (qualify_lookup (iter->value, LOOKUP_PREFER_TYPES))
val = iter->value;
}
-
+
}
/* Type found, check if it is in the allowed scopes, ignoring cleanup
@@ -4064,7 +4107,7 @@ lookup_type_current_level (tree name)
{
if (purpose_member (name, b->type_shadowed))
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP,
- REAL_IDENTIFIER_TYPE_VALUE (name));
+ REAL_IDENTIFIER_TYPE_VALUE (name));
if (b->kind == sk_cleanup)
b = b->level_chain;
else
@@ -4108,7 +4151,7 @@ add_function (struct arg_lookup *k, tree fn)
case. */
/* We must find only functions, or exactly one non-function. */
- if (!k->functions)
+ if (!k->functions)
k->functions = fn;
else if (fn == k->functions)
;
@@ -4176,7 +4219,7 @@ arg_assoc_namespace (struct arg_lookup *k, tree scope)
value = TREE_CHAIN (value))
if (arg_assoc_namespace (k, TREE_PURPOSE (value)))
return true;
-
+
value = namespace_binding (k->name, scope);
if (!value)
return false;
@@ -4184,7 +4227,7 @@ arg_assoc_namespace (struct arg_lookup *k, tree scope)
for (; value; value = OVL_NEXT (value))
if (add_function (k, OVL_CURRENT (value)))
return true;
-
+
return false;
}
@@ -4215,10 +4258,10 @@ arg_assoc_template_arg (struct arg_lookup *k, tree arg)
/* It's not a member template. */
if (TREE_CODE (ctx) == NAMESPACE_DECL)
- return arg_assoc_namespace (k, ctx);
+ return arg_assoc_namespace (k, ctx);
/* Otherwise, it must be member template. */
- else
- return arg_assoc_class (k, ctx);
+ else
+ return arg_assoc_class (k, ctx);
}
/* It's not a template template argument, but it is a type template
argument. */
@@ -4237,7 +4280,7 @@ arg_assoc_class (struct arg_lookup *k, tree type)
{
tree list, friends, context;
int i;
-
+
/* Backend build structures, such as __builtin_va_list, aren't
affected by all this. */
if (!CLASS_TYPE_P (type))
@@ -4246,7 +4289,7 @@ arg_assoc_class (struct arg_lookup *k, tree type)
if (purpose_member (type, k->classes))
return false;
k->classes = tree_cons (type, NULL_TREE, k->classes);
-
+
context = decl_namespace_context (type);
if (arg_assoc_namespace (k, context))
return true;
@@ -4255,18 +4298,18 @@ arg_assoc_class (struct arg_lookup *k, tree type)
{
/* Process baseclasses. */
tree binfo, base_binfo;
-
+
for (binfo = TYPE_BINFO (type), i = 0;
BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
if (arg_assoc_class (k, BINFO_TYPE (base_binfo)))
return true;
}
-
+
/* Process friends. */
- for (list = DECL_FRIENDLIST (TYPE_MAIN_DECL (type)); list;
+ for (list = DECL_FRIENDLIST (TYPE_MAIN_DECL (type)); list;
list = TREE_CHAIN (list))
if (k->name == FRIEND_NAME (list))
- for (friends = FRIEND_DECLS (list); friends;
+ for (friends = FRIEND_DECLS (list); friends;
friends = TREE_CHAIN (friends))
{
tree fn = TREE_VALUE (friends);
@@ -4285,12 +4328,12 @@ arg_assoc_class (struct arg_lookup *k, tree type)
}
/* Process template arguments. */
- if (CLASSTYPE_TEMPLATE_INFO (type)
+ if (CLASSTYPE_TEMPLATE_INFO (type)
&& PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (type)))
{
list = INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (type));
- for (i = 0; i < TREE_VEC_LENGTH (list); ++i)
- arg_assoc_template_arg (k, TREE_VEC_ELT (list, i));
+ for (i = 0; i < TREE_VEC_LENGTH (list); ++i)
+ arg_assoc_template_arg (k, TREE_VEC_ELT (list, i));
}
return false;
@@ -4411,8 +4454,8 @@ arg_assoc (struct arg_lookup *k, tree n)
int ix;
if (TREE_CODE (template) == COMPONENT_REF)
- template = TREE_OPERAND (template, 1);
-
+ template = TREE_OPERAND (template, 1);
+
/* First, the template. There may actually be more than one if
this is an overloaded function template. But, in that case,
we only need the first; all the functions will be in the same
@@ -4420,7 +4463,7 @@ arg_assoc (struct arg_lookup *k, tree n)
template = OVL_CURRENT (template);
ctx = CP_DECL_CONTEXT (template);
-
+
if (TREE_CODE (ctx) == NAMESPACE_DECL)
{
if (arg_assoc_namespace (k, ctx) == 1)
@@ -4470,7 +4513,7 @@ lookup_arg_dependent (tree name, tree fns, tree args)
should be visible during argument-dependent lookup. */
if (fns)
fn = OVL_CURRENT (fns);
- if (fn && TREE_CODE (fn) == FUNCTION_DECL
+ if (fn && TREE_CODE (fn) == FUNCTION_DECL
&& (CP_DECL_CONTEXT (fn) != current_decl_namespace ()
|| DECL_LOCAL_FUNCTION_P (fn)))
k.namespaces = NULL_TREE;
@@ -4523,7 +4566,7 @@ push_using_directive (tree used)
static tree
maybe_process_template_type_declaration (tree type, int is_friend,
- cxx_scope *b)
+ cxx_scope *b)
{
tree decl = TYPE_NAME (type);
@@ -4531,7 +4574,7 @@ maybe_process_template_type_declaration (tree type, int is_friend,
/* You can't declare a new template type in a template parameter
list. But, you can declare a non-template type:
- template <class A*> struct S;
+ template <class A*> struct S;
is a forward-declaration of `A'. */
;
@@ -4622,8 +4665,8 @@ pushtag (tree name, tree type, tag_scope scope)
{
/* Do C++ gratuitous typedefing. */
if (IDENTIFIER_TYPE_VALUE (name) != type)
- {
- tree d = NULL_TREE;
+ {
+ tree d = NULL_TREE;
int in_class = 0;
tree context = TYPE_CONTEXT (type);
@@ -4643,7 +4686,7 @@ pushtag (tree name, tree type, tag_scope scope)
context = current_namespace;
if (b->kind == sk_class
- || (b->kind == sk_template_parms
+ || (b->kind == sk_template_parms
&& b->level_chain->kind == sk_class))
in_class = 1;
@@ -4699,10 +4742,9 @@ pushtag (tree name, tree type, tag_scope scope)
way. (It's otherwise tricky to find a member function definition
it's only pointed to from within a local class.) */
if (TYPE_CONTEXT (type)
- && TREE_CODE (TYPE_CONTEXT (type)) == FUNCTION_DECL
- && !processing_template_decl)
+ && TREE_CODE (TYPE_CONTEXT (type)) == FUNCTION_DECL)
VEC_safe_push (tree, gc, local_classes, type);
- }
+ }
if (b->kind == sk_class
&& !COMPLETE_TYPE_P (current_class_type))
{
@@ -4757,7 +4799,7 @@ store_binding (tree id, VEC(cxx_saved_binding,gc) **old_bindings)
if (IDENTIFIER_MARKED (id))
return;
-
+
IDENTIFIER_MARKED (id) = 1;
saved = VEC_safe_push (cxx_saved_binding, gc, *old_bindings, NULL);
@@ -4791,7 +4833,7 @@ store_bindings (tree names, VEC(cxx_saved_binding,gc) **old_bindings)
objects, rather than a TREE_LIST. */
static void
-store_class_bindings (VEC(cp_class_binding,gc) *names,
+store_class_bindings (VEC(cp_class_binding,gc) *names,
VEC(cxx_saved_binding,gc) **old_bindings)
{
size_t i;
@@ -4877,7 +4919,7 @@ pop_from_top_level (void)
cxx_saved_binding *saved;
size_t i;
- timevar_push (TV_NAME_LOOKUP);
+ timevar_push (TV_NAME_LOOKUP);
/* Clear out class-level bindings cache. */
if (previous_class_level)
invalidate_class_lookup_cache ();
@@ -4922,15 +4964,15 @@ pop_everything (void)
}
/* Emit debugging information for using declarations and directives.
- If input tree is overloaded fn then emit debug info for all
+ If input tree is overloaded fn then emit debug info for all
candidates. */
-static void
+void
cp_emit_debug_info_for_using (tree t, tree context)
{
- /* Ignore this FUNCTION_DECL if it refers to a builtin declaration
+ /* Ignore this FUNCTION_DECL if it refers to a builtin declaration
of a builtin function. */
- if (TREE_CODE (t) == FUNCTION_DECL
+ if (TREE_CODE (t) == FUNCTION_DECL
&& DECL_EXTERNAL (t)
&& DECL_BUILT_IN (t))
return;
@@ -4939,14 +4981,14 @@ cp_emit_debug_info_for_using (tree t, tree context)
it is a global namespace. */
if (context == global_namespace)
context = NULL_TREE;
-
+
if (BASELINK_P (t))
t = BASELINK_FUNCTIONS (t);
-
+
/* FIXME: Handle TEMPLATE_DECLs. */
for (t = OVL_CURRENT (t); t; t = OVL_NEXT (t))
if (TREE_CODE (t) != TEMPLATE_DECL)
(*debug_hooks->imported_module_or_decl) (t, context);
- }
+}
#include "gt-cp-name-lookup.h"
diff --git a/gcc/cp/name-lookup.h b/gcc/cp/name-lookup.h
index 19bcec0eba6..72472337c7d 100644
--- a/gcc/cp/name-lookup.h
+++ b/gcc/cp/name-lookup.h
@@ -40,11 +40,11 @@ struct binding_entry_s GTY(())
};
/* These macros indicate the initial chains count for binding_table. */
-#define SCOPE_DEFAULT_HT_SIZE (1 << 3)
-#define CLASS_SCOPE_HT_SIZE (1 << 3)
-#define NAMESPACE_ORDINARY_HT_SIZE (1 << 5)
-#define NAMESPACE_STD_HT_SIZE (1 << 8)
-#define GLOBAL_SCOPE_HT_SIZE (1 << 8)
+#define SCOPE_DEFAULT_HT_SIZE (1 << 3)
+#define CLASS_SCOPE_HT_SIZE (1 << 3)
+#define NAMESPACE_ORDINARY_HT_SIZE (1 << 5)
+#define NAMESPACE_STD_HT_SIZE (1 << 8)
+#define GLOBAL_SCOPE_HT_SIZE (1 << 8)
extern void binding_table_foreach (binding_table, bt_foreach_proc, void *);
extern binding_entry binding_table_find (binding_table, tree);
@@ -105,16 +105,16 @@ typedef enum scope_kind {
is initialized by using "memset" to set the
contents to zero, and the default scope kind
is "sk_block". */
- sk_cleanup, /* A scope for (pseudo-)scope for cleanup. It is
- peusdo in that it is transparent to name lookup
- activities. */
+ sk_cleanup, /* A scope for (pseudo-)scope for cleanup. It is
+ peusdo in that it is transparent to name lookup
+ activities. */
sk_try, /* A try-block. */
- sk_catch, /* A catch-block. */
- sk_for, /* The scope of the variable declared in a
+ sk_catch, /* A catch-block. */
+ sk_for, /* The scope of the variable declared in a
for-init-statement. */
sk_function_parms, /* The scope containing function parameters. */
- sk_class, /* The scope containing the members of a class. */
- sk_namespace, /* The scope containing the members of a
+ sk_class, /* The scope containing the members of a class. */
+ sk_namespace, /* The scope containing the members of a
namespace, including the global scope. */
sk_template_parms, /* A scope for template parameters. */
sk_template_spec /* Like sk_template_parms, but for an explicit
@@ -191,7 +191,7 @@ struct cp_binding_level GTY(())
VEC(tree,gc) *static_decls;
/* A chain of VTABLE_DECL nodes. */
- tree vtables;
+ tree vtables;
/* A list of USING_DECL nodes. */
tree usings;
@@ -341,6 +341,7 @@ extern bool is_associated_namespace (tree, tree);
extern void parse_using_directive (tree, tree);
extern tree innermost_non_namespace_value (tree);
extern cxx_binding *outer_binding (tree, cxx_binding *, bool);
+extern void cp_emit_debug_info_for_using (tree, tree);
/* Set *DECL to the (non-hidden) declaration for ID at global scope,
if present and return true; otherwise return false. */
diff --git a/gcc/cp/operators.def b/gcc/cp/operators.def
index 16e603d31bf..845dbbd2de9 100644
--- a/gcc/cp/operators.def
+++ b/gcc/cp/operators.def
@@ -1,11 +1,11 @@
/* -*-C-*-
-
+
This file contains definitions of the various C++ operators,
including both overloadable operators (like `+') and
- non-overloadable operators (like the `?:' ternary operator).
+ non-overloadable operators (like the `?:' ternary operator).
Written by Mark Mitchell <mark@codesourcery.com>
- Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
This file is part of GCC.
@@ -32,7 +32,7 @@ Boston, MA 02111-1307, USA. */
preceding `operator'. This is the name that would be given in
the source program. For `operator +', for example, this would be
`+'.
-
+
CODE
The tree_code for this operator. For `operator +', for example,
@@ -47,7 +47,7 @@ Boston, MA 02111-1307, USA. */
would be "pl".
ARITY
-
+
The arity of the operator, or -1 if any arity is allowed. (As
for `operator ()'.) Postincrement and postdecrement operators
are marked as binary.
@@ -57,12 +57,12 @@ Boston, MA 02111-1307, USA. */
A boolean value. If nonzero, this is an assignment operator.
Before including this file, you should define DEFOPERATOR
- to take these arguments.
+ to take these arguments.
There is code (such as in grok_op_properties) that depends on the
order the operators are presented in this file. In particular,
unary operators must precede binary operators. */
-
+
/* Use DEF_SIMPLE_OPERATOR to define a non-assignment operator. Its
arguments are as for DEF_OPERATOR, but there is no need to provide
an ASSIGNMENT_P argument; it is always zero. */
@@ -84,7 +84,7 @@ DEF_SIMPLE_OPERATOR ("delete", DELETE_EXPR, "dl", -1)
DEF_SIMPLE_OPERATOR ("delete []", VEC_DELETE_EXPR, "da", -1)
/* Unary operators. */
-DEF_SIMPLE_OPERATOR ("+", CONVERT_EXPR, "ps", 1)
+DEF_SIMPLE_OPERATOR ("+", UNARY_PLUS_EXPR, "ps", 1)
DEF_SIMPLE_OPERATOR ("-", NEGATE_EXPR, "ng", 1)
DEF_SIMPLE_OPERATOR ("&", ADDR_EXPR, "ad", 1)
DEF_SIMPLE_OPERATOR ("*", INDIRECT_REF, "de", 1)
diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c
index 7ccfaffbf0d..06eadc1cd5e 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, 2002, 2004
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005
Free Software Foundation, Inc.
Written by Mark Michell (mark@codesourcery.com).
@@ -62,12 +62,13 @@ update_cloned_parm (tree parm, tree cloned_parm)
/* 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. */
DECL_NAME (cloned_parm) = DECL_NAME (parm);
DECL_SOURCE_LOCATION (cloned_parm) = DECL_SOURCE_LOCATION (parm);
+ TREE_TYPE (cloned_parm) = TREE_TYPE (parm);
}
/* FN is a function that has a complete body. Clone the body as
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index b0dee735c48..db3fa63164b 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -93,7 +93,7 @@ typedef struct cp_lexer GTY (())
/* If the lexer owns the buffer, this is the number of tokens in the
buffer. */
size_t buffer_length;
-
+
/* A pointer just past the last available token. The tokens
in this lexer are [buffer, last_token). */
cp_token_position GTY ((skip)) last_token;
@@ -258,13 +258,13 @@ cp_lexer_new_main (void)
/* Allocate the memory. */
lexer = GGC_CNEW (cp_lexer);
-#ifdef ENABLE_CHECKING
+#ifdef ENABLE_CHECKING
/* Initially we are not debugging. */
lexer->debugging_p = false;
#endif /* ENABLE_CHECKING */
lexer->saved_tokens = VEC_alloc (cp_token_position, heap,
CP_SAVED_TOKEN_STACK);
-
+
/* Create the buffer. */
alloc = CP_LEXER_BUFFER_SIZE;
buffer = ggc_alloc (alloc * sizeof (cp_token));
@@ -273,7 +273,7 @@ cp_lexer_new_main (void)
space = alloc;
pos = buffer;
*pos = first_token;
-
+
/* Get the remaining tokens from the preprocessor. */
while (pos->type != CPP_EOF)
{
@@ -316,7 +316,7 @@ cp_lexer_new_from_tokens (cp_token_cache *cache)
lexer->buffer_length = 0;
lexer->next_token = first == last ? (cp_token *)&eof_token : first;
lexer->last_token = last;
-
+
lexer->saved_tokens = VEC_alloc (cp_token_position, heap,
CP_SAVED_TOKEN_STACK);
@@ -356,7 +356,7 @@ static inline cp_token_position
cp_lexer_token_position (cp_lexer *lexer, bool previous_p)
{
gcc_assert (!previous_p || lexer->next_token != &eof_token);
-
+
return lexer->next_token - previous_p;
}
@@ -379,7 +379,7 @@ cp_lexer_saving_tokens (const cp_lexer* lexer)
static void
cp_lexer_get_preprocessor_token (cp_lexer *lexer ATTRIBUTE_UNUSED ,
- cp_token *token)
+ cp_token *token)
{
static int is_extern_c = 0;
@@ -388,7 +388,7 @@ cp_lexer_get_preprocessor_token (cp_lexer *lexer ATTRIBUTE_UNUSED ,
= c_lex_with_flags (&token->value, &token->location, &token->flags);
token->in_system_header = in_system_header;
- /* On some systems, some header files are surrounded by an
+ /* On some systems, some header files are surrounded by an
implicit extern "C" block. Set a flag in the token if it
comes from such a header. */
is_extern_c += pending_lang_change;
@@ -513,7 +513,7 @@ cp_lexer_peek_nth_token (cp_lexer* lexer, size_t n)
token = (cp_token *)&eof_token;
break;
}
-
+
if (token->type != CPP_PURGED)
--n;
}
@@ -536,7 +536,7 @@ cp_lexer_consume_token (cp_lexer* lexer)
cp_token *token = lexer->next_token;
gcc_assert (token != &eof_token);
-
+
do
{
lexer->next_token++;
@@ -545,12 +545,12 @@ cp_lexer_consume_token (cp_lexer* lexer)
lexer->next_token = (cp_token *)&eof_token;
break;
}
-
+
}
while (lexer->next_token->type == CPP_PURGED);
-
+
cp_lexer_set_source_position_from_token (token);
-
+
/* Provide debugging output. */
if (cp_lexer_debugging_p (lexer))
{
@@ -558,7 +558,7 @@ cp_lexer_consume_token (cp_lexer* lexer)
cp_lexer_print_token (cp_lexer_debug_stream, token);
putc ('\n', cp_lexer_debug_stream);
}
-
+
return token;
}
@@ -570,7 +570,7 @@ static void
cp_lexer_purge_token (cp_lexer *lexer)
{
cp_token *tok = lexer->next_token;
-
+
gcc_assert (tok != &eof_token);
tok->type = CPP_PURGED;
tok->location = UNKNOWN_LOCATION;
@@ -601,7 +601,7 @@ cp_lexer_purge_tokens_after (cp_lexer *lexer, cp_token *tok)
if (peek == &eof_token)
peek = lexer->last_token;
-
+
gcc_assert (tok < peek);
for ( tok += 1; tok != peek; tok += 1)
@@ -693,7 +693,7 @@ cp_lexer_print_token (FILE * stream, cp_token *token)
"NESTED_NAME_SPECIFIER",
"PURGED"
};
-
+
/* If we have a name for the token, print it out. Otherwise, we
simply give the numeric code. */
gcc_assert (token->type < ARRAY_SIZE(token_names));
@@ -904,7 +904,7 @@ cp_declarator *
make_call_declarator (cp_declarator *target,
cp_parameter_declarator *parms,
cp_cv_quals cv_qualifiers,
- tree exception_specification)
+ tree exception_specification)
{
cp_declarator *declarator;
@@ -1217,7 +1217,8 @@ typedef struct cp_parser GTY(())
/* The scope in which names should be looked up. If NULL_TREE, then
we look up names in the scope that is currently open in the
source program. If non-NULL, this is either a TYPE or
- NAMESPACE_DECL for the scope in which we should look.
+ NAMESPACE_DECL for the scope in which we should look. It can
+ also be ERROR_MARK, when we've parsed a bogus scope.
This value is not cleared automatically after a name is looked
up, so we must be careful to clear it before starting a new look
@@ -1225,7 +1226,7 @@ typedef struct cp_parser GTY(())
will look up `Z' in the scope of `X', rather than the current
scope.) Unfortunately, it is difficult to tell when name lookup
is complete, because we sometimes peek at a token, look it up,
- and then decide not to consume it. */
+ and then decide not to consume it. */
tree scope;
/* OBJECT_SCOPE and QUALIFYING_SCOPE give the scopes in which the
@@ -1670,7 +1671,7 @@ static tree cp_parser_objc_message_expression
(cp_parser *);
static tree cp_parser_objc_encode_expression
(cp_parser *);
-static tree cp_parser_objc_defs_expression
+static tree cp_parser_objc_defs_expression
(cp_parser *);
static tree cp_parser_objc_protocol_expression
(cp_parser *);
@@ -1865,7 +1866,7 @@ cp_parser_error (cp_parser* parser, const char* message)
cp_lexer_set_source_position_from_token (token);
if (token->type == CPP_PRAGMA)
{
- error ("%<#pragma%> is not allowed here");
+ error ("%<#pragma%> is not allowed here");
cp_lexer_purge_token (parser->lexer);
return;
}
@@ -1898,12 +1899,12 @@ cp_parser_name_lookup_error (cp_parser* parser,
parser->scope, name);
else if (parser->scope == global_namespace)
error ("%<::%D%> has not been declared", name);
- else if (parser->object_scope
+ else if (parser->object_scope
&& !CLASS_TYPE_P (parser->object_scope))
error ("request for member %qD in non-class type %qT",
name, parser->object_scope);
else if (parser->object_scope)
- error ("%<%T::%D%> has not been declared",
+ error ("%<%T::%D%> has not been declared",
parser->object_scope, name);
else
error ("%qD has not been declared", name);
@@ -2007,7 +2008,7 @@ cp_parser_check_for_invalid_template_id (cp_parser* parser,
/* If parsing an integral constant-expression, issue an error message
about the fact that THING appeared and return true. Otherwise,
return false. In either case, set
- PARSER->NON_INTEGRAL_CONSTANT_EXPRESSION_P. */
+ PARSER->NON_INTEGRAL_CONSTANT_EXPRESSION_P. */
static bool
cp_parser_non_integral_constant_expression (cp_parser *parser,
@@ -2045,7 +2046,7 @@ cp_parser_diagnose_invalid_type_name (cp_parser *parser, tree scope, tree id)
if (TREE_CODE (decl) == TEMPLATE_DECL)
error ("invalid use of template-name %qE without an argument list",
decl);
- else if (!parser->scope)
+ else if (!parser->scope || parser->scope == error_mark_node)
{
/* Issue an error message. */
error ("%qE does not name a type", id);
@@ -2081,7 +2082,7 @@ cp_parser_diagnose_invalid_type_name (cp_parser *parser, tree scope, tree id)
&& DECL_NAME (field) == id)
{
inform ("(perhaps %<typename %T::%E%> was intended)",
- BINFO_TYPE (b), id);
+ BINFO_TYPE (b), id);
break;
}
if (field)
@@ -2267,7 +2268,7 @@ cp_parser_skip_to_end_of_statement (cp_parser* parser)
scanned, stop -- but only after consuming the token.
That way given:
- void f g () { ... }
+ void f g () { ... }
typedef int I;
we will stop after the body of the erroneously declared
@@ -2313,36 +2314,48 @@ cp_parser_consume_semicolon_at_end_of_statement (cp_parser *parser)
static void
cp_parser_skip_to_end_of_block_or_statement (cp_parser* parser)
{
- unsigned nesting_depth = 0;
+ int nesting_depth = 0;
- while (true)
+ while (nesting_depth >= 0)
{
- cp_token *token;
+ cp_token *token = cp_lexer_peek_token (parser->lexer);
- /* Peek at the next token. */
- token = cp_lexer_peek_token (parser->lexer);
- /* If we've run out of tokens, stop. */
if (token->type == CPP_EOF)
break;
- /* If the next token is a `;', we have reached the end of the
- statement. */
- if (token->type == CPP_SEMICOLON && !nesting_depth)
+
+ switch (token->type)
{
- /* Consume the `;'. */
- cp_lexer_consume_token (parser->lexer);
+ case CPP_EOF:
+ /* If we've run out of tokens, stop. */
+ nesting_depth = -1;
+ continue;
+
+ case CPP_SEMICOLON:
+ /* Stop if this is an unnested ';'. */
+ if (!nesting_depth)
+ nesting_depth = -1;
+ break;
+
+ case CPP_CLOSE_BRACE:
+ /* Stop if this is an unnested '}', or closes the outermost
+ nesting level. */
+ nesting_depth--;
+ if (!nesting_depth)
+ nesting_depth = -1;
+ break;
+
+ case CPP_OPEN_BRACE:
+ /* Nest. */
+ nesting_depth++;
+ break;
+
+ default:
break;
}
+
/* Consume the token. */
- token = cp_lexer_consume_token (parser->lexer);
- /* If the next token is a non-nested `}', then we have reached
- the end of the current block. */
- if (token->type == CPP_CLOSE_BRACE
- && (nesting_depth == 0 || --nesting_depth == 0))
- break;
- /* If it the next token is a `{', then we are entering a new
- block. Consume the entire block. */
- if (token->type == CPP_OPEN_BRACE)
- ++nesting_depth;
+ cp_lexer_consume_token (parser->lexer);
+
}
}
@@ -2779,7 +2792,7 @@ cp_parser_primary_expression (cp_parser *parser,
checked at that point. If we are not within a cast, then
this code is invalid. */
if (!cast_p)
- cp_parser_non_integral_constant_expression
+ cp_parser_non_integral_constant_expression
(parser, "floating-point literal");
}
return token->value;
@@ -2787,7 +2800,7 @@ cp_parser_primary_expression (cp_parser *parser,
case CPP_STRING:
case CPP_WSTRING:
/* ??? Should wide strings be allowed when parser->translate_strings_p
- is false (i.e. in attributes)? If not, we can kill the third
+ is false (i.e. in attributes)? If not, we can kill the third
argument to cp_parser_string_literal. */
return cp_parser_string_literal (parser,
parser->translate_strings_p,
@@ -2817,7 +2830,7 @@ cp_parser_primary_expression (cp_parser *parser,
/* And they're not allowed outside of a function-body; you
cannot, for example, write:
- int i = ({ int j = 3; j + 1; });
+ int i = ({ int j = 3; j + 1; });
at class or namespace scope. */
if (!at_function_scope_p ())
@@ -3040,7 +3053,7 @@ cp_parser_primary_expression (cp_parser *parser,
/* Anything else is an error. */
default:
/* ...unless we have an Objective-C++ message or string literal, that is. */
- if (c_dialect_objc ()
+ if (c_dialect_objc ()
&& (token->type == CPP_OPEN_SQUARE || token->type == CPP_OBJC_STRING))
return cp_parser_objc_expression (parser);
@@ -3216,7 +3229,7 @@ cp_parser_id_expression (cp_parser *parser,
static tree
cp_parser_unqualified_id (cp_parser* parser,
- bool template_keyword_p,
+ bool template_keyword_p,
bool check_dependency_p,
bool declarator_p)
{
@@ -3266,7 +3279,7 @@ cp_parser_unqualified_id (cp_parser* parser,
template <typename T> struct S { ~S (); };
template <typename T> S<T>::~S() {}
- is invalid, since `~' must be followed by a class-name, but
+ is invalid, since `~' must be followed by a class-name, but
`S<T>' is dependent, and so not known to be a class.
That's not right; we need to look in uninstantiated
templates. A further complication arises from:
@@ -3281,14 +3294,14 @@ cp_parser_unqualified_id (cp_parser* parser,
Yet another issue is:
- struct S {
- int S;
- ~S();
- };
+ struct S {
+ int S;
+ ~S();
+ };
- S::~S() {}
+ S::~S() {}
- The standard does not seem to say that the `S' in `~S'
+ The standard does not seem to say that the `S' in `~S'
should refer to the type `S' and not the data member
`S::S'. */
@@ -3550,11 +3563,11 @@ cp_parser_nested_name_specifier_opt (cp_parser *parser,
look up names in "X<T>::I" in order to determine that "Y" is
a template. So, if we have a typename at this point, we make
an effort to look through it. */
- if (is_declaration
+ if (is_declaration
&& !typename_keyword_p
- && parser->scope
+ && parser->scope
&& TREE_CODE (parser->scope) == TYPENAME_TYPE)
- parser->scope = resolve_typename_type (parser->scope,
+ parser->scope = resolve_typename_type (parser->scope,
/*only_current_p=*/false);
/* Parse the qualifying entity. */
new_scope
@@ -3646,13 +3659,13 @@ cp_parser_nested_name_specifier_opt (cp_parser *parser,
if (success && start)
{
cp_token *token = cp_lexer_token_at (parser->lexer, start);
-
+
/* Reset the contents of the START token. */
token->type = CPP_NESTED_NAME_SPECIFIER;
token->value = build_tree_list (access_check, parser->scope);
TREE_TYPE (token->value) = parser->qualifying_scope;
token->keyword = RID_MAX;
-
+
/* Purge all subsequent tokens. */
cp_lexer_purge_tokens_after (parser->lexer, start);
}
@@ -3664,9 +3677,7 @@ cp_parser_nested_name_specifier_opt (cp_parser *parser,
/* Parse a nested-name-specifier. See
cp_parser_nested_name_specifier_opt for details. This function
behaves identically, except that it will an issue an error if no
- nested-name-specifier is present, and it will return
- ERROR_MARK_NODE, rather than NULL_TREE, if no nested-name-specifier
- is present. */
+ nested-name-specifier is present. */
static tree
cp_parser_nested_name_specifier (cp_parser *parser,
@@ -3688,7 +3699,6 @@ cp_parser_nested_name_specifier (cp_parser *parser,
{
cp_parser_error (parser, "expected nested-name-specifier");
parser->scope = NULL_TREE;
- return error_mark_node;
}
return scope;
@@ -3798,7 +3808,7 @@ cp_parser_class_or_namespace_name (cp_parser *parser,
If ADDRESS_P is true, the postfix expression is the operand of the
`&' operator. CAST_P is true if this expression is the target of a
- cast.
+ cast.
Returns a representation of the expression. */
@@ -3973,7 +3983,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p)
id = cp_parser_identifier (parser);
/* Don't process id if nested name specifier is invalid. */
- if (scope == error_mark_node)
+ if (!scope || scope == error_mark_node)
return error_mark_node;
/* If we look up a template-id in a non-dependent qualifying
scope, there's no need to create a dependent type. */
@@ -4121,10 +4131,34 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p)
/* postfix-expression ( expression-list [opt] ) */
{
bool koenig_p;
- tree args = (cp_parser_parenthesized_expression_list
- (parser, false,
- /*cast_p=*/false,
- /*non_constant_p=*/NULL));
+ bool is_builtin_constant_p;
+ bool saved_integral_constant_expression_p = false;
+ bool saved_non_integral_constant_expression_p = false;
+ tree args;
+
+ is_builtin_constant_p
+ = DECL_IS_BUILTIN_CONSTANT_P (postfix_expression);
+ if (is_builtin_constant_p)
+ {
+ /* The whole point of __builtin_constant_p is to allow
+ non-constant expressions to appear as arguments. */
+ saved_integral_constant_expression_p
+ = parser->integral_constant_expression_p;
+ saved_non_integral_constant_expression_p
+ = parser->non_integral_constant_expression_p;
+ parser->integral_constant_expression_p = false;
+ }
+ args = (cp_parser_parenthesized_expression_list
+ (parser, /*is_attribute_list=*/false,
+ /*cast_p=*/false,
+ /*non_constant_p=*/NULL));
+ if (is_builtin_constant_p)
+ {
+ parser->integral_constant_expression_p
+ = saved_integral_constant_expression_p;
+ parser->non_integral_constant_expression_p
+ = saved_non_integral_constant_expression_p;
+ }
if (args == error_mark_node)
{
@@ -4438,8 +4472,8 @@ cp_parser_postfix_dot_deref_expression (cp_parser *parser,
However, if the name was not dependent and has already been
resolved; there is no need to build the SCOPE_REF. For example;
- struct X { void f(); };
- template <typename T> void f(T* t) { t->X::f(); }
+ struct X { void f(); };
+ template <typename T> void f(T* t) { t->X::f(); }
Even though "t" is dependent, "X::f" is not and has been resolved
to a BASELINK; there is no need to include scope information. */
@@ -4625,8 +4659,8 @@ cp_parser_parenthesized_expression_list (cp_parser* parser,
static void
cp_parser_pseudo_destructor_name (cp_parser* parser,
- tree* scope,
- tree* type)
+ tree* scope,
+ tree* type)
{
bool nested_name_specifier_p;
@@ -4850,7 +4884,7 @@ cp_parser_unary_expression (cp_parser *parser, bool address_p, bool cast_p)
token = cp_lexer_consume_token (parser->lexer);
/* Parse the cast-expression. */
cast_expression
- = cp_parser_cast_expression (parser,
+ = cp_parser_cast_expression (parser,
unary_operator == ADDR_EXPR,
/*cast_p=*/false);
/* Now, build an appropriate representation. */
@@ -4873,7 +4907,7 @@ cp_parser_unary_expression (cp_parser *parser, bool address_p, bool cast_p)
non_constant_p = (unary_operator == PREINCREMENT_EXPR
? "`++'" : "`--'");
/* Fall through. */
- case CONVERT_EXPR:
+ case UNARY_PLUS_EXPR:
case NEGATE_EXPR:
case TRUTH_NOT_EXPR:
expression = finish_unary_op_expr (unary_operator, cast_expression);
@@ -4909,7 +4943,7 @@ cp_parser_unary_operator (cp_token* token)
return ADDR_EXPR;
case CPP_PLUS:
- return CONVERT_EXPR;
+ return UNARY_PLUS_EXPR;
case CPP_MINUS:
return NEGATE_EXPR;
@@ -4969,7 +5003,7 @@ cp_parser_new_expression (cp_parser* parser)
/* Look for the closing `)'. */
cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
/* There should not be a direct-new-declarator in this production,
- but GCC used to allowed this, so we check and emit a sensible error
+ but GCC used to allowed this, so we check and emit a sensible error
message for this case. */
if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_SQUARE))
{
@@ -5078,7 +5112,7 @@ cp_parser_new_type_id (cp_parser* parser, tree *nelts)
*nelts = declarator->u.array.bounds;
if (*nelts == error_mark_node)
*nelts = integer_one_node;
-
+
if (outer_declarator)
outer_declarator->declarator = declarator->declarator;
else
@@ -5177,7 +5211,7 @@ cp_parser_direct_new_declarator (cp_parser* parser)
if (!expression)
{
error ("expression in new-declarator must have integral "
- "or enumeration type");
+ "or enumeration type");
expression = error_mark_node;
}
}
@@ -5350,11 +5384,11 @@ cp_parser_cast_expression (cp_parser *parser, bool address_p, bool cast_p)
parser->type_definition_forbidden_message = saved_message;
/* If ok so far, parse the dependent expression. We cannot be
- sure it is a cast. Consider `(T ())'. It is a parenthesized
- ctor of T, but looks like a cast to function returning T
- without a dependent expression. */
+ sure it is a cast. Consider `(T ())'. It is a parenthesized
+ ctor of T, but looks like a cast to function returning T
+ without a dependent expression. */
if (!cp_parser_error_occurred (parser))
- expr = cp_parser_cast_expression (parser,
+ expr = cp_parser_cast_expression (parser,
/*address_p=*/false,
/*cast_p=*/true);
@@ -5420,7 +5454,7 @@ cp_parser_cast_expression (cp_parser *parser, bool address_p, bool cast_p)
relational-expression >= shift-expression
GNU Extension:
-
+
relational-expression:
relational-expression <? shift-expression
relational-expression >? shift-expression
@@ -5490,19 +5524,19 @@ cp_parser_binary_expression (cp_parser* parser, bool cast_p)
new_prec = TOKEN_PRECEDENCE (token);
/* Popping an entry off the stack means we completed a subexpression:
- - either we found a token which is not an operator (`>' where it is not
- an operator, or prec == PREC_NOT_OPERATOR), in which case popping
- will happen repeatedly;
- - or, we found an operator which has lower priority. This is the case
- where the recursive descent *ascends*, as in `3 * 4 + 5' after
- parsing `3 * 4'. */
+ - either we found a token which is not an operator (`>' where it is not
+ an operator, or prec == PREC_NOT_OPERATOR), in which case popping
+ will happen repeatedly;
+ - or, we found an operator which has lower priority. This is the case
+ where the recursive descent *ascends*, as in `3 * 4 + 5' after
+ parsing `3 * 4'. */
if (new_prec <= prec)
- {
- if (sp == stack)
+ {
+ if (sp == stack)
break;
- else
+ else
goto pop;
- }
+ }
get_rhs:
tree_type = binops_by_token[token->type].tree_type;
@@ -5511,57 +5545,57 @@ cp_parser_binary_expression (cp_parser* parser, bool cast_p)
cp_lexer_consume_token (parser->lexer);
/* Extract another operand. It may be the RHS of this expression
- or the LHS of a new, higher priority expression. */
+ or the LHS of a new, higher priority expression. */
rhs = cp_parser_simple_cast_expression (parser);
/* Get another operator token. Look up its precedence to avoid
- building a useless (immediately popped) stack entry for common
- cases such as 3 + 4 + 5 or 3 * 4 + 5. */
+ building a useless (immediately popped) stack entry for common
+ cases such as 3 + 4 + 5 or 3 * 4 + 5. */
token = cp_lexer_peek_token (parser->lexer);
lookahead_prec = TOKEN_PRECEDENCE (token);
if (lookahead_prec > new_prec)
- {
- /* ... and prepare to parse the RHS of the new, higher priority
- expression. Since precedence levels on the stack are
+ {
+ /* ... and prepare to parse the RHS of the new, higher priority
+ expression. Since precedence levels on the stack are
monotonically increasing, we do not have to care about
stack overflows. */
- sp->prec = prec;
- sp->tree_type = tree_type;
- sp->lhs = lhs;
- sp++;
- lhs = rhs;
- prec = new_prec;
- new_prec = lookahead_prec;
- goto get_rhs;
-
- pop:
- /* If the stack is not empty, we have parsed into LHS the right side
+ sp->prec = prec;
+ sp->tree_type = tree_type;
+ sp->lhs = lhs;
+ sp++;
+ lhs = rhs;
+ prec = new_prec;
+ new_prec = lookahead_prec;
+ goto get_rhs;
+
+ pop:
+ /* If the stack is not empty, we have parsed into LHS the right side
(`4' in the example above) of an expression we had suspended.
- We can use the information on the stack to recover the LHS (`3')
+ We can use the information on the stack to recover the LHS (`3')
from the stack together with the tree code (`MULT_EXPR'), and
the precedence of the higher level subexpression
(`PREC_ADDITIVE_EXPRESSION'). TOKEN is the CPP_PLUS token,
which will be used to actually build the additive expression. */
- --sp;
+ --sp;
prec = sp->prec;
- tree_type = sp->tree_type;
- rhs = lhs;
- lhs = sp->lhs;
- }
+ tree_type = sp->tree_type;
+ rhs = lhs;
+ lhs = sp->lhs;
+ }
overloaded_p = false;
lhs = build_x_binary_op (tree_type, lhs, rhs, &overloaded_p);
/* If the binary operator required the use of an overloaded operator,
- then this expression cannot be an integral constant-expression.
- An overloaded operator can be used even if both operands are
- otherwise permissible in an integral constant-expression if at
- least one of the operands is of enumeration type. */
+ then this expression cannot be an integral constant-expression.
+ An overloaded operator can be used even if both operands are
+ otherwise permissible in an integral constant-expression if at
+ least one of the operands is of enumeration type. */
if (overloaded_p
- && (cp_parser_non_integral_constant_expression
- (parser, "calls to overloaded operators")))
- return error_mark_node;
+ && (cp_parser_non_integral_constant_expression
+ (parser, "calls to overloaded operators")))
+ return error_mark_node;
}
return lhs;
@@ -5863,7 +5897,7 @@ cp_parser_constant_expression (cp_parser* parser,
constant. */
expression = cp_parser_assignment_expression (parser, /*cast_p=*/false);
/* Restore the old settings. */
- parser->integral_constant_expression_p
+ parser->integral_constant_expression_p
= saved_integral_constant_expression_p;
parser->allow_non_integral_constant_expression_p
= saved_allow_non_integral_constant_expression_p;
@@ -5871,7 +5905,7 @@ cp_parser_constant_expression (cp_parser* parser,
*non_constant_p = parser->non_integral_constant_expression_p;
else if (parser->non_integral_constant_expression_p)
expression = error_mark_node;
- parser->non_integral_constant_expression_p
+ parser->non_integral_constant_expression_p
= saved_non_integral_constant_expression_p;
return expression;
@@ -6131,11 +6165,11 @@ cp_parser_labeled_statement (cp_parser* parser, tree in_statement_expr)
ellipsis = cp_lexer_peek_token (parser->lexer);
if (ellipsis->type == CPP_ELLIPSIS)
{
- /* Consume the `...' token. */
+ /* Consume the `...' token. */
cp_lexer_consume_token (parser->lexer);
expr_hi =
cp_parser_constant_expression (parser,
- /*allow_non_constant_p=*/false,
+ /*allow_non_constant_p=*/false,
NULL);
/* We don't need to emit warnings here, as the common code
will do this for us. */
@@ -6421,7 +6455,7 @@ cp_parser_condition (cp_parser* parser)
for sure. */
if (cp_parser_parse_definitely (parser))
{
- tree pushed_scope;
+ tree pushed_scope;
/* Create the declaration. */
decl = start_decl (declarator, &type_specifiers,
@@ -7040,7 +7074,7 @@ cp_parser_block_declaration (cp_parser *parser,
static void
cp_parser_simple_declaration (cp_parser* parser,
- bool function_definition_allowed_p)
+ bool function_definition_allowed_p)
{
cp_decl_specifier_seq decl_specifiers;
int declares_class_or_enum;
@@ -7094,11 +7128,11 @@ cp_parser_simple_declaration (cp_parser* parser,
/* Give up. */
goto done;
}
-
+
/* If we have seen at least one decl-specifier, and the next token
is not a parenthesis, then we must be looking at a declaration.
(After "int (" we might be looking at a functional cast.) */
- if (decl_specifiers.any_specifiers_p
+ if (decl_specifiers.any_specifiers_p
&& cp_lexer_next_token_is_not (parser->lexer, CPP_OPEN_PAREN))
cp_parser_commit_to_tentative_parse (parser);
@@ -7169,9 +7203,9 @@ cp_parser_simple_declaration (cp_parser* parser,
/* After the first time around, a function-definition is not
allowed -- even if it was OK at first. For example:
- int i, f() {}
+ int i, f() {}
- is not valid. */
+ is not valid. */
function_definition_allowed_p = false;
}
@@ -7218,9 +7252,9 @@ cp_parser_simple_declaration (cp_parser* parser,
flags:
1: one of the decl-specifiers is an elaborated-type-specifier
- (i.e., a type declaration)
+ (i.e., a type declaration)
2: one of the decl-specifiers is an enum-specifier or a
- class-specifier (i.e., a type definition)
+ class-specifier (i.e., a type definition)
*/
@@ -7301,7 +7335,7 @@ cp_parser_decl_specifier_seq (cp_parser* parser,
extern
mutable
- GNU Extension:
+ GNU Extension:
thread */
case RID_AUTO:
/* Consume the token. */
@@ -7607,7 +7641,7 @@ cp_parser_conversion_function_id (cp_parser* parser)
conversion-type-id. For example, consider:
struct S {
- typedef int I;
+ typedef int I;
operator I();
};
@@ -7659,7 +7693,7 @@ cp_parser_conversion_type_id (cp_parser* parser)
declarator = cp_parser_conversion_declarator_opt (parser);
type_specified = grokdeclarator (declarator, &type_specifiers, TYPENAME,
- /*initialized=*/0, &attributes);
+ /*initialized=*/0, &attributes);
if (attributes)
cplus_decl_attributes (&type_specified, attributes, /*flags=*/0);
return type_specified;
@@ -8363,7 +8397,7 @@ cp_parser_type_parameter (cp_parser* parser)
tree default_argument;
/* If the next token is an identifier, then it names the
- parameter. */
+ parameter. */
if (cp_lexer_next_token_is (parser->lexer, CPP_NAME))
identifier = cp_parser_identifier (parser);
else
@@ -8565,7 +8599,7 @@ cp_parser_template_id (cp_parser *parser,
/* Change `:' into `::'. */
next_token_2->type = CPP_SCOPE;
/* Consume the first token (CPP_OPEN_SQUARE - which we pretend it is
- CPP_LESS. */
+ CPP_LESS. */
cp_lexer_consume_token (parser->lexer);
/* Parse the arguments. */
arguments = cp_parser_enclosed_template_argument_list (parser);
@@ -8580,7 +8614,7 @@ cp_parser_template_id (cp_parser *parser,
return error_mark_node;
}
/* Otherwise, emit an error about the invalid digraph, but continue
- parsing because we got our argument list. */
+ parsing because we got our argument list. */
pedwarn ("%<<::%> cannot begin a template-argument list");
inform ("%<<:%> is an alternate spelling for %<[%>. Insert whitespace "
"between %<<%> and %<::%>");
@@ -8639,12 +8673,12 @@ cp_parser_template_id (cp_parser *parser,
if (start_of_id)
{
cp_token *token = cp_lexer_token_at (parser->lexer, start_of_id);
-
+
/* Reset the contents of the START_OF_ID token. */
token->type = CPP_TEMPLATE_ID;
token->value = build_tree_list (access_check, template_id);
token->keyword = RID_MAX;
-
+
/* Purge all subsequent tokens. */
cp_lexer_purge_tokens_after (parser->lexer, start_of_id);
@@ -8699,8 +8733,8 @@ cp_parser_template_id (cp_parser *parser,
static tree
cp_parser_template_name (cp_parser* parser,
- bool template_keyword_p,
- bool check_dependency_p,
+ bool template_keyword_p,
+ bool check_dependency_p,
bool is_declaration,
bool *is_identifier)
{
@@ -8719,10 +8753,10 @@ cp_parser_template_name (cp_parser* parser,
identifier = cp_parser_operator_function_id (parser);
/* If that didn't work, try a conversion-function-id. */
if (!cp_parser_parse_definitely (parser))
- {
+ {
cp_parser_error (parser, "expected template-name");
return error_mark_node;
- }
+ }
}
/* Look for the identifier. */
else
@@ -8764,7 +8798,7 @@ cp_parser_template_name (cp_parser* parser,
&& !constructor_name_p (identifier, parser->scope))
{
cp_token_position start = 0;
-
+
/* Explain what went wrong. */
error ("non-template %qD used as template", identifier);
inform ("use %<%T::template %D%> to indicate that it is a template",
@@ -9011,7 +9045,7 @@ cp_parser_template_argument (cp_parser* parser)
in [temp.arg.nontype]:
-- an integral constant-expression of integral or enumeration
- type; or
+ type; or
-- the name of a non-type template-parameter; or
@@ -9063,7 +9097,7 @@ cp_parser_template_argument (cp_parser* parser)
gcc_assert (REFERENCE_REF_P (argument));
argument = TREE_OPERAND (argument, 0);
}
-
+
if (qualifying_class)
argument = finish_qualified_id_expr (qualifying_class,
argument,
@@ -9352,7 +9386,7 @@ cp_parser_type_specifier (cp_parser* parser,
if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_OPEN_BRACE
|| (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_NAME
&& cp_lexer_peek_nth_token (parser->lexer, 3)->type
- == CPP_OPEN_BRACE))
+ == CPP_OPEN_BRACE))
{
if (parser->num_template_parameter_lists)
{
@@ -9695,7 +9729,7 @@ cp_parser_simple_type_specifier (cp_parser* parser,
}
cp_parser_check_for_invalid_template_id (parser, TREE_TYPE (type));
- }
+ }
return type;
}
@@ -9748,7 +9782,7 @@ cp_parser_type_name (cp_parser* parser)
/* See if this is an Objective-C type. */
tree protos = cp_parser_objc_protocol_refs_opt (parser);
tree type = objc_get_protocol_qualified_type (identifier, protos);
- if (type)
+ if (type)
type_decl = TYPE_NAME (type);
}
@@ -9789,7 +9823,7 @@ cp_parser_type_name (cp_parser* parser)
elaborated-type-specifier:
class-key attributes :: [opt] nested-name-specifier [opt] identifier
class-key attributes :: [opt] nested-name-specifier [opt]
- template [opt] template-id
+ template [opt] template-id
enum attributes :: [opt] nested-name-specifier [opt] identifier
If IS_FRIEND is TRUE, then this elaborated-type-specifier is being
@@ -9801,8 +9835,8 @@ cp_parser_type_name (cp_parser* parser)
static tree
cp_parser_elaborated_type_specifier (cp_parser* parser,
- bool is_friend,
- bool is_declaration)
+ bool is_friend,
+ bool is_declaration)
{
enum tag_types tag_type;
tree identifier;
@@ -9847,12 +9881,11 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
/* Look for the nested-name-specifier. */
if (tag_type == typename_type)
{
- if (cp_parser_nested_name_specifier (parser,
+ if (!cp_parser_nested_name_specifier (parser,
/*typename_keyword_p=*/true,
/*check_dependency_p=*/true,
/*type_p=*/true,
- is_declaration)
- == error_mark_node)
+ is_declaration))
return error_mark_node;
}
else
@@ -9873,7 +9906,7 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
/* Allow the `template' keyword. */
template_p = cp_parser_optional_template_keyword (parser);
/* If we didn't see `template', we don't know if there's a
- template-id or not. */
+ template-id or not. */
if (!template_p)
cp_parser_parse_tentatively (parser);
/* Parse the template-id. */
@@ -9881,7 +9914,7 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
/*check_dependency_p=*/true,
is_declaration);
/* If we didn't find a template-id, look for an ordinary
- identifier. */
+ identifier. */
if (!template_p && !cp_parser_parse_definitely (parser))
;
/* If DECL is a TEMPLATE_ID_EXPR, and the `typename' keyword is
@@ -9908,7 +9941,7 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
}
/* For a `typename', we needn't call xref_tag. */
- if (tag_type == typename_type
+ if (tag_type == typename_type
&& TREE_CODE (parser->scope) != NAMESPACE_DECL)
return cp_parser_make_typename_type (parser, parser->scope,
identifier);
@@ -9951,7 +9984,7 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
if (TREE_CODE (decl) != TYPE_DECL)
{
- cp_parser_diagnose_invalid_type_name (parser,
+ cp_parser_diagnose_invalid_type_name (parser,
parser->scope,
identifier);
return error_mark_node;
@@ -10022,9 +10055,10 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
else
ts = ts_global;
- /* Warn about attributes. They are ignored. */
- if (attributes)
- warning (0, "type attributes are honored only at type definition");
+ /* Warn about attributes. They are ignored. */
+ if (attributes)
+ warning (OPT_Wattributes,
+ "type attributes are honored only at type definition");
type = xref_tag (tag_type, identifier, ts,
parser->num_template_parameter_lists);
@@ -10477,10 +10511,10 @@ cp_parser_using_directive (cp_parser* parser)
asm volatile [opt] ( string-literal ) ;
asm volatile [opt] ( string-literal : asm-operand-list [opt] ) ;
asm volatile [opt] ( string-literal : asm-operand-list [opt]
- : asm-operand-list [opt] ) ;
+ : asm-operand-list [opt] ) ;
asm volatile [opt] ( string-literal : asm-operand-list [opt]
- : asm-operand-list [opt]
- : asm-operand-list [opt] ) ; */
+ : asm-operand-list [opt]
+ : asm-operand-list [opt] ) ; */
static void
cp_parser_asm_definition (cp_parser* parser)
@@ -10598,7 +10632,7 @@ cp_parser_asm_definition (cp_parser* parser)
tree temp = asm_stmt;
if (TREE_CODE (temp) == CLEANUP_POINT_EXPR)
temp = TREE_OPERAND (temp, 0);
-
+
ASM_INPUT_P (temp) = 1;
}
}
@@ -10869,7 +10903,8 @@ cp_parser_init_declarator (cp_parser* parser,
attributes -- but ignores them. */
if (cp_parser_allow_gnu_extensions_p (parser) && is_parenthesized_init)
if (cp_parser_attributes_opt (parser))
- warning (0, "attributes after parenthesized initializer ignored");
+ warning (OPT_Wattributes,
+ "attributes after parenthesized initializer ignored");
/* For an in-class declaration, use `grokfield' to create the
declaration. */
@@ -10948,14 +10983,14 @@ cp_parser_init_declarator (cp_parser* parser,
expression, not a declaration.)
If PARENTHESIZED_P is non-NULL, *PARENTHESIZED_P is set to true iff
- the declarator is a direct-declarator of the form "(...)".
+ the declarator is a direct-declarator of the form "(...)".
MEMBER_P is true iff this declarator is a member-declarator. */
static cp_declarator *
cp_parser_declarator (cp_parser* parser,
- cp_parser_declarator_kind dcl_kind,
- int* ctor_dtor_or_conv_p,
+ cp_parser_declarator_kind dcl_kind,
+ int* ctor_dtor_or_conv_p,
bool* parenthesized_p,
bool member_p)
{
@@ -11063,8 +11098,8 @@ cp_parser_declarator (cp_parser* parser,
static cp_declarator *
cp_parser_direct_declarator (cp_parser* parser,
- cp_parser_declarator_kind dcl_kind,
- int* ctor_dtor_or_conv_p,
+ cp_parser_declarator_kind dcl_kind,
+ int* ctor_dtor_or_conv_p,
bool member_p)
{
cp_token *token;
@@ -11082,15 +11117,15 @@ cp_parser_direct_declarator (cp_parser* parser,
if (token->type == CPP_OPEN_PAREN)
{
/* This is either a parameter-declaration-clause, or a
- parenthesized declarator. When we know we are parsing a
- named declarator, it must be a parenthesized declarator
- if FIRST is true. For instance, `(int)' is a
- parameter-declaration-clause, with an omitted
- direct-abstract-declarator. But `((*))', is a
- parenthesized abstract declarator. Finally, when T is a
- template parameter `(T)' is a
- parameter-declaration-clause, and not a parenthesized
- named declarator.
+ parenthesized declarator. When we know we are parsing a
+ named declarator, it must be a parenthesized declarator
+ if FIRST is true. For instance, `(int)' is a
+ parameter-declaration-clause, with an omitted
+ direct-abstract-declarator. But `((*))', is a
+ parenthesized abstract declarator. Finally, when T is a
+ template parameter `(T)' is a
+ parameter-declaration-clause, and not a parenthesized
+ named declarator.
We first try and parse a parameter-declaration-clause,
and then try a nested declarator (if FIRST is true).
@@ -11110,7 +11145,7 @@ cp_parser_direct_declarator (cp_parser* parser,
these two alternatives should be selected. Even more
complex are examples like:
- int i (int (a));
+ int i (int (a));
int i (int (3));
The former is a function-declaration; the latter is a
@@ -11156,7 +11191,7 @@ cp_parser_direct_declarator (cp_parser* parser,
= saved_num_template_parameter_lists;
/* If all went well, parse the cv-qualifier-seq and the
- exception-specification. */
+ exception-specification. */
if (member_p || cp_parser_parse_definitely (parser))
{
cp_cv_quals cv_quals;
@@ -11180,8 +11215,8 @@ cp_parser_direct_declarator (cp_parser* parser,
cv_quals,
exception_specification);
/* Any subsequent parameter lists are to do with
- return type, so are not those of the declared
- function. */
+ return type, so are not those of the declared
+ function. */
parser->default_arg_ok_p = false;
/* Repeat the main loop. */
@@ -11251,7 +11286,7 @@ cp_parser_direct_declarator (cp_parser* parser,
bounds = fold_non_dependent_expr (bounds);
/* Normally, the array bound must be an integral constant
expression. However, as an extension, we allow VLAs
- in function scopes. */
+ in function scopes. */
else if (!at_function_scope_p ())
{
error ("array bound is not an integer constant");
@@ -11284,7 +11319,7 @@ cp_parser_direct_declarator (cp_parser* parser,
if (!cp_parser_parse_definitely (parser))
unqualified_name = error_mark_node;
else if (qualifying_scope
- || (TREE_CODE (unqualified_name)
+ || (TREE_CODE (unqualified_name)
!= IDENTIFIER_NODE))
{
cp_parser_error (parser, "expected unqualified-id");
@@ -11302,23 +11337,23 @@ cp_parser_direct_declarator (cp_parser* parser,
&& TREE_CODE (qualifying_scope) == TYPENAME_TYPE)
{
/* In the declaration of a member of a template class
- outside of the class itself, the SCOPE will sometimes
- be a TYPENAME_TYPE. For example, given:
+ outside of the class itself, the SCOPE will sometimes
+ be a TYPENAME_TYPE. For example, given:
- template <typename T>
- int S<T>::R::i = 3;
+ template <typename T>
+ int S<T>::R::i = 3;
- the SCOPE will be a TYPENAME_TYPE for `S<T>::R'. In
- this context, we must resolve S<T>::R to an ordinary
- type, rather than a typename type.
+ the SCOPE will be a TYPENAME_TYPE for `S<T>::R'. In
+ this context, we must resolve S<T>::R to an ordinary
+ type, rather than a typename type.
- The reason we normally avoid resolving TYPENAME_TYPEs
- is that a specialization of `S' might render
- `S<T>::R' not a type. However, if `S' is
- specialized, then this `i' will not be used, so there
- is no harm in resolving the types here. */
+ The reason we normally avoid resolving TYPENAME_TYPEs
+ is that a specialization of `S' might render
+ `S<T>::R' not a type. However, if `S' is
+ specialized, then this `i' will not be used, so there
+ is no harm in resolving the types here. */
tree type;
-
+
/* Resolve the TYPENAME_TYPE. */
type = resolve_typename_type (qualifying_scope,
/*only_current_p=*/false);
@@ -11330,7 +11365,7 @@ cp_parser_direct_declarator (cp_parser* parser,
qualifying_scope = type;
}
- declarator = make_id_declarator (qualifying_scope,
+ declarator = make_id_declarator (qualifying_scope,
unqualified_name);
declarator->id_loc = token->location;
if (unqualified_name)
@@ -11356,7 +11391,7 @@ cp_parser_direct_declarator (cp_parser* parser,
&& (constructor_name_p (unqualified_name,
class_type)
|| (TREE_CODE (unqualified_name) == TYPE_DECL
- && (same_type_p
+ && (same_type_p
(TREE_TYPE (unqualified_name),
class_type)))))
declarator->u.id.sfk = sfk_constructor;
@@ -11369,8 +11404,8 @@ cp_parser_direct_declarator (cp_parser* parser,
{
error ("invalid use of constructor as a template");
inform ("use %<%T::%D%> instead of %<%T::%T%> to name "
- "the constructor in a qualified name",
- class_type,
+ "the constructor in a qualified name",
+ class_type,
DECL_NAME (TYPE_TI_TEMPLATE (class_type)),
class_type, class_type);
}
@@ -11435,7 +11470,7 @@ cp_parser_direct_declarator (cp_parser* parser,
static enum tree_code
cp_parser_ptr_operator (cp_parser* parser,
- tree* type,
+ tree* type,
cp_cv_quals *cv_quals)
{
enum tree_code code = ERROR_MARK;
@@ -11705,22 +11740,22 @@ cp_parser_type_specifier_seq (cp_parser* parser,
seen_type_specifier = true;
/* The standard says that a condition can be:
- type-specifier-seq declarator = assignment-expression
-
+ type-specifier-seq declarator = assignment-expression
+
However, given:
struct S {};
if (int S = ...)
- we should treat the "S" as a declarator, not as a
- type-specifier. The standard doesn't say that explicitly for
- type-specifier-seq, but it does say that for
- decl-specifier-seq in an ordinary declaration. Perhaps it
- would be clearer just to allow a decl-specifier-seq here, and
- then add a semantic restriction that if any decl-specifiers
- that are not type-specifiers appear, the program is invalid. */
+ we should treat the "S" as a declarator, not as a
+ type-specifier. The standard doesn't say that explicitly for
+ type-specifier-seq, but it does say that for
+ decl-specifier-seq in an ordinary declaration. Perhaps it
+ would be clearer just to allow a decl-specifier-seq here, and
+ then add a semantic restriction that if any decl-specifiers
+ that are not type-specifiers appear, the program is invalid. */
if (is_condition && !is_cv_qualifier)
- flags |= CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES;
+ flags |= CP_PARSER_FLAGS_NO_USER_DEFINED_TYPES;
}
return;
@@ -11878,9 +11913,9 @@ cp_parser_parameter_declaration_list (cp_parser* parser, bool *is_error)
cp_lexer_consume_token (parser->lexer);
/* When parsing something like:
- int i(float f, double d)
+ int i(float f, double d)
- we can tell after seeing the declaration for "f" that we
+ we can tell after seeing the declaration for "f" that we
are not looking at an initialization of a variable "i",
but rather at the declaration of a function "i".
@@ -12116,13 +12151,14 @@ cp_parser_parameter_declaration (cp_parser *parser,
}
/* Create a DEFAULT_ARG to represented the unparsed default
- argument. */
+ argument. */
default_argument = make_node (DEFAULT_ARG);
DEFARG_TOKENS (default_argument)
- = cp_token_cache_new (first_token, token);
+ = cp_token_cache_new (first_token, token);
+ DEFARG_INSTANTIATIONS (default_argument) = NULL;
}
/* Outside of a class definition, we can just parse the
- assignment-expression. */
+ assignment-expression. */
else
{
bool saved_local_variables_forbidden_p;
@@ -12138,7 +12174,7 @@ cp_parser_parameter_declaration (cp_parser *parser,
= parser->local_variables_forbidden_p;
parser->local_variables_forbidden_p = true;
/* Parse the assignment-expression. */
- default_argument
+ default_argument
= cp_parser_assignment_expression (parser, /*cast_p=*/false);
/* Restore saved state. */
parser->greater_than_is_operator_p
@@ -12614,7 +12650,7 @@ cp_parser_class_specifier (cp_parser* parser)
class-specifier for that class. Consider:
struct A {
- struct B { void f() { sizeof (A); } };
+ struct B { void f() { sizeof (A); } };
};
If `f' were processed before the processing of `A' were
@@ -12639,11 +12675,11 @@ cp_parser_class_specifier (cp_parser* parser)
This two-phased approach handles cases like:
struct S {
- void f() { g(); }
- void g(int i = 3);
- };
+ void f() { g(); }
+ void g(int i = 3);
+ };
- */
+ */
for (TREE_PURPOSE (parser->unparsed_functions_queues)
= nreverse (TREE_PURPOSE (parser->unparsed_functions_queues));
(queue_entry = TREE_PURPOSE (parser->unparsed_functions_queues));
@@ -12717,7 +12753,7 @@ cp_parser_class_specifier (cp_parser* parser)
involving a nested-name-specifier was used, and FALSE otherwise.
Returns error_mark_node if this is not a class-head.
-
+
Returns NULL_TREE if the class-head is syntactically valid, but
semantically invalid in a way that means we should skip the entire
body of the class. */
@@ -12790,10 +12826,10 @@ cp_parser_class_head (cp_parser* parser,
It is OK to define an inaccessible class; for example:
- class A { class B; };
- class A::B {};
+ class A { class B; };
+ class A::B {};
- We do not know if we will see a class-name, or a
+ We do not know if we will see a class-name, or a
template-name. We look for a class-name first, in case the
class-name is a template-id; if we looked for the
template-name first we would stop after the template-name. */
@@ -12906,13 +12942,13 @@ cp_parser_class_head (cp_parser* parser,
if (scope && !is_ancestor (scope, nested_name_specifier))
{
error ("declaration of %qD in %qD which does not enclose %qD",
- type, scope, nested_name_specifier);
+ type, scope, nested_name_specifier);
type = NULL_TREE;
goto done;
}
/* [dcl.meaning]
- A declarator-id shall not be qualified exception of the
+ A declarator-id shall not be qualified exception of the
definition of a ... nested class outside of its class
... [or] a the definition or explicit instantiation of a
class member of a namespace outside of its namespace. */
@@ -12998,7 +13034,7 @@ cp_parser_class_head (cp_parser* parser,
goto done;
}
}
-
+
type = TREE_TYPE (type);
*nested_name_specifier_p = true;
}
@@ -13270,8 +13306,8 @@ cp_parser_member_declaration (cp_parser* parser)
/* In this case:
template <typename T> struct A {
- friend struct A<T>::B;
- };
+ friend struct A<T>::B;
+ };
A<T>::B will be represented by a TYPENAME_TYPE, and
therefore not recognized by check_tag_decl. */
@@ -14280,7 +14316,7 @@ cp_parser_attribute_list (cp_parser* parser)
token = cp_lexer_consume_token (parser->lexer);
/* Save away the identifier that indicates which attribute
- this is. */
+ this is. */
identifier = token->value;
attribute = build_tree_list (identifier, NULL_TREE);
@@ -14292,7 +14328,7 @@ cp_parser_attribute_list (cp_parser* parser)
tree arguments;
arguments = (cp_parser_parenthesized_expression_list
- (parser, true, /*cast_p=*/false,
+ (parser, true, /*cast_p=*/false,
/*non_constant_p=*/NULL));
/* Save the identifier and arguments away. */
TREE_VALUE (attribute) = arguments;
@@ -14365,7 +14401,10 @@ cp_parser_label_declaration (cp_parser* parser)
/* Look for an identifier. */
identifier = cp_parser_identifier (parser);
- /* Declare it as a lobel. */
+ /* If we failed, stop. */
+ if (identifier == error_mark_node)
+ break;
+ /* Declare it as a label. */
finish_label_decl (identifier);
/* If the next token is a `;', stop. */
if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
@@ -14409,7 +14448,7 @@ cp_parser_label_declaration (cp_parser* parser)
are ignored.
If CHECK_DEPENDENCY is TRUE, names are not looked up in dependent
- types.
+ types.
If AMBIGUOUS_P is non-NULL, it is set to true if name-lookup
results in an ambiguity, and false otherwise. */
@@ -14530,8 +14569,8 @@ cp_parser_lookup_name (cp_parser *parser, tree name,
may be instantiated during name lookup. In that case,
errors may be issued. Even if we rollback the current
tentative parse, those errors are valid. */
- decl = lookup_qualified_name (parser->scope, name,
- tag_type != none_type,
+ decl = lookup_qualified_name (parser->scope, name,
+ tag_type != none_type,
/*complain=*/true);
if (pushed_scope)
pop_scope (pushed_scope);
@@ -14551,10 +14590,10 @@ cp_parser_lookup_name (cp_parser *parser, tree name,
parse, those errors are valid. */
object_decl = lookup_member (object_type,
name,
- /*protect=*/0,
+ /*protect=*/0,
tag_type != none_type);
/* Look it up in the enclosing context, too. */
- decl = lookup_name_real (name, tag_type != none_type,
+ decl = lookup_name_real (name, tag_type != none_type,
/*nonclass=*/0,
/*block_p=*/true, is_namespace,
/*flags=*/0);
@@ -14565,7 +14604,7 @@ cp_parser_lookup_name (cp_parser *parser, tree name,
}
else
{
- decl = lookup_name_real (name, tag_type != none_type,
+ decl = lookup_name_real (name, tag_type != none_type,
/*nonclass=*/0,
/*block_p=*/true, is_namespace,
/*flags=*/0);
@@ -14640,7 +14679,7 @@ cp_parser_maybe_treat_template_as_class (tree decl, bool tag_name_p)
the translation from TEMPLATE_DECL to TYPE_DECL occurs:
struct A {
- template <typename T> struct B;
+ template <typename T> struct B;
};
template <typename T> struct A::B {};
@@ -14650,7 +14689,7 @@ cp_parser_maybe_treat_template_as_class (tree decl, bool tag_name_p)
namespace N { struct X{}; }
struct A {
- template <typename T> friend struct N::X;
+ template <typename T> friend struct N::X;
};
However, if the DECL refers to a class type, and we are in
@@ -14659,7 +14698,7 @@ cp_parser_maybe_treat_template_as_class (tree decl, bool tag_name_p)
than a TEMPLATE_DECL. For example, in:
template <class T> struct S {
- S s;
+ S s;
};
there is no need to handle such case. */
@@ -14715,7 +14754,7 @@ cp_parser_check_declarator_template_parameters (cp_parser* parser,
scope = TYPE_CONTEXT (scope);
}
}
- else if (TREE_CODE (declarator->u.id.unqualified_name)
+ else if (TREE_CODE (declarator->u.id.unqualified_name)
== TEMPLATE_ID_EXPR)
/* If the DECLARATOR has the form `X<y>' then it uses one
additional level of template parameters. */
@@ -14747,7 +14786,7 @@ cp_parser_check_declarator_template_parameters (cp_parser* parser,
static bool
cp_parser_check_template_parameters (cp_parser* parser,
- unsigned num_templates)
+ unsigned num_templates)
{
/* If there are more template classes than parameter lists, we have
something like:
@@ -15119,7 +15158,7 @@ cp_parser_template_declaration_after_export (cp_parser* parser, bool member_p)
else
{
/* There are no access checks when parsing a template, as we do not
- know if a specialization will be a friend. */
+ know if a specialization will be a friend. */
push_deferring_access_checks (dk_no_check);
decl = cp_parser_single_declaration (parser,
@@ -15477,13 +15516,14 @@ cp_parser_late_parsing_for_member (cp_parser* parser, tree member_function)
tokens = DECL_PENDING_INLINE_INFO (member_function);
DECL_PENDING_INLINE_INFO (member_function) = NULL;
DECL_PENDING_INLINE_P (member_function) = 0;
-
+
/* If this is a local class, enter the scope of the containing
function. */
function_scope = current_function_decl;
if (function_scope)
push_function_context_to (function_scope);
+
/* Push the body of the function onto the lexer stack. */
cp_parser_push_lexer_for_tokens (parser, tokens);
@@ -15492,10 +15532,17 @@ cp_parser_late_parsing_for_member (cp_parser* parser, tree member_function)
start_preparsed_function (member_function, NULL_TREE,
SF_PRE_PARSED | SF_INCLASS_INLINE);
+ /* Don't do access checking if it is a templated function. */
+ if (processing_template_decl)
+ push_deferring_access_checks (dk_no_check);
+
/* Now, parse the body of the function. */
cp_parser_function_definition_after_declarator (parser,
/*inline_p=*/true);
+ if (processing_template_decl)
+ pop_deferring_access_checks ();
+
/* Leave the scope of the containing function. */
if (function_scope)
pop_function_context_from (function_scope);
@@ -15559,19 +15606,34 @@ cp_parser_late_parsing_default_args (cp_parser *parser, tree fn)
parm = TREE_CHAIN (parm))
{
cp_token_cache *tokens;
+ tree default_arg = TREE_PURPOSE (parm);
+ tree parsed_arg;
+ VEC(tree,gc) *insts;
+ tree copy;
+ unsigned ix;
+
+ if (!default_arg)
+ continue;
- if (!TREE_PURPOSE (parm)
- || TREE_CODE (TREE_PURPOSE (parm)) != DEFAULT_ARG)
+ if (TREE_CODE (default_arg) != DEFAULT_ARG)
+ /* This can happen for a friend declaration for a function
+ already declared with default arguments. */
continue;
/* Push the saved tokens for the default argument onto the parser's
lexer stack. */
- tokens = DEFARG_TOKENS (TREE_PURPOSE (parm));
+ tokens = DEFARG_TOKENS (default_arg);
cp_parser_push_lexer_for_tokens (parser, tokens);
/* Parse the assignment-expression. */
- TREE_PURPOSE (parm) = cp_parser_assignment_expression (parser,
- /*cast_p=*/false);
+ parsed_arg = cp_parser_assignment_expression (parser, /*cast_p=*/false);
+
+ TREE_PURPOSE (parm) = parsed_arg;
+
+ /* Update any instantiations we've already created. */
+ for (insts = DEFARG_INSTANTIATIONS (default_arg), ix = 0;
+ VEC_iterate (tree, insts, ix, copy); ix++)
+ TREE_PURPOSE (copy) = parsed_arg;
/* If the token stream has not been completely used up, then
there was extra junk after the end of the default
@@ -15622,7 +15684,7 @@ cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword)
/* The restrictions on constant-expressions do not apply inside
sizeof expressions. */
- saved_integral_constant_expression_p
+ saved_integral_constant_expression_p
= parser->integral_constant_expression_p;
saved_non_integral_constant_expression_p
= parser->non_integral_constant_expression_p;
@@ -15679,7 +15741,7 @@ cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword)
free ((char *) parser->type_definition_forbidden_message);
/* And restore the old one. */
parser->type_definition_forbidden_message = saved_message;
- parser->integral_constant_expression_p
+ parser->integral_constant_expression_p
= saved_integral_constant_expression_p;
parser->non_integral_constant_expression_p
= saved_non_integral_constant_expression_p;
@@ -15769,8 +15831,8 @@ cp_parser_friend_p (const cp_decl_specifier_seq *decl_specifiers)
static cp_token *
cp_parser_require (cp_parser* parser,
- enum cpp_ttype type,
- const char* token_desc)
+ enum cpp_ttype type,
+ const char* token_desc)
{
if (cp_lexer_next_token_is (parser->lexer, type))
return cp_lexer_consume_token (parser->lexer);
@@ -15793,8 +15855,8 @@ cp_parser_require (cp_parser* parser,
static void
cp_parser_skip_until_found (cp_parser* parser,
- enum cpp_ttype type,
- const char* token_desc)
+ enum cpp_ttype type,
+ const char* token_desc)
{
cp_token *token;
unsigned nesting_depth = 0;
@@ -15841,8 +15903,8 @@ cp_parser_skip_until_found (cp_parser* parser,
static cp_token *
cp_parser_require_keyword (cp_parser* parser,
- enum rid keyword,
- const char* token_desc)
+ enum rid keyword,
+ const char* token_desc)
{
cp_token *token = cp_parser_require (parser, CPP_KEYWORD, token_desc);
@@ -16258,8 +16320,8 @@ cp_parser_objc_message_expression (cp_parser* parser)
/* Parse an objc-message-receiver.
objc-message-receiver:
- type-name
expression
+ simple-type-specifier
Returns a representation of the type or expression. */
@@ -16267,7 +16329,6 @@ static tree
cp_parser_objc_message_receiver (cp_parser* parser)
{
tree rcv;
- bool class_scope_p, template_p;
/* An Objective-C message receiver may be either (1) a type
or (2) an expression. */
@@ -16277,24 +16338,9 @@ cp_parser_objc_message_receiver (cp_parser* parser)
if (cp_parser_parse_definitely (parser))
return rcv;
- /* Look for the optional `::' operator. */
- cp_parser_global_scope_opt (parser, false);
- /* Look for the nested-name-specifier. */
- cp_parser_nested_name_specifier_opt (parser,
- /*typename_keyword_p=*/true,
- /*check_dependency_p=*/true,
- /*type_p=*/true,
- /*is_declaration=*/true);
- class_scope_p = (parser->scope && TYPE_P (parser->scope));
- template_p = class_scope_p && cp_parser_optional_template_keyword (parser);
- /* Finally, look for the class-name. */
- rcv = cp_parser_class_name (parser,
- class_scope_p,
- template_p,
- /*type_p=*/true,
- /*check_dependency_p=*/true,
- /*class_head_p=*/false,
- /*is_declaration=*/true);
+ rcv = cp_parser_simple_type_specifier (parser,
+ /*decl_specs=*/NULL,
+ CP_PARSER_FLAGS_NONE);
return objc_get_class_reference (rcv);
}
@@ -16370,7 +16416,7 @@ cp_parser_objc_message_args (cp_parser* parser)
objc-encode-expression:
@encode objc-typename
-
+
Returns an encoded representation of the type argument. */
static tree
@@ -16501,12 +16547,12 @@ cp_parser_objc_identifier_list (cp_parser* parser)
while (sep->type == CPP_COMMA)
{
cp_lexer_consume_token (parser->lexer); /* Eat ','. */
- list = chainon (list,
+ list = chainon (list,
build_tree_list (NULL_TREE,
cp_parser_identifier (parser)));
sep = cp_lexer_peek_token (parser->lexer);
}
-
+
return list;
}
@@ -16623,7 +16669,7 @@ cp_parser_objc_protocol_qualifiers (cp_parser* parser)
|| node == ridpointers [(int) RID_OUT]
|| node == ridpointers [(int) RID_INOUT]
|| node == ridpointers [(int) RID_BYCOPY]
- || node == ridpointers [(int) RID_BYREF]
+ || node == ridpointers [(int) RID_BYREF]
|| node == ridpointers [(int) RID_ONEWAY]))
{
quals = tree_cons (NULL_TREE, node, quals);
@@ -16679,7 +16725,7 @@ static tree
cp_parser_objc_selector (cp_parser* parser)
{
cp_token *token = cp_lexer_consume_token (parser->lexer);
-
+
if (!cp_parser_objc_selector_p (token->type))
{
error ("invalid Objective-C++ selector name");
@@ -16732,7 +16778,7 @@ cp_parser_objc_method_keyword_params (cp_parser* parser)
params
= chainon (params,
- objc_build_keyword_decl (selector,
+ objc_build_keyword_decl (selector,
typename,
identifier));
@@ -16769,7 +16815,7 @@ cp_parser_objc_method_tail_params_opt (cp_parser* parser, bool *ellipsisp)
parmdecl = cp_parser_parameter_declaration (parser, false, NULL);
parm = grokdeclarator (parmdecl->declarator,
&parmdecl->decl_specifiers,
- PARM, /*initialized=*/0,
+ PARM, /*initialized=*/0,
/*attrlist=*/NULL);
chainon (params, build_tree_list (NULL_TREE, parm));
@@ -16946,7 +16992,7 @@ cp_parser_objc_class_ivars (cp_parser* parser)
else
{
/* Parse the declarator. */
- declarator
+ declarator
= cp_parser_declarator (parser, CP_PARSER_DECLARATOR_NAMED,
&ctor_dtor_or_conv_p,
/*parenthesized_p=*/NULL,
@@ -16970,7 +17016,7 @@ cp_parser_objc_class_ivars (cp_parser* parser)
else
decl = grokfield (declarator, &declspecs, NULL_TREE,
NULL_TREE, attributes);
-
+
/* Add the instance variable. */
objc_add_instance_variable (decl);
@@ -17017,14 +17063,14 @@ cp_parser_objc_protocol_declaration (cp_parser* parser)
/* See if we have a forward declaration or a definition. */
tok = cp_lexer_peek_nth_token (parser->lexer, 2);
-
+
/* Try a forward declaration first. */
if (tok->type == CPP_COMMA || tok->type == CPP_SEMICOLON)
{
objc_declare_protocols (cp_parser_objc_identifier_list (parser));
- finish:
+ finish:
cp_parser_consume_semicolon_at_end_of_statement (parser);
- }
+ }
/* Ok, we got a full-fledged definition (or at least should). */
else
@@ -17181,7 +17227,7 @@ cp_parser_objc_try_catch_finally_statement (cp_parser *parser) {
stmt = push_stmt_list ();
cp_parser_compound_statement (parser, NULL, false);
objc_begin_try_stmt (location, pop_stmt_list (stmt));
-
+
while (cp_lexer_next_token_is_keyword (parser->lexer, RID_AT_CATCH))
{
cp_parameter_declarator *parmdecl;
@@ -17192,7 +17238,7 @@ cp_parser_objc_try_catch_finally_statement (cp_parser *parser) {
parmdecl = cp_parser_parameter_declaration (parser, false, NULL);
parm = grokdeclarator (parmdecl->declarator,
&parmdecl->decl_specifiers,
- PARM, /*initialized=*/0,
+ PARM, /*initialized=*/0,
/*attrlist=*/NULL);
cp_parser_require (parser, CPP_CLOSE_PAREN, "`)'");
objc_begin_catch_clause (parm);
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index f5e3f8a7a32..f130859d3c5 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -107,7 +107,7 @@ static void tsubst_enum (tree, tree, tree);
static tree add_to_template_args (tree, tree);
static tree add_outermost_template_args (tree, tree);
static bool check_instantiated_args (tree, tree, tsubst_flags_t);
-static int maybe_adjust_types_for_deduction (unification_kind_t, tree*, tree*);
+static int maybe_adjust_types_for_deduction (unification_kind_t, tree*, tree*);
static int type_unification_real (tree, tree, tree, tree,
int, unification_kind_t, int);
static void note_template_header (int);
@@ -181,7 +181,7 @@ push_access_scope (tree t)
push_nested_class (DECL_CONTEXT (t));
else
push_to_top_level ();
-
+
if (TREE_CODE (t) == FUNCTION_DECL)
{
saved_access_scope = tree_cons
@@ -226,7 +226,7 @@ finish_member_template_decl (tree decl)
tree type;
type = TREE_TYPE (decl);
- if (IS_AGGR_TYPE (type)
+ if (IS_AGGR_TYPE (type)
&& CLASSTYPE_TEMPLATE_INFO (type)
&& !CLASSTYPE_TEMPLATE_SPECIALIZATION (type))
{
@@ -247,7 +247,7 @@ finish_member_template_decl (tree decl)
}
else
return decl;
- }
+ }
else
error ("invalid member template declaration %qD", decl);
@@ -255,7 +255,7 @@ finish_member_template_decl (tree decl)
}
/* Returns the template nesting level of the indicated class TYPE.
-
+
For example, in:
template <class T>
struct A
@@ -264,23 +264,23 @@ finish_member_template_decl (tree decl)
struct B {};
};
- A<T>::B<U> has depth two, while A<T> has depth one.
+ A<T>::B<U> has depth two, while A<T> has depth one.
Both A<T>::B<int> and A<int>::B<U> have depth one, if
COUNT_SPECIALIZATIONS is 0 or if they are instantiations, not
- specializations.
+ specializations.
This function is guaranteed to return 0 if passed NULL_TREE so
that, for example, `template_class_depth (current_class_type)' is
always safe. */
-static int
+static int
template_class_depth_real (tree type, int count_specializations)
{
int depth;
- for (depth = 0;
+ for (depth = 0;
type && TREE_CODE (type) != NAMESPACE_DECL;
- type = (TREE_CODE (type) == FUNCTION_DECL)
+ type = (TREE_CODE (type) == FUNCTION_DECL)
? CP_DECL_CONTEXT (type) : TYPE_CONTEXT (type))
{
if (TREE_CODE (type) != FUNCTION_DECL)
@@ -292,7 +292,7 @@ template_class_depth_real (tree type, int count_specializations)
|| uses_template_parms (CLASSTYPE_TI_ARGS (type))))
++depth;
}
- else
+ else
{
if (DECL_TEMPLATE_INFO (type)
&& PRIMARY_TEMPLATE_P (DECL_TI_TEMPLATE (type))
@@ -310,7 +310,7 @@ template_class_depth_real (tree type, int count_specializations)
Like template_class_depth_real, but instantiations do not count in
the depth. */
-int
+int
template_class_depth (tree type)
{
return template_class_depth_real (type, /*count_specializations=*/0);
@@ -350,8 +350,8 @@ push_inline_template_parms_recursive (tree parmlist, int levels)
TEMPLATE_PARMS_FOR_INLINE (current_template_parms) = 1;
begin_scope (TREE_VEC_LENGTH (parms) ? sk_template_parms : sk_template_spec,
- NULL);
- for (i = 0; i < TREE_VEC_LENGTH (parms); ++i)
+ NULL);
+ for (i = 0; i < TREE_VEC_LENGTH (parms); ++i)
{
tree parm = TREE_VALUE (TREE_VEC_ELT (parms, i));
gcc_assert (DECL_P (parm));
@@ -422,7 +422,7 @@ maybe_begin_member_template_processing (tree decl)
/* Undo the effects of maybe_begin_member_template_processing. */
-void
+void
maybe_end_member_template_processing (void)
{
int i;
@@ -431,9 +431,9 @@ maybe_end_member_template_processing (void)
return;
--inline_parm_levels_used;
- for (i = 0;
+ for (i = 0;
i < VARRAY_INT (inline_parm_levels, inline_parm_levels_used);
- ++i)
+ ++i)
{
--processing_template_decl;
current_template_parms = TREE_CHAIN (current_template_parms);
@@ -460,7 +460,7 @@ add_to_template_args (tree args, tree extra_args)
for (j = 1; j <= extra_depth; ++j, ++i)
SET_TMPL_ARGS_LEVEL (new_args, i, TMPL_ARGS_LEVEL (extra_args, j));
-
+
return new_args;
}
@@ -487,7 +487,7 @@ add_outermost_template_args (tree args, tree extra_args)
/* For the moment, we make ARGS look like it contains fewer levels. */
TREE_VEC_LENGTH (args) -= TMPL_ARGS_DEPTH (extra_args);
-
+
new_args = add_to_template_args (args, extra_args);
/* Now, we restore ARGS to its full dimensions. */
@@ -510,7 +510,7 @@ get_innermost_template_args (tree args, int n)
/* If N is 1, just return the innermost set of template arguments. */
if (n == 1)
return TMPL_ARGS_LEVEL (args, TMPL_ARGS_DEPTH (args));
-
+
/* If we're not removing anything, just return the arguments we were
given. */
extra_levels = TMPL_ARGS_DEPTH (args) - n;
@@ -521,7 +521,7 @@ get_innermost_template_args (tree args, int n)
/* Make a new set of arguments, not containing the outer arguments. */
new_args = make_tree_vec (n);
for (i = 1; i <= n; ++i)
- SET_TMPL_ARGS_LEVEL (new_args, i,
+ SET_TMPL_ARGS_LEVEL (new_args, i,
TMPL_ARGS_LEVEL (args, i + extra_levels));
return new_args;
@@ -542,7 +542,7 @@ begin_template_parm_list (void)
e.g.:
template <class T> struct S1 {
- template <class T> struct S2 {};
+ template <class T> struct S2 {};
};
pushtag contains special code to call pushdecl_with_scope on the
@@ -561,8 +561,8 @@ check_specialization_scope (void)
{
tree scope = current_scope ();
- /* [temp.expl.spec]
-
+ /* [temp.expl.spec]
+
An explicit specialization shall be declared in the namespace of
which the template is a member, or, for member templates, in the
namespace of which the enclosing class or enclosing class
@@ -573,7 +573,7 @@ check_specialization_scope (void)
if (scope && TREE_CODE (scope) != NAMESPACE_DECL)
error ("explicit specialization in non-namespace scope %qD", scope);
- /* [temp.expl.spec]
+ /* [temp.expl.spec]
In an explicit specialization declaration for a member of a class
template or a member template that appears in namespace scope,
@@ -581,7 +581,7 @@ check_specialization_scope (void)
remain unspecialized, except that the declaration shall not
explicitly specialize a class member template if its enclosing
class templates are not explicitly specialized as well. */
- if (current_template_parms)
+ if (current_template_parms)
error ("enclosing class templates are not explicitly specialized");
}
@@ -598,7 +598,7 @@ begin_specialization (void)
/* Called at then end of processing a declaration preceded by
template<>. */
-void
+void
end_specialization (void)
{
finish_scope ();
@@ -618,7 +618,7 @@ reset_specialization (void)
/* We've just seen a template header. If SPECIALIZATION is nonzero,
it was of the form template <>. */
-static void
+static void
note_template_header (int specialization)
{
processing_specialization = specialization;
@@ -646,14 +646,14 @@ end_explicit_instantiation (void)
declared. Check that the namespace in which the specialization is
occurring is permissible. Returns false iff it is invalid to
specialize TMPL in the current namespace. */
-
+
static bool
check_specialization_namespace (tree tmpl)
{
tree tpl_ns = decl_namespace_context (tmpl);
/* [tmpl.expl.spec]
-
+
An explicit specialization shall be declared in the namespace of
which the template is a member, or, for member templates, in the
namespace of which the enclosing class or enclosing class
@@ -675,7 +675,7 @@ check_specialization_namespace (tree tmpl)
/* The TYPE is being declared. If it is a template type, that means it
is a partial specialization. Do appropriate error-checking. */
-void
+void
maybe_process_partial_specialization (tree type)
{
/* TYPE maybe an ERROR_MARK_NODE. */
@@ -769,7 +769,7 @@ maybe_process_partial_specialization (tree type)
for TMPL, a TEMPLATE_DECL. In particular, for such a template, we
do not use DECL_TEMPLATE_SPECIALIZATIONS at all. */
-static inline bool
+static inline bool
optimize_specialization_lookup_p (tree tmpl)
{
return (DECL_FUNCTION_TEMPLATE_P (tmpl)
@@ -787,10 +787,10 @@ optimize_specialization_lookup_p (tree tmpl)
&& !DECL_CONV_FN_P (tmpl)
/* It is possible to have a template that is not a member
template and is not a member of a template class:
-
- template <typename T>
+
+ template <typename T>
struct S { friend A::f(); };
-
+
Here, the friend function is a template, but the context does
not have template information. The optimized lookup relies
on having ARGS be the template arguments for both the class
@@ -803,23 +803,23 @@ optimize_specialization_lookup_p (tree tmpl)
specialization) of TMPL for the given template ARGS. If there is
no such specialization, return NULL_TREE. The ARGS are a vector of
arguments, or a vector of vectors of arguments, in the case of
- templates with more than one level of parameters.
+ templates with more than one level of parameters.
If TMPL is a type template and CLASS_SPECIALIZATIONS_P is true,
then we search for a partial specialization matching ARGS. This
parameter is ignored if TMPL is not a class template. */
-
+
static tree
-retrieve_specialization (tree tmpl, tree args,
+retrieve_specialization (tree tmpl, tree args,
bool class_specializations_p)
{
gcc_assert (TREE_CODE (tmpl) == TEMPLATE_DECL);
/* There should be as many levels of arguments as there are
levels of parameters. */
- gcc_assert (TMPL_ARGS_DEPTH (args)
+ gcc_assert (TMPL_ARGS_DEPTH (args)
== TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl)));
-
+
if (optimize_specialization_lookup_p (tmpl))
{
tree class_template;
@@ -832,7 +832,7 @@ retrieve_specialization (tree tmpl, tree args,
class. Find the class specialization with those
arguments. */
class_template = CLASSTYPE_TI_TEMPLATE (DECL_CONTEXT (tmpl));
- class_specialization
+ class_specialization
= retrieve_specialization (class_template, args,
/*class_specializations_p=*/false);
if (!class_specialization)
@@ -871,11 +871,11 @@ retrieve_specialization (tree tmpl, tree args,
while (*sp != NULL_TREE)
{
tree spec = *sp;
-
+
if (comp_template_args (TREE_PURPOSE (spec), args))
{
/* Use the move-to-front heuristic to speed up future
- searches. */
+ searches. */
if (spec != *head)
{
*sp = TREE_CHAIN (*sp);
@@ -910,13 +910,13 @@ is_specialization_of (tree decl, tree tmpl)
if (TREE_CODE (decl) == FUNCTION_DECL)
{
- for (t = decl;
+ for (t = decl;
t != NULL_TREE;
t = DECL_TEMPLATE_INFO (t) ? DECL_TI_TEMPLATE (t) : NULL_TREE)
if (t == tmpl)
return 1;
}
- else
+ else
{
gcc_assert (TREE_CODE (decl) == TYPE_DECL);
@@ -926,7 +926,7 @@ is_specialization_of (tree decl, tree tmpl)
? TREE_TYPE (CLASSTYPE_TI_TEMPLATE (t)) : NULL_TREE)
if (same_type_ignoring_top_level_qualifiers_p (t, TREE_TYPE (tmpl)))
return 1;
- }
+ }
return 0;
}
@@ -970,7 +970,7 @@ is_specialization_of_friend (tree decl, tree friend)
non-template class. In this case, the corresponding member of
every specialization of the class template is a friend of the
class granting friendship.
-
+
For example, given a template friend declaration
template <class T> friend void A<T>::f();
@@ -988,7 +988,7 @@ is_specialization_of_friend (tree decl, tree friend)
template_depth = template_class_depth (DECL_CONTEXT (friend));
if (template_depth
&& DECL_CLASS_SCOPE_P (decl)
- && is_specialization_of (TYPE_NAME (DECL_CONTEXT (decl)),
+ && is_specialization_of (TYPE_NAME (DECL_CONTEXT (decl)),
CLASSTYPE_TI_TEMPLATE (DECL_CONTEXT (friend))))
{
/* Next, we check the members themselves. In order to handle
@@ -1124,7 +1124,7 @@ register_specialization (tree spec, tree tmpl, tree args)
gcc_assert (TREE_CODE (tmpl) == TEMPLATE_DECL);
- if (TREE_CODE (spec) == FUNCTION_DECL
+ if (TREE_CODE (spec) == FUNCTION_DECL
&& uses_template_parms (DECL_TI_ARGS (spec)))
/* This is the FUNCTION_DECL for a partial instantiation. Don't
register it; we want the corresponding TEMPLATE_DECL instead.
@@ -1133,7 +1133,7 @@ register_specialization (tree spec, tree tmpl, tree args)
with default function arguments. In particular, given
something like this:
- template <class T> void f(T t1, T t = T())
+ template <class T> void f(T t1, T t = T())
the default argument expression is not substituted for in an
instantiation unless and until it is actually needed. */
@@ -1141,10 +1141,10 @@ register_specialization (tree spec, tree tmpl, tree args)
/* There should be as many levels of arguments as there are
levels of parameters. */
- gcc_assert (TMPL_ARGS_DEPTH (args)
+ gcc_assert (TMPL_ARGS_DEPTH (args)
== TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl)));
- fn = retrieve_specialization (tmpl, args,
+ fn = retrieve_specialization (tmpl, args,
/*class_specializations_p=*/false);
/* We can sometimes try to re-register a specialization that we've
already got. In particular, regenerate_decl_from_template calls
@@ -1157,7 +1157,7 @@ register_specialization (tree spec, tree tmpl, tree args)
{
if (DECL_TEMPLATE_INSTANTIATION (fn))
{
- if (TREE_USED (fn)
+ if (TREE_USED (fn)
|| DECL_EXPLICIT_INSTANTIATION (fn))
{
error ("specialization of %qD after instantiation",
@@ -1173,15 +1173,15 @@ register_specialization (tree spec, tree tmpl, tree args)
situation can occur if we have implicitly
instantiated a member function and then specialized
it later.
-
+
We can also wind up here if a friend declaration that
looked like an instantiation turns out to be a
specialization:
-
+
template <class T> void foo(T);
class S { friend void foo<>(int) };
- template <> void foo(int);
-
+ template <> void foo(int);
+
We transform the existing DECL in place so that any
pointers to it become pointers to the updated
declaration.
@@ -1191,7 +1191,7 @@ register_specialization (tree spec, tree tmpl, tree args)
there were no definition, and vice versa. */
DECL_INITIAL (fn) = NULL_TREE;
duplicate_decls (spec, fn);
-
+
return fn;
}
}
@@ -1202,7 +1202,7 @@ register_specialization (tree spec, tree tmpl, tree args)
line number so any errors match this new
definition. */
DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (spec);
-
+
return fn;
}
}
@@ -1270,7 +1270,7 @@ register_local_specialization (tree spec, tree tmpl)
{
void **slot;
- slot = htab_find_slot_with_hash (local_specializations, tmpl,
+ slot = htab_find_slot_with_hash (local_specializations, tmpl,
htab_hash_pointer (tmpl), INSERT);
*slot = build_tree_list (spec, tmpl);
}
@@ -1314,9 +1314,9 @@ print_candidates (tree fns)
issued. The error_mark_node is returned to indicate failure. */
static tree
-determine_specialization (tree template_id,
- tree decl,
- tree* targs_out,
+determine_specialization (tree template_id,
+ tree decl,
+ tree* targs_out,
int need_member_template,
int template_count)
{
@@ -1352,7 +1352,7 @@ determine_specialization (tree template_id,
/* Count the number of template headers specified for this
specialization. */
header_count = 0;
- for (b = current_binding_level;
+ for (b = current_binding_level;
b->kind == sk_template_parms;
b = b->level_chain)
++header_count;
@@ -1370,7 +1370,7 @@ determine_specialization (tree template_id,
/* Adjust the type of DECL in case FN is a static member. */
decl_arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl));
- if (DECL_STATIC_FUNCTION_P (fn)
+ if (DECL_STATIC_FUNCTION_P (fn)
&& DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
decl_arg_types = TREE_CHAIN (decl_arg_types);
@@ -1389,7 +1389,7 @@ determine_specialization (tree template_id,
the const qualification is the same. This can be done by
checking the 'this' in the argument list. */
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn)
- && !same_type_p (TREE_VALUE (fn_arg_types),
+ && !same_type_p (TREE_VALUE (fn_arg_types),
TREE_VALUE (decl_arg_types)))
continue;
@@ -1408,14 +1408,14 @@ determine_specialization (tree template_id,
is a template member function. So both lines are syntactically
correct, and check_explicit_specialization does not reject
them.
-
+
Here, we can do better, as we are matching the specialization
against the declarations. We count the number of template
headers, and we check if they match TEMPLATE_COUNT + 1
(TEMPLATE_COUNT is the number of qualifying template classes,
plus there must be another header for the member template
itself).
-
+
Notice that if header_count is zero, this is not a
specialization but rather a template instantiation, so there
is no check we can perform here. */
@@ -1429,7 +1429,7 @@ determine_specialization (tree template_id,
&& (TREE_VEC_LENGTH (DECL_INNERMOST_TEMPLATE_PARMS (fn))
!= TREE_VEC_LENGTH (TREE_VALUE (current_template_parms))))
continue;
-
+
/* See whether this function might be a specialization of this
template. */
targs = get_bindings (fn, decl, explicit_targs, /*check_ret=*/true);
@@ -1464,7 +1464,7 @@ determine_specialization (tree template_id,
/* This is an ordinary member function. However, since
we're here, we can assume it's enclosing class is a
template class. For example,
-
+
template <typename T> struct S { void f(); };
template <> void S<int>::f() {}
@@ -1484,11 +1484,11 @@ determine_specialization (tree template_id,
/* Adjust the type of DECL in case FN is a static member. */
decl_arg_types = TYPE_ARG_TYPES (TREE_TYPE (decl));
- if (DECL_STATIC_FUNCTION_P (fn)
+ if (DECL_STATIC_FUNCTION_P (fn)
&& DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
decl_arg_types = TREE_CHAIN (decl_arg_types);
- if (compparms (TYPE_ARG_TYPES (TREE_TYPE (fn)),
+ if (compparms (TYPE_ARG_TYPES (TREE_TYPE (fn)),
decl_arg_types))
/* They match! */
candidates = tree_cons (NULL_TREE, fn, candidates);
@@ -1498,7 +1498,7 @@ determine_specialization (tree template_id,
if (templates && TREE_CHAIN (templates))
{
/* We have:
-
+
[temp.expl.spec]
It is possible for a specialization with a given function
@@ -1516,10 +1516,10 @@ determine_specialization (tree template_id,
Partial ordering of overloaded function template
declarations is used in the following contexts to select
the function template to which a function template
- specialization refers:
+ specialization refers:
- -- when an explicit specialization refers to a function
- template.
+ -- when an explicit specialization refers to a function
+ template.
So, we do use the partial ordering rules, at least for now.
This extension can only serve to make invalid programs valid,
@@ -1539,7 +1539,7 @@ determine_specialization (tree template_id,
if (templates == NULL_TREE && candidates == NULL_TREE)
{
cp_error_at ("template-id %qD for %q+D does not match any template "
- "declaration",
+ "declaration",
template_id, decl);
return error_mark_node;
}
@@ -1568,7 +1568,7 @@ determine_specialization (tree template_id,
if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (targs))
{
*targs_out = copy_node (targs);
- SET_TMPL_ARGS_LEVEL (*targs_out,
+ SET_TMPL_ARGS_LEVEL (*targs_out,
TMPL_ARGS_DEPTH (*targs_out),
TREE_PURPOSE (templates));
}
@@ -1580,7 +1580,7 @@ determine_specialization (tree template_id,
/* Returns a chain of parameter types, exactly like the SPEC_TYPES,
but with the default argument values filled in from those in the
TMPL_TYPES. */
-
+
static tree
copy_default_args_to_explicit_spec_1 (tree spec_types,
tree tmpl_types)
@@ -1597,7 +1597,7 @@ copy_default_args_to_explicit_spec_1 (tree spec_types,
new_spec_types =
copy_default_args_to_explicit_spec_1 (TREE_CHAIN (spec_types),
TREE_CHAIN (tmpl_types));
-
+
/* Add the default argument for this parameter. */
return hash_tree_cons (TREE_PURPOSE (tmpl_types),
TREE_VALUE (spec_types),
@@ -1609,7 +1609,7 @@ copy_default_args_to_explicit_spec_1 (tree spec_types,
template <class T> void f(T = 3);
template <> void f(double);
- void g () { f (); }
+ void g () { f (); }
works, as required.) An alternative approach would be to look up
the correct default arguments at the call-site, but this approach
@@ -1640,20 +1640,20 @@ copy_default_args_to_explicit_spec (tree decl)
old_type = TREE_TYPE (decl);
spec_types = TYPE_ARG_TYPES (old_type);
-
+
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
{
/* Remove the this pointer, but remember the object's type for
- CV quals. */
+ CV quals. */
object_type = TREE_TYPE (TREE_VALUE (spec_types));
spec_types = TREE_CHAIN (spec_types);
tmpl_types = TREE_CHAIN (tmpl_types);
-
+
if (DECL_HAS_IN_CHARGE_PARM_P (decl))
- {
- /* DECL may contain more parameters than TMPL due to the extra
- in-charge parameter in constructors and destructors. */
- in_charge = spec_types;
+ {
+ /* DECL may contain more parameters than TMPL due to the extra
+ in-charge parameter in constructors and destructors. */
+ in_charge = spec_types;
spec_types = TREE_CHAIN (spec_types);
}
if (DECL_HAS_VTT_PARM_P (decl))
@@ -1664,22 +1664,22 @@ copy_default_args_to_explicit_spec (tree decl)
}
/* Compute the merged default arguments. */
- new_spec_types =
+ new_spec_types =
copy_default_args_to_explicit_spec_1 (spec_types, tmpl_types);
/* Compute the new FUNCTION_TYPE. */
if (object_type)
{
if (vtt)
- new_spec_types = hash_tree_cons (TREE_PURPOSE (vtt),
- TREE_VALUE (vtt),
- new_spec_types);
+ new_spec_types = hash_tree_cons (TREE_PURPOSE (vtt),
+ TREE_VALUE (vtt),
+ new_spec_types);
if (in_charge)
- /* Put the in-charge parameter back. */
- new_spec_types = hash_tree_cons (TREE_PURPOSE (in_charge),
- TREE_VALUE (in_charge),
- new_spec_types);
+ /* Put the in-charge parameter back. */
+ new_spec_types = hash_tree_cons (TREE_PURPOSE (in_charge),
+ TREE_VALUE (in_charge),
+ new_spec_types);
new_type = build_method_type_directly (object_type,
TREE_TYPE (old_type),
@@ -1704,8 +1704,8 @@ copy_default_args_to_explicit_spec (tree decl)
instead if all goes well. Issues an error message if something is
amiss. Returns error_mark_node if the error is not easily
recoverable.
-
- FLAGS is a bitmask consisting of the following flags:
+
+ FLAGS is a bitmask consisting of the following flags:
2: The function has a definition.
4: The function is a friend.
@@ -1716,7 +1716,7 @@ copy_default_args_to_explicit_spec (tree decl)
template <class T> struct S { void f(); };
void S<int>::f();
-
+
the TEMPLATE_COUNT would be 1. However, explicitly specialized
classes are not counted in the TEMPLATE_COUNT, so that in
@@ -1729,14 +1729,14 @@ copy_default_args_to_explicit_spec (tree decl)
If the function is a specialization, it is marked as such via
DECL_TEMPLATE_SPECIALIZATION. Furthermore, its DECL_TEMPLATE_INFO
- is set up correctly, and it is added to the list of specializations
+ is set up correctly, and it is added to the list of specializations
for that template. */
tree
-check_explicit_specialization (tree declarator,
- tree decl,
- int template_count,
- int flags)
+check_explicit_specialization (tree declarator,
+ tree decl,
+ int template_count,
+ int flags)
{
int have_def = flags & 2;
int is_friend = flags & 4;
@@ -1760,7 +1760,7 @@ check_explicit_specialization (tree declarator,
switch (tsk)
{
case tsk_none:
- if (processing_specialization)
+ if (processing_specialization)
{
specialization = 1;
SET_DECL_TEMPLATE_SPECIALIZATION (decl);
@@ -1779,7 +1779,7 @@ check_explicit_specialization (tree declarator,
template <class T> void f<int>(); */
error ("template-id %qD in declaration of primary template",
- declarator);
+ declarator);
return decl;
}
}
@@ -1798,14 +1798,14 @@ check_explicit_specialization (tree declarator,
case tsk_expl_inst:
if (have_def)
error ("definition provided for explicit instantiation");
-
+
explicit_instantiation = 1;
break;
case tsk_excessive_parms:
case tsk_insufficient_parms:
if (tsk == tsk_excessive_parms)
- error ("too many template parameter lists in declaration of %qD",
+ error ("too many template parameter lists in declaration of %qD",
decl);
else if (template_header_count)
error("too few template parameter lists in declaration of %qD", decl);
@@ -1833,7 +1833,7 @@ check_explicit_specialization (tree declarator,
"is not allowed", declarator);
else
error ("template-id %qD in declaration of primary template",
- declarator);
+ declarator);
return decl;
}
@@ -1842,10 +1842,10 @@ check_explicit_specialization (tree declarator,
specialization the containing class. Something like:
template <class T> struct S {
- template <class U> void f (U);
- };
+ template <class U> void f (U);
+ };
template <> template <class U> void S<int>::f(U) {}
-
+
That's a specialization -- but of the entire template. */
specialization = 1;
break;
@@ -1884,11 +1884,11 @@ check_explicit_specialization (tree declarator,
else
{
/* If there is no class context, the explicit instantiation
- must be at namespace scope. */
+ must be at namespace scope. */
gcc_assert (DECL_NAMESPACE_SCOPE_P (decl));
/* Find the namespace binding, using the declaration
- context. */
+ context. */
fns = namespace_binding (dname, CP_DECL_CONTEXT (decl));
if (!fns || !is_overloaded_fn (fns))
{
@@ -1915,11 +1915,11 @@ check_explicit_specialization (tree declarator,
/* It's not valid to write an explicit instantiation in
class scope, e.g.:
- class C { template void f(); }
+ class C { template void f(); }
This case is caught by the parser. However, on
something like:
-
+
template class C { void f(); };
(which is invalid) we can get here. The error will be
@@ -1929,7 +1929,7 @@ check_explicit_specialization (tree declarator,
return decl;
}
- else if (ctype != NULL_TREE
+ else if (ctype != NULL_TREE
&& (TREE_CODE (TREE_OPERAND (declarator, 0)) ==
IDENTIFIER_NODE))
{
@@ -1942,16 +1942,16 @@ check_explicit_specialization (tree declarator,
if (constructor_name_p (name, ctype))
{
int is_constructor = DECL_CONSTRUCTOR_P (decl);
-
+
if (is_constructor ? !TYPE_HAS_CONSTRUCTOR (ctype)
: !CLASSTYPE_DESTRUCTORS (ctype))
{
/* From [temp.expl.spec]:
-
+
If such an explicit specialization for the member
of a class template names an implicitly-declared
special member function (clause _special_), the
- program is ill-formed.
+ program is ill-formed.
Similar language is found in [temp.explicit]. */
error ("specialization of implicitly-declared special member function");
@@ -1995,8 +1995,8 @@ check_explicit_specialization (tree declarator,
fns = ovl_cons (OVL_CURRENT (ovl), fns);
}
}
-
- if (fns == NULL_TREE)
+
+ if (fns == NULL_TREE)
{
error ("no member function %qD declared in %qT", name, ctype);
return error_mark_node;
@@ -2004,7 +2004,7 @@ check_explicit_specialization (tree declarator,
else
TREE_OPERAND (declarator, 0) = fns;
}
-
+
/* Figure out what exactly is being specialized at this point.
Note that for an explicit instantiation, even one for a
member function, we cannot tell apriori whether the
@@ -2014,10 +2014,10 @@ check_explicit_specialization (tree declarator,
elided if they can be deduced from the rest of the
declaration. */
tmpl = determine_specialization (declarator, decl,
- &targs,
+ &targs,
member_specialization,
template_count);
-
+
if (!tmpl || tmpl == error_mark_node)
/* We couldn't figure out what this declaration was
specializing. */
@@ -2029,7 +2029,7 @@ check_explicit_specialization (tree declarator,
if (explicit_instantiation)
{
/* We don't set DECL_EXPLICIT_INSTANTIATION here; that
- is done by do_decl_instantiation later. */
+ is done by do_decl_instantiation later. */
int arg_depth = TMPL_ARGS_DEPTH (targs);
int parm_depth = TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl));
@@ -2050,7 +2050,7 @@ check_explicit_specialization (tree declarator,
= TREE_VEC_ELT (targs, i);
targs = new_targs;
}
-
+
return instantiate_template (tmpl, targs, tf_error);
}
@@ -2109,7 +2109,7 @@ check_explicit_specialization (tree declarator,
decl = register_specialization (decl, gen_tmpl, targs);
}
}
-
+
return decl;
}
@@ -2126,7 +2126,7 @@ comp_template_parms (tree parms1, tree parms2)
if (parms1 == parms2)
return 1;
- for (p1 = parms1, p2 = parms2;
+ for (p1 = parms1, p2 = parms2;
p1 != NULL_TREE && p2 != NULL_TREE;
p1 = TREE_CHAIN (p1), p2 = TREE_CHAIN (p2))
{
@@ -2140,7 +2140,7 @@ comp_template_parms (tree parms1, tree parms2)
if (TREE_VEC_LENGTH (t1) != TREE_VEC_LENGTH (t2))
return 0;
- for (i = 0; i < TREE_VEC_LENGTH (t2); ++i)
+ for (i = 0; i < TREE_VEC_LENGTH (t2); ++i)
{
tree parm1 = TREE_VALUE (TREE_VEC_ELT (t1, i));
tree parm2 = TREE_VALUE (TREE_VEC_ELT (t2, i));
@@ -2198,7 +2198,7 @@ check_template_shadow (tree decl)
/* We check for decl != olddecl to avoid bogus errors for using a
name inside a class. We check TPFI to avoid duplicate errors for
inline member templates. */
- if (decl == olddecl
+ if (decl == olddecl
|| TEMPLATE_PARMS_FOR_INLINE (current_template_parms))
return;
@@ -2210,11 +2210,11 @@ check_template_shadow (tree decl)
ORIG_LEVEL, DECL, and TYPE. */
static tree
-build_template_parm_index (int index,
- int level,
- int orig_level,
- tree decl,
- tree type)
+build_template_parm_index (int index,
+ int level,
+ int orig_level,
+ tree decl,
+ tree type)
{
tree t = make_node (TEMPLATE_PARM_INDEX);
TEMPLATE_PARM_IDX (t) = index;
@@ -2234,7 +2234,7 @@ build_template_parm_index (int index,
TEMPLATE_PARM_INDEX already exists, it is returned; otherwise, a
new one is created. */
-static tree
+static tree
reduce_template_parm_level (tree index, tree type, int levels)
{
if (TEMPLATE_PARM_DESCENDANTS (index) == NULL_TREE
@@ -2243,14 +2243,14 @@ reduce_template_parm_level (tree index, tree type, int levels)
{
tree orig_decl = TEMPLATE_PARM_DECL (index);
tree decl, t;
-
+
decl = build_decl (TREE_CODE (orig_decl), DECL_NAME (orig_decl), type);
TREE_CONSTANT (decl) = TREE_CONSTANT (orig_decl);
TREE_INVARIANT (decl) = TREE_INVARIANT (orig_decl);
TREE_READONLY (decl) = TREE_READONLY (orig_decl);
DECL_ARTIFICIAL (decl) = 1;
SET_DECL_TEMPLATE_PARM_P (decl);
-
+
t = build_template_parm_index (TEMPLATE_PARM_IDX (index),
TEMPLATE_PARM_LEVEL (index) - levels,
TEMPLATE_PARM_ORIG_LEVEL (index),
@@ -2311,12 +2311,12 @@ process_template_parm (tree list, tree next, bool is_non_type)
TREE_INVARIANT (parm) = 1;
TREE_READONLY (parm) = 1;
if (invalid_nontype_parm_type_p (TREE_TYPE (parm), 1))
- TREE_TYPE (parm) = void_type_node;
+ TREE_TYPE (parm) = void_type_node;
decl = build_decl (CONST_DECL, DECL_NAME (parm), TREE_TYPE (parm));
TREE_CONSTANT (decl) = 1;
TREE_INVARIANT (decl) = 1;
TREE_READONLY (decl) = 1;
- DECL_INITIAL (parm) = DECL_INITIAL (decl)
+ DECL_INITIAL (parm) = DECL_INITIAL (decl)
= build_template_parm_index (idx, processing_template_decl,
processing_template_decl,
decl, TREE_TYPE (parm));
@@ -2325,11 +2325,11 @@ process_template_parm (tree list, tree next, bool is_non_type)
{
tree t;
parm = TREE_VALUE (TREE_VALUE (parm));
-
+
if (parm && TREE_CODE (parm) == TEMPLATE_DECL)
{
t = make_aggr_type (TEMPLATE_TEMPLATE_PARM);
- /* This is for distinguishing between real templates and template
+ /* This is for distinguishing between real templates and template
template parameters */
TREE_TYPE (parm) = t;
TREE_TYPE (DECL_TEMPLATE_RESULT (parm)) = t;
@@ -2341,12 +2341,12 @@ process_template_parm (tree list, tree next, bool is_non_type)
/* parm is either IDENTIFIER_NODE or NULL_TREE. */
decl = build_decl (TYPE_DECL, parm, t);
}
-
+
TYPE_NAME (t) = decl;
TYPE_STUB_DECL (t) = decl;
parm = decl;
TEMPLATE_TYPE_PARM_INDEX (t)
- = build_template_parm_index (idx, processing_template_decl,
+ = build_template_parm_index (idx, processing_template_decl,
processing_template_decl,
decl, TREE_TYPE (parm));
}
@@ -2432,11 +2432,11 @@ current_template_args (void)
/* T will be a list if we are called from within a
begin/end_template_parm_list pair, but a vector directly
if within a begin/end_member_template_processing pair. */
- if (TREE_CODE (t) == TREE_LIST)
+ if (TREE_CODE (t) == TREE_LIST)
{
t = TREE_VALUE (t);
-
- if (TREE_CODE (t) == TYPE_DECL
+
+ if (TREE_CODE (t) == TYPE_DECL
|| TREE_CODE (t) == TEMPLATE_DECL)
t = TREE_TYPE (t);
else
@@ -2473,7 +2473,7 @@ build_template_decl (tree decl, tree parms, bool member_template_p)
DECL_NONCONVERTING_P (tmpl) = DECL_NONCONVERTING_P (decl);
DECL_ASSIGNMENT_OPERATOR_P (tmpl) = DECL_ASSIGNMENT_OPERATOR_P (decl);
if (DECL_OVERLOADED_OPERATOR_P (decl))
- SET_OVERLOADED_OPERATOR_CODE (tmpl,
+ SET_OVERLOADED_OPERATOR_CODE (tmpl,
DECL_OVERLOADED_OPERATOR_P (decl));
}
@@ -2578,7 +2578,7 @@ process_partial_specialization (tree decl)
};
The S2<T> declaration is actually invalid; it is a
- full-specialization. Of course,
+ full-specialization. Of course,
template <class U>
struct S2<T (*)(U)>;
@@ -2616,8 +2616,8 @@ process_partial_specialization (tree decl)
The argument list of the specialization shall not be identical to
the implicit argument list of the primary template. */
- if (comp_template_args
- (inner_args,
+ if (comp_template_args
+ (inner_args,
INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (TREE_TYPE
(maintmpl)))))
error ("partial specialization %qT does not specialize any template arguments", type);
@@ -2646,25 +2646,25 @@ process_partial_specialization (tree decl)
{
if (tpd.arg_uses_template_parms[i])
error ("template argument %qE involves template parameter(s)", arg);
- else
+ else
{
/* Look at the corresponding template parameter,
marking which template parameters its type depends
upon. */
- tree type =
- TREE_TYPE (TREE_VALUE (TREE_VEC_ELT (main_inner_parms,
+ tree type =
+ TREE_TYPE (TREE_VALUE (TREE_VEC_ELT (main_inner_parms,
i)));
if (!tpd2.parms)
{
/* We haven't yet initialized TPD2. Do so now. */
- tpd2.arg_uses_template_parms
+ tpd2.arg_uses_template_parms
= alloca (sizeof (int) * nargs);
/* The number of parameters here is the number in the
main template, which, as checked in the assertion
above, is NARGS. */
tpd2.parms = alloca (sizeof (int) * nargs);
- tpd2.level =
+ tpd2.level =
TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (maintmpl));
}
@@ -2678,7 +2678,7 @@ process_partial_specialization (tree decl)
&mark_template_parm,
&tpd2,
NULL);
-
+
if (tpd2.arg_uses_template_parms [i])
{
/* The type depended on some template parameters.
@@ -2690,9 +2690,9 @@ process_partial_specialization (tree decl)
&& tpd.arg_uses_template_parms [j])
{
error ("type %qT of template argument %qE depends "
- "on template parameter(s)",
- type,
- arg);
+ "on template parameter(s)",
+ type,
+ arg);
break;
}
}
@@ -2700,7 +2700,7 @@ process_partial_specialization (tree decl)
}
}
- if (retrieve_specialization (maintmpl, specargs,
+ if (retrieve_specialization (maintmpl, specargs,
/*class_specializations_p=*/true))
/* We've already got this specialization. */
return decl;
@@ -2724,7 +2724,7 @@ check_default_tmpl_args (tree decl, tree parms, int is_primary, int is_partial)
int last_level_to_check;
tree parm_level;
- /* [temp.param]
+ /* [temp.param]
A default template-argument shall not be specified in a
function template declaration or a function template definition, nor
@@ -2758,7 +2758,7 @@ check_default_tmpl_args (tree decl, tree parms, int is_primary, int is_partial)
return;
/* [temp.param]
-
+
If a template-parameter has a default template-argument, all
subsequent template-parameters shall have a default
template-argument supplied. */
@@ -2766,10 +2766,10 @@ check_default_tmpl_args (tree decl, tree parms, int is_primary, int is_partial)
{
tree inner_parms = TREE_VALUE (parm_level);
int ntparms = TREE_VEC_LENGTH (inner_parms);
- int seen_def_arg_p = 0;
+ int seen_def_arg_p = 0;
int i;
- for (i = 0; i < ntparms; ++i)
+ for (i = 0; i < ntparms; ++i)
{
tree parm = TREE_VEC_ELT (inner_parms, i);
if (TREE_PURPOSE (parm))
@@ -2787,13 +2787,13 @@ check_default_tmpl_args (tree decl, tree parms, int is_primary, int is_partial)
if (TREE_CODE (decl) != TYPE_DECL || is_partial || !is_primary)
/* For an ordinary class template, default template arguments are
allowed at the innermost level, e.g.:
- template <class T = int>
+ template <class T = int>
struct S {};
but, in a partial specialization, they're not allowed even
there, as we have in [temp.class.spec]:
-
+
The template parameter list of a specialization shall not
- contain default template argument values.
+ contain default template argument values.
So, for a partial specialization, or for a function template,
we look at all of them. */
@@ -2817,8 +2817,8 @@ check_default_tmpl_args (tree decl, tree parms, int is_primary, int is_partial)
examine the parameters to the class itself. On the one
hand, they will be checked when the class is defined, and,
on the other, default arguments are valid in things like:
- template <class T = double>
- struct S { template <class U> void f(U); };
+ template <class T = double>
+ struct S { template <class U> void f(U); };
Here the default argument for `S' has no bearing on the
declaration of `f'. */
last_level_to_check = template_class_depth (current_class_type) + 1;
@@ -2826,8 +2826,8 @@ check_default_tmpl_args (tree decl, tree parms, int is_primary, int is_partial)
/* Check everything. */
last_level_to_check = 0;
- for (parm_level = parms;
- parm_level && TMPL_PARMS_DEPTH (parm_level) >= last_level_to_check;
+ for (parm_level = parms;
+ parm_level && TMPL_PARMS_DEPTH (parm_level) >= last_level_to_check;
parm_level = TREE_CHAIN (parm_level))
{
tree inner_parms = TREE_VALUE (parm_level);
@@ -2835,7 +2835,7 @@ check_default_tmpl_args (tree decl, tree parms, int is_primary, int is_partial)
int ntparms;
ntparms = TREE_VEC_LENGTH (inner_parms);
- for (i = 0; i < ntparms; ++i)
+ for (i = 0; i < ntparms; ++i)
if (TREE_PURPOSE (TREE_VEC_ELT (inner_parms, i)))
{
if (msg)
@@ -2852,7 +2852,7 @@ check_default_tmpl_args (tree decl, tree parms, int is_primary, int is_partial)
/* At this point, if we're still interested in issuing messages,
they must apply to classes surrounding the object declared. */
if (msg)
- msg = "default argument for template parameter for class enclosing %qD";
+ msg = "default argument for template parameter for class enclosing %qD";
}
}
@@ -2877,7 +2877,7 @@ template_parm_this_level_p (tree t, void* data)
/* Creates a TEMPLATE_DECL for the indicated DECL using the template
parameters given by current_template_args, or reuses a
previously existing one, if appropriate. Returns the DECL, or an
- equivalent one, if it is replaced via a call to duplicate_decls.
+ equivalent one, if it is replaced via a call to duplicate_decls.
If IS_FRIEND is nonzero, DECL is a friend declaration. */
@@ -2934,16 +2934,16 @@ push_template_decl_real (tree decl, int is_friend)
member_template_p = true;
if (current_lang_name == lang_name_c)
error ("template with C linkage");
- else if (TREE_CODE (decl) == TYPE_DECL
- && ANON_AGGRNAME_P (DECL_NAME (decl)))
+ else if (TREE_CODE (decl) == TYPE_DECL
+ && ANON_AGGRNAME_P (DECL_NAME (decl)))
error ("template class without a name");
else if (TREE_CODE (decl) == FUNCTION_DECL)
{
if (DECL_DESTRUCTOR_P (decl))
{
/* [temp.mem]
-
- A destructor shall not be a member template. */
+
+ A destructor shall not be a member template. */
error ("destructor %qD declared as member template", decl);
return error_mark_node;
}
@@ -2954,9 +2954,9 @@ push_template_decl_real (tree decl, int is_friend)
|| (TREE_CHAIN (TYPE_ARG_TYPES ((TREE_TYPE (decl))))
== void_list_node)))
{
- /* [basic.stc.dynamic.allocation]
+ /* [basic.stc.dynamic.allocation]
- An allocation function can be a function
+ An allocation function can be a function
template. ... Template allocation functions shall
have two or more parameters. */
error ("invalid template declaration of %qD", decl);
@@ -2976,7 +2976,7 @@ push_template_decl_real (tree decl, int is_friend)
/* Check to see that the rules regarding the use of default
arguments are not being violated. */
- check_default_tmpl_args (decl, current_template_parms,
+ check_default_tmpl_args (decl, current_template_parms,
primary, is_partial);
if (is_partial)
@@ -2984,7 +2984,7 @@ push_template_decl_real (tree decl, int is_friend)
args = current_template_args ();
- if (!ctx
+ if (!ctx
|| TREE_CODE (ctx) == FUNCTION_DECL
|| (CLASS_TYPE_P (ctx) && TYPE_BEING_DEFINED (ctx))
|| (is_friend && !DECL_TEMPLATE_INFO (decl)))
@@ -2996,7 +2996,7 @@ push_template_decl_real (tree decl, int is_friend)
/* If DECL is a TYPE_DECL for a class-template, then there won't
be DECL_LANG_SPECIFIC. The information equivalent to
DECL_TEMPLATE_INFO is found in TYPE_TEMPLATE_INFO instead. */
- else if (DECL_IMPLICIT_TYPEDEF_P (decl)
+ else if (DECL_IMPLICIT_TYPEDEF_P (decl)
&& TYPE_TEMPLATE_INFO (TREE_TYPE (decl))
&& TYPE_TI_TEMPLATE (TREE_TYPE (decl)))
{
@@ -3051,9 +3051,9 @@ push_template_decl_real (tree decl, int is_friend)
}
else
tmpl = DECL_TI_TEMPLATE (decl);
-
+
if (DECL_FUNCTION_TEMPLATE_P (tmpl)
- && DECL_TEMPLATE_INFO (decl) && DECL_TI_ARGS (decl)
+ && DECL_TEMPLATE_INFO (decl) && DECL_TI_ARGS (decl)
&& DECL_TEMPLATE_SPECIALIZATION (decl)
&& DECL_MEMBER_TEMPLATE_P (tmpl))
{
@@ -3066,18 +3066,18 @@ push_template_decl_real (tree decl, int is_friend)
earlier call to check_explicit_specialization. */
args = DECL_TI_ARGS (decl);
- new_tmpl
+ new_tmpl
= build_template_decl (decl, current_template_parms,
member_template_p);
DECL_TEMPLATE_RESULT (new_tmpl) = decl;
TREE_TYPE (new_tmpl) = TREE_TYPE (decl);
DECL_TI_TEMPLATE (decl) = new_tmpl;
SET_DECL_TEMPLATE_SPECIALIZATION (new_tmpl);
- DECL_TEMPLATE_INFO (new_tmpl)
+ DECL_TEMPLATE_INFO (new_tmpl)
= tree_cons (tmpl, args, NULL_TREE);
- register_specialization (new_tmpl,
- most_general_template (tmpl),
+ register_specialization (new_tmpl,
+ most_general_template (tmpl),
args);
return decl;
}
@@ -3089,7 +3089,7 @@ push_template_decl_real (tree decl, int is_friend)
if (TMPL_ARGS_DEPTH (args) != i)
{
error ("expected %d levels of template parms for %q#D, got %d",
- i, decl, TMPL_ARGS_DEPTH (args));
+ i, decl, TMPL_ARGS_DEPTH (args));
}
else
for (current = decl; i > 0; --i, parms = TREE_CHAIN (parms))
@@ -3101,15 +3101,15 @@ push_template_decl_real (tree decl, int is_friend)
{
if (current == decl)
error ("got %d template parameters for %q#D",
- TREE_VEC_LENGTH (a), decl);
+ TREE_VEC_LENGTH (a), decl);
else
error ("got %d template parameters for %q#T",
- TREE_VEC_LENGTH (a), current);
+ TREE_VEC_LENGTH (a), current);
error (" but %d required", TREE_VEC_LENGTH (t));
}
/* Perhaps we should also check that the parms are used in the
- appropriate qualifying scopes in the declarator? */
+ appropriate qualifying scopes in the declarator? */
if (current == decl)
current = ctx;
@@ -3125,7 +3125,7 @@ push_template_decl_real (tree decl, int is_friend)
that we do not try to push a global template friend declared in a
template class; such a thing may well depend on the template
parameters of the class. */
- if (new_template_p && !ctx
+ if (new_template_p && !ctx
&& !(is_friend && template_class_depth (current_class_type) > 0))
{
tmpl = pushdecl_namespace_level (tmpl);
@@ -3149,7 +3149,7 @@ push_template_decl_real (tree decl, int is_friend)
/* It is a conversion operator. See if the type converted to
depends on innermost template operands. */
-
+
if (uses_template_parms_level (TREE_TYPE (TREE_TYPE (tmpl)),
depth))
DECL_TEMPLATE_CONV_FN_P (tmpl) = 1;
@@ -3192,7 +3192,7 @@ push_template_decl (tree decl)
template <class T> struct S;
template <class T> struct S {}; */
-void
+void
redeclare_class_template (tree type, tree parms)
{
tree tmpl;
@@ -3225,10 +3225,9 @@ redeclare_class_template (tree type, tree parms)
if (TREE_VEC_LENGTH (parms) != TREE_VEC_LENGTH (tmpl_parms))
{
cp_error_at ("previous declaration %qD", tmpl);
- error ("used %d template parameter%s instead of %d",
- TREE_VEC_LENGTH (tmpl_parms),
- TREE_VEC_LENGTH (tmpl_parms) == 1 ? "" : "s",
- TREE_VEC_LENGTH (parms));
+ error ("used %d template parameter(s) instead of %d",
+ TREE_VEC_LENGTH (tmpl_parms),
+ TREE_VEC_LENGTH (parms));
return;
}
@@ -3280,10 +3279,10 @@ fold_non_dependent_expr (tree expr)
{
/* If we're in a template, but EXPR isn't value dependent, simplify
it. We're supposed to treat:
-
+
template <typename T> void f(T[1 + 1]);
template <typename T> void f(T[2]);
-
+
as two declarations of the same function, for example. */
if (processing_template_decl
&& !type_dependent_expression_p (expr)
@@ -3306,7 +3305,7 @@ fold_non_dependent_expr (tree expr)
/* EXPR is an expression which is used in a constant-expression context.
For instance, it could be a VAR_DECL with a constant initializer.
Extract the innest constant expression.
-
+
This is basically a more powerful version of
integral_constant_value, which can be used also in templates where
initializers can maintain a syntactic rather than semantic form
@@ -3501,7 +3500,7 @@ convert_nontype_argument (tree type, tree expr)
expressed as "& id-expression" where the & is optional if the name
refers to a function or array, or if the corresponding
template-parameter is a reference.
-
+
Here, we do not care about functions, as they are invalid anyway
for a parameter of type pointer-to-object. */
bool constant_address_p =
@@ -3543,11 +3542,11 @@ convert_nontype_argument (tree type, tree expr)
"because of conflicts in cv-qualification", expr, type);
return NULL_TREE;
}
-
+
if (!real_lvalue_p (expr))
{
error ("%qE is not a valid template argument for type %qT "
- "because it is not a lvalue", expr, type);
+ "because it is not a lvalue", expr, type);
return NULL_TREE;
}
@@ -3577,7 +3576,7 @@ convert_nontype_argument (tree type, tree expr)
else if (TYPE_PTRFN_P (type))
{
/* If the argument is a template-id, we might not have enough
- context information to decay the pointer.
+ context information to decay the pointer.
??? Why static5.C requires decay and subst1.C works fine
even without it? */
if (!type_unknown_p (expr_type))
@@ -3666,29 +3665,29 @@ convert_nontype_argument (tree type, tree expr)
}
-/* Return 1 if PARM_PARMS and ARG_PARMS matches using rule for
- template template parameters. Both PARM_PARMS and ARG_PARMS are
- vectors of TREE_LIST nodes containing TYPE_DECL, TEMPLATE_DECL
+/* Return 1 if PARM_PARMS and ARG_PARMS matches using rule for
+ template template parameters. Both PARM_PARMS and ARG_PARMS are
+ vectors of TREE_LIST nodes containing TYPE_DECL, TEMPLATE_DECL
or PARM_DECL.
-
- ARG_PARMS may contain more parameters than PARM_PARMS. If this is
+
+ ARG_PARMS may contain more parameters than PARM_PARMS. If this is
the case, then extra parameters must have default arguments.
Consider the example:
template <class T, class Allocator = allocator> class vector;
template<template <class U> class TT> class C;
- C<vector> is a valid instantiation. PARM_PARMS for the above code
- contains a TYPE_DECL (for U), ARG_PARMS contains two TYPE_DECLs (for
- T and Allocator) and OUTER_ARGS contains the argument that is used to
+ C<vector> is a valid instantiation. PARM_PARMS for the above code
+ contains a TYPE_DECL (for U), ARG_PARMS contains two TYPE_DECLs (for
+ T and Allocator) and OUTER_ARGS contains the argument that is used to
substitute the TT parameter. */
static int
-coerce_template_template_parms (tree parm_parms,
- tree arg_parms,
- tsubst_flags_t complain,
+coerce_template_template_parms (tree parm_parms,
+ tree arg_parms,
+ tsubst_flags_t complain,
tree in_decl,
- tree outer_args)
+ tree outer_args)
{
int nparms, nargs, i;
tree parm, arg;
@@ -3711,11 +3710,11 @@ coerce_template_template_parms (tree parm_parms,
arg = TREE_VALUE (TREE_VEC_ELT (arg_parms, i));
if (arg == NULL_TREE || arg == error_mark_node
- || parm == NULL_TREE || parm == error_mark_node)
+ || parm == NULL_TREE || parm == error_mark_node)
return 0;
if (TREE_CODE (arg) != TREE_CODE (parm))
- return 0;
+ return 0;
switch (TREE_CODE (parm))
{
@@ -3750,7 +3749,7 @@ coerce_template_template_parms (tree parm_parms,
TREE_TYPE (arg)))
return 0;
break;
-
+
default:
gcc_unreachable ();
}
@@ -3766,22 +3765,22 @@ coerce_template_template_parms (tree parm_parms,
the full set of template arguments deduced so far. */
static tree
-convert_template_argument (tree parm,
- tree arg,
- tree args,
- tsubst_flags_t complain,
- int i,
- tree in_decl)
+convert_template_argument (tree parm,
+ tree arg,
+ tree args,
+ tsubst_flags_t complain,
+ int i,
+ tree in_decl)
{
tree val;
tree inner_args;
int is_type, requires_type, is_tmpl_type, requires_tmpl_type;
-
+
inner_args = INNERMOST_TEMPLATE_ARGS (args);
- if (TREE_CODE (arg) == TREE_LIST
+ if (TREE_CODE (arg) == TREE_LIST
&& TREE_CODE (TREE_VALUE (arg)) == OFFSET_REF)
- {
+ {
/* The template argument was the name of some
member function. That's usually
invalid, but static members are OK. In any
@@ -3799,7 +3798,7 @@ convert_template_argument (tree parm,
&& TREE_CODE (DECL_TEMPLATE_RESULT (arg)) == TYPE_DECL)
|| TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM
|| TREE_CODE (arg) == UNBOUND_CLASS_TEMPLATE);
-
+
if (is_tmpl_type
&& (TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM
|| TREE_CODE (arg) == UNBOUND_CLASS_TEMPLATE))
@@ -3811,8 +3810,8 @@ convert_template_argument (tree parm,
&& TREE_CODE (TREE_OPERAND (arg, 0)) == TEMPLATE_TYPE_PARM)
{
pedwarn ("to refer to a type member of a template parameter, "
- "use %<typename %E%>", arg);
-
+ "use %<typename %E%>", arg);
+
arg = make_typename_type (TREE_OPERAND (arg, 0),
TREE_OPERAND (arg, 1),
typename_type,
@@ -3826,12 +3825,12 @@ convert_template_argument (tree parm,
if (complain & tf_error)
{
error ("type/value mismatch at argument %d in template "
- "parameter list for %qD",
- i + 1, in_decl);
+ "parameter list for %qD",
+ i + 1, in_decl);
if (is_type)
error (" expected a constant of type %qT, got %qT",
- TREE_TYPE (parm),
- (is_tmpl_type ? DECL_NAME (arg) : arg));
+ TREE_TYPE (parm),
+ (is_tmpl_type ? DECL_NAME (arg) : arg));
else if (requires_tmpl_type)
error (" expected a class template, got %qE", arg);
else
@@ -3845,8 +3844,8 @@ convert_template_argument (tree parm,
if (in_decl && (complain & tf_error))
{
error ("type/value mismatch at argument %d in template "
- "parameter list for %qD",
- i + 1, in_decl);
+ "parameter list for %qD",
+ i + 1, in_decl);
if (is_tmpl_type)
error (" expected a type, got %qT", DECL_NAME (arg));
else
@@ -3854,7 +3853,7 @@ convert_template_argument (tree parm,
}
return error_mark_node;
}
-
+
if (is_type)
{
if (requires_tmpl_type)
@@ -3873,10 +3872,10 @@ convert_template_argument (tree parm,
inner_args))
{
val = arg;
-
- /* TEMPLATE_TEMPLATE_PARM node is preferred over
+
+ /* TEMPLATE_TEMPLATE_PARM node is preferred over
TEMPLATE_DECL. */
- if (val != error_mark_node
+ if (val != error_mark_node
&& DECL_TEMPLATE_TEMPLATE_PARM_P (val))
val = TREE_TYPE (val);
}
@@ -3885,12 +3884,12 @@ convert_template_argument (tree parm,
if (in_decl && (complain & tf_error))
{
error ("type/value mismatch at argument %d in "
- "template parameter list for %qD",
- i + 1, in_decl);
+ "template parameter list for %qD",
+ i + 1, in_decl);
error (" expected a template of type %qD, got %qD",
- parm, arg);
+ parm, arg);
}
-
+
val = error_mark_node;
}
}
@@ -3903,8 +3902,8 @@ convert_template_argument (tree parm,
tree t = tsubst (TREE_TYPE (parm), args, complain, in_decl);
if (invalid_nontype_parm_type_p (t, complain))
- return error_mark_node;
-
+ return error_mark_node;
+
if (!uses_template_parms (arg) && !uses_template_parms (t))
/* We used to call digest_init here. However, digest_init
will report errors, which we don't want when complain
@@ -3938,11 +3937,11 @@ convert_template_argument (tree parm,
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. */
-
+
static tree
-coerce_template_parms (tree parms,
- tree args,
- tree in_decl,
+coerce_template_parms (tree parms,
+ tree args,
+ tree in_decl,
tsubst_flags_t complain,
int require_all_arguments)
{
@@ -3960,11 +3959,11 @@ coerce_template_parms (tree parms,
&& require_all_arguments
&& TREE_PURPOSE (TREE_VEC_ELT (parms, nargs)) == NULL_TREE))
{
- if (complain & tf_error)
+ if (complain & tf_error)
{
error ("wrong number of template arguments (%d, should be %d)",
- nargs, nparms);
-
+ nargs, nparms);
+
if (in_decl)
cp_error_at ("provided for %qD", in_decl);
}
@@ -3991,18 +3990,18 @@ coerce_template_parms (tree parms,
complain, in_decl);
else
break;
-
+
gcc_assert (arg);
if (arg == error_mark_node)
{
if (complain & tf_error)
error ("template argument %d is invalid", i + 1);
}
- else
- arg = convert_template_argument (TREE_VALUE (parm),
+ else
+ arg = convert_template_argument (TREE_VALUE (parm),
arg, new_args, complain, i,
- in_decl);
-
+ in_decl);
+
if (arg == error_mark_node)
lost++;
TREE_VEC_ELT (new_inner_args, i) = arg;
@@ -4026,24 +4025,7 @@ template_args_equal (tree ot, tree nt)
/* For member templates */
return TREE_CODE (ot) == TREE_VEC && comp_template_args (ot, nt);
else if (TYPE_P (nt))
- {
- int c1, c2;
-
- if (!TYPE_P (ot))
- return 0;
-
- /* We must handle ObjC types specially because they may differ
- only in protocol qualifications (e.g., 'NSObject *' vs.
- 'NSObject <Foo> *') that must be taken into account here.
- See also cp/typeck.c:build_c_cast(), where a similar problem
- arises. We must call objc_comptypes() twice, since its
- comparisons are _not_ symmetric. */
- if ((c1 = objc_comptypes (ot, nt, 0)) >= 0
- && (c2 = objc_comptypes (nt, ot, 0)) >= 0)
- return (c1 && c2);
-
- return same_type_p (ot, nt);
- }
+ return TYPE_P (ot) && same_type_p (ot, nt);
else if (TREE_CODE (ot) == TREE_VEC || TYPE_P (ot))
return 0;
else
@@ -4113,14 +4095,14 @@ mangle_class_name_for_template (const char* name, tree parms, tree arglist)
{
if (TREE_CODE (arg) == TEMPLATE_DECL)
{
- /* Already substituted with real template. Just output
+ /* Already substituted with real template. Just output
the template name here */
- tree context = DECL_CONTEXT (arg);
- if (context)
- {
- /* The template may be defined in a namespace, or
- may be a member template. */
- gcc_assert (TREE_CODE (context) == NAMESPACE_DECL
+ tree context = DECL_CONTEXT (arg);
+ if (context)
+ {
+ /* The template may be defined in a namespace, or
+ may be a member template. */
+ gcc_assert (TREE_CODE (context) == NAMESPACE_DECL
|| CLASS_TYPE_P (context));
cat (decl_as_string (DECL_CONTEXT (arg),
TFF_PLAIN_IDENTIFIER));
@@ -4172,7 +4154,7 @@ classtype_mangled_name (tree t)
{
tree name = DECL_NAME (tmpl);
char *mangled_name = mangle_class_name_for_template
- (IDENTIFIER_POINTER (name),
+ (IDENTIFIER_POINTER (name),
DECL_INNERMOST_TEMPLATE_PARMS (tmpl),
CLASSTYPE_TI_ARGS (t));
tree id = get_identifier (mangled_name);
@@ -4247,7 +4229,7 @@ lookup_template_function (tree fns, tree arglist)
type = TREE_TYPE (fns);
if (TREE_CODE (fns) == OVERLOAD || !type)
type = unknown_type_node;
-
+
return build2 (TEMPLATE_ID_EXPR, type, fns, arglist);
}
@@ -4262,10 +4244,10 @@ tree
maybe_get_template_decl_from_type_decl (tree decl)
{
return (decl != NULL_TREE
- && TREE_CODE (decl) == TYPE_DECL
+ && TREE_CODE (decl) == TYPE_DECL
&& DECL_ARTIFICIAL (decl)
&& CLASS_TYPE_P (TREE_TYPE (decl))
- && CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (decl)))
+ && CLASSTYPE_TEMPLATE_INFO (TREE_TYPE (decl)))
? CLASSTYPE_TI_TEMPLATE (TREE_TYPE (decl)) : decl;
}
@@ -4275,16 +4257,16 @@ maybe_get_template_decl_from_type_decl (tree decl)
D1 is the PTYPENAME terminal, and ARGLIST is the list of arguments.
IN_DECL, if non-NULL, is the template declaration we are trying to
- instantiate.
+ instantiate.
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.
If the template class is really a local class in a template
function, then the FUNCTION_CONTEXT is the function in which it is
- being instantiated.
+ being instantiated.
??? Note that this function is currently called *twice* for each
template-id: the first time from the parser, while creating the
@@ -4294,18 +4276,18 @@ maybe_get_template_decl_from_type_decl (tree decl)
coercion (see convert_nontype_argument for more information on this). */
tree
-lookup_template_class (tree d1,
- tree arglist,
- tree in_decl,
- tree context,
- int entering_scope,
- tsubst_flags_t complain)
+lookup_template_class (tree d1,
+ tree arglist,
+ tree in_decl,
+ tree context,
+ int entering_scope,
+ tsubst_flags_t complain)
{
tree template = NULL_TREE, parmlist;
tree t;
-
+
timevar_push (TV_NAME_LOOKUP);
-
+
if (TREE_CODE (d1) == IDENTIFIER_NODE)
{
tree value = innermost_non_namespace_value (d1);
@@ -4331,14 +4313,14 @@ lookup_template_class (tree d1,
an implicit typename for the second A. Deal with it. */
if (TREE_CODE (type) == TYPENAME_TYPE && TREE_TYPE (type))
type = TREE_TYPE (type);
-
+
if (CLASSTYPE_TEMPLATE_INFO (type))
{
template = CLASSTYPE_TI_TEMPLATE (type);
d1 = DECL_NAME (template);
}
}
- else if (TREE_CODE (d1) == ENUMERAL_TYPE
+ else if (TREE_CODE (d1) == ENUMERAL_TYPE
|| (TYPE_P (d1) && IS_AGGR_TYPE (d1)))
{
template = TYPE_TI_TEMPLATE (d1);
@@ -4356,31 +4338,31 @@ lookup_template_class (tree d1,
if (! template)
{
if (complain & tf_error)
- error ("%qT is not a template", d1);
+ error ("%qT is not a template", d1);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
}
if (TREE_CODE (template) != TEMPLATE_DECL
- /* Make sure it's a user visible template, if it was named by
+ /* Make sure it's a user visible template, if it was named by
the user. */
|| ((complain & tf_user) && !DECL_TEMPLATE_PARM_P (template)
&& !PRIMARY_TEMPLATE_P (template)))
{
if (complain & tf_error)
- {
- error ("non-template type %qT used as a template", d1);
- if (in_decl)
+ {
+ error ("non-template type %qT used as a template", d1);
+ if (in_decl)
cp_error_at ("for template declaration %qD", in_decl);
}
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
}
complain &= ~tf_user;
-
+
if (DECL_TEMPLATE_TEMPLATE_PARM_P (template))
{
/* Create a new TEMPLATE_DECL and TEMPLATE_TEMPLATE_PARM node to store
- template arguments */
+ template arguments */
tree parm;
tree arglist2;
@@ -4391,8 +4373,8 @@ lookup_template_class (tree d1,
template <class T, class U = std::allocator<T> > class TT
- The template parameter level of T and U are one level larger than
- of TT. To proper process the default argument of U, say when an
+ The template parameter level of T and U are one level larger than
+ of TT. To proper process the default argument of U, say when an
instantiation `TT<int>' is seen, we need to build the full
arguments containing {int} as the innermost level. Outer levels,
available when not appearing as default template argument, can be
@@ -4407,16 +4389,16 @@ lookup_template_class (tree d1,
arglist = add_to_template_args (current_template_args (), arglist);
arglist2 = coerce_template_parms (parmlist, arglist, template,
- complain, /*require_all_args=*/1);
+ complain, /*require_all_args=*/1);
if (arglist2 == error_mark_node
|| (!uses_template_parms (arglist2)
&& check_instantiated_args (template, arglist2, complain)))
- POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
+ POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
parm = bind_template_template_parm (TREE_TYPE (template), arglist2);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, parm);
}
- else
+ else
{
tree template_type = TREE_TYPE (template);
tree gen_tmpl;
@@ -4437,15 +4419,15 @@ lookup_template_class (tree d1,
For example, given:
template <class T> struct S1 {
- template <class U> struct S2 {};
+ template <class U> struct S2 {};
template <class U> struct S2<U*> {};
- };
-
+ };
+
we will be called with an ARGLIST of `U*', but the
TEMPLATE will be `template <class T> template
<class U> struct S1<T>::S2'. We must fill in the missing
arguments. */
- arglist
+ arglist
= add_outermost_template_args (TYPE_TI_ARGS (TREE_TYPE (template)),
arglist);
arg_depth = TMPL_ARGS_DEPTH (arglist);
@@ -4453,7 +4435,7 @@ lookup_template_class (tree d1,
/* Now we should have enough arguments. */
gcc_assert (parm_depth == arg_depth);
-
+
/* From here on, we're only interested in the most general
template. */
template = gen_tmpl;
@@ -4468,15 +4450,15 @@ lookup_template_class (tree d1,
int saved_depth = TMPL_ARGS_DEPTH (arglist);
tree bound_args = make_tree_vec (parm_depth);
-
+
for (i = saved_depth,
- t = DECL_TEMPLATE_PARMS (template);
+ t = DECL_TEMPLATE_PARMS (template);
i > 0 && t != NULL_TREE;
--i, t = TREE_CHAIN (t))
{
tree a = coerce_template_parms (TREE_VALUE (t),
arglist, template,
- complain, /*require_all_args=*/1);
+ complain, /*require_all_args=*/1);
/* Don't process further if one of the levels fails. */
if (a == error_mark_node)
@@ -4485,7 +4467,7 @@ lookup_template_class (tree d1,
TREE_VEC_LENGTH (arglist) = saved_depth;
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
}
-
+
SET_TMPL_ARGS_LEVEL (bound_args, i, a);
/* We temporarily reduce the length of the ARGLIST so
@@ -4505,7 +4487,7 @@ lookup_template_class (tree d1,
= coerce_template_parms (INNERMOST_TEMPLATE_PARMS (parmlist),
INNERMOST_TEMPLATE_ARGS (arglist),
template,
- complain, /*require_all_args=*/1);
+ complain, /*require_all_args=*/1);
if (arglist == error_mark_node)
/* We were unable to bind the arguments. */
@@ -4514,7 +4496,7 @@ lookup_template_class (tree d1,
/* In the scope of a template class, explicit references to the
template class refer to the type of the template, not any
instantiation of it. For example, in:
-
+
template <class T> class C { void f(C<T>); }
the `C<T>' is just the same as `C'. Outside of the
@@ -4523,19 +4505,19 @@ lookup_template_class (tree d1,
arglist))
{
found = template_type;
-
+
if (!entering_scope && PRIMARY_TEMPLATE_P (template))
{
tree ctx;
-
- for (ctx = current_class_type;
+
+ for (ctx = current_class_type;
ctx && TREE_CODE (ctx) != NAMESPACE_DECL;
ctx = (TYPE_P (ctx)
? TYPE_CONTEXT (ctx)
: DECL_CONTEXT (ctx)))
if (TYPE_P (ctx) && same_type_p (ctx, template_type))
goto found_ctx;
-
+
/* We're not in the scope of the class, so the
TEMPLATE_TYPE is not the type we want after all. */
found = NULL_TREE;
@@ -4543,7 +4525,7 @@ lookup_template_class (tree d1,
}
}
if (found)
- POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, found);
+ POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, found);
/* If we already have this specialization, return it. */
found = retrieve_specialization (template, arglist,
@@ -4564,8 +4546,8 @@ lookup_template_class (tree d1,
INNERMOST_TEMPLATE_ARGS (arglist),
complain))
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, error_mark_node);
-
- if (!is_partial_instantiation
+
+ if (!is_partial_instantiation
&& !PRIMARY_TEMPLATE_P (template)
&& TREE_CODE (CP_DECL_CONTEXT (template)) == NAMESPACE_DECL)
{
@@ -4574,7 +4556,7 @@ lookup_template_class (tree d1,
/*tag_scope=*/ts_global);
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, found);
}
-
+
context = tsubst (DECL_CONTEXT (template), arglist,
complain, in_decl);
if (!context)
@@ -4598,7 +4580,7 @@ lookup_template_class (tree d1,
else
{
t = make_aggr_type (TREE_CODE (template_type));
- CLASSTYPE_DECLARED_CLASS (t)
+ CLASSTYPE_DECLARED_CLASS (t)
= CLASSTYPE_DECLARED_CLASS (template_type);
SET_CLASSTYPE_IMPLICIT_INSTANTIATION (t);
TYPE_FOR_JAVA (t) = TYPE_FOR_JAVA (template_type);
@@ -4613,11 +4595,11 @@ lookup_template_class (tree d1,
if (!TYPE_NAME (t))
{
TYPE_CONTEXT (t) = FROB_CONTEXT (context);
-
+
type_decl = create_implicit_typedef (DECL_NAME (template), t);
DECL_CONTEXT (type_decl) = TYPE_CONTEXT (t);
TYPE_STUB_DECL (t) = type_decl;
- DECL_SOURCE_LOCATION (type_decl)
+ DECL_SOURCE_LOCATION (type_decl)
= DECL_SOURCE_LOCATION (TYPE_STUB_DECL (template_type));
}
else
@@ -4678,26 +4660,26 @@ lookup_template_class (tree d1,
if (!found)
{
/* There was no partial instantiation. This happens
- where C<T> is a member template of A<T> and it's used
- in something like
-
- template <typename T> struct B { A<T>::C<int> m; };
- B<float>;
-
- Create the partial instantiation.
- */
- TREE_VEC_LENGTH (arglist)--;
- found = tsubst (template, arglist, complain, NULL_TREE);
- TREE_VEC_LENGTH (arglist)++;
- }
- }
-
- SET_TYPE_TEMPLATE_INFO (t, tree_cons (found, arglist, NULL_TREE));
- DECL_TEMPLATE_INSTANTIATIONS (template)
- = tree_cons (arglist, t,
+ where C<T> is a member template of A<T> and it's used
+ in something like
+
+ template <typename T> struct B { A<T>::C<int> m; };
+ B<float>;
+
+ Create the partial instantiation.
+ */
+ TREE_VEC_LENGTH (arglist)--;
+ found = tsubst (template, arglist, complain, NULL_TREE);
+ TREE_VEC_LENGTH (arglist)++;
+ }
+ }
+
+ SET_TYPE_TEMPLATE_INFO (t, tree_cons (found, arglist, NULL_TREE));
+ DECL_TEMPLATE_INSTANTIATIONS (template)
+ = tree_cons (arglist, t,
DECL_TEMPLATE_INSTANTIATIONS (template));
- if (TREE_CODE (t) == ENUMERAL_TYPE
+ if (TREE_CODE (t) == ENUMERAL_TYPE
&& !is_partial_instantiation)
/* Now that the type has been registered on the instantiations
list, we set up the enumerators. Because the enumeration
@@ -4722,7 +4704,7 @@ lookup_template_class (tree d1,
timevar_pop (TV_NAME_LOOKUP);
}
-struct pair_fn_data
+struct pair_fn_data
{
tree_fn_t fn;
void *data;
@@ -4793,7 +4775,7 @@ for_each_template_parm_r (tree *tp, int *walk_subtrees, void *d)
break;
case TYPEOF_TYPE:
- if (for_each_template_parm (TYPE_FIELDS (t), fn, data,
+ if (for_each_template_parm (TYPE_FIELDS (t), fn, data,
pfd->visited))
return error_mark_node;
break;
@@ -4812,7 +4794,7 @@ for_each_template_parm_r (tree *tp, int *walk_subtrees, void *d)
&& for_each_template_parm (DECL_INITIAL (t), fn, data,
pfd->visited))
return error_mark_node;
- if (DECL_CONTEXT (t)
+ if (DECL_CONTEXT (t)
&& for_each_template_parm (DECL_CONTEXT (t), fn, data,
pfd->visited))
return error_mark_node;
@@ -4844,7 +4826,7 @@ for_each_template_parm_r (tree *tp, int *walk_subtrees, void *d)
break;
case TYPENAME_TYPE:
- if (!fn
+ if (!fn
|| for_each_template_parm (TYPENAME_TYPE_FULLNAME (t), fn,
data, pfd->visited))
return error_mark_node;
@@ -4857,7 +4839,7 @@ for_each_template_parm_r (tree *tp, int *walk_subtrees, void *d)
pfd->visited))
return error_mark_node;
break;
-
+
case INDIRECT_REF:
case COMPONENT_REF:
/* If there's no type, then this thing must be some expression
@@ -4898,8 +4880,8 @@ for_each_template_parm_r (tree *tp, int *walk_subtrees, void *d)
return NULL_TREE;
}
-/* For each TEMPLATE_TYPE_PARM, TEMPLATE_TEMPLATE_PARM,
- BOUND_TEMPLATE_TEMPLATE_PARM or TEMPLATE_PARM_INDEX in T,
+/* 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 nonzero, the iteration is terminated, and
for_each_template_parm returns 1. Otherwise, the iteration
@@ -4927,8 +4909,8 @@ for_each_template_parm (tree t, tree_fn_t fn, void* data,
pfd.visited = visited;
else
pfd.visited = pointer_set_create ();
- result = walk_tree (&t,
- for_each_template_parm_r,
+ result = walk_tree (&t,
+ for_each_template_parm_r,
&pfd,
pfd.visited) != NULL_TREE;
@@ -4960,8 +4942,8 @@ uses_template_parms (tree t)
else if (TREE_CODE (t) == TREE_LIST)
dependent_p = (uses_template_parms (TREE_VALUE (t))
|| uses_template_parms (TREE_CHAIN (t)));
- else if (DECL_P (t)
- || EXPR_P (t)
+ else if (DECL_P (t)
+ || EXPR_P (t)
|| TREE_CODE (t) == TEMPLATE_PARM_INDEX
|| TREE_CODE (t) == OVERLOAD
|| TREE_CODE (t) == BASELINK
@@ -4973,7 +4955,7 @@ uses_template_parms (tree t)
gcc_assert (t == error_mark_node);
dependent_p = false;
}
-
+
processing_template_decl = saved_processing_template_decl;
return dependent_p;
@@ -5007,13 +4989,13 @@ push_tinst_level (tree d)
{
/* If the instantiation in question still has unbound template parms,
we don't really care if we can't instantiate it, so just return.
- This happens with base instantiation for implicit `typename'. */
+ This happens with base instantiation for implicit `typename'. */
if (uses_template_parms (d))
return 0;
last_template_error_tick = tinst_level_tick;
error ("template instantiation depth exceeds maximum of %d (use "
- "-ftemplate-depth-NN to increase the maximum) instantiating %qD",
+ "-ftemplate-depth-NN to increase the maximum) instantiating %qD",
max_tinst_depth, d);
print_instantiation_context ();
@@ -5082,14 +5064,14 @@ tsubst_friend_function (tree decl, tree args)
{
tree new_friend;
- if (TREE_CODE (decl) == FUNCTION_DECL
+ if (TREE_CODE (decl) == FUNCTION_DECL
&& DECL_TEMPLATE_INSTANTIATION (decl)
&& TREE_CODE (DECL_TI_TEMPLATE (decl)) != TEMPLATE_DECL)
/* This was a friend declared with an explicit template
argument list, e.g.:
-
+
friend void f<>(T);
-
+
to indicate that f was a template instantiation, not a new
function declaration. Now, we have to figure out what
instantiation of what template. */
@@ -5098,41 +5080,41 @@ tsubst_friend_function (tree decl, tree args)
tree new_args;
tree tmpl;
tree ns = decl_namespace_context (TYPE_MAIN_DECL (current_class_type));
-
+
/* Friend functions are looked up in the containing namespace scope.
- We must enter that scope, to avoid finding member functions of the
- current cless with same name. */
+ We must enter that scope, to avoid finding member functions of the
+ current cless with same name. */
push_nested_namespace (ns);
fns = tsubst_expr (DECL_TI_TEMPLATE (decl), args,
- tf_error | tf_warning, NULL_TREE);
+ tf_error | tf_warning, NULL_TREE);
pop_nested_namespace (ns);
arglist = tsubst (DECL_TI_ARGS (decl), args,
- tf_error | tf_warning, NULL_TREE);
+ tf_error | tf_warning, NULL_TREE);
template_id = lookup_template_function (fns, arglist);
-
+
new_friend = tsubst (decl, args, tf_error | tf_warning, NULL_TREE);
tmpl = determine_specialization (template_id, new_friend,
- &new_args,
+ &new_args,
/*need_member_template=*/0,
TREE_VEC_LENGTH (args));
return instantiate_template (tmpl, new_args, tf_error);
}
new_friend = tsubst (decl, args, tf_error | tf_warning, NULL_TREE);
-
+
/* The NEW_FRIEND will look like an instantiation, to the
compiler, but is not an instantiation from the point of view of
the language. For example, we might have had:
-
+
template <class T> struct S {
template <class U> friend void f(T, U);
};
-
+
Then, in S<int>, template <class U> void f(int, U) is not an
instantiation of anything. */
if (new_friend == error_mark_node)
return error_mark_node;
-
+
DECL_USE_TEMPLATE (new_friend) = 0;
if (TREE_CODE (decl) == TEMPLATE_DECL)
{
@@ -5150,7 +5132,7 @@ tsubst_friend_function (tree decl, tree args)
SET_DECL_RTL (new_friend, NULL_RTX);
SET_DECL_ASSEMBLER_NAME (new_friend, NULL_TREE);
}
-
+
if (DECL_NAMESPACE_SCOPE_P (new_friend))
{
tree old_decl;
@@ -5164,14 +5146,14 @@ tsubst_friend_function (tree decl, tree args)
possible. */
new_friend_template_info = DECL_TEMPLATE_INFO (new_friend);
new_friend_is_defn =
- (DECL_INITIAL (DECL_TEMPLATE_RESULT
+ (DECL_INITIAL (DECL_TEMPLATE_RESULT
(template_for_substitution (new_friend)))
!= NULL_TREE);
if (TREE_CODE (new_friend) == TEMPLATE_DECL)
{
/* This declaration is a `primary' template. */
DECL_PRIMARY_TEMPLATE (new_friend) = new_friend;
-
+
new_friend_result_template_info
= DECL_TEMPLATE_INFO (DECL_TEMPLATE_RESULT (new_friend));
}
@@ -5192,8 +5174,8 @@ tsubst_friend_function (tree decl, tree args)
declaration. For example, given:
template <class T> void f(T);
- template <class U> class C {
- template <class T> friend void f(T) {}
+ template <class U> class C {
+ template <class T> friend void f(T) {}
};
the friend declaration actually provides the definition
@@ -5210,14 +5192,14 @@ tsubst_friend_function (tree decl, tree args)
run through all specialization of `f', adding to their
DECL_TI_ARGS appropriately. In particular, they need a
new set of outer arguments, corresponding to the
- arguments for this class instantiation.
+ arguments for this class instantiation.
The same situation can arise with something like this:
friend void f(int);
- template <class T> class C {
- friend void f(T) {}
- };
+ template <class T> class C {
+ friend void f(T) {}
+ };
when `C<int>' is instantiated. Now, `f(int)' is defined
in the class. */
@@ -5239,22 +5221,22 @@ tsubst_friend_function (tree decl, tree args)
reregister_specialization (new_friend,
most_general_template (old_decl),
old_decl);
- else
+ else
{
tree t;
tree new_friend_args;
- DECL_TEMPLATE_INFO (DECL_TEMPLATE_RESULT (old_decl))
+ DECL_TEMPLATE_INFO (DECL_TEMPLATE_RESULT (old_decl))
= new_friend_result_template_info;
-
+
new_friend_args = TI_ARGS (new_friend_template_info);
- for (t = DECL_TEMPLATE_SPECIALIZATIONS (old_decl);
+ for (t = DECL_TEMPLATE_SPECIALIZATIONS (old_decl);
t != NULL_TREE;
t = TREE_CHAIN (t))
{
tree spec = TREE_VALUE (t);
-
- DECL_TI_ARGS (spec)
+
+ DECL_TI_ARGS (spec)
= add_outermost_template_args (new_friend_args,
DECL_TI_ARGS (spec));
}
@@ -5335,11 +5317,11 @@ tsubst_friend_class (tree friend_tmpl, tree args)
if (TREE_CODE (context) == NAMESPACE_DECL)
push_nested_namespace (context);
else
- push_nested_class (tsubst (context, args, tf_none, NULL_TREE));
+ push_nested_class (tsubst (context, args, tf_none, NULL_TREE));
}
/* First, we look for a class template. */
- tmpl = lookup_name (DECL_NAME (friend_tmpl), /*prefer_type=*/0);
+ tmpl = lookup_name (DECL_NAME (friend_tmpl), /*prefer_type=*/0);
/* But, if we don't find one, it might be because we're in a
situation like this:
@@ -5385,7 +5367,7 @@ tsubst_friend_class (tree friend_tmpl, tree args)
tmpl = tsubst (friend_tmpl, args, tf_error | tf_warning, NULL_TREE);
/* The new TMPL is not an instantiation of anything, so we
- forget its origins. We don't reset CLASSTYPE_TI_TEMPLATE for
+ forget its origins. We don't reset CLASSTYPE_TI_TEMPLATE for
the new type because that is supposed to be the corresponding
template decl, i.e., TMPL. */
DECL_USE_TEMPLATE (tmpl) = 0;
@@ -5398,7 +5380,7 @@ tsubst_friend_class (tree friend_tmpl, tree args)
friend_type = TREE_TYPE (pushdecl_top_level (tmpl));
}
- if (context)
+ if (context)
{
if (TREE_CODE (context) == NAMESPACE_DECL)
pop_nested_namespace (context);
@@ -5435,11 +5417,11 @@ instantiate_class_template (tree type)
tree typedecl;
tree pbinfo;
tree base_list;
-
+
if (type == error_mark_node)
return error_mark_node;
- if (TYPE_BEING_DEFINED (type)
+ if (TYPE_BEING_DEFINED (type)
|| COMPLETE_TYPE_P (type)
|| dependent_type_p (type))
return type;
@@ -5459,7 +5441,7 @@ instantiate_class_template (tree type)
{
const char *str = "candidates are:";
error ("ambiguous class template instantiation for %q#T", type);
- for (t = DECL_TEMPLATE_SPECIALIZATIONS (template); t;
+ for (t = DECL_TEMPLATE_SPECIALIZATIONS (template); t;
t = TREE_CHAIN (t))
{
if (get_class_bindings (TREE_VALUE (t), TREE_PURPOSE (t), args))
@@ -5505,10 +5487,10 @@ instantiate_class_template (tree type)
template <class T> struct S {};
template <class T> struct S<T*> {};
-
+
and supposing that we are instantiating S<int*>, ARGS will
present be {int*} but we need {int}. */
- tree inner_args
+ tree inner_args
= get_class_bindings (TREE_VALUE (t), TREE_PURPOSE (t),
args);
@@ -5571,7 +5553,7 @@ instantiate_class_template (tree type)
the accessibility of types named in dependent bases are
looked up from. */
pushed_scope = push_scope (context ? context : global_namespace);
-
+
/* Substitute into each of the bases to determine the actual
basetypes. */
for (i = 0; BINFO_BASE_ITERATE (pbinfo, i, pbase_binfo); i++)
@@ -5583,7 +5565,7 @@ instantiate_class_template (tree type)
base = tsubst (BINFO_TYPE (pbase_binfo), args, tf_error, NULL_TREE);
if (base == error_mark_node)
continue;
-
+
base_list = tree_cons (access, base, base_list);
if (BINFO_VIRTUAL_P (pbase_binfo))
TREE_TYPE (base_list) = integer_type_node;
@@ -5666,12 +5648,12 @@ instantiate_class_template (tree type)
pushtag (name, newtag, /*tag_scope=*/ts_current);
}
}
- else if (TREE_CODE (t) == FUNCTION_DECL
+ else if (TREE_CODE (t) == FUNCTION_DECL
|| DECL_FUNCTION_TEMPLATE_P (t))
{
/* Build new TYPE_METHODS. */
tree r;
-
+
if (TREE_CODE (t) == TEMPLATE_DECL)
++processing_template_decl;
r = tsubst (t, args, tf_error, NULL_TREE);
@@ -5729,7 +5711,7 @@ instantiate_class_template (tree type)
if (!COMPLETE_TYPE_P (rtype))
{
cxx_incomplete_type_error (r, rtype);
- r = error_mark_node;
+ r = error_mark_node;
}
}
@@ -5744,7 +5726,7 @@ instantiate_class_template (tree type)
set_current_access_from_decl (r);
finish_member_declaration (r);
}
- }
+ }
}
}
else
@@ -5760,7 +5742,7 @@ instantiate_class_template (tree type)
{
/* template <class T> friend class C; */
friend_type = tsubst_friend_class (friend_type, args);
- adjust_processing_template_decl = true;
+ adjust_processing_template_decl = true;
}
else if (TREE_CODE (friend_type) == UNBOUND_CLASS_TEMPLATE)
{
@@ -5769,7 +5751,7 @@ instantiate_class_template (tree type)
tf_error | tf_warning, NULL_TREE);
if (TREE_CODE (friend_type) == TEMPLATE_DECL)
friend_type = TREE_TYPE (friend_type);
- adjust_processing_template_decl = true;
+ adjust_processing_template_decl = true;
}
else if (TREE_CODE (friend_type) == TYPENAME_TYPE)
{
@@ -5804,8 +5786,8 @@ instantiate_class_template (tree type)
/* The call to xref_tag_from_type does injection for friend
classes. */
push_nested_namespace (ns);
- friend_type =
- xref_tag_from_type (friend_type, NULL_TREE,
+ friend_type =
+ xref_tag_from_type (friend_type, NULL_TREE,
/*tag_scope=*/ts_current);
pop_nested_namespace (ns);
}
@@ -5821,7 +5803,7 @@ instantiate_class_template (tree type)
friend class C<int>;
- We don't have to do anything in these cases. */
+ We don't have to do anything in these cases. */
if (adjust_processing_template_decl)
/* Trick make_friend_class into realizing that the friend
@@ -5832,7 +5814,7 @@ instantiate_class_template (tree type)
++processing_template_decl;
if (friend_type != error_mark_node)
- make_friend_class (type, friend_type, /*complain=*/false);
+ make_friend_class (type, friend_type, /*complain=*/false);
if (adjust_processing_template_decl)
--processing_template_decl;
@@ -5853,7 +5835,7 @@ instantiate_class_template (tree type)
++processing_template_decl;
push_deferring_access_checks (dk_no_check);
}
-
+
r = tsubst_friend_function (t, args);
add_friend (type, r, /*complain=*/false);
if (TREE_CODE (t) == TEMPLATE_DECL)
@@ -5880,7 +5862,7 @@ instantiate_class_template (tree type)
default arguments may reference members of the class. */
if (!PRIMARY_TEMPLATE_P (template))
for (t = TYPE_METHODS (type); t; t = TREE_CHAIN (t))
- if (TREE_CODE (t) == FUNCTION_DECL
+ if (TREE_CODE (t) == FUNCTION_DECL
/* Implicitly generated member functions will not have template
information; they are not instantiations, but instead are
created "fresh" for each instantiation. */
@@ -5906,7 +5888,7 @@ static tree
tsubst_template_arg (tree t, tree args, tsubst_flags_t complain, tree in_decl)
{
tree r;
-
+
if (!t)
r = t;
else if (TYPE_P (t))
@@ -5931,12 +5913,12 @@ tsubst_template_arg (tree t, tree args, tsubst_flags_t complain, tree in_decl)
will always be set. */
if (!TREE_TYPE (r))
{
- int saved_processing_template_decl = processing_template_decl;
+ int saved_processing_template_decl = processing_template_decl;
processing_template_decl = 0;
r = tsubst_copy_and_build (r, /*args=*/NULL_TREE,
tf_error, /*in_decl=*/NULL_TREE,
/*function_p=*/false);
- processing_template_decl = saved_processing_template_decl;
+ processing_template_decl = saved_processing_template_decl;
}
r = fold (r);
}
@@ -5952,7 +5934,7 @@ tsubst_template_args (tree t, tree args, tsubst_flags_t complain, tree in_decl)
int len = TREE_VEC_LENGTH (t);
int need_new = 0, i;
tree *elts = alloca (len * sizeof (tree));
-
+
for (i = 0; i < len; i++)
{
tree orig_arg = TREE_VEC_ELT (t, i);
@@ -5962,7 +5944,7 @@ tsubst_template_args (tree t, tree args, tsubst_flags_t complain, tree in_decl)
new_arg = tsubst_template_args (orig_arg, args, complain, in_decl);
else
new_arg = tsubst_template_arg (orig_arg, args, complain, in_decl);
-
+
if (new_arg == error_mark_node)
return error_mark_node;
@@ -5970,14 +5952,14 @@ tsubst_template_args (tree t, tree args, tsubst_flags_t complain, tree in_decl)
if (new_arg != orig_arg)
need_new = 1;
}
-
+
if (!need_new)
return t;
t = make_tree_vec (len);
for (i = 0; i < len; i++)
TREE_VEC_ELT (t, i) = elts[i];
-
+
return t;
}
@@ -5999,10 +5981,10 @@ tsubst_template_parms (tree parms, tree args, tsubst_flags_t complain)
new_parms = &(TREE_CHAIN (*new_parms)),
parms = TREE_CHAIN (parms))
{
- tree new_vec =
+ tree new_vec =
make_tree_vec (TREE_VEC_LENGTH (TREE_VALUE (parms)));
int i;
-
+
for (i = 0; i < TREE_VEC_LENGTH (new_vec); ++i)
{
tree tuple = TREE_VEC_ELT (TREE_VALUE (parms), i);
@@ -6012,13 +5994,13 @@ tsubst_template_parms (tree parms, tree args, tsubst_flags_t complain)
parm_decl = tsubst (parm_decl, args, complain, NULL_TREE);
default_value = tsubst_template_arg (default_value, args,
complain, NULL_TREE);
-
+
tuple = build_tree_list (default_value, parm_decl);
TREE_VEC_ELT (new_vec, i) = tuple;
}
-
- *new_parms =
- tree_cons (size_int (TMPL_PARMS_DEPTH (parms)
+
+ *new_parms =
+ tree_cons (size_int (TMPL_PARMS_DEPTH (parms)
- TMPL_ARGS_DEPTH (args)),
new_vec, NULL_TREE);
}
@@ -6033,11 +6015,11 @@ tsubst_template_parms (tree parms, tree args, tsubst_flags_t complain)
we are presently tsubst'ing. Return the substituted value. */
static tree
-tsubst_aggr_type (tree t,
- tree args,
- tsubst_flags_t complain,
- tree in_decl,
- int entering_scope)
+tsubst_aggr_type (tree t,
+ tree args,
+ tsubst_flags_t complain,
+ tree in_decl,
+ int entering_scope)
{
if (t == NULL_TREE)
return NULL_TREE;
@@ -6078,12 +6060,12 @@ tsubst_aggr_type (tree t,
if (argvec == error_mark_node)
return error_mark_node;
- r = lookup_template_class (t, argvec, in_decl, context,
+ r = lookup_template_class (t, argvec, in_decl, context,
entering_scope, complain);
return cp_build_qualified_type_real (r, TYPE_QUALS (t), complain);
}
- else
+ else
/* This is not a template type, so there's nothing to do. */
return t;
@@ -6103,14 +6085,14 @@ tsubst_default_argument (tree fn, tree type, tree arg)
/* This default argument came from a template. Instantiate the
default argument here, not in tsubst. In the case of
- something like:
-
+ something like:
+
template <class T>
struct S {
static T t();
void f(T = t());
};
-
+
we must be careful to do name lookup in the scope of S<T>,
rather than in the current class. */
push_access_scope (fn);
@@ -6162,11 +6144,11 @@ tsubst_default_arguments (tree fn)
if (uses_template_parms (tmpl_args))
return;
- for (arg = TYPE_ARG_TYPES (TREE_TYPE (fn));
- arg;
+ for (arg = TYPE_ARG_TYPES (TREE_TYPE (fn));
+ arg;
arg = TREE_CHAIN (arg))
if (TREE_PURPOSE (arg))
- TREE_PURPOSE (arg) = tsubst_default_argument (fn,
+ TREE_PURPOSE (arg) = tsubst_default_argument (fn,
TREE_VALUE (arg),
TREE_PURPOSE (arg));
}
@@ -6210,7 +6192,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
TREE_TYPE (r) = new_type;
DECL_TEMPLATE_RESULT (r)
= build_decl (TYPE_DECL, DECL_NAME (decl), new_type);
- DECL_TEMPLATE_PARMS (r)
+ DECL_TEMPLATE_PARMS (r)
= tsubst_template_parms (DECL_TEMPLATE_PARMS (t), args,
complain);
TYPE_NAME (new_type) = r;
@@ -6221,7 +6203,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
The ARGS are for the surrounding class type, so the
full args contain the tsubst'd args for the context,
plus the innermost args from the template decl. */
- tmpl_args = DECL_CLASS_TEMPLATE_P (t)
+ tmpl_args = DECL_CLASS_TEMPLATE_P (t)
? CLASSTYPE_TI_ARGS (TREE_TYPE (t))
: DECL_TI_ARGS (DECL_TEMPLATE_RESULT (t));
full_args = tsubst_template_args (tmpl_args, args,
@@ -6241,7 +6223,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
}
/* Make a new template decl. It will be similar to the
- original, but will record the current template arguments.
+ original, but will record the current template arguments.
We also create a new function declaration, which is just
like the old one, but points to this new template, rather
than the old one. */
@@ -6249,10 +6231,10 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
gcc_assert (DECL_LANG_SPECIFIC (r) != 0);
TREE_CHAIN (r) = NULL_TREE;
- DECL_CONTEXT (r)
- = tsubst_aggr_type (DECL_CONTEXT (t), args,
- complain, in_decl,
- /*entering_scope=*/1);
+ DECL_CONTEXT (r)
+ = tsubst_aggr_type (DECL_CONTEXT (t), args,
+ complain, in_decl,
+ /*entering_scope=*/1);
DECL_TEMPLATE_INFO (r) = build_tree_list (t, args);
if (TREE_CODE (decl) == TYPE_DECL)
@@ -6285,7 +6267,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
/* The template parameters for this new template are all the
template parameters for the old template, except the
outermost level of parameters. */
- DECL_TEMPLATE_PARMS (r)
+ DECL_TEMPLATE_PARMS (r)
= tsubst_template_parms (DECL_TEMPLATE_PARMS (t), args,
complain);
@@ -6294,7 +6276,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
if (TREE_CODE (decl) != TYPE_DECL)
/* Record this non-type partial instantiation. */
- register_specialization (r, t,
+ register_specialization (r, t,
DECL_TI_ARGS (DECL_TEMPLATE_RESULT (r)));
}
break;
@@ -6332,9 +6314,9 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
specialization, and the complete set of arguments used to
specialize R. */
gen_tmpl = most_general_template (DECL_TI_TEMPLATE (t));
- argvec = tsubst_template_args (DECL_TI_ARGS
+ argvec = tsubst_template_args (DECL_TI_ARGS
(DECL_TEMPLATE_RESULT (gen_tmpl)),
- args, complain, in_decl);
+ args, complain, in_decl);
/* Check to see if we already have this specialization. */
spec = retrieve_specialization (gen_tmpl, argvec,
@@ -6350,17 +6332,17 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
there was a specialization of a member template, like
this:
- template <class T> struct S { template <class U> void f(); }
- template <> template <class U> void S<int>::f(U);
+ template <class T> struct S { template <class U> void f(); }
+ template <> template <class U> void S<int>::f(U);
Here, we'll be substituting into the specialization,
because that's where we can find the code we actually
want to generate, but we'll have enough arguments for
- the most general template.
+ the most general template.
We also deal with the peculiar case:
- template <class T> struct S {
+ template <class T> struct S {
template <class U> friend void f();
};
template <class U> void f() {}
@@ -6379,8 +6361,8 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
which we can spot because the pattern will be a
specialization in this case. */
args_depth = TMPL_ARGS_DEPTH (args);
- parms_depth =
- TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (DECL_TI_TEMPLATE (t)));
+ parms_depth =
+ TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (DECL_TI_TEMPLATE (t)));
if (args_depth > parms_depth
&& !DECL_TEMPLATE_SPECIALIZATION (t))
args = get_innermost_template_args (args, parms_depth);
@@ -6389,8 +6371,8 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
{
/* This special case arises when we have something like this:
- template <class T> struct S {
- friend void f<int>(int, double);
+ template <class T> struct S {
+ friend void f<int>(int, double);
};
Here, the DECL_TI_TEMPLATE for the friend declaration
@@ -6407,7 +6389,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
member = 2;
else
member = 1;
- ctx = tsubst_aggr_type (DECL_CONTEXT (t), args,
+ ctx = tsubst_aggr_type (DECL_CONTEXT (t), args,
complain, t, /*entering_scope=*/1);
}
else
@@ -6420,9 +6402,9 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
return error_mark_node;
/* We do NOT check for matching decls pushed separately at this
- point, as they may not represent instantiations of this
- template, and in any case are considered separate under the
- discrete model. */
+ point, as they may not represent instantiations of this
+ template, and in any case are considered separate under the
+ discrete model. */
r = copy_decl (t);
DECL_USE_TEMPLATE (r) = 0;
TREE_TYPE (r) = type;
@@ -6432,7 +6414,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
DECL_INITIAL (r) = NULL_TREE;
DECL_CONTEXT (r) = ctx;
- if (member && DECL_CONV_FN_P (r))
+ if (member && DECL_CONV_FN_P (r))
/* Type-conversion operator. Reconstruct the name, in
case it's the name of one of the template's parameters. */
DECL_NAME (r) = mangle_conv_op_name_for_type (TREE_TYPE (type));
@@ -6467,7 +6449,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
GEN_TMPL is NULL. */
if (gen_tmpl)
{
- DECL_TEMPLATE_INFO (r)
+ DECL_TEMPLATE_INFO (r)
= tree_cons (gen_tmpl, argvec, NULL_TREE);
SET_DECL_IMPLICIT_INSTANTIATION (r);
register_specialization (r, gen_tmpl, argvec);
@@ -6476,9 +6458,9 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
until they are called, for a template. But, for a
declaration like:
- template <class T> void f ()
- { extern void g(int i = T()); }
-
+ template <class T> void f ()
+ { extern void g(int i = T()); }
+
we should do the substitution when the template is
instantiated. We handle the member function case in
instantiate_class_template since the default arguments
@@ -6492,7 +6474,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
/* Copy the list of befriending classes. */
for (friends = &DECL_BEFRIENDING_CLASSES (r);
*friends;
- friends = &TREE_CHAIN (*friends))
+ friends = &TREE_CHAIN (*friends))
{
*friends = copy_node (*friends);
TREE_VALUE (*friends) = tsubst (TREE_VALUE (*friends),
@@ -6512,8 +6494,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
clone_function_decl (r, /*update_method_vec_p=*/0);
}
else if (IDENTIFIER_OPNAME_P (DECL_NAME (r)))
- grok_op_properties (r, DECL_FRIEND_P (r),
- (complain & tf_error) != 0);
+ grok_op_properties (r, (complain & tf_error) != 0);
if (DECL_FRIEND_P (t) && DECL_FRIEND_CONTEXT (t))
SET_DECL_FRIEND_CONTEXT (r,
@@ -6570,22 +6551,26 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
DECL_INITIAL (r) = tsubst_expr (DECL_INITIAL (t), args,
complain, in_decl);
TREE_CHAIN (r) = NULL_TREE;
- if (VOID_TYPE_P (type))
+ if (VOID_TYPE_P (type))
cp_error_at ("instantiation of %qD as type %qT", r, type);
}
break;
case USING_DECL:
- {
- r = copy_node (t);
- /* It is not a dependent using decl any more. */
- TREE_TYPE (r) = void_type_node;
- DECL_INITIAL (r)
- = tsubst_copy (DECL_INITIAL (t), args, complain, in_decl);
- DECL_NAME (r)
- = tsubst_copy (DECL_NAME (t), args, complain, in_decl);
- TREE_CHAIN (r) = NULL_TREE;
- }
+ /* We reach here only for member using decls. */
+ if (DECL_DEPENDENT_P (t))
+ {
+ r = do_class_using_decl
+ (tsubst_copy (USING_DECL_SCOPE (t), args, complain, in_decl),
+ tsubst_copy (DECL_NAME (t), args, complain, in_decl));
+ if (!r)
+ r = error_mark_node;
+ }
+ else
+ {
+ r = copy_node (t);
+ TREE_CHAIN (r) = NULL_TREE;
+ }
break;
case TYPE_DECL:
@@ -6614,12 +6599,12 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
break;
}
}
-
+
/* Assume this is a non-local variable. */
local_p = 0;
if (TYPE_P (CP_DECL_CONTEXT (t)))
- ctx = tsubst_aggr_type (DECL_CONTEXT (t), args,
+ ctx = tsubst_aggr_type (DECL_CONTEXT (t), args,
complain,
in_decl, /*entering_scope=*/1);
else if (DECL_NAMESPACE_SCOPE_P (t))
@@ -6705,7 +6690,7 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
default:
gcc_unreachable ();
- }
+ }
/* Restore the file and line information. */
input_location = saved_loc;
@@ -6716,17 +6701,19 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
/* Substitute into the ARG_TYPES of a function type. */
static tree
-tsubst_arg_types (tree arg_types,
- tree args,
- tsubst_flags_t complain,
- tree in_decl)
+tsubst_arg_types (tree arg_types,
+ tree args,
+ tsubst_flags_t complain,
+ tree in_decl)
{
tree remaining_arg_types;
tree type;
+ tree default_arg;
+ tree result = NULL_TREE;
if (!arg_types || arg_types == void_list_node)
return arg_types;
-
+
remaining_arg_types = tsubst_arg_types (TREE_CHAIN (arg_types),
args, complain, in_decl);
if (remaining_arg_types == error_mark_node)
@@ -6738,11 +6725,11 @@ tsubst_arg_types (tree arg_types,
if (VOID_TYPE_P (type))
{
if (complain & tf_error)
- {
- error ("invalid parameter type %qT", type);
- if (in_decl)
- cp_error_at ("in declaration %qD", in_decl);
- }
+ {
+ error ("invalid parameter type %qT", type);
+ if (in_decl)
+ cp_error_at ("in declaration %qD", in_decl);
+ }
return error_mark_node;
}
@@ -6750,12 +6737,24 @@ tsubst_arg_types (tree arg_types,
top-level qualifiers as required. */
type = TYPE_MAIN_VARIANT (type_decays_to (type));
- /* Note that we do not substitute into default arguments here. The
- standard mandates that they be instantiated only when needed,
- which is done in build_over_call. */
- return hash_tree_cons (TREE_PURPOSE (arg_types), type,
- remaining_arg_types);
-
+ /* We do not substitute into default arguments here. The standard
+ mandates that they be instantiated only when needed, which is
+ done in build_over_call. */
+ default_arg = TREE_PURPOSE (arg_types);
+
+ if (default_arg && TREE_CODE (default_arg) == DEFAULT_ARG)
+ {
+ /* We've instantiated a template before its default arguments
+ have been parsed. This can happen for a nested template
+ class, and is not an error unless we require the default
+ argument in a call of this function. */
+ result = tree_cons (default_arg, type, remaining_arg_types);
+ VEC_safe_push (tree, gc, DEFARG_INSTANTIATIONS (default_arg), result);
+ }
+ else
+ result = hash_tree_cons (default_arg, type, remaining_arg_types);
+
+ return result;
}
/* Substitute into a FUNCTION_TYPE or METHOD_TYPE. This routine does
@@ -6776,10 +6775,10 @@ tsubst_arg_types (tree arg_types,
results in an invalid type.] */
static tree
-tsubst_function_type (tree t,
- tree args,
- tsubst_flags_t complain,
- tree in_decl)
+tsubst_function_type (tree t,
+ tree args,
+ tsubst_flags_t complain,
+ tree in_decl)
{
tree return_type;
tree arg_types;
@@ -6795,7 +6794,7 @@ tsubst_function_type (tree t,
/* The standard does not presently indicate that creation of a
function type with an invalid return type is a deduction failure.
However, that is clearly analogous to creating an array of "void"
- or a reference to a reference. This is core issue #486. */
+ or a reference to a reference. This is core issue #486. */
if (TREE_CODE (return_type) == ARRAY_TYPE
|| TREE_CODE (return_type) == FUNCTION_TYPE)
{
@@ -6811,10 +6810,10 @@ tsubst_function_type (tree t,
/* Substitute the argument types. */
arg_types = tsubst_arg_types (TYPE_ARG_TYPES (t), args,
- complain, in_decl);
+ complain, in_decl);
if (arg_types == error_mark_node)
return error_mark_node;
-
+
/* Construct a new type node and return it. */
if (TREE_CODE (t) == FUNCTION_TYPE)
fntype = build_function_type (return_type, arg_types);
@@ -6824,10 +6823,10 @@ tsubst_function_type (tree t,
if (! IS_AGGR_TYPE (r))
{
/* [temp.deduct]
-
+
Type deduction may fail for any of the following
reasons:
-
+
-- Attempting to create "pointer to member of T" when T
is not a class type. */
if (complain & tf_error)
@@ -6835,14 +6834,14 @@ tsubst_function_type (tree t,
r);
return error_mark_node;
}
-
- fntype = build_method_type_directly (r, return_type,
+
+ fntype = build_method_type_directly (r, return_type,
TREE_CHAIN (arg_types));
}
fntype = cp_build_qualified_type_real (fntype, TYPE_QUALS (t), complain);
fntype = cp_build_type_attribute_variant (fntype, TYPE_ATTRIBUTES (t));
-
- return fntype;
+
+ return fntype;
}
/* FNTYPE is a FUNCTION_TYPE or METHOD_TYPE. Substitute the template
@@ -6850,8 +6849,8 @@ tsubst_function_type (tree t,
specification. If there is no specification, return NULL_TREE. */
static tree
-tsubst_exception_specification (tree fntype,
- tree args,
+tsubst_exception_specification (tree fntype,
+ tree args,
tsubst_flags_t complain,
tree in_decl)
{
@@ -6881,10 +6880,10 @@ tsubst_exception_specification (tree fntype,
/* Substitute into the PARMS of a call-declarator. */
static tree
-tsubst_call_declarator_parms (tree parms,
- tree args,
- tsubst_flags_t complain,
- tree in_decl)
+tsubst_call_declarator_parms (tree parms,
+ tree args,
+ tsubst_flags_t complain,
+ tree in_decl)
{
tree new_parms;
tree type;
@@ -6892,13 +6891,13 @@ tsubst_call_declarator_parms (tree parms,
if (!parms || parms == void_list_node)
return parms;
-
+
new_parms = tsubst_call_declarator_parms (TREE_CHAIN (parms),
args, complain, in_decl);
/* Figure out the type of this parameter. */
type = tsubst (TREE_VALUE (parms), args, complain, in_decl);
-
+
/* Figure out the default argument as well. Note that we use
tsubst_expr since the default argument is really an expression. */
defarg = tsubst_expr (TREE_PURPOSE (parms), args, complain, in_decl);
@@ -7001,14 +7000,14 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
if (pedantic)
pedwarn ("creating array with size zero");
}
- else if (integer_zerop (max)
- || (TREE_CODE (max) == INTEGER_CST
+ else if (integer_zerop (max)
+ || (TREE_CODE (max) == INTEGER_CST
&& INT_CST_LT (max, integer_zero_node)))
{
/* [temp.deduct]
Type deduction may fail for any of the following
- reasons:
+ reasons:
Attempting to create an array with a size that is
zero or negative. */
@@ -7070,7 +7069,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
args, complain, in_decl);
if (argvec == error_mark_node)
return error_mark_node;
-
+
/* We can get a TEMPLATE_TEMPLATE_PARM here when we
are resolving nested-types in the signature of a
member function templates. Otherwise ARG is a
@@ -7078,9 +7077,9 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
instantiated. */
if (TREE_CODE (arg) == TEMPLATE_TEMPLATE_PARM)
arg = TYPE_NAME (arg);
-
- r = lookup_template_class (arg,
- argvec, in_decl,
+
+ r = lookup_template_class (arg,
+ argvec, in_decl,
DECL_CONTEXT (arg),
/*entering_scope=*/0,
complain);
@@ -7109,8 +7108,8 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
if (cp_type_quals (t))
{
r = tsubst (TYPE_MAIN_VARIANT (t), args, complain, in_decl);
- r = cp_build_qualified_type_real
- (r, cp_type_quals (t),
+ r = cp_build_qualified_type_real
+ (r, cp_type_quals (t),
complain | (TREE_CODE (t) == TEMPLATE_TYPE_PARM
? tf_ignore_bad_quals : 0));
}
@@ -7128,7 +7127,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
if (TREE_CODE (t) == BOUND_TEMPLATE_TEMPLATE_PARM)
{
tree argvec = tsubst (TYPE_TI_ARGS (t), args,
- complain, in_decl);
+ complain, in_decl);
if (argvec == error_mark_node)
return error_mark_node;
@@ -7141,7 +7140,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
case TEMPLATE_PARM_INDEX:
r = reduce_template_parm_level (t, type, levels);
break;
-
+
default:
gcc_unreachable ();
}
@@ -7183,7 +7182,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
return t;
return hash_tree_cons (purpose, value, chain);
}
-
+
case TREE_BINFO:
/* We should never be tsubsting a binfo. */
gcc_unreachable ();
@@ -7205,9 +7204,9 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
/* [temp.deduct]
-
+
Type deduction may fail for any of the following
- reasons:
+ reasons:
-- Attempting to create a pointer to reference type.
-- Attempting to create a reference to a reference type or
@@ -7233,8 +7232,8 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
error ("forming reference to void");
else
error ("forming %s to reference type %qT",
- (code == POINTER_TYPE) ? "pointer" : "reference",
- type);
+ (code == POINTER_TYPE) ? "pointer" : "reference",
+ type);
last_loc = input_location;
}
@@ -7253,7 +7252,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
if (r != error_mark_node)
/* Will this ever be needed for TYPE_..._TO values? */
layout_type (r);
-
+
return r;
}
case OFFSET_TYPE:
@@ -7265,9 +7264,9 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
Type deduction may fail for any of the following
reasons:
-
+
-- Attempting to create "pointer to member of T" when T
- is not a class type. */
+ is not a class type. */
if (complain & tf_error)
error ("creating pointer to member of non-class type %qT", r);
return error_mark_node;
@@ -7276,24 +7275,29 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
{
if (complain & tf_error)
error ("creating pointer to member reference type %qT", type);
-
+ return error_mark_node;
+ }
+ if (TREE_CODE (type) == VOID_TYPE)
+ {
+ if (complain & tf_error)
+ error ("creating pointer to member of type void");
return error_mark_node;
}
gcc_assert (TREE_CODE (type) != METHOD_TYPE);
if (TREE_CODE (type) == FUNCTION_TYPE)
{
- /* The type of the implicit object parameter gets its
- cv-qualifiers from the FUNCTION_TYPE. */
+ /* The type of the implicit object parameter gets its
+ cv-qualifiers from the FUNCTION_TYPE. */
tree method_type;
- tree this_type = cp_build_qualified_type (TYPE_MAIN_VARIANT (r),
- cp_type_quals (type));
- tree memptr;
- method_type = build_method_type_directly (this_type,
+ tree this_type = cp_build_qualified_type (TYPE_MAIN_VARIANT (r),
+ cp_type_quals (type));
+ tree memptr;
+ method_type = build_method_type_directly (this_type,
TREE_TYPE (type),
TYPE_ARG_TYPES (type));
- memptr = build_ptrmemfunc_type (build_pointer_type (method_type));
- return cp_build_qualified_type_real (memptr, cp_type_quals (t),
- complain);
+ memptr = build_ptrmemfunc_type (build_pointer_type (method_type));
+ return cp_build_qualified_type_real (memptr, cp_type_quals (t),
+ complain);
}
else
return cp_build_qualified_type_real (build_ptrmem_type (r, type),
@@ -7310,7 +7314,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
return error_mark_node;
/* Substitute the exception specification. */
- specs = tsubst_exception_specification (t, args, complain,
+ specs = tsubst_exception_specification (t, args, complain,
in_decl);
if (specs)
fntype = build_exception_variant (fntype, specs);
@@ -7327,16 +7331,16 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
if (type == TREE_TYPE (t) && domain == TYPE_DOMAIN (t))
return t;
- /* These checks should match the ones in grokdeclarator.
+ /* These checks should match the ones in grokdeclarator.
+
+ [temp.deduct]
- [temp.deduct]
-
- The deduction may fail for any of the following reasons:
+ The deduction may fail for any of the following reasons:
-- Attempting to create an array with an element type that
- is void, a function type, or a reference type, or [DR337]
+ is void, a function type, or a reference type, or [DR337]
an abstract class type. */
- if (TREE_CODE (type) == VOID_TYPE
+ if (TREE_CODE (type) == VOID_TYPE
|| TREE_CODE (type) == FUNCTION_TYPE
|| TREE_CODE (type) == REFERENCE_TYPE)
{
@@ -7347,9 +7351,9 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
if (CLASS_TYPE_P (type) && CLASSTYPE_PURE_VIRTUALS (type))
{
if (complain & tf_error)
- error ("creating array of %qT, which is an abstract class type",
+ error ("creating array of %qT, which is an abstract class type",
type);
- return error_mark_node;
+ return error_mark_node;
}
r = build_cplus_array_type (type, domain);
@@ -7383,7 +7387,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
tree ctx = tsubst_aggr_type (TYPE_CONTEXT (t), args, complain,
in_decl, /*entering_scope=*/1);
tree f = tsubst_copy (TYPENAME_TYPE_FULLNAME (t), args,
- complain, in_decl);
+ complain, in_decl);
if (ctx == error_mark_node || f == error_mark_node)
return error_mark_node;
@@ -7398,8 +7402,8 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
{
/* Normally, make_typename_type does not require that the CTX
have complete type in order to allow things like:
-
- template <class T> struct S { typename S<T>::X Y; };
+
+ template <class T> struct S { typename S<T>::X Y; };
But, such constructs have already been resolved by this
point, so here CTX really should have complete type, unless
@@ -7417,26 +7421,26 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
(complain & tf_error) | tf_keep_type_decl);
if (f == error_mark_node)
return f;
- if (TREE_CODE (f) == TYPE_DECL)
- {
+ if (TREE_CODE (f) == TYPE_DECL)
+ {
complain |= tf_ignore_bad_quals;
- f = TREE_TYPE (f);
- }
-
+ f = TREE_TYPE (f);
+ }
+
if (TREE_CODE (f) != TYPENAME_TYPE)
{
if (TYPENAME_IS_ENUM_P (t) && TREE_CODE (f) != ENUMERAL_TYPE)
- error ("%qT resolves to %qT, which is not an enumeration type",
+ error ("%qT resolves to %qT, which is not an enumeration type",
t, f);
else if (TYPENAME_IS_CLASS_P (t) && !CLASS_TYPE_P (f))
- error ("%qT resolves to %qT, which is is not a class type",
+ error ("%qT resolves to %qT, which is is not a class type",
t, f);
}
- return cp_build_qualified_type_real
- (f, cp_type_quals (f) | cp_type_quals (t), complain);
+ return cp_build_qualified_type_real
+ (f, cp_type_quals (f) | cp_type_quals (t), complain);
}
-
+
case UNBOUND_CLASS_TEMPLATE:
{
tree ctx = tsubst_aggr_type (TYPE_CONTEXT (t), args, complain,
@@ -7514,7 +7518,7 @@ tsubst_baselink (tree baselink, tree object_type,
BASELINK_ACCESS_BINFO and BASELINK_BINFO are going to have
non-dependent types; otherwise, the lookup could not have
succeeded. However, they may indicate bases of the template
- class, rather than the instantiated class.
+ class, rather than the instantiated class.
In addition, lookups that were not ambiguous before may be
ambiguous now. Therefore, we perform the lookup again. */
@@ -7531,7 +7535,7 @@ tsubst_baselink (tree baselink, tree object_type,
}
name = DECL_NAME (get_first_fn (fns));
baselink = lookup_fnfields (qualifying_scope, name, /*protect=*/1);
-
+
/* If lookup found a single function, mark it as used at this
point. (If it lookup found multiple functions the one selected
later by overload resolution will be marked as used at that
@@ -7543,14 +7547,14 @@ tsubst_baselink (tree baselink, tree object_type,
/* Add back the template arguments, if present. */
if (BASELINK_P (baselink) && template_id_p)
- BASELINK_FUNCTIONS (baselink)
+ BASELINK_FUNCTIONS (baselink)
= build_nt (TEMPLATE_ID_EXPR,
BASELINK_FUNCTIONS (baselink),
template_args);
if (!object_type)
object_type = current_class_type;
- return adjust_result_of_qualified_name_lookup (baselink,
+ return adjust_result_of_qualified_name_lookup (baselink,
qualifying_scope,
object_type);
}
@@ -7562,7 +7566,7 @@ tsubst_baselink (tree baselink, tree object_type,
of "&". */
static tree
-tsubst_qualified_id (tree qualified_id, tree args,
+tsubst_qualified_id (tree qualified_id, tree args,
tsubst_flags_t complain, tree in_decl,
bool done, bool address_p)
{
@@ -7606,7 +7610,7 @@ tsubst_qualified_id (tree qualified_id, tree args,
if (dependent_type_p (scope))
return build_nt (SCOPE_REF, scope, expr);
-
+
if (!BASELINK_P (name) && !DECL_P (expr))
{
expr = lookup_qualified_name (scope, expr, /*is_type_p=*/0, false);
@@ -7622,7 +7626,7 @@ tsubst_qualified_id (tree qualified_id, tree args,
return error_mark_node;
}
}
-
+
if (DECL_P (expr))
{
check_accessibility_of_qualified_id (expr, /*object_type=*/NULL_TREE,
@@ -7634,7 +7638,7 @@ tsubst_qualified_id (tree qualified_id, tree args,
if (expr == error_mark_node || TREE_CODE (expr) == TREE_LIST)
{
if (complain & tf_error)
- qualified_name_lookup_error (scope,
+ qualified_name_lookup_error (scope,
TREE_OPERAND (qualified_id, 1),
expr);
return error_mark_node;
@@ -7648,11 +7652,11 @@ tsubst_qualified_id (tree qualified_id, tree args,
expr);
else if (TYPE_P (scope))
{
- expr = (adjust_result_of_qualified_name_lookup
+ expr = (adjust_result_of_qualified_name_lookup
(expr, scope, current_class_type));
expr = finish_qualified_id_expr (scope, expr, done, address_p);
}
-
+
expr = convert_from_reference (expr);
return expr;
@@ -7698,20 +7702,20 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
/* Unfortunately, we cannot just call lookup_name here.
Consider:
-
+
template <int I> int f() {
enum E { a = I };
struct S { void g() { E e = a; } };
};
-
+
When we instantiate f<7>::S::g(), say, lookup_name is not
clever enough to find f<7>::a. */
- enum_type
- = tsubst_aggr_type (TREE_TYPE (t), args, complain, in_decl,
+ enum_type
+ = tsubst_aggr_type (TREE_TYPE (t), args, complain, in_decl,
/*entering_scope=*/0);
- for (v = TYPE_VALUES (enum_type);
- v != NULL_TREE;
+ for (v = TYPE_VALUES (enum_type);
+ v != NULL_TREE;
v = TREE_CHAIN (v))
if (TREE_PURPOSE (v) == DECL_NAME (t))
return TREE_VALUE (v);
@@ -7742,7 +7746,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
return r;
}
}
-
+
return t;
case VAR_DECL:
@@ -7758,7 +7762,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
case TEMPLATE_DECL:
if (DECL_TEMPLATE_TEMPLATE_PARM_P (t))
- return tsubst (TREE_TYPE (DECL_TEMPLATE_RESULT (t)),
+ return tsubst (TREE_TYPE (DECL_TEMPLATE_RESULT (t)),
args, complain, in_decl);
else if (DECL_FUNCTION_TEMPLATE_P (t) && DECL_MEMBER_TEMPLATE_P (t))
return tsubst (t, args, complain, in_decl);
@@ -7771,7 +7775,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
template <template <class> class TT> struct C {};
template <class T> struct D {
template <class U> struct E {};
- C<E> c; // #1
+ C<E> c; // #1
};
D<int> d; // #2
@@ -7802,7 +7806,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
case TRUTH_NOT_EXPR:
case BIT_NOT_EXPR:
case ADDR_EXPR:
- case CONVERT_EXPR: /* Unary + */
+ case UNARY_PLUS_EXPR: /* Unary + */
case SIZEOF_EXPR:
case ALIGNOF_EXPR:
case ARROW_EXPR:
@@ -7821,7 +7825,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
object = tsubst_copy (TREE_OPERAND (t, 0), args, complain, in_decl);
name = TREE_OPERAND (t, 1);
- if (TREE_CODE (name) == BIT_NOT_EXPR)
+ if (TREE_CODE (name) == BIT_NOT_EXPR)
{
name = tsubst_copy (TREE_OPERAND (name, 0), args,
complain, in_decl);
@@ -7839,9 +7843,9 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
name = build_nt (SCOPE_REF, base, name);
}
else if (TREE_CODE (name) == BASELINK)
- name = tsubst_baselink (name,
- non_reference (TREE_TYPE (object)),
- args, complain,
+ name = tsubst_baselink (name,
+ non_reference (TREE_TYPE (object)),
+ args, complain,
in_decl);
else
name = tsubst_copy (name, args, complain, in_decl);
@@ -7897,7 +7901,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
NULL_TREE, NULL_TREE);
case CALL_EXPR:
- return build_nt (code,
+ return build_nt (code,
tsubst_copy (TREE_OPERAND (t, 0), args,
complain, in_decl),
tsubst_copy (TREE_OPERAND (t, 1), args, complain,
@@ -7938,14 +7942,14 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
case TEMPLATE_ID_EXPR:
{
- /* Substituted template arguments */
+ /* Substituted template arguments */
tree fn = TREE_OPERAND (t, 0);
tree targs = TREE_OPERAND (t, 1);
fn = tsubst_copy (fn, args, complain, in_decl);
if (targs)
targs = tsubst_template_args (targs, args, complain, in_decl);
-
+
return lookup_template_function (fn, targs);
}
@@ -8004,7 +8008,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
case CONSTRUCTOR:
{
r = build_constructor
- (tsubst (TREE_TYPE (t), args, complain, in_decl),
+ (tsubst (TREE_TYPE (t), args, complain, in_decl),
tsubst_copy (CONSTRUCTOR_ELTS (t), args, complain, in_decl));
TREE_HAS_CONSTRUCTOR (r) = TREE_HAS_CONSTRUCTOR (t);
return r;
@@ -8053,7 +8057,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
}
case CTOR_INITIALIZER:
- finish_mem_initializers (tsubst_initializer_list
+ finish_mem_initializers (tsubst_initializer_list
(TREE_OPERAND (t, 0), args));
break;
@@ -8074,7 +8078,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
do_using_directive (tsubst_expr (USING_STMT_NAMESPACE (t),
args, complain, in_decl));
break;
-
+
case DECL_EXPR:
{
tree decl;
@@ -8085,10 +8089,10 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
finish_label_decl (DECL_NAME (decl));
else if (TREE_CODE (decl) == USING_DECL)
{
- tree scope = DECL_INITIAL (decl);
+ tree scope = USING_DECL_SCOPE (decl);
tree name = DECL_NAME (decl);
tree decl;
-
+
scope = tsubst_expr (scope, args, complain, in_decl);
decl = lookup_qualified_name (scope, name,
/*is_type_p=*/false,
@@ -8104,20 +8108,20 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
decl = tsubst (decl, args, complain, in_decl);
if (decl != error_mark_node)
{
- if (init)
- DECL_INITIAL (decl) = error_mark_node;
- /* By marking the declaration as instantiated, we avoid
- trying to instantiate it. Since instantiate_decl can't
- handle local variables, and since we've already done
- all that needs to be done, that's the right thing to
- do. */
- if (TREE_CODE (decl) == VAR_DECL)
- DECL_TEMPLATE_INSTANTIATED (decl) = 1;
+ if (init)
+ DECL_INITIAL (decl) = error_mark_node;
+ /* By marking the declaration as instantiated, we avoid
+ trying to instantiate it. Since instantiate_decl can't
+ handle local variables, and since we've already done
+ all that needs to be done, that's the right thing to
+ do. */
+ if (TREE_CODE (decl) == VAR_DECL)
+ DECL_TEMPLATE_INSTANTIATED (decl) = 1;
if (TREE_CODE (decl) == VAR_DECL
&& ANON_AGGR_TYPE_P (TREE_TYPE (decl)))
/* Anonymous aggregates are a special case. */
finish_anon_union (decl);
- else
+ else
{
maybe_push_decl (decl);
if (TREE_CODE (decl) == VAR_DECL
@@ -8244,7 +8248,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
(ASM_VOLATILE_P (t),
tsubst_expr (ASM_STRING (t), args, complain, in_decl),
tsubst_expr (ASM_OUTPUTS (t), args, complain, in_decl),
- tsubst_expr (ASM_INPUTS (t), args, complain, in_decl),
+ tsubst_expr (ASM_INPUTS (t), args, complain, in_decl),
tsubst_expr (ASM_CLOBBERS (t), args, complain, in_decl));
{
tree asm_expr = tmp;
@@ -8285,7 +8289,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
finish_handler_sequence (stmt);
}
break;
-
+
case HANDLER:
{
tree decl;
@@ -8314,7 +8318,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
default:
gcc_assert (!STATEMENT_CODE_P (TREE_CODE (t)));
-
+
return tsubst_copy_and_build (t, args, complain, in_decl,
/*function_p=*/false);
}
@@ -8326,7 +8330,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl)
call. Return the substituted version of T. */
static tree
-tsubst_non_call_postfix_expression (tree t, tree args,
+tsubst_non_call_postfix_expression (tree t, tree args,
tsubst_flags_t complain,
tree in_decl)
{
@@ -8344,10 +8348,10 @@ tsubst_non_call_postfix_expression (tree t, tree args,
analysis. FUNCTION_P is true if T is the "F" in "F (ARGS)". */
tree
-tsubst_copy_and_build (tree t,
- tree args,
- tsubst_flags_t complain,
- tree in_decl,
+tsubst_copy_and_build (tree t,
+ tree args,
+ tsubst_flags_t complain,
+ tree in_decl,
bool function_p)
{
#define RECUR(NODE) \
@@ -8407,7 +8411,7 @@ tsubst_copy_and_build (tree t,
if (targs)
targs = tsubst_template_args (targs, args, complain, in_decl);
-
+
if (TREE_CODE (template) == COMPONENT_REF)
{
object = TREE_OPERAND (template, 0);
@@ -8416,9 +8420,9 @@ tsubst_copy_and_build (tree t,
else
object = NULL_TREE;
template = lookup_template_function (template, targs);
-
+
if (object)
- return build3 (COMPONENT_REF, TREE_TYPE (template),
+ return build3 (COMPONENT_REF, TREE_TYPE (template),
object, template, NULL_TREE);
else
return template;
@@ -8483,7 +8487,7 @@ tsubst_copy_and_build (tree t,
case BIT_NOT_EXPR:
case ABS_EXPR:
case TRUTH_NOT_EXPR:
- case CONVERT_EXPR: /* Unary + */
+ case UNARY_PLUS_EXPR: /* Unary + */
case REALPART_EXPR:
case IMAGPART_EXPR:
return build_x_unary_op (TREE_CODE (t), RECUR (TREE_OPERAND (t, 0)));
@@ -8491,10 +8495,10 @@ tsubst_copy_and_build (tree t,
case ADDR_EXPR:
op1 = TREE_OPERAND (t, 0);
if (TREE_CODE (op1) == SCOPE_REF)
- op1 = tsubst_qualified_id (op1, args, complain, in_decl,
+ op1 = tsubst_qualified_id (op1, args, complain, in_decl,
/*done=*/true, /*address_p=*/true);
else
- op1 = tsubst_non_call_postfix_expression (op1, args, complain,
+ op1 = tsubst_non_call_postfix_expression (op1, args, complain,
in_decl);
if (TREE_CODE (op1) == LABEL_DECL)
return finish_label_address_expr (DECL_NAME (op1));
@@ -8532,7 +8536,7 @@ tsubst_copy_and_build (tree t,
case MEMBER_REF:
case DOTSTAR_EXPR:
return build_x_binary_op
- (TREE_CODE (t),
+ (TREE_CODE (t),
RECUR (TREE_OPERAND (t, 0)),
RECUR (TREE_OPERAND (t, 1)),
/*overloaded_p=*/NULL);
@@ -8545,7 +8549,7 @@ tsubst_copy_and_build (tree t,
args, complain, in_decl);
return build_x_binary_op (ARRAY_REF, op1, RECUR (TREE_OPERAND (t, 1)),
/*overloaded_p=*/NULL);
-
+
case SIZEOF_EXPR:
case ALIGNOF_EXPR:
op1 = TREE_OPERAND (t, 0);
@@ -8627,7 +8631,7 @@ tsubst_copy_and_build (tree t,
{
qualified_p = true;
function = tsubst_qualified_id (function, args, complain, in_decl,
- /*done=*/false,
+ /*done=*/false,
/*address_p=*/false);
}
else
@@ -8635,7 +8639,7 @@ tsubst_copy_and_build (tree t,
qualified_p = (TREE_CODE (function) == COMPONENT_REF
&& (TREE_CODE (TREE_OPERAND (function, 1))
== SCOPE_REF));
- function = tsubst_copy_and_build (function, args, complain,
+ function = tsubst_copy_and_build (function, args, complain,
in_decl,
!qualified_p);
if (BASELINK_P (function))
@@ -8675,13 +8679,13 @@ tsubst_copy_and_build (tree t,
/*disallow_virtual=*/false,
/*koenig_p=*/false);
else
- return (build_new_method_call
+ return (build_new_method_call
(TREE_OPERAND (function, 0),
TREE_OPERAND (function, 1),
- call_args, NULL_TREE,
+ call_args, NULL_TREE,
qualified_p ? LOOKUP_NONVIRTUAL : LOOKUP_NORMAL));
}
- return finish_call_expr (function, call_args,
+ return finish_call_expr (function, call_args,
/*disallow_virtual=*/qualified_p,
koenig_p);
}
@@ -8693,7 +8697,7 @@ tsubst_copy_and_build (tree t,
RECUR (TREE_OPERAND (t, 2)));
case PSEUDO_DTOR_EXPR:
- return finish_pseudo_destructor_expr
+ return finish_pseudo_destructor_expr
(RECUR (TREE_OPERAND (t, 0)),
RECUR (TREE_OPERAND (t, 1)),
RECUR (TREE_OPERAND (t, 2)));
@@ -8734,7 +8738,7 @@ tsubst_copy_and_build (tree t,
member = TREE_OPERAND (t, 1);
if (BASELINK_P (member))
- member = tsubst_baselink (member,
+ member = tsubst_baselink (member,
non_reference (TREE_TYPE (object)),
args, complain, in_decl);
else
@@ -8745,12 +8749,12 @@ tsubst_copy_and_build (tree t,
else if (!CLASS_TYPE_P (TREE_TYPE (object)))
{
if (TREE_CODE (member) == BIT_NOT_EXPR)
- return finish_pseudo_destructor_expr (object,
+ return finish_pseudo_destructor_expr (object,
NULL_TREE,
TREE_TYPE (object));
else if (TREE_CODE (member) == SCOPE_REF
&& (TREE_CODE (TREE_OPERAND (member, 1)) == BIT_NOT_EXPR))
- return finish_pseudo_destructor_expr (object,
+ return finish_pseudo_destructor_expr (object,
object,
TREE_TYPE (object));
}
@@ -8759,21 +8763,21 @@ tsubst_copy_and_build (tree t,
{
tree tmpl;
tree args;
-
+
/* Lookup the template functions now that we know what the
scope is. */
tmpl = TREE_OPERAND (TREE_OPERAND (member, 1), 0);
args = TREE_OPERAND (TREE_OPERAND (member, 1), 1);
- member = lookup_qualified_name (TREE_OPERAND (member, 0), tmpl,
+ member = lookup_qualified_name (TREE_OPERAND (member, 0), tmpl,
/*is_type_p=*/false,
/*complain=*/false);
if (BASELINK_P (member))
{
- BASELINK_FUNCTIONS (member)
+ BASELINK_FUNCTIONS (member)
= build_nt (TEMPLATE_ID_EXPR, BASELINK_FUNCTIONS (member),
args);
- member = (adjust_result_of_qualified_name_lookup
- (member, BINFO_TYPE (BASELINK_BINFO (member)),
+ member = (adjust_result_of_qualified_name_lookup
+ (member, BINFO_TYPE (BASELINK_BINFO (member)),
TREE_TYPE (object)));
}
else
@@ -8790,10 +8794,10 @@ tsubst_copy_and_build (tree t,
if (complain & tf_error)
{
if (TYPE_P (TREE_OPERAND (member, 0)))
- error ("%qT is not a class or namespace",
+ error ("%qT is not a class or namespace",
TREE_OPERAND (member, 0));
else
- error ("%qD is not a class or namespace",
+ error ("%qD is not a class or namespace",
TREE_OPERAND (member, 0));
}
return error_mark_node;
@@ -8830,13 +8834,13 @@ tsubst_copy_and_build (tree t,
{
tree purpose = TREE_PURPOSE (elts);
tree value = TREE_VALUE (elts);
-
+
if (purpose && purpose_p)
purpose = RECUR (purpose);
value = RECUR (value);
r = tree_cons (purpose, value, r);
}
-
+
r = build_constructor (NULL_TREE, nreverse (r));
TREE_HAS_CONSTRUCTOR (r) = TREE_HAS_CONSTRUCTOR (t);
@@ -8857,11 +8861,11 @@ tsubst_copy_and_build (tree t,
if (!args)
return t;
/* Fall through */
-
+
case PARM_DECL:
{
tree r = tsubst_copy (t, args, complain, in_decl);
-
+
if (TREE_CODE (TREE_TYPE (t)) != REFERENCE_TYPE)
/* If the original type was a reference, we'll be wrapped in
the appropriate INDIRECT_REF. */
@@ -8871,7 +8875,7 @@ tsubst_copy_and_build (tree t,
case VA_ARG_EXPR:
return build_x_va_arg (RECUR (TREE_OPERAND (t, 0)),
- tsubst_copy (TREE_TYPE (t), args, complain,
+ tsubst_copy (TREE_TYPE (t), args, complain,
in_decl));
case OFFSETOF_EXPR:
@@ -8928,7 +8932,7 @@ check_instantiated_args (tree tmpl, tree args, tsubst_flags_t complain)
for (ix = 0; ix != len; ix++)
{
tree t = TREE_VEC_ELT (args, ix);
-
+
if (TYPE_P (t))
{
/* [basic.link]: A name with no linkage (notably, the name
@@ -8992,7 +8996,7 @@ instantiate_template (tree tmpl, tree targ_ptr, tsubst_flags_t complain)
{
tree spec;
tree clone;
-
+
spec = instantiate_template (DECL_CLONED_FUNCTION (tmpl), targ_ptr,
complain);
if (spec == error_mark_node)
@@ -9006,9 +9010,9 @@ instantiate_template (tree tmpl, tree targ_ptr, tsubst_flags_t complain)
gcc_unreachable ();
return NULL_TREE;
}
-
+
/* Check to see if we already have this specialization. */
- spec = retrieve_specialization (tmpl, targ_ptr,
+ spec = retrieve_specialization (tmpl, targ_ptr,
/*class_specializations_p=*/false);
if (spec != NULL_TREE)
return spec;
@@ -9032,7 +9036,7 @@ instantiate_template (tree tmpl, tree targ_ptr, tsubst_flags_t complain)
if (check_instantiated_args (gen_tmpl, INNERMOST_TEMPLATE_ARGS (targ_ptr),
complain))
return error_mark_node;
-
+
/* We are building a FUNCTION_DECL, during which the access of its
parameters and return types have to be checked. However this
FUNCTION_DECL which is the desired context for access checking
@@ -9067,7 +9071,7 @@ instantiate_template (tree tmpl, tree targ_ptr, tsubst_flags_t complain)
/* The FN is a TEMPLATE_DECL for a function. The ARGS are the
arguments that are being used when calling it. TARGS is a vector
- into which the deduced template arguments are placed.
+ into which the deduced template arguments are placed.
Return zero for success, 2 for an incomplete match that doesn't resolve
all the types, and 1 for complete failure. An error message will be
@@ -9081,12 +9085,12 @@ instantiate_template (tree tmpl, tree targ_ptr, tsubst_flags_t complain)
The parameter STRICT is one of:
- DEDUCE_CALL:
+ DEDUCE_CALL:
We are deducing arguments for a function call, as in
[temp.deduct.call].
DEDUCE_CONV:
- We are deducing arguments for a conversion function, as in
+ We are deducing arguments for a conversion function, as in
[temp.deduct.conv].
DEDUCE_EXACT:
@@ -9096,11 +9100,11 @@ instantiate_template (tree tmpl, tree targ_ptr, tsubst_flags_t complain)
template, as in [temp.deduct.funcaddr]. */
int
-fn_type_unification (tree fn,
- tree explicit_targs,
- tree targs,
- tree args,
- tree return_type,
+fn_type_unification (tree fn,
+ tree explicit_targs,
+ tree targs,
+ tree args,
+ tree return_type,
unification_kind_t strict)
{
tree parms;
@@ -9113,7 +9117,7 @@ fn_type_unification (tree fn,
if (explicit_targs)
{
/* [temp.deduct]
-
+
The specified template arguments must match the template
parameters in kind (i.e., type, nontype, template), and there
must not be more arguments than there are parameters;
@@ -9137,23 +9141,23 @@ fn_type_unification (tree fn,
return 1;
converted_args
- = (coerce_template_parms (DECL_INNERMOST_TEMPLATE_PARMS (fn),
- explicit_targs, NULL_TREE, tf_none,
+ = (coerce_template_parms (DECL_INNERMOST_TEMPLATE_PARMS (fn),
+ explicit_targs, NULL_TREE, tf_none,
/*require_all_arguments=*/0));
if (converted_args == error_mark_node)
return 1;
/* Substitute the explicit args into the function type. This is
- necessary so that, for instance, explicitly declared function
- arguments can match null pointed constants. If we were given
- an incomplete set of explicit args, we must not do semantic
- processing during substitution as we could create partial
- instantiations. */
+ necessary so that, for instance, explicitly declared function
+ arguments can match null pointed constants. If we were given
+ an incomplete set of explicit args, we must not do semantic
+ processing during substitution as we could create partial
+ instantiations. */
incomplete = NUM_TMPL_ARGS (explicit_targs) != NUM_TMPL_ARGS (targs);
processing_template_decl += incomplete;
fntype = tsubst (fntype, converted_args, tf_none, NULL_TREE);
processing_template_decl -= incomplete;
-
+
if (fntype == error_mark_node)
return 1;
@@ -9161,12 +9165,12 @@ fn_type_unification (tree fn,
for (i = NUM_TMPL_ARGS (converted_args); i--;)
TREE_VEC_ELT (targs, i) = TREE_VEC_ELT (converted_args, i);
}
-
+
parms = TYPE_ARG_TYPES (fntype);
/* Never do unification on the 'this' parameter. */
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
parms = TREE_CHAIN (parms);
-
+
if (return_type)
{
/* We've been given a return type to match, prepend it. */
@@ -9178,15 +9182,15 @@ fn_type_unification (tree fn,
because the standard doesn't seem to explicitly prohibit it. Our
callers must be ready to deal with unification failures in any
event. */
- result = type_unification_real (DECL_INNERMOST_TEMPLATE_PARMS (fn),
+ result = type_unification_real (DECL_INNERMOST_TEMPLATE_PARMS (fn),
targs, parms, args, /*subr=*/0,
strict, /*allow_incomplete*/1);
- if (result == 0)
+ if (result == 0)
/* All is well so far. Now, check:
-
- [temp.deduct]
-
+
+ [temp.deduct]
+
When all template arguments have been deduced, all uses of
template parameters in nondeduced contexts are replaced with
the corresponding deduced argument values. If the
@@ -9207,12 +9211,12 @@ fn_type_unification (tree fn,
initialized with the result of the conversion function. */
static int
-maybe_adjust_types_for_deduction (unification_kind_t strict,
- tree* parm,
- tree* arg)
+maybe_adjust_types_for_deduction (unification_kind_t strict,
+ tree* parm,
+ tree* arg)
{
int result = 0;
-
+
switch (strict)
{
case DEDUCE_CALL:
@@ -9240,18 +9244,18 @@ maybe_adjust_types_for_deduction (unification_kind_t strict,
if (TREE_CODE (*parm) != REFERENCE_TYPE)
{
/* [temp.deduct.call]
-
+
If P is not a reference type:
-
+
--If A is an array type, the pointer type produced by the
array-to-pointer standard conversion (_conv.array_) is
used in place of A for type deduction; otherwise,
-
+
--If A is a function type, the pointer type produced by
the function-to-pointer standard conversion
(_conv.func_) is used in place of A for type deduction;
otherwise,
-
+
--If A is a cv-qualified type, the top level
cv-qualifiers of A's type are ignored for type
deduction. */
@@ -9262,9 +9266,9 @@ maybe_adjust_types_for_deduction (unification_kind_t strict,
else
*arg = TYPE_MAIN_VARIANT (*arg);
}
-
+
/* [temp.deduct.call]
-
+
If P is a cv-qualified type, the top level cv-qualifiers
of P's type are ignored for type deduction. If P is a
reference type, the type referred to by P is used for
@@ -9280,7 +9284,7 @@ maybe_adjust_types_for_deduction (unification_kind_t strict,
too (which has been swapped into ARG). */
if (strict == DEDUCE_CONV && TREE_CODE (*arg) == REFERENCE_TYPE)
*arg = TREE_TYPE (*arg);
-
+
return result;
}
@@ -9291,13 +9295,13 @@ maybe_adjust_types_for_deduction (unification_kind_t strict,
template). */
static int
-type_unification_real (tree tparms,
- tree targs,
- tree xparms,
- tree xargs,
- int subr,
- unification_kind_t strict,
- int allow_incomplete)
+type_unification_real (tree tparms,
+ tree targs,
+ tree xparms,
+ tree xargs,
+ int subr,
+ unification_kind_t strict,
+ int allow_incomplete)
{
tree parm, arg;
int i;
@@ -9315,9 +9319,9 @@ type_unification_real (tree tparms,
{
case DEDUCE_CALL:
sub_strict = (UNIFY_ALLOW_OUTER_LEVEL | UNIFY_ALLOW_MORE_CV_QUAL
- | UNIFY_ALLOW_DERIVED);
+ | UNIFY_ALLOW_DERIVED);
break;
-
+
case DEDUCE_CONV:
sub_strict = UNIFY_ALLOW_LESS_CV_QUAL;
break;
@@ -9325,7 +9329,7 @@ type_unification_real (tree tparms,
case DEDUCE_EXACT:
sub_strict = UNIFY_ALLOW_NONE;
break;
-
+
default:
gcc_unreachable ();
}
@@ -9375,7 +9379,7 @@ type_unification_real (tree tparms,
return 1;
}
-
+
if (!TYPE_P (arg))
{
gcc_assert (TREE_TYPE (arg) != NULL_TREE);
@@ -9397,18 +9401,18 @@ type_unification_real (tree tparms,
if (arg == error_mark_node)
return 1;
}
-
+
{
- int arg_strict = sub_strict;
-
- if (!subr)
+ int arg_strict = sub_strict;
+
+ if (!subr)
arg_strict |= maybe_adjust_types_for_deduction (strict, &parm, &arg);
- if (unify (tparms, targs, parm, arg, arg_strict))
- return 1;
+ if (unify (tparms, targs, parm, arg, arg_strict))
+ return 1;
}
}
-
+
/* Fail if we've reached the end of the parm list, and more args
are present, and the parm list isn't variadic. */
if (args && args != void_list_node && parms == void_list_node)
@@ -9437,7 +9441,7 @@ type_unification_real (tree tparms,
error ("incomplete type unification");
return 2;
}
-
+
return 0;
}
@@ -9447,11 +9451,11 @@ type_unification_real (tree tparms,
succeeds, we go with that. Modifies TARGS and returns 0 on success. */
static int
-resolve_overloaded_unification (tree tparms,
- tree targs,
- tree parm,
- tree arg,
- unification_kind_t strict,
+resolve_overloaded_unification (tree tparms,
+ tree targs,
+ tree parm,
+ tree arg,
+ unification_kind_t strict,
int sub_strict)
{
tree tempargs = copy_node (targs);
@@ -9500,7 +9504,7 @@ resolve_overloaded_unification (tree tparms,
if (subargs)
{
elem = tsubst (TREE_TYPE (fn), subargs, tf_none, NULL_TREE);
- good += try_one_overload (tparms, targs, tempargs, parm,
+ good += try_one_overload (tparms, targs, tempargs, parm,
elem, strict, sub_strict, addr_p);
}
}
@@ -9509,7 +9513,7 @@ resolve_overloaded_unification (tree tparms,
{
gcc_assert (TREE_CODE (arg) == OVERLOAD
|| TREE_CODE (arg) == FUNCTION_DECL);
-
+
for (; arg; arg = OVL_NEXT (arg))
good += try_one_overload (tparms, targs, tempargs, parm,
TREE_TYPE (OVL_CURRENT (arg)),
@@ -9547,11 +9551,11 @@ resolve_overloaded_unification (tree tparms,
static int
try_one_overload (tree tparms,
- tree orig_targs,
- tree targs,
- tree parm,
- tree arg,
- unification_kind_t strict,
+ tree orig_targs,
+ tree targs,
+ tree parm,
+ tree arg,
+ unification_kind_t strict,
int sub_strict,
bool addr_p)
{
@@ -9636,7 +9640,7 @@ static int
verify_class_unification (tree targs, tree parms, tree args)
{
parms = tsubst (parms, add_outermost_template_args (args, targs),
- tf_none, NULL_TREE);
+ tf_none, NULL_TREE);
if (parms == error_mark_node)
return 1;
@@ -9654,7 +9658,7 @@ try_class_unification (tree tparms, tree targs, tree parm, tree arg)
tree copy_of_targs;
if (!CLASSTYPE_TEMPLATE_INFO (arg)
- || (most_general_template (CLASSTYPE_TI_TEMPLATE (arg))
+ || (most_general_template (CLASSTYPE_TI_TEMPLATE (arg))
!= most_general_template (CLASSTYPE_TI_TEMPLATE (parm))))
return NULL_TREE;
@@ -9668,18 +9672,18 @@ try_class_unification (tree tparms, tree targs, tree parm, tree arg)
template <int I, int J, int K>
struct S {};
-
+
template <int I, int J>
struct S<I, J, 2> : public S<I, I, I>, S<J, J, J> {};
-
+
template <int I, int J, int K>
void f(S<I, J, K>, S<I, I, I>);
-
+
void g() {
- S<0, 0, 0> s0;
- S<0, 1, 2> s2;
-
- f(s0, s2);
+ S<0, 0, 0> s0;
+ S<0, 1, 2> s2;
+
+ f(s0, s2);
}
Now, by the time we consider the unification involving `s2', we
@@ -9689,7 +9693,7 @@ try_class_unification (tree tparms, tree targs, tree parm, tree arg)
with S<I, I, I>. If we kept the already deduced knowledge, we
would reject the possibility I=1. */
copy_of_targs = make_tree_vec (TREE_VEC_LENGTH (targs));
-
+
/* If unification failed, we're done. */
if (unify (tparms, copy_of_targs, CLASSTYPE_TI_ARGS (parm),
CLASSTYPE_TI_ARGS (arg), UNIFY_ALLOW_NONE))
@@ -9712,7 +9716,7 @@ get_template_base (tree tparms, tree targs, tree parm, tree arg)
tree binfo;
gcc_assert (IS_AGGR_TYPE_CODE (TREE_CODE (arg)));
-
+
binfo = TYPE_BINFO (complete_type (arg));
if (!binfo)
/* The type could not be completed. */
@@ -9736,7 +9740,7 @@ get_template_base (tree tparms, tree targs, tree parm, tree arg)
applies. */
if (rval && !same_type_p (r, rval))
return NULL_TREE;
-
+
rval = r;
}
}
@@ -9778,11 +9782,11 @@ check_cv_quals_for_unify (int strict, tree arg, tree parm)
&& !(strict & UNIFY_ALLOW_OUTER_MORE_CV_QUAL))
{
/* Although a CVR qualifier is ignored when being applied to a
- substituted template parameter ([8.3.2]/1 for example), that
- does not apply during deduction [14.8.2.4]/1, (even though
- that is not explicitly mentioned, [14.8.2.4]/9 indicates
- this). Except when we're allowing additional CV qualifiers
- at the outer level [14.8.2.1]/3,1st bullet. */
+ substituted template parameter ([8.3.2]/1 for example), that
+ does not apply during deduction [14.8.2.4]/1, (even though
+ that is not explicitly mentioned, [14.8.2.4]/9 indicates
+ this). Except when we're allowing additional CV qualifiers
+ at the outer level [14.8.2.1]/3,1st bullet. */
if ((TREE_CODE (arg) == REFERENCE_TYPE
|| TREE_CODE (arg) == FUNCTION_TYPE
|| TREE_CODE (arg) == METHOD_TYPE)
@@ -9822,7 +9826,7 @@ check_cv_quals_for_unify (int strict, tree arg, tree parm)
ARG.
UNIFY_ALLOW_INTEGER:
Allow any integral type to be deduced. See the TEMPLATE_PARM_INDEX
- case for more information.
+ case for more information.
UNIFY_ALLOW_OUTER_LEVEL:
This is the outermost level of a deduction. Used to determine validity
of qualification conversions. A valid qualification conversion must
@@ -9871,8 +9875,8 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
if (TREE_CODE (arg) == TREE_CODE (parm)
&& TYPE_P (arg)
/* It is the elements of the array which hold the cv quals of an array
- type, and the elements might be template type parms. We'll check
- when we recurse. */
+ type, and the elements might be template type parms. We'll check
+ when we recurse. */
&& TREE_CODE (arg) != ARRAY_TYPE
/* We check the cv-qualifiers when unifying with template type
parameters below. We want to allow ARG `const T' to unify with
@@ -9889,7 +9893,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
strict &= ~UNIFY_ALLOW_DERIVED;
strict &= ~UNIFY_ALLOW_OUTER_MORE_CV_QUAL;
strict &= ~UNIFY_ALLOW_OUTER_LESS_CV_QUAL;
-
+
switch (TREE_CODE (parm))
{
case TYPENAME_TYPE:
@@ -9918,7 +9922,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
/* Check for mixed types and values. */
if ((TREE_CODE (parm) == TEMPLATE_TYPE_PARM
&& TREE_CODE (tparm) != TYPE_DECL)
- || (TREE_CODE (parm) == TEMPLATE_TEMPLATE_PARM
+ || (TREE_CODE (parm) == TEMPLATE_TEMPLATE_PARM
&& TREE_CODE (tparm) != TEMPLATE_DECL))
return 1;
@@ -9938,27 +9942,27 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
= DECL_INNERMOST_TEMPLATE_PARMS (TYPE_TI_TEMPLATE (arg));
int i;
- /* The parameter and argument roles have to be switched here
- in order to handle default arguments properly. For example,
- template<template <class> class TT> void f(TT<int>)
- should be able to accept vector<int> which comes from
- template <class T, class Allocator = allocator>
+ /* The parameter and argument roles have to be switched here
+ in order to handle default arguments properly. For example,
+ template<template <class> class TT> void f(TT<int>)
+ should be able to accept vector<int> which comes from
+ template <class T, class Allocator = allocator>
class vector. */
if (coerce_template_parms (argtmplvec, parmvec, parmtmpl, 0, 1)
- == error_mark_node)
+ == error_mark_node)
return 1;
-
- /* Deduce arguments T, i from TT<T> or TT<i>.
+
+ /* Deduce arguments T, i from TT<T> or TT<i>.
We check each element of PARMVEC and ARGVEC individually
rather than the whole TREE_VEC since they can have
different number of elements. */
for (i = 0; i < TREE_VEC_LENGTH (parmvec); ++i)
{
- if (unify (tparms, targs,
- TREE_VEC_ELT (parmvec, i),
- TREE_VEC_ELT (argvec, i),
+ if (unify (tparms, targs,
+ TREE_VEC_ELT (parmvec, i),
+ TREE_VEC_ELT (argvec, i),
UNIFY_ALLOW_NONE))
return 1;
}
@@ -9985,7 +9989,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
a match unless we are allowing additional qualification.
If ARG is `const int' and PARM is just `T' that's OK;
that binds `const int' to `T'. */
- if (!check_cv_quals_for_unify (strict_in | UNIFY_ALLOW_LESS_CV_QUAL,
+ if (!check_cv_quals_for_unify (strict_in | UNIFY_ALLOW_LESS_CV_QUAL,
arg, parm))
return 1;
@@ -10019,7 +10023,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
case TEMPLATE_PARM_INDEX:
tparm = TREE_VALUE (TREE_VEC_ELT (tparms, 0));
- if (TEMPLATE_PARM_LEVEL (parm)
+ if (TEMPLATE_PARM_LEVEL (parm)
!= template_decl_level (tparm))
/* The PARM is not one we're trying to unify. Just check
to see if it matches ARG. */
@@ -10038,7 +10042,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
parameter-list and, if the corresponding template-argument is
deduced, the template-argument type shall match the type of the
template-parameter exactly, except that a template-argument
- deduced from an array bound may be of any integral type.
+ deduced from an array bound may be of any integral type.
The non-type parameter might use already deduced type parameters. */
tparm = tsubst (TREE_TYPE (parm), targs, 0, NULL_TREE);
if (!TREE_TYPE (arg))
@@ -10066,30 +10070,30 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
case PTRMEM_CST:
{
- /* A pointer-to-member constant can be unified only with
- another constant. */
+ /* A pointer-to-member constant can be unified only with
+ another constant. */
if (TREE_CODE (arg) != PTRMEM_CST)
- return 1;
+ return 1;
/* Just unify the class member. It would be useless (and possibly
- wrong, depending on the strict flags) to unify also
- PTRMEM_CST_CLASS, because we want to be sure that both parm and
- arg refer to the same variable, even if through different
- classes. For instance:
+ wrong, depending on the strict flags) to unify also
+ PTRMEM_CST_CLASS, because we want to be sure that both parm and
+ arg refer to the same variable, even if through different
+ classes. For instance:
- struct A { int x; };
- struct B : A { };
+ struct A { int x; };
+ struct B : A { };
- Unification of &A::x and &B::x must succeed. */
+ Unification of &A::x and &B::x must succeed. */
return unify (tparms, targs, PTRMEM_CST_MEMBER (parm),
- PTRMEM_CST_MEMBER (arg), strict);
+ PTRMEM_CST_MEMBER (arg), strict);
}
case POINTER_TYPE:
{
if (TREE_CODE (arg) != POINTER_TYPE)
return 1;
-
+
/* [temp.deduct.call]
A can be another pointer or pointer to member type that can
@@ -10099,13 +10103,13 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
We pass down STRICT here rather than UNIFY_ALLOW_NONE.
This will allow for additional cv-qualification of the
pointed-to types if appropriate. */
-
+
if (TREE_CODE (TREE_TYPE (arg)) == RECORD_TYPE)
/* The derived-to-base conversion only persists through one
level of pointers. */
strict |= (strict_in & UNIFY_ALLOW_DERIVED);
- return unify (tparms, targs, TREE_TYPE (parm),
+ return unify (tparms, targs, TREE_TYPE (parm),
TREE_TYPE (arg), strict);
}
@@ -10134,7 +10138,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
not an integer constant. */
if (TREE_CODE (parm_max) == MINUS_EXPR)
{
- arg_max = fold_build2 (PLUS_EXPR,
+ arg_max = fold_build2 (PLUS_EXPR,
integer_type_node,
arg_max,
TREE_OPERAND (parm_max, 1));
@@ -10156,7 +10160,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
case VOID_TYPE:
if (TREE_CODE (arg) != TREE_CODE (parm))
return 1;
-
+
/* We have already checked cv-qualification at the top of the
function. */
if (!same_type_ignoring_top_level_qualifiers_p (arg, parm))
@@ -10195,13 +10199,13 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
case UNION_TYPE:
if (TREE_CODE (arg) != TREE_CODE (parm))
return 1;
-
+
if (TYPE_PTRMEMFUNC_P (parm))
{
if (!TYPE_PTRMEMFUNC_P (arg))
return 1;
- return unify (tparms, targs,
+ return unify (tparms, targs,
TYPE_PTRMEMFUNC_FN_TYPE (parm),
TYPE_PTRMEMFUNC_FN_TYPE (arg),
strict);
@@ -10221,7 +10225,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
{
/* Fallback to the special case allowed in
[temp.deduct.call]:
-
+
If P is a class, and P has the form
template-id, then A can be a derived class of
the deduced A. Likewise, if P is a pointer to
@@ -10234,8 +10238,8 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
return 1;
}
}
- else if (CLASSTYPE_TEMPLATE_INFO (arg)
- && (CLASSTYPE_TI_TEMPLATE (parm)
+ else if (CLASSTYPE_TEMPLATE_INFO (arg)
+ && (CLASSTYPE_TI_TEMPLATE (parm)
== CLASSTYPE_TI_TEMPLATE (arg)))
/* Perhaps PARM is something like S<U> and ARG is S<int>.
Then, we should unify `int' and `U'. */
@@ -10260,40 +10264,40 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
TREE_TYPE (arg), UNIFY_ALLOW_NONE))
return 1;
return type_unification_real (tparms, targs, TYPE_ARG_TYPES (parm),
- TYPE_ARG_TYPES (arg), 1,
+ TYPE_ARG_TYPES (arg), 1,
DEDUCE_EXACT, 0);
case OFFSET_TYPE:
/* Unify a pointer to member with a pointer to member function, which
- deduces the type of the member as a function type. */
+ deduces the type of the member as a function type. */
if (TYPE_PTRMEMFUNC_P (arg))
- {
- tree method_type;
- tree fntype;
- cp_cv_quals cv_quals;
-
- /* Check top-level cv qualifiers */
- if (!check_cv_quals_for_unify (UNIFY_ALLOW_NONE, arg, parm))
- return 1;
-
- if (unify (tparms, targs, TYPE_OFFSET_BASETYPE (parm),
- TYPE_PTRMEMFUNC_OBJECT_TYPE (arg), UNIFY_ALLOW_NONE))
- return 1;
-
- /* Determine the type of the function we are unifying against. */
- method_type = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (arg));
- fntype =
- build_function_type (TREE_TYPE (method_type),
- TREE_CHAIN (TYPE_ARG_TYPES (method_type)));
-
- /* Extract the cv-qualifiers of the member function from the
- implicit object parameter and place them on the function
- type to be restored later. */
- cv_quals =
- cp_type_quals(TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (method_type))));
- fntype = build_qualified_type (fntype, cv_quals);
- return unify (tparms, targs, TREE_TYPE (parm), fntype, strict);
- }
+ {
+ tree method_type;
+ tree fntype;
+ cp_cv_quals cv_quals;
+
+ /* Check top-level cv qualifiers */
+ if (!check_cv_quals_for_unify (UNIFY_ALLOW_NONE, arg, parm))
+ return 1;
+
+ if (unify (tparms, targs, TYPE_OFFSET_BASETYPE (parm),
+ TYPE_PTRMEMFUNC_OBJECT_TYPE (arg), UNIFY_ALLOW_NONE))
+ return 1;
+
+ /* Determine the type of the function we are unifying against. */
+ method_type = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (arg));
+ fntype =
+ build_function_type (TREE_TYPE (method_type),
+ TREE_CHAIN (TYPE_ARG_TYPES (method_type)));
+
+ /* Extract the cv-qualifiers of the member function from the
+ implicit object parameter and place them on the function
+ type to be restored later. */
+ cv_quals =
+ cp_type_quals(TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (method_type))));
+ fntype = build_qualified_type (fntype, cv_quals);
+ return unify (tparms, targs, TREE_TYPE (parm), fntype, strict);
+ }
if (TREE_CODE (arg) != OFFSET_TYPE)
return 1;
@@ -10306,7 +10310,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
case CONST_DECL:
if (DECL_TEMPLATE_PARM_P (parm))
return unify (tparms, targs, DECL_INITIAL (parm), arg, strict);
- if (arg != integral_constant_value (parm))
+ if (arg != integral_constant_value (parm))
return 1;
return 0;
@@ -10317,22 +10321,22 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
default:
gcc_assert (EXPR_P (parm));
-
+
/* We must be looking at an expression. This can happen with
- something like:
-
+ something like:
+
template <int I>
void foo(S<I>, S<I + 2>);
This is a "nondeduced context":
[deduct.type]
-
+
The nondeduced contexts are:
--A type that is a template-id in which one or more of
the template-arguments is an expression that references
- a template-parameter.
+ a template-parameter.
In these cases, we assume deduction succeeded, but don't
actually infer any unifications. */
@@ -10391,13 +10395,13 @@ mark_decl_instantiated (tree result, int extern_p)
else if (TREE_PUBLIC (result))
maybe_make_one_only (result);
}
-
+
/* If EXTERN_P, then this function will not be emitted -- unless
followed by an explicit instantiation, at which point its linkage
will be adjusted. If !EXTERN_P, then this function will be
emitted here. In neither circumstance do we want
import_export_decl to adjust the linkage. */
- DECL_INTERFACE_KNOWN (result) = 1;
+ DECL_INTERFACE_KNOWN (result) = 1;
}
/* Given two function templates PAT1 and PAT2, return:
@@ -10425,7 +10429,7 @@ mark_decl_instantiated (tree result, int extern_p)
we do *not* verify the deduced template argument values can be
substituted into non-deduced contexts, nor do we have to verify
that all template arguments have been deduced. */
-
+
int
more_specialized_fn (tree pat1, tree pat2, int len)
{
@@ -10443,7 +10447,7 @@ more_specialized_fn (tree pat1, tree pat2, int len)
/* If only one is a member function, they are unordered. */
if (DECL_FUNCTION_MEMBER_P (decl1) != DECL_FUNCTION_MEMBER_P (decl2))
return 0;
-
+
/* Don't consider 'this' parameter. */
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl1))
args1 = TREE_CHAIN (args1);
@@ -10453,7 +10457,7 @@ more_specialized_fn (tree pat1, tree pat2, int len)
/* If only one is a conversion operator, they are unordered. */
if (DECL_CONV_FN_P (decl1) != DECL_CONV_FN_P (decl2))
return 0;
-
+
/* Consider the return type for a conversion function */
if (DECL_CONV_FN_P (decl1))
{
@@ -10461,9 +10465,9 @@ more_specialized_fn (tree pat1, tree pat2, int len)
args2 = tree_cons (NULL_TREE, TREE_TYPE (TREE_TYPE (decl2)), args2);
len++;
}
-
+
processing_template_decl++;
-
+
while (len--)
{
tree arg1 = TREE_VALUE (args1);
@@ -10477,7 +10481,7 @@ more_specialized_fn (tree pat1, tree pat2, int len)
arg1 = TREE_TYPE (arg1);
quals1 = cp_type_quals (arg1);
}
-
+
if (TREE_CODE (arg2) == REFERENCE_TYPE)
{
arg2 = TREE_TYPE (arg2);
@@ -10502,7 +10506,7 @@ more_specialized_fn (tree pat1, tree pat2, int len)
case FUNCTION_TYPE:
arg1 = build_pointer_type (arg1);
break;
-
+
default:
break;
}
@@ -10517,16 +10521,16 @@ more_specialized_fn (tree pat1, tree pat2, int len)
case FUNCTION_TYPE:
arg2 = build_pointer_type (arg2);
break;
-
+
default:
break;
}
}
}
-
+
arg1 = TYPE_MAIN_VARIANT (arg1);
arg2 = TYPE_MAIN_VARIANT (arg2);
-
+
deduce1 = !unify (tparms1, targs1, arg1, arg2, UNIFY_ALLOW_NONE);
deduce2 = !unify (tparms2, targs2, arg2, arg1, UNIFY_ALLOW_NONE);
@@ -10538,7 +10542,7 @@ more_specialized_fn (tree pat1, tree pat2, int len)
/* We've failed to deduce something in either direction.
These must be unordered. */
break;
-
+
if (deduce1 && deduce2 && quals1 >= 0 && quals2 >= 0)
{
/* Deduces in both directions, see if quals can
@@ -10552,7 +10556,7 @@ more_specialized_fn (tree pat1, tree pat2, int len)
better2 = 1;
if (deduce2 && !deduce1 && !better1)
better1 = 1;
-
+
args1 = TREE_CHAIN (args1);
args2 = TREE_CHAIN (args2);
}
@@ -10570,14 +10574,14 @@ more_specialized_fn (tree pat1, tree pat2, int len)
FULL_ARGS is the full set of template arguments that triggers this
partial ordering. */
-
+
int
more_specialized_class (tree pat1, tree pat2, tree full_args)
{
tree targs;
int winner = 0;
- /* Just like what happens for functions, if we are ordering between
+ /* Just like what happens for functions, if we are ordering between
different class template specializations, we may encounter dependent
types in the arguments, and we need our dependency check functions
to behave correctly. */
@@ -10601,7 +10605,7 @@ more_specialized_class (tree pat1, tree pat2, tree full_args)
arguments EXPLICIT_ARGS. If CHECK_RETTYPE is true, the return type must
also match. Return NULL_TREE if no satisfactory arguments could be
found. */
-
+
static tree
get_bindings (tree fn, tree decl, tree explicit_args, bool check_rettype)
{
@@ -10631,8 +10635,8 @@ get_bindings (tree fn, tree decl, tree explicit_args, bool check_rettype)
tf_none, /*require_all_arguments=*/0));
if (converted_args == error_mark_node)
return NULL_TREE;
-
- decl_type = tsubst (decl_type, converted_args, tf_none, NULL_TREE);
+
+ decl_type = tsubst (decl_type, converted_args, tf_none, NULL_TREE);
if (decl_type == error_mark_node)
return NULL_TREE;
}
@@ -10642,10 +10646,10 @@ get_bindings (tree fn, tree decl, tree explicit_args, bool check_rettype)
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl))
decl_arg_types = TREE_CHAIN (decl_arg_types);
- if (fn_type_unification (fn, explicit_args, targs,
+ if (fn_type_unification (fn, explicit_args, targs,
decl_arg_types,
(check_rettype || DECL_CONV_FN_P (fn)
- ? TREE_TYPE (decl_type) : NULL_TREE),
+ ? TREE_TYPE (decl_type) : NULL_TREE),
DEDUCE_EXACT))
return NULL_TREE;
@@ -10655,7 +10659,7 @@ get_bindings (tree fn, tree decl, tree explicit_args, bool check_rettype)
/* Return the innermost template arguments that, when applied to a
template specialization whose innermost template parameters are
TPARMS, and whose specialization arguments are PARMS, yield the
- ARGS.
+ ARGS.
For example, suppose we have:
@@ -10674,7 +10678,7 @@ get_class_bindings (tree tparms, tree parms, tree args)
tree vec = make_tree_vec (ntparms);
if (unify (tparms, vec, parms, INNERMOST_TEMPLATE_ARGS (args),
- UNIFY_ALLOW_NONE))
+ UNIFY_ALLOW_NONE))
return NULL_TREE;
for (i = 0; i < ntparms; ++i)
@@ -10701,14 +10705,14 @@ most_specialized_instantiation (tree instantiations)
if (!instantiations)
return NULL_TREE;
-
+
++processing_template_decl;
-
+
champ = instantiations;
for (fn = TREE_CHAIN (instantiations); fn; fn = TREE_CHAIN (fn))
{
int fate = 0;
-
+
if (get_bindings (TREE_VALUE (champ),
DECL_TEMPLATE_RESULT (TREE_VALUE (fn)),
NULL_TREE, /*check_ret=*/false))
@@ -10718,7 +10722,7 @@ most_specialized_instantiation (tree instantiations)
DECL_TEMPLATE_RESULT (TREE_VALUE (champ)),
NULL_TREE, /*check_ret=*/false))
fate++;
-
+
if (fate != 1)
{
if (!fate)
@@ -10728,7 +10732,7 @@ most_specialized_instantiation (tree instantiations)
champ = fn;
}
}
-
+
if (champ)
/* Now verify that champ is better than everything earlier in the
instantiation list. */
@@ -10743,9 +10747,9 @@ most_specialized_instantiation (tree instantiations)
champ = NULL_TREE;
break;
}
-
+
processing_template_decl--;
-
+
if (!champ)
return error_mark_node;
@@ -10847,7 +10851,7 @@ most_specialized_class (tree tmpl, tree args)
tmpl = most_general_template (tmpl);
for (t = DECL_TEMPLATE_SPECIALIZATIONS (tmpl); t; t = TREE_CHAIN (t))
{
- tree spec_args
+ tree spec_args
= get_class_bindings (TREE_VALUE (t), TREE_PURPOSE (t), args);
if (spec_args)
{
@@ -10955,7 +10959,7 @@ do_decl_instantiation (tree decl, tree storage)
/* [temp.spec]
No program shall explicitly instantiate any template more
- than once.
+ than once.
We check DECL_NOT_REALLY_EXTERN so as not to complain when
the first instantiation was `extern' and the second is not,
@@ -10984,7 +10988,7 @@ do_decl_instantiation (tree decl, tree storage)
{
if (pedantic && !in_system_header)
pedwarn ("ISO C++ forbids the use of %<extern%> on explicit "
- "instantiations");
+ "instantiations");
extern_p = 1;
}
else
@@ -11007,7 +11011,7 @@ mark_class_instantiated (tree t, int extern_p)
CLASSTYPE_DEBUG_REQUESTED (t) = 1;
rest_of_type_compilation (t, 1);
}
-}
+}
/* Called from do_type_instantiation through binding_table_foreach to
do recursive instantiation for the type bound in ENTRY. */
@@ -11036,7 +11040,7 @@ instantiate_class_member (tree decl, int extern_p)
non-null, is the RID for extern, inline or static. COMPLAIN is
nonzero if this is called from the parser, zero if called recursively,
since the standard is unclear (as detailed below). */
-
+
void
do_type_instantiation (tree t, tree storage, tsubst_flags_t complain)
{
@@ -11060,15 +11064,15 @@ do_type_instantiation (tree t, tree storage, tsubst_flags_t complain)
{
if (complain & tf_error)
error ("explicit instantiation of %q#T before definition of template",
- t);
+ t);
return;
}
if (storage != NULL_TREE)
{
if (pedantic && !in_system_header)
- pedwarn("ISO C++ forbids the use of %qE on explicit instantiations",
- storage);
+ pedwarn("ISO C++ forbids the use of %qE on explicit instantiations",
+ storage);
if (storage == ridpointers[(int) RID_INLINE])
nomem_p = 1;
@@ -11079,7 +11083,7 @@ do_type_instantiation (tree t, tree storage, tsubst_flags_t complain)
else
{
error ("storage class %qD applied to template instantiation",
- storage);
+ storage);
extern_p = 0;
}
}
@@ -11103,9 +11107,9 @@ do_type_instantiation (tree t, tree storage, tsubst_flags_t complain)
/* [temp.spec]
No program shall explicitly instantiate any template more
- than once.
+ than once.
- If PREVIOUS_INSTANTIATION_EXTERN_P, then the first explicit
+ If PREVIOUS_INSTANTIATION_EXTERN_P, then the first explicit
instantiation was `extern'. If EXTERN_P then the second is.
These cases are OK. */
previous_instantiation_extern_p = CLASSTYPE_INTERFACE_ONLY (t);
@@ -11113,7 +11117,7 @@ do_type_instantiation (tree t, tree storage, tsubst_flags_t complain)
if (!previous_instantiation_extern_p && !extern_p
&& (complain & tf_error))
pedwarn ("duplicate explicit instantiation of %q#T", t);
-
+
/* If we've already instantiated the template, just return now. */
if (!CLASSTYPE_INTERFACE_ONLY (t))
return;
@@ -11131,12 +11135,12 @@ do_type_instantiation (tree t, tree storage, tsubst_flags_t complain)
declarations, and not the definitions, of members are
instantiated, we have here:
- [temp.explicit]
+ [temp.explicit]
The explicit instantiation of a class template specialization
implies the instantiation of all of its members not
previously explicitly specialized in the translation unit
- containing the explicit instantiation.
+ containing the explicit instantiation.
Of course, we can't instantiate member template classes, since
we don't have any arguments for them. Note that the standard
@@ -11156,7 +11160,7 @@ do_type_instantiation (tree t, tree storage, tsubst_flags_t complain)
if (CLASSTYPE_NESTED_UTDS (t))
binding_table_foreach (CLASSTYPE_NESTED_UTDS (t),
- bt_instantiate_type_proc, &storage);
+ bt_instantiate_type_proc, &storage);
}
}
@@ -11202,9 +11206,9 @@ regenerate_decl_from_template (tree decl, tree tmpl)
tree specs;
int args_depth;
int parms_depth;
-
+
args_depth = TMPL_ARGS_DEPTH (args);
- parms_depth = TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl));
+ parms_depth = TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl));
if (args_depth > parms_depth)
args = get_innermost_template_args (args, parms_depth);
@@ -11215,9 +11219,9 @@ regenerate_decl_from_template (tree decl, tree tmpl)
specs);
/* Merge parameter declarations. */
- decl_parm = skip_artificial_parms_for (decl,
+ decl_parm = skip_artificial_parms_for (decl,
DECL_ARGUMENTS (decl));
- pattern_parm
+ pattern_parm
= skip_artificial_parms_for (code_pattern,
DECL_ARGUMENTS (code_pattern));
while (decl_parm)
@@ -11253,8 +11257,8 @@ regenerate_decl_from_template (tree decl, tree tmpl)
{
if (!DECL_INITIALIZED_IN_CLASS_P (decl)
&& DECL_INITIAL (code_pattern))
- DECL_INITIAL (decl) =
- tsubst_expr (DECL_INITIAL (code_pattern), args,
+ DECL_INITIAL (decl) =
+ tsubst_expr (DECL_INITIAL (code_pattern), args,
tf_error, DECL_TI_TEMPLATE (decl));
}
else
@@ -11275,9 +11279,9 @@ template_for_substitution (tree decl)
for the instantiation. This is not always the most general
template. Consider, for example:
- template <class T>
+ template <class T>
struct S { template <class U> void f();
- template <> void f<int>(); };
+ template <> void f<int>(); };
and an instantiation of S<double>::f<int>. We want TD to be the
specialization S<T>::f<int>, not the more general S<T>::f<U>. */
@@ -11286,7 +11290,7 @@ template_for_substitution (tree decl)
DECL_TEMPLATE_INSTANTIATION (tmpl)
/* We must also deal with friend templates. Given:
- template <class T> struct S {
+ template <class T> struct S {
template <class U> friend void f() {};
};
@@ -11295,7 +11299,7 @@ template_for_substitution (tree decl)
where we get the pattern for the instantiation from. On
other hand, if the definition comes outside the class, say:
- template <class T> struct S {
+ template <class T> struct S {
template <class U> friend void f();
};
template <class U> friend void f() {}
@@ -11313,7 +11317,7 @@ template_for_substitution (tree decl)
a specialization was declared, but not defined. */
gcc_assert (TREE_CODE (decl) != VAR_DECL
|| DECL_IN_AGGR_P (DECL_TEMPLATE_RESULT (tmpl)));
-
+
/* Fetch the more general template. */
tmpl = DECL_TI_TEMPLATE (tmpl);
}
@@ -11344,7 +11348,7 @@ instantiate_decl (tree d, int defer_ok, int undefined_ok)
int pattern_defined;
int need_push;
location_t saved_loc = input_location;
-
+
/* This function should only be used to instantiate templates for
functions and static member variables. */
gcc_assert (TREE_CODE (d) == FUNCTION_DECL
@@ -11414,7 +11418,7 @@ instantiate_decl (tree d, int defer_ok, int undefined_ok)
/* Unless an explicit instantiation directive has already determined
the linkage of D, remember that a definition is available for
this entity. */
- if (pattern_defined
+ if (pattern_defined
&& !DECL_INTERFACE_KNOWN (d)
&& !DECL_NOT_REALLY_EXTERN (d))
mark_definable (d);
@@ -11454,10 +11458,10 @@ instantiate_decl (tree d, int defer_ok, int undefined_ok)
pop_access_scope (d);
}
-
+
/* We should have set up DECL_INITIAL in instantiate_class_template
for in-class definitions of static data members. */
- gcc_assert (!(TREE_CODE (d) == VAR_DECL
+ gcc_assert (!(TREE_CODE (d) == VAR_DECL
&& DECL_INITIALIZED_IN_CLASS_P (d)
&& DECL_INITIAL (d) == NULL_TREE));
@@ -11465,7 +11469,7 @@ instantiate_decl (tree d, int defer_ok, int undefined_ok)
elsewhere. */
if (DECL_INTERFACE_KNOWN (d)
&& DECL_REALLY_EXTERN (d)
- && ! (TREE_CODE (d) == FUNCTION_DECL
+ && ! (TREE_CODE (d) == FUNCTION_DECL
&& DECL_INLINE (d)))
goto out;
/* Defer all other templates, unless we have been explicitly
@@ -11475,7 +11479,7 @@ instantiate_decl (tree d, int defer_ok, int undefined_ok)
{
input_location = saved_loc;
- if (at_eof && !pattern_defined
+ if (at_eof && !pattern_defined
&& DECL_EXPLICIT_INSTANTIATION (d))
/* [temp.explicit]
@@ -11504,7 +11508,7 @@ instantiate_decl (tree d, int defer_ok, int undefined_ok)
job, even though we'll not be emitting a copy of this
function. */
if (!(TREE_CODE (d) == FUNCTION_DECL
- && flag_inline_trees
+ && flag_inline_trees
&& DECL_DECLARED_INLINE_P (d)))
goto out;
}
@@ -11539,8 +11543,8 @@ instantiate_decl (tree d, int defer_ok, int undefined_ok)
/* Enter the scope of D so that access-checking works correctly. */
push_nested_class (DECL_CONTEXT (d));
- cp_finish_decl (d,
- (!DECL_INITIALIZED_IN_CLASS_P (d)
+ cp_finish_decl (d,
+ (!DECL_INITIALIZED_IN_CLASS_P (d)
? DECL_INITIAL (d) : NULL_TREE),
NULL_TREE, 0);
pop_nested_class ();
@@ -11557,7 +11561,7 @@ instantiate_decl (tree d, int defer_ok, int undefined_ok)
saved_local_specializations = local_specializations;
/* Set up the list of local specializations. */
- local_specializations = htab_create (37,
+ local_specializations = htab_create (37,
hash_local_specialization,
eq_local_specializations,
NULL);
@@ -11638,7 +11642,7 @@ instantiate_pending_templates (int retries)
return;
}
- do
+ do
{
reconsider = 0;
@@ -11657,7 +11661,7 @@ instantiate_pending_templates (int retries)
{
instantiate_class_template (instantiation);
if (CLASSTYPE_TEMPLATE_INSTANTIATION (instantiation))
- for (fn = TYPE_METHODS (instantiation);
+ for (fn = TYPE_METHODS (instantiation);
fn;
fn = TREE_CHAIN (fn))
if (! DECL_ARTIFICIAL (fn))
@@ -11704,7 +11708,7 @@ instantiate_pending_templates (int retries)
current_tinst_level = NULL_TREE;
}
last_pending_template = last;
- }
+ }
while (reconsider);
input_location = saved_loc;
@@ -11731,7 +11735,7 @@ tsubst_initializer_list (tree t, tree argvec)
decl = expand_member_init (decl);
if (decl && !DECL_P (decl))
in_base_initializer = 1;
-
+
init = tsubst_expr (TREE_VALUE (t), argvec, tf_error | tf_warning,
NULL_TREE);
in_base_initializer = 0;
@@ -11776,7 +11780,7 @@ tsubst_enum (tree tag, tree newtag, tree args)
decl = TREE_VALUE (e);
/* Note that in a template enum, the TREE_VALUE is the
CONST_DECL, not the corresponding INTEGER_CST. */
- value = tsubst_expr (DECL_INITIAL (decl),
+ value = tsubst_expr (DECL_INITIAL (decl),
args, tf_error | tf_warning,
NULL_TREE);
@@ -11784,7 +11788,7 @@ tsubst_enum (tree tag, tree newtag, tree args)
set_current_access_from_decl (decl);
/* Actually build the enumerator itself. */
- build_enumerator (DECL_NAME (decl), value, newtag);
+ build_enumerator (DECL_NAME (decl), value, newtag);
}
finish_enum (newtag);
@@ -11797,7 +11801,7 @@ tsubst_enum (tree tag, tree newtag, tree args)
arguments. So, innermost set of template parameters will appear in
the type. */
-tree
+tree
get_mostly_instantiated_function_type (tree decl)
{
tree fn_type;
@@ -11897,7 +11901,7 @@ invalid_nontype_parm_type_p (tree type, tsubst_flags_t complain)
return 0;
else if (TREE_CODE (type) == TYPENAME_TYPE)
return 0;
-
+
if (complain & tf_error)
error ("%q#T is not a valid type for a template constant parameter", type);
return 1;
@@ -11918,21 +11922,21 @@ dependent_type_p_r (tree type)
-- a template parameter. Template template parameters are types
for us (since TYPE_P holds true for them) so we handle
them here. */
- if (TREE_CODE (type) == TEMPLATE_TYPE_PARM
+ if (TREE_CODE (type) == TEMPLATE_TYPE_PARM
|| TREE_CODE (type) == TEMPLATE_TEMPLATE_PARM)
return true;
/* -- a qualified-id with a nested-name-specifier which contains a
- class-name that names a dependent type or whose unqualified-id
+ class-name that names a dependent type or whose unqualified-id
names a dependent type. */
if (TREE_CODE (type) == TYPENAME_TYPE)
return true;
/* -- a cv-qualified type where the cv-unqualified type is
- dependent. */
+ dependent. */
type = TYPE_MAIN_VARIANT (type);
/* -- a compound type constructed from any dependent type. */
if (TYPE_PTR_TO_MEMBER_P (type))
return (dependent_type_p (TYPE_PTRMEM_CLASS_TYPE (type))
- || dependent_type_p (TYPE_PTRMEM_POINTED_TO_TYPE
+ || dependent_type_p (TYPE_PTRMEM_POINTED_TO_TYPE
(type)));
else if (TREE_CODE (type) == POINTER_TYPE
|| TREE_CODE (type) == REFERENCE_TYPE)
@@ -11944,27 +11948,27 @@ dependent_type_p_r (tree type)
if (dependent_type_p (TREE_TYPE (type)))
return true;
- for (arg_type = TYPE_ARG_TYPES (type);
- arg_type;
+ for (arg_type = TYPE_ARG_TYPES (type);
+ arg_type;
arg_type = TREE_CHAIN (arg_type))
if (dependent_type_p (TREE_VALUE (arg_type)))
return true;
return false;
}
/* -- an array type constructed from any dependent type or whose
- size is specified by a constant expression that is
+ size is specified by a constant expression that is
value-dependent. */
if (TREE_CODE (type) == ARRAY_TYPE)
{
if (TYPE_DOMAIN (type)
- && ((value_dependent_expression_p
+ && ((value_dependent_expression_p
(TYPE_MAX_VALUE (TYPE_DOMAIN (type))))
|| (type_dependent_expression_p
(TYPE_MAX_VALUE (TYPE_DOMAIN (type))))))
return true;
return dependent_type_p (TREE_TYPE (type));
}
-
+
/* -- a template-id in which either the template name is a template
parameter ... */
if (TREE_CODE (type) == BOUND_TEMPLATE_TEMPLATE_PARM)
@@ -11972,22 +11976,22 @@ dependent_type_p_r (tree type)
/* ... or any of the template arguments is a dependent type or
an expression that is type-dependent or value-dependent. */
else if (CLASS_TYPE_P (type) && CLASSTYPE_TEMPLATE_INFO (type)
- && (any_dependent_template_arguments_p
+ && (any_dependent_template_arguments_p
(INNERMOST_TEMPLATE_ARGS (CLASSTYPE_TI_ARGS (type)))))
return true;
-
+
/* All TYPEOF_TYPEs are dependent; if the argument of the `typeof'
expression is not type-dependent, then it should already been
have resolved. */
if (TREE_CODE (type) == TYPEOF_TYPE)
return true;
-
+
/* The standard does not specifically mention types that are local
to template functions or local classes, but they should be
considered dependent too. For example:
- template <int I> void f() {
- enum E { a = I };
+ template <int I> void f() {
+ enum E { a = I };
S<sizeof (E)> s;
}
@@ -12058,7 +12062,7 @@ dependent_scope_ref_p (tree expression, bool criterion (tree))
/* The suggested resolution to Core Issue 2 implies that if the
qualifying type is the current class, then we must peek
inside it. */
- if (DECL_P (name)
+ if (DECL_P (name)
&& currently_open_class (scope)
&& !criterion (name))
return false;
@@ -12080,7 +12084,7 @@ value_dependent_expression_p (tree expression)
/* A name declared with a dependent type. */
if (DECL_P (expression) && type_dependent_expression_p (expression))
return true;
-
+
switch (TREE_CODE (expression))
{
case IDENTIFIER_NODE:
@@ -12098,8 +12102,8 @@ value_dependent_expression_p (tree expression)
return false;
case VAR_DECL:
- /* A constant with integral or enumeration type and is initialized
- with an expression that is value-dependent. */
+ /* A constant with integral or enumeration type and is initialized
+ with an expression that is value-dependent. */
if (DECL_INITIAL (expression)
&& INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (expression))
&& value_dependent_expression_p (DECL_INITIAL (expression)))
@@ -12112,14 +12116,14 @@ value_dependent_expression_p (tree expression)
case REINTERPRET_CAST_EXPR:
case CAST_EXPR:
/* These expressions are value-dependent if the type to which
- the cast occurs is dependent or the expression being casted
- is value-dependent. */
+ the cast occurs is dependent or the expression being casted
+ is value-dependent. */
{
tree type = TREE_TYPE (expression);
-
+
if (dependent_type_p (type))
return true;
-
+
/* A functional cast has a list of operands. */
expression = TREE_OPERAND (expression, 0);
if (!expression)
@@ -12128,10 +12132,10 @@ value_dependent_expression_p (tree expression)
as "int()". This should not happen for aggregate types
because it would form non-constant expressions. */
gcc_assert (INTEGRAL_OR_ENUMERATION_TYPE_P (type));
-
+
return false;
}
-
+
if (TREE_CODE (expression) == TREE_LIST)
{
for (; expression; expression = TREE_CHAIN (expression))
@@ -12139,14 +12143,14 @@ value_dependent_expression_p (tree expression)
return true;
return false;
}
-
+
return value_dependent_expression_p (expression);
}
-
+
case SIZEOF_EXPR:
case ALIGNOF_EXPR:
/* A `sizeof' expression is value-dependent if the operand is
- type-dependent. */
+ type-dependent. */
expression = TREE_OPERAND (expression, 0);
if (TYPE_P (expression))
return dependent_type_p (expression);
@@ -12161,21 +12165,21 @@ value_dependent_expression_p (tree expression)
case CALL_EXPR:
/* A CALL_EXPR is value-dependent if any argument is
- value-dependent. Why do we have to handle CALL_EXPRs in this
- function at all? First, some function calls, those for which
- value_dependent_expression_p is true, man appear in constant
- expressions. Second, there appear to be bugs which result in
- other CALL_EXPRs reaching this point. */
+ value-dependent. Why do we have to handle CALL_EXPRs in this
+ function at all? First, some function calls, those for which
+ value_dependent_expression_p is true, man appear in constant
+ expressions. Second, there appear to be bugs which result in
+ other CALL_EXPRs reaching this point. */
{
tree function = TREE_OPERAND (expression, 0);
tree args = TREE_OPERAND (expression, 1);
-
+
if (value_dependent_expression_p (function))
return true;
-
+
if (! args)
return false;
-
+
if (TREE_CODE (args) == TREE_LIST)
{
for (; args; args = TREE_CHAIN (args))
@@ -12183,27 +12187,27 @@ value_dependent_expression_p (tree expression)
return true;
return false;
}
-
+
return value_dependent_expression_p (args);
}
default:
/* A constant expression is value-dependent if any subexpression is
- value-dependent. */
+ value-dependent. */
switch (TREE_CODE_CLASS (TREE_CODE (expression)))
{
case tcc_reference:
case tcc_unary:
- return (value_dependent_expression_p
+ return (value_dependent_expression_p
(TREE_OPERAND (expression, 0)));
-
+
case tcc_comparison:
case tcc_binary:
- return ((value_dependent_expression_p
+ return ((value_dependent_expression_p
(TREE_OPERAND (expression, 0)))
- || (value_dependent_expression_p
+ || (value_dependent_expression_p
(TREE_OPERAND (expression, 1))));
-
+
case tcc_expression:
{
int i;
@@ -12218,12 +12222,12 @@ value_dependent_expression_p (tree expression)
return true;
return false;
}
-
+
default:
break;
}
}
-
+
/* The expression is not value-dependent. */
return false;
}
@@ -12243,7 +12247,7 @@ type_dependent_expression_p (tree expression)
/* An unresolved name is always dependent. */
if (TREE_CODE (expression) == IDENTIFIER_NODE)
return true;
-
+
/* Some expression forms are never type-dependent. */
if (TREE_CODE (expression) == PSEUDO_DTOR_EXPR
|| TREE_CODE (expression) == SIZEOF_EXPR
@@ -12314,10 +12318,10 @@ type_dependent_expression_p (tree expression)
/* SCOPE_REF with non-null TREE_TYPE is always non-dependent. */
if (TREE_CODE (expression) == SCOPE_REF)
return false;
-
+
if (TREE_CODE (expression) == BASELINK)
expression = BASELINK_FUNCTIONS (expression);
-
+
if (TREE_CODE (expression) == TEMPLATE_ID_EXPR)
{
if (any_dependent_template_arguments_p
@@ -12326,7 +12330,7 @@ type_dependent_expression_p (tree expression)
expression = TREE_OPERAND (expression, 0);
}
gcc_assert (TREE_CODE (expression) == OVERLOAD);
-
+
while (expression)
{
if (type_dependent_expression_p (OVL_CURRENT (expression)))
@@ -12335,7 +12339,7 @@ type_dependent_expression_p (tree expression)
}
return false;
}
-
+
return (dependent_type_p (TREE_TYPE (expression)));
}
@@ -12524,13 +12528,13 @@ build_non_dependent_expr (tree expr)
{
tree inner_expr;
- /* Preserve null pointer constants so that the type of things like
+ /* Preserve null pointer constants so that the type of things like
"p == 0" where "p" is a pointer can be determined. */
if (null_ptr_cst_p (expr))
return expr;
/* Preserve OVERLOADs; the functions must be available to resolve
types. */
- inner_expr = (TREE_CODE (expr) == ADDR_EXPR ?
+ inner_expr = (TREE_CODE (expr) == ADDR_EXPR ?
TREE_OPERAND (expr, 0) : expr);
if (is_overloaded_fn (inner_expr)
|| TREE_CODE (inner_expr) == OFFSET_REF)
@@ -12559,7 +12563,7 @@ build_non_dependent_expr (tree expr)
return build3 (COND_EXPR,
TREE_TYPE (expr),
TREE_OPERAND (expr, 0),
- (TREE_OPERAND (expr, 1)
+ (TREE_OPERAND (expr, 1)
? build_non_dependent_expr (TREE_OPERAND (expr, 1))
: build_non_dependent_expr (TREE_OPERAND (expr, 0))),
build_non_dependent_expr (TREE_OPERAND (expr, 2)));
@@ -12569,14 +12573,14 @@ build_non_dependent_expr (tree expr)
TREE_TYPE (expr),
TREE_OPERAND (expr, 0),
build_non_dependent_expr (TREE_OPERAND (expr, 1)));
-
- /* Otherwise, build a NON_DEPENDENT_EXPR.
+
+ /* Otherwise, build a NON_DEPENDENT_EXPR.
REFERENCE_TYPEs are not stripped for expressions in templates
because doing so would play havoc with mangling. Consider, for
example:
- template <typename T> void f<T& g>() { g(); }
+ template <typename T> void f<T& g>() { g(); }
In the body of "f", the expression for "g" will have
REFERENCE_TYPE, even though the standard says that it should
@@ -12599,7 +12603,7 @@ build_non_dependent_args (tree args)
new_args = NULL_TREE;
for (a = args; a; a = TREE_CHAIN (a))
- new_args = tree_cons (NULL_TREE,
+ new_args = tree_cons (NULL_TREE,
build_non_dependent_expr (TREE_VALUE (a)),
new_args);
return nreverse (new_args);
diff --git a/gcc/cp/ptree.c b/gcc/cp/ptree.c
index 2ed91a3a79e..227dde59f37 100644
--- a/gcc/cp/ptree.c
+++ b/gcc/cp/ptree.c
@@ -129,7 +129,7 @@ cxx_print_type (FILE *file, tree node, int indent)
BINFO_N_BASE_BINFOS (TYPE_BINFO (node)));
else
fprintf (file, " no-binfo");
-
+
fprintf (file, " use_template=%d", CLASSTYPE_USE_TEMPLATE (node));
if (CLASSTYPE_INTERFACE_ONLY (node))
fprintf (file, " interface-only");
diff --git a/gcc/cp/repo.c b/gcc/cp/repo.c
index 370ecec2ea0..206487d6d3a 100644
--- a/gcc/cp/repo.c
+++ b/gcc/cp/repo.c
@@ -115,7 +115,7 @@ get_base_filename (const char *filename)
}
return lbasename (filename);
-}
+}
static void
open_repo_file (const char *filename)
@@ -332,7 +332,7 @@ repo_export_class_p (tree class_type)
return false;
/* If the virtual table has been assigned to this translation unit,
export the class. */
- return (IDENTIFIER_REPO_CHOSEN
+ return (IDENTIFIER_REPO_CHOSEN
(DECL_ASSEMBLER_NAME (CLASSTYPE_VTABLES (class_type))));
}
diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c
index bff6c952b9a..317068e5c6e 100644
--- a/gcc/cp/rtti.c
+++ b/gcc/cp/rtti.c
@@ -62,21 +62,45 @@ Boston, MA 02111-1307, USA. */
corresponding to type_info. That will only happen at the end of
translation, when we are emitting the type info objects. */
-/* 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. */
-#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. */
-#define TINFO_VTABLE_DECL(NODE) TREE_VALUE (NODE)
-/* The IDENTIFIER_NODE naming the real class. */
-#define TINFO_REAL_NAME(NODE) TREE_PURPOSE (NODE)
+/* Auxiliary data we hold for each type_info derived object we need. */
+typedef struct tinfo_s GTY (())
+{
+ tree type; /* The RECORD_TYPE for this type_info object */
+
+ tree vtable; /* The VAR_DECL of the vtable. Only filled at end of
+ translation. */
+
+ tree name; /* IDENTIFIER_NODE for the ABI specified name of
+ the type_info derived type. */
+} tinfo_s;
+
+DEF_VEC_O(tinfo_s);
+DEF_VEC_ALLOC_O(tinfo_s,gc);
+
+typedef enum tinfo_kind
+{
+ TK_TYPE_INFO_TYPE, /* std::type_info */
+ TK_BASE_TYPE, /* abi::__base_class_type_info */
+ TK_BUILTIN_TYPE, /* abi::__fundamental_type_info */
+ TK_ARRAY_TYPE, /* abi::__array_type_info */
+ TK_FUNCTION_TYPE, /* abi::__function_type_info */
+ TK_ENUMERAL_TYPE, /* abi::__enum_type_info */
+ TK_POINTER_TYPE, /* abi::__pointer_type_info */
+ TK_POINTER_MEMBER_TYPE, /* abi::__pointer_to_member_type_info */
+ TK_CLASS_TYPE, /* abi::__class_type_info */
+ TK_SI_CLASS_TYPE, /* abi::__si_class_type_info */
+ TK_FIXED /* end of fixed descriptors. */
+ /* ... abi::__vmi_type_info<I> */
+} tinfo_kind;
/* A vector of all tinfo decls that haven't yet been emitted. */
VEC(tree,gc) *unemitted_tinfo_decls;
+/* A vector of all type_info derived types we need. The first few are
+ fixed and created early. The remainder are for multiple inheritance
+ and are generated as needed. */
+static GTY (()) VEC(tinfo_s,gc) *tinfo_descs;
+
static tree build_headof (tree);
static tree ifnonnull (tree, tree);
static tree tinfo_name (tree);
@@ -88,12 +112,14 @@ static tree get_tinfo_ptr (tree);
static bool typeid_ok_p (void);
static int qualifier_flags (tree);
static bool target_incomplete_p (tree);
-static tree tinfo_base_init (tree, tree);
-static tree generic_initializer (tree, tree);
-static tree class_initializer (tree, tree, tree);
-static tree create_pseudo_type_info (const char *, int, ...);
-static tree get_pseudo_ti_init (tree, tree);
-static tree get_pseudo_ti_desc (tree);
+static tree tinfo_base_init (tinfo_s *, tree);
+static tree generic_initializer (tinfo_s *, tree);
+static tree ptr_initializer (tinfo_s *, tree);
+static tree ptm_initializer (tinfo_s *, tree);
+static tree class_initializer (tinfo_s *, tree, tree);
+static void create_pseudo_type_info (tinfo_kind, const char *, ...);
+static tree get_pseudo_ti_init (tree, unsigned);
+static unsigned get_pseudo_ti_index (tree);
static void create_tinfo_types (void);
static bool typeinfo_in_lib_p (tree);
@@ -110,7 +136,7 @@ void
init_rtti_processing (void)
{
tree type_info_type;
-
+
push_namespace (std_identifier);
type_info_type = xref_tag (class_type, get_identifier ("type_info"),
/*tag_scope=*/ts_current, false);
@@ -120,7 +146,7 @@ init_rtti_processing (void)
type_info_ptr_type = build_pointer_type (const_type_info_type_node);
unemitted_tinfo_decls = VEC_alloc (tree, gc, 124);
-
+
create_tinfo_types ();
}
@@ -151,9 +177,9 @@ build_headof (tree exp)
offset = build_vtbl_ref (build_indirect_ref (exp, NULL), index);
- type = build_qualified_type (ptr_type_node,
+ type = build_qualified_type (ptr_type_node,
cp_type_quals (TREE_TYPE (exp)));
- return build2 (PLUS_EXPR, type, exp,
+ return build2 (PLUS_EXPR, type, exp,
convert_to_integer (ptrdiff_type_node, offset));
}
@@ -168,7 +194,7 @@ throw_bad_cast (void)
if (!get_global_value_if_present (fn, &fn))
fn = push_throw_library_fn (fn, build_function_type (ptr_type_node,
void_list_node));
-
+
return build_cxx_call (fn, NULL_TREE);
}
@@ -201,7 +227,7 @@ get_tinfo_decl_dynamic (tree exp)
{
tree type;
tree t;
-
+
if (exp == error_mark_node)
return error_mark_node;
@@ -210,10 +236,10 @@ get_tinfo_decl_dynamic (tree exp)
/* Peel off cv qualifiers. */
type = TYPE_MAIN_VARIANT (type);
-
+
if (!VOID_TYPE_P (type))
type = complete_type_or_else (type, exp);
-
+
if (!type)
return error_mark_node;
@@ -244,13 +270,13 @@ typeid_ok_p (void)
error ("cannot use typeid with -fno-rtti");
return false;
}
-
+
if (!COMPLETE_TYPE_P (const_type_info_type_node))
{
error ("must #include <typeinfo> before using typeid");
return false;
}
-
+
return true;
}
@@ -308,7 +334,7 @@ tinfo_name (tree type)
/* Return a VAR_DECL for the internal ABI defined type_info object for
TYPE. You must arrange that the decl is mark_used, if actually use
- it --- decls in vtables are only used if the vtable is output. */
+ it --- decls in vtables are only used if the vtable is output. */
tree
get_tinfo_decl (tree type)
@@ -316,11 +342,11 @@ get_tinfo_decl (tree type)
tree name;
tree d;
- if (COMPLETE_TYPE_P (type)
+ if (COMPLETE_TYPE_P (type)
&& TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
{
error ("cannot create type information for type %qT because "
- "its size is variable",
+ "its size is variable",
type);
return error_mark_node;
}
@@ -337,15 +363,16 @@ get_tinfo_decl (tree type)
if (d)
return d;
}
-
+
name = mangle_typeinfo_for_type (type);
d = IDENTIFIER_GLOBAL_VALUE (name);
if (!d)
{
- tree var_desc = get_pseudo_ti_desc (type);
+ tinfo_s *ti = VEC_index (tinfo_s, tinfo_descs,
+ get_pseudo_ti_index (type));
- d = build_lang_decl (VAR_DECL, name, TINFO_PSEUDO_TYPE (var_desc));
+ d = build_lang_decl (VAR_DECL, name, ti->type);
SET_DECL_ASSEMBLER_NAME (d, name);
/* Remember the type it is for. */
TREE_TYPE (name) = type;
@@ -379,7 +406,7 @@ get_tinfo_ptr (tree type)
tree decl = get_tinfo_decl (type);
mark_used (decl);
- return build_nop (type_info_ptr_type,
+ return build_nop (type_info_ptr_type,
build_address (decl));
}
@@ -390,7 +417,7 @@ get_typeid (tree type)
{
if (type == error_mark_node || !typeid_ok_p ())
return error_mark_node;
-
+
if (processing_template_decl)
return build_min (TYPEID_EXPR, const_type_info_type_node, type);
@@ -405,7 +432,7 @@ get_typeid (tree type)
if (!VOID_TYPE_P (type))
type = complete_type_or_else (type, NULL_TREE);
-
+
if (!type)
return error_mark_node;
@@ -419,8 +446,8 @@ static tree
ifnonnull (tree test, tree result)
{
return build3 (COND_EXPR, TREE_TYPE (result),
- build2 (EQ_EXPR, boolean_type_node, test,
- cp_convert (TREE_TYPE (test), integer_zero_node)),
+ build2 (EQ_EXPR, boolean_type_node, test,
+ cp_convert (TREE_TYPE (test), integer_zero_node)),
cp_convert (TREE_TYPE (result), integer_zero_node),
result);
}
@@ -504,7 +531,7 @@ build_dynamic_cast_1 (tree type, tree expr)
errstr = "source is of incomplete class type";
goto fail;
}
-
+
}
/* The dynamic_cast operator shall not cast away constness. */
@@ -557,21 +584,21 @@ build_dynamic_cast_1 (tree type, tree expr)
else
{
tree retval;
- tree result, td2, td3, elems;
- tree static_type, target_type, boff;
+ tree result, td2, td3, elems;
+ tree static_type, target_type, boff;
- /* If we got here, we can't convert statically. Therefore,
+ /* If we got here, we can't convert statically. Therefore,
dynamic_cast<D&>(b) (b an object) cannot succeed. */
if (tc == REFERENCE_TYPE)
{
if (TREE_CODE (old_expr) == VAR_DECL
&& TREE_CODE (TREE_TYPE (old_expr)) == RECORD_TYPE)
{
- tree expr = throw_bad_cast ();
+ tree expr = throw_bad_cast ();
warning (0, "dynamic_cast of %q#D to %q#T can never succeed",
- old_expr, type);
- /* Bash it to the expected type. */
- TREE_TYPE (expr) = type;
+ old_expr, type);
+ /* Bash it to the expected type. */
+ TREE_TYPE (expr) = type;
return expr;
}
}
@@ -583,8 +610,8 @@ build_dynamic_cast_1 (tree type, tree expr)
&& TREE_CODE (TREE_TYPE (op)) == RECORD_TYPE)
{
warning (0, "dynamic_cast of %q#D to %q#T can never succeed",
- op, type);
- retval = build_int_cst (type, 0);
+ op, type);
+ retval = build_int_cst (type, 0);
return retval;
}
}
@@ -598,9 +625,9 @@ build_dynamic_cast_1 (tree type, tree expr)
mark_used (td3);
td3 = build_unary_op (ADDR_EXPR, td3, 0);
- /* Determine how T and V are related. */
- boff = dcast_base_hint (static_type, target_type);
-
+ /* Determine how T and V are related. */
+ boff = dcast_base_hint (static_type, target_type);
+
/* Since expr is used twice below, save it. */
expr = save_expr (expr);
@@ -621,12 +648,12 @@ build_dynamic_cast_1 (tree type, tree expr)
tree tinfo_ptr;
tree ns = abi_node;
const char *name;
-
+
push_nested_namespace (ns);
tinfo_ptr = xref_tag (class_type,
get_identifier ("__class_type_info"),
/*tag_scope=*/ts_current, false);
-
+
tinfo_ptr = build_pointer_type
(build_qualified_type
(tinfo_ptr, TYPE_QUAL_CONST));
@@ -639,22 +666,22 @@ build_dynamic_cast_1 (tree type, tree expr)
tmp = build_function_type (ptr_type_node, tmp);
dcast_fn = build_library_fn_ptr (name, tmp);
DECL_IS_PURE (dcast_fn) = 1;
- pop_nested_namespace (ns);
- dynamic_cast_node = dcast_fn;
+ pop_nested_namespace (ns);
+ dynamic_cast_node = dcast_fn;
}
- result = build_cxx_call (dcast_fn, elems);
+ result = build_cxx_call (dcast_fn, elems);
if (tc == REFERENCE_TYPE)
{
tree bad = throw_bad_cast ();
-
+
result = save_expr (result);
return build3 (COND_EXPR, type, result, result, bad);
}
/* Now back to the type we want from a void*. */
result = cp_convert (type, result);
- return ifnonnull (expr, result);
+ return ifnonnull (expr, result);
}
}
else
@@ -662,7 +689,7 @@ build_dynamic_cast_1 (tree type, tree expr)
fail:
error ("cannot dynamic_cast %qE (of type %q#T) to type %q#T (%s)",
- expr, exprtype, type, errstr);
+ expr, exprtype, type, errstr);
return error_mark_node;
}
@@ -671,12 +698,12 @@ build_dynamic_cast (tree type, tree expr)
{
if (type == error_mark_node || expr == error_mark_node)
return error_mark_node;
-
+
if (processing_template_decl)
{
expr = build_min (DYNAMIC_CAST_EXPR, type, expr);
TREE_SIDE_EFFECTS (expr) = 1;
-
+
return expr;
}
@@ -690,7 +717,7 @@ qualifier_flags (tree type)
{
int flags = 0;
int quals = cp_type_quals (type);
-
+
if (quals & TYPE_QUAL_CONST)
flags |= 1;
if (quals & TYPE_QUAL_VOLATILE)
@@ -733,7 +760,7 @@ involves_incomplete_p (tree type)
case OFFSET_TYPE:
ptrmem:
- return
+ return
(target_incomplete_p (TYPE_PTRMEM_POINTED_TO_TYPE (type))
|| !COMPLETE_TYPE_P (TYPE_PTRMEM_CLASS_TYPE (type)));
@@ -758,19 +785,19 @@ involves_incomplete_p (tree type)
as comdat, because of pointers to incomplete.) */
static tree
-tinfo_base_init (tree desc, tree target)
+tinfo_base_init (tinfo_s *ti, tree target)
{
tree init = NULL_TREE;
tree name_decl;
tree vtable_ptr;
-
+
{
tree name_name;
-
+
/* Generate the NTBS array variable. */
tree name_type = build_cplus_array_type
- (build_qualified_type (char_type_node, TYPE_QUAL_CONST),
- NULL_TREE);
+ (build_qualified_type (char_type_node, TYPE_QUAL_CONST),
+ NULL_TREE);
tree name_string = tinfo_name (target);
/* Determine the name of the variable -- and remember with which
@@ -799,19 +826,18 @@ tinfo_base_init (tree desc, tree target)
pushdecl_top_level_and_finish (name_decl, name_string);
}
- vtable_ptr = TINFO_VTABLE_DECL (desc);
+ vtable_ptr = ti->vtable;
if (!vtable_ptr)
{
tree real_type;
-
push_nested_namespace (abi_node);
- real_type = xref_tag (class_type, TINFO_REAL_NAME (desc),
+ real_type = xref_tag (class_type, ti->name,
/*tag_scope=*/ts_current, false);
pop_nested_namespace (abi_node);
-
+
if (!COMPLETE_TYPE_P (real_type))
{
- /* We never saw a definition of this type, so we need to
+ /* We never saw a definition of this type, so we need to
tell the compiler that this is an exported class, as
indeed all of the __*_type_info classes are. */
SET_CLASSTYPE_INTERFACE_KNOWN (real_type);
@@ -827,31 +853,31 @@ tinfo_base_init (tree desc, tree target)
size_binop (MULT_EXPR,
size_int (2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE),
TYPE_SIZE_UNIT (vtable_entry_type)));
-
- TINFO_VTABLE_DECL (desc) = vtable_ptr;
+
+ ti->vtable = vtable_ptr;
}
init = tree_cons (NULL_TREE, vtable_ptr, init);
-
+
init = tree_cons (NULL_TREE, decay_conversion (name_decl), init);
-
+
init = build_constructor (NULL_TREE, nreverse (init));
TREE_CONSTANT (init) = 1;
TREE_INVARIANT (init) = 1;
TREE_STATIC (init) = 1;
init = tree_cons (NULL_TREE, init, NULL_TREE);
-
+
return init;
}
-/* Return the CONSTRUCTOR expr for a type_info of TYPE. DESC provides the
+/* Return the CONSTRUCTOR expr for a type_info of TYPE. TI provides the
information about the particular type_info derivation, which adds no
additional fields to the type_info base. */
static tree
-generic_initializer (tree desc, tree target)
+generic_initializer (tinfo_s *ti, tree target)
{
- tree init = tinfo_base_init (desc, target);
+ tree init = tinfo_base_init (ti, target);
init = build_constructor (NULL_TREE, init);
TREE_CONSTANT (init) = 1;
@@ -861,24 +887,24 @@ generic_initializer (tree desc, tree target)
}
/* Return the CONSTRUCTOR expr for a type_info of pointer TYPE.
- DESC provides information about the particular type_info derivation,
+ TI provides information about the particular type_info derivation,
which adds target type and qualifier flags members to the type_info base. */
static tree
-ptr_initializer (tree desc, tree target)
+ptr_initializer (tinfo_s *ti, tree target)
{
- tree init = tinfo_base_init (desc, target);
+ tree init = tinfo_base_init (ti, target);
tree to = TREE_TYPE (target);
int flags = qualifier_flags (to);
bool incomplete = target_incomplete_p (to);
-
+
if (incomplete)
flags |= 8;
init = tree_cons (NULL_TREE, build_int_cst (NULL_TREE, flags), init);
init = tree_cons (NULL_TREE,
- get_tinfo_ptr (TYPE_MAIN_VARIANT (to)),
- init);
-
+ get_tinfo_ptr (TYPE_MAIN_VARIANT (to)),
+ init);
+
init = build_constructor (NULL_TREE, nreverse (init));
TREE_CONSTANT (init) = 1;
TREE_INVARIANT (init) = 1;
@@ -887,19 +913,19 @@ ptr_initializer (tree desc, tree target)
}
/* Return the CONSTRUCTOR expr for a type_info of pointer to member data TYPE.
- DESC provides information about the particular type_info derivation,
+ TI provides information about the particular type_info derivation,
which adds class, target type and qualifier flags members to the type_info
base. */
static tree
-ptm_initializer (tree desc, tree target)
+ptm_initializer (tinfo_s *ti, tree target)
{
- tree init = tinfo_base_init (desc, target);
+ tree init = tinfo_base_init (ti, target);
tree to = TYPE_PTRMEM_POINTED_TO_TYPE (target);
tree klass = TYPE_PTRMEM_CLASS_TYPE (target);
int flags = qualifier_flags (to);
bool incomplete = target_incomplete_p (to);
-
+
if (incomplete)
flags |= 0x8;
if (!COMPLETE_TYPE_P (klass))
@@ -907,33 +933,33 @@ ptm_initializer (tree desc, tree target)
init = tree_cons (NULL_TREE, build_int_cst (NULL_TREE, flags), init);
init = tree_cons (NULL_TREE,
get_tinfo_ptr (TYPE_MAIN_VARIANT (to)),
- init);
+ init);
init = tree_cons (NULL_TREE,
get_tinfo_ptr (klass),
- init);
-
+ init);
+
init = build_constructor (NULL_TREE, nreverse (init));
TREE_CONSTANT (init) = 1;
TREE_INVARIANT (init) = 1;
TREE_STATIC (init) = 1;
- return init;
+ return init;
}
/* Return the CONSTRUCTOR expr for a type_info of class TYPE.
- DESC provides information about the particular __class_type_info derivation,
+ TI provides information about the particular __class_type_info derivation,
which adds hint flags and TRAIL initializers to the type_info base. */
static tree
-class_initializer (tree desc, tree target, tree trail)
+class_initializer (tinfo_s *ti, tree target, tree trail)
{
- tree init = tinfo_base_init (desc, target);
-
+ tree init = tinfo_base_init (ti, target);
+
TREE_CHAIN (init) = trail;
init = build_constructor (NULL_TREE, init);
TREE_CONSTANT (init) = 1;
TREE_INVARIANT (init) = 1;
TREE_STATIC (init) = 1;
- return init;
+ return init;
}
/* Returns true if the typeinfo for type should be placed in
@@ -957,107 +983,104 @@ typeinfo_in_lib_p (tree type)
case REAL_TYPE:
case VOID_TYPE:
return true;
-
+
default:
return false;
}
}
-/* Generate the initializer for the type info describing TYPE. */
+/* Generate the initializer for the type info describing TYPE. TK_INDEX is
+ the index of the descriptor in the tinfo_desc vector. */
static tree
-get_pseudo_ti_init (tree type, tree var_desc)
+get_pseudo_ti_init (tree type, unsigned tk_index)
{
+ tinfo_s *ti = VEC_index (tinfo_s, tinfo_descs, tk_index);
+
gcc_assert (at_eof);
- switch (TREE_CODE (type))
+ switch (tk_index)
{
- case OFFSET_TYPE:
- return ptm_initializer (var_desc, type);
- case POINTER_TYPE:
- return ptr_initializer (var_desc, type);
- case ENUMERAL_TYPE:
- return generic_initializer (var_desc, type);
- break;
- case FUNCTION_TYPE:
- return generic_initializer (var_desc, type);
- break;
- case ARRAY_TYPE:
- return generic_initializer (var_desc, type);
- break;
- case UNION_TYPE:
- case RECORD_TYPE:
- if (TYPE_PTRMEMFUNC_P (type))
- return ptm_initializer (var_desc, type);
- else if (var_desc == class_desc_type_node)
- return class_initializer (var_desc, type, NULL_TREE);
- else if (var_desc == si_class_desc_type_node)
- {
- tree base_binfo = BINFO_BASE_BINFO (TYPE_BINFO (type), 0);
- tree tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
- tree base_inits = tree_cons (NULL_TREE, tinfo, NULL_TREE);
-
- return class_initializer (var_desc, type, base_inits);
- }
- else
- {
- int hint = ((CLASSTYPE_REPEATED_BASE_P (type) << 0)
- | (CLASSTYPE_DIAMOND_SHAPED_P (type) << 1));
- tree binfo = TYPE_BINFO (type);
- int nbases = BINFO_N_BASE_BINFOS (binfo);
- VEC(tree,gc) *base_accesses = BINFO_BASE_ACCESSES (binfo);
- tree base_inits = NULL_TREE;
- int ix;
-
- /* Generate the base information initializer. */
- for (ix = nbases; ix--;)
- {
- tree base_binfo = BINFO_BASE_BINFO (binfo, ix);
- tree base_init = NULL_TREE;
- int flags = 0;
- tree tinfo;
- tree offset;
-
- if (VEC_index (tree, base_accesses, ix) == access_public_node)
- flags |= 2;
- tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
- if (BINFO_VIRTUAL_P (base_binfo))
- {
- /* We store the vtable offset at which the virtual
- base offset can be found. */
- offset = BINFO_VPTR_FIELD (base_binfo);
- offset = convert (sizetype, offset);
- flags |= 1;
- }
- else
- offset = BINFO_OFFSET (base_binfo);
-
- /* Combine offset and flags into one field. */
- offset = cp_build_binary_op (LSHIFT_EXPR, offset,
- build_int_cst (NULL_TREE, 8));
- offset = cp_build_binary_op (BIT_IOR_EXPR, offset,
- build_int_cst (NULL_TREE, flags));
- base_init = tree_cons (NULL_TREE, offset, base_init);
- base_init = tree_cons (NULL_TREE, tinfo, base_init);
- base_init = build_constructor (NULL_TREE, base_init);
- base_inits = tree_cons (NULL_TREE, base_init, base_inits);
- }
- base_inits = build_constructor (NULL_TREE, base_inits);
- base_inits = tree_cons (NULL_TREE, base_inits, NULL_TREE);
- /* Prepend the number of bases. */
- base_inits = tree_cons (NULL_TREE,
- build_int_cst (NULL_TREE, nbases),
- base_inits);
- /* Prepend the hint flags. */
- base_inits = tree_cons (NULL_TREE,
- build_int_cst (NULL_TREE, hint),
- base_inits);
-
- return class_initializer (var_desc, type, base_inits);
- }
- break;
+ case TK_POINTER_MEMBER_TYPE:
+ return ptm_initializer (ti, type);
+
+ case TK_POINTER_TYPE:
+ return ptr_initializer (ti, type);
+
+ case TK_BUILTIN_TYPE:
+ case TK_ENUMERAL_TYPE:
+ case TK_FUNCTION_TYPE:
+ case TK_ARRAY_TYPE:
+ return generic_initializer (ti, type);
+
+ case TK_CLASS_TYPE:
+ return class_initializer (ti, type, NULL_TREE);
+
+ case TK_SI_CLASS_TYPE:
+ {
+ tree base_binfo = BINFO_BASE_BINFO (TYPE_BINFO (type), 0);
+ tree tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
+ tree base_inits = tree_cons (NULL_TREE, tinfo, NULL_TREE);
+
+ return class_initializer (ti, type, base_inits);
+ }
default:
- return generic_initializer (var_desc, type);
+ {
+ int hint = ((CLASSTYPE_REPEATED_BASE_P (type) << 0)
+ | (CLASSTYPE_DIAMOND_SHAPED_P (type) << 1));
+ tree binfo = TYPE_BINFO (type);
+ int nbases = BINFO_N_BASE_BINFOS (binfo);
+ VEC(tree,gc) *base_accesses = BINFO_BASE_ACCESSES (binfo);
+ tree base_inits = NULL_TREE;
+ int ix;
+
+ gcc_assert (tk_index >= TK_FIXED);
+
+ /* Generate the base information initializer. */
+ for (ix = nbases; ix--;)
+ {
+ tree base_binfo = BINFO_BASE_BINFO (binfo, ix);
+ tree base_init = NULL_TREE;
+ int flags = 0;
+ tree tinfo;
+ tree offset;
+
+ if (VEC_index (tree, base_accesses, ix) == access_public_node)
+ flags |= 2;
+ tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
+ if (BINFO_VIRTUAL_P (base_binfo))
+ {
+ /* We store the vtable offset at which the virtual
+ base offset can be found. */
+ offset = BINFO_VPTR_FIELD (base_binfo);
+ offset = convert (sizetype, offset);
+ flags |= 1;
+ }
+ else
+ offset = BINFO_OFFSET (base_binfo);
+
+ /* Combine offset and flags into one field. */
+ offset = cp_build_binary_op (LSHIFT_EXPR, offset,
+ build_int_cst (NULL_TREE, 8));
+ offset = cp_build_binary_op (BIT_IOR_EXPR, offset,
+ build_int_cst (NULL_TREE, flags));
+ base_init = tree_cons (NULL_TREE, offset, base_init);
+ base_init = tree_cons (NULL_TREE, tinfo, base_init);
+ base_init = build_constructor (NULL_TREE, base_init);
+ base_inits = tree_cons (NULL_TREE, base_init, base_inits);
+ }
+ base_inits = build_constructor (NULL_TREE, base_inits);
+ base_inits = tree_cons (NULL_TREE, base_inits, NULL_TREE);
+ /* Prepend the number of bases. */
+ base_inits = tree_cons (NULL_TREE,
+ build_int_cst (NULL_TREE, nbases),
+ base_inits);
+ /* Prepend the hint flags. */
+ base_inits = tree_cons (NULL_TREE,
+ build_int_cst (NULL_TREE, hint),
+ base_inits);
+ return class_initializer (ti, type, base_inits);
+ }
}
}
@@ -1071,117 +1094,140 @@ get_pseudo_ti_init (tree type, tree var_desc)
vtable. We have to delay generating the VAR_DECL of the vtable
until the end of the translation, when we'll have seen the library
definition, if there was one.
-
+
REAL_NAME is the runtime's name of the type. Trailing arguments are
additional FIELD_DECL's for the structure. The final argument must be
NULL. */
-static tree
-create_pseudo_type_info (const char *real_name, int ident, ...)
+static void
+create_pseudo_type_info (tinfo_kind tk, const char *real_name, ...)
{
+ tinfo_s *ti;
tree pseudo_type;
char *pseudo_name;
tree fields;
tree field_decl;
- tree result;
va_list ap;
- va_start (ap, ident);
+ va_start (ap, real_name);
/* Generate the pseudo type name. */
pseudo_name = alloca (strlen (real_name) + 30);
strcpy (pseudo_name, real_name);
strcat (pseudo_name, "_pseudo");
- if (ident)
- sprintf (pseudo_name + strlen (pseudo_name), "%d", ident);
-
+ if (tk >= TK_FIXED)
+ sprintf (pseudo_name + strlen (pseudo_name), "%d", tk - TK_FIXED);
+
/* First field is the pseudo type_info base class. */
- fields = build_decl (FIELD_DECL, NULL_TREE, ti_desc_type_node);
-
+ fields = build_decl (FIELD_DECL, NULL_TREE,
+ VEC_index (tinfo_s, tinfo_descs,
+ TK_TYPE_INFO_TYPE)->type);
+
/* Now add the derived fields. */
while ((field_decl = va_arg (ap, tree)))
{
TREE_CHAIN (field_decl) = fields;
fields = field_decl;
}
-
+
/* Create the pseudo type. */
pseudo_type = make_aggr_type (RECORD_TYPE);
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);
- TINFO_PSEUDO_TYPE (result) =
- cp_build_qualified_type (pseudo_type, TYPE_QUAL_CONST);
-
+ ti = VEC_index (tinfo_s, tinfo_descs, tk);
+ ti->type = cp_build_qualified_type (pseudo_type, TYPE_QUAL_CONST);
+ ti->name = get_identifier (real_name);
+ ti->vtable = NULL_TREE;
+
va_end (ap);
- return result;
}
-/* Return a pseudo type info type node used to describe TYPE. TYPE
- must be a complete type (or cv void), except at the end of the
- translation unit. */
+/* Return the index of a pseudo type info type node used to describe
+ TYPE. TYPE must be a complete type (or cv void), except at the end
+ of the translation unit. */
-static tree
-get_pseudo_ti_desc (tree type)
+static unsigned
+get_pseudo_ti_index (tree type)
{
+ unsigned ix;
+
switch (TREE_CODE (type))
{
case OFFSET_TYPE:
- return ptm_desc_type_node;
+ ix = TK_POINTER_MEMBER_TYPE;
+ break;
+
case POINTER_TYPE:
- return ptr_desc_type_node;
+ ix = TK_POINTER_TYPE;
+ break;
+
case ENUMERAL_TYPE:
- return enum_desc_type_node;
+ ix = TK_ENUMERAL_TYPE;
+ break;
+
case FUNCTION_TYPE:
- return func_desc_type_node;
+ ix = TK_FUNCTION_TYPE;
+ break;
+
case ARRAY_TYPE:
- return ary_desc_type_node;
+ ix = TK_ARRAY_TYPE;
+ break;
+
case UNION_TYPE:
case RECORD_TYPE:
if (TYPE_PTRMEMFUNC_P (type))
- return ptm_desc_type_node;
+ {
+ ix = TK_POINTER_MEMBER_TYPE;
+ break;
+ }
else if (!COMPLETE_TYPE_P (type))
{
if (!at_eof)
cxx_incomplete_type_error (NULL_TREE, type);
- return class_desc_type_node;
+ ix = TK_CLASS_TYPE;
+ break;
}
else if (!BINFO_N_BASE_BINFOS (TYPE_BINFO (type)))
- return class_desc_type_node;
+ {
+ ix = TK_CLASS_TYPE;
+ break;
+ }
else
{
tree binfo = TYPE_BINFO (type);
VEC(tree,gc) *base_accesses = BINFO_BASE_ACCESSES (binfo);
tree base_binfo = BINFO_BASE_BINFO (binfo, 0);
int num_bases = BINFO_N_BASE_BINFOS (binfo);
-
+
if (num_bases == 1
&& VEC_index (tree, base_accesses, 0) == access_public_node
&& !BINFO_VIRTUAL_P (base_binfo)
&& integer_zerop (BINFO_OFFSET (base_binfo)))
- /* single non-virtual public. */
- return si_class_desc_type_node;
+ {
+ /* single non-virtual public. */
+ ix = TK_SI_CLASS_TYPE;
+ break;
+ }
else
{
- tree var_desc;
+ tinfo_s *ti;
tree array_domain, base_array;
-
- if (TREE_VEC_LENGTH (vmi_class_desc_type_node) <= num_bases)
+
+ ix = TK_FIXED + num_bases;
+ if (VEC_length (tinfo_s, tinfo_descs) <= ix)
{
- int ix;
- tree extend = make_tree_vec (num_bases + 5);
+ /* too short, extend. */
+ unsigned len = VEC_length (tinfo_s, tinfo_descs);
- for (ix = TREE_VEC_LENGTH (vmi_class_desc_type_node); ix--;)
- TREE_VEC_ELT (extend, ix)
- = TREE_VEC_ELT (vmi_class_desc_type_node, ix);
- vmi_class_desc_type_node = extend;
+ VEC_safe_grow (tinfo_s, gc, tinfo_descs, ix + 1);
+ while (VEC_iterate (tinfo_s, tinfo_descs, len++, ti))
+ ti->type = ti->vtable = ti->name = NULL_TREE;
}
- var_desc = TREE_VEC_ELT (vmi_class_desc_type_node, num_bases);
- if (var_desc)
- return var_desc;
-
+ else if (VEC_index (tinfo_s, tinfo_descs, ix)->type)
+ /* already created. */
+ break;
+
/* Create the array of __base_class_type_info entries.
G++ 3.2 allocated an array that had one too many
entries, and then filled that extra entries with
@@ -1191,24 +1237,26 @@ get_pseudo_ti_desc (tree type)
else
array_domain = build_index_type (size_int (num_bases));
base_array =
- build_array_type (base_desc_type_node, array_domain);
+ build_array_type (VEC_index (tinfo_s, tinfo_descs,
+ TK_BASE_TYPE)->type,
+ array_domain);
push_nested_namespace (abi_node);
- var_desc = create_pseudo_type_info
- ("__vmi_class_type_info", num_bases,
+ create_pseudo_type_info
+ (ix, "__vmi_class_type_info",
build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
build_decl (FIELD_DECL, NULL_TREE, base_array),
NULL);
pop_nested_namespace (abi_node);
-
- TREE_VEC_ELT (vmi_class_desc_type_node, num_bases) = var_desc;
- return var_desc;
+ break;
}
}
default:
- return bltn_desc_type_node;
+ ix = TK_BUILTIN_TYPE;
+ break;
}
+ return ix;
}
/* Make sure the required builtin types exist for generating the type_info
@@ -1217,82 +1265,78 @@ get_pseudo_ti_desc (tree type)
static void
create_tinfo_types (void)
{
- gcc_assert (!ti_desc_type_node);
+ tinfo_s *ti;
+
+ gcc_assert (!tinfo_descs);
- push_nested_namespace (abi_node);
+ VEC_safe_grow (tinfo_s, gc, tinfo_descs, TK_FIXED);
+ push_nested_namespace (abi_node);
+
/* Create the internal type_info structure. This is used as a base for
the other structures. */
{
tree field, fields;
- ti_desc_type_node = make_aggr_type (RECORD_TYPE);
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",
+
+ ti = VEC_index (tinfo_s, tinfo_descs, TK_TYPE_INFO_TYPE);
+ ti->type = make_aggr_type (RECORD_TYPE);
+ ti->vtable = NULL_TREE;
+ ti->name = NULL_TREE;
+ finish_builtin_struct (ti->type, "__type_info_pseudo",
fields, NULL_TREE);
- TYPE_HAS_CONSTRUCTOR (ti_desc_type_node) = 1;
+ TYPE_HAS_CONSTRUCTOR (ti->type) = 1;
}
-
+
/* Fundamental type_info */
- bltn_desc_type_node = create_pseudo_type_info
- ("__fundamental_type_info", 0,
- NULL);
+ create_pseudo_type_info (TK_BUILTIN_TYPE, "__fundamental_type_info", NULL);
/* Array, function and enum type_info. No additional fields. */
- ary_desc_type_node = create_pseudo_type_info
- ("__array_type_info", 0,
- NULL);
- func_desc_type_node = create_pseudo_type_info
- ("__function_type_info", 0,
- NULL);
- enum_desc_type_node = create_pseudo_type_info
- ("__enum_type_info", 0,
- NULL);
+ create_pseudo_type_info (TK_ARRAY_TYPE, "__array_type_info", NULL);
+ create_pseudo_type_info (TK_FUNCTION_TYPE, "__function_type_info", NULL);
+ create_pseudo_type_info (TK_ENUMERAL_TYPE, "__enum_type_info", NULL);
- /* Class type_info. Add a flags field. */
- class_desc_type_node = create_pseudo_type_info
- ("__class_type_info", 0,
- NULL);
+ /* Class type_info. No additional fields. */
+ create_pseudo_type_info (TK_CLASS_TYPE, "__class_type_info", NULL);
/* Single public non-virtual base class. Add pointer to base class.
This is really a descendant of __class_type_info. */
- si_class_desc_type_node = create_pseudo_type_info
- ("__si_class_type_info", 0,
+ create_pseudo_type_info (TK_SI_CLASS_TYPE, "__si_class_type_info",
build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type),
NULL);
-
+
/* Base class internal helper. Pointer to base type, offset to base,
flags. */
{
tree field, fields;
-
+
field = build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type);
fields = field;
-
+
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_struct (base_desc_type_node, "__base_class_type_info_pseudo",
+ ti = VEC_index (tinfo_s, tinfo_descs, TK_BASE_TYPE);
+
+ ti->type = make_aggr_type (RECORD_TYPE);
+ ti->vtable = NULL_TREE;
+ ti->name = NULL_TREE;
+ finish_builtin_struct (ti->type, "__base_class_type_info_pseudo",
fields, NULL_TREE);
- TYPE_HAS_CONSTRUCTOR (base_desc_type_node) = 1;
+ TYPE_HAS_CONSTRUCTOR (ti->type) = 1;
}
-
- /* 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. */
- ptr_desc_type_node = create_pseudo_type_info
- ("__pointer_type_info", 0,
+ create_pseudo_type_info (TK_POINTER_TYPE, "__pointer_type_info",
build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type),
NULL);
@@ -1300,8 +1344,8 @@ create_tinfo_types (void)
/* Pointer to member data type_info. Add qualifications flags,
pointer to the member's type info and pointer to the class.
This is really a descendant of __pbase_type_info. */
- ptm_desc_type_node = create_pseudo_type_info
- ("__pointer_to_member_type_info", 0,
+ create_pseudo_type_info (TK_POINTER_MEMBER_TYPE,
+ "__pointer_to_member_type_info",
build_decl (FIELD_DECL, NULL_TREE, integer_type_node),
build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type),
build_decl (FIELD_DECL, NULL_TREE, type_info_ptr_type),
@@ -1334,10 +1378,10 @@ emit_support_tinfos (void)
};
int ix;
tree bltn_type, dtor;
-
+
push_nested_namespace (abi_node);
bltn_type = xref_tag (class_type,
- get_identifier ("__fundamental_type_info"),
+ get_identifier ("__fundamental_type_info"),
/*tag_scope=*/ts_current, false);
pop_nested_namespace (abi_node);
if (!COMPLETE_TYPE_P (bltn_type))
@@ -1354,9 +1398,9 @@ emit_support_tinfos (void)
types[0] = bltn;
types[1] = build_pointer_type (bltn);
- types[2] = build_pointer_type (build_qualified_type (bltn,
+ types[2] = build_pointer_type (build_qualified_type (bltn,
TYPE_QUAL_CONST));
-
+
for (i = 0; i < 3; ++i)
{
tree tinfo;
@@ -1365,7 +1409,7 @@ emit_support_tinfos (void)
TREE_USED (tinfo) = 1;
mark_needed (tinfo);
/* The C++ ABI requires that these objects be COMDAT. But,
- On systems without weak symbols, initialized COMDAT
+ On systems without weak symbols, initialized COMDAT
objects are emitted with internal linkage. (See
comdat_linkage for details.) Since we want these objects
to have external linkage so that copies do not have to be
@@ -1389,10 +1433,9 @@ emit_tinfo_decl (tree decl)
{
tree type = TREE_TYPE (DECL_NAME (decl));
int in_library = typeinfo_in_lib_p (type);
- tree var_desc, var_init;
- gcc_assert (DECL_TINFO_P (decl));
-
+ gcc_assert (DECL_TINFO_P (decl));
+
if (in_library)
{
if (doing_runtime)
@@ -1422,14 +1465,17 @@ emit_tinfo_decl (tree decl)
import_export_decl (decl);
if (DECL_NOT_REALLY_EXTERN (decl) && decl_needed_p (decl))
{
+ tree init;
+
DECL_EXTERNAL (decl) = 0;
- var_desc = get_pseudo_ti_desc (type);
- var_init = get_pseudo_ti_init (type, var_desc);
- DECL_INITIAL (decl) = var_init;
+ init = get_pseudo_ti_init (type, get_pseudo_ti_index (type));
+ DECL_INITIAL (decl) = init;
mark_used (decl);
- cp_finish_decl (decl, var_init, NULL_TREE, 0);
+ cp_finish_decl (decl, init, NULL_TREE, 0);
return true;
}
else
return false;
}
+
+#include "gt-cp-rtti.h"
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index 45668a14a94..a0758c369ba 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -82,13 +82,13 @@ static int n_contexts_saved;
struct lookup_base_data_s
{
tree t; /* type being searched. */
- tree base; /* The base type we're looking for. */
- tree binfo; /* Found binfo. */
- bool via_virtual; /* Found via a virtual path. */
+ tree base; /* The base type we're looking for. */
+ tree binfo; /* Found binfo. */
+ bool via_virtual; /* Found via a virtual path. */
bool ambiguous; /* Found multiply ambiguous */
- bool repeated_base; /* Whether there are repeated bases in the
+ bool repeated_base; /* Whether there are repeated bases in the
hierarchy. */
- bool want_any; /* Whether we want any matching binfo. */
+ bool want_any; /* Whether we want any matching binfo. */
};
/* Worker function for lookup_base. See if we've found the desired
@@ -106,22 +106,22 @@ dfs_lookup_base (tree binfo, void *data_)
data->binfo = binfo;
data->via_virtual
= binfo_via_virtual (data->binfo, data->t) != NULL_TREE;
-
+
if (!data->repeated_base)
/* If there are no repeated bases, we can stop now. */
return binfo;
-
+
if (data->want_any && !data->via_virtual)
/* If this is a non-virtual base, then we can't do
better. */
return binfo;
-
+
return dfs_skip_bases;
}
else
{
gcc_assert (binfo != data->binfo);
-
+
/* We've found more than one matching binfo. */
if (!data->want_any)
{
@@ -144,7 +144,7 @@ dfs_lookup_base (tree binfo, void *data_)
return dfs_skip_bases;
}
}
-
+
return NULL_TREE;
}
@@ -161,7 +161,7 @@ accessible_base_p (tree t, tree base, bool consider_local_p)
/* [class.access.base]
A base class is said to be accessible if an invented public
- member of the base class is accessible.
+ member of the base class is accessible.
If BASE is a non-proper base, this condition is trivially
true. */
@@ -193,7 +193,7 @@ lookup_base (tree t, tree base, base_access access, base_kind *kind_ptr)
tree binfo;
tree t_binfo;
base_kind bk;
-
+
if (t == error_mark_node || base == error_mark_node)
{
if (kind_ptr)
@@ -201,7 +201,7 @@ lookup_base (tree t, tree base, base_access access, base_kind *kind_ptr)
return error_mark_node;
}
gcc_assert (TYPE_P (base));
-
+
if (!TYPE_P (t))
{
t_binfo = t;
@@ -212,7 +212,7 @@ lookup_base (tree t, tree base, base_access access, base_kind *kind_ptr)
t = complete_type (TYPE_MAIN_VARIANT (t));
t_binfo = TYPE_BINFO (t);
}
-
+
base = complete_type (TYPE_MAIN_VARIANT (base));
if (t_binfo)
@@ -228,7 +228,7 @@ lookup_base (tree t, tree base, base_access access, base_kind *kind_ptr)
dfs_walk_once (t_binfo, dfs_lookup_base, NULL, &data);
binfo = data.binfo;
-
+
if (!binfo)
bk = data.ambiguous ? bk_ambig : bk_not_base;
else if (binfo == t_binfo)
@@ -284,7 +284,7 @@ lookup_base (tree t, tree base, base_access access, base_kind *kind_ptr)
if (kind_ptr)
*kind_ptr = bk;
-
+
return binfo;
}
@@ -310,7 +310,7 @@ dfs_dcast_hint_pre (tree binfo, void *data_)
if (BINFO_VIRTUAL_P (binfo))
data->virt_depth++;
-
+
if (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), data->subtype))
{
if (data->virt_depth)
@@ -362,7 +362,7 @@ dcast_base_hint (tree subtype, tree target)
data.virt_depth = 0;
data.offset = NULL_TREE;
data.repeated_base = CLASSTYPE_REPEATED_BASE_P (target);
-
+
dfs_walk_once_accessible (TYPE_BINFO (target), /*friends=*/false,
dfs_dcast_hint_pre, dfs_dcast_hint_post, &data);
return data.offset ? data.offset : ssize_int (-2);
@@ -386,7 +386,7 @@ lookup_field_1 (tree type, tree name, bool want_type)
if (TREE_CODE (type) == TEMPLATE_TYPE_PARM
|| TREE_CODE (type) == BOUND_TEMPLATE_TEMPLATE_PARM
|| TREE_CODE (type) == TYPENAME_TYPE)
- /* The TYPE_FIELDS of a TEMPLATE_TYPE_PARM and
+ /* The TYPE_FIELDS of a TEMPLATE_TYPE_PARM and
BOUND_TEMPLATE_TEMPLATE_PARM are not fields at all;
instead TYPE_FIELDS is the TEMPLATE_PARM_INDEX. (Miraculously,
the code often worked even when we treated the index as a list
@@ -471,14 +471,13 @@ lookup_field_1 (tree type, tree name, bool want_type)
defined, USING_DECLs are purged from TYPE_FIELDS; see
handle_using_decl. However, we make special efforts to
make using-declarations in class templates and class
- template partial specializations work correctly noticing
- that dependent USING_DECL's do not have TREE_TYPE set. */
- if (TREE_TYPE (field))
+ template partial specializations work correctly. */
+ if (!DECL_DEPENDENT_P (field))
continue;
}
if (DECL_NAME (field) == name
- && (!want_type
+ && (!want_type
|| TREE_CODE (field) == TYPE_DECL
|| DECL_CLASS_TEMPLATE_P (field)))
return field;
@@ -494,7 +493,7 @@ lookup_field_1 (tree type, tree name, bool want_type)
}
/* Return the FUNCTION_DECL, RECORD_TYPE, UNION_TYPE, or
- NAMESPACE_DECL corresponding to the innermost non-block scope. */
+ NAMESPACE_DECL corresponding to the innermost non-block scope. */
tree
current_scope (void)
@@ -564,11 +563,11 @@ tree
context_for_name_lookup (tree decl)
{
/* [class.union]
-
+
For the purposes of name lookup, after the anonymous union
definition, the members of the anonymous union are considered to
have been defined in the scope in which the anonymous union is
- declared. */
+ declared. */
tree context = DECL_CONTEXT (decl);
while (context && TYPE_P (context) && ANON_AGGR_TYPE_P (context))
@@ -612,7 +611,7 @@ dfs_access_in_type (tree binfo, void *data)
else
access = ak_public;
}
- else
+ else
{
/* First, check for an access-declaration that gives us more
access to the DECL. The CONST_DECL for an enumeration
@@ -621,11 +620,11 @@ dfs_access_in_type (tree binfo, void *data)
if (DECL_LANG_SPECIFIC (decl) && !DECL_DISCRIMINATOR_P (decl))
{
tree decl_access = purpose_member (type, DECL_ACCESS (decl));
-
+
if (decl_access)
{
decl_access = TREE_VALUE (decl_access);
-
+
if (decl_access == access_public_node)
access = ak_public;
else if (decl_access == access_protected_node)
@@ -642,7 +641,7 @@ dfs_access_in_type (tree binfo, void *data)
int i;
tree base_binfo;
VEC(tree,gc) *accesses;
-
+
/* Otherwise, scan our baseclasses, and pick the most favorable
access. */
accesses = BINFO_BASE_ACCESSES (binfo);
@@ -699,7 +698,7 @@ access_in_type (tree type, tree decl)
If a name can be reached by several paths through a multiple
inheritance graph, the access is that of the path that gives
- most access.
+ most access.
The algorithm we use is to make a post-order depth-first traversal
of the base-class hierarchy. As we come up the tree, we annotate
@@ -722,7 +721,7 @@ protected_accessible_p (tree decl, tree derived, tree binfo)
m as a member of N is protected, and the reference occurs in a
member or friend of class N, or in a member or friend of a
class P derived from N, where m as a member of P is private or
- protected.
+ protected.
Here DERIVED is a possible P and DECL is m. accessible_p will
iterate over various values of N, but the access to m in DERIVED
@@ -742,7 +741,7 @@ protected_accessible_p (tree decl, tree derived, tree binfo)
/* If m is inaccessible in DERIVED, then it's not a P. */
if (access == ak_none)
return 0;
-
+
/* [class.protected]
When a friend or a member function of a derived class references
@@ -761,7 +760,7 @@ protected_accessible_p (tree decl, tree derived, tree binfo)
tree t = binfo;
while (BINFO_INHERITANCE_CHAIN (t))
t = BINFO_INHERITANCE_CHAIN (t);
-
+
if (!DERIVED_FROM_P (derived, BINFO_TYPE (t)))
return 0;
}
@@ -803,8 +802,8 @@ friend_accessible_p (tree scope, tree decl, tree binfo)
if (TREE_CODE (scope) == FUNCTION_DECL
|| DECL_FUNCTION_TEMPLATE_P (scope))
{
- /* Perhaps this SCOPE is a member of a class which is a
- friend. */
+ /* Perhaps this SCOPE is a member of a class which is a
+ friend. */
if (DECL_CLASS_SCOPE_P (scope)
&& friend_accessible_p (DECL_CONTEXT (scope), decl, binfo))
return 1;
@@ -837,7 +836,7 @@ dfs_accessible_post (tree binfo, void *data ATTRIBUTE_UNUSED)
&& is_friend (BINFO_TYPE (binfo), scope))
return binfo;
}
-
+
return NULL_TREE;
}
@@ -849,7 +848,7 @@ dfs_accessible_post (tree binfo, void *data ATTRIBUTE_UNUSED)
CONSIDER_LOCAL is true, do consider special access the current
scope or friendship thereof we might have. */
-int
+int
accessible_p (tree type, tree decl, bool consider_local_p)
{
tree binfo;
@@ -900,7 +899,7 @@ accessible_p (tree type, tree decl, bool consider_local_p)
protected, or
--there exists a base class B of N that is accessible at the point
- of reference, and m is accessible when named in class B.
+ of reference, and m is accessible when named in class B.
We walk the base class hierarchy, checking these conditions. */
@@ -928,10 +927,10 @@ accessible_p (tree type, tree decl, bool consider_local_p)
if (access == ak_public
|| (access == ak_protected && protected_ok))
return 1;
-
+
if (!consider_local_p)
return 0;
-
+
/* Walk the hierarchy again, looking for a base class that allows
access. */
return dfs_walk_once_accessible (binfo, /*friends=*/true,
@@ -960,7 +959,7 @@ struct lookup_field_info {
/* Within the scope of a template class, you can refer to the to the
current specialization with the name of the template itself. For
example:
-
+
template <typename T> struct S { S* sp; }
Returns nonzero if DECL is such a declaration in a class TYPE. */
@@ -1012,7 +1011,7 @@ static int
is_subobject_of_p (tree parent, tree binfo)
{
tree probe;
-
+
for (probe = parent; probe; probe = BINFO_INHERITANCE_CHAIN (probe))
{
if (probe == binfo)
@@ -1039,7 +1038,7 @@ lookup_field_r (tree binfo, void *data)
/* If this is a dependent base, don't look in it. */
if (BINFO_DEPENDENT_BASE_P (binfo))
return NULL_TREE;
-
+
/* If this base class is hidden by the best-known value so far, we
don't need to look. */
if (lfi->rval_binfo && BINFO_INHERITANCE_CHAIN (binfo) == lfi->rval_binfo
@@ -1085,17 +1084,17 @@ lookup_field_r (tree binfo, void *data)
nval = NULL_TREE;
if (!nval && CLASSTYPE_NESTED_UTDS (type) != NULL)
{
- binding_entry e = binding_table_find (CLASSTYPE_NESTED_UTDS (type),
- lfi->name);
+ binding_entry e = binding_table_find (CLASSTYPE_NESTED_UTDS (type),
+ lfi->name);
if (e != NULL)
nval = TYPE_MAIN_DECL (e->type);
- else
+ else
goto done;
}
}
/* You must name a template base class with a template-id. */
- if (!same_type_p (type, lfi->type)
+ if (!same_type_p (type, lfi->type)
&& template_self_reference_p (type, nval))
goto done;
@@ -1103,7 +1102,7 @@ lookup_field_r (tree binfo, void *data)
hide the old one, we might have an ambiguity. */
if (lfi->rval_binfo
&& !is_subobject_of_p (lfi->rval_binfo, binfo))
-
+
{
if (nval == lfi->rval && shared_member_p (nval))
/* The two things are really the same. */
@@ -1237,8 +1236,8 @@ lookup_member (tree xbasetype, tree name, int protect, bool want_type)
just return NULL_TREE. */
if (!protect && lfi.ambiguous)
return NULL_TREE;
-
- if (protect == 2)
+
+ if (protect == 2)
{
if (lfi.ambiguous)
return lfi.ambiguous;
@@ -1257,11 +1256,11 @@ lookup_member (tree xbasetype, tree name, int protect, bool want_type)
{
error (errstr, name, type);
if (lfi.ambiguous)
- print_candidates (lfi.ambiguous);
+ print_candidates (lfi.ambiguous);
rval = error_mark_node;
}
- if (rval && is_overloaded_fn (rval))
+ if (rval && is_overloaded_fn (rval))
rval = build_baselink (rval_binfo, basetype_path, rval,
(IDENTIFIER_TYPENAME_P (name)
? TREE_TYPE (name): NULL_TREE));
@@ -1275,7 +1274,7 @@ tree
lookup_field (tree xbasetype, tree name, int protect, bool want_type)
{
tree rval = lookup_member (xbasetype, name, protect, want_type);
-
+
/* Ignore functions, but propagate the ambiguity list. */
if (!error_operand_p (rval)
&& (rval && BASELINK_P (rval)))
@@ -1315,7 +1314,7 @@ lookup_conversion_operator (tree class_type, tree type)
int i;
tree fn;
VEC(tree,gc) *methods = CLASSTYPE_METHOD_VEC (class_type);
-
+
for (i = CLASSTYPE_FIRST_CONVERSION_SLOT;
VEC_iterate (tree, methods, i, fn); ++i)
{
@@ -1326,7 +1325,7 @@ lookup_conversion_operator (tree class_type, tree type)
fn = OVL_CURRENT (fn);
if (!DECL_CONV_FN_P (fn))
break;
-
+
if (TREE_CODE (fn) == TEMPLATE_DECL)
/* All the templated conversion functions are on the same
slot, so remember it. */
@@ -1349,7 +1348,7 @@ lookup_fnfields_1 (tree type, tree name)
tree fn;
tree tmp;
size_t i;
-
+
if (!CLASS_TYPE_P (type))
return -1;
@@ -1472,11 +1471,11 @@ class_method_index_for_fn (tree class_type, tree function)
`B', not `D'. This function makes that adjustment. */
tree
-adjust_result_of_qualified_name_lookup (tree decl,
+adjust_result_of_qualified_name_lookup (tree decl,
tree qualifying_scope,
tree context_class)
{
- if (context_class && CLASS_TYPE_P (qualifying_scope)
+ if (context_class && CLASS_TYPE_P (qualifying_scope)
&& DERIVED_FROM_P (qualifying_scope, context_class)
&& BASELINK_P (decl))
{
@@ -1494,7 +1493,7 @@ adjust_result_of_qualified_name_lookup (tree decl,
if (base)
{
BASELINK_ACCESS_BINFO (decl) = base;
- BASELINK_BINFO (decl)
+ BASELINK_BINFO (decl)
= lookup_base (base, BINFO_TYPE (BASELINK_BINFO (decl)),
ba_unique | ba_quiet,
NULL);
@@ -1522,7 +1521,7 @@ dfs_walk_all (tree binfo, tree (*pre_fn) (tree, void *),
tree rval;
unsigned ix;
tree base_binfo;
-
+
/* Call the pre-order walking function. */
if (pre_fn)
{
@@ -1551,7 +1550,7 @@ dfs_walk_all (tree binfo, tree (*pre_fn) (tree, void *),
gcc_assert (rval != dfs_skip_bases);
return rval;
}
-
+
return NULL_TREE;
}
@@ -1565,7 +1564,7 @@ dfs_walk_once_r (tree binfo, tree (*pre_fn) (tree, void *),
tree rval;
unsigned ix;
tree base_binfo;
-
+
/* Call the pre-order walking function. */
if (pre_fn)
{
@@ -1574,7 +1573,7 @@ dfs_walk_once_r (tree binfo, tree (*pre_fn) (tree, void *),
{
if (rval == dfs_skip_bases)
goto skip_bases;
-
+
return rval;
}
}
@@ -1588,12 +1587,12 @@ dfs_walk_once_r (tree binfo, tree (*pre_fn) (tree, void *),
continue;
BINFO_MARKED (base_binfo) = 1;
}
-
+
rval = dfs_walk_once_r (base_binfo, pre_fn, post_fn, data);
if (rval)
return rval;
}
-
+
skip_bases:
/* Call the post-order walking function. */
if (post_fn)
@@ -1602,19 +1601,19 @@ dfs_walk_once_r (tree binfo, tree (*pre_fn) (tree, void *),
gcc_assert (rval != dfs_skip_bases);
return rval;
}
-
+
return NULL_TREE;
}
/* Worker for dfs_walk_once. Recursively unmark the virtual base binfos of
BINFO. */
-
+
static void
dfs_unmark_r (tree binfo)
{
unsigned ix;
tree base_binfo;
-
+
/* Process the basetypes. */
for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
{
@@ -1645,7 +1644,7 @@ dfs_walk_once (tree binfo, tree (*pre_fn) (tree, void *),
gcc_assert (pre_fn || post_fn);
gcc_assert (!active);
active++;
-
+
if (!CLASSTYPE_DIAMOND_SHAPED_P (BINFO_TYPE (binfo)))
/* We are not diamond shaped, and therefore cannot encounter the
same binfo twice. */
@@ -1656,12 +1655,12 @@ dfs_walk_once (tree binfo, tree (*pre_fn) (tree, void *),
if (!BINFO_INHERITANCE_CHAIN (binfo))
{
/* We are at the top of the hierarchy, and can use the
- CLASSTYPE_VBASECLASSES list for unmarking the virtual
- bases. */
+ CLASSTYPE_VBASECLASSES list for unmarking the virtual
+ bases. */
VEC(tree,gc) *vbases;
unsigned ix;
tree base_binfo;
-
+
for (vbases = CLASSTYPE_VBASECLASSES (BINFO_TYPE (binfo)), ix = 0;
VEC_iterate (tree, vbases, ix, base_binfo); ix++)
BINFO_MARKED (base_binfo) = 0;
@@ -1671,7 +1670,7 @@ dfs_walk_once (tree binfo, tree (*pre_fn) (tree, void *),
}
active--;
-
+
return rval;
}
@@ -1697,7 +1696,7 @@ dfs_walk_once_accessible_r (tree binfo, bool friends_p, bool once,
{
if (rval == dfs_skip_bases)
goto skip_bases;
-
+
return rval;
}
}
@@ -1709,17 +1708,17 @@ dfs_walk_once_accessible_r (tree binfo, bool friends_p, bool once,
if (mark && BINFO_MARKED (base_binfo))
continue;
-
+
/* If the base is inherited via private or protected
- inheritance, then we can't see it, unless we are a friend of
- the current binfo. */
+ inheritance, then we can't see it, unless we are a friend of
+ the current binfo. */
if (BINFO_BASE_ACCESS (binfo, ix) != access_public_node)
{
tree scope;
if (!friends_p)
continue;
scope = current_scope ();
- if (!scope
+ if (!scope
|| TREE_CODE (scope) == NAMESPACE_DECL
|| !is_friend (BINFO_TYPE (binfo), scope))
continue;
@@ -1733,7 +1732,7 @@ dfs_walk_once_accessible_r (tree binfo, bool friends_p, bool once,
if (rval)
return rval;
}
-
+
skip_bases:
/* Call the post-order walking function. */
if (post_fn)
@@ -1742,7 +1741,7 @@ dfs_walk_once_accessible_r (tree binfo, bool friends_p, bool once,
gcc_assert (rval != dfs_skip_bases);
return rval;
}
-
+
return NULL_TREE;
}
@@ -1758,18 +1757,18 @@ dfs_walk_once_accessible (tree binfo, bool friends_p,
bool diamond_shaped = CLASSTYPE_DIAMOND_SHAPED_P (BINFO_TYPE (binfo));
tree rval = dfs_walk_once_accessible_r (binfo, friends_p, diamond_shaped,
pre_fn, post_fn, data);
-
+
if (diamond_shaped)
{
if (!BINFO_INHERITANCE_CHAIN (binfo))
{
/* We are at the top of the hierarchy, and can use the
- CLASSTYPE_VBASECLASSES list for unmarking the virtual
- bases. */
+ CLASSTYPE_VBASECLASSES list for unmarking the virtual
+ bases. */
VEC(tree,gc) *vbases;
unsigned ix;
tree base_binfo;
-
+
for (vbases = CLASSTYPE_VBASECLASSES (BINFO_TYPE (binfo)), ix = 0;
VEC_iterate (tree, vbases, ix, base_binfo); ix++)
BINFO_MARKED (base_binfo) = 0;
@@ -1805,12 +1804,12 @@ check_final_overrider (tree overrider, tree basefn)
{
/* Potentially covariant. */
unsigned base_quals, over_quals;
-
+
fail = !POINTER_TYPE_P (base_return);
if (!fail)
{
fail = cp_type_quals (base_return) != cp_type_quals (over_return);
-
+
base_return = TREE_TYPE (base_return);
over_return = TREE_TYPE (over_return);
}
@@ -1819,7 +1818,7 @@ check_final_overrider (tree overrider, tree basefn)
if ((base_quals & over_quals) != over_quals)
fail = 1;
-
+
if (CLASS_TYPE_P (base_return) && CLASS_TYPE_P (over_return))
{
tree binfo = lookup_base (over_return, base_return,
@@ -1868,7 +1867,7 @@ check_final_overrider (tree overrider, tree basefn)
DECL_INVALID_OVERRIDER_P (overrider) = 1;
return 0;
}
-
+
/* Check throw specifier is at least as strict. */
if (!comp_except_specs (base_throw, over_throw, 0))
{
@@ -1877,17 +1876,17 @@ check_final_overrider (tree overrider, tree basefn)
DECL_INVALID_OVERRIDER_P (overrider) = 1;
return 0;
}
-
+
return 1;
}
/* Given a class TYPE, and a function decl FNDECL, look for
virtual functions in TYPE's hierarchy which FNDECL overrides.
We do not look in TYPE itself, only its bases.
-
+
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
overridden. */
@@ -1902,9 +1901,9 @@ look_for_overrides (tree type, tree fndecl)
for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
{
tree basetype = BINFO_TYPE (base_binfo);
-
+
if (TYPE_POLYMORPHIC_P (basetype))
- found += look_for_overrides_r (basetype, fndecl);
+ found += look_for_overrides_r (basetype, fndecl);
}
return found;
}
@@ -1930,23 +1929,23 @@ look_for_overrides_here (tree type, tree fndecl)
if (ix >= 0)
{
tree fns = VEC_index (tree, CLASSTYPE_METHOD_VEC (type), ix);
-
+
for (; fns; fns = OVL_NEXT (fns))
- {
- tree fn = OVL_CURRENT (fns);
+ {
+ tree fn = OVL_CURRENT (fns);
- if (!DECL_VIRTUAL_P (fn))
- /* Not a virtual. */;
- else if (DECL_CONTEXT (fn) != type)
- /* Introduced with a using declaration. */;
+ if (!DECL_VIRTUAL_P (fn))
+ /* Not a virtual. */;
+ else if (DECL_CONTEXT (fn) != type)
+ /* Introduced with a using declaration. */;
else if (DECL_STATIC_FUNCTION_P (fndecl))
{
tree btypes = TYPE_ARG_TYPES (TREE_TYPE (fn));
tree dtypes = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
- if (compparms (TREE_CHAIN (btypes), dtypes))
+ if (compparms (TREE_CHAIN (btypes), dtypes))
return fn;
- }
- else if (same_signature_p (fndecl, fn))
+ }
+ else if (same_signature_p (fndecl, fn))
return fn;
}
}
@@ -1995,7 +1994,7 @@ dfs_get_pure_virtuals (tree binfo, void *data)
if (!BINFO_PRIMARY_P (binfo))
{
tree virtuals;
-
+
for (virtuals = BINFO_VIRTUALS (binfo);
virtuals;
virtuals = TREE_CHAIN (virtuals))
@@ -2150,17 +2149,17 @@ check_hidden_convs (tree binfo, int virtual_depth, int virtualness,
if (virtual_depth || virtualness)
{
/* In a virtual hierarchy, we could be hidden, or could hide a
- conversion function on the other_convs list. */
+ conversion function on the other_convs list. */
for (level = other_convs; level; level = TREE_CHAIN (level))
{
int we_hide_them;
int they_hide_us;
tree *prev, other;
-
+
if (!(virtual_depth || TREE_STATIC (level)))
/* Neither is morally virtual, so cannot hide each other. */
continue;
-
+
if (!TREE_VALUE (level))
/* They evaporated away already. */
continue;
@@ -2173,7 +2172,7 @@ check_hidden_convs (tree binfo, int virtual_depth, int virtualness,
if (!(we_hide_them || they_hide_us))
/* Neither is within the other, so no hiding can occur. */
continue;
-
+
for (prev = &TREE_VALUE (level), other = *prev; other;)
{
if (same_type_p (to_type, TREE_TYPE (other)))
@@ -2213,12 +2212,12 @@ split_conversions (tree my_convs, tree parent_convs,
{
tree t;
tree prev;
-
+
/* Remove the original other_convs portion from child_convs. */
for (prev = NULL, t = child_convs;
t != other_convs; prev = t, t = TREE_CHAIN (t))
continue;
-
+
if (prev)
TREE_CHAIN (prev) = NULL_TREE;
else
@@ -2232,7 +2231,7 @@ split_conversions (tree my_convs, tree parent_convs,
}
else
my_convs = child_convs;
-
+
return my_convs;
}
@@ -2277,15 +2276,15 @@ lookup_conversions_r (tree binfo,
if (!TYPE_HAS_CONVERSION (BINFO_TYPE (binfo)))
{
*convs = *tpl_convs = NULL_TREE;
-
+
return 0;
}
-
+
if (BINFO_VIRTUAL_P (binfo))
virtual_depth++;
-
+
/* First, locate the unhidden ones at this level. */
- for (i = CLASSTYPE_FIRST_CONVERSION_SLOT;
+ for (i = CLASSTYPE_FIRST_CONVERSION_SLOT;
VEC_iterate (tree, method_vec, i, conv);
++i)
{
@@ -2304,7 +2303,7 @@ lookup_conversions_r (tree binfo,
{
tree tpl = OVL_CURRENT (tpls);
tree type = DECL_CONV_FN_TYPE (tpl);
-
+
if (check_hidden_convs (binfo, virtual_depth, virtualness,
type, parent_tpl_convs, other_tpl_convs))
{
@@ -2325,7 +2324,7 @@ lookup_conversions_r (tree binfo,
if (!IDENTIFIER_MARKED (name))
{
tree type = DECL_CONV_FN_TYPE (cur);
-
+
if (check_hidden_convs (binfo, virtual_depth, virtualness,
type, parent_convs, other_convs))
{
@@ -2348,7 +2347,7 @@ lookup_conversions_r (tree binfo,
if (virtual_depth)
TREE_STATIC (parent_convs) = 1;
}
-
+
if (my_tpl_convs)
{
parent_tpl_convs = tree_cons (binfo, my_tpl_convs, parent_tpl_convs);
@@ -2358,7 +2357,7 @@ lookup_conversions_r (tree binfo,
child_convs = other_convs;
child_tpl_convs = other_tpl_convs;
-
+
/* Now iterate over each base, looking for more conversions. */
for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
{
@@ -2384,7 +2383,7 @@ lookup_conversions_r (tree binfo,
child_convs, other_convs);
*tpl_convs = split_conversions (my_tpl_convs, parent_tpl_convs,
child_tpl_convs, other_tpl_convs);
-
+
return my_virtualness;
}
@@ -2402,15 +2401,15 @@ lookup_conversions (tree type)
{
tree convs, tpl_convs;
tree list = NULL_TREE;
-
+
complete_type (type);
if (!TYPE_BINFO (type))
return NULL_TREE;
-
+
lookup_conversions_r (TYPE_BINFO (type), 0, 0,
NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE,
&convs, &tpl_convs);
-
+
/* Flatten the list-of-lists */
for (; convs; convs = TREE_CHAIN (convs))
{
@@ -2424,7 +2423,7 @@ lookup_conversions (tree type)
list = probe;
}
}
-
+
for (; tpl_convs; tpl_convs = TREE_CHAIN (tpl_convs))
{
tree probe, next;
@@ -2437,7 +2436,7 @@ lookup_conversions (tree type)
list = probe;
}
}
-
+
return list;
}
@@ -2465,7 +2464,7 @@ binfo_via_virtual (tree binfo, tree limit)
if (limit && !CLASSTYPE_VBASECLASSES (limit))
/* LIMIT has no virtual bases, so BINFO cannot be via one. */
return NULL_TREE;
-
+
for (; binfo && !SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), limit);
binfo = BINFO_INHERITANCE_CHAIN (binfo))
{
@@ -2483,7 +2482,7 @@ tree
copied_binfo (tree binfo, tree here)
{
tree result = NULL_TREE;
-
+
if (BINFO_VIRTUAL_P (binfo))
{
tree t;
@@ -2499,7 +2498,7 @@ copied_binfo (tree binfo, tree here)
tree cbinfo;
tree base_binfo;
int ix;
-
+
cbinfo = copied_binfo (BINFO_INHERITANCE_CHAIN (binfo), here);
for (ix = 0; BINFO_BASE_ITERATE (cbinfo, ix, base_binfo); ix++)
if (SAME_BINFO_TYPE_P (BINFO_TYPE (base_binfo), BINFO_TYPE (binfo)))
@@ -2524,7 +2523,7 @@ binfo_for_vbase (tree base, tree t)
unsigned ix;
tree binfo;
VEC(tree,gc) *vbases;
-
+
for (vbases = CLASSTYPE_VBASECLASSES (t), ix = 0;
VEC_iterate (tree, vbases, ix, binfo); ix++)
if (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), base))
@@ -2541,7 +2540,7 @@ tree
original_binfo (tree binfo, tree here)
{
tree result = NULL;
-
+
if (SAME_BINFO_TYPE_P (BINFO_TYPE (binfo), BINFO_TYPE (here)))
result = here;
else if (BINFO_VIRTUAL_P (binfo))
@@ -2551,13 +2550,13 @@ original_binfo (tree binfo, tree here)
else if (BINFO_INHERITANCE_CHAIN (binfo))
{
tree base_binfos;
-
+
base_binfos = original_binfo (BINFO_INHERITANCE_CHAIN (binfo), here);
if (base_binfos)
{
int ix;
tree base_binfo;
-
+
for (ix = 0; (base_binfo = BINFO_BASE_BINFO (base_binfos, ix)); ix++)
if (SAME_BINFO_TYPE_P (BINFO_TYPE (base_binfo),
BINFO_TYPE (binfo)))
@@ -2567,7 +2566,7 @@ original_binfo (tree binfo, tree here)
}
}
}
-
+
return result;
}
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 6955291d536..0c559752bac 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -1,12 +1,12 @@
/* Perform the semantic phase of parsing, i.e., the process of
building tree structure, checking semantic consistency, and
building RTL. These routines are used both during actual parsing
- and during the instantiation of template functions.
+ and during the instantiation of template functions.
Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
Written by Mark Mitchell (mmitchell@usa.net) based on code found
- formerly in parse.y and pt.c.
+ formerly in parse.y and pt.c.
This file is part of GCC.
@@ -14,12 +14,12 @@
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
@@ -75,9 +75,9 @@ static tree finalize_nrv_r (tree *, int *, void *);
example:
class A {
- typedef int X;
+ typedef int X;
public:
- X f();
+ X f();
};
A::X A::f();
@@ -91,7 +91,7 @@ static tree finalize_nrv_r (tree *, int *, void *);
instantiations.
Typical use of access checking functions is described here:
-
+
1. When we enter a context that requires certain access checking
mode, the function `push_deferring_access_checks' is called with
DEFERRING argument specifying the desired mode. Access checking
@@ -121,23 +121,23 @@ typedef struct deferred_access GTY(())
names used in a decl-specifier-seq until we know what is being
declared because code like:
- class A {
- class B {};
- B* f();
+ class A {
+ class B {};
+ B* f();
}
A::B* A::f() { return 0; }
- is valid, even though `A::B' is not generally accessible.
+ is valid, even though `A::B' is not generally accessible.
The TREE_PURPOSE of each node is the scope used to qualify the
name being looked up; the TREE_VALUE is the DECL to which the
name was resolved. */
tree deferred_access_checks;
-
+
/* The current mode of access checks. */
enum deferring_kind deferring_access_checks_kind;
-
+
} deferred_access;
DEF_VEC_O (deferred_access);
DEF_VEC_ALLOC_O (deferred_access,gc);
@@ -199,8 +199,8 @@ pop_deferring_access_checks (void)
VEC_pop (deferred_access, deferred_access_stack);
}
-/* Returns a TREE_LIST representing the deferred checks.
- The TREE_PURPOSE of each node is the type through which the
+/* Returns a TREE_LIST representing the deferred checks.
+ The TREE_PURPOSE of each node is the type through which the
access occurred; the TREE_VALUE is the declaration named.
*/
@@ -236,8 +236,8 @@ pop_to_parent_deferring_access_checks (void)
if (ptr->deferring_access_checks_kind == dk_no_deferred)
{
/* Check access. */
- for (; checks; checks = TREE_CHAIN (checks))
- enforce_access (TREE_PURPOSE (checks),
+ for (; checks; checks = TREE_CHAIN (checks))
+ enforce_access (TREE_PURPOSE (checks),
TREE_VALUE (checks));
}
else
@@ -245,11 +245,11 @@ pop_to_parent_deferring_access_checks (void)
/* Merge with parent. */
tree next;
tree original = ptr->deferred_access_checks;
-
+
for (; checks; checks = next)
{
tree probe;
-
+
next = TREE_CHAIN (checks);
for (probe = original; probe; probe = TREE_CHAIN (probe))
@@ -290,7 +290,7 @@ perform_deferred_access_checks (void)
deferred_check;
deferred_check = TREE_CHAIN (deferred_check))
/* Check access. */
- enforce_access (TREE_PURPOSE (deferred_check),
+ enforce_access (TREE_PURPOSE (deferred_check),
TREE_VALUE (deferred_check));
}
@@ -307,18 +307,18 @@ perform_or_defer_access_check (tree binfo, tree decl)
*/
if (deferred_access_no_check)
return;
-
+
gcc_assert (TREE_CODE (binfo) == TREE_BINFO);
ptr = VEC_last (deferred_access, deferred_access_stack);
-
+
/* If we are not supposed to defer access checks, just check now. */
if (ptr->deferring_access_checks_kind == dk_no_deferred)
{
enforce_access (binfo, decl);
return;
}
-
+
/* See if we are already going to perform this check. */
for (check = ptr->deferred_access_checks;
check;
@@ -340,6 +340,32 @@ stmts_are_full_exprs_p (void)
return current_stmt_tree ()->stmts_are_full_exprs_p;
}
+/* T is a statement. Add it to the statement-tree. This is the C++
+ version. The C/ObjC frontends have a slightly different version of
+ this function. */
+
+tree
+add_stmt (tree t)
+{
+ enum tree_code code = TREE_CODE (t);
+
+ if (EXPR_P (t) && code != LABEL_EXPR)
+ {
+ if (!EXPR_HAS_LOCATION (t))
+ SET_EXPR_LOCATION (t, input_location);
+
+ /* When we expand a statement-tree, we must know whether or not the
+ statements are full-expressions. We record that fact here. */
+ STMT_IS_FULL_EXPR_P (t) = stmts_are_full_exprs_p ();
+ }
+
+ /* Add T to the statement-tree. Non-side-effect statements need to be
+ recorded during statement expressions. */
+ append_to_statement_list_force (t, &cur_stmt_list);
+
+ return t;
+}
+
/* Returns the stmt_tree (if any) to which statements are currently
being added. If there is no active statement-tree, NULL is
returned. */
@@ -347,8 +373,8 @@ stmts_are_full_exprs_p (void)
stmt_tree
current_stmt_tree (void)
{
- return (cfun
- ? &cfun->language->base.x_stmt_tree
+ return (cfun
+ ? &cfun->language->base.x_stmt_tree
: &scope_chain->x_stmt_tree);
}
@@ -410,7 +436,7 @@ do_poplevel (tree stmt_list)
block = poplevel (kept_level_p (), 1, 0);
stmt_list = pop_stmt_list (stmt_list);
-
+
if (!processing_template_decl)
{
stmt_list = c_build_bind_expr (block, stmt_list);
@@ -420,7 +446,7 @@ do_poplevel (tree stmt_list)
return stmt_list;
}
-/* Begin a new scope. */
+/* Begin a new scope. */
static tree
do_pushlevel (scope_kind sk)
@@ -472,14 +498,14 @@ finish_cond (tree *cond_p, tree expr)
/* If *COND_P specifies a conditional with a declaration, transform the
loop such that
- while (A x = 42) { }
- for (; A x = 42;) { }
+ while (A x = 42) { }
+ for (; A x = 42;) { }
becomes
- while (true) { A x = 42; if (!x) break; }
- for (;;) { A x = 42; if (!x) break; }
+ while (true) { A x = 42; if (!x) break; }
+ for (;;) { A x = 42; if (!x) break; }
The statement list for BODY will be empty if the conditional did
not declare anything. */
-
+
static void
simplify_loop_decl_cond (tree *cond_p, tree body)
{
@@ -490,7 +516,7 @@ simplify_loop_decl_cond (tree *cond_p, tree body)
cond = *cond_p;
*cond_p = boolean_true_node;
-
+
if_stmt = begin_if_stmt ();
cond = build_unary_op (TRUTH_NOT_EXPR, cond, 0);
finish_if_stmt_cond (cond, if_stmt);
@@ -522,7 +548,7 @@ finish_goto_stmt (tree destination)
addresses, or some such. */
DECL_UNINLINABLE (current_function_decl) = 1;
}
-
+
check_goto (destination);
return add_stmt (build_stmt (GOTO_EXPR, destination));
@@ -600,7 +626,7 @@ begin_if_stmt (void)
/* Process the COND of an if-statement, which may be given by
IF_STMT. */
-void
+void
finish_if_stmt_cond (tree cond, tree if_stmt)
{
finish_cond (&IF_COND (if_stmt), maybe_convert_cond (cond));
@@ -637,7 +663,7 @@ finish_else_clause (tree if_stmt)
/* Finish an if-statement. */
-void
+void
finish_if_stmt (tree if_stmt)
{
tree scope = TREE_CHAIN (if_stmt);
@@ -663,7 +689,7 @@ begin_while_stmt (void)
/* Process the COND of a while-statement, which may be given by
WHILE_STMT. */
-void
+void
finish_while_stmt_cond (tree cond, tree while_stmt)
{
finish_cond (&WHILE_COND (while_stmt), maybe_convert_cond (cond));
@@ -672,7 +698,7 @@ finish_while_stmt_cond (tree cond, tree while_stmt)
/* Finish a while-statement, which may be given by WHILE_STMT. */
-void
+void
finish_while_stmt (tree while_stmt)
{
WHILE_BODY (while_stmt) = do_poplevel (WHILE_BODY (while_stmt));
@@ -722,7 +748,7 @@ finish_return_stmt (tree expr)
if (!processing_template_decl)
{
if (DECL_DESTRUCTOR_P (current_function_decl)
- || (DECL_CONSTRUCTOR_P (current_function_decl)
+ || (DECL_CONSTRUCTOR_P (current_function_decl)
&& targetm.cxx.cdtor_returns_this ()))
{
/* Similarly, all destructors must run destructors for
@@ -748,7 +774,7 @@ begin_for_stmt (void)
{
tree r;
- r = build_stmt (FOR_STMT, NULL_TREE, NULL_TREE,
+ r = build_stmt (FOR_STMT, NULL_TREE, NULL_TREE,
NULL_TREE, NULL_TREE);
if (flag_new_for_scope > 0)
@@ -801,7 +827,7 @@ finish_for_expr (tree expr, tree for_stmt)
if (!processing_template_decl)
{
if (warn_sequence_point)
- verify_sequence_points (expr);
+ verify_sequence_points (expr);
expr = convert_to_void (expr, "3rd expression in for");
}
else if (!type_dependent_expression_p (expr))
@@ -827,7 +853,7 @@ finish_for_stmt (tree for_stmt)
add_stmt (do_poplevel (scope));
}
- finish_stmt ();
+ finish_stmt ();
}
/* Finish a break-statement. */
@@ -919,7 +945,7 @@ finish_switch_stmt (tree switch_stmt)
SWITCH_STMT_BODY (switch_stmt) =
pop_stmt_list (SWITCH_STMT_BODY (switch_stmt));
- pop_switch ();
+ pop_switch ();
finish_stmt ();
scope = TREE_CHAIN (switch_stmt);
@@ -1064,7 +1090,7 @@ finish_handler (tree handler)
/* Begin a compound statement. FLAGS contains some bits that control the
behavior and context. If BCS_NO_SCOPE is set, the compound statement
does not define a scope. If BCS_FN_BODY is set, this is the outermost
- block of a function. If BCS_TRY_BLOCK is set, this is the block
+ block of a function. If BCS_TRY_BLOCK is set, this is the block
created on behalf of a TRY statement. Returns a token to be passed to
finish_compound_stmt. */
@@ -1081,7 +1107,7 @@ begin_compound_stmt (unsigned int flags)
/* Normally, we try hard to keep the BLOCK for a statement-expression.
But, if it's a statement-expression with a scopeless block, there's
nothing to keep, and we don't want to accidentally keep a block
- *inside* the scopeless block. */
+ *inside* the scopeless block. */
keep_next_level (false);
}
else
@@ -1189,7 +1215,7 @@ finish_asm_stmt (int volatile_p, tree string, tree output_operands,
for (i = 0, t = input_operands; t; ++i, t = TREE_CHAIN (t))
{
constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
- operand = decay_conversion (TREE_VALUE (t));
+ operand = decay_conversion (TREE_VALUE (t));
/* If the type of the operand hasn't been determined (e.g.,
because it involves an overloaded function), then issue
@@ -1197,8 +1223,8 @@ finish_asm_stmt (int volatile_p, tree string, tree output_operands,
resolve the overloading. */
if (TREE_TYPE (operand) == unknown_type_node)
{
- error ("type of asm operand %qE could not be determined",
- TREE_VALUE (t));
+ error ("type of asm operand %qE could not be determined",
+ TREE_VALUE (t));
operand = error_mark_node;
}
@@ -1253,7 +1279,7 @@ finish_label_decl (tree name)
/* When DECL goes out of scope, make sure that CLEANUP is executed. */
-void
+void
finish_decl_cleanup (tree decl, tree cleanup)
{
push_cleanup (decl, cleanup, false);
@@ -1297,10 +1323,10 @@ finish_parenthesized_expr (tree expr)
/* [expr.unary.op]/3 The qualified id of a pointer-to-member must not be
enclosed in parentheses. */
PTRMEM_OK_P (expr) = 0;
-
+
if (TREE_CODE (expr) == STRING_CST)
PAREN_STRING_LITERAL_P (expr) = 1;
-
+
return expr;
}
@@ -1314,7 +1340,7 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope)
if (!object)
{
- if (current_function_decl
+ if (current_function_decl
&& DECL_STATIC_FUNCTION_P (current_function_decl))
cp_error_at ("invalid use of member %qD in static member function",
decl);
@@ -1335,21 +1361,21 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope)
{
/* Set the cv qualifiers. */
int quals = cp_type_quals (TREE_TYPE (current_class_ref));
-
+
if (DECL_MUTABLE_P (decl))
quals &= ~TYPE_QUAL_CONST;
quals |= cp_type_quals (TREE_TYPE (decl));
type = cp_build_qualified_type (type, quals);
}
-
+
return build_min (COMPONENT_REF, type, object, decl, NULL_TREE);
}
else
{
tree access_type = TREE_TYPE (object);
tree lookup_context = context_for_name_lookup (decl);
-
+
while (!DERIVED_FROM_P (lookup_context, access_type))
{
access_type = TYPE_CONTEXT (access_type);
@@ -1395,8 +1421,8 @@ finish_non_static_data_member (tree decl, tree object, tree qualifying_scope)
`A::B' then NESTED_NAME_SPECIFIER is `A'. */
void
-check_accessibility_of_qualified_id (tree decl,
- tree object_type,
+check_accessibility_of_qualified_id (tree decl,
+ tree object_type,
tree nested_name_specifier)
{
tree scope;
@@ -1405,21 +1431,21 @@ check_accessibility_of_qualified_id (tree decl,
/* If we're not checking, return immediately. */
if (deferred_access_no_check)
return;
-
+
/* Determine the SCOPE of DECL. */
scope = context_for_name_lookup (decl);
/* If the SCOPE is not a type, then DECL is not a member. */
if (!TYPE_P (scope))
return;
/* Compute the scope through which DECL is being accessed. */
- if (object_type
+ if (object_type
/* OBJECT_TYPE might not be a class type; consider:
class A { typedef int I; };
I *p;
p->A::I::~I();
- In this case, we will have "A::I" as the DECL, but "I" as the
+ In this case, we will have "A::I" as the DECL, but "I" as the
OBJECT_TYPE. */
&& CLASS_TYPE_P (object_type)
&& DERIVED_FROM_P (scope, object_type))
@@ -1470,7 +1496,7 @@ finish_qualified_id_expr (tree qualifying_class, tree expr, bool done,
{
if (TREE_CODE (expr) == SCOPE_REF)
expr = TREE_OPERAND (expr, 1);
- expr = build_offset_ref (qualifying_class, expr,
+ expr = build_offset_ref (qualifying_class, expr,
/*address_p=*/true);
return expr;
}
@@ -1489,9 +1515,9 @@ finish_qualified_id_expr (tree qualifying_class, tree expr, bool done,
/* If so, the expression may be relative to the current
class. */
if (!shared_member_p (fns)
- && current_class_type
+ && current_class_type
&& DERIVED_FROM_P (qualifying_class, current_class_type))
- expr = (build_class_member_access_expr
+ expr = (build_class_member_access_expr
(maybe_dummy_object (qualifying_class, NULL),
expr,
BASELINK_ACCESS_BINFO (expr),
@@ -1508,7 +1534,7 @@ finish_qualified_id_expr (tree qualifying_class, tree expr, bool done,
/* Begin a statement-expression. The value returned must be passed to
finish_stmt_expr. */
-tree
+tree
begin_stmt_expr (void)
{
return push_stmt_list ();
@@ -1526,7 +1552,7 @@ finish_stmt_expr_expr (tree expr, tree stmt_expr)
if (error_operand_p (expr))
return error_mark_node;
-
+
if (expr)
{
if (!processing_template_decl && !VOID_TYPE_P (TREE_TYPE (expr)))
@@ -1568,13 +1594,13 @@ finish_stmt_expr_expr (tree expr, tree stmt_expr)
add_stmt (result);
}
}
-
+
finish_stmt ();
/* Remember the last expression so that finish_stmt_expr
can pull it apart. */
TREE_TYPE (stmt_expr) = result;
-
+
return result;
}
@@ -1582,7 +1608,7 @@ finish_stmt_expr_expr (tree expr, tree stmt_expr)
by the previous begin_stmt_expr. Returns an expression
representing the statement-expression. */
-tree
+tree
finish_stmt_expr (tree stmt_expr, bool has_no_scope)
{
tree result, result_stmt, type;
@@ -1729,7 +1755,7 @@ perform_koenig_lookup (tree fn, tree args)
Returns code for the call. */
-tree
+tree
finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p)
{
tree result;
@@ -1794,18 +1820,18 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p)
function call is transformed into a qualified function call
using (*this) as the postfix-expression to the left of the
. operator.... [Otherwise] a contrived object of type T
- becomes the implied object argument.
+ becomes the implied object argument.
- This paragraph is unclear about this situation:
+ This paragraph is unclear about this situation:
struct A { void f(); };
struct B : public A {};
struct C : public A { void g() { B::f(); }};
In particular, for `B::f', this paragraph does not make clear
- whether "the class of that member function" refers to `A' or
+ whether "the class of that member function" refers to `A' or
to `B'. We believe it refers to `B'. */
- if (current_class_type
+ if (current_class_type
&& DERIVED_FROM_P (BINFO_TYPE (BASELINK_ACCESS_BINFO (fn)),
current_class_type)
&& current_class_ref)
@@ -1830,7 +1856,7 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p)
}
result = build_new_method_call (object, fn, args, NULL_TREE,
- (disallow_virtual
+ (disallow_virtual
? LOOKUP_NONVIRTUAL : 0));
}
else if (is_overloaded_fn (fn))
@@ -1839,7 +1865,7 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p)
if (TREE_CODE (fn) == FUNCTION_DECL
&& (DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL
|| DECL_BUILT_IN_CLASS (fn) == BUILT_IN_MD))
- result = resolve_overloaded_builtin (fn, args);
+ result = resolve_overloaded_builtin (fn, args);
if (!result)
/* A call to a namespace-scope function. */
@@ -1879,15 +1905,15 @@ finish_call_expr (tree fn, tree args, bool disallow_virtual, bool koenig_p)
is indicated by CODE, which should be POSTINCREMENT_EXPR or
POSTDECREMENT_EXPR.) */
-tree
+tree
finish_increment_expr (tree expr, enum tree_code code)
{
- return build_x_unary_op (code, expr);
+ return build_x_unary_op (code, expr);
}
/* Finish a use of `this'. Returns an expression for `this'. */
-tree
+tree
finish_this_expr (void)
{
tree result;
@@ -1919,7 +1945,7 @@ finish_this_expr (void)
the TYPE for the type given. If SCOPE is non-NULL, the expression
was of the form `OBJECT.SCOPE::~DESTRUCTOR'. */
-tree
+tree
finish_pseudo_destructor_expr (tree object, tree scope, tree destructor)
{
if (destructor == error_mark_node)
@@ -1934,21 +1960,21 @@ finish_pseudo_destructor_expr (tree object, tree scope, tree destructor)
error ("invalid qualifying scope in pseudo-destructor name");
return error_mark_node;
}
-
+
/* [expr.pseudo] says both:
- The type designated by the pseudo-destructor-name shall be
+ The type designated by the pseudo-destructor-name shall be
the same as the object type.
- and:
+ and:
- The cv-unqualified versions of the object type and of the
+ The cv-unqualified versions of the object type and of the
type designated by the pseudo-destructor-name shall be the
same type.
- We implement the more generous second sentence, since that is
- what most other compilers do. */
- if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (object),
+ We implement the more generous second sentence, since that is
+ what most other compilers do. */
+ if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (object),
destructor))
{
error ("%qE is not of type %qT", object, destructor);
@@ -2021,7 +2047,7 @@ tree
finish_fname (tree id)
{
tree decl;
-
+
decl = fname_decl (C_RID_CODE (id), id);
if (processing_template_decl)
decl = DECL_NAME (decl);
@@ -2030,7 +2056,7 @@ finish_fname (tree id)
/* Finish a translation unit. */
-void
+void
finish_translation_unit (void)
{
/* In case there were missing closebraces,
@@ -2046,7 +2072,7 @@ finish_translation_unit (void)
/* Finish a template type parameter, specified as AGGR IDENTIFIER.
Returns the parameter. */
-tree
+tree
finish_template_type_parm (tree aggr, tree identifier)
{
if (aggr != class_type_node)
@@ -2061,7 +2087,7 @@ finish_template_type_parm (tree aggr, tree identifier)
/* Finish a template template parameter, specified as AGGR IDENTIFIER.
Returns the parameter. */
-tree
+tree
finish_template_template_parm (tree aggr, tree identifier)
{
tree decl = build_decl (TYPE_DECL, identifier, NULL_TREE);
@@ -2093,13 +2119,13 @@ check_template_template_default_arg (tree argument)
/* Try to emit a slightly smarter error message if we detect
that the user is using a template instantiation. */
- if (CLASSTYPE_TEMPLATE_INFO (t)
+ if (CLASSTYPE_TEMPLATE_INFO (t)
&& CLASSTYPE_TEMPLATE_INSTANTIATION (t))
error ("invalid use of type %qT as a default value for a "
- "template template-parameter", t);
+ "template template-parameter", t);
else
error ("invalid use of %qD as a default value for a template "
- "template-parameter", argument);
+ "template-parameter", argument);
}
else
error ("invalid default argument for a template template parameter");
@@ -2125,7 +2151,7 @@ begin_class_definition (tree t)
/* A non-implicit typename comes from code like:
template <typename T> struct A {
- template <typename U> struct A<T>::B ...
+ template <typename U> struct A<T>::B ...
This is erroneous. */
else if (TREE_CODE (t) == TYPENAME_TYPE)
@@ -2142,7 +2168,7 @@ begin_class_definition (tree t)
/* Update the location of the decl. */
DECL_SOURCE_LOCATION (TYPE_NAME (t)) = input_location;
-
+
if (TYPE_BEING_DEFINED (t))
{
t = make_aggr_type (TREE_CODE (t));
@@ -2172,7 +2198,7 @@ begin_class_definition (tree t)
(t, finfo->interface_unknown);
}
reset_specialization();
-
+
/* Make a declaration for this class in its own scope. */
build_self_reference ();
@@ -2196,9 +2222,9 @@ finish_member_declaration (tree decl)
gcc_assert (TREE_CHAIN (decl) == NULL_TREE);
/* Set up access control for DECL. */
- TREE_PRIVATE (decl)
+ TREE_PRIVATE (decl)
= (current_access_specifier == access_private_node);
- TREE_PROTECTED (decl)
+ TREE_PROTECTED (decl)
= (current_access_specifier == access_protected_node);
if (TREE_CODE (decl) == TEMPLATE_DECL)
{
@@ -2219,21 +2245,21 @@ finish_member_declaration (tree decl)
/* Put functions on the TYPE_METHODS list and everything else on the
TYPE_FIELDS list. Note that these are built up in reverse order.
We reverse them (to obtain declaration order) in finish_struct. */
- if (TREE_CODE (decl) == FUNCTION_DECL
+ if (TREE_CODE (decl) == FUNCTION_DECL
|| DECL_FUNCTION_TEMPLATE_P (decl))
{
/* We also need to add this function to the
CLASSTYPE_METHOD_VEC. */
- add_method (current_class_type, decl);
+ add_method (current_class_type, decl, NULL_TREE);
TREE_CHAIN (decl) = TYPE_METHODS (current_class_type);
TYPE_METHODS (current_class_type) = decl;
- maybe_add_class_template_decl_list (current_class_type, decl,
+ maybe_add_class_template_decl_list (current_class_type, decl,
/*friend_p=*/0);
}
/* Enter the DECL into the scope of the class. */
- else if ((TREE_CODE (decl) == USING_DECL && TREE_TYPE (decl))
+ else if ((TREE_CODE (decl) == USING_DECL && !DECL_DEPENDENT_P (decl))
|| pushdecl_class_level (decl))
{
/* All TYPE_DECLs go at the end of TYPE_FIELDS. Ordinary fields
@@ -2254,7 +2280,7 @@ finish_member_declaration (tree decl)
list.) */
if (TREE_CODE (decl) == TYPE_DECL)
- TYPE_FIELDS (current_class_type)
+ TYPE_FIELDS (current_class_type)
= chainon (TYPE_FIELDS (current_class_type), decl);
else
{
@@ -2262,7 +2288,7 @@ finish_member_declaration (tree decl)
TYPE_FIELDS (current_class_type) = decl;
}
- maybe_add_class_template_decl_list (current_class_type, decl,
+ maybe_add_class_template_decl_list (current_class_type, decl,
/*friend_p=*/0);
}
@@ -2293,7 +2319,7 @@ note_decl_for_pch (tree decl)
comdat_linkage (decl);
DECL_INTERFACE_KNOWN (decl) = 1;
}
-
+
/* There's a good chance that we'll have to mangle names at some
point, even if only for emission in debugging information. */
if (TREE_CODE (decl) == VAR_DECL
@@ -2339,7 +2365,7 @@ finish_template_type (tree name, tree args, int entering_scope)
access_{default,public,protected_private}_node. For a virtual base
we set TREE_TYPE. */
-tree
+tree
finish_base_specifier (tree base, tree access, bool virtual_p)
{
tree result;
@@ -2354,10 +2380,10 @@ finish_base_specifier (tree base, tree access, bool virtual_p)
else
{
if (cp_type_quals (base) != 0)
- {
- error ("base class %qT has cv qualifiers", base);
- base = TYPE_MAIN_VARIANT (base);
- }
+ {
+ error ("base class %qT has cv qualifiers", base);
+ base = TYPE_MAIN_VARIANT (base);
+ }
result = build_tree_list (access, base);
if (virtual_p)
TREE_TYPE (result) = integer_type_node;
@@ -2389,12 +2415,12 @@ qualified_name_lookup_error (tree scope, tree name, tree decl)
else
error ("%<::%D%> has not been declared", name);
}
-
+
/* ID_EXPRESSION is a representation of parsed, but unprocessed,
id-expression. (See cp_parser_id_expression for details.) SCOPE,
if non-NULL, is the type or namespace used to explicitly qualify
ID_EXPRESSION. DECL is the entity to which that name has been
- resolved.
+ resolved.
*CONSTANT_EXPRESSION_P is true if we are presently parsing a
constant-expression. In that case, *NON_CONSTANT_EXPRESSION_P will
@@ -2413,12 +2439,12 @@ qualified_name_lookup_error (tree scope, tree name, tree decl)
Return an expression for the entity, after issuing appropriate
diagnostics. This function is also responsible for transforming a
reference to a non-static member into a COMPONENT_REF that makes
- the use of "this" explicit.
+ the use of "this" explicit.
Upon return, *IDK will be filled in appropriately. */
tree
-finish_id_expression (tree id_expression,
+finish_id_expression (tree id_expression,
tree decl,
tree scope,
cp_id_kind *idk,
@@ -2441,13 +2467,13 @@ finish_id_expression (tree id_expression,
|| TREE_CODE (decl) == TYPE_DECL)
;
/* Look up the name. */
- else
+ else
{
if (decl == error_mark_node)
{
/* Name lookup failed. */
- if (scope
- && (!TYPE_P (scope)
+ if (scope
+ && (!TYPE_P (scope)
|| (!dependent_type_p (scope)
&& !(TREE_CODE (id_expression) == IDENTIFIER_NODE
&& IDENTIFIER_TYPENAME_P (id_expression)
@@ -2503,13 +2529,13 @@ finish_id_expression (tree id_expression,
|| TREE_CODE (decl) == TEMPLATE_PARM_INDEX)
{
tree r;
-
+
*idk = CP_ID_KIND_NONE;
if (TREE_CODE (decl) == TEMPLATE_PARM_INDEX)
decl = TEMPLATE_PARM_DECL (decl);
r = convert_from_reference (DECL_INITIAL (decl));
-
- if (integral_constant_expression_p
+
+ if (integral_constant_expression_p
&& !dependent_type_p (TREE_TYPE (decl))
&& !(INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (r))))
{
@@ -2521,7 +2547,7 @@ finish_id_expression (tree id_expression,
}
return r;
}
- /* Similarly, we resolve enumeration constants to their
+ /* Similarly, we resolve enumeration constants to their
underlying values. */
else if (TREE_CODE (decl) == CONST_DECL)
{
@@ -2537,7 +2563,7 @@ finish_id_expression (tree id_expression,
/* If the declaration was explicitly qualified indicate
that. The semantics of `A::f(3)' are different than
`f(3)' if `f' is virtual. */
- *idk = (scope
+ *idk = (scope
? CP_ID_KIND_QUALIFIED
: (TREE_CODE (decl) == TEMPLATE_ID_EXPR
? CP_ID_KIND_TEMPLATE_ID
@@ -2561,13 +2587,13 @@ finish_id_expression (tree id_expression,
/* A template-id where the name of the template was not resolved
is definitely dependent. */
else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
- && (TREE_CODE (TREE_OPERAND (decl, 0))
+ && (TREE_CODE (TREE_OPERAND (decl, 0))
== IDENTIFIER_NODE))
dependent_p = true;
/* For anything except an overloaded function, just check its
type. */
else if (!is_overloaded_fn (decl))
- dependent_p
+ dependent_p
= dependent_type_p (TREE_TYPE (decl));
/* For a set of overloaded functions, check each of the
functions. */
@@ -2660,8 +2686,8 @@ finish_id_expression (tree id_expression,
}
/* Only certain kinds of names are allowed in constant
- expression. Enumerators and template parameters have already
- been handled above. */
+ expression. Enumerators and template parameters have already
+ been handled above. */
if (integral_constant_expression_p
&& ! DECL_INTEGRAL_CONSTANT_VAR_P (decl)
&& ! builtin_valid_in_constant_expr_p (decl))
@@ -2673,7 +2699,7 @@ finish_id_expression (tree id_expression,
}
*non_integral_constant_expression_p = true;
}
-
+
if (TREE_CODE (decl) == NAMESPACE_DECL)
{
error ("use of namespace %qD as expression", decl);
@@ -2702,7 +2728,7 @@ finish_id_expression (tree id_expression,
if (scope)
{
- decl = (adjust_result_of_qualified_name_lookup
+ decl = (adjust_result_of_qualified_name_lookup
(decl, scope, current_class_type));
if (TREE_CODE (decl) == FUNCTION_DECL)
@@ -2713,7 +2739,7 @@ finish_id_expression (tree id_expression,
else
{
tree r = convert_from_reference (decl);
-
+
if (processing_template_decl
&& TYPE_P (scope))
r = build2 (SCOPE_REF, TREE_TYPE (r), scope, decl);
@@ -2756,31 +2782,31 @@ finish_id_expression (tree id_expression,
|| TREE_CODE (decl) == RESULT_DECL)
{
tree context = decl_function_context (decl);
-
+
if (context != NULL_TREE && context != current_function_decl
&& ! TREE_STATIC (decl))
{
- error ("use of %s from containing function",
- (TREE_CODE (decl) == VAR_DECL
- ? "%<auto%> variable" : "parameter"));
+ error (TREE_CODE (decl) == VAR_DECL
+ ? "use of %<auto%> variable from containing function"
+ : "use of parameter from containing function");
cp_error_at (" %q#D declared here", decl);
return error_mark_node;
}
}
-
+
if (DECL_P (decl) && DECL_NONLOCAL (decl)
&& DECL_CLASS_SCOPE_P (decl)
&& DECL_CONTEXT (decl) != current_class_type)
{
tree path;
-
+
path = currently_open_derived_class (DECL_CONTEXT (decl));
perform_or_defer_access_check (TYPE_BINFO (path), decl);
}
-
+
decl = convert_from_reference (decl);
}
-
+
/* Resolve references to variables of anonymous unions
into COMPONENT_REFs. */
if (TREE_CODE (decl) == ALIAS_DECL)
@@ -2824,9 +2850,9 @@ finish_typeof (tree expr)
with equivalent CALL_EXPRs. */
static tree
-simplify_aggr_init_exprs_r (tree* tp,
- int* walk_subtrees,
- void* data ATTRIBUTE_UNUSED)
+simplify_aggr_init_exprs_r (tree* tp,
+ int* walk_subtrees,
+ void* data ATTRIBUTE_UNUSED)
{
/* We don't need to walk into types; there's nothing in a type that
needs simplification. (And, furthermore, there are places we
@@ -2893,7 +2919,7 @@ simplify_aggr_init_expr (tree *tp)
{
/* The return type might have different cv-quals from the slot. */
tree fntype = TREE_TYPE (TREE_TYPE (fn));
-
+
gcc_assert (TREE_CODE (fntype) == FUNCTION_TYPE
|| TREE_CODE (fntype) == METHOD_TYPE);
addr = convert (build_pointer_type (TREE_TYPE (fntype)), addr);
@@ -2902,7 +2928,7 @@ simplify_aggr_init_expr (tree *tp)
args = tree_cons (NULL_TREE, addr, args);
}
- call_expr = build3 (CALL_EXPR,
+ call_expr = build3 (CALL_EXPR,
TREE_TYPE (TREE_TYPE (TREE_TYPE (fn))),
fn, args, NULL_TREE);
@@ -2937,7 +2963,7 @@ emit_associated_thunks (tree fn)
if (DECL_VIRTUAL_P (fn))
{
tree thunk;
-
+
for (thunk = DECL_THUNKS (fn); thunk; thunk = TREE_CHAIN (thunk))
{
if (!THUNK_ALIAS (thunk))
@@ -2946,7 +2972,7 @@ emit_associated_thunks (tree fn)
if (DECL_RESULT_THUNK_P (thunk))
{
tree probe;
-
+
for (probe = DECL_THUNKS (thunk);
probe; probe = TREE_CHAIN (probe))
use_thunk (probe, /*emit_p=*/1);
@@ -2996,9 +3022,9 @@ expand_body (tree fn)
if (DECL_CLONED_FUNCTION_P (fn))
{
/* If this is a clone, go through the other clones now and mark
- their parameters used. We have to do that here, as we don't
- know whether any particular clone will be expanded, and
- therefore cannot pick one arbitrarily. */
+ their parameters used. We have to do that here, as we don't
+ know whether any particular clone will be expanded, and
+ therefore cannot pick one arbitrarily. */
tree probe;
for (probe = TREE_CHAIN (DECL_CLONED_FUNCTION (fn));
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 114275cd419..06b8532d23d 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -59,7 +59,7 @@ static tree handle_init_priority_attribute (tree *, tree, tree, int, bool *);
static cp_lvalue_kind
lvalue_p_1 (tree ref,
- int treat_class_rvalues_as_lvalues)
+ int treat_class_rvalues_as_lvalues)
{
cp_lvalue_kind op1_lvalue_kind = clk_none;
cp_lvalue_kind op2_lvalue_kind = clk_none;
@@ -93,9 +93,9 @@ lvalue_p_1 (tree ref,
/* Look at the member designator. */
if (!op1_lvalue_kind
/* The "field" can be a FUNCTION_DECL or an OVERLOAD in some
- situations. */
- || TREE_CODE (TREE_OPERAND (ref, 1)) != FIELD_DECL)
- ;
+ situations. */
+ || TREE_CODE (TREE_OPERAND (ref, 1)) != FIELD_DECL)
+ ;
else if (DECL_C_BIT_FIELD (TREE_OPERAND (ref, 1)))
{
/* Clear the ordinary bit. If this object was a class
@@ -225,9 +225,7 @@ builtin_valid_in_constant_expr_p (tree decl)
{
/* At present BUILT_IN_CONSTANT_P is the only builtin we're allowing
in constant-expressions. We may want to add other builtins later. */
- return TREE_CODE (decl) == FUNCTION_DECL
- && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
- && DECL_FUNCTION_CODE (decl) == BUILT_IN_CONSTANT_P;
+ return DECL_IS_BUILTIN_CONSTANT_P (decl);
}
/* Build a TARGET_EXPR, initializing the DECL with the VALUE. */
@@ -435,8 +433,8 @@ build_cplus_array_type (tree elt_type, tree index_type)
tree
cp_build_qualified_type_real (tree type,
- int type_quals,
- tsubst_flags_t complain)
+ int type_quals,
+ tsubst_flags_t complain)
{
tree result;
int bad_quals = TYPE_UNQUALIFIED;
@@ -530,17 +528,17 @@ cp_build_qualified_type_real (tree type,
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;
+ /* We're not going to warn about constifying things that can't
+ be constified. */
+ bad_quals &= ~TYPE_QUAL_CONST;
if (bad_quals)
- {
- tree bad_type = build_qualified_type (ptr_type_node, bad_quals);
+ {
+ tree bad_type = build_qualified_type (ptr_type_node, bad_quals);
- if (!(complain & tf_ignore_bad_quals))
- error ("%qV qualifiers cannot be applied to %qT",
+ if (!(complain & tf_ignore_bad_quals))
+ error ("%qV qualifiers cannot be applied to %qT",
bad_type, type);
- }
+ }
}
/* Retrieve (or create) the appropriately qualified variant. */
@@ -901,7 +899,7 @@ build_exception_variant (tree type, tree raises)
for (; v; v = TYPE_NEXT_VARIANT (v))
if (check_qualified_type (v, type, type_quals)
- && comp_except_specs (raises, TYPE_RAISES_EXCEPTIONS (v), 1))
+ && comp_except_specs (raises, TYPE_RAISES_EXCEPTIONS (v), 1))
return v;
/* Need to build a new variant. */
@@ -967,8 +965,8 @@ count_trees (tree t)
static tree
verify_stmt_tree_r (tree* tp,
- int* walk_subtrees ATTRIBUTE_UNUSED ,
- void* data)
+ int* walk_subtrees ATTRIBUTE_UNUSED ,
+ void* data)
{
tree t = *tp;
htab_t *statements = (htab_t *) data;
@@ -1004,8 +1002,8 @@ verify_stmt_tree (tree t)
static tree
find_tree_r (tree* tp,
- int* walk_subtrees ATTRIBUTE_UNUSED ,
- void* data)
+ int* walk_subtrees ATTRIBUTE_UNUSED ,
+ void* data)
{
if (*tp == (tree) data)
return (tree) data;
@@ -1148,8 +1146,8 @@ bot_manip (tree* tp, int* walk_subtrees, void* data)
if (!TYPE_P (t) && TREE_CONSTANT (t))
{
/* There can't be any TARGET_EXPRs or their slot variables below
- this point. We used to check !TREE_SIDE_EFFECTS, but then we
- failed to copy an ADDR_EXPR of the slot VAR_DECL. */
+ this point. We used to check !TREE_SIDE_EFFECTS, but then we
+ failed to copy an ADDR_EXPR of the slot VAR_DECL. */
*walk_subtrees = 0;
return NULL_TREE;
}
@@ -1195,8 +1193,8 @@ bot_manip (tree* tp, int* walk_subtrees, void* data)
static tree
bot_replace (tree* t,
- int* walk_subtrees ATTRIBUTE_UNUSED ,
- void* data)
+ int* walk_subtrees ATTRIBUTE_UNUSED ,
+ void* data)
{
splay_tree target_remap = ((splay_tree) data);
@@ -1644,8 +1642,8 @@ maybe_dummy_object (tree type, tree* 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. */
+ correct. It might not be if we're in the middle of
+ tsubst_default_argument. */
&& same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (current_class_ref)),
current_class_type))
decl = current_class_ref;
@@ -1724,17 +1722,17 @@ const struct attribute_spec cxx_attribute_table[] =
{ "java_interface", 0, 0, false, false, false, handle_java_interface_attribute },
{ "com_interface", 0, 0, false, false, false, handle_com_interface_attribute },
{ "init_priority", 1, 1, true, false, false, handle_init_priority_attribute },
- { NULL, 0, 0, false, false, false, NULL }
+ { NULL, 0, 0, false, false, false, NULL }
};
/* Handle a "java_interface" attribute; arguments as in
struct attribute_spec.handler. */
static tree
handle_java_interface_attribute (tree* node,
- tree name,
- tree args ATTRIBUTE_UNUSED ,
- int flags,
- bool* no_add_attrs)
+ tree name,
+ tree args ATTRIBUTE_UNUSED ,
+ int flags,
+ bool* no_add_attrs)
{
if (DECL_P (*node)
|| !CLASS_TYPE_P (*node)
@@ -1756,10 +1754,10 @@ handle_java_interface_attribute (tree* node,
struct attribute_spec.handler. */
static tree
handle_com_interface_attribute (tree* node,
- tree name,
- tree args ATTRIBUTE_UNUSED ,
- int flags ATTRIBUTE_UNUSED ,
- bool* no_add_attrs)
+ tree name,
+ tree args ATTRIBUTE_UNUSED ,
+ int flags ATTRIBUTE_UNUSED ,
+ bool* no_add_attrs)
{
static int warned;
@@ -1769,7 +1767,8 @@ handle_com_interface_attribute (tree* node,
|| !CLASS_TYPE_P (*node)
|| *node != TYPE_MAIN_VARIANT (*node))
{
- warning (0, "%qE attribute can only be applied to class definitions", name);
+ warning (OPT_Wattributes, "%qE attribute can only be applied "
+ "to class definitions", name);
return NULL_TREE;
}
@@ -1784,10 +1783,10 @@ handle_com_interface_attribute (tree* node,
struct attribute_spec.handler. */
static tree
handle_init_priority_attribute (tree* node,
- tree name,
- tree args,
- int flags ATTRIBUTE_UNUSED ,
- bool* no_add_attrs)
+ tree name,
+ tree args,
+ int flags ATTRIBUTE_UNUSED ,
+ bool* no_add_attrs)
{
tree initp_expr = TREE_VALUE (args);
tree decl = *node;
@@ -1820,7 +1819,7 @@ handle_init_priority_attribute (tree* node,
|| current_function_decl)
{
error ("can only use %qE attribute on file-scope definitions "
- "of objects of class type", name);
+ "of objects of class type", name);
*no_add_attrs = true;
return NULL_TREE;
}
@@ -1922,7 +1921,7 @@ cp_walk_subtrees (tree *tp, int *walk_subtrees_p, walk_tree_fn func,
case TYPEOF_TYPE:
case BASELINK:
/* None of these have subtrees other than those already walked
- above. */
+ above. */
*walk_subtrees_p = 0;
break;
@@ -2267,7 +2266,14 @@ fold_if_not_in_template (tree expr)
"fold". We will call fold later when actually instantiating the
template. Integral constant expressions in templates will be
evaluated via fold_non_dependent_expr, as necessary. */
- return (processing_template_decl ? expr : fold (expr));
+ if (processing_template_decl)
+ return expr;
+
+ /* Fold C++ front-end specific tree codes. */
+ if (TREE_CODE (expr) == UNARY_PLUS_EXPR)
+ return fold_convert (TREE_TYPE (expr), TREE_OPERAND (expr, 0));
+
+ return fold (expr);
}
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 319e8ad6e35..58ba0798aae 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -247,11 +247,13 @@ type_after_usual_arithmetic_conversions (tree t1, tree t2)
tree attributes;
/* FIXME: Attributes. */
- gcc_assert (ARITHMETIC_TYPE_P (t1)
+ gcc_assert (ARITHMETIC_TYPE_P (t1)
|| TREE_CODE (t1) == COMPLEX_TYPE
+ || TREE_CODE (t1) == VECTOR_TYPE
|| TREE_CODE (t1) == ENUMERAL_TYPE);
- gcc_assert (ARITHMETIC_TYPE_P (t2)
+ gcc_assert (ARITHMETIC_TYPE_P (t2)
|| TREE_CODE (t2) == COMPLEX_TYPE
+ || TREE_CODE (t1) == VECTOR_TYPE
|| TREE_CODE (t2) == ENUMERAL_TYPE);
/* In what follows, we slightly generalize the rules given in [expr] so
@@ -278,6 +280,16 @@ type_after_usual_arithmetic_conversions (tree t1, tree t2)
attributes);
}
+ if (code1 == VECTOR_TYPE)
+ {
+ /* When we get here we should have two vectors of the same size.
+ Just prefer the unsigned one if present. */
+ if (TYPE_UNSIGNED (t1))
+ return build_type_attribute_variant (t1, attributes);
+ else
+ return build_type_attribute_variant (t2, attributes);
+ }
+
/* If only one is real, use it as the result. */
if (code1 == REAL_TYPE && code2 != REAL_TYPE)
return build_type_attribute_variant (t1, attributes);
@@ -320,7 +332,7 @@ type_after_usual_arithmetic_conversions (tree t1, tree t2)
convert to a long long. Otherwise, convert to an unsigned long
long. Otherwise, if either operand is long long, convert the
other to long long.
-
+
Since we're here, we know the TYPE_PRECISION is the same;
therefore converting to long long cannot represent all the values
of an unsigned long, so we choose unsigned long long in that
@@ -329,11 +341,11 @@ type_after_usual_arithmetic_conversions (tree t1, tree t2)
|| same_type_p (TYPE_MAIN_VARIANT (t2), long_long_integer_type_node))
{
tree t = ((TYPE_UNSIGNED (t1) || TYPE_UNSIGNED (t2))
- ? long_long_unsigned_type_node
+ ? long_long_unsigned_type_node
: long_long_integer_type_node);
return build_type_attribute_variant (t, attributes);
}
-
+
/* Go through the same procedure, but for longs. */
if (same_type_p (TYPE_MAIN_VARIANT (t1), long_unsigned_type_node)
|| same_type_p (TYPE_MAIN_VARIANT (t2), long_unsigned_type_node))
@@ -366,12 +378,12 @@ type_after_usual_arithmetic_conversions (tree t1, tree t2)
|| same_type_p (TYPE_MAIN_VARIANT (t2), float_type_node))
return build_type_attribute_variant (float_type_node,
attributes);
-
+
/* Two floating-point types whose TYPE_MAIN_VARIANTs are none of
- the standard C++ floating-point types. Logic earlier in this
- function has already eliminated the possibility that
- TYPE_PRECISION (t2) != TYPE_PRECISION (t1), so there's no
- compelling reason to choose one or the other. */
+ the standard C++ floating-point types. Logic earlier in this
+ function has already eliminated the possibility that
+ TYPE_PRECISION (t2) != TYPE_PRECISION (t1), so there's no
+ compelling reason to choose one or the other. */
return build_type_attribute_variant (t1, attributes);
}
}
@@ -445,12 +457,12 @@ composite_pointer_type_r (tree t1, tree t2, const char* location)
/* Return the composite pointer type (see [expr.rel]) for T1 and T2.
ARG1 and ARG2 are the values with those types. The LOCATION is a
- string describing the current location, in case an error occurs.
+ string describing the current location, in case an error occurs.
This routine also implements the computation of a common type for
pointers-to-members as per [expr.eq]. */
-tree
+tree
composite_pointer_type (tree t1, tree t2, tree arg1, tree arg2,
const char* location)
{
@@ -465,7 +477,7 @@ composite_pointer_type (tree t1, tree t2, tree arg1, tree arg2,
return t2;
if (null_ptr_cst_p (arg2))
return t1;
-
+
/* We have:
[expr.rel]
@@ -492,8 +504,8 @@ composite_pointer_type (tree t1, tree t2, tree arg1, tree arg2,
if (pedantic && TYPE_PTRFN_P (t2))
pedwarn ("ISO C++ forbids %s between pointer of type %<void *%> "
- "and pointer-to-function", location);
- result_type
+ "and pointer-to-function", location);
+ result_type
= cp_build_qualified_type (void_type_node,
(cp_type_quals (TREE_TYPE (t1))
| cp_type_quals (TREE_TYPE (t2))));
@@ -503,6 +515,13 @@ composite_pointer_type (tree t1, tree t2, tree arg1, tree arg2,
return build_type_attribute_variant (result_type, attributes);
}
+ if (c_dialect_objc () && TREE_CODE (t1) == POINTER_TYPE
+ && TREE_CODE (t2) == POINTER_TYPE)
+ {
+ if (objc_compare_types (t1, t2, -3, NULL_TREE))
+ return t1;
+ }
+
/* [expr.eq] permits the application of a pointer conversion to
bring the pointers to a common type. */
if (TREE_CODE (t1) == POINTER_TYPE && TREE_CODE (t2) == POINTER_TYPE
@@ -514,13 +533,11 @@ composite_pointer_type (tree t1, tree t2, tree arg1, tree arg2,
class1 = TREE_TYPE (t1);
class2 = TREE_TYPE (t2);
- if (DERIVED_FROM_P (class1, class2) ||
- (c_dialect_objc () && objc_comptypes (class1, class2, 0) == 1))
- t2 = (build_pointer_type
+ if (DERIVED_FROM_P (class1, class2))
+ t2 = (build_pointer_type
(cp_build_qualified_type (class1, TYPE_QUALS (class2))));
- else if (DERIVED_FROM_P (class2, class1) ||
- (c_dialect_objc () && objc_comptypes (class2, class1, 0) == 1))
- t1 = (build_pointer_type
+ else if (DERIVED_FROM_P (class2, class1))
+ t1 = (build_pointer_type
(cp_build_qualified_type (class2, TYPE_QUALS (class1))));
else
{
@@ -730,9 +747,9 @@ common_type (tree t1, tree t2)
code2 = TREE_CODE (t2);
if ((ARITHMETIC_TYPE_P (t1) || code1 == ENUMERAL_TYPE
- || code1 == COMPLEX_TYPE)
+ || code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE)
&& (ARITHMETIC_TYPE_P (t2) || code2 == ENUMERAL_TYPE
- || code2 == COMPLEX_TYPE))
+ || code2 == COMPLEX_TYPE || code2 == VECTOR_TYPE))
return type_after_usual_arithmetic_conversions (t1, t2);
else if ((TYPE_PTR_P (t1) && TYPE_PTR_P (t2))
@@ -747,7 +764,7 @@ common_type (tree t1, tree t2)
/* Compare two exception specifier types for exactness or subsetness, if
allowed. Returns false for mismatch, true for match (same, or
derived and !exact).
-
+
[except.spec] "If a class X ... objects of class X or any class publicly
and unambiguously derived from X. Similarly, if a pointer type Y * ...
exceptions of type Y * or that are pointers to any type publicly and
@@ -757,7 +774,7 @@ common_type (tree t1, tree t2)
[except.throw] and catch [except.catch] will do. They will ignore the
top level cv qualifiers, and allow qualifiers in the pointer to class
example.
-
+
We implement the letter of the standard. */
static bool
@@ -768,23 +785,23 @@ comp_except_types (tree a, tree b, bool exact)
else if (!exact)
{
if (cp_type_quals (a) || cp_type_quals (b))
- return false;
-
+ return false;
+
if (TREE_CODE (a) == POINTER_TYPE
- && TREE_CODE (b) == POINTER_TYPE)
- {
- a = TREE_TYPE (a);
- b = TREE_TYPE (b);
- if (cp_type_quals (a) || cp_type_quals (b))
- return false;
- }
-
+ && TREE_CODE (b) == POINTER_TYPE)
+ {
+ a = TREE_TYPE (a);
+ b = TREE_TYPE (b);
+ if (cp_type_quals (a) || cp_type_quals (b))
+ return false;
+ }
+
if (TREE_CODE (a) != RECORD_TYPE
- || TREE_CODE (b) != RECORD_TYPE)
- return false;
-
+ || TREE_CODE (b) != RECORD_TYPE)
+ return false;
+
if (PUBLICLY_UNIQUELY_DERIVED_P (a, b))
- return true;
+ return true;
}
return false;
}
@@ -804,16 +821,16 @@ comp_except_specs (tree t1, tree t2, bool exact)
if (t1 == t2)
return true;
-
- if (t1 == NULL_TREE) /* T1 is ... */
+
+ if (t1 == NULL_TREE) /* T1 is ... */
return t2 == NULL_TREE || !exact;
- if (!TREE_VALUE (t1)) /* t1 is EMPTY */
+ 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 false;
if (TREE_VALUE (t1) && !TREE_VALUE (t2)) /* T2 is EMPTY, T1 is not */
return !exact;
-
+
/* Neither set is ... or EMPTY, make sure each part of T2 is in T1.
Count how many we find, to determine exactness. For exact matching and
ordered T1, T2, this is an O(n) operation, otherwise its worst case is
@@ -821,20 +838,20 @@ comp_except_specs (tree t1, tree t2, bool exact)
for (base = t1; t2 != NULL_TREE; t2 = TREE_CHAIN (t2))
{
for (probe = base; probe != NULL_TREE; probe = TREE_CHAIN (probe))
- {
- tree a = TREE_VALUE (probe);
- tree b = TREE_VALUE (t2);
-
- if (comp_except_types (a, b, exact))
- {
- if (probe == base && exact)
- base = TREE_CHAIN (probe);
- length++;
- break;
- }
- }
+ {
+ tree a = TREE_VALUE (probe);
+ tree b = TREE_VALUE (t2);
+
+ if (comp_except_types (a, b, exact))
+ {
+ if (probe == base && exact)
+ base = TREE_CHAIN (probe);
+ length++;
+ break;
+ }
+ }
if (probe == NULL_TREE)
- return false;
+ return false;
}
return !exact || base == NULL_TREE || length == list_length (t1);
}
@@ -869,7 +886,7 @@ comp_array_types (tree t1, tree t2, bool allow_redeclaration)
extern int a[];
int a[3];
- by [basic.link]:
+ by [basic.link]:
declarations for an array object can specify
array types that differ by the presence or absence of a major
@@ -888,9 +905,9 @@ comp_array_types (tree t1, tree t2, bool allow_redeclaration)
&& !value_dependent_expression_p (max2))
{
/* With abi-1 we do not fold non-dependent array bounds, (and
- consequently mangle them incorrectly). We must therefore
- fold them here, to verify the domains have the same
- value. */
+ consequently mangle them incorrectly). We must therefore
+ fold them here, to verify the domains have the same
+ value. */
max1 = fold (max1);
max2 = fold (max2);
}
@@ -913,9 +930,9 @@ comptypes (tree t1, tree t2, int strict)
/* Suppress errors caused by previously reported errors. */
if (t1 == error_mark_node || t2 == error_mark_node)
return false;
-
+
gcc_assert (TYPE_P (t1) && TYPE_P (t2));
-
+
/* TYPENAME_TYPEs should be resolved if the qualifying scope is the
current instantiation. */
if (TREE_CODE (t1) == TYPENAME_TYPE)
@@ -925,7 +942,7 @@ comptypes (tree t1, tree t2, int strict)
if (resolved != error_mark_node)
t1 = resolved;
}
-
+
if (TREE_CODE (t2) == TYPENAME_TYPE)
{
tree resolved = resolve_typename_type (t2, /*only_current_p=*/true);
@@ -994,16 +1011,11 @@ comptypes (tree t1, tree t2, int strict)
|| TREE_CODE (t1) == BOUND_TEMPLATE_TEMPLATE_PARM)
&& comp_template_args (TYPE_TI_ARGS (t1), TYPE_TI_ARGS (t2)))
break;
-
+
if ((strict & COMPARE_BASE) && DERIVED_FROM_P (t1, t2))
break;
else if ((strict & COMPARE_DERIVED) && DERIVED_FROM_P (t2, t1))
break;
-
- /* We may be dealing with Objective-C instances. */
- if (TREE_CODE (t1) == RECORD_TYPE
- && objc_comptypes (t1, t2, 0) > 0)
- break;
return false;
@@ -1046,14 +1058,14 @@ comptypes (tree t1, tree t2, int strict)
case TYPENAME_TYPE:
if (!cp_tree_equal (TYPENAME_TYPE_FULLNAME (t1),
TYPENAME_TYPE_FULLNAME (t2)))
- return false;
+ return false;
if (!same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2)))
return false;
break;
case UNBOUND_CLASS_TEMPLATE:
if (!cp_tree_equal (TYPE_IDENTIFIER (t1), TYPE_IDENTIFIER (t2)))
- return false;
+ return false;
if (!same_type_p (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2)))
return false;
break;
@@ -1086,7 +1098,7 @@ at_least_as_qualified_p (tree type1, tree type2)
{
int q1 = cp_type_quals (type1);
int q2 = cp_type_quals (type2);
-
+
/* All qualifiers for TYPE2 must also appear in TYPE1. */
return (q1 & q2) == q2;
}
@@ -1148,7 +1160,7 @@ common_base_type (tree tt1, tree tt2)
{
tree basetype = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (tt1), i));
tree trial = common_base_type (basetype, tt2);
-
+
if (trial)
{
if (trial == error_mark_node)
@@ -1165,7 +1177,7 @@ common_base_type (tree tt1, tree tt2)
{
tree basetype = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (tt2), i));
tree trial = common_base_type (tt1, basetype);
-
+
if (trial)
{
if (trial == error_mark_node)
@@ -1222,14 +1234,14 @@ cxx_sizeof_or_alignof_type (tree type, enum tree_code op, bool complain)
gcc_assert (op == SIZEOF_EXPR || op == ALIGNOF_EXPR);
if (type == error_mark_node)
return error_mark_node;
-
+
if (dependent_type_p (type))
{
value = build_min (op, size_type_node, type);
TREE_READONLY (value) = 1;
return value;
}
-
+
op_name = operator_name_info[(int) op].name;
type = non_reference (type);
@@ -1256,19 +1268,19 @@ tree
cxx_sizeof_or_alignof_expr (tree e, enum tree_code op)
{
const char *op_name = operator_name_info[(int) op].name;
-
+
if (e == error_mark_node)
return error_mark_node;
-
+
if (processing_template_decl)
{
e = build_min (op, size_type_node, e);
TREE_SIDE_EFFECTS (e) = 0;
TREE_READONLY (e) = 1;
-
+
return e;
}
-
+
if (TREE_CODE (e) == COMPONENT_REF
&& TREE_CODE (TREE_OPERAND (e, 1)) == FIELD_DECL
&& DECL_C_BIT_FIELD (TREE_OPERAND (e, 1)))
@@ -1279,7 +1291,7 @@ cxx_sizeof_or_alignof_expr (tree e, enum tree_code op)
else if (is_overloaded_fn (e))
{
pedwarn ("ISO C++ forbids applying %qs to an expression of "
- "function type", op_name);
+ "function type", op_name);
e = char_type_node;
}
else if (type_unknown_p (e))
@@ -1289,23 +1301,23 @@ cxx_sizeof_or_alignof_expr (tree e, enum tree_code op)
}
else
e = TREE_TYPE (e);
-
+
return cxx_sizeof_or_alignof_type (e, op, true);
}
-
+
/* EXPR is being used in a context that is not a function call.
Enforce:
- [expr.ref]
+ [expr.ref]
The expression can be used only as the left-hand operand of a
- member function call.
+ member function call.
[expr.mptr.operator]
If the result of .* or ->* is a function, then that result can be
- used only as the operand for the function call operator ().
+ used only as the operand for the function call operator ().
by issuing an error message if appropriate. Returns true iff EXPR
violates these rules. */
@@ -1346,7 +1358,7 @@ decay_conversion (tree exp)
}
exp = integral_constant_value (exp);
-
+
/* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
Leave such NOP_EXPRs, since RHS is being used in non-lvalue context. */
@@ -1365,7 +1377,7 @@ decay_conversion (tree exp)
tree ptrtype;
if (TREE_CODE (exp) == INDIRECT_REF)
- return build_nop (build_pointer_type (TREE_TYPE (type)),
+ return build_nop (build_pointer_type (TREE_TYPE (type)),
TREE_OPERAND (exp, 0));
if (TREE_CODE (exp) == COMPOUND_EXPR)
@@ -1563,7 +1575,7 @@ lookup_anon_field (tree t, tree type)
non-NULL, it indicates the path to the base used to name MEMBER.
If PRESERVE_REFERENCE is true, the expression returned will have
REFERENCE_TYPE if the MEMBER does. Otherwise, the expression
- returned will have the type referred to by the reference.
+ returned will have the type referred to by the reference.
This function does not perform access control; that is either done
earlier by the parser when the name of MEMBER is resolved to MEMBER
@@ -1571,7 +1583,7 @@ lookup_anon_field (tree t, tree type)
functions indicated by MEMBER. */
tree
-build_class_member_access_expr (tree object, tree member,
+build_class_member_access_expr (tree object, tree member,
tree access_path, bool preserve_reference)
{
tree object_type;
@@ -1588,12 +1600,12 @@ build_class_member_access_expr (tree object, tree member,
The type of the first expression shall be "class object" (of a
complete type). */
object_type = TREE_TYPE (object);
- if (!currently_open_class (object_type)
+ if (!currently_open_class (object_type)
&& !complete_type_or_else (object_type, object))
return error_mark_node;
if (!CLASS_TYPE_P (object_type))
{
- error ("request for member %qD in %qE, which is of non-class type %qT",
+ error ("request for member %qD in %qE, which is of non-class type %qT",
member, object, object_type);
return error_mark_node;
}
@@ -1620,9 +1632,9 @@ build_class_member_access_expr (tree object, tree member,
if (!member_scope || !DERIVED_FROM_P (member_scope, object_type))
{
if (TREE_CODE (member) == FIELD_DECL)
- error ("invalid use of nonstatic data member %qE", member);
+ error ("invalid use of nonstatic data member %qE", member);
else
- error ("%qD is not a member of %qT", member, object_type);
+ error ("%qD is not a member of %qT", member, object_type);
return error_mark_node;
}
@@ -1673,14 +1685,14 @@ build_class_member_access_expr (tree object, tree member,
if (null_object_p && kind == bk_via_virtual)
{
error ("invalid access to non-static data member %qD of "
- "NULL object",
+ "NULL object",
member);
error ("(perhaps the %<offsetof%> macro was used incorrectly)");
return error_mark_node;
}
/* Convert to the base. */
- object = build_base_path (PLUS_EXPR, object, binfo,
+ object = build_base_path (PLUS_EXPR, object, binfo,
/*nonnull=*/1);
/* If we found the base successfully then we should be able
to convert to it successfully. */
@@ -1700,7 +1712,7 @@ build_class_member_access_expr (tree object, tree member,
&& !DECL_FIELD_IS_BASE (member)
&& !skip_evaluation)
{
- warning (0, "invalid access to non-static data member %qD of NULL object",
+ warning (0, "invalid access to non-static data member %qD of NULL object",
member);
warning (0, "(perhaps the %<offsetof%> macro was used incorrectly)");
}
@@ -1716,7 +1728,7 @@ build_class_member_access_expr (tree object, tree member,
constructed, and was then disassembled before calling
build_field_call. After the function-call code is
cleaned up, this waste can be eliminated. */
- && (!same_type_ignoring_top_level_qualifiers_p
+ && (!same_type_ignoring_top_level_qualifiers_p
(TREE_TYPE (object), DECL_CONTEXT (member))))
{
tree anonymous_union;
@@ -1734,9 +1746,9 @@ build_class_member_access_expr (tree object, tree member,
member_type = TREE_TYPE (member);
if (TREE_CODE (member_type) != REFERENCE_TYPE)
{
- type_quals = (cp_type_quals (member_type)
+ type_quals = (cp_type_quals (member_type)
| cp_type_quals (object_type));
-
+
/* A field is const (volatile) if the enclosing object, or the
field itself, is const (volatile). But, a mutable field is
not const, even within a const object. */
@@ -1793,7 +1805,7 @@ build_class_member_access_expr (tree object, tree member,
if (!preserve_reference)
/* [expr.ref]
-
+
If E2 is declared to have type "reference to T", then ... the
type of E1.E2 is T. */
result = convert_from_reference (result);
@@ -1877,17 +1889,17 @@ finish_class_member_access_expr (tree object, tree name)
return build_min_nt (COMPONENT_REF, object, name, NULL_TREE);
object = build_non_dependent_expr (object);
}
-
+
/* [expr.ref]
The type of the first expression shall be "class object" (of a
complete type). */
- if (!currently_open_class (object_type)
+ if (!currently_open_class (object_type)
&& !complete_type_or_else (object_type, object))
return error_mark_node;
if (!CLASS_TYPE_P (object_type))
{
- error ("request for member %qD in %qE, which is of non-class type %qT",
+ error ("request for member %qD in %qE, which is of non-class type %qT",
name, object, object_type);
return error_mark_node;
}
@@ -1933,7 +1945,7 @@ finish_class_member_access_expr (tree object, tree name)
name a member of OBJECT_TYPE. */
if (TREE_CODE (scope) == NAMESPACE_DECL)
{
- error ("%<%D::%D%> is not a member of %qT",
+ error ("%<%D::%D%> is not a member of %qT",
scope, name, object_type);
return error_mark_node;
}
@@ -1959,7 +1971,7 @@ finish_class_member_access_expr (tree object, tree name)
else
{
/* Look up the member. */
- member = lookup_member (access_path, name, /*protect=*/1,
+ member = lookup_member (access_path, name, /*protect=*/1,
/*want_type=*/false);
if (member == NULL_TREE)
{
@@ -1969,11 +1981,11 @@ finish_class_member_access_expr (tree object, tree name)
if (member == error_mark_node)
return error_mark_node;
}
-
+
if (is_template_id)
{
tree template = member;
-
+
if (BASELINK_P (template))
template = lookup_template_function (template, template_args);
else
@@ -2072,22 +2084,22 @@ build_indirect_ref (tree ptr, const char *errorstring)
if (POINTER_TYPE_P (type))
{
/* [expr.unary.op]
-
+
If the type of the expression is "pointer to T," the type
- of the result is "T."
+ of the result is "T."
- We must use the canonical variant because certain parts of
+ We must use the canonical variant because certain parts of
the back end, like fold, do pointer comparisons between
types. */
tree t = canonical_type_variant (TREE_TYPE (type));
if (VOID_TYPE_P (t))
- {
- /* A pointer to incomplete type (other than cv void) can be
- dereferenced [expr.unary.op]/1 */
- error ("%qT is not a pointer-to-object type", type);
- return error_mark_node;
- }
+ {
+ /* A pointer to incomplete type (other than cv void) can be
+ dereferenced [expr.unary.op]/1 */
+ error ("%qT is not a pointer-to-object type", type);
+ return error_mark_node;
+ }
else if (TREE_CODE (pointer) == ADDR_EXPR
&& same_type_p (t, TREE_TYPE (TREE_OPERAND (pointer, 0))))
/* The POINTER was something like `&x'. We simplify `*&x' to
@@ -2346,14 +2358,23 @@ get_member_function_from_ptrfunc (tree *instance_ptrptr, tree function)
gcc_unreachable ();
}
- /* Convert down to the right base before using the instance. First
- use the type... */
+ /* Convert down to the right base before using the instance. A
+ special case is that in a pointer to member of class C, C may
+ be incomplete. In that case, the function will of course be
+ a member of C, and no conversion is required. In fact,
+ lookup_base will fail in that case, because incomplete
+ classes do not have BINFOs. */
basetype = TYPE_METHOD_BASETYPE (TREE_TYPE (fntype));
- basetype = lookup_base (TREE_TYPE (TREE_TYPE (instance_ptr)),
- basetype, ba_check, NULL);
- instance_ptr = build_base_path (PLUS_EXPR, instance_ptr, basetype, 1);
- if (instance_ptr == error_mark_node)
- return error_mark_node;
+ if (!same_type_ignoring_top_level_qualifiers_p
+ (basetype, TREE_TYPE (TREE_TYPE (instance_ptr))))
+ {
+ basetype = lookup_base (TREE_TYPE (TREE_TYPE (instance_ptr)),
+ basetype, ba_check, NULL);
+ instance_ptr = build_base_path (PLUS_EXPR, instance_ptr, basetype,
+ 1);
+ if (instance_ptr == error_mark_node)
+ return error_mark_node;
+ }
/* ...and then the delta in the PMF. */
instance_ptr = build2 (PLUS_EXPR, TREE_TYPE (instance_ptr),
instance_ptr, delta);
@@ -2380,7 +2401,7 @@ get_member_function_from_ptrfunc (tree *instance_ptrptr, tree function)
TREE_TYPE (e2) = TREE_TYPE (e3);
e1 = build_conditional_expr (e1, e2, e3);
-
+
/* Make sure this doesn't get evaluated first inside one of the
branches of the COND_EXPR. */
if (instance_save_expr)
@@ -2425,7 +2446,7 @@ build_function_call (tree function, tree params)
/* Differs from default_conversion by not setting TREE_ADDRESSABLE
(because calling an inline function does not mean the function
needs to be separately compiled). */
-
+
if (DECL_INLINE (function))
function = inline_conversion (function);
else
@@ -2446,8 +2467,8 @@ build_function_call (tree function, tree params)
if (TYPE_PTRMEMFUNC_P (fntype))
{
error ("must use %<.*%> or %<->*%> to call pointer-to-member "
- "function in %<%E (...)%>",
- original);
+ "function in %<%E (...)%>",
+ original);
return error_mark_node;
}
@@ -2490,7 +2511,7 @@ build_function_call (tree function, tree params)
NAME is an IDENTIFIER_NODE or 0. It is used only for error messages.
This is also where warnings about wrong number of args are generated.
-
+
Return a list of expressions for the parameters as converted.
Both VALUES and the returned value are chains of TREE_LIST nodes
@@ -2617,14 +2638,14 @@ convert_arguments (tree typelist, tree values, tree fndecl, int flags)
if (typetail != 0 && typetail != void_list_node)
{
/* See if there are default arguments that can be used. */
- if (TREE_PURPOSE (typetail)
+ if (TREE_PURPOSE (typetail)
&& TREE_CODE (TREE_PURPOSE (typetail)) != DEFAULT_ARG)
{
for (; typetail != void_list_node; ++i)
{
- tree parmval
- = convert_default_arg (TREE_VALUE (typetail),
- TREE_PURPOSE (typetail),
+ tree parmval
+ = convert_default_arg (TREE_VALUE (typetail),
+ TREE_PURPOSE (typetail),
fndecl, i);
if (parmval == error_mark_node)
@@ -2642,7 +2663,7 @@ convert_arguments (tree typelist, tree values, tree fndecl, int flags)
if (fndecl)
{
cp_error_at ("too few arguments to %s %q+#D",
- called_thing, fndecl);
+ called_thing, fndecl);
error ("at this point in file");
}
else
@@ -2658,7 +2679,7 @@ convert_arguments (tree typelist, tree values, tree fndecl, int flags)
conversions on the operands. CODE is the kind of expression to build. */
tree
-build_x_binary_op (enum tree_code code, tree arg1, tree arg2,
+build_x_binary_op (enum tree_code code, tree arg1, tree arg2,
bool *overloaded_p)
{
tree orig_arg1;
@@ -2680,12 +2701,12 @@ build_x_binary_op (enum tree_code code, tree arg1, tree arg2,
if (code == DOTSTAR_EXPR)
expr = build_m_component_ref (arg1, arg2);
else
- expr = build_new_op (code, LOOKUP_NORMAL, arg1, arg2, NULL_TREE,
+ expr = build_new_op (code, LOOKUP_NORMAL, arg1, arg2, NULL_TREE,
overloaded_p);
if (processing_template_decl && expr != error_mark_node)
return build_min_non_dep (code, expr, orig_arg1, orig_arg2);
-
+
return expr;
}
@@ -2765,7 +2786,7 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
/* Apply default conversions. */
op0 = orig_op0;
op1 = orig_op1;
-
+
if (code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
|| code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
|| code == TRUTH_XOR_EXPR)
@@ -2794,7 +2815,7 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
if (t != error_mark_node)
{
pedwarn ("assuming cast to type %qT from overloaded function",
- TREE_TYPE (t));
+ TREE_TYPE (t));
op0 = t;
}
}
@@ -2804,7 +2825,7 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
if (t != error_mark_node)
{
pedwarn ("assuming cast to type %qT from overloaded function",
- TREE_TYPE (t));
+ TREE_TYPE (t));
op1 = t;
}
}
@@ -2867,7 +2888,7 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
warning (0, "division by zero in %<%E / 0%>", op0);
else if (TREE_CODE (op1) == REAL_CST && real_zerop (op1))
warning (0, "division by zero in %<%E / 0.%>", op0);
-
+
if (code0 == COMPLEX_TYPE || code0 == VECTOR_TYPE)
code0 = TREE_CODE (TREE_TYPE (TREE_TYPE (op0)));
if (code1 == COMPLEX_TYPE || code1 == VECTOR_TYPE)
@@ -2893,7 +2914,8 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
case BIT_AND_EXPR:
case BIT_IOR_EXPR:
case BIT_XOR_EXPR:
- if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
+ if ((code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
+ || (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE))
shorten = -1;
break;
@@ -2903,7 +2925,7 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
warning (0, "division by zero in %<%E %% 0%>", op0);
else if (code1 == REAL_TYPE && real_zerop (op1))
warning (0, "division by zero in %<%E %% 0.%>", op0);
-
+
if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
{
/* Although it would be tempting to shorten always here, that loses
@@ -3000,7 +3022,7 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
if (warn_float_equal && (code0 == REAL_TYPE || code1 == REAL_TYPE))
warning (0, "comparing floating point with == or != is unsafe");
- build_type = boolean_type_node;
+ build_type = boolean_type_node;
if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
|| code0 == COMPLEX_TYPE)
&& (code1 == INTEGER_TYPE || code1 == REAL_TYPE
@@ -3054,9 +3076,9 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
/* We generate:
- (op0.pfn == op1.pfn
+ (op0.pfn == op1.pfn
&& (!op0.pfn || op0.delta == op1.delta))
-
+
The reason for the `!op0.pfn' bit is that a NULL
pointer-to-member is any member with a zero PFN; the
DELTA field is unspecified. */
@@ -3067,7 +3089,7 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
delta1 = build_ptrmemfunc_access_expr (op1,
delta_identifier);
e1 = cp_build_binary_op (EQ_EXPR, delta0, delta1);
- e2 = cp_build_binary_op (EQ_EXPR,
+ e2 = cp_build_binary_op (EQ_EXPR,
pfn0,
cp_convert (TREE_TYPE (pfn0),
integer_zero_node));
@@ -3087,7 +3109,7 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
|| !same_type_p (TYPE_PTRMEMFUNC_FN_TYPE (type1),
type0));
}
-
+
break;
case MAX_EXPR:
@@ -3149,13 +3171,29 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
break;
}
- arithmetic_types_p =
- ((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE)
- && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
- || code1 == COMPLEX_TYPE));
+ if (((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE)
+ && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
+ || code1 == COMPLEX_TYPE)))
+ arithmetic_types_p = 1;
+ else
+ {
+ arithmetic_types_p = 0;
+ /* Vector arithmetic is only allowed when both sides are vectors. */
+ if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)
+ {
+ if (!tree_int_cst_equal (TYPE_SIZE (type0), TYPE_SIZE (type1))
+ || !same_scalar_type_ignoring_signedness (TREE_TYPE (type0),
+ TREE_TYPE (type1)))
+ {
+ binary_op_error (code);
+ return error_mark_node;
+ }
+ arithmetic_types_p = 1;
+ }
+ }
/* Determine the RESULT_TYPE, if it is not already known. */
if (!result_type
- && arithmetic_types_p
+ && arithmetic_types_p
&& (shorten || common || short_compare))
result_type = common_type (type0, type1);
@@ -3169,8 +3207,8 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
/* If we're in a template, the only thing we need to know is the
RESULT_TYPE. */
if (processing_template_decl)
- return build2 (resultcode,
- build_type ? build_type : result_type,
+ return build2 (resultcode,
+ build_type ? build_type : result_type,
op0, op1);
if (arithmetic_types_p)
@@ -3297,7 +3335,7 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
pass the copies by reference, then copy them back afterward. */
tree xop0 = op0, xop1 = op1, xresult_type = result_type;
enum tree_code xresultcode = resultcode;
- tree val
+ tree val
= shorten_compare (&xop0, &xop1, &xresult_type, &xresultcode);
if (val != 0)
return cp_convert (boolean_type_node, val);
@@ -3320,13 +3358,13 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
tree primop1 = get_narrower (op1, &unsignedp1);
/* Check for comparison of different enum types. */
- if (TREE_CODE (TREE_TYPE (orig_op0)) == ENUMERAL_TYPE
- && TREE_CODE (TREE_TYPE (orig_op1)) == ENUMERAL_TYPE
+ if (TREE_CODE (TREE_TYPE (orig_op0)) == ENUMERAL_TYPE
+ && TREE_CODE (TREE_TYPE (orig_op1)) == ENUMERAL_TYPE
&& TYPE_MAIN_VARIANT (TREE_TYPE (orig_op0))
- != TYPE_MAIN_VARIANT (TREE_TYPE (orig_op1)))
+ != TYPE_MAIN_VARIANT (TREE_TYPE (orig_op1)))
{
- warning (0, "comparison between types %q#T and %q#T",
- TREE_TYPE (orig_op0), TREE_TYPE (orig_op1));
+ warning (0, "comparison between types %q#T and %q#T",
+ TREE_TYPE (orig_op0), TREE_TYPE (orig_op1));
}
/* Give warnings for comparisons between signed and unsigned
@@ -3378,7 +3416,7 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
primop0 = get_narrower (TREE_OPERAND (op0, 0), &unsignedp0);
if (TREE_CODE (primop1) == BIT_NOT_EXPR)
primop1 = get_narrower (TREE_OPERAND (op1, 0), &unsignedp1);
-
+
if (host_integerp (primop0, 0) || host_integerp (primop1, 0))
{
tree primop;
@@ -3434,7 +3472,7 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
|| (orig_op1 == null_node
&& TREE_CODE (TREE_TYPE (op0)) != POINTER_TYPE)
/* Or, both are NULL and the operation was not a comparison. */
- || (orig_op0 == null_node && orig_op1 == null_node
+ || (orig_op0 == null_node && orig_op1 == null_node
&& code != EQ_EXPR && code != NE_EXPR)))
/* Some sort of arithmetic operation involving NULL was
performed. Note that pointer-difference and pointer-addition
@@ -3445,9 +3483,9 @@ build_binary_op (enum tree_code code, tree orig_op0, tree orig_op1,
if (! converted)
{
if (TREE_TYPE (op0) != result_type)
- op0 = cp_convert (result_type, op0);
+ op0 = cp_convert (result_type, op0);
if (TREE_TYPE (op1) != result_type)
- op1 = cp_convert (result_type, op1);
+ op1 = cp_convert (result_type, op1);
if (op0 == error_mark_node || op1 == error_mark_node)
return error_mark_node;
@@ -3508,7 +3546,7 @@ pointer_diff (tree op0, tree op1, tree ptrtype)
/* First do the subtraction as integers;
then drop through to build the divide operator. */
- op0 = cp_build_binary_op (MINUS_EXPR,
+ op0 = cp_build_binary_op (MINUS_EXPR,
cp_convert (restype, op0),
cp_convert (restype, op1));
@@ -3516,7 +3554,7 @@ pointer_diff (tree op0, tree op1, tree ptrtype)
if (!COMPLETE_TYPE_P (TREE_TYPE (TREE_TYPE (op1))))
error ("invalid use of a pointer to an incomplete type in pointer arithmetic");
- op1 = (TYPE_PTROB_P (ptrtype)
+ op1 = (TYPE_PTROB_P (ptrtype)
? size_in_bytes (target_type)
: integer_one_node);
@@ -3536,7 +3574,7 @@ build_x_unary_op (enum tree_code code, tree xarg)
tree orig_expr = xarg;
tree exp;
int ptrmem = 0;
-
+
if (processing_template_decl)
{
if (type_dependent_expression_p (xarg))
@@ -3574,34 +3612,34 @@ build_x_unary_op (enum tree_code code, tree xarg)
if (TREE_CODE (xarg) != OFFSET_REF)
{
error ("invalid use of %qE to form a pointer-to-member-function."
- " Use a qualified-id.",
+ " Use a qualified-id.",
xarg);
return error_mark_node;
}
else
{
error ("parenthesis around %qE cannot be used to form a"
- " pointer-to-member-function",
+ " pointer-to-member-function",
xarg);
PTRMEM_OK_P (xarg) = 1;
}
}
-
+
if (TREE_CODE (xarg) == OFFSET_REF)
- {
- ptrmem = PTRMEM_OK_P (xarg);
-
- if (!ptrmem && !flag_ms_extensions
- && TREE_CODE (TREE_TYPE (TREE_OPERAND (xarg, 1))) == METHOD_TYPE)
+ {
+ ptrmem = PTRMEM_OK_P (xarg);
+
+ if (!ptrmem && !flag_ms_extensions
+ && TREE_CODE (TREE_TYPE (TREE_OPERAND (xarg, 1))) == METHOD_TYPE)
{
/* A single non-static member, make sure we don't allow a
- pointer-to-member. */
+ pointer-to-member. */
xarg = build2 (OFFSET_REF, TREE_TYPE (xarg),
TREE_OPERAND (xarg, 0),
ovl_cons (TREE_OPERAND (xarg, 1), NULL_TREE));
PTRMEM_OK_P (xarg) = ptrmem;
- }
- }
+ }
+ }
else if (TREE_CODE (xarg) == TARGET_EXPR)
warning (0, "taking address of temporary");
exp = build_unary_op (ADDR_EXPR, xarg, 0);
@@ -3630,7 +3668,7 @@ cp_truthvalue_conversion (tree expr)
}
/* Just like cp_truthvalue_conversion, but we want a CLEANUP_POINT_EXPR. */
-
+
tree
condition_conversion (tree expr)
{
@@ -3641,7 +3679,7 @@ condition_conversion (tree expr)
t = fold_build_cleanup_point_expr (boolean_type_node, t);
return t;
}
-
+
/* Return an ADDR_EXPR giving the address of T. This function
attempts no optimizations or simplifications; it is a low-level
primitive. */
@@ -3692,13 +3730,12 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
switch (code)
{
- /* CONVERT_EXPR stands for unary plus in this context. */
- case CONVERT_EXPR:
+ case UNARY_PLUS_EXPR:
case NEGATE_EXPR:
{
int flags = WANT_ARITH | WANT_ENUM;
/* Unary plus (but not unary minus) is allowed on pointers. */
- if (code == CONVERT_EXPR)
+ if (code == UNARY_PLUS_EXPR)
flags |= WANT_POINTER;
arg = build_expr_type_conversion (flags, arg, true);
if (!arg)
@@ -3757,7 +3794,7 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
case NOP_EXPR:
break;
-
+
case REALPART_EXPR:
if (TREE_CODE (arg) == COMPLEX_CST)
return TREE_REALPART (arg);
@@ -3779,7 +3816,7 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
}
else
return cp_convert (TREE_TYPE (arg), integer_zero_node);
-
+
case PREINCREMENT_EXPR:
case POSTINCREMENT_EXPR:
case PREDECREMENT_EXPR:
@@ -3841,24 +3878,24 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
pedwarn ("ISO C++ forbids %sing an enum",
(code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
? "increment" : "decrement");
-
+
/* Compute the increment. */
if (TREE_CODE (argtype) == POINTER_TYPE)
{
tree type = complete_type (TREE_TYPE (argtype));
-
+
if (!COMPLETE_OR_VOID_TYPE_P (type))
error ("cannot %s a pointer to incomplete type %qT",
- ((code == PREINCREMENT_EXPR
- || code == POSTINCREMENT_EXPR)
- ? "increment" : "decrement"), TREE_TYPE (argtype));
+ ((code == PREINCREMENT_EXPR
+ || code == POSTINCREMENT_EXPR)
+ ? "increment" : "decrement"), TREE_TYPE (argtype));
else if ((pedantic || warn_pointer_arith)
&& !TYPE_PTROB_P (argtype))
pedwarn ("ISO C++ forbids %sing a pointer of type %qT",
- ((code == PREINCREMENT_EXPR
- || code == POSTINCREMENT_EXPR)
- ? "increment" : "decrement"), argtype);
+ ((code == PREINCREMENT_EXPR
+ || code == POSTINCREMENT_EXPR)
+ ? "increment" : "decrement"), argtype);
inc = cxx_sizeof_nowarn (TREE_TYPE (argtype));
}
else
@@ -3975,7 +4012,7 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
if (TREE_CODE (arg) == COMPONENT_REF && type_unknown_p (arg)
&& !really_overloaded_fn (TREE_OPERAND (arg, 1)))
- {
+ {
/* They're trying to take the address of a unique non-static
member function. This is ill-formed (except in MS-land),
but let's try to DTRT.
@@ -4009,12 +4046,12 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
base, name);
}
arg = build_offset_ref (base, name, /*address_p=*/true);
- }
+ }
- offset_ref:
+ offset_ref:
if (type_unknown_p (arg))
return build1 (ADDR_EXPR, unknown_type_node, arg);
-
+
/* Handle complex lvalues (when permitted)
by reduction to simpler cases. */
val = unary_complex_lvalue (code, arg);
@@ -4047,15 +4084,15 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
if (!PTRMEM_OK_P (arg))
return build_unary_op (code, arg, 0);
-
+
t = TREE_OPERAND (arg, 1);
if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE)
{
error ("cannot create pointer to reference member %qD", t);
return error_mark_node;
}
-
- type = build_ptrmem_type (context_for_name_lookup (t),
+
+ type = build_ptrmem_type (context_for_name_lookup (t),
TREE_TYPE (t));
t = make_ptrmem_cst (type, TREE_OPERAND (arg, 1));
return t;
@@ -4156,7 +4193,7 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
If ARG is not a kind of expression we can handle, return
NULL_TREE. */
-
+
tree
unary_complex_lvalue (enum tree_code code, tree arg)
{
@@ -4213,7 +4250,7 @@ unary_complex_lvalue (enum tree_code code, tree arg)
|| TREE_CODE (TREE_TYPE (arg)) == METHOD_TYPE
|| TREE_CODE (arg) == OFFSET_REF)
return NULL_TREE;
-
+
/* We permit compiler to make function calls returning
objects of aggregate type look like lvalues. */
{
@@ -4265,7 +4302,7 @@ cxx_mark_addressable (tree exp)
case PARM_DECL:
if (x == current_class_ptr)
{
- error ("cannot take the address of %<this%>, which is an rvalue expression");
+ error ("cannot take the address of %<this%>, which is an rvalue expression");
TREE_ADDRESSABLE (x) = 1; /* so compiler doesn't die later. */
return true;
}
@@ -4344,7 +4381,7 @@ build_x_conditional_expr (tree ifexp, tree op1, tree op2)
expr = build_conditional_expr (ifexp, op1, op2);
if (processing_template_decl && expr != error_mark_node)
- return build_min_non_dep (COND_EXPR, expr,
+ return build_min_non_dep (COND_EXPR, expr,
orig_ifexp, orig_op1, orig_op2);
return expr;
}
@@ -4355,7 +4392,7 @@ build_x_conditional_expr (tree ifexp, tree op1, tree op2)
tree build_x_compound_expr_from_list (tree list, const char *msg)
{
tree expr = TREE_VALUE (list);
-
+
if (TREE_CHAIN (list))
{
if (msg)
@@ -4364,7 +4401,7 @@ tree build_x_compound_expr_from_list (tree list, const char *msg)
for (list = TREE_CHAIN (list); list; list = TREE_CHAIN (list))
expr = build_x_compound_expr (expr, TREE_VALUE (list));
}
-
+
return expr;
}
@@ -4393,7 +4430,7 @@ build_x_compound_expr (tree op1, tree op2)
if (processing_template_decl && result != error_mark_node)
return build_min_non_dep (COMPOUND_EXPR, result, orig_op1, orig_op2);
-
+
return result;
}
@@ -4403,23 +4440,23 @@ tree
build_compound_expr (tree lhs, tree rhs)
{
lhs = convert_to_void (lhs, "left-hand operand of comma");
-
+
if (lhs == error_mark_node || rhs == error_mark_node)
return error_mark_node;
-
+
if (TREE_CODE (rhs) == TARGET_EXPR)
{
/* If the rhs is a TARGET_EXPR, then build the compound
- expression inside the target_expr's initializer. This
+ expression inside the target_expr's initializer. This
helps the compiler to eliminate unnecessary temporaries. */
tree init = TREE_OPERAND (rhs, 1);
-
+
init = build2 (COMPOUND_EXPR, TREE_TYPE (init), lhs, init);
TREE_OPERAND (rhs, 1) = init;
-
+
return rhs;
}
-
+
return build2 (COMPOUND_EXPR, TREE_TYPE (rhs), lhs, rhs);
}
@@ -4445,7 +4482,7 @@ check_for_casting_away_constness (tree src_type, tree dest_type,
only the other direction is permitted. If C_CAST_P is true, this
conversion is taking place as part of a C-style cast. */
-tree
+tree
convert_ptrmem (tree type, tree expr, bool allow_inverse_p,
bool c_cast_p)
{
@@ -4456,17 +4493,17 @@ convert_ptrmem (tree type, tree expr, bool allow_inverse_p,
if (TREE_CODE (expr) == PTRMEM_CST)
expr = cplus_expand_constant (expr);
delta = get_delta_difference (TYPE_PTRMEM_CLASS_TYPE (TREE_TYPE (expr)),
- TYPE_PTRMEM_CLASS_TYPE (type),
+ TYPE_PTRMEM_CLASS_TYPE (type),
allow_inverse_p,
c_cast_p);
if (!integer_zerop (delta))
- expr = cp_build_binary_op (PLUS_EXPR,
+ expr = cp_build_binary_op (PLUS_EXPR,
build_nop (ptrdiff_type_node, expr),
delta);
return build_nop (type, expr);
}
else
- return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr,
+ return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), expr,
allow_inverse_p, c_cast_p);
}
@@ -4496,7 +4533,7 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
if (c_cast_p)
{
/* C-style casts are allowed to cast away constness. With
- WARN_CAST_QUAL, we still want to issue a warning. */
+ WARN_CAST_QUAL, we still want to issue a warning. */
diag_fn = warn_cast_qual ? warning0 : NULL;
desc = "cast";
}
@@ -4506,7 +4543,7 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
diag_fn = error;
desc = "static_cast";
}
-
+
/* [expr.static.cast]
An lvalue of type "cv1 B", where B is a class type, can be cast
@@ -4532,7 +4569,7 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
&& real_lvalue_p (expr)
&& DERIVED_FROM_P (intype, TREE_TYPE (type))
&& can_convert (build_pointer_type (TYPE_MAIN_VARIANT (intype)),
- build_pointer_type (TYPE_MAIN_VARIANT
+ build_pointer_type (TYPE_MAIN_VARIANT
(TREE_TYPE (type))))
&& (c_cast_p
|| at_least_as_qualified_p (TREE_TYPE (type), intype)))
@@ -4545,13 +4582,13 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
ambiguity. However, if this is a static_cast being performed
because the user wrote a C-style cast, then accessibility is
not considered. */
- base = lookup_base (TREE_TYPE (type), intype,
- c_cast_p ? ba_unique : ba_check,
+ base = lookup_base (TREE_TYPE (type), intype,
+ c_cast_p ? ba_unique : ba_check,
NULL);
/* Convert from "B*" to "D*". This function will check that "B"
is not a virtual base of "D". */
- expr = build_base_path (MINUS_EXPR, build_address (expr),
+ expr = build_base_path (MINUS_EXPR, build_address (expr),
base, /*nonnull=*/false);
/* Convert the pointer to a reference -- but then remember that
there are no expressions with reference type in C++. */
@@ -4582,14 +4619,14 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
}
/* [expr.static.cast]
- If T is a reference type, the result is an lvalue; otherwise,
+ If T is a reference type, the result is an lvalue; otherwise,
the result is an rvalue. */
if (TREE_CODE (type) != REFERENCE_TYPE
&& real_lvalue_p (result))
result = build1 (NON_LVALUE_EXPR, TREE_TYPE (result), result);
return result;
}
-
+
/* [expr.static.cast]
Any expression can be explicitly converted to type cv void. */
@@ -4610,7 +4647,7 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
floating point conversions, floating-integral conversions,
pointer conversions, and pointer to member conversions. */
/* DR 128
-
+
A value of integral _or enumeration_ type can be explicitly
converted to an enumeration type. */
/* The effect of all that is that any conversion between any two
@@ -4634,21 +4671,21 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
if (TYPE_PTR_P (type) && TYPE_PTR_P (intype)
&& CLASS_TYPE_P (TREE_TYPE (type))
&& CLASS_TYPE_P (TREE_TYPE (intype))
- && can_convert (build_pointer_type (TYPE_MAIN_VARIANT
- (TREE_TYPE (intype))),
- build_pointer_type (TYPE_MAIN_VARIANT
+ && can_convert (build_pointer_type (TYPE_MAIN_VARIANT
+ (TREE_TYPE (intype))),
+ build_pointer_type (TYPE_MAIN_VARIANT
(TREE_TYPE (type)))))
{
tree base;
if (!c_cast_p)
check_for_casting_away_constness (intype, type, diag_fn, desc);
- base = lookup_base (TREE_TYPE (type), TREE_TYPE (intype),
- c_cast_p ? ba_unique : ba_check,
+ base = lookup_base (TREE_TYPE (type), TREE_TYPE (intype),
+ c_cast_p ? ba_unique : ba_check,
NULL);
return build_base_path (MINUS_EXPR, expr, base, /*nonnull=*/false);
}
-
+
if ((TYPE_PTRMEM_P (type) && TYPE_PTRMEM_P (intype))
|| (TYPE_PTRMEMFUNC_P (type) && TYPE_PTRMEMFUNC_P (intype)))
{
@@ -4662,10 +4699,10 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
if (TYPE_PTRMEM_P (type))
{
- t1 = (build_ptrmem_type
+ t1 = (build_ptrmem_type
(c1,
TYPE_MAIN_VARIANT (TYPE_PTRMEM_POINTED_TO_TYPE (intype))));
- t2 = (build_ptrmem_type
+ t2 = (build_ptrmem_type
(c2,
TYPE_MAIN_VARIANT (TYPE_PTRMEM_POINTED_TO_TYPE (type))));
}
@@ -4677,20 +4714,20 @@ build_static_cast_1 (tree type, tree expr, bool c_cast_p,
if (can_convert (t1, t2))
{
if (!c_cast_p)
- check_for_casting_away_constness (intype, type, diag_fn,
+ check_for_casting_away_constness (intype, type, diag_fn,
desc);
return convert_ptrmem (type, expr, /*allow_inverse_p=*/1,
c_cast_p);
}
}
-
+
/* [expr.static.cast]
An rvalue of type "pointer to cv void" can be explicitly
converted to a pointer to object type. A value of type pointer
to object converted to "pointer to cv void" and back to the
original pointer type will have its original value. */
- if (TREE_CODE (intype) == POINTER_TYPE
+ if (TREE_CODE (intype) == POINTER_TYPE
&& VOID_TYPE_P (TREE_TYPE (intype))
&& TYPE_PTROB_P (type))
{
@@ -4733,7 +4770,7 @@ build_static_cast (tree type, tree expr)
if (valid_p)
return result;
- error ("invalid static_cast from type %qT to type %qT",
+ error ("invalid static_cast from type %qT to type %qT",
TREE_TYPE (expr), type);
return error_mark_node;
}
@@ -4756,7 +4793,7 @@ convert_member_func_to_ptr (tree type, tree expr)
if (pedantic || warn_pmf2ptr)
pedwarn ("converting from %qT to %qT", intype, type);
-
+
if (TREE_CODE (intype) == METHOD_TYPE)
expr = build_addr_func (expr);
else if (TREE_CODE (expr) == PTRMEM_CST)
@@ -4801,7 +4838,7 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
if (! real_lvalue_p (expr))
{
error ("invalid cast of an rvalue expression of type "
- "%qT to type %qT",
+ "%qT to type %qT",
intype, type);
return error_mark_node;
}
@@ -4830,7 +4867,7 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
pointer-to-function and pointer-to-void types. If
-Wno-pmf-conversions has not been specified,
convert_member_func_to_ptr will issue an error message. */
- if ((TYPE_PTRMEMFUNC_P (intype)
+ if ((TYPE_PTRMEMFUNC_P (intype)
|| TREE_CODE (intype) == METHOD_TYPE)
&& TYPE_PTR_P (type)
&& (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE
@@ -4841,7 +4878,7 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
array-to-pointer, and function-to-pointer conversions are
performed. */
expr = decay_conversion (expr);
-
+
/* build_c_cast puts on a NOP_EXPR to make the result not an lvalue.
Strip such NOP_EXPRs if VALUE is being used in non-lvalue context. */
if (TREE_CODE (expr) == NOP_EXPR
@@ -4860,7 +4897,7 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
{
if (TYPE_PRECISION (type) < TYPE_PRECISION (intype))
pedwarn ("cast from %qT to %qT loses precision",
- intype, type);
+ intype, type);
}
/* [expr.reinterpret.cast]
A value of integral or enumeration type can be explicitly
@@ -4875,7 +4912,7 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
|| (TYPE_PTROBV_P (type) && TYPE_PTROBV_P (intype)))
{
if (!c_cast_p)
- check_for_casting_away_constness (intype, type, error,
+ check_for_casting_away_constness (intype, type, error,
"reinterpret_cast");
/* Warn about possible alignment problems. */
if (STRICT_ALIGNMENT && warn_cast_align
@@ -4887,7 +4924,7 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
warning (0, "cast from %qT to %qT increases required alignment of "
"target type",
intype, type);
-
+
return fold_if_not_in_template (build_nop (type, expr));
}
else if ((TYPE_PTRFN_P (type) && TYPE_PTROBV_P (intype))
@@ -4895,10 +4932,10 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
{
if (pedantic)
/* Only issue a warning, as we have always supported this
- where possible, and it is necessary in some cases. DR 195
- addresses this issue, but as of 2004/10/26 is still in
- drafting. */
- warning (0, "ISO C++ forbids casting between pointer-to-function and pointer-to-object");
+ where possible, and it is necessary in some cases. DR 195
+ addresses this issue, but as of 2004/10/26 is still in
+ drafting. */
+ warning (0, "ISO C++ forbids casting between pointer-to-function and pointer-to-object");
return fold_if_not_in_template (build_nop (type, expr));
}
else if (TREE_CODE (type) == VECTOR_TYPE)
@@ -4912,7 +4949,7 @@ build_reinterpret_cast_1 (tree type, tree expr, bool c_cast_p,
error ("invalid cast from type %qT to type %qT", intype, type);
return error_mark_node;
}
-
+
return cp_convert (type, expr);
}
@@ -4925,7 +4962,7 @@ build_reinterpret_cast (tree type, tree expr)
if (processing_template_decl)
{
tree t = build_min (REINTERPRET_CAST_EXPR, type, expr);
-
+
if (!TREE_SIDE_EFFECTS (t)
&& type_dependent_expression_p (expr))
/* There might turn out to be side effects inside expr. */
@@ -5039,7 +5076,7 @@ build_const_cast_1 (tree dst_type, tree expr, bool complain,
}
if (complain)
- error ("invalid const_cast from type %qT to type %qT",
+ error ("invalid const_cast from type %qT to type %qT",
src_type, dst_type);
return error_mark_node;
}
@@ -5053,7 +5090,7 @@ build_const_cast (tree type, tree expr)
if (processing_template_decl)
{
tree t = build_min (CONST_CAST_EXPR, type, expr);
-
+
if (!TREE_SIDE_EFFECTS (t)
&& type_dependent_expression_p (expr))
/* There might turn out to be side effects inside expr. */
@@ -5139,7 +5176,7 @@ build_c_cast (tree type, tree expr)
&valid_p);
/* The static_cast or reinterpret_cast may be followed by a
const_cast. */
- if (valid_p
+ if (valid_p
/* A valid cast may result in errors if, for example, a
conversion to am ambiguous base class is required. */
&& !error_operand_p (result))
@@ -5252,7 +5289,7 @@ build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
tree preeval = NULL_TREE;
rhs = stabilize_expr (rhs, &preeval);
-
+
/* Check this here to avoid odd errors when trying to convert
a throw to the type of the COND_EXPR. */
if (!lvalue_or_else (lhs, lv_assign))
@@ -5275,7 +5312,7 @@ build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
cond = build2 (COMPOUND_EXPR, TREE_TYPE (lhs), preeval, cond);
return cond;
}
-
+
default:
break;
}
@@ -5328,8 +5365,8 @@ build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
else
{
/* A binary op has been requested. Combine the old LHS
- value with the RHS producing the value we should actually
- store into the LHS. */
+ value with the RHS producing the value we should actually
+ store into the LHS. */
gcc_assert (!PROMOTES_TO_AGGR_TYPE (lhstype, REFERENCE_TYPE));
lhs = stabilize_reference (lhs);
@@ -5340,7 +5377,7 @@ build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
TREE_TYPE (lhs), TREE_TYPE (rhs));
return error_mark_node;
}
-
+
/* Now it looks like a plain assignment. */
modifycode = NOP_EXPR;
}
@@ -5401,7 +5438,7 @@ build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
if (TREE_CODE (lhstype) == ARRAY_TYPE)
{
int from_array;
-
+
if (!same_or_base_type_p (TYPE_MAIN_VARIANT (lhstype),
TYPE_MAIN_VARIANT (TREE_TYPE (rhs))))
{
@@ -5415,7 +5452,7 @@ build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
pedwarn ("ISO C++ forbids assignment of arrays");
from_array = TREE_CODE (TREE_TYPE (newrhs)) == ARRAY_TYPE
- ? 1 + (modifycode != INIT_EXPR): 0;
+ ? 1 + (modifycode != INIT_EXPR): 0;
return build_vec_init (lhs, NULL_TREE, newrhs, from_array);
}
@@ -5518,12 +5555,11 @@ build_x_modify_expr (tree lhs, enum tree_code modifycode, tree rhs)
a pointer to member of FROM to a pointer to member of TO. */
static tree
-get_delta_difference (tree from, tree to,
+get_delta_difference (tree from, tree to,
bool allow_inverse_p,
bool c_cast_p)
{
tree binfo;
- tree virt_binfo;
base_kind kind;
tree result;
@@ -5532,36 +5568,14 @@ get_delta_difference (tree from, tree to,
binfo = lookup_base (to, from, c_cast_p ? ba_unique : ba_check, &kind);
if (kind == bk_inaccessible || kind == bk_ambig)
error (" in pointer to member function conversion");
- else if (!binfo)
+ else if (binfo)
{
- if (!allow_inverse_p)
- {
- error_not_base_type (from, to);
- error (" in pointer to member conversion");
- }
- else
- {
- binfo = lookup_base (from, to, c_cast_p ? ba_unique : ba_check,
- &kind);
- if (binfo)
- {
- virt_binfo = binfo_from_vbase (binfo);
- if (virt_binfo)
- /* This is a reinterpret cast, we choose to do nothing. */
- warning (0, "pointer to member cast via virtual base %qT",
- BINFO_TYPE (virt_binfo));
- else
- result = size_diffop (size_zero_node, BINFO_OFFSET (binfo));
- }
- }
- }
- else
- {
- virt_binfo = binfo_from_vbase (binfo);
- if (!virt_binfo)
+ if (kind != bk_via_virtual)
result = BINFO_OFFSET (binfo);
else
{
+ tree virt_binfo = binfo_from_vbase (binfo);
+
/* This is a reinterpret cast, we choose to do nothing. */
if (allow_inverse_p)
warning (0, "pointer to member cast via virtual base %qT",
@@ -5571,8 +5585,32 @@ get_delta_difference (tree from, tree to,
BINFO_TYPE (virt_binfo));
}
}
+ else if (same_type_ignoring_top_level_qualifiers_p (from, to))
+ /* Pointer to member of incomplete class is permitted*/;
+ else if (!allow_inverse_p)
+ {
+ error_not_base_type (from, to);
+ error (" in pointer to member conversion");
+ }
+ else
+ {
+ binfo = lookup_base (from, to, c_cast_p ? ba_unique : ba_check, &kind);
+ if (binfo)
+ {
+ if (kind != bk_via_virtual)
+ result = size_diffop (size_zero_node, BINFO_OFFSET (binfo));
+ else
+ {
+ /* This is a reinterpret cast, we choose to do nothing. */
+ tree virt_binfo = binfo_from_vbase (binfo);
+
+ warning (0, "pointer to member cast via virtual base %qT",
+ BINFO_TYPE (virt_binfo));
+ }
+ }
+ }
- return fold_if_not_in_template (convert_to_integer (ptrdiff_type_node,
+ return fold_if_not_in_template (convert_to_integer (ptrdiff_type_node,
result));
}
@@ -5602,7 +5640,7 @@ build_ptrmemfunc1 (tree type, tree delta, tree pfn)
TREE_STATIC (u) = (TREE_CONSTANT (u)
&& (initializer_constant_valid_p (pfn, TREE_TYPE (pfn))
!= NULL_TREE)
- && (initializer_constant_valid_p (delta, TREE_TYPE (delta))
+ && (initializer_constant_valid_p (delta, TREE_TYPE (delta))
!= NULL_TREE));
return u;
}
@@ -5638,10 +5676,10 @@ build_ptrmemfunc (tree type, tree pfn, int force, bool c_cast_p)
tree npfn = NULL_TREE;
tree n;
- if (!force
+ if (!force
&& !can_convert_arg (to_type, TREE_TYPE (pfn), pfn))
- error ("invalid conversion to type %qT from type %qT",
- to_type, pfn_type);
+ error ("invalid conversion to type %qT from type %qT",
+ to_type, pfn_type);
n = get_delta_difference (TYPE_PTRMEMFUNC_OBJECT_TYPE (pfn_type),
TYPE_PTRMEMFUNC_OBJECT_TYPE (to_type),
@@ -5686,7 +5724,7 @@ build_ptrmemfunc (tree type, tree pfn, int force, bool c_cast_p)
{
pfn = build_c_cast (type, integer_zero_node);
return build_ptrmemfunc1 (to_type,
- integer_zero_node,
+ integer_zero_node,
pfn);
}
@@ -5732,8 +5770,8 @@ expand_ptrmemfunc_cst (tree cst, tree *delta, tree *pfn)
else
{
/* If we're dealing with a virtual function, we have to adjust 'this'
- again, to point to the base which provides the vtable entry for
- fn; the call will do the opposite adjustment. */
+ again, to point to the base which provides the vtable entry for
+ fn; the call will do the opposite adjustment. */
tree orig_class = DECL_CONTEXT (fn);
tree binfo = binfo_or_else (orig_class, fn_class);
*delta = build2 (PLUS_EXPR, TREE_TYPE (*delta),
@@ -5784,7 +5822,7 @@ pfn_from_ptrmemfunc (tree t)
{
tree delta;
tree pfn;
-
+
expand_ptrmemfunc_cst (t, &delta, &pfn);
if (pfn)
return pfn;
@@ -5832,7 +5870,33 @@ convert_for_assignment (tree type, tree rhs,
/* Simplify the RHS if possible. */
if (TREE_CODE (rhs) == CONST_DECL)
rhs = DECL_INITIAL (rhs);
-
+
+ if (c_dialect_objc ())
+ {
+ int parmno;
+ tree rname = fndecl;
+
+ if (!strcmp (errtype, "assignment"))
+ parmno = -1;
+ else if (!strcmp (errtype, "initialization"))
+ parmno = -2;
+ else
+ {
+ tree selector = objc_message_selector ();
+
+ parmno = parmnum;
+
+ if (selector && parmno > 1)
+ {
+ rname = selector;
+ parmno -= 1;
+ }
+ }
+
+ if (objc_compare_types (type, rhstype, parmno, rname))
+ return convert (type, rhs);
+ }
+
/* [expr.ass]
The expression is implicitly converted (clause _conv_) to the
@@ -5846,8 +5910,8 @@ convert_for_assignment (tree type, tree rhs,
/* When -Wno-pmf-conversions is use, we just silently allow
conversions from pointers-to-members to plain pointers. If
the conversion doesn't work, cp_convert will complain. */
- if (!warn_pmf2ptr
- && TYPE_PTR_P (type)
+ if (!warn_pmf2ptr
+ && TYPE_PTR_P (type)
&& TYPE_PTRMEMFUNC_P (rhstype))
rhs = cp_convert (strip_top_quals (type), rhs);
else
@@ -5859,7 +5923,7 @@ convert_for_assignment (tree type, tree rhs,
instantiate_type (type, rhs, tf_error | tf_warning);
else if (fndecl)
error ("cannot convert %qT to %qT for argument %qP to %qD",
- rhstype, type, parmnum, fndecl);
+ rhstype, type, parmnum, fndecl);
else
error ("cannot convert %qT to %qT in %s", rhstype, type, errtype);
return error_mark_node;
@@ -5921,7 +5985,7 @@ convert_for_initialization (tree exp, tree type, tree rhs, int flags,
/* We accept references to incomplete types, so we can
return here before checking if RHS is of complete type. */
-
+
if (codel == REFERENCE_TYPE)
{
/* This should eventually happen in convert_arguments. */
@@ -5939,7 +6003,7 @@ convert_for_initialization (tree exp, tree type, tree rhs, int flags,
cp_error_at ("in passing argument %P of %q+D", parmnum, fndecl);
}
return rhs;
- }
+ }
if (exp != 0)
exp = require_complete_type (exp);
@@ -5979,7 +6043,7 @@ maybe_warn_about_returning_address_of_local (tree retval)
if (TREE_CODE (whats_returned) != ADDR_EXPR)
return;
- whats_returned = TREE_OPERAND (whats_returned, 0);
+ whats_returned = TREE_OPERAND (whats_returned, 0);
if (TREE_CODE (valtype) == REFERENCE_TYPE)
{
@@ -5989,7 +6053,7 @@ maybe_warn_about_returning_address_of_local (tree retval)
warning (0, "returning reference to temporary");
return;
}
- if (TREE_CODE (whats_returned) == VAR_DECL
+ if (TREE_CODE (whats_returned) == VAR_DECL
&& DECL_NAME (whats_returned)
&& TEMP_NAME_P (DECL_NAME (whats_returned)))
{
@@ -6005,10 +6069,10 @@ maybe_warn_about_returning_address_of_local (tree retval)
|| TREE_PUBLIC (whats_returned)))
{
if (TREE_CODE (valtype) == REFERENCE_TYPE)
- cp_warning_at ("reference to local variable %qD returned",
+ cp_warning_at ("reference to local variable %qD returned",
whats_returned);
else
- cp_warning_at ("address of local variable %qD returned",
+ cp_warning_at ("address of local variable %qD returned",
whats_returned);
return;
}
@@ -6058,7 +6122,7 @@ check_return_expr (tree retval)
current_function_returns_value = 1;
return retval;
}
-
+
/* When no explicit return-value is given in a function with a named
return value, the named return value is used. */
result = DECL_RESULT (current_function_decl);
@@ -6082,7 +6146,7 @@ check_return_expr (tree retval)
/* Check for a return statement with a value in a function that
isn't supposed to return a value. */
else if (retval && !fn_returns_value_p)
- {
+ {
if (VOID_TYPE_P (TREE_TYPE (retval)))
/* You can return a `void' value from a function of `void'
type. In that case, we have to evaluate the expression for
@@ -6090,7 +6154,7 @@ check_return_expr (tree retval)
finish_expr_stmt (retval);
else
pedwarn ("return-statement with a value, in function "
- "returning 'void'");
+ "returning 'void'");
current_function_returns_null = 1;
@@ -6121,7 +6185,7 @@ check_return_expr (tree retval)
&& ! flag_check_new
&& null_ptr_cst_p (retval))
warning (0, "%<operator new%> must not return NULL unless it is "
- "declared %<throw()%> (or -fcheck-new is in effect)");
+ "declared %<throw()%> (or -fcheck-new is in effect)");
/* Effective C++ rule 15. See also start_function. */
if (warn_ecpp
@@ -6203,7 +6267,7 @@ check_return_expr (tree 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);
@@ -6221,7 +6285,7 @@ check_return_expr (tree retval)
else
maybe_warn_about_returning_address_of_local (retval);
}
-
+
/* Actually copy the value returned into the appropriate location. */
if (retval && retval != result)
retval = build2 (INIT_EXPR, TREE_TYPE (result), result, retval);
@@ -6257,10 +6321,15 @@ comp_ptr_ttypes_real (tree to, tree from, int constp)
so the usual checks are not appropriate. */
if (TREE_CODE (to) != FUNCTION_TYPE && TREE_CODE (to) != METHOD_TYPE)
{
- if (!at_least_as_qualified_p (to, from))
+ /* In Objective-C++, some types may have been 'volatilized' by
+ the compiler for EH; when comparing them here, the volatile
+ qualification must be ignored. */
+ bool objc_quals_match = objc_type_quals_match (to, from);
+
+ if (!at_least_as_qualified_p (to, from) && !objc_quals_match)
return 0;
- if (!at_least_as_qualified_p (from, to))
+ if (!at_least_as_qualified_p (from, to) && !objc_quals_match)
{
if (constp == 0)
return 0;
@@ -6305,7 +6374,7 @@ ptr_reasonably_similar (tree to, tree from)
if (TREE_CODE (from) == OFFSET_TYPE
&& comptypes (TYPE_OFFSET_BASETYPE (to),
- TYPE_OFFSET_BASETYPE (from),
+ TYPE_OFFSET_BASETYPE (from),
COMPARE_BASE | COMPARE_DERIVED))
continue;
@@ -6322,7 +6391,7 @@ ptr_reasonably_similar (tree to, tree from)
if (TREE_CODE (to) != POINTER_TYPE)
return comptypes
- (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from),
+ (TYPE_MAIN_VARIANT (to), TYPE_MAIN_VARIANT (from),
COMPARE_BASE | COMPARE_DERIVED);
}
}
@@ -6378,18 +6447,18 @@ cp_apply_type_quals_to_decl (int type_quals, tree decl)
if (type == error_mark_node)
return;
- if (TREE_CODE (type) == FUNCTION_TYPE
+ if (TREE_CODE (type) == FUNCTION_TYPE
&& type_quals != TYPE_UNQUALIFIED)
{
/* This was an error in C++98 (cv-qualifiers cannot be added to
- a function type), but DR 295 makes the code well-formed by
- dropping the extra qualifiers. */
+ a function type), but DR 295 makes the code well-formed by
+ dropping the extra qualifiers. */
if (pedantic)
- {
- tree bad_type = build_qualified_type (type, type_quals);
- pedwarn ("ignoring %qV qualifiers added to function type %qT",
- bad_type, type);
- }
+ {
+ tree bad_type = build_qualified_type (type, type_quals);
+ pedwarn ("ignoring %qV qualifiers added to function type %qT",
+ bad_type, type);
+ }
TREE_TYPE (decl) = TYPE_MAIN_VARIANT (type);
return;
@@ -6401,7 +6470,7 @@ cp_apply_type_quals_to_decl (int type_quals, tree decl)
TYPE_NEEDS_CONSTRUCTING (type)
/* If the type isn't complete, we don't know yet if it will need
constructing. */
- || !COMPLETE_TYPE_P (type)
+ || !COMPLETE_TYPE_P (type)
/* If the type has a mutable component, that component might be
modified. */
|| TYPE_HAS_MUTABLE_P (type))
@@ -6426,31 +6495,25 @@ casts_away_constness_r (tree *t1, tree *t2)
and pointers to members (conv.qual), the "member" aspect of a
pointer to member level is ignored when determining if a const
cv-qualifier has been cast away. */
- if (TYPE_PTRMEM_P (*t1))
- *t1 = build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (*t1));
- if (TYPE_PTRMEM_P (*t2))
- *t2 = build_pointer_type (TYPE_PTRMEM_POINTED_TO_TYPE (*t2));
-
/* [expr.const.cast]
For two pointer types:
- X1 is T1cv1,1 * ... cv1,N * where T1 is not a pointer type
- X2 is T2cv2,1 * ... cv2,M * where T2 is not a pointer type
- K is min(N,M)
+ X1 is T1cv1,1 * ... cv1,N * where T1 is not a pointer type
+ X2 is T2cv2,1 * ... cv2,M * where T2 is not a pointer type
+ K is min(N,M)
casting from X1 to X2 casts away constness if, for a non-pointer
type T there does not exist an implicit conversion (clause
_conv_) from:
- Tcv1,(N-K+1) * cv1,(N-K+2) * ... cv1,N *
-
- to
+ Tcv1,(N-K+1) * cv1,(N-K+2) * ... cv1,N *
- Tcv2,(M-K+1) * cv2,(M-K+2) * ... cv2,M *. */
+ to
- if (TREE_CODE (*t1) != POINTER_TYPE
- || TREE_CODE (*t2) != POINTER_TYPE)
+ Tcv2,(M-K+1) * cv2,(M-K+2) * ... cv2,M *. */
+ if ((!TYPE_PTR_P (*t1) && !TYPE_PTRMEM_P (*t1))
+ || (!TYPE_PTR_P (*t2) && !TYPE_PTRMEM_P (*t2)))
{
*t1 = cp_build_qualified_type (void_type_node,
cp_type_quals (*t1));
@@ -6458,11 +6521,19 @@ casts_away_constness_r (tree *t1, tree *t2)
cp_type_quals (*t2));
return;
}
-
+
quals1 = cp_type_quals (*t1);
quals2 = cp_type_quals (*t2);
- *t1 = TREE_TYPE (*t1);
- *t2 = TREE_TYPE (*t2);
+
+ if (TYPE_PTRMEM_P (*t1))
+ *t1 = TYPE_PTRMEM_POINTED_TO_TYPE (*t1);
+ else
+ *t1 = TREE_TYPE (*t1);
+ if (TYPE_PTRMEM_P (*t2))
+ *t2 = TYPE_PTRMEM_POINTED_TO_TYPE (*t2);
+ else
+ *t2 = TREE_TYPE (*t2);
+
casts_away_constness_r (t1, t2);
*t1 = build_pointer_type (*t1);
*t2 = build_pointer_type (*t2);
@@ -6479,7 +6550,7 @@ casts_away_constness (tree t1, tree t2)
if (TREE_CODE (t2) == REFERENCE_TYPE)
{
/* [expr.const.cast]
-
+
Casting from an lvalue of type T1 to an lvalue of type T2
using a reference cast casts away constness if a cast from an
rvalue of type "pointer to T1" to the type "pointer to T2"
@@ -6491,7 +6562,7 @@ casts_away_constness (tree t1, tree t2)
if (TYPE_PTRMEM_P (t1) && TYPE_PTRMEM_P (t2))
/* [expr.const.cast]
-
+
Casting from an rvalue of type "pointer to data member of X
of type T1" to the type "pointer to data member of Y of type
T2" casts away constness if a cast from an rvalue of type
@@ -6503,7 +6574,7 @@ casts_away_constness (tree t1, tree t2)
/* Casting away constness is only something that makes sense for
pointer or reference types. */
- if (TREE_CODE (t1) != POINTER_TYPE
+ if (TREE_CODE (t1) != POINTER_TYPE
|| TREE_CODE (t2) != POINTER_TYPE)
return false;
diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index 37eb023324a..50940645944 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -84,9 +84,9 @@ readonly_error (tree arg, const char* string, int soft)
if (TREE_CODE (arg) == COMPONENT_REF)
{
if (TYPE_READONLY (TREE_TYPE (TREE_OPERAND (arg, 0))))
- fmt = "%s of data-member %qD in read-only structure";
+ fmt = "%s of data-member %qD in read-only structure";
else
- fmt = "%s of read-only data-member %qD";
+ fmt = "%s of read-only data-member %qD";
(*fn) (fmt, string, TREE_OPERAND (arg, 1));
}
else if (TREE_CODE (arg) == VAR_DECL)
@@ -102,9 +102,9 @@ readonly_error (tree arg, const char* string, int soft)
else if (TREE_CODE (arg) == PARM_DECL)
(*fn) ("%s of read-only parameter %qD", string, arg);
else if (TREE_CODE (arg) == INDIRECT_REF
- && TREE_CODE (TREE_TYPE (TREE_OPERAND (arg, 0))) == REFERENCE_TYPE
- && (TREE_CODE (TREE_OPERAND (arg, 0)) == VAR_DECL
- || TREE_CODE (TREE_OPERAND (arg, 0)) == PARM_DECL))
+ && TREE_CODE (TREE_TYPE (TREE_OPERAND (arg, 0))) == REFERENCE_TYPE
+ && (TREE_CODE (TREE_OPERAND (arg, 0)) == VAR_DECL
+ || TREE_CODE (TREE_OPERAND (arg, 0)) == PARM_DECL))
(*fn) ("%s of read-only reference %qD", string, TREE_OPERAND (arg, 0));
else if (TREE_CODE (arg) == RESULT_DECL)
(*fn) ("%s of read-only named return value %qD", string, arg);
@@ -236,7 +236,7 @@ int
abstract_virtuals_error (tree decl, tree type)
{
VEC(tree,gc) *pure;
-
+
/* This function applies only to classes. Any other entity can never
be abstract. */
if (!CLASS_TYPE_P (type))
@@ -251,11 +251,11 @@ abstract_virtuals_error (tree decl, tree type)
void **slot;
struct pending_abstract_type *pat;
- gcc_assert (!decl || DECL_P (decl)
+ gcc_assert (!decl || DECL_P (decl)
|| TREE_CODE (decl) == IDENTIFIER_NODE);
if (!abstract_pending_vars)
- abstract_pending_vars = htab_create_ggc (31, &pat_calc_hash,
+ abstract_pending_vars = htab_create_ggc (31, &pat_calc_hash,
&pat_compare, NULL);
slot = htab_find_slot_with_hash (abstract_pending_vars, type,
@@ -302,7 +302,7 @@ abstract_virtuals_error (tree decl, tree type)
cp_error_at ("invalid abstract return type for member function %q+#D",
decl);
else if (TREE_CODE (decl) == FUNCTION_DECL)
- cp_error_at ("invalid abstract return type for function %q+#D",
+ cp_error_at ("invalid abstract return type for function %q+#D",
decl);
else if (TREE_CODE (decl) == IDENTIFIER_NODE)
/* Here we do not have location information, so use error instead
@@ -319,19 +319,19 @@ abstract_virtuals_error (tree decl, tree type)
{
unsigned ix;
tree fn;
-
+
inform ("%J because the following virtual functions are pure "
"within %qT:", TYPE_MAIN_DECL (type), type);
for (ix = 0; VEC_iterate (tree, pure, ix, fn); ix++)
inform ("%J\t%#D", fn, fn);
/* Now truncate the vector. This leaves it non-null, so we know
- there are pure virtuals, but empty so we don't list them out
- again. */
+ there are pure virtuals, but empty so we don't list them out
+ again. */
VEC_truncate (tree, pure, 0);
}
else
- inform ("%J since type %qT has pure virtual functions",
+ inform ("%J since type %qT has pure virtual functions",
TYPE_MAIN_DECL (type), type);
return 1;
@@ -365,7 +365,7 @@ cxx_incomplete_type_diagnostic (tree value, tree type, int diag_type)
p_msg = error;
p_msg_at = cp_error_at;
}
-
+
/* Avoid duplicate error message. */
if (TREE_CODE (type) == ERROR_MARK)
return;
@@ -386,7 +386,7 @@ cxx_incomplete_type_diagnostic (tree value, tree type, int diag_type)
case UNION_TYPE:
case ENUMERAL_TYPE:
if (!decl)
- (*p_msg) ("invalid use of undefined type %q#T", type);
+ (*p_msg) ("invalid use of undefined type %q#T", type);
if (!TYPE_TEMPLATE_INFO (type))
(*p_msg_at) ("forward declaration of %q#T", type);
else
@@ -399,10 +399,10 @@ cxx_incomplete_type_diagnostic (tree value, tree type, int diag_type)
case ARRAY_TYPE:
if (TYPE_DOMAIN (type))
- {
- type = TREE_TYPE (type);
- goto retry;
- }
+ {
+ type = TREE_TYPE (type);
+ goto retry;
+ }
(*p_msg) ("invalid use of array with unspecified bounds");
break;
@@ -417,16 +417,16 @@ cxx_incomplete_type_diagnostic (tree value, tree type, int diag_type)
case UNKNOWN_TYPE:
if (value && TREE_CODE (value) == COMPONENT_REF)
- goto bad_member;
+ goto bad_member;
else if (value && TREE_CODE (value) == ADDR_EXPR)
- (*p_msg) ("address of overloaded function with no contextual "
- "type information");
+ (*p_msg) ("address of overloaded function with no contextual "
+ "type information");
else if (value && TREE_CODE (value) == OVERLOAD)
- (*p_msg) ("overloaded function with no contextual type information");
+ (*p_msg) ("overloaded function with no contextual type information");
else
- (*p_msg) ("insufficient contextual information to determine type");
+ (*p_msg) ("insufficient contextual information to determine type");
break;
-
+
default:
gcc_unreachable ();
}
@@ -474,10 +474,10 @@ split_nonconstant_init_1 (tree dest, tree init)
if (TREE_CODE (value) == CONSTRUCTOR)
{
if (array_type_p)
- sub = build4 (ARRAY_REF, inner_type, dest, field_index,
+ sub = build4 (ARRAY_REF, inner_type, dest, field_index,
NULL_TREE, NULL_TREE);
else
- sub = build3 (COMPONENT_REF, inner_type, dest, field_index,
+ sub = build3 (COMPONENT_REF, inner_type, dest, field_index,
NULL_TREE);
split_nonconstant_init_1 (sub, value);
@@ -487,10 +487,10 @@ split_nonconstant_init_1 (tree dest, tree init)
*pelt = TREE_CHAIN (elt);
if (array_type_p)
- sub = build4 (ARRAY_REF, inner_type, dest, field_index,
+ sub = build4 (ARRAY_REF, inner_type, dest, field_index,
NULL_TREE, NULL_TREE);
else
- sub = build3 (COMPONENT_REF, inner_type, dest, field_index,
+ sub = build3 (COMPONENT_REF, inner_type, dest, field_index,
NULL_TREE);
code = build2 (MODIFY_EXPR, inner_type, sub, value);
@@ -519,7 +519,7 @@ split_nonconstant_init_1 (tree dest, tree init)
}
}
-/* A subroutine of store_init_value. Splits non-constant static
+/* A subroutine of store_init_value. Splits non-constant static
initializer INIT into a constant part and generates code to
perform the non-constant part of the initialization to DEST.
Returns the code for the runtime init. */
@@ -580,7 +580,7 @@ store_init_value (tree decl, tree init)
if (TREE_CODE (init) == TREE_LIST)
{
error ("constructor syntax used, but no constructor declared "
- "for type %qT", type);
+ "for type %qT", type);
init = build_constructor (NULL_TREE, nreverse (init));
}
}
@@ -659,7 +659,7 @@ digest_init (tree type, tree init, tree* tail)
if (!complete_type_or_else (TREE_CODE (type) == ARRAY_TYPE
? TREE_TYPE (type) : type, NULL_TREE))
return error_mark_node;
-
+
/* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
if (TREE_CODE (init) == NON_LVALUE_EXPR)
init = TREE_OPERAND (init, 0);
@@ -774,7 +774,7 @@ digest_init (tree type, tree init, tree* tail)
if (TYPE_NON_AGGREGATE_CLASS (type))
{
error ("subobject of type %qT must be initialized by "
- "constructor, not by %qE",
+ "constructor, not by %qE",
type, init);
return error_mark_node;
}
@@ -994,17 +994,17 @@ process_init_constructor (tree type, tree init, tree* elts)
next1 = build_functional_cast (TREE_TYPE (field),
NULL_TREE);
else
- {
+ {
next1 = build_constructor (NULL_TREE, NULL_TREE);
- if (init)
- TREE_HAS_CONSTRUCTOR (next1)
- = TREE_HAS_CONSTRUCTOR (init);
- }
+ if (init)
+ TREE_HAS_CONSTRUCTOR (next1)
+ = TREE_HAS_CONSTRUCTOR (init);
+ }
next1 = digest_init (TREE_TYPE (field), next1, 0);
/* Warn when some struct elements are implicitly initialized. */
if (warn_missing_field_initializers
- && (!init || BRACE_ENCLOSED_INITIALIZER_P (init)))
+ && (!init || BRACE_ENCLOSED_INITIALIZER_P (init)))
warning (0, "missing initializer for member %qD", field);
}
else
@@ -1019,7 +1019,7 @@ process_init_constructor (tree type, tree init, tree* elts)
/* Warn when some struct elements are implicitly initialized
to zero. */
if (warn_missing_field_initializers
- && (!init || BRACE_ENCLOSED_INITIALIZER_P (init)))
+ && (!init || BRACE_ENCLOSED_INITIALIZER_P (init)))
warning (0, "missing initializer for member %qD", field);
if (! zero_init_p (TREE_TYPE (field)))
@@ -1074,7 +1074,7 @@ process_init_constructor (tree type, tree init, tree* elts)
field = temp, win = 1;
else
error ("no field %qD in union being initialized",
- TREE_PURPOSE (tail));
+ TREE_PURPOSE (tail));
}
if (!win)
TREE_VALUE (tail) = error_mark_node;
@@ -1082,7 +1082,7 @@ process_init_constructor (tree type, tree init, tree* elts)
else if (field == 0)
{
error ("union %qT with no named members cannot be initialized",
- type);
+ type);
TREE_VALUE (tail) = error_mark_node;
}
@@ -1233,7 +1233,7 @@ build_x_arrow (tree expr)
types_memoized);
}
last_rval = expr;
- }
+ }
if (last_rval == NULL_TREE)
{
@@ -1288,17 +1288,17 @@ build_m_component_ref (tree datum, tree component)
if (!TYPE_PTR_TO_MEMBER_P (ptrmem_type))
{
error ("%qE cannot be used as a member pointer, since it is of "
- "type %qT",
+ "type %qT",
component, ptrmem_type);
return error_mark_node;
}
-
- objtype = TYPE_MAIN_VARIANT (TREE_TYPE (datum));
+
+ objtype = TYPE_MAIN_VARIANT (TREE_TYPE (datum));
if (! IS_AGGR_TYPE (objtype))
{
error ("cannot apply member pointer %qE to %qE, which is of "
- "non-aggregate type %qT",
- component, datum, objtype);
+ "non-aggregate type %qT",
+ component, datum, objtype);
return error_mark_node;
}
@@ -1314,12 +1314,12 @@ build_m_component_ref (tree datum, tree component)
else
{
binfo = lookup_base (objtype, ctype, ba_check, NULL);
-
+
if (!binfo)
{
mismatch:
error ("pointer to member type %qT incompatible with object "
- "type %qT",
+ "type %qT",
type, objtype);
return error_mark_node;
}
@@ -1334,15 +1334,15 @@ build_m_component_ref (tree datum, tree component)
things are not as complex as they are for references to
non-static data members. */
type = cp_build_qualified_type (type,
- (cp_type_quals (type)
+ (cp_type_quals (type)
| cp_type_quals (TREE_TYPE (datum))));
datum = build_address (datum);
-
+
/* Convert object to the correct base. */
if (binfo)
datum = build_base_path (PLUS_EXPR, datum, binfo, 1);
-
+
/* Build an expression for "object + offset" where offset is the
value stored in the pointer-to-data-member. */
datum = build2 (PLUS_EXPR, build_pointer_type (type),
@@ -1391,9 +1391,9 @@ build_functional_cast (tree exp, tree parms)
/* Prepare to evaluate as a call to a constructor. If this expression
is actually used, for example,
-
+
return X (arg1, arg2, ...);
-
+
then the slot being initialized will be filled in. */
if (!complete_type_or_else (type, NULL_TREE))
@@ -1435,12 +1435,12 @@ add_exception_specifier (tree list, tree spec, int complain)
tree core = spec;
bool is_ptr;
int diag_type = -1; /* none */
-
+
if (spec == error_mark_node)
return list;
-
+
gcc_assert (spec && (!list || TREE_VALUE (list)));
-
+
/* [except.spec] 1, type in an exception specifier shall not be
incomplete, or pointer or ref to incomplete other than pointer
to cv void. */
@@ -1459,9 +1459,9 @@ add_exception_specifier (tree list, tree spec, int complain)
{
ok = true;
/* 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. */
+ 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 */
}
@@ -1469,16 +1469,16 @@ add_exception_specifier (tree list, tree spec, int complain)
if (ok)
{
tree probe;
-
+
for (probe = list; probe; probe = TREE_CHAIN (probe))
- if (same_type_p (TREE_VALUE (probe), spec))
- break;
+ if (same_type_p (TREE_VALUE (probe), spec))
+ break;
if (!probe)
list = tree_cons (NULL_TREE, spec, list);
}
else
diag_type = 0; /* error */
-
+
if (diag_type >= 0 && complain)
cxx_incomplete_type_diagnostic (NULL_TREE, core, diag_type);
@@ -1500,22 +1500,22 @@ merge_exception_specifiers (tree list, tree add)
else
{
tree orig_list = list;
-
+
for (; add; add = TREE_CHAIN (add))
- {
- tree spec = TREE_VALUE (add);
- tree probe;
-
- for (probe = orig_list; probe; probe = TREE_CHAIN (probe))
- if (same_type_p (TREE_VALUE (probe), spec))
- break;
- if (!probe)
- {
- spec = build_tree_list (NULL_TREE, spec);
- TREE_CHAIN (spec) = list;
- list = spec;
- }
- }
+ {
+ tree spec = TREE_VALUE (add);
+ tree probe;
+
+ for (probe = orig_list; probe; probe = TREE_CHAIN (probe))
+ if (same_type_p (TREE_VALUE (probe), spec))
+ break;
+ if (!probe)
+ {
+ spec = build_tree_list (NULL_TREE, spec);
+ TREE_CHAIN (spec) = list;
+ list = spec;
+ }
+ }
}
return list;
}
diff --git a/gcc/dbxout.c b/gcc/dbxout.c
index a4a036bb51f..be03d8129bc 100644
--- a/gcc/dbxout.c
+++ b/gcc/dbxout.c
@@ -856,7 +856,7 @@ dbxout_finish_complex_stabs (tree sym, STAB_CODE_TYPE code,
obstack_1grow (&stabstr_ob, '\0');
len = obstack_object_size (&stabstr_ob);
- chunk = str = obstack_finish (&stabstr_ob);
+ chunk = str = XOBFINISH (&stabstr_ob, char *);
/* Within the buffer are a sequence of NUL-separated strings,
each of which is to be written out as a separate stab
@@ -889,7 +889,7 @@ dbxout_finish_complex_stabs (tree sym, STAB_CODE_TYPE code,
comma than to do a two-character fputs. */
obstack_grow (&stabstr_ob, "\",", 2);
len = obstack_object_size (&stabstr_ob);
- str = obstack_finish (&stabstr_ob);
+ str = XOBFINISH (&stabstr_ob, char *);
fwrite (str, 1, len, asm_out_file);
DBX_FINISH_STABS (sym, code, line, addr, label, number);
diff --git a/gcc/ddg.c b/gcc/ddg.c
index ea65835a324..5d32b89c143 100644
--- a/gcc/ddg.c
+++ b/gcc/ddg.c
@@ -302,7 +302,7 @@ add_deps_for_use (ddg_ptr g, struct df *df, struct ref *use)
if (df_find_def (df, g->nodes[i].insn, use->reg))
return;
/* We must not add ANTI dep when there is an intra-loop TRUE dep in
- the opozite direction. If the first_def reaches the USE then there is
+ the opposite direction. If the first_def reaches the USE then there is
such a dep. */
if (! bitmap_bit_p (bb_info->rd_gen, first_def->id))
create_ddg_dep_no_link (g, use_node, def_node, ANTI_DEP, REG_DEP, 1);
@@ -692,7 +692,8 @@ static ddg_scc_ptr
create_scc (ddg_ptr g, sbitmap nodes)
{
ddg_scc_ptr scc;
- int u;
+ unsigned int u;
+ sbitmap_iterator sbi;
scc = (ddg_scc_ptr) xmalloc (sizeof (struct ddg_scc));
scc->backarcs = NULL;
@@ -701,7 +702,7 @@ create_scc (ddg_ptr g, sbitmap nodes)
sbitmap_copy (scc->nodes, nodes);
/* Mark the backarcs that belong to this SCC. */
- EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, u,
+ EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, u, sbi)
{
ddg_edge_ptr e;
ddg_node_ptr n = &g->nodes[u];
@@ -713,7 +714,7 @@ create_scc (ddg_ptr g, sbitmap nodes)
if (e->distance > 0)
add_backarc_to_scc (scc, e);
}
- });
+ }
set_recurrence_length (scc, g);
return scc;
@@ -782,13 +783,14 @@ get_node_of_insn (ddg_ptr g, rtx insn)
void
find_successors (sbitmap succ, ddg_ptr g, sbitmap ops)
{
- int i;
+ unsigned int i;
+ sbitmap_iterator sbi;
- EXECUTE_IF_SET_IN_SBITMAP (ops, 0, i,
+ EXECUTE_IF_SET_IN_SBITMAP (ops, 0, i, sbi)
{
const sbitmap node_succ = NODE_SUCCESSORS (&g->nodes[i]);
sbitmap_a_or_b (succ, succ, node_succ);
- });
+ };
/* We want those that are not in ops. */
sbitmap_difference (succ, succ, ops);
@@ -800,13 +802,14 @@ find_successors (sbitmap succ, ddg_ptr g, sbitmap ops)
void
find_predecessors (sbitmap preds, ddg_ptr g, sbitmap ops)
{
- int i;
+ unsigned int i;
+ sbitmap_iterator sbi;
- EXECUTE_IF_SET_IN_SBITMAP (ops, 0, i,
+ EXECUTE_IF_SET_IN_SBITMAP (ops, 0, i, sbi)
{
const sbitmap node_preds = NODE_PREDECESSORS (&g->nodes[i]);
sbitmap_a_or_b (preds, preds, node_preds);
- });
+ };
/* We want those that are not in ops. */
sbitmap_difference (preds, preds, ops);
@@ -901,8 +904,11 @@ int
find_nodes_on_paths (sbitmap result, ddg_ptr g, sbitmap from, sbitmap to)
{
int answer;
- int change, u;
+ int change;
+ unsigned int u;
int num_nodes = g->num_nodes;
+ sbitmap_iterator sbi;
+
sbitmap workset = sbitmap_alloc (num_nodes);
sbitmap reachable_from = sbitmap_alloc (num_nodes);
sbitmap reach_to = sbitmap_alloc (num_nodes);
@@ -917,7 +923,7 @@ find_nodes_on_paths (sbitmap result, ddg_ptr g, sbitmap from, sbitmap to)
change = 0;
sbitmap_copy (workset, tmp);
sbitmap_zero (tmp);
- EXECUTE_IF_SET_IN_SBITMAP (workset, 0, u,
+ EXECUTE_IF_SET_IN_SBITMAP (workset, 0, u, sbi)
{
ddg_edge_ptr e;
ddg_node_ptr u_node = &g->nodes[u];
@@ -934,7 +940,7 @@ find_nodes_on_paths (sbitmap result, ddg_ptr g, sbitmap from, sbitmap to)
change = 1;
}
}
- });
+ }
}
sbitmap_copy (reach_to, to);
@@ -946,7 +952,7 @@ find_nodes_on_paths (sbitmap result, ddg_ptr g, sbitmap from, sbitmap to)
change = 0;
sbitmap_copy (workset, tmp);
sbitmap_zero (tmp);
- EXECUTE_IF_SET_IN_SBITMAP (workset, 0, u,
+ EXECUTE_IF_SET_IN_SBITMAP (workset, 0, u, sbi)
{
ddg_edge_ptr e;
ddg_node_ptr u_node = &g->nodes[u];
@@ -963,7 +969,7 @@ find_nodes_on_paths (sbitmap result, ddg_ptr g, sbitmap from, sbitmap to)
change = 1;
}
}
- });
+ }
}
answer = sbitmap_a_and_b_cg (result, reachable_from, reach_to);
@@ -1008,7 +1014,8 @@ update_dist_to_successors (ddg_node_ptr u_node, sbitmap nodes, sbitmap tmp)
int
longest_simple_path (struct ddg * g, int src, int dest, sbitmap nodes)
{
- int i, u;
+ int i;
+ unsigned int u;
int change = 1;
int result;
int num_nodes = g->num_nodes;
@@ -1027,15 +1034,17 @@ longest_simple_path (struct ddg * g, int src, int dest, sbitmap nodes)
while (change)
{
+ sbitmap_iterator sbi;
+
change = 0;
sbitmap_copy (workset, tmp);
sbitmap_zero (tmp);
- EXECUTE_IF_SET_IN_SBITMAP (workset, 0, u,
+ EXECUTE_IF_SET_IN_SBITMAP (workset, 0, u, sbi)
{
ddg_node_ptr u_node = &g->nodes[u];
change |= update_dist_to_successors (u_node, nodes, tmp);
- });
+ }
}
result = g->nodes[dest].aux.count;
sbitmap_free (workset);
diff --git a/gcc/df.c b/gcc/df.c
index ad7852cb4d4..339f2c9ac4f 100644
--- a/gcc/df.c
+++ b/gcc/df.c
@@ -820,7 +820,8 @@ df_ref_record (struct df *df, rtx reg, rtx *loc, rtx insn,
reg. As written in the docu those should have the form
(subreg:SI (reg:M A) N), with size(SImode) > size(Mmode).
XXX Is that true? We could also use the global word_mode variable. */
- if (GET_CODE (reg) == SUBREG
+ if ((df->flags & DF_SUBREGS) == 0
+ && GET_CODE (reg) == SUBREG
&& (GET_MODE_SIZE (GET_MODE (reg)) < GET_MODE_SIZE (word_mode)
|| GET_MODE_SIZE (GET_MODE (reg))
>= GET_MODE_SIZE (GET_MODE (SUBREG_REG (reg)))))
@@ -2675,6 +2676,20 @@ df_insn_modify (struct df *df, basic_block bb, rtx insn)
will just get ignored. */
}
+/* Check if INSN was marked as changed. Of course the correctness of
+ the information depends on whether the instruction was really modified
+ at the time df_insn_modify was called. */
+bool
+df_insn_modified_p (struct df *df, rtx insn)
+{
+ unsigned int uid;
+
+ uid = INSN_UID (insn);
+ return (df->insns_modified
+ && uid < df->insn_size
+ && bitmap_bit_p (df->insns_modified, uid));
+}
+
typedef struct replace_args
{
rtx match;
@@ -3237,6 +3252,48 @@ df_bb_regs_lives_compare (struct df *df, basic_block bb, rtx reg1, rtx reg2)
}
+/* Return true if the definition DEF, which is in the same basic
+ block as USE, is available at USE. So DEF may as well be
+ dead, in which case using it will extend its live range. */
+bool
+df_local_def_available_p (struct df *df, struct ref *def, struct ref *use)
+{
+ struct df_link *link;
+ int def_luid = DF_INSN_LUID (df, DF_REF_INSN (def));
+ int in_bb = 0;
+ unsigned int regno = REGNO (def->reg);
+ basic_block bb;
+
+ /* The regs must be local to BB. */
+ gcc_assert (DF_REF_BB (def) == DF_REF_BB (use));
+ bb = DF_REF_BB (def);
+
+ /* This assumes that the reg-def list is ordered such that for any
+ BB, the first def is found first. However, since the BBs are not
+ ordered, the first def in the chain is not necessarily the first
+ def in the function. */
+ for (link = df->regs[regno].defs; link; link = link->next)
+ {
+ struct ref *this_def = link->ref;
+ if (DF_REF_BB (this_def) == bb)
+ {
+ int this_luid = DF_INSN_LUID (df, DF_REF_INSN (this_def));
+ /* Do nothing with defs coming before DEF. */
+ if (this_luid > def_luid)
+ return this_luid > DF_INSN_LUID (df, DF_REF_INSN (use));
+
+ in_bb = 1;
+ }
+ else if (in_bb)
+ /* DEF was the last in its basic block. */
+ return 1;
+ }
+
+ /* DEF was the last in the function. */
+ return 1;
+}
+
+
/* Return last use of REGNO within BB. */
struct ref *
df_bb_regno_last_use_find (struct df *df, basic_block bb, unsigned int regno)
@@ -3304,7 +3361,7 @@ df_bb_regno_last_def_find (struct df *df, basic_block bb, unsigned int regno)
return last_def;
}
-/* Return first use of REGNO inside INSN within BB. */
+/* Return last use of REGNO inside INSN within BB. */
static struct ref *
df_bb_insn_regno_last_use_find (struct df *df,
basic_block bb ATTRIBUTE_UNUSED, rtx insn,
diff --git a/gcc/df.h b/gcc/df.h
index 60f6030fae1..43820819025 100644
--- a/gcc/df.h
+++ b/gcc/df.h
@@ -38,6 +38,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#define DF_ALL 255
#define DF_HARD_REGS 1024 /* Mark hard registers. */
#define DF_EQUIV_NOTES 2048 /* Mark uses present in EQUIV/EQUAL notes. */
+#define DF_SUBREGS 4096 /* Return subregs rather than the inner reg. */
enum df_ref_type {DF_REF_REG_DEF, DF_REF_REG_USE, DF_REF_REG_MEM_LOAD,
DF_REF_REG_MEM_STORE};
@@ -207,11 +208,9 @@ struct df_map
((DF)->regs[REGNUM].uses ? (DF)->regs[REGNUM].uses->ref : 0)
#define DF_REGNO_FIRST_BB(DF, REGNUM) \
-(DF_REGNO_FIRST_DEF (DF, REGNUM) \
-? DF_REF_BB (DF_REGNO_FIRST_DEF (DF, REGNUM)) : 0)
+((DF)->regs[REGNUM].defs ? DF_REF_BB ((DF)->regs[REGNUM].defs->ref) : 0)
#define DF_REGNO_LAST_BB(DF, REGNUM) \
-(DF_REGNO_LAST_USE (DF, REGNUM) \
-? DF_REF_BB (DF_REGNO_LAST_USE (DF, REGNUM)) : 0)
+((DF)->regs[REGNUM].uses ? DF_REF_BB ((DF)->regs[REGNUM].uses->ref) : 0)
/* Macros to access the elements within the insn_info structure table. */
@@ -235,6 +234,8 @@ extern void df_dump (struct df *, int, FILE *);
/* Functions to modify insns. */
+extern bool df_insn_modified_p (struct df *, rtx);
+
extern void df_insn_modify (struct df *, basic_block, rtx);
extern rtx df_insn_delete (struct df *, basic_block, rtx);
@@ -280,6 +281,8 @@ extern int df_bb_reg_live_end_p (struct df *, basic_block, rtx);
extern int df_bb_regs_lives_compare (struct df *, basic_block, rtx, rtx);
+extern bool df_local_def_available_p (struct df *, struct ref *, struct ref *);
+
extern rtx df_bb_single_def_use_insn_find (struct df *, basic_block, rtx,
rtx);
extern struct ref *df_bb_regno_last_use_find (struct df *, basic_block, unsigned int);
diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c
index e48133299af..35bce25d97f 100644
--- a/gcc/diagnostic.c
+++ b/gcc/diagnostic.c
@@ -113,13 +113,13 @@ diagnostic_initialize (diagnostic_context *context)
}
void
-diagnostic_set_info (diagnostic_info *diagnostic, const char *msgid,
+diagnostic_set_info (diagnostic_info *diagnostic, const char *gmsgid,
va_list *args, location_t location,
diagnostic_t kind)
{
diagnostic->message.err_no = errno;
diagnostic->message.args_ptr = args;
- diagnostic->message.format_spec = _(msgid);
+ diagnostic->message.format_spec = _(gmsgid);
diagnostic->location = location;
diagnostic->kind = kind;
diagnostic->option_index = 0;
@@ -396,15 +396,15 @@ trim_filename (const char *name)
/* Text to be emitted verbatim to the error message stream; this
produces no prefix and disables line-wrapping. Use rarely. */
void
-verbatim (const char *msgid, ...)
+verbatim (const char *gmsgid, ...)
{
text_info text;
va_list ap;
- va_start (ap, msgid);
+ va_start (ap, gmsgid);
text.err_no = errno;
text.args_ptr = &ap;
- text.format_spec = _(msgid);
+ text.format_spec = _(gmsgid);
pp_format_verbatim (global_dc->printer, &text);
pp_flush (global_dc->printer);
va_end (ap);
@@ -413,13 +413,13 @@ verbatim (const char *msgid, ...)
/* An informative note. Use this for additional details on an error
message. */
void
-inform (const char *msgid, ...)
+inform (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location, DK_NOTE);
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_NOTE);
report_diagnostic (&diagnostic);
va_end (ap);
}
@@ -427,13 +427,13 @@ inform (const char *msgid, ...)
/* A warning. Use this for code which is correct according to the
relevant language specification but is likely to be buggy anyway. */
void
-warning (int opt, const char *msgid, ...)
+warning (int opt, const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location, DK_WARNING);
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_WARNING);
diagnostic.option_index = opt;
report_diagnostic (&diagnostic);
@@ -441,13 +441,13 @@ warning (int opt, const char *msgid, ...)
}
void
-warning0 (const char *msgid, ...)
+warning0 (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location, DK_WARNING);
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_WARNING);
report_diagnostic (&diagnostic);
va_end (ap);
}
@@ -461,13 +461,13 @@ warning0 (const char *msgid, ...)
of the -pedantic command-line switch. To get a warning enabled
only with that switch, write "if (pedantic) pedwarn (...);" */
void
-pedwarn (const char *msgid, ...)
+pedwarn (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location,
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location,
pedantic_error_kind ());
report_diagnostic (&diagnostic);
va_end (ap);
@@ -476,13 +476,13 @@ pedwarn (const char *msgid, ...)
/* A hard error: the code is definitely ill-formed, and an object file
will not be produced. */
void
-error (const char *msgid, ...)
+error (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location, DK_ERROR);
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ERROR);
report_diagnostic (&diagnostic);
va_end (ap);
}
@@ -491,13 +491,13 @@ error (const char *msgid, ...)
required by the relevant specification but not implemented by GCC.
An object file will not be produced. */
void
-sorry (const char *msgid, ...)
+sorry (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location, DK_SORRY);
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_SORRY);
report_diagnostic (&diagnostic);
va_end (ap);
}
@@ -506,13 +506,13 @@ sorry (const char *msgid, ...)
continue. Do not use this for internal consistency checks; that's
internal_error. Use of this function should be rare. */
void
-fatal_error (const char *msgid, ...)
+fatal_error (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location, DK_FATAL);
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_FATAL);
report_diagnostic (&diagnostic);
va_end (ap);
@@ -524,13 +524,13 @@ fatal_error (const char *msgid, ...)
a more specific message, or some other good reason, you should use
abort () instead of calling this function directly. */
void
-internal_error (const char *msgid, ...)
+internal_error (const char *gmsgid, ...)
{
diagnostic_info diagnostic;
va_list ap;
- va_start (ap, msgid);
- diagnostic_set_info (&diagnostic, msgid, &ap, input_location, DK_ICE);
+ va_start (ap, gmsgid);
+ diagnostic_set_info (&diagnostic, gmsgid, &ap, input_location, DK_ICE);
report_diagnostic (&diagnostic);
va_end (ap);
@@ -543,12 +543,12 @@ internal_error (const char *msgid, ...)
/* Print a diagnostic MSGID on FILE. This is just fprintf, except it
runs its second argument through gettext. */
void
-fnotice (FILE *file, const char *msgid, ...)
+fnotice (FILE *file, const char *cmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
- vfprintf (file, _(msgid), ap);
+ va_start (ap, cmsgid);
+ vfprintf (file, _(cmsgid), ap);
va_end (ap);
}
diff --git a/gcc/doc/c-tree.texi b/gcc/doc/c-tree.texi
index a6033f16256..196aa564430 100644
--- a/gcc/doc/c-tree.texi
+++ b/gcc/doc/c-tree.texi
@@ -1712,6 +1712,7 @@ This macro returns the attributes on the type @var{type}.
@tindex EXACT_DIV_EXPR
@tindex ARRAY_REF
@tindex ARRAY_RANGE_REF
+@tindex TARGET_MEM_REF
@tindex LT_EXPR
@tindex LE_EXPR
@tindex GT_EXPR
@@ -2103,6 +2104,26 @@ meanings. The type of these expressions must be an array whose component
type is the same as that of the first operand. The range of that array
type determines the amount of data these expressions access.
+@item TARGET_MEM_REF
+These nodes represent memory accesses whose address directly map to
+an addressing mode of the target architecture. The first argument
+is @code{TMR_SYMBOL} and must be a @code{VAR_DECL} of an object with
+a fixed address. The second argument is @code{TMR_BASE} and the
+third one is @code{TMR_INDEX}. The fourth argument is
+@code{TMR_STEP} and must be an @code{INTEGER_CST}. The fifth
+argument is @code{TMR_OFFSET} and must be an @code{INTEGER_CST}.
+Any of the arguments may be NULL if the appropriate component
+does not appear in the address. Address of the @code{TARGET_MEM_REF}
+is determined in the following way.
+
+@smallexample
+&TMR_SYMBOL + TMR_BASE + TMR_INDEX * TMR_STEP + TMR_OFFSET
+@end smallexample
+
+The sixth argument is the reference to the original memory access, which
+is preserved for the purposes of the RTL alias analysis. The seventh
+argument is a tag representing the results of tree level alias analysis.
+
@item LT_EXPR
@itemx LE_EXPR
@itemx GT_EXPR
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index c714c54b495..7d83c2bded7 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -4791,6 +4791,9 @@ are not prevented from being speculated to before the barrier.
@findex cimag
@findex cimagf
@findex cimagl
+@findex clog
+@findex clogf
+@findex clogl
@findex conj
@findex conjf
@findex conjl
@@ -5140,21 +5143,21 @@ The ISO C99 functions
@code{catanl}, @code{catan}, @code{cbrtf}, @code{cbrtl}, @code{cbrt},
@code{ccosf}, @code{ccoshf}, @code{ccoshl}, @code{ccosh}, @code{ccosl},
@code{ccos}, @code{cexpf}, @code{cexpl}, @code{cexp}, @code{cimagf},
-@code{cimagl}, @code{cimag}, @code{conjf}, @code{conjl}, @code{conj},
-@code{copysignf}, @code{copysignl}, @code{copysign}, @code{cpowf},
-@code{cpowl}, @code{cpow}, @code{cprojf}, @code{cprojl}, @code{cproj},
-@code{crealf}, @code{creall}, @code{creal}, @code{csinf}, @code{csinhf},
-@code{csinhl}, @code{csinh}, @code{csinl}, @code{csin}, @code{csqrtf},
-@code{csqrtl}, @code{csqrt}, @code{ctanf}, @code{ctanhf}, @code{ctanhl},
-@code{ctanh}, @code{ctanl}, @code{ctan}, @code{erfcf}, @code{erfcl},
-@code{erfc}, @code{erff}, @code{erfl}, @code{erf}, @code{exp2f},
-@code{exp2l}, @code{exp2}, @code{expm1f}, @code{expm1l}, @code{expm1},
-@code{fdimf}, @code{fdiml}, @code{fdim}, @code{fmaf}, @code{fmal},
-@code{fmaxf}, @code{fmaxl}, @code{fmax}, @code{fma}, @code{fminf},
-@code{fminl}, @code{fmin}, @code{hypotf}, @code{hypotl}, @code{hypot},
-@code{ilogbf}, @code{ilogbl}, @code{ilogb}, @code{imaxabs},
-@code{isblank}, @code{iswblank}, @code{lgammaf}, @code{lgammal},
-@code{lgamma}, @code{llabs}, @code{llrintf}, @code{llrintl},
+@code{cimagl}, @code{cimag}, @code{clogf}, @code{clogl}, @code{clog},
+@code{conjf}, @code{conjl}, @code{conj}, @code{copysignf}, @code{copysignl},
+@code{copysign}, @code{cpowf}, @code{cpowl}, @code{cpow}, @code{cprojf},
+@code{cprojl}, @code{cproj}, @code{crealf}, @code{creall}, @code{creal},
+@code{csinf}, @code{csinhf}, @code{csinhl}, @code{csinh}, @code{csinl},
+@code{csin}, @code{csqrtf}, @code{csqrtl}, @code{csqrt}, @code{ctanf},
+@code{ctanhf}, @code{ctanhl}, @code{ctanh}, @code{ctanl}, @code{ctan},
+@code{erfcf}, @code{erfcl}, @code{erfc}, @code{erff}, @code{erfl},
+@code{erf}, @code{exp2f}, @code{exp2l}, @code{exp2}, @code{expm1f},
+@code{expm1l}, @code{expm1}, @code{fdimf}, @code{fdiml}, @code{fdim},
+@code{fmaf}, @code{fmal}, @code{fmaxf}, @code{fmaxl}, @code{fmax},
+@code{fma}, @code{fminf}, @code{fminl}, @code{fmin}, @code{hypotf},
+@code{hypotl}, @code{hypot}, @code{ilogbf}, @code{ilogbl}, @code{ilogb},
+@code{imaxabs}, @code{isblank}, @code{iswblank}, @code{lgammaf},
+@code{lgammal}, @code{lgamma}, @code{llabs}, @code{llrintf}, @code{llrintl},
@code{llrint}, @code{llroundf}, @code{llroundl}, @code{llround},
@code{log1pf}, @code{log1pl}, @code{log1p}, @code{log2f}, @code{log2l},
@code{log2}, @code{logbf}, @code{logbl}, @code{logb}, @code{lrintf},
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
index 80a655b8948..d4c9a027e73 100644
--- a/gcc/doc/install.texi
+++ b/gcc/doc/install.texi
@@ -328,7 +328,7 @@ the 1.9.x series, which is currently 1.9.3. When regenerating a directory
to a newer version, please update all the directories using an older 1.9.x
to the latest released version.
-@item gettext version 0.12 (or later)
+@item gettext version 0.14.5 (or later)
Needed to regenerate @file{gcc.pot}.
@@ -1072,6 +1072,27 @@ do a @samp{make -C gcc gnatlib_and_tools}.
Specify that the compiler should
use DWARF 2 debugging information as the default.
+@item --enable-targets=all
+@itemx --enable-targets=@var{target_list}
+Some GCC targets, e.g.@: powerpc64-linux, build bi-arch compilers.
+These are compilers that are able to generate either 64-bit or 32-bit
+code. Typically, the corresponding 32-bit target, e.g.@:
+powerpc-linux for powerpc64-linux, only generates 32-bit code. This
+option enables the 32-bit target to be a bi-arch compiler, which is
+useful when you want a bi-arch compiler that defaults to 32-bit, and
+you are building a bi-arch or multi-arch binutils in a combined tree.
+Currently, this option only affects powerpc-linux.
+
+@item --enable-secureplt
+This option enables @option{-msecure-plt} by default for powerpc-linux.
+@ifnothtml
+@xref{RS/6000 and PowerPC Options,, RS/6000 and PowerPC Options, gcc,
+Using the GNU Compiler Collection (GCC)},
+@end ifnothtml
+@ifhtml
+See ``RS/6000 and PowerPC Options'' in the main manual
+@end ifhtml
+
@item --enable-win32-registry
@itemx --enable-win32-registry=@var{key}
@itemx --disable-win32-registry
@@ -2465,7 +2486,7 @@ ARM-family processors. These targets support the AOUT file format:
ATMEL AVR-family micro controllers. These are used in embedded
applications. There are no standard Unix configurations.
@ifnothtml
-@xref{AVR Options,, AVR Options, gcc, Using and Porting the GNU Compiler
+@xref{AVR Options,, AVR Options, gcc, Using the GNU Compiler
Collection (GCC)},
@end ifnothtml
@ifhtml
@@ -2503,8 +2524,8 @@ indicates that you should upgrade to a newer version of the binutils.
The Blackfin processor, an Analog Devices DSP.
@ifnothtml
-@xref{Blackfin Options,, Blackfin Options, gcc, Using and Porting the GNU
-Compiler Collection (GCC)},
+@xref{Blackfin Options,, Blackfin Options, gcc, Using the GNU Compiler
+Collection (GCC)},
@end ifnothtml
@ifhtml
See ``Blackfin Options'' in the main manual
@@ -2522,8 +2543,8 @@ Texas Instruments TMS320C3x and TMS320C4x Floating Point Digital Signal
Processors. These are used in embedded applications. There are no
standard Unix configurations.
@ifnothtml
-@xref{TMS320C3x/C4x Options,, TMS320C3x/C4x Options, gcc, Using and
-Porting the GNU Compiler Collection (GCC)},
+@xref{TMS320C3x/C4x Options,, TMS320C3x/C4x Options, gcc, Using the
+GNU Compiler Collection (GCC)},
@end ifnothtml
@ifhtml
See ``TMS320C3x/C4x Options'' in the main manual
@@ -2552,7 +2573,7 @@ CRIS is the CPU architecture in Axis Communications ETRAX system-on-a-chip
series. These are used in embedded applications.
@ifnothtml
-@xref{CRIS Options,, CRIS Options, gcc, Using and Porting the GNU Compiler
+@xref{CRIS Options,, CRIS Options, gcc, Using the GNU Compiler
Collection (GCC)},
@end ifnothtml
@ifhtml
@@ -3623,11 +3644,11 @@ failure in form of a miscompilation of the stage1 compiler by the Sun
compiler. This is Sun bug 4974440. This is fixed with patch 112760-07.
GCC 3.4 changed the default debugging format from STABS to DWARF-2 for
-32-bit code on Solaris 7 and later. If you are using the Sun
-assembler, this change apparently runs afoul of Sun bug 4910101, for
-which (as of 2004-05-23) there is no fix. A symptom of the problem is
-that you cannot compile C++ programs like @command{groff} 1.19.1
-without getting messages similar to the following:
+32-bit code on Solaris 7 and later. If you use the Sun assembler, this
+change apparently runs afoul of Sun bug 4910101 (which is referenced as
+a x86-only problem by Sun, probably because they do not use DWARF-2).
+A symptom of the problem is that you cannot compile C++ programs like
+@command{groff} 1.19.1 without getting messages similar to the following:
@smallexample
ld: warning: relocation error: R_SPARC_UA32: @dots{}
@@ -3697,6 +3718,17 @@ ld: fatal: relocation error: R_SPARC_32: file libgcc/sparcv9/_muldi3.o:
This bug has been fixed in the final 5.0 version of the assembler.
+A similar problem was reported for version Sun WorkShop 6 99/08/18 of the
+Sun assembler, which causes a bootstrap failure with GCC 4.0.0:
+
+@smallexample
+ld: fatal: relocation error: R_SPARC_DISP32:
+ file .libs/libstdc++.lax/libsupc++convenience.a/vterminate.o:
+ symbol <unknown>: offset 0xfccd33ad is non-aligned
+@end smallexample
+
+This bug has been fixed in more recent revisions of the assembler.
+
@html
<hr />
@end html
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 1a96988ced2..ebb783e95d0 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -218,8 +218,8 @@ Objective-C and Objective-C++ Dialects}.
@item Warning Options
@xref{Warning Options,,Options to Request or Suppress Warnings}.
@gccoptlist{-fsyntax-only -pedantic -pedantic-errors @gol
--w -Wextra -Wall -Waggregate-return @gol
--Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment @gol
+-w -Wextra -Wall -Waggregate-return -Wno-attributes @gol
+-Wc++-compat -Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment @gol
-Wconversion -Wno-deprecated-declarations @gol
-Wdisabled-optimization -Wno-div-by-zero -Wno-endif-labels @gol
-Werror -Werror-implicit-function-declaration @gol
@@ -277,6 +277,7 @@ Objective-C and Objective-C++ Dialects}.
-fdump-tree-sra@r{[}-@var{n}@r{]} @gol
-fdump-tree-salias @gol
-fdump-tree-fre@r{[}-@var{n}@r{]} @gol
+-fdump-tree-vrp@r{[}-@var{n}@r{]} @gol
-ftree-vectorizer-verbose=@var{n} @gol
-fdump-tree-storeccp@r{[}-@var{n}@r{]} @gol
-feliminate-dwarf2-dups -feliminate-unused-debug-types @gol
@@ -415,7 +416,8 @@ Objective-C and Objective-C++ Dialects}.
@emph{Blackfin Options}
@gccoptlist{-momit-leaf-frame-pointer -mno-omit-leaf-frame-pointer -mcsync @gol
-mno-csync -mlow-64k -mno-low64k -mid-shared-library @gol
--mno-id-shared-library -mshared-library-id=@var{n} @gol}
+-mno-id-shared-library -mshared-library-id=@var{n} @gol
+-mlong-calls -mno-long-calls}
@emph{CRIS Options}
@gccoptlist{-mcpu=@var{cpu} -march=@var{cpu} -mtune=@var{cpu} @gol
@@ -630,13 +632,13 @@ See RS/6000 and PowerPC Options.
-mstrict-align -mno-strict-align -mrelocatable @gol
-mno-relocatable -mrelocatable-lib -mno-relocatable-lib @gol
-mtoc -mno-toc -mlittle -mlittle-endian -mbig -mbig-endian @gol
--mdynamic-no-pic @gol
+-mdynamic-no-pic -maltivec -mswdiv @gol
-mprioritize-restricted-insns=@var{priority} @gol
-msched-costly-dep=@var{dependence_type} @gol
-minsert-sched-nops=@var{scheme} @gol
-mcall-sysv -mcall-netbsd @gol
-maix-struct-return -msvr4-struct-return @gol
--mabi=@var{abi-type} @gol
+-mabi=@var{abi-type} -msecure-plt -mbss-plt @gol
-misel -mno-isel @gol
-misel=yes -misel=no @gol
-mspe -mno-spe @gol
@@ -732,6 +734,7 @@ See S/390 and zSeries Options.
-finhibit-size-directive -finstrument-functions @gol
-fno-common -fno-ident @gol
-fpcc-struct-return -fpic -fPIC -fpie -fPIE @gol
+-fno-jump-tables @gol
-freg-struct-return -fshared-data -fshort-enums @gol
-fshort-double -fshort-wchar @gol
-fverbose-asm -fpack-struct[=@var{n}] -fstack-check @gol
@@ -2991,6 +2994,11 @@ to functions.
Warn whenever a function call is cast to a non-matching type.
For example, warn if @code{int malloc()} is cast to @code{anything *}.
+@item -Wc++-compat
+Warn about ISO C constructs that are outside of the common subset of
+ISO C and ISO C++, e.g.@: request for implicit conversion from
+@code{void *} to a pointer to non-@code{void} type.
+
@item -Wcast-qual
@opindex Wcast-qual
Warn whenever a pointer is cast so as to remove a type qualifier from
@@ -3046,6 +3054,14 @@ Warn if any functions that return structures or unions are defined or
called. (In languages where you can return an array, this also elicits
a warning.)
+@item -Wno-attributes
+@opindex Wno-attributes
+@opindex Wattributes
+Do not warn if an unexpected @code{__attribute__} is used, such as
+unrecognized attributes, function attributes applied to variables,
+etc. This will not stop errors for incorrect use of supported
+attributes.
+
@item -Wstrict-prototypes @r{(C only)}
@opindex Wstrict-prototypes
Warn if a function is declared or defined without specifying the
@@ -4058,6 +4074,11 @@ file name.
Dump each function after applying vectorization of loops. The file name is
made by appending @file{.vect} to the source file name.
+@item vrp
+@opindex fdump-tree-vrp
+Dump each function after Value Range Propagation (VRP). The file name
+is made by appending @file{.vrp} to the source file name.
+
@item all
@opindex fdump-tree-all
Enable all the available tree dumps with the flags provided in this option.
@@ -4312,6 +4333,7 @@ also turns on the following optimization flags:
-funit-at-a-time @gol
-falign-functions -falign-jumps @gol
-falign-loops -falign-labels @gol
+-ftree-vrp @gol
-ftree-pre}
Please note the warning under @option{-fgcse} about
@@ -4462,7 +4484,7 @@ See below for a documentation of the individual
parameters controlling inlining.
@emph{Note:} pseudo instruction represents, in this particular context, an
-abstract measurement of function's size. In no way, it represents a count
+abstract measurement of function's size. In no way does it represent a count
of assembly instructions and as such its exact meaning might change from one
release to an another.
@@ -4954,6 +4976,15 @@ optimization later. This is enabled by default at @option{-O} and higher.
@item -ftree-vectorize
Perform loop vectorization on trees.
+@item -ftree-vrp
+Perform Value Range Propagation on trees. This is similar to the
+constant propagation pass, but instead of values, ranges of values are
+propagated. This allows the optimizers to remove unnecessary range
+checks like array bound checks and null pointer checks. This is
+enabled by default at @option{-O2} and higher. Null pointer check
+elimination is only done if @option{-fdelete-null-pointer-checks} is
+enabled.
+
@item -ftracer
@opindex ftracer
Perform tail duplication to enlarge superblock size. This transformation
@@ -5301,6 +5332,10 @@ math functions.
The default is @option{-fmath-errno}.
+On Darwin systems, the math library never sets @code{errno}. There is therefore
+no reason for the compiler to consider the possibility that it might,
+and @option{-fno-math-errno} is the default.
+
@item -funsafe-math-optimizations
@opindex funsafe-math-optimizations
Allow optimizations for floating-point arithmetic that (a) assume
@@ -6875,10 +6910,6 @@ Some configurations of the compiler also support additional special
options, usually for compatibility with other compilers on the same
platform.
-These options are defined by the macro @code{TARGET_SWITCHES} in the
-machine description. The default for the options is also defined by
-that macro, which enables you to change the defaults.
-
@c This list is ordered alphanumerically by subsection name.
@c It should be the same order and spelling as these options are listed
@c in Machine Dependent Options
@@ -7388,6 +7419,21 @@ Specified the identification number of the ID based shared library being
compiled. Specifying a value of 0 will generate more compact code, specifying
other values will force the allocation of that number to the current
library but is no more space or time efficient than omitting this option.
+
+@item -mlong-calls
+@itemx -mno-long-calls
+@opindex mlong-calls
+@opindex mno-long-calls
+Tells the compiler to perform function calls by first loading the
+address of the function into a register and then performing a subroutine
+call on this register. This switch is needed if the target function
+will lie outside of the 24 bit addressing range of the offset based
+version of subroutine call instruction.
+
+This feature is not enabled by default. Specifying
+@option{-mno-long-calls} will restore the default behavior. Note these
+switches have no effect on how the compiler generates code to handle
+function calls via function pointers.
@end table
@node CRIS Options
@@ -9815,7 +9861,8 @@ Equivalent to @samp{-march=mips64}.
@itemx -mno-mips16
@opindex mips16
@opindex mno-mips16
-Use (do not use) the MIPS16 ISA@.
+Generate (do not generate) MIPS16 code. If GCC is targetting a
+MIPS32 or MIPS64 architecture, it will make use of the MIPS16e ASE@.
@item -mabi=32
@itemx -mabi=o64
@@ -10699,6 +10746,17 @@ values for @var{cpu_type} are used for @option{-mtune} as for
architecture, registers, and mnemonics set by @option{-mcpu}, but the
scheduling parameters set by @option{-mtune}.
+@item -mswdiv
+@itemx -mno-swdiv
+@opindex mswdiv
+@opindex mno-swdiv
+Generate code to compute division as reciprocal estimate and iterative
+refinement, creating opportunities for increased throughput. This
+feature requires: optional PowerPC Graphics instruction set for single
+precision and FRE instruction for double precision, assuming divides
+cannot generate user-visible traps, and the domain values not include
+Infinities, denormals or zero denominator.
+
@item -maltivec
@itemx -mno-altivec
@opindex maltivec
@@ -10725,6 +10783,18 @@ ABI@.
@opindex mabi=no-spe
Disable Booke SPE ABI extensions for the current ABI@.
+@item -msecure-plt
+@opindex msecure-plt
+Generate code that allows ld and ld.so to build executables and shared
+libraries with non-exec .plt and .got sections. This is a PowerPC
+32-bit SYSV ABI option.
+
+@item -mbss-plt
+@opindex mbss-plt
+Generate code that uses a BSS .plt section that ld.so fills in, and
+requires .plt and .got sections that are both writable and executable.
+This is a PowerPC 32-bit SYSV ABI option.
+
@item -misel
@itemx -mno-isel
@opindex misel
@@ -12566,6 +12636,15 @@ generated position independent code can be only linked into executables.
Usually these options are used when @option{-pie} GCC option will be
used during linking.
+@item -fno-jump-tables
+@opindex fno-jump-tables
+Do not use jump tables for switch statements even where it would be
+more efficient than other code generation strategies. This option is
+of use in conjunction with @option{-fpic} or @option{-fPIC} for
+building code which forms part of a dynamic linker and cannot
+reference the address of a jump table. On some targets, jump tables
+do not require a GOT and this option is not needed.
+
@item -ffixed-@var{reg}
@opindex ffixed
Treat the register named @var{reg} as a fixed register; generated code
@@ -12766,8 +12845,8 @@ For those adding visibility support to existing code, you may find
@samp{#pragma GCC visibility} of use. This works by you enclosing
the declarations you wish to set visibility for with (for example)
@samp{#pragma GCC visibility push(hidden)} and
-@samp{#pragma GCC visibility pop}. These can be nested up to sixteen
-times. Bear in mind that symbol visibility should be viewed @strong{as
+@samp{#pragma GCC visibility pop}.
+Bear in mind that symbol visibility should be viewed @strong{as
part of the API interface contract} and thus all new code should
always specify visibility when it is not the default ie; declarations
only for use within the local DSO should @strong{always} be marked explicitly
diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi
index 4feab32698e..81f5ebcf38e 100644
--- a/gcc/doc/md.texi
+++ b/gcc/doc/md.texi
@@ -4282,9 +4282,9 @@ 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
-additional modes required (@pxref{Condition Code}). Also define
-@code{SELECT_CC_MODE} to choose a mode given an operand of a compare.
+the SPARC), define them in @file{@var{machine}-modes.def}
+(@pxref{Condition Code}). Also define @code{SELECT_CC_MODE} to choose
+a mode given an operand of a compare.
If it is known during RTL generation that a different mode will be
required (for example, if the machine has separate compare instructions
@@ -4951,9 +4951,9 @@ jump. When new sequence contains multiple jump instructions or new labels,
more assistance is needed. Splitter is required to create only unconditional
jumps, or simple conditional jump instructions. Additionally it must attach a
@code{REG_BR_PROB} note to each conditional jump. A global variable
-@code{split_branch_probability} hold the probability of original branch in case
+@code{split_branch_probability} holds the probability of the original branch in case
it was an simple conditional jump, @minus{}1 otherwise. To simplify
-recomputing of edge frequencies, new sequence is required to have only
+recomputing of edge frequencies, the new sequence is required to have only
forward jumps to the newly created labels.
@findex define_insn_and_split
diff --git a/gcc/doc/options.texi b/gcc/doc/options.texi
index 307a325e5de..b4ada5bebdb 100644
--- a/gcc/doc/options.texi
+++ b/gcc/doc/options.texi
@@ -121,12 +121,29 @@ will check and convert the argument before passing it to the relevant
option handler.
@item Var(@var{var})
-The option controls an integer variable @var{var}. If the option has
-the @code{UInteger} property, the option parser will set @var{var} to
-the value of the user-specified argument. Otherwise the option is
-assumed to be an on/off switch that is active when @var{var} is nonzero.
-In this case, the option parser will set @var{var} to 1 when the positive
-form of the option is used and 0 when the ``no-'' form is used.
+The state of this option should be stored in variable @var{var}.
+The way that the state is stored depends on the type of option:
+
+@itemize @bullet
+@item
+If the option uses the @code{Mask} or @code{InverseMask} properties,
+@var{var} is the integer variable that contains the mask.
+
+@item
+If the option is a normal on/off switch, @var{var} is an integer
+variable that is nonzero when the option is enabled. The options
+parser will set the variable to 1 when the positive form of the
+option is used and 0 when the ``no-'' form is used.
+
+@item
+If the option takes an argument and has the @code{UInteger} property,
+@var{var} is an integer variable that stores the value of the argument.
+
+@item
+Otherwise, if the option takes an argument, @var{var} is a pointer to
+the argument string. The pointer will be null if the argument is optional
+and wasn't given.
+@end itemize
The option-processing script will usually declare @var{var} in
@file{options.c} and leave it to be zero-initialized at start-up time.
diff --git a/gcc/doc/passes.texi b/gcc/doc/passes.texi
index ad6110e7312..e2fcc7a5d02 100644
--- a/gcc/doc/passes.texi
+++ b/gcc/doc/passes.texi
@@ -639,7 +639,8 @@ The pass is located in @file{regmove.c}.
This pass looks for instructions that require the processor to be in a
specific ``mode'' and minimizes the number of mode changes required to
satisfy all users. What these modes are, and what they apply to are
-completely target-specific. The source is located in @file{lcm.c}.
+completely target-specific.
+The source is located in @file{mode-switching.c}.
@cindex modulo scheduling
@cindex sms, swing, software pipelining
diff --git a/gcc/doc/rtl.texi b/gcc/doc/rtl.texi
index f917c85e016..daca4cb5304 100644
--- a/gcc/doc/rtl.texi
+++ b/gcc/doc/rtl.texi
@@ -1191,7 +1191,8 @@ Algol or Pascal function variables including a static chain.
@findex MODE_CC
@item MODE_CC
Modes representing condition code values. These are @code{CCmode} plus
-any modes listed in the @code{EXTRA_CC_MODES} macro. @xref{Jump Patterns},
+any @code{CC_MODE} modes listed in the @file{@var{machine}-modes.def}.
+@xref{Jump Patterns},
also see @ref{Condition Code}.
@findex MODE_RANDOM
@@ -3115,9 +3116,6 @@ Appears near the end of the function body, just before the label that
does not suffice for returning). This note may be deleted by jump
optimization.
-@findex NOTE_INSN_SETJMP
-@item NOTE_INSN_SETJMP
-Appears following each call to @code{setjmp} or a related function.
@end table
These codes are printed symbolically when they appear in debugging dumps.
@@ -3298,6 +3296,11 @@ of this note indicates to other optimizations that this this branching
instruction should not be ``collapsed'' into a simpler branching
construct. It is used when the optimization to partition basic blocks
into hot and cold sections is turned on.
+
+@findex REG_SETJMP
+@item REG_SETJMP
+Appears attached to each @code{CALL_INSN} to @code{setjmp} or a
+related function.
@end table
The following notes describe attributes of outputs of an insn:
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 9e755aaf8af..b2310e0ffc3 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -728,11 +728,11 @@ any target-specific headers.
@deftypevar {Target Hook} int TARGET_DEFAULT_TARGET_FLAGS
This variable specifies the initial value of @code{target_flags}.
Its default setting is 0.
-
-If the target defines @code{TARGET_SWITCHES}, the null
-@code{TARGET_SWITCHES} entry will override this value.
@end deftypevar
+@cindex optional hardware or system features
+@cindex features, optional, in system conventions
+
@deftypefn {Target Hook} bool TARGET_HANDLE_OPTION (size_t @var{code}, const char *@var{arg}, int @var{value})
This hook is called whenever the user specifies one of the
target-specific options described by the @file{.opt} definition files
@@ -750,153 +750,6 @@ argument. Otherwise @var{value} is 1 if the positive form of the
option was used and 0 if the ``no-'' form was.
@end deftypefn
-@cindex optional hardware or system features
-@cindex features, optional, in system conventions
-
-@defmac TARGET_@var{featurename}
-This series of macros is to allow compiler command arguments to
-enable or disable the use of optional features of the target machine.
-For example, one machine description serves both the 68000 and
-the 68020; a command argument tells the compiler whether it should
-use 68020-only instructions or not. This command argument works
-by means of a macro @code{TARGET_68020} that tests a bit in
-@code{target_flags}.
-
-Define a macro @code{TARGET_@var{featurename}} for each such option.
-Its definition should test a bit in @code{target_flags}. It is
-recommended that a helper macro @code{MASK_@var{featurename}}
-is defined for each bit-value to test, and used in
-@code{TARGET_@var{featurename}} and @code{TARGET_SWITCHES}. For
-example:
-
-@smallexample
-#define TARGET_MASK_68020 1
-#define TARGET_68020 (target_flags & MASK_68020)
-@end smallexample
-
-One place where these macros are used is in the condition-expressions
-of instruction patterns. Note how @code{TARGET_68020} appears
-frequently in the 68000 machine description file, @file{m68k.md}.
-Another place they are used is in the definitions of the other
-macros in the @file{@var{machine}.h} file.
-@end defmac
-
-@defmac TARGET_SWITCHES
-This macro defines names of command options to set and clear
-bits in @code{target_flags}. Its definition is an initializer
-with a subgrouping for each command option.
-
-Each subgrouping contains a string constant, that defines the option
-name, a number, which contains the bits to set in
-@code{target_flags}, and a second string which is the description
-displayed by @option{--help}. If the number is negative then the bits specified
-by the number are cleared instead of being set. If the description
-string is present but empty, then no help information will be displayed
-for that option, but it will not count as an undocumented option. The
-actual option name is made by appending @samp{-m} to the specified name.
-Non-empty description strings should be marked with @code{N_(@dots{})} for
-@command{xgettext}. Please do not mark empty strings because the empty
-string is reserved by GNU gettext. @code{gettext("")} returns the header entry
-of the message catalog with meta information, not the empty string.
-
-In addition to the description for @option{--help},
-more detailed documentation for each option should be added to
-@file{invoke.texi}.
-
-One of the subgroupings should have a null string. The number in
-this grouping is the default value for @code{target_flags}. Any
-target options act starting with that value.
-
-Here is an example which defines @option{-m68000} and @option{-m68020}
-with opposite meanings, and picks the latter as the default:
-
-@smallexample
-#define TARGET_SWITCHES \
- @{ @{ "68020", MASK_68020, "" @}, \
- @{ "68000", -MASK_68020, \
- N_("Compile for the 68000") @}, \
- @{ "", MASK_68020, "" @}, \
- @}
-@end smallexample
-
-This macro is being kept for compatibility with older backends.
-New targets should use option definition files instead.
-@xref{Back End}.
-@end defmac
-
-@defmac TARGET_OPTIONS
-This macro is similar to @code{TARGET_SWITCHES} but defines names of command
-options that have values. Its definition is an initializer with a
-subgrouping for each command option.
-
-Each subgrouping contains a string constant, that defines the option
-name, the address of a variable, a description string, and a value.
-Non-empty description strings should be marked with @code{N_(@dots{})}
-for @command{xgettext}. Please do not mark empty strings because the
-empty string is reserved by GNU gettext. @code{gettext("")} returns the
-header entry of the message catalog with meta information, not the empty
-string.
-
-If the value listed in the table is @code{NULL}, then the variable, type
-@code{char *}, is set to the variable part of the given option if the
-fixed part matches. In other words, if the first part of the option
-matches what's in the table, the variable will be set to point to the
-rest of the option. This allows the user to specify a value for that
-option. The actual option name is made by appending @samp{-m} to the
-specified name. Again, each option should also be documented in
-@file{invoke.texi}.
-
-If the value listed in the table is non-@code{NULL}, then the option
-must match the option in the table exactly (with @samp{-m}), and the
-variable is set to point to the value listed in the table.
-
-Here is an example which defines @option{-mshort-data-@var{number}}. If the
-given option is @option{-mshort-data-512}, the variable @code{m88k_short_data}
-will be set to the string @code{"512"}.
-
-@smallexample
-extern char *m88k_short_data;
-#define TARGET_OPTIONS \
- @{ @{ "short-data-", &m88k_short_data, \
- N_("Specify the size of the short data section"), 0 @} @}
-@end smallexample
-
-Here is a variant of the above that allows the user to also specify
-just @option{-mshort-data} where a default of @code{"64"} is used.
-
-@smallexample
-extern char *m88k_short_data;
-#define TARGET_OPTIONS \
- @{ @{ "short-data-", &m88k_short_data, \
- N_("Specify the size of the short data section"), 0 @} \
- @{ "short-data", &m88k_short_data, "", "64" @},
- @}
-@end smallexample
-
-Here is an example which defines @option{-mno-alu}, @option{-malu1}, and
-@option{-malu2} as a three-state switch, along with suitable macros for
-checking the state of the option (documentation is elided for brevity).
-
-@smallexample
-[chip.c]
-char *chip_alu = ""; /* @r{Specify default here.} */
-
-[chip.h]
-extern char *chip_alu;
-#define TARGET_OPTIONS \
- @{ @{ "no-alu", &chip_alu, "", "" @}, \
- @{ "alu1", &chip_alu, "", "1" @}, \
- @{ "alu2", &chip_alu, "", "2" @}, @}
-#define TARGET_ALU (chip_alu[0] != '\0')
-#define TARGET_ALU1 (chip_alu[0] == '1')
-#define TARGET_ALU2 (chip_alu[0] == '2')
-@end smallexample
-
-This macro is being kept for compatibility with older backends.
-New targets should use option definition files instead.
-@xref{Back End}.
-@end defmac
-
@defmac TARGET_VERSION
This macro is a C statement to print on @code{stderr} a string
describing the particular machine description choice. Every machine
@@ -8287,6 +8140,11 @@ A C statement to issue assembly directives that create a self-relative
reference to the given label, using an integer of the given size.
@end defmac
+@deftypefn {Target Hook} void TARGET_ASM_OUTPUT_DWARF_DTPREL (FILE *@var{FILE}, int @var{size}, rtx @var{x})
+If defined, this target hook is a function which outputs a DTP-relative
+reference to the given TLS symbol of the specified size.
+@end deftypefn
+
@defmac PUT_SDB_@dots{}
Define these macros to override the assembler syntax for the special
SDB assembler directives. See @file{sdbout.c} for a list of these
@@ -8668,24 +8526,32 @@ Default: empty.
@section Parameters for Precompiled Header Validity Checking
@cindex parameters, precompiled headers
-@deftypefn {Target Hook} void * TARGET_GET_PCH_VALIDITY (size_t * @var{sz})
-Define this hook if your target needs to check a different collection
-of flags than the default, which is every flag defined by
-@code{TARGET_SWITCHES} and @code{TARGET_OPTIONS}. It should return
-some data which will be saved in the PCH file and presented to
-@code{TARGET_PCH_VALID_P} later; it should set @code{SZ} to the size
-of the data.
+@deftypefn {Target Hook} void *TARGET_GET_PCH_VALIDITY (size_t *@var{sz})
+This hook returns the data needed by @code{TARGET_PCH_VALID_P} and sets
+@samp{*@var{sz}} to the size of the data in bytes.
+@end deftypefn
+
+@deftypefn {Target Hook} const char *TARGET_PCH_VALID_P (const void *@var{data}, size_t @var{sz})
+This hook checks whether the options used to create a PCH file are
+compatible with the current settings. It returns @code{NULL}
+if so and a suitable error message if not. Error messages will
+be presented to the user and must be localized using @samp{_(@var{msg})}.
+
+@var{data} is the data that was returned by @code{TARGET_GET_PCH_VALIDITY}
+when the PCH file was created and @var{sz} is the size of that data in bytes.
+It's safe to assume that the data was created by the same version of the
+compiler, so no format checking is needed.
+
+The default definition of @code{default_pch_valid_p} should be
+suitable for most targets.
@end deftypefn
-@deftypefn {Target Hook} const char * TARGET_PCH_VALID_P (const void * @var{data}, size_t @var{sz})
-Define this hook if your target needs to check a different collection of
-flags than the default, which is every flag defined by @code{TARGET_SWITCHES}
-and @code{TARGET_OPTIONS}. It is given data which came from
-@code{TARGET_GET_PCH_VALIDITY} (in this version of this compiler, so there
-is no need for extensive validity checking). It returns @code{NULL} if
-it is safe to load a PCH file with this data, or a suitable error message
-if not. The error message will be presented to the user, so it should
-be localized.
+@deftypefn {Target Hook} const char *TARGET_CHECK_PCH_TARGET_FLAGS (int @var{pch_flags})
+If this hook is nonnull, the default implementation of
+@code{TARGET_PCH_VALID_P} will use it to check for compatible values
+of @code{target_flags}. @var{pch_flags} specifies the value that
+@code{target_flags} had when the PCH file was created. The return
+value is the same as for @code{TARGET_PCH_VALID_P}.
@end deftypefn
@node C++ ABI
@@ -9511,6 +9377,18 @@ simplified expression for the call's result. If @var{ignore} is true
the value will be ignored.
@end deftypefn
+@deftypefn {Target Hook} const char * TARGET_INVALID_WITHIN_DOLOOP (rtx @var{insn})
+
+Take an instruction in @var{insn} and return NULL if it is valid within a
+low-overhead loop, otherwise return a string why doloop could not be applied.
+
+Many targets use special registers for low-overhead looping. For any
+instruction that clobbers these this function should return a string indicating
+the reason why the doloop could not be applied.
+By default, the RTL loop optimizer does not use a present doloop pattern for
+loops containing function calls or branch on table instructions.
+@end deftypefn
+
@defmac MD_CAN_REDIRECT_BRANCH (@var{branch1}, @var{branch2})
Take a branch insn in @var{branch1} and another in @var{branch2}.
diff --git a/gcc/doc/tree-ssa.texi b/gcc/doc/tree-ssa.texi
index cbceb37073c..7113c394dd5 100644
--- a/gcc/doc/tree-ssa.texi
+++ b/gcc/doc/tree-ssa.texi
@@ -632,6 +632,12 @@ void f()
op2 -> var
compref : inner-compref
+ | TARGET_MEM_REF
+ op0 -> ID
+ op1 -> val
+ op2 -> val
+ op3 -> CONST
+ op4 -> CONST
| REALPART_EXPR
op0 -> inner-compref
| IMAGPART_EXPR
@@ -1282,7 +1288,7 @@ After the replacement mappings have been registered and new symbols
marked for renaming, a call to @code{update_ssa} makes the registered
changes. This can be done with an explicit call or by creating
@code{TODO} flags in the @code{tree_opt_pass} structure for your pass.
-There are several @code{TODO} flags that control the behaviour of
+There are several @code{TODO} flags that control the behavior of
@code{update_ssa}:
@itemize @bullet
@@ -1304,7 +1310,7 @@ There are several @code{TODO} flags that control the behaviour of
@item @code{TODO_update_ssa_full_phi}. Insert PHI nodes everywhere
- they are needed. No prunning of the IDF is done. This is used
+ they are needed. No pruning of the IDF is done. This is used
by passes that need the PHI nodes for @code{O_j} even if it
means that some arguments will come from the default definition
of @code{O_j}'s symbol (e.g., @code{pass_linear_transform})@.
diff --git a/gcc/dominance.c b/gcc/dominance.c
index ce977e292fe..1018d1ae30e 100644
--- a/gcc/dominance.c
+++ b/gcc/dominance.c
@@ -41,7 +41,7 @@
#include "hard-reg-set.h"
#include "obstack.h"
#include "basic-block.h"
-#include "errors.h"
+#include "toplev.h"
#include "et-forest.h"
/* Whether the dominators and the postdominators are available. */
@@ -746,15 +746,15 @@ get_dominated_by_region (enum cdi_direction dir, basic_block *region,
basic_block dom;
for (i = 0; i < n_region; i++)
- region[i]->rbi->duplicated = 1;
+ region[i]->flags |= BB_DUPLICATED;
for (i = 0; i < n_region; i++)
for (dom = first_dom_son (dir, region[i]);
dom;
dom = next_dom_son (dir, dom))
- if (!dom->rbi->duplicated)
+ if (!(dom->flags & BB_DUPLICATED))
doms[n_doms++] = dom;
for (i = 0; i < n_region; i++)
- region[i]->rbi->duplicated = 0;
+ region[i]->flags &= ~BB_DUPLICATED;
return n_doms;
}
diff --git a/gcc/domwalk.c b/gcc/domwalk.c
index 2713e04c097..389dac23e4d 100644
--- a/gcc/domwalk.c
+++ b/gcc/domwalk.c
@@ -161,10 +161,9 @@ walk_dominator_tree (struct dom_walk_data *walk_data, basic_block bb)
/* First get some local data, reusing any local data pointer we may
have saved. */
- if (VARRAY_ACTIVE_SIZE (walk_data->free_block_data) > 0)
+ if (VEC_length (void_p, walk_data->free_block_data) > 0)
{
- bd = VARRAY_TOP_GENERIC_PTR (walk_data->free_block_data);
- VARRAY_POP (walk_data->free_block_data);
+ bd = VEC_pop (void_p, walk_data->free_block_data);
recycled = 1;
}
else
@@ -174,7 +173,7 @@ walk_dominator_tree (struct dom_walk_data *walk_data, basic_block bb)
}
/* Push the local data into the local data stack. */
- VARRAY_PUSH_GENERIC_PTR (walk_data->block_data_stack, bd);
+ VEC_safe_push (void_p, heap, walk_data->block_data_stack, bd);
/* Call the initializer. */
walk_data->initialize_block_local_data (walk_data, bb, recycled);
@@ -237,26 +236,18 @@ walk_dominator_tree (struct dom_walk_data *walk_data, basic_block bb)
if (walk_data->initialize_block_local_data)
{
/* And save the block data so that we can re-use it. */
- VARRAY_PUSH_GENERIC_PTR (walk_data->free_block_data, bd);
+ VEC_safe_push (void_p, heap, walk_data->free_block_data, bd);
/* And finally pop the record off the block local data stack. */
- VARRAY_POP (walk_data->block_data_stack);
+ VEC_pop (void_p, walk_data->block_data_stack);
}
}
void
init_walk_dominator_tree (struct dom_walk_data *walk_data)
{
- if (walk_data->initialize_block_local_data)
- {
- VARRAY_GENERIC_PTR_INIT (walk_data->free_block_data, 2, "freelist ");
- VARRAY_GENERIC_PTR_INIT (walk_data->block_data_stack, 2, "block_data");
- }
- else
- {
- walk_data->free_block_data = NULL;
- walk_data->block_data_stack = NULL;
- }
+ walk_data->free_block_data = NULL;
+ walk_data->block_data_stack = NULL;
}
void
@@ -264,10 +255,10 @@ fini_walk_dominator_tree (struct dom_walk_data *walk_data)
{
if (walk_data->initialize_block_local_data)
{
- while (VARRAY_ACTIVE_SIZE (walk_data->free_block_data) > 0)
- {
- free (VARRAY_TOP_GENERIC_PTR (walk_data->free_block_data));
- VARRAY_POP (walk_data->free_block_data);
- }
+ while (VEC_length (void_p, walk_data->free_block_data) > 0)
+ free (VEC_pop (void_p, walk_data->free_block_data));
}
+
+ VEC_free (void_p, heap, walk_data->free_block_data);
+ VEC_free (void_p, heap, walk_data->block_data_stack);
}
diff --git a/gcc/domwalk.h b/gcc/domwalk.h
index bf16229b488..ba0624ef160 100644
--- a/gcc/domwalk.h
+++ b/gcc/domwalk.h
@@ -19,6 +19,10 @@ along with GCC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+typedef void *void_p;
+DEF_VEC_P(void_p);
+DEF_VEC_ALLOC_P(void_p,heap);
+
/* This is the main data structure for the dominator walker. It provides
the callback hooks as well as a convenient place to hang block local
data and pass-global data. */
@@ -94,7 +98,7 @@ struct dom_walk_data
/* Stack of any data we need to keep on a per-block basis.
If you have no local data, then BLOCK_DATA_STACK will be NULL. */
- varray_type block_data_stack;
+ VEC(void_p,heap) *block_data_stack;
/* Size of the block local data. If this is zero, then it is assumed
you have no local data and thus no BLOCK_DATA_STACK as well. */
@@ -104,7 +108,7 @@ struct dom_walk_data
information/data outside domwalk.c. */
/* Stack of available block local structures. */
- varray_type free_block_data;
+ VEC(void_p,heap) *free_block_data;
/* Interesting blocks to process. If this field is not NULL, this
set is used to determine which blocks to walk. If we encounter
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 32711c7227c..1ae49905806 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -2996,7 +2996,6 @@ new_loc_descr (enum dwarf_location_atom op, unsigned HOST_WIDE_INT oprnd1,
return descr;
}
-
/* Add a location description term to a location description expression. */
static inline void
@@ -3262,13 +3261,15 @@ output_loc_operands (dw_loc_descr_ref loc)
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
- gcc_unreachable ();
-#endif
+ if (targetm.asm_out.output_dwarf_dtprel)
+ {
+ targetm.asm_out.output_dwarf_dtprel (asm_out_file,
+ DWARF2_ADDR_SIZE,
+ val1->v.val_addr);
+ fputc ('\n', asm_out_file);
+ }
+ else
+ gcc_unreachable ();
break;
default:
@@ -3972,6 +3973,7 @@ static dw_die_ref subrange_type_die (tree, dw_die_ref);
static dw_die_ref modified_type_die (tree, int, int, dw_die_ref);
static int type_is_enum (tree);
static unsigned int dbx_reg_number (rtx);
+static void add_loc_descr_op_piece (dw_loc_descr_ref *, int);
static dw_loc_descr_ref reg_loc_descriptor (rtx);
static dw_loc_descr_ref one_reg_loc_descriptor (unsigned int);
static dw_loc_descr_ref multiple_reg_loc_descriptor (rtx, rtx);
@@ -8408,6 +8410,26 @@ dbx_reg_number (rtx rtl)
return DBX_REGISTER_NUMBER (regno);
}
+/* Optionally add a DW_OP_piece term to a location description expression.
+ DW_OP_piece is only added if the location description expression already
+ doesn't end with DW_OP_piece. */
+
+static void
+add_loc_descr_op_piece (dw_loc_descr_ref *list_head, int size)
+{
+ dw_loc_descr_ref loc;
+
+ if (*list_head != NULL)
+ {
+ /* Find the end of the chain. */
+ for (loc = *list_head; loc->dw_loc_next != NULL; loc = loc->dw_loc_next)
+ ;
+
+ if (loc->dw_loc_opc != DW_OP_piece)
+ loc->dw_loc_next = new_loc_descr (DW_OP_piece, size, 0);
+ }
+}
+
/* Return a location descriptor that designates a machine register or
zero if there is none. */
@@ -8467,7 +8489,7 @@ multiple_reg_loc_descriptor (rtx rtl, rtx regs)
t = one_reg_loc_descriptor (reg);
add_loc_descr (&loc_result, t);
- add_loc_descr (&loc_result, new_loc_descr (DW_OP_piece, size, 0));
+ add_loc_descr_op_piece (&loc_result, size);
++reg;
}
return loc_result;
@@ -8487,7 +8509,7 @@ multiple_reg_loc_descriptor (rtx rtl, rtx regs)
t = one_reg_loc_descriptor (REGNO (XVECEXP (regs, 0, i)));
add_loc_descr (&loc_result, t);
size = GET_MODE_SIZE (GET_MODE (XVECEXP (regs, 0, 0)));
- add_loc_descr (&loc_result, new_loc_descr (DW_OP_piece, size, 0));
+ add_loc_descr_op_piece (&loc_result, size);
}
return loc_result;
}
@@ -8790,14 +8812,10 @@ concat_loc_descriptor (rtx x0, rtx x1)
return 0;
cc_loc_result = x0_ref;
- add_loc_descr (&cc_loc_result,
- new_loc_descr (DW_OP_piece,
- GET_MODE_SIZE (GET_MODE (x0)), 0));
+ add_loc_descr_op_piece (&cc_loc_result, GET_MODE_SIZE (GET_MODE (x0)));
add_loc_descr (&cc_loc_result, x1_ref);
- add_loc_descr (&cc_loc_result,
- new_loc_descr (DW_OP_piece,
- GET_MODE_SIZE (GET_MODE (x1)), 0));
+ add_loc_descr_op_piece (&cc_loc_result, GET_MODE_SIZE (GET_MODE (x1)));
return cc_loc_result;
}
@@ -8862,8 +8880,7 @@ loc_descriptor (rtx rtl, bool can_use_fbreg)
loc_result = loc_descriptor (XEXP (RTVEC_ELT (par_elems, 0), 0),
can_use_fbreg);
mode = GET_MODE (XEXP (RTVEC_ELT (par_elems, 0), 0));
- add_loc_descr (&loc_result,
- new_loc_descr (DW_OP_piece, GET_MODE_SIZE (mode), 0));
+ add_loc_descr_op_piece (&loc_result, GET_MODE_SIZE (mode));
for (i = 1; i < num_elem; i++)
{
dw_loc_descr_ref temp;
@@ -8872,9 +8889,7 @@ loc_descriptor (rtx rtl, bool can_use_fbreg)
can_use_fbreg);
add_loc_descr (&loc_result, temp);
mode = GET_MODE (XEXP (RTVEC_ELT (par_elems, i), 0));
- add_loc_descr (&loc_result,
- new_loc_descr (DW_OP_piece,
- GET_MODE_SIZE (mode), 0));
+ add_loc_descr_op_piece (&loc_result, GET_MODE_SIZE (mode));
}
}
break;
@@ -8939,10 +8954,9 @@ loc_descriptor_from_tree_1 (tree loc, int want_address)
{
rtx rtl;
-#ifndef ASM_OUTPUT_DWARF_DTPREL
/* If this is not defined, we have no way to emit the data. */
- return 0;
-#endif
+ if (!targetm.asm_out.output_dwarf_dtprel)
+ return 0;
/* The way DW_OP_GNU_push_tls_address is specified, we can only
look up addresses of objects in the current module. */
@@ -8972,8 +8986,9 @@ loc_descriptor_from_tree_1 (tree loc, int want_address)
/* FALLTHRU */
case PARM_DECL:
- if (DECL_VALUE_EXPR (loc))
- return loc_descriptor_from_tree_1 (DECL_VALUE_EXPR (loc), want_address);
+ if (DECL_HAS_VALUE_EXPR_P (loc))
+ return loc_descriptor_from_tree_1 (DECL_VALUE_EXPR (loc),
+ want_address);
/* FALLTHRU */
case RESULT_DECL:
@@ -12508,6 +12523,11 @@ decls_for_scope (tree stmt, dw_die_ref context_die, int depth)
if (die != NULL && die->die_parent == NULL)
add_child_die (context_die, die);
+ /* Do not produce debug information for static variables since
+ these might be optimized out. We are called for these later
+ in cgraph_varpool_analyze_pending_decls. */
+ if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
+ ;
else
gen_decl_die (decl, context_die);
}
@@ -13055,6 +13075,10 @@ dwarf2out_decl (tree decl)
if (DECL_EXTERNAL (decl) && !TREE_USED (decl))
return;
+ /* For local statics lookup proper context die. */
+ if (TREE_STATIC (decl) && decl_function_context (decl))
+ context_die = lookup_decl_die (DECL_CONTEXT (decl));
+
/* If we are in terse mode, don't generate any DIEs to represent any
variable declarations or definitions. */
if (debug_info_level <= DINFO_LEVEL_TERSE)
@@ -13283,7 +13307,7 @@ dwarf2out_var_location (rtx loc_note)
last_insn = loc_note;
last_label = newloc->label;
decl = NOTE_VAR_LOCATION_DECL (loc_note);
- if (DECL_DEBUG_EXPR (decl) && DECL_DEBUG_EXPR_IS_FROM (decl)
+ if (DECL_DEBUG_EXPR_IS_FROM (decl) && DECL_DEBUG_EXPR (decl)
&& DECL_P (DECL_DEBUG_EXPR (decl)))
decl = DECL_DEBUG_EXPR (decl);
add_var_loc_to_decl (decl, newloc);
diff --git a/gcc/errors.h b/gcc/errors.h
index 9aa87e72852..cc0c4a07b96 100644
--- a/gcc/errors.h
+++ b/gcc/errors.h
@@ -30,10 +30,10 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#ifndef GCC_ERRORS_H
#define GCC_ERRORS_H
-extern void warning (int, const char *, ...);
-extern void error (const char *, ...);
-extern void fatal (const char *, ...) ATTRIBUTE_NORETURN;
-extern void internal_error (const char *, ...) ATTRIBUTE_NORETURN;
+extern void warning (int, const char *, ...) ATTRIBUTE_PRINTF_2;
+extern void error (const char *, ...) ATTRIBUTE_PRINTF_1;
+extern void fatal (const char *, ...) ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF_1;
+extern void internal_error (const char *, ...) ATTRIBUTE_NORETURN ATTRIBUTE_PRINTF_1;
extern const char *trim_filename (const char *);
extern int have_error;
diff --git a/gcc/except.c b/gcc/except.c
index 9f1bfe926af..e78341110d9 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -139,8 +139,7 @@ struct eh_region GTY(())
ERT_CATCH,
ERT_ALLOWED_EXCEPTIONS,
ERT_MUST_NOT_THROW,
- ERT_THROW,
- ERT_FIXUP
+ ERT_THROW
} type;
/* Holds the action to perform based on the preceding type. */
@@ -150,8 +149,6 @@ struct eh_region GTY(())
struct eh_region_u_try {
struct eh_region *catch;
struct eh_region *last_catch;
- struct eh_region *prev_try;
- rtx continue_label;
} GTY ((tag ("ERT_TRY"))) try;
/* The list through the catch handlers, the list of type objects
@@ -180,13 +177,6 @@ struct eh_region GTY(())
struct eh_region_u_cleanup {
struct eh_region *prev_try;
} GTY ((tag ("ERT_CLEANUP"))) cleanup;
-
- /* The real region (by expression and by pointer) that fixup code
- should live in. */
- struct eh_region_u_fixup {
- struct eh_region *real_region;
- bool resolved;
- } GTY ((tag ("ERT_FIXUP"))) fixup;
} GTY ((desc ("%0.type"))) u;
/* Entry point for this region's handler before landing pads are built. */
@@ -572,6 +562,7 @@ expand_resx_expr (tree exp)
int region_nr = TREE_INT_CST_LOW (TREE_OPERAND (exp, 0));
struct eh_region *reg = cfun->eh->region_array[region_nr];
+ gcc_assert (!reg->resume);
reg->resume = emit_jump_insn (gen_rtx_RESX (VOIDmode, region_nr));
emit_barrier ();
}
@@ -2430,7 +2421,6 @@ reachable_next_level (struct eh_region *region, tree type_thrown,
return RNL_BLOCKED;
case ERT_THROW:
- case ERT_FIXUP:
case ERT_UNKNOWN:
/* Shouldn't see these here. */
gcc_unreachable ();
@@ -2539,7 +2529,7 @@ reachable_handlers (rtx insn)
within the function. */
bool
-can_throw_internal_1 (int region_number)
+can_throw_internal_1 (int region_number, bool is_resx)
{
struct eh_region *region;
tree type_thrown;
@@ -2547,7 +2537,9 @@ can_throw_internal_1 (int region_number)
region = cfun->eh->region_array[region_number];
type_thrown = NULL_TREE;
- if (region->type == ERT_THROW)
+ if (is_resx)
+ region = region->outer;
+ else if (region->type == ERT_THROW)
{
type_thrown = region->u.throw.type;
region = region->outer;
@@ -2579,7 +2571,7 @@ can_throw_internal (rtx insn)
if (JUMP_P (insn)
&& GET_CODE (PATTERN (insn)) == RESX
&& XINT (PATTERN (insn), 0) > 0)
- return can_throw_internal_1 (XINT (PATTERN (insn), 0));
+ return can_throw_internal_1 (XINT (PATTERN (insn), 0), true);
if (NONJUMP_INSN_P (insn)
&& GET_CODE (PATTERN (insn)) == SEQUENCE)
@@ -2590,14 +2582,14 @@ can_throw_internal (rtx insn)
if (!note || INTVAL (XEXP (note, 0)) <= 0)
return false;
- return can_throw_internal_1 (INTVAL (XEXP (note, 0)));
+ return can_throw_internal_1 (INTVAL (XEXP (note, 0)), false);
}
/* Determine if the given INSN can throw an exception that is
visible outside the function. */
bool
-can_throw_external_1 (int region_number)
+can_throw_external_1 (int region_number, bool is_resx)
{
struct eh_region *region;
tree type_thrown;
@@ -2605,7 +2597,9 @@ can_throw_external_1 (int region_number)
region = cfun->eh->region_array[region_number];
type_thrown = NULL_TREE;
- if (region->type == ERT_THROW)
+ if (is_resx)
+ region = region->outer;
+ else if (region->type == ERT_THROW)
{
type_thrown = region->u.throw.type;
region = region->outer;
@@ -2628,6 +2622,11 @@ can_throw_external (rtx insn)
if (! INSN_P (insn))
return false;
+ if (JUMP_P (insn)
+ && GET_CODE (PATTERN (insn)) == RESX
+ && XINT (PATTERN (insn), 0) > 0)
+ return can_throw_external_1 (XINT (PATTERN (insn), 0), true);
+
if (NONJUMP_INSN_P (insn)
&& GET_CODE (PATTERN (insn)) == SEQUENCE)
insn = XVECEXP (PATTERN (insn), 0, 0);
@@ -2647,7 +2646,7 @@ can_throw_external (rtx insn)
if (INTVAL (XEXP (note, 0)) <= 0)
return false;
- return can_throw_external_1 (INTVAL (XEXP (note, 0)));
+ return can_throw_external_1 (INTVAL (XEXP (note, 0)), false);
}
/* Set TREE_NOTHROW and cfun->all_throwers_are_sibcalls. */
@@ -3605,7 +3604,7 @@ dump_eh_tree (FILE *out, struct function *fun)
int depth = 0;
static const char * const type_name[] = {"unknown", "cleanup", "try", "catch",
"allowed_exceptions", "must_not_throw",
- "throw", "fixup"};
+ "throw"};
i = fun->eh->region_tree;
if (! i)
diff --git a/gcc/except.h b/gcc/except.h
index 9526b865909..9188c3bb60f 100644
--- a/gcc/except.h
+++ b/gcc/except.h
@@ -46,9 +46,9 @@ extern void for_each_eh_label (void (*) (rtx));
extern void for_each_eh_region (void (*) (struct eh_region *));
/* Determine if the given INSN can throw an exception. */
-extern bool can_throw_internal_1 (int);
+extern bool can_throw_internal_1 (int, bool);
extern bool can_throw_internal (rtx);
-extern bool can_throw_external_1 (int);
+extern bool can_throw_external_1 (int, bool);
extern bool can_throw_external (rtx);
/* Set TREE_NOTHROW and cfun->all_throwers_are_sibcalls. */
diff --git a/gcc/expmed.c b/gcc/expmed.c
index c814233d24c..ff8c278ced3 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -3030,7 +3030,7 @@ expand_mult (enum machine_mode mode, rtx op0, rtx op1, rtx target,
/* These are the operations that are potentially turned into a sequence
of shifts and additions. */
- if (GET_MODE_CLASS (mode) == MODE_INT
+ if (SCALAR_INT_MODE_P (mode)
&& (unsignedp || !flag_trapv))
{
HOST_WIDE_INT coeff = 0;
diff --git a/gcc/expr.c b/gcc/expr.c
index 459c248f420..8b75ed7c605 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -466,19 +466,27 @@ convert_move (rtx to, rtx from, int unsignedp)
}
if (GET_MODE_CLASS (from_mode) == MODE_PARTIAL_INT)
{
+ rtx new_from;
enum machine_mode full_mode
= smallest_mode_for_size (GET_MODE_BITSIZE (from_mode), MODE_INT);
gcc_assert (sext_optab->handlers[full_mode][from_mode].insn_code
!= CODE_FOR_nothing);
- emit_unop_insn (sext_optab->handlers[full_mode][from_mode].insn_code,
- to, from, UNKNOWN);
if (to_mode == full_mode)
- return;
+ {
+ emit_unop_insn (sext_optab->handlers[full_mode][from_mode].insn_code,
+ to, from, UNKNOWN);
+ return;
+ }
+
+ new_from = gen_reg_rtx (full_mode);
+ emit_unop_insn (sext_optab->handlers[full_mode][from_mode].insn_code,
+ new_from, from, UNKNOWN);
/* else proceed to integer conversions below. */
from_mode = full_mode;
+ from = new_from;
}
/* Now both modes are integers. */
@@ -6108,7 +6116,7 @@ expand_var (tree var)
? !TREE_ASM_WRITTEN (var)
: !DECL_RTL_SET_P (var))
{
- if (TREE_CODE (var) == VAR_DECL && DECL_VALUE_EXPR (var))
+ if (TREE_CODE (var) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (var))
/* Should be ignored. */;
else if (lang_hooks.expand_decl (var))
/* OK. */;
@@ -6854,7 +6862,6 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
case INDIRECT_REF:
{
tree exp1 = TREE_OPERAND (exp, 0);
- tree orig;
if (modifier != EXPAND_WRITE)
{
@@ -6877,10 +6884,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
temp = gen_rtx_MEM (mode, op0);
- orig = REF_ORIGINAL (exp);
- if (!orig)
- orig = exp;
- set_mem_attributes (temp, orig, 0);
+ set_mem_attributes (temp, exp, 0);
/* Resolve the misalignment now, so that we don't have to remember
to resolve it later. Of course, this only works for reads. */
@@ -6912,6 +6916,18 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
return temp;
}
+ case TARGET_MEM_REF:
+ {
+ struct mem_address addr;
+
+ get_address_description (exp, &addr);
+ op0 = addr_for_mem_ref (&addr, true);
+ op0 = memory_address (mode, op0);
+ temp = gen_rtx_MEM (mode, op0);
+ set_mem_attributes (temp, TMR_ORIGINAL (exp), 0);
+ }
+ return temp;
+
case ARRAY_REF:
{
@@ -7747,7 +7763,7 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
optab other_optab = zextend_p ? smul_widen_optab : umul_widen_optab;
this_optab = zextend_p ? umul_widen_optab : smul_widen_optab;
- if (mode == GET_MODE_WIDER_MODE (innermode))
+ if (mode == GET_MODE_2XWIDER_MODE (innermode))
{
if (this_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
{
@@ -8721,8 +8737,7 @@ do_store_flag (tree exp, rtx target, enum machine_mode mode, int only_cheap)
if ((code == LT && integer_zerop (arg1))
|| (! only_cheap && code == GE && integer_zerop (arg1)))
;
- else if (BRANCH_COST >= 0
- && ! only_cheap && (code == NE || code == EQ)
+ else if (! only_cheap && (code == NE || code == EQ)
&& TREE_CODE (type) != REAL_TYPE
&& ((abs_optab->handlers[(int) operand_mode].insn_code
!= CODE_FOR_nothing)
diff --git a/gcc/expr.h b/gcc/expr.h
index 267daf0119f..550c0d0afc6 100644
--- a/gcc/expr.h
+++ b/gcc/expr.h
@@ -588,7 +588,7 @@ extern rtx eliminate_constant_term (rtx, rtx *);
by emitting insns to perform arithmetic if nec. */
extern rtx memory_address (enum machine_mode, rtx);
-/* Like `memory_address' but pretent `flag_force_addr' is 0. */
+/* Like `memory_address' but pretend `flag_force_addr' is 0. */
extern rtx memory_address_noforce (enum machine_mode, rtx);
/* Return a memory reference like MEMREF, but with its mode changed
diff --git a/gcc/final.c b/gcc/final.c
index 2e8a7a8d6df..5b7ac3cb5bf 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -2753,17 +2753,17 @@ alter_cond (rtx cond)
In an `asm', it's the user's fault; otherwise, the compiler's fault. */
void
-output_operand_lossage (const char *msgid, ...)
+output_operand_lossage (const char *cmsgid, ...)
{
char *fmt_string;
char *new_message;
const char *pfx_str;
va_list ap;
- va_start (ap, msgid);
+ va_start (ap, cmsgid);
pfx_str = this_is_asm_operands ? _("invalid 'asm': ") : "output_operand: ";
- asprintf (&fmt_string, "%s%s", pfx_str, _(msgid));
+ asprintf (&fmt_string, "%s%s", pfx_str, _(cmsgid));
vasprintf (&new_message, fmt_string, ap);
if (this_is_asm_operands)
diff --git a/gcc/flags.h b/gcc/flags.h
index 695d6228f65..c28e16bd91e 100644
--- a/gcc/flags.h
+++ b/gcc/flags.h
@@ -101,11 +101,6 @@ extern bool extra_warnings;
extern void set_Wunused (int setting);
-/* Nonzero means warn about function definitions that default the return type
- or that use a null return and have a return-type other than void. */
-
-extern int warn_return_type;
-
/* Nonzero means warn about any objects definitions whose size is larger
than N bytes. Also want about function definitions whose returned
values are larger than N bytes. The value N is in `larger_than_size'. */
diff --git a/gcc/flow.c b/gcc/flow.c
index 9eae74b4ad0..b73ac4d09bc 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -653,7 +653,9 @@ update_life_info (sbitmap blocks, enum update_life_extent extent,
if (blocks)
{
- EXECUTE_IF_SET_IN_SBITMAP (blocks, 0, i,
+ sbitmap_iterator sbi;
+
+ EXECUTE_IF_SET_IN_SBITMAP (blocks, 0, i, sbi)
{
bb = BASIC_BLOCK (i);
@@ -662,7 +664,7 @@ update_life_info (sbitmap blocks, enum update_life_extent extent,
if (extent == UPDATE_LIFE_LOCAL)
verify_local_live_at_start (tmp, bb);
- });
+ };
}
else
{
@@ -1032,7 +1034,7 @@ calculate_global_regs_live (sbitmap blocks_in, sbitmap blocks_out, int flags)
In other words, regs that are set only as part of a COND_EXEC. */
regset *cond_local_sets;
- int i;
+ unsigned int i;
/* Some passes used to forget clear aux field of basic block causing
sick behavior here. */
@@ -1406,12 +1408,14 @@ calculate_global_regs_live (sbitmap blocks_in, sbitmap blocks_out, int flags)
if (blocks_out)
{
- EXECUTE_IF_SET_IN_SBITMAP (blocks_out, 0, i,
+ sbitmap_iterator sbi;
+
+ EXECUTE_IF_SET_IN_SBITMAP (blocks_out, 0, i, sbi)
{
basic_block bb = BASIC_BLOCK (i);
FREE_REG_SET (local_sets[bb->index - (INVALID_BLOCK + 1)]);
FREE_REG_SET (cond_local_sets[bb->index - (INVALID_BLOCK + 1)]);
- });
+ };
}
else
{
@@ -4355,7 +4359,7 @@ int
count_or_remove_death_notes (sbitmap blocks, int kill)
{
int count = 0;
- int i;
+ unsigned int i;
basic_block bb;
/* This used to be a loop over all the blocks with a membership test
@@ -4367,10 +4371,12 @@ count_or_remove_death_notes (sbitmap blocks, int kill)
than an sbitmap. */
if (blocks)
{
- EXECUTE_IF_SET_IN_SBITMAP (blocks, 0, i,
+ sbitmap_iterator sbi;
+
+ EXECUTE_IF_SET_IN_SBITMAP (blocks, 0, i, sbi)
{
count += count_or_remove_death_notes_bb (BASIC_BLOCK (i), kill);
- });
+ };
}
else
{
@@ -4450,7 +4456,6 @@ static void
clear_log_links (sbitmap blocks)
{
rtx insn;
- int i;
if (!blocks)
{
@@ -4459,15 +4464,20 @@ clear_log_links (sbitmap blocks)
free_INSN_LIST_list (&LOG_LINKS (insn));
}
else
- EXECUTE_IF_SET_IN_SBITMAP (blocks, 0, i,
- {
- basic_block bb = BASIC_BLOCK (i);
+ {
+ unsigned int i;
+ sbitmap_iterator sbi;
- for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb));
- insn = NEXT_INSN (insn))
- if (INSN_P (insn))
- free_INSN_LIST_list (&LOG_LINKS (insn));
- });
+ EXECUTE_IF_SET_IN_SBITMAP (blocks, 0, i, sbi)
+ {
+ basic_block bb = BASIC_BLOCK (i);
+
+ for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb));
+ insn = NEXT_INSN (insn))
+ if (INSN_P (insn))
+ free_INSN_LIST_list (&LOG_LINKS (insn));
+ }
+ }
}
/* Given a register bitmap, turn on the bits in a HARD_REG_SET that
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 050d45c6069..2c1bd15b365 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -89,7 +89,6 @@ static tree negate_expr (tree);
static tree split_tree (tree, enum tree_code, tree *, tree *, tree *, int);
static tree associate_trees (tree, tree, enum tree_code, tree);
static tree const_binop (enum tree_code, tree, tree, int);
-static enum tree_code invert_tree_comparison (enum tree_code, bool);
static enum comparison_code comparison_to_compcode (enum tree_code);
static enum tree_code compcode_to_comparison (enum comparison_code);
static tree combine_comparisons (enum tree_code, enum tree_code,
@@ -1600,33 +1599,36 @@ const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
case RDIV_EXPR:
{
+ tree t1, t2, real, imag;
tree magsquared
= const_binop (PLUS_EXPR,
const_binop (MULT_EXPR, r2, r2, notrunc),
const_binop (MULT_EXPR, i2, i2, notrunc),
notrunc);
- t = build_complex (type,
- const_binop
- (INTEGRAL_TYPE_P (TREE_TYPE (r1))
- ? TRUNC_DIV_EXPR : RDIV_EXPR,
- const_binop (PLUS_EXPR,
- const_binop (MULT_EXPR, r1, r2,
- notrunc),
- const_binop (MULT_EXPR, i1, i2,
- notrunc),
- notrunc),
- magsquared, notrunc),
- const_binop
- (INTEGRAL_TYPE_P (TREE_TYPE (r1))
- ? TRUNC_DIV_EXPR : RDIV_EXPR,
- const_binop (MINUS_EXPR,
- const_binop (MULT_EXPR, i1, r2,
- notrunc),
- const_binop (MULT_EXPR, r1, i2,
- notrunc),
- notrunc),
- magsquared, notrunc));
+ t1 = const_binop (PLUS_EXPR,
+ const_binop (MULT_EXPR, r1, r2, notrunc),
+ const_binop (MULT_EXPR, i1, i2, notrunc),
+ notrunc);
+ t2 = const_binop (MINUS_EXPR,
+ const_binop (MULT_EXPR, i1, r2, notrunc),
+ const_binop (MULT_EXPR, r1, i2, notrunc),
+ notrunc);
+
+ if (INTEGRAL_TYPE_P (TREE_TYPE (r1)))
+ {
+ real = const_binop (TRUNC_DIV_EXPR, t1, magsquared, notrunc);
+ imag = const_binop (TRUNC_DIV_EXPR, t2, magsquared, notrunc);
+ }
+ else
+ {
+ real = const_binop (RDIV_EXPR, t1, magsquared, notrunc);
+ imag = const_binop (RDIV_EXPR, t2, magsquared, notrunc);
+ if (!real || !imag)
+ return NULL_TREE;
+ }
+
+ t = build_complex (type, real, imag);
}
break;
@@ -2116,7 +2118,7 @@ pedantic_non_lvalue (tree x)
comparisons, except for NE_EXPR and EQ_EXPR, so we receive a machine mode
as well: if reversing the comparison is unsafe, return ERROR_MARK. */
-static enum tree_code
+enum tree_code
invert_tree_comparison (enum tree_code code, bool honor_nans)
{
if (honor_nans && flag_trapping_math)
@@ -2458,7 +2460,7 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags)
v2 = TREE_CHAIN (v2);
}
- return 1;
+ return v1 == v2;
}
case COMPLEX_CST:
@@ -5485,26 +5487,31 @@ constant_boolean_node (int value, tree type)
/* Return true if expr looks like an ARRAY_REF and set base and
offset to the appropriate trees. If there is no offset,
- offset is set to NULL_TREE. */
+ offset is set to NULL_TREE. Base will be canonicalized to
+ something you can get the element type from using
+ TREE_TYPE (TREE_TYPE (base)). */
static bool
extract_array_ref (tree expr, tree *base, tree *offset)
{
- /* We have to be careful with stripping nops as with the
- base type the meaning of the offset can change. */
- tree inner_expr = expr;
- STRIP_NOPS (inner_expr);
/* One canonical form is a PLUS_EXPR with the first
argument being an ADDR_EXPR with a possible NOP_EXPR
attached. */
if (TREE_CODE (expr) == PLUS_EXPR)
{
tree op0 = TREE_OPERAND (expr, 0);
+ tree inner_base, dummy1;
+ /* Strip NOP_EXPRs here because the C frontends and/or
+ folders present us (int *)&x.a + 4B possibly. */
STRIP_NOPS (op0);
- if (TREE_CODE (op0) == ADDR_EXPR)
+ if (extract_array_ref (op0, &inner_base, &dummy1))
{
- *base = TREE_OPERAND (expr, 0);
- *offset = TREE_OPERAND (expr, 1);
+ *base = inner_base;
+ if (dummy1 == NULL_TREE)
+ *offset = TREE_OPERAND (expr, 1);
+ else
+ *offset = fold_build2 (PLUS_EXPR, TREE_TYPE (expr),
+ dummy1, TREE_OPERAND (expr, 1));
return true;
}
}
@@ -5513,21 +5520,33 @@ extract_array_ref (tree expr, tree *base, tree *offset)
offset. For other arguments to the ADDR_EXPR we assume
zero offset and as such do not care about the ADDR_EXPR
type and strip possible nops from it. */
- else if (TREE_CODE (inner_expr) == ADDR_EXPR)
+ else if (TREE_CODE (expr) == ADDR_EXPR)
{
- tree op0 = TREE_OPERAND (inner_expr, 0);
+ tree op0 = TREE_OPERAND (expr, 0);
if (TREE_CODE (op0) == ARRAY_REF)
{
- *base = build_fold_addr_expr (TREE_OPERAND (op0, 0));
+ *base = TREE_OPERAND (op0, 0);
*offset = TREE_OPERAND (op0, 1);
}
else
{
- *base = inner_expr;
+ /* Handle array-to-pointer decay as &a. */
+ if (TREE_CODE (TREE_TYPE (op0)) == ARRAY_TYPE)
+ *base = TREE_OPERAND (expr, 0);
+ else
+ *base = expr;
*offset = NULL_TREE;
}
return true;
}
+ /* The next canonical form is a VAR_DECL with POINTER_TYPE. */
+ else if (SSA_VAR_P (expr)
+ && TREE_CODE (TREE_TYPE (expr)) == POINTER_TYPE)
+ {
+ *base = expr;
+ *offset = NULL_TREE;
+ return true;
+ }
return false;
}
@@ -7928,7 +7947,9 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
&& (TREE_CODE (arg1) != REAL_CST
|| REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
|| (INTEGRAL_TYPE_P (type) && flag_wrapv && !flag_trapv)))
- return fold_build2 (PLUS_EXPR, type, arg0, negate_expr (arg1));
+ return fold_build2 (PLUS_EXPR, type,
+ fold_convert (type, arg0),
+ fold_convert (type, negate_expr (arg1)));
/* Try folding difference of addresses. */
{
@@ -8447,7 +8468,8 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
if (exact_real_inverse (TYPE_MODE(TREE_TYPE(arg0)), &r))
{
tem = build_real (type, r);
- return fold_build2 (MULT_EXPR, type, arg0, tem);
+ return fold_build2 (MULT_EXPR, type,
+ fold_convert (type, arg0), tem);
}
}
}
@@ -8720,6 +8742,58 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
don't try to compute it in the compiler. */
if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_sgn (arg1) < 0)
return NULL_TREE;
+
+ /* Turn (a OP c1) OP c2 into a OP (c1+c2). */
+ if (TREE_CODE (arg0) == code && host_integerp (arg1, false)
+ && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
+ && host_integerp (TREE_OPERAND (arg0, 1), false)
+ && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
+ {
+ HOST_WIDE_INT low = (TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1))
+ + TREE_INT_CST_LOW (arg1));
+
+ /* Deal with a OP (c1 + c2) being undefined but (a OP c1) OP c2
+ being well defined. */
+ if (low >= TYPE_PRECISION (type))
+ {
+ if (code == LROTATE_EXPR || code == RROTATE_EXPR)
+ low = low % TYPE_PRECISION (type);
+ else if (TYPE_UNSIGNED (type) || code == LSHIFT_EXPR)
+ return build_int_cst (type, 0);
+ else
+ low = TYPE_PRECISION (type) - 1;
+ }
+
+ return fold_build2 (code, type, TREE_OPERAND (arg0, 0),
+ build_int_cst (type, low));
+ }
+
+ /* Transform (x >> c) << c into x & (-1<<c), or transform (x << c) >> c
+ into x & ((unsigned)-1 >> c) for unsigned types. */
+ if (((code == LSHIFT_EXPR && TREE_CODE (arg0) == RSHIFT_EXPR)
+ || (TYPE_UNSIGNED (type)
+ && code == RSHIFT_EXPR && TREE_CODE (arg0) == LSHIFT_EXPR))
+ && host_integerp (arg1, false)
+ && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
+ && host_integerp (TREE_OPERAND (arg0, 1), false)
+ && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
+ {
+ HOST_WIDE_INT low0 = TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1));
+ HOST_WIDE_INT low1 = TREE_INT_CST_LOW (arg1);
+ tree lshift;
+ tree arg00;
+
+ if (low0 == low1)
+ {
+ arg00 = fold_convert (type, TREE_OPERAND (arg0, 0));
+
+ lshift = build_int_cst (type, -1);
+ lshift = int_const_binop (code, lshift, arg1, 0);
+
+ return fold_build2 (BIT_AND_EXPR, type, arg00, lshift);
+ }
+ }
+
/* Rewrite an LROTATE_EXPR by a constant into an
RROTATE_EXPR by a new constant. */
if (code == LROTATE_EXPR && TREE_CODE (arg1) == INTEGER_CST)
@@ -9014,6 +9088,12 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
&& extract_array_ref (arg1, &base1, &offset1)
&& operand_equal_p (base0, base1, 0))
{
+ if (TYPE_SIZE (TREE_TYPE (TREE_TYPE (base0)))
+ && integer_zerop (TYPE_SIZE (TREE_TYPE (TREE_TYPE (base0)))))
+ offset0 = NULL_TREE;
+ if (TYPE_SIZE (TREE_TYPE (TREE_TYPE (base1)))
+ && integer_zerop (TYPE_SIZE (TREE_TYPE (TREE_TYPE (base1)))))
+ offset1 = NULL_TREE;
if (offset0 == NULL_TREE
&& offset1 == NULL_TREE)
{
@@ -9275,12 +9355,16 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
switch (code)
{
case GE_EXPR:
- arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
- return fold_build2 (GT_EXPR, type, arg0, arg1);
+ arg1 = const_binop (MINUS_EXPR, arg1,
+ build_int_cst (TREE_TYPE (arg1), 1), 0);
+ return fold_build2 (GT_EXPR, type, arg0,
+ fold_convert (TREE_TYPE (arg0), arg1));
case LT_EXPR:
- arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
- return fold_build2 (LE_EXPR, type, arg0, arg1);
+ arg1 = const_binop (MINUS_EXPR, arg1,
+ build_int_cst (TREE_TYPE (arg1), 1), 0);
+ return fold_build2 (LE_EXPR, type, arg0,
+ fold_convert (TREE_TYPE (arg0), arg1));
default:
break;
@@ -9889,11 +9973,11 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
&& (arglist = TREE_OPERAND (arg0, 1))
&& TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) == POINTER_TYPE
&& ! TREE_CHAIN (arglist))
- return fold_build2 (code, type,
- build1 (INDIRECT_REF, char_type_node,
- TREE_VALUE (arglist)),
- fold_convert (char_type_node,
- integer_zero_node));
+ {
+ tree iref = build_fold_indirect_ref (TREE_VALUE (arglist));
+ return fold_build2 (code, type, iref,
+ build_int_cst (TREE_TYPE (iref), 0));
+ }
}
/* We can fold X/C1 op C2 where C1 and C2 are integer constants
@@ -10258,6 +10342,32 @@ fold_ternary (enum tree_code code, tree type, tree op0, tree op1, tree op2)
}
return NULL_TREE;
+ case BIT_FIELD_REF:
+ if (TREE_CODE (arg0) == VECTOR_CST
+ && type == TREE_TYPE (TREE_TYPE (arg0))
+ && host_integerp (arg1, 1)
+ && host_integerp (op2, 1))
+ {
+ unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
+ unsigned HOST_WIDE_INT idx = tree_low_cst (op2, 1);
+
+ if (width != 0
+ && simple_cst_equal (arg1, TYPE_SIZE (type)) == 1
+ && (idx % width) == 0
+ && (idx = idx / width)
+ < TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
+ {
+ tree elements = TREE_VECTOR_CST_ELTS (arg0);
+ while (idx-- > 0 && elements)
+ elements = TREE_CHAIN (elements);
+ if (elements)
+ return TREE_VALUE (elements);
+ else
+ return fold_convert (type, integer_zero_node);
+ }
+ }
+ return NULL_TREE;
+
default:
return NULL_TREE;
} /* switch (code) */
@@ -10393,6 +10503,8 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
enum tree_code code;
char buf[sizeof (struct tree_decl)];
int i, len;
+
+recursive_label:
gcc_assert ((sizeof (struct tree_exp) + 5 * sizeof (tree)
<= sizeof (struct tree_decl))
@@ -10414,11 +10526,13 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
}
else if (TREE_CODE_CLASS (code) == tcc_type
&& (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
- || TYPE_CACHED_VALUES_P (expr)))
+ || TYPE_CACHED_VALUES_P (expr)
+ || TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr)))
{
/* Allow these fields to be modified. */
memcpy (buf, expr, tree_size (expr));
expr = (tree) buf;
+ TYPE_CONTAINS_PLACEHOLDER_INTERNAL (expr) = 0;
TYPE_POINTER_TO (expr) = NULL;
TYPE_REFERENCE_TO (expr) = NULL;
if (TYPE_CACHED_VALUES_P (expr))
@@ -10430,7 +10544,8 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
md5_process_bytes (expr, tree_size (expr), ctx);
fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
if (TREE_CODE_CLASS (code) != tcc_type
- && TREE_CODE_CLASS (code) != tcc_declaration)
+ && TREE_CODE_CLASS (code) != tcc_declaration
+ && code != TREE_LIST)
fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
switch (TREE_CODE_CLASS (code))
{
@@ -10458,6 +10573,8 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
case TREE_LIST:
fold_checksum_tree (TREE_PURPOSE (expr), ctx, ht);
fold_checksum_tree (TREE_VALUE (expr), ctx, ht);
+ expr = TREE_CHAIN (expr);
+ goto recursive_label;
break;
case TREE_VEC:
for (i = 0; i < TREE_VEC_LENGTH (expr); ++i)
@@ -11448,14 +11565,14 @@ build_fold_addr_expr (tree t)
return build_fold_addr_expr_with_type (t, build_pointer_type (TREE_TYPE (t)));
}
-/* Given a pointer value T, return a simplified version of an indirection
- through T, or NULL_TREE if no simplification is possible. */
+/* Given a pointer value OP0 and a type TYPE, return a simplified version
+ of an indirection through OP0, or NULL_TREE if no simplification is
+ possible. */
-static tree
-fold_indirect_ref_1 (tree t)
+tree
+fold_indirect_ref_1 (tree type, tree op0)
{
- tree type = TREE_TYPE (TREE_TYPE (t));
- tree sub = t;
+ tree sub = op0;
tree subtype;
STRIP_NOPS (sub);
@@ -11468,11 +11585,11 @@ fold_indirect_ref_1 (tree t)
tree op = TREE_OPERAND (sub, 0);
tree optype = TREE_TYPE (op);
/* *&p => p */
- if (lang_hooks.types_compatible_p (type, optype))
+ if (type == optype)
return op;
/* *(foo *)&fooarray => fooarray[0] */
else if (TREE_CODE (optype) == ARRAY_TYPE
- && lang_hooks.types_compatible_p (type, TREE_TYPE (optype)))
+ && type == TREE_TYPE (optype))
{
tree type_domain = TYPE_DOMAIN (optype);
tree min_val = size_zero_node;
@@ -11484,7 +11601,7 @@ fold_indirect_ref_1 (tree t)
/* *(foo *)fooarrptr => (*fooarrptr)[0] */
if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
- && lang_hooks.types_compatible_p (type, TREE_TYPE (TREE_TYPE (subtype))))
+ && type == TREE_TYPE (TREE_TYPE (subtype)))
{
tree type_domain;
tree min_val = size_zero_node;
@@ -11504,12 +11621,13 @@ fold_indirect_ref_1 (tree t)
tree
build_fold_indirect_ref (tree t)
{
- tree sub = fold_indirect_ref_1 (t);
+ tree type = TREE_TYPE (TREE_TYPE (t));
+ tree sub = fold_indirect_ref_1 (type, t);
if (sub)
return sub;
else
- return build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (t)), t);
+ return build1 (INDIRECT_REF, type, t);
}
/* Given an INDIRECT_REF T, return either T or a simplified version. */
@@ -11517,7 +11635,7 @@ build_fold_indirect_ref (tree t)
tree
fold_indirect_ref (tree t)
{
- tree sub = fold_indirect_ref_1 (TREE_OPERAND (t, 0));
+ tree sub = fold_indirect_ref_1 (TREE_TYPE (t), TREE_OPERAND (t, 0));
if (sub)
return sub;
@@ -11683,9 +11801,7 @@ split_address_to_core_and_offset (tree exp,
core = get_inner_reference (TREE_OPERAND (exp, 0), &bitsize, pbitpos,
poffset, &mode, &unsignedp, &volatilep,
false);
-
- if (TREE_CODE (core) == INDIRECT_REF)
- core = TREE_OPERAND (core, 0);
+ core = build_fold_addr_expr (core);
}
else
{
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 87e10472d98..bcad19f20db 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,231 @@
+2005-06-13 Geoffrey Keating <geoffk@apple.com>
+
+ * Make-lang.in (fortran.install-man): Doesn't depend on installdirs.
+ (rule for installing f95.1 manpage): Does depend on installdirs.
+
+2005-06-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR fortran/22038
+ * trans-stmt.c (gfc_trans_forall_loop): Only increment maskindex
+ in the innermost loop.
+
+2005-06-12 Richard Henderson <rth@redhat.com>
+
+ * trans-array.c (gfc_conv_descriptor_data_get): Rename from
+ gfc_conv_descriptor_data. Cast the result to the DATAPTR type.
+ (gfc_conv_descriptor_data_set, gfc_conv_descriptor_data_addr): New.
+ (gfc_trans_allocate_array_storage): Use them.
+ (gfc_array_allocate, gfc_array_deallocate): Likewise.
+ (gfc_trans_dummy_array_bias, gfc_conv_expr_descriptor): Likewise.
+ (gfc_trans_deferred_array): Likewise.
+ * trans-expr.c (gfc_conv_function_call): Likewise.
+ (gfc_trans_subcomponent_assign): Likewise.
+ (gfc_trans_pointer_assignment): Likewise.
+ * trans-intrinsic.c (gfc_conv_allocated): Likewise.
+ * trans-types.c (gfc_array_descriptor_base): New.
+ (gfc_get_element_type): Use GFC_TYPE_ARRAY_DATAPTR_TYPE.
+ (gfc_get_array_descriptor_base): Break out from ...
+ (gfc_get_array_type_bounds): ... here. Create type variants.
+ * trans-array.h (gfc_conv_descriptor_data_get): Declare.
+ (gfc_conv_descriptor_data_set, gfc_conv_descriptor_data_addr): Declare.
+
+2005-06-12 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
+
+ * trans-expr.c (gfc_conv_variable): POINTER results don't need f2c
+ calling conventions. Look at sym instead of sym->result.
+ * trans-types.c (gfc_sym_type): Remove workaround for frontend bug.
+ Remove condition which is always false with workaround removed.
+ (gfc_return_by_reference): Always look at sym, never at sym->result.
+
+2005-06-11 Steven G. Kargl <kargls@comcast.net>
+
+ PR fortran/17792
+ PR fortran/21375
+ * trans-array.c (gfc_array_deallocate): pstat is new argument
+ (gfc_array_allocate): update gfc_array_deallocate() call.
+ (gfc_trans_deferred_array): ditto.
+ * trans-array.h: update gfc_array_deallocate() prototype.
+ * trans-decl.c (gfc_build_builtin_function_decls): update declaration
+ * trans-stmt.c (gfc_trans_deallocate): Implement STAT= feature.
+
+2005-06-07 Jerry DeLisle <jvdelisle@verizon.net>
+
+ * intrinsic.texi: Add documentation for dcmplx, digits,
+ dim, idim, ddim, dot_product, dprod, dreal, and dtime.
+
+2005-06-05 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
+
+ PR fortran/21912
+ * trans-array.c (gfc_trans_array_constructor_value): Slightly reorder.
+ Generate correct exit condition in case of negative steps in
+ implied-do loops.
+
+ * invoke.texi: Fix description of flags required for compatibility
+ with g77.
+
+2005-06-04 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
+ Erik Schnetter <schnetter@aei.mpg.de>
+
+ PR fortran/19195
+ * trans.c (gfc_get_backend_locus): Remove unnecessary adjustment,
+ remove FIXME comment.
+
+2005-06-04 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
+
+ * match.c (match_forall_iterator): Don't immediately give error if '='
+ is not followed by an expression.
+
+2005-06-04 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
+ Erik Edelmann <erik.edelmann@iki.fi>
+
+ * array.c (gfc_match_array_constructor): Disallow empty array
+ constructor.
+
+2005-06-03 Jerry DeLisle <jvdelisle@verizon.net>
+
+ * fortran/intrinsic.texi: Add documentation for
+ command_argument_count, conjg, dconjg, count,
+ cpu_time, cshift, date_and_time, dble, dfloat.
+
+2005-06-01 Roger Sayle <roger@eyesopen.com>
+
+ * intrinsic.c (add_conv): No longer take a "simplify" argument as
+ its always gfc_convert_constant, instead take a "standard" argument.
+ (add_conversions): Change all existing calls of add_conv to pass
+ GFC_STD_F77 as appropriate. Additionally, if we're allowing GNU
+ extensions support integer-logical and logical-integer conversions.
+ (gfc_convert_type_warn): Warn about use the use of these conversions
+ as a extension when appropriate, i.e. with -pedantic.
+ * simplify.c (gfc_convert_constant): Add support for integer to
+ logical and logical to integer conversions, using gfc_int2log and
+ gfc_log2int.
+ * arith.c (gfc_log2int, gfc_int2log): New functions.
+ * arith.h (gfc_log2int, gfc_int2log): Prototype here.
+ * gfortran.texi: Document this new GNU extension.
+
+2005-06-01 Paul Thomas <pault@gcc.gnu.org>
+
+ * fortran/trans-expr.c (gfc_conv_variable): Clean up bracketting.
+ * fortran/trans-expr.c (gfc_conv_function_call): Insert spaces.
+ Correct comments and replace convert of integer_one_node with
+ build_int_cst.
+
+2005-06-01 Jakub Jelinek <jakub@redhat.com>
+
+ PR fortran/21729
+ * resolve.c (resolve_contained_fntype): Use sym->attr.untyped
+ to avoid giving error multiple times.
+ (resolve_entries): Don't error about BT_UNKNOWN here.
+ (resolve_unknown_f): Capitalize IMPLICIT for consistency.
+ (resolve_fntype): New function.
+ (gfc_resolve): Call resolve_fntype.
+
+2005-06-01 Feng Wang <fengwang@nudt.edu.cn>
+
+ PR fortran/20883
+ * fortran/io.c (resolve_tag): Fix error message.
+
+2005-05-31 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * fortran/trans-decl.c: Don't include errors.h.
+ * fortran/Make-lang.in: Updates dependencies.
+
+2005-05-31 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/18109
+ PR fortran/18283
+ PR fortran/19107
+ * fortran/trans-array.c (gfc_conv_expr_descriptor): Obtain the
+ string length from the expression typespec character length value
+ and set temp_ss->stringlength and backend_decl. Obtain the
+ tree expression from gfc_conv_expr rather than gfc_conv_expr_val.
+ Dereference the expression to obtain the character.
+ * fortran/trans-expr.c (gfc_conv_component_ref): Remove the
+ dereference of scalar character pointer structure components.
+ * fortran/trans-expr.c (gfc_trans_subarray_assign): Obtain the
+ string length for the structure component from the component
+ expression.
+
+2005-05-30 Roger Sayle <roger@eyesopen.com>
+
+ * gfortran.h (GFC_STD_LEGACY): New "standard" macro. Reindent.
+ * options.c (gfc_init_options): By default, allow legacy extensions
+ but warn about them.
+ (gfc_post_options): Make -pedantic warn about legacy extensions
+ even with -std=legacy.
+ (gfc_handle_option): Make -std=gnu follow the default behaviour
+ of warning about legacy extensions, but allowing them. Make the
+ new -std=legacy accept everything and warn about nothing.
+ * lang.opt (std=legacy): New F95 command line option.
+ * invoke.texi: Document both -std=f2003 and -std=legacy.
+ * gfortran.texi: Explain the two types of extensions and document
+ how they are affected by the various -std= command line options.
+
+2005-05-30 Kazu Hirata <kazu@cs.umass.edu>
+
+ * trans-expr.c: Remove trailing ^M.
+
+ * trans-expr.c: Fix comment typos.
+
+2005-05-29 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/16939
+ PR fortran/17192
+ PR fortran/17193
+ PR fortran/17202
+ PR fortran/18689
+ PR fortran/18890
+ * fortran/trans-array.c (gfc_conv_resolve_dependencies): Add string
+ length to temp_ss for character pointer array assignments.
+ * fortran/trans-expr.c (gfc_conv_variable): Correct errors in
+ dereferencing of characters and character pointers.
+ * fortran/trans-expr.c (gfc_conv_function_call): Provide string
+ length as return argument for various kinds of handling of return.
+ Return a char[]* temporary for character pointer functions and
+ dereference the temporary upon return.
+
+2005-05-29 Janne Blomqvist <jblomqvi@vipunen.hut.fi>
+ Steven G. Kargl <kargls@comcast.net>
+
+ fortran/PR20846
+ * io.c (gfc_match_inquire): Implement constraints on UNIT and FILE usage.
+
+2005-05-29 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ PR libfortran/20006
+ * io.c (format_item_1): Add check and extension warning for
+ $ edit descriptor.
+
+2005-05-28 Steven G. Kargl <kargls@comcast.net>
+
+ * arith.c (gfc_arith_init_1): Fix off by one problem;
+ (gfc_check_integer_range): Chop extra bits in subnormal numbers.
+
+2005-05-28 Jerry DeLisle <jvdelisle@verizon.net>
+ Steven G. Kargl <kargls@comcast.net>
+
+ * intrinsic.texi: added documentation for BIT_SIZE, BTEST, CHAR, CEILING
+ and CMPLX
+
+2005-05-27 Steven G. Kargl <kargls@comcast.net>
+
+ * trans-array.c (gfc_trans_deferred_array): Use build_int_cst to force
+ like types in comparsion.
+
+2005-05-26 Kazu Hirata <kazu@cs.umass.edu>
+
+ * data.c, parse.c, trans-array.c, trans-decl.c,
+ trans-intrinsic.c, trans-stmt.c, trans-types.c, trans.c,
+ trans.h: Fix comment typos. Follow spelling conventions.
+
+2005-05-22 Roger Sayle <roger@eyesopen.com>
+
+ * gfortran.texi: Document some more GNU extensions.
+
+2005-05-22 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ * error.c (gfc_warning): Fix typo in comment.
+
2005-05-18 Thomas Koenig <Thomas.Koenig@online.de>
PR libfortran/21127
@@ -246,7 +474,7 @@
* trans-const.c (gfc_conv_mpz_to_tree): Fix comment.
2005-04-19 Arnaud Desitter <arnaud.desitter@ouce.ox.ac.uk>
- Steven G. Kargl <kargls@comcast.net>
+ Steven G. Kargl <kargls@comcast.net>
* invoke.texi: Update -Waliasing description
diff --git a/gcc/fortran/Make-lang.in b/gcc/fortran/Make-lang.in
index 3775c8585b5..384ff6b7503 100644
--- a/gcc/fortran/Make-lang.in
+++ b/gcc/fortran/Make-lang.in
@@ -207,10 +207,10 @@ f95.install-common: installdirs
install-info:: $(DESTDIR)$(infodir)/gfortran.info
-f95.install-man: installdirs \
- $(DESTDIR)$(man1dir)/$(GFORTRAN_INSTALL_NAME)$(man1ext)
+f95.install-man: $(DESTDIR)$(man1dir)/$(GFORTRAN_INSTALL_NAME)$(man1ext)
-$(DESTDIR)$(man1dir)/$(GFORTRAN_INSTALL_NAME)$(man1ext): doc/gfortran.1
+$(DESTDIR)$(man1dir)/$(GFORTRAN_INSTALL_NAME)$(man1ext): doc/gfortran.1 \
+ installdirs
-rm -f $@
-$(INSTALL_DATA) $< $@
-chmod a-x $@
@@ -284,7 +284,7 @@ fortran/f95-lang.o: $(GFORTRAN_TRANS_DEPS) fortran/mathbuiltins.def \
fortran/convert.o: $(GFORTRAN_TRANS_DEPS)
fortran/trans.o: $(GFORTRAN_TRANS_DEPS)
fortran/trans-decl.o: $(GFORTRAN_TRANS_DEPS) gt-fortran-trans-decl.h \
- cgraph.h $(TARGET_H) function.h errors.h $(FLAGS_H) tree-gimple.h \
+ cgraph.h $(TARGET_H) function.h $(FLAGS_H) tree-gimple.h \
tree-dump.h
fortran/trans-types.o: $(GFORTRAN_TRANS_DEPS) gt-fortran-trans-types.h \
real.h toplev.h $(TARGET_H)
diff --git a/gcc/fortran/arith.c b/gcc/fortran/arith.c
index ef19217ae04..684ae7bfd8b 100644
--- a/gcc/fortran/arith.c
+++ b/gcc/fortran/arith.c
@@ -259,9 +259,9 @@ gfc_arith_init_1 (void)
mpfr_init (real_info->tiny);
mpfr_set (real_info->tiny, b, GFC_RND_MODE);
- /* subnormal (x) = b**(emin - digit + 1) */
+ /* subnormal (x) = b**(emin - digit) */
mpfr_set_ui (b, real_info->radix, GFC_RND_MODE);
- mpfr_pow_si (b, b, real_info->min_exponent - real_info->digits + 1,
+ mpfr_pow_si (b, b, real_info->min_exponent - real_info->digits,
GFC_RND_MODE);
mpfr_init (real_info->subnormal);
@@ -381,9 +381,42 @@ gfc_check_real_range (mpfr_t p, int kind)
if (mpfr_sgn (q) == 0)
retval = ARITH_OK;
else if (mpfr_cmp (q, gfc_real_kinds[i].huge) > 0)
- retval = ARITH_OVERFLOW;
+ retval = ARITH_OVERFLOW;
else if (mpfr_cmp (q, gfc_real_kinds[i].subnormal) < 0)
retval = ARITH_UNDERFLOW;
+ else if (mpfr_cmp (q, gfc_real_kinds[i].tiny) < 0)
+ {
+ /* MPFR operates on a numbers with a given precision and enormous
+ exponential range. To represent subnormal numbers the exponent is
+ allowed to become smaller than emin, but always retains the full
+ precision. This function resets unused bits to 0 to alleviate
+ rounding problems. Note, a future version of MPFR will have a
+ mpfr_subnormalize() function, which handles this truncation in a
+ more efficient and robust way. */
+
+ int j, k;
+ char *bin, *s;
+ mp_exp_t e;
+
+ bin = mpfr_get_str (NULL, &e, gfc_real_kinds[i].radix, 0, q, GMP_RNDN);
+ k = gfc_real_kinds[i].digits - (gfc_real_kinds[i].min_exponent - e);
+ for (j = k; j < gfc_real_kinds[i].digits; j++)
+ bin[j] = '0';
+ /* Need space for '0.', bin, 'E', and e */
+ s = (char *) gfc_getmem (strlen(bin)+10);
+ sprintf (s, "0.%sE%d", bin, (int) e);
+ mpfr_set_str (q, s, gfc_real_kinds[i].radix, GMP_RNDN);
+
+ if (mpfr_sgn (p) < 0)
+ mpfr_neg (p, q, GMP_RNDN);
+ else
+ mpfr_set (p, q, GMP_RNDN);
+
+ gfc_free (s);
+ gfc_free (bin);
+
+ retval = ARITH_OK;
+ }
else
retval = ARITH_OK;
@@ -2158,3 +2191,26 @@ gfc_log2log (gfc_expr * src, int kind)
return result;
}
+
+/* Convert logical to integer. */
+
+gfc_expr *
+gfc_log2int (gfc_expr *src, int kind)
+{
+ gfc_expr *result;
+ result = gfc_constant_result (BT_INTEGER, kind, &src->where);
+ mpz_set_si (result->value.integer, src->value.logical);
+ return result;
+}
+
+/* Convert integer to logical. */
+
+gfc_expr *
+gfc_int2log (gfc_expr *src, int kind)
+{
+ gfc_expr *result;
+ result = gfc_constant_result (BT_LOGICAL, kind, &src->where);
+ result->value.logical = (mpz_cmp_si (src->value.integer, 0) != 0);
+ return result;
+}
+
diff --git a/gcc/fortran/arith.h b/gcc/fortran/arith.h
index 1a718d4ea4c..f75b826ee7c 100644
--- a/gcc/fortran/arith.h
+++ b/gcc/fortran/arith.h
@@ -80,6 +80,8 @@ gfc_expr *gfc_complex2int (gfc_expr *, int);
gfc_expr *gfc_complex2real (gfc_expr *, int);
gfc_expr *gfc_complex2complex (gfc_expr *, int);
gfc_expr *gfc_log2log (gfc_expr *, int);
+gfc_expr *gfc_log2int (gfc_expr *, int);
+gfc_expr *gfc_int2log (gfc_expr *, int);
#endif /* GFC_ARITH_H */
diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c
index f6284408567..3d90a55833f 100644
--- a/gcc/fortran/array.c
+++ b/gcc/fortran/array.c
@@ -887,7 +887,10 @@ gfc_match_array_constructor (gfc_expr ** result)
head = tail = NULL;
if (gfc_match (end_delim) == MATCH_YES)
- goto empty; /* Special case */
+ {
+ gfc_error ("Empty array constructor at %C is not allowed");
+ goto cleanup;
+ }
for (;;)
{
@@ -911,7 +914,6 @@ gfc_match_array_constructor (gfc_expr ** result)
if (gfc_match (end_delim) == MATCH_NO)
goto syntax;
-empty:
expr = gfc_get_expr ();
expr->expr_type = EXPR_ARRAY;
diff --git a/gcc/fortran/data.c b/gcc/fortran/data.c
index 5a74516c758..17354d2fbe7 100644
--- a/gcc/fortran/data.c
+++ b/gcc/fortran/data.c
@@ -132,7 +132,7 @@ find_con_by_component (gfc_component *com, gfc_constructor *con)
}
-/* Create a character type intialization expression from RVALUE.
+/* Create a character type initialization expression from RVALUE.
TS [and REF] describe [the substring of] the variable being initialized.
INIT is thh existing initializer, not NULL. Initialization is performed
according to normal assignment rules. */
@@ -556,7 +556,7 @@ formalize_structure_cons (gfc_expr * expr)
c = expr->value.constructor;
- /* Constructor is already fomalized. */
+ /* Constructor is already formalized. */
if (c->n.component == NULL)
return;
diff --git a/gcc/fortran/error.c b/gcc/fortran/error.c
index dd56aebac6e..c531329566e 100644
--- a/gcc/fortran/error.c
+++ b/gcc/fortran/error.c
@@ -486,7 +486,7 @@ gfc_warning (const char *format, ...)
/* Possibly issue a warning/error about use of a nonstandard (or deleted)
feature. An error/warning will be issued if the currently selected
standard does not contain the requested bits. Return FAILURE if
- and error is generated. */
+ an error is generated. */
try
gfc_notify_std (int std, const char *format, ...)
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index d17f388212c..69a56e188ac 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -92,13 +92,14 @@ mstring;
/* Flags to specify which standard/extension contains a feature. */
-#define GFC_STD_GNU (1<<5) /* GNU Fortran extension. */
-#define GFC_STD_F2003 (1<<4) /* New in F2003. */
+#define GFC_STD_LEGACY (1<<6) /* Backward compatibility. */
+#define GFC_STD_GNU (1<<5) /* GNU Fortran extension. */
+#define GFC_STD_F2003 (1<<4) /* New in F2003. */
/* Note that no features were obsoleted nor deleted in F2003. */
-#define GFC_STD_F95 (1<<3) /* New in F95. */
-#define GFC_STD_F95_DEL (1<<2) /* Deleted in F95. */
-#define GFC_STD_F95_OBS (1<<1) /* Obsoleted in F95. */
-#define GFC_STD_F77 (1<<0) /* Up to and including F77. */
+#define GFC_STD_F95 (1<<3) /* New in F95. */
+#define GFC_STD_F95_DEL (1<<2) /* Deleted in F95. */
+#define GFC_STD_F95_OBS (1<<1) /* Obsoleted in F95. */
+#define GFC_STD_F77 (1<<0) /* Up to and including F77. */
/*************************** Enums *****************************/
diff --git a/gcc/fortran/gfortran.texi b/gcc/fortran/gfortran.texi
index 67867bc6c08..50b64990985 100644
--- a/gcc/fortran/gfortran.texi
+++ b/gcc/fortran/gfortran.texi
@@ -618,12 +618,26 @@ Variable for swapping Endianness during unformatted write.
@command{gfortran} implements a number of extensions over standard
Fortran. This chapter contains information on their syntax and
-meaning.
+meaning. There are currently two categories of @command{gfortran}
+extensions, those that provide functionality beyond that provided
+by any standard, and those that are supported by @command{gfortran}
+purely for backward compatibility with legacy compilers. By default,
+@option{-std=gnu} allows the compiler to accept both types of
+extensions, but to warn about the use of the latter. Specifying
+either @option{-std=f95} or @option{-std=f2003} disables both types
+of extensions, and @option{-std=legacy} allows both without warning.
@menu
* Old-style kind specifications::
* Old-style variable initialization::
* Extensions to namelist::
+* X format descriptor::
+* Commas in FORMAT specifications::
+* I/O item lists::
+* Hexadecimal constants::
+* Real array indices::
+* Unary operators::
+* Implicitly interconvert LOGICAL and INTEGER::
@end menu
@node Old-style kind specifications
@@ -720,6 +734,82 @@ had been called:
To aid this dialog, when input is from stdin, errors produce send their
messages to stderr and execution continues, even if IOSTAT is set.
+@node X format descriptor
+@section X format descriptor
+@cindex X format descriptor
+
+To support legacy codes, @command{gfortran} permits the count field
+of the X edit descriptor in FORMAT statements to be omitted. When
+omitted, the count is implicitly assumed to be one.
+
+@smallexample
+ PRINT 10, 2, 3
+10 FORMAT (I1, X, I1)
+@end smallexample
+
+@node Commas in FORMAT specifications
+@section Commas in FORMAT specifications
+@cindex Commas in FORMAT specifications
+
+To support legacy codes, @command{gfortran} allows the comma separator
+to be omitted immediately before and after character string edit
+descriptors in FORMAT statements.
+
+@smallexample
+ PRINT 10, 2, 3
+10 FORMAT ('FOO='I1' BAR='I2)
+@end smallexample
+
+@node I/O item lists
+@section I/O item lists
+@cindex I/O item lists
+
+To support legacy codes, @command{gfortran} allows the input item list
+of the READ statement, and the output item lists of the WRITE and PRINT
+statements to start with a comma.
+
+@node Hexadecimal constants
+@section Hexadecimal constants
+@cindex Hexadecimal constants
+
+As a GNU extension, @command{gfortran} allows hexadecimal constants to
+be specified using the X prefix, in addition to the standard Z prefix.
+
+@node Real array indices
+@section Real array indices
+@cindex Real array indices
+
+As a GNU extension, @command{gfortran} allows arrays to be indexed using
+real types, whose values are implicitly converted to integers.
+
+@node Unary operators
+@section Unary operators
+@cindex Unary operators
+
+As a GNU extension, @command{gfortran} allows unary plus and unary
+minus operators to appear as the second operand of binary arithmetic
+operators without the need for parenthesis.
+
+@smallexample
+ X = Y * -Z
+@end smallexample
+
+@node Implicitly interconvert LOGICAL and INTEGER
+@section Implicitly interconvert LOGICAL and INTEGER
+@cindex Implicitly interconvert LOGICAL and INTEGER
+
+As a GNU extension for backwards compatability with other compilers,
+@command{gfortran} allows the implicit conversion of LOGICALs to INTEGERs
+and vice versa. When converting from a LOGICAL to an INTEGER, the numeric
+value of @code{.FALSE.} is zero, and that of @code{.TRUE.} is one. When
+converting from INTEGER to LOGICAL, the value zero is interpreted as
+@code{.FALSE.} and any non-zero value is interpreted as @code{.TRUE.}.
+
+@smallexample
+ INTEGER*4 i
+ i = .FALSE.
+@end smallexample
+
@include intrinsic.texi
@c ---------------------------------------------------------------------
@c Contributing
diff --git a/gcc/fortran/intrinsic.c b/gcc/fortran/intrinsic.c
index 0b50cdcaa11..66cf1902689 100644
--- a/gcc/fortran/intrinsic.c
+++ b/gcc/fortran/intrinsic.c
@@ -2227,8 +2227,7 @@ add_subroutines (void)
/* Add a function to the list of conversion symbols. */
static void
-add_conv (bt from_type, int from_kind, bt to_type, int to_kind,
- gfc_expr * (*simplify) (gfc_expr *, bt, int))
+add_conv (bt from_type, int from_kind, bt to_type, int to_kind, int standard)
{
gfc_typespec from, to;
@@ -2250,9 +2249,10 @@ add_conv (bt from_type, int from_kind, bt to_type, int to_kind,
sym = conversion + nconv;
- sym->name = conv_name (&from, &to);
+ sym->name = conv_name (&from, &to);
sym->lib_name = sym->name;
- sym->simplify.cc = simplify;
+ sym->simplify.cc = gfc_convert_constant;
+ sym->standard = standard;
sym->elemental = 1;
sym->ts = to;
sym->generic_id = GFC_ISYM_CONVERSION;
@@ -2277,7 +2277,7 @@ add_conversions (void)
continue;
add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
- BT_INTEGER, gfc_integer_kinds[j].kind, gfc_convert_constant);
+ BT_INTEGER, gfc_integer_kinds[j].kind, GFC_STD_F77);
}
/* Integer-Real/Complex conversions. */
@@ -2285,16 +2285,16 @@ add_conversions (void)
for (j = 0; gfc_real_kinds[j].kind != 0; j++)
{
add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
- BT_REAL, gfc_real_kinds[j].kind, gfc_convert_constant);
+ BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
add_conv (BT_REAL, gfc_real_kinds[j].kind,
- BT_INTEGER, gfc_integer_kinds[i].kind, gfc_convert_constant);
+ BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
- BT_COMPLEX, gfc_real_kinds[j].kind, gfc_convert_constant);
+ BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
add_conv (BT_COMPLEX, gfc_real_kinds[j].kind,
- BT_INTEGER, gfc_integer_kinds[i].kind, gfc_convert_constant);
+ BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_F77);
}
/* Real/Complex - Real/Complex conversions. */
@@ -2304,17 +2304,17 @@ add_conversions (void)
if (i != j)
{
add_conv (BT_REAL, gfc_real_kinds[i].kind,
- BT_REAL, gfc_real_kinds[j].kind, gfc_convert_constant);
+ BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
- BT_COMPLEX, gfc_real_kinds[j].kind, gfc_convert_constant);
+ BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
}
add_conv (BT_REAL, gfc_real_kinds[i].kind,
- BT_COMPLEX, gfc_real_kinds[j].kind, gfc_convert_constant);
+ BT_COMPLEX, gfc_real_kinds[j].kind, GFC_STD_F77);
add_conv (BT_COMPLEX, gfc_real_kinds[i].kind,
- BT_REAL, gfc_real_kinds[j].kind, gfc_convert_constant);
+ BT_REAL, gfc_real_kinds[j].kind, GFC_STD_F77);
}
/* Logical/Logical kind conversion. */
@@ -2325,8 +2325,19 @@ add_conversions (void)
continue;
add_conv (BT_LOGICAL, gfc_logical_kinds[i].kind,
- BT_LOGICAL, gfc_logical_kinds[j].kind, gfc_convert_constant);
+ BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_F77);
}
+
+ /* Integer-Logical and Logical-Integer conversions. */
+ if ((gfc_option.allow_std & GFC_STD_LEGACY) != 0)
+ for (i=0; gfc_integer_kinds[i].kind; i++)
+ for (j=0; gfc_logical_kinds[j].kind; j++)
+ {
+ add_conv (BT_INTEGER, gfc_integer_kinds[i].kind,
+ BT_LOGICAL, gfc_logical_kinds[j].kind, GFC_STD_LEGACY);
+ add_conv (BT_LOGICAL, gfc_logical_kinds[j].kind,
+ BT_INTEGER, gfc_integer_kinds[i].kind, GFC_STD_LEGACY);
+ }
}
@@ -3142,7 +3153,10 @@ gfc_convert_type_warn (gfc_expr * expr, gfc_typespec * ts, int eflag,
goto bad;
/* At this point, a conversion is necessary. A warning may be needed. */
- if (wflag && gfc_option.warn_conversion)
+ if ((gfc_option.warn_std & sym->standard) != 0)
+ gfc_warning_now ("Extension: Conversion from %s to %s at %L",
+ gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
+ else if (wflag && gfc_option.warn_conversion)
gfc_warning_now ("Conversion from %s to %s at %L",
gfc_typename (&from_ts), gfc_typename (ts), &expr->where);
diff --git a/gcc/fortran/intrinsic.texi b/gcc/fortran/intrinsic.texi
index ad09185bd45..a5248856300 100644
--- a/gcc/fortran/intrinsic.texi
+++ b/gcc/fortran/intrinsic.texi
@@ -32,41 +32,61 @@ This portion of the document is incomplete and undergoing massive expansion
and editing. All contributions and corrections are strongly encouraged.
@menu
-* Introduction: Introduction
-* @code{ABORT}: ABORT, Abort the program
-* @code{ABS}: ABS, Absolute value
-* @code{ACHAR}: ACHAR, Character in @acronym{ASCII} collating sequence
-* @code{ACOS}: ACOS, Arccosine function
-* @code{ADJUSTL}: ADJUSTL, Left adjust a string
-* @code{ADJUSTR}: ADJUSTR, Right adjust a string
-* @code{AIMAG}: AIMAG, Imaginary part of complex number
-* @code{AINT}: AINT, Truncate to a whole number
-* @code{ALL}: ALL, Determine if all values are true
-* @code{ALLOCATED}: ALLOCATED, Status of allocatable entity
-* @code{ANINT}: ANINT, Nearest whole number
-* @code{ANY}: ANY, Determine if any values are true
-* @code{ASIN}: ASIN, Arcsine function
-* @code{ASSOCIATED}: ASSOCIATED, Status of a pointer or pointer/target pair
-* @code{ATAN}: ATAN, Arctangent function
-* @code{ATAN2}: ATAN2, Arctangent function
-* @code{BESJ0}: BESJ0, Bessel function of the first kind of order 0
-* @code{BESJ1}: BESJ1, Bessel function of the first kind of order 1
-* @code{BESJN}: BESJN, Bessel function of the first kind
-* @code{BESY0}: BESY0, Bessel function of the second kind of order 0
-* @code{BESY1}: BESY1, Bessel function of the second kind of order 1
-* @code{BESYN}: BESYN, Bessel function of the second kind
-* @code{COS}: COS, Cosine function
-* @code{COSH}: COSH, Hyperbolic cosine function
-* @code{ERF}: ERF, Error function
-* @code{ERFC}: ERFC, Complementary error function
-* @code{EXP}: EXP, Cosine function
-* @code{LOG}: LOG, Logarithm function
-* @code{LOG10}: LOG10, Base 10 logarithm function
-* @code{SQRT}: SQRT, Square-root function
-* @code{SIN}: SIN, Sine function
-* @code{SINH}: SINH, Hyperbolic sine function
-* @code{TAN}: TAN, Tangent function
-* @code{TANH}: TANH, Hyperbolic tangent function
+* Introduction: Introduction
+* @code{ABORT}: ABORT, Abort the program
+* @code{ABS}: ABS, Absolute value
+* @code{ACHAR}: ACHAR, Character in @acronym{ASCII} collating sequence
+* @code{ACOS}: ACOS, Arc cosine function
+* @code{ADJUSTL}: ADJUSTL, Left adjust a string
+* @code{ADJUSTR}: ADJUSTR, Right adjust a string
+* @code{AIMAG}: AIMAG, Imaginary part of complex number
+* @code{AINT}: AINT, Truncate to a whole number
+* @code{ALL}: ALL, Determine if all values are true
+* @code{ALLOCATED}: ALLOCATED, Status of allocatable entity
+* @code{ANINT}: ANINT, Nearest whole number
+* @code{ANY}: ANY, Determine if any values are true
+* @code{ASIN}: ASIN, Arcsine function
+* @code{ASSOCIATED}: ASSOCIATED, Status of a pointer or pointer/target pair
+* @code{ATAN}: ATAN, Arctangent function
+* @code{ATAN2}: ATAN2, Arctangent function
+* @code{BESJ0}: BESJ0, Bessel function of the first kind of order 0
+* @code{BESJ1}: BESJ1, Bessel function of the first kind of order 1
+* @code{BESJN}: BESJN, Bessel function of the first kind
+* @code{BESY0}: BESY0, Bessel function of the second kind of order 0
+* @code{BESY1}: BESY1, Bessel function of the second kind of order 1
+* @code{BESYN}: BESYN, Bessel function of the second kind
+* @code{BIT_SIZE}: BIT_SIZE, Bit size inquiry function
+* @code{BTEST}: BTEST, Bit test function
+* @code{CEILING}: CEILING, Integer ceiling function
+* @code{CHAR}: CHAR, Character conversion function
+* @code{CMPLX}: CMPLX, Complex conversion function
+* @code{COMMAND_ARGUMENT_COUNT}: COMMAND_ARGUMENT_COUNT, Command line argument count
+* @code{CONJG}: CONJG, Complex conjugate function
+* @code{COS}: COS, Cosine function
+* @code{COSH}: COSH, Hyperbolic cosine function
+* @code{COUNT}: COUNT, Count occurences of .TRUE. in an array
+* @code{CPU_TIME}: CPU_TIME, CPU time subroutine
+* @code{CSHIFT}: CSHIFT, Circular array shift function
+* @code{DATE_AND_TIME}: DATE_AND_TIME, Date and time subroutine
+* @code{DBLE}: DBLE, Double precision conversion function
+* @code{DCMPLX}: DCMPLX, Double complex conversion function
+* @code{DFLOAT}: DFLOAT, Double precision conversion function
+* @code{DIGITS}: DIGITS, Significant digits function
+* @code{DIM}: DIM, Dim function
+* @code{DOT_PRODUCT}: DOT_PRODUCT, Dot product function
+* @code{DPROD}: DPROD, Double product function
+* @code{DREAL}: DREAL, Double real part function
+* @code{DTIME}: DTIME, Execution time subroutine (or function)
+* @code{ERF}: ERF, Error function
+* @code{ERFC}: ERFC, Complementary error function
+* @code{EXP}: EXP, Cosine function
+* @code{LOG}: LOG, Logarithm function
+* @code{LOG10}: LOG10, Base 10 logarithm function
+* @code{SQRT}: SQRT, Square-root function
+* @code{SIN}: SIN, Sine function
+* @code{SINH}: SINH, Hyperbolic sine function
+* @code{TAN}: TAN, Tangent function
+* @code{TANH}: TANH, Hyperbolic tangent function
@end menu
@node Introduction
@@ -85,7 +105,7 @@ the Fortran 95 standard. Gfortran defines the default integer type and
default real type by @code{INTEGER(KIND=4)} and @code{REAL(KIND=4)},
respectively. The standard mandates that both data types shall have
another kind, which have more precision. On typical target architectures
-supports by @command{gfortran}, this kind type parameter is @code{KIND=8}.
+supported by @command{gfortran}, this kind type parameter is @code{KIND=8}.
Hence, @code{REAL(KIND=8)} and @code{DOUBLE PRECISION} are equivalent.
In the description of generic intrinsic procedures, the kind type parameter
will be specified by @code{KIND=*}, and in the description of specific
@@ -100,7 +120,7 @@ and denotes such arguments by square brackets.
@command{Gfortran} offers the @option{-std=f95} and @option{-std=gnu} options,
which can be used to restrict the set of intrinsic procedures to a
given standard. By default, @command{gfortran} sets the @option{-std=gnu}
-option, and so all intrinsic procedures describe here are accepted. There
+option, and so all intrinsic procedures described here are accepted. There
is one caveat. For a select group of intrinsic procedures, @command{g77}
implemented both a function and a subroutine. Both classes
have been implemented in @command{gfortran} for backwards compatibility
@@ -124,7 +144,7 @@ which is suitable for debugging purposes.
@item @emph{Option}:
gnu
-@item @emph{Type}:
+@item @emph{Class}:
non-elemental subroutine
@item @emph{Syntax}:
@@ -161,7 +181,7 @@ end program test_abort
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -216,7 +236,7 @@ in the @acronym{ASCII} collating sequence.
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -224,7 +244,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{I} @tab The type shall be an @code{INTEGER(*)}.
+@item @var{I} @tab The type shall be @code{INTEGER(*)}.
@end multitable
@item @emph{Return value}:
@@ -243,19 +263,19 @@ end program test_achar
@node ACOS
-@section @code{ACOS} --- Arccosine function
+@section @code{ACOS} --- Arc cosine function
@findex @code{ACOS} intrinsic
@findex @code{DACOS} intrinsic
-@cindex arccosine
+@cindex arc cosine
@table @asis
@item @emph{Description}:
-@code{ACOS(X)} computes the arccosine of its @var{X}.
+@code{ACOS(X)} computes the arc cosine of @var{X}.
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -263,7 +283,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)}, and a magnitude that is
+@item @var{X} @tab The type shall be @code{REAL(*)} with a magnitude that is
less than one.
@end multitable
@@ -302,7 +322,7 @@ Spaces are inserted at the end of the string as needed.
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -329,6 +349,7 @@ end program test_adjustl
@end table
+
@node ADJUSTR
@section @code{ADJUSTR} --- Right adjust a string
@findex @code{ADJUSTR} intrinsic
@@ -342,7 +363,7 @@ Spaces are inserted at the start of the string as needed.
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -369,6 +390,7 @@ end program test_adjustr
@end table
+
@node AIMAG
@section @code{AIMAG} --- Imaginary part of complex number
@findex @code{AIMAG} intrinsic
@@ -382,7 +404,7 @@ end program test_adjustr
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -416,6 +438,7 @@ end program test_aimag
@end table
+
@node AINT
@section @code{AINT} --- Imaginary part of complex number
@findex @code{AINT} intrinsic
@@ -429,11 +452,11 @@ end program test_aimag
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
-@code{X = AINT(X)} @*
+@code{X = AINT(X)}
@code{X = AINT(X, KIND)}
@item @emph{Arguments}:
@@ -445,7 +468,7 @@ initialization expression.
@item @emph{Return value}:
The return value is of type real with the kind type parameter of the
-argument if the optional @var{KIND} is absence; otherwise, the kind
+argument if the optional @var{KIND} is absent; otherwise, the kind
type parameter will be given by @var{KIND}. If the magnitude of
@var{X} is less than one, then @code{AINT(X)} returns zero. If the
magnitude is equal to or greater than one, then it returns the largest
@@ -472,6 +495,7 @@ end program test_aint
@end table
+
@node ALL
@section @code{ALL} --- All values in @var{MASK} along @var{DIM} are true
@findex @code{ALL} intrinsic
@@ -485,11 +509,11 @@ in the array along dimension @var{DIM}.
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
transformational function
@item @emph{Syntax}:
-@code{L = ALL(MASK)} @*
+@code{L = ALL(MASK)}
@code{L = ALL(MASK, DIM)}
@item @emph{Arguments}:
@@ -546,12 +570,12 @@ end program test_all
@table @asis
@item @emph{Description}:
-@code{ALLOCATED(X)} checks the status of wether @var{X} is allocated.
+@code{ALLOCATED(X)} checks the status of whether @var{X} is allocated.
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
inquiry function
@item @emph{Syntax}:
@@ -578,6 +602,7 @@ end program test_allocated
@end table
+
@node ANINT
@section @code{ANINT} --- Imaginary part of complex number
@findex @code{ANINT} intrinsic
@@ -591,11 +616,11 @@ end program test_allocated
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
-@code{X = ANINT(X)} @*
+@code{X = ANINT(X)}
@code{X = ANINT(X, KIND)}
@item @emph{Arguments}:
@@ -607,7 +632,7 @@ initialization expression.
@item @emph{Return value}:
The return value is of type real with the kind type parameter of the
-argument if the optional @var{KIND} is absence; otherwise, the kind
+argument if the optional @var{KIND} is absent; otherwise, the kind
type parameter will be given by @var{KIND}. If @var{X} is greater than
zero, then @code{ANINT(X)} returns @code{AINT(X+0.5)}. If @var{X} is
less than or equal to zero, then return @code{AINT(X-0.5)}.
@@ -632,6 +657,7 @@ end program test_anint
@end table
+
@node ANY
@section @code{ANY} --- Any value in @var{MASK} along @var{DIM} is true
@findex @code{ANY} intrinsic
@@ -639,17 +665,17 @@ end program test_anint
@table @asis
@item @emph{Description}:
-@code{ANY(MASK [, DIM])} determines if any of the values is true in @var{MASK}
-in the array along dimension @var{DIM}.
+@code{ANY(MASK [, DIM])} determines if any of the values in the logical array @var{MASK}
+along dimension @var{DIM} are @code{.TRUE.}.
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
transformational function
@item @emph{Syntax}:
-@code{L = ANY(MASK)} @*
+@code{L = ANY(MASK)}
@code{L = ANY(MASK, DIM)}
@item @emph{Arguments}:
@@ -698,6 +724,7 @@ end program test_any
@end table
+
@node ASIN
@section @code{ASIN} --- Arcsine function
@findex @code{ASIN} intrinsic
@@ -711,7 +738,7 @@ end program test_any
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -719,7 +746,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)}, and a magnitude that is
+@item @var{X} @tab The type shall be @code{REAL(*)}, and a magnitude that is
less than one.
@end multitable
@@ -744,6 +771,7 @@ end program test_asin
@end table
+
@node ASSOCIATED
@section @code{ASSOCIATED} --- Status of a pointer or pointer/target pair
@findex @code{ASSOCIATED} intrinsic
@@ -757,11 +785,11 @@ or if @var{PTR} is associated with the target @var{TGT}.
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
inquiry function
@item @emph{Syntax}:
-@code{L = ASSOCIATED(PTR)} @*
+@code{L = ASSOCIATED(PTR)}
@code{L = ASSOCIATED(PTR [, TGT])}
@item @emph{Arguments}:
@@ -816,6 +844,7 @@ end program test_associated
@end table
+
@node ATAN
@section @code{ATAN} --- Arctangent function
@findex @code{ATAN} intrinsic
@@ -829,7 +858,7 @@ end program test_associated
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -837,7 +866,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)}.
+@item @var{X} @tab The type shall be @code{REAL(*)}.
@end multitable
@item @emph{Return value}:
@@ -860,6 +889,7 @@ end program test_atan
@end table
+
@node ATAN2
@section @code{ATAN2} --- Arctangent function
@findex @code{ATAN2} intrinsic
@@ -873,7 +903,7 @@ end program test_atan
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -911,6 +941,7 @@ end program test_atan2
@end table
+
@node BESJ0
@section @code{BESJ0} --- Bessel function of the first kind of order 0
@findex @code{BESJ0} intrinsic
@@ -925,7 +956,7 @@ of @var{X}.
@item @emph{Option}:
gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -933,7 +964,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)}, and it shall be scalar.
+@item @var{X} @tab The type shall be @code{REAL(*)}, and it shall be scalar.
@end multitable
@item @emph{Return value}:
@@ -971,7 +1002,7 @@ of @var{X}.
@item @emph{Option}:
gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -979,7 +1010,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)}, and it shall be scalar.
+@item @var{X} @tab The type shall be @code{REAL(*)}, and it shall be scalar.
@end multitable
@item @emph{Return value}:
@@ -1017,7 +1048,7 @@ end program test_besj1
@item @emph{Option}:
gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1025,8 +1056,8 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{N} @tab The type shall be an @code{INTEGER(*)}, and it shall be scalar.
-@item @var{X} @tab The type shall be an @code{REAL(*)}, and it shall be scalar.
+@item @var{N} @tab The type shall be @code{INTEGER(*)}, and it shall be scalar.
+@item @var{X} @tab The type shall be @code{REAL(*)}, and it shall be scalar.
@end multitable
@item @emph{Return value}:
@@ -1064,7 +1095,7 @@ of @var{X}.
@item @emph{Option}:
gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1072,7 +1103,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)}, and it shall be scalar.
+@item @var{X} @tab The type shall be @code{REAL(*)}, and it shall be scalar.
@end multitable
@item @emph{Return value}:
@@ -1109,7 +1140,7 @@ of @var{X}.
@item @emph{Option}:
gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1117,7 +1148,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)}, and it shall be scalar.
+@item @var{X} @tab The type shall be @code{REAL(*)}, and it shall be scalar.
@end multitable
@item @emph{Return value}:
@@ -1154,7 +1185,7 @@ end program test_besy1
@item @emph{Option}:
gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1162,8 +1193,8 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{N} @tab The type shall be an @code{INTEGER(*)}, and it shall be scalar.
-@item @var{X} @tab The type shall be an @code{REAL(*)}, and it shall be scalar.
+@item @var{N} @tab The type shall be @code{INTEGER(*)}, and it shall be scalar.
+@item @var{X} @tab The type shall be @code{REAL(*)}, and it shall be scalar.
@end multitable
@item @emph{Return value}:
@@ -1186,6 +1217,301 @@ end program test_besyn
@end table
+
+@node BIT_SIZE
+@section @code{BIT_SIZE} --- Bit size inquiry function
+@findex @code{BIT_SIZE} intrinsic
+@cindex bit_size
+
+@table @asis
+@item @emph{Description}:
+@code{BIT_SIZE(I)} returns the number of bits (integer precision plus sign bit) represented by the type of @var{I}.
+
+@item @emph{Option}:
+f95, gnu
+
+@item @emph{Class}:
+elemental function
+
+@item @emph{Syntax}:
+@code{I = BIT_SIZE(I)}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{I} @tab The type shall be @code{INTEGER(*)}.
+@end multitable
+
+@item @emph{Return value}:
+The return value is of type @code{INTEGER(*)}
+
+@item @emph{Example}:
+@smallexample
+program test_bit_size
+ integer :: i = 123
+ integer :: size
+ size = bit_size(i)
+ print *, size
+end program test_bit_size
+@end smallexample
+@end table
+
+
+
+@node BTEST
+@section @code{BTEST} --- Bit test function
+@findex @code{BTEST} intrinsic
+@cindex BTEST
+
+@table @asis
+@item @emph{Description}:
+@code{BTEST(I,POS)} returns logical .TRUE. if the bit at @var{POS} in @var{I} is set.
+
+@item @emph{Option}:
+f95, gnu
+
+@item @emph{Class}:
+elemental function
+
+@item @emph{Syntax}:
+@code{I = BTEST(I,POS)}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{I} @tab The type shall be @code{INTEGER(*)}.
+@item @var{POS} @tab The type shall be @code{INTEGER(*)}.
+@end multitable
+
+@item @emph{Return value}:
+The return value is of type @code{LOGICAL}
+
+@item @emph{Example}:
+@smallexample
+program test_btest
+ integer :: i = 32768 + 1024 + 64
+ integer :: pos
+ logical :: bool
+ do pos=0,16
+ bool = btest(i, pos)
+ print *, pos, bool
+ end do
+end program test_btest
+@end smallexample
+@end table
+
+
+
+@node CEILING
+@section @code{CEILING} --- Integer ceiling function
+@findex @code{CEILING} intrinsic
+@cindex CEILING
+
+@table @asis
+@item @emph{Description}:
+@code{CEILING(X)} returns the least integer greater than or equal to @var{X}.
+
+@item @emph{Option}:
+f95, gnu
+
+@item @emph{Class}:
+elemental function
+
+@item @emph{Syntax}:
+@code{X = CEILING(X[,KIND])}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{X} @tab The type shall be @code{REAL(*)}.
+@item @var{KIND} @tab Optional scaler integer initialization expression.
+@end multitable
+
+@item @emph{Return value}:
+The return value is of type @code{INTEGER(KIND)}
+
+@item @emph{Example}:
+@smallexample
+program test_ceiling
+ real :: x = 63.29
+ real :: y = -63.59
+ print *, ceiling(x) ! returns 64
+ print *, ceiling(y) ! returns -63
+end program test_ceiling
+@end smallexample
+@end table
+
+
+
+@node CHAR
+@section @code{CHAR} --- Character conversion function
+@findex @code{CHAR} intrinsic
+@cindex CHAR
+
+@table @asis
+@item @emph{Description}:
+@code{CHAR(I,[KIND])} returns the character represented by the integer @var{I}.
+
+@item @emph{Option}:
+f95, gnu
+
+@item @emph{Class}:
+elemental function
+
+@item @emph{Syntax}:
+@code{C = CHAR(I[,KIND])}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{I} @tab The type shall be @code{INTEGER(*)}.
+@item @var{KIND} @tab Optional scaler integer initialization expression.
+@end multitable
+
+@item @emph{Return value}:
+The return value is of type @code{CHARACTER(1)}
+
+@item @emph{Example}:
+@smallexample
+program test_char
+ integer :: i = 74
+ character(1) :: c
+ c = char(i)
+ print *, i, c ! returns 'J'
+end program test_char
+@end smallexample
+@end table
+
+
+
+@node CMPLX
+@section @code{CMPLX} --- Complex conversion function
+@findex @code{CMPLX} intrinsic
+@cindex CMPLX
+
+@table @asis
+@item @emph{Description}:
+@code{CMPLX(X,[Y,KIND])} returns a complex number where @var{X} is converted to
+the real component. If @var{Y} is present it is converted to the imaginary
+component. If @var{Y} is not present then the imaginary component is set to
+0.0. If @var{X} is complex then @var{Y} must not be present.
+
+@item @emph{Option}:
+f95, gnu
+
+@item @emph{Class}:
+elemental function
+
+@item @emph{Syntax}:
+@code{C = CMPLX(X[,Y,KIND])}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{X} @tab The type may be @code{INTEGER(*)}, @code{REAL(*)}, or @code{COMPLEX(*)}.
+@item @var{Y} @tab Optional, allowed if @var{X} is not @code{COMPLEX(*)}. May be @code{INTEGER(*)} or @code{REAL(*)}.
+@item @var{KIND} @tab Optional scaler integer initialization expression.
+@end multitable
+
+@item @emph{Return value}:
+The return value is of type @code{COMPLEX(*)}
+
+@item @emph{Example}:
+@smallexample
+program test_cmplx
+ integer :: i = 42
+ real :: x = 3.14
+ complex :: z
+ z = cmplx(i, x)
+ print *, z, cmplx(x)
+end program test_cmplx
+@end smallexample
+@end table
+
+
+
+@node COMMAND_ARGUMENT_COUNT
+@section @code{COMMAND_ARGUMENT_COUNT} --- Argument count function
+@findex @code{COMMAND_ARGUMENT_COUNT} intrinsic
+@cindex command argument count
+
+@table @asis
+@item @emph{Description}:
+@code{COMMAND_ARGUMENT_COUNT()} returns the number of arguments passed on the
+command line when the containing program was invoked.
+
+@item @emph{Option}:
+f2003, gnu
+
+@item @emph{Class}:
+non-elemental function
+
+@item @emph{Syntax}:
+@code{I = COMMAND_ARGUMENT_COUNT()}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item None
+@end multitable
+
+@item @emph{Return value}:
+The return value is of type @code{INTEGER(4)}
+
+@item @emph{Example}:
+@smallexample
+program test_command_argument_count
+ integer :: count
+ count = command_argument_count()
+ print *, count
+end program test_command_argument_count
+@end smallexample
+@end table
+
+
+
+@node CONJG
+@section @code{CONJG} --- Complex conjugate function
+@findex @code{CONJG} intrinsic
+@findex @code{DCONJG} intrinsic
+@cindex complex conjugate
+@table @asis
+@item @emph{Description}:
+@code{CONJG(Z)} returns the conjugate of @var{Z}. If @var{Z} is @code{(x, y)}
+then the result is @code{(x, -y)}
+
+@item @emph{Option}:
+f95, gnu
+
+@item @emph{Class}:
+elemental function
+
+@item @emph{Syntax}:
+@code{Z = CONJG(Z)}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{Z} @tab The type shall be @code{COMPLEX(*)}.
+@end multitable
+
+@item @emph{Return value}:
+The return value is of type @code{COMPLEX(*)}.
+
+@item @emph{Example}:
+@smallexample
+program test_conjg
+ complex :: z = (2.0, 3.0)
+ complex(8) :: dz = (2.71_8, -3.14_8)
+ z= conjg(z)
+ print *, z
+ dz = dconjg(dz)
+ print *, dz
+end program test_conjg
+@end smallexample
+
+@item @emph{Specific names}:
+@multitable @columnfractions .24 .24 .24 .24
+@item Name @tab Argument @tab Return type @tab Option
+@item @code{DCONJG(Z)} @tab @code{COMPLEX(8) Z} @tab @code{COMPLEX(8)} @tab gnu
+@end multitable
+@end table
+
+
+
@node COS
@section @code{COS} --- Cosine function
@findex @code{COS} intrinsic
@@ -1201,7 +1527,7 @@ end program test_besyn
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1209,12 +1535,12 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)} or
+@item @var{X} @tab The type shall be @code{REAL(*)} or
@code{COMPLEX(*)}.
@end multitable
@item @emph{Return value}:
-The return value has same type and kind than @var{X}.
+The return value has the same type and kind as @var{X}.
@item @emph{Example}:
@smallexample
@@ -1226,15 +1552,16 @@ end program test_cos
@item @emph{Specific names}:
@multitable @columnfractions .24 .24 .24 .24
-@item Name @tab Argument @tab Return type @tab Option
-@item @code{DCOS(X)} @tab @code{REAL(8) X} @tab @code{REAL(8)} @tab f95, gnu
-@item @code{CCOS(X)} @tab @code{COMPLEX(4) X} @tab @code{COMPLEX(4)} @tab f95, gnu
-@item @code{ZCOS(X)} @tab @code{COMPLEX(8) X} @tab @code{COMPLEX(8)} @tab f95, gnu
-@item @code{CDCOS(X)} @tab @code{COMPLEX(8) X} @tab @code{COMPLEX(8)} @tab f95, gnu
+@item Name @tab Argument @tab Return type @tab Option
+@item @code{DCOS(X)} @tab @code{REAL(8) X} @tab @code{REAL(8)} @tab f95, gnu
+@item @code{CCOS(X)}@tab @code{COMPLEX(4) X}@tab @code{COMPLEX(4)}@tab f95, gnu
+@item @code{ZCOS(X)}@tab @code{COMPLEX(8) X}@tab @code{COMPLEX(8)}@tab f95, gnu
+@item @code{CDCOS(X)}@tab @code{COMPLEX(8) X}@tab @code{COMPLEX(8)}@tab f95, gnu
@end multitable
@end table
+
@node COSH
@section @code{COSH} --- Hyperbolic cosine function
@findex @code{COSH} intrinsic
@@ -1248,7 +1575,7 @@ end program test_cos
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1256,7 +1583,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)}.
+@item @var{X} @tab The type shall be @code{REAL(*)}.
@end multitable
@item @emph{Return value}:
@@ -1279,6 +1606,629 @@ end program test_cosh
@end table
+
+@node COUNT
+@section @code{COUNT} --- Count function
+@findex @code{COUNT} intrinsic
+@cindex count
+
+@table @asis
+@item @emph{Description}:
+@code{COUNT(MASK[,DIM])} counts the number of @code{.TRUE.} elements of
+@var{MASK} along the dimension of @var{DIM}. If @var{DIM} is omitted it is
+taken to be @code{1}. @var{DIM} is a scaler of type @code{INTEGER} in the
+range of @math{1 /leq DIM /leq n)} where @math{n} is the rank of @var{MASK}.
+
+@item @emph{Option}:
+f95, gnu
+
+@item @emph{Class}:
+transformational function
+
+@item @emph{Syntax}:
+@code{I = COUNT(MASK[,DIM])}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{MASK} @tab The type shall be @code{LOGICAL}.
+@item @var{DIM} @tab The type shall be @code{INTEGER}.
+@end multitable
+
+@item @emph{Return value}:
+The return value is of type @code{INTEGER} with rank equal to that of
+@var{MASK}.
+
+@item @emph{Example}:
+@smallexample
+program test_count
+ integer, dimension(2,3) :: a, b
+ logical, dimension(2,3) :: mask
+ a = reshape( (/ 1, 2, 3, 4, 5, 6 /), (/ 2, 3 /))
+ b = reshape( (/ 0, 7, 3, 4, 5, 8 /), (/ 2, 3 /))
+ print '(3i3)', a(1,:)
+ print '(3i3)', a(2,:)
+ print *
+ print '(3i3)', b(1,:)
+ print '(3i3)', b(2,:)
+ print *
+ mask = a.ne.b
+ print '(3l3)', mask(1,:)
+ print '(3l3)', mask(2,:)
+ print *
+ print '(3i3)', count(mask)
+ print *
+ print '(3i3)', count(mask, 1)
+ print *
+ print '(3i3)', count(mask, 2)
+end program test_count
+@end smallexample
+@end table
+
+
+
+@node CPU_TIME
+@section @code{CPU_TIME} --- CPU elapsed time in seconds
+@findex @code{CPU_TIME} intrinsic
+@cindex CPU_TIME
+
+@table @asis
+@item @emph{Description}:
+Returns a @code{REAL} value representing the elapsed CPU time in seconds. This
+is useful for testing segments of code to determine execution time.
+
+@item @emph{Option}:
+f95, gnu
+
+@item @emph{Class}:
+subroutine
+
+@item @emph{Syntax}:
+@code{CPU_TIME(X)}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{X} @tab The type shall be @code{REAL} with intent out.
+@end multitable
+
+@item @emph{Return value}:
+None
+
+@item @emph{Example}:
+@smallexample
+program test_cpu_time
+ real :: start, finish
+ call cpu_time(start)
+ ! put code to test here
+ call cpu_time(finish)
+ print '("Time = ",f6.3," seconds.")',finish-start
+end program test_cpu_time
+@end smallexample
+@end table
+
+
+
+@node CSHIFT
+@section @code{CSHIFT} --- Circular shift function
+@findex @code{CSHIFT} intrinsic
+@cindex cshift intrinsic
+
+@table @asis
+@item @emph{Description}:
+@code{CSHIFT(ARRAY, SHIFT[,DIM])} performs a circular shift on elements of
+@var{ARRAY} along the dimension of @var{DIM}. If @var{DIM} is omitted it is
+taken to be @code{1}. @var{DIM} is a scaler of type @code{INTEGER} in the
+range of @math{1 /leq DIM /leq n)} where @math{n} is the rank of @var{ARRAY}.
+If the rank of @var{ARRAY} is one, then all elements of @var{ARRAY} are shifted
+by @var{SHIFT} places. If rank is greater than one, then all complete rank one
+sections of @var{ARRAY} along the given dimension are shifted. Elements
+shifted out one end of each rank one section are shifted back in the other end.
+
+@item @emph{Option}:
+f95, gnu
+
+@item @emph{Class}:
+transformational function
+
+@item @emph{Syntax}:
+@code{A = CSHIFT(A, SHIFT[,DIM])}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{ARRAY} @tab May be any type, not scaler.
+@item @var{SHIFT} @tab The type shall be @code{INTEGER}.
+@item @var{DIM} @tab The type shall be @code{INTEGER}.
+@end multitable
+
+@item @emph{Return value}:
+Returns an array of same type and rank as the @var{ARRAY} argument.
+
+@item @emph{Example}:
+@smallexample
+program test_cshift
+ integer, dimension(3,3) :: a
+ a = reshape( (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /), (/ 3, 3 /))
+ print '(3i3)', a(1,:)
+ print '(3i3)', a(2,:)
+ print '(3i3)', a(3,:)
+ a = cshift(a, SHIFT=(/1, 2, -1/), DIM=2)
+ print *
+ print '(3i3)', a(1,:)
+ print '(3i3)', a(2,:)
+ print '(3i3)', a(3,:)
+end program test_cshift
+@end smallexample
+@end table
+
+
+
+@node DATE_AND_TIME
+@section @code{DATE_AND_TIME} --- Date and time subroutine
+@findex @code{DATE_AND_TIME} intrinsic
+@cindex DATE_AND_TIME
+
+@table @asis
+@item @emph{Description}:
+@code{DATE_AND_TIME(DATE, TIME, ZONE, VALUES)} gets the corresponding date and
+time information from the real-time system clock. @var{DATE} is
+@code{INTENT(OUT)} and has form ccyymmdd. @var{TIME} is @code{INTENT(OUT)} and
+has form hhmmss.sss. @var{ZONE} is @code{INTENT(OUT)} and has form (+-)hhmm,
+representing the difference with respect to Coordinated Universal Time (UTC).
+Unavailable time and date parameters return blanks.
+
+@var{VALUES} is @code{INTENT(OUT)} and provides the following:
+
+@multitable @columnfractions .15 .30 .60
+@item @tab @code{VALUE(1)}: @tab The year
+@item @tab @code{VALUE(2)}: @tab The month
+@item @tab @code{VALUE(3)}: @tab The day of the month
+@item @tab @code{VAlUE(4)}: @tab Time difference with UTC in minutes
+@item @tab @code{VALUE(5)}: @tab The hour of the day
+@item @tab @code{VALUE(6)}: @tab The minutes of the hour
+@item @tab @code{VALUE(7)}: @tab The seconds of the minute
+@item @tab @code{VALUE(8)}: @tab The milliseconds of the second
+@end multitable
+
+@item @emph{Option}:
+f95, gnu
+
+@item @emph{Class}:
+subroutine
+
+@item @emph{Syntax}:
+@code{CALL DATE_AND_TIME([DATE, TIME, ZONE, VALUES])}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{DATE} @tab (Optional) The type shall be @code{CHARACTER(8)} or larger.
+@item @var{TIME} @tab (OPtional) The type shall be @code{CHARACTER(10)} or larger.
+@item @var{ZONE} @tab (Optional) The type shall be @code{CHARACTER(5)} or larger.
+@item @var{VALUES}@tab (Optional) The type shall be @code{INTEGER(8)}.
+@end multitable
+
+@item @emph{Return value}:
+None
+
+@item @emph{Example}:
+@smallexample
+program test_time_and_date
+ character(8) :: date
+ character(10) :: time
+ character(5) :: zone
+ integer,dimension(8) :: values
+ ! using keyword arguments
+ call date_and_time(date,time,zone,values)
+ call date_and_time(DATE=date,ZONE=zone)
+ call date_and_time(TIME=time)
+ call date_and_time(VALUES=values)
+ print '(a,2x,a,2x,a)', date, time, zone
+ print '(8i5))', values
+end program test_time_and_date
+@end smallexample
+@end table
+
+
+
+@node DBLE
+@section @code{DBLE} --- Double conversion function
+@findex @code{DBLE} intrinsic
+@cindex double conversion
+
+@table @asis
+@item @emph{Description}:
+@code{DBLE(X)} Converts @var{X} to double precision real type.
+@code{DFLOAT} is an alias for @code{DBLE}
+
+@item @emph{Option}:
+f95, gnu
+
+@item @emph{Class}:
+elemental function
+
+@item @emph{Syntax}:
+@code{X = DBLE(X)}
+@code{X = DFLOAT(X)}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{X} @tab The type shall be @code{INTEGER(*)}, @code{REAL(*)}, or @code{COMPLEX(*)}.
+@end multitable
+
+@item @emph{Return value}:
+The return value is of type double precision real.
+
+@item @emph{Example}:
+@smallexample
+program test_dble
+ real :: x = 2.18
+ integer :: i = 5
+ complex :: z = (2.3,1.14)
+ print *, dble(x), dble(i), dfloat(z)
+end program test_dble
+@end smallexample
+@end table
+
+
+
+@node DCMPLX
+@section @code{DCMPLX} --- Double complex conversion function
+@findex @code{DCMPLX} intrinsic
+@cindex DCMPLX
+
+@table @asis
+@item @emph{Description}:
+@code{DCMPLX(X [,Y])} returns a double complex number where @var{X} is
+converted to the real component. If @var{Y} is present it is converted to the
+imaginary component. If @var{Y} is not present then the imaginary component is
+set to 0.0. If @var{X} is complex then @var{Y} must not be present.
+
+@item @emph{Option}:
+f95, gnu
+
+@item @emph{Class}:
+elemental function
+
+@item @emph{Syntax}:
+@code{C = DCMPLX(X)}
+@code{C = DCMPLX(X,Y)}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{X} @tab The type may be @code{INTEGER(*)}, @code{REAL(*)}, or @code{COMPLEX(*)}.
+@item @var{Y} @tab Optional if @var{X} is not @code{COMPLEX(*)}. May be @code{INTEGER(*)} or @code{REAL(*)}.
+@end multitable
+
+@item @emph{Return value}:
+The return value is of type @code{COMPLEX(8)}
+
+@item @emph{Example}:
+@smallexample
+program test_dcmplx
+ integer :: i = 42
+ real :: x = 3.14
+ complex :: z
+ z = cmplx(i, x)
+ print *, dcmplx(i)
+ print *, dcmplx(x)
+ print *, dcmplx(z)
+ print *, dcmplx(x,i)
+end program test_dcmplx
+@end smallexample
+@end table
+
+
+
+@node DFLOAT
+@section @code{DFLOAT} --- Double conversion function
+@findex @code{DFLOAT} intrinsic
+@cindex double float conversion
+
+@table @asis
+@item @emph{Description}:
+@code{DFLOAT(X)} Converts @var{X} to double precision real type.
+@code{DFLOAT} is an alias for @code{DBLE}. See @code{DBLE}.
+@end table
+
+
+
+@node DIGITS
+@section @code{DIGITS} --- Significant digits function
+@findex @code{DIGITS} intrinsic
+@cindex digits, significant
+
+@table @asis
+@item @emph{Description}:
+@code{DIGITS(X)} returns the number of significant digits of the internal model
+representation of @var{X}. For example, on a system using a 32-bit
+floating point representation, a default real number would likely return 24.
+
+@item @emph{Option}:
+f95, gnu
+
+@item @emph{Class}:
+inquiry function
+
+@item @emph{Syntax}:
+@code{C = DIGITS(X)}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{X} @tab The type may be @code{INTEGER(*)} or @code{REAL(*)}.
+@end multitable
+
+@item @emph{Return value}:
+The return value is of type @code{INTEGER}.
+
+@item @emph{Example}:
+@smallexample
+program test_digits
+ integer :: i = 12345
+ real :: x = 3.143
+ real(8) :: y = 2.33
+ complex :: z = (23.0,45.6)
+ print *, digits(i)
+ print *, digits(x)
+ print *, digits(y)
+end program test_digits
+@end smallexample
+@end table
+
+
+
+@node DIM
+@section @code{DIM} --- Dim function
+@findex @code{DIM} intrinsic
+@findex @code{IDIM} intrinsic
+@findex @code{DDIM} intrinsic
+@cindex dim
+
+@table @asis
+@item @emph{Description}:
+@code{DIM(X,Y)} returns the difference @code{X-Y} if the result is positive;
+otherwise returns zero.
+
+@item @emph{Option}:
+f95, gnu
+
+@item @emph{Class}:
+elemental function
+
+@item @emph{Syntax}:
+@code{X = DIM(X,Y)}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{X} @tab The type shall be @code{INTEGER(*)} or @code{REAL(*)}
+@item @var{Y} @tab The type shall be the same type and kind as @var{X}.
+@end multitable
+
+@item @emph{Return value}:
+The return value is of type @code{INTEGER(*)} or @code{REAL(*)}.
+
+@item @emph{Example}:
+@smallexample
+program test_dim
+ integer :: i
+ real(8) :: x
+ i = dim(4, 15)
+ x = dim(4.345_8, 2.111_8)
+ print *, i
+ print *, x
+end program test_dim
+@end smallexample
+
+@item @emph{Specific names}:
+@multitable @columnfractions .24 .24 .24 .24
+@item Name @tab Argument @tab Return type @tab Option
+@item @code{IDIM(X,Y)} @tab @code{INTEGER(4) X,Y} @tab @code{INTEGER(4)} @tab gnu
+@item @code{DDIM(X,Y)} @tab @code{REAL(8) X,Y} @tab @code{REAL(8)} @tab gnu
+@end multitable
+@end table
+
+
+
+@node DOT_PRODUCT
+@section @code{DOT_PRODUCT} --- Dot product function
+@findex @code{DOT_PRODUCT} intrinsic
+@cindex Dot product
+
+@table @asis
+@item @emph{Description}:
+@code{DOT_PRODUCT(X,Y)} computes the dot product multiplication of two vectors
+@var{X} and @var{Y}. The two vectors may be either numeric or logical
+and must be arrays of rank one and of equal size. If the vectors are
+@code{INTEGER(*)} or @code{REAL(*)}, the result is @code{SUM(X*Y)}. If the
+vectors are @code{COMPLEX(*)}, the result is @code{SUM(CONJG(X)*Y)}. If the
+vectors are @code{LOGICAL}, the result is @code{ANY(X.AND.Y)}.
+
+@item @emph{Option}:
+f95
+
+@item @emph{Class}:
+transformational function
+
+@item @emph{Syntax}:
+@code{S = DOT_PRODUCT(X,Y)}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{X} @tab The type shall be numeric or @code{LOGICAL}, rank 1.
+@item @var{Y} @tab The type shall be numeric or @code{LOGICAL}, rank 1.
+@end multitable
+
+@item @emph{Return value}:
+If the arguments are numeric, the return value is a scaler of numeric type,
+@code{INTEGER(*)}, @code{REAL(*)}, or @code{COMPLEX(*)}. If the arguments are
+@code{LOGICAL}, the return value is @code{.TRUE.} or @code{.FALSE.}.
+
+@item @emph{Example}:
+@smallexample
+program test_dot_prod
+ integer, dimension(3) :: a, b
+ a = (/ 1, 2, 3 /)
+ b = (/ 4, 5, 6 /)
+ print '(3i3)', a
+ print *
+ print '(3i3)', b
+ print *
+ print *, dot_product(a,b)
+end program test_dot_prod
+@end smallexample
+@end table
+
+
+
+@node DPROD
+@section @code{DPROD} --- Double product function
+@findex @code{DPROD} intrinsic
+@cindex Double product
+
+@table @asis
+@item @emph{Description}:
+@code{DPROD(X,Y)} returns the product @code{X*Y}.
+
+@item @emph{Option}:
+f95, gnu
+
+@item @emph{Class}:
+elemental function
+
+@item @emph{Syntax}:
+@code{D = DPROD(X,Y)}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{X} @tab The type shall be @code{REAL}.
+@item @var{Y} @tab The type shall be @code{REAL}.
+@end multitable
+
+@item @emph{Return value}:
+The return value is of type @code{REAL(8)}.
+
+@item @emph{Example}:
+@smallexample
+program test_dprod
+ integer :: i
+ real :: x = 5.2
+ real :: y = 2.3
+ real(8) :: d
+ d = dprod(x,y)
+ print *, d
+end program test_dprod
+@end smallexample
+@end table
+
+
+
+@node DREAL
+@section @code{DREAL} --- Double real part function
+@findex @code{DREAL} intrinsic
+@cindex Double real part
+
+@table @asis
+@item @emph{Description}:
+@code{DREAL(Z)} returns the real part of complex variable @var{Z}.
+
+@item @emph{Option}:
+gnu
+
+@item @emph{Class}:
+elemental function
+
+@item @emph{Syntax}:
+@code{D = DREAL(Z)}
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{Z} @tab The type shall be @code{COMPLEX(8)}.
+@end multitable
+
+@item @emph{Return value}:
+The return value is of type @code{REAL(8)}.
+
+@item @emph{Example}:
+@smallexample
+program test_dreal
+ complex(8) :: z = (1.3_8,7.2_8)
+ print *, dreal(z)
+end program test_dreal
+@end smallexample
+@end table
+
+
+
+@node DTIME
+@section @code{DTIME} --- Execution time subroutine (or function)
+@findex @code{DTIME} intrinsic
+@cindex dtime subroutine
+
+@table @asis
+@item @emph{Description}:
+@code{DTIME(TARRAY, RESULT)} initially returns the number of seconds of runtime
+since the start of the process's execution in @var{RESULT}. @var{TARRAY}
+returns the user and system components of this time in @code{TARRAY(1)} and
+@code{TARRAY(2)} respectively. @var{RESULT} is equal to @code{TARRAY(1) + TARRAY(2)}.
+
+Subsequent invocations of @code{DTIME} return values accumulated since the previous invocation.
+
+On some systems, the underlying timings are represented using types with
+sufficiently small limits that overflows (wraparounds) are possible, such as
+32-bit types. Therefore, the values returned by this intrinsic might be, or
+become, negative, or numerically less than previous values, during a single
+run of the compiled program.
+
+If @code{DTIME} is invoked as a function, it can not be invoked as a
+subroutine, and vice versa.
+
+@var{TARRAY} and @var{RESULT} are @code{INTENT(OUT)} and provide the following:
+
+@multitable @columnfractions .15 .30 .60
+@item @tab @code{TARRAY(1)}: @tab User time in seconds.
+@item @tab @code{TARRAY(2)}: @tab System time in seconds.
+@item @tab @code{RESULT}: @tab Run time since start in seconds.
+@end multitable
+
+@item @emph{Option}:
+gnu
+
+@item @emph{Class}:
+subroutine
+
+@item @emph{Syntax}:
+@code{CALL DTIME(TARRAY, RESULT)}
+@code{RESULT = DTIME(TARRAY)}, (not recommended)
+
+@item @emph{Arguments}:
+@multitable @columnfractions .15 .80
+@item @var{TARRAY}@tab The type shall be @code{REAL, DIMENSION(2)}.
+@item @var{RESULT}@tab The type shall be @code{REAL}.
+@end multitable
+
+@item @emph{Return value}:
+Elapsed time in seconds since the start of program execution.
+
+@item @emph{Example}:
+@smallexample
+program test_dtime
+ integer(8) :: i, j
+ real, dimension(2) :: tarray
+ real :: result
+ call dtime(tarray, result)
+ print *, result
+ print *, tarray(1)
+ print *, tarray(2)
+ do i=1,100000000 ! Just a delay
+ j = i * i - i
+ end do
+ call dtime(tarray, result)
+ print *, result
+ print *, tarray(1)
+ print *, tarray(2)
+end program test_dtime
+@end smallexample
+@end table
+
+
+
@node ERF
@section @code{ERF} --- Error function
@findex @code{ERF} intrinsic
@@ -1291,7 +2241,7 @@ end program test_cosh
@item @emph{Option}:
gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1299,7 +2249,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)}, and it shall be scalar.
+@item @var{X} @tab The type shall be @code{REAL(*)}, and it shall be scalar.
@end multitable
@item @emph{Return value}:
@@ -1335,7 +2285,7 @@ end program test_erf
@item @emph{Option}:
gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1343,7 +2293,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)}, and it shall be scalar.
+@item @var{X} @tab The type shall be @code{REAL(*)}, and it shall be scalar.
@end multitable
@item @emph{Return value}:
@@ -1382,7 +2332,7 @@ end program test_erfc
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1390,12 +2340,12 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)} or
+@item @var{X} @tab The type shall be @code{REAL(*)} or
@code{COMPLEX(*)}.
@end multitable
@item @emph{Return value}:
-The return value has same type and kind than @var{X}.
+The return value has same type and kind as @var{X}.
@item @emph{Example}:
@smallexample
@@ -1416,6 +2366,7 @@ end program test_exp
@end table
+
@node LOG
@section @code{LOG} --- Logarithm function
@findex @code{LOG} intrinsic
@@ -1433,7 +2384,7 @@ end program test_exp
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1441,7 +2392,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)} or
+@item @var{X} @tab The type shall be @code{REAL(*)} or
@code{COMPLEX(*)}.
@end multitable
@@ -1486,7 +2437,7 @@ end program test_log
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1494,7 +2445,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)} or
+@item @var{X} @tab The type shall be @code{REAL(*)} or
@code{COMPLEX(*)}.
@end multitable
@@ -1535,7 +2486,7 @@ end program test_log10
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1543,7 +2494,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)} or
+@item @var{X} @tab The type shall be @code{REAL(*)} or
@code{COMPLEX(*)}.
@end multitable
@@ -1570,7 +2521,6 @@ end program test_sin
-
@node SINH
@section @code{SINH} --- Hyperbolic sine function
@findex @code{SINH} intrinsic
@@ -1584,7 +2534,7 @@ end program test_sin
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1592,7 +2542,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)}.
+@item @var{X} @tab The type shall be @code{REAL(*)}.
@end multitable
@item @emph{Return value}:
@@ -1631,7 +2581,7 @@ end program test_sinh
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1639,7 +2589,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)} or
+@item @var{X} @tab The type shall be @code{REAL(*)} or
@code{COMPLEX(*)}.
@end multitable
@@ -1682,7 +2632,7 @@ end program test_sqrt
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1690,7 +2640,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)}.
+@item @var{X} @tab The type shall be @code{REAL(*)}.
@end multitable
@item @emph{Return value}:
@@ -1713,6 +2663,7 @@ end program test_tan
@end table
+
@node TANH
@section @code{TANH} --- Hyperbolic tangent function
@findex @code{TANH} intrinsic
@@ -1726,7 +2677,7 @@ end program test_tan
@item @emph{Option}:
f95, gnu
-@item @emph{Type}:
+@item @emph{Class}:
elemental function
@item @emph{Syntax}:
@@ -1734,7 +2685,7 @@ elemental function
@item @emph{Arguments}:
@multitable @columnfractions .15 .80
-@item @var{X} @tab The type shall be an @code{REAL(*)}.
+@item @var{X} @tab The type shall be @code{REAL(*)}.
@end multitable
@item @emph{Return value}:
@@ -1758,50 +2709,6 @@ end program test_tanh
-
-
-@comment gen bit_size
-@comment
-@comment gen btest
-@comment
-@comment gen ceiling
-@comment
-@comment gen char
-@comment
-@comment gen cmplx
-@comment
-@comment gen command_argument_count
-@comment
-@comment gen conjg
-@comment dconjg
-@comment
-@comment gen count
-@comment
-@comment sub cpu_time
-@comment
-@comment gen cshift
-@comment
-@comment sub date_and_time
-@comment
-@comment gen dble
-@comment dfloat
-@comment
-@comment gen dcmplx
-@comment
-@comment gen digits
-@comment
-@comment gen dim
-@comment idim
-@comment ddim
-@comment
-@comment gen dot_product
-@comment
-@comment gen dprod
-@comment
-@comment gen dreal
-@comment
-@comment sub dtime
-@comment
@comment gen eoshift
@comment
@comment gen epsilon
diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi
index 996556fb5bc..e3d2e26848a 100644
--- a/gcc/fortran/invoke.texi
+++ b/gcc/fortran/invoke.texi
@@ -248,7 +248,7 @@ Specify that no implicit typing is allowed, unless overridden by explicit
@cindex option, -std=@var{std}
@item -std=@var{std}
Conform to the specified standard. Allowed values for @var{std} are
-@samp{gnu} and @samp{f95}.
+@samp{gnu}, @samp{f95}, @samp{f2003} and @samp{legacy}.
@end table
@@ -571,9 +571,9 @@ UNIX Fortran compilers.
@emph{Caution}: The default behavior of @command{gfortran} is
incompatible with @command{f2c} and @command{g77}, please use the
-@option{-ff2c} and @option{-fsecond-underscore} options if you want
-object files compiled with @option{gfortran} to be compatible with
-object code created with these tools.
+@option{-ff2c} option if you want object files compiled with
+@option{gfortran} to be compatible with object code created with these
+tools.
Use of @option{-fno-underscoring} is not recommended unless you are
experimenting with issues such as integration of (GNU) Fortran into
diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c
index 8dab5f59afd..34619ab27df 100644
--- a/gcc/fortran/io.c
+++ b/gcc/fortran/io.c
@@ -491,9 +491,13 @@ format_item_1:
case FMT_DOLLAR:
t = format_lex ();
+
+ if (gfc_notify_std (GFC_STD_GNU, "Extension: $ descriptor at %C")
+ == FAILURE)
+ return FAILURE;
if (t != FMT_RPAREN || level > 0)
{
- error = "$ must the last specifier";
+ error = "$ must be the last specifier";
goto syntax;
}
@@ -970,8 +974,9 @@ resolve_tag (const io_tag * tag, gfc_expr * e)
/* Format label can be integer varibale. */
if (tag != &tag_format || e->ts.type != BT_INTEGER)
{
- gfc_error ("%s tag at %L must be of type %s", tag->name, &e->where,
- gfc_basic_typename (tag->type));
+ gfc_error ("%s tag at %L must be of type %s or %s", tag->name,
+ &e->where, gfc_basic_typename (tag->type),
+ gfc_basic_typename (BT_INTEGER));
return FAILURE;
}
}
@@ -2359,6 +2364,7 @@ gfc_match_inquire (void)
gfc_inquire *inquire;
gfc_code *code;
match m;
+ locus loc;
m = gfc_match_char ('(');
if (m == MATCH_NO)
@@ -2366,6 +2372,8 @@ gfc_match_inquire (void)
inquire = gfc_getmem (sizeof (gfc_inquire));
+ loc = gfc_current_locus;
+
m = match_inquire_element (inquire);
if (m == MATCH_ERROR)
goto cleanup;
@@ -2431,6 +2439,20 @@ gfc_match_inquire (void)
if (gfc_match_eos () != MATCH_YES)
goto syntax;
+ if (inquire->unit != NULL && inquire->file != NULL)
+ {
+ gfc_error ("INQUIRE statement at %L cannot contain both FILE and"
+ " UNIT specifiers", &loc);
+ goto cleanup;
+ }
+
+ if (inquire->unit == NULL && inquire->file == NULL)
+ {
+ gfc_error ("INQUIRE statement at %L requires either FILE or"
+ " UNIT specifier", &loc);
+ goto cleanup;
+ }
+
if (gfc_pure (NULL))
{
gfc_error ("INQUIRE statement not allowed in PURE procedure at %C");
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
index d1ca5f02ebd..6798b6d4f14 100644
--- a/gcc/fortran/lang.opt
+++ b/gcc/fortran/lang.opt
@@ -161,4 +161,8 @@ std=gnu
F95
Conform nothing in particular.
+std=legacy
+F95
+Accept extensions to support legacy code.
+
; This comment is to ensure we retain the blank line above.
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index 741e1a30607..0592b1e974b 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -3084,9 +3084,7 @@ match_forall_iterator (gfc_forall_iterator ** result)
}
m = gfc_match_expr (&iter->start);
- if (m == MATCH_NO)
- goto syntax;
- if (m == MATCH_ERROR)
+ if (m != MATCH_YES)
goto cleanup;
if (gfc_match_char (':') != MATCH_YES)
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
index 2603caa67a8..347f7068b96 100644
--- a/gcc/fortran/options.c
+++ b/gcc/fortran/options.c
@@ -77,9 +77,10 @@ gfc_init_options (unsigned int argc ATTRIBUTE_UNUSED,
flag_errno_math = 0;
gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
- | GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F77 | GFC_STD_GNU;
+ | GFC_STD_F2003 | GFC_STD_F95 | GFC_STD_F77 | GFC_STD_GNU
+ | GFC_STD_LEGACY;
gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
- | GFC_STD_F2003;
+ | GFC_STD_F2003 | GFC_STD_LEGACY;
gfc_option.warn_nonstd_intrinsics = 0;
@@ -113,6 +114,9 @@ gfc_post_options (const char **pfilename)
/* If -pedantic, warn about the use of GNU extensions. */
if (pedantic && (gfc_option.allow_std & GFC_STD_GNU) != 0)
gfc_option.warn_std |= GFC_STD_GNU;
+ /* -std=legacy -pedantic is effectively -std=gnu. */
+ if (pedantic && (gfc_option.allow_std & GFC_STD_LEGACY) != 0)
+ gfc_option.warn_std |= GFC_STD_F95_OBS | GFC_STD_F95_DEL | GFC_STD_LEGACY;
/* If the user didn't explicitly specify -f(no)-second-underscore we
use it if we're trying to be compatible with f2c, and not
@@ -333,8 +337,16 @@ gfc_handle_option (size_t scode, const char *arg, int value)
case OPT_std_gnu:
gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
| GFC_STD_F77 | GFC_STD_F95 | GFC_STD_F2003
- | GFC_STD_GNU;
- gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL;
+ | GFC_STD_GNU | GFC_STD_LEGACY;
+ gfc_option.warn_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
+ | GFC_STD_LEGACY;
+ break;
+
+ case OPT_std_legacy:
+ gfc_option.allow_std = GFC_STD_F95_OBS | GFC_STD_F95_DEL
+ | GFC_STD_F77 | GFC_STD_F95 | GFC_STD_F2003
+ | GFC_STD_GNU | GFC_STD_LEGACY;
+ gfc_option.warn_std = 0;
break;
case OPT_Wnonstd_intrinsics:
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c
index 94bf6d0d28d..13b815ad62e 100644
--- a/gcc/fortran/parse.c
+++ b/gcc/fortran/parse.c
@@ -2157,7 +2157,7 @@ gfc_fixup_sibling_symbols (gfc_symbol * sym, gfc_namespace * siblings)
gfc_free_symbol (old_sym);
}
- /* Do the same for any contined procedures. */
+ /* Do the same for any contained procedures. */
gfc_fixup_sibling_symbols (sym, ns->contained);
}
}
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 5f7a76a57a4..f0367acea3d 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -267,9 +267,12 @@ resolve_contained_fntype (gfc_symbol * sym, gfc_namespace * ns)
{
t = gfc_set_default_type (sym, 0, ns);
- if (t == FAILURE)
- gfc_error ("Contained function '%s' at %L has no IMPLICIT type",
- sym->name, &sym->declared_at); /* FIXME */
+ if (t == FAILURE && !sym->attr.untyped)
+ {
+ gfc_error ("Contained function '%s' at %L has no IMPLICIT type",
+ sym->name, &sym->declared_at); /* FIXME */
+ sym->attr.untyped = 1;
+ }
}
}
@@ -439,6 +442,10 @@ resolve_entries (gfc_namespace * ns)
if (ts->kind == gfc_default_logical_kind)
sym = NULL;
break;
+ case BT_UNKNOWN:
+ /* We will issue error elsewhere. */
+ sym = NULL;
+ break;
default:
break;
}
@@ -957,7 +964,7 @@ set_type:
if (ts->type == BT_UNKNOWN)
{
- gfc_error ("Function '%s' at %L has no implicit type",
+ gfc_error ("Function '%s' at %L has no IMPLICIT type",
sym->name, &expr->where);
return FAILURE;
}
@@ -4810,8 +4817,51 @@ resolve_equivalence (gfc_equiv *eq)
}
}
}
-
-
+
+
+/* Resolve function and ENTRY types, issue diagnostics if needed. */
+
+static void
+resolve_fntype (gfc_namespace * ns)
+{
+ gfc_entry_list *el;
+ gfc_symbol *sym;
+
+ if (ns->proc_name == NULL || !ns->proc_name->attr.function)
+ return;
+
+ /* If there are any entries, ns->proc_name is the entry master
+ synthetic symbol and ns->entries->sym actual FUNCTION symbol. */
+ if (ns->entries)
+ sym = ns->entries->sym;
+ else
+ sym = ns->proc_name;
+ if (sym->result == sym
+ && sym->ts.type == BT_UNKNOWN
+ && gfc_set_default_type (sym, 0, NULL) == FAILURE
+ && !sym->attr.untyped)
+ {
+ gfc_error ("Function '%s' at %L has no IMPLICIT type",
+ sym->name, &sym->declared_at);
+ sym->attr.untyped = 1;
+ }
+
+ if (ns->entries)
+ for (el = ns->entries->next; el; el = el->next)
+ {
+ if (el->sym->result == el->sym
+ && el->sym->ts.type == BT_UNKNOWN
+ && gfc_set_default_type (el->sym, 0, NULL) == FAILURE
+ && !el->sym->attr.untyped)
+ {
+ gfc_error ("ENTRY '%s' at %L has no IMPLICIT type",
+ el->sym->name, &el->sym->declared_at);
+ el->sym->attr.untyped = 1;
+ }
+ }
+}
+
+
/* This function is called after a complete program unit has been compiled.
Its purpose is to examine all of the expressions associated with a program
unit, assign types to all intermediate expressions, make sure that all
@@ -4835,6 +4885,8 @@ gfc_resolve (gfc_namespace * ns)
gfc_traverse_ns (ns, resolve_symbol);
+ resolve_fntype (ns);
+
for (n = ns->contained; n; n = n->sibling)
{
if (gfc_pure (ns->proc_name) && !gfc_pure (n->proc_name))
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index fa6c2c6aa7c..6797bcad9fa 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -3659,6 +3659,9 @@ gfc_convert_constant (gfc_expr * e, bt type, int kind)
case BT_COMPLEX:
f = gfc_int2complex;
break;
+ case BT_LOGICAL:
+ f = gfc_int2log;
+ break;
default:
goto oops;
}
@@ -3700,9 +3703,17 @@ gfc_convert_constant (gfc_expr * e, bt type, int kind)
break;
case BT_LOGICAL:
- if (type != BT_LOGICAL)
- goto oops;
- f = gfc_log2log;
+ switch (type)
+ {
+ case BT_INTEGER:
+ f = gfc_log2int;
+ break;
+ case BT_LOGICAL:
+ f = gfc_log2log;
+ break;
+ default:
+ goto oops;
+ }
break;
default:
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 87e37ea6308..2060fa1787d 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -134,22 +134,60 @@ gfc_array_dataptr_type (tree desc)
#define LBOUND_SUBFIELD 1
#define UBOUND_SUBFIELD 2
+/* This provides READ-ONLY access to the data field. The field itself
+ doesn't have the proper type. */
+
tree
-gfc_conv_descriptor_data (tree desc)
+gfc_conv_descriptor_data_get (tree desc)
{
- tree field;
- tree type;
+ tree field, type, t;
type = TREE_TYPE (desc);
gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
field = TYPE_FIELDS (type);
gcc_assert (DATA_FIELD == 0);
- gcc_assert (field != NULL_TREE
- && TREE_CODE (TREE_TYPE (field)) == POINTER_TYPE
- && TREE_CODE (TREE_TYPE (TREE_TYPE (field))) == ARRAY_TYPE);
- return build3 (COMPONENT_REF, TREE_TYPE (field), desc, field, NULL_TREE);
+ t = build3 (COMPONENT_REF, TREE_TYPE (field), desc, field, NULL_TREE);
+ t = fold_convert (GFC_TYPE_ARRAY_DATAPTR_TYPE (type), t);
+
+ return t;
+}
+
+/* This provides WRITE access to the data field. */
+
+void
+gfc_conv_descriptor_data_set (stmtblock_t *block, tree desc, tree value)
+{
+ tree field, type, t;
+
+ type = TREE_TYPE (desc);
+ gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
+
+ field = TYPE_FIELDS (type);
+ gcc_assert (DATA_FIELD == 0);
+
+ t = build3 (COMPONENT_REF, TREE_TYPE (field), desc, field, NULL_TREE);
+ gfc_add_modify_expr (block, t, fold_convert (TREE_TYPE (field), value));
+}
+
+
+/* This provides address access to the data field. This should only be
+ used by array allocation, passing this on to the runtime. */
+
+tree
+gfc_conv_descriptor_data_addr (tree desc)
+{
+ tree field, type, t;
+
+ type = TREE_TYPE (desc);
+ gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
+
+ field = TYPE_FIELDS (type);
+ gcc_assert (DATA_FIELD == 0);
+
+ t = build3 (COMPONENT_REF, TREE_TYPE (field), desc, field, NULL_TREE);
+ return gfc_build_addr_expr (NULL, t);
}
tree
@@ -407,18 +445,14 @@ gfc_trans_allocate_array_storage (gfc_loopinfo * loop, gfc_ss_info * info,
tree tmp;
tree args;
tree desc;
- tree data;
bool onstack;
desc = info->descriptor;
- data = gfc_conv_descriptor_data (desc);
+ info->offset = gfc_index_zero_node;
if (size == NULL_TREE)
{
/* A callee allocated array. */
- gfc_add_modify_expr (&loop->pre, data, convert (TREE_TYPE (data),
- gfc_index_zero_node));
- info->data = data;
- info->offset = gfc_index_zero_node;
+ gfc_conv_descriptor_data_set (&loop->pre, desc, null_pointer_node);
onstack = FALSE;
}
else
@@ -436,11 +470,8 @@ gfc_trans_allocate_array_storage (gfc_loopinfo * loop, gfc_ss_info * info,
tmp = build_array_type (gfc_get_element_type (TREE_TYPE (desc)),
tmp);
tmp = gfc_create_var (tmp, "A");
- tmp = gfc_build_addr_expr (TREE_TYPE (data), tmp);
- gfc_add_modify_expr (&loop->pre, data, tmp);
- info->data = data;
- info->offset = gfc_index_zero_node;
-
+ tmp = gfc_build_addr_expr (NULL, tmp);
+ gfc_conv_descriptor_data_set (&loop->pre, desc, tmp);
}
else
{
@@ -454,13 +485,11 @@ gfc_trans_allocate_array_storage (gfc_loopinfo * loop, gfc_ss_info * info,
else
gcc_unreachable ();
tmp = gfc_build_function_call (tmp, args);
- tmp = convert (TREE_TYPE (data), tmp);
- gfc_add_modify_expr (&loop->pre, data, tmp);
-
- info->data = data;
- info->offset = gfc_index_zero_node;
+ tmp = gfc_evaluate_now (tmp, &loop->pre);
+ gfc_conv_descriptor_data_set (&loop->pre, desc, tmp);
}
}
+ info->data = gfc_conv_descriptor_data_get (desc);
/* The offset is zero because we create temporaries with a zero
lower bound. */
@@ -470,7 +499,8 @@ gfc_trans_allocate_array_storage (gfc_loopinfo * loop, gfc_ss_info * info,
if (!onstack)
{
/* Free the temporary. */
- tmp = convert (pvoid_type_node, info->data);
+ tmp = gfc_conv_descriptor_data_get (desc);
+ tmp = fold_convert (pvoid_type_node, tmp);
tmp = gfc_chainon_list (NULL_TREE, tmp);
tmp = gfc_build_function_call (gfor_fndecl_internal_free, tmp);
gfc_add_expr_to_block (&loop->post, tmp);
@@ -721,7 +751,6 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type,
{
tree tmp;
stmtblock_t body;
- tree loopbody;
gfc_se se;
for (; c; c = c->next)
@@ -842,13 +871,23 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type,
}
}
- /* The frontend should already have done any expansions. */
- if (c->iterator)
+ /* The frontend should already have done any expansions possible
+ at compile-time. */
+ if (!c->iterator)
{
+ /* Pass the code as is. */
+ tmp = gfc_finish_block (&body);
+ gfc_add_expr_to_block (pblock, tmp);
+ }
+ else
+ {
+ /* Build the implied do-loop. */
+ tree cond;
tree end;
tree step;
tree loopvar;
tree exit_label;
+ tree loopbody;
loopbody = gfc_finish_block (&body);
@@ -877,17 +916,25 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type,
exit_label = gfc_build_label_decl (NULL_TREE);
gfc_start_block (&body);
- /* Generate the exit condition. */
- end = build2 (GT_EXPR, boolean_type_node, loopvar, end);
+ /* Generate the exit condition. Depending on the sign of
+ the step variable we have to generate the correct
+ comparison. */
+ tmp = fold_build2 (GT_EXPR, boolean_type_node, step,
+ build_int_cst (TREE_TYPE (step), 0));
+ cond = fold_build3 (COND_EXPR, boolean_type_node, tmp,
+ build2 (GT_EXPR, boolean_type_node,
+ loopvar, end),
+ build2 (LT_EXPR, boolean_type_node,
+ loopvar, end));
tmp = build1_v (GOTO_EXPR, exit_label);
TREE_USED (exit_label) = 1;
- tmp = build3_v (COND_EXPR, end, tmp, build_empty_stmt ());
+ tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
gfc_add_expr_to_block (&body, tmp);
/* The main loop body. */
gfc_add_expr_to_block (&body, loopbody);
- /* Increment the loop variable. */
+ /* Increase loop variable by step. */
tmp = build2 (PLUS_EXPR, TREE_TYPE (loopvar), loopvar, step);
gfc_add_modify_expr (&body, loopvar, tmp);
@@ -900,12 +947,6 @@ gfc_trans_array_constructor_value (stmtblock_t * pblock, tree type,
tmp = build1_v (LABEL_EXPR, exit_label);
gfc_add_expr_to_block (pblock, tmp);
}
- else
- {
- /* Pass the code as is. */
- tmp = gfc_finish_block (&body);
- gfc_add_expr_to_block (pblock, tmp);
- }
}
}
@@ -1297,7 +1338,7 @@ gfc_conv_array_data (tree descriptor)
}
}
else
- return gfc_conv_descriptor_data (descriptor);
+ return gfc_conv_descriptor_data_get (descriptor);
}
@@ -2342,7 +2383,7 @@ gfc_conv_resolve_dependencies (gfc_loopinfo * loop, gfc_ss * dest,
loop->temp_ss->type = GFC_SS_TEMP;
loop->temp_ss->data.temp.type =
gfc_get_element_type (TREE_TYPE (dest->data.info.descriptor));
- loop->temp_ss->string_length = NULL_TREE;
+ loop->temp_ss->string_length = dest->string_length;
loop->temp_ss->data.temp.dimen = loop->dimen;
loop->temp_ss->next = gfc_ss_terminator;
gfc_add_ss_to_loop (loop, loop->temp_ss);
@@ -2738,9 +2779,8 @@ gfc_array_allocate (gfc_se * se, gfc_ref * ref, tree pstat)
lower, upper, &se->pre);
/* Allocate memory to store the data. */
- tmp = gfc_conv_descriptor_data (se->expr);
- pointer = gfc_build_addr_expr (NULL, tmp);
- pointer = gfc_evaluate_now (pointer, &se->pre);
+ tmp = gfc_conv_descriptor_data_addr (se->expr);
+ pointer = gfc_evaluate_now (tmp, &se->pre);
if (TYPE_PRECISION (gfc_array_index_type) == 32)
allocate = gfor_fndecl_allocate;
@@ -2755,8 +2795,6 @@ gfc_array_allocate (gfc_se * se, gfc_ref * ref, tree pstat)
tmp = gfc_build_function_call (allocate, tmp);
gfc_add_expr_to_block (&se->pre, tmp);
- pointer = gfc_conv_descriptor_data (se->expr);
-
tmp = gfc_conv_descriptor_offset (se->expr);
gfc_add_modify_expr (&se->pre, tmp, offset);
}
@@ -2767,7 +2805,7 @@ gfc_array_allocate (gfc_se * se, gfc_ref * ref, tree pstat)
/*GCC ARRAYS*/
tree
-gfc_array_deallocate (tree descriptor)
+gfc_array_deallocate (tree descriptor, tree pstat)
{
tree var;
tree tmp;
@@ -2775,14 +2813,12 @@ gfc_array_deallocate (tree descriptor)
gfc_start_block (&block);
/* Get a pointer to the data. */
- tmp = gfc_conv_descriptor_data (descriptor);
- tmp = gfc_build_addr_expr (NULL, tmp);
- var = gfc_create_var (TREE_TYPE (tmp), "ptr");
- gfc_add_modify_expr (&block, var, tmp);
+ tmp = gfc_conv_descriptor_data_addr (descriptor);
+ var = gfc_evaluate_now (tmp, &block);
/* Parameter is the address of the data component. */
tmp = gfc_chainon_list (NULL_TREE, var);
- tmp = gfc_chainon_list (tmp, integer_zero_node);
+ tmp = gfc_chainon_list (tmp, pstat);
tmp = gfc_build_function_call (gfor_fndecl_deallocate, tmp);
gfc_add_expr_to_block (&block, tmp);
@@ -3242,7 +3278,7 @@ gfc_trans_dummy_array_bias (gfc_symbol * sym, tree tmpdesc, tree body)
/* This is for the case where the array data is used directly without
calling the repack function. */
if (no_repack || partial != NULL_TREE)
- stmt_packed = gfc_conv_descriptor_data (dumdesc);
+ stmt_packed = gfc_conv_descriptor_data_get (dumdesc);
else
stmt_packed = NULL_TREE;
@@ -3409,7 +3445,7 @@ gfc_trans_dummy_array_bias (gfc_symbol * sym, tree tmpdesc, tree body)
/* Only do the cleanup if the array was repacked. */
tmp = gfc_build_indirect_ref (dumdesc);
- tmp = gfc_conv_descriptor_data (tmp);
+ tmp = gfc_conv_descriptor_data_get (tmp);
tmp = build2 (NE_EXPR, boolean_type_node, tmp, tmpdesc);
stmt = build3_v (COND_EXPR, tmp, stmt, build_empty_stmt ());
@@ -3616,11 +3652,23 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
loop.temp_ss = gfc_get_ss ();
loop.temp_ss->type = GFC_SS_TEMP;
loop.temp_ss->next = gfc_ss_terminator;
- loop.temp_ss->data.temp.type = gfc_typenode_for_spec (&expr->ts);
+ if (expr->ts.type == BT_CHARACTER)
+ {
+ gcc_assert (expr->ts.cl && expr->ts.cl->length
+ && expr->ts.cl->length->expr_type == EXPR_CONSTANT);
+ loop.temp_ss->string_length = gfc_conv_mpz_to_tree
+ (expr->ts.cl->length->value.integer,
+ expr->ts.cl->length->ts.kind);
+ expr->ts.cl->backend_decl = loop.temp_ss->string_length;
+ }
+ loop.temp_ss->data.temp.type = gfc_typenode_for_spec (&expr->ts);
+
/* ... which can hold our string, if present. */
if (expr->ts.type == BT_CHARACTER)
- se->string_length = loop.temp_ss->string_length
- = TYPE_SIZE_UNIT (loop.temp_ss->data.temp.type);
+ {
+ loop.temp_ss->string_length = TYPE_SIZE_UNIT (loop.temp_ss->data.temp.type);
+ se->string_length = loop.temp_ss->string_length;
+ }
else
loop.temp_ss->string_length = NULL;
loop.temp_ss->data.temp.dimen = loop.dimen;
@@ -3652,7 +3700,13 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
rse.ss = ss;
gfc_conv_scalarized_array_ref (&lse, NULL);
- gfc_conv_expr_val (&rse, expr);
+ if (expr->ts.type == BT_CHARACTER)
+ {
+ gfc_conv_expr (&rse, expr);
+ rse.expr = gfc_build_indirect_ref (rse.expr);
+ }
+ else
+ gfc_conv_expr_val (&rse, expr);
gfc_add_block_to_block (&block, &rse.pre);
gfc_add_block_to_block (&block, &lse.pre);
@@ -3814,10 +3868,7 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss)
tmp = gfc_build_indirect_ref (tmp);
tmp = gfc_build_array_ref (tmp, offset);
offset = gfc_build_addr_expr (gfc_array_dataptr_type (desc), tmp);
-
- tmp = gfc_conv_descriptor_data (parm);
- gfc_add_modify_expr (&loop.pre, tmp,
- fold_convert (TREE_TYPE (tmp), offset));
+ gfc_conv_descriptor_data_set (&loop.pre, parm, offset);
if (se->direct_byref)
{
@@ -3984,9 +4035,7 @@ gfc_trans_deferred_array (gfc_symbol * sym, tree body)
gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
/* NULLIFY the data pointer. */
- tmp = gfc_conv_descriptor_data (descriptor);
- gfc_add_modify_expr (&fnblock, tmp,
- convert (TREE_TYPE (tmp), integer_zero_node));
+ gfc_conv_descriptor_data_set (&fnblock, descriptor, null_pointer_node);
gfc_add_expr_to_block (&fnblock, body);
@@ -3997,10 +4046,11 @@ gfc_trans_deferred_array (gfc_symbol * sym, tree body)
gfc_start_block (&block);
/* Deallocate if still allocated at the end of the procedure. */
- deallocate = gfc_array_deallocate (descriptor);
+ deallocate = gfc_array_deallocate (descriptor, null_pointer_node);
- tmp = gfc_conv_descriptor_data (descriptor);
- tmp = build2 (NE_EXPR, boolean_type_node, tmp, integer_zero_node);
+ tmp = gfc_conv_descriptor_data_get (descriptor);
+ tmp = build2 (NE_EXPR, boolean_type_node, tmp,
+ build_int_cst (TREE_TYPE (tmp), 0));
tmp = build3_v (COND_EXPR, tmp, deallocate, build_empty_stmt ());
gfc_add_expr_to_block (&block, tmp);
@@ -4349,7 +4399,7 @@ gfc_walk_array_constructor (gfc_ss * ss, gfc_expr * expr)
/* Walk an expression. Add walked expressions to the head of the SS chain.
- A wholy scalar expression will not be added. */
+ A wholly scalar expression will not be added. */
static gfc_ss *
gfc_walk_subexpr (gfc_ss * ss, gfc_expr * expr)
diff --git a/gcc/fortran/trans-array.h b/gcc/fortran/trans-array.h
index faaaf5ade4b..377411c4e95 100644
--- a/gcc/fortran/trans-array.h
+++ b/gcc/fortran/trans-array.h
@@ -20,7 +20,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
/* Generate code to free an array. */
-tree gfc_array_deallocate (tree);
+tree gfc_array_deallocate (tree, tree);
/* Generate code to initialize an allocate an array. Statements are added to
se, which should contain an expression for the array descriptor. */
@@ -96,7 +96,9 @@ tree gfc_conv_array_lbound (tree, int);
tree gfc_conv_array_ubound (tree, int);
/* Build expressions for accessing components of an array descriptor. */
-tree gfc_conv_descriptor_data (tree);
+tree gfc_conv_descriptor_data_get (tree);
+void gfc_conv_descriptor_data_set (stmtblock_t *, tree, tree);
+tree gfc_conv_descriptor_data_addr (tree);
tree gfc_conv_descriptor_offset (tree);
tree gfc_conv_descriptor_dtype (tree);
tree gfc_conv_descriptor_stride (tree, tree);
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 3d89effb7c2..5aca960d883 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -32,7 +32,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "tm.h"
#include "target.h"
#include "function.h"
-#include "errors.h"
#include "flags.h"
#include "cgraph.h"
#include "gfortran.h"
@@ -537,7 +536,7 @@ gfc_build_qualified_array (tree decl, gfc_symbol * sym)
{
if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE)
GFC_TYPE_ARRAY_LBOUND (type, dim) = create_index_var ("lbound", nest);
- /* Don't try to use the unkown bound for assumed shape arrays. */
+ /* Don't try to use the unknown bound for assumed shape arrays. */
if (GFC_TYPE_ARRAY_UBOUND (type, dim) == NULL_TREE
&& (sym->as->type != AS_ASSUMED_SIZE
|| dim < GFC_TYPE_ARRAY_RANK (type) - 1))
@@ -1874,6 +1873,7 @@ gfc_build_builtin_function_decls (void)
tree gfc_int4_type_node = gfc_get_int_type (4);
tree gfc_int8_type_node = gfc_get_int_type (8);
tree gfc_logical4_type_node = gfc_get_logical_type (4);
+ tree gfc_pint4_type_node = build_pointer_type (gfc_int4_type_node);
gfor_fndecl_internal_malloc =
gfc_build_library_function_decl (get_identifier (PREFIX("internal_malloc")),
@@ -1900,7 +1900,8 @@ gfc_build_builtin_function_decls (void)
gfor_fndecl_deallocate =
gfc_build_library_function_decl (get_identifier (PREFIX("deallocate")),
- void_type_node, 1, ppvoid_type_node);
+ void_type_node, 2, ppvoid_type_node,
+ gfc_pint4_type_node);
gfor_fndecl_stop_numeric =
gfc_build_library_function_decl (get_identifier (PREFIX("stop_numeric")),
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 52a532d2408..3a4d52a674d 100644
--- a/gcc/fortran/trans-expr.c
+++ b/gcc/fortran/trans-expr.c
@@ -281,7 +281,7 @@ gfc_conv_component_ref (gfc_se * se, gfc_ref * ref)
se->string_length = tmp;
}
- if (c->pointer && c->dimension == 0)
+ if (c->pointer && c->dimension == 0 && c->ts.type != BT_CHARACTER)
se->expr = gfc_build_indirect_ref (se->expr);
}
@@ -356,27 +356,41 @@ gfc_conv_variable (gfc_se * se, gfc_expr * expr)
return;
}
- /* Dereference scalar dummy variables. */
- if (sym->attr.dummy
- && sym->ts.type != BT_CHARACTER
- && !sym->attr.dimension)
- se->expr = gfc_build_indirect_ref (se->expr);
-
- /* Dereference scalar hidden result. */
- if (gfc_option.flag_f2c
- && (sym->attr.function || sym->attr.result)
- && sym->ts.type == BT_COMPLEX
- && !sym->attr.dimension)
- se->expr = gfc_build_indirect_ref (se->expr);
-
- /* Dereference pointer variables. */
- if ((sym->attr.pointer || sym->attr.allocatable)
- && (sym->attr.dummy
- || sym->attr.result
- || sym->attr.function
- || !sym->attr.dimension)
- && sym->ts.type != BT_CHARACTER)
- se->expr = gfc_build_indirect_ref (se->expr);
+
+ /* Dereference the expression, where needed. Since characters
+ are entirely different from other types, they are treated
+ separately. */
+ if (sym->ts.type == BT_CHARACTER)
+ {
+ /* Dereference character pointer dummy arguments
+ or results. */
+ if ((sym->attr.pointer || sym->attr.allocatable)
+ && (sym->attr.dummy
+ || sym->attr.function
+ || sym->attr.result))
+ se->expr = gfc_build_indirect_ref (se->expr);
+ }
+ else
+ {
+ /* Dereference non-character scalar dummy arguments. */
+ if (sym->attr.dummy && !sym->attr.dimension)
+ se->expr = gfc_build_indirect_ref (se->expr);
+
+ /* Dereference scalar hidden result. */
+ if (gfc_option.flag_f2c && sym->ts.type == BT_COMPLEX
+ && (sym->attr.function || sym->attr.result)
+ && !sym->attr.dimension && !sym->attr.pointer)
+ se->expr = gfc_build_indirect_ref (se->expr);
+
+ /* Dereference non-character pointer variables.
+ These must be dummies, results, or scalars. */
+ if ((sym->attr.pointer || sym->attr.allocatable)
+ && (sym->attr.dummy
+ || sym->attr.function
+ || sym->attr.result
+ || !sym->attr.dimension))
+ se->expr = gfc_build_indirect_ref (se->expr);
+ }
ref = expr->ref;
}
@@ -1059,9 +1073,10 @@ gfc_conv_function_val (gfc_se * se, gfc_symbol * sym)
/* Generate code for a procedure call. Note can return se->post != NULL.
- If se->direct_byref is set then se->expr contains the return parameter. */
+ If se->direct_byref is set then se->expr contains the return parameter.
+ Return non-zero, if the call has alternate specifiers. */
-void
+int
gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
gfc_actual_arglist * arg)
{
@@ -1077,12 +1092,22 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
tree len;
tree stringargs;
gfc_formal_arglist *formal;
+ int has_alternate_specifier = 0;
arglist = NULL_TREE;
stringargs = NULL_TREE;
var = NULL_TREE;
len = NULL_TREE;
+ /* Obtain the string length now because it is needed often below. */
+ if (sym->ts.type == BT_CHARACTER)
+ {
+ gcc_assert (sym->ts.cl && sym->ts.cl->length
+ && sym->ts.cl->length->expr_type == EXPR_CONSTANT);
+ len = gfc_conv_mpz_to_tree
+ (sym->ts.cl->length->value.integer, sym->ts.cl->length->ts.kind);
+ }
+
if (se->ss != NULL)
{
if (!sym->attr.elemental)
@@ -1097,7 +1122,10 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
/* Access the previously obtained result. */
gfc_conv_tmp_array_ref (se);
gfc_advance_se_ss_chain (se);
- return;
+
+ /* Bundle in the string length. */
+ se->string_length = len;
+ return 0;
}
}
info = &se->ss->data.info;
@@ -1108,14 +1136,26 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
byref = gfc_return_by_reference (sym);
if (byref)
{
- if (se->direct_byref)
- arglist = gfc_chainon_list (arglist, se->expr);
+ if (se->direct_byref)
+ {
+ arglist = gfc_chainon_list (arglist, se->expr);
+
+ /* Add string length to argument list. */
+ if (sym->ts.type == BT_CHARACTER)
+ {
+ sym->ts.cl->backend_decl = len;
+ arglist = gfc_chainon_list (arglist,
+ convert (gfc_charlen_type_node, len));
+ }
+ }
else if (sym->result->attr.dimension)
{
gcc_assert (se->loop && se->ss);
+
/* Set the type of the array. */
tmp = gfc_typenode_for_spec (&sym->ts);
info->dimen = se->loop->dimen;
+
/* Allocate a temporary to store the result. */
gfc_trans_allocate_temp_array (se->loop, info, tmp);
@@ -1124,22 +1164,46 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
gfc_conv_descriptor_stride (info->descriptor, gfc_rank_cst[0]);
gfc_add_modify_expr (&se->pre, tmp,
convert (TREE_TYPE (tmp), integer_zero_node));
+
/* Pass the temporary as the first argument. */
tmp = info->descriptor;
tmp = gfc_build_addr_expr (NULL, tmp);
arglist = gfc_chainon_list (arglist, tmp);
+
+ /* Add string length to argument list. */
+ if (sym->ts.type == BT_CHARACTER)
+ {
+ sym->ts.cl->backend_decl = len;
+ arglist = gfc_chainon_list (arglist,
+ convert (gfc_charlen_type_node, len));
+ }
+
}
else if (sym->ts.type == BT_CHARACTER)
{
- gcc_assert (sym->ts.cl && sym->ts.cl->length
- && sym->ts.cl->length->expr_type == EXPR_CONSTANT);
- len = gfc_conv_mpz_to_tree
- (sym->ts.cl->length->value.integer, sym->ts.cl->length->ts.kind);
+
+ /* Pass the string length. */
sym->ts.cl->backend_decl = len;
type = gfc_get_character_type (sym->ts.kind, sym->ts.cl);
type = build_pointer_type (type);
- var = gfc_conv_string_tmp (se, type, len);
+ /* Return an address to a char[0:len-1]* temporary for character pointers. */
+ if (sym->attr.pointer || sym->attr.allocatable)
+ {
+ /* Build char[0:len-1] * pstr. */
+ tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node, len,
+ build_int_cst (gfc_charlen_type_node, 1));
+ tmp = build_range_type (gfc_array_index_type, gfc_index_zero_node, tmp);
+ tmp = build_array_type (gfc_character1_type_node, tmp);
+ var = gfc_create_var (build_pointer_type (tmp), "pstr");
+
+ /* Provide an address expression for the function arguments. */
+ var = gfc_build_addr_expr (NULL, var);
+ }
+ else
+ {
+ var = gfc_conv_string_tmp (se, type, len);
+ }
arglist = gfc_chainon_list (arglist, var);
arglist = gfc_chainon_list (arglist,
convert (gfc_charlen_type_node, len));
@@ -1205,8 +1269,8 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
&& arg->expr->expr_type != EXPR_NULL)
{
/* Scalar pointer dummy args require an extra level of
- indirection. The null pointer already contains
- this level of indirection. */
+ indirection. The null pointer already contains
+ this level of indirection. */
parmse.expr = gfc_build_addr_expr (NULL, parmse.expr);
}
}
@@ -1245,17 +1309,22 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
/* Generate the actual call. */
gfc_conv_function_val (se, sym);
/* If there are alternate return labels, function type should be
- integer. */
- if (has_alternate_specifier)
- TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) = integer_type_node;
+ integer. Can't modify the type in place though, since it can be shared
+ with other functions. */
+ if (has_alternate_specifier
+ && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
+ {
+ gcc_assert (! sym->attr.dummy);
+ TREE_TYPE (sym->backend_decl)
+ = build_function_type (integer_type_node,
+ TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
+ se->expr = gfc_build_addr_expr (NULL, sym->backend_decl);
+ }
fntype = TREE_TYPE (TREE_TYPE (se->expr));
se->expr = build3 (CALL_EXPR, TREE_TYPE (fntype), se->expr,
arglist, NULL_TREE);
- if (sym->result)
- sym = sym->result;
-
/* If we have a pointer function, but we don't want a pointer, e.g.
something like
x = f()
@@ -1294,15 +1363,22 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
{
/* Check the data pointer hasn't been modified. This would
happen in a function returning a pointer. */
- tmp = gfc_conv_descriptor_data (info->descriptor);
+ tmp = gfc_conv_descriptor_data_get (info->descriptor);
tmp = build2 (NE_EXPR, boolean_type_node, tmp, info->data);
gfc_trans_runtime_check (tmp, gfc_strconst_fault, &se->pre);
}
se->expr = info->descriptor;
+ /* Bundle in the string length. */
+ se->string_length = len;
}
else if (sym->ts.type == BT_CHARACTER)
{
- se->expr = var;
+ /* Dereference for character pointer results. */
+ if (sym->attr.pointer || sym->attr.allocatable)
+ se->expr = gfc_build_indirect_ref (var);
+ else
+ se->expr = var;
+
se->string_length = len;
}
else
@@ -1312,6 +1388,8 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym,
}
}
}
+
+ return has_alternate_specifier;
}
@@ -1603,6 +1681,9 @@ gfc_trans_subarray_assign (tree dest, gfc_component * cm, gfc_expr * expr)
gfc_start_scalarized_body (&loop, &body);
gfc_conv_tmp_array_ref (&lse);
+ if (cm->ts.type == BT_CHARACTER)
+ lse.string_length = cm->ts.cl->backend_decl;
+
gfc_conv_expr (&rse, expr);
tmp = gfc_trans_scalar_assign (&lse, &rse, cm->ts.type);
@@ -1645,12 +1726,7 @@ gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr)
{
/* Array pointer. */
if (expr->expr_type == EXPR_NULL)
- {
- dest = gfc_conv_descriptor_data (dest);
- tmp = fold_convert (TREE_TYPE (se.expr),
- null_pointer_node);
- gfc_add_modify_expr (&block, dest, tmp);
- }
+ gfc_conv_descriptor_data_set (&block, dest, null_pointer_node);
else
{
rss = gfc_walk_expr (expr);
@@ -1996,11 +2072,7 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2)
gfc_conv_expr_descriptor (&lse, expr1, lss);
/* Implement Nullify. */
if (expr2->expr_type == EXPR_NULL)
- {
- lse.expr = gfc_conv_descriptor_data (lse.expr);
- rse.expr = fold_convert (TREE_TYPE (lse.expr), null_pointer_node);
- gfc_add_modify_expr (&block, lse.expr, rse.expr);
- }
+ gfc_conv_descriptor_data_set (&block, lse.expr, null_pointer_node);
else
{
lse.direct_byref = 1;
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
index 97f00dc441a..ab498efce24 100644
--- a/gcc/fortran/trans-intrinsic.c
+++ b/gcc/fortran/trans-intrinsic.c
@@ -158,7 +158,7 @@ gfc_conv_intrinsic_function_args (gfc_se * se, gfc_expr * expr)
args = NULL_TREE;
for (actual = expr->value.function.actual; actual; actual = actual->next)
{
- /* Skip ommitted optional arguments. */
+ /* Skip omitted optional arguments. */
if (!actual->expr)
continue;
@@ -2189,7 +2189,7 @@ gfc_conv_allocated (gfc_se *se, gfc_expr *expr)
arg1se.descriptor_only = 1;
gfc_conv_expr_descriptor (&arg1se, arg1->expr, ss1);
- tmp = gfc_conv_descriptor_data (arg1se.expr);
+ tmp = gfc_conv_descriptor_data_get (arg1se.expr);
tmp = build2 (NE_EXPR, boolean_type_node, tmp,
fold_convert (TREE_TYPE (tmp), null_pointer_node));
se->expr = convert (gfc_typenode_for_spec (&expr->ts), tmp);
@@ -2235,7 +2235,7 @@ gfc_conv_associated (gfc_se *se, gfc_expr *expr)
/* A pointer to an array. */
arg1se.descriptor_only = 1;
gfc_conv_expr_lhs (&arg1se, arg1->expr);
- tmp2 = gfc_conv_descriptor_data (arg1se.expr);
+ tmp2 = gfc_conv_descriptor_data_get (arg1se.expr);
}
tmp = build2 (NE_EXPR, boolean_type_node, tmp2,
fold_convert (TREE_TYPE (tmp2), null_pointer_node));
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index d3e86dd9d9d..6670f543609 100644
--- a/gcc/fortran/trans-stmt.c
+++ b/gcc/fortran/trans-stmt.c
@@ -37,8 +37,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "trans-const.h"
#include "arith.h"
-int has_alternate_specifier;
-
typedef struct iter_info
{
tree var;
@@ -206,6 +204,7 @@ tree
gfc_trans_call (gfc_code * code)
{
gfc_se se;
+ int has_alternate_specifier;
/* A CALL starts a new block because the actual arguments may have to
be evaluated first. */
@@ -213,10 +212,10 @@ gfc_trans_call (gfc_code * code)
gfc_start_block (&se.pre);
gcc_assert (code->resolved_sym);
- has_alternate_specifier = 0;
/* Translate the call. */
- gfc_conv_function_call (&se, code->resolved_sym, code->ext.actual);
+ has_alternate_specifier
+ = gfc_conv_function_call (&se, code->resolved_sym, code->ext.actual);
/* A subroutine without side-effect, by definition, does nothing! */
TREE_SIDE_EFFECTS (se.expr) = 1;
@@ -1365,8 +1364,9 @@ gfc_trans_forall_loop (forall_info *forall_tmp, int nvar, tree body, int mask_fl
tmp = build2 (PLUS_EXPR, TREE_TYPE (var), var, step);
gfc_add_modify_expr (&block, var, tmp);
- /* Advance to the next mask element. */
- if (mask_flag)
+ /* Advance to the next mask element. Only do this for the
+ innermost loop. */
+ if (n == 0 && mask_flag)
{
mask = forall_tmp->mask;
maskindex = forall_tmp->maskindex;
@@ -2965,7 +2965,7 @@ gfc_trans_where_assign (gfc_expr *expr1, gfc_expr *expr2, tree mask,
/* Translate the WHERE construct or statement.
- This fuction can be called iteratively to translate the nested WHERE
+ This function can be called iteratively to translate the nested WHERE
construct or statement.
MASK is the control mask, and PMASK is the pending control mask.
TEMP records the temporary address which must be freed later. */
@@ -3288,19 +3288,56 @@ gfc_trans_allocate (gfc_code * code)
}
+/* Translate a DEALLOCATE statement.
+ There are two cases within the for loop:
+ (1) deallocate(a1, a2, a3) is translated into the following sequence
+ _gfortran_deallocate(a1, 0B)
+ _gfortran_deallocate(a2, 0B)
+ _gfortran_deallocate(a3, 0B)
+ where the STAT= variable is passed a NULL pointer.
+ (2) deallocate(a1, a2, a3, stat=i) is translated into the following
+ astat = 0
+ _gfortran_deallocate(a1, &stat)
+ astat = astat + stat
+ _gfortran_deallocate(a2, &stat)
+ astat = astat + stat
+ _gfortran_deallocate(a3, &stat)
+ astat = astat + stat
+ In case (1), we simply return at the end of the for loop. In case (2)
+ we set STAT= astat. */
tree
gfc_trans_deallocate (gfc_code * code)
{
gfc_se se;
gfc_alloc *al;
gfc_expr *expr;
- tree var;
- tree tmp;
- tree type;
+ tree apstat, astat, parm, pstat, stat, tmp, type, var;
stmtblock_t block;
gfc_start_block (&block);
+ /* Set up the optional STAT= */
+ if (code->expr)
+ {
+ tree gfc_int4_type_node = gfc_get_int_type (4);
+
+ /* Variable used with the library call. */
+ stat = gfc_create_var (gfc_int4_type_node, "stat");
+ pstat = gfc_build_addr_expr (NULL, stat);
+
+ /* Running total of possible deallocation failures. */
+ astat = gfc_create_var (gfc_int4_type_node, "astat");
+ apstat = gfc_build_addr_expr (NULL, astat);
+
+ /* Initialize astat to 0. */
+ gfc_add_modify_expr (&block, astat, build_int_cst (TREE_TYPE (astat), 0));
+ }
+ else
+ {
+ pstat = apstat = null_pointer_node;
+ stat = astat = NULL_TREE;
+ }
+
for (al = code->ext.alloc_list; al != NULL; al = al->next)
{
expr = al->expr;
@@ -3314,10 +3351,7 @@ gfc_trans_deallocate (gfc_code * code)
gfc_conv_expr (&se, expr);
if (expr->symtree->n.sym->attr.dimension)
- {
- tmp = gfc_array_deallocate (se.expr);
- gfc_add_expr_to_block (&se.pre, tmp);
- }
+ tmp = gfc_array_deallocate (se.expr, pstat);
else
{
type = build_pointer_type (TREE_TYPE (se.expr));
@@ -3325,13 +3359,33 @@ gfc_trans_deallocate (gfc_code * code)
tmp = gfc_build_addr_expr (type, se.expr);
gfc_add_modify_expr (&se.pre, var, tmp);
- tmp = gfc_chainon_list (NULL_TREE, var);
- tmp = gfc_chainon_list (tmp, integer_zero_node);
- tmp = gfc_build_function_call (gfor_fndecl_deallocate, tmp);
- gfc_add_expr_to_block (&se.pre, tmp);
+ parm = gfc_chainon_list (NULL_TREE, var);
+ parm = gfc_chainon_list (parm, pstat);
+ tmp = gfc_build_function_call (gfor_fndecl_deallocate, parm);
+ }
+
+ gfc_add_expr_to_block (&se.pre, tmp);
+
+ /* Keep track of the number of failed deallocations by adding stat
+ of the last deallocation to the running total. */
+ if (code->expr)
+ {
+ apstat = build2 (PLUS_EXPR, TREE_TYPE (stat), astat, stat);
+ gfc_add_modify_expr (&se.pre, astat, apstat);
}
+
tmp = gfc_finish_block (&se.pre);
gfc_add_expr_to_block (&block, tmp);
+
+ }
+
+ /* Assign the value to the status variable. */
+ if (code->expr)
+ {
+ gfc_init_se (&se, NULL);
+ gfc_conv_expr_lhs (&se, code->expr);
+ tmp = convert (TREE_TYPE (se.expr), astat);
+ gfc_add_modify_expr (&block, se.expr, tmp);
}
return gfc_finish_block (&block);
diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c
index a70784cbf3c..f0e54536b54 100644
--- a/gcc/fortran/trans-types.c
+++ b/gcc/fortran/trans-types.c
@@ -59,6 +59,7 @@ tree gfc_charlen_type_node;
static GTY(()) tree gfc_desc_dim_type;
static GTY(()) tree gfc_max_array_element_size;
+static GTY(()) tree gfc_array_descriptor_base[GFC_MAX_DIMENSIONS];
/* Arrays for all integral and real kinds. We'll fill this in at runtime
after the target has a chance to process command-line options. */
@@ -688,7 +689,7 @@ gfc_get_element_type (tree type)
else
{
gcc_assert (GFC_DESCRIPTOR_TYPE_P (type));
- element = TREE_TYPE (TYPE_FIELDS (type));
+ element = GFC_TYPE_ARRAY_DATAPTR_TYPE (type);
gcc_assert (TREE_CODE (element) == POINTER_TYPE);
element = TREE_TYPE (element);
@@ -1095,6 +1096,61 @@ gfc_get_nodesc_array_type (tree etype, gfc_array_spec * as, int packed)
return type;
}
+/* Return or create the base type for an array descriptor. */
+
+static tree
+gfc_get_array_descriptor_base (int dimen)
+{
+ tree fat_type, fieldlist, decl, arraytype;
+ char name[16 + GFC_RANK_DIGITS + 1];
+
+ gcc_assert (dimen >= 1 && dimen <= GFC_MAX_DIMENSIONS);
+ if (gfc_array_descriptor_base[dimen - 1])
+ return gfc_array_descriptor_base[dimen - 1];
+
+ /* Build the type node. */
+ fat_type = make_node (RECORD_TYPE);
+
+ sprintf (name, "array_descriptor" GFC_RANK_PRINTF_FORMAT, dimen);
+ TYPE_NAME (fat_type) = get_identifier (name);
+
+ /* Add the data member as the first element of the descriptor. */
+ decl = build_decl (FIELD_DECL, get_identifier ("data"), ptr_type_node);
+
+ DECL_CONTEXT (decl) = fat_type;
+ fieldlist = decl;
+
+ /* Add the base component. */
+ decl = build_decl (FIELD_DECL, get_identifier ("offset"),
+ gfc_array_index_type);
+ DECL_CONTEXT (decl) = fat_type;
+ fieldlist = chainon (fieldlist, decl);
+
+ /* Add the dtype component. */
+ decl = build_decl (FIELD_DECL, get_identifier ("dtype"),
+ gfc_array_index_type);
+ DECL_CONTEXT (decl) = fat_type;
+ fieldlist = chainon (fieldlist, decl);
+
+ /* Build the array type for the stride and bound components. */
+ arraytype =
+ build_array_type (gfc_get_desc_dim_type (),
+ build_range_type (gfc_array_index_type,
+ gfc_index_zero_node,
+ gfc_rank_cst[dimen - 1]));
+
+ decl = build_decl (FIELD_DECL, get_identifier ("dim"), arraytype);
+ DECL_CONTEXT (decl) = fat_type;
+ fieldlist = chainon (fieldlist, decl);
+
+ /* Finish off the type. */
+ TYPE_FIELDS (fat_type) = fieldlist;
+
+ gfc_finish_type (fat_type);
+
+ gfc_array_descriptor_base[dimen - 1] = fat_type;
+ return fat_type;
+}
/* Build an array (descriptor) type with given bounds. */
@@ -1102,25 +1158,13 @@ tree
gfc_get_array_type_bounds (tree etype, int dimen, tree * lbound,
tree * ubound, int packed)
{
- tree fat_type, fat_pointer_type;
- tree fieldlist;
- tree arraytype;
- tree decl;
- int n;
char name[8 + GFC_RANK_DIGITS + GFC_MAX_SYMBOL_LEN];
+ tree fat_type, base_type, arraytype, lower, upper, stride, tmp;
const char *typename;
- tree lower;
- tree upper;
- tree stride;
- tree tmp;
+ int n;
- /* Build the type node. */
- fat_type = make_node (RECORD_TYPE);
- GFC_DESCRIPTOR_TYPE_P (fat_type) = 1;
- TYPE_LANG_SPECIFIC (fat_type) = (struct lang_type *)
- ggc_alloc_cleared (sizeof (struct lang_type));
- GFC_TYPE_ARRAY_RANK (fat_type) = dimen;
- GFC_TYPE_ARRAY_DTYPE (fat_type) = NULL_TREE;
+ base_type = gfc_get_array_descriptor_base (dimen);
+ fat_type = build_variant_type_copy (base_type);
tmp = TYPE_NAME (etype);
if (tmp && TREE_CODE (tmp) == TYPE_DECL)
@@ -1129,20 +1173,22 @@ gfc_get_array_type_bounds (tree etype, int dimen, tree * lbound,
typename = IDENTIFIER_POINTER (tmp);
else
typename = "unknown";
-
sprintf (name, "array" GFC_RANK_PRINTF_FORMAT "_%.*s", dimen,
GFC_MAX_SYMBOL_LEN, typename);
TYPE_NAME (fat_type) = get_identifier (name);
- TYPE_PACKED (fat_type) = 0;
- fat_pointer_type = build_pointer_type (fat_type);
+ GFC_DESCRIPTOR_TYPE_P (fat_type) = 1;
+ TYPE_LANG_SPECIFIC (fat_type) = (struct lang_type *)
+ ggc_alloc_cleared (sizeof (struct lang_type));
+
+ GFC_TYPE_ARRAY_RANK (fat_type) = dimen;
+ GFC_TYPE_ARRAY_DTYPE (fat_type) = NULL_TREE;
/* Build an array descriptor record type. */
if (packed != 0)
stride = gfc_index_one_node;
else
stride = NULL_TREE;
-
for (n = 0; n < dimen; n++)
{
GFC_TYPE_ARRAY_STRIDE (fat_type, n) = stride;
@@ -1183,6 +1229,7 @@ gfc_get_array_type_bounds (tree etype, int dimen, tree * lbound,
stride = NULL_TREE;
}
GFC_TYPE_ARRAY_SIZE (fat_type) = stride;
+
/* TODO: known offsets for descriptors. */
GFC_TYPE_ARRAY_OFFSET (fat_type) = NULL_TREE;
@@ -1193,42 +1240,6 @@ gfc_get_array_type_bounds (tree etype, int dimen, tree * lbound,
arraytype = build_pointer_type (arraytype);
GFC_TYPE_ARRAY_DATAPTR_TYPE (fat_type) = arraytype;
- /* The pointer to the array data. */
- decl = build_decl (FIELD_DECL, get_identifier ("data"), arraytype);
-
- DECL_CONTEXT (decl) = fat_type;
- /* Add the data member as the first element of the descriptor. */
- fieldlist = decl;
-
- /* Add the base component. */
- decl = build_decl (FIELD_DECL, get_identifier ("offset"),
- gfc_array_index_type);
- DECL_CONTEXT (decl) = fat_type;
- fieldlist = chainon (fieldlist, decl);
-
- /* Add the dtype component. */
- decl = build_decl (FIELD_DECL, get_identifier ("dtype"),
- gfc_array_index_type);
- DECL_CONTEXT (decl) = fat_type;
- fieldlist = chainon (fieldlist, decl);
-
- /* Build the array type for the stride and bound components. */
- arraytype =
- build_array_type (gfc_get_desc_dim_type (),
- build_range_type (gfc_array_index_type,
- gfc_index_zero_node,
- gfc_rank_cst[dimen - 1]));
-
- decl = build_decl (FIELD_DECL, get_identifier ("dim"), arraytype);
- DECL_CONTEXT (decl) = fat_type;
- DECL_INITIAL (decl) = NULL_TREE;
- fieldlist = chainon (fieldlist, decl);
-
- /* Finish off the type. */
- TYPE_FIELDS (fat_type) = fieldlist;
-
- gfc_finish_type (fat_type);
-
return fat_type;
}
@@ -1268,11 +1279,6 @@ gfc_sym_type (gfc_symbol * sym)
return TREE_TYPE (sym->backend_decl);
}
- /* The frontend doesn't set all the attributes for a function with an
- explicit result value, so we use that instead when present. */
- if (sym->attr.function && sym->result)
- sym = sym->result;
-
type = gfc_typenode_for_spec (&sym->ts);
if (gfc_option.flag_f2c
&& sym->attr.function
@@ -1299,7 +1305,7 @@ gfc_sym_type (gfc_symbol * sym)
/* If this is a character argument of unknown length, just use the
base type. */
if (sym->ts.type != BT_CHARACTER
- || !(sym->attr.dummy || sym->attr.function || sym->attr.result)
+ || !(sym->attr.dummy || sym->attr.function)
|| sym->ts.cl->backend_decl)
{
type = gfc_get_nodesc_array_type (type, sym->as,
@@ -1467,17 +1473,13 @@ gfc_get_derived_type (gfc_symbol * derived)
int
gfc_return_by_reference (gfc_symbol * sym)
{
- gfc_symbol *result;
-
if (!sym->attr.function)
return 0;
- result = sym->result ? sym->result : sym;
-
- if (result->attr.dimension)
+ if (sym->attr.dimension)
return 1;
- if (result->ts.type == BT_CHARACTER)
+ if (sym->ts.type == BT_CHARACTER)
return 1;
/* Possibly return complex numbers by reference for g77 compatibility.
@@ -1486,7 +1488,7 @@ gfc_return_by_reference (gfc_symbol * sym)
require an explicit interface, as no compatibility problems can
arise there. */
if (gfc_option.flag_f2c
- && result->ts.type == BT_COMPLEX
+ && sym->ts.type == BT_COMPLEX
&& !sym->attr.intrinsic && !sym->attr.always_explicit)
return 1;
@@ -1611,7 +1613,7 @@ gfc_get_function_type (gfc_symbol * sym)
The problem arises if a function is called via an implicit
prototype. In this situation the INTENT is not known.
For this reason all parameters to global functions must be
- passed by reference. Passing by value would potentialy
+ passed by reference. Passing by value would potentially
generate bad code. Worse there would be no way of telling that
this code was bad, except that it would give incorrect results.
diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c
index 70630cbecab..fe41654f1c9 100644
--- a/gcc/fortran/trans.c
+++ b/gcc/fortran/trans.c
@@ -314,7 +314,7 @@ gfc_build_array_ref (tree base, tree offset)
}
-/* Given a funcion declaration FNDECL and an argument list ARGLIST,
+/* Given a function declaration FNDECL and an argument list ARGLIST,
build a CALL_EXPR. */
tree
@@ -437,9 +437,9 @@ gfc_get_backend_locus (locus * loc)
{
loc->lb = gfc_getmem (sizeof (gfc_linebuf));
#ifdef USE_MAPPED_LOCATION
- loc->lb->location = input_location; /* FIXME adjust?? */
+ loc->lb->location = input_location;
#else
- loc->lb->linenum = input_line - 1;
+ loc->lb->linenum = input_line;
#endif
loc->lb->file = gfc_current_backend_file;
}
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h
index d44c67d6d48..705e9f6a7f9 100644
--- a/gcc/fortran/trans.h
+++ b/gcc/fortran/trans.h
@@ -251,8 +251,8 @@ gfc_saved_var;
/* Advance the SS chain to the next term. */
void gfc_advance_se_ss_chain (gfc_se *);
-/* Call this to initialise a gfc_se structure before use
- first parameter is structure to initialise, second is
+/* Call this to initialize a gfc_se structure before use
+ first parameter is structure to initialize, second is
parent to get scalarization data from, or NULL. */
void gfc_init_se (gfc_se *, gfc_se *);
@@ -301,7 +301,7 @@ void gfc_conv_intrinsic_function (gfc_se *, gfc_expr *);
int gfc_is_intrinsic_libcall (gfc_expr *);
/* Also used to CALL subroutines. */
-void gfc_conv_function_call (gfc_se *, gfc_symbol *, gfc_actual_arglist *);
+int gfc_conv_function_call (gfc_se *, gfc_symbol *, gfc_actual_arglist *);
/* gfc_trans_* shouldn't call push/poplevel, use gfc_push/pop_scope */
/* Generate code for a scalar assignment. */
@@ -574,7 +574,4 @@ struct lang_decl GTY(())
arg1, arg2)
#define build3_v(code, arg1, arg2, arg3) build3(code, void_type_node, \
arg1, arg2, arg3)
-
-/* flag for alternative return labels. */
-extern int has_alternate_specifier; /* for caller */
#endif /* GFC_TRANS_H */
diff --git a/gcc/function.c b/gcc/function.c
index 2e2152da498..6337b5dab1d 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -121,13 +121,16 @@ struct machine_function * (*init_machine_status) (void);
/* The currently compiled function. */
struct function *cfun = 0;
+DEF_VEC_I(int);
+DEF_VEC_ALLOC_I(int,heap);
+
/* These arrays record the INSN_UIDs of the prologue and epilogue insns. */
-static GTY(()) varray_type prologue;
-static GTY(()) varray_type epilogue;
+static VEC(int,heap) *prologue;
+static VEC(int,heap) *epilogue;
/* Array of INSN_UIDs to hold the INSN_UIDs for each sibcall epilogue
in this function. */
-static GTY(()) varray_type sibcall_epilogue;
+static VEC(int,heap) *sibcall_epilogue;
/* In order to evaluate some expressions, such as function calls returning
structures in memory, we need to temporarily allocate stack locations.
@@ -198,8 +201,8 @@ static tree *get_block_vector (tree, int *);
extern tree debug_find_var_in_block_tree (tree, tree);
/* We always define `record_insns' even if it's not used so that we
can always export `prologue_epilogue_contains'. */
-static void record_insns (rtx, varray_type *) ATTRIBUTE_UNUSED;
-static int contains (rtx, varray_type);
+static void record_insns (rtx, VEC(int,heap) **) ATTRIBUTE_UNUSED;
+static int contains (rtx, VEC(int,heap) **);
#ifdef HAVE_return
static void emit_return_into_block (basic_block, rtx);
#endif
@@ -306,6 +309,10 @@ free_after_parsing (struct function *f)
void
free_after_compilation (struct function *f)
{
+ VEC_free (int, heap, prologue);
+ VEC_free (int, heap, epilogue);
+ VEC_free (int, heap, sibcall_epilogue);
+
f->eh = NULL;
f->expr = NULL;
f->emit = NULL;
@@ -3140,7 +3147,8 @@ gimplify_parameters (void)
t = build2 (MODIFY_EXPR, void_type_node, local, parm);
gimplify_and_add (t, &stmts);
- DECL_VALUE_EXPR (parm) = local;
+ SET_DECL_VALUE_EXPR (parm, local);
+ DECL_HAS_VALUE_EXPR_P (parm) = 1;
}
}
}
@@ -3861,10 +3869,11 @@ init_function_for_compilation (void)
{
reg_renumber = 0;
- /* No prologue/epilogue insns yet. */
- VARRAY_GROW (prologue, 0);
- VARRAY_GROW (epilogue, 0);
- VARRAY_GROW (sibcall_epilogue, 0);
+ /* No prologue/epilogue insns yet. Make sure that these vectors are
+ empty. */
+ gcc_assert (VEC_length (int, prologue) == 0);
+ gcc_assert (VEC_length (int, epilogue) == 0);
+ gcc_assert (VEC_length (int, sibcall_epilogue) == 0);
}
void
@@ -4446,28 +4455,12 @@ get_arg_pointer_save_area (struct function *f)
(a list of one or more insns). */
static void
-record_insns (rtx insns, varray_type *vecp)
+record_insns (rtx insns, VEC(int,heap) **vecp)
{
- int i, len;
rtx tmp;
- tmp = insns;
- len = 0;
- while (tmp != NULL_RTX)
- {
- len++;
- tmp = NEXT_INSN (tmp);
- }
-
- i = VARRAY_SIZE (*vecp);
- VARRAY_GROW (*vecp, i + len);
- tmp = insns;
- while (tmp != NULL_RTX)
- {
- VARRAY_INT (*vecp, i) = INSN_UID (tmp);
- i++;
- tmp = NEXT_INSN (tmp);
- }
+ for (tmp = insns; tmp != NULL_RTX; tmp = NEXT_INSN (tmp))
+ VEC_safe_push (int, heap, *vecp, INSN_UID (tmp));
}
/* Set the locator of the insn chain starting at INSN to LOC. */
@@ -4486,7 +4479,7 @@ set_insn_locators (rtx insn, int loc)
be running after reorg, SEQUENCE rtl is possible. */
static int
-contains (rtx insn, varray_type vec)
+contains (rtx insn, VEC(int,heap) **vec)
{
int i, j;
@@ -4495,15 +4488,16 @@ contains (rtx insn, varray_type vec)
{
int count = 0;
for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
- for (j = VARRAY_SIZE (vec) - 1; j >= 0; --j)
- if (INSN_UID (XVECEXP (PATTERN (insn), 0, i)) == VARRAY_INT (vec, j))
+ for (j = VEC_length (int, *vec) - 1; j >= 0; --j)
+ if (INSN_UID (XVECEXP (PATTERN (insn), 0, i))
+ == VEC_index (int, *vec, j))
count++;
return count;
}
else
{
- for (j = VARRAY_SIZE (vec) - 1; j >= 0; --j)
- if (INSN_UID (insn) == VARRAY_INT (vec, j))
+ for (j = VEC_length (int, *vec) - 1; j >= 0; --j)
+ if (INSN_UID (insn) == VEC_index (int, *vec, j))
return 1;
}
return 0;
@@ -4512,9 +4506,9 @@ contains (rtx insn, varray_type vec)
int
prologue_epilogue_contains (rtx insn)
{
- if (contains (insn, prologue))
+ if (contains (insn, &prologue))
return 1;
- if (contains (insn, epilogue))
+ if (contains (insn, &epilogue))
return 1;
return 0;
}
@@ -4523,7 +4517,7 @@ int
sibcall_epilogue_contains (rtx insn)
{
if (sibcall_epilogue)
- return contains (insn, sibcall_epilogue);
+ return contains (insn, &sibcall_epilogue);
return 0;
}
@@ -5262,7 +5256,7 @@ reposition_prologue_and_epilogue_notes (rtx f ATTRIBUTE_UNUSED)
rtx insn, last, note;
int len;
- if ((len = VARRAY_SIZE (prologue)) > 0)
+ if ((len = VEC_length (int, prologue)) > 0)
{
last = 0, note = 0;
@@ -5276,7 +5270,7 @@ reposition_prologue_and_epilogue_notes (rtx f ATTRIBUTE_UNUSED)
if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_PROLOGUE_END)
note = insn;
}
- else if (contains (insn, prologue))
+ else if (contains (insn, &prologue))
{
last = insn;
if (--len == 0)
@@ -5303,7 +5297,7 @@ reposition_prologue_and_epilogue_notes (rtx f ATTRIBUTE_UNUSED)
}
}
- if ((len = VARRAY_SIZE (epilogue)) > 0)
+ if ((len = VEC_length (int, epilogue)) > 0)
{
last = 0, note = 0;
@@ -5317,7 +5311,7 @@ reposition_prologue_and_epilogue_notes (rtx f ATTRIBUTE_UNUSED)
if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EPILOGUE_BEG)
note = insn;
}
- else if (contains (insn, epilogue))
+ else if (contains (insn, &epilogue))
{
last = insn;
if (--len == 0)
@@ -5344,16 +5338,6 @@ reposition_prologue_and_epilogue_notes (rtx f ATTRIBUTE_UNUSED)
#endif /* HAVE_prologue or HAVE_epilogue */
}
-/* Called once, at initialization, to initialize function.c. */
-
-void
-init_function_once (void)
-{
- VARRAY_INT_INIT (prologue, 0, "prologue");
- VARRAY_INT_INIT (epilogue, 0, "epilogue");
- VARRAY_INT_INIT (sibcall_epilogue, 0, "sibcall_epilogue");
-}
-
/* Resets insn_block_boundaries array. */
void
diff --git a/gcc/function.h b/gcc/function.h
index da435b17c22..cdacf09431a 100644
--- a/gcc/function.h
+++ b/gcc/function.h
@@ -556,9 +556,6 @@ extern void instantiate_virtual_regs (void);
/* Returns the name of the current function. */
extern const char *current_function_name (void);
-/* Called once, at initialization, to initialize function.c. */
-extern void init_function_once (void);
-
extern void do_warn_unused_parameter (tree);
extern bool pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 0820bd7cac0..076d224bebd 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -1736,7 +1736,7 @@ init_spec (void)
}
obstack_1grow (&obstack, '\0');
- libgcc_spec = obstack_finish (&obstack);
+ libgcc_spec = XOBFINISH (&obstack, const char *);
}
#endif
#ifdef USE_AS_TRADITIONAL_FORMAT
@@ -1745,14 +1745,14 @@ init_spec (void)
static const char tf[] = "--traditional-format ";
obstack_grow (&obstack, tf, sizeof(tf) - 1);
obstack_grow0 (&obstack, asm_spec, strlen (asm_spec));
- asm_spec = obstack_finish (&obstack);
+ asm_spec = XOBFINISH (&obstack, const char *);
}
#endif
#ifdef LINK_EH_SPEC
/* Prepend LINK_EH_SPEC to whatever link_spec we had before. */
obstack_grow (&obstack, LINK_EH_SPEC, sizeof(LINK_EH_SPEC) - 1);
obstack_grow0 (&obstack, link_spec, strlen (link_spec));
- link_spec = obstack_finish (&obstack);
+ link_spec = XOBFINISH (&obstack, const char *);
#endif
specs = sl;
@@ -2393,7 +2393,7 @@ build_search_list (struct path_prefix *paths, const char *prefix,
}
obstack_1grow (&collect_obstack, '\0');
- return obstack_finish (&collect_obstack);
+ return XOBFINISH (&collect_obstack, char *);
}
/* Rebuild the COMPILER_PATH and LIBRARY_PATH environment variables
@@ -2980,7 +2980,7 @@ convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
{
obstack_grow (&obstack, name, len - 2);
obstack_grow0 (&obstack, TARGET_OBJECT_SUFFIX, strlen (TARGET_OBJECT_SUFFIX));
- name = obstack_finish (&obstack);
+ name = XOBFINISH (&obstack, const char *);
}
#endif
@@ -3001,7 +3001,7 @@ convert_filename (const char *name, int do_exe ATTRIBUTE_UNUSED,
obstack_grow (&obstack, name, len);
obstack_grow0 (&obstack, TARGET_EXECUTABLE_SUFFIX,
strlen (TARGET_EXECUTABLE_SUFFIX));
- name = obstack_finish (&obstack);
+ name = XOBFINISH (&obstack, const char *);
#endif
return name;
@@ -4154,7 +4154,7 @@ set_collect_gcc_options (void)
}
}
obstack_grow (&collect_obstack, "\0", 1);
- putenv (obstack_finish (&collect_obstack));
+ putenv (XOBFINISH (&collect_obstack, char *));
}
/* Process a spec string, accumulating and running commands. */
@@ -4253,7 +4253,7 @@ do_spec_2 (const char *spec)
if (arg_going)
{
obstack_1grow (&obstack, 0);
- string = obstack_finish (&obstack);
+ string = XOBFINISH (&obstack, const char *);
if (this_is_library_file)
string = find_file (string);
store_arg (string, delete_this_arg, this_is_output_file);
@@ -4488,7 +4488,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
if (arg_going)
{
obstack_1grow (&obstack, 0);
- string = obstack_finish (&obstack);
+ string = XOBFINISH (&obstack, const char *);
if (this_is_library_file)
string = find_file (string);
store_arg (string, delete_this_arg, this_is_output_file);
@@ -4533,7 +4533,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
if (arg_going)
{
obstack_1grow (&obstack, 0);
- string = obstack_finish (&obstack);
+ string = XOBFINISH (&obstack, const char *);
if (this_is_library_file)
string = find_file (string);
store_arg (string, delete_this_arg, this_is_output_file);
@@ -4552,7 +4552,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
if (arg_going)
{
obstack_1grow (&obstack, 0);
- string = obstack_finish (&obstack);
+ string = XOBFINISH (&obstack, const char *);
if (this_is_library_file)
string = find_file (string);
store_arg (string, delete_this_arg, this_is_output_file);
@@ -4914,7 +4914,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
if (arg_going)
{
obstack_1grow (&obstack, 0);
- string = obstack_finish (&obstack);
+ string = XOBFINISH (&obstack, const char *);
if (this_is_library_file)
string = find_file (string);
store_arg (string, delete_this_arg, this_is_output_file);
@@ -5243,7 +5243,7 @@ do_spec_1 (const char *spec, int inswitch, const char *soft_matched_part)
if (processing_spec_function && arg_going)
{
obstack_1grow (&obstack, 0);
- string = obstack_finish (&obstack);
+ string = XOBFINISH (&obstack, const char *);
if (this_is_library_file)
string = find_file (string);
store_arg (string, delete_this_arg, this_is_output_file);
@@ -6037,21 +6037,21 @@ main (int argc, const char **argv)
obstack_grow (&multilib_obstack, p, strlen (p));
obstack_1grow (&multilib_obstack, 0);
- multilib_select = obstack_finish (&multilib_obstack);
+ multilib_select = XOBFINISH (&multilib_obstack, const char *);
q = multilib_matches_raw;
while ((p = *q++) != (char *) 0)
obstack_grow (&multilib_obstack, p, strlen (p));
obstack_1grow (&multilib_obstack, 0);
- multilib_matches = obstack_finish (&multilib_obstack);
+ multilib_matches = XOBFINISH (&multilib_obstack, const char *);
q = multilib_exclusions_raw;
while ((p = *q++) != (char *) 0)
obstack_grow (&multilib_obstack, p, strlen (p));
obstack_1grow (&multilib_obstack, 0);
- multilib_exclusions = obstack_finish (&multilib_obstack);
+ multilib_exclusions = XOBFINISH (&multilib_obstack, const char *);
need_space = FALSE;
for (i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++)
@@ -6065,7 +6065,7 @@ main (int argc, const char **argv)
}
obstack_1grow (&multilib_obstack, 0);
- multilib_defaults = obstack_finish (&multilib_obstack);
+ multilib_defaults = XOBFINISH (&multilib_obstack, const char *);
}
/* Set up to remember the pathname of gcc and any options
@@ -6074,7 +6074,7 @@ main (int argc, const char **argv)
obstack_init (&collect_obstack);
obstack_grow (&collect_obstack, "COLLECT_GCC=", sizeof ("COLLECT_GCC=") - 1);
obstack_grow (&collect_obstack, argv[0], strlen (argv[0]) + 1);
- putenv (obstack_finish (&collect_obstack));
+ putenv (XOBFINISH (&collect_obstack, char *));
#ifdef INIT_ENVIRONMENT
/* Set up any other necessary machine specific environment variables. */
@@ -6160,7 +6160,7 @@ main (int argc, const char **argv)
{
obstack_grow (&obstack, "%(sysroot_spec) ", strlen ("%(sysroot_spec) "));
obstack_grow0 (&obstack, link_spec, strlen (link_spec));
- set_spec ("link", obstack_finish (&obstack));
+ set_spec ("link", XOBFINISH (&obstack, const char *));
}
#endif
@@ -6349,7 +6349,7 @@ main (int argc, const char **argv)
obstack_init (&obstack);
do_spec_1 (THREAD_MODEL_SPEC, 0, thread_model);
obstack_1grow (&obstack, '\0');
- thrmod = obstack_finish (&obstack);
+ thrmod = XOBFINISH (&obstack, const char *);
#else
thrmod = thread_model;
#endif
@@ -6716,40 +6716,46 @@ fancy_abort (const char *file, int line, const char *func)
/* Output an error message and exit. */
void
-fatal (const char *msgid, ...)
+fatal (const char *cmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
+ va_start (ap, cmsgid);
fprintf (stderr, "%s: ", programname);
- vfprintf (stderr, _(msgid), ap);
+ vfprintf (stderr, _(cmsgid), ap);
va_end (ap);
fprintf (stderr, "\n");
delete_temp_files ();
exit (1);
}
+/* The argument is actually c-format, not gcc-internal-format,
+ but because functions with identical names are used through
+ the rest of the compiler with gcc-internal-format, we just
+ need to hope all users of these functions use the common
+ subset between c-format and gcc-internal-format. */
+
void
-error (const char *msgid, ...)
+error (const char *gmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
+ va_start (ap, gmsgid);
fprintf (stderr, "%s: ", programname);
- vfprintf (stderr, _(msgid), ap);
+ vfprintf (stderr, _(gmsgid), ap);
va_end (ap);
fprintf (stderr, "\n");
}
static void
-notice (const char *msgid, ...)
+notice (const char *cmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
- vfprintf (stderr, _(msgid), ap);
+ va_start (ap, cmsgid);
+ vfprintf (stderr, _(cmsgid), ap);
va_end (ap);
}
@@ -7071,7 +7077,7 @@ set_multilib_dir (void)
obstack_grow (&multilib_obstack, start, end - start);
obstack_1grow (&multilib_obstack, 0);
- mdswitches[i].str = obstack_finish (&multilib_obstack);
+ mdswitches[i].str = XOBFINISH (&multilib_obstack, const char *);
mdswitches[i++].len = end - start;
if (*end == '\0')
diff --git a/gcc/gcov.c b/gcc/gcov.c
index 984721a058b..9803672dc41 100644
--- a/gcc/gcov.c
+++ b/gcc/gcov.c
@@ -367,12 +367,12 @@ main (int argc, char **argv)
}
static void
-fnotice (FILE *file, const char *msgid, ...)
+fnotice (FILE *file, const char *cmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
- vfprintf (file, _(msgid), ap);
+ va_start (ap, cmsgid);
+ vfprintf (file, _(cmsgid), ap);
va_end (ap);
}
diff --git a/gcc/gcse.c b/gcc/gcse.c
index 3cd1268df02..d29a507d238 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -507,11 +507,11 @@ static int gcse_subst_count;
static int gcse_create_count;
/* Number of local constants propagated. */
static int local_const_prop_count;
-/* Number of local copys propagated. */
+/* Number of local copies propagated. */
static int local_copy_prop_count;
/* Number of global constants propagated. */
static int global_const_prop_count;
-/* Number of global copys propagated. */
+/* Number of global copies propagated. */
static int global_copy_prop_count;
/* For available exprs */
@@ -1370,6 +1370,11 @@ static int
load_killed_in_block_p (basic_block bb, int uid_limit, rtx x, int avail_p)
{
rtx list_entry = modify_mem_list[bb->index];
+
+ /* If this is a readonly then we aren't going to be changing it. */
+ if (MEM_READONLY_P (x))
+ return 0;
+
while (list_entry)
{
rtx setter;
@@ -2462,51 +2467,53 @@ compute_transp (rtx x, int indx, sbitmap *bmap, int set_p)
return;
case MEM:
- {
- bitmap_iterator bi;
- unsigned bb_index;
-
- /* First handle all the blocks with calls. We don't need to
- do any list walking for them. */
- EXECUTE_IF_SET_IN_BITMAP (blocks_with_calls, 0, bb_index, bi)
- {
- if (set_p)
- SET_BIT (bmap[bb_index], indx);
- else
- RESET_BIT (bmap[bb_index], indx);
- }
+ if (! MEM_READONLY_P (x))
+ {
+ bitmap_iterator bi;
+ unsigned bb_index;
- /* Now iterate over the blocks which have memory modifications
- but which do not have any calls. */
- EXECUTE_IF_AND_COMPL_IN_BITMAP (modify_mem_list_set, blocks_with_calls,
- 0, bb_index, bi)
- {
- rtx list_entry = canon_modify_mem_list[bb_index];
+ /* First handle all the blocks with calls. We don't need to
+ do any list walking for them. */
+ EXECUTE_IF_SET_IN_BITMAP (blocks_with_calls, 0, bb_index, bi)
+ {
+ if (set_p)
+ SET_BIT (bmap[bb_index], indx);
+ else
+ RESET_BIT (bmap[bb_index], indx);
+ }
- while (list_entry)
+ /* Now iterate over the blocks which have memory modifications
+ but which do not have any calls. */
+ EXECUTE_IF_AND_COMPL_IN_BITMAP (modify_mem_list_set,
+ blocks_with_calls,
+ 0, bb_index, bi)
{
- rtx dest, dest_addr;
+ rtx list_entry = canon_modify_mem_list[bb_index];
- /* LIST_ENTRY must be an INSN of some kind that sets memory.
- Examine each hunk of memory that is modified. */
+ while (list_entry)
+ {
+ rtx dest, dest_addr;
- dest = XEXP (list_entry, 0);
- list_entry = XEXP (list_entry, 1);
- dest_addr = XEXP (list_entry, 0);
+ /* LIST_ENTRY must be an INSN of some kind that sets memory.
+ Examine each hunk of memory that is modified. */
- if (canon_true_dependence (dest, GET_MODE (dest), dest_addr,
- x, rtx_addr_varies_p))
- {
- if (set_p)
- SET_BIT (bmap[bb_index], indx);
- else
- RESET_BIT (bmap[bb_index], indx);
- break;
- }
- list_entry = XEXP (list_entry, 1);
+ dest = XEXP (list_entry, 0);
+ list_entry = XEXP (list_entry, 1);
+ dest_addr = XEXP (list_entry, 0);
+
+ if (canon_true_dependence (dest, GET_MODE (dest), dest_addr,
+ x, rtx_addr_varies_p))
+ {
+ if (set_p)
+ SET_BIT (bmap[bb_index], indx);
+ else
+ RESET_BIT (bmap[bb_index], indx);
+ break;
+ }
+ list_entry = XEXP (list_entry, 1);
+ }
}
- }
- }
+ }
x = XEXP (x, 0);
goto repeat;
@@ -6529,9 +6536,9 @@ is_too_expensive (const char *pass)
graceful degradation. */
if (n_edges > 20000 + n_basic_blocks * 4)
{
- if (warn_disabled_optimization)
- warning (0, "%s: %d basic blocks and %d edges/basic block",
- pass, n_basic_blocks, n_edges / n_basic_blocks);
+ warning (OPT_Wdisabled_optimization,
+ "%s: %d basic blocks and %d edges/basic block",
+ pass, n_basic_blocks, n_edges / n_basic_blocks);
return true;
}
@@ -6542,9 +6549,9 @@ is_too_expensive (const char *pass)
* SBITMAP_SET_SIZE (max_reg_num ())
* sizeof (SBITMAP_ELT_TYPE)) > MAX_GCSE_MEMORY)
{
- if (warn_disabled_optimization)
- warning (0, "%s: %d basic blocks and %d registers",
- pass, n_basic_blocks, max_reg_num ());
+ warning (OPT_Wdisabled_optimization,
+ "%s: %d basic blocks and %d registers",
+ pass, n_basic_blocks, max_reg_num ());
return true;
}
diff --git a/gcc/genemit.c b/gcc/genemit.c
index bd9cf364a21..08b51f821ff 100644
--- a/gcc/genemit.c
+++ b/gcc/genemit.c
@@ -845,6 +845,7 @@ from the machine description file `md'. */\n\n");
printf ("#include \"reload.h\"\n");
printf ("#include \"toplev.h\"\n");
printf ("#include \"ggc.h\"\n\n");
+ printf ("#include \"basic-block.h\"\n\n");
printf ("#define FAIL return (end_sequence (), _val)\n");
printf ("#define DONE return (_val = get_insns (), end_sequence (), _val)\n\n");
diff --git a/gcc/genflags.c b/gcc/genflags.c
index a52e18a9def..0710b4a4667 100644
--- a/gcc/genflags.c
+++ b/gcc/genflags.c
@@ -267,7 +267,7 @@ main (int argc, char **argv)
/* Print out the prototypes now. */
dummy = (rtx) 0;
obstack_grow (&obstack, &dummy, sizeof (rtx));
- insns = (rtx *) obstack_finish (&obstack);
+ insns = XOBFINISH (&obstack, rtx *);
for (insn_ptr = insns; *insn_ptr; insn_ptr++)
gen_proto (*insn_ptr);
diff --git a/gcc/genmodes.c b/gcc/genmodes.c
index 6e282f36dd9..42a8d03c83e 100644
--- a/gcc/genmodes.c
+++ b/gcc/genmodes.c
@@ -64,6 +64,7 @@ struct mode_data
struct mode_data *component; /* mode of components */
struct mode_data *wider; /* next wider mode */
+ struct mode_data *wider_2x; /* 2x wider mode */
struct mode_data *contained; /* Pointer to list of modes that have
this mode as a component. */
@@ -80,7 +81,7 @@ static struct mode_data *void_mode;
static const struct mode_data blank_mode = {
0, "<unknown>", MAX_MODE_CLASS,
-1U, -1U, -1U, -1U,
- 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,
"<unknown>", 0
};
@@ -619,7 +620,7 @@ make_vector_mode (enum mode_class bclass,
ncomponents, base) >= sizeof namebuf)
{
error ("%s:%d: mode name \"%s\" is too long",
- base, file, line);
+ file, line, base);
return;
}
@@ -717,6 +718,7 @@ calc_wider_mode (void)
for (prev = 0, m = modes[c]; m; m = next)
{
m->wider = void_mode;
+ m->wider_2x = void_mode;
/* this is nreverse */
next = m->next;
@@ -951,6 +953,39 @@ emit_mode_wider (void)
m->name);
print_closer ();
+ print_decl ("unsigned char", "mode_2xwider", "NUM_MACHINE_MODES");
+
+ for_all_modes (c, m)
+ {
+ struct mode_data * m2;
+
+ for (m2 = m;
+ m2 && m2 != void_mode;
+ m2 = m2->wider)
+ {
+ if (m2->bytesize < 2 * m->bytesize)
+ continue;
+ if (m->precision != (unsigned int) -1)
+ {
+ if (m2->precision != 2 * m->precision)
+ continue;
+ }
+ else
+ {
+ if (m2->precision != (unsigned int) -1)
+ continue;
+ }
+
+ break;
+ }
+ if (m2 == void_mode)
+ m2 = 0;
+ tagged_printf ("%smode",
+ m2 ? m2->name : void_mode->name,
+ m->name);
+ }
+
+ print_closer ();
}
static void
diff --git a/gcc/genpreds.c b/gcc/genpreds.c
index b07abedc5b0..e03e609ae98 100644
--- a/gcc/genpreds.c
+++ b/gcc/genpreds.c
@@ -122,7 +122,7 @@ write_predicate_subfunction (struct pred_data *p)
obstack_grow (rtl_obstack, p->name, strlen (p->name));
obstack_grow (rtl_obstack, "_1 (op, mode)",
sizeof "_1 (op, mode)");
- match_test_str = obstack_finish (rtl_obstack);
+ match_test_str = XOBFINISH (rtl_obstack, const char *);
/* Add the function-call expression to the complete expression to be
evaluated. */
diff --git a/gcc/ggc-page.c b/gcc/ggc-page.c
index 15f22c9f7f4..4da04b378bd 100644
--- a/gcc/ggc-page.c
+++ b/gcc/ggc-page.c
@@ -75,7 +75,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#define USING_MALLOC_PAGE_GROUPS
#endif
-/* Stategy:
+/* Strategy:
This garbage-collecting allocator allocates objects on one of a set
of pages. Each page can allocate objects of a single size only;
diff --git a/gcc/ggc-zone.c b/gcc/ggc-zone.c
index e3c72679d51..eb4fc1484ef 100644
--- a/gcc/ggc-zone.c
+++ b/gcc/ggc-zone.c
@@ -100,7 +100,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
ggc_set_mark for any object in the garbage zone, which cuts off
marking quickly. */
-/* Stategy:
+/* Strategy:
This garbage-collecting allocator segregates objects into zones.
It also segregates objects into "large" and "small" bins. Large
diff --git a/gcc/gimple-low.c b/gcc/gimple-low.c
index 4f814a5e6d7..e56efca4f85 100644
--- a/gcc/gimple-low.c
+++ b/gcc/gimple-low.c
@@ -25,7 +25,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "tm.h"
#include "tree.h"
#include "rtl.h"
-#include "errors.h"
#include "varray.h"
#include "tree-gimple.h"
#include "tree-inline.h"
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 1b91b186d6e..df93bc5dde8 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -27,7 +27,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "tm.h"
#include "tree.h"
#include "rtl.h"
-#include "errors.h"
#include "varray.h"
#include "tree-gimple.h"
#include "tree-inline.h"
@@ -45,6 +44,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "output.h"
#include "expr.h"
#include "ggc.h"
+#include "toplev.h"
#include "target.h"
static struct gimplify_ctx
@@ -54,7 +54,7 @@ static struct gimplify_ctx
tree conditional_cleanups;
tree exit_label;
tree return_temp;
- varray_type case_labels;
+ VEC(tree,heap) *case_labels;
/* The formal temporary table. Should this be persistent? */
htab_t temp_htab;
int conditions;
@@ -470,6 +470,9 @@ internal_get_tmp_var (tree val, tree *pre_p, tree *post_p, bool is_formal)
t = lookup_tmp_var (val, is_formal);
+ if (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE)
+ DECL_COMPLEX_GIMPLE_REG_P (t) = 1;
+
mod = build (MODIFY_EXPR, TREE_TYPE (t), t, val);
if (EXPR_HAS_LOCATION (val))
@@ -856,7 +859,18 @@ gimplify_bind_expr (tree *expr_p, tree temp, tree *pre_p)
/* Mark variables seen in this bind expr. */
for (t = BIND_EXPR_VARS (bind_expr); t ; t = TREE_CHAIN (t))
- DECL_SEEN_IN_BIND_EXPR_P (t) = 1;
+ {
+ DECL_SEEN_IN_BIND_EXPR_P (t) = 1;
+
+ /* Preliminarily mark non-addressed complex variables as eligible
+ for promotion to gimple registers. We'll transform their uses
+ as we find them. */
+ if (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
+ && !TREE_THIS_VOLATILE (t)
+ && (TREE_CODE (t) == VAR_DECL && !DECL_HARD_REGISTER (t))
+ && !needs_to_live_in_memory (t))
+ DECL_COMPLEX_GIMPLE_REG_P (t) = 1;
+ }
gimple_push_bind_expr (bind_expr);
gimplify_ctxp->save_stack = false;
@@ -983,10 +997,12 @@ gimplify_decl_expr (tree *stmt_p)
if (TREE_TYPE (decl) == error_mark_node)
return GS_ERROR;
- else if (TREE_CODE (decl) == TYPE_DECL)
+ if ((TREE_CODE (decl) == TYPE_DECL
+ || TREE_CODE (decl) == VAR_DECL)
+ && !TYPE_SIZES_GIMPLIFIED (TREE_TYPE (decl)))
gimplify_type_sizes (TREE_TYPE (decl), stmt_p);
- else if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl))
+ if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl))
{
tree init = DECL_INITIAL (decl);
@@ -997,12 +1013,6 @@ gimplify_decl_expr (tree *stmt_p)
of the emitted code: see mx_register_decls(). */
tree t, args, addr, ptr_type;
- /* ??? We really shouldn't need to gimplify the type of the variable
- since it already should have been done. But leave this here
- for now to avoid disrupting too many things at once. */
- if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (decl)))
- gimplify_type_sizes (TREE_TYPE (decl), stmt_p);
-
gimplify_one_sizepos (&DECL_SIZE (decl), stmt_p);
gimplify_one_sizepos (&DECL_SIZE_UNIT (decl), stmt_p);
@@ -1015,7 +1025,8 @@ gimplify_decl_expr (tree *stmt_p)
addr = create_tmp_var (ptr_type, get_name (decl));
DECL_IGNORED_P (addr) = 0;
t = build_fold_indirect_ref (addr);
- DECL_VALUE_EXPR (decl) = t;
+ SET_DECL_VALUE_EXPR (decl, t);
+ DECL_HAS_VALUE_EXPR_P (decl) = 1;
args = tree_cons (NULL, DECL_SIZE_UNIT (decl), NULL);
t = built_in_decls[BUILT_IN_ALLOCA];
@@ -1142,7 +1153,7 @@ gimplify_switch_expr (tree *expr_p, tree *pre_p)
if (SWITCH_BODY (switch_expr))
{
- varray_type labels, saved_labels;
+ VEC(tree,heap) *labels, *saved_labels;
tree label_vec, default_case = NULL_TREE;
size_t i, len;
@@ -1151,23 +1162,23 @@ gimplify_switch_expr (tree *expr_p, tree *pre_p)
gcc_assert (!SWITCH_LABELS (switch_expr));
saved_labels = gimplify_ctxp->case_labels;
- VARRAY_TREE_INIT (gimplify_ctxp->case_labels, 8, "case_labels");
+ gimplify_ctxp->case_labels = VEC_alloc (tree, heap, 8);
gimplify_to_stmt_list (&SWITCH_BODY (switch_expr));
labels = gimplify_ctxp->case_labels;
gimplify_ctxp->case_labels = saved_labels;
- len = VARRAY_ACTIVE_SIZE (labels);
+ len = VEC_length (tree, labels);
for (i = 0; i < len; ++i)
{
- tree t = VARRAY_TREE (labels, i);
+ tree t = VEC_index (tree, labels, i);
if (!CASE_LOW (t))
{
/* The default case must be the last label in the list. */
default_case = t;
- VARRAY_TREE (labels, i) = VARRAY_TREE (labels, len - 1);
+ VEC_replace (tree, labels, i, VEC_index (tree, labels, len - 1));
len--;
break;
}
@@ -1191,9 +1202,11 @@ gimplify_switch_expr (tree *expr_p, tree *pre_p)
*expr_p = SWITCH_BODY (switch_expr);
for (i = 0; i < len; ++i)
- TREE_VEC_ELT (label_vec, i) = VARRAY_TREE (labels, i);
+ TREE_VEC_ELT (label_vec, i) = VEC_index (tree, labels, i);
TREE_VEC_ELT (label_vec, len) = default_case;
+ VEC_free (tree, heap, labels);
+
sort_case_labels (label_vec);
SWITCH_BODY (switch_expr) = NULL;
@@ -1210,7 +1223,7 @@ gimplify_case_label_expr (tree *expr_p)
tree expr = *expr_p;
gcc_assert (gimplify_ctxp->case_labels);
- VARRAY_PUSH_TREE (gimplify_ctxp->case_labels, expr);
+ VEC_safe_push (tree, heap, gimplify_ctxp->case_labels, expr);
*expr_p = build (LABEL_EXPR, void_type_node, CASE_LABEL (expr));
return GS_ALL_DONE;
}
@@ -2125,12 +2138,10 @@ gimplify_cond_expr (tree *expr_p, tree *pre_p, tree *post_p, tree target,
enum gimplify_status ret;
type = TREE_TYPE (expr);
- if (!type)
- TREE_TYPE (expr) = void_type_node;
/* If this COND_EXPR has a value, copy the values into a temporary within
the arms. */
- else if (! VOID_TYPE_P (type))
+ if (! VOID_TYPE_P (type))
{
tree result;
@@ -2505,6 +2516,17 @@ gimplify_init_ctor_eval_range (tree object, tree lower, tree upper,
pre_p);
}
+/* Return true if FDECL is accessing a field that is zero sized. */
+
+static bool
+zero_sized_field_decl (tree fdecl)
+{
+ if (TREE_CODE (fdecl) == FIELD_DECL && DECL_SIZE (fdecl)
+ && integer_zerop (DECL_SIZE (fdecl)))
+ return true;
+ return false;
+}
+
/* A subroutine of gimplify_init_constructor. Generate individual
MODIFY_EXPRs for a CONSTRUCTOR. OBJECT is the LHS against which the
assignments should happen. LIST is the CONSTRUCTOR_ELTS of the
@@ -2537,6 +2559,9 @@ gimplify_init_ctor_eval (tree object, tree list, tree *pre_p, bool cleared)
so we don't have to figure out what's missing ourselves. */
gcc_assert (purpose);
+ if (zero_sized_field_decl (purpose))
+ continue;
+
/* If we have a RANGE_EXPR, we have to build a loop to assign the
whole range. */
if (TREE_CODE (purpose) == RANGE_EXPR)
@@ -2653,10 +2678,35 @@ gimplify_init_constructor (tree *expr_p, tree *pre_p,
break;
}
+ /* If there are "lots" of initialized elements, even discounting
+ those that are not address constants (and thus *must* be
+ computed at runtime), then partition the constructor into
+ constant and non-constant parts. Block copy the constant
+ parts in, then generate code for the non-constant parts. */
+ /* TODO. There's code in cp/typeck.c to do this. */
+
+ num_type_elements = count_type_elements (TREE_TYPE (ctor));
+
+ /* If there are "lots" of zeros, then block clear the object first. */
+ if (num_type_elements - num_nonzero_elements > CLEAR_RATIO
+ && num_nonzero_elements < num_type_elements/4)
+ cleared = true;
+
+ /* ??? This bit ought not be needed. For any element not present
+ in the initializer, we should simply set them to zero. Except
+ we'd need to *find* the elements that are not present, and that
+ requires trickery to avoid quadratic compile-time behavior in
+ large cases or excessive memory use in small cases. */
+ else if (num_ctor_elements < num_type_elements)
+ cleared = true;
+
/* If there are "lots" of initialized elements, and all of them
are valid address constants, then the entire initializer can
- be dropped to memory, and then memcpy'd out. */
- if (num_nonconstant_elements == 0)
+ be dropped to memory, and then memcpy'd out. Don't do this
+ for sparse arrays, though, as it's more efficient to follow
+ the standard CONSTRUCTOR behavior of memset followed by
+ individual element initialization. */
+ if (num_nonconstant_elements == 0 && !cleared)
{
HOST_WIDE_INT size = int_size_in_bytes (type);
unsigned int align;
@@ -2702,28 +2752,6 @@ gimplify_init_constructor (tree *expr_p, tree *pre_p,
}
}
- /* If there are "lots" of initialized elements, even discounting
- those that are not address constants (and thus *must* be
- computed at runtime), then partition the constructor into
- constant and non-constant parts. Block copy the constant
- parts in, then generate code for the non-constant parts. */
- /* TODO. There's code in cp/typeck.c to do this. */
-
- num_type_elements = count_type_elements (TREE_TYPE (ctor));
-
- /* If there are "lots" of zeros, then block clear the object first. */
- if (num_type_elements - num_nonzero_elements > CLEAR_RATIO
- && num_nonzero_elements < num_type_elements/4)
- cleared = true;
-
- /* ??? This bit ought not be needed. For any element not present
- in the initializer, we should simply set them to zero. Except
- we'd need to *find* the elements that are not present, and that
- requires trickery to avoid quadratic compile-time behavior in
- large cases or excessive memory use in small cases. */
- else if (num_ctor_elements < num_type_elements)
- cleared = true;
-
if (cleared)
{
/* Zap the CONSTRUCTOR element list, which simplifies this case.
@@ -2846,6 +2874,62 @@ gimplify_init_constructor (tree *expr_p, tree *pre_p,
return GS_ALL_DONE;
}
+/* Given a pointer value OP0, return a simplified version of an
+ indirection through OP0, or NULL_TREE if no simplification is
+ possible. This may only be applied to a rhs of an expression.
+ Note that the resulting type may be different from the type pointed
+ to in the sense that it is still compatible from the langhooks
+ point of view. */
+
+static tree
+fold_indirect_ref_rhs (tree t)
+{
+ tree type = TREE_TYPE (TREE_TYPE (t));
+ tree sub = t;
+ tree subtype;
+
+ STRIP_NOPS (sub);
+ subtype = TREE_TYPE (sub);
+ if (!POINTER_TYPE_P (subtype))
+ return NULL_TREE;
+
+ if (TREE_CODE (sub) == ADDR_EXPR)
+ {
+ tree op = TREE_OPERAND (sub, 0);
+ tree optype = TREE_TYPE (op);
+ /* *&p => p */
+ if (lang_hooks.types_compatible_p (type, optype))
+ return op;
+ /* *(foo *)&fooarray => fooarray[0] */
+ else if (TREE_CODE (optype) == ARRAY_TYPE
+ && lang_hooks.types_compatible_p (type, TREE_TYPE (optype)))
+ {
+ tree type_domain = TYPE_DOMAIN (optype);
+ tree min_val = size_zero_node;
+ if (type_domain && TYPE_MIN_VALUE (type_domain))
+ min_val = TYPE_MIN_VALUE (type_domain);
+ return build4 (ARRAY_REF, type, op, min_val, NULL_TREE, NULL_TREE);
+ }
+ }
+
+ /* *(foo *)fooarrptr => (*fooarrptr)[0] */
+ if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
+ && lang_hooks.types_compatible_p (type, TREE_TYPE (TREE_TYPE (subtype))))
+ {
+ tree type_domain;
+ tree min_val = size_zero_node;
+ sub = fold_indirect_ref_rhs (sub);
+ if (! sub)
+ sub = build1 (INDIRECT_REF, TREE_TYPE (subtype), sub);
+ type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
+ if (type_domain && TYPE_MIN_VALUE (type_domain))
+ min_val = TYPE_MIN_VALUE (type_domain);
+ return build4 (ARRAY_REF, type, sub, min_val, NULL_TREE, NULL_TREE);
+ }
+
+ return NULL_TREE;
+}
+
/* Subroutine of gimplify_modify_expr to do simplifications of MODIFY_EXPRs
based on the code of the RHS. We loop for as long as something changes. */
@@ -2869,8 +2953,8 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
This kind of code arises in C++ when an object is bound
to a const reference, and if "x" is a TARGET_EXPR we want
to take advantage of the optimization below. */
- tree t = fold_indirect_ref (*from_p);
- if (t != *from_p)
+ tree t = fold_indirect_ref_rhs (TREE_OPERAND (*from_p, 0));
+ if (t)
{
*from_p = t;
ret = GS_OK;
@@ -2939,6 +3023,45 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
return ret;
}
+/* Promote partial stores to COMPLEX variables to total stores. *EXPR_P is
+ a MODIFY_EXPR with a lhs of a REAL/IMAGPART_EXPR of a variable with
+ DECL_COMPLEX_GIMPLE_REG_P set. */
+
+static enum gimplify_status
+gimplify_modify_expr_complex_part (tree *expr_p, tree *pre_p, bool want_value)
+{
+ enum tree_code code, ocode;
+ tree lhs, rhs, new_rhs, other, realpart, imagpart;
+
+ lhs = TREE_OPERAND (*expr_p, 0);
+ rhs = TREE_OPERAND (*expr_p, 1);
+ code = TREE_CODE (lhs);
+ lhs = TREE_OPERAND (lhs, 0);
+
+ ocode = code == REALPART_EXPR ? IMAGPART_EXPR : REALPART_EXPR;
+ other = build1 (ocode, TREE_TYPE (rhs), lhs);
+ other = get_formal_tmp_var (other, pre_p);
+
+ realpart = code == REALPART_EXPR ? rhs : other;
+ imagpart = code == REALPART_EXPR ? other : rhs;
+
+ if (TREE_CONSTANT (realpart) && TREE_CONSTANT (imagpart))
+ new_rhs = build_complex (TREE_TYPE (lhs), realpart, imagpart);
+ else
+ new_rhs = build2 (COMPLEX_EXPR, TREE_TYPE (lhs), realpart, imagpart);
+
+ TREE_OPERAND (*expr_p, 0) = lhs;
+ TREE_OPERAND (*expr_p, 1) = new_rhs;
+
+ if (want_value)
+ {
+ append_to_statement_list (*expr_p, pre_p);
+ *expr_p = rhs;
+ }
+
+ return GS_ALL_DONE;
+}
+
/* Gimplify the MODIFY_EXPR node pointed by EXPR_P.
modify_expr
@@ -3014,10 +3137,18 @@ gimplify_modify_expr (tree *expr_p, tree *pre_p, tree *post_p, bool want_value)
}
}
+ /* Transform partial stores to non-addressable complex variables into
+ total stores. This allows us to use real instead of virtual operands
+ for these variables, which improves optimization. */
+ if ((TREE_CODE (*to_p) == REALPART_EXPR
+ || TREE_CODE (*to_p) == IMAGPART_EXPR)
+ && is_gimple_reg (TREE_OPERAND (*to_p, 0)))
+ return gimplify_modify_expr_complex_part (expr_p, pre_p, want_value);
+
if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p))
{
/* If we've somehow already got an SSA_NAME on the LHS, then
- we're probably modifying it twice. Not good. */
+ we're probably modified it twice. Not good. */
gcc_assert (TREE_CODE (*to_p) != SSA_NAME);
*to_p = make_ssa_name (*to_p, *expr_p);
}
@@ -4112,7 +4243,7 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
/* If this is a local variable sized decl, it must be accessed
indirectly. Perform that substitution. */
- if (DECL_VALUE_EXPR (tmp))
+ if (DECL_HAS_VALUE_EXPR_P (tmp))
{
*expr_p = unshare_expr (DECL_VALUE_EXPR (tmp));
ret = GS_OK;
@@ -4353,21 +4484,21 @@ gimplify_type_sizes (tree type, tree *list_p)
{
tree field, t;
- /* Note that we do not check for TYPE_SIZES_GIMPLIFIED already set because
- that's not supposed to happen on types where gimplification does anything.
- We should assert that it isn't set, but we can indeed be called multiple
- times on pointers. Unfortunately, this includes fat pointers which we
- can't easily test for. We could pass TYPE down to gimplify_one_sizepos
- and test there, but it doesn't seem worth it. */
+ if (type == NULL)
+ return;
/* We first do the main variant, then copy into any other variants. */
type = TYPE_MAIN_VARIANT (type);
+ /* Avoid infinite recursion. */
+ if (TYPE_SIZES_GIMPLIFIED (type)
+ || type == error_mark_node)
+ return;
+
+ TYPE_SIZES_GIMPLIFIED (type) = 1;
+
switch (TREE_CODE (type))
{
- case ERROR_MARK:
- return;
-
case INTEGER_TYPE:
case ENUMERAL_TYPE:
case BOOLEAN_TYPE:
@@ -4380,17 +4511,13 @@ gimplify_type_sizes (tree type, tree *list_p)
{
TYPE_MIN_VALUE (t) = TYPE_MIN_VALUE (type);
TYPE_MAX_VALUE (t) = TYPE_MAX_VALUE (type);
- TYPE_SIZES_GIMPLIFIED (t) = 1;
}
break;
case ARRAY_TYPE:
/* These types may not have declarations, so handle them here. */
- if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (type)))
- gimplify_type_sizes (TREE_TYPE (type), list_p);
-
- if (!TYPE_SIZES_GIMPLIFIED (TYPE_DOMAIN (type)))
- gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
+ gimplify_type_sizes (TREE_TYPE (type), list_p);
+ gimplify_type_sizes (TYPE_DOMAIN (type), list_p);
break;
case RECORD_TYPE:
@@ -4398,7 +4525,15 @@ gimplify_type_sizes (tree type, tree *list_p)
case QUAL_UNION_TYPE:
for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
if (TREE_CODE (field) == FIELD_DECL)
- gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
+ {
+ gimplify_one_sizepos (&DECL_FIELD_OFFSET (field), list_p);
+ gimplify_type_sizes (TREE_TYPE (field), list_p);
+ }
+ break;
+
+ case POINTER_TYPE:
+ case REFERENCE_TYPE:
+ gimplify_type_sizes (TREE_TYPE (type), list_p);
break;
default:
@@ -4414,8 +4549,6 @@ gimplify_type_sizes (tree type, tree *list_p)
TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (type);
TYPE_SIZES_GIMPLIFIED (t) = 1;
}
-
- TYPE_SIZES_GIMPLIFIED (type) = 1;
}
/* A subroutine of gimplify_type_sizes to make sure that *EXPR_P,
@@ -4596,7 +4729,7 @@ gimplify_body (tree *body_p, tree fndecl, bool do_parms)
void
gimplify_function_tree (tree fndecl)
{
- tree oldfn;
+ tree oldfn, parm, ret;
oldfn = current_function_decl;
current_function_decl = fndecl;
@@ -4604,6 +4737,22 @@ gimplify_function_tree (tree fndecl)
if (cfun == NULL)
allocate_struct_function (fndecl);
+ for (parm = DECL_ARGUMENTS (fndecl); parm ; parm = TREE_CHAIN (parm))
+ {
+ /* Preliminarily mark non-addressed complex variables as eligible
+ for promotion to gimple registers. We'll transform their uses
+ as we find them. */
+ if (TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
+ && !TREE_THIS_VOLATILE (parm)
+ && !needs_to_live_in_memory (parm))
+ DECL_COMPLEX_GIMPLE_REG_P (parm) = 1;
+ }
+
+ ret = DECL_RESULT (fndecl);
+ if (TREE_CODE (TREE_TYPE (ret)) == COMPLEX_TYPE
+ && !needs_to_live_in_memory (ret))
+ DECL_COMPLEX_GIMPLE_REG_P (ret) = 1;
+
gimplify_body (&DECL_SAVED_TREE (fndecl), fndecl, true);
/* If we're instrumenting function entry/exit, then prepend the call to
diff --git a/gcc/global.c b/gcc/global.c
index 34fcc1dd9e8..d297d33bb84 100644
--- a/gcc/global.c
+++ b/gcc/global.c
@@ -2083,8 +2083,8 @@ mark_reg_change (rtx reg, rtx setter, void *data)
/* Classes of registers which could be early clobbered in the current
insn. */
-DEF_VEC_P(int);
-DEF_VEC_ALLOC_P(int,heap);
+DEF_VEC_I(int);
+DEF_VEC_ALLOC_I(int,heap);
static VEC(int,heap) *earlyclobber_regclass;
diff --git a/gcc/gthr-posix.h b/gcc/gthr-posix.h
index 9b56b5aec51..938b4f15dd9 100644
--- a/gcc/gthr-posix.h
+++ b/gcc/gthr-posix.h
@@ -548,6 +548,7 @@ __gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *mutex)
r = pthread_mutexattr_destroy (&attr);
return r;
}
+ return 0;
}
#endif
diff --git a/gcc/hooks.c b/gcc/hooks.c
index 6e6e7c70321..23038ff3612 100644
--- a/gcc/hooks.c
+++ b/gcc/hooks.c
@@ -249,3 +249,10 @@ hook_tree_tree_tree_bool_null (tree t0 ATTRIBUTE_UNUSED, tree t1 ATTRIBUTE_UNUSE
{
return NULL;
}
+
+/* Generic hook that takes a rtx and returns a NULL string. */
+const char *
+hook_constcharptr_rtx_null (rtx r ATTRIBUTE_UNUSED)
+{
+ return NULL;
+}
diff --git a/gcc/hooks.h b/gcc/hooks.h
index b799a8c0709..2d9b3a3bde7 100644
--- a/gcc/hooks.h
+++ b/gcc/hooks.h
@@ -65,4 +65,5 @@ extern rtx hook_rtx_tree_int_null (tree, int);
extern tree hook_tree_tree_tree_tree_3rd_identity (tree, tree, tree);
extern const char *hook_constcharptr_tree_null (tree);
extern tree hook_tree_tree_tree_bool_null (tree, tree, bool);
+extern const char *hook_constcharptr_rtx_null (rtx);
#endif
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index be02aaa7d24..d4b66a58f7a 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -687,7 +687,61 @@ noce_emit_move_insn (rtx x, rtx y)
if (GET_CODE (x) != STRICT_LOW_PART)
{
- emit_move_insn (x, y);
+ rtx seq, insn, target;
+ optab ot;
+
+ start_sequence ();
+ /* Check that the SET_SRC is reasonable before calling emit_move_insn,
+ otherwise construct a suitable SET pattern ourselves. */
+ insn = (OBJECT_P (y) || CONSTANT_P (y) || GET_CODE (y) == SUBREG)
+ ? emit_move_insn (x, y)
+ : emit_insn (gen_rtx_SET (VOIDmode, x, y));
+ seq = get_insns ();
+ end_sequence();
+
+ if (recog_memoized (insn) <= 0)
+ switch (GET_RTX_CLASS (GET_CODE (y)))
+ {
+ case RTX_UNARY:
+ ot = code_to_optab[GET_CODE (y)];
+ if (ot)
+ {
+ start_sequence ();
+ target = expand_unop (GET_MODE (y), ot, XEXP (y, 0), x, 0);
+ if (target != NULL_RTX)
+ {
+ if (target != x)
+ emit_move_insn (x, target);
+ seq = get_insns ();
+ }
+ end_sequence ();
+ }
+ break;
+
+ case RTX_BIN_ARITH:
+ case RTX_COMM_ARITH:
+ ot = code_to_optab[GET_CODE (y)];
+ if (ot)
+ {
+ start_sequence ();
+ target = expand_binop (GET_MODE (y), ot,
+ XEXP (y, 0), XEXP (y, 1),
+ x, 0, OPTAB_DIRECT);
+ if (target != NULL_RTX)
+ {
+ if (target != x)
+ emit_move_insn (x, target);
+ seq = get_insns ();
+ }
+ end_sequence ();
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ emit_insn (seq);
return;
}
@@ -1815,6 +1869,105 @@ noce_try_sign_mask (struct noce_if_info *if_info)
}
+/* Optimize away "if (x & C) x |= C" and similar bit manipulation
+ transformations. */
+
+static int
+noce_try_bitop (struct noce_if_info *if_info)
+{
+ rtx cond, x, a, result, seq;
+ enum machine_mode mode;
+ enum rtx_code code;
+ int bitnum;
+
+ x = if_info->x;
+ cond = if_info->cond;
+ code = GET_CODE (cond);
+
+ /* Check for no else condition. */
+ if (! rtx_equal_p (x, if_info->b))
+ return FALSE;
+
+ /* Check for a suitable condition. */
+ if (code != NE && code != EQ)
+ return FALSE;
+ if (XEXP (cond, 1) != const0_rtx)
+ return FALSE;
+ cond = XEXP (cond, 0);
+
+ /* ??? We could also handle AND here. */
+ if (GET_CODE (cond) == ZERO_EXTRACT)
+ {
+ if (XEXP (cond, 1) != const1_rtx
+ || GET_CODE (XEXP (cond, 2)) != CONST_INT
+ || ! rtx_equal_p (x, XEXP (cond, 0)))
+ return FALSE;
+ bitnum = INTVAL (XEXP (cond, 2));
+ mode = GET_MODE (x);
+ if (bitnum >= HOST_BITS_PER_WIDE_INT)
+ return FALSE;
+ }
+ else
+ return FALSE;
+
+ a = if_info->a;
+ if (GET_CODE (a) == IOR || GET_CODE (a) == XOR)
+ {
+ /* Check for "if (X & C) x = x op C". */
+ if (! rtx_equal_p (x, XEXP (a, 0))
+ || GET_CODE (XEXP (a, 1)) != CONST_INT
+ || (INTVAL (XEXP (a, 1)) & GET_MODE_MASK (mode))
+ != (unsigned HOST_WIDE_INT) 1 << bitnum)
+ return FALSE;
+
+ /* if ((x & C) == 0) x |= C; is transformed to x |= C. */
+ /* if ((x & C) != 0) x |= C; is transformed to nothing. */
+ if (GET_CODE (a) == IOR)
+ result = (code == NE) ? a : NULL_RTX;
+ else if (code == NE)
+ {
+ /* if ((x & C) == 0) x ^= C; is transformed to x |= C. */
+ result = gen_int_mode ((HOST_WIDE_INT) 1 << bitnum, mode);
+ result = simplify_gen_binary (IOR, mode, x, result);
+ }
+ else
+ {
+ /* if ((x & C) != 0) x ^= C; is transformed to x &= ~C. */
+ result = gen_int_mode (~((HOST_WIDE_INT) 1 << bitnum), mode);
+ result = simplify_gen_binary (AND, mode, x, result);
+ }
+ }
+ else if (GET_CODE (a) == AND)
+ {
+ /* Check for "if (X & C) x &= ~C". */
+ if (! rtx_equal_p (x, XEXP (a, 0))
+ || GET_CODE (XEXP (a, 1)) != CONST_INT
+ || (INTVAL (XEXP (a, 1)) & GET_MODE_MASK (mode))
+ != (~((HOST_WIDE_INT) 1 << bitnum) & GET_MODE_MASK (mode)))
+ return FALSE;
+
+ /* if ((x & C) == 0) x &= ~C; is transformed to nothing. */
+ /* if ((x & C) != 0) x &= ~C; is transformed to x &= ~C. */
+ result = (code == EQ) ? a : NULL_RTX;
+ }
+ else
+ return FALSE;
+
+ if (result)
+ {
+ start_sequence ();
+ noce_emit_move_insn (x, result);
+ seq = end_ifcvt_sequence (if_info);
+ if (!seq)
+ return FALSE;
+
+ emit_insn_before_setloc (seq, if_info->jump,
+ INSN_LOCATOR (if_info->insn_a));
+ }
+ return TRUE;
+}
+
+
/* Similar to get_condition, only the resulting condition must be
valid at JUMP, instead of at EARLIEST. */
@@ -2078,6 +2231,8 @@ noce_process_if_block (struct ce_if_block * ce_info)
goto success;
if (noce_try_store_flag (&if_info))
goto success;
+ if (noce_try_bitop (&if_info))
+ goto success;
if (noce_try_minmax (&if_info))
goto success;
if (noce_try_abs (&if_info))
@@ -3275,12 +3430,31 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb,
/* Move the insns out of MERGE_BB to before the branch. */
if (head != NULL)
{
+ rtx insn;
+
if (end == BB_END (merge_bb))
BB_END (merge_bb) = PREV_INSN (head);
if (squeeze_notes (&head, &end))
return TRUE;
+ /* PR 21767: When moving insns above a conditional branch, REG_EQUAL
+ notes might become invalid. */
+ insn = head;
+ do
+ {
+ rtx note, set;
+
+ if (! INSN_P (insn))
+ continue;
+ note = find_reg_note (insn, REG_EQUAL, NULL_RTX);
+ if (! note)
+ continue;
+ set = single_set (insn);
+ if (!set || !function_invariant_p (SET_SRC (set)))
+ remove_note (insn, note);
+ } while (insn != end && (insn = NEXT_INSN (insn)));
+
reorder_insns (head, end, PREV_INSN (earliest));
}
diff --git a/gcc/integrate.c b/gcc/integrate.c
index 0f5cfcf1544..e6e0867d6bc 100644
--- a/gcc/integrate.c
+++ b/gcc/integrate.c
@@ -107,6 +107,7 @@ copy_decl_for_inlining (tree decl, tree from_fn, tree to_fn)
TREE_ADDRESSABLE (copy) = TREE_ADDRESSABLE (decl);
TREE_READONLY (copy) = TREE_READONLY (decl);
TREE_THIS_VOLATILE (copy) = TREE_THIS_VOLATILE (decl);
+ DECL_COMPLEX_GIMPLE_REG_P (copy) = DECL_COMPLEX_GIMPLE_REG_P (decl);
}
else
{
diff --git a/gcc/intl.h b/gcc/intl.h
index 1166794ed74..cca596d984d 100644
--- a/gcc/intl.h
+++ b/gcc/intl.h
@@ -51,6 +51,10 @@ extern size_t gcc_gettext_width (const char *);
# define N_(msgid) msgid
#endif
+#ifndef G_
+# define G_(gmsgid) gmsgid
+#endif
+
extern const char *open_quote;
extern const char *close_quote;
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index 79150d2ba9a..5a336ff1b1b 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -78,12 +78,15 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "fibheap.h"
#include "intl.h"
#include "tree-pass.h"
+#include "coverage.h"
/* Statistics we collect about inlining algorithm. */
static int ncalls_inlined;
static int nfunctions_inlined;
static int initial_insns;
static int overall_insns;
+static int max_insns;
+static gcov_type max_count;
/* Estimate size of the function after inlining WHAT into TO. */
@@ -91,12 +94,15 @@ static int
cgraph_estimate_size_after_inlining (int times, struct cgraph_node *to,
struct cgraph_node *what)
{
- tree fndecl = what->decl;
- tree arg;
+ int size;
+ tree fndecl = what->decl, arg;
int call_insns = PARAM_VALUE (PARAM_INLINE_CALL_COST);
+
for (arg = DECL_ARGUMENTS (fndecl); arg; arg = TREE_CHAIN (arg))
call_insns += estimate_move_cost (TREE_TYPE (arg));
- return (what->global.insns - call_insns) * times + to->global.insns;
+ size = (what->global.insns - call_insns) * times + to->global.insns;
+ gcc_assert (size >= 0);
+ return size;
}
/* E is expected to be an edge being inlined. Clone destination node of
@@ -209,6 +215,8 @@ cgraph_estimate_growth (struct cgraph_node *node)
{
int growth = 0;
struct cgraph_edge *e;
+ if (node->global.estimated_growth != INT_MIN)
+ return node->global.estimated_growth;
for (e = node->callers; e; e = e->next_caller)
if (e->inline_failed)
@@ -221,6 +229,7 @@ cgraph_estimate_growth (struct cgraph_node *node)
if (!node->needed && !DECL_EXTERNAL (node->decl))
growth -= node->global.insns;
+ node->global.estimated_growth = growth;
return growth;
}
@@ -298,52 +307,145 @@ cgraph_recursive_inlining_p (struct cgraph_node *to,
return recursive;
}
-/* Recompute heap nodes for each of callees. */
+/* Return true if the call can be hot. */
+static bool
+cgraph_maybe_hot_edge_p (struct cgraph_edge *edge)
+{
+ if (profile_info && flag_branch_probabilities
+ && (edge->count
+ <= profile_info->sum_max / PARAM_VALUE (HOT_BB_COUNT_FRACTION)))
+ return false;
+ return true;
+}
+
+/* A cost model driving the inlining heuristics in a way so the edges with
+ smallest badness are inlined first. After each inlining is performed
+ the costs of all caller edges of nodes affected are recomputed so the
+ metrics may accurately depend on values such as number of inlinable callers
+ of the function or function body size.
+
+ For the moment we use estimated growth caused by inlining callee into all
+ it's callers for driving the inlining but once we have loop depth or
+ frequency information readily available we should do better.
+
+ With profiling we use number of executions of each edge to drive the cost.
+ We also should distinguish hot and cold calls where the cold calls are
+ inlined into only when code size is overall improved.
+
+ Value INT_MAX can be returned to prevent function from being inlined.
+ */
+
+static int
+cgraph_edge_badness (struct cgraph_edge *edge)
+{
+ if (max_count)
+ {
+ int growth =
+ cgraph_estimate_size_after_inlining (1, edge->caller, edge->callee);
+ growth -= edge->caller->global.insns;
+
+ /* Always prefer inlining saving code size. */
+ if (growth <= 0)
+ return INT_MIN - growth;
+ return ((int)((double)edge->count * INT_MIN / max_count)) / growth;
+ }
+ else
+ {
+ int nest = MIN (edge->loop_nest, 8);
+ int badness = cgraph_estimate_growth (edge->callee) * 256;
+
+ badness >>= nest;
+
+ /* Make recursive inlining happen always after other inlining is done. */
+ if (cgraph_recursive_inlining_p (edge->caller, edge->callee, NULL))
+ return badness + 1;
+ else
+ return badness;
+ }
+}
+
+/* Recompute heap nodes for each of caller edge. */
+
+static void
+update_caller_keys (fibheap_t heap, struct cgraph_node *node,
+ bitmap updated_nodes)
+{
+ struct cgraph_edge *edge;
+
+ if (!node->local.inlinable || node->local.disregard_inline_limits
+ || node->global.inlined_to)
+ return;
+ if (bitmap_bit_p (updated_nodes, node->uid))
+ return;
+ bitmap_set_bit (updated_nodes, node->uid);
+
+ for (edge = node->callers; edge; edge = edge->next_caller)
+ if (edge->inline_failed)
+ {
+ int badness = cgraph_edge_badness (edge);
+ if (edge->aux)
+ {
+ fibnode_t n = edge->aux;
+ gcc_assert (n->data == edge);
+ if (n->key == badness)
+ continue;
+
+ /* fibheap_replace_key only increase the keys. */
+ if (fibheap_replace_key (heap, n, badness))
+ continue;
+ fibheap_delete_node (heap, edge->aux);
+ }
+ edge->aux = fibheap_insert (heap, badness, edge);
+ }
+}
+
+/* Recompute heap nodes for each of caller edges of each of callees. */
+
static void
-update_callee_keys (fibheap_t heap, struct fibnode **heap_node,
- struct cgraph_node *node)
+update_callee_keys (fibheap_t heap, struct cgraph_node *node,
+ bitmap updated_nodes)
{
struct cgraph_edge *e;
+ node->global.estimated_growth = INT_MIN;
for (e = node->callees; e; e = e->next_callee)
- if (e->inline_failed && heap_node[e->callee->uid])
- fibheap_replace_key (heap, heap_node[e->callee->uid],
- cgraph_estimate_growth (e->callee));
+ if (e->inline_failed)
+ update_caller_keys (heap, e->callee, updated_nodes);
else if (!e->inline_failed)
- update_callee_keys (heap, heap_node, e->callee);
+ update_callee_keys (heap, e->callee, updated_nodes);
}
-/* Enqueue all recursive calls from NODE into queue linked via aux pointers
- in between FIRST and LAST. WHERE is used for bookkeeping while looking
- int calls inlined within NODE. */
+/* Enqueue all recursive calls from NODE into priority queue depending on
+ how likely we want to recursively inline the call. */
+
static void
lookup_recursive_calls (struct cgraph_node *node, struct cgraph_node *where,
- struct cgraph_edge **first, struct cgraph_edge **last)
+ fibheap_t heap)
{
+ static int priority;
struct cgraph_edge *e;
for (e = where->callees; e; e = e->next_callee)
if (e->callee == node)
{
- if (!*first)
- *first = e;
- else
- (*last)->aux = e;
- *last = e;
+ /* FIXME: Once counts and frequencies are available we should drive the
+ order by these. For now force the order to be simple queue since
+ we get order dependent on recursion depth for free by this. */
+ fibheap_insert (heap, priority++, e);
}
for (e = where->callees; e; e = e->next_callee)
if (!e->inline_failed)
- lookup_recursive_calls (node, e->callee, first, last);
+ lookup_recursive_calls (node, e->callee, heap);
}
/* Decide on recursive inlining: in the case function has recursive calls,
inline until body size reaches given argument. */
-static void
+
+static bool
cgraph_decide_recursive_inlining (struct cgraph_node *node)
{
int limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE_AUTO);
int max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH_AUTO);
- struct cgraph_edge *first_call = NULL, *last_call = NULL;
- struct cgraph_edge *last_in_current_depth;
+ fibheap_t heap;
struct cgraph_edge *e;
struct cgraph_node *master_clone;
int depth = 0;
@@ -358,14 +460,18 @@ cgraph_decide_recursive_inlining (struct cgraph_node *node)
/* Make sure that function is small enough to be considered for inlining. */
if (!max_depth
|| cgraph_estimate_size_after_inlining (1, node, node) >= limit)
- return;
- lookup_recursive_calls (node, node, &first_call, &last_call);
- if (!first_call)
- return;
+ return false;
+ heap = fibheap_new ();
+ lookup_recursive_calls (node, node, heap);
+ if (fibheap_empty (heap))
+ {
+ fibheap_delete (heap);
+ return false;
+ }
if (dump_file)
fprintf (dump_file,
- "\nPerforming recursive inlining on %s\n",
+ " Performing recursive inlining on %s\n",
cgraph_node_name (node));
/* We need original clone to copy around. */
@@ -376,32 +482,30 @@ cgraph_decide_recursive_inlining (struct cgraph_node *node)
cgraph_clone_inlined_nodes (e, true);
/* Do the inlining and update list of recursive call during process. */
- last_in_current_depth = last_call;
- while (first_call
+ while (!fibheap_empty (heap)
&& cgraph_estimate_size_after_inlining (1, node, master_clone) <= limit)
{
- struct cgraph_edge *curr = first_call;
-
- first_call = first_call->aux;
- curr->aux = NULL;
+ struct cgraph_edge *curr = fibheap_extract_min (heap);
+ struct cgraph_node *node;
+
+ depth = 0;
+ for (node = curr->caller;
+ node; node = node->global.inlined_to)
+ if (node->decl == curr->callee->decl)
+ depth++;
+ if (depth > max_depth)
+ continue;
+ if (dump_file)
+ fprintf (dump_file,
+ " Inlining call of depth %i\n", depth);
cgraph_redirect_edge_callee (curr, master_clone);
cgraph_mark_inline_edge (curr);
- lookup_recursive_calls (node, curr->callee, &first_call, &last_call);
-
- if (last_in_current_depth
- && ++depth >= max_depth)
- break;
+ lookup_recursive_calls (node, curr->callee, heap);
n++;
}
- /* Cleanup queue pointers. */
- while (first_call)
- {
- struct cgraph_edge *next = first_call->aux;
- first_call->aux = NULL;
- first_call = next;
- }
+ fibheap_delete (heap);
if (dump_file)
fprintf (dump_file,
"\n Inlined %i times, body grown from %i to %i insns\n", n,
@@ -415,6 +519,7 @@ cgraph_decide_recursive_inlining (struct cgraph_node *node)
if (node->global.inlined_to == master_clone)
cgraph_remove_node (node);
cgraph_remove_node (master_clone);
+ return true;
}
/* Set inline_failed for all callers of given function to REASON. */
@@ -442,11 +547,12 @@ static void
cgraph_decide_inlining_of_small_functions (void)
{
struct cgraph_node *node;
+ struct cgraph_edge *edge;
fibheap_t heap = fibheap_new ();
- struct fibnode **heap_node =
- xcalloc (cgraph_max_uid, sizeof (struct fibnode *));
- int max_insns = ((HOST_WIDEST_INT) initial_insns
- * (100 + PARAM_VALUE (PARAM_INLINE_UNIT_GROWTH)) / 100);
+ bitmap updated_nodes = BITMAP_ALLOC (NULL);
+
+ if (dump_file)
+ fprintf (dump_file, "\nDeciding on smaller functions:\n");
/* Put all inline candidates into the heap. */
@@ -455,87 +561,161 @@ cgraph_decide_inlining_of_small_functions (void)
if (!node->local.inlinable || !node->callers
|| node->local.disregard_inline_limits)
continue;
+ if (dump_file)
+ fprintf (dump_file, "Considering inline candidate %s.\n", cgraph_node_name (node));
+ node->global.estimated_growth = INT_MIN;
if (!cgraph_default_inline_p (node))
{
cgraph_set_inline_failed (node,
N_("--param max-inline-insns-single limit reached"));
continue;
}
- heap_node[node->uid] =
- fibheap_insert (heap, cgraph_estimate_growth (node), node);
- }
- if (dump_file)
- fprintf (dump_file, "\nDeciding on smaller functions:\n");
- while (overall_insns <= max_insns && (node = fibheap_extract_min (heap)))
+ for (edge = node->callers; edge; edge = edge->next_caller)
+ if (edge->inline_failed)
+ {
+ gcc_assert (!edge->aux);
+ edge->aux = fibheap_insert (heap, cgraph_edge_badness (edge), edge);
+ }
+ }
+ while (overall_insns <= max_insns && (edge = fibheap_extract_min (heap)))
{
- struct cgraph_edge *e, *next;
int old_insns = overall_insns;
+ struct cgraph_node *where;
+ int growth =
+ cgraph_estimate_size_after_inlining (1, edge->caller, edge->callee);
+
+ growth -= edge->caller->global.insns;
- heap_node[node->uid] = NULL;
if (dump_file)
- fprintf (dump_file,
- "\nConsidering %s with %i insns\n"
- " Estimated growth is %+i insns.\n",
- cgraph_node_name (node), node->global.insns,
- cgraph_estimate_growth (node));
- if (!cgraph_default_inline_p (node))
{
- cgraph_set_inline_failed (node,
- N_("--param max-inline-insns-single limit reached after inlining into the callee"));
- continue;
+ fprintf (dump_file,
+ "\nConsidering %s with %i insns to be inlined into %s\n"
+ " Estimated growth after inlined into all callees is %+i insns.\n"
+ " Estimated badness is %i.\n",
+ cgraph_node_name (edge->callee),
+ edge->callee->global.insns,
+ cgraph_node_name (edge->caller),
+ cgraph_estimate_growth (edge->callee),
+ cgraph_edge_badness (edge));
+ if (edge->count)
+ fprintf (dump_file," Called "HOST_WIDEST_INT_PRINT_DEC"x\n", edge->count);
}
- for (e = node->callers; e; e = next)
- {
- next = e->next_caller;
- if (e->inline_failed)
- {
- struct cgraph_node *where;
-
- if (cgraph_recursive_inlining_p (e->caller, e->callee,
- &e->inline_failed)
- || !cgraph_check_inline_limits (e->caller, e->callee,
- &e->inline_failed))
- {
- if (dump_file)
- fprintf (dump_file, " Not inlining into %s:%s.\n",
- cgraph_node_name (e->caller), e->inline_failed);
- continue;
- }
- next = cgraph_mark_inline (e);
- where = e->caller;
- if (where->global.inlined_to)
- where = where->global.inlined_to;
+ gcc_assert (edge->aux);
+ edge->aux = NULL;
+ if (!edge->inline_failed)
+ continue;
- if (heap_node[where->uid])
- fibheap_replace_key (heap, heap_node[where->uid],
- cgraph_estimate_growth (where));
+ /* When not having profile info ready we don't weight by any way the
+ position of call in procedure itself. This means if call of
+ function A from function B seems profitable to inline, the recursive
+ call of function A in inline copy of A in B will look profitable too
+ and we end up inlining until reaching maximal function growth. This
+ is not good idea so prohibit the recursive inlining.
+ ??? When the frequencies are taken into account we might not need this
+ restriction. */
+ if (!max_count)
+ {
+ where = edge->caller;
+ while (where->global.inlined_to)
+ {
+ if (where->decl == edge->callee->decl)
+ break;
+ where = where->callers->caller;
+ }
+ if (where->global.inlined_to)
+ {
+ edge->inline_failed
+ = (edge->callee->local.disregard_inline_limits ? N_("recursive inlining") : "");
if (dump_file)
- fprintf (dump_file,
- " Inlined into %s which now has %i insns.\n",
- cgraph_node_name (e->caller),
- e->caller->global.insns);
+ fprintf (dump_file, " inline_failed:Recursive inlining performed only for function itself.\n");
+ continue;
}
}
- cgraph_decide_recursive_inlining (node);
-
- /* Similarly all functions called by the function we just inlined
- are now called more times; update keys. */
- update_callee_keys (heap, heap_node, node);
+ if (!cgraph_maybe_hot_edge_p (edge) && growth > 0)
+ {
+ if (!cgraph_recursive_inlining_p (edge->caller, edge->callee,
+ &edge->inline_failed))
+ {
+ edge->inline_failed =
+ N_("call is unlikely");
+ if (dump_file)
+ fprintf (dump_file, " inline_failed:%s.\n", edge->inline_failed);
+ }
+ continue;
+ }
+ if (!cgraph_default_inline_p (edge->callee))
+ {
+ if (!cgraph_recursive_inlining_p (edge->caller, edge->callee,
+ &edge->inline_failed))
+ {
+ edge->inline_failed =
+ N_("--param max-inline-insns-single limit reached after inlining into the callee");
+ if (dump_file)
+ fprintf (dump_file, " inline_failed:%s.\n", edge->inline_failed);
+ }
+ continue;
+ }
+ if (cgraph_recursive_inlining_p (edge->caller, edge->callee,
+ &edge->inline_failed))
+ {
+ where = edge->caller;
+ if (where->global.inlined_to)
+ where = where->global.inlined_to;
+ if (!cgraph_decide_recursive_inlining (where))
+ continue;
+ update_callee_keys (heap, where, updated_nodes);
+ }
+ else
+ {
+ if (!cgraph_check_inline_limits (edge->caller, edge->callee,
+ &edge->inline_failed))
+ {
+ if (dump_file)
+ fprintf (dump_file, " Not inlining into %s:%s.\n",
+ cgraph_node_name (edge->caller), edge->inline_failed);
+ continue;
+ }
+ cgraph_mark_inline_edge (edge);
+ update_callee_keys (heap, edge->callee, updated_nodes);
+ }
+ where = edge->caller;
+ if (where->global.inlined_to)
+ where = where->global.inlined_to;
+
+ /* Our profitability metric can depend on local properties
+ such as number of inlinable calls and size of the function body.
+ After inlining these properties might change for the function we
+ inlined into (since it's body size changed) and for the functions
+ called by function we inlined (since number of it inlinable callers
+ might change). */
+ update_caller_keys (heap, where, updated_nodes);
+ bitmap_clear (updated_nodes);
if (dump_file)
fprintf (dump_file,
+ " Inlined into %s which now has %i insns.\n",
+ cgraph_node_name (edge->caller),
+ edge->caller->global.insns);
+ if (dump_file)
+ fprintf (dump_file,
" Inlined for a net change of %+i insns.\n",
overall_insns - old_insns);
}
- while ((node = fibheap_extract_min (heap)) != NULL)
- if (!node->local.disregard_inline_limits)
- cgraph_set_inline_failed (node, N_("--param inline-unit-growth limit reached"));
+ while ((edge = fibheap_extract_min (heap)) != NULL)
+ {
+ gcc_assert (edge->aux);
+ edge->aux = NULL;
+ if (!edge->callee->local.disregard_inline_limits && edge->inline_failed
+ && !cgraph_recursive_inlining_p (edge->caller, edge->callee,
+ &edge->inline_failed))
+ edge->inline_failed = N_("--param inline-unit-growth limit reached");
+ }
fibheap_delete (heap);
- free (heap_node);
+ BITMAP_FREE (updated_nodes);
}
/* Decide on the inlining. We do so in the topological order to avoid
@@ -551,9 +731,21 @@ cgraph_decide_inlining (void)
int old_insns = 0;
int i;
+ timevar_push (TV_INLINE_HEURISTICS);
+ max_count = 0;
for (node = cgraph_nodes; node; node = node->next)
- initial_insns += node->local.self_insns;
+ {
+ struct cgraph_edge *e;
+ initial_insns += node->local.self_insns;
+ for (e = node->callees; e; e = e->next_callee)
+ if (max_count < e->count)
+ max_count = e->count;
+ }
overall_insns = initial_insns;
+ gcc_assert (!max_count || (profile_info && flag_branch_probabilities));
+
+ max_insns = ((HOST_WIDEST_INT) overall_insns
+ * (100 + PARAM_VALUE (PARAM_INLINE_UNIT_GROWTH)) / 100);
nnodes = cgraph_postorder (order);
@@ -665,11 +857,6 @@ cgraph_decide_inlining (void)
}
}
- /* We will never output extern functions we didn't inline.
- ??? Perhaps we can prevent accounting of growth of external
- inline functions. */
- cgraph_remove_unreachable_nodes (false, dump_file);
-
if (dump_file)
fprintf (dump_file,
"\nInlined %i calls, eliminated %i functions, "
@@ -677,6 +864,7 @@ cgraph_decide_inlining (void)
ncalls_inlined, nfunctions_inlined, initial_insns,
overall_insns);
free (order);
+ timevar_pop (TV_INLINE_HEURISTICS);
}
/* Decide on the inlining. We do so in the topological order to avoid
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 9cfbe0a5165..b6f6e3a694d 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,188 @@
+2005-06-15 Tom Tromey <tromey@redhat.com>
+
+ PR libgcj/21906:
+ * class.c (make_method_value): Use soft_abstractmethod_node for
+ abstract method.
+ * java-tree.h (soft_abstractmethod_node): New define.
+ (JTI_SOFT_ABSTRACTMETHOD_NODE): New enum constant.
+ * decl.c (java_init_decl_processing): Initialize
+ soft_abstractmethod_node.
+
+2005-06-13 Geoffrey Keating <geoffk@apple.com>
+
+ * Make-lang.in (rule for installing gcj.1): Depends on installdirs.
+
+2005-06-13 Per Bothner <per@bothner.com>
+
+ * expr.c (int highest_label_pc_this_method,
+ start_label_pc_this_method): New globals.
+ (lookup_label): Add start_label_pc_this_method to pc for label, and
+ update highest_label_pc_this_method. This prevents conflicts between
+ labels from different methods.
+ * java-tree.h: Declare new globals.
+ * jcf-parse.c (parse_class_file): If needed bump
+ start_label_pc_this_method and reset highest_label_pc_this_method.
+
+2005-06-13 Tom Tromey <tromey@redhat.com>
+
+ PR java/21844:
+ * parse.y (nested_field_access_p): Handle case where outer field
+ is inherited by enclosing class.
+
+2005-06-12 Per Bothner <per@bothner.com>
+
+ * class.c (inherits_from_p): Do load_class if needed.
+
+2005-06-09 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * gjavah.c (error): Add ATTRIBUTE_PRINTF_1.
+ * java-tree.h (parse_error_context): Move...
+ * parse.h (parse_error_context): ... here, add ATTRIBUTE_GCC_DIAG.
+ * parse.y (parse_warning_context): Add ATTRIBUTE_GCC_DIAG.
+ * verify-impl.c (debug_print): Add ATTRIBUTE_PRINTF_1.
+
+2005-06-08 Roger Sayle <roger@eyesopen.com>
+
+ * typeck.c (convert): Only clear TREE_OVERFLOW on INTEGER_CST nodes.
+
+2005-06-06 Jakub Jelinek <jakub@redhat.com>
+
+ * jv-scan.c (fatal_error, warning, warning0): Use gmsgid instead of
+ msgid for argument name.
+ * gjavah.c (error): Likewise.
+ * java-tree.h (parse_error_context): Likewise.
+ * parse.y (parse_error_context, parse_warning_context,
+ issue_warning_error_from_context): Likewise.
+
+2005-06-01 Tom Tromey <tromey@redhat.com>
+
+ PR java/21722:
+ * class.c (build_static_field_ref): Don't fold constant fields if
+ current class is from a .class file and we're using indirect
+ dispatch.
+
+2005-05-31 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * java/verify-glue.c: Don't include errors.h and include toplev.h.
+ * java/Make-lang.in: Updates dependencies.
+
+2005-05-26 Ranjit Mathew <rmathew@hotmail.com>
+
+ PR java/19870.
+ * java-tree.h (OUTER_FIELD_ACCESS_IDENTIFIER_P): Rename to
+ NESTED_FIELD_ACCESS_IDENTIFIER_P.
+ (FIELD_INNER_ACCESS): Rename to FIELD_NESTED_ACCESS.
+ (FIELD_INNER_ACCESS_P): Rename to FIELD_NESTED_ACCESS_P.
+ * jcf-write.c (generate_classfile): Use
+ NESTED_FIELD_ACCESS_IDENTIFIER_P instead of
+ OUTER_FIELD_ACCESS_IDENTIFIER_P.
+ * parse.y (build_outer_field_access): Rename to
+ build_nested_field_access. Support static fields and outer-to-inner
+ class accesses.
+ (outer_field_access_p): Rename to nested_field_access_p. Support
+ static fields and generalise to outer-to-inner class and sibling
+ inner class accesses.
+ (outer_field_expanded_access_p): Rename to
+ nested_field_expanded_access_p and support static fields.
+ (outer_field_access_fix): Rename to nested_field_access_fix and
+ support static fields.
+ (build_outer_field_access_expr): Rename to
+ build_nested_field_access_expr and support static fields.
+ (build_outer_field_access_methods): Rename to
+ build_nested_field_access_methods and support static fields. For
+ static fields, generate accessors without class instance parameters.
+ (build_outer_field_access_method): Rename to
+ build_nested_field_access_method and support static fields.
+ (build_outer_method_access_method): Use
+ NESTED_FIELD_ACCESS_IDENTIFIER_P instead of
+ OUTER_FIELD_ACCESS_IDENTIFIER_P.
+ (resolve_expression_name): Consider static field accesses across
+ nested classes.
+ (resolve_qualified_expression_name): Likewise.
+ (java_complete_lhs): Use nested_field_access_fix instead of
+ outer_field_access_fix.
+ (patch_unary_op): Rename outer_field_flag to nested_field_flag.
+ Use nested_field_expanded_access_p instead of
+ outer_field_expanded_access_p. Use nested_field_access_fix instead
+ of outer_field_access_fix.
+ (check_thrown_exceptions): Use NESTED_FIELD_ACCESS_IDENTIFIER_P
+ instead of OUTER_FIELD_ACCESS_IDENTIFIER_P.
+
+2005-05-26 Bryce McKinlay <mckinlay@redhat.com>
+
+ * decl.c (GCJ_BINARYCOMPAT_ADDITION,
+ GCJ_BOOTSTRAP_LOADER_ADDITION): Removed.
+ (FLAG_BINARYCOMPAT_ABI, FLAG_BOOTSTRAP_LOADER,
+ MINOR_BINARYCOMPAT_ABI_VERSION): New.
+ (GCJ_CURRENT_BC_ABI_VERSION): Use new method to calculate version ID.
+ (parse_version): Calculate version ID using new method. Use bit-flags
+ for flag_indirect_dispatch and flag_bootstrap_classes.
+
+2005-05-25 Richard Henderson <rth@redhat.com>
+
+ PR libgcj/21692
+ * Make-lang.in (java/mangle.o): Depend on LANGHOOKS_DEF_H.
+ * class.c (build_class_ref): Set DECL_CLASS_FIELD_P and
+ DECL_CONTEXT; avoid pushdecl_top_level.
+ (build_dtable_decl): Set DECL_VTABLE_P and DECL_CONTEXT.
+ (layout_class): Don't SET_DECL_ASSEMBLER_NAME.
+ (layout_class_method): Likewise.
+ * decl.c (java_mark_cni_decl_local): New.
+ (java_mark_class_local): Use it.
+ * java-tree.h (DECL_LOCAL_CNI_METHOD_P): New.
+ (DECL_CLASS_FIELD_P, DECL_VTABLE_P): New.
+ (struct lang_decl_func): Add local_cni;
+ (struct lang_decl_var): Add class_field, vtable.
+ (java_mangle_decl): Declare.
+ * lang.c (LANG_HOOKS_SET_DECL_ASSEMBLER_NAME): New.
+ * mangle.c: Remove dup obstack.h; include langhooks-def.h.
+ (mangle_obstack_1): New.
+ (java_mangle_decl): Remove obstack argument. Call mangle_class_field,
+ mangle_vtable, and mangle_local_cni_method_decl. Fall back to
+ lhd_set_decl_assembler_name for things that don't need mangling.
+ (mangle_class_field): Rename from java_mangle_class_field, make
+ static, don't call init_mangling or finish_mangling.
+ (mangle_vtable): Similarly.
+ (mangle_local_cni_method_decl): New.
+ (init_mangling): Remove obstack argument. Use &mangle_obstack_1,
+ gcc_assert, and MANGLE_RAW_STRING.
+ (finish_mangling): Use gcc_assert, remove if 0 debugging code.
+
+2005-05-25 DJ Delorie <dj@redhat.com>
+
+ * class.c (set_constant_value): Move warning control from if() to
+ warning(OPT_*).
+
+2005-05-24 Richard Henderson <rth@redhat.com>
+
+ * builtins.c (define_builtin): Don't call make_decl_rtl.
+ * constants.c (build_constant_data_ref): Likewise.
+ * class.c (build_utf8_ref): Likewise.
+ (build_fieldref_cache_entry, build_static_field_ref): Likewise.
+ (get_dispatch_table, layout_class_method): Likewise.
+ (build_class_ref): Likewise. Don't set DECL_SIZE or DECL_SIZE_UNIT
+ by hand.
+ (make_local_function_alias): Don't SET_DECL_ASSEMBLER_NAME.
+ (make_method_value): Use METHOD_ABSTRACT instead of DECL_RTL_SET_P
+ to determine if we need a non-zero address.
+ * decl.c (builtin_function): Don't call make_decl_rtl.
+ (give_name_to_locals): Don't SET_DECL_ASSEMBLER_NAME.
+ * expr.c (build_known_method_ref): Don't call make_decl_rtl.
+ * resource.c (compile_resource_data): Likewise.
+ * parse.y (resolve_field_access): Re-word comment to avoid
+ building DECL_RTL.
+
+2005-05-24 Richard Henderson <rth@redhat.com>
+
+ * class.c (registered_class): Take it out of class_roots; turn into
+ a vec of trees.
+ (register_class): Make static. Don't duplicate decl node. Use
+ VEC_safe_push.
+ (emit_register_classes): Use VEC_iterate. Use output_constant
+ instead of assemble_integer. Don't call mark_decl_referenced
+ directly.
+ * java-tree.h (register_class): Remove decl.
+
2005-05-19 Paolo Bonzini <bonzini@gnu.org>
PR java/17845
@@ -19,7 +204,7 @@
2005-05-12 Aaron Luchko <aluchko@redhat.com>
- * gcj.texi: Add '-verify', '-noverify', and '-verifyremote'.
+ * gcj.texi: Add '-verify', '-noverify', and '-verifyremote'.
2005-05-11 Tom Tromey <tromey@redhat.com>
@@ -10386,7 +10571,7 @@
properly initialize `finished_label'. Don't emit gotos for empty
try statements.
-2000-03-19 Martin v. Löwis <loewis@informatik.hu-berlin.de>
+2000-03-19 Martin v. Loewis <loewis@informatik.hu-berlin.de>
* except.c (emit_handlers): Clear catch_clauses_last.
diff --git a/gcc/java/Make-lang.in b/gcc/java/Make-lang.in
index 17aa70a7a94..c6f714c9c03 100644
--- a/gcc/java/Make-lang.in
+++ b/gcc/java/Make-lang.in
@@ -340,7 +340,7 @@ java/lang.o: java/lang.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h input.h \
toplev.h $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) $(EXPR_H) diagnostic.h \
langhooks.h $(LANGHOOKS_DEF_H) gt-java-lang.h opts.h options.h
java/mangle.o: java/mangle.c $(CONFIG_H) java/jcf.h $(JAVA_TREE_H) $(SYSTEM_H) \
- coretypes.h $(TM_H) toplev.h $(GGC_H) gt-java-mangle.h
+ coretypes.h $(TM_H) toplev.h $(GGC_H) gt-java-mangle.h $(LANGHOOKS_DEF_H)
java/mangle_name.o: java/mangle_name.c $(CONFIG_H) java/jcf.h $(JAVA_TREE_H) \
$(SYSTEM_H) coretypes.h $(TM_H) toplev.h $(GGC_H)
java/resource.o: java/resource.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
@@ -353,7 +353,7 @@ java/verify.o: java/verify.c $(CONFIG_H) $(JAVA_TREE_H) java/jcf.h \
java/javaop.h java/java-opcodes.h java/java-except.h toplev.h $(SYSTEM_H) \
coretypes.h $(TM_H)
java/verify-glue.o: java/verify-glue.c $(CONFIG_H) $(SYSTEM_H) $(JAVA_TREE_H) \
- coretypes.h $(TM_H) java/verify.h
+ coretypes.h $(TM_H) java/verify.h toplev.h
java/verify-impl.o: java/verify-impl.c $(CONFIG_H) java/verify.h $(SYSTEM_H) \
coretypes.h java/jcf.h $(JAVA_TREE_H)
java/zextract.o: java/zextract.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
@@ -453,7 +453,7 @@ java.install-man: installdirs \
chmod a-x $$man_name ; \
done
-$(DESTDIR)$(man1dir)/$(JAVA_INSTALL_NAME)$(man1ext): doc/gcj.1
+$(DESTDIR)$(man1dir)/$(JAVA_INSTALL_NAME)$(man1ext): doc/gcj.1 installdirs
-rm -f $@
-$(INSTALL_DATA) $< $@
-chmod a-x $@
diff --git a/gcc/java/builtins.c b/gcc/java/builtins.c
index dcfff1c1ef5..63cbfac2789 100644
--- a/gcc/java/builtins.c
+++ b/gcc/java/builtins.c
@@ -144,7 +144,6 @@ define_builtin (enum built_in_function val,
DECL_EXTERNAL (decl) = 1;
TREE_PUBLIC (decl) = 1;
SET_DECL_ASSEMBLER_NAME (decl, get_identifier (libname));
- make_decl_rtl (decl);
pushdecl (decl);
DECL_BUILT_IN_CLASS (decl) = BUILT_IN_NORMAL;
DECL_FUNCTION_CODE (decl) = val;
diff --git a/gcc/java/class.c b/gcc/java/class.c
index 9ab88570d03..f4441214633 100644
--- a/gcc/java/class.c
+++ b/gcc/java/class.c
@@ -64,6 +64,7 @@ static void add_miranda_methods (tree, tree);
static int assume_compiled (const char *);
static tree build_symbol_entry (tree);
static tree emit_assertion_table (tree);
+static void register_class (void);
struct obstack temporary_obstack;
@@ -98,12 +99,13 @@ static class_flag_node *assume_compiled_tree;
static class_flag_node *enable_assert_tree;
-static GTY(()) tree class_roots[5];
-#define registered_class class_roots[0]
-#define fields_ident class_roots[1] /* get_identifier ("fields") */
-#define info_ident class_roots[2] /* get_identifier ("info") */
-#define class_list class_roots[3]
-#define class_dtable_decl class_roots[4]
+static GTY(()) tree class_roots[4];
+#define fields_ident class_roots[0] /* get_identifier ("fields") */
+#define info_ident class_roots[1] /* get_identifier ("info") */
+#define class_list class_roots[2]
+#define class_dtable_decl class_roots[3]
+
+static GTY(()) VEC(tree,gc) *registered_class;
/* Return the node that most closely represents the class whose name
is IDENT. Start the search from NODE (followed by its siblings).
@@ -547,6 +549,8 @@ inherits_from_p (tree type1, tree type2)
{
if (type1 == type2)
return 1;
+ if (! CLASS_LOADED_P (type1))
+ load_class (type1, 1);
type1 = CLASSTYPE_SUPER (type1);
}
return 0;
@@ -788,9 +792,11 @@ void
set_constant_value (tree field, tree constant)
{
if (field == NULL_TREE)
- warning (0, "misplaced ConstantValue attribute (not in any field)");
+ warning (OPT_Wattributes,
+ "misplaced ConstantValue attribute (not in any field)");
else if (DECL_INITIAL (field) != NULL_TREE)
- warning (0, "duplicate ConstantValue attribute for field '%s'",
+ warning (OPT_Wattributes,
+ "duplicate ConstantValue attribute for field '%s'",
IDENTIFIER_POINTER (DECL_NAME (field)));
else
{
@@ -914,7 +920,6 @@ build_utf8_ref (tree name)
rest_of_decl_compilation (decl, global_bindings_p (), 0);
cgraph_varpool_mark_needed_node (cgraph_varpool_node (decl));
utf8_decl_list = decl;
- make_decl_rtl (decl);
ref = build1 (ADDR_EXPR, utf8const_ptr_type, decl);
IDENTIFIER_UTF8_REF (name) = ref;
return ref;
@@ -946,9 +951,9 @@ build_class_ref (tree type)
if (TREE_CODE (type) == POINTER_TYPE)
type = TREE_TYPE (type);
- if (flag_indirect_dispatch
- && type != output_class
- && TREE_CODE (type) == RECORD_TYPE)
+ if (flag_indirect_dispatch
+ && type != output_class
+ && TREE_CODE (type) == RECORD_TYPE)
return build_indirect_class_ref (type);
if (TREE_CODE (type) == RECORD_TYPE)
@@ -961,19 +966,19 @@ build_class_ref (tree type)
if (decl == NULL_TREE)
{
decl = build_decl (VAR_DECL, decl_name, class_type_node);
- DECL_SIZE (decl) = TYPE_SIZE (class_type_node);
- DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (class_type_node);
TREE_STATIC (decl) = 1;
TREE_PUBLIC (decl) = 1;
DECL_IGNORED_P (decl) = 1;
DECL_ARTIFICIAL (decl) = 1;
if (is_compiled == 1)
DECL_EXTERNAL (decl) = 1;
- SET_DECL_ASSEMBLER_NAME (decl,
- java_mangle_class_field
- (&temporary_obstack, type));
- make_decl_rtl (decl);
- pushdecl_top_level (decl);
+ MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
+ DECL_CLASS_FIELD_P (decl) = 1;
+ DECL_CONTEXT (decl) = type;
+
+ /* ??? We want to preserve the DECL_CONTEXT we set just above,
+ that that means not calling pushdecl_top_level. */
+ IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
}
}
else
@@ -1025,7 +1030,6 @@ build_class_ref (tree type)
TREE_PUBLIC (decl) = 1;
DECL_EXTERNAL (decl) = 1;
DECL_ARTIFICIAL (decl) = 1;
- make_decl_rtl (decl);
pushdecl_top_level (decl);
}
}
@@ -1056,7 +1060,6 @@ build_fieldref_cache_entry (int index, tree fdecl ATTRIBUTE_UNUSED)
TREE_PUBLIC (decl) = 0;
DECL_EXTERNAL (decl) = 0;
DECL_ARTIFICIAL (decl) = 1;
- make_decl_rtl (decl);
pushdecl_top_level (decl);
}
return decl;
@@ -1067,26 +1070,21 @@ build_static_field_ref (tree fdecl)
{
tree fclass = DECL_CONTEXT (fdecl);
int is_compiled = is_compiled_class (fclass);
+ int from_class = ! CLASS_FROM_SOURCE_P (current_class);
/* Allow static final fields to fold to a constant. When using
- -fno-assume-compiled, gcj will sometimes try to fold a field from
- an uncompiled class. This is required when the field in question
- meets the appropriate criteria for a compile-time constant.
- However, currently sometimes gcj is too eager and will end up
- returning the field itself, leading to an incorrect external
- reference being generated. */
- if ((is_compiled && !flag_indirect_dispatch)
- || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
- && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
- || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
- && TREE_CONSTANT (DECL_INITIAL (fdecl))))
- {
- if (!DECL_RTL_SET_P (fdecl))
- {
- if (is_compiled == 1)
- DECL_EXTERNAL (fdecl) = 1;
- make_decl_rtl (fdecl);
- }
+ -findirect-dispatch, we simply never do this folding if compiling
+ from .class; in the .class file constants will be referred to via
+ the constant pool. */
+ if ((!flag_indirect_dispatch || !from_class)
+ && (is_compiled
+ || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
+ && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
+ || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
+ && TREE_CONSTANT (DECL_INITIAL (fdecl)))))
+ {
+ if (is_compiled == 1)
+ DECL_EXTERNAL (fdecl) = 1;
}
else
{
@@ -1238,7 +1236,6 @@ make_local_function_alias (tree method)
DECL_INITIAL (alias) = error_mark_node;
TREE_ADDRESSABLE (alias) = 1;
TREE_USED (alias) = 1;
- SET_DECL_ASSEMBLER_NAME (alias, DECL_NAME (alias));
TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias)) = 1;
if (!flag_syntax_only)
assemble_alias (alias, DECL_ASSEMBLER_NAME (method));
@@ -1318,7 +1315,10 @@ make_method_value (tree mdecl)
index = integer_minus_one_node;
code = null_pointer_node;
- if (DECL_RTL_SET_P (mdecl))
+ if (METHOD_ABSTRACT (mdecl))
+ code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
+ soft_abstractmethod_node);
+ else
code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
make_local_function_alias (mdecl));
START_RECORD_CONSTRUCTOR (minit, method_type_node);
@@ -1440,9 +1440,6 @@ get_dispatch_table (tree type, tree this_class_addr)
}
else
{
- if (!DECL_RTL_SET_P (method))
- make_decl_rtl (method);
-
if (TARGET_VTABLE_USES_DESCRIPTORS)
for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
{
@@ -1979,7 +1976,7 @@ is_compiled_class (tree class)
tree
build_dtable_decl (tree type)
{
- tree dtype;
+ tree dtype, decl;
/* We need to build a new dtable type so that its size is uniquely
computed when we're dealing with the class for real and not just
@@ -2027,8 +2024,12 @@ build_dtable_decl (tree type)
else
dtype = dtable_type;
- return build_decl (VAR_DECL,
- java_mangle_vtable (&temporary_obstack, type), dtype);
+ decl = build_decl (VAR_DECL, get_identifier ("vt$"), dtype);
+ DECL_CONTEXT (decl) = type;
+ MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
+ DECL_VTABLE_P (decl) = 1;
+
+ return decl;
}
/* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
@@ -2102,7 +2103,6 @@ void
layout_class (tree this_class)
{
tree super_class = CLASSTYPE_SUPER (this_class);
- tree field;
class_list = tree_cons (this_class, NULL_TREE, class_list);
if (CLASS_BEING_LAIDOUT (this_class))
@@ -2150,18 +2150,6 @@ layout_class (tree this_class)
push_super_field (this_class, maybe_super_class);
}
- for (field = TYPE_FIELDS (this_class);
- field != NULL_TREE; field = TREE_CHAIN (field))
- {
- if (FIELD_STATIC (field))
- {
- /* Set DECL_ASSEMBLER_NAME to something suitably mangled. */
- SET_DECL_ASSEMBLER_NAME (field,
- java_mangle_decl
- (&temporary_obstack, field));
- }
- }
-
layout_type (this_class);
/* Also recursively load/layout any superinterfaces, but only if
@@ -2329,17 +2317,6 @@ layout_class_method (tree this_class, tree super_class,
compiled into this object file. */
DECL_EXTERNAL (method_decl) = 1;
- /* This is a good occasion to mangle the method's name */
- SET_DECL_ASSEMBLER_NAME (method_decl,
- java_mangle_decl (&temporary_obstack,
- method_decl));
- /* We don't generate a RTL for the method if it's abstract, or if
- it's an interface method that isn't clinit. */
- if (! METHOD_ABSTRACT (method_decl)
- || (CLASS_INTERFACE (TYPE_NAME (this_class))
- && (DECL_CLINIT_P (method_decl))))
- make_decl_rtl (method_decl);
-
if (ID_INIT_P (method_name))
{
const char *p = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class)));
@@ -2407,23 +2384,16 @@ layout_class_method (tree this_class, tree super_class,
return dtable_count;
}
-void
+static void
register_class (void)
{
- /* END does not need to be registered with the garbage collector
- because it always points into the list given by REGISTERED_CLASS,
- and that variable is registered with the collector. */
- static tree end;
- tree node = TREE_OPERAND (build_class_ref (current_class), 0);
- tree current = copy_node (node);
+ tree node;
- XEXP (DECL_RTL (current), 0) = copy_rtx (XEXP (DECL_RTL(node), 0));
if (!registered_class)
- registered_class = current;
- else
- TREE_CHAIN (end) = current;
+ registered_class = VEC_alloc (tree, gc, 8);
- end = current;
+ node = TREE_OPERAND (build_class_ref (current_class), 0);
+ VEC_safe_push (tree, gc, registered_class, node);
}
/* Emit something to register classes at start-up time.
@@ -2448,25 +2418,28 @@ emit_register_classes (tree *list_p)
targets can overide the default in tm.h to use the fallback mechanism. */
if (TARGET_USE_JCR_SECTION)
{
+ tree klass, t;
+ int i;
+
#ifdef JCR_SECTION_NAME
- tree t;
named_section_flags (JCR_SECTION_NAME, SECTION_WRITE);
+#else
+ /* A target has defined TARGET_USE_JCR_SECTION,
+ but doesn't have a JCR_SECTION_NAME. */
+ gcc_unreachable ();
+#endif
assemble_align (POINTER_SIZE);
- for (t = registered_class; t; t = TREE_CHAIN (t))
+
+ for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
{
- mark_decl_referenced (t);
- assemble_integer (XEXP (DECL_RTL (t), 0),
- POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
+ t = build_fold_addr_expr (klass);
+ output_constant (t, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE);
}
-#else
- /* A target has defined TARGET_USE_JCR_SECTION, but doesn't have a
- JCR_SECTION_NAME. */
- abort ();
-#endif
}
else
{
tree klass, t, register_class_fn;
+ int i;
t = build_function_type_list (void_type_node, class_ptr_type, NULL);
t = build_decl (FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t);
@@ -2474,7 +2447,7 @@ emit_register_classes (tree *list_p)
DECL_EXTERNAL (t) = 1;
register_class_fn = t;
- for (klass = registered_class; klass; klass = TREE_CHAIN (klass))
+ for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
{
t = build_fold_addr_expr (klass);
t = tree_cons (NULL, t, NULL);
diff --git a/gcc/java/constants.c b/gcc/java/constants.c
index 99e156f3034..196da583106 100644
--- a/gcc/java/constants.c
+++ b/gcc/java/constants.c
@@ -446,7 +446,6 @@ build_constant_data_ref (void)
decl = build_decl (VAR_DECL, decl_name, type);
TREE_STATIC (decl) = 1;
- make_decl_rtl (decl);
TYPE_CPOOL_DATA_REF (output_class) = decl;
}
diff --git a/gcc/java/decl.c b/gcc/java/decl.c
index a74e5186b7d..5240fbacd3b 100644
--- a/gcc/java/decl.c
+++ b/gcc/java/decl.c
@@ -61,19 +61,31 @@ static tree create_primitive_vtable (const char *);
static tree check_local_unnamed_variable (tree, tree, tree);
static void parse_version (void);
-/* Used when computing the ABI version. */
-#define GCJ_BINARYCOMPAT_ADDITION 5
-/* Used when defining a class that should be loaded by the bootstrap
- loader. */
-#define GCJ_BOOTSTRAP_LOADER_ADDITION 1
+/* The following ABI flags are used in the high-order bits of the version
+ ID field. The version ID number itself should never be larger than
+ 0xfffff, so it should be safe to use top 12 bits for these flags. */
-/* The version of the BC ABI that we generate. At the moment we are
- compatible with what shipped in GCC 4.0. This must be kept in sync
- with parse_version(), libgcj, and reality (if the BC format
- changes, this must change. */
+#define FLAG_BINARYCOMPAT_ABI (1<<31) /* Class is built with the BC-ABI. */
+
+#define FLAG_BOOTSTRAP_LOADER (1<<30) /* Used when defining a class that
+ should be loaded by the bootstrap
+ loader. */
+
+/* If an ABI change is made within a GCC release series, rendering current
+ binaries incompatible with the old runtimes, this number can be set to
+ enforce the compatibility rules. */
+#define MINOR_BINARYCOMPAT_ABI_VERSION 0
+
+/* The runtime may recognize a variety of BC ABIs (objects generated by
+ different version of gcj), but will probably always require strict
+ matching for the ordinary (C++) ABI. */
+
+/* The version ID of the BC ABI that we generate. This must be kept in
+ sync with parse_version(), libgcj, and reality (if the BC format changes,
+ this must change). */
#define GCJ_CURRENT_BC_ABI_VERSION \
- (4 * 10000 + 0 * 10 + GCJ_BINARYCOMPAT_ADDITION)
+ (4 * 100000 + 0 * 1000 + MINOR_BINARYCOMPAT_ABI_VERSION)
/* The ABI version number. */
tree gcj_abi_version;
@@ -558,7 +570,6 @@ builtin_function (const char *name,
TREE_PUBLIC (decl) = 1;
if (library_name)
SET_DECL_ASSEMBLER_NAME (decl, get_identifier (library_name));
- make_decl_rtl (decl);
pushdecl (decl);
DECL_BUILT_IN_CLASS (decl) = cl;
DECL_FUNCTION_CODE (decl) = function_code;
@@ -614,18 +625,20 @@ parse_version (void)
++p;
}
- /* Implicit in this computation is the idea that we won't break the
- old-style binary ABI in a sub-minor release (e.g., from 4.0.0 to
- 4.0.1). */
- abi_version = 10000 * major + 10 * minor;
- /* It is helpful to distinguish BC ABI from ordinary ABI at this
- level, since at some point we will recognize a variety of BC ABIs
- (objects generated by different version of gcj), but will
- probably always require strict matching for ordinary ABI. */
if (flag_indirect_dispatch)
- abi_version = GCJ_CURRENT_BC_ABI_VERSION;
+ {
+ abi_version = GCJ_CURRENT_BC_ABI_VERSION;
+ abi_version |= FLAG_BINARYCOMPAT_ABI;
+ }
+ else /* C++ ABI */
+ {
+ /* Implicit in this computation is the idea that we won't break the
+ old-style binary ABI in a sub-minor release (e.g., from 4.0.0 to
+ 4.0.1). */
+ abi_version = 100000 * major + 1000 * minor;
+ }
if (flag_bootstrap_classes)
- abi_version += GCJ_BOOTSTRAP_LOADER_ADDITION;
+ abi_version |= FLAG_BOOTSTRAP_LOADER;
gcj_abi_version = build_int_cstu (ptr_type_node, abi_version);
}
@@ -1094,6 +1107,15 @@ java_init_decl_processing (void)
TREE_THIS_VOLATILE (soft_nullpointer_node) = 1;
TREE_SIDE_EFFECTS (soft_nullpointer_node) = 1;
+ soft_abstractmethod_node
+ = builtin_function ("_Jv_ThrowAbstractMethodError",
+ build_function_type (void_type_node, endlink),
+ 0, NOT_BUILT_IN, NULL, NULL_TREE);
+ /* Mark soft_abstractmethod_node as a `noreturn' function with side
+ effects. */
+ TREE_THIS_VOLATILE (soft_abstractmethod_node) = 1;
+ TREE_SIDE_EFFECTS (soft_abstractmethod_node) = 1;
+
t = tree_cons (NULL_TREE, class_ptr_type,
tree_cons (NULL_TREE, object_ptr_type_node, endlink));
soft_checkcast_node
@@ -1854,7 +1876,6 @@ give_name_to_locals (JCF *jcf)
{
tree decl = TREE_VEC_ELT (decl_map, slot);
DECL_NAME (decl) = name;
- SET_DECL_ASSEMBLER_NAME (decl, name);
if (TREE_CODE (decl) != PARM_DECL || TREE_TYPE (decl) != type)
warning (0, "bad type in parameter debug info");
}
@@ -1921,7 +1942,6 @@ give_name_to_locals (JCF *jcf)
sprintf (buffer, "ARG_%d", arg_i);
DECL_NAME (parm) = get_identifier (buffer);
}
- SET_DECL_ASSEMBLER_NAME (parm, DECL_NAME (parm));
}
}
}
@@ -2127,10 +2147,39 @@ java_mark_decl_local (tree decl)
/* If we've already constructed DECL_RTL, give encode_section_info
a second chance, now that we've changed the flags. */
+ /* ??? Ideally, we'd have flag_unit_at_a_time set, and not have done
+ anything that would have referenced DECL_RTL so far. But at the
+ moment we force flag_unit_at_a_time off due to excessive memory
+ consumption when compiling large jar files. Which probably means
+ that we need to re-order how we process jar files... */
if (DECL_RTL_SET_P (decl))
make_decl_rtl (decl);
}
+/* Given appropriate target support, G++ will emit hidden aliases for native
+ methods. Using this hidden name is required for proper operation of
+ _Jv_Method::ncode, but it doesn't hurt to use it everywhere. Look for
+ proper target support, then mark the method for aliasing. */
+
+static void
+java_mark_cni_decl_local (tree decl)
+{
+ /* Setting DECL_LOCAL_CNI_METHOD_P changes the behaviour of the mangler.
+ We expect that we should not yet have referenced this decl in a
+ context that requires it. Check this invariant even if we don't have
+ support for hidden aliases. */
+ gcc_assert (!DECL_ASSEMBLER_NAME_SET_P (decl));
+
+#if !defined(HAVE_GAS_HIDDEN) || !defined(ASM_OUTPUT_DEF)
+ return;
+#endif
+
+ DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
+ DECL_LOCAL_CNI_METHOD_P (decl) = 1;
+}
+
+/* Use the preceeding two functions and mark all members of the class. */
+
void
java_mark_class_local (tree class)
{
@@ -2141,8 +2190,13 @@ java_mark_class_local (tree class)
java_mark_decl_local (t);
for (t = TYPE_METHODS (class); t ; t = TREE_CHAIN (t))
- if (!METHOD_ABSTRACT (t) && (!METHOD_NATIVE (t) || flag_jni))
- java_mark_decl_local (t);
+ if (!METHOD_ABSTRACT (t))
+ {
+ if (METHOD_NATIVE (t) && !flag_jni)
+ java_mark_cni_decl_local (t);
+ else
+ java_mark_decl_local (t);
+ }
}
/* Add a statement to a compound_expr. */
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index 3a4002bbb87..90f8ff40460 100644
--- a/gcc/java/expr.c
+++ b/gcc/java/expr.c
@@ -138,6 +138,12 @@ int stack_pointer;
const unsigned char *linenumber_table;
int linenumber_count;
+/* Largest pc so far in this method that has been passed to lookup_label. */
+int highest_label_pc_this_method = -1;
+
+/* Base value for this method to add to pc to get generated label. */
+int start_label_pc_this_method = 0;
+
void
init_expr_processing (void)
{
@@ -1766,7 +1772,9 @@ lookup_label (int pc)
{
tree name;
char buf[32];
- ASM_GENERATE_INTERNAL_LABEL(buf, "LJpc=", pc);
+ if (pc > highest_label_pc_this_method)
+ highest_label_pc_this_method = pc;
+ ASM_GENERATE_INTERNAL_LABEL(buf, "LJpc=", start_label_pc_this_method + pc);
name = get_identifier (buf);
if (IDENTIFIER_LOCAL_VALUE (name))
return IDENTIFIER_LOCAL_VALUE (name);
@@ -2050,7 +2058,6 @@ build_known_method_ref (tree method, tree method_type ATTRIBUTE_UNUSED,
if (! flag_indirect_dispatch
|| (! DECL_EXTERNAL (method) && ! TREE_PUBLIC (method)))
{
- make_decl_rtl (method);
func = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (method)),
method);
}
diff --git a/gcc/java/gjavah.c b/gcc/java/gjavah.c
index d25dab8d0f7..acf62afdbec 100644
--- a/gcc/java/gjavah.c
+++ b/gcc/java/gjavah.c
@@ -164,7 +164,7 @@ static const unsigned char *
decode_signature_piece (FILE *, const unsigned char *,
const unsigned char *, int *);
static void print_class_decls (FILE *, JCF *, int);
-static void error (const char *msgid, ...);
+static void error (const char *gmsgid, ...) ATTRIBUTE_PRINTF_1;
static void usage (void) ATTRIBUTE_NORETURN;
static void help (void) ATTRIBUTE_NORETURN;
static void version (void) ATTRIBUTE_NORETURN;
@@ -266,16 +266,19 @@ static int decompiled = 0;
#include "jcf-reader.c"
-/* Print an error message and set found_error. */
+/* Print an error message and set found_error.
+ Not really gcc-internal-format message, but as error elsewhere
+ uses it, assume all users will use intersection between
+ c-format and gcc-internal-format. */
static void
-error (const char *msgid, ...)
+error (const char *gmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
+ va_start (ap, gmsgid);
fprintf (stderr, TOOLNAME ": ");
- vfprintf (stderr, _(msgid), ap);
+ vfprintf (stderr, _(gmsgid), ap);
va_end (ap);
fprintf (stderr, "\n");
found_error = 1;
diff --git a/gcc/java/java-tree.h b/gcc/java/java-tree.h
index a55e9ab476b..3d0f2331110 100644
--- a/gcc/java/java-tree.h
+++ b/gcc/java/java-tree.h
@@ -71,7 +71,7 @@ struct JCF;
IS_CRAFTED_STRING_BUFFER_P (in CALL_EXPR)
IS_INIT_CHECKED (in SAVE_EXPR)
6: CAN_COMPLETE_NORMALLY (in statement nodes)
- OUTER_FIELD_ACCESS_IDENTIFIER_P (in IDENTIFIER_NODE)
+ NESTED_FIELD_ACCESS_IDENTIFIER_P (in IDENTIFIER_NODE)
Usage of TYPE_LANG_FLAG_?:
0: CLASS_ACCESS0_GENERATED_P (in RECORD_TYPE)
@@ -234,6 +234,12 @@ extern int always_initialize_class_p;
extern int flag_verify_invocations;
+/* Largest pc so far in this method that has been passed to lookup_label. */
+extern int highest_label_pc_this_method;
+
+/* Base value for this method to add to pc to get generated label. */
+extern int start_label_pc_this_method;
+
typedef struct CPool constant_pool;
#define CONSTANT_ResolvedFlag 16
@@ -386,6 +392,7 @@ enum java_tree_index
JTI_SOFT_MULTIANEWARRAY_NODE,
JTI_SOFT_BADARRAYINDEX_NODE,
JTI_SOFT_NULLPOINTER_NODE,
+ JTI_SOFT_ABSTRACTMETHOD_NODE,
JTI_SOFT_CHECKARRAYSTORE_NODE,
JTI_SOFT_MONITORENTER_NODE,
JTI_SOFT_MONITOREXIT_NODE,
@@ -645,6 +652,8 @@ extern GTY(()) tree java_global_trees[JTI_MAX];
java_global_trees[JTI_SOFT_BADARRAYINDEX_NODE]
#define soft_nullpointer_node \
java_global_trees[JTI_SOFT_NULLPOINTER_NODE]
+#define soft_abstractmethod_node \
+ java_global_trees[JTI_SOFT_ABSTRACTMETHOD_NODE]
#define soft_checkarraystore_node \
java_global_trees[JTI_SOFT_CHECKARRAYSTORE_NODE]
#define soft_monitorenter_node \
@@ -818,6 +827,9 @@ union lang_tree_node
#define DECL_FIXED_CONSTRUCTOR_P(DECL) \
(DECL_LANG_SPECIFIC(DECL)->u.f.fixed_ctor)
+#define DECL_LOCAL_CNI_METHOD_P(NODE) \
+ (DECL_LANG_SPECIFIC (NODE)->u.f.local_cni)
+
/* A constructor that calls this. */
#define DECL_INIT_CALLS_THIS(DECL) \
(DECL_LANG_SPECIFIC(DECL)->u.f.init_calls_this)
@@ -893,16 +905,16 @@ union lang_tree_node
#define DECL_LOCAL_START_PC(NODE) (DECL_LANG_SPECIFIC (NODE)->u.v.start_pc)
/* The end (bytecode) pc for the valid range of this local variable. */
#define DECL_LOCAL_END_PC(NODE) (DECL_LANG_SPECIFIC (NODE)->u.v.end_pc)
-/* For a VAR_DECLor PARM_DECL, used to chain decls with the same
+/* For a VAR_DECL or PARM_DECL, used to chain decls with the same
slot_number in decl_map. */
#define DECL_LOCAL_SLOT_CHAIN(NODE) (DECL_LANG_SPECIFIC(NODE)->u.v.slot_chain)
/* For a FIELD_DECL, holds the name of the access method. Used to
- read/write the content of the field from an inner class. */
-#define FIELD_INNER_ACCESS(DECL) \
+ read/write the content of the field across nested class boundaries. */
+#define FIELD_NESTED_ACCESS(DECL) \
(DECL_LANG_SPECIFIC (VAR_OR_FIELD_CHECK (DECL))->u.v.am)
-/* Safely tests whether FIELD_INNER_ACCESS exists or not. */
-#define FIELD_INNER_ACCESS_P(DECL) \
- DECL_LANG_SPECIFIC (DECL) && FIELD_INNER_ACCESS (DECL)
+/* Safely tests whether FIELD_NESTED_ACCESS exists or not. */
+#define FIELD_NESTED_ACCESS_P(DECL) \
+ DECL_LANG_SPECIFIC (DECL) && FIELD_NESTED_ACCESS (DECL)
/* True if a final field was initialized upon its declaration
or in an initializer. Set after definite assignment. */
#define DECL_FIELD_FINAL_IUD(NODE) (DECL_LANG_SPECIFIC (NODE)->u.v.final_iud)
@@ -931,6 +943,12 @@ union lang_tree_node
(DECL_LANG_SPECIFIC (NODE)->u.v.freed)
#define LOCAL_SLOT_P(NODE) \
(DECL_LANG_SPECIFIC (NODE)->u.v.local_slot)
+
+#define DECL_CLASS_FIELD_P(NODE) \
+ (DECL_LANG_SPECIFIC (NODE)->u.v.class_field)
+#define DECL_VTABLE_P(NODE) \
+ (DECL_LANG_SPECIFIC (NODE)->u.v.vtable)
+
/* Create a DECL_LANG_SPECIFIC if necessary. */
#define MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC(T) \
if (DECL_LANG_SPECIFIC (T) == NULL) \
@@ -993,7 +1011,8 @@ struct lang_decl_func GTY(())
unsigned int invisible : 1; /* Set for methods we generate
internally but which shouldn't be
written to the .class file. */
- unsigned int dummy:1;
+ unsigned int dummy : 1;
+ unsigned int local_cni : 1; /* Decl needs mangle_local_cni_method. */
};
struct treetreehash_entry GTY(())
@@ -1037,6 +1056,8 @@ struct lang_decl_var GTY(())
unsigned int cif : 1; /* True: decl is a class initialization flag */
unsigned int freed : 1; /* Decl is no longer in scope. */
unsigned int local_slot : 1; /* Decl is a temporary in the stack frame. */
+ unsigned int class_field : 1; /* Decl needs mangle_class_field. */
+ unsigned int vtable : 1; /* Decl needs mangle_vtable. */
};
/* This is what 'lang_decl' really points to. */
@@ -1286,7 +1307,6 @@ extern tree build_result_decl (tree);
extern void set_method_index (tree decl, tree method_index);
extern tree get_method_index (tree decl);
extern void make_class_data (tree);
-extern void register_class (void);
extern int alloc_name_constant (int, tree);
extern int alloc_constant_fieldref (tree, tree);
extern void emit_register_classes (tree *);
@@ -1294,7 +1314,6 @@ extern tree emit_symbol_table (tree, tree, tree, tree, tree, int);
extern void lang_init_source (int);
extern void write_classfile (tree);
extern char *print_int_node (tree);
-extern void parse_error_context (tree cl, const char *msgid, ...);
extern void finish_class (void);
extern void java_layout_seen_class_methods (void);
extern void check_for_initialization (tree, tree);
@@ -1368,7 +1387,7 @@ extern void init_jcf_parse (void);
extern void init_src_parse (void);
extern int cxx_keyword_p (const char *, int);
-extern tree java_mangle_decl (struct obstack *, tree);
+extern void java_mangle_decl (tree);
extern tree java_mangle_class_field (struct obstack *, tree);
extern tree java_mangle_vtable (struct obstack *, tree);
extern void append_gpp_mangled_name (const char *, int);
@@ -1678,9 +1697,9 @@ extern tree *type_map;
/* True if NODE (a statement) can complete normally. */
#define CAN_COMPLETE_NORMALLY(NODE) TREE_LANG_FLAG_6 (NODE)
-/* True if NODE (an IDENTIFIER) bears the name of a outer field from
- inner class access function. */
-#define OUTER_FIELD_ACCESS_IDENTIFIER_P(NODE) \
+/* True if NODE (an IDENTIFIER) bears the name of an outer field from
+ inner class (or vice versa) access function. */
+#define NESTED_FIELD_ACCESS_IDENTIFIER_P(NODE) \
TREE_LANG_FLAG_6 (IDENTIFIER_NODE_CHECK (NODE))
/* True if NODE belongs to an inner class TYPE_DECL node.
diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c
index ccf6d34d357..29c257fe951 100644
--- a/gcc/java/jcf-parse.c
+++ b/gcc/java/jcf-parse.c
@@ -929,6 +929,21 @@ parse_class_file (void)
give_name_to_locals (jcf);
+ /* Bump up start_label_pc_this_method so we get a unique label number
+ and reset highest_label_pc_this_method. */
+ if (highest_label_pc_this_method >= 0)
+ {
+ /* We adjust to the next multiple of 1000. This is just a frill
+ so the last 3 digits of the label number match the bytecode
+ offset, which might make debugging marginally more convenient. */
+ start_label_pc_this_method
+ = ((((start_label_pc_this_method + highest_label_pc_this_method)
+ / 1000)
+ + 1)
+ * 1000);
+ highest_label_pc_this_method = -1;
+ }
+
/* Convert bytecode to trees. */
expand_byte_code (jcf, method);
diff --git a/gcc/java/jcf-write.c b/gcc/java/jcf-write.c
index 6f1516d5a1a..5deb5c84487 100644
--- a/gcc/java/jcf-write.c
+++ b/gcc/java/jcf-write.c
@@ -3087,7 +3087,7 @@ generate_classfile (tree clas, struct jcf_partial *state)
/* Make room for the Synthetic attribute (of zero length.) */
if (DECL_FINIT_P (part)
|| DECL_INSTINIT_P (part)
- || OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (part))
+ || NESTED_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (part))
|| TYPE_DOT_CLASS (clas) == part)
{
i++;
diff --git a/gcc/java/jv-scan.c b/gcc/java/jv-scan.c
index a283328847e..0f09e91d2ea 100644
--- a/gcc/java/jv-scan.c
+++ b/gcc/java/jv-scan.c
@@ -40,10 +40,10 @@ Boston, MA 02111-1307, USA. */
#include <getopt.h>
-extern void fatal_error (const char *msgid, ...)
+extern void fatal_error (const char *gmsgid, ...)
ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
-void warning (int opt, const char *msgid, ...) ATTRIBUTE_PRINTF_2;
-void warning0 (const char *msgid, ...) ATTRIBUTE_PRINTF_1;
+void warning (int opt, const char *gmsgid, ...) ATTRIBUTE_PRINTF_2;
+void warning0 (const char *gmsgid, ...) ATTRIBUTE_PRINTF_1;
void report (void);
static void usage (void) ATTRIBUTE_NORETURN;
@@ -245,38 +245,40 @@ main (int argc, char **argv)
/* Error report, memory, obstack initialization and other utility
- functions */
+ functions. Use actually c-format msgid, but as functions with
+ the same name elsewhere use gcc-internal-format, assume all users
+ here use intersection between c-format and gcc-internal-format. */
void
-fatal_error (const char *msgid, ...)
+fatal_error (const char *gmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
+ va_start (ap, gmsgid);
fprintf (stderr, _("%s: error: "), exec_name);
- vfprintf (stderr, _(msgid), ap);
+ vfprintf (stderr, _(gmsgid), ap);
fputc ('\n', stderr);
va_end (ap);
exit (1);
}
void
-warning (int opt ATTRIBUTE_UNUSED, const char *msgid, ...)
+warning (int opt ATTRIBUTE_UNUSED, const char *gmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
+ va_start (ap, gmsgid);
fprintf (stderr, _("%s: warning: "), exec_name);
- vfprintf (stderr, _(msgid), ap);
+ vfprintf (stderr, _(gmsgid), ap);
fputc ('\n', stderr);
va_end (ap);
}
void
-warning0 (const char *msgid, ...)
+warning0 (const char *gmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
+ va_start (ap, gmsgid);
fprintf (stderr, _("%s: warning: "), exec_name);
- vfprintf (stderr, _(msgid), ap);
+ vfprintf (stderr, _(gmsgid), ap);
fputc ('\n', stderr);
va_end (ap);
}
diff --git a/gcc/java/lang.c b/gcc/java/lang.c
index e0d2672b2a5..4ade9364113 100644
--- a/gcc/java/lang.c
+++ b/gcc/java/lang.c
@@ -213,6 +213,9 @@ struct language_function GTY(())
#undef LANG_HOOKS_CLEAR_BINDING_STACK
#define LANG_HOOKS_CLEAR_BINDING_STACK java_clear_binding_stack
+#undef LANG_HOOKS_SET_DECL_ASSEMBLER_NAME
+#define LANG_HOOKS_SET_DECL_ASSEMBLER_NAME java_mangle_decl
+
/* Each front end provides its own. */
const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
diff --git a/gcc/java/mangle.c b/gcc/java/mangle.c
index e0b53a13c2b..22a391839a7 100644
--- a/gcc/java/mangle.c
+++ b/gcc/java/mangle.c
@@ -35,11 +35,14 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
#include "java-tree.h"
#include "obstack.h"
#include "toplev.h"
-#include "obstack.h"
#include "ggc.h"
+#include "langhooks-def.h"
+static void mangle_class_field (tree);
+static void mangle_vtable (tree);
static void mangle_field_decl (tree);
static void mangle_method_decl (tree);
+static void mangle_local_cni_method_decl (tree);
static void mangle_type (tree);
static void mangle_pointer_type (tree);
@@ -55,15 +58,15 @@ static void set_type_package_list (tree);
static int entry_match_pointer_p (tree, int);
static void emit_compression_string (int);
-static void init_mangling (struct obstack *);
+static void init_mangling (void);
static tree finish_mangling (void);
static void compression_table_add (tree);
static void mangle_member_name (tree);
-/* We use an incoming obstack, always to be provided to the interface
- functions. */
+static struct obstack mangle_obstack_1;
struct obstack *mangle_obstack;
+
#define MANGLE_RAW_STRING(S) \
obstack_grow (mangle_obstack, (S), sizeof (S)-1)
@@ -73,46 +76,75 @@ static GTY(()) tree atms;
/* This is the mangling interface: a decl, a class field (.class) and
the vtable. */
-tree
-java_mangle_decl (struct obstack *obstack, tree decl)
+void
+java_mangle_decl (tree decl)
{
- init_mangling (obstack);
- switch (TREE_CODE (decl))
+ /* A copy of the check from the beginning of lhd_set_decl_assembler_name.
+ Only FUNCTION_DECLs and VAR_DECLs for variables with static storage
+ duration need a real DECL_ASSEMBLER_NAME. */
+ gcc_assert (TREE_CODE (decl) == FUNCTION_DECL
+ || (TREE_CODE (decl) == VAR_DECL
+ && (TREE_STATIC (decl)
+ || DECL_EXTERNAL (decl)
+ || TREE_PUBLIC (decl))));
+
+ /* Mangling only applies to class members. */
+ if (DECL_CONTEXT (decl) && TYPE_P (DECL_CONTEXT (decl)))
{
- case VAR_DECL:
- mangle_field_decl (decl);
- break;
- case FUNCTION_DECL:
- mangle_method_decl (decl);
- break;
- default:
- internal_error ("can't mangle %s", tree_code_name [TREE_CODE (decl)]);
+ init_mangling ();
+ switch (TREE_CODE (decl))
+ {
+ case VAR_DECL:
+ if (DECL_LANG_SPECIFIC (decl))
+ {
+ if (DECL_CLASS_FIELD_P (decl))
+ {
+ mangle_class_field (DECL_CONTEXT (decl));
+ break;
+ }
+ else if (DECL_VTABLE_P (decl))
+ {
+ mangle_vtable (DECL_CONTEXT (decl));
+ break;
+ }
+ }
+ mangle_field_decl (decl);
+ break;
+
+ case FUNCTION_DECL:
+ if (DECL_LANG_SPECIFIC (decl) && DECL_LOCAL_CNI_METHOD_P (decl))
+ mangle_local_cni_method_decl (decl);
+ else
+ mangle_method_decl (decl);
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+ SET_DECL_ASSEMBLER_NAME (decl, finish_mangling ());
}
- return finish_mangling ();
+ else
+ lhd_set_decl_assembler_name (decl);
}
-tree
-java_mangle_class_field (struct obstack *obstack, tree type)
+/* Beginning of the helper functions */
+
+static void
+mangle_class_field (tree type)
{
- init_mangling (obstack);
mangle_record_type (type, /* for_pointer = */ 0);
MANGLE_RAW_STRING ("6class$");
obstack_1grow (mangle_obstack, 'E');
- return finish_mangling ();
}
-tree
-java_mangle_vtable (struct obstack *obstack, tree type)
+static void
+mangle_vtable (tree type)
{
- init_mangling (obstack);
MANGLE_RAW_STRING ("TV");
mangle_record_type (type, /* for_pointer = */ 0);
obstack_1grow (mangle_obstack, 'E');
- return finish_mangling ();
}
-/* Beginning of the helper functions */
-
/* This mangles a field decl */
static void
@@ -167,6 +199,18 @@ mangle_method_decl (tree mdecl)
}
}
+/* This mangles a CNI method for a local class. If the target supports
+ hidden aliases, then G++ will have generated one for us. It is the
+ responsibility of java_mark_class_local to check target support, since
+ we need to set DECL_VISIBILITY (or not) much earlier. */
+
+static void
+mangle_local_cni_method_decl (tree decl)
+{
+ MANGLE_RAW_STRING ("GA");
+ mangle_method_decl (decl);
+}
+
/* This mangles a member name, like a function name or a field
name. Handle cases were `name' is a C++ keyword. Return a nonzero
value if unicode encoding was required. */
@@ -585,17 +629,19 @@ compression_table_add (tree type)
/* Mangling initialization routine. */
static void
-init_mangling (struct obstack *obstack)
+init_mangling (void)
{
- mangle_obstack = obstack;
- if (!compression_table)
- compression_table = make_tree_vec (10);
- else
- /* Mangling already in progress. */
- abort ();
+ if (!mangle_obstack)
+ {
+ mangle_obstack = &mangle_obstack_1;
+ gcc_obstack_init (mangle_obstack);
+ }
+
+ gcc_assert (compression_table == NULL);
+ compression_table = make_tree_vec (10);
/* Mangled name are to be suffixed */
- obstack_grow (mangle_obstack, "_Z", 2);
+ MANGLE_RAW_STRING ("_Z");
}
/* Mangling finalization routine. The mangled name is returned as a
@@ -606,18 +652,14 @@ finish_mangling (void)
{
tree result;
- if (!compression_table)
- /* Mangling already finished. */
- abort ();
+ gcc_assert (compression_table);
compression_table = NULL_TREE;
compression_next = 0;
obstack_1grow (mangle_obstack, '\0');
result = get_identifier (obstack_base (mangle_obstack));
obstack_free (mangle_obstack, obstack_base (mangle_obstack));
-#if 0
- printf ("// %s\n", IDENTIFIER_POINTER (result));
-#endif
+
return result;
}
diff --git a/gcc/java/parse.h b/gcc/java/parse.h
index 232eead9862..c016fad1b5d 100644
--- a/gcc/java/parse.h
+++ b/gcc/java/parse.h
@@ -120,6 +120,10 @@ extern tree stabilize_reference (tree);
}
#endif
+#ifdef ATTRIBUTE_GCC_DIAG
+extern void parse_error_context (tree cl, const char *gmsgid, ...) ATTRIBUTE_GCC_DIAG(2,3);
+#endif
+
#define ABSTRACT_CHECK(FLAG, V, CL, S) \
if ((FLAG) & (V)) \
parse_error_context ((CL), "%s method can't be abstract", (S));
diff --git a/gcc/java/parse.y b/gcc/java/parse.y
index e90fc426e5d..11087192bec 100644
--- a/gcc/java/parse.y
+++ b/gcc/java/parse.y
@@ -96,13 +96,13 @@ static tree lookup_java_method2 (tree, tree, int);
static tree method_header (int, tree, tree, tree);
static void fix_method_argument_names (tree ,tree);
static tree method_declarator (tree, tree);
-static void parse_warning_context (tree cl, const char *msgid, ...);
+static void parse_warning_context (tree cl, const char *gmsgid, ...) ATTRIBUTE_GCC_DIAG(2,3);
#ifdef USE_MAPPED_LOCATION
static void issue_warning_error_from_context
- (source_location, const char *msgid, va_list *);
+ (source_location, const char *gmsgid, va_list *);
#else
static void issue_warning_error_from_context
- (tree, const char *msgid, va_list *);
+ (tree, const char *gmsgid, va_list *);
#endif
static void parse_ctor_invocation_error (void);
static tree parse_jdk1_1_error (const char *);
@@ -320,19 +320,17 @@ static tree build_current_thisn (tree);
static tree build_access_to_thisn (tree, tree, int);
static tree maybe_build_thisn_access_method (tree);
-static tree build_outer_field_access (tree, tree);
-static tree build_outer_field_access_methods (tree);
-static tree build_outer_field_access_expr (int, tree, tree,
- tree, tree);
+static tree build_nested_field_access (tree, tree);
+static tree build_nested_field_access_methods (tree);
+static tree build_nested_field_access_method (tree, tree, tree, tree, tree);
+static tree build_nested_field_access_expr (int, tree, tree, tree, tree);
static tree build_outer_method_access_method (tree);
static tree build_new_access_id (void);
-static tree build_outer_field_access_method (tree, tree, tree,
- tree, tree);
-static int outer_field_access_p (tree, tree);
-static int outer_field_expanded_access_p (tree, tree *,
- tree *, tree *);
-static tree outer_field_access_fix (tree, tree, tree);
+static int nested_field_access_p (tree, tree);
+static int nested_field_expanded_access_p (tree, tree *, tree *, tree *);
+static tree nested_field_access_fix (tree, tree, tree);
+
static tree build_incomplete_class_ref (int, tree);
static tree patch_incomplete_class_ref (tree);
static tree create_anonymous_class (tree);
@@ -3128,7 +3126,7 @@ issue_warning_error_from_context (
#else
tree cl,
#endif
- const char *msgid, va_list *ap)
+ const char *gmsgid, va_list *ap)
{
#ifdef USE_MAPPED_LOCATION
source_location saved_location = input_location;
@@ -3142,7 +3140,7 @@ issue_warning_error_from_context (
text.err_no = errno;
text.args_ptr = ap;
- text.format_spec = msgid;
+ text.format_spec = gmsgid;
pp_format_text (global_dc->printer, &text);
strncpy (buffer, pp_formatted_text (global_dc->printer), sizeof (buffer) - 1);
buffer[sizeof (buffer) - 1] = '\0';
@@ -3184,14 +3182,14 @@ issue_warning_error_from_context (
FUTURE/FIXME: change cl to be a source_location. */
void
-parse_error_context (tree cl, const char *msgid, ...)
+parse_error_context (tree cl, const char *gmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
+ va_start (ap, gmsgid);
#ifdef USE_MAPPED_LOCATION
- issue_warning_error_from_context (EXPR_LOCATION (cl), msgid, &ap);
+ issue_warning_error_from_context (EXPR_LOCATION (cl), gmsgid, &ap);
#else
- issue_warning_error_from_context (cl, msgid, &ap);
+ issue_warning_error_from_context (cl, gmsgid, &ap);
#endif
va_end (ap);
}
@@ -3200,16 +3198,16 @@ parse_error_context (tree cl, const char *msgid, ...)
FUTURE/FIXME: change cl to be a source_location. */
static void
-parse_warning_context (tree cl, const char *msgid, ...)
+parse_warning_context (tree cl, const char *gmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
+ va_start (ap, gmsgid);
do_warning = 1;
#ifdef USE_MAPPED_LOCATION
- issue_warning_error_from_context (EXPR_LOCATION (cl), msgid, &ap);
+ issue_warning_error_from_context (EXPR_LOCATION (cl), gmsgid, &ap);
#else
- issue_warning_error_from_context (cl, msgid, &ap);
+ issue_warning_error_from_context (cl, gmsgid, &ap);
#endif
do_warning = 0;
va_end (ap);
@@ -8289,114 +8287,159 @@ java_expand_method_bodies (tree class)
fields either directly by using the relevant access to this$<n> or
by invoking an access method crafted for that purpose. */
-/* Build the necessary access from an inner class to an outer
- class. This routine could be optimized to cache previous result
+/* Build the necessary access across nested class boundaries.
+ This routine could be optimized to cache previous result
(decl, current_class and returned access). When an access method
- needs to be generated, it always takes the form of a read. It might
- be later turned into a write by calling outer_field_access_fix. */
+ needs to be generated, it always takes the form of a read. It might
+ be later turned into a write by calling nested_field_access_fix. */
static tree
-build_outer_field_access (tree id, tree decl)
+build_nested_field_access (tree id, tree decl)
{
tree access = NULL_TREE;
- tree ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
+ tree ctx = NULL_TREE;
tree decl_ctx = DECL_CONTEXT (decl);
+ bool is_static = FIELD_STATIC (decl);
+
+ if (DECL_CONTEXT (TYPE_NAME (current_class)))
+ ctx = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current_class)));
- /* If the immediate enclosing context of the current class is the
- field decl's class or inherits from it; build the access as
- `this$<n>.<field>'. Note that we will break the `private' barrier
- if we're not emitting bytecodes. */
- if ((ctx == decl_ctx || inherits_from_p (ctx, decl_ctx))
- && (!FIELD_PRIVATE (decl) || !flag_emit_class_files ))
+ /* For non-static fields, if the immediate enclosing context of the
+ current class is the field decl's class or inherits from it,
+ build the access as `this$<n>.<field>'. Note that we will break
+ the `private' barrier if we're not emitting bytecodes. */
+ if (!is_static
+ && ctx
+ && (ctx == decl_ctx || inherits_from_p (ctx, decl_ctx))
+ && (!FIELD_PRIVATE (decl) || !flag_emit_class_files))
{
tree thisn = build_current_thisn (current_class);
access = make_qualified_primary (build_wfl_node (thisn),
id, EXPR_WFL_LINECOL (id));
}
- /* Otherwise, generate access methods to outer this and access the
- field (either using an access method or by direct access.) */
+ /* Otherwise, generate and use accessor methods for the field as
+ needed. */
else
{
int lc = EXPR_WFL_LINECOL (id);
/* Now we chain the required number of calls to the access$0 to
- get a hold to the enclosing instance we need, and then we
- build the field access. */
- access = build_access_to_thisn (current_class, decl_ctx, lc);
+ get a hold to the enclosing instance we need for a non-static
+ field, and then we build the field access. */
+ if (!is_static)
+ access = build_access_to_thisn (current_class, decl_ctx, lc);
/* If the field is private and we're generating bytecode, then
- we generate an access method */
- if (FIELD_PRIVATE (decl) && flag_emit_class_files )
+ we generate an access method. */
+ if (FIELD_PRIVATE (decl) && flag_emit_class_files)
{
- tree name = build_outer_field_access_methods (decl);
- access = build_outer_field_access_expr (lc, decl_ctx,
- name, access, NULL_TREE);
+ tree name = build_nested_field_access_methods (decl);
+ access = build_nested_field_access_expr (lc, decl_ctx,
+ name, access, NULL_TREE);
}
- /* Otherwise we use `access$(this$<j>). ... access$(this$<i>).<field>'.
+ /* Otherwise we use `access$(this$<j>). ... access$(this$<i>).<field>'
+ for non-static fields.
Once again we break the `private' access rule from a foreign
- class. */
+ class. */
+ else if (is_static)
+ {
+ tree class_name = DECL_NAME (TYPE_NAME (decl_ctx));
+ access
+ = make_qualified_primary (build_wfl_node (class_name), id, lc);
+ }
else
- access = make_qualified_primary (access, id, lc);
+ access = make_qualified_primary (access, id, lc);
}
+
return resolve_expression_name (access, NULL);
}
-/* Return a nonzero value if NODE describes an outer field inner
- access. */
+/* Return a nonzero value if DECL describes a field access across nested
+ class boundaries. That is, DECL is in a class that either encloses,
+ is enclosed by or shares a common enclosing class with, the class
+ TYPE. */
static int
-outer_field_access_p (tree type, tree decl)
+nested_field_access_p (tree type, tree decl)
{
+ bool is_static = false;
+ tree decl_type = DECL_CONTEXT (decl);
+ tree type_root, decl_type_root;
+
+ if (decl_type == type
+ || (TREE_CODE (decl) != FIELD_DECL && TREE_CODE (decl) != VAR_DECL))
+ return 0;
+
if (!INNER_CLASS_TYPE_P (type)
- || TREE_CODE (decl) != FIELD_DECL
- || DECL_CONTEXT (decl) == type)
+ && !(TREE_CODE (decl_type) == RECORD_TYPE
+ && INNER_CLASS_TYPE_P (decl_type)))
return 0;
- /* If the inner class extends the declaration context of the field
- we're trying to access, then this isn't an outer field access */
- if (inherits_from_p (type, DECL_CONTEXT (decl)))
+ is_static = FIELD_STATIC (decl);
+
+ /* If TYPE extends the declaration context of the non-static
+ field we're trying to access, then this isn't a nested field
+ access we need to worry about. */
+ if (!is_static && inherits_from_p (type, decl_type))
return 0;
- for (type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))); ;
- type = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type))))
+ for (type_root = type;
+ DECL_CONTEXT (TYPE_NAME (type_root));
+ type_root = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type_root))))
{
- if (type == DECL_CONTEXT (decl))
- return 1;
+ if (type_root == decl_type)
+ return 1;
+ }
- if (!DECL_CONTEXT (TYPE_NAME (type)))
- {
- /* Before we give up, see whether the field is inherited from
- the enclosing context we're considering. */
- if (inherits_from_p (type, DECL_CONTEXT (decl)))
- return 1;
- break;
- }
+ if (TREE_CODE (decl_type) == RECORD_TYPE
+ && INNER_CLASS_TYPE_P (decl_type))
+ {
+ for (decl_type_root = decl_type;
+ DECL_CONTEXT (TYPE_NAME (decl_type_root));
+ decl_type_root
+ = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (decl_type_root))))
+ {
+ if (decl_type_root == type)
+ return 1;
+ }
}
+ else
+ decl_type_root = decl_type;
+
+ if (type_root == decl_type_root)
+ return 1;
+
+ /* Before we give up, see whether it is a non-static field
+ inherited from the enclosing context we are considering. */
+ if (!DECL_CONTEXT (TYPE_NAME (type_root))
+ && !is_static
+ && inherits_from_p (type_root, decl_type))
+ return 1;
return 0;
}
-/* Return a nonzero value if NODE represents an outer field inner
- access that was been already expanded. As a side effect, it returns
+/* Return a nonzero value if NODE represents a cross-nested-class
+ access that has already been 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
- call if necessary. */
+ call if necessary. */
static int
-outer_field_expanded_access_p (tree node, tree *name, tree *arg_type,
- tree *arg)
+nested_field_expanded_access_p (tree node, tree *name, tree *arg_type,
+ tree *arg)
{
int identified = 0;
if (TREE_CODE (node) != CALL_EXPR)
return 0;
- /* Well, gcj generates slightly different tree nodes when compiling
- to native or bytecodes. It's the case for function calls. */
+ /* Well, GCJ generates slightly different tree nodes when compiling
+ to native or bytecodes. It's the case for function calls. */
if (flag_emit_class_files
&& TREE_CODE (node) == CALL_EXPR
- && OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (TREE_OPERAND (node, 0))))
+ && NESTED_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (TREE_OPERAND (node, 0))))
identified = 1;
else if (!flag_emit_class_files)
{
@@ -8408,7 +8451,7 @@ outer_field_expanded_access_p (tree node, tree *name, tree *arg_type,
node = TREE_OPERAND (node, 0);
if (TREE_OPERAND (node, 0)
&& TREE_CODE (TREE_OPERAND (node, 0)) == FUNCTION_DECL
- && (OUTER_FIELD_ACCESS_IDENTIFIER_P
+ && (NESTED_FIELD_ACCESS_IDENTIFIER_P
(DECL_NAME (TREE_OPERAND (node, 0)))))
identified = 1;
}
@@ -8418,26 +8461,37 @@ outer_field_expanded_access_p (tree node, tree *name, tree *arg_type,
{
tree argument = TREE_OPERAND (node, 1);
*name = DECL_NAME (TREE_OPERAND (node, 0));
- *arg_type = TREE_TYPE (TREE_TYPE (TREE_VALUE (argument)));
- *arg = TREE_VALUE (argument);
+
+ /* The accessors for static fields do not take in a this$<n> argument,
+ so we take the class name from the accessor's context instead. */
+ if (argument)
+ {
+ *arg_type = TREE_TYPE (TREE_TYPE (TREE_VALUE (argument)));
+ *arg = TREE_VALUE (argument);
+ }
+ else
+ {
+ *arg_type = DECL_CONTEXT (TREE_OPERAND (node, 0));
+ *arg = NULL_TREE;
+ }
}
return identified;
}
-/* Detect in NODE an outer field read access from an inner class and
- transform it into a write with RHS as an argument. This function is
- called from the java_complete_lhs when an assignment to a LHS can
- be identified. */
+/* Detect in NODE cross-nested-class field read access and
+ transform it into a write with RHS as an argument. This function
+ is called from the java_complete_lhs when an assignment to a LHS can
+ be identified. */
static tree
-outer_field_access_fix (tree wfl, tree node, tree rhs)
+nested_field_access_fix (tree wfl, tree node, tree rhs)
{
tree name, arg_type, arg;
- if (outer_field_expanded_access_p (node, &name, &arg_type, &arg))
+ if (nested_field_expanded_access_p (node, &name, &arg_type, &arg))
{
- node = build_outer_field_access_expr (EXPR_WFL_LINECOL (wfl),
- arg_type, name, arg, rhs);
+ node = build_nested_field_access_expr (EXPR_WFL_LINECOL (wfl),
+ arg_type, name, arg, rhs);
return java_complete_tree (node);
}
return NULL_TREE;
@@ -8450,23 +8504,34 @@ outer_field_access_fix (tree wfl, tree node, tree rhs)
read access. */
static tree
-build_outer_field_access_expr (int lc, tree type, tree access_method_name,
- tree arg1, tree arg2)
+build_nested_field_access_expr (int lc, tree type, tree access_method_name,
+ tree arg1, tree arg2)
{
tree args, cn, access;
- args = arg1 ? arg1 :
- build_wfl_node (build_current_thisn (current_class));
- args = build_tree_list (NULL_TREE, args);
+ if (arg1)
+ args = build_tree_list (NULL_TREE, arg1);
+ else
+ args = NULL_TREE;
if (arg2)
- args = tree_cons (NULL_TREE, arg2, args);
+ {
+ if (args)
+ args = tree_cons (NULL_TREE, arg2, args);
+ else
+ args = build_tree_list (NULL_TREE, arg2);
+ }
- access = build_method_invocation (build_wfl_node (access_method_name), args);
+ access
+ = build_method_invocation (build_wfl_node (access_method_name), args);
cn = build_wfl_node (DECL_NAME (TYPE_NAME (type)));
+
return make_qualified_primary (cn, access, lc);
}
+/* Build the name of a synthetic accessor used to access class members
+ across nested class boundaries. */
+
static tree
build_new_access_id (void)
{
@@ -8477,8 +8542,8 @@ build_new_access_id (void)
return get_identifier (buffer);
}
-/* Create the static access functions for the outer field DECL. We define a
- read:
+/* Create the static access functions for the cross-nested-class field DECL.
+ We define a read:
TREE_TYPE (<field>) access$<n> (DECL_CONTEXT (<field>) inst$) {
return inst$.field;
}
@@ -8487,63 +8552,89 @@ build_new_access_id (void)
TREE_TYPE (<field>) value$) {
return inst$.field = value$;
}
- We should have a usage flags on the DECL so we can lazily turn the ones
- we're using for code generation. FIXME.
+ For static fields, these methods are generated without the instance
+ parameter.
+ We should have a usage flag on the DECL so we can lazily turn the ones
+ we're using for code generation. FIXME.
*/
static tree
-build_outer_field_access_methods (tree decl)
+build_nested_field_access_methods (tree decl)
{
- tree id, args, stmt, mdecl;
+ tree id, args, stmt, mdecl, class_name = NULL_TREE;
+ bool is_static = FIELD_STATIC (decl);
- if (FIELD_INNER_ACCESS_P (decl))
- return FIELD_INNER_ACCESS (decl);
+ if (FIELD_NESTED_ACCESS_P (decl))
+ return FIELD_NESTED_ACCESS (decl);
MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
- /* Create the identifier and a function named after it. */
+ /* Create the identifier and a function named after it. */
id = build_new_access_id ();
/* The identifier is marked as bearing the name of a generated write
- access function for outer field accessed from inner classes. */
- OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
+ access function for outer field accessed from inner classes. */
+ NESTED_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
- /* Create the read access */
- args = build_tree_list (inst_id, build_pointer_type (DECL_CONTEXT (decl)));
- TREE_CHAIN (args) = end_params_node;
- stmt = make_qualified_primary (build_wfl_node (inst_id),
- build_wfl_node (DECL_NAME (decl)), 0);
+ /* Create the read access. */
+ if (!is_static)
+ {
+ args = build_tree_list (inst_id,
+ build_pointer_type (DECL_CONTEXT (decl)));
+ TREE_CHAIN (args) = end_params_node;
+ stmt = make_qualified_primary (build_wfl_node (inst_id),
+ build_wfl_node (DECL_NAME (decl)), 0);
+ }
+ else
+ {
+ args = end_params_node;
+ class_name = DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl)));
+ stmt = make_qualified_primary (build_wfl_node (class_name),
+ build_wfl_node (DECL_NAME (decl)), 0);
+ }
stmt = build_return (0, stmt);
- mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
- TREE_TYPE (decl), id, args, stmt);
+ mdecl = build_nested_field_access_method (DECL_CONTEXT (decl),
+ TREE_TYPE (decl), id, args, stmt);
DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
- /* Create the write access method. No write access for final variable */
+ /* Create the write access method. No write access for final variable */
if (!FIELD_FINAL (decl))
{
- args = build_tree_list (inst_id,
- build_pointer_type (DECL_CONTEXT (decl)));
- TREE_CHAIN (args) = build_tree_list (wpv_id, TREE_TYPE (decl));
- TREE_CHAIN (TREE_CHAIN (args)) = end_params_node;
- stmt = make_qualified_primary (build_wfl_node (inst_id),
- build_wfl_node (DECL_NAME (decl)), 0);
+ if (!is_static)
+ {
+ args = build_tree_list (inst_id,
+ build_pointer_type (DECL_CONTEXT (decl)));
+ TREE_CHAIN (args) = build_tree_list (wpv_id, TREE_TYPE (decl));
+ TREE_CHAIN (TREE_CHAIN (args)) = end_params_node;
+ stmt = make_qualified_primary (build_wfl_node (inst_id),
+ build_wfl_node (DECL_NAME (decl)),
+ 0);
+ }
+ else
+ {
+ args = build_tree_list (wpv_id, TREE_TYPE (decl));
+ TREE_CHAIN (args) = end_params_node;
+ stmt = make_qualified_primary (build_wfl_node (class_name),
+ build_wfl_node (DECL_NAME (decl)),
+ 0);
+ }
stmt = build_return (0, build_assignment (ASSIGN_TK, 0, stmt,
build_wfl_node (wpv_id)));
- mdecl = build_outer_field_access_method (DECL_CONTEXT (decl),
- TREE_TYPE (decl), id,
- args, stmt);
+ mdecl = build_nested_field_access_method (DECL_CONTEXT (decl),
+ TREE_TYPE (decl), id,
+ args, stmt);
}
DECL_FUNCTION_ACCESS_DECL (mdecl) = decl;
/* Return the access name */
- return FIELD_INNER_ACCESS (decl) = id;
+ return FIELD_NESTED_ACCESS (decl) = id;
}
-/* Build an field access method NAME. */
+/* Build a field access method NAME. */
static tree
-build_outer_field_access_method (tree class, tree type, tree name,
- tree args, tree body)
+build_nested_field_access_method (tree class, tree type, tree name,
+ tree args, tree body)
{
tree saved_current_function_decl, mdecl;
@@ -8587,7 +8678,7 @@ build_outer_method_access_method (tree decl)
/* Obtain an access identifier and mark it */
id = build_new_access_id ();
- OUTER_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
+ NESTED_FIELD_ACCESS_IDENTIFIER_P (id) = 1;
carg = TYPE_ARG_TYPES (TREE_TYPE (decl));
/* Create the arguments, as much as the original */
@@ -8653,7 +8744,7 @@ build_outer_method_access_method (tree decl)
others. Access methods to this$<n> are build on the fly if
necessary. This CAN'T be used to solely access this$<n-1> from
this$<n> (which alway yield to special cases and optimization, see
- for example build_outer_field_access). */
+ for example build_nested_field_access). */
static tree
build_access_to_thisn (tree from, tree to, int lc)
@@ -9456,15 +9547,15 @@ resolve_expression_name (tree id, tree *orig)
/* If we're processing an inner class and we're trying
to access a field belonging to an outer class, build
- the access to the field */
- if (!fs && outer_field_access_p (current_class, decl))
+ the access to the field. */
+ if (nested_field_access_p (current_class, decl))
{
- if (CLASS_STATIC (TYPE_NAME (current_class)))
+ if (!fs && CLASS_STATIC (TYPE_NAME (current_class)))
{
static_ref_err (id, DECL_NAME (decl), current_class);
return error_mark_node;
}
- access = build_outer_field_access (id, decl);
+ access = build_nested_field_access (id, decl);
if (orig)
*orig = access;
return access;
@@ -9550,11 +9641,7 @@ resolve_field_access (tree qual_wfl, tree *field_decl, tree *field_type)
field_ref = length;
/* In case we're dealing with a static array, we need to
- initialize its class before the array length can be fetched.
- It's also a good time to create a DECL_RTL for the field if
- none already exists, otherwise if the field was declared in a
- class found in an external file and hasn't been (and won't
- be) accessed for its value, none will be created. */
+ initialize its class before the array length can be fetched. */
if (TREE_CODE (where_found) == VAR_DECL && FIELD_STATIC (where_found))
{
build_static_field_ref (where_found);
@@ -9997,18 +10084,29 @@ resolve_qualified_expression_name (tree wfl, tree *found_decl,
decl = QUAL_RESOLUTION (q);
if (!type)
{
- if (TREE_CODE (decl) == FIELD_DECL && !FIELD_STATIC (decl))
+ if (TREE_CODE (decl) == FIELD_DECL
+ || TREE_CODE (decl) == VAR_DECL)
{
- if (current_this)
- *where_found = current_this;
- else
- {
- static_ref_err (qual_wfl, DECL_NAME (decl),
- current_class);
- return 1;
- }
- if (outer_field_access_p (current_class, decl))
- decl = build_outer_field_access (qual_wfl, decl);
+ if (TREE_CODE (decl) == FIELD_DECL
+ && !FIELD_STATIC (decl))
+ {
+ if (current_this)
+ *where_found = current_this;
+ else
+ {
+ static_ref_err (qual_wfl, DECL_NAME (decl),
+ current_class);
+ return 1;
+ }
+ }
+ else
+ {
+ *where_found = TREE_TYPE (decl);
+ if (TREE_CODE (*where_found) == POINTER_TYPE)
+ *where_found = TREE_TYPE (*where_found);
+ }
+ if (nested_field_access_p (current_class, decl))
+ decl = build_nested_field_access (qual_wfl, decl);
}
else
{
@@ -10117,7 +10215,7 @@ resolve_qualified_expression_name (tree wfl, tree *found_decl,
}
from_cast = from_super = 0;
- /* It's an access from a type but it isn't static, we
+ /* If it's an access from a type but isn't static, we
make it relative to `this'. */
if (!is_static && from_type)
decl = current_this;
@@ -10132,8 +10230,8 @@ resolve_qualified_expression_name (tree wfl, tree *found_decl,
return 1;
}
- /* We want to keep the location were found it, and the type
- we found. */
+ /* We want to keep the location where we found it, and the
+ type we found. */
*where_found = decl;
*type_found = type;
@@ -10141,10 +10239,18 @@ resolve_qualified_expression_name (tree wfl, tree *found_decl,
qualified this */
if (from_qualified_this)
{
- field_decl = build_outer_field_access (qual_wfl, field_decl);
+ field_decl
+ = build_nested_field_access (qual_wfl, field_decl);
from_qualified_this = 0;
}
+ /* If needed, generate accessors for static field access. */
+ if (is_static
+ && FIELD_PRIVATE (field_decl)
+ && flag_emit_class_files
+ && nested_field_access_p (current_class, field_decl))
+ field_decl = build_nested_field_access (qual_wfl, field_decl);
+
/* This is the decl found and eventually the next one to
search from */
decl = field_decl;
@@ -12124,10 +12230,10 @@ java_complete_lhs (tree node)
if ((nn = patch_string (TREE_OPERAND (node, 1))))
TREE_OPERAND (node, 1) = nn;
- if ((nn = outer_field_access_fix (wfl_op1, TREE_OPERAND (node, 0),
- TREE_OPERAND (node, 1))))
+ if ((nn = nested_field_access_fix (wfl_op1, TREE_OPERAND (node, 0),
+ TREE_OPERAND (node, 1))))
{
- /* We return error_mark_node if outer_field_access_fix
+ /* We return error_mark_node if nested_field_access_fix
detects we write into a final. */
if (nn == error_mark_node)
return error_mark_node;
@@ -14147,7 +14253,7 @@ patch_unaryop (tree node, tree wfl_op)
tree op = TREE_OPERAND (node, 0);
tree op_type = TREE_TYPE (op);
tree prom_type = NULL_TREE, value, decl;
- int outer_field_flag = 0;
+ int nested_field_flag = 0;
int code = TREE_CODE (node);
int error_found = 0;
@@ -14164,10 +14270,11 @@ patch_unaryop (tree node, tree wfl_op)
/* 15.14.2 Prefix Decrement Operator -- */
case PREDECREMENT_EXPR:
op = decl = extract_field_decl (op);
- outer_field_flag = outer_field_expanded_access_p (op, NULL, NULL, NULL);
+ nested_field_flag
+ = nested_field_expanded_access_p (op, NULL, NULL, NULL);
/* We might be trying to change an outer field accessed using
access method. */
- if (outer_field_flag)
+ if (nested_field_flag)
{
/* Retrieve the decl of the field we're trying to access. We
do that by first retrieving the function we would call to
@@ -14221,15 +14328,15 @@ patch_unaryop (tree node, tree wfl_op)
}
/* We remember we might be accessing an outer field */
- if (outer_field_flag)
+ if (nested_field_flag)
{
/* We re-generate an access to the field */
value = build2 (PLUS_EXPR, TREE_TYPE (op),
- build_outer_field_access (wfl_op, decl), value);
+ build_nested_field_access (wfl_op, decl), value);
/* And we patch the original access$() into a write
with plus_op as a rhs */
- return outer_field_access_fix (node, op, value);
+ return nested_field_access_fix (node, op, value);
}
/* And write back into the node. */
@@ -15813,7 +15920,7 @@ check_thrown_exceptions (
int is_array_call = 0;
/* Skip check within generated methods, such as access$<n>. */
- if (OUTER_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (current_function_decl)))
+ if (NESTED_FIELD_ACCESS_IDENTIFIER_P (DECL_NAME (current_function_decl)))
return;
if (this_expr != NULL_TREE
diff --git a/gcc/java/resource.c b/gcc/java/resource.c
index c8fe0fba711..2a0b6909197 100644
--- a/gcc/java/resource.c
+++ b/gcc/java/resource.c
@@ -93,7 +93,6 @@ compile_resource_data (const char *name, const char *buffer, int length)
layout_decl (decl, 0);
pushdecl (decl);
rest_of_decl_compilation (decl, global_bindings_p (), 0);
- make_decl_rtl (decl);
cgraph_varpool_finalize_decl (decl);
resources = tree_cons (NULL_TREE, decl, resources);
diff --git a/gcc/java/typeck.c b/gcc/java/typeck.c
index a15b1d7abb2..ae176da121d 100644
--- a/gcc/java/typeck.c
+++ b/gcc/java/typeck.c
@@ -142,7 +142,8 @@ convert (tree type, tree expr)
overflows in a narrowing integer conversion, but Java
doesn't care. */
tree tmp = fold (convert_to_integer (type, expr));
- TREE_OVERFLOW (tmp) = 0;
+ if (TREE_CODE (tmp) == INTEGER_CST)
+ TREE_OVERFLOW (tmp) = 0;
return tmp;
}
}
diff --git a/gcc/java/verify-glue.c b/gcc/java/verify-glue.c
index b8eed71736e..e743f98e8c1 100644
--- a/gcc/java/verify-glue.c
+++ b/gcc/java/verify-glue.c
@@ -30,12 +30,12 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
#include "coretypes.h"
#include "tm.h"
#include "tree.h"
-#include "errors.h"
#include "parse.h"
#include "verify.h"
#include "java-tree.h"
#include "java-except.h"
+#include "toplev.h"
void *
vfy_alloc (size_t bytes)
diff --git a/gcc/java/verify-impl.c b/gcc/java/verify-impl.c
index 30d12209449..db6078e9c97 100644
--- a/gcc/java/verify-impl.c
+++ b/gcc/java/verify-impl.c
@@ -26,21 +26,16 @@ details. */
verification. */
#define INVALID_STATE ((state *) -1)
-#ifdef VERIFY_DEBUG
-static void
-debug_print (const char *fmt, ...)
+static void ATTRIBUTE_PRINTF_1
+debug_print (const char *fmt ATTRIBUTE_UNUSED, ...)
{
+#ifdef VERIFY_DEBUG
va_list ap;
va_start (ap, fmt);
vfprintf (stderr, fmt, ap);
va_end (ap);
-}
-#else
-static void
-debug_print (const char *fmt ATTRIBUTE_UNUSED, ...)
-{
-}
#endif /* VERIFY_DEBUG */
+}
/* This started as a fairly ordinary verifier, and for the most part
it remains so. It works in the obvious way, by modeling the effect
diff --git a/gcc/lambda-code.c b/gcc/lambda-code.c
index 940f7470afe..c649d181b2d 100644
--- a/gcc/lambda-code.c
+++ b/gcc/lambda-code.c
@@ -23,7 +23,6 @@
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
#include "tree.h"
#include "target.h"
@@ -115,8 +114,8 @@
Fourier-Motzkin elimination is used to compute the bounds of the base space
of the lattice. */
-DEF_VEC_P(int);
-DEF_VEC_ALLOC_P(int,heap);
+DEF_VEC_I(int);
+DEF_VEC_ALLOC_I(int,heap);
static bool perfect_nestify (struct loops *,
struct loop *, VEC(tree,heap) *,
@@ -2165,17 +2164,30 @@ perfect_nest_p (struct loop *loop)
return true;
}
-/* Replace the USES of tree X in STMT with tree Y */
+/* Replace the USES of X in STMT, or uses with the same step as X with Y. */
static void
-replace_uses_of_x_with_y (tree stmt, tree x, tree y)
+replace_uses_equiv_to_x_with_y (struct loop *loop, tree stmt, tree x,
+ int xstep, tree y)
{
ssa_op_iter iter;
use_operand_p use_p;
FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
{
- if (USE_FROM_PTR (use_p) == x)
+ tree use = USE_FROM_PTR (use_p);
+ tree step = NULL_TREE;
+ tree access_fn = NULL_TREE;
+
+
+ access_fn = instantiate_parameters
+ (loop, analyze_scalar_evolution (loop, use));
+ if (access_fn != NULL_TREE && access_fn != chrec_dont_know)
+ step = evolution_part_in_loop_num (access_fn, loop->num);
+ if ((step && step != chrec_dont_know
+ && TREE_CODE (step) == INTEGER_CST
+ && int_cst_value (step) == xstep)
+ || USE_FROM_PTR (use_p) == x)
SET_USE (use_p, y);
}
}
@@ -2196,6 +2208,56 @@ stmt_uses_op (tree stmt, tree op)
return false;
}
+/* Return true if STMT is an exit PHI for LOOP */
+
+static bool
+exit_phi_for_loop_p (struct loop *loop, tree stmt)
+{
+
+ if (TREE_CODE (stmt) != PHI_NODE
+ || PHI_NUM_ARGS (stmt) != 1
+ || bb_for_stmt (stmt) != loop->single_exit->dest)
+ return false;
+
+ return true;
+}
+
+/* Return true if STMT can be put back into INNER, a loop by moving it to the
+ beginning of that loop. */
+
+static bool
+can_put_in_inner_loop (struct loop *inner, tree stmt)
+{
+ imm_use_iterator imm_iter;
+ use_operand_p use_p;
+ basic_block use_bb = NULL;
+
+ gcc_assert (TREE_CODE (stmt) == MODIFY_EXPR);
+ if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS)
+ || !expr_invariant_in_loop_p (inner, TREE_OPERAND (stmt, 1)))
+ return false;
+
+ /* We require that the basic block of all uses be the same, or the use be an
+ exit phi. */
+ FOR_EACH_IMM_USE_FAST (use_p, imm_iter, TREE_OPERAND (stmt, 0))
+ {
+ if (!exit_phi_for_loop_p (inner, USE_STMT (use_p)))
+ {
+ basic_block immbb = bb_for_stmt (USE_STMT (use_p));
+
+ if (!flow_bb_inside_loop_p (inner, immbb))
+ return false;
+ if (use_bb == NULL)
+ use_bb = immbb;
+ else if (immbb != use_bb)
+ return false;
+ }
+ }
+ return true;
+
+}
+
+
/* Return TRUE if LOOP is an imperfect nest that we can convert to a perfect
one. LOOPIVS is a vector of induction variables, one per loop.
ATM, we only handle imperfect nests of depth 2, where all of the statements
@@ -2215,8 +2277,6 @@ can_convert_to_perfect_nest (struct loop *loop,
if (!loop->inner || loop->inner->inner)
return false;
- /* We only handle moving the after-inner-body statements right now, so make
- sure all the statements we need to move are located in that position. */
bbs = get_loop_body (loop);
exit_condition = get_loop_exit_condition (loop);
for (i = 0; i < loop->num_nodes; i++)
@@ -2238,8 +2298,24 @@ can_convert_to_perfect_nest (struct loop *loop,
if (stmt_uses_op (stmt, iv))
goto fail;
- /* If the bb of a statement we care about isn't dominated by
- the header of the inner loop, then we are also screwed. */
+ /* If this is a simple operation like a cast that is invariant
+ in the inner loop, only used there, and we can place it
+ there, then it's not going to hurt us.
+ This means that we will propagate casts and other cheap
+ invariant operations *back*
+ into the inner loop if we can interchange the loop, on the
+ theory that we are going to gain a lot more by interchanging
+ the loop than we are by leaving some invariant code there for
+ some other pass to clean up. */
+ if (TREE_CODE (stmt) == MODIFY_EXPR
+ && is_gimple_cast (TREE_OPERAND (stmt, 1))
+ && can_put_in_inner_loop (loop->inner, stmt))
+ continue;
+
+ /* Otherwise, if the bb of a statement we care about isn't
+ dominated by the header of the inner loop, then we can't
+ handle this case right now. This test ensures that the
+ statement comes completely *after* the inner loop. */
if (!dominated_by_p (CDI_DOMINATORS,
bb_for_stmt (stmt),
loop->inner->header))
@@ -2301,6 +2377,7 @@ can_convert_to_perfect_nest (struct loop *loop,
}
Return FALSE if we can't make this loop into a perfect nest. */
+
static bool
perfect_nestify (struct loops *loops,
struct loop *loop,
@@ -2313,7 +2390,7 @@ perfect_nestify (struct loops *loops,
tree exit_condition;
tree then_label, else_label, cond_stmt;
basic_block preheaderbb, headerbb, bodybb, latchbb, olddest;
- size_t i;
+ int i;
block_stmt_iterator bsi;
bool insert_after;
edge e;
@@ -2394,11 +2471,12 @@ perfect_nestify (struct loops *loops,
set_immediate_dominator (CDI_DOMINATORS, latchbb, bodybb);
set_immediate_dominator (CDI_DOMINATORS, olddest, bodybb);
/* Create the new iv. */
- ivvar = create_tmp_var (integer_type_node, "perfectiv");
+ oldivvar = VEC_index (tree, loopivs, 0);
+ ivvar = create_tmp_var (TREE_TYPE (oldivvar), "perfectiv");
add_referenced_tmp_var (ivvar);
standard_iv_increment_position (newloop, &bsi, &insert_after);
create_iv (VEC_index (tree, lbounds, 0),
- build_int_cst (integer_type_node, VEC_index (int, steps, 0)),
+ build_int_cst (TREE_TYPE (oldivvar), VEC_index (int, steps, 0)),
ivvar, newloop, &bsi, insert_after, &ivvar, &ivvarinced);
/* Create the new upper bound. This may be not just a variable, so we copy
@@ -2416,46 +2494,99 @@ perfect_nestify (struct loops *loops,
bsi_insert_after (&bsi, stmt, BSI_SAME_STMT);
else
bsi_insert_before (&bsi, stmt, BSI_SAME_STMT);
-
+ update_stmt (stmt);
COND_EXPR_COND (exit_condition) = build (GE_EXPR,
boolean_type_node,
uboundvar,
ivvarinced);
-
- bbs = get_loop_body (loop);
- /* Now replace the induction variable in the moved statements with the
- correct loop induction variable. */
+ update_stmt (exit_condition);
+ bbs = get_loop_body_in_dom_order (loop);
+ /* Now move the statements, and replace the induction variable in the moved
+ statements with the correct loop induction variable. */
oldivvar = VEC_index (tree, loopivs, 0);
- for (i = 0; i < loop->num_nodes; i++)
+ for (i = loop->num_nodes - 1; i >= 0 ; i--)
{
block_stmt_iterator tobsi = bsi_last (bodybb);
if (bbs[i]->loop_father == loop)
{
- /* Note that the bsi only needs to be explicitly incremented
- when we don't move something, since it is automatically
- incremented when we do. */
- for (bsi = bsi_start (bbs[i]); !bsi_end_p (bsi);)
- {
- ssa_op_iter i;
- tree n, stmt = bsi_stmt (bsi);
+ /* If this is true, we are *before* the inner loop.
+ If this isn't true, we are *after* it.
- if (stmt == exit_condition
- || not_interesting_stmt (stmt)
- || stmt_is_bumper_for_loop (loop, stmt))
- {
- bsi_next (&bsi);
- continue;
- }
+ The only time can_convert_to_perfect_nest returns true when we
+ have statements before the inner loop is if they can be moved
+ into the inner loop.
- replace_uses_of_x_with_y (stmt, oldivvar, ivvar);
- bsi_move_before (&bsi, &tobsi);
+ The only time can_convert_to_perfect_nest returns true when we
+ have statements after the inner loop is if they can be moved into
+ the new split loop. */
- /* If the statement has any virtual operands, they may
- need to be rewired because the original loop may
- still reference them. */
- FOR_EACH_SSA_TREE_OPERAND (n, stmt, i, SSA_OP_ALL_VIRTUALS)
- mark_sym_for_renaming (SSA_NAME_VAR (n));
+ if (dominated_by_p (CDI_DOMINATORS, loop->inner->header, bbs[i]))
+ {
+ for (bsi = bsi_last (bbs[i]); !bsi_end_p (bsi);)
+ {
+ use_operand_p use_p;
+ imm_use_iterator imm_iter;
+ tree stmt = bsi_stmt (bsi);
+
+ if (stmt == exit_condition
+ || not_interesting_stmt (stmt)
+ || stmt_is_bumper_for_loop (loop, stmt))
+ {
+ if (!bsi_end_p (bsi))
+ bsi_prev (&bsi);
+ continue;
+ }
+ /* Move this statement back into the inner loop.
+ This looks a bit confusing, but we are really just
+ finding the first non-exit phi use and moving the
+ statement to the beginning of that use's basic
+ block. */
+ FOR_EACH_IMM_USE_SAFE (use_p, imm_iter,
+ TREE_OPERAND (stmt, 0))
+ {
+ tree imm_stmt = USE_STMT (use_p);
+ if (!exit_phi_for_loop_p (loop->inner, imm_stmt))
+ {
+ block_stmt_iterator tobsi = bsi_after_labels (bb_for_stmt (imm_stmt));
+ bsi_move_after (&bsi, &tobsi);
+ update_stmt (stmt);
+ BREAK_FROM_SAFE_IMM_USE (imm_iter);
+ }
+ }
+ }
+ }
+ else
+ {
+ /* Note that the bsi only needs to be explicitly incremented
+ when we don't move something, since it is automatically
+ incremented when we do. */
+ for (bsi = bsi_start (bbs[i]); !bsi_end_p (bsi);)
+ {
+ ssa_op_iter i;
+ tree n, stmt = bsi_stmt (bsi);
+
+ if (stmt == exit_condition
+ || not_interesting_stmt (stmt)
+ || stmt_is_bumper_for_loop (loop, stmt))
+ {
+ bsi_next (&bsi);
+ continue;
+ }
+
+ replace_uses_equiv_to_x_with_y (loop, stmt,
+ oldivvar,
+ VEC_index (int, steps, 0),
+ ivvar);
+ bsi_move_before (&bsi, &tobsi);
+
+ /* If the statement has any virtual operands, they may
+ need to be rewired because the original loop may
+ still reference them. */
+ FOR_EACH_SSA_TREE_OPERAND (n, stmt, i, SSA_OP_ALL_VIRTUALS)
+ mark_sym_for_renaming (SSA_NAME_VAR (n));
+ }
}
+
}
}
diff --git a/gcc/lambda-trans.c b/gcc/lambda-trans.c
index 2179c7f113e..a3a11f190ca 100644
--- a/gcc/lambda-trans.c
+++ b/gcc/lambda-trans.c
@@ -23,7 +23,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
#include "tree.h"
#include "target.h"
diff --git a/gcc/lcm.c b/gcc/lcm.c
index 210e4d600b1..330068e7d61 100644
--- a/gcc/lcm.c
+++ b/gcc/lcm.c
@@ -809,676 +809,3 @@ pre_edge_rev_lcm (FILE *file ATTRIBUTE_UNUSED, int n_exprs, sbitmap *transp,
return edge_list;
}
-/* Mode switching:
-
- The algorithm for setting the modes consists of scanning the insn list
- and finding all the insns which require a specific mode. Each insn gets
- a unique struct seginfo element. These structures are inserted into a list
- for each basic block. For each entity, there is an array of bb_info over
- the flow graph basic blocks (local var 'bb_info'), and contains a list
- of all insns within that basic block, in the order they are encountered.
-
- For each entity, any basic block WITHOUT any insns requiring a specific
- mode are given a single entry, without a mode. (Each basic block
- in the flow graph must have at least one entry in the segment table.)
-
- The LCM algorithm is then run over the flow graph to determine where to
- place the sets to the highest-priority value in respect of first the first
- insn in any one block. Any adjustments required to the transparency
- vectors are made, then the next iteration starts for the next-lower
- priority mode, till for each entity all modes are exhausted.
-
- More details are located in the code for optimize_mode_switching(). */
-
-/* This structure contains the information for each insn which requires
- either single or double mode to be set.
- MODE is the mode this insn must be executed in.
- INSN_PTR is the insn to be executed (may be the note that marks the
- beginning of a basic block).
- BBNUM is the flow graph basic block this insn occurs in.
- NEXT is the next insn in the same basic block. */
-struct seginfo
-{
- int mode;
- rtx insn_ptr;
- int bbnum;
- struct seginfo *next;
- HARD_REG_SET regs_live;
-};
-
-struct bb_info
-{
- struct seginfo *seginfo;
- int computing;
-};
-
-/* These bitmaps are used for the LCM algorithm. */
-
-#ifdef OPTIMIZE_MODE_SWITCHING
-static sbitmap *antic;
-static sbitmap *transp;
-static sbitmap *comp;
-
-static struct seginfo * new_seginfo (int, rtx, int, HARD_REG_SET);
-static void add_seginfo (struct bb_info *, struct seginfo *);
-static void reg_dies (rtx, HARD_REG_SET);
-static void reg_becomes_live (rtx, rtx, void *);
-static void make_preds_opaque (basic_block, int);
-#endif
-
-#ifdef OPTIMIZE_MODE_SWITCHING
-
-/* This function will allocate a new BBINFO structure, initialized
- with the MODE, INSN, and basic block BB parameters. */
-
-static struct seginfo *
-new_seginfo (int mode, rtx insn, int bb, HARD_REG_SET regs_live)
-{
- struct seginfo *ptr;
- ptr = xmalloc (sizeof (struct seginfo));
- ptr->mode = mode;
- ptr->insn_ptr = insn;
- ptr->bbnum = bb;
- ptr->next = NULL;
- COPY_HARD_REG_SET (ptr->regs_live, regs_live);
- return ptr;
-}
-
-/* Add a seginfo element to the end of a list.
- HEAD is a pointer to the list beginning.
- INFO is the structure to be linked in. */
-
-static void
-add_seginfo (struct bb_info *head, struct seginfo *info)
-{
- struct seginfo *ptr;
-
- if (head->seginfo == NULL)
- head->seginfo = info;
- else
- {
- ptr = head->seginfo;
- while (ptr->next != NULL)
- ptr = ptr->next;
- ptr->next = info;
- }
-}
-
-/* Make all predecessors of basic block B opaque, recursively, till we hit
- some that are already non-transparent, or an edge where aux is set; that
- denotes that a mode set is to be done on that edge.
- J is the bit number in the bitmaps that corresponds to the entity that
- we are currently handling mode-switching for. */
-
-static void
-make_preds_opaque (basic_block b, int j)
-{
- edge e;
- edge_iterator ei;
-
- FOR_EACH_EDGE (e, ei, b->preds)
- {
- basic_block pb = e->src;
-
- if (e->aux || ! TEST_BIT (transp[pb->index], j))
- continue;
-
- RESET_BIT (transp[pb->index], j);
- make_preds_opaque (pb, j);
- }
-}
-
-/* Record in LIVE that register REG died. */
-
-static void
-reg_dies (rtx reg, HARD_REG_SET live)
-{
- int regno, nregs;
-
- if (!REG_P (reg))
- return;
-
- regno = REGNO (reg);
- if (regno < FIRST_PSEUDO_REGISTER)
- for (nregs = hard_regno_nregs[regno][GET_MODE (reg)] - 1; nregs >= 0;
- nregs--)
- CLEAR_HARD_REG_BIT (live, regno + nregs);
-}
-
-/* Record in LIVE that register REG became live.
- This is called via note_stores. */
-
-static void
-reg_becomes_live (rtx reg, rtx setter ATTRIBUTE_UNUSED, void *live)
-{
- int regno, nregs;
-
- if (GET_CODE (reg) == SUBREG)
- reg = SUBREG_REG (reg);
-
- if (!REG_P (reg))
- return;
-
- regno = REGNO (reg);
- if (regno < FIRST_PSEUDO_REGISTER)
- for (nregs = hard_regno_nregs[regno][GET_MODE (reg)] - 1; nregs >= 0;
- nregs--)
- SET_HARD_REG_BIT (* (HARD_REG_SET *) live, regno + nregs);
-}
-
-/* Make sure if MODE_ENTRY is defined the MODE_EXIT is defined
- and vice versa. */
-#if defined (MODE_ENTRY) != defined (MODE_EXIT)
- #error "Both MODE_ENTRY and MODE_EXIT must be defined"
-#endif
-
-#if defined (MODE_ENTRY) && defined (MODE_EXIT)
-/* Split the fallthrough edge to the exit block, so that we can note
- that there NORMAL_MODE is required. Return the new block if it's
- inserted before the exit block. Otherwise return null. */
-
-static basic_block
-create_pre_exit (int n_entities, int *entity_map, const int *num_modes)
-{
- edge eg;
- edge_iterator ei;
- basic_block pre_exit;
-
- /* The only non-call predecessor at this stage is a block with a
- fallthrough edge; there can be at most one, but there could be
- none at all, e.g. when exit is called. */
- pre_exit = 0;
- FOR_EACH_EDGE (eg, ei, EXIT_BLOCK_PTR->preds)
- if (eg->flags & EDGE_FALLTHRU)
- {
- basic_block src_bb = eg->src;
- regset live_at_end = src_bb->global_live_at_end;
- rtx last_insn, ret_reg;
-
- gcc_assert (!pre_exit);
- /* If this function returns a value at the end, we have to
- insert the final mode switch before the return value copy
- to its hard register. */
- if (EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 1
- && NONJUMP_INSN_P ((last_insn = BB_END (src_bb)))
- && GET_CODE (PATTERN (last_insn)) == USE
- && GET_CODE ((ret_reg = XEXP (PATTERN (last_insn), 0))) == REG)
- {
- int ret_start = REGNO (ret_reg);
- int nregs = hard_regno_nregs[ret_start][GET_MODE (ret_reg)];
- int ret_end = ret_start + nregs;
- int short_block = 0;
- int maybe_builtin_apply = 0;
- int forced_late_switch = 0;
- rtx before_return_copy;
-
- do
- {
- rtx return_copy = PREV_INSN (last_insn);
- rtx return_copy_pat, copy_reg;
- int copy_start, copy_num;
- int j;
-
- if (INSN_P (return_copy))
- {
- if (GET_CODE (PATTERN (return_copy)) == USE
- && GET_CODE (XEXP (PATTERN (return_copy), 0)) == REG
- && (FUNCTION_VALUE_REGNO_P
- (REGNO (XEXP (PATTERN (return_copy), 0)))))
- {
- maybe_builtin_apply = 1;
- last_insn = return_copy;
- continue;
- }
- /* If the return register is not (in its entirety)
- likely spilled, the return copy might be
- partially or completely optimized away. */
- return_copy_pat = single_set (return_copy);
- if (!return_copy_pat)
- {
- return_copy_pat = PATTERN (return_copy);
- if (GET_CODE (return_copy_pat) != CLOBBER)
- break;
- }
- copy_reg = SET_DEST (return_copy_pat);
- if (GET_CODE (copy_reg) == REG)
- copy_start = REGNO (copy_reg);
- else if (GET_CODE (copy_reg) == SUBREG
- && GET_CODE (SUBREG_REG (copy_reg)) == REG)
- copy_start = REGNO (SUBREG_REG (copy_reg));
- else
- break;
- if (copy_start >= FIRST_PSEUDO_REGISTER)
- break;
- copy_num
- = hard_regno_nregs[copy_start][GET_MODE (copy_reg)];
-
- /* If the return register is not likely spilled, - as is
- the case for floating point on SH4 - then it might
- be set by an arithmetic operation that needs a
- different mode than the exit block. */
- for (j = n_entities - 1; j >= 0; j--)
- {
- int e = entity_map[j];
- int mode = MODE_NEEDED (e, return_copy);
-
- if (mode != num_modes[e] && mode != MODE_EXIT (e))
- break;
- }
- if (j >= 0)
- {
- /* For the SH4, floating point loads depend on fpscr,
- thus we might need to put the final mode switch
- after the return value copy. That is still OK,
- because a floating point return value does not
- conflict with address reloads. */
- if (copy_start >= ret_start
- && copy_start + copy_num <= ret_end
- && OBJECT_P (SET_SRC (return_copy_pat)))
- forced_late_switch = 1;
- break;
- }
-
- if (copy_start >= ret_start
- && copy_start + copy_num <= ret_end)
- nregs -= copy_num;
- else if (!maybe_builtin_apply
- || !FUNCTION_VALUE_REGNO_P (copy_start))
- break;
- last_insn = return_copy;
- }
- /* ??? Exception handling can lead to the return value
- copy being already separated from the return value use,
- as in unwind-dw2.c .
- Similarly, conditionally returning without a value,
- and conditionally using builtin_return can lead to an
- isolated use. */
- if (return_copy == BB_HEAD (src_bb))
- {
- short_block = 1;
- break;
- }
- last_insn = return_copy;
- }
- while (nregs);
-
- /* If we didn't see a full return value copy, verify that there
- is a plausible reason for this. If some, but not all of the
- return register is likely spilled, we can expect that there
- is a copy for the likely spilled part. */
- gcc_assert (!nregs
- || forced_late_switch
- || short_block
- || !(CLASS_LIKELY_SPILLED_P
- (REGNO_REG_CLASS (ret_start)))
- || (nregs
- != hard_regno_nregs[ret_start][GET_MODE (ret_reg)])
- /* For multi-hard-register floating point
- values, sometimes the likely-spilled part
- is ordinarily copied first, then the other
- part is set with an arithmetic operation.
- This doesn't actually cause reload
- failures, so let it pass. */
- || (GET_MODE_CLASS (GET_MODE (ret_reg)) != MODE_INT
- && nregs != 1));
-
- if (INSN_P (last_insn))
- {
- before_return_copy
- = emit_note_before (NOTE_INSN_DELETED, last_insn);
- /* Instructions preceding LAST_INSN in the same block might
- require a different mode than MODE_EXIT, so if we might
- have such instructions, keep them in a separate block
- from pre_exit. */
- if (last_insn != BB_HEAD (src_bb))
- src_bb = split_block (src_bb,
- PREV_INSN (before_return_copy))->dest;
- }
- else
- before_return_copy = last_insn;
- pre_exit = split_block (src_bb, before_return_copy)->src;
- }
- else
- {
- pre_exit = split_edge (eg);
- COPY_REG_SET (pre_exit->global_live_at_start, live_at_end);
- COPY_REG_SET (pre_exit->global_live_at_end, live_at_end);
- }
- }
-
- return pre_exit;
-}
-#endif
-
-/* Find all insns that need a particular mode setting, and insert the
- necessary mode switches. Return true if we did work. */
-
-int
-optimize_mode_switching (FILE *file)
-{
- rtx insn;
- int e;
- basic_block bb;
- int need_commit = 0;
- sbitmap *kill;
- struct edge_list *edge_list;
- static const int num_modes[] = NUM_MODES_FOR_MODE_SWITCHING;
-#define N_ENTITIES ARRAY_SIZE (num_modes)
- int entity_map[N_ENTITIES];
- struct bb_info *bb_info[N_ENTITIES];
- int i, j;
- int n_entities;
- int max_num_modes = 0;
- bool emited = false;
- basic_block post_entry ATTRIBUTE_UNUSED, pre_exit ATTRIBUTE_UNUSED;
-
- clear_bb_flags ();
-
- for (e = N_ENTITIES - 1, n_entities = 0; e >= 0; e--)
- if (OPTIMIZE_MODE_SWITCHING (e))
- {
- int entry_exit_extra = 0;
-
- /* Create the list of segments within each basic block.
- If NORMAL_MODE is defined, allow for two extra
- blocks split from the entry and exit block. */
-#if defined (MODE_ENTRY) && defined (MODE_EXIT)
- entry_exit_extra = 3;
-#endif
- bb_info[n_entities]
- = xcalloc (last_basic_block + entry_exit_extra, sizeof **bb_info);
- entity_map[n_entities++] = e;
- if (num_modes[e] > max_num_modes)
- max_num_modes = num_modes[e];
- }
-
- if (! n_entities)
- return 0;
-
-#if defined (MODE_ENTRY) && defined (MODE_EXIT)
- /* Split the edge from the entry block, so that we can note that
- there NORMAL_MODE is supplied. */
- post_entry = split_edge (single_succ_edge (ENTRY_BLOCK_PTR));
- pre_exit = create_pre_exit (n_entities, entity_map, num_modes);
-#endif
-
- /* Create the bitmap vectors. */
-
- antic = sbitmap_vector_alloc (last_basic_block, n_entities);
- transp = sbitmap_vector_alloc (last_basic_block, n_entities);
- comp = sbitmap_vector_alloc (last_basic_block, n_entities);
-
- sbitmap_vector_ones (transp, last_basic_block);
-
- for (j = n_entities - 1; j >= 0; j--)
- {
- int e = entity_map[j];
- int no_mode = num_modes[e];
- struct bb_info *info = bb_info[j];
-
- /* Determine what the first use (if any) need for a mode of entity E is.
- This will be the mode that is anticipatable for this block.
- Also compute the initial transparency settings. */
- FOR_EACH_BB (bb)
- {
- struct seginfo *ptr;
- int last_mode = no_mode;
- HARD_REG_SET live_now;
-
- REG_SET_TO_HARD_REG_SET (live_now,
- bb->global_live_at_start);
- for (insn = BB_HEAD (bb);
- insn != NULL && insn != NEXT_INSN (BB_END (bb));
- insn = NEXT_INSN (insn))
- {
- if (INSN_P (insn))
- {
- int mode = MODE_NEEDED (e, insn);
- rtx link;
-
- if (mode != no_mode && mode != last_mode)
- {
- last_mode = mode;
- ptr = new_seginfo (mode, insn, bb->index, live_now);
- add_seginfo (info + bb->index, ptr);
- RESET_BIT (transp[bb->index], j);
- }
-#ifdef MODE_AFTER
- last_mode = MODE_AFTER (last_mode, insn);
-#endif
- /* Update LIVE_NOW. */
- for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
- if (REG_NOTE_KIND (link) == REG_DEAD)
- reg_dies (XEXP (link, 0), live_now);
-
- note_stores (PATTERN (insn), reg_becomes_live, &live_now);
- for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
- if (REG_NOTE_KIND (link) == REG_UNUSED)
- reg_dies (XEXP (link, 0), live_now);
- }
- }
-
- info[bb->index].computing = last_mode;
- /* Check for blocks without ANY mode requirements. */
- if (last_mode == no_mode)
- {
- ptr = new_seginfo (no_mode, BB_END (bb), bb->index, live_now);
- add_seginfo (info + bb->index, ptr);
- }
- }
-#if defined (MODE_ENTRY) && defined (MODE_EXIT)
- {
- int mode = MODE_ENTRY (e);
-
- if (mode != no_mode)
- {
- bb = post_entry;
-
- /* By always making this nontransparent, we save
- an extra check in make_preds_opaque. We also
- need this to avoid confusing pre_edge_lcm when
- antic is cleared but transp and comp are set. */
- RESET_BIT (transp[bb->index], j);
-
- /* Insert a fake computing definition of MODE into entry
- blocks which compute no mode. This represents the mode on
- entry. */
- info[bb->index].computing = mode;
-
- if (pre_exit)
- info[pre_exit->index].seginfo->mode = MODE_EXIT (e);
- }
- }
-#endif /* NORMAL_MODE */
- }
-
- kill = sbitmap_vector_alloc (last_basic_block, n_entities);
- for (i = 0; i < max_num_modes; i++)
- {
- int current_mode[N_ENTITIES];
- sbitmap *delete;
- sbitmap *insert;
-
- /* Set the anticipatable and computing arrays. */
- sbitmap_vector_zero (antic, last_basic_block);
- sbitmap_vector_zero (comp, last_basic_block);
- for (j = n_entities - 1; j >= 0; j--)
- {
- int m = current_mode[j] = MODE_PRIORITY_TO_MODE (entity_map[j], i);
- struct bb_info *info = bb_info[j];
-
- FOR_EACH_BB (bb)
- {
- if (info[bb->index].seginfo->mode == m)
- SET_BIT (antic[bb->index], j);
-
- if (info[bb->index].computing == m)
- SET_BIT (comp[bb->index], j);
- }
- }
-
- /* Calculate the optimal locations for the
- placement mode switches to modes with priority I. */
-
- FOR_EACH_BB (bb)
- sbitmap_not (kill[bb->index], transp[bb->index]);
- edge_list = pre_edge_lcm (file, 1, transp, comp, antic,
- kill, &insert, &delete);
-
- for (j = n_entities - 1; j >= 0; j--)
- {
- /* Insert all mode sets that have been inserted by lcm. */
- int no_mode = num_modes[entity_map[j]];
-
- /* Wherever we have moved a mode setting upwards in the flow graph,
- the blocks between the new setting site and the now redundant
- computation ceases to be transparent for any lower-priority
- mode of the same entity. First set the aux field of each
- insertion site edge non-transparent, then propagate the new
- non-transparency from the redundant computation upwards till
- we hit an insertion site or an already non-transparent block. */
- for (e = NUM_EDGES (edge_list) - 1; e >= 0; e--)
- {
- edge eg = INDEX_EDGE (edge_list, e);
- int mode;
- basic_block src_bb;
- HARD_REG_SET live_at_edge;
- rtx mode_set;
-
- eg->aux = 0;
-
- if (! TEST_BIT (insert[e], j))
- continue;
-
- eg->aux = (void *)1;
-
- mode = current_mode[j];
- src_bb = eg->src;
-
- REG_SET_TO_HARD_REG_SET (live_at_edge,
- src_bb->global_live_at_end);
-
- start_sequence ();
- EMIT_MODE_SET (entity_map[j], mode, live_at_edge);
- mode_set = get_insns ();
- end_sequence ();
-
- /* Do not bother to insert empty sequence. */
- if (mode_set == NULL_RTX)
- continue;
-
- /* If this is an abnormal edge, we'll insert at the end
- of the previous block. */
- if (eg->flags & EDGE_ABNORMAL)
- {
- emited = true;
- if (JUMP_P (BB_END (src_bb)))
- emit_insn_before (mode_set, BB_END (src_bb));
- else
- {
- /* It doesn't make sense to switch to normal
- mode after a CALL_INSN. The cases in which a
- CALL_INSN may have an abnormal edge are
- sibcalls and EH edges. In the case of
- sibcalls, the dest basic-block is the
- EXIT_BLOCK, that runs in normal mode; it is
- assumed that a sibcall insn requires normal
- mode itself, so no mode switch would be
- required after the call (it wouldn't make
- sense, anyway). In the case of EH edges, EH
- entry points also start in normal mode, so a
- similar reasoning applies. */
- gcc_assert (NONJUMP_INSN_P (BB_END (src_bb)));
- emit_insn_after (mode_set, BB_END (src_bb));
- }
- bb_info[j][src_bb->index].computing = mode;
- RESET_BIT (transp[src_bb->index], j);
- }
- else
- {
- need_commit = 1;
- insert_insn_on_edge (mode_set, eg);
- }
- }
-
- FOR_EACH_BB_REVERSE (bb)
- if (TEST_BIT (delete[bb->index], j))
- {
- make_preds_opaque (bb, j);
- /* Cancel the 'deleted' mode set. */
- bb_info[j][bb->index].seginfo->mode = no_mode;
- }
- }
-
- sbitmap_vector_free (delete);
- sbitmap_vector_free (insert);
- clear_aux_for_edges ();
- free_edge_list (edge_list);
- }
-
- /* Now output the remaining mode sets in all the segments. */
- for (j = n_entities - 1; j >= 0; j--)
- {
- int no_mode = num_modes[entity_map[j]];
-
- FOR_EACH_BB_REVERSE (bb)
- {
- struct seginfo *ptr, *next;
- for (ptr = bb_info[j][bb->index].seginfo; ptr; ptr = next)
- {
- next = ptr->next;
- if (ptr->mode != no_mode)
- {
- rtx mode_set;
-
- start_sequence ();
- EMIT_MODE_SET (entity_map[j], ptr->mode, ptr->regs_live);
- mode_set = get_insns ();
- end_sequence ();
-
- /* Insert MODE_SET only if it is nonempty. */
- if (mode_set != NULL_RTX)
- {
- emited = true;
- if (NOTE_P (ptr->insn_ptr)
- && (NOTE_LINE_NUMBER (ptr->insn_ptr)
- == NOTE_INSN_BASIC_BLOCK))
- emit_insn_after (mode_set, ptr->insn_ptr);
- else
- emit_insn_before (mode_set, ptr->insn_ptr);
- }
- }
-
- free (ptr);
- }
- }
-
- free (bb_info[j]);
- }
-
- /* Finished. Free up all the things we've allocated. */
-
- sbitmap_vector_free (kill);
- sbitmap_vector_free (antic);
- sbitmap_vector_free (transp);
- sbitmap_vector_free (comp);
-
- if (need_commit)
- commit_edge_insertions ();
-
-#if defined (MODE_ENTRY) && defined (MODE_EXIT)
- cleanup_cfg (CLEANUP_NO_INSN_DEL);
-#else
- if (!need_commit && !emited)
- return 0;
-#endif
-
- max_regno = max_reg_num ();
- allocate_reg_info (max_regno, FALSE, FALSE);
- update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
- (PROP_DEATH_NOTES | PROP_KILL_DEAD_CODE
- | PROP_SCAN_DEAD_CODE));
-
- return 1;
-}
-#endif /* OPTIMIZE_MODE_SWITCHING */
diff --git a/gcc/local-alloc.c b/gcc/local-alloc.c
index 1cbc489e668..78b2ede46d7 100644
--- a/gcc/local-alloc.c
+++ b/gcc/local-alloc.c
@@ -76,6 +76,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "toplev.h"
#include "except.h"
#include "integrate.h"
+#include "reload.h"
+#include "ggc.h"
/* Next quantity number available for allocation. */
@@ -260,6 +262,10 @@ struct equivalence
/* The list of each instruction which initializes this register. */
rtx init_insns;
+
+ /* Nonzero if this had a preexisting REG_EQUIV note. */
+
+ int is_arg_equivalence;
};
/* reg_equiv[N] (where N is a pseudo reg number) is the equivalence
@@ -344,8 +350,7 @@ local_alloc (void)
/* Promote REG_EQUAL notes to REG_EQUIV notes and adjust status of affected
registers. */
- if (optimize)
- update_equiv_regs ();
+ update_equiv_regs ();
/* This sets the maximum number of quantities we can have. Quantity
numbers start at zero and we can have one for each pseudo. */
@@ -761,7 +766,9 @@ memref_used_between_p (rtx memref, rtx start, rtx end)
If such a register is only referenced once, try substituting its value
into the using insn. If it succeeds, we can eliminate the register
- completely. */
+ completely.
+
+ Initialize the REG_EQUIV_INIT array of initializing insns. */
static void
update_equiv_regs (void)
@@ -774,6 +781,8 @@ update_equiv_regs (void)
reg_equiv = xcalloc (max_regno, sizeof *reg_equiv);
INIT_REG_SET (&cleared_regs);
+ reg_equiv_init = ggc_alloc_cleared (max_regno * sizeof (rtx));
+ reg_equiv_init_size = max_regno;
init_alias_analysis ();
@@ -824,44 +833,30 @@ update_equiv_regs (void)
dest = SET_DEST (set);
src = SET_SRC (set);
- /* If this sets a MEM to the contents of a REG that is only used
- in a single basic block, see if the register is always equivalent
- to that memory location and if moving the store from INSN to the
- insn that set REG is safe. If so, put a REG_EQUIV note on the
- initializing insn.
-
- Don't add a REG_EQUIV note if the insn already has one. The existing
- REG_EQUIV is likely more useful than the one we are adding.
-
- If one of the regs in the address has reg_equiv[REGNO].replace set,
- then we can't add this REG_EQUIV note. The reg_equiv[REGNO].replace
- optimization may move the set of this register immediately before
- insn, which puts it after reg_equiv[REGNO].init_insns, and hence
- the mention in the REG_EQUIV note would be to an uninitialized
- pseudo. */
- /* ????? This test isn't good enough; we might see a MEM with a use of
- a pseudo register before we see its setting insn that will cause
- reg_equiv[].replace for that pseudo to be set.
- Equivalences to MEMs should be made in another pass, after the
- reg_equiv[].replace information has been gathered. */
-
- if (MEM_P (dest) && REG_P (src)
- && (regno = REGNO (src)) >= FIRST_PSEUDO_REGISTER
- && REG_BASIC_BLOCK (regno) >= 0
- && REG_N_SETS (regno) == 1
- && reg_equiv[regno].init_insns != 0
- && reg_equiv[regno].init_insns != const0_rtx
- && ! find_reg_note (XEXP (reg_equiv[regno].init_insns, 0),
- REG_EQUIV, NULL_RTX)
- && ! contains_replace_regs (XEXP (dest, 0)))
+ /* See if this is setting up the equivalence between an argument
+ register and its stack slot. */
+ note = find_reg_note (insn, REG_EQUIV, NULL_RTX);
+ if (note)
{
- rtx init_insn = XEXP (reg_equiv[regno].init_insns, 0);
- if (validate_equiv_mem (init_insn, src, dest)
- && ! memref_used_between_p (dest, init_insn, insn))
- REG_NOTES (init_insn)
- = gen_rtx_EXPR_LIST (REG_EQUIV, dest, REG_NOTES (init_insn));
+ gcc_assert (REG_P (dest));
+ regno = REGNO (dest);
+
+ /* Note that we don't want to clear reg_equiv_init even if there
+ are multiple sets of this register. */
+ reg_equiv[regno].is_arg_equivalence = 1;
+
+ /* Record for reload that this is an equivalencing insn. */
+ if (rtx_equal_p (src, XEXP (note, 0)))
+ reg_equiv_init[regno]
+ = gen_rtx_INSN_LIST (VOIDmode, insn, reg_equiv_init[regno]);
+
+ /* Continue normally in case this is a candidate for
+ replacements. */
}
+ if (!optimize)
+ continue;
+
/* We only handle the case of a pseudo register being set
once, or always to the same value. */
/* ??? The mn10200 port breaks if we add equivalences for
@@ -878,7 +873,7 @@ update_equiv_regs (void)
|| (regno = REGNO (dest)) < FIRST_PSEUDO_REGISTER
|| reg_equiv[regno].init_insns == const0_rtx
|| (CLASS_LIKELY_SPILLED_P (reg_preferred_class (regno))
- && MEM_P (src)))
+ && MEM_P (src) && ! reg_equiv[regno].is_arg_equivalence))
{
/* This might be setting a SUBREG of a pseudo, a pseudo that is
also set somewhere else to a constant. */
@@ -944,20 +939,27 @@ update_equiv_regs (void)
if (note)
{
int regno = REGNO (dest);
+ rtx x = XEXP (note, 0);
+
+ /* If we haven't done so, record for reload that this is an
+ equivalencing insn. */
+ if (!reg_equiv[regno].is_arg_equivalence
+ && (!MEM_P (x) || rtx_equal_p (src, x)))
+ reg_equiv_init[regno]
+ = gen_rtx_INSN_LIST (VOIDmode, insn, reg_equiv_init[regno]);
/* Record whether or not we created a REG_EQUIV note for a LABEL_REF.
We might end up substituting the LABEL_REF for uses of the
pseudo here or later. That kind of transformation may turn an
indirect jump into a direct jump, in which case we must rerun the
jump optimizer to ensure that the JUMP_LABEL fields are valid. */
- if (GET_CODE (XEXP (note, 0)) == LABEL_REF
- || (GET_CODE (XEXP (note, 0)) == CONST
- && GET_CODE (XEXP (XEXP (note, 0), 0)) == PLUS
- && (GET_CODE (XEXP (XEXP (XEXP (note, 0), 0), 0))
- == LABEL_REF)))
+ if (GET_CODE (x) == LABEL_REF
+ || (GET_CODE (x) == CONST
+ && GET_CODE (XEXP (x, 0)) == PLUS
+ && (GET_CODE (XEXP (XEXP (x, 0), 0)) == LABEL_REF)))
recorded_label_ref = 1;
- reg_equiv[regno].replacement = XEXP (note, 0);
+ reg_equiv[regno].replacement = x;
reg_equiv[regno].src_p = &SET_SRC (set);
reg_equiv[regno].loop_depth = loop_depth;
@@ -968,7 +970,6 @@ update_equiv_regs (void)
in local-alloc! */
REG_LIVE_LENGTH (regno) *= 2;
-
/* If the register is referenced exactly twice, meaning it is
set once and used once, indicate that the reference may be
replaced by the equivalence we computed above. Do this
@@ -978,20 +979,82 @@ update_equiv_regs (void)
and to reduce the number of registers alive across
calls. */
- if (REG_N_REFS (regno) == 2
- && (rtx_equal_p (XEXP (note, 0), src)
- || ! equiv_init_varies_p (src))
- && NONJUMP_INSN_P (insn)
- && equiv_init_movable_p (PATTERN (insn), regno))
- reg_equiv[regno].replace = 1;
+ if (REG_N_REFS (regno) == 2
+ && (rtx_equal_p (x, src)
+ || ! equiv_init_varies_p (src))
+ && NONJUMP_INSN_P (insn)
+ && equiv_init_movable_p (PATTERN (insn), regno))
+ reg_equiv[regno].replace = 1;
}
}
}
}
+ if (!optimize)
+ goto out;
+
+ /* A second pass, to gather additional equivalences with memory. This needs
+ to be done after we know which registers we are going to replace. */
+
+ for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
+ {
+ rtx set, src, dest;
+ unsigned regno;
+
+ if (! INSN_P (insn))
+ continue;
+
+ set = single_set (insn);
+ if (! set)
+ continue;
+
+ dest = SET_DEST (set);
+ src = SET_SRC (set);
+
+ /* If this sets a MEM to the contents of a REG that is only used
+ in a single basic block, see if the register is always equivalent
+ to that memory location and if moving the store from INSN to the
+ insn that set REG is safe. If so, put a REG_EQUIV note on the
+ initializing insn.
+
+ Don't add a REG_EQUIV note if the insn already has one. The existing
+ REG_EQUIV is likely more useful than the one we are adding.
+
+ If one of the regs in the address has reg_equiv[REGNO].replace set,
+ then we can't add this REG_EQUIV note. The reg_equiv[REGNO].replace
+ optimization may move the set of this register immediately before
+ insn, which puts it after reg_equiv[REGNO].init_insns, and hence
+ the mention in the REG_EQUIV note would be to an uninitialized
+ pseudo. */
+
+ if (MEM_P (dest) && REG_P (src)
+ && (regno = REGNO (src)) >= FIRST_PSEUDO_REGISTER
+ && REG_BASIC_BLOCK (regno) >= 0
+ && REG_N_SETS (regno) == 1
+ && reg_equiv[regno].init_insns != 0
+ && reg_equiv[regno].init_insns != const0_rtx
+ && ! find_reg_note (XEXP (reg_equiv[regno].init_insns, 0),
+ REG_EQUIV, NULL_RTX)
+ && ! contains_replace_regs (XEXP (dest, 0)))
+ {
+ rtx init_insn = XEXP (reg_equiv[regno].init_insns, 0);
+ if (validate_equiv_mem (init_insn, src, dest)
+ && ! memref_used_between_p (dest, init_insn, insn))
+ {
+ REG_NOTES (init_insn)
+ = gen_rtx_EXPR_LIST (REG_EQUIV, dest,
+ REG_NOTES (init_insn));
+ /* This insn makes the equivalence, not the one initializing
+ the register. */
+ reg_equiv_init[regno]
+ = gen_rtx_INSN_LIST (VOIDmode, insn, NULL_RTX);
+ }
+ }
+ }
+
/* Now scan all regs killed in an insn to see if any of them are
registers only used that once. If so, see if we can replace the
- reference with the equivalent from. If we can, delete the
+ reference with the equivalent form. If we can, delete the
initializing reference and this register will go away. If we
can't replace the reference, and the initializing reference is
within the same loop (or in an inner loop), then move the register
@@ -1077,6 +1140,12 @@ update_equiv_regs (void)
reg_equiv[regno].init_insns
= XEXP (reg_equiv[regno].init_insns, 1);
+
+ /* Remember to clear REGNO from all basic block's live
+ info. */
+ SET_REGNO_REG_SET (&cleared_regs, regno);
+ clear_regnos++;
+ reg_equiv_init[regno] = NULL_RTX;
}
/* Move the initialization of the register to just before
INSN. Update the flow information. */
@@ -1108,6 +1177,7 @@ update_equiv_regs (void)
info. */
SET_REGNO_REG_SET (&cleared_regs, regno);
clear_regnos++;
+ reg_equiv_init[regno] = NULL_RTX;
}
}
}
@@ -1141,6 +1211,7 @@ update_equiv_regs (void)
}
}
+ out:
/* Clean up. */
end_alias_analysis ();
CLEAR_REG_SET (&cleared_regs);
@@ -1166,13 +1237,18 @@ no_equiv (rtx reg, rtx store ATTRIBUTE_UNUSED, void *data ATTRIBUTE_UNUSED)
list = reg_equiv[regno].init_insns;
if (list == const0_rtx)
return;
+ reg_equiv[regno].init_insns = const0_rtx;
+ reg_equiv[regno].replacement = NULL_RTX;
+ /* This doesn't matter for equivalences made for argument registers, we
+ should keep their initialization insns. */
+ if (reg_equiv[regno].is_arg_equivalence)
+ return;
+ reg_equiv_init[regno] = NULL_RTX;
for (; list; list = XEXP (list, 1))
{
rtx insn = XEXP (list, 0);
remove_note (insn, find_reg_note (insn, REG_EQUIV, NULL_RTX));
}
- reg_equiv[regno].init_insns = const0_rtx;
- reg_equiv[regno].replacement = NULL_RTX;
}
/* Allocate hard regs to the pseudo regs used only within block number B.
diff --git a/gcc/longlong.h b/gcc/longlong.h
index 05a706517b8..57ae6343447 100644
--- a/gcc/longlong.h
+++ b/gcc/longlong.h
@@ -46,8 +46,8 @@
/* Define auxiliary asm macros.
- 1) umul_ppmm(high_prod, low_prod, multipler, multiplicand) multiplies two
- UWtype integers MULTIPLER and MULTIPLICAND, and generates a two UWtype
+ 1) umul_ppmm(high_prod, low_prod, multiplier, multiplicand) multiplies two
+ UWtype integers MULTIPLIER and MULTIPLICAND, and generates a two UWtype
word product in HIGH_PROD and LOW_PROD.
2) __umulsidi3(a,b) multiplies two UWtype integers A and B, and returns a
diff --git a/gcc/loop-doloop.c b/gcc/loop-doloop.c
index c6ef37e84d6..c40777b82c4 100644
--- a/gcc/loop-doloop.c
+++ b/gcc/loop-doloop.c
@@ -33,6 +33,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "cfgloop.h"
#include "output.h"
#include "params.h"
+#include "target.h"
/* This module is used to modify loops with a determinable number of
iterations to use special low-overhead looping instructions.
@@ -68,12 +69,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
/* Return the loop termination condition for PATTERN or zero
if it is not a decrement and branch jump insn. */
-static rtx
+rtx
doloop_condition_get (rtx pattern)
{
rtx cmp;
rtx inc;
rtx reg;
+ rtx inc_src;
rtx condition;
/* The canonical doloop pattern we expect is:
@@ -84,12 +86,13 @@ doloop_condition_get (rtx pattern)
(set (reg) (plus (reg) (const_int -1)))
(additional clobbers and uses)])
- Some machines (IA-64) make the decrement conditional on
- the condition as well, so we don't bother verifying the
- actual decrement. In summary, the branch must be the
- first entry of the parallel (also required by jump.c),
- and the second entry of the parallel must be a set of
- the loop counter register. */
+ Some targets (IA-64) wrap the set of the loop counter in
+ an if_then_else too.
+
+ In summary, the branch must be the first entry of the
+ parallel (also required by jump.c), and the second
+ entry of the parallel must be a set of the loop counter
+ register. */
if (GET_CODE (pattern) != PARALLEL)
return 0;
@@ -98,11 +101,21 @@ doloop_condition_get (rtx pattern)
inc = XVECEXP (pattern, 0, 1);
/* Check for (set (reg) (something)). */
- if (GET_CODE (inc) != SET || ! REG_P (SET_DEST (inc)))
+ if (GET_CODE (inc) != SET)
return 0;
-
- /* Extract loop counter register. */
reg = SET_DEST (inc);
+ if (! REG_P (reg))
+ return 0;
+
+ /* Check if something = (plus (reg) (const_int -1)).
+ On IA-64, this decrement is wrapped in an if_then_else. */
+ inc_src = SET_SRC (inc);
+ if (GET_CODE (inc_src) == IF_THEN_ELSE)
+ inc_src = XEXP (inc_src, 1);
+ if (GET_CODE (inc_src) != PLUS
+ || XEXP (inc_src, 0) != reg
+ || XEXP (inc_src, 1) != constm1_rtx)
+ return 0;
/* Check for (set (pc) (if_then_else (condition)
(label_ref (label))
@@ -117,15 +130,16 @@ doloop_condition_get (rtx pattern)
/* Extract loop termination condition. */
condition = XEXP (SET_SRC (cmp), 0);
- if ((GET_CODE (condition) != GE && GET_CODE (condition) != NE)
- || GET_CODE (XEXP (condition, 1)) != CONST_INT)
+ /* We expect a GE or NE comparison with 0 or 1. */
+ if ((GET_CODE (condition) != GE
+ && GET_CODE (condition) != NE)
+ || (XEXP (condition, 1) != const0_rtx
+ && XEXP (condition, 1) != const1_rtx))
return 0;
- if (XEXP (condition, 0) == reg)
- return condition;
-
- if (GET_CODE (XEXP (condition, 0)) == PLUS
- && XEXP (XEXP (condition, 0), 0) == reg)
+ if ((XEXP (condition, 0) == reg)
+ || (GET_CODE (XEXP (condition, 0)) == PLUS
+ && XEXP (XEXP (condition, 0), 0) == reg))
return condition;
/* ??? If a machine uses a funny comparison, we could return a
@@ -187,24 +201,15 @@ doloop_valid_p (struct loop *loop, struct niter_desc *desc)
insn != NEXT_INSN (BB_END (bb));
insn = NEXT_INSN (insn))
{
- /* A called function may clobber any special registers required for
- low-overhead looping. */
- if (CALL_P (insn))
- {
- if (dump_file)
- fprintf (dump_file, "Doloop: Function call in loop.\n");
- result = false;
- goto cleanup;
- }
-
- /* Some targets (eg, PPC) use the count register for branch on table
- instructions. ??? This should be a target specific check. */
- if (JUMP_P (insn)
- && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
- || GET_CODE (PATTERN (insn)) == ADDR_VEC))
+ /* Different targets have different necessities for low-overhead
+ looping. Call the back end for each instruction within the loop
+ to let it decide whether the insn prohibits a low-overhead loop.
+ It will then return the cause for it to emit to the dump file. */
+ const char * invalid = targetm.invalid_within_doloop (insn);
+ if (invalid)
{
if (dump_file)
- fprintf (dump_file, "Doloop: Computed branch in the loop.\n");
+ fprintf (dump_file, "Doloop: %s\n", invalid);
result = false;
goto cleanup;
}
diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c
index bacf8382b7f..ba0d64c78f3 100644
--- a/gcc/loop-iv.c
+++ b/gcc/loop-iv.c
@@ -844,7 +844,7 @@ iv_analyze_biv (rtx def, struct rtx_iv *iv)
if (dump_file)
{
- fprintf (dump_file, "Analysing ");
+ fprintf (dump_file, "Analyzing ");
print_rtl (dump_file, def);
fprintf (dump_file, " for bivness.\n");
}
@@ -927,7 +927,7 @@ iv_analyze_op (rtx insn, rtx op, struct rtx_iv *iv)
if (dump_file)
{
- fprintf (dump_file, "Analysing operand ");
+ fprintf (dump_file, "Analyzing operand ");
print_rtl (dump_file, op);
fprintf (dump_file, " of insn ");
print_rtl_single (dump_file, insn);
@@ -1012,7 +1012,7 @@ iv_analyze (rtx insn, rtx def, struct rtx_iv *iv)
if (dump_file)
{
- fprintf (dump_file, "Analysing def of ");
+ fprintf (dump_file, "Analyzing def of ");
print_rtl (dump_file, def);
fprintf (dump_file, " in insn ");
print_rtl_single (dump_file, insn);
diff --git a/gcc/loop-unroll.c b/gcc/loop-unroll.c
index 68512d02a5a..72fda46e391 100644
--- a/gcc/loop-unroll.c
+++ b/gcc/loop-unroll.c
@@ -790,7 +790,7 @@ unroll_loop_constant_iterations (struct loops *loops, struct loop *loop)
if (exit_at_end)
{
- basic_block exit_block = desc->in_edge->src->rbi->copy;
+ basic_block exit_block = get_bb_copy (desc->in_edge->src);
/* Find a new in and out edge; they are in the last copy we have made. */
if (EDGE_SUCC (exit_block, 0)->dest == desc->out_edge->dest)
@@ -1110,7 +1110,7 @@ unroll_loop_runtime_iterations (struct loops *loops, struct loop *loop)
if (exit_at_end)
{
- basic_block exit_block = desc->in_edge->src->rbi->copy;
+ basic_block exit_block = get_bb_copy (desc->in_edge->src);
/* Find a new in and out edge; they are in the last copy we have
made. */
@@ -2058,9 +2058,11 @@ apply_opt_in_copies (struct opt_info *opt_info,
for (i = opt_info->first_new_block; i < (unsigned) last_basic_block; i++)
{
bb = BASIC_BLOCK (i);
- orig_bb = bb->rbi->original;
+ orig_bb = get_bb_original (bb);
- delta = determine_split_iv_delta (bb->rbi->copy_number, n_copies,
+ /* bb->aux holds position in copy sequence initialized by
+ duplicate_loop_to_header_edge. */
+ delta = determine_split_iv_delta ((size_t)bb->aux, n_copies,
unrolling);
orig_insn = BB_HEAD (orig_bb);
for (insn = BB_HEAD (bb); insn != NEXT_INSN (BB_END (bb)); insn = next)
@@ -2124,12 +2126,12 @@ apply_opt_in_copies (struct opt_info *opt_info,
/* Rewrite also the original loop body. Find them as originals of the blocks
in the last copied iteration, i.e. those that have
- bb->rbi->original->copy == bb. */
+ get_bb_copy (get_bb_original (bb)) == bb. */
for (i = opt_info->first_new_block; i < (unsigned) last_basic_block; i++)
{
bb = BASIC_BLOCK (i);
- orig_bb = bb->rbi->original;
- if (orig_bb->rbi->copy != bb)
+ orig_bb = get_bb_original (bb);
+ if (get_bb_copy (orig_bb) != bb)
continue;
delta = determine_split_iv_delta (0, n_copies, unrolling);
diff --git a/gcc/loop-unswitch.c b/gcc/loop-unswitch.c
index ef4e5b8c2d4..27a8bca2625 100644
--- a/gcc/loop-unswitch.c
+++ b/gcc/loop-unswitch.c
@@ -431,10 +431,10 @@ unswitch_loop (struct loops *loops, struct loop *loop, basic_block unswitch_on,
entry->flags |= irred_flag;
/* Record the block with condition we unswitch on. */
- unswitch_on_alt = unswitch_on->rbi->copy;
+ unswitch_on_alt = get_bb_copy (unswitch_on);
true_edge = BRANCH_EDGE (unswitch_on_alt);
false_edge = FALLTHRU_EDGE (unswitch_on);
- latch_edge = single_succ_edge (loop->latch->rbi->copy);
+ latch_edge = single_succ_edge (get_bb_copy (loop->latch));
/* Create a block with the condition. */
prob = true_edge->probability;
@@ -465,7 +465,7 @@ unswitch_loop (struct loops *loops, struct loop *loop, basic_block unswitch_on,
/* Loopify from the copy of LOOP body, constructing the new loop. */
nloop = loopify (loops, latch_edge,
- single_pred_edge (loop->header->rbi->copy), switch_bb,
+ single_pred_edge (get_bb_copy (loop->header)), switch_bb,
BRANCH_EDGE (switch_bb), FALLTHRU_EDGE (switch_bb), true);
/* Remove branches that are now unreachable in new loops. */
diff --git a/gcc/loop.c b/gcc/loop.c
index eaa1bd931b7..a25c1c0cbac 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -6719,7 +6719,7 @@ valid_initial_value_p (rtx x, rtx insn, int call_seen, rtx loop_start)
some machines, don't use any hard registers at all. */
if (REGNO (x) < FIRST_PSEUDO_REGISTER
&& (SMALL_REGISTER_CLASSES
- || (call_used_regs[REGNO (x)] && call_seen)))
+ || (call_seen && call_used_regs[REGNO (x)])))
return 0;
/* Don't use registers that have been clobbered before the start of the
diff --git a/gcc/machmode.h b/gcc/machmode.h
index c978c0a9b52..10016f86ac7 100644
--- a/gcc/machmode.h
+++ b/gcc/machmode.h
@@ -115,6 +115,9 @@ extern const unsigned char mode_nunits[NUM_MACHINE_MODES];
extern const unsigned char mode_wider[NUM_MACHINE_MODES];
#define GET_MODE_WIDER_MODE(MODE) mode_wider[MODE]
+extern const unsigned char mode_2xwider[NUM_MACHINE_MODES];
+#define GET_MODE_2XWIDER_MODE(MODE) mode_2xwider[MODE]
+
/* Return the mode for data of a given size SIZE and mode class CLASS.
If LIMIT is nonzero, then don't use modes bigger than MAX_FIXED_MODE_SIZE.
The value is BLKmode if no other mode is found. */
diff --git a/gcc/mode-switching.c b/gcc/mode-switching.c
new file mode 100644
index 00000000000..c66fd3c5998
--- /dev/null
+++ b/gcc/mode-switching.c
@@ -0,0 +1,711 @@
+/* CPU mode switching
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+ 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. */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
+#include "rtl.h"
+#include "regs.h"
+#include "hard-reg-set.h"
+#include "flags.h"
+#include "real.h"
+#include "insn-config.h"
+#include "recog.h"
+#include "basic-block.h"
+#include "output.h"
+#include "tm_p.h"
+#include "function.h"
+
+/* We want target macros for the mode switching code to be able to refer
+ to instruction attribute values. */
+#include "insn-attr.h"
+
+#ifdef OPTIMIZE_MODE_SWITCHING
+
+/* The algorithm for setting the modes consists of scanning the insn list
+ and finding all the insns which require a specific mode. Each insn gets
+ a unique struct seginfo element. These structures are inserted into a list
+ for each basic block. For each entity, there is an array of bb_info over
+ the flow graph basic blocks (local var 'bb_info'), and contains a list
+ of all insns within that basic block, in the order they are encountered.
+
+ For each entity, any basic block WITHOUT any insns requiring a specific
+ mode are given a single entry, without a mode. (Each basic block
+ in the flow graph must have at least one entry in the segment table.)
+
+ The LCM algorithm is then run over the flow graph to determine where to
+ place the sets to the highest-priority value in respect of first the first
+ insn in any one block. Any adjustments required to the transparency
+ vectors are made, then the next iteration starts for the next-lower
+ priority mode, till for each entity all modes are exhausted.
+
+ More details are located in the code for optimize_mode_switching(). */
+
+/* This structure contains the information for each insn which requires
+ either single or double mode to be set.
+ MODE is the mode this insn must be executed in.
+ INSN_PTR is the insn to be executed (may be the note that marks the
+ beginning of a basic block).
+ BBNUM is the flow graph basic block this insn occurs in.
+ NEXT is the next insn in the same basic block. */
+struct seginfo
+{
+ int mode;
+ rtx insn_ptr;
+ int bbnum;
+ struct seginfo *next;
+ HARD_REG_SET regs_live;
+};
+
+struct bb_info
+{
+ struct seginfo *seginfo;
+ int computing;
+};
+
+/* These bitmaps are used for the LCM algorithm. */
+
+static sbitmap *antic;
+static sbitmap *transp;
+static sbitmap *comp;
+
+static struct seginfo * new_seginfo (int, rtx, int, HARD_REG_SET);
+static void add_seginfo (struct bb_info *, struct seginfo *);
+static void reg_dies (rtx, HARD_REG_SET);
+static void reg_becomes_live (rtx, rtx, void *);
+static void make_preds_opaque (basic_block, int);
+
+
+/* This function will allocate a new BBINFO structure, initialized
+ with the MODE, INSN, and basic block BB parameters. */
+
+static struct seginfo *
+new_seginfo (int mode, rtx insn, int bb, HARD_REG_SET regs_live)
+{
+ struct seginfo *ptr;
+ ptr = xmalloc (sizeof (struct seginfo));
+ ptr->mode = mode;
+ ptr->insn_ptr = insn;
+ ptr->bbnum = bb;
+ ptr->next = NULL;
+ COPY_HARD_REG_SET (ptr->regs_live, regs_live);
+ return ptr;
+}
+
+/* Add a seginfo element to the end of a list.
+ HEAD is a pointer to the list beginning.
+ INFO is the structure to be linked in. */
+
+static void
+add_seginfo (struct bb_info *head, struct seginfo *info)
+{
+ struct seginfo *ptr;
+
+ if (head->seginfo == NULL)
+ head->seginfo = info;
+ else
+ {
+ ptr = head->seginfo;
+ while (ptr->next != NULL)
+ ptr = ptr->next;
+ ptr->next = info;
+ }
+}
+
+/* Make all predecessors of basic block B opaque, recursively, till we hit
+ some that are already non-transparent, or an edge where aux is set; that
+ denotes that a mode set is to be done on that edge.
+ J is the bit number in the bitmaps that corresponds to the entity that
+ we are currently handling mode-switching for. */
+
+static void
+make_preds_opaque (basic_block b, int j)
+{
+ edge e;
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, b->preds)
+ {
+ basic_block pb = e->src;
+
+ if (e->aux || ! TEST_BIT (transp[pb->index], j))
+ continue;
+
+ RESET_BIT (transp[pb->index], j);
+ make_preds_opaque (pb, j);
+ }
+}
+
+/* Record in LIVE that register REG died. */
+
+static void
+reg_dies (rtx reg, HARD_REG_SET live)
+{
+ int regno, nregs;
+
+ if (!REG_P (reg))
+ return;
+
+ regno = REGNO (reg);
+ if (regno < FIRST_PSEUDO_REGISTER)
+ for (nregs = hard_regno_nregs[regno][GET_MODE (reg)] - 1; nregs >= 0;
+ nregs--)
+ CLEAR_HARD_REG_BIT (live, regno + nregs);
+}
+
+/* Record in LIVE that register REG became live.
+ This is called via note_stores. */
+
+static void
+reg_becomes_live (rtx reg, rtx setter ATTRIBUTE_UNUSED, void *live)
+{
+ int regno, nregs;
+
+ if (GET_CODE (reg) == SUBREG)
+ reg = SUBREG_REG (reg);
+
+ if (!REG_P (reg))
+ return;
+
+ regno = REGNO (reg);
+ if (regno < FIRST_PSEUDO_REGISTER)
+ for (nregs = hard_regno_nregs[regno][GET_MODE (reg)] - 1; nregs >= 0;
+ nregs--)
+ SET_HARD_REG_BIT (* (HARD_REG_SET *) live, regno + nregs);
+}
+
+/* Make sure if MODE_ENTRY is defined the MODE_EXIT is defined
+ and vice versa. */
+#if defined (MODE_ENTRY) != defined (MODE_EXIT)
+ #error "Both MODE_ENTRY and MODE_EXIT must be defined"
+#endif
+
+#if defined (MODE_ENTRY) && defined (MODE_EXIT)
+/* Split the fallthrough edge to the exit block, so that we can note
+ that there NORMAL_MODE is required. Return the new block if it's
+ inserted before the exit block. Otherwise return null. */
+
+static basic_block
+create_pre_exit (int n_entities, int *entity_map, const int *num_modes)
+{
+ edge eg;
+ edge_iterator ei;
+ basic_block pre_exit;
+
+ /* The only non-call predecessor at this stage is a block with a
+ fallthrough edge; there can be at most one, but there could be
+ none at all, e.g. when exit is called. */
+ pre_exit = 0;
+ FOR_EACH_EDGE (eg, ei, EXIT_BLOCK_PTR->preds)
+ if (eg->flags & EDGE_FALLTHRU)
+ {
+ basic_block src_bb = eg->src;
+ regset live_at_end = src_bb->global_live_at_end;
+ rtx last_insn, ret_reg;
+
+ gcc_assert (!pre_exit);
+ /* If this function returns a value at the end, we have to
+ insert the final mode switch before the return value copy
+ to its hard register. */
+ if (EDGE_COUNT (EXIT_BLOCK_PTR->preds) == 1
+ && NONJUMP_INSN_P ((last_insn = BB_END (src_bb)))
+ && GET_CODE (PATTERN (last_insn)) == USE
+ && GET_CODE ((ret_reg = XEXP (PATTERN (last_insn), 0))) == REG)
+ {
+ int ret_start = REGNO (ret_reg);
+ int nregs = hard_regno_nregs[ret_start][GET_MODE (ret_reg)];
+ int ret_end = ret_start + nregs;
+ int short_block = 0;
+ int maybe_builtin_apply = 0;
+ int forced_late_switch = 0;
+ rtx before_return_copy;
+
+ do
+ {
+ rtx return_copy = PREV_INSN (last_insn);
+ rtx return_copy_pat, copy_reg;
+ int copy_start, copy_num;
+ int j;
+
+ if (INSN_P (return_copy))
+ {
+ if (GET_CODE (PATTERN (return_copy)) == USE
+ && GET_CODE (XEXP (PATTERN (return_copy), 0)) == REG
+ && (FUNCTION_VALUE_REGNO_P
+ (REGNO (XEXP (PATTERN (return_copy), 0)))))
+ {
+ maybe_builtin_apply = 1;
+ last_insn = return_copy;
+ continue;
+ }
+ /* If the return register is not (in its entirety)
+ likely spilled, the return copy might be
+ partially or completely optimized away. */
+ return_copy_pat = single_set (return_copy);
+ if (!return_copy_pat)
+ {
+ return_copy_pat = PATTERN (return_copy);
+ if (GET_CODE (return_copy_pat) != CLOBBER)
+ break;
+ }
+ copy_reg = SET_DEST (return_copy_pat);
+ if (GET_CODE (copy_reg) == REG)
+ copy_start = REGNO (copy_reg);
+ else if (GET_CODE (copy_reg) == SUBREG
+ && GET_CODE (SUBREG_REG (copy_reg)) == REG)
+ copy_start = REGNO (SUBREG_REG (copy_reg));
+ else
+ break;
+ if (copy_start >= FIRST_PSEUDO_REGISTER)
+ break;
+ copy_num
+ = hard_regno_nregs[copy_start][GET_MODE (copy_reg)];
+
+ /* If the return register is not likely spilled, - as is
+ the case for floating point on SH4 - then it might
+ be set by an arithmetic operation that needs a
+ different mode than the exit block. */
+ for (j = n_entities - 1; j >= 0; j--)
+ {
+ int e = entity_map[j];
+ int mode = MODE_NEEDED (e, return_copy);
+
+ if (mode != num_modes[e] && mode != MODE_EXIT (e))
+ break;
+ }
+ if (j >= 0)
+ {
+ /* For the SH4, floating point loads depend on fpscr,
+ thus we might need to put the final mode switch
+ after the return value copy. That is still OK,
+ because a floating point return value does not
+ conflict with address reloads. */
+ if (copy_start >= ret_start
+ && copy_start + copy_num <= ret_end
+ && OBJECT_P (SET_SRC (return_copy_pat)))
+ forced_late_switch = 1;
+ break;
+ }
+
+ if (copy_start >= ret_start
+ && copy_start + copy_num <= ret_end)
+ nregs -= copy_num;
+ else if (!maybe_builtin_apply
+ || !FUNCTION_VALUE_REGNO_P (copy_start))
+ break;
+ last_insn = return_copy;
+ }
+ /* ??? Exception handling can lead to the return value
+ copy being already separated from the return value use,
+ as in unwind-dw2.c .
+ Similarly, conditionally returning without a value,
+ and conditionally using builtin_return can lead to an
+ isolated use. */
+ if (return_copy == BB_HEAD (src_bb))
+ {
+ short_block = 1;
+ break;
+ }
+ last_insn = return_copy;
+ }
+ while (nregs);
+
+ /* If we didn't see a full return value copy, verify that there
+ is a plausible reason for this. If some, but not all of the
+ return register is likely spilled, we can expect that there
+ is a copy for the likely spilled part. */
+ gcc_assert (!nregs
+ || forced_late_switch
+ || short_block
+ || !(CLASS_LIKELY_SPILLED_P
+ (REGNO_REG_CLASS (ret_start)))
+ || (nregs
+ != hard_regno_nregs[ret_start][GET_MODE (ret_reg)])
+ /* For multi-hard-register floating point
+ values, sometimes the likely-spilled part
+ is ordinarily copied first, then the other
+ part is set with an arithmetic operation.
+ This doesn't actually cause reload
+ failures, so let it pass. */
+ || (GET_MODE_CLASS (GET_MODE (ret_reg)) != MODE_INT
+ && nregs != 1));
+
+ if (INSN_P (last_insn))
+ {
+ before_return_copy
+ = emit_note_before (NOTE_INSN_DELETED, last_insn);
+ /* Instructions preceding LAST_INSN in the same block might
+ require a different mode than MODE_EXIT, so if we might
+ have such instructions, keep them in a separate block
+ from pre_exit. */
+ if (last_insn != BB_HEAD (src_bb))
+ src_bb = split_block (src_bb,
+ PREV_INSN (before_return_copy))->dest;
+ }
+ else
+ before_return_copy = last_insn;
+ pre_exit = split_block (src_bb, before_return_copy)->src;
+ }
+ else
+ {
+ pre_exit = split_edge (eg);
+ COPY_REG_SET (pre_exit->global_live_at_start, live_at_end);
+ COPY_REG_SET (pre_exit->global_live_at_end, live_at_end);
+ }
+ }
+
+ return pre_exit;
+}
+#endif
+
+/* Find all insns that need a particular mode setting, and insert the
+ necessary mode switches. Return true if we did work. */
+
+int
+optimize_mode_switching (FILE *file)
+{
+ rtx insn;
+ int e;
+ basic_block bb;
+ int need_commit = 0;
+ sbitmap *kill;
+ struct edge_list *edge_list;
+ static const int num_modes[] = NUM_MODES_FOR_MODE_SWITCHING;
+#define N_ENTITIES ARRAY_SIZE (num_modes)
+ int entity_map[N_ENTITIES];
+ struct bb_info *bb_info[N_ENTITIES];
+ int i, j;
+ int n_entities;
+ int max_num_modes = 0;
+ bool emited = false;
+ basic_block post_entry ATTRIBUTE_UNUSED, pre_exit ATTRIBUTE_UNUSED;
+
+ clear_bb_flags ();
+
+ for (e = N_ENTITIES - 1, n_entities = 0; e >= 0; e--)
+ if (OPTIMIZE_MODE_SWITCHING (e))
+ {
+ int entry_exit_extra = 0;
+
+ /* Create the list of segments within each basic block.
+ If NORMAL_MODE is defined, allow for two extra
+ blocks split from the entry and exit block. */
+#if defined (MODE_ENTRY) && defined (MODE_EXIT)
+ entry_exit_extra = 3;
+#endif
+ bb_info[n_entities]
+ = xcalloc (last_basic_block + entry_exit_extra, sizeof **bb_info);
+ entity_map[n_entities++] = e;
+ if (num_modes[e] > max_num_modes)
+ max_num_modes = num_modes[e];
+ }
+
+ if (! n_entities)
+ return 0;
+
+#if defined (MODE_ENTRY) && defined (MODE_EXIT)
+ /* Split the edge from the entry block, so that we can note that
+ there NORMAL_MODE is supplied. */
+ post_entry = split_edge (single_succ_edge (ENTRY_BLOCK_PTR));
+ pre_exit = create_pre_exit (n_entities, entity_map, num_modes);
+#endif
+
+ /* Create the bitmap vectors. */
+
+ antic = sbitmap_vector_alloc (last_basic_block, n_entities);
+ transp = sbitmap_vector_alloc (last_basic_block, n_entities);
+ comp = sbitmap_vector_alloc (last_basic_block, n_entities);
+
+ sbitmap_vector_ones (transp, last_basic_block);
+
+ for (j = n_entities - 1; j >= 0; j--)
+ {
+ int e = entity_map[j];
+ int no_mode = num_modes[e];
+ struct bb_info *info = bb_info[j];
+
+ /* Determine what the first use (if any) need for a mode of entity E is.
+ This will be the mode that is anticipatable for this block.
+ Also compute the initial transparency settings. */
+ FOR_EACH_BB (bb)
+ {
+ struct seginfo *ptr;
+ int last_mode = no_mode;
+ HARD_REG_SET live_now;
+
+ REG_SET_TO_HARD_REG_SET (live_now,
+ bb->global_live_at_start);
+ for (insn = BB_HEAD (bb);
+ insn != NULL && insn != NEXT_INSN (BB_END (bb));
+ insn = NEXT_INSN (insn))
+ {
+ if (INSN_P (insn))
+ {
+ int mode = MODE_NEEDED (e, insn);
+ rtx link;
+
+ if (mode != no_mode && mode != last_mode)
+ {
+ last_mode = mode;
+ ptr = new_seginfo (mode, insn, bb->index, live_now);
+ add_seginfo (info + bb->index, ptr);
+ RESET_BIT (transp[bb->index], j);
+ }
+#ifdef MODE_AFTER
+ last_mode = MODE_AFTER (last_mode, insn);
+#endif
+ /* Update LIVE_NOW. */
+ for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
+ if (REG_NOTE_KIND (link) == REG_DEAD)
+ reg_dies (XEXP (link, 0), live_now);
+
+ note_stores (PATTERN (insn), reg_becomes_live, &live_now);
+ for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
+ if (REG_NOTE_KIND (link) == REG_UNUSED)
+ reg_dies (XEXP (link, 0), live_now);
+ }
+ }
+
+ info[bb->index].computing = last_mode;
+ /* Check for blocks without ANY mode requirements. */
+ if (last_mode == no_mode)
+ {
+ ptr = new_seginfo (no_mode, BB_END (bb), bb->index, live_now);
+ add_seginfo (info + bb->index, ptr);
+ }
+ }
+#if defined (MODE_ENTRY) && defined (MODE_EXIT)
+ {
+ int mode = MODE_ENTRY (e);
+
+ if (mode != no_mode)
+ {
+ bb = post_entry;
+
+ /* By always making this nontransparent, we save
+ an extra check in make_preds_opaque. We also
+ need this to avoid confusing pre_edge_lcm when
+ antic is cleared but transp and comp are set. */
+ RESET_BIT (transp[bb->index], j);
+
+ /* Insert a fake computing definition of MODE into entry
+ blocks which compute no mode. This represents the mode on
+ entry. */
+ info[bb->index].computing = mode;
+
+ if (pre_exit)
+ info[pre_exit->index].seginfo->mode = MODE_EXIT (e);
+ }
+ }
+#endif /* NORMAL_MODE */
+ }
+
+ kill = sbitmap_vector_alloc (last_basic_block, n_entities);
+ for (i = 0; i < max_num_modes; i++)
+ {
+ int current_mode[N_ENTITIES];
+ sbitmap *delete;
+ sbitmap *insert;
+
+ /* Set the anticipatable and computing arrays. */
+ sbitmap_vector_zero (antic, last_basic_block);
+ sbitmap_vector_zero (comp, last_basic_block);
+ for (j = n_entities - 1; j >= 0; j--)
+ {
+ int m = current_mode[j] = MODE_PRIORITY_TO_MODE (entity_map[j], i);
+ struct bb_info *info = bb_info[j];
+
+ FOR_EACH_BB (bb)
+ {
+ if (info[bb->index].seginfo->mode == m)
+ SET_BIT (antic[bb->index], j);
+
+ if (info[bb->index].computing == m)
+ SET_BIT (comp[bb->index], j);
+ }
+ }
+
+ /* Calculate the optimal locations for the
+ placement mode switches to modes with priority I. */
+
+ FOR_EACH_BB (bb)
+ sbitmap_not (kill[bb->index], transp[bb->index]);
+ edge_list = pre_edge_lcm (file, n_entities, transp, comp, antic,
+ kill, &insert, &delete);
+
+ for (j = n_entities - 1; j >= 0; j--)
+ {
+ /* Insert all mode sets that have been inserted by lcm. */
+ int no_mode = num_modes[entity_map[j]];
+
+ /* Wherever we have moved a mode setting upwards in the flow graph,
+ the blocks between the new setting site and the now redundant
+ computation ceases to be transparent for any lower-priority
+ mode of the same entity. First set the aux field of each
+ insertion site edge non-transparent, then propagate the new
+ non-transparency from the redundant computation upwards till
+ we hit an insertion site or an already non-transparent block. */
+ for (e = NUM_EDGES (edge_list) - 1; e >= 0; e--)
+ {
+ edge eg = INDEX_EDGE (edge_list, e);
+ int mode;
+ basic_block src_bb;
+ HARD_REG_SET live_at_edge;
+ rtx mode_set;
+
+ eg->aux = 0;
+
+ if (! TEST_BIT (insert[e], j))
+ continue;
+
+ eg->aux = (void *)1;
+
+ mode = current_mode[j];
+ src_bb = eg->src;
+
+ REG_SET_TO_HARD_REG_SET (live_at_edge,
+ src_bb->global_live_at_end);
+
+ start_sequence ();
+ EMIT_MODE_SET (entity_map[j], mode, live_at_edge);
+ mode_set = get_insns ();
+ end_sequence ();
+
+ /* Do not bother to insert empty sequence. */
+ if (mode_set == NULL_RTX)
+ continue;
+
+ /* If this is an abnormal edge, we'll insert at the end
+ of the previous block. */
+ if (eg->flags & EDGE_ABNORMAL)
+ {
+ emited = true;
+ if (JUMP_P (BB_END (src_bb)))
+ emit_insn_before (mode_set, BB_END (src_bb));
+ else
+ {
+ /* It doesn't make sense to switch to normal
+ mode after a CALL_INSN. The cases in which a
+ CALL_INSN may have an abnormal edge are
+ sibcalls and EH edges. In the case of
+ sibcalls, the dest basic-block is the
+ EXIT_BLOCK, that runs in normal mode; it is
+ assumed that a sibcall insn requires normal
+ mode itself, so no mode switch would be
+ required after the call (it wouldn't make
+ sense, anyway). In the case of EH edges, EH
+ entry points also start in normal mode, so a
+ similar reasoning applies. */
+ gcc_assert (NONJUMP_INSN_P (BB_END (src_bb)));
+ emit_insn_after (mode_set, BB_END (src_bb));
+ }
+ bb_info[j][src_bb->index].computing = mode;
+ RESET_BIT (transp[src_bb->index], j);
+ }
+ else
+ {
+ need_commit = 1;
+ insert_insn_on_edge (mode_set, eg);
+ }
+ }
+
+ FOR_EACH_BB_REVERSE (bb)
+ if (TEST_BIT (delete[bb->index], j))
+ {
+ make_preds_opaque (bb, j);
+ /* Cancel the 'deleted' mode set. */
+ bb_info[j][bb->index].seginfo->mode = no_mode;
+ }
+ }
+
+ sbitmap_vector_free (delete);
+ sbitmap_vector_free (insert);
+ clear_aux_for_edges ();
+ free_edge_list (edge_list);
+ }
+
+ /* Now output the remaining mode sets in all the segments. */
+ for (j = n_entities - 1; j >= 0; j--)
+ {
+ int no_mode = num_modes[entity_map[j]];
+
+ FOR_EACH_BB_REVERSE (bb)
+ {
+ struct seginfo *ptr, *next;
+ for (ptr = bb_info[j][bb->index].seginfo; ptr; ptr = next)
+ {
+ next = ptr->next;
+ if (ptr->mode != no_mode)
+ {
+ rtx mode_set;
+
+ start_sequence ();
+ EMIT_MODE_SET (entity_map[j], ptr->mode, ptr->regs_live);
+ mode_set = get_insns ();
+ end_sequence ();
+
+ /* Insert MODE_SET only if it is nonempty. */
+ if (mode_set != NULL_RTX)
+ {
+ emited = true;
+ if (NOTE_P (ptr->insn_ptr)
+ && (NOTE_LINE_NUMBER (ptr->insn_ptr)
+ == NOTE_INSN_BASIC_BLOCK))
+ emit_insn_after (mode_set, ptr->insn_ptr);
+ else
+ emit_insn_before (mode_set, ptr->insn_ptr);
+ }
+ }
+
+ free (ptr);
+ }
+ }
+
+ free (bb_info[j]);
+ }
+
+ /* Finished. Free up all the things we've allocated. */
+
+ sbitmap_vector_free (kill);
+ sbitmap_vector_free (antic);
+ sbitmap_vector_free (transp);
+ sbitmap_vector_free (comp);
+
+ if (need_commit)
+ commit_edge_insertions ();
+
+#if defined (MODE_ENTRY) && defined (MODE_EXIT)
+ cleanup_cfg (CLEANUP_NO_INSN_DEL);
+#else
+ if (!need_commit && !emited)
+ return 0;
+#endif
+
+ max_regno = max_reg_num ();
+ allocate_reg_info (max_regno, FALSE, FALSE);
+ update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
+ (PROP_DEATH_NOTES | PROP_KILL_DEAD_CODE
+ | PROP_SCAN_DEAD_CODE));
+
+ return 1;
+}
+#endif /* OPTIMIZE_MODE_SWITCHING */
diff --git a/gcc/modulo-sched.c b/gcc/modulo-sched.c
index 2dffc3170a1..39549b93cb0 100644
--- a/gcc/modulo-sched.c
+++ b/gcc/modulo-sched.c
@@ -269,74 +269,35 @@ static struct sched_info sms_sched_info =
};
-/* Return the register decremented and tested or zero if it is not a decrement
- and branch jump insn (similar to doloop_condition_get). */
+/* Return the register decremented and tested in INSN,
+ or zero if it is not a decrement-and-branch insn. */
+
static rtx
-doloop_register_get (rtx insn, rtx *comp)
+doloop_register_get (rtx insn ATTRIBUTE_UNUSED)
{
- rtx pattern, cmp, inc, reg, condition;
-
- if (!JUMP_P (insn))
- return NULL_RTX;
- pattern = PATTERN (insn);
-
- /* The canonical doloop pattern we expect is:
-
- (parallel [(set (pc) (if_then_else (condition)
- (label_ref (label))
- (pc)))
- (set (reg) (plus (reg) (const_int -1)))
- (additional clobbers and uses)])
-
- where condition is further restricted to be
- (ne (reg) (const_int 1)). */
-
- if (GET_CODE (pattern) != PARALLEL)
- return NULL_RTX;
-
- cmp = XVECEXP (pattern, 0, 0);
- inc = XVECEXP (pattern, 0, 1);
- /* Return the compare rtx. */
- *comp = cmp;
-
- /* Check for (set (reg) (something)). */
- if (GET_CODE (inc) != SET || ! REG_P (SET_DEST (inc)))
- return NULL_RTX;
-
- /* Extract loop counter register. */
- reg = SET_DEST (inc);
+#ifdef HAVE_doloop_end
+ rtx pattern, reg, condition;
- /* Check if something = (plus (reg) (const_int -1)). */
- if (GET_CODE (SET_SRC (inc)) != PLUS
- || XEXP (SET_SRC (inc), 0) != reg
- || XEXP (SET_SRC (inc), 1) != constm1_rtx)
+ if (! JUMP_P (insn))
return NULL_RTX;
- /* Check for (set (pc) (if_then_else (condition)
- (label_ref (label))
- (pc))). */
- if (GET_CODE (cmp) != SET
- || SET_DEST (cmp) != pc_rtx
- || GET_CODE (SET_SRC (cmp)) != IF_THEN_ELSE
- || GET_CODE (XEXP (SET_SRC (cmp), 1)) != LABEL_REF
- || XEXP (SET_SRC (cmp), 2) != pc_rtx)
- return NULL_RTX;
-
- /* Extract loop termination condition. */
- condition = XEXP (SET_SRC (cmp), 0);
-
- /* Check if condition = (ne (reg) (const_int 1)), which is more
- restrictive than the check in doloop_condition_get:
- if ((GET_CODE (condition) != GE && GET_CODE (condition) != NE)
- || GET_CODE (XEXP (condition, 1)) != CONST_INT). */
- if (GET_CODE (condition) != NE
- || XEXP (condition, 1) != const1_rtx)
+ pattern = PATTERN (insn);
+ condition = doloop_condition_get (pattern);
+ if (! condition)
return NULL_RTX;
- if (XEXP (condition, 0) == reg)
- return reg;
+ if (REG_P (XEXP (condition, 0)))
+ reg = XEXP (condition, 0);
+ else if (GET_CODE (XEXP (condition, 0)) == PLUS
+ && REG_P (XEXP (XEXP (condition, 0), 0)))
+ reg = XEXP (XEXP (condition, 0), 0);
+ else
+ gcc_unreachable ();
+ return reg;
+#else
return NULL_RTX;
+#endif
}
/* Check if COUNT_REG is set to a constant in the PRE_HEADER block, so
@@ -538,9 +499,10 @@ generate_reg_moves (partial_schedule_ptr ps)
for (i_reg_move = 0; i_reg_move < nreg_moves; i_reg_move++)
{
- int i_use;
+ unsigned int i_use;
rtx new_reg = gen_reg_rtx (GET_MODE (prev_reg));
rtx reg_move = gen_move_insn (new_reg, prev_reg);
+ sbitmap_iterator sbi;
add_insn_before (reg_move, last_reg_move);
last_reg_move = reg_move;
@@ -548,7 +510,7 @@ generate_reg_moves (partial_schedule_ptr ps)
if (!SCHED_FIRST_REG_MOVE (u))
SCHED_FIRST_REG_MOVE (u) = reg_move;
- EXECUTE_IF_SET_IN_SBITMAP (uses_of_defs[i_reg_move], 0, i_use,
+ EXECUTE_IF_SET_IN_SBITMAP (uses_of_defs[i_reg_move], 0, i_use, sbi)
{
struct undo_replace_buff_elem *rep;
@@ -567,7 +529,7 @@ generate_reg_moves (partial_schedule_ptr ps)
}
replace_rtx (g->nodes[i_use].insn, old_reg, new_reg);
- });
+ }
prev_reg = new_reg;
}
@@ -597,6 +559,7 @@ undo_generate_reg_moves (partial_schedule_ptr ps,
delete_insn (crr);
crr = prev;
}
+ SCHED_FIRST_REG_MOVE (u) = NULL_RTX;
}
while (reg_move_replaces)
@@ -1024,7 +987,7 @@ sms_schedule (FILE *dump_file)
for (i = 0; i < loops->num; i++)
{
rtx head, tail;
- rtx count_reg, comp;
+ rtx count_reg;
struct loop *loop = loops->parray[i];
/* For debugging. */
@@ -1087,7 +1050,7 @@ sms_schedule (FILE *dump_file)
}
/* Make sure this is a doloop. */
- if ( !(count_reg = doloop_register_get (tail, &comp)))
+ if ( !(count_reg = doloop_register_get (tail)))
continue;
/* Don't handle BBs with calls or barriers, or !single_set insns. */
@@ -1133,7 +1096,7 @@ sms_schedule (FILE *dump_file)
for (i = 0; i < num_loops; i++)
{
rtx head, tail;
- rtx count_reg, count_init, comp;
+ rtx count_reg, count_init;
int mii, rec_mii;
unsigned stage_count = 0;
HOST_WIDEST_INT loop_count = 0;
@@ -1185,7 +1148,7 @@ sms_schedule (FILE *dump_file)
/* In case of th loop have doloop register it gets special
handling. */
count_init = NULL_RTX;
- if ((count_reg = doloop_register_get (tail, &comp)))
+ if ((count_reg = doloop_register_get (tail)))
{
basic_block pre_header;
@@ -1283,7 +1246,7 @@ sms_schedule (FILE *dump_file)
/* SMS is not profitable so undo the permutation and reg move generation
and return the kernel to its original state. */
if (dump_file)
- fprintf (dump_file, "Undoing SMS becuase it is not profitable.\n");
+ fprintf (dump_file, "Undoing SMS because it is not profitable.\n");
}
else
@@ -1880,11 +1843,12 @@ calculate_order_params (ddg_ptr g, int mii ATTRIBUTE_UNUSED)
static int
find_max_asap (ddg_ptr g, sbitmap nodes)
{
- int u;
+ unsigned int u;
int max_asap = -1;
int result = -1;
+ sbitmap_iterator sbi;
- EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, u,
+ EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, u, sbi)
{
ddg_node_ptr u_node = &g->nodes[u];
@@ -1893,19 +1857,20 @@ find_max_asap (ddg_ptr g, sbitmap nodes)
max_asap = ASAP (u_node);
result = u;
}
- });
+ }
return result;
}
static int
find_max_hv_min_mob (ddg_ptr g, sbitmap nodes)
{
- int u;
+ unsigned int u;
int max_hv = -1;
int min_mob = INT_MAX;
int result = -1;
+ sbitmap_iterator sbi;
- EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, u,
+ EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, u, sbi)
{
ddg_node_ptr u_node = &g->nodes[u];
@@ -1921,19 +1886,20 @@ find_max_hv_min_mob (ddg_ptr g, sbitmap nodes)
min_mob = MOB (u_node);
result = u;
}
- });
+ }
return result;
}
static int
find_max_dv_min_mob (ddg_ptr g, sbitmap nodes)
{
- int u;
+ unsigned int u;
int max_dv = -1;
int min_mob = INT_MAX;
int result = -1;
+ sbitmap_iterator sbi;
- EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, u,
+ EXECUTE_IF_SET_IN_SBITMAP (nodes, 0, u, sbi)
{
ddg_node_ptr u_node = &g->nodes[u];
@@ -1949,7 +1915,7 @@ find_max_dv_min_mob (ddg_ptr g, sbitmap nodes)
min_mob = MOB (u_node);
result = u;
}
- });
+ }
return result;
}
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog
index 00e650283b7..d9eb3d15f8d 100644
--- a/gcc/objc/ChangeLog
+++ b/gcc/objc/ChangeLog
@@ -1,3 +1,58 @@
+2005-06-15 Joseph S. Myers <joseph@codesourcery.com>
+
+ * objc-act.c (my_build_string_pointer): New.
+ (objc_get_class_reference, get_super_receiver): Call
+ my_build_string_pointer instead of my_build_string when building
+ function arguments.
+
+2005-05-25 Mike Stump <mrs@mrs.kithrup.com>
+
+ * objc-act.c (volatilized_hash): Avoid warnings on 64-bit
+ machines.
+
+2005-05-24 Ziemowit Laski <zlaski@apple.com>
+
+ * objc-act.c (objc_build_struct): New function.
+ (objc_derived_from_p): Likewise.
+ (objc_build_component_ref): Likewise.
+ (objc_copy_binfo): Likewise.
+ (objc_xref_basetypes): Likewise.
+ (objc_lookup_protocol): Likewise.
+ (objc_compare_protocols): Likewise.
+ (objc_volatilize_decl): Likewise.
+ (encode_aggregate_fields): Likewise.
+ (volatilized_hash): Likewise.
+ (volatilized_eq): Likewise.
+ (objc_compare_types): Likewise.
+ (objc_type_quals_match): Likewise.
+ (DERIVED_FROM_P): New ObjC macro, corresponding to C++ macro
+ of same name.
+ (get_class_ivars): Add second parameter indicating if entire
+ hierarchy is desired.
+ (struct volatilized_type): New type.
+ (volatilized_htab): New hash table.
+ (objc_types_compatible_p, objc_comptypes): Remove functions.
+ (synth_module_prologue): Do not initialize 'unused_list'.
+ (objc_get_class_reference): Fix ObjC++ impedance mismatches.
+ (objc_declare_alias): Implement as a typedef.
+ (objc_substitute_decl, objc_gimplify_expr): Reformat.
+ (objc_get_class_ivars): Adjust call to get_class_ivars().
+ (next_sjlj_build_enter_and_setjmp, synth_forward_declarations,
+ build_ivar_reference, get_super_receiver): Call
+ objc_build_component_ref() instead of build_component_ref().
+ (objc_begin_catch_clause): Use DERIVED_FROM_P() instead of
+ objc_comptypes().
+ (build_private_template): Call objc_build_struct() instead of
+ start_struct() and finish_struct().
+ (hash_init): Initialize volatilized_htab.
+ (objc_is_public): Adjust calls to objc_get_ivars(); adjust
+ ObjC++ impedance mismatches.
+ (encode_aggregate_within): Streamline by calling
+ encode_aggregate_fields().
+ * objc-act.h (objc_types_compatible_p): Remove prototype.
+ (OCTI_UNUSED_LIST, unused_list): Remove slot.
+ * objc-lang.c (LANG_HOOKS_TYPES_COMPATIBLE_P): Remove.
+
2005-05-18 Geoffrey Keating <geoffk@apple.com>
* Make-lang.in (cc1obj-dummy): New.
@@ -11,7 +66,8 @@
* objc-act.c (struct interface_tuple): Mark it up for GC.
(interface_htab): It is really a struct interface_tuple.
-2005-05-17 Mike Stump <mrs@apple.com>
+2005-05-17 Ziemowit Laski <zlaski@apple.com>
+ Mike Stump <mrs@apple.com>
Yet more Objective-C++...
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index 92eaa63b0e0..3329318ef2a 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -169,12 +169,20 @@ static tree is_ivar (tree, tree);
static void build_objc_exception_stuff (void);
static void build_next_objc_exception_stuff (void);
+/* We only need the following for ObjC; ObjC++ will use C++'s definition
+ of DERIVED_FROM_P. */
+#ifndef OBJCPLUS
+static bool objc_derived_from_p (tree, tree);
+#define DERIVED_FROM_P(PARENT, CHILD) objc_derived_from_p (PARENT, CHILD)
+#endif
+static void objc_xref_basetypes (tree, tree);
+
static void build_class_template (void);
static void build_selector_template (void);
static void build_category_template (void);
static void build_super_template (void);
static tree build_protocol_initializer (tree, tree, tree, tree, tree);
-static tree get_class_ivars (tree);
+static tree get_class_ivars (tree, bool);
static tree generate_protocol_list (tree);
static void build_protocol_reference (tree);
@@ -388,6 +396,14 @@ struct string_descriptor GTY(())
static GTY((param_is (struct string_descriptor))) htab_t string_htab;
+/* Store the EH-volatilized types in a hash table, for easy retrieval. */
+struct volatilized_type GTY(())
+{
+ tree type;
+};
+
+static GTY((param_is (struct volatilized_type))) htab_t volatilized_htab;
+
FILE *gen_declaration_file;
/* Tells "encode_pointer/encode_aggregate" whether we are generating
@@ -777,351 +793,470 @@ objc_is_class_id (tree type)
return OBJC_TYPE_NAME (type) == objc_class_id;
}
+/* Construct a C struct with tag NAME, a base struct with tag
+ SUPER_NAME (if any), and FIELDS indicated. */
-int
-objc_types_compatible_p (tree type1, tree type2)
+static tree
+objc_build_struct (tree name, tree fields, tree super_name)
+{
+ tree s = start_struct (RECORD_TYPE, name);
+ tree super = (super_name ? xref_tag (RECORD_TYPE, super_name) : NULL_TREE);
+
+ if (super)
+ {
+ /* Prepend a packed variant of the base class into the layout. This
+ is necessary to preserve ObjC ABI compatibility. */
+ tree base = build_decl (FIELD_DECL, NULL_TREE, super);
+ tree field = TYPE_FIELDS (super);
+
+ while (field && TREE_CHAIN (field)
+ && TREE_CODE (TREE_CHAIN (field)) == FIELD_DECL)
+ field = TREE_CHAIN (field);
+
+ /* For ObjC ABI purposes, the "packed" size of a base class is
+ the the sum of the offset and the size (in bits) of the last
+ field in the class. */
+ DECL_SIZE (base)
+ = (field && TREE_CODE (field) == FIELD_DECL
+ ? size_binop (PLUS_EXPR,
+ size_binop (PLUS_EXPR,
+ size_binop
+ (MULT_EXPR,
+ convert (bitsizetype,
+ DECL_FIELD_OFFSET (field)),
+ bitsize_int (BITS_PER_UNIT)),
+ DECL_FIELD_BIT_OFFSET (field)),
+ DECL_SIZE (field))
+ : bitsize_zero_node);
+ DECL_SIZE_UNIT (base)
+ = size_binop (FLOOR_DIV_EXPR, convert (sizetype, DECL_SIZE (base)),
+ size_int (BITS_PER_UNIT));
+ DECL_ARTIFICIAL (base) = 1;
+ DECL_ALIGN (base) = 1;
+ DECL_FIELD_CONTEXT (base) = s;
+#ifdef OBJCPLUS
+ DECL_FIELD_IS_BASE (base) = 1;
+
+ if (fields)
+ TREE_NO_WARNING (fields) = 1; /* Suppress C++ ABI warnings -- we */
+#endif /* are following the ObjC ABI here. */
+ TREE_CHAIN (base) = fields;
+ fields = base;
+ }
+
+ s = finish_struct (s, fields, NULL_TREE);
+
+ /* Use TYPE_BINFO structures to point at the super class, if any. */
+ objc_xref_basetypes (s, super);
+
+ return s;
+}
+
+/* Mark DECL as being 'volatile' for purposes of Darwin
+ _setjmp()/_longjmp() exception handling. Called from
+ objc_mark_locals_volatile(). */
+void
+objc_volatilize_decl (tree decl)
+{
+ /* Do not mess with variables that are 'static' or (already)
+ 'volatile'. */
+ if (!TREE_THIS_VOLATILE (decl) && !TREE_STATIC (decl)
+ && (TREE_CODE (decl) == VAR_DECL
+ || TREE_CODE (decl) == PARM_DECL))
+ {
+ tree t = TREE_TYPE (decl);
+ struct volatilized_type key;
+ void **loc;
+
+ t = build_qualified_type (t, (TYPE_QUALS (t)
+ | TYPE_QUAL_VOLATILE));
+ key.type = t;
+ loc = htab_find_slot (volatilized_htab, &key, INSERT);
+
+ if (!*loc)
+ {
+ *loc = ggc_alloc (sizeof (key));
+ ((struct volatilized_type *) *loc)->type = t;
+ }
+
+ TREE_TYPE (decl) = t;
+ TREE_THIS_VOLATILE (decl) = 1;
+ TREE_SIDE_EFFECTS (decl) = 1;
+ DECL_REGISTER (decl) = 0;
+#ifndef OBJCPLUS
+ C_DECL_REGISTER (decl) = 0;
+#endif
+ }
+}
+
+/* Check if protocol PROTO is adopted (directly or indirectly) by class CLS
+ (including its categoreis and superclasses) or by object type TYP.
+ Issue a warning if PROTO is not adopted anywhere and WARN is set. */
+
+static bool
+objc_lookup_protocol (tree proto, tree cls, tree typ, bool warn)
{
+ bool class_type = (cls != NULL_TREE);
- if (objc_is_object_ptr (type1) || objc_is_object_ptr (type2)
- || objc_is_class_name (type1) || objc_is_class_name (type2))
+ while (cls)
{
- return lhd_types_compatible_p (type1, type2);
+ tree c;
+
+ /* Check protocols adopted by the class and its categories. */
+ for (c = cls; c; c = CLASS_CATEGORY_LIST (c))
+ {
+ if (lookup_protocol_in_reflist (CLASS_PROTOCOL_LIST (c), proto))
+ return true;
+ }
+
+ /* Repeat for superclasses. */
+ cls = lookup_interface (CLASS_SUPER_NAME (cls));
}
- else
+
+ /* Check for any protocols attached directly to the object type. */
+ if (TYPE_HAS_OBJC_INFO (typ))
{
-#ifdef OBJCPLUS
- return cxx_types_compatible_p (type1, type2);
-#else
- return c_types_compatible_p (type1, type2);
-#endif
+ if (lookup_protocol_in_reflist (TYPE_OBJC_PROTOCOL_LIST (typ), proto))
+ return true;
+ }
+
+ if (warn)
+ {
+ strcpy (errbuf, class_type ? "class \'" : "type \'");
+ gen_type_name_0 (class_type ? typ : TYPE_POINTER_TO (typ));
+ strcat (errbuf, "\' does not ");
+ /* NB: Types 'id' and 'Class' cannot reasonably be described as
+ "implementing" a given protocol, since they do not have an
+ implementation. */
+ strcat (errbuf, class_type ? "implement" : "conform to");
+ strcat (errbuf, " the \'");
+ strcat (errbuf, IDENTIFIER_POINTER (PROTOCOL_NAME (proto)));
+ strcat (errbuf, "\' protocol");
+ warning (0, errbuf);
}
+
+ return false;
}
+/* Check if class RCLS and instance struct type RTYP conform to at least the
+ same protocols that LCLS and LTYP conform to. */
+
+static bool
+objc_compare_protocols (tree lcls, tree ltyp, tree rcls, tree rtyp, bool warn)
+{
+ tree p;
+ bool have_lproto = false;
+
+ while (lcls)
+ {
+ /* NB: We do _not_ look at categories defined for LCLS; these may or
+ may not get loaded in, and therefore it is unreasonable to require
+ that RCLS/RTYP must implement any of their protocols. */
+ for (p = CLASS_PROTOCOL_LIST (lcls); p; p = TREE_CHAIN (p))
+ {
+ have_lproto = true;
-/* 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.
+ if (!objc_lookup_protocol (TREE_VALUE (p), rcls, rtyp, warn))
+ return warn;
+ }
- 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).
+ /* Repeat for superclasses. */
+ lcls = lookup_interface (CLASS_SUPER_NAME (lcls));
+ }
- 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.
-*/
+ /* Check for any protocols attached directly to the object type. */
+ if (TYPE_HAS_OBJC_INFO (ltyp))
+ {
+ for (p = TYPE_OBJC_PROTOCOL_LIST (ltyp); p; p = TREE_CHAIN (p))
+ {
+ have_lproto = true;
-int
-objc_comptypes (tree lhs, tree rhs, int reflexive)
+ if (!objc_lookup_protocol (TREE_VALUE (p), rcls, rtyp, warn))
+ return warn;
+ }
+ }
+
+ /* NB: If LTYP and LCLS have no protocols to search for, return 'true'
+ vacuously, _unless_ RTYP is a protocol-qualified 'id'. We can get
+ away with simply checking for 'id' or 'Class' (!RCLS), since this
+ routine will not get called in other cases. */
+ return have_lproto || (rcls != NULL_TREE);
+}
+
+/* Determine if it is permissible to assign (if ARGNO is greater than -3)
+ an instance of RTYP to an instance of LTYP or to compare the two
+ (if ARGNO is equal to -3), per ObjC type system rules. Before
+ returning 'true', this routine may issue warnings related to, e.g.,
+ protocol conformance. When returning 'false', the routine must
+ produce absolutely no warnings; the C or C++ front-end will do so
+ instead, if needed. If either LTYP or RTYP is not an Objective-C type,
+ the routine must return 'false'.
+
+ The ARGNO parameter is encoded as follows:
+ >= 1 Parameter number (CALLEE contains function being called);
+ 0 Return value;
+ -1 Assignment;
+ -2 Initialization;
+ -3 Comparison (LTYP and RTYP may match in either direction). */
+
+bool
+objc_compare_types (tree ltyp, tree rtyp, int argno, tree callee)
{
- /* New clause for protocols. */
+ tree lcls, rcls, lproto, rproto;
+ bool pointers_compatible;
+
+ /* We must be dealing with pointer types */
+ if (!POINTER_TYPE_P (ltyp) || !POINTER_TYPE_P (rtyp))
+ return false;
- /* 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
- && TREE_CODE (TREE_TYPE (rhs)) == RECORD_TYPE)
+ do
{
- int lhs_is_proto = IS_PROTOCOL_QUALIFIED_UNTYPED (lhs);
- int rhs_is_proto = IS_PROTOCOL_QUALIFIED_UNTYPED (rhs);
+ ltyp = TREE_TYPE (ltyp); /* Remove indirections. */
+ rtyp = TREE_TYPE (rtyp);
+ }
+ while (POINTER_TYPE_P (ltyp) && POINTER_TYPE_P (rtyp));
- if (lhs_is_proto)
- {
- tree lproto, lproto_list = TYPE_OBJC_PROTOCOL_LIST (TREE_TYPE (lhs));
- tree rproto, rproto_list;
- tree p;
+ /* Past this point, we are only interested in ObjC class instances,
+ or 'id' or 'Class'. */
+ if (TREE_CODE (ltyp) != RECORD_TYPE || TREE_CODE (rtyp) != RECORD_TYPE)
+ return false;
- /* <Protocol> = <Protocol> */
- if (rhs_is_proto)
- {
- /* Class <Protocol> != id <Protocol>;
- id <Protocol> != Class <Protocol> */
- if (IS_ID (lhs) != IS_ID (rhs))
- return 0;
+ if (!objc_is_object_id (ltyp) && !objc_is_class_id (ltyp)
+ && !TYPE_HAS_OBJC_INFO (ltyp))
+ return false;
- rproto_list = TYPE_OBJC_PROTOCOL_LIST (TREE_TYPE (rhs));
+ if (!objc_is_object_id (rtyp) && !objc_is_class_id (rtyp)
+ && !TYPE_HAS_OBJC_INFO (rtyp))
+ return false;
- if (!reflexive)
- {
- /* 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);
+ /* Past this point, we are committed to returning 'true' to the caller.
+ However, we can still warn about type and/or protocol mismatches. */
- if (!rproto)
- warning
- (0, "object does not conform to the %qs 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 = OBJC_TYPE_NAME (TREE_TYPE (rhs));
- tree rinter;
+ if (TYPE_HAS_OBJC_INFO (ltyp))
+ {
+ lcls = TYPE_OBJC_INTERFACE (ltyp);
+ lproto = TYPE_OBJC_PROTOCOL_LIST (ltyp);
+ }
+ else
+ lcls = lproto = NULL_TREE;
- /* Class <Protocol> != <class> * */
- if (IS_CLASS (lhs))
- return 0;
+ if (TYPE_HAS_OBJC_INFO (rtyp))
+ {
+ rcls = TYPE_OBJC_INTERFACE (rtyp);
+ rproto = TYPE_OBJC_PROTOCOL_LIST (rtyp);
+ }
+ else
+ rcls = rproto = NULL_TREE;
- /* 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);
- rproto = 0;
- rinter = lookup_interface (rname);
+ /* If either type is an unqualified 'id', we're done. */
+ if ((!lproto && objc_is_object_id (ltyp))
+ || (!rproto && objc_is_object_id (rtyp)))
+ return true;
- while (rinter && !rproto)
- {
- tree cat;
-
- rproto_list = CLASS_PROTOCOL_LIST (rinter);
- 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 && TYPE_HAS_OBJC_INFO (TREE_TYPE (rhs)))
- {
- rproto_list = TYPE_OBJC_PROTOCOL_LIST (TREE_TYPE (rhs));
- rproto = lookup_protocol_in_reflist (rproto_list, p);
- }
-
- /* Check for protocols adopted by categories. */
- cat = CLASS_CATEGORY_LIST (rinter);
- while (cat && !rproto)
- {
- rproto_list = CLASS_PROTOCOL_LIST (cat);
- rproto = lookup_protocol_in_reflist (rproto_list, p);
- cat = CLASS_CATEGORY_LIST (cat);
- }
-
- rinter = lookup_interface (CLASS_SUPER_NAME (rinter));
- }
+ pointers_compatible = (TYPE_MAIN_VARIANT (ltyp) == TYPE_MAIN_VARIANT (rtyp));
- if (!rproto)
- warning (0, "class %qs does not implement the %qs protocol",
- IDENTIFIER_POINTER (OBJC_TYPE_NAME (TREE_TYPE (rhs))),
- IDENTIFIER_POINTER (PROTOCOL_NAME (p)));
- }
- return 1;
- }
- /* id <Protocol> = id; Class <Protocol> = id */
- else if (objc_is_object_id (TREE_TYPE (rhs)))
- {
- return 1;
- }
- /* id <Protocol> != Class; Class <Protocol> = Class */
- else if (objc_is_class_id (TREE_TYPE (rhs)))
- {
- return IS_CLASS (lhs);
- }
- /* <Protocol> = ?? : let comptypes decide. */
- return -1;
- }
- else if (rhs_is_proto)
- {
- /* <class> * = <Protocol> */
- if (TYPED_OBJECT (TREE_TYPE (lhs)))
- {
- /* <class> * != Class <Protocol> */
- if (IS_CLASS (rhs))
- return 0;
+ /* If the underlying types are the same, and at most one of them has
+ a protocol list, we do not need to issue any diagnostics. */
+ if (pointers_compatible && (!lproto || !rproto))
+ return true;
- if (reflexive)
- {
- tree rname = OBJC_TYPE_NAME (TREE_TYPE (lhs));
- tree rinter;
- tree rproto, rproto_list = TYPE_OBJC_PROTOCOL_LIST (TREE_TYPE (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 && TYPE_HAS_OBJC_INFO (TREE_TYPE (lhs)))
- {
- lproto_list = TYPE_OBJC_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 (0, "class %qs does not implement the %qs protocol",
- IDENTIFIER_POINTER (OBJC_TYPE_NAME
- (TREE_TYPE (lhs))),
- IDENTIFIER_POINTER (PROTOCOL_NAME (p)));
- }
- return 1;
- }
- else
- return 0;
- }
- /* id = id <Protocol>; id = Class <Protocol> */
- else if (objc_is_object_id (TREE_TYPE (lhs)))
- {
- return 1;
- }
- /* Class != id <Protocol>; Class = Class <Protocol> */
- else if (objc_is_class_id (TREE_TYPE (lhs)))
- {
- return IS_CLASS (rhs);
- }
- /* ??? = <Protocol> : let comptypes decide */
- else
- {
- return -1;
- }
- }
- else
+ /* If exactly one of the types is 'Class', issue a diagnostic; any
+ exceptions of this rule have already been handled. */
+ if (objc_is_class_id (ltyp) ^ objc_is_class_id (rtyp))
+ pointers_compatible = false;
+ /* Otherwise, check for inheritance relations. */
+ else
+ {
+ if (!pointers_compatible)
+ pointers_compatible
+ = (objc_is_object_id (ltyp) || objc_is_object_id (rtyp));
+
+ if (!pointers_compatible)
+ pointers_compatible = DERIVED_FROM_P (ltyp, rtyp);
+
+ if (!pointers_compatible && argno == -3)
+ pointers_compatible = DERIVED_FROM_P (rtyp, ltyp);
+ }
+
+ /* If the pointers match modulo protocols, check for protocol conformance
+ mismatches. */
+ if (pointers_compatible)
+ {
+ pointers_compatible = objc_compare_protocols (lcls, ltyp, rcls, rtyp,
+ argno != -3);
+
+ if (!pointers_compatible && argno == -3)
+ pointers_compatible = objc_compare_protocols (rcls, rtyp, lcls, ltyp,
+ argno != -3);
+ }
+
+ if (!pointers_compatible)
+ {
+ /* NB: For the time being, we shall make our warnings look like their
+ C counterparts. In the future, we may wish to make them more
+ ObjC-specific. */
+ switch (argno)
{
- /* 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);
+ case -3:
+ warning (0, "comparison of distinct Objective-C types lacks a cast");
+ break;
+
+ case -2:
+ warning (0, "initialization from distinct Objective-C type");
+ break;
+
+ case -1:
+ warning (0, "assignment from distinct Objective-C type");
+ break;
+
+ case 0:
+ warning (0, "distinct Objective-C type in return");
+ break;
+
+ default:
+ warning (0, "passing argument %d of %qE from distinct "
+ "Objective-C type", argno, callee);
+ break;
}
}
- if (TREE_CODE (lhs) != RECORD_TYPE || TREE_CODE (rhs) != RECORD_TYPE)
+ return true;
+}
+
+/* Check if LTYP and RTYP have the same type qualifiers. If either type
+ lives in the volatilized hash table, ignore the 'volatile' bit when
+ making the comparison. */
+
+bool
+objc_type_quals_match (tree ltyp, tree rtyp)
+{
+ int lquals = TYPE_QUALS (ltyp), rquals = TYPE_QUALS (rtyp);
+ struct volatilized_type key;
+
+ key.type = ltyp;
+
+ if (htab_find_slot (volatilized_htab, &key, NO_INSERT))
+ lquals &= ~TYPE_QUAL_VOLATILE;
+
+ key.type = rtyp;
+
+ if (htab_find_slot (volatilized_htab, &key, NO_INSERT))
+ rquals &= ~TYPE_QUAL_VOLATILE;
+
+ return (lquals == rquals);
+}
+
+#ifndef OBJCPLUS
+/* Determine if CHILD is derived from PARENT. The routine assumes that
+ both parameters are RECORD_TYPEs, and is non-reflexive. */
+
+static bool
+objc_derived_from_p (tree parent, tree child)
+{
+ parent = TYPE_MAIN_VARIANT (parent);
+
+ for (child = TYPE_MAIN_VARIANT (child);
+ TYPE_BINFO (child) && BINFO_N_BASE_BINFOS (TYPE_BINFO (child));)
{
- /* Nothing to do with ObjC - let immediately comptypes take
- responsibility for checking. */
- return -1;
+ child = TYPE_MAIN_VARIANT (BINFO_TYPE (BINFO_BASE_BINFO
+ (TYPE_BINFO (child),
+ 0)));
+
+ if (child == parent)
+ return true;
}
- /* `id' = `<class> *' `<class> *' = `id': always allow it.
- Please note that
- 'Object *o = [[Object alloc] init]; falls
- in the case <class> * = `id'.
- */
- if ((objc_is_object_id (lhs) && TYPED_OBJECT (rhs))
- || (objc_is_object_id (rhs) && TYPED_OBJECT (lhs)))
- return 1;
+ return false;
+}
+#endif
- /* `id' = `Class', `Class' = `id' */
+static tree
+objc_build_component_ref (tree datum, tree component)
+{
+ /* If COMPONENT is NULL, the caller is referring to the anonymous
+ base class field. */
+ if (!component)
+ {
+ tree base = TYPE_FIELDS (TREE_TYPE (datum));
- else if ((objc_is_object_id (lhs) && objc_is_class_id (rhs))
- || (objc_is_class_id (lhs) && objc_is_object_id (rhs)))
- return 1;
+ return build3 (COMPONENT_REF, TREE_TYPE (base), datum, base, NULL_TREE);
+ }
- /* `Class' != `<class> *' && `<class> *' != `Class'! */
- else if ((OBJC_TYPE_NAME (lhs) == objc_class_id && TYPED_OBJECT (rhs))
- || (OBJC_TYPE_NAME (rhs) == objc_class_id && TYPED_OBJECT (lhs)))
- return 0;
+ /* The 'build_component_ref' routine has been removed from the C++
+ front-end, but 'finish_class_member_access_expr' seems to be
+ a worthy substitute. */
+#ifdef OBJCPLUS
+ return finish_class_member_access_expr (datum, component);
+#else
+ return build_component_ref (datum, component);
+#endif
+}
+
+/* Recursively copy inheritance information rooted at BINFO. To do this,
+ we emulate the song and dance performed by cp/tree.c:copy_binfo(). */
+
+static tree
+objc_copy_binfo (tree binfo)
+{
+ tree btype = BINFO_TYPE (binfo);
+ tree binfo2 = make_tree_binfo (BINFO_N_BASE_BINFOS (binfo));
+ tree base_binfo;
+ int ix;
- /* `<class> *' = `<class> *' */
+ BINFO_TYPE (binfo2) = btype;
+ BINFO_OFFSET (binfo2) = BINFO_OFFSET (binfo);
+ BINFO_BASE_ACCESSES (binfo2) = BINFO_BASE_ACCESSES (binfo);
- else if (TYPED_OBJECT (lhs) && TYPED_OBJECT (rhs))
+ /* Recursively copy base binfos of BINFO. */
+ for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
{
- tree lname = OBJC_TYPE_NAME (lhs);
- tree rname = OBJC_TYPE_NAME (rhs);
- tree inter;
+ tree base_binfo2 = objc_copy_binfo (base_binfo);
- if (lname == rname)
- return 1;
+ BINFO_INHERITANCE_CHAIN (base_binfo2) = binfo2;
+ BINFO_BASE_APPEND (binfo2, base_binfo2);
+ }
+
+ return binfo2;
+}
+
+/* Record superclass information provided in BASETYPE for ObjC class REF.
+ This is loosely based on cp/decl.c:xref_basetypes(). */
- /* If the left hand side is a super class of the right hand side,
- allow it. */
- for (inter = lookup_interface (rname); inter;
- inter = lookup_interface (CLASS_SUPER_NAME (inter)))
- if (lname == CLASS_SUPER_NAME (inter))
- return 1;
+static void
+objc_xref_basetypes (tree ref, tree basetype)
+{
+ tree binfo = make_tree_binfo (basetype ? 1 : 0);
- /* Allow the reverse when reflexive. */
- if (reflexive)
- for (inter = lookup_interface (lname); inter;
- inter = lookup_interface (CLASS_SUPER_NAME (inter)))
- if (rname == CLASS_SUPER_NAME (inter))
- return 1;
+ TYPE_BINFO (ref) = binfo;
+ BINFO_OFFSET (binfo) = size_zero_node;
+ BINFO_TYPE (binfo) = ref;
+
+ if (basetype)
+ {
+ tree base_binfo = objc_copy_binfo (TYPE_BINFO (basetype));
- return 0;
+ BINFO_INHERITANCE_CHAIN (base_binfo) = binfo;
+ BINFO_BASE_ACCESSES (binfo) = VEC_alloc (tree, gc, 1);
+ BINFO_BASE_APPEND (binfo, base_binfo);
+ BINFO_BASE_ACCESS_APPEND (binfo, access_public_node);
}
- else
- /* Not an ObjC type - let comptypes do the check. */
- return -1;
+}
+
+static hashval_t
+volatilized_hash (const void *ptr)
+{
+ tree typ = ((struct volatilized_type *)ptr)->type;
+
+ return htab_hash_pointer(typ);
+}
+
+static int
+volatilized_eq (const void *ptr1, const void *ptr2)
+{
+ tree typ1 = ((struct volatilized_type *)ptr1)->type;
+ tree typ2 = ((struct volatilized_type *)ptr2)->type;
+
+ return typ1 == typ2;
}
/* Called from finish_decl. */
@@ -1532,10 +1667,6 @@ synth_module_prologue (void)
/* Pre-build the following entities - for speed/convenience. */
self_id = get_identifier ("self");
ucmd_id = get_identifier ("_cmd");
-#ifndef OBJCPLUS
- /* The C++ front-end does not appear to grok __attribute__((__unused__)). */
- unused_list = build_tree_list (get_identifier ("__unused__"), NULL_TREE);
-#endif
#ifdef OBJCPLUS
pop_lang_context ();
@@ -1591,6 +1722,16 @@ my_build_string (int len, const char *str)
return fix_string_type (build_string (len, str));
}
+/* Build a string with contents STR and length LEN and convert it to a
+ pointer. */
+
+static tree
+my_build_string_pointer (int len, const char *str)
+{
+ tree string = my_build_string (len, str);
+ tree ptrtype = build_pointer_type (TREE_TYPE (TREE_TYPE (string)));
+ return build1 (ADDR_EXPR, ptrtype, string);
+}
static hashval_t
string_hash (const void *ptr)
@@ -2512,23 +2653,29 @@ add_class_reference (tree ident)
tree
objc_get_class_reference (tree ident)
{
- tree orig_ident;
+ tree orig_ident = (DECL_P (ident)
+ ? DECL_NAME (ident)
+ : TYPE_P (ident)
+ ? OBJC_TYPE_NAME (ident)
+ : ident);
bool local_scope = false;
#ifdef OBJCPLUS
if (processing_template_decl)
/* Must wait until template instantiation time. */
return build_min_nt (CLASS_REFERENCE_EXPR, ident);
+#endif
+
if (TREE_CODE (ident) == TYPE_DECL)
- {
- /* The type must exist in the global namespace. */
- if (DECL_CONTEXT (ident) && DECL_CONTEXT (ident) != global_namespace)
- local_scope = true;
+ ident = (DECL_ORIGINAL_TYPE (ident)
+ ? DECL_ORIGINAL_TYPE (ident)
+ : TREE_TYPE (ident));
- ident = DECL_NAME (ident);
- }
+#ifdef OBJCPLUS
+ if (TYPE_P (ident) && TYPE_CONTEXT (ident)
+ && TYPE_CONTEXT (ident) != global_namespace)
+ local_scope = true;
#endif
- orig_ident = ident;
if (local_scope || !(ident = objc_is_class_name (ident)))
{
@@ -2562,8 +2709,9 @@ objc_get_class_reference (tree ident)
add_class_reference (ident);
params = build_tree_list (NULL_TREE,
- my_build_string (IDENTIFIER_LENGTH (ident) + 1,
- IDENTIFIER_POINTER (ident)));
+ my_build_string_pointer
+ (IDENTIFIER_LENGTH (ident) + 1,
+ IDENTIFIER_POINTER (ident)));
assemble_external (objc_get_class_decl);
return build_function_call (objc_get_class_decl, params);
@@ -2656,7 +2804,20 @@ objc_declare_alias (tree alias_ident, tree class_ident)
else if (objc_is_class_name (alias_ident))
warning (0, "class %qs already exists", IDENTIFIER_POINTER (alias_ident));
else
- alias_chain = tree_cons (underlying_class, alias_ident, alias_chain);
+ {
+ /* Implement @compatibility_alias as a typedef. */
+#ifdef OBJCPLUS
+ push_lang_context (lang_name_c); /* extern "C" */
+#endif
+ lang_hooks.decls.pushdecl (build_decl
+ (TYPE_DECL,
+ alias_ident,
+ xref_tag (RECORD_TYPE, underlying_class)));
+#ifdef OBJCPLUS
+ pop_lang_context ();
+#endif
+ alias_chain = tree_cons (underlying_class, alias_ident, alias_chain);
+ }
}
void
@@ -2807,10 +2968,11 @@ objc_substitute_decl (tree expr, tree oldexpr, tree newexpr)
switch (TREE_CODE (expr))
{
case COMPONENT_REF:
- return build_component_ref (objc_substitute_decl (TREE_OPERAND (expr, 0),
- oldexpr,
- newexpr),
- DECL_NAME (TREE_OPERAND (expr, 1)));
+ return objc_build_component_ref
+ (objc_substitute_decl (TREE_OPERAND (expr, 0),
+ oldexpr,
+ newexpr),
+ DECL_NAME (TREE_OPERAND (expr, 1)));
case ARRAY_REF:
return build_array_ref (objc_substitute_decl (TREE_OPERAND (expr, 0),
oldexpr,
@@ -3103,7 +3265,7 @@ objc_get_class_ivars (tree class_name)
tree interface = lookup_interface (class_name);
if (interface)
- return get_class_ivars (interface);
+ return get_class_ivars (interface, true);
error ("cannot find interface declaration for %qs",
IDENTIFIER_POINTER (class_name));
@@ -3115,7 +3277,7 @@ objc_get_class_ivars (tree class_name)
and for @defs constructs. */
static tree
-get_class_ivars (tree interface)
+get_class_ivars (tree interface, bool inherited)
{
tree ivar_chain = copy_list (CLASS_RAW_IVARS (interface));
@@ -3126,6 +3288,9 @@ get_class_ivars (tree interface)
if (!CLASS_IVARS (interface))
CLASS_IVARS (interface) = ivar_chain;
+ if (!inherited)
+ return ivar_chain;
+
while (CLASS_SUPER_NAME (interface))
{
/* Prepend super-class ivars. */
@@ -3283,8 +3448,8 @@ next_sjlj_build_enter_and_setjmp (void)
t = tree_cons (NULL, t, NULL);
enter = build_function_call (objc_exception_try_enter_decl, t);
- t = build_component_ref (cur_try_context->stack_decl,
- get_identifier ("buf"));
+ t = objc_build_component_ref (cur_try_context->stack_decl,
+ get_identifier ("buf"));
t = build_fold_addr_expr (t);
#ifdef OBJCPLUS
/* Convert _setjmp argument to type that is expected. */
@@ -3569,7 +3734,7 @@ objc_begin_catch_clause (tree decl)
t = CATCH_TYPES (stmt);
if (t == error_mark_node)
continue;
- if (!t || objc_comptypes (TREE_TYPE (t), TREE_TYPE (type), 0) == 1)
+ if (!t || DERIVED_FROM_P (TREE_TYPE (t), TREE_TYPE (type)))
{
warning (0, "exception of type %<%T%> will be caught",
TREE_TYPE (type));
@@ -3869,9 +4034,10 @@ build_private_template (tree class)
{
if (!CLASS_STATIC_TEMPLATE (class))
{
- tree record = start_struct (RECORD_TYPE, CLASS_NAME (class));
+ tree record = objc_build_struct (CLASS_NAME (class),
+ get_class_ivars (class, false),
+ CLASS_SUPER_NAME (class));
- finish_struct (record, get_class_ivars (class), NULL_TREE);
/* mark this record as class template - for class type checking */
INIT_TYPE_OBJC_INFO (record);
TYPE_OBJC_INTERFACE (record) = class;
@@ -4702,8 +4868,8 @@ synth_forward_declarations (void)
/* Pre-build the following entities - for speed/convenience. */
an_id = get_identifier ("super_class");
- ucls_super_ref = build_component_ref (UOBJC_CLASS_decl, an_id);
- uucls_super_ref = build_component_ref (UOBJC_METACLASS_decl, an_id);
+ ucls_super_ref = objc_build_component_ref (UOBJC_CLASS_decl, an_id);
+ uucls_super_ref = objc_build_component_ref (UOBJC_METACLASS_decl, an_id);
}
static void
@@ -6482,7 +6648,7 @@ build_ivar_reference (tree id)
self_decl = convert (objc_instance_type, self_decl); /* cast */
}
- return build_component_ref (build_indirect_ref (self_decl, "->"), id);
+ return objc_build_component_ref (build_indirect_ref (self_decl, "->"), id);
}
/* Compute a hash value for a given method SEL_NAME. */
@@ -6510,6 +6676,10 @@ hash_init (void)
/* Initialize the hash table used to hold the constant string objects. */
string_htab = htab_create_ggc (31, string_hash,
string_eq, NULL);
+
+ /* Initialize the hash table used to hold EH-volatilized types. */
+ volatilized_htab = htab_create_ggc (31, volatilized_hash,
+ volatilized_eq, NULL);
}
/* WARNING!!!! hash_enter is called with a method, and will peek
@@ -6924,8 +7094,14 @@ is_private (tree decl)
int
objc_is_public (tree expr, tree identifier)
{
- tree basetype = TREE_TYPE (expr);
- tree decl;
+ tree basetype, decl;
+
+#ifdef OBJCPLUS
+ if (processing_template_decl)
+ return 1;
+#endif
+
+ basetype = TYPE_MAIN_VARIANT (TREE_TYPE (expr));
if (basetype && TREE_CODE (basetype) == RECORD_TYPE)
{
@@ -6940,7 +7116,7 @@ objc_is_public (tree expr, tree identifier)
return 0;
}
- if ((decl = is_ivar (get_class_ivars (class), identifier)))
+ if ((decl = is_ivar (get_class_ivars (class, true), identifier)))
{
if (TREE_PUBLIC (decl))
return 1;
@@ -6949,19 +7125,26 @@ objc_is_public (tree expr, tree identifier)
all instance variables should be public within the context
of the implementation. */
if (objc_implementation_context
- && (((TREE_CODE (objc_implementation_context)
- == CLASS_IMPLEMENTATION_TYPE)
- || (TREE_CODE (objc_implementation_context)
- == CATEGORY_IMPLEMENTATION_TYPE))
- && (CLASS_NAME (objc_implementation_context)
- == OBJC_TYPE_NAME (basetype))))
+ && ((TREE_CODE (objc_implementation_context)
+ == CLASS_IMPLEMENTATION_TYPE)
+ || (TREE_CODE (objc_implementation_context)
+ == CATEGORY_IMPLEMENTATION_TYPE)))
{
- int private = is_private (decl);
+ tree curtype = TYPE_MAIN_VARIANT
+ (CLASS_STATIC_TEMPLATE
+ (implementation_template));
+
+ if (basetype == curtype
+ || DERIVED_FROM_P (basetype, curtype))
+ {
+ int private = is_private (decl);
+
+ if (private)
+ error ("instance variable %qs is declared private",
+ IDENTIFIER_POINTER (DECL_NAME (decl)));
- if (private)
- error ("instance variable %qs is declared private",
- IDENTIFIER_POINTER (DECL_NAME (decl)));
- return !private;
+ return !private;
+ }
}
/* The 2.95.2 compiler sometimes allowed C functions to access
@@ -7396,7 +7579,7 @@ continue_class (tree class)
pop_lang_context ();
#endif /* OBJCPLUS */
- return get_class_ivars (implementation_template);
+ return get_class_ivars (implementation_template, true);
}
else if (TREE_CODE (class) == CLASS_INTERFACE_TYPE)
@@ -7682,6 +7865,47 @@ encode_array (tree type, int curtype, int format)
}
static void
+encode_aggregate_fields (tree type, int pointed_to, int curtype, int format)
+{
+ tree field = TYPE_FIELDS (type);
+
+ for (; field; field = TREE_CHAIN (field))
+ {
+#ifdef OBJCPLUS
+ /* C++ static members, and things that are not field at all,
+ should not appear in the encoding. */
+ if (TREE_CODE (field) != FIELD_DECL || TREE_STATIC (field))
+ continue;
+#endif
+
+ /* Recursively encode fields of embedded base classes. */
+ if (DECL_ARTIFICIAL (field) && !DECL_NAME (field)
+ && TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
+ {
+ encode_aggregate_fields (TREE_TYPE (field),
+ pointed_to, curtype, format);
+ continue;
+ }
+
+ if (generating_instance_variables && !pointed_to)
+ {
+ tree fname = DECL_NAME (field);
+
+ obstack_1grow (&util_obstack, '"');
+
+ if (fname && TREE_CODE (fname) == IDENTIFIER_NODE)
+ obstack_grow (&util_obstack,
+ IDENTIFIER_POINTER (fname),
+ strlen (IDENTIFIER_POINTER (fname)));
+
+ obstack_1grow (&util_obstack, '"');
+ }
+
+ encode_field_decl (field, curtype, format);
+ }
+}
+
+static void
encode_aggregate_within (tree type, int curtype, int format, int left,
int right)
{
@@ -7721,30 +7945,8 @@ encode_aggregate_within (tree type, int curtype, int format, int left,
if required. */
if (inline_contents)
{
- tree fields = TYPE_FIELDS (type);
-
obstack_1grow (&util_obstack, '=');
- for (; fields; fields = TREE_CHAIN (fields))
- {
-#ifdef OBJCPLUS
- /* C++ static members, and things that are not fields at all,
- should not appear in the encoding. */
- if (TREE_CODE (fields) != FIELD_DECL || TREE_STATIC (fields))
- continue;
-#endif
- if (generating_instance_variables && !pointed_to)
- {
- tree fname = DECL_NAME (fields);
-
- obstack_1grow (&util_obstack, '"');
- if (fname && TREE_CODE (fname) == IDENTIFIER_NODE)
- obstack_grow (&util_obstack,
- IDENTIFIER_POINTER (fname),
- strlen (IDENTIFIER_POINTER (fname)));
- obstack_1grow (&util_obstack, '"');
- }
- encode_field_decl (fields, curtype, format);
- }
+ encode_aggregate_fields (type, pointed_to, curtype, format);
}
/* Close parenth/bracket. */
obstack_1grow (&util_obstack, right);
@@ -8392,13 +8594,13 @@ get_super_receiver (void)
}
/* Set receiver to self. */
- super_expr = build_component_ref (UOBJC_SUPER_decl, self_id);
+ super_expr = objc_build_component_ref (UOBJC_SUPER_decl, self_id);
super_expr = build_modify_expr (super_expr, NOP_EXPR, self_decl);
super_expr_list = super_expr;
/* Set class to begin searching. */
- super_expr = build_component_ref (UOBJC_SUPER_decl,
- get_identifier ("super_class"));
+ super_expr = objc_build_component_ref (UOBJC_SUPER_decl,
+ get_identifier ("super_class"));
if (TREE_CODE (objc_implementation_context) == CLASS_IMPLEMENTATION_TYPE)
{
@@ -8450,8 +8652,9 @@ get_super_receiver (void)
(super_class,
build_tree_list
(NULL_TREE,
- my_build_string (IDENTIFIER_LENGTH (super_name) + 1,
- IDENTIFIER_POINTER (super_name))));
+ my_build_string_pointer
+ (IDENTIFIER_LENGTH (super_name) + 1,
+ IDENTIFIER_POINTER (super_name))));
}
super_expr
@@ -9174,14 +9377,14 @@ objc_rewrite_function_call (tree function, tree params)
a function in OBJ_TYPE_REF_EXPR (presumably objc_msgSend or one
of its cousins). */
-enum gimplify_status objc_gimplify_expr (tree *expr_p, tree *pre_p,
- tree *post_p)
+enum gimplify_status
+objc_gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p)
{
enum gimplify_status r0, r1;
- if (TREE_CODE (*expr_p) == OBJ_TYPE_REF
+ if (TREE_CODE (*expr_p) == OBJ_TYPE_REF
&& TREE_CODE (OBJ_TYPE_REF_EXPR (*expr_p)) == ADDR_EXPR
- && TREE_CODE (TREE_OPERAND (OBJ_TYPE_REF_EXPR (*expr_p), 0))
- == FUNCTION_DECL)
+ && TREE_CODE (TREE_OPERAND (OBJ_TYPE_REF_EXPR (*expr_p), 0))
+ == FUNCTION_DECL)
{
/* Postincrements in OBJ_TYPE_REF_OBJECT don't affect the
value of the OBJ_TYPE_REF, so force them to be emitted
@@ -9193,8 +9396,10 @@ enum gimplify_status objc_gimplify_expr (tree *expr_p, tree *pre_p,
is_gimple_val, fb_rvalue);
r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p, post_p,
is_gimple_val, fb_rvalue);
+
return MIN (r0, r1);
}
+
#ifdef OBJCPLUS
return cp_gimplify_expr (expr_p, pre_p, post_p);
#else
diff --git a/gcc/objc/objc-act.h b/gcc/objc/objc-act.h
index 47ee83ed5e3..f99f60d07ba 100644
--- a/gcc/objc/objc-act.h
+++ b/gcc/objc/objc-act.h
@@ -32,7 +32,6 @@ const char *objc_printable_name (tree, int);
tree objc_get_callee_fndecl (tree);
void objc_finish_file (void);
tree objc_fold_obj_type_ref (tree, tree);
-int objc_types_compatible_p (tree, tree);
enum gimplify_status objc_gimplify_expr (tree *, tree *, tree *);
/* NB: The remaining public functions are prototyped in c-common.h, for the
@@ -190,7 +189,6 @@ enum objc_tree_index
OCTI_STATIC_NST_DECL,
OCTI_SELF_ID,
OCTI_UCMD_ID,
- OCTI_UNUSED_LIST,
OCTI_SELF_DECL,
OCTI_UMSG_DECL,
@@ -305,7 +303,6 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX];
#define self_id objc_global_trees[OCTI_SELF_ID]
#define ucmd_id objc_global_trees[OCTI_UCMD_ID]
-#define unused_list objc_global_trees[OCTI_UNUSED_LIST]
#define self_decl objc_global_trees[OCTI_SELF_DECL]
#define umsg_decl objc_global_trees[OCTI_UMSG_DECL]
diff --git a/gcc/objc/objc-lang.c b/gcc/objc/objc-lang.c
index 0d64dbd2487..e8e50c92d76 100644
--- a/gcc/objc/objc-lang.c
+++ b/gcc/objc/objc-lang.c
@@ -45,8 +45,6 @@ enum c_language_kind c_language = clk_objc;
#define LANG_HOOKS_INIT objc_init
#undef LANG_HOOKS_DECL_PRINTABLE_NAME
#define LANG_HOOKS_DECL_PRINTABLE_NAME objc_printable_name
-#undef LANG_HOOKS_TYPES_COMPATIBLE_P
-#define LANG_HOOKS_TYPES_COMPATIBLE_P objc_types_compatible_p
#undef LANG_HOOKS_GIMPLIFY_EXPR
#define LANG_HOOKS_GIMPLIFY_EXPR objc_gimplify_expr
#undef LANG_HOOKS_GET_CALLEE_FNDECL
diff --git a/gcc/objcp/ChangeLog b/gcc/objcp/ChangeLog
index dea594dbd4b..f80405f6f0d 100644
--- a/gcc/objcp/ChangeLog
+++ b/gcc/objcp/ChangeLog
@@ -1,3 +1,12 @@
+2005-05-24 Ziemowit Laski <zlaski@apple.com>
+
+ * objcp-decl.c (objcp_start_struct, objcp_xref_tag): Adjust
+ call to xref_tag().
+ (objcp_build_component_ref): Remove function.
+ * objcp-decl.h (objcp_build_component_ref): Remove prototype.
+ (build_component_ref): Remove macro.
+ * objcp-lang.c (LANG_HOOKS_TYPES_COMPATIBLE_P): Remove.
+
2005-05-18 Geoffrey Keating <geoffk@apple.com>
* Make-lang.in (cc1objplus-dummy): New.
@@ -5,7 +14,8 @@
(cc1objplus-checksum.o): New.
(cc1objplus): Add cc1objplus-checksum.o.
-2005-05-17 Mike Stump <mrs@apple.com>
+2005-05-17 Ziemowit Laski <zlaski@apple.com>
+ Mike Stump <mrs@apple.com>
Yet more Objective-C++...
@@ -14,7 +24,8 @@
(objcp/objcp-act.o): Likewise.
* objcp-lang.c (LANG_HOOKS_GIMPLIFY_EXPR): Add.
-2005-04-21 Mike Stump <mrs@apple.com>
+2005-04-21 Ziemowit Laski <zlaski@apple.com>
+ Mike Stump <mrs@apple.com>
* ChangeLog: New.
* Make-lang.in: Likewise.
diff --git a/gcc/objcp/objcp-decl.c b/gcc/objcp/objcp-decl.c
index 7493a23f609..68bcb0f25ea 100644
--- a/gcc/objcp/objcp-decl.c
+++ b/gcc/objcp/objcp-decl.c
@@ -51,9 +51,11 @@ objcp_start_struct (enum tree_code code ATTRIBUTE_UNUSED, tree name)
/* The idea here is to mimic the actions that the C++ parser takes when
constructing 'extern "C" struct NAME {'. */
push_lang_context (lang_name_c);
+
if (!name)
name = make_anon_name ();
- s = xref_tag (record_type, name, ts_current, 0);
+
+ s = xref_tag (record_type, name, ts_global, 0);
CLASSTYPE_DECLARED_CLASS (s) = 0; /* this is a 'struct', not a 'class'. */
xref_basetypes (s, NULL_TREE); /* no base classes here! */
@@ -94,16 +96,7 @@ objcp_lookup_name (tree name)
tree
objcp_xref_tag (enum tree_code code ATTRIBUTE_UNUSED, tree name)
{
- return xref_tag (record_type, name, true, false);
-}
-
-tree
-objcp_build_component_ref (tree datum, tree component)
-{
- /* The 'build_component_ref' routine has been removed from the C++
- front-end, but 'finish_class_member_access_expr' seems to be
- a worthy substitute. */
- return finish_class_member_access_expr (datum, component);
+ return xref_tag (record_type, name, ts_global, false);
}
int
diff --git a/gcc/objcp/objcp-decl.h b/gcc/objcp/objcp-decl.h
index 39cad46d2e9..a6b14b76741 100644
--- a/gcc/objcp/objcp-decl.h
+++ b/gcc/objcp/objcp-decl.h
@@ -29,7 +29,6 @@ extern void objcp_finish_function (void);
extern tree objcp_lookup_name (tree);
extern tree objcp_build_function_call (tree, tree);
extern tree objcp_xref_tag (enum tree_code, tree);
-extern tree objcp_build_component_ref (tree, tree);
extern int objcp_comptypes (tree, tree);
extern tree objcp_builtin_function (const char *, tree, int,
enum built_in_class, const char *, tree);
@@ -51,8 +50,6 @@ extern tree objcp_end_compound_stmt (tree, int);
objcp_lookup_name (name)
#define xref_tag(code, name) \
objcp_xref_tag (code, name)
-#define build_component_ref(datum, component) \
- objcp_build_component_ref (datum, component)
#define comptypes(type1, type2) \
objcp_comptypes (type1, type2)
#define c_begin_compound_stmt(flags) \
diff --git a/gcc/objcp/objcp-lang.c b/gcc/objcp/objcp-lang.c
index 63f1953a770..7f2b6e107c7 100644
--- a/gcc/objcp/objcp-lang.c
+++ b/gcc/objcp/objcp-lang.c
@@ -46,8 +46,6 @@ enum c_language_kind c_language = clk_objcxx;
#define LANG_HOOKS_INIT objc_init
#undef LANG_HOOKS_DECL_PRINTABLE_NAME
#define LANG_HOOKS_DECL_PRINTABLE_NAME objc_printable_name
-#undef LANG_HOOKS_TYPES_COMPATIBLE_P
-#define LANG_HOOKS_TYPES_COMPATIBLE_P objc_types_compatible_p
#undef LANG_HOOKS_GIMPLIFY_EXPR
#define LANG_HOOKS_GIMPLIFY_EXPR objc_gimplify_expr
#undef LANG_HOOKS_GET_CALLEE_FNDECL
diff --git a/gcc/opt-functions.awk b/gcc/opt-functions.awk
index 9dc9640d998..b5124969cec 100644
--- a/gcc/opt-functions.awk
+++ b/gcc/opt-functions.awk
@@ -89,6 +89,43 @@ function var_name(flags)
return nth_arg(0, opt_args("Var", flags))
}
+# Return true if the option described by FLAGS has a globally-visible state.
+function global_state_p(flags)
+{
+ return (var_name(flags) != "" \
+ || opt_args("Mask", flags) != "" \
+ || opt_args("InverseMask", flags) != "")
+}
+
+# Return true if the option described by FLAGS must have some state
+# associated with it.
+function needs_state_p(flags)
+{
+ return flag_set_p("Target", flags)
+}
+
+# If FLAGS describes an option that needs a static state variable,
+# return the name of that variable, otherwise return "". NAME is
+# the name of the option.
+function static_var(name, flags)
+{
+ if (global_state_p(flags) || !needs_state_p(flags))
+ return ""
+ gsub ("[^A-Za-z0-9]", "_", name)
+ return "VAR_" name
+}
+
+# Return the type of variable that should be associated with the given flags.
+function var_type(flags)
+{
+ if (!flag_set_p("Joined.*", flags))
+ return "int "
+ else if (flag_set_p("UInteger", flags))
+ return "int "
+ else
+ return "const char *"
+}
+
# Given that an option has flags FLAGS, return an initializer for the
# "var_cond" and "var_value" fields of its cl_options[] entry.
function var_set(flags)
@@ -109,17 +146,19 @@ function var_set(flags)
vn = var_name(flags);
if (vn)
return "CLVC_BIT_CLEAR, OPTION_MASK_" s
- else
+ else
return "CLVC_BIT_CLEAR, MASK_" s
}
+ if (var_type(flags) == "const char *")
+ return "CLVC_STRING, 0"
return "CLVC_BOOLEAN, 0"
}
-# Given that an option has flags FLAGS, return an initializer for the
-# "flag_var" field of its cl_options[] entry.
-function var_ref(flags)
+# Given that an option called NAME has flags FLAGS, return an initializer
+# for the "flag_var" field of its cl_options[] entry.
+function var_ref(name, flags)
{
- name = var_name(flags)
+ name = var_name(flags) static_var(name, flags)
if (name != "")
return "&" name
if (opt_args("Mask", flags) != "")
diff --git a/gcc/optabs.c b/gcc/optabs.c
index d3c4934c544..2e84ac3a0b8 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -5627,6 +5627,7 @@ expand_bool_compare_and_swap (rtx mem, rtx old_val, rtx new_val, rtx target)
emit_jump_insn (bcc_gen_fctn[EQ] (label0));
emit_move_insn (target, const0_rtx);
emit_jump_insn (gen_jump (label1));
+ emit_barrier ();
emit_label (label0);
emit_move_insn (target, const1_rtx);
emit_label (label1);
diff --git a/gcc/optc-gen.awk b/gcc/optc-gen.awk
index 4c4eef7a8a2..85876e0f148 100644
--- a/gcc/optc-gen.awk
+++ b/gcc/optc-gen.awk
@@ -77,12 +77,22 @@ for (i = 0; i < n_opts; i++) {
else if (name in var_seen)
continue;
- printf ("/* Set by -%s.\n %s */\nint %s%s;\n\n",
- opts[i], help[i], name,init)
+ print "/* Set by -" opts[i] "."
+ print " " help[i] " */"
+ print var_type(flags[i]) name init ";"
+ print ""
var_seen[name] = 1;
}
+print ""
+print "/* Local state variables. */"
+for (i = 0; i < n_opts; i++) {
+ name = static_var(opts[i], flags[i]);
+ if (name != "")
+ print "static " var_type(flags[i]) name ";"
+}
+print ""
print "const char * const lang_names[] =\n{"
for (i = 0; i < n_langs; i++) {
@@ -150,7 +160,8 @@ for (i = 0; i < n_opts; i++) {
condition, cl_flags, cl_flags)
else
printf(" %s,\n", cl_flags)
- printf(" %s, %s }%s\n", var_ref(flags[i]), var_set(flags[i]), comma)
+ printf(" %s, %s }%s\n", var_ref(opts[i], flags[i]),
+ var_set(flags[i]), comma)
}
print "};"
diff --git a/gcc/opth-gen.awk b/gcc/opth-gen.awk
index e95af00d2c4..1a63bc90f63 100644
--- a/gcc/opth-gen.awk
+++ b/gcc/opth-gen.awk
@@ -68,12 +68,9 @@ for (i = 0; i < n_opts; i++) {
if (name == "")
continue;
- print "/* Set by -" opts[i] "."
- print " " help[i] " */"
- print "extern int " name ";"
- print ""
-
- }
+ print "extern " var_type(flags[i]) name ";"
+}
+print ""
for (i = 0; i < n_opts; i++) {
name = opt_args("Mask", flags[i])
diff --git a/gcc/opts.c b/gcc/opts.c
index 896728c3727..039e0f1208d 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -110,8 +110,10 @@ static void complain_wrong_lang (const char *, const struct cl_option *,
unsigned int lang_mask);
static void handle_options (unsigned int, const char **, unsigned int);
static void wrap_help (const char *help, const char *item, unsigned int);
+static void print_target_help (void);
static void print_help (void);
static void print_param_help (void);
+static void print_filtered_help (unsigned int);
static unsigned int print_switch (const char *text, unsigned int indent);
static void set_debug_level (enum debug_info_type type, int extended,
const char *arg);
@@ -294,16 +296,7 @@ handle_option (const char **argv, unsigned int lang_mask)
}
if (opt_index == cl_options_count)
- {
-#if defined (TARGET_OPTIONS) || defined (TARGET_SWITCHES)
- if (opt[1] == 'm')
- {
- set_target_switch (argv[0] + 2);
- result = 1;
- }
-#endif
- goto done;
- }
+ goto done;
option = &cl_options[opt_index];
@@ -379,25 +372,31 @@ handle_option (const char **argv, unsigned int lang_mask)
}
if (option->flag_var)
- switch (option->var_cond)
+ switch (option->var_type)
{
case CLVC_BOOLEAN:
- *option->flag_var = value;
+ *(int *) option->flag_var = value;
break;
case CLVC_EQUAL:
- *option->flag_var = value ? option->var_value : !option->var_value;
+ *(int *) option->flag_var = (value
+ ? option->var_value
+ : !option->var_value);
break;
case CLVC_BIT_CLEAR:
case CLVC_BIT_SET:
- if ((value != 0) == (option->var_cond == CLVC_BIT_SET))
- *option->flag_var |= option->var_value;
+ if ((value != 0) == (option->var_type == CLVC_BIT_SET))
+ *(int *) option->flag_var |= option->var_value;
else
- *option->flag_var &= ~option->var_value;
+ *(int *) option->flag_var &= ~option->var_value;
if (option->flag_var == &target_flags)
target_flags_explicit |= option->var_value;
break;
+
+ case CLVC_STRING:
+ *(const char **) option->flag_var = arg;
+ break;
}
if (option->flags & lang_mask)
@@ -627,7 +626,6 @@ decode_options (unsigned int argc, const char **argv)
/* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
modify it. */
target_flags = targetm.default_target_flags;
- set_target_switch ("");
/* Unwind tables are always present when a target has ABI-specified unwind
tables, so the default should be ON. */
@@ -668,7 +666,8 @@ decode_options (unsigned int argc, const char **argv)
this to `2' if -Wall is used, so we can avoid giving out
lots of errors for people who don't realize what -Wall does. */
if (warn_uninitialized == 1)
- warning (0, "-Wuninitialized is not supported without -O");
+ warning (OPT_Wuninitialized,
+ "-Wuninitialized is not supported without -O");
}
if (flag_really_no_inline == 2)
@@ -719,7 +718,7 @@ common_handle_option (size_t scode, const char *arg, int value)
break;
case OPT__target_help:
- display_target_options ();
+ print_target_help ();
exit_after_options = true;
break;
@@ -920,7 +919,7 @@ common_handle_option (size_t scode, const char *arg, int value)
else if (!strcmp(arg, "protected"))
default_visibility = VISIBILITY_PROTECTED;
else
- error ("unrecognised visibility value \"%s\"", arg);
+ error ("unrecognized visibility value \"%s\"", arg);
}
break;
@@ -1196,6 +1195,27 @@ set_debug_level (enum debug_info_type type, int extended, const char *arg)
}
}
+/* Display help for target options. */
+static void
+print_target_help (void)
+{
+ unsigned int i;
+ static bool displayed = false;
+
+ /* Avoid double printing for --help --target-help. */
+ if (displayed)
+ return;
+
+ displayed = true;
+ for (i = 0; i < cl_options_count; i++)
+ if ((cl_options[i].flags & (CL_TARGET | CL_UNDOCUMENTED)) == CL_TARGET)
+ {
+ printf (_("\nTarget specific options:\n"));
+ print_filtered_help (CL_TARGET);
+ break;
+ }
+}
+
/* Output --help text. */
static void
print_help (void)
@@ -1222,8 +1242,7 @@ print_help (void)
lang_names[i]);
print_filtered_help (1U << i);
}
-
- display_target_options ();
+ print_target_help ();
}
/* Print the help for --param. */
@@ -1252,7 +1271,7 @@ print_param_help (void)
}
/* Print help for a specific front-end, etc. */
-void
+static void
print_filtered_help (unsigned int flag)
{
unsigned int i, len, filter, indent = 0;
@@ -1416,19 +1435,56 @@ option_enabled (int opt_idx)
{
const struct cl_option *option = &(cl_options[opt_idx]);
if (option->flag_var)
- switch (option->var_cond)
+ switch (option->var_type)
{
case CLVC_BOOLEAN:
- return *option->flag_var != 0;
+ return *(int *) option->flag_var != 0;
case CLVC_EQUAL:
- return *option->flag_var == option->var_value;
+ return *(int *) option->flag_var == option->var_value;
case CLVC_BIT_CLEAR:
- return (*option->flag_var & option->var_value) == 0;
+ return (*(int *) option->flag_var & option->var_value) == 0;
case CLVC_BIT_SET:
- return (*option->flag_var & option->var_value) != 0;
+ return (*(int *) option->flag_var & option->var_value) != 0;
+
+ case CLVC_STRING:
+ break;
}
return -1;
}
+
+/* Fill STATE with the current state of option OPTION. Return true if
+ there is some state to store. */
+
+bool
+get_option_state (int option, struct cl_option_state *state)
+{
+ if (cl_options[option].flag_var == 0)
+ return false;
+
+ switch (cl_options[option].var_type)
+ {
+ case CLVC_BOOLEAN:
+ case CLVC_EQUAL:
+ state->data = cl_options[option].flag_var;
+ state->size = sizeof (int);
+ break;
+
+ case CLVC_BIT_CLEAR:
+ case CLVC_BIT_SET:
+ state->ch = option_enabled (option);
+ state->data = &state->ch;
+ state->size = 1;
+ break;
+
+ case CLVC_STRING:
+ state->data = *(const char **) cl_options[option].flag_var;
+ if (state->data == 0)
+ state->data = "";
+ state->size = strlen (state->data) + 1;
+ break;
+ }
+ return true;
+}
diff --git a/gcc/opts.h b/gcc/opts.h
index 758f8309abd..bc05ac97957 100644
--- a/gcc/opts.h
+++ b/gcc/opts.h
@@ -22,7 +22,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#define GCC_OPTS_H
/* Specifies how a switch's VAR_VALUE relates to its FLAG_VAR. */
-enum cl_var_cond {
+enum cl_var_type {
/* The switch is enabled when FLAG_VAR is nonzero. */
CLVC_BOOLEAN,
@@ -33,7 +33,11 @@ enum cl_var_cond {
CLVC_BIT_CLEAR,
/* The switch is enabled when VAR_VALUE is set in FLAG_VAR. */
- CLVC_BIT_SET
+ CLVC_BIT_SET,
+
+ /* The switch takes a string argument and FLAG_VAR points to that
+ argument. */
+ CLVC_STRING
};
struct cl_option
@@ -43,11 +47,19 @@ struct cl_option
unsigned short back_chain;
unsigned char opt_len;
unsigned int flags;
- int *flag_var;
- enum cl_var_cond var_cond;
+ void *flag_var;
+ enum cl_var_type var_type;
int var_value;
};
+/* Records that the state of an option consists of SIZE bytes starting
+ at DATA. DATA might point to CH in some cases. */
+struct cl_option_state {
+ const void *data;
+ size_t size;
+ char ch;
+};
+
extern const struct cl_option cl_options[];
extern const unsigned int cl_options_count;
extern const char *const lang_names[];
@@ -73,6 +85,6 @@ extern unsigned num_in_fnames;
extern void decode_options (unsigned int argc, const char **argv);
extern int option_enabled (int opt_idx);
-extern void print_filtered_help (unsigned int);
+extern bool get_option_state (int, struct cl_option_state *);
#endif
diff --git a/gcc/passes.c b/gcc/passes.c
index b51d7c7ddab..93126b020ea 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -227,7 +227,7 @@ rest_of_decl_compilation (tree decl,
&& !DECL_EXTERNAL (decl))
{
if (flag_unit_at_a_time && !cgraph_global_info_ready
- && TREE_CODE (decl) != FUNCTION_DECL && top_level)
+ && TREE_CODE (decl) != FUNCTION_DECL)
cgraph_varpool_finalize_decl (decl);
else
assemble_variable (decl, top_level, at_end, 0);
@@ -1427,7 +1427,6 @@ static void
rest_of_clean_state (void)
{
rtx insn, next;
- coverage_end_function ();
/* It is very important to decompose the RTL instruction chain here:
debug information keeps pointing into CODE_LABEL insns inside the function
diff --git a/gcc/po/ChangeLog b/gcc/po/ChangeLog
index 54e353c6a23..307499ef624 100644
--- a/gcc/po/ChangeLog
+++ b/gcc/po/ChangeLog
@@ -1,3 +1,19 @@
+2005-06-07 Jakub Jelinek <jakub@redhat.com>
+
+ * gcc.pot: Regenerate.
+
+2005-06-06 Jakub Jelinek <jakub@redhat.com>
+
+ * exgettext: Handle gmsgid and cmsgid arguments specially,
+ as gcc-internal-format and c-format. Because of xgettext
+ bug, invoke xgettext once with --language=c, once with
+ --language=GCC-source and then merge together. Fail if
+ xgettext is not 0.14.5 or later.
+
+2005-05-31 Joseph S. Myers <joseph@codesourcery.com>
+
+ * sv.po: Update.
+
2005-05-19 Joseph S. Myers <joseph@codesourcery.com>
* de.po, zh_CN.po: Update.
diff --git a/gcc/po/exgettext b/gcc/po/exgettext
index 3408cb79066..40c646390cf 100644
--- a/gcc/po/exgettext
+++ b/gcc/po/exgettext
@@ -43,6 +43,12 @@ xgettext=$1
package=$2
srcdir=$3
+case `$xgettext --version | sed -e 1q | sed -e 's/^\([^0-9]*\)//'` in
+ 0.14.[5-9]* | 0.14.[1-9][0-9]* | 0.1[5-9]* | 0.[2-9][0-9]* | [1-9].*) : ;;
+ *) echo "$xgettext is too old. GNU xgettext 0.14.5 is required"
+ exit 1 ;;
+esac
+
nl='
'
@@ -55,8 +61,12 @@ trap "rm -r $T" 0
pwd=`${PWDCMD-pwd}`
kopt=$pwd/$T/keyword-options
+kopt2=$pwd/$T/keyword2-options
emsg=$pwd/$T/emsgids.c
posr=$pwd/$T/po-sources
+pottmp1=$pwd/$T/tmp1.pot
+pottmp2=$pwd/$T/tmp2.pot
+pottmp=$pwd/$T/tmp.pot
# Locate files to scan, and generate the list. All .c, .h, and .def files
# in $srcdir are examined, likewise $srcdir/config and $srcdir/config/*
@@ -81,7 +91,7 @@ echo "scanning for keywords and %e strings..." >&2
done
done;
} | tr ' ' "$nl" | grep -v '\*' |
- $AWK -v excl=po/EXCLUDES -v posr=$posr -v kopt=$kopt -v emsg=$emsg '
+ $AWK -v excl=po/EXCLUDES -v posr=$posr -v kopt=$kopt -v kopt2=$kopt2 -v emsg=$emsg '
function keyword_option(line) {
paren_index = index(line, "(")
name = substr(line, 1, paren_index - 1)
@@ -95,12 +105,28 @@ function keyword_option(line) {
for (n = 1; sub(/^[^,]*,/, "", args); n++) {
continue
}
+ format=""
+ if (args ~ /g$/)
+ format="gcc-internal-format"
+ else if (args ~ /c$/)
+ format="c-format"
+
+ if (n == 1) { keyword = "--keyword=" name }
+ else { keyword = "--keyword=" name ":" n }
+ if (format) {
+ keyword=keyword "\n--flag=" name ":" n ":" format
+ }
- if (n == 1) { keyword = name }
- else { keyword = name ":" n }
-
- if (! keyword_seen[keyword]++) {
- print "--keyword=" keyword > kopt
+ if (! keyword_seen[name]) {
+ if (format == "gcc-internal-format")
+ print keyword > kopt2
+ else
+ print keyword > kopt
+ keyword_seen[name] = keyword
+ } else if (keyword_seen[name] != keyword) {
+ printf("%s used incompatibly as both %s and %s\n",
+ name, keyword_seen[name], keyword)
+ exit (1)
}
}
@@ -155,7 +181,7 @@ END {
}
print emsg > posr
}'
-)
+) || exit
echo "scanning option files..." >&2
@@ -186,7 +212,16 @@ $xgettext --default-domain=$package --directory=$srcdir \
--add-comments `cat $kopt` --files-from=$posr \
--copyright-holder="Free Software Foundation, Inc." \
--msgid-bugs-address="http://gcc.gnu.org/bugs.html" \
- --language=c -o po/$package.pot.tmp
+ --language=c -o $pottmp1
+$xgettext --default-domain=$package --directory=$srcdir \
+ --add-comments --keyword= `cat $kopt2` --files-from=$posr \
+ --copyright-holder="Free Software Foundation, Inc." \
+ --msgid-bugs-address="http://gcc.gnu.org/bugs.html" \
+ --language=GCC-source -o $pottmp2
+$xgettext --default-domain=$package \
+ --add-comments $pottmp1 $pottmp2 \
+ --copyright-holder="Free Software Foundation, Inc." \
+ --msgid-bugs-address="http://gcc.gnu.org/bugs.html" \
+ --language=PO -o $pottmp
# Remove local paths from .pot file.
-sed "s:$srcdir/::g;s:$pwd/::g;" <po/$package.pot.tmp >po/$package.pot
-rm po/$package.pot.tmp
+sed "s:$srcdir/::g;s:$pwd/::g;" <$pottmp >po/$package.pot
diff --git a/gcc/po/gcc.pot b/gcc/po/gcc.pot
index 397e6640ebd..6e4f94623e9 100644
--- a/gcc/po/gcc.pot
+++ b/gcc/po/gcc.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n"
-"POT-Creation-Date: 2005-04-06 19:49+0100\n"
+"POT-Creation-Date: 2005-06-07 23:27+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,11964 +16,17141 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: attribs.c:175
+#: c-decl.c:3708
+msgid "<anonymous>"
+msgstr ""
+
+#: c-format.c:341 c-format.c:365
+msgid "' ' flag"
+msgstr ""
+
+#: c-format.c:341 c-format.c:365
+msgid "the ' ' printf flag"
+msgstr ""
+
+#: c-format.c:342 c-format.c:366 c-format.c:404 c-format.c:461
+msgid "'+' flag"
+msgstr ""
+
+#: c-format.c:342 c-format.c:366 c-format.c:404
+msgid "the '+' printf flag"
+msgstr ""
+
+#: c-format.c:343 c-format.c:367 c-format.c:405 c-format.c:437
+msgid "'#' flag"
+msgstr ""
+
+#: c-format.c:343 c-format.c:367 c-format.c:405
+msgid "the '#' printf flag"
+msgstr ""
+
+#: c-format.c:344 c-format.c:368 c-format.c:435
+msgid "'0' flag"
+msgstr ""
+
+#: c-format.c:344 c-format.c:368
+msgid "the '0' printf flag"
+msgstr ""
+
+#: c-format.c:345 c-format.c:369 c-format.c:434 c-format.c:464
+msgid "'-' flag"
+msgstr ""
+
+#: c-format.c:345 c-format.c:369
+msgid "the '-' printf flag"
+msgstr ""
+
+#: c-format.c:346 c-format.c:418
+msgid "''' flag"
+msgstr ""
+
+#: c-format.c:346
+msgid "the ''' printf flag"
+msgstr ""
+
+#: c-format.c:347 c-format.c:419
+msgid "'I' flag"
+msgstr ""
+
+#: c-format.c:347
+msgid "the 'I' printf flag"
+msgstr ""
+
+#: c-format.c:348 c-format.c:370 c-format.c:416 c-format.c:438 c-format.c:465
+#: c-format.c:1537 config/sol2-c.c:46
+msgid "field width"
+msgstr ""
+
+#: c-format.c:348 c-format.c:370 config/sol2-c.c:46
+msgid "field width in printf format"
+msgstr ""
+
+#: c-format.c:349 c-format.c:371 c-format.c:395 c-format.c:407
+msgid "precision"
+msgstr ""
+
+#: c-format.c:349 c-format.c:371 c-format.c:395 c-format.c:407
+msgid "precision in printf format"
+msgstr ""
+
+#: c-format.c:350 c-format.c:372 c-format.c:396 c-format.c:408 c-format.c:417
+#: c-format.c:468 config/sol2-c.c:47
+msgid "length modifier"
+msgstr ""
+
+#: c-format.c:350 c-format.c:372 c-format.c:396 c-format.c:408
+#: config/sol2-c.c:47
+msgid "length modifier in printf format"
+msgstr ""
+
+#: c-format.c:394 c-format.c:406
+msgid "'q' flag"
+msgstr ""
+
+#: c-format.c:394 c-format.c:406
+msgid "the 'q' diagnostic flag"
+msgstr ""
+
+#: c-format.c:414
+msgid "assignment suppression"
+msgstr ""
+
+#: c-format.c:414
+msgid "the assignment suppression scanf feature"
+msgstr ""
+
+#: c-format.c:415
+msgid "'a' flag"
+msgstr ""
+
+#: c-format.c:415
+msgid "the 'a' scanf flag"
+msgstr ""
+
+#: c-format.c:416
+msgid "field width in scanf format"
+msgstr ""
+
+#: c-format.c:417
+msgid "length modifier in scanf format"
+msgstr ""
+
+#: c-format.c:418
+msgid "the ''' scanf flag"
+msgstr ""
+
+#: c-format.c:419
+msgid "the 'I' scanf flag"
+msgstr ""
+
+#: c-format.c:433
+msgid "'_' flag"
+msgstr ""
+
+#: c-format.c:433
+msgid "the '_' strftime flag"
+msgstr ""
+
+#: c-format.c:434
+msgid "the '-' strftime flag"
+msgstr ""
+
+#: c-format.c:435
+msgid "the '0' strftime flag"
+msgstr ""
+
+#: c-format.c:436 c-format.c:460
+msgid "'^' flag"
+msgstr ""
+
+#: c-format.c:436
+msgid "the '^' strftime flag"
+msgstr ""
+
+#: c-format.c:437
+msgid "the '#' strftime flag"
+msgstr ""
+
+#: c-format.c:438
+msgid "field width in strftime format"
+msgstr ""
+
+#: c-format.c:439
+msgid "'E' modifier"
+msgstr ""
+
+#: c-format.c:439
+msgid "the 'E' strftime modifier"
+msgstr ""
+
+#: c-format.c:440
+msgid "'O' modifier"
+msgstr ""
+
+#: c-format.c:440
+msgid "the 'O' strftime modifier"
+msgstr ""
+
+#: c-format.c:441
+msgid "the 'O' modifier"
+msgstr ""
+
+#: c-format.c:459
+msgid "fill character"
+msgstr ""
+
+#: c-format.c:459
+msgid "fill character in strfmon format"
+msgstr ""
+
+#: c-format.c:460
+msgid "the '^' strfmon flag"
+msgstr ""
+
+#: c-format.c:461
+msgid "the '+' strfmon flag"
+msgstr ""
+
+#: c-format.c:462
+msgid "'(' flag"
+msgstr ""
+
+#: c-format.c:462
+msgid "the '(' strfmon flag"
+msgstr ""
+
+#: c-format.c:463
+msgid "'!' flag"
+msgstr ""
+
+#: c-format.c:463
+msgid "the '!' strfmon flag"
+msgstr ""
+
+#: c-format.c:464
+msgid "the '-' strfmon flag"
+msgstr ""
+
+#: c-format.c:465
+msgid "field width in strfmon format"
+msgstr ""
+
+#: c-format.c:466
+msgid "left precision"
+msgstr ""
+
+#: c-format.c:466
+msgid "left precision in strfmon format"
+msgstr ""
+
+#: c-format.c:467
+msgid "right precision"
+msgstr ""
+
+#: c-format.c:467
+msgid "right precision in strfmon format"
+msgstr ""
+
+#: c-format.c:468
+msgid "length modifier in strfmon format"
+msgstr ""
+
+#: c-format.c:1639
+msgid "field precision"
+msgstr ""
+
+#: c-incpath.c:70
#, c-format
-msgid "%qs attribute directive ignored"
+msgid "ignoring duplicate directory \"%s\"\n"
msgstr ""
-#: attribs.c:183
+#: c-incpath.c:73
#, c-format
-msgid "wrong number of arguments specified for %qs attribute"
+msgid " as it is a non-system directory that duplicates a system directory\n"
msgstr ""
-#: attribs.c:200
+#: c-incpath.c:77
#, c-format
-msgid "%qs attribute does not apply to types"
+msgid "ignoring nonexistent directory \"%s\"\n"
msgstr ""
-#: attribs.c:246
+#: c-incpath.c:286
#, c-format
-msgid "%qs attribute only applies to function types"
+msgid "#include \"...\" search starts here:\n"
msgstr ""
-#: bb-reorder.c:1882
+#: c-incpath.c:290
#, c-format
-msgid "Multiple hot/cold transitions found (bb %i)"
+msgid "#include <...> search starts here:\n"
msgstr ""
-#: bb-reorder.c:1895
-msgid "verify_hot_cold_block_grouping failed"
+#: c-incpath.c:295
+#, c-format
+msgid "End of search list.\n"
msgstr ""
-#: builtins.c:342
-msgid "offset outside bounds of constant string"
+#: c-opts.c:1314
+msgid "<built-in>"
msgstr ""
-#: builtins.c:929
-msgid "second argument to %<__builtin_prefetch%> must be a constant"
+#: c-opts.c:1330
+msgid "<command line>"
msgstr ""
-#: builtins.c:936
-msgid "invalid second argument to %<__builtin_prefetch%>; using zero"
+#: c-typeck.c:2092 c-typeck.c:4416 c-typeck.c:4418 c-typeck.c:4426
+#: c-typeck.c:4451 c-typeck.c:5825
+msgid "initializer element is not constant"
msgstr ""
-#: builtins.c:944
-msgid "third argument to %<__builtin_prefetch%> must be a constant"
+#: c-typeck.c:4226
+msgid "array initialized from parenthesized string constant"
msgstr ""
-#: builtins.c:951
-msgid "invalid third argument to %<__builtin_prefetch%>; using zero"
+#: c-typeck.c:4286 cp/typeck2.c:703
+#, gcc-internal-format
+msgid "char-array initialized from wide string"
msgstr ""
-#: builtins.c:3814
-msgid "argument of %<__builtin_args_info%> must be constant"
+#: c-typeck.c:4291
+msgid "wchar_t-array initialized from non-wide string"
msgstr ""
-#: builtins.c:3820
-msgid "argument of %<__builtin_args_info%> out of range"
+#: c-typeck.c:4309 cp/typeck2.c:725
+#, gcc-internal-format
+msgid "initializer-string for array of chars is too long"
msgstr ""
-#: builtins.c:3826
-msgid "missing argument in %<__builtin_args_info%>"
+#: c-typeck.c:4315
+msgid "array of inappropriate type initialized from string constant"
msgstr ""
-#: builtins.c:3922 gimplify.c:1765
-msgid "too few arguments to function %<va_start%>"
+#. ??? This should not be an error when inlining calls to
+#. unprototyped functions.
+#: c-typeck.c:4376 c-typeck.c:3879 cp/typeck.c:1381
+#, gcc-internal-format
+msgid "invalid use of non-lvalue array"
msgstr ""
-#: builtins.c:4085
-msgid "first argument to %<va_arg%> not of type %<va_list%>"
+#: c-typeck.c:4399
+msgid "array initialized from non-constant array expression"
msgstr ""
-#. Unfortunately, this is merely undefined, rather than a constraint
-#. violation, so we cannot make this an error. If this call is never
-#. executed, the program is still strictly conforming.
-#: builtins.c:4099
-msgid "%qT is promoted to %qT when passed through %<...%>"
+#: c-typeck.c:4458 c-typeck.c:5829
+#, gcc-internal-format
+msgid "initializer element is not computable at load time"
msgstr ""
-#: builtins.c:4104
-msgid "(so you should pass %qT not %qT to %<va_arg%>)"
+#. Although C99 is unclear about whether incomplete arrays
+#. of VLAs themselves count as VLAs, it does not make
+#. sense to permit them to be initialized given that
+#. ordinary VLAs may not be initialized.
+#: c-typeck.c:4469 c-decl.c:3144 c-decl.c:3159
+#, gcc-internal-format
+msgid "variable-sized object may not be initialized"
msgstr ""
-#. We can, however, treat "undefined" any way we please.
-#. Call abort to encourage the user to fix the program.
-#: builtins.c:4110 c-typeck.c:2039
-msgid "if this code is reached, the program will abort"
+#: c-typeck.c:4473 cp/typeck2.c:804
+#, gcc-internal-format
+msgid "invalid initializer"
msgstr ""
-#: builtins.c:4228
-msgid "invalid argument to %<__builtin_frame_address%>"
+#: c-typeck.c:4947
+msgid "extra brace group at end of initializer"
msgstr ""
-#: builtins.c:4230
-msgid "invalid argument to %<__builtin_return_address%>"
+#: c-typeck.c:4967 cp/decl.c:4371
+#, gcc-internal-format
+msgid "missing braces around initializer"
msgstr ""
-#: builtins.c:4243
-msgid "unsupported argument to %<__builtin_frame_address%>"
+#: c-typeck.c:5028
+msgid "braces around scalar initializer"
msgstr ""
-#: builtins.c:4245
-msgid "unsupported argument to %<__builtin_return_address%>"
+#: c-typeck.c:5085
+msgid "initialization of flexible array member in a nested context"
msgstr ""
-#: builtins.c:4348
-msgid "second argument to %<__builtin_expect%> must be a constant"
+#: c-typeck.c:5087
+msgid "initialization of a flexible array member"
msgstr ""
-#: builtins.c:5614
-msgid "%<__builtin_longjmp%> second argument must be 1"
+#: c-typeck.c:5114
+msgid "missing initializer"
msgstr ""
-#: builtins.c:5966
-msgid "target format does not support infinity"
+#: c-typeck.c:5136
+msgid "empty scalar initializer"
+msgstr ""
+
+#: c-typeck.c:5141
+msgid "extra elements in scalar initializer"
+msgstr ""
+
+#: c-typeck.c:5245 c-typeck.c:5305
+msgid "array index in non-array initializer"
+msgstr ""
+
+#: c-typeck.c:5250 c-typeck.c:5358
+msgid "field name not in record or union initializer"
+msgstr ""
+
+#: c-typeck.c:5296
+msgid "array index in initializer not of integer type"
+msgstr ""
+
+#: c-typeck.c:5301 c-typeck.c:5303
+msgid "nonconstant array index in initializer"
+msgstr ""
+
+#: c-typeck.c:5307 c-typeck.c:5310
+msgid "array index in initializer exceeds array bounds"
+msgstr ""
+
+#: c-typeck.c:5321
+msgid "empty index range in initializer"
+msgstr ""
+
+#: c-typeck.c:5330
+msgid "array index range in initializer exceeds array bounds"
+msgstr ""
+
+#: c-typeck.c:5405 c-typeck.c:5426 c-typeck.c:5892
+msgid "initialized field with side-effects overwritten"
+msgstr ""
+
+#: c-typeck.c:6101
+msgid "excess elements in char array initializer"
+msgstr ""
+
+#: c-typeck.c:6108 c-typeck.c:6154
+msgid "excess elements in struct initializer"
msgstr ""
-#: builtins.c:7764 builtins.c:7858
+#: c-typeck.c:6169
+msgid "non-static initialization of a flexible array member"
+msgstr ""
+
+#: c-typeck.c:6237
+msgid "excess elements in union initializer"
+msgstr ""
+
+#: c-typeck.c:6323
+msgid "excess elements in array initializer"
+msgstr ""
+
+#: c-typeck.c:6353
+msgid "excess elements in vector initializer"
+msgstr ""
+
+#: c-typeck.c:6377
+msgid "excess elements in scalar initializer"
+msgstr ""
+
+#: cfgrtl.c:2105
+msgid "flow control insn inside a basic block"
+msgstr ""
+
+#: cfgrtl.c:2183
+msgid "wrong insn in the fallthru edge"
+msgstr ""
+
+#: cfgrtl.c:2225
+msgid "insn outside basic block"
+msgstr ""
+
+#: cfgrtl.c:2232
+msgid "return not followed by barrier"
+msgstr ""
+
+#: cgraph.c:299
+msgid "function body not available"
+msgstr ""
+
+#: cgraph.c:301 cgraphunit.c:775
+msgid "redefined extern inline functions are not considered for inlining"
+msgstr ""
+
+#: cgraph.c:304 cgraphunit.c:780
+msgid "function not considered for inlining"
+msgstr ""
+
+#: cgraph.c:306 cgraphunit.c:778
+msgid "function not inlinable"
+msgstr ""
+
+#: collect2.c:393 gcc.c:6713
#, c-format
-msgid "too few arguments to function %qs"
+msgid "internal gcc abort in %s, at %s:%d"
msgstr ""
-#: builtins.c:7770 builtins.c:7864
+#: collect2.c:892
#, c-format
-msgid "too many arguments to function %qs"
+msgid "no arguments"
msgstr ""
-#: builtins.c:7776 builtins.c:7889
+#: collect2.c:1266 collect2.c:1414 collect2.c:1449
#, c-format
-msgid "non-floating-point argument to function %qs"
+msgid "fopen %s"
msgstr ""
-#: builtins.c:8974
-msgid "%<va_start%> used in function with fixed args"
+#: collect2.c:1269 collect2.c:1419 collect2.c:1452
+#, c-format
+msgid "fclose %s"
msgstr ""
-#. Evidently an out of date version of <stdarg.h>; can't validate
-#. va_start's second argument, but can still work as intended.
-#: builtins.c:8981
-msgid "%<__builtin_next_arg%> called without an argument"
+#: collect2.c:1278
+#, c-format
+msgid "collect2 version %s"
msgstr ""
-#: builtins.c:8996
-msgid "%<va_start%> used with too many arguments"
+#: collect2.c:1368
+#, c-format
+msgid "%d constructor(s) found\n"
msgstr ""
-#. FIXME: Sometimes with the tree optimizers we can get the
-#. not the last argument even though the user used the last
-#. argument. We just warn and set the arg to be the last
-#. argument so that we will get wrong-code because of
-#. it.
-#: builtins.c:9016
-msgid "second parameter of %<va_start%> not last named argument"
+#: collect2.c:1369
+#, c-format
+msgid "%d destructor(s) found\n"
msgstr ""
-#: c-common.c:834
-msgid "%qD is not defined outside of function scope"
+#: collect2.c:1370
+#, c-format
+msgid "%d frame table(s) found\n"
msgstr ""
-#: c-common.c:855
+#: collect2.c:1507
#, c-format
-msgid ""
-"string length %qd is greater than the length %qd ISO C%d compilers are "
-"required to support"
+msgid "can't get program status"
msgstr ""
-#: c-common.c:896
-msgid "overflow in constant expression"
+#: collect2.c:1557
+#, c-format
+msgid "[cannot find %s]"
msgstr ""
-#: c-common.c:916
-msgid "integer overflow in expression"
+#: collect2.c:1572
+#, c-format
+msgid "cannot find '%s'"
msgstr ""
-#: c-common.c:925
-msgid "floating point overflow in expression"
+#: collect2.c:1576 collect2.c:2065 collect2.c:2220 gcc.c:2790
+#, c-format
+msgid "pex_init failed"
msgstr ""
-#: c-common.c:931
-msgid "vector overflow in expression"
+#: collect2.c:1611
+#, c-format
+msgid "[Leaving %s]\n"
msgstr ""
-#. This detects cases like converting -129 or 256 to unsigned char.
-#: c-common.c:953
-msgid "large integer implicitly truncated to unsigned type"
+#: collect2.c:1831
+#, c-format
+msgid ""
+"\n"
+"write_c_file - output name is %s, prefix is %s\n"
msgstr ""
-#: c-common.c:955
-msgid "negative integer implicitly converted to unsigned type"
+#: collect2.c:2039
+#, c-format
+msgid "cannot find 'nm'"
msgstr ""
-#: c-common.c:1013
-msgid "overflow in implicit constant conversion"
+#: collect2.c:2086
+#, c-format
+msgid "can't open nm output"
msgstr ""
-#: c-common.c:1149
+#: collect2.c:2130
#, c-format
-msgid "operation on %qE may be undefined"
+msgid "init function found in object %s"
msgstr ""
-#: c-common.c:1435
-msgid "case label does not reduce to an integer constant"
+#: collect2.c:2138
+#, c-format
+msgid "fini function found in object %s"
msgstr ""
-#: c-common.c:1475
-msgid "case label value is less than minimum value for type"
+#: collect2.c:2241
+#, c-format
+msgid "can't open ldd output"
msgstr ""
-#: c-common.c:1483
-msgid "case label value exceeds maximum value for type"
+#: collect2.c:2244
+#, c-format
+msgid ""
+"\n"
+"ldd output with constructors/destructors.\n"
msgstr ""
-#: c-common.c:1491
-msgid "lower value in case label range less than minimum value for type"
+#: collect2.c:2259
+#, c-format
+msgid "dynamic dependency %s not found"
msgstr ""
-#: c-common.c:1500
-msgid "upper value in case label range exceeds maximum value for type"
+#: collect2.c:2271
+#, c-format
+msgid "unable to open dynamic dependency '%s'"
msgstr ""
-#: c-common.c:1840
-msgid "invalid truth-value expression"
+#: collect2.c:2427
+#, c-format
+msgid "%s: not a COFF file"
msgstr ""
-#: c-common.c:1888
+#: collect2.c:2547
#, c-format
-msgid "invalid operands to binary %s"
+msgid "%s: cannot open as COFF file"
msgstr ""
-#: c-common.c:2123
-msgid "comparison is always false due to limited range of data type"
+#: collect2.c:2605
+#, c-format
+msgid "library lib%s not found"
msgstr ""
-#: c-common.c:2125
-msgid "comparison is always true due to limited range of data type"
+#: combine.c:12501
+#, c-format
+msgid ""
+";; Combiner statistics: %d attempts, %d substitutions (%d requiring new "
+"space),\n"
+";; %d successes.\n"
+"\n"
msgstr ""
-#: c-common.c:2195
-msgid "comparison of unsigned expression >= 0 is always true"
+#: combine.c:12510
+#, c-format
+msgid ""
+"\n"
+";; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n"
+";; %d successes.\n"
msgstr ""
-#: c-common.c:2204
-msgid "comparison of unsigned expression < 0 is always false"
+#: cppspec.c:106
+#, c-format
+msgid "\"%s\" is not a valid option to the preprocessor"
msgstr ""
-#: c-common.c:2246
-msgid "pointer of type %<void *%> used in arithmetic"
+#: cppspec.c:128
+#, c-format
+msgid "too many input files"
msgstr ""
-#: c-common.c:2252
-msgid "pointer to a function used in arithmetic"
+#: cse.c:6802
+#, c-format
+msgid ";; Processing block from %d to %d, %d sets.\n"
msgstr ""
-#: c-common.c:2258
-msgid "pointer to member function used in arithmetic"
+#: diagnostic.c:174
+#, c-format
+msgid "%s:%d: confused by earlier errors, bailing out\n"
msgstr ""
-#. Common Ada/Pascal programmer's mistake. We always warn
-#. about this since it is so bad.
-#: c-common.c:2384
-msgid "the address of %qD, will always evaluate as %<true%>"
+#: diagnostic.c:234
+#, c-format
+msgid "compilation terminated due to -Wfatal-errors.\n"
msgstr ""
-#: c-common.c:2480
-msgid "suggest parentheses around assignment used as truth value"
+#: diagnostic.c:243
+#, c-format
+msgid ""
+"Please submit a full bug report,\n"
+"with preprocessed source if appropriate.\n"
+"See %s for instructions.\n"
msgstr ""
-#: c-common.c:2548 c-common.c:2588
-msgid "invalid use of %<restrict%>"
+#: diagnostic.c:252
+#, c-format
+msgid "compilation terminated.\n"
msgstr ""
-#: c-common.c:2804
-msgid "invalid application of %<sizeof%> to a function type"
+#: diagnostic.c:569
+#, c-format
+msgid "Internal compiler error: Error reporting routines re-entered.\n"
msgstr ""
-#: c-common.c:2814
+#: final.c:1062
+msgid "negative insn length"
+msgstr ""
+
+#: final.c:2419
+msgid "could not split insn"
+msgstr ""
+
+#: final.c:2765
+msgid "invalid 'asm': "
+msgstr ""
+
+#: final.c:2948
#, c-format
-msgid "invalid application of %qs to a void type"
+msgid "nested assembly dialect alternatives"
msgstr ""
-#: c-common.c:2820
-msgid "invalid application of %qs to incomplete type %qT "
+#: final.c:2965 final.c:2977
+#, c-format
+msgid "unterminated assembly dialect alternative"
msgstr ""
-#: c-common.c:2861
-msgid "%<__alignof%> applied to a bit-field"
+#: final.c:3024
+#, c-format
+msgid "operand number missing after %%-letter"
msgstr ""
-#: c-common.c:3328
+#: final.c:3027 final.c:3068
#, c-format
-msgid "cannot disable built-in function %qs"
+msgid "operand number out of range"
msgstr ""
-#: c-common.c:3519
-msgid "pointers are not permitted as case values"
+#: final.c:3087
+#, c-format
+msgid "invalid %%-code"
msgstr ""
-#: c-common.c:3525
-msgid "range expressions in switch statements are non-standard"
+#: final.c:3117
+#, c-format
+msgid "'%%l' operand isn't a label"
msgstr ""
-#: c-common.c:3550
-msgid "empty range specified"
+#. We can't handle floating point constants;
+#. PRINT_OPERAND must handle them.
+#. We can't handle floating point constants; PRINT_OPERAND must
+#. handle them.
+#. We can't handle floating point constants;
+#. PRINT_OPERAND must handle them.
+#: final.c:3218 vmsdbgout.c:487 config/i386/i386.c:6031
+#: config/pdp11/pdp11.c:1700
+#, c-format
+msgid "floating constant misused"
msgstr ""
-#: c-common.c:3609
-msgid "duplicate (or overlapping) case value"
+#: final.c:3274 vmsdbgout.c:544 config/i386/i386.c:6107
+#: config/pdp11/pdp11.c:1747
+#, c-format
+msgid "invalid expression as operand"
msgstr ""
-#: c-common.c:3610
-msgid "%Jthis is the first entry overlapping that value"
+#: flow.c:1692
+msgid "Attempt to delete prologue/epilogue insn:"
msgstr ""
-#: c-common.c:3614
-msgid "duplicate case value"
+#: gcc.c:1628
+#, c-format
+msgid "Using built-in specs.\n"
msgstr ""
-#: c-common.c:3615
-msgid "%Jpreviously used here"
+#: gcc.c:1811
+#, c-format
+msgid ""
+"Setting spec %s to '%s'\n"
+"\n"
msgstr ""
-#: c-common.c:3619
-msgid "multiple default labels in one switch"
+#: gcc.c:1920
+#, c-format
+msgid "Reading specs from %s\n"
msgstr ""
-#: c-common.c:3620
-msgid "%Jthis is the first default label"
+#: gcc.c:2016 gcc.c:2035
+#, c-format
+msgid "specs %%include syntax malformed after %ld characters"
msgstr ""
-#: c-common.c:3669
-msgid "%Jcase value %qs not in enumerated type"
+#: gcc.c:2043
+#, c-format
+msgid "could not find specs file %s\n"
msgstr ""
-#: c-common.c:3672
-msgid "%Jcase value %qs not in enumerated type %qT"
+#: gcc.c:2060 gcc.c:2068 gcc.c:2077 gcc.c:2086
+#, c-format
+msgid "specs %%rename syntax malformed after %ld characters"
msgstr ""
-#: c-common.c:3724
-msgid "%Hswitch missing default case"
+#: gcc.c:2095
+#, c-format
+msgid "specs %s spec was not found to be renamed"
msgstr ""
-#. Warn if there are enumerators that don't correspond to
-#. case expressions.
-#: c-common.c:3758
-msgid "%Henumeration value %qE not handled in switch"
+#: gcc.c:2102
+#, c-format
+msgid "%s: attempt to rename spec '%s' to already defined spec '%s'"
msgstr ""
-#: c-common.c:3824
-msgid "taking the address of a label is non-standard"
+#: gcc.c:2107
+#, c-format
+msgid "rename spec %s to %s\n"
msgstr ""
-#: c-common.c:3993 c-common.c:4012 c-common.c:4030 c-common.c:4057
-#: c-common.c:4076 c-common.c:4099 c-common.c:4123 c-common.c:4149
-#: c-common.c:4183 c-common.c:4227 c-common.c:4255 c-common.c:4283
-#: c-common.c:4302 c-common.c:4627 c-common.c:4657 c-common.c:4749
-#: c-common.c:4816 c-common.c:4834 c-common.c:4880 c-common.c:4950
-#: c-common.c:4974 c-common.c:5245 c-common.c:5268 c-common.c:5307
+#: gcc.c:2109
#, c-format
-msgid "%qE attribute ignored"
+msgid ""
+"spec is '%s'\n"
+"\n"
msgstr ""
-#: c-common.c:4340
+#: gcc.c:2122
#, c-format
-msgid "unknown machine mode %qs"
+msgid "specs unknown %% command after %ld characters"
msgstr ""
-#: c-common.c:4360
-msgid "specifying vector types with __attribute__ ((mode)) is deprecated"
+#: gcc.c:2133 gcc.c:2146
+#, c-format
+msgid "specs file malformed after %ld characters"
msgstr ""
-#: c-common.c:4362
-msgid "use __attribute__ ((vector_size)) instead"
+#: gcc.c:2199
+#, c-format
+msgid "spec file has no spec for linking"
msgstr ""
-#: c-common.c:4371
+#: gcc.c:2621
#, c-format
-msgid "unable to emulate %qs"
+msgid "system path '%s' is not absolute"
msgstr ""
-#: c-common.c:4381
+#: gcc.c:2684
#, c-format
-msgid "invalid pointer mode %qs"
+msgid "-pipe not supported"
msgstr ""
-#: c-common.c:4396
+#: gcc.c:2746
#, c-format
-msgid "no data type for mode %qs"
+msgid ""
+"\n"
+"Go ahead? (y or n) "
msgstr ""
-#: c-common.c:4406
+#: gcc.c:2829
+msgid "failed to get exit status"
+msgstr ""
+
+#: gcc.c:2835
+msgid "failed to get process times"
+msgstr ""
+
+#: gcc.c:2858
#, c-format
-msgid "cannot use mode %qs for enumeral types"
+msgid ""
+"Internal error: %s (program %s)\n"
+"Please submit a full bug report.\n"
+"See %s for instructions."
msgstr ""
-#: c-common.c:4430
+#: gcc.c:2886
#, c-format
-msgid "mode %qs applied to inappropriate type"
+msgid "# %s %.2f %.2f\n"
msgstr ""
-#: c-common.c:4461
-msgid "%Jsection attribute cannot be specified for local variables"
+#: gcc.c:3015
+#, c-format
+msgid "Usage: %s [options] file...\n"
msgstr ""
-#: c-common.c:4472
-msgid "%Jsection of %qD conflicts with previous declaration"
+#: gcc.c:3016
+msgid "Options:\n"
msgstr ""
-#: c-common.c:4481
-msgid "%Jsection attribute not allowed for %qD"
+#: gcc.c:3018
+msgid " -pass-exit-codes Exit with highest error code from a phase\n"
msgstr ""
-#: c-common.c:4487
-msgid "%Jsection attributes are not supported for this target"
+#: gcc.c:3019
+msgid " --help Display this information\n"
msgstr ""
-#: c-common.c:4519
-msgid "requested alignment is not a constant"
+#: gcc.c:3020
+msgid ""
+" --target-help Display target specific command line options\n"
msgstr ""
-#: c-common.c:4524
-msgid "requested alignment is not a power of 2"
+#: gcc.c:3022
+msgid " (Use '-v --help' to display command line options of sub-processes)\n"
msgstr ""
-#: c-common.c:4529
-msgid "requested alignment is too large"
+#: gcc.c:3023
+msgid " -dumpspecs Display all of the built in spec strings\n"
msgstr ""
-#: c-common.c:4555
-msgid "%Jalignment may not be specified for %qD"
+#: gcc.c:3024
+msgid " -dumpversion Display the version of the compiler\n"
msgstr ""
-#: c-common.c:4593
-msgid "%J%qD defined both normally and as an alias"
+#: gcc.c:3025
+msgid " -dumpmachine Display the compiler's target processor\n"
msgstr ""
-#: c-common.c:4609
-msgid "alias argument not a string"
+#: gcc.c:3026
+msgid ""
+" -print-search-dirs Display the directories in the compiler's search "
+"path\n"
+msgstr ""
+
+#: gcc.c:3027
+msgid ""
+" -print-libgcc-file-name Display the name of the compiler's companion "
+"library\n"
+msgstr ""
+
+#: gcc.c:3028
+msgid " -print-file-name=<lib> Display the full path to library <lib>\n"
+msgstr ""
+
+#: gcc.c:3029
+msgid ""
+" -print-prog-name=<prog> Display the full path to compiler component "
+"<prog>\n"
+msgstr ""
+
+#: gcc.c:3030
+msgid ""
+" -print-multi-directory Display the root directory for versions of "
+"libgcc\n"
+msgstr ""
+
+#: gcc.c:3031
+msgid ""
+" -print-multi-lib Display the mapping between command line options "
+"and\n"
+" multiple library search directories\n"
+msgstr ""
+
+#: gcc.c:3034
+msgid " -print-multi-os-directory Display the relative path to OS libraries\n"
+msgstr ""
+
+#: gcc.c:3035
+msgid ""
+" -Wa,<options> Pass comma-separated <options> on to the "
+"assembler\n"
+msgstr ""
+
+#: gcc.c:3036
+msgid ""
+" -Wp,<options> Pass comma-separated <options> on to the "
+"preprocessor\n"
+msgstr ""
+
+#: gcc.c:3037
+msgid ""
+" -Wl,<options> Pass comma-separated <options> on to the linker\n"
+msgstr ""
+
+#: gcc.c:3038
+msgid " -Xassembler <arg> Pass <arg> on to the assembler\n"
+msgstr ""
+
+#: gcc.c:3039
+msgid " -Xpreprocessor <arg> Pass <arg> on to the preprocessor\n"
+msgstr ""
+
+#: gcc.c:3040
+msgid " -Xlinker <arg> Pass <arg> on to the linker\n"
msgstr ""
-#: c-common.c:4651
+#: gcc.c:3041
+msgid ""
+" -combine Pass multiple source files to compiler at once\n"
+msgstr ""
+
+#: gcc.c:3042
+msgid " -save-temps Do not delete intermediate files\n"
+msgstr ""
+
+#: gcc.c:3043
+msgid " -pipe Use pipes rather than intermediate files\n"
+msgstr ""
+
+#: gcc.c:3044
+msgid " -time Time the execution of each subprocess\n"
+msgstr ""
+
+#: gcc.c:3045
+msgid ""
+" -specs=<file> Override built-in specs with the contents of "
+"<file>\n"
+msgstr ""
+
+#: gcc.c:3046
+msgid ""
+" -std=<standard> Assume that the input sources are for <standard>\n"
+msgstr ""
+
+#: gcc.c:3047
+msgid ""
+" -B <directory> Add <directory> to the compiler's search paths\n"
+msgstr ""
+
+#: gcc.c:3048
+msgid " -b <machine> Run gcc for target <machine>, if installed\n"
+msgstr ""
+
+#: gcc.c:3049
+msgid ""
+" -V <version> Run gcc version number <version>, if installed\n"
+msgstr ""
+
+#: gcc.c:3050
+msgid ""
+" -v Display the programs invoked by the compiler\n"
+msgstr ""
+
+#: gcc.c:3051
+msgid ""
+" -### Like -v but options quoted and commands not "
+"executed\n"
+msgstr ""
+
+#: gcc.c:3052
+msgid ""
+" -E Preprocess only; do not compile, assemble or "
+"link\n"
+msgstr ""
+
+#: gcc.c:3053
+msgid " -S Compile only; do not assemble or link\n"
+msgstr ""
+
+#: gcc.c:3054
+msgid " -c Compile and assemble, but do not link\n"
+msgstr ""
+
+#: gcc.c:3055
+msgid " -o <file> Place the output into <file>\n"
+msgstr ""
+
+#: gcc.c:3056
+msgid ""
+" -x <language> Specify the language of the following input "
+"files\n"
+" Permissible languages include: c c++ assembler "
+"none\n"
+" 'none' means revert to the default behavior of\n"
+" guessing the language based on the file's "
+"extension\n"
+msgstr ""
+
+#: gcc.c:3063
#, c-format
-msgid "%qE attribute ignored on non-class types"
+msgid ""
+"\n"
+"Options starting with -g, -f, -m, -O, -W, or --param are automatically\n"
+" passed on to the various sub-processes invoked by %s. In order to pass\n"
+" other options on to these processes the -W<letter> options must be used.\n"
msgstr ""
-#: c-common.c:4663
-msgid "visibility argument not a string"
+#: gcc.c:3183
+#, c-format
+msgid "'-%c' option must have argument"
msgstr ""
-#: c-common.c:4675
+#: gcc.c:3205
#, c-format
-msgid "%qE attribute ignored on types"
+msgid "couldn't run '%s': %s"
msgstr ""
-#: c-common.c:4690
-msgid ""
-"visibility argument must be one of \"default\", \"hidden\", \"protected\" or "
-"\"internal\""
+#. translate_options () has turned --version into -fversion.
+#: gcc.c:3390
+#, c-format
+msgid "%s (GCC) %s\n"
msgstr ""
-#: c-common.c:4759
-msgid "tls_model argument not a string"
+#: gcc.c:3392 gcov.c:415 java/gjavah.c:2400 java/jcf-dump.c:931
+#: java/jv-scan.c:129
+msgid "(C)"
msgstr ""
-#: c-common.c:4768
+#: gcc.c:3393 java/gjavah.c:2401 java/jcf-dump.c:932 java/jv-scan.c:130
+#, c-format
msgid ""
-"tls_model argument must be one of \"local-exec\", \"initial-exec\", \"local-"
-"dynamic\" or \"global-dynamic\""
+"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"
msgstr ""
-#: c-common.c:4790 c-common.c:4854
-msgid "%J%qE attribute applies only to functions"
+#: gcc.c:3494
+#, c-format
+msgid "argument to '-Xlinker' is missing"
msgstr ""
-#: c-common.c:4795 c-common.c:4859
-msgid "%Jcan%'t set %qE attribute after definition"
+#: gcc.c:3502
+#, c-format
+msgid "argument to '-Xpreprocessor' is missing"
msgstr ""
-#: c-common.c:4948
+#: gcc.c:3509
#, c-format
-msgid "%qE attribute ignored for %qE"
+msgid "argument to '-Xassembler' is missing"
msgstr ""
-#: c-common.c:5003
+#: gcc.c:3516
#, c-format
-msgid "invalid vector type for attribute %qE"
+msgid "argument to '-l' is missing"
msgstr ""
-#: c-common.c:5011
-msgid "number of components of the vector not a power of two"
+#: gcc.c:3537
+#, c-format
+msgid "argument to '-specs' is missing"
msgstr ""
-#: c-common.c:5039
-msgid "nonnull attribute without arguments on a non-prototype"
+#: gcc.c:3551
+#, c-format
+msgid "argument to '-specs=' is missing"
msgstr ""
-#: c-common.c:5054
+#: gcc.c:3588
#, c-format
-msgid "nonnull argument has invalid operand number (argument %lu)"
+msgid "'-%c' must come at the start of the command line"
msgstr ""
-#: c-common.c:5073
+#: gcc.c:3597
#, c-format
-msgid ""
-"nonnull argument with out-of-range operand number (argument %lu, operand %lu)"
+msgid "argument to '-B' is missing"
msgstr ""
-#: c-common.c:5081
+#: gcc.c:3977
#, c-format
-msgid ""
-"nonnull argument references non-pointer operand (argument %lu, operand %lu)"
+msgid "argument to '-x' is missing"
msgstr ""
-#: c-common.c:5136 c-common.c:5172
-msgid "missing sentinel in function call"
+#: gcc.c:4005
+#, c-format
+msgid "argument to '-%s' is missing"
msgstr ""
-#: c-common.c:5158
-msgid "not enough arguments to fit a sentinel"
+#: gcc.c:4343
+#, c-format
+msgid "switch '%s' does not start with '-'"
msgstr ""
-#: c-common.c:5214
+#: gcc.c:4573
#, c-format
-msgid "null argument where non-null required (argument %lu)"
+msgid "spec '%s' invalid"
msgstr ""
-#: c-common.c:5279
-msgid "cleanup argument not an identifier"
+#: gcc.c:4639
+#, c-format
+msgid "%s\n"
msgstr ""
-#: c-common.c:5286
-msgid "cleanup argument not a function"
+#: gcc.c:4712
+#, c-format
+msgid "spec '%s' has invalid '%%0%c'"
msgstr ""
-#: c-common.c:5324
+#: gcc.c:4909
#, c-format
-msgid "%qE attribute requires prototypes with named arguments"
+msgid "spec '%s' has invalid '%%W%c"
msgstr ""
-#: c-common.c:5334
+#: gcc.c:4940
#, c-format
-msgid "%qE attribute only applies to variadic functions"
+msgid "spec '%s' has invalid '%%x%c'"
msgstr ""
-#: c-common.c:5345
-msgid "requested position is not an integer constant"
+#: gcc.c:5162
+#, c-format
+msgid "Processing spec %c%s%c, which is '%s'\n"
msgstr ""
-#: c-common.c:5352
-msgid "requested position is less than zero"
+#: gcc.c:5304
+#, c-format
+msgid "unknown spec function '%s'"
msgstr ""
-#: c-common.c:5654
-msgid ""
-"%Hignoring return value of %qD, declared with attribute warn_unused_result"
+#: gcc.c:5323
+#, c-format
+msgid "error in args to spec function '%s'"
+msgstr ""
+
+#: gcc.c:5371
+#, c-format
+msgid "malformed spec function name"
+msgstr ""
+
+#. )
+#: gcc.c:5374
+#, c-format
+msgid "no arguments for spec function"
msgstr ""
-#: c-common.c:5658
+#: gcc.c:5393
+#, c-format
+msgid "malformed spec function arguments"
+msgstr ""
+
+#: gcc.c:5632
+#, c-format
+msgid "braced spec '%s' is invalid at '%c'"
+msgstr ""
+
+#: gcc.c:5720
+#, c-format
+msgid "braced spec body '%s' is invalid"
+msgstr ""
+
+#: gcc.c:6267
+#, c-format
+msgid "install: %s%s\n"
+msgstr ""
+
+#: gcc.c:6268
+#, c-format
+msgid "programs: %s\n"
+msgstr ""
+
+#: gcc.c:6269
+#, c-format
+msgid "libraries: %s\n"
+msgstr ""
+
+#: gcc.c:6326
+#, c-format
msgid ""
-"%Hignoring return value of function declared with attribute "
-"warn_unused_result"
+"\n"
+"For bug reporting instructions, please see:\n"
msgstr ""
-#: c-common.c:5718 cp/typeck.c:4102
-msgid "attempt to take address of bit-field structure member %qD"
+#: gcc.c:6342
+#, c-format
+msgid "Target: %s\n"
msgstr ""
-#: c-common.c:5765
-msgid "invalid lvalue in assignment"
+#: gcc.c:6343
+#, c-format
+msgid "Configured with: %s\n"
msgstr ""
-#: c-common.c:5768
-msgid "invalid lvalue in increment"
+#: gcc.c:6357
+#, c-format
+msgid "Thread model: %s\n"
msgstr ""
-#: c-common.c:5771
-msgid "invalid lvalue in decrement"
+#: gcc.c:6368
+#, c-format
+msgid "gcc version %s\n"
msgstr ""
-#: c-common.c:5774
-msgid "invalid lvalue in unary %<&%>"
+#: gcc.c:6370
+#, c-format
+msgid "gcc driver version %s executing gcc version %s\n"
msgstr ""
-#: c-common.c:5777
-msgid "invalid lvalue in asm statement"
+#: gcc.c:6378
+#, c-format
+msgid "no input files"
msgstr ""
-#. Except for passing an argument to an unprototyped function,
-#. this is a constraint violation. When passing an argument to
-#. an unprototyped function, it is compile-time undefined;
-#. making it a constraint in that case was rejected in
-#. DR#252.
-#: c-convert.c:84 c-typeck.c:1446 c-typeck.c:3548 cp/typeck.c:1351
-#: cp/typeck.c:5813 fortran/convert.c:89 treelang/tree-convert.c:79
-msgid "void value not ignored as it ought to be"
+#: gcc.c:6458
+#, c-format
+msgid "spec '%s' is invalid"
msgstr ""
-#: c-convert.c:122 fortran/convert.c:122 java/typeck.c:153
-#: treelang/tree-convert.c:105
-msgid "conversion to non-scalar type requested"
+#: gcc.c:6913
+#, c-format
+msgid "multilib spec '%s' is invalid"
msgstr ""
-#: c-decl.c:530
-msgid "%Jarray %qD assumed to have one element"
+#: gcc.c:7105
+#, c-format
+msgid "multilib exclusions '%s' is invalid"
msgstr ""
-#: c-decl.c:643
+#: gcc.c:7163 gcc.c:7304
#, c-format
-msgid "GCC supports only %u nested scopes"
+msgid "multilib select '%s' is invalid"
msgstr ""
-#: c-decl.c:727
-msgid "%Jlabel %qD used but not defined"
+#: gcc.c:7342
+#, c-format
+msgid "multilib exclusion '%s' is invalid"
msgstr ""
-#: c-decl.c:733
-msgid "%Jlabel %qD defined but not used"
+#: gcov.c:388
+#, c-format
+msgid ""
+"Usage: gcov [OPTION]... SOURCEFILE\n"
+"\n"
msgstr ""
-#: c-decl.c:735
-msgid "%Jlabel %qD declared but not defined"
+#: gcov.c:389
+#, c-format
+msgid ""
+"Print code coverage information.\n"
+"\n"
msgstr ""
-#: c-decl.c:770
-msgid "%Jnested function %qD declared but never defined"
+#: gcov.c:390
+#, c-format
+msgid " -h, --help Print this help, then exit\n"
msgstr ""
-#: c-decl.c:784 cp/decl.c:568
-msgid "%Junused variable %qD"
+#: gcov.c:391
+#, c-format
+msgid " -v, --version Print version number, then exit\n"
msgstr ""
-#: c-decl.c:788
-msgid "%Jtype of array %qD completed incompatibly with implicit initialization"
+#: gcov.c:392
+#, c-format
+msgid ""
+" -a, --all-blocks Show information for every basic block\n"
msgstr ""
-#: c-decl.c:1022
+#: gcov.c:393
+#, c-format
msgid ""
-"a parameter list with an ellipsis can%'t match an empty parameter name list "
-"declaration"
+" -b, --branch-probabilities Include branch probabilities in output\n"
msgstr ""
-#: c-decl.c:1029
+#: gcov.c:394
+#, c-format
msgid ""
-"an argument type that has a default promotion can%'t match an empty "
-"parameter name list declaration"
+" -c, --branch-counts Given counts of branches taken\n"
+" rather than percentages\n"
msgstr ""
-#: c-decl.c:1064
+#: gcov.c:396
+#, c-format
+msgid " -n, --no-output Do not create an output file\n"
+msgstr ""
+
+#: gcov.c:397
+#, c-format
msgid ""
-"%Jprototype for %qD declares more arguments than previous old-style "
-"definition"
+" -l, --long-file-names Use long output file names for included\n"
+" source files\n"
msgstr ""
-#: c-decl.c:1070
+#: gcov.c:399
+#, c-format
+msgid " -f, --function-summaries Output summaries for each function\n"
+msgstr ""
+
+#: gcov.c:400
+#, c-format
msgid ""
-"%Jprototype for %qD declares fewer arguments than previous old-style "
-"definition"
+" -o, --object-directory DIR|FILE Search for object files in DIR or called "
+"FILE\n"
msgstr ""
-#: c-decl.c:1079
-msgid "%Jprototype for %qD declares argument %d with incompatible type"
+#: gcov.c:401
+#, c-format
+msgid " -p, --preserve-paths Preserve all pathname components\n"
msgstr ""
-#. If we get here, no errors were found, but do issue a warning
-#. for this poor-style construct.
-#: c-decl.c:1092
-msgid "%Jprototype for %qD follows non-prototype definition"
+#: gcov.c:402
+#, c-format
+msgid ""
+" -u, --unconditional-branches Show unconditional branch counts too\n"
msgstr ""
-#: c-decl.c:1107
-msgid "%Jprevious definition of %qD was here"
+#: gcov.c:403
+#, c-format
+msgid ""
+"\n"
+"For bug reporting instructions, please see:\n"
+"%s.\n"
msgstr ""
-#: c-decl.c:1109
-msgid "%Jprevious implicit declaration of %qD was here"
+#: gcov.c:413
+#, c-format
+msgid "gcov (GCC) %s\n"
msgstr ""
-#: c-decl.c:1111
-msgid "%Jprevious declaration of %qD was here"
+#: gcov.c:417
+#, c-format
+msgid ""
+"This is free software; see the source for copying conditions.\n"
+"There is NO warranty; not even for MERCHANTABILITY or \n"
+"FITNESS FOR A PARTICULAR PURPOSE.\n"
+"\n"
msgstr ""
-#: c-decl.c:1148
-msgid "%J%qD redeclared as different kind of symbol"
+#: gcov.c:507
+#, c-format
+msgid "%s:no functions found\n"
msgstr ""
-#: c-decl.c:1153
-msgid "%Jbuilt-in function %qD declared as non-function"
+#: gcov.c:528 gcov.c:556
+#, c-format
+msgid "\n"
msgstr ""
-#: c-decl.c:1156 c-decl.c:1272 c-decl.c:1879
-msgid "%Jdeclaration of %qD shadows a built-in function"
+#: gcov.c:543
+#, c-format
+msgid "%s:creating '%s'\n"
msgstr ""
-#: c-decl.c:1165
-msgid "%Jredeclaration of enumerator %qD"
+#: gcov.c:547
+#, c-format
+msgid "%s:error writing output file '%s'\n"
msgstr ""
-#. If types don't match for a built-in, throw away the
-#. built-in. No point in calling locate_old_decl here, it
-#. won't print anything.
-#: c-decl.c:1186
-msgid "%Jconflicting types for built-in function %qD"
+#: gcov.c:552
+#, c-format
+msgid "%s:could not open output file '%s'\n"
msgstr ""
-#: c-decl.c:1210 c-decl.c:1223 c-decl.c:1233
-msgid "%Jconflicting types for %qD"
+#: gcov.c:703
+#, c-format
+msgid "%s:cannot open graph file\n"
msgstr ""
-#: c-decl.c:1231
-msgid "%J conflicting type qualifiers for %qD"
+#: gcov.c:709
+#, c-format
+msgid "%s:not a gcov graph file\n"
msgstr ""
-#. Allow OLDDECL to continue in use.
-#: c-decl.c:1248
-msgid "%Jredefinition of typedef %qD"
+#: gcov.c:722
+#, c-format
+msgid "%s:version '%.4s', prefer '%.4s'\n"
msgstr ""
-#: c-decl.c:1290 c-decl.c:1300 c-decl.c:1313 c-decl.c:1395
-msgid "%Jredefinition of %qD"
+#: gcov.c:774
+#, c-format
+msgid "%s:already seen blocks for '%s'\n"
msgstr ""
-#: c-decl.c:1352 c-decl.c:1433
-msgid "%Jstatic declaration of %qD follows non-static declaration"
+#: gcov.c:892 gcov.c:1048
+#, c-format
+msgid "%s:corrupted\n"
msgstr ""
-#: c-decl.c:1362 c-decl.c:1369 c-decl.c:1422 c-decl.c:1430
-msgid "%Jnon-static declaration of %qD follows static declaration"
+#: gcov.c:966
+#, c-format
+msgid "%s:cannot open data file\n"
msgstr ""
-#: c-decl.c:1382
-msgid "%Jthread-local declaration of %qD follows non-thread-local declaration"
+#: gcov.c:971
+#, c-format
+msgid "%s:not a gcov data file\n"
msgstr ""
-#: c-decl.c:1385
-msgid "%Jnon-thread-local declaration of %qD follows thread-local declaration"
+#: gcov.c:984
+#, c-format
+msgid "%s:version '%.4s', prefer version '%.4s'\n"
msgstr ""
-#: c-decl.c:1415
-msgid "%Jextern declaration of %qD follows declaration with no linkage"
+#: gcov.c:990
+#, c-format
+msgid "%s:stamp mismatch with graph file\n"
msgstr ""
-#: c-decl.c:1451
-msgid "%Jdeclaration of %qD with no linkage follows extern declaration"
+#: gcov.c:1016
+#, c-format
+msgid "%s:unknown function '%u'\n"
msgstr ""
-#: c-decl.c:1457
-msgid "%Jredeclaration of %qD with no linkage"
+#: gcov.c:1029
+#, c-format
+msgid "%s:profile mismatch for '%s'\n"
msgstr ""
-#: c-decl.c:1471
-msgid ""
-"%Jredeclaration of %qD with different visibility (old visibility preserved)"
+#: gcov.c:1048
+#, c-format
+msgid "%s:overflowed\n"
msgstr ""
-#: c-decl.c:1482
-msgid "%Jinline declaration of %qD follows declaration with attribute noinline"
+#: gcov.c:1072
+#, c-format
+msgid "%s:'%s' lacks entry and/or exit blocks\n"
msgstr ""
-#: c-decl.c:1489
-msgid ""
-"%Jdeclaration of %qD with attribute noinline follows inline declaration "
+#: gcov.c:1077
+#, c-format
+msgid "%s:'%s' has arcs to entry block\n"
msgstr ""
-#: c-decl.c:1504
-msgid "%J%qD declared inline after being called"
+#: gcov.c:1085
+#, c-format
+msgid "%s:'%s' has arcs from exit block\n"
msgstr ""
-#: c-decl.c:1510
-msgid "%J%qD declared inline after its definition"
+#: gcov.c:1293
+#, c-format
+msgid "%s:graph is unsolvable for '%s'\n"
msgstr ""
-#: c-decl.c:1530
-msgid "%Jredefinition of parameter %qD"
+#: gcov.c:1373
+#, c-format
+msgid "%s '%s'\n"
msgstr ""
-#: c-decl.c:1554
-msgid "%Jredundant redeclaration of %qD"
+#: gcov.c:1376
+#, c-format
+msgid "Lines executed:%s of %d\n"
msgstr ""
-#: c-decl.c:1866
-msgid "%Jdeclaration of %qD shadows previous non-variable"
+#: gcov.c:1380
+#, c-format
+msgid "No executable lines\n"
msgstr ""
-#: c-decl.c:1871
-msgid "%Jdeclaration of %qD shadows a parameter"
+#: gcov.c:1386
+#, c-format
+msgid "Branches executed:%s of %d\n"
msgstr ""
-#: c-decl.c:1874
-msgid "%Jdeclaration of %qD shadows a global declaration"
+#: gcov.c:1390
+#, c-format
+msgid "Taken at least once:%s of %d\n"
msgstr ""
-#: c-decl.c:1884
-msgid "%Jdeclaration of %qD shadows a previous local"
+#: gcov.c:1396
+#, c-format
+msgid "No branches\n"
msgstr ""
-#: c-decl.c:1887 cp/name-lookup.c:942 cp/name-lookup.c:973
-#: cp/name-lookup.c:981
-msgid "%Jshadowed declaration is here"
+#: gcov.c:1398
+#, c-format
+msgid "Calls executed:%s of %d\n"
msgstr ""
-#: c-decl.c:2041
-msgid "nested extern declaration of %qD"
+#: gcov.c:1402
+#, c-format
+msgid "No calls\n"
msgstr ""
-#: c-decl.c:2201
+#: gcov.c:1543
#, c-format
-msgid "implicit declaration of function %qE"
+msgid "%s:no lines for '%s'\n"
msgstr ""
-#: c-decl.c:2262
-msgid "incompatible implicit declaration of built-in function %qD"
+#: gcov.c:1738
+#, c-format
+msgid "call %2d returned %s\n"
msgstr ""
-#: c-decl.c:2271
-msgid "incompatible implicit declaration of function %qD"
+#: gcov.c:1743
+#, c-format
+msgid "call %2d never executed\n"
msgstr ""
-#: c-decl.c:2324
-msgid "%H%qE undeclared here (not in a function)"
+#: gcov.c:1748
+#, c-format
+msgid "branch %2d taken %s%s\n"
msgstr ""
-#: c-decl.c:2329
-msgid "%H%qE undeclared (first use in this function)"
+#: gcov.c:1752
+#, c-format
+msgid "branch %2d never executed\n"
msgstr ""
-#: c-decl.c:2333
-msgid "%H(Each undeclared identifier is reported only once"
+#: gcov.c:1757
+#, c-format
+msgid "unconditional %2d taken %s\n"
msgstr ""
-#: c-decl.c:2334
-msgid "%Hfor each function it appears in.)"
+#: gcov.c:1760
+#, c-format
+msgid "unconditional %2d never executed\n"
msgstr ""
-#: c-decl.c:2372 cp/decl.c:2055
+#: gcov.c:1792
#, c-format
-msgid "label %qE referenced outside of any function"
+msgid "%s:cannot open source file\n"
msgstr ""
-#: c-decl.c:2414
+#: gcov.c:1802
#, c-format
-msgid "duplicate label declaration %qE"
+msgid "%s:source file is newer than graph file '%s'\n"
msgstr ""
-#: c-decl.c:2450
-msgid "%Hduplicate label %qD"
+#. Return if there's nothing to do, or it is too expensive.
+#: gcse.c:689
+msgid "GCSE disabled"
msgstr ""
-#: c-decl.c:2460
-msgid "%Jjump into statement expression"
+#. Return if there's nothing to do, or it is too expensive.
+#: gcse.c:6479
+msgid "jump bypassing disabled"
msgstr ""
-#: c-decl.c:2474
-msgid ""
-"%Htraditional C lacks a separate namespace for labels, identifier %qE "
-"conflicts"
+#: gengtype-yacc.c:564 java/parse-scan.c:1938 java/parse-scan.y:1374
+#: java/parse.c:2930 java/parse.y:16422
+msgid "syntax error: cannot back up"
msgstr ""
-#: c-decl.c:2544
-msgid "%H%qE defined as wrong kind of tag"
+#: gengtype-yacc.c:1576 java/parse-scan.c:3077
+#: java/parse-scan.y:1372 java/parse.c:6163
+#: java/parse.y:16420
+msgid "syntax error; also virtual memory exhausted"
msgstr ""
-#: c-decl.c:2758
-msgid "unnamed struct/union that defines no instances"
+#. Depending on the version of Bison used to compile this grammar,
+#. it may issue generic diagnostics spelled "syntax error" or
+#. "parse error". To prevent this from changing the translation
+#. template randomly, we list all the variants of this particular
+#. diagnostic here. Translators: there is no fine distinction
+#. between diagnostics with "syntax error" in them, and diagnostics
+#. with "parse error" in them. It's okay to give them both the same
+#. translation.
+#: gengtype-yacc.c:1580 java/parse-scan.c:3081
+#: java/parse-scan.y:1370 java/parse.c:6167
+#: java/parse.y:16418
+msgid "syntax error"
msgstr ""
-#: c-decl.c:2766
-msgid "empty declaration with storage class specifier does not redeclare tag"
+#: gengtype-yacc.c:1698 java/parse-scan.c:3199 java/parse.c:6285
+msgid "parser stack overflow"
msgstr ""
-#: c-decl.c:2777
-msgid "empty declaration with type qualifier does not redeclare tag"
+#. Opening quotation mark.
+#: intl.c:58
+msgid "`"
msgstr ""
-#: c-decl.c:2798 c-decl.c:2805
-msgid "useless type name in empty declaration"
+#. Closing quotation mark.
+#: intl.c:61
+msgid "'"
msgstr ""
-#: c-decl.c:2813
-msgid "%<inline%> in empty declaration"
+#: ipa-inline.c:269
+msgid "--param large-function-growth limit reached"
msgstr ""
-#: c-decl.c:2819
-msgid "%<auto%> in file-scope empty declaration"
+#: ipa-inline.c:306 ipa-inline.c:631
+msgid "recursive inlining"
msgstr ""
-#: c-decl.c:2825
-msgid "%<register%> in file-scope empty declaration"
+#: ipa-inline.c:571 ipa-inline.c:902
+msgid "--param max-inline-insns-single limit reached"
msgstr ""
-#: c-decl.c:2831
-msgid "useless storage class specifier in empty declaration"
+#: ipa-inline.c:644
+msgid "call is unlikely"
msgstr ""
-#: c-decl.c:2837
-msgid "useless %<__thread%> in empty declaration"
+#: ipa-inline.c:656
+msgid ""
+"--param max-inline-insns-single limit reached after inlining into the callee"
msgstr ""
-#: c-decl.c:2845
-msgid "useless type qualifier in empty declaration"
+#: ipa-inline.c:715
+msgid "--param inline-unit-growth limit reached"
msgstr ""
-#: c-decl.c:2852 c-parser.c:1159
-msgid "empty declaration"
+#: langhooks.c:507
+msgid "At top level:"
msgstr ""
-#: c-decl.c:2918
+#: langhooks.c:512
+#, c-format
+msgid "In member function %qs:"
+msgstr ""
+
+#: langhooks.c:516
+#, c-format
+msgid "In function %qs:"
+msgstr ""
+
+#. What to print when a switch has no documentation.
+#: opts.c:89
+msgid "This switch lacks documentation"
+msgstr ""
+
+#: opts.c:1213
+#, c-format
msgid ""
-"ISO C90 does not support %<static%> or type qualifiers in parameter array "
-"declarators"
+"\n"
+"Target specific options:\n"
msgstr ""
-#: c-decl.c:2921
-msgid "ISO C90 does not support %<[*]%> array declarators"
+#: opts.c:1234
+msgid "The following options are language-independent:\n"
msgstr ""
-#: c-decl.c:2924
-msgid "GCC does not yet properly implement %<[*]%> array declarators"
+#: opts.c:1241
+#, c-format
+msgid ""
+"The %s front end recognizes the following options:\n"
+"\n"
msgstr ""
-#: c-decl.c:2943
-msgid "static or type qualifiers in abstract declarator"
+#: opts.c:1254
+msgid "The --param option recognizes the following as parameters:\n"
msgstr ""
-#: c-decl.c:3002
-msgid "%J%qD is usually a function"
+#: protoize.c:583
+#, c-format
+msgid "%s: error writing file '%s': %s\n"
msgstr ""
-#: c-decl.c:3011 cp/decl.c:3624 cp/decl2.c:850
-msgid "typedef %qD is initialized (use __typeof__ instead)"
+#: protoize.c:627
+#, c-format
+msgid "%s: usage '%s [ -VqfnkN ] [ -i <istring> ] [ filename ... ]'\n"
msgstr ""
-#: c-decl.c:3016
-msgid "function %qD is initialized like a variable"
+#: protoize.c:630
+#, c-format
+msgid "%s: usage '%s [ -VqfnkNlgC ] [ -B <dirname> ] [ filename ... ]'\n"
msgstr ""
-#. DECL_INITIAL in a PARM_DECL is really DECL_ARG_TYPE.
-#: c-decl.c:3022
-msgid "parameter %qD is initialized"
+#: protoize.c:731
+#, c-format
+msgid "%s: warning: no read access for file '%s'\n"
msgstr ""
-#. Although C99 is unclear about whether incomplete arrays
-#. of VLAs themselves count as VLAs, it does not make
-#. sense to permit them to be initialized given that
-#. ordinary VLAs may not be initialized.
-#: c-decl.c:3041 c-decl.c:3056 c-typeck.c:4397
-msgid "variable-sized object may not be initialized"
+#: protoize.c:739
+#, c-format
+msgid "%s: warning: no write access for file '%s'\n"
msgstr ""
-#: c-decl.c:3047
-msgid "variable %qD has initializer but incomplete type"
+#: protoize.c:747
+#, c-format
+msgid "%s: warning: no write access for dir containing '%s'\n"
msgstr ""
-#: c-decl.c:3123 c-decl.c:5673 cp/decl.c:3664 cp/decl.c:9900
-msgid "%Jinline function %qD given attribute noinline"
+#. Catch cases like /.. where we try to backup to a
+#. point above the absolute root of the logical file
+#. system.
+#: protoize.c:1134
+#, c-format
+msgid "%s: invalid file name: %s\n"
msgstr ""
-#: c-decl.c:3192
-msgid "%Jinitializer fails to determine size of %qD"
+#: protoize.c:1282
+#, c-format
+msgid "%s: %s: can't get status: %s\n"
msgstr ""
-#: c-decl.c:3197
-msgid "%Jarray size missing in %qD"
+#: protoize.c:1303
+#, c-format
+msgid ""
+"\n"
+"%s: fatal error: aux info file corrupted at line %d\n"
msgstr ""
-#: c-decl.c:3208
-msgid "%Jzero or negative size array %qD"
+#: protoize.c:1632
+#, c-format
+msgid "%s:%d: declaration of function '%s' takes different forms\n"
msgstr ""
-#: c-decl.c:3237 varasm.c:1630
-msgid "%Jstorage size of %qD isn%'t known"
+#: protoize.c:1887
+#, c-format
+msgid "%s: compiling '%s'\n"
msgstr ""
-#: c-decl.c:3247
-msgid "%Jstorage size of %qD isn%'t constant"
+#: protoize.c:1910
+#, c-format
+msgid "%s: wait: %s\n"
msgstr ""
-#: c-decl.c:3295
-msgid "%Jignoring asm-specifier for non-static local variable %qD"
+#: protoize.c:1915
+#, c-format
+msgid "%s: subprocess got fatal signal %d\n"
msgstr ""
-#: c-decl.c:3325 fortran/f95-lang.c:644
-msgid "cannot put object with volatile field into register"
+#: protoize.c:1923
+#, c-format
+msgid "%s: %s exited with status %d\n"
msgstr ""
-#: c-decl.c:3459
-msgid "ISO C forbids forward parameter declarations"
+#: protoize.c:1972
+#, c-format
+msgid "%s: warning: missing SYSCALLS file '%s'\n"
msgstr ""
-#: c-decl.c:3579
-msgid "<anonymous>"
+#: protoize.c:1981 protoize.c:2010
+#, c-format
+msgid "%s: can't read aux info file '%s': %s\n"
msgstr ""
-#: c-decl.c:3586
+#: protoize.c:2026 protoize.c:2054
#, c-format
-msgid "bit-field %qs width not an integer constant"
+msgid "%s: can't get status of aux info file '%s': %s\n"
msgstr ""
-#: c-decl.c:3594
+#: protoize.c:2082
#, c-format
-msgid "negative width in bit-field %qs"
+msgid "%s: can't open aux info file '%s' for reading: %s\n"
msgstr ""
-#: c-decl.c:3599
+#: protoize.c:2100
#, c-format
-msgid "zero width for bit-field %qs"
+msgid "%s: error reading aux info file '%s': %s\n"
msgstr ""
-#: c-decl.c:3609
+#: protoize.c:2113
#, c-format
-msgid "bit-field %qs has invalid type"
+msgid "%s: error closing aux info file '%s': %s\n"
msgstr ""
-#: c-decl.c:3618
+#: protoize.c:2129
#, c-format
-msgid "type of bit-field %qs is a GCC extension"
+msgid "%s: can't delete aux info file '%s': %s\n"
msgstr ""
-#: c-decl.c:3627
+#: protoize.c:2211 protoize.c:4180
#, c-format
-msgid "width of %qs exceeds its type"
+msgid "%s: can't delete file '%s': %s\n"
msgstr ""
-#: c-decl.c:3640
+#: protoize.c:2289
#, c-format
-msgid "%qs is narrower than values of its type"
+msgid "%s: warning: can't rename file '%s' to '%s': %s\n"
msgstr ""
-#: c-decl.c:3765
-msgid "type defaults to %<int%> in declaration of %qs"
+#: protoize.c:2411
+#, c-format
+msgid "%s: conflicting extern definitions of '%s'\n"
msgstr ""
-#: c-decl.c:3793
-msgid "duplicate %<const%>"
+#: protoize.c:2415
+#, c-format
+msgid "%s: declarations of '%s' will not be converted\n"
msgstr ""
-#: c-decl.c:3795
-msgid "duplicate %<restrict%>"
+#: protoize.c:2417
+#, c-format
+msgid "%s: conflict list for '%s' follows:\n"
msgstr ""
-#: c-decl.c:3797
-msgid "duplicate %<volatile%>"
+#: protoize.c:2450
+#, c-format
+msgid "%s: warning: using formals list from %s(%d) for function '%s'\n"
msgstr ""
-#: c-decl.c:3816
-msgid "function definition declared %<auto%>"
+#: protoize.c:2490
+#, c-format
+msgid "%s: %d: '%s' used but missing from SYSCALLS\n"
msgstr ""
-#: c-decl.c:3818
-msgid "function definition declared %<register%>"
+#: protoize.c:2496
+#, c-format
+msgid "%s: %d: warning: no extern definition for '%s'\n"
msgstr ""
-#: c-decl.c:3820
-msgid "function definition declared %<typedef%>"
+#: protoize.c:2526
+#, c-format
+msgid "%s: warning: no static definition for '%s' in file '%s'\n"
msgstr ""
-#: c-decl.c:3822
-msgid "function definition declared %<__thread%>"
+#: protoize.c:2532
+#, c-format
+msgid "%s: multiple static defs of '%s' in file '%s'\n"
msgstr ""
-#: c-decl.c:3838
+#: protoize.c:2702 protoize.c:2705
#, c-format
-msgid "storage class specified for structure field %qs"
+msgid "%s: %d: warning: source too confusing\n"
msgstr ""
-#: c-decl.c:3842 cp/decl.c:6988
+#: protoize.c:2900
#, c-format
-msgid "storage class specified for parameter %qs"
+msgid "%s: %d: warning: varargs function declaration not converted\n"
msgstr ""
-#: c-decl.c:3845 cp/decl.c:6990
-msgid "storage class specified for typename"
+#: protoize.c:2915
+#, c-format
+msgid "%s: declaration of function '%s' not converted\n"
msgstr ""
-#: c-decl.c:3858 cp/decl.c:7007
-msgid "%qs initialized and declared %<extern%>"
+#: protoize.c:3038
+#, c-format
+msgid "%s: warning: too many parameter lists in declaration of '%s'\n"
msgstr ""
-#: c-decl.c:3860 cp/decl.c:7010
-msgid "%qs has both %<extern%> and initializer"
+#: protoize.c:3059
+#, c-format
+msgid ""
+"\n"
+"%s: warning: too few parameter lists in declaration of '%s'\n"
msgstr ""
-#: c-decl.c:3865
-msgid "file-scope declaration of %qs specifies %<auto%>"
+#: protoize.c:3155
+#, c-format
+msgid "%s: %d: warning: found '%s' but expected '%s'\n"
msgstr ""
-#: c-decl.c:3867
-msgid "file-scope declaration of %qs specifies %<register%>"
+#: protoize.c:3330
+#, c-format
+msgid "%s: local declaration for function '%s' not inserted\n"
msgstr ""
-#: c-decl.c:3872 cp/decl.c:7014
-msgid "nested function %qs declared %<extern%>"
+#: protoize.c:3357
+#, c-format
+msgid ""
+"\n"
+"%s: %d: warning: can't add declaration of '%s' into macro call\n"
msgstr ""
-#: c-decl.c:3875 cp/decl.c:7024
-msgid "function-scope %qs implicitly auto and declared %<__thread%>"
+#: protoize.c:3429
+#, c-format
+msgid "%s: global declarations for file '%s' not inserted\n"
msgstr ""
-#. Only the innermost declarator (making a parameter be of
-#. array type which is converted to pointer type)
-#. may have static or type qualifiers.
-#: c-decl.c:3922 c-decl.c:4112
-msgid "static or type qualifiers in non-parameter array declarator"
+#: protoize.c:3518 protoize.c:3548
+#, c-format
+msgid "%s: definition of function '%s' not converted\n"
msgstr ""
-#: c-decl.c:3968
+#: protoize.c:3537
#, c-format
-msgid "declaration of %qs as array of voids"
+msgid "%s: %d: warning: definition of %s not converted\n"
msgstr ""
-#: c-decl.c:3974
+#: protoize.c:3863
#, c-format
-msgid "declaration of %qs as array of functions"
+msgid "%s: found definition of '%s' at %s(%d)\n"
msgstr ""
-#: c-decl.c:3979
-msgid "invalid use of structure with flexible array member"
+#. If we make it here, then we did not know about this
+#. function definition.
+#: protoize.c:3879
+#, c-format
+msgid "%s: %d: warning: '%s' excluded by preprocessing\n"
msgstr ""
-#: c-decl.c:3999
+#: protoize.c:3882
#, c-format
-msgid "size of array %qs has non-integer type"
+msgid "%s: function definition not converted\n"
msgstr ""
-#: c-decl.c:4004
+#: protoize.c:3940
#, c-format
-msgid "ISO C forbids zero-size array %qs"
+msgid "%s: '%s' not converted\n"
msgstr ""
-#: c-decl.c:4011
+#: protoize.c:3948
#, c-format
-msgid "size of array %qs is negative"
+msgid "%s: would convert file '%s'\n"
msgstr ""
-#: c-decl.c:4025
-msgid "ISO C90 forbids array %qs whose size can%'t be evaluated"
+#: protoize.c:3951
+#, c-format
+msgid "%s: converting file '%s'\n"
msgstr ""
-#: c-decl.c:4029
+#: protoize.c:3961
#, c-format
-msgid "ISO C90 forbids variable-size array %qs"
+msgid "%s: can't get status for file '%s': %s\n"
msgstr ""
-#: c-decl.c:4068 c-decl.c:4232 cp/decl.c:7445
+#: protoize.c:4003
#, c-format
-msgid "size of array %qs is too large"
+msgid "%s: can't open file '%s' for reading: %s\n"
msgstr ""
-#: c-decl.c:4079
-msgid "ISO C90 does not support flexible array members"
+#: protoize.c:4018
+#, c-format
+msgid ""
+"\n"
+"%s: error reading input file '%s': %s\n"
msgstr ""
-#: c-decl.c:4089
-msgid "array type has incomplete element type"
+#: protoize.c:4052
+#, c-format
+msgid "%s: can't create/open clean file '%s': %s\n"
msgstr ""
-#: c-decl.c:4144 cp/decl.c:7115
+#: protoize.c:4157
#, c-format
-msgid "%qs declared as function returning a function"
+msgid "%s: warning: file '%s' already saved in '%s'\n"
msgstr ""
-#: c-decl.c:4149 cp/decl.c:7120
+#: protoize.c:4165
#, c-format
-msgid "%qs declared as function returning an array"
+msgid "%s: can't link file '%s' to '%s': %s\n"
msgstr ""
-#: c-decl.c:4169
-msgid "function definition has qualified void return type"
+#: protoize.c:4195
+#, c-format
+msgid "%s: can't create/open output file '%s': %s\n"
msgstr ""
-#: c-decl.c:4171
-msgid "type qualifiers ignored on function return type"
+#: protoize.c:4228
+#, c-format
+msgid "%s: can't change mode of file '%s': %s\n"
msgstr ""
-#: c-decl.c:4200 c-decl.c:4245 c-decl.c:4339 c-decl.c:4430
-msgid "ISO C forbids qualified function types"
+#: protoize.c:4404
+#, c-format
+msgid "%s: cannot get working directory: %s\n"
msgstr ""
-#: c-decl.c:4253
-msgid "%Jtypedef %qD declared %<inline%>"
+#: protoize.c:4502
+#, c-format
+msgid "%s: input file names must have .c suffixes: %s\n"
msgstr ""
-#: c-decl.c:4283
-msgid "ISO C forbids const or volatile function types"
+#: reload.c:3720
+msgid "unable to generate reloads for:"
msgstr ""
-#: c-decl.c:4303
+#: reload1.c:1902
+msgid "this is the insn:"
+msgstr ""
+
+#. It's the compiler's fault.
+#: reload1.c:5021
+msgid "could not find a spill register"
+msgstr ""
+
+#. It's the compiler's fault.
+#: reload1.c:6652
+msgid "VOIDmode on an output"
+msgstr ""
+
+#: rtl-error.c:128
+msgid "unrecognizable insn:"
+msgstr ""
+
+#: rtl-error.c:130
+msgid "insn does not satisfy its constraints:"
+msgstr ""
+
+#: timevar.c:412
+msgid ""
+"\n"
+"Execution times (seconds)\n"
+msgstr ""
+
+#. Print total time.
+#: timevar.c:470
+msgid " TOTAL :"
+msgstr ""
+
+#: timevar.c:499
#, c-format
-msgid "variable or field %qs declared void"
+msgid "time in %s: %ld.%06ld (%ld%%)\n"
msgstr ""
-#: c-decl.c:4332
-msgid "attributes in parameter array declarator ignored"
+#: tlink.c:384
+#, c-format
+msgid "collect: reading %s\n"
msgstr ""
-#: c-decl.c:4367
-msgid "%Jparameter %qD declared %<inline%>"
+#: tlink.c:478
+#, c-format
+msgid "removing .rpo file"
msgstr ""
-#: c-decl.c:4380
+#: tlink.c:480
#, c-format
-msgid "field %qs declared as a function"
+msgid "renaming .rpo file"
msgstr ""
-#: c-decl.c:4386
+#: tlink.c:534
#, c-format
-msgid "field %qs has incomplete type"
+msgid "collect: recompiling %s\n"
msgstr ""
-#: c-decl.c:4400 c-decl.c:4412 c-decl.c:4416
+#: tlink.c:714
#, c-format
-msgid "invalid storage class for function %qs"
+msgid "collect: tweaking %s in %s\n"
msgstr ""
-#: c-decl.c:4436
-msgid "%<noreturn%> function returns non-void value"
+#: tlink.c:764
+#, c-format
+msgid "collect: relinking\n"
msgstr ""
-#: c-decl.c:4464
-msgid "cannot inline function %<main%>"
+#: toplev.c:574
+#, c-format
+msgid "unrecoverable error"
msgstr ""
-#: c-decl.c:4511
-msgid "variable previously declared %<static%> redeclared %<extern%>"
+#: toplev.c:1093
+#, c-format
+msgid ""
+"%s%s%s version %s (%s)\n"
+"%s\tcompiled by GNU C version %s.\n"
+"%s%s%s version %s (%s) compiled by CC.\n"
msgstr ""
-#: c-decl.c:4521
-msgid "%Jvariable %qD declared %<inline%>"
+#: toplev.c:1100
+#, c-format
+msgid ""
+"%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n"
msgstr ""
-#. A mere warning is sure to result in improper semantics
-#. at runtime. Don't bother to allow this to compile.
-#: c-decl.c:4552 cp/decl.c:5855
-msgid "thread-local storage not supported for this target"
+#: toplev.c:1152
+msgid "options passed: "
msgstr ""
-#: c-decl.c:4614 c-decl.c:5711
-msgid "function declaration isn%'t a prototype"
+#: toplev.c:1181
+msgid "options enabled: "
msgstr ""
-#: c-decl.c:4622
-msgid "parameter names (without types) in function declaration"
+#: toplev.c:1300
+#, c-format
+msgid "created and used with differing settings of '%s'"
msgstr ""
-#: c-decl.c:4655
-msgid "%Jparameter %u (%qD) has incomplete type"
+#: toplev.c:1302
+msgid "out of memory"
msgstr ""
-#: c-decl.c:4658
-msgid "%Jparameter %u has incomplete type"
+#: toplev.c:1317
+msgid "created and used with different settings of -fpic"
msgstr ""
-#: c-decl.c:4667
-msgid "%Jparameter %u (%qD) has void type"
+#: toplev.c:1319
+msgid "created and used with different settings of -fpie"
msgstr ""
-#: c-decl.c:4670
-msgid "%Jparameter %u has void type"
+#: tree-inline.c:1937
+msgid "originally indirect function call not considered for inlining"
msgstr ""
-#: c-decl.c:4727
-msgid "%<void%> as only parameter may not be qualified"
+#.
+#. Local variables:
+#. mode:c
+#. End:
+#.
+#: diagnostic.def:1
+msgid "fatal error: "
msgstr ""
-#: c-decl.c:4731 c-decl.c:4766
-msgid "%<void%> must be the only parameter"
+#: diagnostic.def:2
+msgid "internal compiler error: "
msgstr ""
-#: c-decl.c:4759
-msgid "%Jparameter %qD has just a forward declaration"
+#: diagnostic.def:3
+msgid "error: "
msgstr ""
-#. The %s will be one of 'struct', 'union', or 'enum'.
-#: c-decl.c:4805
-msgid "%<%s %E%> declared inside parameter list"
+#: diagnostic.def:4
+msgid "sorry, unimplemented: "
msgstr ""
-#. The %s will be one of 'struct', 'union', or 'enum'.
-#: c-decl.c:4809
-#, c-format
-msgid "anonymous %s declared inside parameter list"
+#: diagnostic.def:5
+msgid "warning: "
+msgstr ""
+
+#: diagnostic.def:6
+msgid "anachronism: "
msgstr ""
-#: c-decl.c:4814
+#: diagnostic.def:7
+msgid "note: "
+msgstr ""
+
+#: diagnostic.def:8
+msgid "debug: "
+msgstr ""
+
+#: params.def:43
msgid ""
-"its scope is only this definition or declaration, which is probably not what "
-"you want"
+"The maximum number of fields in a structure variable without direct "
+"structure accesses that GCC will attempt to track separately"
msgstr ""
-#: c-decl.c:4947
-msgid "redefinition of %<union %E%>"
+#: params.def:52
+msgid "The maximum structure size (in bytes) at which GCC will do block copies"
msgstr ""
-#: c-decl.c:4949
-msgid "redefinition of %<struct %E%>"
+#: params.def:62
+msgid ""
+"The threshold ratio between instantiated fields and the total structure size"
msgstr ""
-#: c-decl.c:4954
-msgid "nested redefinition of %<union %E%>"
+#: params.def:79
+msgid ""
+"The maximum number of instructions in a single function eligible for inlining"
msgstr ""
-#: c-decl.c:4956
-msgid "nested redefinition of %<struct %E%>"
+#: params.def:91
+msgid "The maximum number of instructions when automatically inlining"
msgstr ""
-#: c-decl.c:5027 cp/decl.c:3421
-msgid "declaration does not declare anything"
+#: params.def:96
+msgid ""
+"The maximum number of instructions inline function can grow to via recursive "
+"inlining"
msgstr ""
-#: c-decl.c:5031
-msgid "ISO C doesn%'t support unnamed structs/unions"
+#: params.def:101
+msgid ""
+"The maximum number of instructions non-inline function can grow to via "
+"recursive inlining"
msgstr ""
-#: c-decl.c:5074 c-decl.c:5090
-msgid "%Jduplicate member %qD"
+#: params.def:106
+msgid "The maximum depth of recursive inlining for inline functions"
msgstr ""
-#: c-decl.c:5129
-msgid "union has no named members"
+#: params.def:111
+msgid "The maximum depth of recursive inlining for non-inline functions"
msgstr ""
-#: c-decl.c:5131
-msgid "union has no members"
+#: params.def:118
+msgid ""
+"If -fvariable-expansion-in-unroller is used, the maximum number "
+"of times that an individual variable will be expanded "
+"during loop unrolling"
msgstr ""
-#: c-decl.c:5136
-msgid "struct has no named members"
+#: params.def:131
+msgid "The maximum number of instructions to consider to fill a delay slot"
msgstr ""
-#: c-decl.c:5138
-msgid "struct has no members"
+#: params.def:142
+msgid ""
+"The maximum number of instructions to consider to find accurate live "
+"register information"
msgstr ""
-#: c-decl.c:5195
-msgid "%Jflexible array member in union"
+#: params.def:152
+msgid "The maximum length of scheduling's pending operations list"
msgstr ""
-#: c-decl.c:5200
-msgid "%Jflexible array member not at end of struct"
+#: params.def:157
+msgid "The size of function body to be considered large"
msgstr ""
-#: c-decl.c:5205
-msgid "%Jflexible array member in otherwise empty struct"
+#: params.def:161
+msgid "Maximal growth due to inlining of large function (in percent)"
msgstr ""
-#: c-decl.c:5212
-msgid "%Jinvalid use of structure with flexible array member"
+#: params.def:165
+msgid ""
+"how much can given compilation unit grow because of the inlining (in percent)"
msgstr ""
-#: c-decl.c:5320
-msgid "union cannot be made transparent"
+#: params.def:169
+msgid "expense of call operation relative to ordinary arithmetic operations"
msgstr ""
-#: c-decl.c:5391
-msgid "nested redefinition of %<enum %E%>"
+#: params.def:176
+msgid "The maximum amount of memory to be allocated by GCSE"
msgstr ""
-#. This enum is a named one that has been declared already.
-#: c-decl.c:5398
-msgid "redeclaration of %<enum %E%>"
+#: params.def:181
+msgid "The maximum number of passes to make when doing GCSE"
msgstr ""
-#: c-decl.c:5461
-msgid "enumeration values exceed range of largest integer"
+#: params.def:191
+msgid ""
+"The threshold ratio for performing partial redundancy elimination after "
+"reload."
msgstr ""
-#: c-decl.c:5478
-msgid "specified mode too small for enumeral values"
+#: params.def:198
+msgid ""
+"The threshold ratio of critical edges execution count that permit performing "
+"redundancy elimination after reload."
msgstr ""
-#: c-decl.c:5574
-#, c-format
-msgid "enumerator value for %qE is not an integer constant"
+#: params.def:209
+msgid "The maximum number of instructions to consider to unroll in a loop"
msgstr ""
-#: c-decl.c:5591
-msgid "overflow in enumeration values"
+#: params.def:215
+msgid ""
+"The maximum number of instructions to consider to unroll in a loop on average"
msgstr ""
-#: c-decl.c:5596
-msgid "ISO C restricts enumerator values to range of %<int%>"
+#: params.def:220
+msgid "The maximum number of unrollings of a single loop"
msgstr ""
-#: c-decl.c:5679
-msgid "return type is an incomplete type"
+#: params.def:225
+msgid "The maximum number of insns of a peeled loop"
msgstr ""
-#: c-decl.c:5687
-msgid "return type defaults to %<int%>"
+#: params.def:230
+msgid "The maximum number of peelings of a single loop"
msgstr ""
-#: c-decl.c:5718
-msgid "%Jno previous prototype for %qD"
+#: params.def:235
+msgid "The maximum number of insns of a completely peeled loop"
msgstr ""
-#: c-decl.c:5726
-msgid "%J%qD was used with no prototype before its definition"
+#: params.def:240
+msgid ""
+"The maximum number of peelings of a single loop that is peeled completely"
msgstr ""
-#: c-decl.c:5733
-msgid "%Jno previous declaration for %qD"
+#: params.def:245
+msgid "The maximum number of insns of a peeled loop that rolls only once"
msgstr ""
-#: c-decl.c:5741
-msgid "%J%qD was used with no declaration before its definition"
+#: params.def:251
+msgid "The maximum number of insns of an unswitched loop"
msgstr ""
-#: c-decl.c:5774 c-decl.c:6268
-msgid "%Jreturn type of %qD is not %<int%>"
+#: params.def:256
+msgid "The maximum number of unswitchings in a single loop"
msgstr ""
-#: c-decl.c:5789
-msgid "%Jfirst argument of %qD should be %<int%>"
+#: params.def:263
+msgid ""
+"Bound on the number of iterations the brute force # of iterations analysis "
+"algorithm evaluates"
msgstr ""
-#: c-decl.c:5798
-msgid "%Jsecond argument of %qD should be %<char **%>"
+#: params.def:268
+msgid ""
+"Maximum number of loops to perform swing modulo scheduling on (mainly for "
+"debugging)"
msgstr ""
-#: c-decl.c:5807
-msgid "%Jthird argument of %qD should probably be %<char **%>"
+#: params.def:274
+msgid ""
+"A factor for tuning the upper bound that swing modulo scheduler uses for "
+"scheduling a loop"
msgstr ""
-#: c-decl.c:5817
-msgid "%J%qD takes only zero or two arguments"
+#: params.def:278
+msgid ""
+"The number of cycles the swing modulo scheduler considers when \t checking "
+"conflicts using DFA"
msgstr ""
-#: c-decl.c:5820
-msgid "%J%qD is normally a non-static function"
+#: params.def:283
+msgid ""
+"A threshold on the average loop count considered by the swing modulo "
+"scheduler"
msgstr ""
-#: c-decl.c:5866
-msgid "%Jold-style parameter declarations in prototyped function definition"
+#: params.def:288
+msgid ""
+"Select fraction of the maximal count of repetitions of basic block in "
+"program given basic block needs to have to be considered hot"
msgstr ""
-#: c-decl.c:5879
-msgid "%Jtraditional C rejects ISO C style function definitions"
+#: params.def:292
+msgid ""
+"Select fraction of the maximal frequency of executions of basic block in "
+"function given basic block needs to have to be considered hot"
msgstr ""
-#: c-decl.c:5891
-msgid "%Jparameter name omitted"
+#: params.def:296
+msgid ""
+"The percentage of function, weighted by execution frequency, that must be "
+"covered by trace formation. Used when profile feedback is available"
msgstr ""
-#: c-decl.c:5931
-msgid "%Jold-style function definition"
+#: params.def:300
+msgid ""
+"The percentage of function, weighted by execution frequency, that must be "
+"covered by trace formation. Used when profile feedback is not available"
msgstr ""
-#: c-decl.c:5939
-msgid "%Jparameter name missing from parameter list"
+#: params.def:304
+msgid "Maximal code growth caused by tail duplication (in percent)"
msgstr ""
-#: c-decl.c:5950
-msgid "%J%qD declared as a non-parameter"
+#: params.def:308
+msgid ""
+"Stop reverse growth if the reverse probability of best edge is less than "
+"this threshold (in percent)"
msgstr ""
-#: c-decl.c:5955
-msgid "%Jmultiple parameters named %qD"
+#: params.def:312
+msgid ""
+"Stop forward growth if the probability of best edge is less than this "
+"threshold (in percent). Used when profile feedback is available"
msgstr ""
-#: c-decl.c:5963
-msgid "%Jparameter %qD declared with void type"
+#: params.def:316
+msgid ""
+"Stop forward growth if the probability of best edge is less than this "
+"threshold (in percent). Used when profile feedback is not available"
msgstr ""
-#: c-decl.c:5978 c-decl.c:5980
-msgid "%Jtype of %qD defaults to %<int%>"
+#: params.def:322
+msgid "The maximum number of incoming edges to consider for crossjumping"
msgstr ""
-#: c-decl.c:5999
-msgid "%Jparameter %qD has incomplete type"
+#: params.def:328
+msgid ""
+"The minimum number of matching instructions to consider for crossjumping"
msgstr ""
-#: c-decl.c:6005
-msgid "%Jdeclaration for parameter %qD but no such parameter"
+#: params.def:334
+msgid ""
+"The maximum number of insns to duplicate when unfactoring computed gotos"
msgstr ""
-#: c-decl.c:6055
-msgid "number of arguments doesn%'t match prototype"
+#: params.def:340
+msgid "The maximum length of path considered in cse"
msgstr ""
-#: c-decl.c:6056 c-decl.c:6086 c-decl.c:6093
-msgid "%Hprototype declaration"
+#: params.def:347
+msgid ""
+"The minimum cost of an expensive expression in the loop invariant motion"
msgstr ""
-#: c-decl.c:6084
-msgid "promoted argument %qD doesn%'t match prototype"
+#: params.def:356
+msgid ""
+"Bound on number of candidates below that all candidates are considered in iv "
+"optimizations"
msgstr ""
-#: c-decl.c:6092
-msgid "argument %qD doesn%'t match prototype"
+#: params.def:364
+msgid "Bound on number of iv uses in loop optimized in iv optimizations"
msgstr ""
-#: c-decl.c:6311 cp/decl.c:10670
-msgid "no return statement in function returning non-void"
+#: params.def:372
+msgid ""
+"If number of candidates in the set is smaller, we always try to remove "
+"unused ivs during its optimization"
msgstr ""
-#: c-decl.c:6318
-msgid "this function may return with or without a value"
+#: params.def:377
+msgid "Bound on size of expressions used in the scalar evolutions analyzer"
msgstr ""
-#. If we get here, declarations have been used in a for loop without
-#. the C99 for loop scope. This doesn't make much sense, so don't
-#. allow it.
-#: c-decl.c:6411
-msgid "%<for%> loop initial declaration used outside C99 mode"
+#: params.def:384
+msgid ""
+"Given N calls and V call-clobbered vars in a function. Use .GLOBAL_VAR if "
+"NxV is larger than this limit"
msgstr ""
-#: c-decl.c:6440
+#: params.def:389
+msgid "The maximum memory locations recorded by cselib"
+msgstr ""
+
+#: params.def:402
msgid ""
-"%Jdeclaration of static variable %qD in %<for%> loop initial declaration"
+"Minimum heap expansion to trigger garbage collection, as a percentage of the "
+"total size of the heap"
msgstr ""
-#: c-decl.c:6443
+#: params.def:407
+msgid "Minimum heap size before we start collecting garbage, in kilobytes"
+msgstr ""
+
+#: params.def:415
msgid ""
-"%Jdeclaration of %<extern%> variable %qD in %<for%> loop initial declaration"
+"The maximum number of instructions to search backward when looking for "
+"equivalent reload"
msgstr ""
-#: c-decl.c:6448
-msgid "%<struct %E%> declared in %<for%> loop initial declaration"
+#: params.def:420
+msgid ""
+"The maximum number of virtual operands allowed to represent aliases before "
+"triggering alias grouping."
msgstr ""
-#: c-decl.c:6452
-msgid "%<union %E%> declared in %<for%> loop initial declaration"
+#: params.def:425
+msgid ""
+"The maximum number of blocks in a region to be considered for interblock "
+"scheduling"
msgstr ""
-#: c-decl.c:6456
-msgid "%<enum %E%> declared in %<for%> loop initial declaration"
+#: params.def:430
+msgid ""
+"The maximum number of insns in a region to be considered for interblock "
+"scheduling"
msgstr ""
-#: c-decl.c:6460
-msgid "%Jdeclaration of non-variable %qD in %<for%> loop initial declaration"
+#: params.def:435
+msgid ""
+"The maximum number of RTL nodes that can be recorded as combiner's last value"
msgstr ""
-#: c-decl.c:6754 c-decl.c:6905 c-decl.c:7115
+#: params.def:443
+msgid "The upper bound for sharing integer constants"
+msgstr ""
+
+#: params.def:462
+msgid ""
+"Minimum number of virtual mappings to consider switching to full virtual "
+"renames"
+msgstr ""
+
+#: params.def:467
+msgid ""
+"Ratio between virtual mappings and virtual symbols to do full virtual renames"
+msgstr ""
+
+#: config/alpha/alpha.c:4894
#, c-format
-msgid "duplicate %qE"
+msgid "invalid %%H value"
msgstr ""
-#: c-decl.c:6777 c-decl.c:6914 c-decl.c:7017
-msgid "two or more data types in declaration specifiers"
+#: config/alpha/alpha.c:4915 config/bfin/bfin.c:1031
+#, c-format
+msgid "invalid %%J value"
msgstr ""
-#: c-decl.c:6789 cp/decl.c:6658
-msgid "%<long long long%> is too long for GCC"
+#: config/alpha/alpha.c:4945 config/ia64/ia64.c:4353
+#, c-format
+msgid "invalid %%r value"
msgstr ""
-#: c-decl.c:6796 c-decl.c:6988
-msgid "both %<long long%> and %<double%> in declaration specifiers"
+#: config/alpha/alpha.c:4955 config/rs6000/rs6000.c:9859
+#: config/xtensa/xtensa.c:1691
+#, c-format
+msgid "invalid %%R value"
msgstr ""
-#: c-decl.c:6802
-msgid "ISO C90 does not support %<long long%>"
+#: config/alpha/alpha.c:4961 config/rs6000/rs6000.c:9778
+#: config/xtensa/xtensa.c:1658
+#, c-format
+msgid "invalid %%N value"
msgstr ""
-#: c-decl.c:6807 c-decl.c:6827
-msgid "both %<long%> and %<short%> in declaration specifiers"
+#: config/alpha/alpha.c:4969 config/rs6000/rs6000.c:9806
+#, c-format
+msgid "invalid %%P value"
msgstr ""
-#: c-decl.c:6810 c-decl.c:6921
-msgid "both %<long%> and %<void%> in declaration specifiers"
+#: config/alpha/alpha.c:4977
+#, c-format
+msgid "invalid %%h value"
msgstr ""
-#: c-decl.c:6813 c-decl.c:6940
-msgid "both %<long%> and %<_Bool%> in declaration specifiers"
+#: config/alpha/alpha.c:4985 config/xtensa/xtensa.c:1684
+#, c-format
+msgid "invalid %%L value"
msgstr ""
-#: c-decl.c:6816 c-decl.c:6959
-msgid "both %<long%> and %<char%> in declaration specifiers"
+#: config/alpha/alpha.c:5024 config/rs6000/rs6000.c:9760
+#, c-format
+msgid "invalid %%m value"
msgstr ""
-#: c-decl.c:6819 c-decl.c:6972
-msgid "both %<long%> and %<float%> in declaration specifiers"
+#: config/alpha/alpha.c:5032 config/rs6000/rs6000.c:9768
+#, c-format
+msgid "invalid %%M value"
msgstr ""
-#: c-decl.c:6830 c-decl.c:6924
-msgid "both %<short%> and %<void%> in declaration specifiers"
+#: config/alpha/alpha.c:5076
+#, c-format
+msgid "invalid %%U value"
msgstr ""
-#: c-decl.c:6833 c-decl.c:6943
-msgid "both %<short%> and %<_Bool%> in declaration specifiers"
+#: config/alpha/alpha.c:5088 config/alpha/alpha.c:5102
+#: config/rs6000/rs6000.c:9867
+#, c-format
+msgid "invalid %%s value"
msgstr ""
-#: c-decl.c:6836 c-decl.c:6962
-msgid "both %<short%> and %<char%> in declaration specifiers"
+#: config/alpha/alpha.c:5125
+#, c-format
+msgid "invalid %%C value"
msgstr ""
-#: c-decl.c:6839 c-decl.c:6975
-msgid "both %<short%> and %<float%> in declaration specifiers"
+#: config/alpha/alpha.c:5162 config/rs6000/rs6000.c:9599
+#: config/rs6000/rs6000.c:9617
+#, c-format
+msgid "invalid %%E value"
msgstr ""
-#: c-decl.c:6842 c-decl.c:6991
-msgid "both %<short%> and %<double%> in declaration specifiers"
+#: config/alpha/alpha.c:5187 config/alpha/alpha.c:5235
+#, c-format
+msgid "unknown relocation unspec"
msgstr ""
-#: c-decl.c:6850 c-decl.c:6870
-msgid "both %<signed%> and %<unsigned%> in declaration specifiers"
+#: config/alpha/alpha.c:5196 config/rs6000/rs6000.c:10180
+#, c-format
+msgid "invalid %%xn code"
msgstr ""
-#: c-decl.c:6853 c-decl.c:6927
-msgid "both %<signed%> and %<void%> in declaration specifiers"
+#: config/arc/arc.c:1725 config/m32r/m32r.c:1795
+#, c-format
+msgid "invalid operand to %%R code"
msgstr ""
-#: c-decl.c:6856 c-decl.c:6946
-msgid "both %<signed%> and %<_Bool%> in declaration specifiers"
+#: config/arc/arc.c:1757 config/m32r/m32r.c:1818
+#, c-format
+msgid "invalid operand to %%H/%%L code"
msgstr ""
-#: c-decl.c:6859 c-decl.c:6978
-msgid "both %<signed%> and %<float%> in declaration specifiers"
+#: config/arc/arc.c:1779 config/m32r/m32r.c:1889
+#, c-format
+msgid "invalid operand to %%U code"
msgstr ""
-#: c-decl.c:6862 c-decl.c:6994
-msgid "both %<signed%> and %<double%> in declaration specifiers"
+#: config/arc/arc.c:1790
+#, c-format
+msgid "invalid operand to %%V code"
msgstr ""
-#: c-decl.c:6873 c-decl.c:6930
-msgid "both %<unsigned%> and %<void%> in declaration specifiers"
+#. Unknown flag.
+#. Undocumented flag.
+#: config/arc/arc.c:1797 config/m32r/m32r.c:1916 config/sparc/sparc.c:6787
+#, c-format
+msgid "invalid operand output code"
msgstr ""
-#: c-decl.c:6876 c-decl.c:6949
-msgid "both %<unsigned%> and %<_Bool%> in declaration specifiers"
+#: config/arm/arm.c:10496 config/arm/arm.c:10514
+#, c-format
+msgid "predicated Thumb instruction"
msgstr ""
-#: c-decl.c:6879 c-decl.c:6981
-msgid "both %<unsigned%> and %<float%> in declaration specifiers"
+#: config/arm/arm.c:10502
+#, c-format
+msgid "predicated instruction in conditional sequence"
msgstr ""
-#: c-decl.c:6882 c-decl.c:6997
-msgid "both %<unsigned%> and %<double%> in declaration specifiers"
+#: config/arm/arm.c:10610 config/arm/arm.c:10620 config/arm/arm.c:10630
+#: config/arm/arm.c:10656 config/arm/arm.c:10674 config/arm/arm.c:10709
+#: config/arm/arm.c:10728 config/arm/arm.c:10743 config/arm/arm.c:10769
+#: config/arm/arm.c:10776 config/arm/arm.c:10783
+#, c-format
+msgid "invalid operand for code '%c'"
msgstr ""
-#: c-decl.c:6890
-msgid "ISO C90 does not support complex types"
+#: config/arm/arm.c:10669
+#, c-format
+msgid "instruction never exectued"
msgstr ""
-#: c-decl.c:6892 c-decl.c:6933
-msgid "both %<complex%> and %<void%> in declaration specifiers"
+#: config/arm/arm.c:10794
+#, c-format
+msgid "missing operand"
msgstr ""
-#: c-decl.c:6895 c-decl.c:6952
-msgid "both %<complex%> and %<_Bool%> in declaration specifiers"
+#: config/avr/avr.c:1110
+msgid "bad address, not (reg+disp):"
msgstr ""
-#: c-decl.c:7034
+#: config/avr/avr.c:1117
+msgid "bad address, not post_inc or pre_dec:"
+msgstr ""
+
+#: config/avr/avr.c:1128
+msgid "internal compiler error. Bad address:"
+msgstr ""
+
+#: config/avr/avr.c:1141
+msgid "internal compiler error. Unknown mode:"
+msgstr ""
+
+#: config/avr/avr.c:1764 config/avr/avr.c:2447
+msgid "invalid insn:"
+msgstr ""
+
+#: config/avr/avr.c:1798 config/avr/avr.c:1884 config/avr/avr.c:1933
+#: config/avr/avr.c:1961 config/avr/avr.c:2056 config/avr/avr.c:2225
+#: config/avr/avr.c:2481 config/avr/avr.c:2593
+msgid "incorrect insn:"
+msgstr ""
+
+#: config/avr/avr.c:1980 config/avr/avr.c:2141 config/avr/avr.c:2296
+#: config/avr/avr.c:2659
+msgid "unknown move insn:"
+msgstr ""
+
+#: config/avr/avr.c:2889
+msgid "bad shift insn:"
+msgstr ""
+
+#: config/avr/avr.c:3005 config/avr/avr.c:3453 config/avr/avr.c:3839
+msgid "internal compiler error. Incorrect shift:"
+msgstr ""
+
+#: config/bfin/bfin.c:993
#, c-format
-msgid "%qE fails to be a typedef or built in type"
+msgid "invalid %%j value"
msgstr ""
-#: c-decl.c:7066
+#: config/bfin/bfin.c:1112
#, c-format
-msgid "%qE is not at beginning of declaration"
+msgid "invalid const_double operand"
msgstr ""
-#: c-decl.c:7080
-msgid "%<__thread%> used with %<auto%>"
+#: config/c4x/c4x.c:1591
+msgid "using CONST_DOUBLE for address"
msgstr ""
-#: c-decl.c:7082
-msgid "%<__thread%> used with %<register%>"
+#: config/c4x/c4x.c:1729
+msgid "c4x_address_cost: Invalid addressing mode"
msgstr ""
-#: c-decl.c:7084
-msgid "%<__thread%> used with %<typedef%>"
+#: config/c4x/c4x.c:1864
+#, c-format
+msgid "c4x_print_operand: %%L inconsistency"
msgstr ""
-#: c-decl.c:7095 cp/parser.c:7245
-msgid "%<__thread%> before %<extern%>"
+#: config/c4x/c4x.c:1870
+#, c-format
+msgid "c4x_print_operand: %%N inconsistency"
msgstr ""
-#: c-decl.c:7104 cp/parser.c:7235
-msgid "%<__thread%> before %<static%>"
+#: config/c4x/c4x.c:1911
+#, c-format
+msgid "c4x_print_operand: %%O inconsistency"
msgstr ""
-#: c-decl.c:7120
-msgid "multiple storage classes in declaration specifiers"
+#: config/c4x/c4x.c:2006
+msgid "c4x_print_operand: Bad operand case"
msgstr ""
-#: c-decl.c:7127
-msgid "%<__thread%> used with %qE"
+#: config/c4x/c4x.c:2047
+msgid "c4x_print_operand_address: Bad post_modify"
msgstr ""
-#: c-decl.c:7181
-msgid "ISO C does not support plain %<complex%> meaning %<double complex%>"
+#: config/c4x/c4x.c:2069
+msgid "c4x_print_operand_address: Bad pre_modify"
msgstr ""
-#: c-decl.c:7226 c-decl.c:7252
-msgid "ISO C does not support complex integer types"
+#: config/c4x/c4x.c:2117 config/c4x/c4x.c:2129 config/c4x/c4x.c:2144
+msgid "c4x_print_operand_address: Bad operand case"
msgstr ""
-#: c-decl.c:7327 toplev.c:852
-msgid "%J%qF used but never defined"
+#: config/c4x/c4x.c:2395
+msgid "c4x_rptb_insert: Cannot find start label"
msgstr ""
-#: c-format.c:96 c-format.c:205
-msgid "format string has invalid operand number"
+#: config/c4x/c4x.c:3310 config/c4x/c4x.c:3328
+msgid "mode not QImode"
msgstr ""
-#: c-format.c:113
-msgid "function does not return string type"
+#: config/c4x/c4x.c:3398
+msgid "invalid indirect memory address"
msgstr ""
-#: c-format.c:142
-msgid "format string argument not a string type"
+#: config/c4x/c4x.c:3487
+msgid "invalid indirect (S) memory address"
msgstr ""
-#: c-format.c:185
-msgid "unrecognized format specifier"
+#: config/c4x/c4x.c:3822
+msgid "c4x_valid_operands: Internal error"
msgstr ""
-#: c-format.c:197
+#: config/c4x/c4x.c:4261
+msgid "c4x_operand_subword: invalid mode"
+msgstr ""
+
+#: config/c4x/c4x.c:4264
+msgid "c4x_operand_subword: invalid operand"
+msgstr ""
+
+#. We could handle these with some difficulty.
+#. e.g., *p-- => *(p-=2); *(p+1).
+#: config/c4x/c4x.c:4290
+msgid "c4x_operand_subword: invalid autoincrement"
+msgstr ""
+
+#: config/c4x/c4x.c:4296
+msgid "c4x_operand_subword: invalid address"
+msgstr ""
+
+#: config/c4x/c4x.c:4307
+msgid "c4x_operand_subword: address not offsettable"
+msgstr ""
+
+#: config/c4x/c4x.c:4509
+msgid "c4x_rptb_rpts_p: Repeat block top label moved\n"
+msgstr ""
+
+#. Use `%s' to print the string in case there are any escape
+#. characters in the message.
+#: config/cris/cris.c:492 c-typeck.c:4179 c-typeck.c:4194 c-typeck.c:4209
+#: final.c:2770 final.c:2772 gcc.c:4625 rtl-error.c:113 toplev.c:578
+#: cp/parser.c:1945 cp/typeck.c:4157 java/expr.c:409
+#: java/parse.y:4988 java/verify.c:1552 java/verify.c:1553
+#: java/verify.c:1572
+#, gcc-internal-format
+msgid "%s"
+msgstr ""
+
+#: config/cris/cris.c:544
+msgid "unexpected index-type in cris_print_index"
+msgstr ""
+
+#: config/cris/cris.c:558
+msgid "unexpected base-type in cris_print_base"
+msgstr ""
+
+#: config/cris/cris.c:674
+msgid "invalid operand for 'b' modifier"
+msgstr ""
+
+#: config/cris/cris.c:687
+msgid "invalid operand for 'v' modifier"
+msgstr ""
+
+#: config/cris/cris.c:700
+msgid "invalid operand for 'o' modifier"
+msgstr ""
+
+#: config/cris/cris.c:719
+msgid "invalid operand for 'O' modifier"
+msgstr ""
+
+#: config/cris/cris.c:753
+msgid "invalid operand for 'P' modifier"
+msgstr ""
+
+#: config/cris/cris.c:760
+msgid "invalid operand for 'p' modifier"
+msgstr ""
+
+#: config/cris/cris.c:799
+msgid "invalid operand for 'z' modifier"
+msgstr ""
+
+#: config/cris/cris.c:846 config/cris/cris.c:876
+msgid "invalid operand for 'H' modifier"
+msgstr ""
+
+#: config/cris/cris.c:852
+msgid "bad register"
+msgstr ""
+
+#: config/cris/cris.c:890
+msgid "invalid operand for 'e' modifier"
+msgstr ""
+
+#: config/cris/cris.c:907
+msgid "invalid operand for 'm' modifier"
+msgstr ""
+
+#: config/cris/cris.c:932
+msgid "invalid operand for 'A' modifier"
+msgstr ""
+
+#: config/cris/cris.c:950
+msgid "invalid operand for 'D' modifier"
+msgstr ""
+
+#: config/cris/cris.c:964
+msgid "invalid operand for 'T' modifier"
+msgstr ""
+
+#: config/cris/cris.c:973
+msgid "invalid operand modifier letter"
+msgstr ""
+
+#: config/cris/cris.c:1031
+msgid "unexpected multiplicative operand"
+msgstr ""
+
+#: config/cris/cris.c:1051
+msgid "unexpected operand"
+msgstr ""
+
+#: config/cris/cris.c:1084 config/cris/cris.c:1094
+msgid "unrecognized address"
+msgstr ""
+
+#: config/cris/cris.c:1904 config/cris/cris.c:1966
+msgid "unrecognized supposed constant"
+msgstr ""
+
+#: config/cris/cris.c:2009
+msgid "unrecognized supposed constant in cris_global_pic_symbol"
+msgstr ""
+
+#: config/cris/cris.c:2356 config/cris/cris.c:2401
+msgid "unexpected side-effects in address"
+msgstr ""
+
+#: config/cris/cris.c:3101
+msgid "unexpected PIC symbol"
+msgstr ""
+
+#: config/cris/cris.c:3105
#, c-format
-msgid "%qE is an unrecognized format function type"
+msgid "PIC register isn't set up"
msgstr ""
-#: c-format.c:211
-msgid "%<...%> has invalid operand number"
+#: config/fr30/fr30.c:464
+#, c-format
+msgid "fr30_print_operand_address: unhandled address"
msgstr ""
-#: c-format.c:218
-msgid "format string argument follows the args to be formatted"
+#: config/fr30/fr30.c:488
+#, c-format
+msgid "fr30_print_operand: unrecognized %%p code"
msgstr ""
-#: c-format.c:341 c-format.c:365
-msgid "' ' flag"
+#: config/fr30/fr30.c:508
+#, c-format
+msgid "fr30_print_operand: unrecognized %%b code"
msgstr ""
-#: c-format.c:341 c-format.c:365
-msgid "the ' ' printf flag"
+#: config/fr30/fr30.c:529
+#, c-format
+msgid "fr30_print_operand: unrecognized %%B code"
msgstr ""
-#: c-format.c:342 c-format.c:366 c-format.c:404 c-format.c:461
-msgid "'+' flag"
+#: config/fr30/fr30.c:537
+#, c-format
+msgid "fr30_print_operand: invalid operand to %%A code"
msgstr ""
-#: c-format.c:342 c-format.c:366 c-format.c:404
-msgid "the '+' printf flag"
+#: config/fr30/fr30.c:554
+#, c-format
+msgid "fr30_print_operand: invalid %%x code"
msgstr ""
-#: c-format.c:343 c-format.c:367 c-format.c:405 c-format.c:437
-msgid "'#' flag"
+#: config/fr30/fr30.c:561
+#, c-format
+msgid "fr30_print_operand: invalid %%F code"
msgstr ""
-#: c-format.c:343 c-format.c:367 c-format.c:405
-msgid "the '#' printf flag"
+#: config/fr30/fr30.c:578
+#, c-format
+msgid "fr30_print_operand: unknown code"
msgstr ""
-#: c-format.c:344 c-format.c:368 c-format.c:435
-msgid "'0' flag"
+#: config/fr30/fr30.c:606 config/fr30/fr30.c:615 config/fr30/fr30.c:626
+#: config/fr30/fr30.c:639
+#, c-format
+msgid "fr30_print_operand: unhandled MEM"
msgstr ""
-#: c-format.c:344 c-format.c:368
-msgid "the '0' printf flag"
+#: config/frv/frv.c:2506
+msgid "Bad insn to frv_print_operand_address:"
msgstr ""
-#: c-format.c:345 c-format.c:369 c-format.c:434 c-format.c:464
-msgid "'-' flag"
+#: config/frv/frv.c:2517
+msgid "Bad register to frv_print_operand_memory_reference_reg:"
msgstr ""
-#: c-format.c:345 c-format.c:369
-msgid "the '-' printf flag"
+#: config/frv/frv.c:2556 config/frv/frv.c:2566 config/frv/frv.c:2575
+#: config/frv/frv.c:2596 config/frv/frv.c:2601
+msgid "Bad insn to frv_print_operand_memory_reference:"
msgstr ""
-#: c-format.c:346 c-format.c:418
-msgid "''' flag"
+#: config/frv/frv.c:2687
+#, c-format
+msgid "bad condition code"
msgstr ""
-#: c-format.c:346
-msgid "the ''' printf flag"
+#: config/frv/frv.c:2762
+msgid "Bad insn in frv_print_operand, bad const_double"
msgstr ""
-#: c-format.c:347 c-format.c:419
-msgid "'I' flag"
+#: config/frv/frv.c:2823
+msgid "Bad insn to frv_print_operand, 'e' modifier:"
msgstr ""
-#: c-format.c:347
-msgid "the 'I' printf flag"
+#: config/frv/frv.c:2831
+msgid "Bad insn to frv_print_operand, 'F' modifier:"
msgstr ""
-#: c-format.c:348 c-format.c:370 c-format.c:416 c-format.c:438 c-format.c:465
-#: c-format.c:1527 config/sol2-c.c:46
-msgid "field width"
+#: config/frv/frv.c:2847
+msgid "Bad insn to frv_print_operand, 'f' modifier:"
msgstr ""
-#: c-format.c:348 c-format.c:370 config/sol2-c.c:46
-msgid "field width in printf format"
+#: config/frv/frv.c:2861
+msgid "Bad insn to frv_print_operand, 'g' modifier:"
msgstr ""
-#: c-format.c:349 c-format.c:371 c-format.c:395 c-format.c:407
-msgid "precision"
+#: config/frv/frv.c:2909
+msgid "Bad insn to frv_print_operand, 'L' modifier:"
msgstr ""
-#: c-format.c:349 c-format.c:371 c-format.c:395 c-format.c:407
-msgid "precision in printf format"
+#: config/frv/frv.c:2922
+msgid "Bad insn to frv_print_operand, 'M/N' modifier:"
msgstr ""
-#: c-format.c:350 c-format.c:372 c-format.c:396 c-format.c:408 c-format.c:417
-#: c-format.c:468 config/sol2-c.c:47
-msgid "length modifier"
+#: config/frv/frv.c:2943
+msgid "Bad insn to frv_print_operand, 'O' modifier:"
msgstr ""
-#: c-format.c:350 c-format.c:372 c-format.c:396 c-format.c:408
-#: config/sol2-c.c:47
-msgid "length modifier in printf format"
+#: config/frv/frv.c:2961
+msgid "Bad insn to frv_print_operand, P modifier:"
msgstr ""
-#: c-format.c:394 c-format.c:406
-msgid "'q' flag"
+#: config/frv/frv.c:2981
+msgid "Bad insn in frv_print_operand, z case"
msgstr ""
-#: c-format.c:394 c-format.c:406
-msgid "the 'q' diagnostic flag"
+#: config/frv/frv.c:3012
+msgid "Bad insn in frv_print_operand, 0 case"
msgstr ""
-#: c-format.c:414
-msgid "assignment suppression"
+#: config/frv/frv.c:3017
+msgid "frv_print_operand: unknown code"
msgstr ""
-#: c-format.c:414
-msgid "the assignment suppression scanf feature"
+#: config/frv/frv.c:4386
+msgid "Bad output_move_single operand"
msgstr ""
-#: c-format.c:415
-msgid "'a' flag"
+#: config/frv/frv.c:4513
+msgid "Bad output_move_double operand"
msgstr ""
-#: c-format.c:415
-msgid "the 'a' scanf flag"
+#: config/frv/frv.c:4655
+msgid "Bad output_condmove_single operand"
msgstr ""
-#: c-format.c:416
-msgid "field width in scanf format"
+#. This macro is a C statement to print on `stderr' a string describing the
+#. particular machine description choice. Every machine description should
+#. define `TARGET_VERSION'. For example:
+#.
+#. #ifdef MOTOROLA
+#. #define TARGET_VERSION fprintf (stderr, " (68k, Motorola syntax)");
+#. #else
+#. #define TARGET_VERSION fprintf (stderr, " (68k, MIT syntax)");
+#. #endif
+#: config/frv/frv.h:329
+#, c-format
+msgid " (frv)"
msgstr ""
-#: c-format.c:417
-msgid "length modifier in scanf format"
+#: config/i386/i386.c:6101
+#, c-format
+msgid "invalid UNSPEC as operand"
msgstr ""
-#: c-format.c:418
-msgid "the ''' scanf flag"
+#: config/i386/i386.c:6683
+#, c-format
+msgid ""
+"operand is neither a constant nor a condition code, invalid operand code 'c'"
msgstr ""
-#: c-format.c:419
-msgid "the 'I' scanf flag"
+#: config/i386/i386.c:6736
+#, c-format
+msgid "invalid operand code '%c'"
msgstr ""
-#: c-format.c:433
-msgid "'_' flag"
+#: config/i386/i386.c:6779
+#, c-format
+msgid "invalid constraints for operand"
msgstr ""
-#: c-format.c:433
-msgid "the '_' strftime flag"
+#: config/i386/i386.c:12240
+msgid "unknown insn mode"
msgstr ""
-#: c-format.c:434
-msgid "the '-' strftime flag"
+#. If the environment variable DJDIR is not defined, then DJGPP is not installed correctly and GCC will quickly become confused with the default prefix settings. Report the problem now so the user doesn't receive deceptive "file not found" error messages later.
+#. DJDIR is automatically defined by the DJGPP environment config file pointed to by the environment variable DJGPP. Examine DJGPP to try and figure out what's wrong.
+#: config/i386/xm-djgpp.h:62
+#, c-format
+msgid "environment variable DJGPP not defined"
msgstr ""
-#: c-format.c:435
-msgid "the '0' strftime flag"
+#: config/i386/xm-djgpp.h:64
+#, c-format
+msgid "environment variable DJGPP points to missing file '%s'"
msgstr ""
-#: c-format.c:436 c-format.c:460
-msgid "'^' flag"
+#: config/i386/xm-djgpp.h:67
+#, c-format
+msgid "environment variable DJGPP points to corrupt file '%s'"
msgstr ""
-#: c-format.c:436
-msgid "the '^' strftime flag"
+#: config/ia64/ia64.c:4403
+#, c-format
+msgid "ia64_print_operand: unknown code"
msgstr ""
-#: c-format.c:437
-msgid "the '#' strftime flag"
+#: config/ip2k/ip2k.c:1087
+msgid "bad operand"
msgstr ""
-#: c-format.c:438
-msgid "field width in strftime format"
+#: config/iq2000/iq2000.c:3125
+#, c-format
+msgid "invalid %%P operand"
msgstr ""
-#: c-format.c:439
-msgid "'E' modifier"
+#: config/iq2000/iq2000.c:3133 config/rs6000/rs6000.c:9796
+#, c-format
+msgid "invalid %%p value"
msgstr ""
-#: c-format.c:439
-msgid "the 'E' strftime modifier"
+#: config/iq2000/iq2000.c:3189 config/mips/mips.c:5360
+#, c-format
+msgid "invalid use of %%d, %%x, or %%X"
msgstr ""
-#: c-format.c:440
-msgid "'O' modifier"
+#: config/m32r/m32r.c:1765
+#, c-format
+msgid "invalid operand to %%s code"
msgstr ""
-#: c-format.c:440
-msgid "the 'O' strftime modifier"
+#: config/m32r/m32r.c:1772
+#, c-format
+msgid "invalid operand to %%p code"
msgstr ""
-#: c-format.c:441
-msgid "the 'O' modifier"
+#: config/m32r/m32r.c:1827
+msgid "bad insn for 'A'"
msgstr ""
-#: c-format.c:459
-msgid "fill character"
+#: config/m32r/m32r.c:1874
+#, c-format
+msgid "invalid operand to %%T/%%B code"
msgstr ""
-#: c-format.c:459
-msgid "fill character in strfmon format"
+#: config/m32r/m32r.c:1897
+#, c-format
+msgid "invalid operand to %%N code"
msgstr ""
-#: c-format.c:460
-msgid "the '^' strfmon flag"
+#: config/m32r/m32r.c:1930
+msgid "pre-increment address is not a register"
msgstr ""
-#: c-format.c:461
-msgid "the '+' strfmon flag"
+#: config/m32r/m32r.c:1937
+msgid "pre-decrement address is not a register"
msgstr ""
-#: c-format.c:462
-msgid "'(' flag"
+#: config/m32r/m32r.c:1944
+msgid "post-increment address is not a register"
msgstr ""
-#: c-format.c:462
-msgid "the '(' strfmon flag"
+#: config/m32r/m32r.c:2020 config/m32r/m32r.c:2034
+#: config/rs6000/rs6000.c:16829
+msgid "bad address"
msgstr ""
-#: c-format.c:463
-msgid "'!' flag"
+#: config/m32r/m32r.c:2039
+msgid "lo_sum not of register"
msgstr ""
-#: c-format.c:463
-msgid "the '!' strfmon flag"
+#. !!!! SCz wrong here.
+#: config/m68hc11/m68hc11.c:3189 config/m68hc11/m68hc11.c:3567
+msgid "move insn not handled"
msgstr ""
-#: c-format.c:464
-msgid "the '-' strfmon flag"
+#: config/m68hc11/m68hc11.c:3413 config/m68hc11/m68hc11.c:3497
+#: config/m68hc11/m68hc11.c:3770
+msgid "invalid register in the move instruction"
msgstr ""
-#: c-format.c:465
-msgid "field width in strfmon format"
+#: config/m68hc11/m68hc11.c:3447
+msgid "invalid operand in the instruction"
msgstr ""
-#: c-format.c:466
-msgid "left precision"
+#: config/m68hc11/m68hc11.c:3744
+msgid "invalid register in the instruction"
msgstr ""
-#: c-format.c:466
-msgid "left precision in strfmon format"
+#: config/m68hc11/m68hc11.c:3777
+msgid "operand 1 must be a hard register"
msgstr ""
-#: c-format.c:467
-msgid "right precision"
+#: config/m68hc11/m68hc11.c:3791
+msgid "invalid rotate insn"
msgstr ""
-#: c-format.c:467
-msgid "right precision in strfmon format"
+#: config/m68hc11/m68hc11.c:4215
+msgid "registers IX, IY and Z used in the same INSN"
msgstr ""
-#: c-format.c:468
-msgid "length modifier in strfmon format"
+#: config/m68hc11/m68hc11.c:4552 config/m68hc11/m68hc11.c:4852
+msgid "cannot do z-register replacement"
msgstr ""
-#: c-format.c:836
+#: config/m68hc11/m68hc11.c:4915
+msgid "invalid Z register replacement for insn"
+msgstr ""
+
+#: config/mips/mips.c:5045
+msgid "mips_debugger_offset called with non stack/frame/arg pointer"
+msgstr ""
+
+#: config/mips/mips.c:5254
#, c-format
-msgid "function might be possible candidate for %qs format attribute"
+msgid "PRINT_OPERAND, invalid insn for %%C"
msgstr ""
-#: c-format.c:927 c-format.c:948 c-format.c:1943
-msgid "missing $ operand number in format"
+#: config/mips/mips.c:5271
+#, c-format
+msgid "PRINT_OPERAND, invalid insn for %%N"
msgstr ""
-#: c-format.c:957
+#: config/mips/mips.c:5280
#, c-format
-msgid "%s does not support %%n$ operand number formats"
+msgid "PRINT_OPERAND, invalid insn for %%F"
msgstr ""
-#: c-format.c:964
-msgid "operand number out of range in format"
+#: config/mips/mips.c:5289
+#, c-format
+msgid "PRINT_OPERAND, invalid insn for %%W"
msgstr ""
-#: c-format.c:987
+#: config/mips/mips.c:5310
#, c-format
-msgid "format argument %d used more than once in %s format"
+msgid "invalid %%Y value"
msgstr ""
-#: c-format.c:1019
-msgid "$ operand number used after format without operand number"
+#: config/mips/mips.c:5388
+msgid "PRINT_OPERAND, invalid operand for relocation"
+msgstr ""
+
+#: config/mmix/mmix.c:1468 config/mmix/mmix.c:1598
+msgid "MMIX Internal: Expected a CONST_INT, not this"
+msgstr ""
+
+#: config/mmix/mmix.c:1547
+msgid "MMIX Internal: Bad value for 'm', not a CONST_INT"
msgstr ""
-#: c-format.c:1049
+#: config/mmix/mmix.c:1566
+msgid "MMIX Internal: Expected a register, not this"
+msgstr ""
+
+#: config/mmix/mmix.c:1576
+msgid "MMIX Internal: Expected a constant, not this"
+msgstr ""
+
+#. We need the original here.
+#: config/mmix/mmix.c:1660
+msgid "MMIX Internal: Cannot decode this operand"
+msgstr ""
+
+#: config/mmix/mmix.c:1717
+msgid "MMIX Internal: This is not a recognized address"
+msgstr ""
+
+#: config/mmix/mmix.c:2650
+msgid "MMIX Internal: Trying to output invalidly reversed condition:"
+msgstr ""
+
+#: config/mmix/mmix.c:2657
+msgid "MMIX Internal: What's the CC of this?"
+msgstr ""
+
+#: config/mmix/mmix.c:2661
+msgid "MMIX Internal: What is the CC of this?"
+msgstr ""
+
+#: config/mmix/mmix.c:2731
+msgid "MMIX Internal: This is not a constant:"
+msgstr ""
+
+#: config/rs6000/host-darwin.c:83
#, c-format
-msgid "format argument %d unused before used argument %d in $-style format"
+msgid "Out of stack space.\n"
msgstr ""
-#: c-format.c:1144
-msgid "format not a string literal, format string not checked"
+#: config/rs6000/host-darwin.c:104
+#, c-format
+msgid "Try running '%s' in the shell to raise its limit.\n"
msgstr ""
-#: c-format.c:1158
-msgid "format not a string literal and no format arguments"
+#: config/rs6000/rs6000.c:9626
+#, c-format
+msgid "invalid %%f value"
msgstr ""
-#: c-format.c:1160
-msgid "format not a string literal, argument types not checked"
+#: config/rs6000/rs6000.c:9635
+#, c-format
+msgid "invalid %%F value"
msgstr ""
-#: c-format.c:1173
-msgid "too many arguments for format"
+#: config/rs6000/rs6000.c:9644
+#, c-format
+msgid "invalid %%G value"
msgstr ""
-#: c-format.c:1176
-msgid "unused arguments in $-style format"
+#: config/rs6000/rs6000.c:9679
+#, c-format
+msgid "invalid %%j code"
msgstr ""
-#: c-format.c:1179
+#: config/rs6000/rs6000.c:9689
#, c-format
-msgid "zero-length %s format string"
+msgid "invalid %%J code"
msgstr ""
-#: c-format.c:1183
-msgid "format is a wide character string"
+#: config/rs6000/rs6000.c:9699
+#, c-format
+msgid "invalid %%k value"
msgstr ""
-#: c-format.c:1186
-msgid "unterminated format string"
+#: config/rs6000/rs6000.c:9719 config/xtensa/xtensa.c:1677
+#, c-format
+msgid "invalid %%K value"
msgstr ""
-#: c-format.c:1396
-msgid "embedded %<\\0%> in format"
+#: config/rs6000/rs6000.c:9786
+#, c-format
+msgid "invalid %%O value"
msgstr ""
-#: c-format.c:1411
-msgid "spurious trailing %<%%%> in format"
+#: config/rs6000/rs6000.c:9833
+#, c-format
+msgid "invalid %%q value"
msgstr ""
-#: c-format.c:1455 c-format.c:1699
+#: config/rs6000/rs6000.c:9877
#, c-format
-msgid "repeated %s in format"
+msgid "invalid %%S value"
msgstr ""
-#: c-format.c:1468
-msgid "missing fill character at end of strfmon format"
+#: config/rs6000/rs6000.c:9917
+#, c-format
+msgid "invalid %%T value"
msgstr ""
-#: c-format.c:1512 c-format.c:1614 c-format.c:1893 c-format.c:1955
-msgid "too few arguments for format"
+#: config/rs6000/rs6000.c:9927
+#, c-format
+msgid "invalid %%u value"
msgstr ""
-#: c-format.c:1553
+#: config/rs6000/rs6000.c:9936 config/xtensa/xtensa.c:1647
#, c-format
-msgid "zero width in %s format"
+msgid "invalid %%v value"
+msgstr ""
+
+#: config/rs6000/rs6000.c:18331
+msgid "AltiVec argument passed to unprototyped function"
msgstr ""
-#: c-format.c:1571
+#: config/s390/s390.c:3755
#, c-format
-msgid "empty left precision in %s format"
+msgid "Cannot decompose address."
msgstr ""
-#: c-format.c:1629
-msgid "field precision"
+#: config/s390/s390.c:3949
+msgid "UNKNOWN in print_operand !?"
+msgstr ""
+
+#: config/sh/sh.c:7527
+msgid "created and used with different architectures / ABIs"
+msgstr ""
+
+#: config/sh/sh.c:7529
+msgid "created and used with different ABIs"
+msgstr ""
+
+#: config/sh/sh.c:7531
+msgid "created and used with different endianness"
msgstr ""
-#: c-format.c:1644
+#: config/sparc/sparc.c:6595 config/sparc/sparc.c:6601
#, c-format
-msgid "empty precision in %s format"
+msgid "invalid %%Y operand"
msgstr ""
-#: c-format.c:1683
+#: config/sparc/sparc.c:6671
#, c-format
-msgid "%s does not support the %qs %s length modifier"
+msgid "invalid %%A operand"
msgstr ""
-#: c-format.c:1733
-msgid "conversion lacks type at end of format"
+#: config/sparc/sparc.c:6681
+#, c-format
+msgid "invalid %%B operand"
msgstr ""
-#: c-format.c:1744
+#: config/sparc/sparc.c:6720
#, c-format
-msgid "unknown conversion type character %qc in format"
+msgid "invalid %%c operand"
msgstr ""
-#: c-format.c:1747
+#: config/sparc/sparc.c:6721
#, c-format
-msgid "unknown conversion type character 0x%x in format"
+msgid "invalid %%C operand"
msgstr ""
-#: c-format.c:1754
-msgid "%s does not support the %<%%%c%> %s format"
+#: config/sparc/sparc.c:6742
+#, c-format
+msgid "invalid %%d operand"
msgstr ""
-#: c-format.c:1770
-msgid "%s used with %<%%%c%> %s format"
+#: config/sparc/sparc.c:6743
+#, c-format
+msgid "invalid %%D operand"
msgstr ""
-#: c-format.c:1779
+#: config/sparc/sparc.c:6759
#, c-format
-msgid "%s does not support %s"
+msgid "invalid %%f operand"
msgstr ""
-#: c-format.c:1788
-msgid "%s does not support %s with the %<%%%c%> %s format"
+#: config/sparc/sparc.c:6773
+#, c-format
+msgid "invalid %%s operand"
msgstr ""
-#: c-format.c:1821
-msgid "%s ignored with %s and %<%%%c%> %s format"
+#: config/sparc/sparc.c:6827
+#, c-format
+msgid "long long constant not a valid immediate operand"
msgstr ""
-#: c-format.c:1825
+#: config/sparc/sparc.c:6830
#, c-format
-msgid "%s ignored with %s in %s format"
+msgid "floating point constant not a valid immediate operand"
msgstr ""
-#: c-format.c:1831
-msgid "use of %s and %s together with %<%%%c%> %s format"
+#: config/stormy16/stormy16.c:1802 config/stormy16/stormy16.c:1873
+#, c-format
+msgid "'B' operand is not constant"
msgstr ""
-#: c-format.c:1835
+#: config/stormy16/stormy16.c:1829
#, c-format
-msgid "use of %s and %s together in %s format"
+msgid "'B' operand has multiple bits set"
msgstr ""
-#: c-format.c:1854
-msgid "%<%%%c%> yields only last 2 digits of year in some locales"
+#: config/stormy16/stormy16.c:1855
+#, c-format
+msgid "'o' operand is not constant"
msgstr ""
-#: c-format.c:1857
-msgid "%<%%%c%> yields only last 2 digits of year"
+#: config/stormy16/stormy16.c:1887
+#, c-format
+msgid "xstormy16_print_operand: unknown code"
msgstr ""
-#. The end of the format string was reached.
-#: c-format.c:1873
-msgid "no closing %<]%> for %<%%[%> format"
+#: config/v850/v850.c:360
+msgid "const_double_split got a bad insn:"
+msgstr ""
+
+#: config/v850/v850.c:924
+msgid "output_move_single:"
msgstr ""
-#: c-format.c:1886
+#: config/xtensa/xtensa.c:748 config/xtensa/xtensa.c:780
+#: config/xtensa/xtensa.c:789
+msgid "bad test"
+msgstr ""
+
+#: config/xtensa/xtensa.c:1635
#, c-format
-msgid "use of %qs length modifier with %qc type character"
+msgid "invalid %%D value"
msgstr ""
-#: c-format.c:1907
-msgid "%s does not support the %<%%%s%c%> %s format"
+#: config/xtensa/xtensa.c:1672
+msgid "invalid mask"
msgstr ""
-#: c-format.c:1924
-msgid "operand number specified with suppressed assignment"
+#: config/xtensa/xtensa.c:1698
+#, c-format
+msgid "invalid %%x value"
msgstr ""
-#: c-format.c:1926
-msgid "operand number specified for format taking no argument"
+#: config/xtensa/xtensa.c:1705
+#, c-format
+msgid "invalid %%d value"
msgstr ""
-#: c-format.c:2068
+#: config/xtensa/xtensa.c:1726 config/xtensa/xtensa.c:1736
#, c-format
-msgid "writing through null pointer (argument %d)"
+msgid "invalid %%t/%%b value"
+msgstr ""
+
+#: config/xtensa/xtensa.c:1778
+msgid "invalid address"
+msgstr ""
+
+#: config/xtensa/xtensa.c:1803
+msgid "no register in address"
+msgstr ""
+
+#: config/xtensa/xtensa.c:1811
+msgid "address offset not a constant"
+msgstr ""
+
+#: cp/call.c:2428
+msgid "candidates are:"
msgstr ""
-#: c-format.c:2076
+#: cp/call.c:6186
+msgid "candidate 1:"
+msgstr ""
+
+#: cp/call.c:6187
+msgid "candidate 2:"
+msgstr ""
+
+#: cp/g++spec.c:238 java/jvspec.c:417
#, c-format
-msgid "reading through null pointer (argument %d)"
+msgid "argument to '%s' missing\n"
msgstr ""
-#: c-format.c:2096
+#: fortran/gfortranspec.c:231
#, c-format
-msgid "writing into constant object (argument %d)"
+msgid "overflowed output arg list for '%s'"
msgstr ""
-#: c-format.c:2107
+#: fortran/gfortranspec.c:375
#, c-format
-msgid "extra type qualifiers in format argument (argument %d)"
+msgid "argument to '%s' missing"
msgstr ""
-#: c-format.c:2218
-msgid "%s should have type %<%s%s%>, but argument %d has type %qT"
+#: fortran/gfortranspec.c:379
+#, c-format
+msgid "no input files; unwilling to write output files"
msgstr ""
-#: c-format.c:2221
-msgid "format %q.*s expects type %<%s%s%>, but argument %d has type %qT"
+#. FIXME: i18n bug here. Order of prints should not be
+#. fixed.
+#: java/gjavah.c:910
+#, c-format
+msgid "ignored method '"
msgstr ""
-#: c-format.c:2228
-msgid "%s should have type %<%T%s%>, but argument %d has type %qT"
+#: java/gjavah.c:912
+#, c-format
+msgid "' marked virtual\n"
msgstr ""
-#: c-format.c:2231
-msgid "format %q.*s expects type %<%T%s%>, but argument %d has type %qT"
+#: java/gjavah.c:2350
+#, c-format
+msgid "Try '"
msgstr ""
-#: c-format.c:2497
-msgid "args to be formatted is not %<...%>"
+#: java/gjavah.c:2350
+#, c-format
+msgid " --help' for more information.\n"
msgstr ""
-#: c-format.c:2506
-msgid "strftime formats cannot format arguments"
+#: java/gjavah.c:2357
+#, c-format
+msgid "Usage: "
msgstr ""
-#: c-gimplify.c:237
-msgid "statement with no effect"
+#: java/gjavah.c:2357
+#, c-format
+msgid ""
+" [OPTION]... CLASS...\n"
+"\n"
msgstr ""
-#: c-gimplify.c:315 c-typeck.c:6913 cp/parser.c:6566
-msgid "break statement not within loop or switch"
+#: java/gjavah.c:2358
+#, c-format
+msgid ""
+"Generate C or C++ header files from .class files\n"
+"\n"
msgstr ""
-#: c-gimplify.c:317
-msgid "continue statement not within loop or switch"
+#: java/gjavah.c:2359
+#, c-format
+msgid " -stubs Generate an implementation stub file\n"
msgstr ""
-#: c-incpath.c:70
+#: java/gjavah.c:2360
#, c-format
-msgid "ignoring duplicate directory \"%s\"\n"
+msgid " -jni Generate a JNI header or stub\n"
msgstr ""
-#: c-incpath.c:73
+#: java/gjavah.c:2361
#, c-format
-msgid " as it is a non-system directory that duplicates a system directory\n"
+msgid " -force Always overwrite output files\n"
msgstr ""
-#: c-incpath.c:77
+#: java/gjavah.c:2362
#, c-format
-msgid "ignoring nonexistent directory \"%s\"\n"
+msgid " -old Unused compatibility option\n"
msgstr ""
-#: c-incpath.c:286
+#: java/gjavah.c:2363
#, c-format
-msgid "#include \"...\" search starts here:\n"
+msgid " -trace Unused compatibility option\n"
msgstr ""
-#: c-incpath.c:290
+#: java/gjavah.c:2364
#, c-format
-msgid "#include <...> search starts here:\n"
+msgid " -J OPTION Unused compatibility option\n"
msgstr ""
-#: c-incpath.c:295
+#: java/gjavah.c:2366
#, c-format
-msgid "End of search list.\n"
+msgid " -add TEXT Insert TEXT into class body\n"
msgstr ""
-#: c-lex.c:260
-msgid "badly nested C headers from preprocessor"
+#: java/gjavah.c:2367
+#, c-format
+msgid " -append TEXT Insert TEXT after class declaration\n"
msgstr ""
-#: c-lex.c:308
-msgid "%Hignoring #pragma %s %s"
+#: java/gjavah.c:2368
+#, c-format
+msgid " -friend TEXT Insert TEXT as 'friend' declaration\n"
msgstr ""
-#. ... or not.
-#: c-lex.c:417
-msgid "%Hstray %<@%> in program"
+#: java/gjavah.c:2369
+#, c-format
+msgid " -prepend TEXT Insert TEXT before start of class\n"
msgstr ""
-#: c-lex.c:431
+#: java/gjavah.c:2371 java/jcf-dump.c:912
#, c-format
-msgid "stray %qs in program"
+msgid " --classpath PATH Set path to find .class files\n"
msgstr ""
-#: c-lex.c:441
+#: java/gjavah.c:2372 java/jcf-dump.c:913
#, c-format
-msgid "missing terminating %c character"
+msgid " -IDIR Append directory to class path\n"
msgstr ""
-#: c-lex.c:443
+#: java/gjavah.c:2373 java/jcf-dump.c:914
#, c-format
-msgid "stray %qc in program"
+msgid " --bootclasspath PATH Override built-in class path\n"
msgstr ""
-#: c-lex.c:445
-msgid "stray %<\\%o%> in program"
+#: java/gjavah.c:2374 java/jcf-dump.c:915
+#, c-format
+msgid " --extdirs PATH Set extensions directory path\n"
msgstr ""
-#: c-lex.c:606
-msgid "this decimal constant is unsigned only in ISO C90"
+#: java/gjavah.c:2375
+#, c-format
+msgid " -d DIRECTORY Set output directory name\n"
msgstr ""
-#: c-lex.c:609
-msgid "this decimal constant would be unsigned in ISO C90"
+#: java/gjavah.c:2376 java/jcf-dump.c:916 java/jv-scan.c:115
+#, c-format
+msgid " -o FILE Set output file name\n"
msgstr ""
-#: c-lex.c:625
+#: java/gjavah.c:2377
#, c-format
-msgid "integer constant is too large for %qs type"
+msgid " -td DIRECTORY Set temporary directory name\n"
msgstr ""
-#: c-lex.c:691
-msgid "floating constant exceeds range of %<%s%>"
+#: java/gjavah.c:2379 java/jcf-dump.c:918 java/jv-scan.c:117
+#, c-format
+msgid " --help Print this help, then exit\n"
msgstr ""
-#: c-lex.c:773
-msgid "traditional C rejects string constant concatenation"
+#: java/gjavah.c:2380 java/jcf-dump.c:919 java/jv-scan.c:118
+#, c-format
+msgid " --version Print version number, then exit\n"
msgstr ""
-#: c-objc-common.c:80
+#: java/gjavah.c:2381 java/jcf-dump.c:920
+#, c-format
+msgid " -v, --verbose Print extra information while running\n"
+msgstr ""
+
+#: java/gjavah.c:2383
+#, c-format
msgid ""
-"%Jfunction %qF can never be inlined because it is suppressed using -fno-"
-"inline"
+" -M Print all dependencies to stdout;\n"
+" suppress ordinary output\n"
msgstr ""
-#: c-objc-common.c:90
+#: java/gjavah.c:2385
+#, c-format
msgid ""
-"%Jfunction %qF can never be inlined because it might not be bound within "
-"this unit of translation"
+" -MM Print non-system dependencies to stdout;\n"
+" suppress ordinary output\n"
msgstr ""
-#: c-objc-common.c:98
+#: java/gjavah.c:2387
+#, c-format
+msgid " -MD Print all dependencies to stdout\n"
+msgstr ""
+
+#: java/gjavah.c:2388
+#, c-format
+msgid " -MMD Print non-system dependencies to stdout\n"
+msgstr ""
+
+#: java/gjavah.c:2391 java/jcf-dump.c:922 java/jv-scan.c:120
+#, c-format
msgid ""
-"%Jfunction %qF can never be inlined because it uses attributes conflicting "
-"with inlining"
+"For bug reporting instructions, please see:\n"
+"%s.\n"
msgstr ""
-#: c-opts.c:144
+#: java/gjavah.c:2575
#, c-format
-msgid "no class name specified with %qs"
+msgid "Processing %s\n"
msgstr ""
-#: c-opts.c:148
+#: java/gjavah.c:2585
#, c-format
-msgid "assertion missing after %qs"
+msgid "Found in %s\n"
msgstr ""
-#: c-opts.c:153
+#: java/jcf-dump.c:829
#, c-format
-msgid "macro name missing after %qs"
+msgid "Not a valid Java .class file.\n"
msgstr ""
-#: c-opts.c:162
+#: java/jcf-dump.c:835
#, c-format
-msgid "missing path after %qs"
+msgid "error while parsing constant pool\n"
msgstr ""
-#: c-opts.c:171
+#: java/jcf-dump.c:841 java/jcf-parse.c:749
+#, gcc-internal-format
+msgid "error in constant pool entry #%d\n"
+msgstr ""
+
+#: java/jcf-dump.c:851
#, c-format
-msgid "missing filename after %qs"
+msgid "error while parsing fields\n"
msgstr ""
-#: c-opts.c:176
+#: java/jcf-dump.c:857
#, c-format
-msgid "missing makefile target after %qs"
+msgid "error while parsing methods\n"
msgstr ""
-#: c-opts.c:303
-msgid "-I- specified twice"
+#: java/jcf-dump.c:863
+#, c-format
+msgid "error while parsing final attributes\n"
msgstr ""
-#: c-opts.c:306
-msgid "obsolete option -I- used, please use -iquote instead"
+#: java/jcf-dump.c:900
+#, c-format
+msgid "Try 'jcf-dump --help' for more information.\n"
msgstr ""
-#: c-opts.c:473
-msgid "argument %qs to %<-Wnormalized%> not recognized"
+#: java/jcf-dump.c:907
+#, c-format
+msgid ""
+"Usage: jcf-dump [OPTION]... CLASS...\n"
+"\n"
msgstr ""
-#: c-opts.c:553
+#: java/jcf-dump.c:908
#, c-format
-msgid "switch %qs is no longer supported"
+msgid ""
+"Display contents of a class file in readable form.\n"
+"\n"
+msgstr ""
+
+#: java/jcf-dump.c:909
+#, c-format
+msgid " -c Disassemble method bodies\n"
+msgstr ""
+
+#: java/jcf-dump.c:910
+#, c-format
+msgid " --javap Generate output in 'javap' format\n"
msgstr ""
-#: c-opts.c:666
+#: java/jcf-dump.c:950 java/jcf-dump.c:1018
+#, c-format
+msgid "jcf-dump: no classes specified\n"
+msgstr ""
+
+#: java/jcf-dump.c:1038
+#, c-format
+msgid "Cannot open '%s' for output.\n"
+msgstr ""
+
+#: java/jcf-dump.c:1084
+#, c-format
+msgid "bad format of .zip/.jar archive\n"
+msgstr ""
+
+#: java/jcf-dump.c:1202
+#, c-format
+msgid "Bad byte codes.\n"
+msgstr ""
+
+#: java/jv-scan.c:100
+#, c-format
+msgid "Try 'jv-scan --help' for more information.\n"
+msgstr ""
+
+#: java/jv-scan.c:107
+#, c-format
msgid ""
-"-fhandle-exceptions has been renamed -fexceptions (and is now on by default)"
+"Usage: jv-scan [OPTION]... FILE...\n"
+"\n"
msgstr ""
-#: c-opts.c:852
-msgid "output filename specified twice"
+#: java/jv-scan.c:108
+#, c-format
+msgid ""
+"Print useful information read from Java source files.\n"
+"\n"
msgstr ""
-#: c-opts.c:982
-msgid "-Wformat-y2k ignored without -Wformat"
+#: java/jv-scan.c:109
+#, c-format
+msgid " --no-assert Don't recognize the assert keyword\n"
msgstr ""
-#: c-opts.c:984
-msgid "-Wformat-extra-args ignored without -Wformat"
+#: java/jv-scan.c:110
+#, c-format
+msgid " --complexity Print cyclomatic complexity of input file\n"
msgstr ""
-#: c-opts.c:986
-msgid "-Wformat-zero-length ignored without -Wformat"
+#: java/jv-scan.c:111
+#, c-format
+msgid " --encoding NAME Specify encoding of input file\n"
msgstr ""
-#: c-opts.c:988
-msgid "-Wformat-nonliteral ignored without -Wformat"
+#: java/jv-scan.c:112
+#, c-format
+msgid " --print-main Print name of class containing 'main'\n"
msgstr ""
-#: c-opts.c:990
-msgid "-Wformat-security ignored without -Wformat"
+#: java/jv-scan.c:113
+#, c-format
+msgid " --list-class List all classes defined in file\n"
msgstr ""
-#: c-opts.c:992
-msgid "-Wmissing-format-attribute ignored without -Wformat"
+#: java/jv-scan.c:114
+#, c-format
+msgid ""
+" --list-filename Print input filename when listing class names\n"
msgstr ""
-#: c-opts.c:1011
+#: java/jv-scan.c:257
#, c-format
-msgid "opening output file %s: %m"
+msgid "%s: error: "
msgstr ""
-#: c-opts.c:1016
+#: java/jv-scan.c:269 java/jv-scan.c:280
#, c-format
-msgid "too many filenames given. Type %s --help for usage"
+msgid "%s: warning: "
msgstr ""
-#: c-opts.c:1099
-msgid "YYDEBUG was not defined at build time, -dy ignored"
+#: java/jvgenmain.c:48
+#, c-format
+msgid "Usage: %s [OPTIONS]... CLASSNAMEmain [OUTFILE]\n"
msgstr ""
-#: c-opts.c:1145
+#: java/jvgenmain.c:101
#, c-format
-msgid "opening dependency file %s: %m"
+msgid "%s: Cannot open output file: %s\n"
msgstr ""
-#: c-opts.c:1155
+#: java/jvgenmain.c:138
#, c-format
-msgid "closing dependency file %s: %m"
+msgid "%s: Failed to close output file %s\n"
msgstr ""
-#: c-opts.c:1158
+#: java/jvspec.c:420
#, c-format
-msgid "when writing output to %s: %m"
+msgid "can't specify '-D' without '--main'\n"
msgstr ""
-#: c-opts.c:1238
-msgid "to generate dependencies you must specify either -M or -MM"
+#: java/jvspec.c:423
+#, c-format
+msgid "'%s' is not a valid class name"
msgstr ""
-#: c-opts.c:1305
-msgid "<built-in>"
+#: java/jvspec.c:429
+#, c-format
+msgid "--resource requires -o"
msgstr ""
-#: c-opts.c:1320
-msgid "<command line>"
+#: java/jvspec.c:443
+#, c-format
+msgid "cannot specify both -C and -o"
msgstr ""
-#: c-opts.c:1403
-msgid "too late for # directive to set debug directory"
+#: java/jvspec.c:455
+#, c-format
+msgid "cannot create temporary file"
msgstr ""
-#: c-parser.c:971
-msgid "ISO C forbids an empty source file"
+#: java/jvspec.c:483
+#, c-format
+msgid "using both @FILE with multiple files not implemented"
msgstr ""
-#: c-parser.c:1056 c-parser.c:5721
-msgid "ISO C does not allow extra %<;%> outside of a function"
+#: java/jvspec.c:534
+#, c-format
+msgid "cannot specify 'main' class when not linking"
msgstr ""
-#: c-parser.c:1147
-msgid "expected declaration specifiers"
+#: java/parse-scan.y:878 java/parse.y:959
+#: java/parse.y:1300 java/parse.y:1361
+#: java/parse.y:1569 java/parse.y:1792
+#: java/parse.y:1801 java/parse.y:1812
+#: java/parse.y:1823 java/parse.y:1835
+#: java/parse.y:1850 java/parse.y:1867
+#: java/parse.y:1869 java/parse.y:1950
+#: java/parse.y:2127 java/parse.y:2196
+#: java/parse.y:2360 java/parse.y:2373
+#: java/parse.y:2380 java/parse.y:2387
+#: java/parse.y:2398 java/parse.y:2400
+#: java/parse.y:2438 java/parse.y:2440
+#: java/parse.y:2442 java/parse.y:2463
+#: java/parse.y:2465 java/parse.y:2467
+#: java/parse.y:2483 java/parse.y:2485
+#: java/parse.y:2506 java/parse.y:2508
+#: java/parse.y:2510 java/parse.y:2538
+#: java/parse.y:2540 java/parse.y:2542
+#: java/parse.y:2544 java/parse.y:2562
+#: java/parse.y:2564 java/parse.y:2575
+#: java/parse.y:2586 java/parse.y:2597
+#: java/parse.y:2608 java/parse.y:2619
+#: java/parse.y:2632 java/parse.y:2636
+#: java/parse.y:2638 java/parse.y:2651
+msgid "Missing term"
msgstr ""
-#: c-parser.c:1195
-msgid "data definition has no type or storage class"
+#: java/parse-scan.y:880 java/parse.y:739
+#: java/parse.y:777 java/parse.y:802
+#: java/parse.y:980 java/parse.y:1335
+#: java/parse.y:1545 java/parse.y:1547
+#: java/parse.y:1777 java/parse.y:1803
+#: java/parse.y:1814 java/parse.y:1825
+#: java/parse.y:1837 java/parse.y:1852
+msgid "';' expected"
msgstr ""
-#: c-parser.c:1249
-msgid "expected %<,%> or %<;%>"
+#: java/parse-scan.y:1371 java/parse.y:16419
+msgid "parse error"
msgstr ""
-#. This can appear in many cases looking nothing like a
-#. function definition, so we don't give a more specific
-#. error suggesting there was one.
-#: c-parser.c:1256 c-parser.c:1273
-msgid "expected %<=%>, %<,%>, %<;%>, %<asm%> or %<__attribute__%>"
+#: java/parse-scan.y:1373 java/parse.y:16421
+msgid "parse error; also virtual memory exhausted"
msgstr ""
-#: c-parser.c:1265
-msgid "ISO C forbids nested functions"
+#: java/parse-scan.y:1375 java/parse.y:16423
+msgid "parse error: cannot back up"
msgstr ""
-#: c-parser.c:1611 c-parser.c:2373 c-parser.c:2974 c-parser.c:3208
-#: c-parser.c:3991 c-parser.c:4573 c-parser.c:4966 c-parser.c:4986
-#: c-parser.c:5101 c-parser.c:5246 c-parser.c:5262 c-parser.c:5374
-#: c-parser.c:5386 c-parser.c:5411 c-parser.c:5539 c-parser.c:5568
-#: c-parser.c:5576 c-parser.c:5604 c-parser.c:5618 c-parser.c:5825
-#: c-parser.c:5926
-msgid "expected identifier"
+#: java/parse.y:737 java/parse.y:775
+msgid "Missing name"
msgstr ""
-#: c-parser.c:1637 cp/parser.c:10012
-msgid "comma at end of enumerator list"
+#: java/parse.y:800
+msgid "'*' expected"
msgstr ""
-#: c-parser.c:1643
-msgid "expected %<,%> or %<}%>"
+#: java/parse.y:814
+msgid "Class or interface declaration expected"
msgstr ""
-#: c-parser.c:1657 c-parser.c:1827
-msgid "expected %<{%>"
+#: java/parse.y:851 java/parse.y:853
+msgid "Missing class name"
msgstr ""
-#: c-parser.c:1666
-msgid "ISO C forbids forward references to %<enum%> types"
+#: java/parse.y:856 java/parse.y:860
+#: java/parse.y:868 java/parse.y:1020
+#: java/parse.y:1281 java/parse.y:1283
+#: java/parse.y:1612 java/parse.y:1863
+#: java/parse.y:1895 java/parse.y:1957
+msgid "'{' expected"
msgstr ""
-#: c-parser.c:1769
-msgid "expected class name"
+#: java/parse.y:870
+msgid "Missing super class name"
msgstr ""
-#: c-parser.c:1788 c-parser.c:5478
-msgid "extra semicolon in struct or union specified"
+#: java/parse.y:880 java/parse.y:896
+msgid "Missing interface name"
msgstr ""
-#: c-parser.c:1810
-msgid "no semicolon at end of struct or union"
+#: java/parse.y:974
+msgid "Missing variable initializer"
msgstr ""
-#: c-parser.c:1813
-msgid "expected %<;%>"
+#: java/parse.y:991
+msgid "Invalid declaration"
msgstr ""
-#: c-parser.c:1890 c-parser.c:2815
-msgid "expected specifier-qualifier-list"
+#: java/parse.y:994 java/parse.y:1079
+#: java/parse.y:2142 java/parse.y:2171
+#: java/parse.y:2193 java/parse.y:2197
+#: java/parse.y:2232 java/parse.y:2311
+#: java/parse.y:2321 java/parse.y:2331
+msgid "']' expected"
msgstr ""
-#: c-parser.c:1900
-msgid "ISO C forbids member declarations with no members"
+#: java/parse.y:998
+msgid "Unbalanced ']'"
msgstr ""
-#: c-parser.c:1969
-msgid "expected %<,%>, %<;%> or %<}%>"
+#: java/parse.y:1034
+msgid "Invalid method declaration, method name required"
msgstr ""
-#: c-parser.c:1976
-msgid "expected %<:%>, %<,%>, %<;%>, %<}%> or %<__attribute__%>"
+#: java/parse.y:1039 java/parse.y:1044
+#: java/parse.y:1049 java/parse.y:2045
+msgid "Identifier expected"
msgstr ""
-#: c-parser.c:2025
-msgid "%<typeof%> applied to a bit-field"
+#: java/parse.y:1054 java/parse.y:4721
+#, gcc-internal-format
+msgid "Invalid method declaration, return type required"
msgstr ""
-#: c-parser.c:2244
-msgid "expected identifier or %<(%>"
+#: java/parse.y:1077 java/parse.y:1525
+#: java/parse.y:1532 java/parse.y:1541
+#: java/parse.y:1543 java/parse.y:1571
+#: java/parse.y:1680 java/parse.y:1987
+#: java/parse.y:2040
+msgid "')' expected"
msgstr ""
-#: c-parser.c:2436
-msgid "ISO C requires a named argument before %<...%>"
+#: java/parse.y:1093
+msgid "Missing formal parameter term"
msgstr ""
-#: c-parser.c:2537
-msgid "expected declaration specifiers or %<...%>"
+#: java/parse.y:1108 java/parse.y:1113
+msgid "Missing identifier"
msgstr ""
-#: c-parser.c:2587
-msgid "wide string literal in %<asm%>"
+#: java/parse.y:1133 java/parse.y:1142
+msgid "Missing class type term"
msgstr ""
-#: c-parser.c:2593
-msgid "expected string literal"
+#: java/parse.y:1298
+msgid "Invalid interface type"
msgstr ""
-#: c-parser.c:2900
-msgid "ISO C forbids empty initializer braces"
+#: java/parse.y:1485 java/parse.y:1659
+#: java/parse.y:1661
+msgid "':' expected"
msgstr ""
-#: c-parser.c:2945
-msgid "obsolete use of designated initializer with %<:%>"
+#: java/parse.y:1511 java/parse.y:1516
+#: java/parse.y:1521
+msgid "Invalid expression statement"
msgstr ""
-#: c-parser.c:3067
-msgid "ISO C forbids specifying range of elements to initialize"
+#: java/parse.y:1539 java/parse.y:1567
+#: java/parse.y:1608 java/parse.y:1676
+#: java/parse.y:1744 java/parse.y:1865
+#: java/parse.y:1943 java/parse.y:2034
+#: java/parse.y:2036 java/parse.y:2049
+#: java/parse.y:2292 java/parse.y:2294
+msgid "'(' expected"
msgstr ""
-#: c-parser.c:3080
-msgid "ISO C90 forbids specifying subobject to initialize"
+#: java/parse.y:1610
+msgid "Missing term or ')'"
msgstr ""
-#: c-parser.c:3088
-msgid "obsolete use of designated initializer without %<=%>"
+#: java/parse.y:1657
+msgid "Missing or invalid constant expression"
msgstr ""
-#: c-parser.c:3096
-msgid "expected %<=%>"
+#: java/parse.y:1678
+msgid "Missing term and ')' expected"
msgstr ""
-#: c-parser.c:3227
-msgid "ISO C forbids label declarations"
+#: java/parse.y:1717
+msgid "Invalid control expression"
msgstr ""
-#: c-parser.c:3232 c-parser.c:3241
-msgid "expected declaration or statement"
+#: java/parse.y:1719 java/parse.y:1721
+msgid "Invalid update expression"
msgstr ""
-#: c-parser.c:3261 c-parser.c:3289
-msgid "%HISO C90 forbids mixed declarations and code"
+#: java/parse.y:1746
+msgid "Invalid init statement"
msgstr ""
-#: c-parser.c:3305
-msgid "label at end of compound statement"
+#: java/parse.y:1946
+msgid "Missing term or ')' expected"
msgstr ""
-#: c-parser.c:3348
-msgid "expected %<:%> or %<...%>"
+#: java/parse.y:1989
+msgid "'class' or 'this' expected"
msgstr ""
-#: c-parser.c:3484
-msgid "expected identifier or %<*%>"
+#: java/parse.y:1991 java/parse.y:1993
+msgid "'class' expected"
msgstr ""
-#. Avoid infinite loop in error recovery:
-#. c_parser_skip_until_found stops at a closing nesting
-#. delimiter without consuming it, but here we need to consume
-#. it to proceed further.
-#: c-parser.c:3546
-msgid "expected statement"
+#: java/parse.y:2038
+msgid "')' or term expected"
msgstr ""
-#: c-parser.c:3879
-#, c-format
-msgid "%E qualifier ignored on asm"
+#: java/parse.y:2140 java/parse.y:2169
+msgid "'[' expected"
msgstr ""
-#: c-parser.c:4152
-msgid "ISO C forbids omitting the middle term of a ?: expression"
+#: java/parse.y:2247
+msgid "Field expected"
msgstr ""
-#: c-parser.c:4534
-msgid "traditional C rejects the unary plus operator"
+#: java/parse.y:2306 java/parse.y:2316
+#: java/parse.y:2326
+msgid "Missing term and ']' expected"
msgstr ""
-#: c-parser.c:4659
-msgid "%<sizeof%> applied to a bit-field"
+#: java/parse.y:2431
+msgid "']' expected, invalid type expression"
msgstr ""
-#: c-parser.c:4802 c-parser.c:5143 c-parser.c:5165
-msgid "expected expression"
+#: java/parse.y:2434
+msgid "Invalid type expression"
msgstr ""
-#: c-parser.c:4828
-msgid "braced-group within expression allowed only inside a function"
+#: java/parse.y:2546
+msgid "Invalid reference type"
msgstr ""
-#: c-parser.c:4842
-msgid "ISO C forbids braced-groups within expressions"
+#: java/parse.y:3017
+msgid "Constructor invocation must be first thing in a constructor"
msgstr ""
-#: c-parser.c:5025
-msgid "first argument to %<__builtin_choose_expr%> not a constant"
+#: java/parse.y:3019
+msgid "Only constructors can invoke constructors"
msgstr ""
-#: c-parser.c:5192
-msgid "compound literal has variable size"
+#: config/mcore/mcore.h:57
+msgid "the m210 does not have little endian support"
msgstr ""
-#: c-parser.c:5200
-msgid "ISO C90 forbids compound literals"
+#: ada/lang-specs.h:34 java/jvspec.c:80 gcc.c:783
+msgid "-pg and -fomit-frame-pointer are incompatible"
msgstr ""
-#: c-parser.c:5689
-msgid "extra semicolon in method definition specified"
+#: ada/lang-specs.h:35
+msgid "-c or -S required for Ada"
msgstr ""
-#: c-pch.c:130
-msgid "can%'t create precompiled header %s: %m"
+#: config/i386/sco5.h:189
+msgid "-pg not supported on this platform"
msgstr ""
-#: c-pch.c:158
-msgid "can%'t write to %s: %m"
+#: config/i386/sco5.h:190
+msgid "-p and -pp specified - pick one"
msgstr ""
-#: c-pch.c:164
-#, c-format
-msgid "%qs is not a valid output file"
+#: config/i386/sco5.h:264
+msgid "-G and -static are mutually exclusive"
msgstr ""
-#: c-pch.c:193 c-pch.c:208 c-pch.c:222
-msgid "can%'t write %s: %m"
+#: config/i386/cygwin.h:29
+msgid "mno-cygwin and mno-win32 are not compatible"
msgstr ""
-#: c-pch.c:198 c-pch.c:215
-msgid "can%'t seek in %s: %m"
+#: config/i386/cygwin.h:70 config/i386/mingw32.h:58
+msgid "shared and mdll are not compatible"
msgstr ""
-#: c-pch.c:206 c-pch.c:248 c-pch.c:276 c-pch.c:281 c-pch.c:365
-msgid "can%'t read %s: %m"
+#: config/vax/netbsd-elf.h:42
+msgid "The -shared option is not currently supported for VAX ELF."
msgstr ""
-#: c-pch.c:483
-msgid "malformed #pragma GCC pch_preprocess, ignored"
+#: config/arm/arm.h:141
+msgid "-msoft-float and -mhard_float may not be used together"
msgstr ""
-#: c-pch.c:489
-msgid "pch_preprocess pragma should only be used with -fpreprocessed"
+#: config/arm/arm.h:143
+msgid "-mbig-endian and -mlittle-endian may not be used together"
msgstr ""
-#: c-pch.c:490
-msgid "use #include instead"
+#: config/vax/vax.h:50 config/vax/vax.h:51
+msgid "profiling not supported with -mg\n"
msgstr ""
-#: c-pch.c:498
-msgid "%s: couldn%'t open PCH file: %m\n"
+#: config/darwin.h:233
+msgid "-current_version only allowed with -dynamiclib"
msgstr ""
-#: c-pch.c:503
-msgid "use -Winvalid-pch for more information"
+#: config/darwin.h:235
+msgid "-install_name only allowed with -dynamiclib"
msgstr ""
-#: c-pch.c:504
-#, c-format
-msgid "%s: PCH file was invalid"
+#: config/darwin.h:240
+msgid "-bundle not allowed with -dynamiclib"
msgstr ""
-#: c-pragma.c:98
-msgid "#pragma pack (pop) encountered without matching #pragma pack (push)"
+#: config/darwin.h:241
+msgid "-bundle_loader not allowed with -dynamiclib"
msgstr ""
-#: c-pragma.c:111
-#, c-format
-msgid ""
-"#pragma pack(pop, %s) encountered without matching #pragma pack(push, %s)"
+#: config/darwin.h:242
+msgid "-client_name not allowed with -dynamiclib"
msgstr ""
-#: c-pragma.c:125
-msgid "#pragma pack(push[, id], <n>) is not supported on this target"
+#: config/darwin.h:247
+msgid "-force_flat_namespace not allowed with -dynamiclib"
msgstr ""
-#: c-pragma.c:127
-msgid "#pragma pack(pop[, id], <n>) is not supported on this target"
+#: config/darwin.h:249
+msgid "-keep_private_externs not allowed with -dynamiclib"
msgstr ""
-#: c-pragma.c:148
-msgid "missing %<(%> after %<#pragma pack%> - ignored"
+#: config/darwin.h:250
+msgid "-private_bundle not allowed with -dynamiclib"
msgstr ""
-#: c-pragma.c:161 c-pragma.c:201
-msgid "malformed %<#pragma pack%> - ignored"
+#: config/rs6000/darwin.h:105
+msgid " conflicting code gen style switches are used"
msgstr ""
-#: c-pragma.c:166
-msgid "malformed %<#pragma pack(push[, id][, <n>])%> - ignored"
+#: config/mips/mips.h:842 config/arc/arc.h:63
+msgid "may not use both -EB and -EL"
msgstr ""
-#: c-pragma.c:168
-msgid "malformed %<#pragma pack(pop[, id])%> - ignored"
+#: config/sparc/linux64.h:206 config/sparc/linux64.h:217
+#: config/sparc/netbsd-elf.h:126 config/sparc/netbsd-elf.h:145
+#: config/sparc/sol2-bi.h:195 config/sparc/sol2-bi.h:205
+msgid "may not use both -m32 and -m64"
msgstr ""
-#: c-pragma.c:177
-msgid "unknown action %qs for %<#pragma pack%> - ignored"
+#: config/sparc/sol2-bi.h:167 config/sparc/sol2-bi.h:172
+#: config/sparc/sol2-gld-bi.h:17 config/sparc/sol2-gld-bi.h:22
+msgid "does not support multilib"
msgstr ""
-#: c-pragma.c:204
-msgid "junk at end of %<#pragma pack%>"
+#: config/mips/r3900.h:35
+msgid "-mhard-float not supported"
msgstr ""
-#: c-pragma.c:207
-msgid "#pragma pack has no effect with -fpack-struct - ignored"
+#: config/mips/r3900.h:37
+msgid "-msingle-float and -msoft-float cannot both be specified"
msgstr ""
-#: c-pragma.c:227
-#, c-format
-msgid "alignment must be a small power of two, not %d"
+#: config/lynx.h:71
+msgid "Cannot use mthreads and mlegacy-threads together."
msgstr ""
-#: c-pragma.c:260
-msgid ""
-"%Japplying #pragma weak %qD after first use results in unspecified behavior"
+#: config/lynx.h:96
+msgid "Cannot use mshared and static together."
msgstr ""
-#: c-pragma.c:334 c-pragma.c:339
-msgid "malformed #pragma weak, ignored"
+#: config/sh/sh.h:460
+msgid "SH2a does not support little-endian"
msgstr ""
-#: c-pragma.c:343
-msgid "junk at end of #pragma weak"
+#: gcc.c:756
+msgid "GCC does not support -C or -CC without -E"
msgstr ""
-#: c-pragma.c:411 c-pragma.c:413
-msgid "malformed #pragma redefine_extname, ignored"
+#: gcc.c:951
+msgid "-E or -x required when input is from standard input"
msgstr ""
-#: c-pragma.c:416
-msgid "junk at end of #pragma redefine_extname"
+#: java/lang-specs.h:34
+msgid "-fjni and -femit-class-files are incompatible"
msgstr ""
-#: c-pragma.c:421
-msgid "#pragma redefine_extname not supported on this target"
+#: java/lang-specs.h:35
+msgid "-fjni and -femit-class-file are incompatible"
msgstr ""
-#: c-pragma.c:438 c-pragma.c:524
-msgid "#pragma redefine_extname ignored due to conflict with previous rename"
+#: java/lang-specs.h:36 java/lang-specs.h:37
+msgid "-femit-class-file should used along with -fsyntax-only"
+msgstr ""
+
+#: config/i386/nwld.h:34
+msgid "Static linking is not supported.\n"
+msgstr ""
+
+#: fortran/lang.opt:30
+msgid "Add a directory for INCLUDE and MODULE searching"
+msgstr ""
+
+#: fortran/lang.opt:34
+msgid "Put MODULE files in 'directory'"
+msgstr ""
+
+#: fortran/lang.opt:42
+msgid "Warn about possible aliasing of dummy arguments"
+msgstr ""
+
+#: fortran/lang.opt:46
+msgid "Warn about implicit conversion"
+msgstr ""
+
+#: fortran/lang.opt:50
+msgid "Warn about calls with implicit interface"
+msgstr ""
+
+#: fortran/lang.opt:54
+msgid "Warn about truncated source lines"
+msgstr ""
+
+#: fortran/lang.opt:58
+msgid "Warn about usage of non-standard intrinsics"
+msgstr ""
+
+#: fortran/lang.opt:62
+msgid "Warn about \"suspicious\" constructs"
+msgstr ""
+
+#: fortran/lang.opt:66
+msgid "Warn about underflow of numerical constant expressions"
msgstr ""
-#: c-pragma.c:461
+#: fortran/lang.opt:70 common.opt:154
+msgid "Warn when a label is unused"
+msgstr ""
+
+#: fortran/lang.opt:74
+msgid "Set the default double precision kind to an 8 byte wide type"
+msgstr ""
+
+#: fortran/lang.opt:78
+msgid "Set the default integer kind to an 8 byte wide type"
+msgstr ""
+
+#: fortran/lang.opt:82
+msgid "Set the default real kind to an 8 byte wide type"
+msgstr ""
+
+#: fortran/lang.opt:86
+msgid "Allow dollar signs in entity names"
+msgstr ""
+
+#: fortran/lang.opt:90
+msgid "Display the code tree after parsing."
+msgstr ""
+
+#: fortran/lang.opt:94
+msgid "Use f2c calling convention."
+msgstr ""
+
+#: fortran/lang.opt:98
+msgid "Assume that the source file is fixed form"
+msgstr ""
+
+#: fortran/lang.opt:102
+msgid "Assume that the source file is free form"
+msgstr ""
+
+#: fortran/lang.opt:106
+msgid "Append underscores to externally visible names"
+msgstr ""
+
+#: fortran/lang.opt:110
+msgid "Append a second underscore if the name already contains an underscore"
+msgstr ""
+
+#: fortran/lang.opt:114
msgid ""
-"#pragma redefine_extname ignored due to conflict with previous #pragma "
-"redefine_extname"
+"Specify that no implicit typing is allowed, unless overridden by explicit "
+"IMPLICIT statements"
msgstr ""
-#: c-pragma.c:480
-msgid "malformed #pragma extern_prefix, ignored"
+#: fortran/lang.opt:118
+msgid "Allow arbitrary character line width in fixed mode"
msgstr ""
-#: c-pragma.c:483
-msgid "junk at end of #pragma extern_prefix"
+#: fortran/lang.opt:122
+msgid "Use n as character line width in fixed mode"
msgstr ""
-#: c-pragma.c:489
-msgid "#pragma extern_prefix not supported on this target"
+#: fortran/lang.opt:126
+msgid "Maximum identifier length."
msgstr ""
-#: c-pragma.c:515
-msgid "asm declaration ignored due to conflict with previous rename"
+#: fortran/lang.opt:130
+msgid "Size in bytes of the largest array that will be put on the stack"
+msgstr ""
+
+#: fortran/lang.opt:134
+msgid "Set default accessibility of module entities to PRIVATE"
+msgstr ""
+
+#: fortran/lang.opt:138
+msgid "Don't generate code, just do syntax and semantics checking"
+msgstr ""
+
+#: fortran/lang.opt:142
+msgid "Try to layout derived types as compact as possible"
+msgstr ""
+
+#: fortran/lang.opt:146
+msgid "Copy array sections into a contiguous block on procedure entry"
msgstr ""
-#: c-pragma.c:546
+#: fortran/lang.opt:150
+msgid "Set the kind for a real with the 'q' exponent to 'n'"
+msgstr ""
+
+#: fortran/lang.opt:154
+msgid "Conform to the ISO Fortran 95 standard."
+msgstr ""
+
+#: fortran/lang.opt:158
+msgid "Conform to the ISO Fortran 2003 standard."
+msgstr ""
+
+#: fortran/lang.opt:162
+msgid "Conform nothing in particular."
+msgstr ""
+
+#: fortran/lang.opt:166
+msgid "Accept extensions to support legacy code."
+msgstr ""
+
+#: common.opt:28
+msgid "Display this information"
+msgstr ""
+
+#: common.opt:32
msgid ""
-"#pragma redefine_extname ignored due to conflict with __asm__ declaration"
+"Set parameter <param> to value. See below for a complete list of parameters"
msgstr ""
-#: c-pragma.c:606
-msgid "#pragma GCC visibility must be followed by push or pop"
+#: common.opt:42
+msgid ""
+"Put global and static data smaller than <number> bytes into a special "
+"section (on some targets)"
msgstr ""
-#: c-pragma.c:613
-msgid "No matching push for %<#pragma GCC visibility pop%>"
+#: common.opt:46
+msgid "Set optimization level to <number>"
msgstr ""
-#: c-pragma.c:624 c-pragma.c:653
-msgid "missing %<(%> after %<#pragma GCC visibility push%> - ignored"
+#: common.opt:50
+msgid "Optimize for space rather than speed"
msgstr ""
-#: c-pragma.c:628
-msgid "malformed #pragma GCC visibility push"
+#: common.opt:54
+msgid "This switch is deprecated; use -Wextra instead"
msgstr ""
-#: c-pragma.c:632
-msgid "No more than sixteen #pragma GCC visibility pushes allowed at once"
+#: common.opt:58
+msgid "Warn about returning structures, unions or arrays"
+msgstr ""
+
+#: common.opt:62
+msgid "Warn about inappropriate attribute usage"
+msgstr ""
+
+#: common.opt:66
+msgid "Warn about pointer casts which increase alignment"
msgstr ""
-#: c-pragma.c:648
+#: common.opt:70
+msgid "Warn about uses of __attribute__((deprecated)) declarations"
+msgstr ""
+
+#: common.opt:74
+msgid "Warn when an optimization pass is disabled"
+msgstr ""
+
+#: common.opt:78
+msgid "Treat all warnings as errors"
+msgstr ""
+
+#: common.opt:82
+msgid "Print extra (possibly unwanted) warnings"
+msgstr ""
+
+#: common.opt:86
+msgid "Exit on the first error occurred"
+msgstr ""
+
+#: common.opt:90
+msgid "Warn when an inlined function cannot be inlined"
+msgstr ""
+
+#: common.opt:94
+msgid "Warn if an object is larger than <number> bytes"
+msgstr ""
+
+#: common.opt:98
msgid ""
-"#pragma GCC visibility push() must specify default, internal, hidden or "
-"protected"
+"Warn about functions which might be candidates for __attribute__((noreturn))"
msgstr ""
-#: c-pragma.c:657
-msgid "junk at end of %<#pragma GCC visibility%>"
+#: common.opt:102
+msgid "Warn when the packed attribute has no effect on struct layout"
msgstr ""
-#: c-typeck.c:143
-msgid "%qD has an incomplete type"
+#: common.opt:106
+msgid "Warn when padding is required to align structure members"
msgstr ""
-#: c-typeck.c:164 cp/call.c:2679
-msgid "invalid use of void expression"
+#: common.opt:110
+msgid "Warn when one local variable shadows another"
msgstr ""
-#: c-typeck.c:172
-msgid "invalid use of flexible array member"
+#: common.opt:114 common.opt:118
+msgid "Warn about code which might break strict aliasing rules"
msgstr ""
-#: c-typeck.c:178
-msgid "invalid use of array with unspecified bounds"
+#: common.opt:122
+msgid "Warn about enumerated switches, with no default, missing a case"
msgstr ""
-#: c-typeck.c:186
-msgid "invalid use of undefined type %<%s %E%>"
+#: common.opt:126
+msgid "Warn about enumerated switches missing a \"default:\" statement"
msgstr ""
-#. If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL.
-#: c-typeck.c:190
-msgid "invalid use of incomplete typedef %qD"
+#: common.opt:130
+msgid "Warn about all enumerated switches missing a specific case"
msgstr ""
-#: c-typeck.c:396 c-typeck.c:421
-msgid "function types not truly compatible in ISO C"
+#: common.opt:134 c.opt:379
+msgid "Do not suppress warnings from system headers"
msgstr ""
-#: c-typeck.c:805
-msgid "types are not quite compatible"
+#: common.opt:138
+msgid "Warn about uninitialized automatic variables"
msgstr ""
-#: c-typeck.c:1047
-msgid "function return types not compatible due to %<volatile%>"
+#: common.opt:142
+msgid "Warn about code that will never be executed"
msgstr ""
-#: c-typeck.c:1206 c-typeck.c:2459
-msgid "arithmetic on pointer to an incomplete type"
+#: common.opt:146
+msgid "Enable all -Wunused- warnings"
msgstr ""
-#: c-typeck.c:1575
-msgid "%qT has no member named %qE"
+#: common.opt:150
+msgid "Warn when a function is unused"
msgstr ""
-#: c-typeck.c:1610
-#, c-format
-msgid "request for member %qE in something not a structure or union"
+#: common.opt:158
+msgid "Warn when a function parameter is unused"
msgstr ""
-#: c-typeck.c:1644
-msgid "dereferencing pointer to incomplete type"
+#: common.opt:162
+msgid "Warn when an expression value is unused"
msgstr ""
-#: c-typeck.c:1648
-msgid "dereferencing %<void *%> pointer"
+#: common.opt:166
+msgid "Warn when a variable is unused"
msgstr ""
-#: c-typeck.c:1665 cp/typeck.c:2109
-#, c-format
-msgid "invalid type argument of %qs"
+#: common.opt:170
+msgid "Emit declaration information into <file>"
msgstr ""
-#: c-typeck.c:1693 cp/typeck.c:2260
-msgid "subscripted value is neither array nor pointer"
+#: common.opt:183
+msgid "Enable dumps from specific passes of the compiler"
msgstr ""
-#: c-typeck.c:1704 cp/typeck.c:2179 cp/typeck.c:2265
-msgid "array subscript is not an integer"
+#: common.opt:187
+msgid "Set the file basename to be used for dumps"
msgstr ""
-#: c-typeck.c:1710
-msgid "subscripted value is pointer to function"
+#: common.opt:205
+msgid "Align the start of functions"
msgstr ""
-#: c-typeck.c:1723 cp/typeck.c:2175
-msgid "array subscript has type %<char%>"
+#: common.opt:212
+msgid "Align labels which are only reached by jumping"
msgstr ""
-#: c-typeck.c:1763
-msgid "ISO C forbids subscripting %<register%> array"
+#: common.opt:219
+msgid "Align all labels"
msgstr ""
-#: c-typeck.c:1765
-msgid "ISO C90 forbids subscripting non-lvalue array"
+#: common.opt:226
+msgid "Align the start of loops"
msgstr ""
-#: c-typeck.c:2003
-#, c-format
-msgid "called object %qE is not a function"
+#: common.opt:239
+msgid "Specify that arguments may alias each other and globals"
msgstr ""
-#. This situation leads to run-time undefined behavior. We can't,
-#. therefore, simply error unless we can prove that all possible
-#. executions of the program must execute the code.
-#: c-typeck.c:2035
-msgid "function called through a non-compatible type"
+#: common.opt:243
+msgid "Assume arguments may alias globals but not each other"
msgstr ""
-#: c-typeck.c:2082 c-typeck.c:4344 c-typeck.c:4346 c-typeck.c:4354
-#: c-typeck.c:4379 c-typeck.c:5745
-msgid "initializer element is not constant"
+#: common.opt:247
+msgid "Assume arguments alias neither each other nor globals"
msgstr ""
-#: c-typeck.c:2144
-#, c-format
-msgid "too many arguments to function %qE"
+#: common.opt:251
+msgid "Generate unwind tables that are exact at each instruction boundary"
msgstr ""
-#: c-typeck.c:2167
-#, c-format
-msgid "type of formal parameter %d is incomplete"
+#: common.opt:259
+msgid "Generate code to check bounds before indexing arrays"
msgstr ""
-#: c-typeck.c:2180
-#, c-format
+#: common.opt:263
+msgid "Replace add, compare, branch with branch on count register"
+msgstr ""
+
+#: common.opt:267
+msgid "Use profiling information for branch probabilities"
+msgstr ""
+
+#: common.opt:271
msgid ""
-"passing argument %d of %qE as integer rather than floating due to prototype"
+"Perform branch target load optimization before prologue / epilogue threading"
msgstr ""
-#: c-typeck.c:2185
-#, c-format
+#: common.opt:275
msgid ""
-"passing argument %d of %qE as integer rather than complex due to prototype"
+"Perform branch target load optimization after prologue / epilogue threading"
msgstr ""
-#: c-typeck.c:2190
-#, c-format
+#: common.opt:279
msgid ""
-"passing argument %d of %qE as complex rather than floating due to prototype"
+"Restrict target load migration not to re-use registers in any basic block"
msgstr ""
-#: c-typeck.c:2195
-#, c-format
+#: common.opt:283
+msgid "Mark <register> as being preserved across functions"
+msgstr ""
+
+#: common.opt:287
+msgid "Mark <register> as being corrupted by function calls"
+msgstr ""
+
+#: common.opt:294
+msgid "Save registers around function calls"
+msgstr ""
+
+#: common.opt:298
+msgid "Do not put uninitialized globals in the common section"
+msgstr ""
+
+#: common.opt:302
+msgid "Perform a register copy-propagation optimization pass"
+msgstr ""
+
+#: common.opt:306
+msgid "Perform cross-jumping optimization"
+msgstr ""
+
+#: common.opt:310
+msgid "When running CSE, follow jumps to their targets"
+msgstr ""
+
+#: common.opt:314
+msgid "When running CSE, follow conditional jumps"
+msgstr ""
+
+#: common.opt:318
+msgid "Omit range reduction step when performing complex division"
+msgstr ""
+
+#: common.opt:322
+msgid "Place data items into their own section"
+msgstr ""
+
+#: common.opt:328
+msgid "Defer popping functions args from stack until later"
+msgstr ""
+
+#: common.opt:332
+msgid "Attempt to fill delay slots of branch instructions"
+msgstr ""
+
+#: common.opt:336
+msgid "Delete useless null pointer checks"
+msgstr ""
+
+#: common.opt:340
msgid ""
-"passing argument %d of %qE as floating rather than integer due to prototype"
+"How often to emit source location at the beginning of line-wrapped "
+"diagnostics"
msgstr ""
-#: c-typeck.c:2200
-#, c-format
+#: common.opt:344
msgid ""
-"passing argument %d of %qE as complex rather than integer due to prototype"
+"Amend appropriate diagnostic messages with the command line option that "
+"controls them."
msgstr ""
-#: c-typeck.c:2205
-#, c-format
+#: common.opt:348
+msgid "Dump various compiler internals to a file"
+msgstr ""
+
+#: common.opt:352
msgid ""
-"passing argument %d of %qE as floating rather than complex due to prototype"
+"Suppress output of instruction numbers and line number notes in debugging "
+"dumps"
msgstr ""
-#: c-typeck.c:2217
+#: common.opt:356
+msgid "Perform DWARF2 duplicate elimination"
+msgstr ""
+
+#: common.opt:360 common.opt:364
+msgid "Perform unused type elimination in debug info"
+msgstr ""
+
+#: common.opt:368
+msgid "Enable exception handling"
+msgstr ""
+
+#: common.opt:372
+msgid "Perform a number of minor, expensive optimizations"
+msgstr ""
+
+#: common.opt:379
+msgid "Assume no NaNs or infinities are generated"
+msgstr ""
+
+#: common.opt:383
+msgid "Mark <register> as being unavailable to the compiler"
+msgstr ""
+
+#: common.opt:387
+msgid "Don't allocate floats and doubles in extended-precision registers"
+msgstr ""
+
+#: common.opt:393
+msgid "Copy memory address constants into registers before use"
+msgstr ""
+
+#: common.opt:399
+msgid "Copy memory operands into registers before use"
+msgstr ""
+
+#: common.opt:406
+msgid "Allow function addresses to be held in registers"
+msgstr ""
+
+#: common.opt:410
+msgid "Place each function into its own section"
+msgstr ""
+
+#: common.opt:414
+msgid "Perform global common subexpression elimination"
+msgstr ""
+
+#: common.opt:418
msgid ""
-"passing argument %d of %qE as %<float%> rather than %<double%> due to "
-"prototype"
+"Perform enhanced load motion during global common subexpression elimination"
msgstr ""
-#: c-typeck.c:2237
-#, c-format
-msgid "passing argument %d of %qE with different width due to prototype"
+#: common.opt:422
+msgid "Perform store motion after global common subexpression elimination"
msgstr ""
-#: c-typeck.c:2259
-#, c-format
-msgid "passing argument %d of %qE as unsigned due to prototype"
+#: common.opt:426
+msgid ""
+"Perform redundant load after store elimination in global common subexpression"
msgstr ""
-#: c-typeck.c:2262
-#, c-format
-msgid "passing argument %d of %qE as signed due to prototype"
+#: common.opt:431
+msgid ""
+"Perform global common subexpression elimination after register allocation"
msgstr ""
-#: c-typeck.c:2299
-#, c-format
-msgid "too few arguments to function %qE"
+#: common.opt:436
+msgid "Enable guessing of branch probabilities"
msgstr ""
-#: c-typeck.c:2335
-msgid "suggest parentheses around + or - inside shift"
+#: common.opt:444
+msgid "Process #ident directives"
msgstr ""
-#: c-typeck.c:2342
-msgid "suggest parentheses around && within ||"
+#: common.opt:448
+msgid "Perform conversion of conditional jumps to branchless equivalents"
msgstr ""
-#: c-typeck.c:2351
-msgid "suggest parentheses around arithmetic in operand of |"
+#: common.opt:452
+msgid "Perform conversion of conditional jumps to conditional execution"
msgstr ""
-#: c-typeck.c:2355
-msgid "suggest parentheses around comparison in operand of |"
+#: common.opt:460
+msgid "Do not generate .size directives"
msgstr ""
-#: c-typeck.c:2364
-msgid "suggest parentheses around arithmetic in operand of ^"
+#: common.opt:469
+msgid "Pay attention to the \"inline\" keyword"
msgstr ""
-#: c-typeck.c:2368
-msgid "suggest parentheses around comparison in operand of ^"
+#: common.opt:473
+msgid "Integrate simple functions into their callers"
msgstr ""
-#: c-typeck.c:2375
-msgid "suggest parentheses around + or - in operand of &"
+#: common.opt:480
+msgid "Limit the size of inlined functions to <number>"
msgstr ""
-#: c-typeck.c:2379
-msgid "suggest parentheses around comparison in operand of &"
+#: common.opt:484
+msgid "Instrument function entry and exit with profiling calls"
msgstr ""
-#: c-typeck.c:2385
-msgid "comparisons like X<=Y<=Z do not have their mathematical meaning"
+#: common.opt:488
+msgid "Optimize induction variables on trees"
msgstr ""
-#: c-typeck.c:2411
-msgid "pointer of type %<void *%> used in subtraction"
+#: common.opt:492
+msgid "Use jump tables for sufficiently large switch statements"
msgstr ""
-#: c-typeck.c:2413
-msgid "pointer to a function used in subtraction"
+#: common.opt:496
+msgid "Generate code for functions even if they are fully inlined"
msgstr ""
-#: c-typeck.c:2502
-msgid "wrong type argument to unary plus"
+#: common.opt:500
+msgid "Emit static const variables even if they are not used"
msgstr ""
-#: c-typeck.c:2515
-msgid "wrong type argument to unary minus"
+#: common.opt:504
+msgid "Give external symbols a leading underscore"
msgstr ""
-#: c-typeck.c:2532
-msgid "ISO C does not support %<~%> for complex conjugation"
+#: common.opt:508
+msgid "Perform loop optimizations"
msgstr ""
-#: c-typeck.c:2538
-msgid "wrong type argument to bit-complement"
+#: common.opt:512
+msgid "Perform loop optimizations using the new loop optimizer"
msgstr ""
-#: c-typeck.c:2546
-msgid "wrong type argument to abs"
+#: common.opt:516
+msgid "Set errno after built-in math functions"
msgstr ""
-#: c-typeck.c:2558
-msgid "wrong type argument to conjugation"
+#: common.opt:520
+msgid "Report on permanent memory allocation"
msgstr ""
-#: c-typeck.c:2574
-msgid "wrong type argument to unary exclamation mark"
+#: common.opt:527
+msgid "Attempt to merge identical constants and constant variables"
msgstr ""
-#: c-typeck.c:2611
-msgid "ISO C does not support %<++%> and %<--%> on complex types"
+#: common.opt:531
+msgid "Attempt to merge identical constants across compilation units"
msgstr ""
-#: c-typeck.c:2627 c-typeck.c:2659
-msgid "wrong type argument to increment"
+#: common.opt:535
+msgid ""
+"Limit diagnostics to <number> characters per line. 0 suppresses line-"
+"wrapping"
msgstr ""
-#: c-typeck.c:2629 c-typeck.c:2661
-msgid "wrong type argument to decrement"
+#: common.opt:539
+msgid "Perform SMS based modulo scheduling before the first scheduling pass"
msgstr ""
-#: c-typeck.c:2650
-msgid "increment of pointer to unknown structure"
+#: common.opt:543
+msgid "Move loop invariant computations out of loops"
msgstr ""
-#: c-typeck.c:2652
-msgid "decrement of pointer to unknown structure"
+#: common.opt:547
+msgid ""
+"Add mudflap bounds-checking instrumentation for single-threaded program."
msgstr ""
-#: c-typeck.c:2822
-msgid "assignment of read-only member %qD"
+#: common.opt:551
+msgid "Add mudflap bounds-checking instrumentation for multi-threaded program."
msgstr ""
-#: c-typeck.c:2823
-msgid "increment of read-only member %qD"
+#: common.opt:555
+msgid "Ignore read operations when inserting mudflap instrumentation."
msgstr ""
-#: c-typeck.c:2824
-msgid "decrement of read-only member %qD"
+#: common.opt:559
+msgid ""
+"Enable/Disable the traditional scheduling in loops that already passed "
+"modulo scheduling"
msgstr ""
-#: c-typeck.c:2828
-msgid "assignment of read-only variable %qD"
+#: common.opt:563
+msgid "Support synchronous non-call exceptions"
msgstr ""
-#: c-typeck.c:2829
-msgid "increment of read-only variable %qD"
+#: common.opt:567
+msgid "When possible do not generate stack frames"
msgstr ""
-#: c-typeck.c:2830
-msgid "decrement of read-only variable %qD"
+#: common.opt:571
+msgid "Do the full register move optimization pass"
msgstr ""
-#: c-typeck.c:2833
-msgid "assignment of read-only location"
+#: common.opt:575
+msgid "Optimize sibling and tail recursive calls"
msgstr ""
-#: c-typeck.c:2834
-msgid "increment of read-only location"
+#: common.opt:579
+msgid "Pack structure members together without holes"
msgstr ""
-#: c-typeck.c:2835
-msgid "decrement of read-only location"
+#: common.opt:583
+msgid "Set initial maximum structure member alignment"
msgstr ""
-#: c-typeck.c:2870
-msgid "cannot take address of bit-field %qD"
+#: common.opt:587
+msgid "Return small aggregates in memory, not registers"
msgstr ""
-#: c-typeck.c:2898
-msgid "global register variable %qD used in nested function"
+#: common.opt:591
+msgid "Perform loop peeling"
msgstr ""
-#: c-typeck.c:2901
-msgid "register variable %qD used in nested function"
+#: common.opt:595
+msgid "Enable machine specific peephole optimizations"
msgstr ""
-#: c-typeck.c:2906
-msgid "address of global register variable %qD requested"
+#: common.opt:599
+msgid "Enable an RTL peephole pass before sched2"
msgstr ""
-#: c-typeck.c:2908
-msgid "address of register variable %qD requested"
+#: common.opt:603
+msgid "Generate position-independent code if possible (large mode)"
msgstr ""
-#: c-typeck.c:2954
-msgid "non-lvalue array in conditional expression"
+#: common.opt:607
+msgid ""
+"Generate position-independent code for executables if possible (large mode)"
msgstr ""
-#: c-typeck.c:2998
-msgid "signed and unsigned type in conditional expression"
+#: common.opt:611
+msgid "Generate position-independent code if possible (small mode)"
msgstr ""
-#: c-typeck.c:3005
-msgid "ISO C forbids conditional expr with only one void side"
+#: common.opt:615
+msgid ""
+"Generate position-independent code for executables if possible (small mode)"
msgstr ""
-#: c-typeck.c:3021 c-typeck.c:3029
-msgid "ISO C forbids conditional expr between %<void *%> and function pointer"
+#: common.opt:619
+msgid "Generate prefetch instructions, if available, for arrays in loops"
msgstr ""
-#: c-typeck.c:3036
-msgid "pointer type mismatch in conditional expression"
+#: common.opt:623
+msgid "Enable basic program profiling code"
msgstr ""
-#: c-typeck.c:3043 c-typeck.c:3053
-msgid "pointer/integer type mismatch in conditional expression"
+#: common.opt:627
+msgid "Insert arc-based program profiling code"
msgstr ""
-#: c-typeck.c:3067
-msgid "type mismatch in conditional expression"
+#: common.opt:631
+msgid ""
+"Enable common options for generating profile info for profile feedback "
+"directed optimizations"
msgstr ""
-#: c-typeck.c:3106
-msgid "left-hand operand of comma expression has no effect"
+#: common.opt:635
+msgid ""
+"Enable common options for performing profile feedback directed optimizations"
msgstr ""
-#: c-typeck.c:3139
-msgid "cast specifies array type"
+#: common.opt:639
+msgid "Insert code to profile values of expressions"
msgstr ""
-#: c-typeck.c:3145
-msgid "cast specifies function type"
+#: common.opt:646
+msgid "Make compile reproducible using <string>"
msgstr ""
-#: c-typeck.c:3155
-msgid "ISO C forbids casting nonscalar to the same type"
+#: common.opt:650
+msgid "Return small aggregates in registers"
msgstr ""
-#: c-typeck.c:3173
-msgid "ISO C forbids casts to union type"
+#: common.opt:654
+msgid "Enables a register move optimization"
msgstr ""
-#: c-typeck.c:3182
-msgid "cast to union type from type not present in union"
+#: common.opt:658
+msgid "Perform a register renaming optimization pass"
msgstr ""
-#: c-typeck.c:3233
-msgid "cast adds new qualifiers to function type"
+#: common.opt:662
+msgid "Reorder basic blocks to improve code placement"
msgstr ""
-#. There are qualifiers present in IN_OTYPE that are not
-#. present in IN_TYPE.
-#: c-typeck.c:3238
-msgid "cast discards qualifiers from pointer target type"
+#: common.opt:666
+msgid "Reorder basic blocks and partition into hot and cold sections"
msgstr ""
-#: c-typeck.c:3253
-msgid "cast increases required alignment of target type"
+#: common.opt:670
+msgid "Reorder functions to improve code placement"
msgstr ""
-#: c-typeck.c:3259
-msgid "cast from pointer to integer of different size"
+#: common.opt:674
+msgid "Add a common subexpression elimination pass after loop optimizations"
msgstr ""
-#: c-typeck.c:3264
-msgid "cast from function call of type %qT to non-matching type %qT"
+#: common.opt:678
+msgid "Run the loop optimizer twice"
msgstr ""
-#: c-typeck.c:3272
-msgid "cast to pointer from integer of different size"
+#: common.opt:682
+msgid "Disable optimizations that assume default FP rounding behavior"
msgstr ""
-#: c-typeck.c:3284
-msgid "type-punning to incomplete type might break strict-aliasing rules"
+#: common.opt:686
+msgid "Enable scheduling across basic blocks"
msgstr ""
-#: c-typeck.c:3291
-msgid "dereferencing type-punned pointer will break strict-aliasing rules"
+#: common.opt:690
+msgid "Allow speculative motion of non-loads"
msgstr ""
-#: c-typeck.c:3294
-msgid "dereferencing type-punned pointer might break strict-aliasing rules"
+#: common.opt:694
+msgid "Allow speculative motion of some loads"
msgstr ""
-#: c-typeck.c:3306
-msgid "ISO C forbids conversion of function pointer to object pointer type"
+#: common.opt:698
+msgid "Allow speculative motion of more loads"
msgstr ""
-#: c-typeck.c:3315
-msgid "ISO C forbids conversion of object pointer to function pointer type"
+#: common.opt:702
+msgid "Set the verbosity level of the scheduler"
msgstr ""
-#: c-typeck.c:3559
-msgid "cannot pass rvalue to reference parameter"
+#: common.opt:706
+msgid "If scheduling post reload, do superblock scheduling"
msgstr ""
-#: c-typeck.c:3668 c-typeck.c:3783
-#, c-format
+#: common.opt:710
+msgid "If scheduling post reload, do trace scheduling"
+msgstr ""
+
+#: common.opt:714
+msgid "Reschedule instructions before register allocation"
+msgstr ""
+
+#: common.opt:718
+msgid "Reschedule instructions after register allocation"
+msgstr ""
+
+#: common.opt:724
+msgid "Allow premature scheduling of queued insns"
+msgstr ""
+
+#: common.opt:728
+msgid "Set number of queued insns that can be prematurely scheduled"
+msgstr ""
+
+#: common.opt:736 common.opt:740
msgid ""
-"passing argument %d of %qE makes qualified function pointer from unqualified"
+"Set dependence distance checking in premature scheduling of queued insns"
msgstr ""
-#: c-typeck.c:3671 c-typeck.c:3786
-msgid "assignment makes qualified function pointer from unqualified"
+#: common.opt:744
+msgid "Mark data as shared rather than private"
msgstr ""
-#: c-typeck.c:3674 c-typeck.c:3788
-msgid "initialization makes qualified function pointer from unqualified"
+#: common.opt:748
+msgid "Show column numbers in diagnostics, when available. Default on."
msgstr ""
-#: c-typeck.c:3677 c-typeck.c:3790
-msgid "return makes qualified function pointer from unqualified"
+#: common.opt:752
+msgid "Disable optimizations observable by IEEE signaling NaNs"
msgstr ""
-#: c-typeck.c:3681 c-typeck.c:3751
-#, c-format
-msgid "passing argument %d of %qE discards qualifiers from pointer target type"
+#: common.opt:756
+msgid "Convert floating point constants to single precision constants"
msgstr ""
-#: c-typeck.c:3683 c-typeck.c:3753
-msgid "assignment discards qualifiers from pointer target type"
+#: common.opt:760
+msgid "Use value profiling for speculative prefetching"
msgstr ""
-#: c-typeck.c:3685 c-typeck.c:3755
-msgid "initialization discards qualifiers from pointer target type"
+#: common.opt:764
+msgid "Split lifetimes of induction variables when loops are unrolled."
msgstr ""
-#: c-typeck.c:3687 c-typeck.c:3757
-msgid "return discards qualifiers from pointer target type"
+#: common.opt:768
+msgid "Apply variable expansion when loops are unrolled."
msgstr ""
-#: c-typeck.c:3692
-msgid "ISO C prohibits argument conversion to union type"
+#: common.opt:774
+msgid "Insert stack checking code into the program"
msgstr ""
-#: c-typeck.c:3736
-msgid ""
-"ISO C forbids passing argument %d of %qE between function pointer and %<void "
-"*%>"
+#: common.opt:781
+msgid "Trap if the stack goes past <register>"
msgstr ""
-#: c-typeck.c:3739
-msgid "ISO C forbids assignment between function pointer and %<void *%>"
+#: common.opt:785
+msgid "Trap if the stack goes past symbol <name>"
msgstr ""
-#: c-typeck.c:3741
-msgid "ISO C forbids initialization between function pointer and %<void *%>"
+#: common.opt:789
+msgid "Perform strength reduction optimizations"
msgstr ""
-#: c-typeck.c:3743
-msgid "ISO C forbids return between function pointer and %<void *%>"
+#: common.opt:797
+msgid "Assume strict aliasing rules apply"
msgstr ""
-#: c-typeck.c:3766
-#, c-format
-msgid "pointer targets in passing argument %d of %qE differ in signedness"
+#: common.opt:801
+msgid "Check for syntax errors, then stop"
msgstr ""
-#: c-typeck.c:3768
-msgid "pointer targets in assignment differ in signedness"
+#: common.opt:805
+msgid "Create data files needed by \"gcov\""
msgstr ""
-#: c-typeck.c:3770
-msgid "pointer targets in initialization differ in signedness"
+#: common.opt:809
+msgid "Perform jump threading optimizations"
msgstr ""
-#: c-typeck.c:3772
-msgid "pointer targets in return differ in signedness"
+#: common.opt:813
+msgid "Report the time taken by each compiler pass"
msgstr ""
-#: c-typeck.c:3795
-#, c-format
-msgid "passing argument %d of %qE from incompatible pointer type"
+#: common.opt:817
+msgid "Set the default thread-local storage code generation model"
msgstr ""
-#: c-typeck.c:3797
-msgid "assignment from incompatible pointer type"
+#: common.opt:821
+msgid "Perform superblock formation via tail duplication"
msgstr ""
-#: c-typeck.c:3798
-msgid "initialization from incompatible pointer type"
+#: common.opt:828
+msgid "Assume floating-point operations can trap"
msgstr ""
-#: c-typeck.c:3800
-msgid "return from incompatible pointer type"
+#: common.opt:832
+msgid "Trap for signed overflow in addition, subtraction and multiplication"
msgstr ""
-#. ??? This should not be an error when inlining calls to
-#. unprototyped functions.
-#: c-typeck.c:3807 c-typeck.c:4304 cp/typeck.c:1377
-msgid "invalid use of non-lvalue array"
+#: common.opt:836
+msgid "Use tree-ssa based implementation of profiling"
msgstr ""
-#: c-typeck.c:3821
-#, c-format
-msgid "passing argument %d of %qE makes pointer from integer without a cast"
+#: common.opt:840
+msgid "Enable SSA-CCP optimization on trees"
msgstr ""
-#: c-typeck.c:3823
-msgid "assignment makes pointer from integer without a cast"
+#: common.opt:844
+msgid "Enable SSA-CCP optimization for stores and loads"
msgstr ""
-#: c-typeck.c:3825
-msgid "initialization makes pointer from integer without a cast"
+#: common.opt:848
+msgid "Enable loop header copying on trees"
msgstr ""
-#: c-typeck.c:3827
-msgid "return makes pointer from integer without a cast"
+#: common.opt:852
+msgid "Coalesce memory temporaries in the SSA->normal pass"
msgstr ""
-#: c-typeck.c:3834
-#, c-format
-msgid "passing argument %d of %qE makes integer from pointer without a cast"
+#: common.opt:856
+msgid "Replace SSA temporaries with better names in copies."
msgstr ""
-#: c-typeck.c:3836
-msgid "assignment makes integer from pointer without a cast"
+#: common.opt:860
+msgid "Enable copy propagation on trees"
msgstr ""
-#: c-typeck.c:3838
-msgid "initialization makes integer from pointer without a cast"
+#: common.opt:864
+msgid "Enable copy propagation for stores and loads"
msgstr ""
-#: c-typeck.c:3840
-msgid "return makes integer from pointer without a cast"
+#: common.opt:868
+msgid "Enable SSA dead code elimination optimization on trees"
msgstr ""
-#. ??? This should not be an error when inlining calls to
-#. unprototyped functions.
-#: c-typeck.c:3853
-#, c-format
-msgid "incompatible type for argument %d of %qE"
+#: common.opt:872
+msgid "Enable dominator optimizations"
msgstr ""
-#: c-typeck.c:3856
-msgid "incompatible types in assignment"
+#: common.opt:876
+msgid "Enable dead store elimination"
msgstr ""
-#: c-typeck.c:3859
-msgid "incompatible types in initialization"
+#: common.opt:880
+msgid "Enable Full Redundancy Elimination (FRE) on trees"
msgstr ""
-#: c-typeck.c:3862
-msgid "incompatible types in return"
+#: common.opt:884
+msgid "Enable loop invariant motion on trees"
msgstr ""
-#: c-typeck.c:3943
-msgid "traditional C rejects automatic aggregate initialization"
+#: common.opt:888
+msgid "Enable linear loop transforms on trees"
msgstr ""
-#. Use `%s' to print the string in case there are any escape
-#. characters in the message.
-#: c-typeck.c:4107 c-typeck.c:4122 c-typeck.c:4137 final.c:2770 final.c:2772
-#: gcc.c:4622 rtl-error.c:113 toplev.c:612 config/cris/cris.c:670
-#: cp/parser.c:1894 cp/typeck.c:4142 java/expr.c:409
-#: java/parse.y:4984 java/verify.c:1553
-#: java/verify.c:1554 java/verify.c:1573
-#, c-format
-msgid "%s"
+#: common.opt:892
+msgid "Create canonical induction variables in loops"
msgstr ""
-#: c-typeck.c:4110 c-typeck.c:4125 c-typeck.c:4140
-#, c-format
-msgid "(near initialization for %qs)"
+#: common.opt:896
+msgid "Enable loop optimizations on tree level"
msgstr ""
-#: c-typeck.c:4154
-msgid "array initialized from parenthesized string constant"
+#: common.opt:900
+msgid "Enable SSA-PRE optimization on trees"
msgstr ""
-#: c-typeck.c:4214 cp/typeck2.c:703
-msgid "char-array initialized from wide string"
+#: common.opt:904
+msgid "Perform structural alias analysis"
msgstr ""
-#: c-typeck.c:4219
-msgid "wchar_t-array initialized from non-wide string"
+#: common.opt:908
+msgid "Enable SSA code sinking on trees"
msgstr ""
-#: c-typeck.c:4237 cp/typeck2.c:725
-msgid "initializer-string for array of chars is too long"
+#: common.opt:912
+msgid "Perform scalar replacement of aggregates"
msgstr ""
-#: c-typeck.c:4243
-msgid "array of inappropriate type initialized from string constant"
+#: common.opt:916
+msgid "Replace temporary expressions in the SSA->normal pass"
msgstr ""
-#: c-typeck.c:4327
-msgid "array initialized from non-constant array expression"
+#: common.opt:920
+msgid "Perform live range splitting during the SSA->normal pass."
msgstr ""
-#: c-typeck.c:4386 c-typeck.c:5749
-msgid "initializer element is not computable at load time"
+#: common.opt:924
+msgid "Perform Value Range Propagation on trees"
msgstr ""
-#: c-typeck.c:4401 cp/typeck2.c:804
-msgid "invalid initializer"
+#: common.opt:928
+msgid "Compile whole compilation unit at a time"
msgstr ""
-#: c-typeck.c:4668 cp/decl.c:4448
-msgid "opaque vector types cannot be initialized"
+#: common.opt:932
+msgid "Perform loop unrolling when iteration count is known"
msgstr ""
-#: c-typeck.c:4867
-msgid "extra brace group at end of initializer"
+#: common.opt:936
+msgid "Perform loop unrolling for all loops"
msgstr ""
-#: c-typeck.c:4887 cp/decl.c:4363
-msgid "missing braces around initializer"
+#: common.opt:944
+msgid "Allow math optimizations that may violate IEEE or ISO standards"
msgstr ""
-#: c-typeck.c:4948
-msgid "braces around scalar initializer"
+#: common.opt:948
+msgid "Perform loop unswitching"
msgstr ""
-#: c-typeck.c:5005
-msgid "initialization of flexible array member in a nested context"
+#: common.opt:952
+msgid "Just generate unwind tables for exception handling"
msgstr ""
-#: c-typeck.c:5007
-msgid "initialization of a flexible array member"
+#: common.opt:956
+msgid "Perform variable tracking"
msgstr ""
-#: c-typeck.c:5034
-msgid "missing initializer"
+#: common.opt:960
+msgid "Enable loop vectorization on trees"
msgstr ""
-#: c-typeck.c:5056
-msgid "empty scalar initializer"
+#: common.opt:964
+msgid "Set the verbosity level of the vectorizer"
msgstr ""
-#: c-typeck.c:5061
-msgid "extra elements in scalar initializer"
+#: common.opt:974
+msgid "Add extra commentary to assembler output"
msgstr ""
-#: c-typeck.c:5165 c-typeck.c:5225
-msgid "array index in non-array initializer"
+#: common.opt:978
+msgid "Set the default symbol visibility"
msgstr ""
-#: c-typeck.c:5170 c-typeck.c:5278
-msgid "field name not in record or union initializer"
+#: common.opt:983
+msgid "Use expression value profiles in optimizations"
msgstr ""
-#: c-typeck.c:5216
-msgid "array index in initializer not of integer type"
+#: common.opt:987
+msgid "Construct webs and split unrelated uses of single variable"
msgstr ""
-#: c-typeck.c:5221 c-typeck.c:5223
-msgid "nonconstant array index in initializer"
+#: common.opt:991
+msgid "Assume signed arithmetic overflow wraps around"
msgstr ""
-#: c-typeck.c:5227 c-typeck.c:5230
-msgid "array index in initializer exceeds array bounds"
+#: common.opt:995
+msgid "Put zero initialized data in the bss section"
msgstr ""
-#: c-typeck.c:5241
-msgid "empty index range in initializer"
+#: common.opt:999
+msgid "Generate debug information in default format"
msgstr ""
-#: c-typeck.c:5250
-msgid "array index range in initializer exceeds array bounds"
+#: common.opt:1003
+msgid "Generate debug information in COFF format"
msgstr ""
-#: c-typeck.c:5290
-#, c-format
-msgid "unknown field %qE specified in initializer"
+#: common.opt:1007
+msgid "Generate debug information in DWARF v2 format"
msgstr ""
-#: c-typeck.c:5325 c-typeck.c:5346 c-typeck.c:5812
-msgid "initialized field with side-effects overwritten"
+#: common.opt:1011
+msgid "Generate debug information in default extended format"
msgstr ""
-#: c-typeck.c:6021
-msgid "excess elements in char array initializer"
+#: common.opt:1015
+msgid "Generate debug information in STABS format"
msgstr ""
-#: c-typeck.c:6028 c-typeck.c:6074
-msgid "excess elements in struct initializer"
+#: common.opt:1019
+msgid "Generate debug information in extended STABS format"
msgstr ""
-#: c-typeck.c:6089
-msgid "non-static initialization of a flexible array member"
+#: common.opt:1023
+msgid "Generate debug information in VMS format"
msgstr ""
-#: c-typeck.c:6157
-msgid "excess elements in union initializer"
+#: common.opt:1027
+msgid "Generate debug information in XCOFF format"
msgstr ""
-#: c-typeck.c:6179
-msgid "traditional C rejects initialization of unions"
+#: common.opt:1031
+msgid "Generate debug information in extended XCOFF format"
msgstr ""
-#: c-typeck.c:6243
-msgid "excess elements in array initializer"
+#: common.opt:1035
+msgid "Place output into <file>"
msgstr ""
-#: c-typeck.c:6273
-msgid "excess elements in vector initializer"
+#: common.opt:1039
+msgid "Enable function profiling"
msgstr ""
-#: c-typeck.c:6297
-msgid "excess elements in scalar initializer"
+#: common.opt:1043
+msgid "Issue warnings needed for strict compliance to the standard"
msgstr ""
-#: c-typeck.c:6485
-msgid "jump into statement expression"
+#: common.opt:1047
+msgid "Like -pedantic but issue them as errors"
msgstr ""
-#: c-typeck.c:6510
-msgid "ISO C forbids %<goto *expr;%>"
+#: common.opt:1051
+msgid "Do not display functions compiled or elapsed time"
msgstr ""
-#: c-typeck.c:6524 cp/typeck.c:6020
-msgid "function declared %<noreturn%> has a %<return%> statement"
+#: common.opt:1055
+msgid "Display the compiler's version"
msgstr ""
-#: c-typeck.c:6531
-msgid "%<return%> with no value, in function returning non-void"
+#: common.opt:1059
+msgid "Suppress warnings"
msgstr ""
-#: c-typeck.c:6538
-msgid "%<return%> with a value, in function returning void"
+#: ada/lang.opt:74
+msgid "Specify options to GNAT"
msgstr ""
-#: c-typeck.c:6595
-msgid "function returns address of local variable"
+#: config/m68hc11/m68hc11.opt:24 config/m68hc11/m68hc11.opt:32
+msgid "Compile for a 68HC11"
msgstr ""
-#: c-typeck.c:6661 cp/semantics.c:879
-msgid "switch quantity not an integer"
+#: config/m68hc11/m68hc11.opt:28 config/m68hc11/m68hc11.opt:36
+msgid "Compile for a 68HC12"
msgstr ""
-#: c-typeck.c:6672
-msgid "%<long%> switch expression not converted to %<int%> in ISO C"
+#: config/m68hc11/m68hc11.opt:42 config/m68hc11/m68hc11.opt:46
+msgid "Compile for a 68HCS12"
msgstr ""
-#: c-typeck.c:6711
-msgid ""
-"case label in statement expression not containing enclosing switch statement"
+#: config/m68hc11/m68hc11.opt:50
+msgid "Auto pre/post decrement increment allowed"
+msgstr ""
+
+#: config/m68hc11/m68hc11.opt:54
+msgid "Min/max instructions allowed"
+msgstr ""
+
+#: config/m68hc11/m68hc11.opt:58
+msgid "Use call and rtc for function calls and returns"
+msgstr ""
+
+#: config/m68hc11/m68hc11.opt:62
+msgid "Auto pre/post decrement increment not allowed"
+msgstr ""
+
+#: config/m68hc11/m68hc11.opt:66
+msgid "Use jsr and rts for function calls and returns"
msgstr ""
-#: c-typeck.c:6714
+#: config/m68hc11/m68hc11.opt:70
+msgid "Min/max instructions not allowed"
+msgstr ""
+
+#: config/m68hc11/m68hc11.opt:74
+msgid "Use direct addressing mode for soft registers"
+msgstr ""
+
+#: config/m68hc11/m68hc11.opt:78
+msgid "Compile with 32-bit integer mode"
+msgstr ""
+
+#: config/m68hc11/m68hc11.opt:83
+msgid "Specify the register allocation order"
+msgstr ""
+
+#: config/m68hc11/m68hc11.opt:87
+msgid "Do not use direct addressing mode for soft registers"
+msgstr ""
+
+#: config/m68hc11/m68hc11.opt:91
+msgid "Compile with 16-bit integer mode"
+msgstr ""
+
+#: config/m68hc11/m68hc11.opt:95
+msgid "Indicate the number of soft registers available"
+msgstr ""
+
+#: config/pa/pa.opt:24 config/pa/pa.opt:77 config/pa/pa.opt:85
+msgid "Generate PA1.0 code"
+msgstr ""
+
+#: config/pa/pa.opt:28 config/pa/pa.opt:89 config/pa/pa.opt:109
+msgid "Generate PA1.1 code"
+msgstr ""
+
+#: config/pa/pa.opt:32 config/pa/pa.opt:93
+msgid "Generate PA2.0 code (requires binutils 2.10 or later)"
+msgstr ""
+
+#: config/pa/pa.opt:36
+msgid "Generate code for huge switch statements"
+msgstr ""
+
+#: config/pa/pa.opt:40
+msgid "Disable FP regs"
+msgstr ""
+
+#: config/pa/pa.opt:44
+msgid "Disable indexed addressing"
+msgstr ""
+
+#: config/pa/pa.opt:48
+msgid "Generate fast indirect calls"
+msgstr ""
+
+#: config/pa/pa.opt:52
+msgid "Specify range of registers to make fixed."
+msgstr ""
+
+#: config/pa/pa.opt:56
+msgid "Assume code will be assembled by GAS"
+msgstr ""
+
+#: config/pa/pa.opt:60
+msgid "Put jumps in call delay slots"
+msgstr ""
+
+#: config/pa/pa.opt:65
+msgid "Enable linker optimizations"
+msgstr ""
+
+#: config/pa/pa.opt:69
+msgid "Always generate long calls"
+msgstr ""
+
+#: config/pa/pa.opt:73
+msgid "Emit long load/store sequences"
+msgstr ""
+
+#: config/pa/pa.opt:81
+msgid "Disable space regs"
+msgstr ""
+
+#: config/pa/pa.opt:97
+msgid "Use portable calling conventions"
+msgstr ""
+
+#: config/pa/pa.opt:101
msgid ""
-"%<default%> label in statement expression not containing enclosing switch "
-"statement"
+"Specify CPU for scheduling purposes. Valid arguments are 700, 7100, 7100LC, "
+"7200, 7300, and 8000."
msgstr ""
-#: c-typeck.c:6718 cp/parser.c:6075
-msgid "case label not within a switch statement"
+#: config/pa/pa.opt:105 config/frv/frv.opt:174
+msgid "Use software floating point"
msgstr ""
-#: c-typeck.c:6720
-msgid "%<default%> label not within a switch statement"
+#: config/pa/pa.opt:113
+msgid "Do not disable space regs"
msgstr ""
-#: c-typeck.c:6786
-msgid "%Hsuggest explicit braces to avoid ambiguous %<else%>"
+#: config/pa/pa-hpux1010.opt:24 config/pa/pa-hpux1111.opt:24
+#: config/pa/pa-hpux.opt:28
+msgid "Specify UNIX standard for predefines and linking"
msgstr ""
-#: c-typeck.c:6796
-msgid "%Hempty body in an if-statement"
+#: config/pa/pa64-hpux.opt:24
+msgid "Assume code will be linked by GNU ld"
msgstr ""
-#: c-typeck.c:6804
-msgid "%Hempty body in an else-statement"
+#: config/pa/pa64-hpux.opt:28
+msgid "Assume code will be linked by HP ld"
msgstr ""
-#: c-typeck.c:6915 cp/parser.c:6577
-msgid "continue statement not within a loop"
+#: config/pa/pa-hpux.opt:24
+msgid "Generate cpp defines for server IO"
msgstr ""
-#: c-typeck.c:6935
-msgid "%Hstatement with no effect"
+#: config/pa/pa-hpux.opt:32
+msgid "Generate cpp defines for workstation IO"
msgstr ""
-#: c-typeck.c:6964
-msgid "expression statement has incomplete type"
+#: config/lynx.opt:24
+msgid "Support legacy multi-threading"
msgstr ""
-#: c-typeck.c:7333 c-typeck.c:7372
-msgid "division by zero"
+#: config/lynx.opt:28
+msgid "Use shared libraries"
msgstr ""
-#: c-typeck.c:7417 cp/typeck.c:2927
-msgid "right shift count is negative"
+#: config/lynx.opt:32
+msgid "Support multi-threading"
msgstr ""
-#: c-typeck.c:7424 cp/typeck.c:2933
-msgid "right shift count >= width of type"
+#: config/mcore/mcore.opt:24
+msgid "Generate code for the M*Core M210"
msgstr ""
-#: c-typeck.c:7445 cp/typeck.c:2952
-msgid "left shift count is negative"
+#: config/mcore/mcore.opt:28
+msgid "Generate code for the M*Core M340"
msgstr ""
-#: c-typeck.c:7448 cp/typeck.c:2954
-msgid "left shift count >= width of type"
+#: config/mcore/mcore.opt:32
+msgid "Set maximum alignment to 4"
msgstr ""
-#: c-typeck.c:7465 cp/typeck.c:2989
-msgid "comparing floating point with == or != is unsafe"
+#: config/mcore/mcore.opt:36
+msgid "Force functions to be aligned to a 4 byte boundary"
msgstr ""
-#: c-typeck.c:7489 c-typeck.c:7496
-msgid "ISO C forbids comparison of %<void *%> with function pointer"
+#: config/mcore/mcore.opt:40
+msgid "Set maximum alignment to 8"
msgstr ""
-#: c-typeck.c:7500 c-typeck.c:7546
-msgid "comparison of distinct pointer types lacks a cast"
+#: config/mcore/mcore.opt:44
+msgid "Generate big-endian code"
msgstr ""
-#: c-typeck.c:7514 c-typeck.c:7519 c-typeck.c:7566 c-typeck.c:7571
-msgid "comparison between pointer and integer"
+#: config/mcore/mcore.opt:48
+msgid "Emit call graph information"
msgstr ""
-#: c-typeck.c:7538
-msgid "comparison of complete and incomplete pointers"
+#: config/mcore/mcore.opt:52
+msgid "Use the divide instruction"
msgstr ""
-#: c-typeck.c:7541
-msgid "ISO C forbids ordered comparisons of pointers to functions"
+#: config/mcore/mcore.opt:56
+msgid "Inline constants if it can be done in 2 insns or less"
msgstr ""
-#: c-typeck.c:7554 c-typeck.c:7561
-msgid "ordered comparison of pointer with integer zero"
+#: config/mcore/mcore.opt:60
+msgid "Generate little-endian code"
msgstr ""
-#: c-typeck.c:7782
-msgid "comparison between signed and unsigned"
+#: config/mcore/mcore.opt:68
+msgid "Use arbitrary sized immediates in bit operations"
msgstr ""
-#: c-typeck.c:7828 cp/typeck.c:3396
-msgid "comparison of promoted ~unsigned with constant"
+#: config/mcore/mcore.opt:72
+msgid "Prefer word accesses over byte accesses"
msgstr ""
-#: c-typeck.c:7836 cp/typeck.c:3404
-msgid "comparison of promoted ~unsigned with unsigned"
+#: config/mcore/mcore.opt:76
+msgid "Set the maximum amount for a single stack increment operation"
msgstr ""
-#: c-typeck.c:7894
-msgid "used array that cannot be converted to pointer where scalar is required"
+#: config/mcore/mcore.opt:80
+msgid "Always treat bitfields as int-sized"
msgstr ""
-#: c-typeck.c:7898
-msgid "used struct type value where scalar is required"
+#: config/pdp11/pdp11.opt:24
+msgid "Generate code for an 11/10"
msgstr ""
-#: c-typeck.c:7902
-msgid "used union type value where scalar is required"
+#: config/pdp11/pdp11.opt:28
+msgid "Generate code for an 11/40"
msgstr ""
-#: calls.c:1938
-msgid "function call has aggregate value"
+#: config/pdp11/pdp11.opt:32
+msgid "Generate code for an 11/45"
msgstr ""
-#: cfghooks.c:90
-#, c-format
-msgid "bb %d on wrong place"
+#: config/pdp11/pdp11.opt:36
+msgid "Use 16-bit abs patterns"
msgstr ""
-#: cfghooks.c:96
-#, c-format
-msgid "prev_bb of %d should be %d, not %d"
+#: config/pdp11/pdp11.opt:40
+msgid "Return floating-point results in ac0 (fr0 in Unix assembler syntax)"
msgstr ""
-#: cfghooks.c:113
-#, c-format
-msgid "verify_flow_info: Wrong count of block %i %i"
+#: config/pdp11/pdp11.opt:44
+msgid "Do not use inline patterns for copying memory"
msgstr ""
-#: cfghooks.c:119
-#, c-format
-msgid "verify_flow_info: Wrong frequency of block %i %i"
+#: config/pdp11/pdp11.opt:48
+msgid "Use inline patterns for copying memory"
msgstr ""
-#: cfghooks.c:127
-#, c-format
-msgid "verify_flow_info: Duplicate edge %i->%i"
+#: config/pdp11/pdp11.opt:52
+msgid "Do not pretend that branches are expensive"
msgstr ""
-#: cfghooks.c:133
-#, c-format
-msgid "verify_flow_info: Wrong probability of edge %i->%i %i"
+#: config/pdp11/pdp11.opt:56
+msgid "Pretend that branches are expensive"
msgstr ""
-#: cfghooks.c:139
-#, c-format
-msgid "verify_flow_info: Wrong count of edge %i->%i %i"
+#: config/pdp11/pdp11.opt:60
+msgid "Use the DEC assembler syntax"
msgstr ""
-#: cfghooks.c:151
-#, c-format
-msgid "verify_flow_info: Basic block %d succ edge is corrupted"
+#: config/pdp11/pdp11.opt:64
+msgid "Use 32 bit float"
msgstr ""
-#: cfghooks.c:165 cfgrtl.c:2027
-#, c-format
-msgid "Wrong amount of branch edges after unconditional jump %i"
+#: config/pdp11/pdp11.opt:68
+msgid "Use 64 bit float"
msgstr ""
-#: cfghooks.c:173 cfghooks.c:184
-#, c-format
-msgid "basic block %d pred edge is corrupted"
+#: config/pdp11/pdp11.opt:72 config/rs6000/rs6000.opt:89
+#: config/frv/frv.opt:121
+msgid "Use hardware floating point"
msgstr ""
-#: cfghooks.c:185
-#, c-format
-msgid "its dest_idx should be %d, not %d"
+#: config/pdp11/pdp11.opt:76
+msgid "Use 16 bit int"
msgstr ""
-#: cfghooks.c:214
-#, c-format
-msgid "basic block %i edge lists are corrupted"
+#: config/pdp11/pdp11.opt:80
+msgid "Use 32 bit int"
msgstr ""
-#: cfghooks.c:227
-msgid "verify_flow_info failed"
+#: config/pdp11/pdp11.opt:84 config/rs6000/rs6000.opt:85
+msgid "Do not use hardware floating point"
msgstr ""
-#: cfghooks.c:288
-#, c-format
-msgid "%s does not support redirect_edge_and_branch."
+#: config/pdp11/pdp11.opt:88
+msgid "Target has split I&D"
msgstr ""
-#: cfghooks.c:306
-#, c-format
-msgid "%s does not support redirect_edge_and_branch_force."
+#: config/pdp11/pdp11.opt:92
+msgid "Use UNIX assembler syntax"
msgstr ""
-#: cfghooks.c:324
-#, c-format
-msgid "%s does not support split_block."
+#: config/rs6000/sysv4.opt:25
+msgid "Select ABI calling convention"
msgstr ""
-#: cfghooks.c:360
-#, c-format
-msgid "%s does not support move_block_after."
+#: config/rs6000/sysv4.opt:29
+msgid "Select method for sdata handling"
msgstr ""
-#: cfghooks.c:373
-#, c-format
-msgid "%s does not support delete_basic_block."
+#: config/rs6000/sysv4.opt:33 config/alpha/alpha.opt:135
+#: config/ia64/ia64.opt:93
+msgid "Specify bit size of immediate TLS offsets"
msgstr ""
-#: cfghooks.c:405
-#, c-format
-msgid "%s does not support split_edge."
+#: config/rs6000/sysv4.opt:37 config/rs6000/sysv4.opt:41
+msgid "Align to the base type of the bit-field"
msgstr ""
-#: cfghooks.c:466
-#, c-format
-msgid "%s does not support create_basic_block."
+#: config/rs6000/sysv4.opt:46 config/rs6000/sysv4.opt:50
+msgid "Produce code relocatable at runtime"
msgstr ""
-#: cfghooks.c:494
-#, c-format
-msgid "%s does not support can_merge_blocks_p."
+#: config/rs6000/sysv4.opt:54 config/rs6000/sysv4.opt:58
+msgid "Produce little endian code"
msgstr ""
-#: cfghooks.c:505
-#, c-format
-msgid "%s does not support predict_edge."
+#: config/rs6000/sysv4.opt:62 config/rs6000/sysv4.opt:66
+msgid "Produce big endian code"
msgstr ""
-#: cfghooks.c:514
-#, c-format
-msgid "%s does not support predicted_by_p."
+#: config/rs6000/sysv4.opt:71 config/rs6000/sysv4.opt:75
+#: config/rs6000/sysv4.opt:79 config/rs6000/sysv4.opt:84
+#: config/rs6000/sysv4.opt:101 config/rs6000/sysv4.opt:129
+#: config/rs6000/sysv4.opt:141
+msgid "no description yet"
msgstr ""
-#: cfghooks.c:528
-#, c-format
-msgid "%s does not support merge_blocks."
+#: config/rs6000/sysv4.opt:88
+msgid "Use EABI"
msgstr ""
-#: cfghooks.c:574
-#, c-format
-msgid "%s does not support make_forwarder_block."
+#: config/rs6000/sysv4.opt:92
+msgid "Allow bit-fields to cross word boundaries"
msgstr ""
-#: cfghooks.c:679
-#, c-format
-msgid "%s does not support can_duplicate_block_p."
+#: config/rs6000/sysv4.opt:96
+msgid "Use alternate register names"
msgstr ""
-#: cfghooks.c:706
-#, c-format
-msgid "%s does not support duplicate_block."
+#: config/rs6000/sysv4.opt:105
+msgid "Link with libsim.a, libc.a and sim-crt0.o"
msgstr ""
-#: cfghooks.c:772
-#, c-format
-msgid "%s does not support block_ends_with_call_p"
+#: config/rs6000/sysv4.opt:109
+msgid "Link with libads.a, libc.a and crt0.o"
msgstr ""
-#: cfghooks.c:783
-#, c-format
-msgid "%s does not support block_ends_with_condjump_p"
+#: config/rs6000/sysv4.opt:113
+msgid "Link with libyk.a, libc.a and crt0.o"
msgstr ""
-#: cfghooks.c:801
-#, c-format
-msgid "%s does not support flow_call_edges_add"
+#: config/rs6000/sysv4.opt:117
+msgid "Link with libmvme.a, libc.a and crt0.o"
msgstr ""
-#: cfgloop.c:1088
-#, c-format
-msgid "Size of loop %d should be %d, not %d."
+#: config/rs6000/sysv4.opt:121
+msgid "Set the PPC_EMB bit in the ELF flags header"
msgstr ""
-#: cfgloop.c:1105
-#, c-format
-msgid "Bb %d do not belong to loop %d."
+#: config/rs6000/sysv4.opt:125
+msgid "Use the WindISS simulator"
msgstr ""
-#: cfgloop.c:1122
-#, c-format
-msgid "Loop %d's header does not have exactly 2 entries."
+#: config/rs6000/sysv4.opt:133 config/rs6000/darwin.opt:25
+msgid "Generate 64-bit code"
msgstr ""
-#: cfgloop.c:1129
-#, c-format
-msgid "Loop %d's latch does not have exactly 1 successor."
+#: config/rs6000/sysv4.opt:137 config/rs6000/darwin.opt:29
+msgid "Generate 32-bit code"
msgstr ""
-#: cfgloop.c:1134
-#, c-format
-msgid "Loop %d's latch does not have header as successor."
+#: config/rs6000/sysv4.opt:145
+msgid "Generate code to use a non-exec PLT and GOT"
msgstr ""
-#: cfgloop.c:1139
-#, c-format
-msgid "Loop %d's latch does not belong directly to it."
+#: config/rs6000/sysv4.opt:149
+msgid "Generate code for old exec BSS PLT"
msgstr ""
-#: cfgloop.c:1145
-#, c-format
-msgid "Loop %d's header does not belong directly to it."
+#: config/rs6000/aix.opt:25 config/rs6000/rs6000.opt:124
+msgid "Conform more closely to IBM XLC semantics"
msgstr ""
-#: cfgloop.c:1151
-#, c-format
-msgid "Loop %d's latch is marked as part of irreducible region."
+#: config/rs6000/aix64.opt:25
+msgid "Compile for 64-bit pointers"
msgstr ""
-#: cfgloop.c:1184
-#, c-format
-msgid "Basic block %d should be marked irreducible."
+#: config/rs6000/aix64.opt:29
+msgid "Compile for 32-bit pointers"
msgstr ""
-#: cfgloop.c:1190
-#, c-format
-msgid "Basic block %d should not be marked irreducible."
+#: config/rs6000/aix64.opt:33 config/rs6000/aix41.opt:25
+msgid "Support message passing with the Parallel Environment"
msgstr ""
-#: cfgloop.c:1198
-#, c-format
-msgid "Edge from %d to %d should be marked irreducible."
+#: config/rs6000/darwin.opt:33
+msgid "Generate code suitable for executables (NOT shared libs)"
msgstr ""
-#: cfgloop.c:1205
-#, c-format
-msgid "Edge from %d to %d should not be marked irreducible."
+#: config/rs6000/rs6000.opt:25
+msgid "Use POWER instruction set"
msgstr ""
-#: cfgloop.c:1240
-#, c-format
-msgid "Wrong single exit %d->%d recorded for loop %d."
+#: config/rs6000/rs6000.opt:29
+msgid "Do not use POWER instruction set"
msgstr ""
-#: cfgloop.c:1244
-#, c-format
-msgid "Right exit is %d->%d."
+#: config/rs6000/rs6000.opt:33
+msgid "Use POWER2 instruction set"
msgstr ""
-#: cfgloop.c:1261
-#, c-format
-msgid "Single exit not recorded for loop %d."
+#: config/rs6000/rs6000.opt:37
+msgid "Use PowerPC instruction set"
msgstr ""
-#: cfgloop.c:1268
-#, c-format
-msgid "Loop %d should not have single exit (%d -> %d)."
+#: config/rs6000/rs6000.opt:41
+msgid "Do not use PowerPC instruction set"
msgstr ""
-#: cfgrtl.c:1919
-#, c-format
-msgid "end insn %d for block %d not found in the insn stream"
+#: config/rs6000/rs6000.opt:45
+msgid "Use PowerPC-64 instruction set"
msgstr ""
-#: cfgrtl.c:1933
-#, c-format
-msgid "insn %d is in multiple basic blocks (%d and %d)"
+#: config/rs6000/rs6000.opt:49
+msgid "Use PowerPC General Purpose group optional instructions"
msgstr ""
-#: cfgrtl.c:1945
-#, c-format
-msgid "head insn %d for block %d not found in the insn stream"
+#: config/rs6000/rs6000.opt:53
+msgid "Use PowerPC Graphics group optional instructions"
msgstr ""
-#: cfgrtl.c:1969
-msgid "verify_flow_info: REG_BR_PROB does not match cfg %wi %i"
+#: config/rs6000/rs6000.opt:57
+msgid "Generate single field mfcr instruction"
msgstr ""
-#: cfgrtl.c:1984
-#, c-format
-msgid "Fallthru edge crosses section boundary (bb %i)"
+#: config/rs6000/rs6000.opt:61
+msgid "Use PowerPC/AS popcntb instruction"
msgstr ""
-#: cfgrtl.c:2009
-#, c-format
-msgid "Missing REG_EH_REGION note in the end of bb %i"
+#: config/rs6000/rs6000.opt:65
+msgid "Use AltiVec instructions"
msgstr ""
-#: cfgrtl.c:2017
-#, c-format
-msgid "Too many outgoing branch edges from bb %i"
+#: config/rs6000/rs6000.opt:69
+msgid "Generate load/store multiple instructions"
msgstr ""
-#: cfgrtl.c:2022
-#, c-format
-msgid "Fallthru edge after unconditional jump %i"
+#: config/rs6000/rs6000.opt:73
+msgid "Generate string instructions for block moves"
msgstr ""
-#: cfgrtl.c:2033
-#, c-format
-msgid "Wrong amount of branch edges after conditional jump %i"
+#: config/rs6000/rs6000.opt:77
+msgid "Use new mnemonics for PowerPC architecture"
msgstr ""
-#: cfgrtl.c:2038
-#, c-format
-msgid "Call edges for non-call insn in bb %i"
+#: config/rs6000/rs6000.opt:81
+msgid "Use old mnemonics for PowerPC architecture"
msgstr ""
-#: cfgrtl.c:2047
-#, c-format
-msgid "Abnormal edges for no purpose in bb %i"
+#: config/rs6000/rs6000.opt:93
+msgid "Do not generate load/store with update instructions"
msgstr ""
-#: cfgrtl.c:2059
-#, c-format
-msgid "insn %d inside basic block %d but block_for_insn is NULL"
+#: config/rs6000/rs6000.opt:97
+msgid "Generate load/store with update instructions"
msgstr ""
-#: cfgrtl.c:2063
-#, c-format
-msgid "insn %d inside basic block %d but block_for_insn is %i"
+#: config/rs6000/rs6000.opt:101
+msgid "Do not generate fused multiply/add instructions"
msgstr ""
-#: cfgrtl.c:2077 cfgrtl.c:2087
-#, c-format
-msgid "NOTE_INSN_BASIC_BLOCK is missing for block %d"
+#: config/rs6000/rs6000.opt:105
+msgid "Generate fused multiply/add instructions"
msgstr ""
-#: cfgrtl.c:2100
-#, c-format
-msgid "NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d"
+#: config/rs6000/rs6000.opt:109
+msgid "Schedule the start and end of the procedure"
msgstr ""
-#: cfgrtl.c:2110
-#, c-format
-msgid "in basic block %d:"
+#: config/rs6000/rs6000.opt:116
+msgid "Return all structures in memory (AIX default)"
msgstr ""
-#: cfgrtl.c:2111
-msgid "flow control insn inside a basic block"
+#: config/rs6000/rs6000.opt:120
+msgid "Return small structures in registers (SVR4 default)"
msgstr ""
-#: cfgrtl.c:2159
-#, c-format
-msgid "missing barrier after block %i"
+#: config/rs6000/rs6000.opt:128
+msgid "Generate software floating point divide for better throughput"
msgstr ""
-#: cfgrtl.c:2172
-#, c-format
-msgid "verify_flow_info: Incorrect blocks for fallthru %i->%i"
+#: config/rs6000/rs6000.opt:132
+msgid "Do not place floating point constants in TOC"
msgstr ""
-#: cfgrtl.c:2181
-#, c-format
-msgid "verify_flow_info: Incorrect fallthru %i->%i"
+#: config/rs6000/rs6000.opt:136
+msgid "Place floating point constants in TOC"
msgstr ""
-#: cfgrtl.c:2183
-msgid "wrong insn in the fallthru edge"
+#: config/rs6000/rs6000.opt:140
+msgid "Do not place symbol+offset constants in TOC"
msgstr ""
-#: cfgrtl.c:2200
-msgid "basic blocks not laid down consecutively"
+#: config/rs6000/rs6000.opt:144
+msgid "Place symbol+offset constants in TOC"
msgstr ""
-#: cfgrtl.c:2225
-msgid "insn outside basic block"
+#: config/rs6000/rs6000.opt:155
+msgid "Use only one TOC entry per procedure"
msgstr ""
-#: cfgrtl.c:2232
-msgid "return not followed by barrier"
+#: config/rs6000/rs6000.opt:159
+msgid "Put everything in the regular TOC"
msgstr ""
-#: cfgrtl.c:2239
-#, c-format
-msgid "number of bb notes in insn chain (%d) != n_basic_blocks (%d)"
+#: config/rs6000/rs6000.opt:163
+msgid "Generate VRSAVE instructions when generating AltiVec code"
msgstr ""
-#: cgraph.c:291
-msgid "function body not available"
+#: config/rs6000/rs6000.opt:167
+msgid "Deprecated option. Use -mvrsave/-mno-vrsave instead."
msgstr ""
-#: cgraph.c:293 cgraphunit.c:752
-msgid "redefined extern inline functions are not considered for inlining"
+#: config/rs6000/rs6000.opt:171
+msgid "Generate isel instructions"
msgstr ""
-#: cgraph.c:296 cgraphunit.c:757
-msgid "function not considered for inlining"
+#: config/rs6000/rs6000.opt:175
+msgid "Deprecated option. Use -misel/-mno-isel instead"
msgstr ""
-#: cgraph.c:298 cgraphunit.c:755
-msgid "function not inlinable"
+#: config/rs6000/rs6000.opt:179
+msgid "Generate SPE SIMD instructions on E500"
msgstr ""
-#: cgraph.c:715
-msgid "%D renamed after being referenced in assembly"
+#: config/rs6000/rs6000.opt:183
+msgid "Deprecated option. Use -mspe/-mno-spe instead"
msgstr ""
-#: cgraphunit.c:572
-msgid "Shared call_expr:"
+#: config/rs6000/rs6000.opt:187
+msgid "Enable debug output"
msgstr ""
-#: cgraphunit.c:578
-msgid "Edge points to wrong declaration:"
+#: config/rs6000/rs6000.opt:191
+msgid "Specify ABI to use"
msgstr ""
-#: cgraphunit.c:587
-msgid "Missing callgraph edge for call expr:"
+#: config/rs6000/rs6000.opt:195 config/sparc/sparc.opt:92
+msgid "Use features of and schedule code for given CPU"
msgstr ""
-#: cgraphunit.c:613
-#, c-format
-msgid "Aux field set for edge %s->%s"
+#: config/rs6000/rs6000.opt:199 config/s390/s390.opt:80
+#: config/sparc/sparc.opt:96 config/i386/i386.opt:214 config/ia64/ia64.opt:97
+msgid "Schedule code for given CPU"
msgstr ""
-#: cgraphunit.c:625
-msgid "Inlined_to pointer is wrong"
+#: config/rs6000/rs6000.opt:203
+msgid "Select full, part, or no traceback table"
msgstr ""
-#: cgraphunit.c:630
-msgid "Multiple inline callers"
+#: config/rs6000/rs6000.opt:207
+msgid "Avoid all range limits on call instructions"
msgstr ""
-#: cgraphunit.c:637
-msgid "Inlined_to pointer set for noninline callers"
+#: config/rs6000/rs6000.opt:211
+msgid "Warn about deprecated 'vector long ...' AltiVec type usage"
msgstr ""
-#: cgraphunit.c:643
-msgid "Inlined_to pointer is set but no predecesors found"
+#: config/rs6000/rs6000.opt:215
+msgid "Select GPR floating point method."
msgstr ""
-#: cgraphunit.c:648
-msgid "Inlined_to pointer reffers to itself"
+#: config/rs6000/rs6000.opt:219
+msgid "Specify size of long double (64 or 128 bits)"
msgstr ""
-#: cgraphunit.c:658
-msgid "Node not found in DECL_ASSEMBLER_NAME hash"
+#: config/rs6000/rs6000.opt:223
+msgid "Determine which dependences between insns are considered costly"
msgstr ""
-#: cgraphunit.c:672
-#, c-format
-msgid "Edge %s->%s has no corresponding call_expr"
+#: config/rs6000/rs6000.opt:227
+msgid "Specify which post scheduling nop insertion scheme to apply"
msgstr ""
-#: cgraphunit.c:683
-msgid "verify_cgraph_node failed."
+#: config/rs6000/rs6000.opt:231
+msgid "Specify alignment of structure fields default/natural"
msgstr ""
-#: cgraphunit.c:907
-msgid "failed to reclaim unneeded function"
+#: config/rs6000/rs6000.opt:235
+msgid "Specify scheduling priority for dispatch slot restricted insns"
msgstr ""
-#: cgraphunit.c:1298
-msgid "--param large-function-growth limit reached"
+#: config/rs6000/linux64.opt:25
+msgid "Call mcount for profiling before a function prologue"
msgstr ""
-#: cgraphunit.c:1335
-msgid "recursive inlining"
+#: config/i860/i860.opt:24
+msgid "Generate code which uses the FPU"
msgstr ""
-#: cgraphunit.c:1500 cgraphunit.c:1752
-msgid "--param max-inline-insns-single limit reached"
+#: config/i860/i860.opt:28 config/i860/i860.opt:32
+msgid "Do not generate code which uses the FPU"
msgstr ""
-#: cgraphunit.c:1524
-msgid ""
-"--param max-inline-insns-single limit reached after inlining into the callee"
+#: config/alpha/alpha.opt:24 config/i386/i386.opt:182
+#: config/ns32k/ns32k.opt:104
+msgid "Do not use hardware fp"
msgstr ""
-#: cgraphunit.c:1574
-msgid "--param inline-unit-growth limit reached"
+#: config/alpha/alpha.opt:28
+msgid "Use fp registers"
msgstr ""
-#: cgraphunit.c:1937
-msgid "Nodes with no released memory found."
+#: config/alpha/alpha.opt:32
+msgid "Assume GAS"
msgstr ""
-#: collect2.c:393 gcc.c:6712
-#, c-format
-msgid "internal gcc abort in %s, at %s:%d"
+#: config/alpha/alpha.opt:36
+msgid "Do not assume GAS"
msgstr ""
-#: collect2.c:889
-msgid "no arguments"
+#: config/alpha/alpha.opt:40
+msgid "Request IEEE-conformant math library routines (OSF/1)"
msgstr ""
-#: collect2.c:1189
-#, c-format
-msgid "unknown demangling style '%s'"
+#: config/alpha/alpha.opt:44
+msgid "Emit IEEE-conformant code, without inexact exceptions"
msgstr ""
-#: collect2.c:1263 collect2.c:1411 collect2.c:1446
-#, c-format
-msgid "fopen %s"
+#: config/alpha/alpha.opt:51
+msgid "Do not emit complex integer constants to read-only memory"
msgstr ""
-#: collect2.c:1266 collect2.c:1416 collect2.c:1449
-#, c-format
-msgid "fclose %s"
+#: config/alpha/alpha.opt:55
+msgid "Use VAX fp"
msgstr ""
-#: collect2.c:1275
-#, c-format
-msgid "collect2 version %s"
+#: config/alpha/alpha.opt:59
+msgid "Do not use VAX fp"
msgstr ""
-#: collect2.c:1365
-#, c-format
-msgid "%d constructor(s) found\n"
+#: config/alpha/alpha.opt:63
+msgid "Emit code for the byte/word ISA extension"
msgstr ""
-#: collect2.c:1366
-#, c-format
-msgid "%d destructor(s) found\n"
+#: config/alpha/alpha.opt:67
+msgid "Emit code for the motion video ISA extension"
msgstr ""
-#: collect2.c:1367
-#, c-format
-msgid "%d frame table(s) found\n"
+#: config/alpha/alpha.opt:71
+msgid "Emit code for the fp move and sqrt ISA extension"
msgstr ""
-#: collect2.c:1504
-msgid "can't get program status"
+#: config/alpha/alpha.opt:75
+msgid "Emit code for the counting ISA extension"
msgstr ""
-#: collect2.c:1512
-#, c-format
-msgid "%s terminated with signal %d [%s]%s"
+#: config/alpha/alpha.opt:79
+msgid "Emit code using explicit relocation directives"
msgstr ""
-#: collect2.c:1530
-#, c-format
-msgid "%s returned %d exit status"
+#: config/alpha/alpha.opt:83
+msgid "Emit 16-bit relocations to the small data areas"
msgstr ""
-#: collect2.c:1554
-#, c-format
-msgid "[cannot find %s]"
+#: config/alpha/alpha.opt:87
+msgid "Emit 32-bit relocations to the small data areas"
msgstr ""
-#: collect2.c:1569
-#, c-format
-msgid "cannot find '%s'"
+#: config/alpha/alpha.opt:91
+msgid "Emit direct branches to local functions"
msgstr ""
-#: collect2.c:1573 collect2.c:2062 collect2.c:2217 gcc.c:2783
-msgid "pex_init failed"
+#: config/alpha/alpha.opt:95
+msgid "Emit indirect branches to local functions"
msgstr ""
-#: collect2.c:1608
-#, c-format
-msgid "[Leaving %s]\n"
+#: config/alpha/alpha.opt:99
+msgid "Emit rdval instead of rduniq for thread pointer"
msgstr ""
-#: collect2.c:1828
-#, c-format
-msgid ""
-"\n"
-"write_c_file - output name is %s, prefix is %s\n"
+#: config/alpha/alpha.opt:103 config/sparc/long-double-switch.opt:24
+msgid "Use 128-bit long double"
msgstr ""
-#: collect2.c:2036
-msgid "cannot find 'nm'"
+#: config/alpha/alpha.opt:107 config/sparc/long-double-switch.opt:28
+msgid "Use 64-bit long double"
msgstr ""
-#: collect2.c:2083
-msgid "can't open nm output"
+#: config/alpha/alpha.opt:111
+msgid "Use features of and schedule given CPU"
msgstr ""
-#: collect2.c:2127
-#, c-format
-msgid "init function found in object %s"
+#: config/alpha/alpha.opt:115
+msgid "Schedule given CPU"
msgstr ""
-#: collect2.c:2135
-#, c-format
-msgid "fini function found in object %s"
+#: config/alpha/alpha.opt:119
+msgid "Control the generated fp rounding mode"
msgstr ""
-#: collect2.c:2192
-msgid "cannot find 'ldd'"
+#: config/alpha/alpha.opt:123
+msgid "Control the IEEE trap mode"
msgstr ""
-#: collect2.c:2238
-msgid "can't open ldd output"
+#: config/alpha/alpha.opt:127
+msgid "Control the precision given to fp exceptions"
msgstr ""
-#: collect2.c:2241
-msgid ""
-"\n"
-"ldd output with constructors/destructors.\n"
+#: config/alpha/alpha.opt:131
+msgid "Tune expected memory latency"
msgstr ""
-#: collect2.c:2256
-#, c-format
-msgid "dynamic dependency %s not found"
+#: config/s390/s390.opt:24
+msgid "31 bit ABI"
msgstr ""
-#: collect2.c:2268
-#, c-format
-msgid "unable to open dynamic dependency '%s'"
+#: config/s390/s390.opt:28
+msgid "64 bit ABI"
msgstr ""
-#: collect2.c:2424
-#, c-format
-msgid "%s: not a COFF file"
+#: config/s390/s390.opt:32 config/i386/i386.opt:80
+msgid "Generate code for given CPU"
msgstr ""
-#: collect2.c:2544
-#, c-format
-msgid "%s: cannot open as COFF file"
+#: config/s390/s390.opt:36
+msgid "Maintain backchain pointer"
msgstr ""
-#: collect2.c:2602
-#, c-format
-msgid "library lib%s not found"
+#: config/s390/s390.opt:40
+msgid "Additional debug prints"
msgstr ""
-#: combine.c:12543
-#, c-format
-msgid ""
-";; Combiner statistics: %d attempts, %d substitutions (%d requiring new "
-"space),\n"
-";; %d successes.\n"
-"\n"
+#: config/s390/s390.opt:44
+msgid "ESA/390 architecture"
msgstr ""
-#: combine.c:12552
-#, c-format
+#: config/s390/s390.opt:48
+msgid "Enable fused multiply/add instructions"
+msgstr ""
+
+#: config/s390/s390.opt:52 config/i386/i386.opt:48 config/i386/i386.opt:114
+#: config/ns32k/ns32k.opt:28
+msgid "Use hardware fp"
+msgstr ""
+
+#: config/s390/s390.opt:56
+msgid "Use packed stack layout"
+msgstr ""
+
+#: config/s390/s390.opt:60
+msgid "Use bras for executable < 64k"
+msgstr ""
+
+#: config/s390/s390.opt:64
+msgid "Don't use hardware fp"
+msgstr ""
+
+#: config/s390/s390.opt:68
msgid ""
-"\n"
-";; Combiner totals: %d attempts, %d substitutions (%d requiring new space),\n"
-";; %d successes.\n"
+"Set the max. number of bytes which has to be left to stack size before a "
+"trap instruction is triggered"
msgstr ""
-#: convert.c:69
-msgid "cannot convert to a pointer type"
+#: config/s390/s390.opt:72
+msgid ""
+"Emit extra code in the function prologue in order to trap if the stack size "
+"exceeds the given limit"
msgstr ""
-#: convert.c:302
-msgid "pointer value used where a floating point value was expected"
+#: config/s390/s390.opt:76
+msgid "Enable tpf OS tracing code"
msgstr ""
-#: convert.c:306
-msgid "aggregate value used where a float was expected"
+#: config/s390/s390.opt:84
+msgid "mvcle use"
msgstr ""
-#: convert.c:331
-msgid "conversion to incomplete type"
+#: config/s390/s390.opt:88
+msgid "Warn if a function uses alloca or creates an array with dynamic size"
msgstr ""
-#: convert.c:660 convert.c:736
-msgid "can't convert between vector values of different size"
+#: config/s390/s390.opt:92
+msgid "Warn if a single function's framesize exceeds the given framesize"
msgstr ""
-#: convert.c:666
-msgid "aggregate value used where an integer was expected"
+#: config/s390/s390.opt:96
+msgid "z/Architecture"
msgstr ""
-#: convert.c:716
-msgid "pointer value used where a complex was expected"
+#: config/h8300/h8300.opt:24
+msgid "Generate H8S code"
msgstr ""
-#: convert.c:720
-msgid "aggregate value used where a complex was expected"
+#: config/h8300/h8300.opt:28
+msgid "Generate H8SX code"
msgstr ""
-#: convert.c:742
-msgid "can't convert value to a vector"
+#: config/h8300/h8300.opt:32
+msgid "Generate H8S/2600 code"
msgstr ""
-#: coverage.c:183
-#, c-format
-msgid "%qs is not a gcov data file"
+#: config/h8300/h8300.opt:36
+msgid "Make integers 32 bits wide"
msgstr ""
-#: coverage.c:194
-msgid "%qs is version %q.*s, expected version %q.*s"
+#: config/h8300/h8300.opt:43
+msgid "Use registers for argument passing"
msgstr ""
-#: coverage.c:274 coverage.c:282
-#, c-format
-msgid "coverage mismatch for function %u while reading execution counters."
+#: config/h8300/h8300.opt:47
+msgid "Consider access to byte sized memory slow"
msgstr ""
-#: coverage.c:276 coverage.c:359
-#, c-format
-msgid "checksum is %x instead of %x"
+#: config/h8300/h8300.opt:51
+msgid "Enable linker relaxing"
msgstr ""
-#: coverage.c:284 coverage.c:367
-#, c-format
-msgid "number of counters is %d instead of %d"
+#: config/h8300/h8300.opt:55
+msgid "Generate H8/300H code"
msgstr ""
-#: coverage.c:290
-#, c-format
-msgid "cannot merge separate %s counters for function %u"
+#: config/h8300/h8300.opt:59
+msgid "Enable the normal mode"
msgstr ""
-#: coverage.c:311
-#, c-format
-msgid "%qs has overflowed"
+#: config/h8300/h8300.opt:63
+msgid "Use H8/300 alignment rules"
msgstr ""
-#: coverage.c:311
-#, c-format
-msgid "%qs is corrupted"
+#: config/cris/cris.opt:46
+msgid "Work around bug in multiplication instruction"
msgstr ""
-#: coverage.c:348
-#, c-format
-msgid "no coverage for function %qs found."
+#: config/cris/cris.opt:52
+msgid "Compile for ETRAX 4 (CRIS v3)"
msgstr ""
-#: coverage.c:356 coverage.c:364
-#, c-format
-msgid "coverage mismatch for function %qs while reading counter %qs."
+#: config/cris/cris.opt:57
+msgid "Compile for ETRAX 100 (CRIS v8)"
msgstr ""
-#: coverage.c:547
-#, c-format
-msgid "cannot open %s"
+#: config/cris/cris.opt:65
+msgid "Emit verbose debug information in assembly code"
msgstr ""
-#: coverage.c:582
-#, c-format
-msgid "error writing %qs"
+#: config/cris/cris.opt:72
+msgid "Do not use condition codes from normal instructions"
msgstr ""
-#: cppspec.c:106
-#, c-format
-msgid "\"%s\" is not a valid option to the preprocessor"
+#: config/cris/cris.opt:81
+msgid "Do not emit addressing modes with side-effect assignment"
msgstr ""
-#: cppspec.c:128
-msgid "too many input files"
+#: config/cris/cris.opt:90
+msgid "Do not tune stack alignment"
msgstr ""
-#: cse.c:6801
-#, c-format
-msgid ";; Processing block from %d to %d, %d sets.\n"
+#: config/cris/cris.opt:99
+msgid "Do not tune writable data alignment"
msgstr ""
-#: diagnostic.c:171
-#, c-format
-msgid "%s:%d: confused by earlier errors, bailing out\n"
+#: config/cris/cris.opt:108
+msgid "Do not tune code and read-only data alignment"
msgstr ""
-#: diagnostic.c:231
-msgid "compilation terminated due to -Wfatal-errors.\n"
+#: config/cris/cris.opt:117
+msgid "Align code and data to 32 bits"
msgstr ""
-#: diagnostic.c:240
-#, c-format
-msgid ""
-"Please submit a full bug report,\n"
-"with preprocessed source if appropriate.\n"
-"See %s for instructions.\n"
+#: config/cris/cris.opt:134
+msgid "Don't align items in code or data"
msgstr ""
-#: diagnostic.c:249
-msgid "compilation terminated.\n"
+#: config/cris/cris.opt:143
+msgid "Do not emit function prologue or epilogue"
msgstr ""
-#: diagnostic.c:540
-msgid "Internal compiler error: Error reporting routines re-entered.\n"
+#: config/cris/cris.opt:150
+msgid "Use the most feature-enabling options allowed by other options"
msgstr ""
-#: diagnostic.c:559
-#, c-format
-msgid "in %s, at %s:%d"
+#: config/cris/cris.opt:159
+msgid "Override -mbest-lib-options"
msgstr ""
-#: dominance.c:834
-#, c-format
-msgid "dominator of %d status unknown"
+#: config/cris/cris.opt:166
+msgid "Generate code for the specified chip or CPU version"
msgstr ""
-#: dominance.c:836
-#, c-format
-msgid "dominator of %d should be %d, not %d"
+#: config/cris/cris.opt:170
+msgid "Tune alignment for the specified chip or CPU version"
msgstr ""
-#: dominance.c:848
-#, c-format
-msgid "ENTRY does not dominate bb %d"
+#: config/cris/cris.opt:174
+msgid "Warn when a stackframe is larger than the specified size"
msgstr ""
-#: dwarf2out.c:3443
-#, c-format
-msgid "DW_LOC_OP %s not implemented\n"
+#: config/cris/linux.opt:28
+msgid "Together with -fpic and -fPIC, do not use GOTPLT references"
msgstr ""
-#: emit-rtl.c:2200
-msgid "Invalid rtl sharing found in the insn"
+#: config/cris/aout.opt:28
+msgid "Compile for the MMU-less Etrax 100-based elinux system"
msgstr ""
-#: emit-rtl.c:2202
-msgid "Shared rtx"
+#: config/cris/aout.opt:34
+msgid "For elinux, request a specified stack-size for this program"
msgstr ""
-#: emit-rtl.c:2204
-msgid "Internal consistency failure"
+#: config/stormy16/stormy16.opt:25
+msgid "Provide libraries for the simulator"
msgstr ""
-#: emit-rtl.c:3268
-msgid "ICE: emit_insn used where emit_jump_insn needed:\n"
+#: config/arc/arc.opt:33
+msgid "Prepend the name of the cpu to all public symbol names"
msgstr ""
-#: errors.c:133 java/jv-scan.c:272
-#, c-format
-msgid "abort in %s, at %s:%d"
+#: config/arc/arc.opt:43
+msgid "Compile code for ARC variant CPU"
msgstr ""
-#: except.c:340
-msgid "exception handling disabled, use -fexceptions to enable"
+#: config/arc/arc.opt:47
+msgid "Put functions in SECTION"
msgstr ""
-#: except.c:2577
-msgid "argument of %<__builtin_eh_return_regno%> must be constant"
+#: config/arc/arc.opt:51
+msgid "Put data in SECTION"
msgstr ""
-#: except.c:2708
-msgid "__builtin_eh_return not supported on this target"
+#: config/arc/arc.opt:55
+msgid "Put read-only data in SECTION"
msgstr ""
-#: explow.c:1301
-msgid "stack limits not supported on this target"
+#: config/vax/vax.opt:24 config/vax/vax.opt:28
+msgid "Target DFLOAT double precision code"
msgstr ""
-#: final.c:1062
-msgid "negative insn length"
+#: config/vax/vax.opt:32 config/vax/vax.opt:36
+msgid "Generate GFLOAT double precision code"
msgstr ""
-#: final.c:2419
-msgid "could not split insn"
+#: config/vax/vax.opt:40
+msgid "Generate code for GNU assembler (gas)"
msgstr ""
-#: final.c:2765
-msgid "invalid 'asm': "
+#: config/vax/vax.opt:44
+msgid "Generate code for UNIX assembler"
msgstr ""
-#: final.c:2948
-msgid "nested assembly dialect alternatives"
+#: config/vax/vax.opt:48
+msgid "Use VAXC structure conventions"
msgstr ""
-#: final.c:2965 final.c:2977
-msgid "unterminated assembly dialect alternative"
+#: config/c4x/c4x.opt:24
+msgid "Generate code for C30 CPU"
msgstr ""
-#: final.c:3024
-#, c-format
-msgid "operand number missing after %%-letter"
+#: config/c4x/c4x.opt:28
+msgid "Generate code for C31 CPU"
msgstr ""
-#: final.c:3027 final.c:3068
-msgid "operand number out of range"
+#: config/c4x/c4x.opt:32
+msgid "Generate code for C32 CPU"
msgstr ""
-#: final.c:3087
-#, c-format
-msgid "invalid %%-code"
+#: config/c4x/c4x.opt:36
+msgid "Generate code for C33 CPU"
msgstr ""
-#: final.c:3117
-#, c-format
-msgid "'%%l' operand isn't a label"
+#: config/c4x/c4x.opt:40
+msgid "Generate code for C40 CPU"
msgstr ""
-#. We can't handle floating point constants;
-#. PRINT_OPERAND must handle them.
-#. We can't handle floating point constants; PRINT_OPERAND must
-#. handle them.
-#. We can't handle floating point constants;
-#. PRINT_OPERAND must handle them.
-#: final.c:3219 vmsdbgout.c:487 config/i386/i386.c:6001
-#: config/pdp11/pdp11.c:1714
-msgid "floating constant misused"
+#: config/c4x/c4x.opt:44
+msgid "Generate code for C44 CPU"
msgstr ""
-#: final.c:3275 vmsdbgout.c:544 config/i386/i386.c:6079
-#: config/pdp11/pdp11.c:1761
-msgid "invalid expression as operand"
+#: config/c4x/c4x.opt:48
+msgid "Assume that pointers may be aliased"
msgstr ""
-#: flow.c:494 flow.c:518 flow.c:540
-msgid "internal consistency failure"
+#: config/c4x/c4x.opt:52
+msgid "Big memory model"
msgstr ""
-#: flow.c:1689
-msgid "Attempt to delete prologue/epilogue insn:"
+#: config/c4x/c4x.opt:56
+msgid "Use the BK register as a general purpose register"
msgstr ""
-#: fold-const.c:3231 fold-const.c:3242
-#, c-format
-msgid "comparison is always %d due to width of bit-field"
+#: config/c4x/c4x.opt:60
+msgid "Generate code for CPU"
msgstr ""
-#: fold-const.c:4813 fold-const.c:4828
-#, c-format
-msgid "comparison is always %d"
+#: config/c4x/c4x.opt:64
+msgid "Enable use of DB instruction"
msgstr ""
-#: fold-const.c:4957
-msgid "%<or%> of unmatched not-equal tests is always 1"
+#: config/c4x/c4x.opt:68
+msgid "Enable debugging"
msgstr ""
-#: fold-const.c:4962
-msgid "%<and%> of mutually exclusive equal-tests is always 0"
+#: config/c4x/c4x.opt:72
+msgid "Enable new features under development"
msgstr ""
-#: fold-const.c:10071
-msgid "fold check: original tree changed by fold"
+#: config/c4x/c4x.opt:76
+msgid "Use fast but approximate float to integer conversion"
msgstr ""
-#: function.c:832 varasm.c:1658
-msgid "%Jsize of variable %qD is too large"
+#: config/c4x/c4x.opt:80
+msgid "Force RTL generation to emit valid 3 operand insns"
msgstr ""
-#: function.c:1443
-msgid "impossible constraint in %<asm%>"
+#: config/c4x/c4x.opt:84
+msgid "Force constants into registers to improve hoisting"
msgstr ""
-#: function.c:3614
-msgid "%Jvariable %qD might be clobbered by %<longjmp%> or %<vfork%>"
+#: config/c4x/c4x.opt:88 config/c4x/c4x.opt:112
+msgid "Save DP across ISR in small memory model"
msgstr ""
-#: function.c:3635
-msgid "%Jargument %qD might be clobbered by %<longjmp%> or %<vfork%>"
+#: config/c4x/c4x.opt:92
+msgid "Allow unsigned iteration counts for RPTB/DB"
msgstr ""
-#: function.c:4026
-msgid "function returns an aggregate"
+#: config/c4x/c4x.opt:96
+msgid "Pass arguments on the stack"
msgstr ""
-#: function.c:4349
-msgid "%Junused parameter %qD"
+#: config/c4x/c4x.opt:100
+msgid "Use MPYI instruction for C3x"
msgstr ""
-#: gcc.c:1226
-#, c-format
-msgid "ambiguous abbreviation %s"
+#: config/c4x/c4x.opt:104
+msgid "Enable parallel instructions"
msgstr ""
-#: gcc.c:1253
-#, c-format
-msgid "incomplete '%s' option"
+#: config/c4x/c4x.opt:108
+msgid "Enable MPY||ADD and MPY||SUB instructions"
msgstr ""
-#: gcc.c:1264
-#, c-format
-msgid "missing argument to '%s' option"
+#: config/c4x/c4x.opt:116
+msgid "Preserve all 40 bits of FP reg across call"
msgstr ""
-#: gcc.c:1277
-#, c-format
-msgid "extraneous argument to '%s' option"
+#: config/c4x/c4x.opt:120
+msgid "Pass arguments in registers"
msgstr ""
-#: gcc.c:1621
-msgid "Using built-in specs.\n"
+#: config/c4x/c4x.opt:124
+msgid "Enable use of RTPB instruction"
msgstr ""
-#: gcc.c:1804
-#, c-format
-msgid ""
-"Setting spec %s to '%s'\n"
-"\n"
+#: config/c4x/c4x.opt:128
+msgid "Enable use of RTPS instruction"
msgstr ""
-#: gcc.c:1913
-#, c-format
-msgid "Reading specs from %s\n"
+#: config/c4x/c4x.opt:132
+msgid "Set the maximum number of iterations for RPTS to N"
msgstr ""
-#: gcc.c:2009 gcc.c:2028
-#, c-format
-msgid "specs %%include syntax malformed after %ld characters"
+#: config/c4x/c4x.opt:136
+msgid "Small memory model"
msgstr ""
-#: gcc.c:2036
-#, c-format
-msgid "could not find specs file %s\n"
+#: config/c4x/c4x.opt:140
+msgid "Emit code compatible with TI tools"
msgstr ""
-#: gcc.c:2053 gcc.c:2061 gcc.c:2070 gcc.c:2079
-#, c-format
-msgid "specs %%rename syntax malformed after %ld characters"
+#: config/sparc/sparc.opt:24 config/sparc/sparc.opt:28
+msgid "Use hardware FP"
msgstr ""
-#: gcc.c:2088
-#, c-format
-msgid "specs %s spec was not found to be renamed"
+#: config/sparc/sparc.opt:32
+msgid "Do not use hardware FP"
msgstr ""
-#: gcc.c:2095
-#, c-format
-msgid "%s: attempt to rename spec '%s' to already defined spec '%s'"
+#: config/sparc/sparc.opt:36
+msgid "Assume possible double misalignment"
msgstr ""
-#: gcc.c:2100
-#, c-format
-msgid "rename spec %s to %s\n"
+#: config/sparc/sparc.opt:40
+msgid "Pass -assert pure-text to linker"
msgstr ""
-#: gcc.c:2102
-#, c-format
-msgid ""
-"spec is '%s'\n"
-"\n"
+#: config/sparc/sparc.opt:44
+msgid "Use ABI reserved registers"
msgstr ""
-#: gcc.c:2115
-#, c-format
-msgid "specs unknown %% command after %ld characters"
+#: config/sparc/sparc.opt:48
+msgid "Use hardware quad FP instructions"
msgstr ""
-#: gcc.c:2126 gcc.c:2139
-#, c-format
-msgid "specs file malformed after %ld characters"
+#: config/sparc/sparc.opt:52
+msgid "Do not use hardware quad fp instructions"
msgstr ""
-#: gcc.c:2192
-msgid "spec file has no spec for linking"
+#: config/sparc/sparc.opt:56
+msgid "Compile for V8+ ABI"
msgstr ""
-#: gcc.c:2614
-#, c-format
-msgid "system path '%s' is not absolute"
+#: config/sparc/sparc.opt:60
+msgid "Use UltraSPARC Visual Instruction Set extensions"
msgstr ""
-#: gcc.c:2677
-msgid "-pipe not supported"
+#: config/sparc/sparc.opt:64
+msgid "Pointers are 64-bit"
msgstr ""
-#: gcc.c:2739
-msgid ""
-"\n"
-"Go ahead? (y or n) "
+#: config/sparc/sparc.opt:68
+msgid "Pointers are 32-bit"
msgstr ""
-#: gcc.c:2822
-msgid "failed to get exit status"
+#: config/sparc/sparc.opt:72
+msgid "Use 64-bit ABI"
msgstr ""
-#: gcc.c:2828
-msgid "failed to get process times"
+#: config/sparc/sparc.opt:76
+msgid "Use 32-bit ABI"
msgstr ""
-#: gcc.c:2851
-#, c-format
-msgid ""
-"Internal error: %s (program %s)\n"
-"Please submit a full bug report.\n"
-"See %s for instructions."
+#: config/sparc/sparc.opt:80
+msgid "Use stack bias"
msgstr ""
-#: gcc.c:2879
-#, c-format
-msgid "# %s %.2f %.2f\n"
+#: config/sparc/sparc.opt:84
+msgid "Use structs on stronger alignment for double-word copies"
msgstr ""
-#: gcc.c:3008
-#, c-format
-msgid "Usage: %s [options] file...\n"
+#: config/sparc/sparc.opt:88
+msgid "Optimize tail call instructions in assembler and linker"
msgstr ""
-#: gcc.c:3009
-msgid "Options:\n"
+#: config/sparc/sparc.opt:100
+msgid "Use given SPARC-V9 code model"
msgstr ""
-#: gcc.c:3011
-msgid " -pass-exit-codes Exit with highest error code from a phase\n"
+#: config/sparc/little-endian.opt:24
+msgid "Generate code for little-endian"
msgstr ""
-#: gcc.c:3012
-msgid " --help Display this information\n"
+#: config/sparc/little-endian.opt:28
+msgid "Generate code for big-endian"
msgstr ""
-#: gcc.c:3013
-msgid ""
-" --target-help Display target specific command line options\n"
+#: config/mips/mips.opt:24
+msgid "Generate code that conforms to the given ABI"
msgstr ""
-#: gcc.c:3015
-msgid " (Use '-v --help' to display command line options of sub-processes)\n"
+#: config/mips/mips.opt:28
+msgid "Use SVR4-style PIC"
msgstr ""
-#: gcc.c:3016
-msgid " -dumpspecs Display all of the built in spec strings\n"
+#: config/mips/mips.opt:32
+msgid "Use PMC-style 'mad' instructions"
msgstr ""
-#: gcc.c:3017
-msgid " -dumpversion Display the version of the compiler\n"
+#: config/mips/mips.opt:36
+msgid "Generate code for the given ISA"
msgstr ""
-#: gcc.c:3018
-msgid " -dumpmachine Display the compiler's target processor\n"
+#: config/mips/mips.opt:40
+msgid "Use Branch Likely instructions, overriding the architecture default"
msgstr ""
-#: gcc.c:3019
-msgid ""
-" -print-search-dirs Display the directories in the compiler's search "
-"path\n"
+#: config/mips/mips.opt:44
+msgid "Trap on integer divide by zero"
msgstr ""
-#: gcc.c:3020
-msgid ""
-" -print-libgcc-file-name Display the name of the compiler's companion "
-"library\n"
+#: config/mips/mips.opt:48
+msgid "Use branch-and-break sequences to check for integer divide by zero"
msgstr ""
-#: gcc.c:3021
-msgid " -print-file-name=<lib> Display the full path to library <lib>\n"
+#: config/mips/mips.opt:52
+msgid "Use trap instructions to check for integer divide by zero"
msgstr ""
-#: gcc.c:3022
+#: config/mips/mips.opt:56
msgid ""
-" -print-prog-name=<prog> Display the full path to compiler component "
-"<prog>\n"
+"Allow hardware floating-point instructions to cover both 32-bit and 64-bit "
+"operations"
msgstr ""
-#: gcc.c:3023
-msgid ""
-" -print-multi-directory Display the root directory for versions of "
-"libgcc\n"
+#: config/mips/mips.opt:66
+msgid "Use big-endian byte order"
msgstr ""
-#: gcc.c:3024
-msgid ""
-" -print-multi-lib Display the mapping between command line options "
-"and\n"
-" multiple library search directories\n"
+#: config/mips/mips.opt:70
+msgid "Use little-endian byte order"
msgstr ""
-#: gcc.c:3027
-msgid " -print-multi-os-directory Display the relative path to OS libraries\n"
+#: config/mips/mips.opt:74 config/iq2000/iq2000.opt:32
+msgid "Use ROM instead of RAM"
msgstr ""
-#: gcc.c:3028
-msgid ""
-" -Wa,<options> Pass comma-separated <options> on to the "
-"assembler\n"
+#: config/mips/mips.opt:78
+msgid "Use NewABI-style %reloc() assembly operators"
msgstr ""
-#: gcc.c:3029
-msgid ""
-" -Wp,<options> Pass comma-separated <options> on to the "
-"preprocessor\n"
+#: config/mips/mips.opt:82
+msgid "Work around certain R4000 errata"
msgstr ""
-#: gcc.c:3030
-msgid ""
-" -Wl,<options> Pass comma-separated <options> on to the linker\n"
+#: config/mips/mips.opt:86
+msgid "Work around certain R4400 errata"
msgstr ""
-#: gcc.c:3031
-msgid " -Xassembler <arg> Pass <arg> on to the assembler\n"
+#: config/mips/mips.opt:90
+msgid "Work around errata for early SB-1 revision 2 cores"
msgstr ""
-#: gcc.c:3032
-msgid " -Xpreprocessor <arg> Pass <arg> on to the preprocessor\n"
+#: config/mips/mips.opt:94
+msgid "Work around certain VR4120 errata"
msgstr ""
-#: gcc.c:3033
-msgid " -Xlinker <arg> Pass <arg> on to the linker\n"
+#: config/mips/mips.opt:98
+msgid "Work around VR4130 mflo/mfhi errata"
msgstr ""
-#: gcc.c:3034
-msgid ""
-" -combine Pass multiple source files to compiler at once\n"
+#: config/mips/mips.opt:102
+msgid "Work around an early 4300 hardware bug"
msgstr ""
-#: gcc.c:3035
-msgid " -save-temps Do not delete intermediate files\n"
+#: config/mips/mips.opt:106
+msgid "FP exceptions are enabled"
msgstr ""
-#: gcc.c:3036
-msgid " -pipe Use pipes rather than intermediate files\n"
+#: config/mips/mips.opt:110
+msgid "Use 32-bit floating-point registers"
msgstr ""
-#: gcc.c:3037
-msgid " -time Time the execution of each subprocess\n"
+#: config/mips/mips.opt:114
+msgid "Use 64-bit floating-point registers"
msgstr ""
-#: gcc.c:3038
-msgid ""
-" -specs=<file> Override built-in specs with the contents of "
-"<file>\n"
+#: config/mips/mips.opt:118
+msgid "Use FUNC to flush the cache before calling stack trampolines"
msgstr ""
-#: gcc.c:3039
-msgid ""
-" -std=<standard> Assume that the input sources are for <standard>\n"
+#: config/mips/mips.opt:122
+msgid "Generate floating-point multiply-add instructions"
msgstr ""
-#: gcc.c:3040
-msgid ""
-" -B <directory> Add <directory> to the compiler's search paths\n"
+#: config/mips/mips.opt:126
+msgid "Use 32-bit general registers"
msgstr ""
-#: gcc.c:3041
-msgid " -b <machine> Run gcc for target <machine>, if installed\n"
+#: config/mips/mips.opt:130
+msgid "Use 64-bit general registers"
msgstr ""
-#: gcc.c:3042
-msgid ""
-" -V <version> Run gcc version number <version>, if installed\n"
+#: config/mips/mips.opt:134
+msgid "Allow the use of hardware floating-point instructions"
msgstr ""
-#: gcc.c:3043
-msgid ""
-" -v Display the programs invoked by the compiler\n"
+#: config/mips/mips.opt:138
+msgid "Generate code for ISA level N"
msgstr ""
-#: gcc.c:3044
-msgid ""
-" -### Like -v but options quoted and commands not "
-"executed\n"
+#: config/mips/mips.opt:142
+msgid "Generate mips16 code"
msgstr ""
-#: gcc.c:3045
-msgid ""
-" -E Preprocess only; do not compile, assemble or "
-"link\n"
+#: config/mips/mips.opt:146
+msgid "Use MIPS-3D instructions"
msgstr ""
-#: gcc.c:3046
-msgid " -S Compile only; do not assemble or link\n"
+#: config/mips/mips.opt:150
+msgid "Use indirect calls"
msgstr ""
-#: gcc.c:3047
-msgid " -c Compile and assemble, but do not link\n"
+#: config/mips/mips.opt:154
+msgid "Use a 32-bit long type"
msgstr ""
-#: gcc.c:3048
-msgid " -o <file> Place the output into <file>\n"
+#: config/mips/mips.opt:158
+msgid "Use a 64-bit long type"
msgstr ""
-#: gcc.c:3049
-msgid ""
-" -x <language> Specify the language of the following input "
-"files\n"
-" Permissible languages include: c c++ assembler "
-"none\n"
-" 'none' means revert to the default behavior of\n"
-" guessing the language based on the file's "
-"extension\n"
+#: config/mips/mips.opt:162
+msgid "Don't optimize block moves"
msgstr ""
-#: gcc.c:3056
-#, c-format
-msgid ""
-"\n"
-"Options starting with -g, -f, -m, -O, -W, or --param are automatically\n"
-" passed on to the various sub-processes invoked by %s. In order to pass\n"
-" other options on to these processes the -W<letter> options must be used.\n"
+#: config/mips/mips.opt:166
+msgid "Use the mips-tfile postpass"
msgstr ""
-#: gcc.c:3176
-#, c-format
-msgid "'-%c' option must have argument"
+#: config/mips/mips.opt:170
+msgid "Do not use a cache-flushing function before calling stack trampolines"
msgstr ""
-#: gcc.c:3198
-#, c-format
-msgid "couldn't run '%s': %s"
+#: config/mips/mips.opt:174
+msgid "Generate normal-mode code"
msgstr ""
-#. translate_options () has turned --version into -fversion.
-#: gcc.c:3383
-#, c-format
-msgid "%s (GCC) %s\n"
+#: config/mips/mips.opt:178
+msgid "Do not use MIPS-3D instructions"
msgstr ""
-#: gcc.c:3385 gcov.c:412 java/gjavah.c:2376 java/jcf-dump.c:931
-#: java/jv-scan.c:128
-msgid "(C)"
+#: config/mips/mips.opt:182
+msgid "Use paired-single floating-point instructions"
msgstr ""
-#: gcc.c:3386 java/gjavah.c:2377 java/jcf-dump.c:932 java/jv-scan.c:129
-#, c-format
+#: config/mips/mips.opt:186
msgid ""
-"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"
+"Restrict the use of hardware floating-point instructions to 32-bit operations"
msgstr ""
-#: gcc.c:3487
-msgid "argument to '-Xlinker' is missing"
+#: config/mips/mips.opt:190
+msgid "Prevent the use of all hardware floating-point instructions"
msgstr ""
-#: gcc.c:3495
-msgid "argument to '-Xpreprocessor' is missing"
+#: config/mips/mips.opt:194
+msgid "Optimize lui/addiu address loads"
msgstr ""
-#: gcc.c:3502
-msgid "argument to '-Xassembler' is missing"
+#: config/mips/mips.opt:198
+msgid "Assume all symbols have 32-bit values"
msgstr ""
-#: gcc.c:3509
-msgid "argument to '-l' is missing"
+#: config/mips/mips.opt:202
+msgid "Optimize the output for PROCESSOR"
msgstr ""
-#: gcc.c:3530
-msgid "argument to '-specs' is missing"
+#: config/mips/mips.opt:206 config/iq2000/iq2000.opt:45
+msgid "Put uninitialized constants in ROM (needs -membedded-data)"
msgstr ""
-#: gcc.c:3544
-msgid "argument to '-specs=' is missing"
+#: config/mips/mips.opt:210
+msgid "Perform VR4130-specific alignment optimizations"
msgstr ""
-#: gcc.c:3581
-#, c-format
-msgid "'-%c' must come at the start of the command line"
+#: config/mips/mips.opt:214
+msgid "Lift restrictions on GOT size"
msgstr ""
-#: gcc.c:3590
-msgid "argument to '-B' is missing"
+#: config/sh/sh.opt:45
+msgid "Generate SH1 code"
msgstr ""
-#: gcc.c:3763
-msgid "warning: -pipe ignored because -save-temps specified"
+#: config/sh/sh.opt:49
+msgid "Generate SH2 code"
msgstr ""
-#: gcc.c:3974
-msgid "argument to '-x' is missing"
+#: config/sh/sh.opt:53
+msgid "Generate SH2a code"
msgstr ""
-#: gcc.c:4002
-#, c-format
-msgid "argument to '-%s' is missing"
+#: config/sh/sh.opt:57
+msgid "Generate SH2a FPU-less code"
msgstr ""
-#: gcc.c:4063
-#, c-format
-msgid "warning: '-x %s' after last input file has no effect"
+#: config/sh/sh.opt:61
+msgid "Generate default single-precision SH2a code"
msgstr ""
-#: gcc.c:4340
-#, c-format
-msgid "switch '%s' does not start with '-'"
+#: config/sh/sh.opt:65
+msgid "Generate only single-precision SH2a code"
msgstr ""
-#: gcc.c:4570
-#, c-format
-msgid "spec '%s' invalid"
+#: config/sh/sh.opt:69
+msgid "Generate SH2e code"
msgstr ""
-#: gcc.c:4636
-#, c-format
-msgid "%s\n"
+#: config/sh/sh.opt:73
+msgid "Generate SH3 code"
msgstr ""
-#: gcc.c:4709
-#, c-format
-msgid "spec '%s' has invalid '%%0%c'"
+#: config/sh/sh.opt:77
+msgid "Generate SH3e code"
msgstr ""
-#: gcc.c:4906
-#, c-format
-msgid "spec '%s' has invalid '%%W%c"
+#: config/sh/sh.opt:81
+msgid "Generate SH4 code"
msgstr ""
-#: gcc.c:4937
-#, c-format
-msgid "spec '%s' has invalid '%%x%c'"
+#: config/sh/sh.opt:85
+msgid "Generate SH4 FPU-less code"
msgstr ""
-#. Catch the case where a spec string contains something like
-#. '%{foo:%*}'. i.e. there is no * in the pattern on the left
-#. hand side of the :.
-#: gcc.c:5132
-#, c-format
-msgid "spec failure: '%%*' has not been initialized by pattern match"
+#: config/sh/sh.opt:89
+msgid "Generate default single-precision SH4 code"
msgstr ""
-#: gcc.c:5141
-#, c-format
-msgid "warning: use of obsolete %%[ operator in specs"
+#: config/sh/sh.opt:93
+msgid "Generate only single-precision SH4 code"
msgstr ""
-#: gcc.c:5159
-#, c-format
-msgid "Processing spec %c%s%c, which is '%s'\n"
+#: config/sh/sh.opt:97
+msgid "Generate SH4a code"
msgstr ""
-#: gcc.c:5222
-#, c-format
-msgid "spec failure: unrecognized spec option '%c'"
+#: config/sh/sh.opt:101
+msgid "Generate SH4a FPU-less code"
msgstr ""
-#: gcc.c:5301
-#, c-format
-msgid "unknown spec function '%s'"
+#: config/sh/sh.opt:105
+msgid "Generate default single-precision SH4a code"
msgstr ""
-#: gcc.c:5320
-#, c-format
-msgid "error in args to spec function '%s'"
+#: config/sh/sh.opt:109
+msgid "Generate only single-precision SH4a code"
msgstr ""
-#: gcc.c:5368
-msgid "malformed spec function name"
+#: config/sh/sh.opt:113
+msgid "Generate SH4al-dsp code"
msgstr ""
-#. )
-#: gcc.c:5371
-msgid "no arguments for spec function"
+#: config/sh/sh.opt:117
+msgid "Generate 32-bit SHmedia code"
msgstr ""
-#: gcc.c:5390
-msgid "malformed spec function arguments"
+#: config/sh/sh.opt:121
+msgid "Generate 32-bit FPU-less SHmedia code"
msgstr ""
-#: gcc.c:5629
-#, c-format
-msgid "braced spec '%s' is invalid at '%c'"
+#: config/sh/sh.opt:125
+msgid "Generate 64-bit SHmedia code"
msgstr ""
-#: gcc.c:5717
-#, c-format
-msgid "braced spec body '%s' is invalid"
+#: config/sh/sh.opt:129
+msgid "Generate 64-bit FPU-less SHmedia code"
msgstr ""
-#: gcc.c:6143
-msgid "spec failure: more than one arg to SYSROOT_SUFFIX_SPEC."
+#: config/sh/sh.opt:133
+msgid "Generate SHcompact code"
msgstr ""
-#: gcc.c:6153
-msgid "spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC."
+#: config/sh/sh.opt:137
+msgid "Generate FPU-less SHcompact code"
msgstr ""
-#: gcc.c:6242
-#, c-format
-msgid "unrecognized option '-%s'"
+#: config/sh/sh.opt:141
+msgid ""
+"Throttle unrolling to avoid thrashing target registers unless the unroll "
+"benefit outweighs this"
msgstr ""
-#: gcc.c:6248
-#, c-format
-msgid "install: %s%s\n"
+#: config/sh/sh.opt:145
+msgid "Generate code in big endian mode"
msgstr ""
-#: gcc.c:6249
-#, c-format
-msgid "programs: %s\n"
+#: config/sh/sh.opt:149
+msgid "Generate 32-bit offsets in switch tables"
msgstr ""
-#: gcc.c:6250
-#, c-format
-msgid "libraries: %s\n"
+#: config/sh/sh.opt:153
+msgid "Enable SH5 cut2 workaround"
msgstr ""
-#: gcc.c:6307
-#, c-format
+#: config/sh/sh.opt:157
+msgid "Align doubles at 64-bit boundaries"
+msgstr ""
+
+#: config/sh/sh.opt:161
msgid ""
-"\n"
-"For bug reporting instructions, please see:\n"
+"Division strategy, one of: call, call2, fp, inv, inv:minlat, inv20u, inv20l, "
+"inv:call, inv:call2, inv:fp"
msgstr ""
-#: gcc.c:6323
-#, c-format
-msgid "Target: %s\n"
+#: config/sh/sh.opt:165
+msgid "Specify name for 32 bit signed division function"
msgstr ""
-#: gcc.c:6324
-#, c-format
-msgid "Configured with: %s\n"
+#: config/sh/sh.opt:172
+msgid "Cost to assume for gettr insn"
msgstr ""
-#: gcc.c:6338
-#, c-format
-msgid "Thread model: %s\n"
+#: config/sh/sh.opt:176 config/sh/sh.opt:222
+msgid "Follow Renesas (formerly Hitachi) / SuperH calling conventions"
msgstr ""
-#: gcc.c:6349
-#, c-format
-msgid "gcc version %s\n"
+#: config/sh/sh.opt:180
+msgid "Increase the IEEE compliance for floating-point code"
msgstr ""
-#: gcc.c:6351
-#, c-format
-msgid "gcc driver version %s executing gcc version %s\n"
+#: config/sh/sh.opt:184
+msgid "Enable the use of the indexed addressing mode for SHmedia32/SHcompact"
msgstr ""
-#: gcc.c:6359
-msgid "no input files"
+#: config/sh/sh.opt:188
+msgid "Assume symbols might be invalid"
msgstr ""
-#: gcc.c:6430 gcc.c:6493
-#, c-format
-msgid "%s: %s compiler not installed on this system"
+#: config/sh/sh.opt:192
+msgid "Annotate assembler instructions with estimated addresses"
msgstr ""
-#: gcc.c:6439
-#, c-format
-msgid "spec '%s' is invalid"
+#: config/sh/sh.opt:196
+msgid "Generate code in little endian mode"
msgstr ""
-#: gcc.c:6575
-#, c-format
-msgid "%s: linker input file unused because linking not done"
+#: config/sh/sh.opt:200
+msgid "Mark MAC register as call-clobbered"
msgstr ""
-#: gcc.c:6615
-#, c-format
-msgid "language %s not recognized"
+#: config/sh/sh.opt:206
+msgid "Make structs a multiple of 4 bytes (warning: ABI altered)"
msgstr ""
-#: gcc.c:6686
-#, c-format
-msgid "%s: %s"
+#: config/sh/sh.opt:210
+msgid "Emit function-calls using global offset table when generating PIC"
msgstr ""
-#: gcc.c:6906
-#, c-format
-msgid "multilib spec '%s' is invalid"
+#: config/sh/sh.opt:214
+msgid "Assume pt* instructions won't trap"
msgstr ""
-#: gcc.c:7098
-#, c-format
-msgid "multilib exclusions '%s' is invalid"
+#: config/sh/sh.opt:218
+msgid "Shorten address references during linking"
msgstr ""
-#: gcc.c:7156 gcc.c:7297
-#, c-format
-msgid "multilib select '%s' is invalid"
+#: config/sh/sh.opt:226
+msgid "Deprecated. Use -Os instead"
msgstr ""
-#: gcc.c:7335
-#, c-format
-msgid "multilib exclusion '%s' is invalid"
+#: config/sh/sh.opt:230
+msgid "Cost to assume for a multiply insn"
msgstr ""
-#: gcov.c:385
+#: config/sh/sh.opt:234
msgid ""
-"Usage: gcov [OPTION]... SOURCEFILE\n"
-"\n"
+"Generate library function call to invalidate instruction cache entries after "
+"fixing trampoline"
msgstr ""
-#: gcov.c:386
-msgid ""
-"Print code coverage information.\n"
-"\n"
+#: config/i386/i386.opt:24
+msgid "sizeof(long double) is 16"
msgstr ""
-#: gcov.c:387
-msgid " -h, --help Print this help, then exit\n"
+#: config/i386/i386.opt:28
+msgid "Generate 32bit i386 code"
msgstr ""
-#: gcov.c:388
-msgid " -v, --version Print version number, then exit\n"
+#: config/i386/i386.opt:36
+msgid "Support 3DNow! built-in functions"
msgstr ""
-#: gcov.c:389
-msgid ""
-" -a, --all-blocks Show information for every basic block\n"
+#: config/i386/i386.opt:44
+msgid "Generate 64bit x86-64 code"
msgstr ""
-#: gcov.c:390
-msgid ""
-" -b, --branch-probabilities Include branch probabilities in output\n"
+#: config/i386/i386.opt:52
+msgid "sizeof(long double) is 12"
msgstr ""
-#: gcov.c:391
-msgid ""
-" -c, --branch-counts Given counts of branches taken\n"
-" rather than percentages\n"
+#: config/i386/i386.opt:56
+msgid "Reserve space for outgoing arguments in the function prologue"
msgstr ""
-#: gcov.c:393
-msgid " -n, --no-output Do not create an output file\n"
+#: config/i386/i386.opt:60
+msgid "Align some doubles on dword boundary"
msgstr ""
-#: gcov.c:394
-msgid ""
-" -l, --long-file-names Use long output file names for included\n"
-" source files\n"
+#: config/i386/i386.opt:64
+msgid "Function starts are aligned to this power of 2"
msgstr ""
-#: gcov.c:396
-msgid " -f, --function-summaries Output summaries for each function\n"
+#: config/i386/i386.opt:68
+msgid "Jump targets are aligned to this power of 2"
msgstr ""
-#: gcov.c:397
-msgid ""
-" -o, --object-directory DIR|FILE Search for object files in DIR or called "
-"FILE\n"
+#: config/i386/i386.opt:72
+msgid "Loop code aligned to this power of 2"
msgstr ""
-#: gcov.c:398
-msgid " -p, --preserve-paths Preserve all pathname components\n"
+#: config/i386/i386.opt:76
+msgid "Align destination of the string operations"
msgstr ""
-#: gcov.c:399
-msgid ""
-" -u, --unconditional-branches Show unconditional branch counts too\n"
+#: config/i386/i386.opt:84
+msgid "Use given assembler dialect"
msgstr ""
-#: gcov.c:400
-#, c-format
-msgid ""
-"\n"
-"For bug reporting instructions, please see:\n"
-"%s.\n"
+#: config/i386/i386.opt:88
+msgid "Branches are this expensive (1-5, arbitrary units)"
msgstr ""
-#: gcov.c:410
-#, c-format
-msgid "gcov (GCC) %s\n"
+#: config/i386/i386.opt:92
+msgid "Use given x86-64 code model"
msgstr ""
-#: gcov.c:414
-msgid ""
-"This is free software; see the source for copying conditions.\n"
-"There is NO warranty; not even for MERCHANTABILITY or \n"
-"FITNESS FOR A PARTICULAR PURPOSE.\n"
-"\n"
+#: config/i386/i386.opt:102
+msgid "Generate sin, cos, sqrt for FPU"
msgstr ""
-#: gcov.c:504
-#, c-format
-msgid "%s:no functions found\n"
+#: config/i386/i386.opt:106
+msgid "Return values of functions in FPU registers"
msgstr ""
-#: gcov.c:525 gcov.c:553
-msgid "\n"
+#: config/i386/i386.opt:110
+msgid "Generate floating point mathematics using given instruction set"
msgstr ""
-#: gcov.c:540
-#, c-format
-msgid "%s:creating '%s'\n"
+#: config/i386/i386.opt:118 config/m68k/ieee.opt:25 config/ns32k/ns32k.opt:52
+msgid "Use IEEE math for fp comparisons"
msgstr ""
-#: gcov.c:544
-#, c-format
-msgid "%s:error writing output file '%s'\n"
+#: config/i386/i386.opt:122
+msgid "Inline all known string operations"
msgstr ""
-#: gcov.c:549
-#, c-format
-msgid "%s:could not open output file '%s'\n"
+#: config/i386/i386.opt:130
+msgid "Support MMX built-in functions"
msgstr ""
-#: gcov.c:700
-#, c-format
-msgid "%s:cannot open graph file\n"
+#: config/i386/i386.opt:134
+msgid "Use native (MS) bitfield layout"
msgstr ""
-#: gcov.c:706
-#, c-format
-msgid "%s:not a gcov graph file\n"
+#: config/i386/i386.opt:150
+msgid "Omit the frame pointer in leaf functions"
msgstr ""
-#: gcov.c:719
-#, c-format
-msgid "%s:version '%.4s', prefer '%.4s'\n"
+#: config/i386/i386.opt:162
+msgid "Attempt to keep stack aligned to this power of 2"
msgstr ""
-#: gcov.c:771
-#, c-format
-msgid "%s:already seen blocks for '%s'\n"
+#: config/i386/i386.opt:166
+msgid "Use push instructions to save outgoing arguments"
msgstr ""
-#: gcov.c:889 gcov.c:1045
-#, c-format
-msgid "%s:corrupted\n"
+#: config/i386/i386.opt:170
+msgid "Use red-zone in the x86-64 code"
msgstr ""
-#: gcov.c:963
-#, c-format
-msgid "%s:cannot open data file\n"
+#: config/i386/i386.opt:174
+msgid "Number of registers used to pass integer arguments"
msgstr ""
-#: gcov.c:968
-#, c-format
-msgid "%s:not a gcov data file\n"
+#: config/i386/i386.opt:178
+msgid "Alternate calling convention"
msgstr ""
-#: gcov.c:981
-#, c-format
-msgid "%s:version '%.4s', prefer version '%.4s'\n"
+#: config/i386/i386.opt:186
+msgid "Support MMX and SSE built-in functions and code generation"
msgstr ""
-#: gcov.c:987
-#, c-format
-msgid "%s:stamp mismatch with graph file\n"
+#: config/i386/i386.opt:190
+msgid "Support MMX, SSE and SSE2 built-in functions and code generation"
msgstr ""
-#: gcov.c:1013
-#, c-format
-msgid "%s:unknown function '%u'\n"
+#: config/i386/i386.opt:194
+msgid "Support MMX, SSE, SSE2 and SSE3 built-in functions and code generation"
msgstr ""
-#: gcov.c:1026
-#, c-format
-msgid "%s:profile mismatch for '%s'\n"
+#: config/i386/i386.opt:198
+msgid "Uninitialized locals in .bss"
msgstr ""
-#: gcov.c:1045
-#, c-format
-msgid "%s:overflowed\n"
+#: config/i386/i386.opt:202
+msgid "Enable stack probing"
msgstr ""
-#: gcov.c:1069
-#, c-format
-msgid "%s:'%s' lacks entry and/or exit blocks\n"
+#: config/i386/i386.opt:206
+msgid "Use given thread-local storage dialect"
msgstr ""
-#: gcov.c:1074
+#: config/i386/i386.opt:210
#, c-format
-msgid "%s:'%s' has arcs to entry block\n"
+msgid "Use direct references against %gs when accessing tls data"
msgstr ""
-#: gcov.c:1082
-#, c-format
-msgid "%s:'%s' has arcs from exit block\n"
+#: config/i386/cygming.opt:24
+msgid "Create console application"
msgstr ""
-#: gcov.c:1290
-#, c-format
-msgid "%s:graph is unsolvable for '%s'\n"
+#: config/i386/cygming.opt:28
+msgid "Use the Cygwin interface"
msgstr ""
-#: gcov.c:1370
-#, c-format
-msgid "%s '%s'\n"
+#: config/i386/cygming.opt:32
+msgid "Generate code for a DLL"
msgstr ""
-#: gcov.c:1373
-#, c-format
-msgid "Lines executed:%s of %d\n"
+#: config/i386/cygming.opt:36
+msgid "Ignore dllimport for functions"
msgstr ""
-#: gcov.c:1377
-msgid "No executable lines\n"
+#: config/i386/cygming.opt:40
+msgid "Use Mingw-specific thread support"
msgstr ""
-#: gcov.c:1383
-#, c-format
-msgid "Branches executed:%s of %d\n"
+#: config/i386/cygming.opt:44
+msgid "Set Windows defines"
msgstr ""
-#: gcov.c:1387
-#, c-format
-msgid "Taken at least once:%s of %d\n"
+#: config/i386/cygming.opt:48
+msgid "Create GUI application"
msgstr ""
-#: gcov.c:1393
-msgid "No branches\n"
+#: config/i386/djgpp.opt:26
+msgid "Ignored (obsolete)"
msgstr ""
-#: gcov.c:1395
-#, c-format
-msgid "Calls executed:%s of %d\n"
+#: config/i386/sco5.opt:25
+msgid "Generate ELF output"
msgstr ""
-#: gcov.c:1399
-msgid "No calls\n"
+#: config/fr30/fr30.opt:24
+msgid "Assume small address space"
msgstr ""
-#: gcov.c:1540
-#, c-format
-msgid "%s:no lines for '%s'\n"
+#: config/m68k/m68k.opt:24
+msgid "Generate code for a 520X"
msgstr ""
-#: gcov.c:1735
-#, c-format
-msgid "call %2d returned %s\n"
+#: config/m68k/m68k.opt:28
+msgid "Generate code for a 5206e"
msgstr ""
-#: gcov.c:1740
-#, c-format
-msgid "call %2d never executed\n"
+#: config/m68k/m68k.opt:32
+msgid "Generate code for a 528x"
msgstr ""
-#: gcov.c:1745
-#, c-format
-msgid "branch %2d taken %s%s\n"
+#: config/m68k/m68k.opt:36
+msgid "Generate code for a 5307"
msgstr ""
-#: gcov.c:1749
-#, c-format
-msgid "branch %2d never executed\n"
+#: config/m68k/m68k.opt:40
+msgid "Generate code for a 5407"
msgstr ""
-#: gcov.c:1754
-#, c-format
-msgid "unconditional %2d taken %s\n"
+#: config/m68k/m68k.opt:44 config/m68k/m68k.opt:97
+msgid "Generate code for a 68000"
msgstr ""
-#: gcov.c:1757
-#, c-format
-msgid "unconditional %2d never executed\n"
+#: config/m68k/m68k.opt:48 config/m68k/m68k.opt:101
+msgid "Generate code for a 68020"
msgstr ""
-#: gcov.c:1789
-#, c-format
-msgid "%s:cannot open source file\n"
+#: config/m68k/m68k.opt:52
+msgid "Generate code for a 68040, without any new instructions"
msgstr ""
-#: gcov.c:1799
-#, c-format
-msgid "%s:source file is newer than graph file '%s'\n"
+#: config/m68k/m68k.opt:56
+msgid "Generate code for a 68060, without any new instructions"
msgstr ""
-#. Return if there's nothing to do, or it is too expensive.
-#: gcse.c:689
-msgid "GCSE disabled"
+#: config/m68k/m68k.opt:60
+msgid "Generate code for a 68030"
msgstr ""
-#. Return if there's nothing to do, or it is too expensive.
-#: gcse.c:6461
-msgid "jump bypassing disabled"
+#: config/m68k/m68k.opt:64
+msgid "Generate code for a 68040"
msgstr ""
-#: gcse.c:6522
-#, c-format
-msgid "%s: %d basic blocks and %d edges/basic block"
+#: config/m68k/m68k.opt:68
+msgid "Generate code for a 68060"
msgstr ""
-#: gcse.c:6535
-#, c-format
-msgid "%s: %d basic blocks and %d registers"
+#: config/m68k/m68k.opt:72
+msgid "Generate code for a 68302"
msgstr ""
-#: gengtype-yacc.c:564 java/parse-scan.c:1938
-#: java/parse-scan.y:1374
-#: java/parse.c:2935 java/parse.y:16334
-msgid "syntax error: cannot back up"
+#: config/m68k/m68k.opt:76
+msgid "Generate code for a 68332"
msgstr ""
-#: gengtype-yacc.c:1577 java/parse-scan.c:3078
-#: java/parse-scan.y:1372
-#: java/parse.c:6170 java/parse.y:16332
-msgid "syntax error; also virtual memory exhausted"
+#: config/m68k/m68k.opt:81
+msgid "Generate code for a 68851"
msgstr ""
-#. Depending on the version of Bison used to compile this grammar,
-#. it may issue generic diagnostics spelled "syntax error" or
-#. "parse error". To prevent this from changing the translation
-#. template randomly, we list all the variants of this particular
-#. diagnostic here. Translators: there is no fine distinction
-#. between diagnostics with "syntax error" in them, and diagnostics
-#. with "parse error" in them. It's okay to give them both the same
-#. translation.
-#: gengtype-yacc.c:1581 java/parse-scan.c:3082
-#: java/parse-scan.y:1370
-#: java/parse.c:6174 java/parse.y:16330
-msgid "syntax error"
+#: config/m68k/m68k.opt:85
+msgid "Generate code that uses 68881 floating-point instructions"
msgstr ""
-#: gengtype-yacc.c:1699 java/parse-scan.c:3200 java/parse.c:6292
-msgid "parser stack overflow"
+#: config/m68k/m68k.opt:89
+msgid "Align variables on a 32-bit boundary"
msgstr ""
-#: ggc-common.c:404 ggc-common.c:412 ggc-common.c:480 ggc-common.c:499
-#: ggc-page.c:2199 ggc-page.c:2230 ggc-page.c:2237 ggc-zone.c:2289
-#: ggc-zone.c:2304
-#, c-format
-msgid "can't write PCH file: %m"
+#: config/m68k/m68k.opt:93
+msgid "Use the bit-field instructions"
msgstr ""
-#: ggc-common.c:492 config/i386/host-cygwin.c:58
-#, c-format
-msgid "can't get position in PCH file: %m"
+#: config/m68k/m68k.opt:105
+msgid "Generate code for a cpu32"
msgstr ""
-#: ggc-common.c:502
-#, c-format
-msgid "can't write padding to PCH file: %m"
+#: config/m68k/m68k.opt:109
+msgid "Enable ID based shared library"
msgstr ""
-#: ggc-common.c:557 ggc-common.c:565 ggc-common.c:572 ggc-common.c:575
-#: ggc-common.c:585 ggc-common.c:588 ggc-page.c:2324 ggc-zone.c:2323
-#, c-format
-msgid "can't read PCH file: %m"
+#: config/m68k/m68k.opt:113
+msgid "Do not use the bit-field instructions"
msgstr ""
-#: ggc-common.c:580
-msgid "had to relocate PCH"
+#: config/m68k/m68k.opt:117
+msgid "Use normal calling convention"
msgstr ""
-#: ggc-page.c:1442
-#, c-format
-msgid "open /dev/zero: %m"
+#: config/m68k/m68k.opt:121
+msgid "Consider type 'int' to be 32 bits wide"
msgstr ""
-#: ggc-page.c:2215 ggc-page.c:2221
-msgid "can't write PCH file"
+#: config/m68k/m68k.opt:125
+msgid "Generate pc-relative code"
msgstr ""
-#: ggc-zone.c:2286 ggc-zone.c:2297
-#, c-format
-msgid "can't seek PCH file: %m"
+#: config/m68k/m68k.opt:129
+msgid "Use different calling convention using 'rtd'"
msgstr ""
-#: ggc-zone.c:2300
-#, c-format
-msgid "can't write PCH fle: %m"
+#: config/m68k/m68k.opt:133
+msgid "Enable separate data segment"
msgstr ""
-#: gimple-low.c:203
-msgid "unexpected node"
+#: config/m68k/m68k.opt:137 config/bfin/bfin.opt:40
+msgid "ID of shared library to build"
msgstr ""
-#: gimplify.c:3339
-#, c-format
-msgid "invalid lvalue in asm output %d"
+#: config/m68k/m68k.opt:141
+msgid "Consider type 'int' to be 16 bits wide"
msgstr ""
-#: gimplify.c:3451
-#, c-format
-msgid "memory input %d is not directly addressable"
+#: config/m68k/m68k.opt:145
+msgid "Generate code with library calls for floating point"
msgstr ""
-#: gimplify.c:4324
-msgid "gimplification failed"
+#: config/m68k/m68k.opt:149
+msgid "Do not use unaligned memory references"
msgstr ""
-#: global.c:371 global.c:384 global.c:398
-#, c-format
-msgid "%s cannot be used in asm here"
+#: config/frv/frv.opt:24
+msgid "Use 4 media accumulators"
msgstr ""
-#: graph.c:403 passes.c:130 java/jcf-parse.c:1061 java/jcf-parse.c:1196
-#: java/lex.c:1846 objc/objc-act.c:552
-#, c-format
-msgid "can't open %s: %m"
+#: config/frv/frv.opt:28
+msgid "Use 8 media accumulators"
msgstr ""
-#: haifa-sched.c:182
-#, c-format
-msgid "fix_sched_param: unknown param: %s"
+#: config/frv/frv.opt:32
+msgid "Enable label alignment optimizations"
msgstr ""
-#. Opening quotation mark.
-#: intl.c:58
-msgid "`"
+#: config/frv/frv.opt:36
+msgid "Dynamically allocate cc registers"
msgstr ""
-#. Closing quotation mark.
-#: intl.c:61
-msgid "'"
+#: config/frv/frv.opt:43
+msgid "Set the cost of branches"
msgstr ""
-#: langhooks.c:516
-msgid "At top level:"
+#: config/frv/frv.opt:47
+msgid "Enable conditional execution other than moves/scc"
msgstr ""
-#: langhooks.c:521
-#, c-format
-msgid "In member function %qs:"
+#: config/frv/frv.opt:51
+msgid "Change the maximum length of conditionally-executed sequences"
msgstr ""
-#: langhooks.c:525
-#, c-format
-msgid "In function %qs:"
+#: config/frv/frv.opt:55
+msgid ""
+"Change the number of temporary registers that are available to conditionally-"
+"executed sequences"
msgstr ""
-#. What to print when a switch has no documentation.
-#: opts.c:89
-msgid "This switch lacks documentation"
+#: config/frv/frv.opt:59
+msgid "Enable conditional moves"
msgstr ""
-#. Eventually this should become a hard error IMO.
-#: opts.c:258
-#, c-format
-msgid "command line option \"%s\" is valid for %s but not for %s"
+#: config/frv/frv.opt:63
+msgid "Set the target CPU type"
msgstr ""
-#: opts.c:357
-#, c-format
-msgid "missing argument to \"%s\""
+#: config/frv/frv.opt:85
+msgid "Use fp double instructions"
msgstr ""
-#: opts.c:367
-#, c-format
-msgid "argument to \"%s\" should be a non-negative integer"
+#: config/frv/frv.opt:89
+msgid "Change the ABI to allow double word insns"
msgstr ""
-#: opts.c:449
-#, c-format
-msgid "unrecognized command line option \"%s\""
+#: config/frv/frv.opt:93
+msgid "Enable Function Descriptor PIC mode"
msgstr ""
-#: opts.c:659
-msgid "-Wuninitialized is not supported without -O"
+#: config/frv/frv.opt:97
+msgid "Just use icc0/fcc0"
msgstr ""
-#: opts.c:673
-msgid "-freorder-blocks-and-partition does not work with exceptions"
+#: config/frv/frv.opt:101
+msgid "Only use 32 FPRs"
msgstr ""
-#: opts.c:833
-#, c-format
-msgid "structure alignment must be a small power of two, not %d"
+#: config/frv/frv.opt:105
+msgid "Use 64 FPRs"
msgstr ""
-#: opts.c:898
-#, c-format
-msgid "unrecognised visibility value \"%s\""
+#: config/frv/frv.opt:109
+msgid "Only use 32 GPRs"
msgstr ""
-#: opts.c:950
-#, c-format
-msgid "unrecognized register name \"%s\""
+#: config/frv/frv.opt:113
+msgid "Use 64 GPRs"
msgstr ""
-#: opts.c:974
-#, c-format
-msgid "unknown tls-model \"%s\""
+#: config/frv/frv.opt:117
+msgid "Enable use of GPREL for read-only data in FDPIC"
msgstr ""
-#: opts.c:1045
-#, c-format
-msgid "%s: --param arguments should be of the form NAME=VALUE"
+#: config/frv/frv.opt:125
+msgid "Enable inlining of PLT in function calls"
msgstr ""
-#: opts.c:1050
-#, c-format
-msgid "invalid --param value %qs"
+#: config/frv/frv.opt:129
+msgid "Enable PIC support for building libraries"
msgstr ""
-#: opts.c:1147
-msgid "target system does not support debug output"
+#: config/frv/frv.opt:133
+msgid "Follow the EABI linkage requirements"
msgstr ""
-#: opts.c:1154
-#, c-format
-msgid "debug format \"%s\" conflicts with prior selection"
+#: config/frv/frv.opt:137
+msgid "Disallow direct calls to global functions"
msgstr ""
-#: opts.c:1170
-#, c-format
-msgid "unrecognised debug output level \"%s\""
+#: config/frv/frv.opt:141
+msgid "Use media instructions"
msgstr ""
-#: opts.c:1172
-#, c-format
-msgid "debug output level %s is too high"
+#: config/frv/frv.opt:145
+msgid "Use multiply add/subtract instructions"
msgstr ""
-#: opts.c:1191
-msgid "The following options are language-independent:\n"
+#: config/frv/frv.opt:149
+msgid "Enable optimizing &&/|| in conditional execution"
msgstr ""
-#: opts.c:1198
-#, c-format
-msgid ""
-"The %s front end recognizes the following options:\n"
-"\n"
+#: config/frv/frv.opt:153
+msgid "Enable nested conditional execution optimizations"
msgstr ""
-#: opts.c:1212
-msgid "The --param option recognizes the following as parameters:\n"
+#: config/frv/frv.opt:158
+msgid "Do not mark ABI switches in e_flags"
msgstr ""
-#: params.c:71
-#, c-format
-msgid "minimum value of parameter %qs is %u"
+#: config/frv/frv.opt:162
+msgid "Pack VLIW instructions"
msgstr ""
-#: params.c:76
-#, c-format
-msgid "maximum value of parameter %qs is %u"
+#: config/frv/frv.opt:166
+msgid "Enable setting GPRs to the result of comparisons"
msgstr ""
-#. If we didn't find this parameter, issue an error message.
-#: params.c:85
-#, c-format
-msgid "invalid parameter %qs"
+#: config/frv/frv.opt:170
+msgid "Change the amount of scheduler lookahead"
msgstr ""
-#: passes.c:1220
-msgid ""
-"branch target register load optimization is not intended to be run twice"
+#: config/frv/frv.opt:178
+msgid "Assume a large TLS segment"
msgstr ""
-#: profile.c:284
-msgid "corrupted profile info: run_max * runs < sum_max"
+#: config/frv/frv.opt:182
+msgid "Do not assume a large TLS segment"
msgstr ""
-#: profile.c:290
-msgid "corrupted profile info: sum_all is smaller than sum_max"
+#: config/frv/frv.opt:187
+msgid "Cause gas to print tomcat statistics"
msgstr ""
-#: profile.c:335
-#, c-format
-msgid "corrupted profile info: edge from %i to %i exceeds maximal count"
+#: config/frv/frv.opt:192
+msgid "Link with the library-pic libraries"
msgstr ""
-#: profile.c:500
-#, c-format
-msgid ""
-"corrupted profile info: number of iterations for basic block %d thought to "
-"be %i"
+#: config/frv/frv.opt:196
+msgid "Allow branches to be packed with other instructions"
msgstr ""
-#: profile.c:521
-#, c-format
-msgid ""
-"corrupted profile info: number of executions for edge %d-%d thought to be %i"
+#: config/ia64/ilp32.opt:3
+msgid "Generate ILP32 code"
msgstr ""
-#: protoize.c:581
-#, c-format
-msgid "%s: error writing file '%s': %s\n"
+#: config/ia64/ilp32.opt:7
+msgid "Generate LP64 code"
msgstr ""
-#: protoize.c:625
-#, c-format
-msgid "%s: usage '%s [ -VqfnkN ] [ -i <istring> ] [ filename ... ]'\n"
+#: config/ia64/ia64.opt:3
+msgid "Generate big endian code"
msgstr ""
-#: protoize.c:628
-#, c-format
-msgid "%s: usage '%s [ -VqfnkNlgC ] [ -B <dirname> ] [ filename ... ]'\n"
+#: config/ia64/ia64.opt:7
+msgid "Generate little endian code"
msgstr ""
-#: protoize.c:729
-#, c-format
-msgid "%s: warning: no read access for file '%s'\n"
+#: config/ia64/ia64.opt:11
+msgid "Generate code for GNU as"
msgstr ""
-#: protoize.c:737
-#, c-format
-msgid "%s: warning: no write access for file '%s'\n"
+#: config/ia64/ia64.opt:15
+msgid "Generate code for GNU ld"
msgstr ""
-#: protoize.c:745
-#, c-format
-msgid "%s: warning: no write access for dir containing '%s'\n"
+#: config/ia64/ia64.opt:19
+msgid "Emit stop bits before and after volatile extended asms"
msgstr ""
-#. Catch cases like /.. where we try to backup to a
-#. point above the absolute root of the logical file
-#. system.
-#: protoize.c:1132
-#, c-format
-msgid "%s: invalid file name: %s\n"
+#: config/ia64/ia64.opt:23
+msgid "Use in/loc/out register names"
msgstr ""
-#: protoize.c:1280
-#, c-format
-msgid "%s: %s: can't get status: %s\n"
+#: config/ia64/ia64.opt:30
+msgid "Enable use of sdata/scommon/sbss"
msgstr ""
-#: protoize.c:1301
-#, c-format
-msgid ""
-"\n"
-"%s: fatal error: aux info file corrupted at line %d\n"
+#: config/ia64/ia64.opt:34
+msgid "Generate code without GP reg"
msgstr ""
-#: protoize.c:1630
-#, c-format
-msgid "%s:%d: declaration of function '%s' takes different forms\n"
+#: config/ia64/ia64.opt:38
+msgid "gp is constant (but save/restore gp on indirect calls)"
msgstr ""
-#: protoize.c:1885
-#, c-format
-msgid "%s: compiling '%s'\n"
+#: config/ia64/ia64.opt:42
+msgid "Generate self-relocatable code"
msgstr ""
-#: protoize.c:1908
-#, c-format
-msgid "%s: wait: %s\n"
+#: config/ia64/ia64.opt:46
+msgid "Generate inline floating point division, optimize for latency"
msgstr ""
-#: protoize.c:1913
-#, c-format
-msgid "%s: subprocess got fatal signal %d\n"
+#: config/ia64/ia64.opt:50
+msgid "Generate inline floating point division, optimize for throughput"
msgstr ""
-#: protoize.c:1921
-#, c-format
-msgid "%s: %s exited with status %d\n"
+#: config/ia64/ia64.opt:57
+msgid "Generate inline integer division, optimize for latency"
msgstr ""
-#: protoize.c:1970
-#, c-format
-msgid "%s: warning: missing SYSCALLS file '%s'\n"
+#: config/ia64/ia64.opt:61
+msgid "Generate inline integer division, optimize for throughput"
msgstr ""
-#: protoize.c:1979 protoize.c:2008
-#, c-format
-msgid "%s: can't read aux info file '%s': %s\n"
+#: config/ia64/ia64.opt:65
+msgid "Do not inline integer division"
msgstr ""
-#: protoize.c:2024 protoize.c:2052
-#, c-format
-msgid "%s: can't get status of aux info file '%s': %s\n"
+#: config/ia64/ia64.opt:69
+msgid "Generate inline square root, optimize for latency"
msgstr ""
-#: protoize.c:2080
-#, c-format
-msgid "%s: can't open aux info file '%s' for reading: %s\n"
+#: config/ia64/ia64.opt:73
+msgid "Generate inline square root, optimize for throughput"
msgstr ""
-#: protoize.c:2098
-#, c-format
-msgid "%s: error reading aux info file '%s': %s\n"
+#: config/ia64/ia64.opt:77
+msgid "Do not inline square root"
msgstr ""
-#: protoize.c:2111
-#, c-format
-msgid "%s: error closing aux info file '%s': %s\n"
+#: config/ia64/ia64.opt:81
+msgid "Enable Dwarf 2 line debug info via GNU as"
msgstr ""
-#: protoize.c:2127
-#, c-format
-msgid "%s: can't delete aux info file '%s': %s\n"
+#: config/ia64/ia64.opt:85
+msgid "Enable earlier placing stop bits for better scheduling"
msgstr ""
-#: protoize.c:2209 protoize.c:4178
-#, c-format
-msgid "%s: can't delete file '%s': %s\n"
+#: config/ia64/ia64.opt:89
+msgid "Specify range of registers to make fixed"
msgstr ""
-#: protoize.c:2287
-#, c-format
-msgid "%s: warning: can't rename file '%s' to '%s': %s\n"
+#: config/arm/pe.opt:24
+msgid "Ignore dllimport attribute for functions"
msgstr ""
-#: protoize.c:2409
-#, c-format
-msgid "%s: conflicting extern definitions of '%s'\n"
+#: config/arm/arm.opt:24
+msgid "Specify an ABI"
msgstr ""
-#: protoize.c:2413
-#, c-format
-msgid "%s: declarations of '%s' will not be converted\n"
+#: config/arm/arm.opt:28
+msgid "Generate a call to abort if a noreturn function returns"
msgstr ""
-#: protoize.c:2415
-#, c-format
-msgid "%s: conflict list for '%s' follows:\n"
+#: config/arm/arm.opt:35
+msgid "Pass FP arguments in FP registers"
msgstr ""
-#: protoize.c:2448
-#, c-format
-msgid "%s: warning: using formals list from %s(%d) for function '%s'\n"
+#: config/arm/arm.opt:39
+msgid "Generate APCS conformant stack frames"
msgstr ""
-#: protoize.c:2488
-#, c-format
-msgid "%s: %d: '%s' used but missing from SYSCALLS\n"
+#: config/arm/arm.opt:43
+msgid "Generate re-entrant, PIC code"
msgstr ""
-#: protoize.c:2494
-#, c-format
-msgid "%s: %d: warning: no extern definition for '%s'\n"
+#: config/arm/arm.opt:50
+msgid "Specify the name of the target architecture"
msgstr ""
-#: protoize.c:2524
-#, c-format
-msgid "%s: warning: no static definition for '%s' in file '%s'\n"
+#: config/arm/arm.opt:57
+msgid "Assume target CPU is configured as big endian"
msgstr ""
-#: protoize.c:2530
-#, c-format
-msgid "%s: multiple static defs of '%s' in file '%s'\n"
+#: config/arm/arm.opt:61
+msgid "Thumb: Assume non-static functions may be called from ARM code"
msgstr ""
-#: protoize.c:2700 protoize.c:2703
-#, c-format
-msgid "%s: %d: warning: source too confusing\n"
+#: config/arm/arm.opt:65
+msgid "Thumb: Assume function pointers may go to non-Thumb aware code"
msgstr ""
-#: protoize.c:2898
-#, c-format
-msgid "%s: %d: warning: varargs function declaration not converted\n"
+#: config/arm/arm.opt:69
+msgid "Cirrus: Place NOPs to avoid invalid instruction combinations"
msgstr ""
-#: protoize.c:2913
-#, c-format
-msgid "%s: declaration of function '%s' not converted\n"
+#: config/arm/arm.opt:73
+msgid "Specify the name of the target CPU"
msgstr ""
-#: protoize.c:3036
-#, c-format
-msgid "%s: warning: too many parameter lists in declaration of '%s'\n"
+#: config/arm/arm.opt:77
+msgid "Specify if floating point hardware should be used"
msgstr ""
-#: protoize.c:3057
-#, c-format
-msgid ""
-"\n"
-"%s: warning: too few parameter lists in declaration of '%s'\n"
+#: config/arm/arm.opt:91
+msgid "Specify the name of the target floating point hardware/format"
msgstr ""
-#: protoize.c:3153
-#, c-format
-msgid "%s: %d: warning: found '%s' but expected '%s'\n"
+#: config/arm/arm.opt:95
+msgid "Alias for -mfloat-abi=hard"
msgstr ""
-#: protoize.c:3328
-#, c-format
-msgid "%s: local declaration for function '%s' not inserted\n"
+#: config/arm/arm.opt:99
+msgid "Assume target CPU is configured as little endian"
msgstr ""
-#: protoize.c:3355
-#, c-format
-msgid ""
-"\n"
-"%s: %d: warning: can't add declaration of '%s' into macro call\n"
+#: config/arm/arm.opt:103
+msgid "Generate call insns as indirect calls, if necessary"
msgstr ""
-#: protoize.c:3427
-#, c-format
-msgid "%s: global declarations for file '%s' not inserted\n"
+#: config/arm/arm.opt:107
+msgid "Specify the register to be used for PIC addressing"
msgstr ""
-#: protoize.c:3516 protoize.c:3546
-#, c-format
-msgid "%s: definition of function '%s' not converted\n"
+#: config/arm/arm.opt:111
+msgid "Store function names in object code"
msgstr ""
-#: protoize.c:3535
-#, c-format
-msgid "%s: %d: warning: definition of %s not converted\n"
+#: config/arm/arm.opt:115
+msgid "Permit scheduling of a function's prologue sequence"
msgstr ""
-#: protoize.c:3861
-#, c-format
-msgid "%s: found definition of '%s' at %s(%d)\n"
+#: config/arm/arm.opt:119
+msgid "Do not load the PIC register in function prologues"
msgstr ""
-#. If we make it here, then we did not know about this
-#. function definition.
-#: protoize.c:3877
-#, c-format
-msgid "%s: %d: warning: '%s' excluded by preprocessing\n"
+#: config/arm/arm.opt:123
+msgid "Alias for -mfloat-abi=soft"
msgstr ""
-#: protoize.c:3880
-#, c-format
-msgid "%s: function definition not converted\n"
+#: config/arm/arm.opt:127
+msgid "Specify the minimum bit alignment of structures"
msgstr ""
-#: protoize.c:3938
-#, c-format
-msgid "%s: '%s' not converted\n"
+#: config/arm/arm.opt:131
+msgid "Compile for the Thumb not the ARM"
msgstr ""
-#: protoize.c:3946
-#, c-format
-msgid "%s: would convert file '%s'\n"
+#: config/arm/arm.opt:135
+msgid "Support calls between Thumb and ARM instruction sets"
msgstr ""
-#: protoize.c:3949
-#, c-format
-msgid "%s: converting file '%s'\n"
+#: config/arm/arm.opt:139
+msgid "Thumb: Generate (non-leaf) stack frames even if not needed"
msgstr ""
-#: protoize.c:3959
-#, c-format
-msgid "%s: can't get status for file '%s': %s\n"
+#: config/arm/arm.opt:143
+msgid "Thumb: Generate (leaf) stack frames even if not needed"
msgstr ""
-#: protoize.c:4001
-#, c-format
-msgid "%s: can't open file '%s' for reading: %s\n"
+#: config/arm/arm.opt:147
+msgid "Tune code for the given processor"
msgstr ""
-#: protoize.c:4016
-#, c-format
-msgid ""
-"\n"
-"%s: error reading input file '%s': %s\n"
+#: config/arm/arm.opt:151
+msgid "Assume big endian bytes, little endian words"
msgstr ""
-#: protoize.c:4050
-#, c-format
-msgid "%s: can't create/open clean file '%s': %s\n"
+#: config/avr/avr.opt:24
+msgid "Use subroutines for function prologues and epilogues"
msgstr ""
-#: protoize.c:4155
-#, c-format
-msgid "%s: warning: file '%s' already saved in '%s'\n"
+#: config/avr/avr.opt:28
+msgid "Select the target MCU"
msgstr ""
-#: protoize.c:4163
-#, c-format
-msgid "%s: can't link file '%s' to '%s': %s\n"
+#: config/avr/avr.opt:35
+msgid "Use STACK as the initial value of the stack pointer"
msgstr ""
-#: protoize.c:4193
-#, c-format
-msgid "%s: can't create/open output file '%s': %s\n"
+#: config/avr/avr.opt:39
+msgid "Use an 8-bit 'int' type"
msgstr ""
-#: protoize.c:4226
-#, c-format
-msgid "%s: can't change mode of file '%s': %s\n"
+#: config/avr/avr.opt:43
+msgid "Change the stack pointer without disabling interrupts"
msgstr ""
-#: protoize.c:4399
-#, c-format
-msgid "%s: cannot get working directory: %s\n"
+#: config/avr/avr.opt:47
+msgid "Do not generate tablejump insns"
msgstr ""
-#: protoize.c:4497
-#, c-format
-msgid "%s: input file names must have .c suffixes: %s\n"
+#: config/avr/avr.opt:57
+msgid "Use rjmp/rcall (limited range) on >8K devices"
msgstr ""
-#: reg-stack.c:622
-#, c-format
-msgid "output constraint %d must specify a single register"
+#: config/avr/avr.opt:61
+msgid "Output instruction sizes to the asm file"
msgstr ""
-#: reg-stack.c:632
-#, c-format
-msgid "output constraint %d cannot be specified together with \"%s\" clobber"
+#: config/avr/avr.opt:65
+msgid "Change only the low 8 bits of the stack pointer"
msgstr ""
-#: reg-stack.c:655
-msgid "output regs must be grouped at top of stack"
+#: config/mn10300/mn10300.opt:24
+msgid "Target the AM33 processor"
msgstr ""
-#: reg-stack.c:692
-msgid "implicitly popped regs must be grouped at top of stack"
+#: config/mn10300/mn10300.opt:28
+msgid "Target the AM33/2.0 processor"
msgstr ""
-#: reg-stack.c:711
-msgid "output operand %d must use %<&%> constraint"
+#: config/mn10300/mn10300.opt:32
+msgid "Work around hardware multiply bug"
msgstr ""
-#: regclass.c:766
-#, c-format
-msgid "can't use '%s' as a %s register"
+#: config/mn10300/mn10300.opt:37
+msgid "Enable linker relaxations"
msgstr ""
-#: regclass.c:781 config/ia64/ia64.c:4569 config/ia64/ia64.c:4576
-#: config/pa/pa.c:341 config/pa/pa.c:348
-#, c-format
-msgid "unknown register name: %s"
+#: config/xtensa/xtensa.opt:24
+msgid "Use CONST16 instruction to load constants"
msgstr ""
-#: regclass.c:791
-msgid "global register variable follows a function definition"
+#: config/xtensa/xtensa.opt:28
+msgid "Enable fused multiply/add and multiply/subtract FP instructions"
msgstr ""
-#: regclass.c:795
-msgid "register used for two global register variables"
+#: config/xtensa/xtensa.opt:32
+msgid "Use indirect CALLXn instructions for large programs"
msgstr ""
-#: regclass.c:800
-msgid "call-clobbered register used for global register variable"
+#: config/xtensa/xtensa.opt:36
+msgid "Automatically align branch targets to reduce branch penalties"
msgstr ""
-#: regrename.c:1872
-#, c-format
-msgid "validate_value_data: [%u] Bad next_regno for empty chain (%u)"
+#: config/xtensa/xtensa.opt:40
+msgid "Intersperse literal pools with code in the text section"
msgstr ""
-#: regrename.c:1884
-#, c-format
-msgid "validate_value_data: Loop in regno chain (%u)"
+#: config/iq2000/iq2000.opt:24
+msgid "Specify CPU for code generation purposes"
msgstr ""
-#: regrename.c:1887
-#, c-format
-msgid "validate_value_data: [%u] Bad oldest_regno (%u)"
+#: config/iq2000/iq2000.opt:28
+msgid "Specify CPU for scheduling purposes"
msgstr ""
-#: regrename.c:1899
-#, c-format
-msgid "validate_value_data: [%u] Non-empty reg in chain (%s %u %i)"
+#: config/iq2000/iq2000.opt:36
+msgid "Use GP relative sdata/sbss sections"
msgstr ""
-#: reload.c:1270
-msgid "cannot reload integer constant operand in %<asm%>"
+#: config/iq2000/iq2000.opt:41
+msgid "No default crt0.o"
msgstr ""
-#: reload.c:1293
-msgid "impossible register constraint in %<asm%>"
+#: config/bfin/bfin.opt:24
+msgid "Omit frame pointer for leaf functions"
msgstr ""
-#: reload.c:3535
-msgid "%<&%> constraint used with no register class"
+#: config/bfin/bfin.opt:28
+msgid "Program is entirely located in low 64k of memory."
msgstr ""
-#: reload.c:3705
-msgid "unable to generate reloads for:"
+#: config/bfin/bfin.opt:32
+msgid "Avoid speculative loads by inserting CSYNC or equivalent"
msgstr ""
-#: reload.c:3706 reload.c:3938
-msgid "inconsistent operand constraints in an %<asm%>"
+#: config/bfin/bfin.opt:36
+msgid "Enabled ID based shared library"
msgstr ""
-#: reload1.c:1224
-msgid "frame size too large for reliable stack checking"
+#: config/ns32k/ns32k.opt:24
+msgid "Optimize for 32032"
msgstr ""
-#: reload1.c:1227
-msgid "try reducing the number of local variables"
+#: config/ns32k/ns32k.opt:32
+msgid "Optimize for 32332"
msgstr ""
-#: reload1.c:1878
-msgid "can't find a register in class %qs while reloading %<asm%>"
+#: config/ns32k/ns32k.opt:36
+msgid "Use the 32381 fpu"
msgstr ""
-#: reload1.c:1883
-#, c-format
-msgid "unable to find a register to spill in class %qs"
+#: config/ns32k/ns32k.opt:40
+msgid "Optimize for 32532"
msgstr ""
-#: reload1.c:1885
-msgid "this is the insn:"
+#: config/ns32k/ns32k.opt:44
+msgid "Use bit-field instructions"
msgstr ""
-#: reload1.c:3876
-msgid "%<asm%> operand requires impossible reload"
+#: config/ns32k/ns32k.opt:48
+msgid "Generate code for high memory"
msgstr ""
-#. It's the compiler's fault.
-#: reload1.c:4995
-msgid "could not find a spill register"
+#: config/ns32k/ns32k.opt:56
+msgid "Use multiply-accumulate fp instructions"
msgstr ""
-#: reload1.c:5000
-msgid "%<asm%> operand constraint incompatible with operand size"
+#: config/ns32k/ns32k.opt:60
+msgid "Do not use bit-field instructions"
msgstr ""
-#. It's the compiler's fault.
-#: reload1.c:6626
-msgid "VOIDmode on an output"
+#: config/ns32k/ns32k.opt:64
+msgid "Generate code for low memory"
msgstr ""
-#: reload1.c:6627
-msgid "output operand is constant in %<asm%>"
+#: config/ns32k/ns32k.opt:68
+msgid "Do not use IEEE math for fp comparisons"
msgstr ""
-#: rtl-error.c:128
-msgid "unrecognizable insn:"
+#: config/ns32k/ns32k.opt:72
+msgid "Do not use multiply-accumulate fp instructions"
msgstr ""
-#: rtl-error.c:130
-msgid "insn does not satisfy its constraints:"
+#: config/ns32k/ns32k.opt:76
+msgid "Pass all arguments on the stack"
msgstr ""
-#: rtl.c:470
-#, c-format
-msgid "RTL check: access of elt %d of '%s' with last elt %d in %s, at %s:%d"
+#: config/ns32k/ns32k.opt:80
+msgid "Use the normal calling convention"
msgstr ""
-#: rtl.c:480
-#, c-format
-msgid ""
-"RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d"
+#: config/ns32k/ns32k.opt:84
+msgid "Do not use register sb"
msgstr ""
-#: rtl.c:490
-#, c-format
+#: config/ns32k/ns32k.opt:88
+msgid "Do not use the 'small register classes' kludge"
+msgstr ""
+
+#: config/ns32k/ns32k.opt:92
+msgid "Pass some arguments in registers"
+msgstr ""
+
+#: config/ns32k/ns32k.opt:96
+msgid "Use an alternative calling convention"
+msgstr ""
+
+#: config/ns32k/ns32k.opt:100
+msgid "Register sb is zero, use it for absolute addressing"
+msgstr ""
+
+#: config/ns32k/ns32k.opt:108
+msgid "Use the 'small register classes' kludge"
+msgstr ""
+
+#: config/v850/v850.opt:24
+msgid "Use registers r2 and r5"
+msgstr ""
+
+#: config/v850/v850.opt:28
+msgid "Use 4 byte entries in switch tables"
+msgstr ""
+
+#: config/v850/v850.opt:32
+msgid "Enable backend debugging"
+msgstr ""
+
+#: config/v850/v850.opt:36
+msgid "Do not use the callt instruction"
+msgstr ""
+
+#: config/v850/v850.opt:40
+msgid "Reuse r30 on a per function basis"
+msgstr ""
+
+#: config/v850/v850.opt:44
+msgid "Support Green Hills ABI"
+msgstr ""
+
+#: config/v850/v850.opt:48
+msgid "Prohibit PC relative function calls"
+msgstr ""
+
+#: config/v850/v850.opt:52
+msgid "Use stubs for function prologues"
+msgstr ""
+
+#: config/v850/v850.opt:56
+msgid "Set the max size of data eligible for the SDA area"
+msgstr ""
+
+#: config/v850/v850.opt:60
+msgid "Enable the use of the short load instructions"
+msgstr ""
+
+#: config/v850/v850.opt:64
+msgid "Same as: -mep -mprolog-function"
+msgstr ""
+
+#: config/v850/v850.opt:68
+msgid "Set the max size of data eligible for the TDA area"
+msgstr ""
+
+#: config/v850/v850.opt:72
+msgid "Enforce strict alignment"
+msgstr ""
+
+#: config/v850/v850.opt:79
+msgid "Compile for the v850 processor"
+msgstr ""
+
+#: config/v850/v850.opt:83
+msgid "Compile for the v850e processor"
+msgstr ""
+
+#: config/v850/v850.opt:87
+msgid "Compile for the v850e1 processor"
+msgstr ""
+
+#: config/v850/v850.opt:91
+msgid "Set the max size of data eligible for the ZDA area"
+msgstr ""
+
+#: config/mmix/mmix.opt:25
+msgid "For intrinsics library: pass all parameters in registers"
+msgstr ""
+
+#: config/mmix/mmix.opt:29
+msgid "Use register stack for parameters and return value"
+msgstr ""
+
+#: config/mmix/mmix.opt:33
+msgid "Use call-clobbered registers for parameters and return value"
+msgstr ""
+
+#: config/mmix/mmix.opt:38
+msgid "Use epsilon-respecting floating point compare instructions"
+msgstr ""
+
+#: config/mmix/mmix.opt:42
+msgid "Use zero-extending memory loads, not sign-extending ones"
+msgstr ""
+
+#: config/mmix/mmix.opt:46
msgid ""
-"RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %"
-"s:%d"
+"Generate divide results with reminder having the same sign as the divisor "
+"(not the dividend)"
msgstr ""
-#: rtl.c:499
-#, c-format
-msgid "RTL check: expected code '%s', have '%s' in %s, at %s:%d"
+#: config/mmix/mmix.opt:50
+msgid "Prepend global symbols with \":\" (for use with PREFIX)"
msgstr ""
-#: rtl.c:509
-#, c-format
-msgid "RTL check: expected code '%s' or '%s', have '%s' in %s, at %s:%d"
+#: config/mmix/mmix.opt:54
+msgid "Do not provide a default start-address 0x100 of the program"
msgstr ""
-#: rtl.c:520
-#, c-format
-msgid "RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d"
+#: config/mmix/mmix.opt:58
+msgid "Link to emit program in ELF format (rather than mmo)"
msgstr ""
-#: rtl.c:531
-#, c-format
-msgid "RTL flag check: %s used with unexpected rtx code '%s' in %s, at %s:%d"
+#: config/mmix/mmix.opt:62
+msgid "Use P-mnemonics for branches statically predicted as taken"
msgstr ""
-#: stmt.c:317
-msgid "output operand constraint lacks %<=%>"
+#: config/mmix/mmix.opt:66
+msgid "Don't use P-mnemonics for branches"
msgstr ""
-#: stmt.c:332
-#, c-format
-msgid "output constraint %qc for operand %d is not at the beginning"
+#: config/mmix/mmix.opt:80
+msgid "Use addresses that allocate global registers"
msgstr ""
-#: stmt.c:355
-msgid "operand constraint contains incorrectly positioned %<+%> or %<=%>"
+#: config/mmix/mmix.opt:84
+msgid "Do not use addresses that allocate global registers"
msgstr ""
-#: stmt.c:362 stmt.c:461
-msgid "%<%%%> constraint used with last operand"
+#: config/mmix/mmix.opt:88
+msgid "Generate a single exit point for each function"
msgstr ""
-#: stmt.c:381
-msgid "matching constraint not valid in output operand"
+#: config/mmix/mmix.opt:92
+msgid "Do not generate a single exit point for each function"
msgstr ""
-#: stmt.c:452
-#, c-format
-msgid "input operand constraint contains %qc"
+#: config/mmix/mmix.opt:96
+msgid "Set start-address of the program"
msgstr ""
-#: stmt.c:494
-msgid "matching constraint references invalid operand number"
+#: config/mmix/mmix.opt:100
+msgid "Set start-address of data"
msgstr ""
-#: stmt.c:532
-#, c-format
-msgid "invalid punctuation %qc in constraint"
+#: config/darwin.opt:24
+msgid "Set sizeof(bool) to 1"
msgstr ""
-#: stmt.c:556
-msgid "matching constraint does not allow a register"
+#: config/darwin.opt:28
+msgid "Generate code suitable for fast turn around debugging"
msgstr ""
-#: stmt.c:598
-#, c-format
-msgid "asm-specifier for variable %qs conflicts with asm clobber list"
+#: config/m32r/m32r.opt:24
+msgid "Compile for the m32rx"
msgstr ""
-#: stmt.c:686
-msgid "unknown register name %qs in %<asm%>"
+#: config/m32r/m32r.opt:28
+msgid "Compile for the m32r2"
msgstr ""
-#: stmt.c:694
-msgid "PIC register %qs clobbered in %<asm%>"
+#: config/m32r/m32r.opt:32
+msgid "Compile for the m32r"
msgstr ""
-#: stmt.c:741
-msgid "more than %d operands in %<asm%>"
+#: config/m32r/m32r.opt:36
+msgid "Align all loops to 32 byte boundary"
msgstr ""
-#: stmt.c:804
-#, c-format
-msgid "output number %d not directly addressable"
+#: config/m32r/m32r.opt:40
+msgid "Prefer branches over conditional execution"
msgstr ""
-#: stmt.c:883
-msgid "asm operand %d probably doesn%'t match constraints"
+#: config/m32r/m32r.opt:44
+msgid "Give branches their default cost"
msgstr ""
-#: stmt.c:893
-#, c-format
-msgid "use of memory input without lvalue in asm operand %d is deprecated"
+#: config/m32r/m32r.opt:48
+msgid "Display compile time statistics"
msgstr ""
-#: stmt.c:1040
-msgid "asm clobber conflict with output operand"
+#: config/m32r/m32r.opt:52
+msgid "Specify cache flush function"
msgstr ""
-#: stmt.c:1045
-msgid "asm clobber conflict with input operand"
+#: config/m32r/m32r.opt:56
+msgid "Specify cache flush trap number"
msgstr ""
-#: stmt.c:1122
-msgid "too many alternatives in %<asm%>"
+#: config/m32r/m32r.opt:60
+msgid "Only issue one instruction per cycle"
msgstr ""
-#: stmt.c:1134
-msgid "operand constraints for %<asm%> differ in number of alternatives"
+#: config/m32r/m32r.opt:64
+msgid "Allow two instructions to be issued per cycle"
msgstr ""
-#: stmt.c:1187
-#, c-format
-msgid "duplicate asm operand name %qs"
+#: config/m32r/m32r.opt:68
+msgid "Code size: small, medium or large"
msgstr ""
-#: stmt.c:1285
-msgid "missing close brace for named operand"
+#: config/m32r/m32r.opt:72
+msgid "Don't call any cache flush functions"
msgstr ""
-#: stmt.c:1313
-#, c-format
-msgid "undefined named operand %qs"
+#: config/m32r/m32r.opt:76
+msgid "Don't call any cache flush trap"
msgstr ""
-#: stmt.c:1478
-msgid "%Hvalue computed is not used"
+#: config/m32r/m32r.opt:83
+msgid "Small data area: none, sdata, use"
msgstr ""
-#: stor-layout.c:148
-msgid "type size can%'t be explicitly evaluated"
+#: java/lang.opt:66
+msgid "Warn if a deprecated compiler feature, class, method, or field is used"
msgstr ""
-#: stor-layout.c:150
-msgid "variable-size type declared outside of any function"
+#: java/lang.opt:70
+msgid "Warn if deprecated empty statements are found"
msgstr ""
-#: stor-layout.c:454
-msgid "%Jsize of %qD is %d bytes"
+#: java/lang.opt:74
+msgid "Warn if .class files are out of date"
msgstr ""
-#: stor-layout.c:456
-msgid "%Jsize of %qD is larger than %d bytes"
+#: java/lang.opt:78
+msgid "Warn if modifiers are specified when not necessary"
msgstr ""
-#: stor-layout.c:840
-msgid "%Jpacked attribute causes inefficient alignment for %qD"
+#: java/lang.opt:82
+msgid "Deprecated; use --classpath instead"
msgstr ""
-#: stor-layout.c:843
-msgid "%Jpacked attribute is unnecessary for %qD"
+#: java/lang.opt:86
+msgid "Permit the use of the assert keyword"
msgstr ""
-#: stor-layout.c:859
-msgid "%Jpadding struct to align %qD"
+#: java/lang.opt:108
+msgid "Replace system path"
msgstr ""
-#: stor-layout.c:1201
-msgid "padding struct size to alignment boundary"
+#: java/lang.opt:112
+msgid "Generate checks for references to NULL"
msgstr ""
-#: stor-layout.c:1231
-#, c-format
-msgid "packed attribute causes inefficient alignment for %qs"
+#: java/lang.opt:116
+msgid "Set class path"
msgstr ""
-#: stor-layout.c:1234
-#, c-format
-msgid "packed attribute is unnecessary for %qs"
+#: java/lang.opt:123
+msgid "Output a class file"
msgstr ""
-#: stor-layout.c:1239
-msgid "packed attribute causes inefficient alignment"
+#: java/lang.opt:127
+msgid "Alias for -femit-class-file"
msgstr ""
-#: stor-layout.c:1241
-msgid "packed attribute is unnecessary"
+#: java/lang.opt:131
+msgid "Choose input encoding (defaults from your locale)"
msgstr ""
-#: targhooks.c:96
-msgid "__builtin_saveregs not supported by this target"
+#: java/lang.opt:135
+msgid "Set the extension directory path"
+msgstr ""
+
+#: java/lang.opt:139
+msgid "Input file is a file with a list of filenames to compile"
msgstr ""
-#: timevar.c:401
+#: java/lang.opt:143
+msgid "Always check for non gcj generated classes archives"
+msgstr ""
+
+#: java/lang.opt:147
msgid ""
-"\n"
-"Execution times (seconds)\n"
+"Assume the runtime uses a hash table to map an object to its synchronization "
+"structure"
msgstr ""
-#. Print total time.
-#: timevar.c:451
-msgid " TOTAL :"
+#: java/lang.opt:151
+msgid "Use offset tables for virtual method calls"
msgstr ""
-#: timevar.c:479
-#, c-format
-msgid "time in %s: %ld.%06ld (%ld%%)\n"
+#: java/lang.opt:158
+msgid "Assume native functions are implemented using JNI"
msgstr ""
-#: tlink.c:384
-#, c-format
-msgid "collect: reading %s\n"
+#: java/lang.opt:162
+msgid "Enable optimization of static class initialization code"
msgstr ""
-#: tlink.c:478
-msgid "removing .rpo file"
+#: java/lang.opt:169
+msgid "Enable assignability checks for stores into object arrays"
msgstr ""
-#: tlink.c:480
-msgid "renaming .rpo file"
+#: java/lang.opt:173
+msgid "Generate code for the Boehm GC"
msgstr ""
-#: tlink.c:484
-#, c-format
-msgid "repository file '%s' does not contain command-line arguments"
+#: java/lang.opt:177
+msgid "Call a library routine to do integer divisions"
msgstr ""
-#: tlink.c:534
-#, c-format
-msgid "collect: recompiling %s\n"
+#: java/lang.opt:181
+msgid "Generated should be loaded by bootstrap loader"
msgstr ""
-#: tlink.c:705
-#, c-format
+#: treelang/lang.opt:30
+msgid "Trace lexical analysis"
+msgstr ""
+
+#: treelang/lang.opt:34
+msgid "Trace the parsing process"
+msgstr ""
+
+#: c.opt:42
msgid ""
-"'%s' was assigned to '%s', but was not defined during recompilation, or vice "
-"versa"
+"Assert the <answer> to <question>. Putting '-' before <question> disables "
+"the <answer> to <question>"
msgstr ""
-#: tlink.c:714
-#, c-format
-msgid "collect: tweaking %s in %s\n"
+#: c.opt:46
+msgid "Do not discard comments"
msgstr ""
-#: tlink.c:764
-#, c-format
-msgid "collect: relinking\n"
+#: c.opt:50
+msgid "Do not discard comments in macro expansions"
msgstr ""
-#: tlink.c:775
-#, c-format
-msgid "ld returned %d exit status"
+#: c.opt:54
+msgid ""
+"Define a <macro> with <val> as its value. If just <macro> is given, <val> "
+"is taken to be 1"
msgstr ""
-#: toplev.c:471
-#, c-format
-msgid "%s "
+#: c.opt:61
+msgid "Add <dir> to the end of the main framework include path"
msgstr ""
-#: toplev.c:473
-#, c-format
-msgid " %s"
+#: c.opt:65
+msgid "Print the name of header files as they are used"
msgstr ""
-#: toplev.c:538
-#, c-format
-msgid "invalid option argument %qs"
+#: c.opt:69 c.opt:762
+msgid "Add <dir> to the end of the main include path"
msgstr ""
-#: toplev.c:608
-msgid "unrecoverable error"
+#: c.opt:73
+msgid "Generate make dependencies"
msgstr ""
-#: toplev.c:628
-#, c-format
-msgid "getting core file size maximum limit: %m"
+#: c.opt:77
+msgid "Generate make dependencies and compile"
msgstr ""
-#: toplev.c:631
-#, c-format
-msgid "setting core file size limit to maximum: %m"
+#: c.opt:81
+msgid "Write dependency output to the given file"
msgstr ""
-#: toplev.c:854
-msgid "%J%qF declared %<static%> but never defined"
+#: c.opt:85
+msgid "Treat missing header files as generated files"
msgstr ""
-#: toplev.c:880
-msgid "%J%qD defined but not used"
+#: c.opt:89
+msgid "Like -M but ignore system header files"
msgstr ""
-#: toplev.c:903 toplev.c:926
-#, c-format
-msgid "%qs is deprecated (declared at %s:%d)"
+#: c.opt:93
+msgid "Like -MD but ignore system header files"
msgstr ""
-#: toplev.c:929
-#, c-format
-msgid "type is deprecated (declared at %s:%d)"
+#: c.opt:97
+msgid "Generate phony targets for all headers"
msgstr ""
-#: toplev.c:935
-#, c-format
-msgid "%qs is deprecated"
+#: c.opt:101
+msgid "Add a MAKE-quoted target"
msgstr ""
-#: toplev.c:937
-msgid "type is deprecated"
+#: c.opt:105
+msgid "Add an unquoted target"
msgstr ""
-#: toplev.c:1099
-#, c-format
+#: c.opt:109
+msgid "Do not generate #line directives"
+msgstr ""
+
+#: c.opt:113
+msgid "Undefine <macro>"
+msgstr ""
+
+#: c.opt:117
msgid ""
-"\n"
-"Target specific options:\n"
+"Warn about things that will change when compiling with an ABI-compliant "
+"compiler"
msgstr ""
-#: toplev.c:1114 toplev.c:1134
-#, c-format
-msgid " -m%-23s [undocumented]\n"
+#: c.opt:121
+msgid "Enable most warning messages"
msgstr ""
-#: toplev.c:1144
-#, c-format
+#: c.opt:125
msgid ""
-"\n"
-"There are undocumented target specific options as well.\n"
+"Warn whenever an Objective-C assignment is being intercepted by the garbage "
+"collector"
msgstr ""
-#: toplev.c:1146
-#, c-format
-msgid " They exist, but they are not documented.\n"
+#: c.opt:129
+msgid "Warn about casting functions to incompatible types"
msgstr ""
-#: toplev.c:1190
-#, c-format
-msgid "unrecognized gcc debugging option: %c"
+#: c.opt:133
+msgid "Warn about casts which discard qualifiers"
msgstr ""
-#. Handle -mfix-and-continue.
-#: toplev.c:1256 config/rs6000/rs6000.c:1398 config/rs6000/rs6000.c:1409
-#: config/rs6000/darwin.h:106
-#, c-format
-msgid "invalid option %qs"
+#: c.opt:137
+msgid "Warn about subscripts whose type is \"char\""
msgstr ""
-#: toplev.c:1271
-#, c-format
+#: c.opt:141
msgid ""
-"%s%s%s version %s (%s)\n"
-"%s\tcompiled by GNU C version %s.\n"
-"%s%s%s version %s (%s) compiled by CC.\n"
+"Warn about possibly nested block comments, and C++ comments spanning more "
+"than one physical line"
msgstr ""
-#: toplev.c:1278
-#, c-format
+#: c.opt:145
+msgid "Synonym for -Wcomment"
+msgstr ""
+
+#: c.opt:149
+msgid "Warn about possibly confusing type conversions"
+msgstr ""
+
+#: c.opt:153
+msgid "Warn when all constructors and destructors are private"
+msgstr ""
+
+#: c.opt:157
+msgid "Warn when a declaration is found after a statement"
+msgstr ""
+
+#: c.opt:161
+msgid "Warn about deprecated compiler features"
+msgstr ""
+
+#: c.opt:165
+msgid "Warn about compile-time integer division by zero"
+msgstr ""
+
+#: c.opt:169
+msgid "Warn about violations of Effective C++ style rules"
+msgstr ""
+
+#: c.opt:173
+msgid "Warn about stray tokens after #elif and #endif"
+msgstr ""
+
+#: c.opt:181
+msgid "Make implicit function declarations an error"
+msgstr ""
+
+#: c.opt:185
+msgid "Warn if testing floating point numbers for equality"
+msgstr ""
+
+#: c.opt:189
+msgid "Warn about printf/scanf/strftime/strfmon format string anomalies"
+msgstr ""
+
+#: c.opt:193
+msgid "Warn if passing too many arguments to a function for its format string"
+msgstr ""
+
+#: c.opt:197
+msgid "Warn about format strings that are not literals"
+msgstr ""
+
+#: c.opt:201
+msgid "Warn about possible security problems with format functions"
+msgstr ""
+
+#: c.opt:205
+msgid "Warn about strftime formats yielding 2-digit years"
+msgstr ""
+
+#: c.opt:209
+msgid "Warn about zero-length formats"
+msgstr ""
+
+#: c.opt:216
+msgid "Warn about variables which are initialized to themselves."
+msgstr ""
+
+#: c.opt:223
+msgid "Warn about implicit function declarations"
+msgstr ""
+
+#: c.opt:227
+msgid "Warn when a declaration does not specify a type"
+msgstr ""
+
+#: c.opt:231
+msgid "Deprecated. This switch has no effect."
+msgstr ""
+
+#: c.opt:235
msgid ""
-"%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n"
+"Warn when there is a cast to a pointer from an integer of a different size"
msgstr ""
-#: toplev.c:1330
-msgid "options passed: "
+#: c.opt:239
+msgid "Warn about invalid uses of the \"offsetof\" macro"
msgstr ""
-#: toplev.c:1359
-msgid "options enabled: "
+#: c.opt:243
+msgid "Warn about PCH files that are found but not used"
msgstr ""
-#: toplev.c:1420
-msgid "can%'t open %s for writing: %m"
+#: c.opt:247
+msgid "Do not warn about using \"long long\" when -pedantic"
msgstr ""
-#: toplev.c:1498 config/sh/sh.c:7334
-msgid "created and used with different settings of -fpic"
+#: c.opt:251
+msgid "Warn about suspicious declarations of \"main\""
msgstr ""
-#: toplev.c:1500 config/sh/sh.c:7336
-msgid "created and used with different settings of -fpie"
+#: c.opt:255
+msgid "Warn about possibly missing braces around initializers"
msgstr ""
-#: toplev.c:1560 config/sh/sh.c:7386
-#, c-format
-msgid "created and used with differing settings of '-m%s'"
+#: c.opt:259
+msgid "Warn about global functions without previous declarations"
msgstr ""
-#: toplev.c:1563 config/sh/sh.c:7389
-msgid "out of memory"
+#: c.opt:263
+msgid "Warn about missing fields in struct initializers"
msgstr ""
-#: toplev.c:1771
-msgid "instruction scheduling not supported on this target machine"
+#: c.opt:267
+msgid "Warn about functions which might be candidates for format attributes"
msgstr ""
-#: toplev.c:1775
-msgid "this target machine does not have delayed branches"
+#: c.opt:271
+msgid "Warn about user-specified include directories that do not exist"
msgstr ""
-#: toplev.c:1789
-#, c-format
-msgid "-f%sleading-underscore not supported on this target machine"
+#: c.opt:275
+msgid "Warn about global functions without prototypes"
msgstr ""
-#: toplev.c:1863
-#, c-format
-msgid "target system does not support the \"%s\" debug format"
+#: c.opt:279
+msgid "Warn about use of multi-character character constants"
msgstr ""
-#: toplev.c:1875
-msgid "variable tracking requested, but useless unless producing debug info"
+#: c.opt:283
+msgid "Warn about \"extern\" declarations not at file scope"
msgstr ""
-#: toplev.c:1878
-msgid "variable tracking requested, but not supported by this debug format"
+#: c.opt:287
+msgid ""
+"Warn when non-templatized friend functions are declared within a template"
msgstr ""
-#: toplev.c:1898
-msgid "can%'t open %s: %m"
+#: c.opt:291
+msgid "Warn about non-virtual destructors"
msgstr ""
-#: toplev.c:1905
-msgid "-ffunction-sections not supported for this target"
+#: c.opt:295
+msgid ""
+"Warn about NULL being passed to argument slots marked as requiring non-NULL"
msgstr ""
-#: toplev.c:1910
-msgid "-fdata-sections not supported for this target"
+#: c.opt:299
+msgid "Warn about non-normalised Unicode strings"
msgstr ""
-#: toplev.c:1917
-msgid "-ffunction-sections disabled; it makes profiling impossible"
+#: c.opt:303
+msgid "Warn if a C-style cast is used in a program"
msgstr ""
-#: toplev.c:1924
-msgid "-fprefetch-loop-arrays not supported for this target"
+#: c.opt:307
+msgid "Warn if an old-style parameter definition is used"
msgstr ""
-#: toplev.c:1930
-msgid "-fspeculative-prefetching not supported for this target"
+#: c.opt:311
+msgid "Warn about overloaded virtual function names"
msgstr ""
-#: toplev.c:1936
+#: c.opt:315
+msgid "Warn about possibly missing parentheses"
+msgstr ""
+
+#: c.opt:319
+msgid "Warn when converting the type of pointers to member functions"
+msgstr ""
+
+#: c.opt:323
+msgid "Warn about function pointer arithmetic"
+msgstr ""
+
+#: c.opt:327
+msgid "Warn when a pointer is cast to an integer of a different size"
+msgstr ""
+
+#: c.opt:331
+msgid "Warn if inherited methods are unimplemented"
+msgstr ""
+
+#: c.opt:335
+msgid "Warn about multiple declarations of the same object"
+msgstr ""
+
+#: c.opt:339
+msgid "Warn when the compiler reorders code"
+msgstr ""
+
+#: c.opt:343
msgid ""
-"-fprefetch-loop-arrays not supported for this target (try -march switches)"
+"Warn whenever a function's return type defaults to \"int\" (C), or about "
+"inconsistent return types (C++)"
+msgstr ""
+
+#: c.opt:347
+msgid "Warn if a selector has multiple methods"
+msgstr ""
+
+#: c.opt:351
+msgid "Warn about possible violations of sequence point rules"
+msgstr ""
+
+#: c.opt:355
+msgid "Warn about signed-unsigned comparisons"
+msgstr ""
+
+#: c.opt:359
+msgid "Warn when overload promotes from unsigned to signed"
+msgstr ""
+
+#: c.opt:363
+msgid "Warn about uncasted NULL used as sentinel"
+msgstr ""
+
+#: c.opt:367
+msgid "Warn about unprototyped function declarations"
+msgstr ""
+
+#: c.opt:371
+msgid "Warn if type signatures of candidate methods do not match exactly"
+msgstr ""
+
+#: c.opt:375
+msgid "Warn when synthesis behavior differs from Cfront"
msgstr ""
-#: toplev.c:1942
+#: c.opt:383
+msgid "Warn about features not present in traditional C"
+msgstr ""
+
+#: c.opt:387
msgid ""
-"-fspeculative-prefetching not supported for this target (try -march switches)"
+"Warn if trigraphs are encountered that might affect the meaning of the "
+"program"
msgstr ""
-#: toplev.c:1951
-msgid "-fprefetch-loop-arrays is not supported with -Os"
+#: c.opt:391
+msgid "Warn about @selector()s without previously declared methods"
msgstr ""
-#: toplev.c:1957
-msgid "-ffunction-sections may affect debugging on some targets"
+#: c.opt:395
+msgid "Warn if an undefined macro is used in an #if directive"
msgstr ""
-#: toplev.c:2069
-#, c-format
-msgid "error writing to %s: %m"
+#: c.opt:399
+msgid "Warn about unrecognized pragmas"
msgstr ""
-#: toplev.c:2071 java/jcf-parse.c:1080 java/jcf-write.c:3538
-#, c-format
-msgid "error closing %s: %m"
+#: c.opt:403
+msgid "Warn about macros defined in the main file that are not used"
msgstr ""
-#: tree-cfg.c:1396 tree-cfg.c:2133 tree-cfg.c:2136
-msgid "%Hwill never be executed"
+#: c.opt:407
+msgid "Do not warn about using variadic macros when -pedantic"
msgstr ""
-#: tree-cfg.c:3426
-msgid "SSA name in freelist but still referenced"
+#: c.opt:411
+msgid "Give strings the type \"array of char\""
msgstr ""
-#: tree-cfg.c:3436
-msgid "GIMPLE register modified with BIT_FIELD_REF"
+#: c.opt:415
+msgid "Warn when a pointer differs in signedness in an assignment."
msgstr ""
-#: tree-cfg.c:3464
-msgid "address taken, but ADDRESSABLE bit not set"
+#: c.opt:419
+msgid "A synonym for -std=c89 (for C) or -std=c++98 (for C++)."
msgstr ""
-#: tree-cfg.c:3473
-msgid "non-boolean used in condition"
+#: c.opt:427
+msgid "Enforce class member access control semantics"
msgstr ""
-#: tree-cfg.c:3528
-msgid "Invalid reference prefix."
+#: c.opt:434
+msgid "Change when template instances are emitted"
msgstr ""
-#: tree-cfg.c:3593
-msgid "Is not a valid GIMPLE statement."
+#: c.opt:438
+msgid "Recognize the \"asm\" keyword"
msgstr ""
-#: tree-cfg.c:3613
-msgid "Statement marked for throw, but doesn%'t."
+#: c.opt:442
+msgid "Recognize built-in functions"
msgstr ""
-#: tree-cfg.c:3618
-msgid "Statement marked for throw in middle of block."
+#: c.opt:449
+msgid "Check the return value of new"
msgstr ""
-#: tree-cfg.c:3713
-msgid "bb_for_stmt (phi) is set to a wrong basic block\n"
+#: c.opt:453
+msgid "Allow the arguments of the '?' operator to have different types"
msgstr ""
-#: tree-cfg.c:3728
-msgid "PHI def is not a GIMPLE value"
+#: c.opt:457
+msgid "Reduce the size of object files"
msgstr ""
-#: tree-cfg.c:3744 tree-cfg.c:3767
-msgid "Incorrect sharing of tree nodes"
+#: c.opt:461
+msgid "Make string literals \"const char[]\" not \"char[]\""
msgstr ""
-#: tree-cfg.c:3758
-msgid "bb_for_stmt (stmt) is set to a wrong basic block\n"
+#: c.opt:465
+msgid "Use class <name> for constant strings"
msgstr ""
-#: tree-cfg.c:3776
-msgid "verify_stmts failed."
+#: c.opt:469
+msgid "Inline member functions by default"
msgstr ""
-#: tree-cfg.c:3797
-msgid "ENTRY_BLOCK has a statement list associated with it\n"
+#: c.opt:473
+msgid "Permit '$' as an identifier character"
msgstr ""
-#: tree-cfg.c:3803
-msgid "EXIT_BLOCK has a statement list associated with it\n"
+#: c.opt:480
+msgid "Generate code to check exception specifications"
msgstr ""
-#: tree-cfg.c:3810
-#, c-format
-msgid "Fallthru to exit from bb %d\n"
+#: c.opt:487
+msgid "Convert all strings and character constants to character set <cset>"
msgstr ""
-#: tree-cfg.c:3832
-#, c-format
-msgid "Nonlocal label %s is not first in a sequence of labels in bb %d"
+#: c.opt:491
+msgid "Specify the default character set for source files."
msgstr ""
-#: tree-cfg.c:3841
-#, c-format
-msgid "Label %s to block does not match in bb %d\n"
+#: c.opt:505
+msgid "Scope of for-init-statement variables is local to the loop"
msgstr ""
-#: tree-cfg.c:3850
-#, c-format
-msgid "Label %s has incorrect context in bb %d\n"
+#: c.opt:509
+msgid "Do not assume that standard C libraries and \"main\" exist"
msgstr ""
-#: tree-cfg.c:3864
-#, c-format
-msgid "Control flow in the middle of basic block %d\n"
+#: c.opt:513
+msgid "Recognize GNU-defined keywords"
msgstr ""
-#: tree-cfg.c:3874
-#, c-format
-msgid "Label %s in the middle of basic block %d\n"
+#: c.opt:517
+msgid "Generate code for GNU runtime environment"
msgstr ""
-#: tree-cfg.c:3891
-#, c-format
-msgid "Fallthru edge after a control statement in bb %d \n"
+#: c.opt:530
+msgid "Assume normal C execution environment"
msgstr ""
-#: tree-cfg.c:3906
-#, c-format
-msgid "Structured COND_EXPR at the end of bb %d\n"
+#: c.opt:534
+msgid "Enable support for huge objects"
msgstr ""
-#: tree-cfg.c:3919 tree-cfg.c:3957 tree-cfg.c:3970 tree-cfg.c:4041
-#, c-format
-msgid "Wrong outgoing edge flags at end of bb %d\n"
+#: c.opt:538
+msgid "Export functions even if they can be inlined"
msgstr ""
-#: tree-cfg.c:3927
-msgid "%<then%> label does not match edge at end of bb %d\n"
+#: c.opt:542
+msgid "Emit implicit instantiations of inline templates"
msgstr ""
-#: tree-cfg.c:3935
-msgid "%<else%> label does not match edge at end of bb %d\n"
+#: c.opt:546
+msgid "Emit implicit instantiations of templates"
msgstr ""
-#: tree-cfg.c:3945
-#, c-format
-msgid "Explicit goto at end of bb %d\n"
+#: c.opt:553
+msgid "Don't warn about uses of Microsoft extensions"
msgstr ""
-#: tree-cfg.c:3975
-#, c-format
-msgid "Return edge does not point to exit in bb %d\n"
+#: c.opt:563
+msgid "Generate code for NeXT (Apple Mac OS X) runtime environment"
msgstr ""
-#: tree-cfg.c:4008
-msgid "Found default case not at end of case vector"
+#: c.opt:567
+msgid "Assume that receivers of Objective-C messages may be nil"
msgstr ""
-#: tree-cfg.c:4014
+#: c.opt:579
msgid ""
-"Case labels not sorted:\n"
-" "
+"Generate special Objective-C methods to initialize/destroy non-POD C++ "
+"ivars, if needed"
msgstr ""
-#: tree-cfg.c:4025
-msgid "No default case found at end of case vector"
+#: c.opt:583
+msgid "Allow fast jumps to the message dispatcher"
msgstr ""
-#: tree-cfg.c:4033
-#, c-format
-msgid "Extra outgoing edge %d->%d\n"
+#: c.opt:589
+msgid "Enable Objective-C exception and synchronization syntax"
msgstr ""
-#: tree-cfg.c:4055
-#, c-format
-msgid "Missing edge %i->%i"
+#: c.opt:593
+msgid "Enable garbage collection (GC) in Objective-C/Objective-C++ programs"
msgstr ""
-#: tree-cfg.c:5940
-msgid "%Jfunction might be possible candidate for attribute %<noreturn%>"
+#: c.opt:598
+msgid "Enable Objective-C setjmp exception handling runtime"
msgstr ""
-#: tree-cfg.c:5967 tree-cfg.c:5971
-msgid "%H%<noreturn%> function does return"
+#: c.opt:602
+msgid "Recognize C++ kewords like \"compl\" and \"xor\""
msgstr ""
-#: tree-cfg.c:5992 tree-cfg.c:5997
-msgid "%Hcontrol reaches end of non-void function"
+#: c.opt:606
+msgid "Enable optional diagnostics"
msgstr ""
-#: tree-dump.c:851
-#, c-format
-msgid "could not open dump file %qs: %s"
+#: c.opt:613
+msgid "Look for and use PCH files even when preprocessing"
msgstr ""
-#: tree-dump.c:967
-msgid "ignoring unknown option %q.*s in %<-fdump-%s%>"
+#: c.opt:617
+msgid "Downgrade conformance errors to warnings"
+msgstr ""
+
+#: c.opt:621
+msgid "Treat the input file as already preprocessed"
msgstr ""
-#: tree-inline.c:972
+#: c.opt:625
msgid ""
-"%Jfunction %qF can never be inlined because it uses alloca (override using "
-"the always_inline attribute)"
+"Used in Fix-and-Continue mode to indicate that object files may be swapped "
+"in at runtime"
msgstr ""
-#: tree-inline.c:984
-msgid "%Jfunction %qF can never be inlined because it uses setjmp"
+#: c.opt:629
+msgid "Enable automatic template instantiation"
msgstr ""
-#: tree-inline.c:998
-msgid ""
-"%Jfunction %qF can never be inlined because it uses variable argument lists"
+#: c.opt:633
+msgid "Generate run time type descriptor information"
msgstr ""
-#: tree-inline.c:1009
-msgid ""
-"%Jfunction %qF can never be inlined because it uses setjmp-longjmp exception "
-"handling"
+#: c.opt:637
+msgid "Use the same size for double as for float"
msgstr ""
-#: tree-inline.c:1016
-msgid "%Jfunction %qF can never be inlined because it uses non-local goto"
+#: c.opt:641
+msgid "Use the narrowest integer type possible for enumeration types"
+msgstr ""
+
+#: c.opt:645
+msgid "Force the underlying type for \"wchar_t\" to be \"unsigned short\""
+msgstr ""
+
+#: c.opt:649
+msgid "When \"signed\" or \"unsigned\" is not given make the bitfield signed"
+msgstr ""
+
+#: c.opt:653
+msgid "Make \"char\" signed by default"
+msgstr ""
+
+#: c.opt:660
+msgid "Display statistics accumulated during compilation"
+msgstr ""
+
+#: c.opt:667
+msgid "Distance between tab stops for column reporting"
+msgstr ""
+
+#: c.opt:671
+msgid "Specify maximum template instantiation depth"
+msgstr ""
+
+#: c.opt:678
+msgid "Do not generate thread-safe code for initializing local statics."
msgstr ""
-#: tree-inline.c:1027
+#: c.opt:682
+msgid "When \"signed\" or \"unsigned\" is not given make the bitfield unsigned"
+msgstr ""
+
+#: c.opt:686
+msgid "Make \"char\" unsigned by default"
+msgstr ""
+
+#: c.opt:690
+msgid "Use __cxa_atexit to register destructors"
+msgstr ""
+
+#: c.opt:694
+msgid "Marks all inlined methods as having hidden visibility"
+msgstr ""
+
+#: c.opt:698
+msgid "Discard unused virtual functions"
+msgstr ""
+
+#: c.opt:702
+msgid "Implement vtables using thunks"
+msgstr ""
+
+#: c.opt:706
+msgid "Emit common-like symbols as weak symbols"
+msgstr ""
+
+#: c.opt:710
msgid ""
-"%Jfunction %qF can never be inlined because it uses __builtin_return or "
-"__builtin_apply_args"
+"Convert all wide strings and character constants to character set <cset>"
msgstr ""
-#: tree-inline.c:1046
-msgid "%Jfunction %qF can never be inlined because it contains a computed goto"
+#: c.opt:714
+msgid "Generate a #line directive pointing at the current working directory"
+msgstr ""
+
+#: c.opt:718
+msgid "Emit cross referencing information"
msgstr ""
-#: tree-inline.c:1060
+#: c.opt:722
msgid ""
-"%Jfunction %qF can never be inlined because it receives a non-local goto"
+"Generate lazy class lookup (via objc_getClass()) for use in Zero-Link mode"
+msgstr ""
+
+#: c.opt:726
+msgid "Dump declarations to a .decl file"
+msgstr ""
+
+#: c.opt:730 c.opt:758
+msgid "Add <dir> to the end of the system include path"
+msgstr ""
+
+#: c.opt:734
+msgid "Accept definition of macros in <file>"
+msgstr ""
+
+#: c.opt:738
+msgid "Include the contents of <file> before other files"
msgstr ""
-#: tree-inline.c:1085
+#: c.opt:742
+msgid "Specify <path> as a prefix for next two options"
+msgstr ""
+
+#: c.opt:746
+msgid "Set <dir> to be the system root directory"
+msgstr ""
+
+#: c.opt:750
+msgid "Add <dir> to the start of the system include path"
+msgstr ""
+
+#: c.opt:754
+msgid "Add <dir> to the end of the quote include path"
+msgstr ""
+
+#: c.opt:772
msgid ""
-"%Jfunction %qF can never be inlined because it uses variable sized variables"
+"Do not search standard system include directories (those specified with -"
+"isystem will still be used)"
msgstr ""
-#: tree-inline.c:1562
-msgid "originally indirect function call not considered for inlining"
+#: c.opt:776
+msgid "Do not search standard system include directories for C++"
msgstr ""
-#: tree-inline.c:1572 tree-inline.c:1580
-msgid "%Jinlining failed in call to %qF: %s"
+#: c.opt:792
+msgid "Generate C header of platform-specific features"
msgstr ""
-#: tree-inline.c:1573 tree-inline.c:1581
-msgid "called from here"
+#: c.opt:796
+msgid "Print a checksum of the executable for PCH validity checking, and stop."
msgstr ""
-#: tree-inline.c:1695
-msgid "control may reach end of non-void function %qD being inlined"
+#: c.opt:800
+msgid "Remap file names when including files"
msgstr ""
-#: tree-mudflap.c:857
-msgid "mudflap checking not yet implemented for ARRAY_RANGE_REF"
+#: c.opt:804
+msgid "Conform to the ISO 1998 C++ standard"
msgstr ""
-#: tree-mudflap.c:1048
-#, c-format
-msgid "mudflap cannot track %qs in stub function"
+#: c.opt:808 c.opt:836
+msgid "Conform to the ISO 1990 C standard"
msgstr ""
-#: tree-mudflap.c:1279
-#, c-format
-msgid "mudflap cannot track unknown size extern %qs"
+#: c.opt:812 c.opt:844
+msgid "Conform to the ISO 1999 C standard"
msgstr ""
-#: tree-nomudflap.c:51
-msgid "mudflap: this language is not supported"
+#: c.opt:816
+msgid "Deprecated in favor of -std=c99"
msgstr ""
-#: tree-optimize.c:743
-msgid "%Jsize of return value of %qD is %u bytes"
+#: c.opt:820
+msgid "Conform to the ISO 1998 C++ standard with GNU extensions"
msgstr ""
-#: tree-optimize.c:746
-msgid "%Jsize of return value of %qD is larger than %wd bytes"
+#: c.opt:824
+msgid "Conform to the ISO 1990 C standard with GNU extensions"
msgstr ""
-#: tree-outof-ssa.c:608 tree-outof-ssa.c:623 tree-outof-ssa.c:637
-#: tree-outof-ssa.c:659 tree-outof-ssa.c:1027 tree-outof-ssa.c:1863
-#: tree-ssa-live.c:415 tree-ssa-live.c:1793
-msgid "SSA corruption"
+#: c.opt:828
+msgid "Conform to the ISO 1999 C standard with GNU extensions"
msgstr ""
-#: tree-outof-ssa.c:2263
-#, c-format
-msgid " Pending stmts not issued on PRED edge (%d, %d)\n"
+#: c.opt:832
+msgid "Deprecated in favor of -std=gnu99"
msgstr ""
-#: tree-outof-ssa.c:2269
-#, c-format
-msgid " Pending stmts not issued on SUCC edge (%d, %d)\n"
+#: c.opt:840
+msgid "Conform to the ISO 1990 C standard as amended in 1994"
msgstr ""
-#: tree-outof-ssa.c:2276
-#, c-format
-msgid " Pending stmts not issued on ENTRY edge (%d, %d)\n"
+#: c.opt:848
+msgid "Deprecated in favor of -std=iso9899:1999"
msgstr ""
-#: tree-outof-ssa.c:2282
-#, c-format
-msgid " Pending stmts not issued on EXIT edge (%d, %d)\n"
+#: c.opt:852
+msgid "Enable traditional preprocessing"
msgstr ""
-#: tree-profile.c:567
-msgid "unimplemented functionality"
+#: c.opt:856
+msgid "Support ISO C trigraphs"
msgstr ""
-#: tree-ssa-operands.c:1504
-msgid "internal error"
+#: c.opt:860
+msgid "Do not predefine system-specific and GCC-specific macros"
msgstr ""
-#: tree-ssa.c:111
-msgid "Expected an SSA_NAME object"
+#: c.opt:864
+msgid "Enable verbose output"
msgstr ""
-#: tree-ssa.c:117
-msgid "Type mismatch between an SSA_NAME and its symbol."
+#: attribs.c:175
+#, gcc-internal-format
+msgid "%qs attribute directive ignored"
msgstr ""
-#: tree-ssa.c:123
-msgid "Found an SSA_NAME that had been released into the free pool"
+#: attribs.c:183
+#, gcc-internal-format
+msgid "wrong number of arguments specified for %qs attribute"
msgstr ""
-#: tree-ssa.c:129
-msgid "Found a virtual definition for a GIMPLE register"
+#: attribs.c:200
+#, gcc-internal-format
+msgid "%qs attribute does not apply to types"
msgstr ""
-#: tree-ssa.c:135
-msgid "Found a real definition for a non-register"
+#: attribs.c:247
+#, gcc-internal-format
+msgid "%qs attribute only applies to function types"
msgstr ""
-#: tree-ssa.c:142
-msgid "Found real variable when subvariables should have appeared"
+#: bb-reorder.c:1865
+#, gcc-internal-format
+msgid "Multiple hot/cold transitions found (bb %i)"
msgstr ""
-#: tree-ssa.c:171
-#, c-format
-msgid "SSA_NAME created in two different blocks %i and %i"
+#: builtins.c:354
+#, gcc-internal-format
+msgid "offset outside bounds of constant string"
msgstr ""
-#: tree-ssa.c:180
-msgid "SSA_NAME_DEF_STMT is wrong"
+#: builtins.c:941
+#, gcc-internal-format
+msgid "second argument to %<__builtin_prefetch%> must be a constant"
msgstr ""
-#: tree-ssa.c:238
-msgid "Missing definition"
+#: builtins.c:948
+#, gcc-internal-format
+msgid "invalid second argument to %<__builtin_prefetch%>; using zero"
msgstr ""
-#: tree-ssa.c:244
-#, c-format
-msgid "Definition in block %i does not dominate use in block %i"
+#: builtins.c:956
+#, gcc-internal-format
+msgid "third argument to %<__builtin_prefetch%> must be a constant"
msgstr ""
-#: tree-ssa.c:252
-#, c-format
-msgid "Definition in block %i follows the use"
+#: builtins.c:963
+#, gcc-internal-format
+msgid "invalid third argument to %<__builtin_prefetch%>; using zero"
msgstr ""
-#: tree-ssa.c:259
-msgid "SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set"
+#: builtins.c:3951
+#, gcc-internal-format
+msgid "argument of %<__builtin_args_info%> must be constant"
msgstr ""
-#: tree-ssa.c:267
-msgid "No immediate_use list"
+#: builtins.c:3957
+#, gcc-internal-format
+msgid "argument of %<__builtin_args_info%> out of range"
msgstr ""
-#: tree-ssa.c:279
-msgid "Wrong immediate use list"
+#: builtins.c:3963
+#, gcc-internal-format
+msgid "missing argument in %<__builtin_args_info%>"
msgstr ""
-#: tree-ssa.c:312
-msgid "Incoming edge count does not match number of PHI arguments\n"
+#: builtins.c:4059 gimplify.c:1760
+#, gcc-internal-format
+msgid "too few arguments to function %<va_start%>"
msgstr ""
-#: tree-ssa.c:327
-#, c-format
-msgid "PHI argument is missing for edge %d->%d\n"
+#: builtins.c:4222
+#, gcc-internal-format
+msgid "first argument to %<va_arg%> not of type %<va_list%>"
msgstr ""
-#: tree-ssa.c:336
-msgid "PHI argument is not SSA_NAME, or invariant"
+#. Unfortunately, this is merely undefined, rather than a constraint
+#. violation, so we cannot make this an error. If this call is never
+#. executed, the program is still strictly conforming.
+#: builtins.c:4236
+#, gcc-internal-format
+msgid "%qT is promoted to %qT when passed through %<...%>"
msgstr ""
-#: tree-ssa.c:348
-#, c-format
-msgid "Wrong edge %d->%d for PHI argument\n"
+#: builtins.c:4241
+#, gcc-internal-format
+msgid "(so you should pass %qT not %qT to %<va_arg%>)"
msgstr ""
-#: tree-ssa.c:398
-msgid "Non-addressable variable inside an alias set."
+#. We can, however, treat "undefined" any way we please.
+#. Call abort to encourage the user to fix the program.
+#: builtins.c:4247 c-typeck.c:2049
+#, gcc-internal-format
+msgid "if this code is reached, the program will abort"
msgstr ""
-#: tree-ssa.c:416
-msgid "Addressable variable that is an alias tag but is not in any alias set."
+#: builtins.c:4366
+#, gcc-internal-format
+msgid "invalid argument to %<__builtin_frame_address%>"
msgstr ""
-#: tree-ssa.c:426
-msgid "verify_flow_insensitive_alias_info failed."
+#: builtins.c:4368
+#, gcc-internal-format
+msgid "invalid argument to %<__builtin_return_address%>"
msgstr ""
-#: tree-ssa.c:468
-msgid "Dereferenced pointers should have a name or a type tag"
+#: builtins.c:4381
+#, gcc-internal-format
+msgid "unsupported argument to %<__builtin_frame_address%>"
msgstr ""
-#: tree-ssa.c:476
-msgid ""
-"Pointers with a memory tag, should have points-to sets or point to malloc"
+#: builtins.c:4383
+#, gcc-internal-format
+msgid "unsupported argument to %<__builtin_return_address%>"
msgstr ""
-#: tree-ssa.c:484
-msgid "Pointer escapes but its name tag is not call-clobbered."
+#: builtins.c:4486
+#, gcc-internal-format
+msgid "second argument to %<__builtin_expect%> must be a constant"
msgstr ""
-#: tree-ssa.c:493
-msgid "verify_flow_sensitive_alias_info failed."
+#: builtins.c:5936
+#, gcc-internal-format
+msgid "%<__builtin_longjmp%> second argument must be 1"
msgstr ""
-#: tree-ssa.c:569
-msgid ""
-"Alias set of a pointer's type tag should be a superset of the corresponding "
-"name tag"
+#: builtins.c:6457
+#, gcc-internal-format
+msgid "target format does not support infinity"
+msgstr ""
+
+#: builtins.c:8287 builtins.c:8381
+#, gcc-internal-format
+msgid "too few arguments to function %qs"
+msgstr ""
+
+#: builtins.c:8293 builtins.c:8387
+#, gcc-internal-format
+msgid "too many arguments to function %qs"
+msgstr ""
+
+#: builtins.c:8299 builtins.c:8412
+#, gcc-internal-format
+msgid "non-floating-point argument to function %qs"
+msgstr ""
+
+#: builtins.c:9509
+#, gcc-internal-format
+msgid "%<va_start%> used in function with fixed args"
+msgstr ""
+
+#. Evidently an out of date version of <stdarg.h>; can't validate
+#. va_start's second argument, but can still work as intended.
+#: builtins.c:9516
+#, gcc-internal-format
+msgid "%<__builtin_next_arg%> called without an argument"
+msgstr ""
+
+#: builtins.c:9531
+#, gcc-internal-format
+msgid "%<va_start%> used with too many arguments"
+msgstr ""
+
+#. FIXME: Sometimes with the tree optimizers we can get the
+#. not the last argument even though the user used the last
+#. argument. We just warn and set the arg to be the last
+#. argument so that we will get wrong-code because of
+#. it.
+#: builtins.c:9551
+#, gcc-internal-format
+msgid "second parameter of %<va_start%> not last named argument"
msgstr ""
-#: tree-ssa.c:585
+#: c-common.c:828
+#, gcc-internal-format
+msgid "%qD is not defined outside of function scope"
+msgstr ""
+
+#: c-common.c:849
+#, gcc-internal-format
msgid ""
-"Two different pointers with identical points-to sets but different name tags"
+"string length %qd is greater than the length %qd ISO C%d compilers are "
+"required to support"
msgstr ""
-#: tree-ssa.c:614
-msgid "verify_name_tags failed"
+#: c-common.c:890
+#, gcc-internal-format
+msgid "overflow in constant expression"
msgstr ""
-#: tree-ssa.c:681
-#, c-format
-msgid "AUX pointer initialized for edge %d->%d\n"
+#: c-common.c:910
+#, gcc-internal-format
+msgid "integer overflow in expression"
msgstr ""
-#: tree-ssa.c:704
-#, c-format
-msgid "Stmt (0x%x) marked modified after optimization pass : "
+#: c-common.c:919
+#, gcc-internal-format
+msgid "floating point overflow in expression"
msgstr ""
-#: tree-ssa.c:714
-msgid "Statement makes aliased stores, but has no V_MAY_DEFS"
+#: c-common.c:925
+#, gcc-internal-format
+msgid "vector overflow in expression"
msgstr ""
-#: tree-ssa.c:753
-msgid "verify_ssa failed."
+#. This detects cases like converting -129 or 256 to unsigned char.
+#: c-common.c:947
+#, gcc-internal-format
+msgid "large integer implicitly truncated to unsigned type"
msgstr ""
-#: tree-ssa.c:1407
-msgid "%H%qD is used uninitialized in this function"
+#: c-common.c:950
+#, gcc-internal-format
+msgid "negative integer implicitly converted to unsigned type"
msgstr ""
-#: tree-ssa.c:1432
-msgid "%H%qD may be used uninitialized in this function"
+#: c-common.c:1008
+#, gcc-internal-format
+msgid "overflow in implicit constant conversion"
msgstr ""
-#: tree-vect-transform.c:578
-msgid "no support for reduction/induction"
+#: c-common.c:1144
+#, gcc-internal-format
+msgid "operation on %qE may be undefined"
msgstr ""
-#: tree-vect-transform.c:604
-msgid "unsupported defining stmt"
+#: c-common.c:1430
+#, gcc-internal-format
+msgid "case label does not reduce to an integer constant"
msgstr ""
-#: tree.c:3261 config/darwin.c:1241 config/arm/arm.c:2695
-#: config/arm/arm.c:2722 config/avr/avr.c:4680 config/h8300/h8300.c:5291
-#: config/h8300/h8300.c:5314 config/i386/i386.c:1742 config/i386/i386.c:15746
-#: config/ia64/ia64.c:523 config/ip2k/ip2k.c:3164
-#: config/m68hc11/m68hc11.c:1126 config/sh/symbian.c:414
-#: config/sh/symbian.c:421
-#, c-format
-msgid "%qs attribute ignored"
+#: c-common.c:1470
+#, gcc-internal-format
+msgid "case label value is less than minimum value for type"
msgstr ""
-#: tree.c:3279
-msgid "%Jfunction %qD definition is marked dllimport."
+#: c-common.c:1478
+#, gcc-internal-format
+msgid "case label value exceeds maximum value for type"
msgstr ""
-#: tree.c:3287
-msgid "%Jvariable %qD definition is marked dllimport."
+#: c-common.c:1486
+#, gcc-internal-format
+msgid "lower value in case label range less than minimum value for type"
msgstr ""
-#: tree.c:3307
-msgid "%Jexternal linkage required for symbol %qD because of %qs attribute."
+#: c-common.c:1495
+#, gcc-internal-format
+msgid "upper value in case label range exceeds maximum value for type"
msgstr ""
-#: tree.c:4460
-msgid "arrays of functions are not meaningful"
+#: c-common.c:1835
+#, gcc-internal-format
+msgid "invalid truth-value expression"
msgstr ""
-#: tree.c:4512
-msgid "function return type cannot be function"
+#: c-common.c:1883
+#, gcc-internal-format
+msgid "invalid operands to binary %s"
msgstr ""
-#: tree.c:5399
-#, c-format
-msgid "tree check: %s, have %s in %s, at %s:%d"
+#: c-common.c:2118
+#, gcc-internal-format
+msgid "comparison is always false due to limited range of data type"
msgstr ""
-#: tree.c:5436
-#, c-format
-msgid "tree check: expected none of %s, have %s in %s, at %s:%d"
+#: c-common.c:2120
+#, gcc-internal-format
+msgid "comparison is always true due to limited range of data type"
msgstr ""
-#: tree.c:5449
-#, c-format
-msgid "tree check: expected class %qs, have %qs (%s) in %s, at %s:%d"
+#: c-common.c:2190
+#, gcc-internal-format
+msgid "comparison of unsigned expression >= 0 is always true"
msgstr ""
-#: tree.c:5463
-#, c-format
-msgid "tree check: accessed elt %d of tree_vec with %d elts in %s, at %s:%d"
+#: c-common.c:2199
+#, gcc-internal-format
+msgid "comparison of unsigned expression < 0 is always false"
msgstr ""
-#: tree.c:5475
-#, c-format
-msgid "tree check: accessed elt %d of phi_node with %d elts in %s, at %s:%d"
+#: c-common.c:2241
+#, gcc-internal-format
+msgid "pointer of type %<void *%> used in arithmetic"
msgstr ""
-#: tree.c:5487
-#, c-format
-msgid "tree check: accessed operand %d of %s with %d operands in %s, at %s:%d"
+#: c-common.c:2247
+#, gcc-internal-format
+msgid "pointer to a function used in arithmetic"
msgstr ""
-#: varasm.c:487
-msgid "%J%D causes a section type conflict"
+#: c-common.c:2253
+#, gcc-internal-format
+msgid "pointer to member function used in arithmetic"
msgstr ""
-#: varasm.c:932
-msgid "%Jregister name not specified for %qD"
+#. Common Ada/Pascal programmer's mistake. We always warn
+#. about this since it is so bad.
+#: c-common.c:2379
+#, gcc-internal-format
+msgid "the address of %qD, will always evaluate as %<true%>"
msgstr ""
-#: varasm.c:934
-msgid "%Jinvalid register name for %qD"
+#: c-common.c:2476
+#, gcc-internal-format
+msgid "suggest parentheses around assignment used as truth value"
msgstr ""
-#: varasm.c:936
-msgid "%Jdata type of %qD isn%'t suitable for a register"
+#: c-common.c:2544 c-common.c:2584
+#, gcc-internal-format
+msgid "invalid use of %<restrict%>"
msgstr ""
-#: varasm.c:939
-msgid "%Jregister specified for %qD isn%'t suitable for data type"
+#: c-common.c:2800
+#, gcc-internal-format
+msgid "invalid application of %<sizeof%> to a function type"
msgstr ""
-#: varasm.c:949
-msgid "global register variable has initial value"
+#: c-common.c:2810
+#, gcc-internal-format
+msgid "invalid application of %qs to a void type"
msgstr ""
-#: varasm.c:952
-msgid "volatile register variables don%'t work as you might wish"
+#: c-common.c:2816
+#, gcc-internal-format
+msgid "invalid application of %qs to incomplete type %qT "
msgstr ""
-#: varasm.c:990
-msgid "%Jregister name given for non-register variable %qD"
+#: c-common.c:2857
+#, gcc-internal-format
+msgid "%<__alignof%> applied to a bit-field"
msgstr ""
-#: varasm.c:1067
-msgid "global destructors not supported on this target"
+#: c-common.c:3330
+#, gcc-internal-format
+msgid "cannot disable built-in function %qs"
msgstr ""
-#: varasm.c:1128
-msgid "global constructors not supported on this target"
+#: c-common.c:3521
+#, gcc-internal-format
+msgid "pointers are not permitted as case values"
msgstr ""
-#: varasm.c:1681
-msgid ""
-"%Jalignment of %qD is greater than maximum object file alignment. Using %d"
+#: c-common.c:3527
+#, gcc-internal-format
+msgid "range expressions in switch statements are non-standard"
msgstr ""
-#: varasm.c:1720
-msgid "thread-local COMMON data not implemented"
+#: c-common.c:3552
+#, gcc-internal-format
+msgid "empty range specified"
msgstr ""
-#: varasm.c:1745
-msgid ""
-"%Jrequested alignment for %qD is greater than implemented alignment of %d"
+#: c-common.c:3611
+#, gcc-internal-format
+msgid "duplicate (or overlapping) case value"
msgstr ""
-#: varasm.c:3846
-msgid "initializer for integer value is too complicated"
+#: c-common.c:3612
+#, gcc-internal-format
+msgid "%Jthis is the first entry overlapping that value"
msgstr ""
-#: varasm.c:3851
-msgid "initializer for floating value is not a floating constant"
+#: c-common.c:3616
+#, gcc-internal-format
+msgid "duplicate case value"
msgstr ""
-#: varasm.c:4118
-#, c-format
-msgid "invalid initial value for member %qs"
+#: c-common.c:3617
+#, gcc-internal-format
+msgid "%Jpreviously used here"
msgstr ""
-#: varasm.c:4303 varasm.c:4347
-msgid "%Jweak declaration of %qD must precede definition"
+#: c-common.c:3621
+#, gcc-internal-format
+msgid "multiple default labels in one switch"
msgstr ""
-#: varasm.c:4311
-msgid ""
-"%Jweak declaration of %qD after first use results in unspecified behavior"
+#: c-common.c:3622
+#, gcc-internal-format
+msgid "%Jthis is the first default label"
msgstr ""
-#: varasm.c:4345
-msgid "%Jweak declaration of %qD must be public"
+#: c-common.c:3671
+#, gcc-internal-format
+msgid "%Jcase value %qs not in enumerated type"
msgstr ""
-#: varasm.c:4354
-msgid "%Jweak declaration of %qD not supported"
+#: c-common.c:3674
+#, gcc-internal-format
+msgid "%Jcase value %qs not in enumerated type %qT"
msgstr ""
-#: varasm.c:4383
-msgid "only weak aliases are supported in this configuration"
+#: c-common.c:3731
+#, gcc-internal-format
+msgid "%Hswitch missing default case"
msgstr ""
-#: varasm.c:4548
-msgid "%J%qD aliased to undefined symbol %qE"
+#. Warn if there are enumerators that don't correspond to
+#. case expressions.
+#: c-common.c:3766
+#, gcc-internal-format
+msgid "%Henumeration value %qE not handled in switch"
msgstr ""
-#: varasm.c:4551
-msgid "%J%qD aliased to external symbol %qE"
+#: c-common.c:3793
+#, gcc-internal-format
+msgid "taking the address of a label is non-standard"
msgstr ""
-#: varasm.c:4582
-msgid "%Jalias definitions not supported in this configuration"
+#: c-common.c:3962 c-common.c:3981 c-common.c:3999 c-common.c:4026
+#: c-common.c:4045 c-common.c:4068 c-common.c:4092 c-common.c:4118
+#: c-common.c:4152 c-common.c:4196 c-common.c:4224 c-common.c:4252
+#: c-common.c:4271 c-common.c:4597 c-common.c:4628 c-common.c:4720
+#: c-common.c:4787 c-common.c:4805 c-common.c:4851 c-common.c:4921
+#: c-common.c:4945 c-common.c:5223 c-common.c:5246 c-common.c:5285
+#, gcc-internal-format
+msgid "%qE attribute ignored"
msgstr ""
-#: varasm.c:4587
-msgid "%Jonly weak aliases are supported in this configuration"
+#: c-common.c:4309
+#, gcc-internal-format
+msgid "unknown machine mode %qs"
msgstr ""
-#: varasm.c:4645
-msgid "visibility attribute not supported in this configuration; ignored"
+#: c-common.c:4329
+#, gcc-internal-format
+msgid "specifying vector types with __attribute__ ((mode)) is deprecated"
msgstr ""
-#: varray.c:203
-#, c-format
-msgid "virtual array %s[%lu]: element %lu out of bounds in %s, at %s:%d"
+#: c-common.c:4332
+#, gcc-internal-format
+msgid "use __attribute__ ((vector_size)) instead"
msgstr ""
-#: varray.c:213
-#, c-format
-msgid "underflowed virtual array %s in %s, at %s:%d"
+#: c-common.c:4341
+#, gcc-internal-format
+msgid "unable to emulate %qs"
msgstr ""
-#: vec.c:144
-#, c-format
-msgid "vector %s %s domain error, in %s at %s:%u"
+#: c-common.c:4351
+#, gcc-internal-format
+msgid "invalid pointer mode %qs"
msgstr ""
-#. Print an error message for unrecognized stab codes.
-#: xcoffout.c:187
-#, c-format
-msgid "no sclass for %s stab (0x%x)\n"
+#: c-common.c:4366
+#, gcc-internal-format
+msgid "no data type for mode %qs"
msgstr ""
-#.
-#. Local variables:
-#. mode:c
-#. End:
-#.
-#: diagnostic.def:1
-msgid "fatal error: "
+#: c-common.c:4376
+#, gcc-internal-format
+msgid "cannot use mode %qs for enumeral types"
msgstr ""
-#: diagnostic.def:2
-msgid "internal compiler error: "
+#: c-common.c:4400
+#, gcc-internal-format
+msgid "mode %qs applied to inappropriate type"
msgstr ""
-#: diagnostic.def:3
-msgid "error: "
+#: c-common.c:4431
+#, gcc-internal-format
+msgid "%Jsection attribute cannot be specified for local variables"
msgstr ""
-#: diagnostic.def:4
-msgid "sorry, unimplemented: "
+#: c-common.c:4442
+#, gcc-internal-format
+msgid "%Jsection of %qD conflicts with previous declaration"
msgstr ""
-#: diagnostic.def:5
-msgid "warning: "
+#: c-common.c:4451
+#, gcc-internal-format
+msgid "%Jsection attribute not allowed for %qD"
msgstr ""
-#: diagnostic.def:6
-msgid "anachronism: "
+#: c-common.c:4457
+#, gcc-internal-format
+msgid "%Jsection attributes are not supported for this target"
msgstr ""
-#: diagnostic.def:7
-msgid "note: "
+#: c-common.c:4489
+#, gcc-internal-format
+msgid "requested alignment is not a constant"
msgstr ""
-#: diagnostic.def:8
-msgid "debug: "
+#: c-common.c:4494
+#, gcc-internal-format
+msgid "requested alignment is not a power of 2"
msgstr ""
-#: params.def:44
-msgid "The maximum structure size (in bytes) at which GCC will do block copies"
+#: c-common.c:4499
+#, gcc-internal-format
+msgid "requested alignment is too large"
msgstr ""
-#: params.def:54
+#: c-common.c:4525
+#, gcc-internal-format
+msgid "%Jalignment may not be specified for %qD"
+msgstr ""
+
+#: c-common.c:4563
+#, gcc-internal-format
+msgid "%J%qD defined both normally and as an alias"
+msgstr ""
+
+#: c-common.c:4579
+#, gcc-internal-format
+msgid "alias argument not a string"
+msgstr ""
+
+#: c-common.c:4621
+#, gcc-internal-format
+msgid "%qE attribute ignored on non-class types"
+msgstr ""
+
+#: c-common.c:4634
+#, gcc-internal-format
+msgid "visibility argument not a string"
+msgstr ""
+
+#: c-common.c:4646
+#, gcc-internal-format
+msgid "%qE attribute ignored on types"
+msgstr ""
+
+#: c-common.c:4661
+#, gcc-internal-format
msgid ""
-"The threshold ratio between instantiated fields and the total structure size"
+"visibility argument must be one of \"default\", \"hidden\", \"protected\" or "
+"\"internal\""
msgstr ""
-#: params.def:71
+#: c-common.c:4730
+#, gcc-internal-format
+msgid "tls_model argument not a string"
+msgstr ""
+
+#: c-common.c:4739
+#, gcc-internal-format
msgid ""
-"The maximum number of instructions in a single function eligible for inlining"
+"tls_model argument must be one of \"local-exec\", \"initial-exec\", \"local-"
+"dynamic\" or \"global-dynamic\""
msgstr ""
-#: params.def:83
-msgid "The maximum number of instructions when automatically inlining"
+#: c-common.c:4761 c-common.c:4825
+#, gcc-internal-format
+msgid "%J%qE attribute applies only to functions"
+msgstr ""
+
+#: c-common.c:4766 c-common.c:4830
+#, gcc-internal-format
+msgid "%Jcan%'t set %qE attribute after definition"
+msgstr ""
+
+#: c-common.c:4919
+#, gcc-internal-format
+msgid "%qE attribute ignored for %qE"
msgstr ""
-#: params.def:88
+#: c-common.c:4974
+#, gcc-internal-format
+msgid "invalid vector type for attribute %qE"
+msgstr ""
+
+#: c-common.c:4982
+#, gcc-internal-format
+msgid "number of components of the vector not a power of two"
+msgstr ""
+
+#: c-common.c:5010
+#, gcc-internal-format
+msgid "nonnull attribute without arguments on a non-prototype"
+msgstr ""
+
+#: c-common.c:5025
+#, gcc-internal-format
+msgid "nonnull argument has invalid operand number (argument %lu)"
+msgstr ""
+
+#: c-common.c:5044
+#, gcc-internal-format
msgid ""
-"The maximum number of instructions inline function can grow to via recursive "
-"inlining"
+"nonnull argument with out-of-range operand number (argument %lu, operand %lu)"
msgstr ""
-#: params.def:93
+#: c-common.c:5052
+#, gcc-internal-format
msgid ""
-"The maximum number of instructions non-inline function can grow to via "
-"recursive inlining"
+"nonnull argument references non-pointer operand (argument %lu, operand %lu)"
msgstr ""
-#: params.def:98
-msgid "The maximum depth of recursive inlining for inline functions"
+#: c-common.c:5107 c-common.c:5150
+#, gcc-internal-format
+msgid "missing sentinel in function call"
msgstr ""
-#: params.def:103
-msgid "The maximum depth of recursive inlining for non-inline functions"
+#: c-common.c:5129
+#, gcc-internal-format
+msgid "not enough arguments to fit a sentinel"
msgstr ""
-#: params.def:110
-msgid ""
-"If -fvariable-expansion-in-unroller is used, the maximum number "
-"of times that an individual variable will be expanded "
-"during loop unrolling"
+#: c-common.c:5192
+#, gcc-internal-format
+msgid "null argument where non-null required (argument %lu)"
msgstr ""
-#: params.def:123
-msgid "The maximum number of instructions to consider to fill a delay slot"
+#: c-common.c:5257
+#, gcc-internal-format
+msgid "cleanup argument not an identifier"
msgstr ""
-#: params.def:134
-msgid ""
-"The maximum number of instructions to consider to find accurate live "
-"register information"
+#: c-common.c:5264
+#, gcc-internal-format
+msgid "cleanup argument not a function"
msgstr ""
-#: params.def:144
-msgid "The maximum length of scheduling's pending operations list"
+#: c-common.c:5303
+#, gcc-internal-format
+msgid "%qE attribute requires prototypes with named arguments"
msgstr ""
-#: params.def:149
-msgid "The size of function body to be considered large"
+#: c-common.c:5314
+#, gcc-internal-format
+msgid "%qE attribute only applies to variadic functions"
msgstr ""
-#: params.def:153
-msgid "Maximal growth due to inlining of large function (in percent)"
+#: c-common.c:5325
+#, gcc-internal-format
+msgid "requested position is not an integer constant"
msgstr ""
-#: params.def:157
+#: c-common.c:5332
+#, gcc-internal-format
+msgid "requested position is less than zero"
+msgstr ""
+
+#: c-common.c:5634
+#, gcc-internal-format
msgid ""
-"how much can given compilation unit grow because of the inlining (in percent)"
+"%Hignoring return value of %qD, declared with attribute warn_unused_result"
msgstr ""
-#: params.def:161
-msgid "expense of call operation relative to ordinary arithmetic operations"
+#: c-common.c:5638
+#, gcc-internal-format
+msgid ""
+"%Hignoring return value of function declared with attribute "
+"warn_unused_result"
msgstr ""
-#: params.def:168
-msgid "The maximum amount of memory to be allocated by GCSE"
+#: c-common.c:5698 cp/typeck.c:4122
+#, gcc-internal-format
+msgid "attempt to take address of bit-field structure member %qD"
msgstr ""
-#: params.def:173
-msgid "The maximum number of passes to make when doing GCSE"
+#: c-common.c:5745
+#, gcc-internal-format
+msgid "invalid lvalue in assignment"
msgstr ""
-#: params.def:183
+#: c-common.c:5748
+#, gcc-internal-format
+msgid "invalid lvalue in increment"
+msgstr ""
+
+#: c-common.c:5751
+#, gcc-internal-format
+msgid "invalid lvalue in decrement"
+msgstr ""
+
+#: c-common.c:5754
+#, gcc-internal-format
+msgid "invalid lvalue in unary %<&%>"
+msgstr ""
+
+#: c-common.c:5757
+#, gcc-internal-format
+msgid "invalid lvalue in asm statement"
+msgstr ""
+
+#: c-common.c:5879 c-common.c:5928 c-typeck.c:2309
+#, gcc-internal-format
+msgid "too few arguments to function %qE"
+msgstr ""
+
+#. ??? This should not be an error when inlining calls to
+#. unprototyped functions.
+#: c-common.c:5896 c-typeck.c:3925
+#, gcc-internal-format
+msgid "incompatible type for argument %d of %qE"
+msgstr ""
+
+#. Except for passing an argument to an unprototyped function,
+#. this is a constraint violation. When passing an argument to
+#. an unprototyped function, it is compile-time undefined;
+#. making it a constraint in that case was rejected in
+#. DR#252.
+#: c-convert.c:84 c-typeck.c:1452 c-typeck.c:3611 cp/typeck.c:1355
+#: cp/typeck.c:5837 fortran/convert.c:89 treelang/tree-convert.c:79
+#, gcc-internal-format
+msgid "void value not ignored as it ought to be"
+msgstr ""
+
+#: c-convert.c:122 fortran/convert.c:122 java/typeck.c:153
+#: treelang/tree-convert.c:105
+#, gcc-internal-format
+msgid "conversion to non-scalar type requested"
+msgstr ""
+
+#: c-decl.c:563
+#, gcc-internal-format
+msgid "%Jarray %qD assumed to have one element"
+msgstr ""
+
+#: c-decl.c:668
+#, gcc-internal-format
+msgid "GCC supports only %u nested scopes"
+msgstr ""
+
+#: c-decl.c:754
+#, gcc-internal-format
+msgid "%Jlabel %qD used but not defined"
+msgstr ""
+
+#: c-decl.c:760
+#, gcc-internal-format
+msgid "%Jlabel %qD defined but not used"
+msgstr ""
+
+#: c-decl.c:762
+#, gcc-internal-format
+msgid "%Jlabel %qD declared but not defined"
+msgstr ""
+
+#: c-decl.c:797
+#, gcc-internal-format
+msgid "%Jnested function %qD declared but never defined"
+msgstr ""
+
+#: c-decl.c:811 cp/decl.c:566
+#, gcc-internal-format
+msgid "%Junused variable %qD"
+msgstr ""
+
+#: c-decl.c:815
+#, gcc-internal-format
+msgid "%Jtype of array %qD completed incompatibly with implicit initialization"
+msgstr ""
+
+#: c-decl.c:1049
+#, gcc-internal-format
msgid ""
-"The threshold ratio for performing partial redundancy elimination after "
-"reload."
+"a parameter list with an ellipsis can%'t match an empty parameter name list "
+"declaration"
msgstr ""
-#: params.def:190
+#: c-decl.c:1056
+#, gcc-internal-format
msgid ""
-"The threshold ratio of critical edges execution count that permit performing "
-"redundancy elimination after reload."
+"an argument type that has a default promotion can%'t match an empty "
+"parameter name list declaration"
msgstr ""
-#: params.def:201
-msgid "The maximum number of instructions to consider to unroll in a loop"
+#: c-decl.c:1091
+#, gcc-internal-format
+msgid ""
+"%Jprototype for %qD declares more arguments than previous old-style "
+"definition"
msgstr ""
-#: params.def:207
+#: c-decl.c:1097
+#, gcc-internal-format
msgid ""
-"The maximum number of instructions to consider to unroll in a loop on average"
+"%Jprototype for %qD declares fewer arguments than previous old-style "
+"definition"
msgstr ""
-#: params.def:212
-msgid "The maximum number of unrollings of a single loop"
+#: c-decl.c:1106
+#, gcc-internal-format
+msgid "%Jprototype for %qD declares argument %d with incompatible type"
msgstr ""
-#: params.def:217
-msgid "The maximum number of insns of a peeled loop"
+#. If we get here, no errors were found, but do issue a warning
+#. for this poor-style construct.
+#: c-decl.c:1119
+#, gcc-internal-format
+msgid "%Jprototype for %qD follows non-prototype definition"
msgstr ""
-#: params.def:222
-msgid "The maximum number of peelings of a single loop"
+#: c-decl.c:1134
+#, gcc-internal-format
+msgid "%Jprevious definition of %qD was here"
msgstr ""
-#: params.def:227
-msgid "The maximum number of insns of a completely peeled loop"
+#: c-decl.c:1136
+#, gcc-internal-format
+msgid "%Jprevious implicit declaration of %qD was here"
msgstr ""
-#: params.def:232
-msgid ""
-"The maximum number of peelings of a single loop that is peeled completely"
+#: c-decl.c:1138
+#, gcc-internal-format
+msgid "%Jprevious declaration of %qD was here"
msgstr ""
-#: params.def:237
-msgid "The maximum number of insns of a peeled loop that rolls only once"
+#: c-decl.c:1175
+#, gcc-internal-format
+msgid "%J%qD redeclared as different kind of symbol"
msgstr ""
-#: params.def:243
-msgid "The maximum number of insns of an unswitched loop"
+#: c-decl.c:1180
+#, gcc-internal-format
+msgid "%Jbuilt-in function %qD declared as non-function"
msgstr ""
-#: params.def:248
-msgid "The maximum number of unswitchings in a single loop"
+#: c-decl.c:1183 c-decl.c:1298 c-decl.c:1918
+#, gcc-internal-format
+msgid "%Jdeclaration of %qD shadows a built-in function"
msgstr ""
-#: params.def:255
-msgid ""
-"Bound on the number of iterations the brute force # of iterations analysis "
-"algorithm evaluates"
+#: c-decl.c:1192
+#, gcc-internal-format
+msgid "%Jredeclaration of enumerator %qD"
msgstr ""
-#: params.def:260
-msgid ""
-"Maximum number of loops to perform swing modulo scheduling on (mainly for "
-"debugging)"
+#. If types don't match for a built-in, throw away the
+#. built-in. No point in calling locate_old_decl here, it
+#. won't print anything.
+#: c-decl.c:1213
+#, gcc-internal-format
+msgid "%Jconflicting types for built-in function %qD"
+msgstr ""
+
+#: c-decl.c:1237 c-decl.c:1250 c-decl.c:1260
+#, gcc-internal-format
+msgid "%Jconflicting types for %qD"
msgstr ""
-#: params.def:266
+#: c-decl.c:1258
+#, gcc-internal-format
+msgid "%J conflicting type qualifiers for %qD"
+msgstr ""
+
+#. Allow OLDDECL to continue in use.
+#: c-decl.c:1275
+#, gcc-internal-format
+msgid "%Jredefinition of typedef %qD"
+msgstr ""
+
+#: c-decl.c:1316 c-decl.c:1326 c-decl.c:1339 c-decl.c:1421
+#, gcc-internal-format
+msgid "%Jredefinition of %qD"
+msgstr ""
+
+#: c-decl.c:1378 c-decl.c:1459
+#, gcc-internal-format
+msgid "%Jstatic declaration of %qD follows non-static declaration"
+msgstr ""
+
+#: c-decl.c:1388 c-decl.c:1395 c-decl.c:1448 c-decl.c:1456
+#, gcc-internal-format
+msgid "%Jnon-static declaration of %qD follows static declaration"
+msgstr ""
+
+#: c-decl.c:1408
+#, gcc-internal-format
+msgid "%Jthread-local declaration of %qD follows non-thread-local declaration"
+msgstr ""
+
+#: c-decl.c:1411
+#, gcc-internal-format
+msgid "%Jnon-thread-local declaration of %qD follows thread-local declaration"
+msgstr ""
+
+#: c-decl.c:1441
+#, gcc-internal-format
+msgid "%Jextern declaration of %qD follows declaration with no linkage"
+msgstr ""
+
+#: c-decl.c:1477
+#, gcc-internal-format
+msgid "%Jdeclaration of %qD with no linkage follows extern declaration"
+msgstr ""
+
+#: c-decl.c:1483
+#, gcc-internal-format
+msgid "%Jredeclaration of %qD with no linkage"
+msgstr ""
+
+#: c-decl.c:1497
+#, gcc-internal-format
msgid ""
-"A factor for tuning the upper bound that swing modulo scheduler uses for "
-"scheduling a loop"
+"%Jredeclaration of %qD with different visibility (old visibility preserved)"
+msgstr ""
+
+#: c-decl.c:1508
+#, gcc-internal-format
+msgid "%Jinline declaration of %qD follows declaration with attribute noinline"
msgstr ""
-#: params.def:270
+#: c-decl.c:1515
+#, gcc-internal-format
msgid ""
-"The number of cycles the swing modulo scheduler considers when \t checking "
-"conflicts using DFA"
+"%Jdeclaration of %qD with attribute noinline follows inline declaration "
+msgstr ""
+
+#: c-decl.c:1530
+#, gcc-internal-format
+msgid "%J%qD declared inline after being called"
+msgstr ""
+
+#: c-decl.c:1536
+#, gcc-internal-format
+msgid "%J%qD declared inline after its definition"
+msgstr ""
+
+#: c-decl.c:1556
+#, gcc-internal-format
+msgid "%Jredefinition of parameter %qD"
+msgstr ""
+
+#: c-decl.c:1580
+#, gcc-internal-format
+msgid "%Jredundant redeclaration of %qD"
+msgstr ""
+
+#: c-decl.c:1905
+#, gcc-internal-format
+msgid "%Jdeclaration of %qD shadows previous non-variable"
+msgstr ""
+
+#: c-decl.c:1910
+#, gcc-internal-format
+msgid "%Jdeclaration of %qD shadows a parameter"
+msgstr ""
+
+#: c-decl.c:1913
+#, gcc-internal-format
+msgid "%Jdeclaration of %qD shadows a global declaration"
+msgstr ""
+
+#: c-decl.c:1923
+#, gcc-internal-format
+msgid "%Jdeclaration of %qD shadows a previous local"
+msgstr ""
+
+#: c-decl.c:1926 cp/name-lookup.c:942 cp/name-lookup.c:973
+#: cp/name-lookup.c:981
+#, gcc-internal-format
+msgid "%Jshadowed declaration is here"
+msgstr ""
+
+#: c-decl.c:2127
+#, gcc-internal-format
+msgid "nested extern declaration of %qD"
+msgstr ""
+
+#: c-decl.c:2295
+#, gcc-internal-format
+msgid "implicit declaration of function %qE"
+msgstr ""
+
+#: c-decl.c:2356
+#, gcc-internal-format
+msgid "incompatible implicit declaration of built-in function %qD"
+msgstr ""
+
+#: c-decl.c:2365
+#, gcc-internal-format
+msgid "incompatible implicit declaration of function %qD"
+msgstr ""
+
+#: c-decl.c:2418
+#, gcc-internal-format
+msgid "%H%qE undeclared here (not in a function)"
+msgstr ""
+
+#: c-decl.c:2423
+#, gcc-internal-format
+msgid "%H%qE undeclared (first use in this function)"
+msgstr ""
+
+#: c-decl.c:2427
+#, gcc-internal-format
+msgid "%H(Each undeclared identifier is reported only once"
+msgstr ""
+
+#: c-decl.c:2428
+#, gcc-internal-format
+msgid "%Hfor each function it appears in.)"
+msgstr ""
+
+#: c-decl.c:2466 cp/decl.c:2054
+#, gcc-internal-format
+msgid "label %qE referenced outside of any function"
+msgstr ""
+
+#: c-decl.c:2508
+#, gcc-internal-format
+msgid "duplicate label declaration %qE"
+msgstr ""
+
+#: c-decl.c:2544
+#, gcc-internal-format
+msgid "%Hduplicate label %qD"
+msgstr ""
+
+#: c-decl.c:2554
+#, gcc-internal-format
+msgid "%Jjump into statement expression"
+msgstr ""
+
+#: c-decl.c:2556
+#, gcc-internal-format
+msgid "%Jjump into scope of identifier with variably modified type"
msgstr ""
-#: params.def:275
+#: c-decl.c:2571
+#, gcc-internal-format
msgid ""
-"A threshold on the average loop count considered by the swing modulo "
-"scheduler"
+"%Htraditional C lacks a separate namespace for labels, identifier %qE "
+"conflicts"
+msgstr ""
+
+#: c-decl.c:2646
+#, gcc-internal-format
+msgid "%H%qE defined as wrong kind of tag"
msgstr ""
-#: params.def:280
+#: c-decl.c:2861
+#, gcc-internal-format
+msgid "unnamed struct/union that defines no instances"
+msgstr ""
+
+#: c-decl.c:2869
+#, gcc-internal-format
+msgid "empty declaration with storage class specifier does not redeclare tag"
+msgstr ""
+
+#: c-decl.c:2880
+#, gcc-internal-format
+msgid "empty declaration with type qualifier does not redeclare tag"
+msgstr ""
+
+#: c-decl.c:2901 c-decl.c:2908
+#, gcc-internal-format
+msgid "useless type name in empty declaration"
+msgstr ""
+
+#: c-decl.c:2916
+#, gcc-internal-format
+msgid "%<inline%> in empty declaration"
+msgstr ""
+
+#: c-decl.c:2922
+#, gcc-internal-format
+msgid "%<auto%> in file-scope empty declaration"
+msgstr ""
+
+#: c-decl.c:2928
+#, gcc-internal-format
+msgid "%<register%> in file-scope empty declaration"
+msgstr ""
+
+#: c-decl.c:2934
+#, gcc-internal-format
+msgid "useless storage class specifier in empty declaration"
+msgstr ""
+
+#: c-decl.c:2940
+#, gcc-internal-format
+msgid "useless %<__thread%> in empty declaration"
+msgstr ""
+
+#: c-decl.c:2948
+#, gcc-internal-format
+msgid "useless type qualifier in empty declaration"
+msgstr ""
+
+#: c-decl.c:2955 c-parser.c:1156
+#, gcc-internal-format
+msgid "empty declaration"
+msgstr ""
+
+#: c-decl.c:3021
+#, gcc-internal-format
msgid ""
-"Select fraction of the maximal count of repetitions of basic block in "
-"program given basic block needs to have to be considered hot"
+"ISO C90 does not support %<static%> or type qualifiers in parameter array "
+"declarators"
+msgstr ""
+
+#: c-decl.c:3024
+#, gcc-internal-format
+msgid "ISO C90 does not support %<[*]%> array declarators"
+msgstr ""
+
+#: c-decl.c:3027
+#, gcc-internal-format
+msgid "GCC does not yet properly implement %<[*]%> array declarators"
+msgstr ""
+
+#: c-decl.c:3046
+#, gcc-internal-format
+msgid "static or type qualifiers in abstract declarator"
+msgstr ""
+
+#: c-decl.c:3105
+#, gcc-internal-format
+msgid "%J%qD is usually a function"
+msgstr ""
+
+#: c-decl.c:3114 cp/decl.c:3631 cp/decl2.c:838
+#, gcc-internal-format
+msgid "typedef %qD is initialized (use __typeof__ instead)"
+msgstr ""
+
+#: c-decl.c:3119
+#, gcc-internal-format
+msgid "function %qD is initialized like a variable"
+msgstr ""
+
+#. DECL_INITIAL in a PARM_DECL is really DECL_ARG_TYPE.
+#: c-decl.c:3125
+#, gcc-internal-format
+msgid "parameter %qD is initialized"
+msgstr ""
+
+#: c-decl.c:3150
+#, gcc-internal-format
+msgid "variable %qD has initializer but incomplete type"
+msgstr ""
+
+#: c-decl.c:3226 c-decl.c:5816 cp/decl.c:3670 cp/decl.c:9916
+#, gcc-internal-format
+msgid "%Jinline function %qD given attribute noinline"
+msgstr ""
+
+#: c-decl.c:3298
+#, gcc-internal-format
+msgid "%Jinitializer fails to determine size of %qD"
+msgstr ""
+
+#: c-decl.c:3303
+#, gcc-internal-format
+msgid "%Jarray size missing in %qD"
msgstr ""
-#: params.def:284
+#: c-decl.c:3315
+#, gcc-internal-format
+msgid "%Jzero or negative size array %qD"
+msgstr ""
+
+#: c-decl.c:3367 varasm.c:1646
+#, gcc-internal-format
+msgid "%Jstorage size of %qD isn%'t known"
+msgstr ""
+
+#: c-decl.c:3377
+#, gcc-internal-format
+msgid "%Jstorage size of %qD isn%'t constant"
+msgstr ""
+
+#: c-decl.c:3424
+#, gcc-internal-format
+msgid "%Jignoring asm-specifier for non-static local variable %qD"
+msgstr ""
+
+#: c-decl.c:3454 fortran/f95-lang.c:644
+#, gcc-internal-format
+msgid "cannot put object with volatile field into register"
+msgstr ""
+
+#: c-decl.c:3588
+#, gcc-internal-format
+msgid "ISO C forbids forward parameter declarations"
+msgstr ""
+
+#: c-decl.c:3715
+#, gcc-internal-format
+msgid "bit-field %qs width not an integer constant"
+msgstr ""
+
+#: c-decl.c:3723
+#, gcc-internal-format
+msgid "negative width in bit-field %qs"
+msgstr ""
+
+#: c-decl.c:3728
+#, gcc-internal-format
+msgid "zero width for bit-field %qs"
+msgstr ""
+
+#: c-decl.c:3738
+#, gcc-internal-format
+msgid "bit-field %qs has invalid type"
+msgstr ""
+
+#: c-decl.c:3747
+#, gcc-internal-format
+msgid "type of bit-field %qs is a GCC extension"
+msgstr ""
+
+#: c-decl.c:3756
+#, gcc-internal-format
+msgid "width of %qs exceeds its type"
+msgstr ""
+
+#: c-decl.c:3769
+#, gcc-internal-format
+msgid "%qs is narrower than values of its type"
+msgstr ""
+
+#: c-decl.c:3894
+#, gcc-internal-format
+msgid "type defaults to %<int%> in declaration of %qs"
+msgstr ""
+
+#: c-decl.c:3922
+#, gcc-internal-format
+msgid "duplicate %<const%>"
+msgstr ""
+
+#: c-decl.c:3924
+#, gcc-internal-format
+msgid "duplicate %<restrict%>"
+msgstr ""
+
+#: c-decl.c:3926
+#, gcc-internal-format
+msgid "duplicate %<volatile%>"
+msgstr ""
+
+#: c-decl.c:3945
+#, gcc-internal-format
+msgid "function definition declared %<auto%>"
+msgstr ""
+
+#: c-decl.c:3947
+#, gcc-internal-format
+msgid "function definition declared %<register%>"
+msgstr ""
+
+#: c-decl.c:3949
+#, gcc-internal-format
+msgid "function definition declared %<typedef%>"
+msgstr ""
+
+#: c-decl.c:3951
+#, gcc-internal-format
+msgid "function definition declared %<__thread%>"
+msgstr ""
+
+#: c-decl.c:3967
+#, gcc-internal-format
+msgid "storage class specified for structure field %qs"
+msgstr ""
+
+#: c-decl.c:3971 cp/decl.c:6997
+#, gcc-internal-format
+msgid "storage class specified for parameter %qs"
+msgstr ""
+
+#: c-decl.c:3974 cp/decl.c:6999
+#, gcc-internal-format
+msgid "storage class specified for typename"
+msgstr ""
+
+#: c-decl.c:3987 cp/decl.c:7016
+#, gcc-internal-format
+msgid "%qs initialized and declared %<extern%>"
+msgstr ""
+
+#: c-decl.c:3989 cp/decl.c:7019
+#, gcc-internal-format
+msgid "%qs has both %<extern%> and initializer"
+msgstr ""
+
+#: c-decl.c:3994
+#, gcc-internal-format
+msgid "file-scope declaration of %qs specifies %<auto%>"
+msgstr ""
+
+#: c-decl.c:3996
+#, gcc-internal-format
+msgid "file-scope declaration of %qs specifies %<register%>"
+msgstr ""
+
+#: c-decl.c:4001 cp/decl.c:7023
+#, gcc-internal-format
+msgid "nested function %qs declared %<extern%>"
+msgstr ""
+
+#: c-decl.c:4004 cp/decl.c:7033
+#, gcc-internal-format
+msgid "function-scope %qs implicitly auto and declared %<__thread%>"
+msgstr ""
+
+#. Only the innermost declarator (making a parameter be of
+#. array type which is converted to pointer type)
+#. may have static or type qualifiers.
+#: c-decl.c:4051 c-decl.c:4241
+#, gcc-internal-format
+msgid "static or type qualifiers in non-parameter array declarator"
+msgstr ""
+
+#: c-decl.c:4097
+#, gcc-internal-format
+msgid "declaration of %qs as array of voids"
+msgstr ""
+
+#: c-decl.c:4103
+#, gcc-internal-format
+msgid "declaration of %qs as array of functions"
+msgstr ""
+
+#: c-decl.c:4108
+#, gcc-internal-format
+msgid "invalid use of structure with flexible array member"
+msgstr ""
+
+#: c-decl.c:4128
+#, gcc-internal-format
+msgid "size of array %qs has non-integer type"
+msgstr ""
+
+#: c-decl.c:4133
+#, gcc-internal-format
+msgid "ISO C forbids zero-size array %qs"
+msgstr ""
+
+#: c-decl.c:4140
+#, gcc-internal-format
+msgid "size of array %qs is negative"
+msgstr ""
+
+#: c-decl.c:4154
+#, gcc-internal-format
+msgid "ISO C90 forbids array %qs whose size can%'t be evaluated"
+msgstr ""
+
+#: c-decl.c:4158
+#, gcc-internal-format
+msgid "ISO C90 forbids variable-size array %qs"
+msgstr ""
+
+#: c-decl.c:4197 c-decl.c:4362 cp/decl.c:7454
+#, gcc-internal-format
+msgid "size of array %qs is too large"
+msgstr ""
+
+#: c-decl.c:4208
+#, gcc-internal-format
+msgid "ISO C90 does not support flexible array members"
+msgstr ""
+
+#: c-decl.c:4218
+#, gcc-internal-format
+msgid "array type has incomplete element type"
+msgstr ""
+
+#: c-decl.c:4273 cp/decl.c:7124
+#, gcc-internal-format
+msgid "%qs declared as function returning a function"
+msgstr ""
+
+#: c-decl.c:4278 cp/decl.c:7129
+#, gcc-internal-format
+msgid "%qs declared as function returning an array"
+msgstr ""
+
+#: c-decl.c:4298
+#, gcc-internal-format
+msgid "function definition has qualified void return type"
+msgstr ""
+
+#: c-decl.c:4301
+#, gcc-internal-format
+msgid "type qualifiers ignored on function return type"
+msgstr ""
+
+#: c-decl.c:4330 c-decl.c:4375 c-decl.c:4470 c-decl.c:4561
+#, gcc-internal-format
+msgid "ISO C forbids qualified function types"
+msgstr ""
+
+#: c-decl.c:4383
+#, gcc-internal-format
+msgid "%Jtypedef %qD declared %<inline%>"
+msgstr ""
+
+#: c-decl.c:4413
+#, gcc-internal-format
+msgid "ISO C forbids const or volatile function types"
+msgstr ""
+
+#: c-decl.c:4433
+#, gcc-internal-format
+msgid "variable or field %qs declared void"
+msgstr ""
+
+#: c-decl.c:4463
+#, gcc-internal-format
+msgid "attributes in parameter array declarator ignored"
+msgstr ""
+
+#: c-decl.c:4498
+#, gcc-internal-format
+msgid "%Jparameter %qD declared %<inline%>"
+msgstr ""
+
+#: c-decl.c:4511
+#, gcc-internal-format
+msgid "field %qs declared as a function"
+msgstr ""
+
+#: c-decl.c:4517
+#, gcc-internal-format
+msgid "field %qs has incomplete type"
+msgstr ""
+
+#: c-decl.c:4531 c-decl.c:4543 c-decl.c:4547
+#, gcc-internal-format
+msgid "invalid storage class for function %qs"
+msgstr ""
+
+#: c-decl.c:4567
+#, gcc-internal-format
+msgid "%<noreturn%> function returns non-void value"
+msgstr ""
+
+#: c-decl.c:4595
+#, gcc-internal-format
+msgid "cannot inline function %<main%>"
+msgstr ""
+
+#: c-decl.c:4642
+#, gcc-internal-format
+msgid "variable previously declared %<static%> redeclared %<extern%>"
+msgstr ""
+
+#: c-decl.c:4652
+#, gcc-internal-format
+msgid "%Jvariable %qD declared %<inline%>"
+msgstr ""
+
+#. A mere warning is sure to result in improper semantics
+#. at runtime. Don't bother to allow this to compile.
+#: c-decl.c:4683 cp/decl.c:5887
+#, gcc-internal-format
+msgid "thread-local storage not supported for this target"
+msgstr ""
+
+#: c-decl.c:4745 c-decl.c:5894
+#, gcc-internal-format
+msgid "function declaration isn%'t a prototype"
+msgstr ""
+
+#: c-decl.c:4753
+#, gcc-internal-format
+msgid "parameter names (without types) in function declaration"
+msgstr ""
+
+#: c-decl.c:4786
+#, gcc-internal-format
+msgid "%Jparameter %u (%qD) has incomplete type"
+msgstr ""
+
+#: c-decl.c:4789
+#, gcc-internal-format
+msgid "%Jparameter %u has incomplete type"
+msgstr ""
+
+#: c-decl.c:4798
+#, gcc-internal-format
+msgid "%Jparameter %u (%qD) has void type"
+msgstr ""
+
+#: c-decl.c:4801
+#, gcc-internal-format
+msgid "%Jparameter %u has void type"
+msgstr ""
+
+#: c-decl.c:4858
+#, gcc-internal-format
+msgid "%<void%> as only parameter may not be qualified"
+msgstr ""
+
+#: c-decl.c:4862 c-decl.c:4897
+#, gcc-internal-format
+msgid "%<void%> must be the only parameter"
+msgstr ""
+
+#: c-decl.c:4890
+#, gcc-internal-format
+msgid "%Jparameter %qD has just a forward declaration"
+msgstr ""
+
+#. The %s will be one of 'struct', 'union', or 'enum'.
+#: c-decl.c:4936
+#, gcc-internal-format
+msgid "%<%s %E%> declared inside parameter list"
+msgstr ""
+
+#. The %s will be one of 'struct', 'union', or 'enum'.
+#: c-decl.c:4940
+#, gcc-internal-format
+msgid "anonymous %s declared inside parameter list"
+msgstr ""
+
+#: c-decl.c:4945
+#, gcc-internal-format
msgid ""
-"Select fraction of the maximal frequency of executions of basic block in "
-"function given basic block needs to have to be considered hot"
+"its scope is only this definition or declaration, which is probably not what "
+"you want"
msgstr ""
-#: params.def:288
+#: c-decl.c:5078
+#, gcc-internal-format
+msgid "redefinition of %<union %E%>"
+msgstr ""
+
+#: c-decl.c:5080
+#, gcc-internal-format
+msgid "redefinition of %<struct %E%>"
+msgstr ""
+
+#: c-decl.c:5085
+#, gcc-internal-format
+msgid "nested redefinition of %<union %E%>"
+msgstr ""
+
+#: c-decl.c:5087
+#, gcc-internal-format
+msgid "nested redefinition of %<struct %E%>"
+msgstr ""
+
+#: c-decl.c:5158 cp/decl.c:3428
+#, gcc-internal-format
+msgid "declaration does not declare anything"
+msgstr ""
+
+#: c-decl.c:5162
+#, gcc-internal-format
+msgid "ISO C doesn%'t support unnamed structs/unions"
+msgstr ""
+
+#: c-decl.c:5205 c-decl.c:5221
+#, gcc-internal-format
+msgid "%Jduplicate member %qD"
+msgstr ""
+
+#: c-decl.c:5260
+#, gcc-internal-format
+msgid "union has no named members"
+msgstr ""
+
+#: c-decl.c:5262
+#, gcc-internal-format
+msgid "union has no members"
+msgstr ""
+
+#: c-decl.c:5267
+#, gcc-internal-format
+msgid "struct has no named members"
+msgstr ""
+
+#: c-decl.c:5269
+#, gcc-internal-format
+msgid "struct has no members"
+msgstr ""
+
+#: c-decl.c:5326
+#, gcc-internal-format
+msgid "%Jflexible array member in union"
+msgstr ""
+
+#: c-decl.c:5331
+#, gcc-internal-format
+msgid "%Jflexible array member not at end of struct"
+msgstr ""
+
+#: c-decl.c:5336
+#, gcc-internal-format
+msgid "%Jflexible array member in otherwise empty struct"
+msgstr ""
+
+#: c-decl.c:5343
+#, gcc-internal-format
+msgid "%Jinvalid use of structure with flexible array member"
+msgstr ""
+
+#: c-decl.c:5451
+#, gcc-internal-format
+msgid "union cannot be made transparent"
+msgstr ""
+
+#: c-decl.c:5522
+#, gcc-internal-format
+msgid "nested redefinition of %<enum %E%>"
+msgstr ""
+
+#. This enum is a named one that has been declared already.
+#: c-decl.c:5529
+#, gcc-internal-format
+msgid "redeclaration of %<enum %E%>"
+msgstr ""
+
+#: c-decl.c:5592
+#, gcc-internal-format
+msgid "enumeration values exceed range of largest integer"
+msgstr ""
+
+#: c-decl.c:5609
+#, gcc-internal-format
+msgid "specified mode too small for enumeral values"
+msgstr ""
+
+#: c-decl.c:5705
+#, gcc-internal-format
+msgid "enumerator value for %qE is not an integer constant"
+msgstr ""
+
+#: c-decl.c:5722
+#, gcc-internal-format
+msgid "overflow in enumeration values"
+msgstr ""
+
+#: c-decl.c:5727
+#, gcc-internal-format
+msgid "ISO C restricts enumerator values to range of %<int%>"
+msgstr ""
+
+#: c-decl.c:5823
+#, gcc-internal-format
+msgid "return type is an incomplete type"
+msgstr ""
+
+#: c-decl.c:5831
+#, gcc-internal-format
+msgid "return type defaults to %<int%>"
+msgstr ""
+
+#: c-decl.c:5901
+#, gcc-internal-format
+msgid "%Jno previous prototype for %qD"
+msgstr ""
+
+#: c-decl.c:5909
+#, gcc-internal-format
+msgid "%J%qD was used with no prototype before its definition"
+msgstr ""
+
+#: c-decl.c:5916
+#, gcc-internal-format
+msgid "%Jno previous declaration for %qD"
+msgstr ""
+
+#: c-decl.c:5924
+#, gcc-internal-format
+msgid "%J%qD was used with no declaration before its definition"
+msgstr ""
+
+#: c-decl.c:5957 c-decl.c:6475
+#, gcc-internal-format
+msgid "%Jreturn type of %qD is not %<int%>"
+msgstr ""
+
+#: c-decl.c:5972
+#, gcc-internal-format
+msgid "%Jfirst argument of %qD should be %<int%>"
+msgstr ""
+
+#: c-decl.c:5981
+#, gcc-internal-format
+msgid "%Jsecond argument of %qD should be %<char **%>"
+msgstr ""
+
+#: c-decl.c:5990
+#, gcc-internal-format
+msgid "%Jthird argument of %qD should probably be %<char **%>"
+msgstr ""
+
+#: c-decl.c:6000
+#, gcc-internal-format
+msgid "%J%qD takes only zero or two arguments"
+msgstr ""
+
+#: c-decl.c:6003
+#, gcc-internal-format
+msgid "%J%qD is normally a non-static function"
+msgstr ""
+
+#: c-decl.c:6049
+#, gcc-internal-format
+msgid "%Jold-style parameter declarations in prototyped function definition"
+msgstr ""
+
+#: c-decl.c:6062
+#, gcc-internal-format
+msgid "%Jtraditional C rejects ISO C style function definitions"
+msgstr ""
+
+#: c-decl.c:6074
+#, gcc-internal-format
+msgid "%Jparameter name omitted"
+msgstr ""
+
+#: c-decl.c:6114
+#, gcc-internal-format
+msgid "%Jold-style function definition"
+msgstr ""
+
+#: c-decl.c:6123
+#, gcc-internal-format
+msgid "%Jparameter name missing from parameter list"
+msgstr ""
+
+#: c-decl.c:6134
+#, gcc-internal-format
+msgid "%J%qD declared as a non-parameter"
+msgstr ""
+
+#: c-decl.c:6139
+#, gcc-internal-format
+msgid "%Jmultiple parameters named %qD"
+msgstr ""
+
+#: c-decl.c:6147
+#, gcc-internal-format
+msgid "%Jparameter %qD declared with void type"
+msgstr ""
+
+#: c-decl.c:6162 c-decl.c:6164
+#, gcc-internal-format
+msgid "%Jtype of %qD defaults to %<int%>"
+msgstr ""
+
+#: c-decl.c:6183
+#, gcc-internal-format
+msgid "%Jparameter %qD has incomplete type"
+msgstr ""
+
+#: c-decl.c:6189
+#, gcc-internal-format
+msgid "%Jdeclaration for parameter %qD but no such parameter"
+msgstr ""
+
+#: c-decl.c:6240
+#, gcc-internal-format
+msgid "number of arguments doesn%'t match built-in prototype"
+msgstr ""
+
+#: c-decl.c:6244
+#, gcc-internal-format
+msgid "number of arguments doesn%'t match prototype"
+msgstr ""
+
+#: c-decl.c:6245 c-decl.c:6285 c-decl.c:6298
+#, gcc-internal-format
+msgid "%Hprototype declaration"
+msgstr ""
+
+#: c-decl.c:6279
+#, gcc-internal-format
+msgid "promoted argument %qD doesn%'t match built-in prototype"
+msgstr ""
+
+#: c-decl.c:6283
+#, gcc-internal-format
+msgid "promoted argument %qD doesn%'t match prototype"
+msgstr ""
+
+#: c-decl.c:6293
+#, gcc-internal-format
+msgid "argument %qD doesn%'t match built-in prototype"
+msgstr ""
+
+#: c-decl.c:6297
+#, gcc-internal-format
+msgid "argument %qD doesn%'t match prototype"
+msgstr ""
+
+#: c-decl.c:6519 cp/decl.c:10686
+#, gcc-internal-format
+msgid "no return statement in function returning non-void"
+msgstr ""
+
+#: c-decl.c:6528
+#, gcc-internal-format
+msgid "this function may return with or without a value"
+msgstr ""
+
+#. If we get here, declarations have been used in a for loop without
+#. the C99 for loop scope. This doesn't make much sense, so don't
+#. allow it.
+#: c-decl.c:6621
+#, gcc-internal-format
+msgid "%<for%> loop initial declaration used outside C99 mode"
+msgstr ""
+
+#: c-decl.c:6650
+#, gcc-internal-format
msgid ""
-"The percentage of function, weighted by execution frequency, that must be "
-"covered by trace formation. Used when profile feedback is available"
+"%Jdeclaration of static variable %qD in %<for%> loop initial declaration"
msgstr ""
-#: params.def:292
+#: c-decl.c:6653
+#, gcc-internal-format
msgid ""
-"The percentage of function, weighted by execution frequency, that must be "
-"covered by trace formation. Used when profile feedback is not available"
+"%Jdeclaration of %<extern%> variable %qD in %<for%> loop initial declaration"
msgstr ""
-#: params.def:296
-msgid "Maximal code growth caused by tail duplication (in percent)"
+#: c-decl.c:6658
+#, gcc-internal-format
+msgid "%<struct %E%> declared in %<for%> loop initial declaration"
msgstr ""
-#: params.def:300
+#: c-decl.c:6662
+#, gcc-internal-format
+msgid "%<union %E%> declared in %<for%> loop initial declaration"
+msgstr ""
+
+#: c-decl.c:6666
+#, gcc-internal-format
+msgid "%<enum %E%> declared in %<for%> loop initial declaration"
+msgstr ""
+
+#: c-decl.c:6670
+#, gcc-internal-format
+msgid "%Jdeclaration of non-variable %qD in %<for%> loop initial declaration"
+msgstr ""
+
+#: c-decl.c:6954 c-decl.c:7105 c-decl.c:7315
+#, gcc-internal-format
+msgid "duplicate %qE"
+msgstr ""
+
+#: c-decl.c:6977 c-decl.c:7114 c-decl.c:7217
+#, gcc-internal-format
+msgid "two or more data types in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:6989 cp/decl.c:6690
+#, gcc-internal-format
+msgid "%<long long long%> is too long for GCC"
+msgstr ""
+
+#: c-decl.c:6996 c-decl.c:7188
+#, gcc-internal-format
+msgid "both %<long long%> and %<double%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7002
+#, gcc-internal-format
+msgid "ISO C90 does not support %<long long%>"
+msgstr ""
+
+#: c-decl.c:7007 c-decl.c:7027
+#, gcc-internal-format
+msgid "both %<long%> and %<short%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7010 c-decl.c:7121
+#, gcc-internal-format
+msgid "both %<long%> and %<void%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7013 c-decl.c:7140
+#, gcc-internal-format
+msgid "both %<long%> and %<_Bool%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7016 c-decl.c:7159
+#, gcc-internal-format
+msgid "both %<long%> and %<char%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7019 c-decl.c:7172
+#, gcc-internal-format
+msgid "both %<long%> and %<float%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7030 c-decl.c:7124
+#, gcc-internal-format
+msgid "both %<short%> and %<void%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7033 c-decl.c:7143
+#, gcc-internal-format
+msgid "both %<short%> and %<_Bool%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7036 c-decl.c:7162
+#, gcc-internal-format
+msgid "both %<short%> and %<char%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7039 c-decl.c:7175
+#, gcc-internal-format
+msgid "both %<short%> and %<float%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7042 c-decl.c:7191
+#, gcc-internal-format
+msgid "both %<short%> and %<double%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7050 c-decl.c:7070
+#, gcc-internal-format
+msgid "both %<signed%> and %<unsigned%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7053 c-decl.c:7127
+#, gcc-internal-format
+msgid "both %<signed%> and %<void%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7056 c-decl.c:7146
+#, gcc-internal-format
+msgid "both %<signed%> and %<_Bool%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7059 c-decl.c:7178
+#, gcc-internal-format
+msgid "both %<signed%> and %<float%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7062 c-decl.c:7194
+#, gcc-internal-format
+msgid "both %<signed%> and %<double%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7073 c-decl.c:7130
+#, gcc-internal-format
+msgid "both %<unsigned%> and %<void%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7076 c-decl.c:7149
+#, gcc-internal-format
+msgid "both %<unsigned%> and %<_Bool%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7079 c-decl.c:7181
+#, gcc-internal-format
+msgid "both %<unsigned%> and %<float%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7082 c-decl.c:7197
+#, gcc-internal-format
+msgid "both %<unsigned%> and %<double%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7090
+#, gcc-internal-format
+msgid "ISO C90 does not support complex types"
+msgstr ""
+
+#: c-decl.c:7092 c-decl.c:7133
+#, gcc-internal-format
+msgid "both %<complex%> and %<void%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7095 c-decl.c:7152
+#, gcc-internal-format
+msgid "both %<complex%> and %<_Bool%> in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7234
+#, gcc-internal-format
+msgid "%qE fails to be a typedef or built in type"
+msgstr ""
+
+#: c-decl.c:7266
+#, gcc-internal-format
+msgid "%qE is not at beginning of declaration"
+msgstr ""
+
+#: c-decl.c:7280
+#, gcc-internal-format
+msgid "%<__thread%> used with %<auto%>"
+msgstr ""
+
+#: c-decl.c:7282
+#, gcc-internal-format
+msgid "%<__thread%> used with %<register%>"
+msgstr ""
+
+#: c-decl.c:7284
+#, gcc-internal-format
+msgid "%<__thread%> used with %<typedef%>"
+msgstr ""
+
+#: c-decl.c:7295 cp/parser.c:7355
+#, gcc-internal-format
+msgid "%<__thread%> before %<extern%>"
+msgstr ""
+
+#: c-decl.c:7304 cp/parser.c:7345
+#, gcc-internal-format
+msgid "%<__thread%> before %<static%>"
+msgstr ""
+
+#: c-decl.c:7320
+#, gcc-internal-format
+msgid "multiple storage classes in declaration specifiers"
+msgstr ""
+
+#: c-decl.c:7327
+#, gcc-internal-format
+msgid "%<__thread%> used with %qE"
+msgstr ""
+
+#: c-decl.c:7381
+#, gcc-internal-format
+msgid "ISO C does not support plain %<complex%> meaning %<double complex%>"
+msgstr ""
+
+#: c-decl.c:7426 c-decl.c:7452
+#, gcc-internal-format
+msgid "ISO C does not support complex integer types"
+msgstr ""
+
+#: c-decl.c:7527 toplev.c:818
+#, gcc-internal-format
+msgid "%J%qF used but never defined"
+msgstr ""
+
+#: c-format.c:96 c-format.c:205
+#, gcc-internal-format
+msgid "format string has invalid operand number"
+msgstr ""
+
+#: c-format.c:113
+#, gcc-internal-format
+msgid "function does not return string type"
+msgstr ""
+
+#: c-format.c:142
+#, gcc-internal-format
+msgid "format string argument not a string type"
+msgstr ""
+
+#: c-format.c:185
+#, gcc-internal-format
+msgid "unrecognized format specifier"
+msgstr ""
+
+#: c-format.c:197
+#, gcc-internal-format
+msgid "%qE is an unrecognized format function type"
+msgstr ""
+
+#: c-format.c:211
+#, gcc-internal-format
+msgid "%<...%> has invalid operand number"
+msgstr ""
+
+#: c-format.c:218
+#, gcc-internal-format
+msgid "format string argument follows the args to be formatted"
+msgstr ""
+
+#: c-format.c:836
+#, gcc-internal-format
+msgid "function might be possible candidate for %qs format attribute"
+msgstr ""
+
+#: c-format.c:928 c-format.c:949 c-format.c:1953
+#, gcc-internal-format
+msgid "missing $ operand number in format"
+msgstr ""
+
+#: c-format.c:958
+#, gcc-internal-format
+msgid "%s does not support %%n$ operand number formats"
+msgstr ""
+
+#: c-format.c:965
+#, gcc-internal-format
+msgid "operand number out of range in format"
+msgstr ""
+
+#: c-format.c:988
+#, gcc-internal-format
+msgid "format argument %d used more than once in %s format"
+msgstr ""
+
+#: c-format.c:1020
+#, gcc-internal-format
+msgid "$ operand number used after format without operand number"
+msgstr ""
+
+#: c-format.c:1050
+#, gcc-internal-format
+msgid "format argument %d unused before used argument %d in $-style format"
+msgstr ""
+
+#: c-format.c:1145
+#, gcc-internal-format
+msgid "format not a string literal, format string not checked"
+msgstr ""
+
+#: c-format.c:1160 c-format.c:1163
+#, gcc-internal-format
+msgid "format not a string literal and no format arguments"
+msgstr ""
+
+#: c-format.c:1166
+#, gcc-internal-format
+msgid "format not a string literal, argument types not checked"
+msgstr ""
+
+#: c-format.c:1179
+#, gcc-internal-format
+msgid "too many arguments for format"
+msgstr ""
+
+#: c-format.c:1182
+#, gcc-internal-format
+msgid "unused arguments in $-style format"
+msgstr ""
+
+#: c-format.c:1185
+#, gcc-internal-format
+msgid "zero-length %s format string"
+msgstr ""
+
+#: c-format.c:1189
+#, gcc-internal-format
+msgid "format is a wide character string"
+msgstr ""
+
+#: c-format.c:1192
+#, gcc-internal-format
+msgid "unterminated format string"
+msgstr ""
+
+#: c-format.c:1406
+#, gcc-internal-format
+msgid "embedded %<\\0%> in format"
+msgstr ""
+
+#: c-format.c:1421
+#, gcc-internal-format
+msgid "spurious trailing %<%%%> in format"
+msgstr ""
+
+#: c-format.c:1465 c-format.c:1709
+#, gcc-internal-format
+msgid "repeated %s in format"
+msgstr ""
+
+#: c-format.c:1478
+#, gcc-internal-format
+msgid "missing fill character at end of strfmon format"
+msgstr ""
+
+#: c-format.c:1522 c-format.c:1624 c-format.c:1903 c-format.c:1965
+#, gcc-internal-format
+msgid "too few arguments for format"
+msgstr ""
+
+#: c-format.c:1563
+#, gcc-internal-format
+msgid "zero width in %s format"
+msgstr ""
+
+#: c-format.c:1581
+#, gcc-internal-format
+msgid "empty left precision in %s format"
+msgstr ""
+
+#: c-format.c:1654
+#, gcc-internal-format
+msgid "empty precision in %s format"
+msgstr ""
+
+#: c-format.c:1693
+#, gcc-internal-format
+msgid "%s does not support the %qs %s length modifier"
+msgstr ""
+
+#: c-format.c:1743
+#, gcc-internal-format
+msgid "conversion lacks type at end of format"
+msgstr ""
+
+#: c-format.c:1754
+#, gcc-internal-format
+msgid "unknown conversion type character %qc in format"
+msgstr ""
+
+#: c-format.c:1757
+#, gcc-internal-format
+msgid "unknown conversion type character 0x%x in format"
+msgstr ""
+
+#: c-format.c:1764
+#, gcc-internal-format
+msgid "%s does not support the %<%%%c%> %s format"
+msgstr ""
+
+#: c-format.c:1780
+#, gcc-internal-format
+msgid "%s used with %<%%%c%> %s format"
+msgstr ""
+
+#: c-format.c:1789
+#, gcc-internal-format
+msgid "%s does not support %s"
+msgstr ""
+
+#: c-format.c:1798
+#, gcc-internal-format
+msgid "%s does not support %s with the %<%%%c%> %s format"
+msgstr ""
+
+#: c-format.c:1831
+#, gcc-internal-format
+msgid "%s ignored with %s and %<%%%c%> %s format"
+msgstr ""
+
+#: c-format.c:1835
+#, gcc-internal-format
+msgid "%s ignored with %s in %s format"
+msgstr ""
+
+#: c-format.c:1841
+#, gcc-internal-format
+msgid "use of %s and %s together with %<%%%c%> %s format"
+msgstr ""
+
+#: c-format.c:1845
+#, gcc-internal-format
+msgid "use of %s and %s together in %s format"
+msgstr ""
+
+#: c-format.c:1864
+#, gcc-internal-format
+msgid "%<%%%c%> yields only last 2 digits of year in some locales"
+msgstr ""
+
+#: c-format.c:1867
+#, gcc-internal-format
+msgid "%<%%%c%> yields only last 2 digits of year"
+msgstr ""
+
+#. The end of the format string was reached.
+#: c-format.c:1883
+#, gcc-internal-format
+msgid "no closing %<]%> for %<%%[%> format"
+msgstr ""
+
+#: c-format.c:1896
+#, gcc-internal-format
+msgid "use of %qs length modifier with %qc type character"
+msgstr ""
+
+#: c-format.c:1917
+#, gcc-internal-format
+msgid "%s does not support the %<%%%s%c%> %s format"
+msgstr ""
+
+#: c-format.c:1934
+#, gcc-internal-format
+msgid "operand number specified with suppressed assignment"
+msgstr ""
+
+#: c-format.c:1936
+#, gcc-internal-format
+msgid "operand number specified for format taking no argument"
+msgstr ""
+
+#: c-format.c:2078
+#, gcc-internal-format
+msgid "writing through null pointer (argument %d)"
+msgstr ""
+
+#: c-format.c:2086
+#, gcc-internal-format
+msgid "reading through null pointer (argument %d)"
+msgstr ""
+
+#: c-format.c:2106
+#, gcc-internal-format
+msgid "writing into constant object (argument %d)"
+msgstr ""
+
+#: c-format.c:2117
+#, gcc-internal-format
+msgid "extra type qualifiers in format argument (argument %d)"
+msgstr ""
+
+#: c-format.c:2228
+#, gcc-internal-format
+msgid "%s should have type %<%s%s%>, but argument %d has type %qT"
+msgstr ""
+
+#: c-format.c:2231
+#, gcc-internal-format
+msgid "format %q.*s expects type %<%s%s%>, but argument %d has type %qT"
+msgstr ""
+
+#: c-format.c:2238
+#, gcc-internal-format
+msgid "%s should have type %<%T%s%>, but argument %d has type %qT"
+msgstr ""
+
+#: c-format.c:2241
+#, gcc-internal-format
+msgid "format %q.*s expects type %<%T%s%>, but argument %d has type %qT"
+msgstr ""
+
+#: c-format.c:2299 c-format.c:2305 c-format.c:2406
+#, gcc-internal-format
+msgid "%<__gcc_host_wide_int__%> is not defined as a type"
+msgstr ""
+
+#: c-format.c:2312 c-format.c:2416
+#, gcc-internal-format
+msgid "%<__gcc_host_wide_int__%> is not defined as %<long%> or %<long long%>"
+msgstr ""
+
+#: c-format.c:2365
+#, gcc-internal-format
+msgid "%<location_t%> is not defined as a type"
+msgstr ""
+
+#: c-format.c:2382
+#, gcc-internal-format
+msgid "%<tree%> is not defined as a type"
+msgstr ""
+
+#: c-format.c:2387
+#, gcc-internal-format
+msgid "%<tree%> is not defined as a pointer type"
+msgstr ""
+
+#: c-format.c:2573
+#, gcc-internal-format
+msgid "args to be formatted is not %<...%>"
+msgstr ""
+
+#: c-format.c:2582
+#, gcc-internal-format
+msgid "strftime formats cannot format arguments"
+msgstr ""
+
+#: c-lex.c:254
+#, gcc-internal-format
+msgid "badly nested C headers from preprocessor"
+msgstr ""
+
+#: c-lex.c:302
+#, gcc-internal-format
+msgid "%Hignoring #pragma %s %s"
+msgstr ""
+
+#. ... or not.
+#: c-lex.c:411
+#, gcc-internal-format
+msgid "%Hstray %<@%> in program"
+msgstr ""
+
+#: c-lex.c:425
+#, gcc-internal-format
+msgid "stray %qs in program"
+msgstr ""
+
+#: c-lex.c:435
+#, gcc-internal-format
+msgid "missing terminating %c character"
+msgstr ""
+
+#: c-lex.c:437
+#, gcc-internal-format
+msgid "stray %qc in program"
+msgstr ""
+
+#: c-lex.c:439
+#, gcc-internal-format
+msgid "stray %<\\%o%> in program"
+msgstr ""
+
+#: c-lex.c:600
+#, gcc-internal-format
+msgid "this decimal constant is unsigned only in ISO C90"
+msgstr ""
+
+#: c-lex.c:604
+#, gcc-internal-format
+msgid "this decimal constant would be unsigned in ISO C90"
+msgstr ""
+
+#: c-lex.c:620
+#, gcc-internal-format
+msgid "integer constant is too large for %qs type"
+msgstr ""
+
+#: c-lex.c:686
+#, gcc-internal-format
+msgid "floating constant exceeds range of %<%s%>"
+msgstr ""
+
+#: c-lex.c:769
+#, gcc-internal-format
+msgid "traditional C rejects string constant concatenation"
+msgstr ""
+
+#: c-objc-common.c:80
+#, gcc-internal-format
msgid ""
-"Stop reverse growth if the reverse probability of best edge is less than "
-"this threshold (in percent)"
+"%Jfunction %qF can never be inlined because it is suppressed using -fno-"
+"inline"
msgstr ""
-#: params.def:304
+#: c-objc-common.c:90
+#, gcc-internal-format
msgid ""
-"Stop forward growth if the probability of best edge is less than this "
-"threshold (in percent). Used when profile feedback is available"
+"%Jfunction %qF can never be inlined because it might not be bound within "
+"this unit of translation"
msgstr ""
-#: params.def:308
+#: c-objc-common.c:98
+#, gcc-internal-format
msgid ""
-"Stop forward growth if the probability of best edge is less than this "
-"threshold (in percent). Used when profile feedback is not available"
+"%Jfunction %qF can never be inlined because it uses attributes conflicting "
+"with inlining"
msgstr ""
-#: params.def:314
-msgid "The maximum number of incoming edges to consider for crossjumping"
+#: c-opts.c:144
+#, gcc-internal-format
+msgid "no class name specified with %qs"
+msgstr ""
+
+#: c-opts.c:148
+#, gcc-internal-format
+msgid "assertion missing after %qs"
+msgstr ""
+
+#: c-opts.c:153
+#, gcc-internal-format
+msgid "macro name missing after %qs"
+msgstr ""
+
+#: c-opts.c:162
+#, gcc-internal-format
+msgid "missing path after %qs"
+msgstr ""
+
+#: c-opts.c:171
+#, gcc-internal-format
+msgid "missing filename after %qs"
+msgstr ""
+
+#: c-opts.c:176
+#, gcc-internal-format
+msgid "missing makefile target after %qs"
+msgstr ""
+
+#: c-opts.c:303
+#, gcc-internal-format
+msgid "-I- specified twice"
+msgstr ""
+
+#: c-opts.c:306
+#, gcc-internal-format
+msgid "obsolete option -I- used, please use -iquote instead"
msgstr ""
-#: params.def:320
+#: c-opts.c:473
+#, gcc-internal-format
+msgid "argument %qs to %<-Wnormalized%> not recognized"
+msgstr ""
+
+#: c-opts.c:557
+#, gcc-internal-format
+msgid "switch %qs is no longer supported"
+msgstr ""
+
+#: c-opts.c:670
+#, gcc-internal-format
msgid ""
-"The minimum number of matching instructions to consider for crossjumping"
+"-fhandle-exceptions has been renamed -fexceptions (and is now on by default)"
+msgstr ""
+
+#: c-opts.c:848
+#, gcc-internal-format
+msgid "output filename specified twice"
+msgstr ""
+
+#: c-opts.c:985
+#, gcc-internal-format
+msgid "-Wformat-y2k ignored without -Wformat"
+msgstr ""
+
+#: c-opts.c:987
+#, gcc-internal-format
+msgid "-Wformat-extra-args ignored without -Wformat"
+msgstr ""
+
+#: c-opts.c:989
+#, gcc-internal-format
+msgid "-Wformat-zero-length ignored without -Wformat"
+msgstr ""
+
+#: c-opts.c:991
+#, gcc-internal-format
+msgid "-Wformat-nonliteral ignored without -Wformat"
+msgstr ""
+
+#: c-opts.c:993
+#, gcc-internal-format
+msgid "-Wformat-security ignored without -Wformat"
+msgstr ""
+
+#: c-opts.c:995
+#, gcc-internal-format
+msgid "-Wmissing-format-attribute ignored without -Wformat"
+msgstr ""
+
+#: c-opts.c:1015
+#, gcc-internal-format
+msgid "opening output file %s: %m"
+msgstr ""
+
+#: c-opts.c:1020
+#, gcc-internal-format
+msgid "too many filenames given. Type %s --help for usage"
+msgstr ""
+
+#: c-opts.c:1106
+#, gcc-internal-format
+msgid "YYDEBUG was not defined at build time, -dy ignored"
+msgstr ""
+
+#: c-opts.c:1152
+#, gcc-internal-format
+msgid "opening dependency file %s: %m"
+msgstr ""
+
+#: c-opts.c:1162
+#, gcc-internal-format
+msgid "closing dependency file %s: %m"
+msgstr ""
+
+#: c-opts.c:1165
+#, gcc-internal-format
+msgid "when writing output to %s: %m"
+msgstr ""
+
+#: c-opts.c:1245
+#, gcc-internal-format
+msgid "to generate dependencies you must specify either -M or -MM"
+msgstr ""
+
+#: c-opts.c:1413
+#, gcc-internal-format
+msgid "too late for # directive to set debug directory"
+msgstr ""
+
+#: c-parser.c:968
+#, gcc-internal-format
+msgid "ISO C forbids an empty source file"
+msgstr ""
+
+#: c-parser.c:1053 c-parser.c:5695
+#, gcc-internal-format
+msgid "ISO C does not allow extra %<;%> outside of a function"
+msgstr ""
+
+#: c-parser.c:1144
+#, gcc-internal-format
+msgid "expected declaration specifiers"
+msgstr ""
+
+#: c-parser.c:1192
+#, gcc-internal-format
+msgid "data definition has no type or storage class"
+msgstr ""
+
+#: c-parser.c:1246
+#, gcc-internal-format
+msgid "expected %<,%> or %<;%>"
+msgstr ""
+
+#. This can appear in many cases looking nothing like a
+#. function definition, so we don't give a more specific
+#. error suggesting there was one.
+#: c-parser.c:1253 c-parser.c:1270
+#, gcc-internal-format
+msgid "expected %<=%>, %<,%>, %<;%>, %<asm%> or %<__attribute__%>"
+msgstr ""
+
+#: c-parser.c:1262
+#, gcc-internal-format
+msgid "ISO C forbids nested functions"
+msgstr ""
+
+#: c-parser.c:1608 c-parser.c:2371 c-parser.c:2972 c-parser.c:3206
+#: c-parser.c:3989 c-parser.c:4550 c-parser.c:4940 c-parser.c:4960
+#: c-parser.c:5075 c-parser.c:5220 c-parser.c:5236 c-parser.c:5348
+#: c-parser.c:5360 c-parser.c:5385 c-parser.c:5513 c-parser.c:5542
+#: c-parser.c:5550 c-parser.c:5578 c-parser.c:5592 c-parser.c:5800
+#: c-parser.c:5899
+#, gcc-internal-format
+msgid "expected identifier"
+msgstr ""
+
+#: c-parser.c:1634 cp/parser.c:10154
+#, gcc-internal-format
+msgid "comma at end of enumerator list"
+msgstr ""
+
+#: c-parser.c:1640
+#, gcc-internal-format
+msgid "expected %<,%> or %<}%>"
+msgstr ""
+
+#: c-parser.c:1654 c-parser.c:1824
+#, gcc-internal-format
+msgid "expected %<{%>"
+msgstr ""
+
+#: c-parser.c:1663
+#, gcc-internal-format
+msgid "ISO C forbids forward references to %<enum%> types"
+msgstr ""
+
+#: c-parser.c:1766
+#, gcc-internal-format
+msgid "expected class name"
+msgstr ""
+
+#: c-parser.c:1785 c-parser.c:5452
+#, gcc-internal-format
+msgid "extra semicolon in struct or union specified"
+msgstr ""
+
+#: c-parser.c:1807
+#, gcc-internal-format
+msgid "no semicolon at end of struct or union"
+msgstr ""
+
+#: c-parser.c:1810
+#, gcc-internal-format
+msgid "expected %<;%>"
+msgstr ""
+
+#: c-parser.c:1887 c-parser.c:2813
+#, gcc-internal-format
+msgid "expected specifier-qualifier-list"
+msgstr ""
+
+#: c-parser.c:1897
+#, gcc-internal-format
+msgid "ISO C forbids member declarations with no members"
+msgstr ""
+
+#: c-parser.c:1966
+#, gcc-internal-format
+msgid "expected %<,%>, %<;%> or %<}%>"
+msgstr ""
+
+#: c-parser.c:1973
+#, gcc-internal-format
+msgid "expected %<:%>, %<,%>, %<;%>, %<}%> or %<__attribute__%>"
+msgstr ""
+
+#: c-parser.c:2022
+#, gcc-internal-format
+msgid "%<typeof%> applied to a bit-field"
+msgstr ""
+
+#: c-parser.c:2241
+#, gcc-internal-format
+msgid "expected identifier or %<(%>"
+msgstr ""
+
+#: c-parser.c:2434
+#, gcc-internal-format
+msgid "ISO C requires a named argument before %<...%>"
+msgstr ""
+
+#: c-parser.c:2535
+#, gcc-internal-format
+msgid "expected declaration specifiers or %<...%>"
+msgstr ""
+
+#: c-parser.c:2585
+#, gcc-internal-format
+msgid "wide string literal in %<asm%>"
+msgstr ""
+
+#: c-parser.c:2591
+#, gcc-internal-format
+msgid "expected string literal"
+msgstr ""
+
+#: c-parser.c:2898
+#, gcc-internal-format
+msgid "ISO C forbids empty initializer braces"
+msgstr ""
+
+#: c-parser.c:2943
+#, gcc-internal-format
+msgid "obsolete use of designated initializer with %<:%>"
+msgstr ""
+
+#: c-parser.c:3065
+#, gcc-internal-format
+msgid "ISO C forbids specifying range of elements to initialize"
+msgstr ""
+
+#: c-parser.c:3078
+#, gcc-internal-format
+msgid "ISO C90 forbids specifying subobject to initialize"
+msgstr ""
+
+#: c-parser.c:3086
+#, gcc-internal-format
+msgid "obsolete use of designated initializer without %<=%>"
+msgstr ""
+
+#: c-parser.c:3094
+#, gcc-internal-format
+msgid "expected %<=%>"
+msgstr ""
+
+#: c-parser.c:3225
+#, gcc-internal-format
+msgid "ISO C forbids label declarations"
+msgstr ""
+
+#: c-parser.c:3230 c-parser.c:3239
+#, gcc-internal-format
+msgid "expected declaration or statement"
+msgstr ""
+
+#: c-parser.c:3259 c-parser.c:3287
+#, gcc-internal-format
+msgid "%HISO C90 forbids mixed declarations and code"
+msgstr ""
+
+#: c-parser.c:3303
+#, gcc-internal-format
+msgid "label at end of compound statement"
+msgstr ""
+
+#: c-parser.c:3346
+#, gcc-internal-format
+msgid "expected %<:%> or %<...%>"
+msgstr ""
+
+#: c-parser.c:3482
+#, gcc-internal-format
+msgid "expected identifier or %<*%>"
+msgstr ""
+
+#. Avoid infinite loop in error recovery:
+#. c_parser_skip_until_found stops at a closing nesting
+#. delimiter without consuming it, but here we need to consume
+#. it to proceed further.
+#: c-parser.c:3544
+#, gcc-internal-format
+msgid "expected statement"
+msgstr ""
+
+#: c-parser.c:3877
+#, gcc-internal-format
+msgid "%E qualifier ignored on asm"
+msgstr ""
+
+#: c-parser.c:4150
+#, gcc-internal-format
+msgid "ISO C forbids omitting the middle term of a ?: expression"
+msgstr ""
+
+#: c-parser.c:4524
+#, gcc-internal-format
+msgid "traditional C rejects the unary plus operator"
+msgstr ""
+
+#: c-parser.c:4633
+#, gcc-internal-format
+msgid "%<sizeof%> applied to a bit-field"
+msgstr ""
+
+#: c-parser.c:4776 c-parser.c:5117 c-parser.c:5139
+#, gcc-internal-format
+msgid "expected expression"
+msgstr ""
+
+#: c-parser.c:4802
+#, gcc-internal-format
+msgid "braced-group within expression allowed only inside a function"
+msgstr ""
+
+#: c-parser.c:4816
+#, gcc-internal-format
+msgid "ISO C forbids braced-groups within expressions"
+msgstr ""
+
+#: c-parser.c:4999
+#, gcc-internal-format
+msgid "first argument to %<__builtin_choose_expr%> not a constant"
+msgstr ""
+
+#: c-parser.c:5166
+#, gcc-internal-format
+msgid "compound literal has variable size"
+msgstr ""
+
+#: c-parser.c:5174
+#, gcc-internal-format
+msgid "ISO C90 forbids compound literals"
+msgstr ""
+
+#: c-parser.c:5663
+#, gcc-internal-format
+msgid "extra semicolon in method definition specified"
+msgstr ""
+
+#: c-pch.c:132
+#, gcc-internal-format
+msgid "can%'t create precompiled header %s: %m"
msgstr ""
-#: params.def:326
+#: c-pch.c:153
+#, gcc-internal-format
+msgid "can%'t write to %s: %m"
+msgstr ""
+
+#: c-pch.c:159
+#, gcc-internal-format
+msgid "%qs is not a valid output file"
+msgstr ""
+
+#: c-pch.c:188 c-pch.c:203 c-pch.c:217
+#, gcc-internal-format
+msgid "can%'t write %s: %m"
+msgstr ""
+
+#: c-pch.c:193 c-pch.c:210
+#, gcc-internal-format
+msgid "can%'t seek in %s: %m"
+msgstr ""
+
+#: c-pch.c:201 c-pch.c:243 c-pch.c:283 c-pch.c:334
+#, gcc-internal-format
+msgid "can%'t read %s: %m"
+msgstr ""
+
+#: c-pch.c:452
+#, gcc-internal-format
+msgid "malformed #pragma GCC pch_preprocess, ignored"
+msgstr ""
+
+#: c-pch.c:458
+#, gcc-internal-format
+msgid "pch_preprocess pragma should only be used with -fpreprocessed"
+msgstr ""
+
+#: c-pch.c:459
+#, gcc-internal-format
+msgid "use #include instead"
+msgstr ""
+
+#: c-pch.c:467
+#, gcc-internal-format
+msgid "%s: couldn%'t open PCH file: %m\n"
+msgstr ""
+
+#: c-pch.c:472
+#, gcc-internal-format
+msgid "use -Winvalid-pch for more information"
+msgstr ""
+
+#: c-pch.c:473
+#, gcc-internal-format
+msgid "%s: PCH file was invalid"
+msgstr ""
+
+#: c-pragma.c:100
+#, gcc-internal-format
+msgid "#pragma pack (pop) encountered without matching #pragma pack (push)"
+msgstr ""
+
+#: c-pragma.c:113
+#, gcc-internal-format
msgid ""
-"The maximum number of insns to duplicate when unfactoring computed gotos"
+"#pragma pack(pop, %s) encountered without matching #pragma pack(push, %s)"
msgstr ""
-#: params.def:332
-msgid "The maximum length of path considered in cse"
+#: c-pragma.c:127
+#, gcc-internal-format
+msgid "#pragma pack(push[, id], <n>) is not supported on this target"
+msgstr ""
+
+#: c-pragma.c:129
+#, gcc-internal-format
+msgid "#pragma pack(pop[, id], <n>) is not supported on this target"
msgstr ""
-#: params.def:339
+#: c-pragma.c:150
+#, gcc-internal-format
+msgid "missing %<(%> after %<#pragma pack%> - ignored"
+msgstr ""
+
+#: c-pragma.c:163 c-pragma.c:203
+#, gcc-internal-format
+msgid "malformed %<#pragma pack%> - ignored"
+msgstr ""
+
+#: c-pragma.c:168
+#, gcc-internal-format
+msgid "malformed %<#pragma pack(push[, id][, <n>])%> - ignored"
+msgstr ""
+
+#: c-pragma.c:170
+#, gcc-internal-format
+msgid "malformed %<#pragma pack(pop[, id])%> - ignored"
+msgstr ""
+
+#: c-pragma.c:179
+#, gcc-internal-format
+msgid "unknown action %qs for %<#pragma pack%> - ignored"
+msgstr ""
+
+#: c-pragma.c:206
+#, gcc-internal-format
+msgid "junk at end of %<#pragma pack%>"
+msgstr ""
+
+#: c-pragma.c:209
+#, gcc-internal-format
+msgid "#pragma pack has no effect with -fpack-struct - ignored"
+msgstr ""
+
+#: c-pragma.c:229
+#, gcc-internal-format
+msgid "alignment must be a small power of two, not %d"
+msgstr ""
+
+#: c-pragma.c:262
+#, gcc-internal-format
msgid ""
-"The minimum cost of an expensive expression in the loop invariant motion"
+"%Japplying #pragma weak %qD after first use results in unspecified behavior"
msgstr ""
-#: params.def:348
+#: c-pragma.c:336 c-pragma.c:341
+#, gcc-internal-format
+msgid "malformed #pragma weak, ignored"
+msgstr ""
+
+#: c-pragma.c:345
+#, gcc-internal-format
+msgid "junk at end of #pragma weak"
+msgstr ""
+
+#: c-pragma.c:413 c-pragma.c:415
+#, gcc-internal-format
+msgid "malformed #pragma redefine_extname, ignored"
+msgstr ""
+
+#: c-pragma.c:418
+#, gcc-internal-format
+msgid "junk at end of #pragma redefine_extname"
+msgstr ""
+
+#: c-pragma.c:424
+#, gcc-internal-format
+msgid "#pragma redefine_extname not supported on this target"
+msgstr ""
+
+#: c-pragma.c:441 c-pragma.c:528
+#, gcc-internal-format
+msgid "#pragma redefine_extname ignored due to conflict with previous rename"
+msgstr ""
+
+#: c-pragma.c:464
+#, gcc-internal-format
msgid ""
-"Bound on number of candidates below that all candidates are considered in iv "
-"optimizations"
+"#pragma redefine_extname ignored due to conflict with previous #pragma "
+"redefine_extname"
msgstr ""
-#: params.def:356
-msgid "Bound on number of iv uses in loop optimized in iv optimizations"
+#: c-pragma.c:483
+#, gcc-internal-format
+msgid "malformed #pragma extern_prefix, ignored"
msgstr ""
-#: params.def:364
+#: c-pragma.c:486
+#, gcc-internal-format
+msgid "junk at end of #pragma extern_prefix"
+msgstr ""
+
+#: c-pragma.c:493
+#, gcc-internal-format
+msgid "#pragma extern_prefix not supported on this target"
+msgstr ""
+
+#: c-pragma.c:519
+#, gcc-internal-format
+msgid "asm declaration ignored due to conflict with previous rename"
+msgstr ""
+
+#: c-pragma.c:550
+#, gcc-internal-format
msgid ""
-"If number of candidates in the set is smaller, we always try to remove "
-"unused ivs during its optimization"
+"#pragma redefine_extname ignored due to conflict with __asm__ declaration"
msgstr ""
-#: params.def:371
+#: c-pragma.c:615
+#, gcc-internal-format
+msgid "#pragma GCC visibility must be followed by push or pop"
+msgstr ""
+
+#: c-pragma.c:622
+#, gcc-internal-format
+msgid "No matching push for %<#pragma GCC visibility pop%>"
+msgstr ""
+
+#: c-pragma.c:634 c-pragma.c:660
+#, gcc-internal-format
+msgid "missing %<(%> after %<#pragma GCC visibility push%> - ignored"
+msgstr ""
+
+#: c-pragma.c:638
+#, gcc-internal-format
+msgid "malformed #pragma GCC visibility push"
+msgstr ""
+
+#: c-pragma.c:655
+#, gcc-internal-format
msgid ""
-"Given N calls and V call-clobbered vars in a function. Use .GLOBAL_VAR if "
-"NxV is larger than this limit"
+"#pragma GCC visibility push() must specify default, internal, hidden or "
+"protected"
msgstr ""
-#: params.def:376
-msgid "The maximum memory locations recorded by cselib"
+#: c-pragma.c:664
+#, gcc-internal-format
+msgid "junk at end of %<#pragma GCC visibility%>"
msgstr ""
-#: params.def:389
+#: c-typeck.c:144
+#, gcc-internal-format
+msgid "%qD has an incomplete type"
+msgstr ""
+
+#: c-typeck.c:165 cp/call.c:2679
+#, gcc-internal-format
+msgid "invalid use of void expression"
+msgstr ""
+
+#: c-typeck.c:173
+#, gcc-internal-format
+msgid "invalid use of flexible array member"
+msgstr ""
+
+#: c-typeck.c:179
+#, gcc-internal-format
+msgid "invalid use of array with unspecified bounds"
+msgstr ""
+
+#: c-typeck.c:187
+#, gcc-internal-format
+msgid "invalid use of undefined type %<%s %E%>"
+msgstr ""
+
+#. If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL.
+#: c-typeck.c:191
+#, gcc-internal-format
+msgid "invalid use of incomplete typedef %qD"
+msgstr ""
+
+#: c-typeck.c:397 c-typeck.c:422
+#, gcc-internal-format
+msgid "function types not truly compatible in ISO C"
+msgstr ""
+
+#: c-typeck.c:803
+#, gcc-internal-format
+msgid "types are not quite compatible"
+msgstr ""
+
+#: c-typeck.c:1045
+#, gcc-internal-format
+msgid "function return types not compatible due to %<volatile%>"
+msgstr ""
+
+#: c-typeck.c:1204 c-typeck.c:2485
+#, gcc-internal-format
+msgid "arithmetic on pointer to an incomplete type"
+msgstr ""
+
+#: c-typeck.c:1581
+#, gcc-internal-format
+msgid "%qT has no member named %qE"
+msgstr ""
+
+#: c-typeck.c:1616
+#, gcc-internal-format
+msgid "request for member %qE in something not a structure or union"
+msgstr ""
+
+#: c-typeck.c:1647
+#, gcc-internal-format
+msgid "dereferencing pointer to incomplete type"
+msgstr ""
+
+#: c-typeck.c:1651
+#, gcc-internal-format
+msgid "dereferencing %<void *%> pointer"
+msgstr ""
+
+#: c-typeck.c:1668 cp/typeck.c:2117
+#, gcc-internal-format
+msgid "invalid type argument of %qs"
+msgstr ""
+
+#: c-typeck.c:1696 cp/typeck.c:2268
+#, gcc-internal-format
+msgid "subscripted value is neither array nor pointer"
+msgstr ""
+
+#: c-typeck.c:1707 cp/typeck.c:2187 cp/typeck.c:2273
+#, gcc-internal-format
+msgid "array subscript is not an integer"
+msgstr ""
+
+#: c-typeck.c:1713
+#, gcc-internal-format
+msgid "subscripted value is pointer to function"
+msgstr ""
+
+#: c-typeck.c:1726 cp/typeck.c:2183
+#, gcc-internal-format
+msgid "array subscript has type %<char%>"
+msgstr ""
+
+#: c-typeck.c:1766
+#, gcc-internal-format
+msgid "ISO C forbids subscripting %<register%> array"
+msgstr ""
+
+#: c-typeck.c:1768
+#, gcc-internal-format
+msgid "ISO C90 forbids subscripting non-lvalue array"
+msgstr ""
+
+#: c-typeck.c:2018
+#, gcc-internal-format
+msgid "called object %qE is not a function"
+msgstr ""
+
+#. This situation leads to run-time undefined behavior. We can't,
+#. therefore, simply error unless we can prove that all possible
+#. executions of the program must execute the code.
+#: c-typeck.c:2045
+#, gcc-internal-format
+msgid "function called through a non-compatible type"
+msgstr ""
+
+#: c-typeck.c:2154
+#, gcc-internal-format
+msgid "too many arguments to function %qE"
+msgstr ""
+
+#: c-typeck.c:2177
+#, gcc-internal-format
+msgid "type of formal parameter %d is incomplete"
+msgstr ""
+
+#: c-typeck.c:2190
+#, gcc-internal-format
msgid ""
-"Minimum heap expansion to trigger garbage collection, as a percentage of the "
-"total size of the heap"
+"passing argument %d of %qE as integer rather than floating due to prototype"
msgstr ""
-#: params.def:394
-msgid "Minimum heap size before we start collecting garbage, in kilobytes"
+#: c-typeck.c:2195
+#, gcc-internal-format
+msgid ""
+"passing argument %d of %qE as integer rather than complex due to prototype"
msgstr ""
-#: params.def:402
+#: c-typeck.c:2200
+#, gcc-internal-format
msgid ""
-"The maximum number of instructions to search backward when looking for "
-"equivalent reload"
+"passing argument %d of %qE as complex rather than floating due to prototype"
msgstr ""
-#: params.def:407
+#: c-typeck.c:2205
+#, gcc-internal-format
msgid ""
-"The maximum number of virtual operands allowed to represent aliases before "
-"triggering alias grouping."
+"passing argument %d of %qE as floating rather than integer due to prototype"
msgstr ""
-#: params.def:412
+#: c-typeck.c:2210
+#, gcc-internal-format
msgid ""
-"The maximum number of blocks in a region to be considered for interblock "
-"scheduling"
+"passing argument %d of %qE as complex rather than integer due to prototype"
msgstr ""
-#: params.def:417
+#: c-typeck.c:2215
+#, gcc-internal-format
msgid ""
-"The maximum number of insns in a region to be considered for interblock "
-"scheduling"
+"passing argument %d of %qE as floating rather than complex due to prototype"
msgstr ""
-#: params.def:422
+#: c-typeck.c:2227
+#, gcc-internal-format
msgid ""
-"The maximum number of RTL nodes that can be recorded as combiner's last value"
+"passing argument %d of %qE as %<float%> rather than %<double%> due to "
+"prototype"
msgstr ""
-#: params.def:430
-msgid "The upper bound for sharing integer constants"
+#: c-typeck.c:2247
+#, gcc-internal-format
+msgid "passing argument %d of %qE with different width due to prototype"
msgstr ""
-#: config/darwin-c.c:84
-msgid "too many #pragma options align=reset"
+#: c-typeck.c:2269
+#, gcc-internal-format
+msgid "passing argument %d of %qE as unsigned due to prototype"
msgstr ""
-#: config/darwin-c.c:104 config/darwin-c.c:107 config/darwin-c.c:109
-#: config/darwin-c.c:111
-msgid "malformed '#pragma options', ignoring"
+#: c-typeck.c:2272
+#, gcc-internal-format
+msgid "passing argument %d of %qE as signed due to prototype"
msgstr ""
-#: config/darwin-c.c:114
-msgid "junk at end of '#pragma options'"
+#: c-typeck.c:2361
+#, gcc-internal-format
+msgid "suggest parentheses around + or - inside shift"
msgstr ""
-#: config/darwin-c.c:124
-msgid "malformed '#pragma options align={mac68k|power|reset}', ignoring"
+#: c-typeck.c:2368
+#, gcc-internal-format
+msgid "suggest parentheses around && within ||"
msgstr ""
-#: config/darwin-c.c:136
-msgid "missing '(' after '#pragma unused', ignoring"
+#: c-typeck.c:2377
+#, gcc-internal-format
+msgid "suggest parentheses around arithmetic in operand of |"
msgstr ""
-#: config/darwin-c.c:154
-msgid "missing ')' after '#pragma unused', ignoring"
+#: c-typeck.c:2381
+#, gcc-internal-format
+msgid "suggest parentheses around comparison in operand of |"
msgstr ""
-#: config/darwin-c.c:157
-msgid "junk at end of '#pragma unused'"
+#: c-typeck.c:2390
+#, gcc-internal-format
+msgid "suggest parentheses around arithmetic in operand of ^"
msgstr ""
-#: config/darwin-c.c:367
-#, c-format
-msgid "subframework include %s conflicts with framework include"
+#: c-typeck.c:2394
+#, gcc-internal-format
+msgid "suggest parentheses around comparison in operand of ^"
msgstr ""
-#: config/darwin.c:1355
-msgid ""
-"internal and protected visibility attributes not supported in this "
-"configuration; ignored"
+#: c-typeck.c:2401
+#, gcc-internal-format
+msgid "suggest parentheses around + or - in operand of &"
msgstr ""
-#: config/host-darwin.c:64
-#, c-format
-msgid "couldn't unmap pch_address_space: %m\n"
+#: c-typeck.c:2405
+#, gcc-internal-format
+msgid "suggest parentheses around comparison in operand of &"
msgstr ""
-#: config/sol2-c.c:94 config/sol2-c.c:110
-msgid "malformed %<#pragma align%>, ignoring"
+#: c-typeck.c:2411
+#, gcc-internal-format
+msgid "comparisons like X<=Y<=Z do not have their mathematical meaning"
msgstr ""
-#: config/sol2-c.c:103
-msgid "invalid alignment for %<#pragma align%>, ignoring"
+#: c-typeck.c:2437
+#, gcc-internal-format
+msgid "pointer of type %<void *%> used in subtraction"
msgstr ""
-#: config/sol2-c.c:118
-msgid "%<#pragma align%> must appear before the declaration of %D, ignoring"
+#: c-typeck.c:2439
+#, gcc-internal-format
+msgid "pointer to a function used in subtraction"
msgstr ""
-#: config/sol2-c.c:130 config/sol2-c.c:142
-msgid "malformed %<#pragma align%>"
+#: c-typeck.c:2528
+#, gcc-internal-format
+msgid "wrong type argument to unary plus"
msgstr ""
-#: config/sol2-c.c:137
-msgid "junk at end of %<#pragma align%>"
+#: c-typeck.c:2541
+#, gcc-internal-format
+msgid "wrong type argument to unary minus"
msgstr ""
-#: config/sol2-c.c:158 config/sol2-c.c:165
-msgid "malformed %<#pragma init%>, ignoring"
+#: c-typeck.c:2558
+#, gcc-internal-format
+msgid "ISO C does not support %<~%> for complex conjugation"
msgstr ""
-#: config/sol2-c.c:188 config/sol2-c.c:200
-msgid "malformed %<#pragma init%>"
+#: c-typeck.c:2564
+#, gcc-internal-format
+msgid "wrong type argument to bit-complement"
msgstr ""
-#: config/sol2-c.c:195
-msgid "junk at end of %<#pragma init%>"
+#: c-typeck.c:2572
+#, gcc-internal-format
+msgid "wrong type argument to abs"
msgstr ""
-#: config/sol2-c.c:216 config/sol2-c.c:223
-msgid "malformed %<#pragma fini%>, ignoring"
+#: c-typeck.c:2584
+#, gcc-internal-format
+msgid "wrong type argument to conjugation"
msgstr ""
-#: config/sol2-c.c:246 config/sol2-c.c:258
-msgid "malformed %<#pragma fini%>"
+#: c-typeck.c:2600
+#, gcc-internal-format
+msgid "wrong type argument to unary exclamation mark"
msgstr ""
-#: config/sol2-c.c:253
-msgid "junk at end of %<#pragma fini%>"
+#: c-typeck.c:2637
+#, gcc-internal-format
+msgid "ISO C does not support %<++%> and %<--%> on complex types"
msgstr ""
-#: config/sol2.c:54
-msgid "%Jignoring %<#pragma align%> for explicitly aligned %<%D%>"
+#: c-typeck.c:2653 c-typeck.c:2685
+#, gcc-internal-format
+msgid "wrong type argument to increment"
msgstr ""
-#: config/darwin.h:155
-msgid "Set sizeof(bool) to 1"
+#: c-typeck.c:2655 c-typeck.c:2687
+#, gcc-internal-format
+msgid "wrong type argument to decrement"
msgstr ""
-#: config/darwin.h:157
-msgid "Generate code suitable for fast turn around debugging"
+#: c-typeck.c:2676
+#, gcc-internal-format
+msgid "increment of pointer to unknown structure"
msgstr ""
-#: config/darwin.h:159
-msgid "Don't generate code suitable for fast turn around debugging"
+#: c-typeck.c:2678
+#, gcc-internal-format
+msgid "decrement of pointer to unknown structure"
msgstr ""
-#. Mach-O supports 'weak imports', and 'weak definitions' in coalesced
-#. sections. machopic_select_section ensures that weak variables go in
-#. coalesced sections. Weak aliases (or any other kind of aliases) are
-#. not supported. Weak symbols that aren't visible outside the .s file
-#. are not supported.
-#: config/darwin.h:395
-msgid "alias definitions not supported in Mach-O; ignored"
+#: c-typeck.c:2848
+#, gcc-internal-format
+msgid "assignment of read-only member %qD"
msgstr ""
-#: config/lynx.h:137
-msgid "Use shared libraries"
+#: c-typeck.c:2849
+#, gcc-internal-format
+msgid "increment of read-only member %qD"
msgstr ""
-#: config/lynx.h:138
-msgid "Support multi-threading"
+#: c-typeck.c:2850
+#, gcc-internal-format
+msgid "decrement of read-only member %qD"
msgstr ""
-#: config/lynx.h:139
-msgid "Support legacy multi-threading"
+#: c-typeck.c:2854
+#, gcc-internal-format
+msgid "assignment of read-only variable %qD"
msgstr ""
-#: config/windiss.h:37
-msgid "profiler support for WindISS"
+#: c-typeck.c:2855
+#, gcc-internal-format
+msgid "increment of read-only variable %qD"
msgstr ""
-#: config/alpha/alpha.c:272 config/rs6000/rs6000.c:1718
-#, c-format
-msgid "bad value %qs for -mtls-size switch"
+#: c-typeck.c:2856
+#, gcc-internal-format
+msgid "decrement of read-only variable %qD"
msgstr ""
-#: config/alpha/alpha.c:311
-#, c-format
-msgid "-f%s ignored for Unicos/Mk (not supported)"
+#: c-typeck.c:2859
+#, gcc-internal-format
+msgid "assignment of read-only location"
msgstr ""
-#: config/alpha/alpha.c:335
-msgid "-mieee not supported on Unicos/Mk"
+#: c-typeck.c:2860
+#, gcc-internal-format
+msgid "increment of read-only location"
msgstr ""
-#: config/alpha/alpha.c:346
-msgid "-mieee-with-inexact not supported on Unicos/Mk"
+#: c-typeck.c:2861
+#, gcc-internal-format
+msgid "decrement of read-only location"
msgstr ""
-#: config/alpha/alpha.c:363
-#, c-format
-msgid "bad value %qs for -mtrap-precision switch"
+#: c-typeck.c:2896
+#, gcc-internal-format
+msgid "cannot take address of bit-field %qD"
msgstr ""
-#: config/alpha/alpha.c:377
-#, c-format
-msgid "bad value %qs for -mfp-rounding-mode switch"
+#: c-typeck.c:2924
+#, gcc-internal-format
+msgid "global register variable %qD used in nested function"
msgstr ""
-#: config/alpha/alpha.c:392
-#, c-format
-msgid "bad value %qs for -mfp-trap-mode switch"
+#: c-typeck.c:2927
+#, gcc-internal-format
+msgid "register variable %qD used in nested function"
msgstr ""
-#: config/alpha/alpha.c:406 config/alpha/alpha.c:418
-#, c-format
-msgid "bad value %qs for -mcpu switch"
+#: c-typeck.c:2932
+#, gcc-internal-format
+msgid "address of global register variable %qD requested"
msgstr ""
-#: config/alpha/alpha.c:425
-msgid "trap mode not supported on Unicos/Mk"
+#: c-typeck.c:2934
+#, gcc-internal-format
+msgid "address of register variable %qD requested"
msgstr ""
-#: config/alpha/alpha.c:432
-msgid "fp software completion requires -mtrap-precision=i"
+#: c-typeck.c:2980
+#, gcc-internal-format
+msgid "non-lvalue array in conditional expression"
msgstr ""
-#: config/alpha/alpha.c:448
-msgid "rounding mode not supported for VAX floats"
+#: c-typeck.c:3024
+#, gcc-internal-format
+msgid "signed and unsigned type in conditional expression"
msgstr ""
-#: config/alpha/alpha.c:453
-msgid "trap mode not supported for VAX floats"
+#: c-typeck.c:3031
+#, gcc-internal-format
+msgid "ISO C forbids conditional expr with only one void side"
msgstr ""
-#: config/alpha/alpha.c:457
-msgid "128-bit long double not supported for VAX floats"
+#: c-typeck.c:3047 c-typeck.c:3055
+#, gcc-internal-format
+msgid "ISO C forbids conditional expr between %<void *%> and function pointer"
msgstr ""
-#: config/alpha/alpha.c:485
-#, c-format
-msgid "L%d cache latency unknown for %s"
+#: c-typeck.c:3062
+#, gcc-internal-format
+msgid "pointer type mismatch in conditional expression"
msgstr ""
-#: config/alpha/alpha.c:500
-#, c-format
-msgid "bad value %qs for -mmemory-latency"
+#: c-typeck.c:3069 c-typeck.c:3079
+#, gcc-internal-format
+msgid "pointer/integer type mismatch in conditional expression"
msgstr ""
-#: config/alpha/alpha.c:4804
-#, c-format
-msgid "invalid %%H value"
+#: c-typeck.c:3093
+#, gcc-internal-format
+msgid "type mismatch in conditional expression"
msgstr ""
-#: config/alpha/alpha.c:4825 config/bfin/bfin.c:1031
-#, c-format
-msgid "invalid %%J value"
+#: c-typeck.c:3136
+#, gcc-internal-format
+msgid "left-hand operand of comma expression has no effect"
msgstr ""
-#: config/alpha/alpha.c:4841 config/ia64/ia64.c:4134
-#, c-format
-msgid "invalid %%r value"
+#: c-typeck.c:3170
+#, gcc-internal-format
+msgid "cast specifies array type"
msgstr ""
-#: config/alpha/alpha.c:4851 config/rs6000/rs6000.c:9448
-#: config/xtensa/xtensa.c:1692
-#, c-format
-msgid "invalid %%R value"
+#: c-typeck.c:3176
+#, gcc-internal-format
+msgid "cast specifies function type"
msgstr ""
-#: config/alpha/alpha.c:4857 config/rs6000/rs6000.c:9367
-#: config/xtensa/xtensa.c:1659
-#, c-format
-msgid "invalid %%N value"
+#: c-typeck.c:3186
+#, gcc-internal-format
+msgid "ISO C forbids casting nonscalar to the same type"
msgstr ""
-#: config/alpha/alpha.c:4865 config/rs6000/rs6000.c:9395
-#, c-format
-msgid "invalid %%P value"
+#: c-typeck.c:3204
+#, gcc-internal-format
+msgid "ISO C forbids casts to union type"
msgstr ""
-#: config/alpha/alpha.c:4873
-#, c-format
-msgid "invalid %%h value"
+#: c-typeck.c:3213
+#, gcc-internal-format
+msgid "cast to union type from type not present in union"
msgstr ""
-#: config/alpha/alpha.c:4881 config/xtensa/xtensa.c:1685
-#, c-format
-msgid "invalid %%L value"
+#: c-typeck.c:3264
+#, gcc-internal-format
+msgid "cast adds new qualifiers to function type"
msgstr ""
-#: config/alpha/alpha.c:4920 config/rs6000/rs6000.c:9349
-#, c-format
-msgid "invalid %%m value"
+#. There are qualifiers present in IN_OTYPE that are not
+#. present in IN_TYPE.
+#: c-typeck.c:3269
+#, gcc-internal-format
+msgid "cast discards qualifiers from pointer target type"
msgstr ""
-#: config/alpha/alpha.c:4928 config/rs6000/rs6000.c:9357
-#, c-format
-msgid "invalid %%M value"
+#: c-typeck.c:3284
+#, gcc-internal-format
+msgid "cast increases required alignment of target type"
msgstr ""
-#: config/alpha/alpha.c:4972
-#, c-format
-msgid "invalid %%U value"
+#: c-typeck.c:3291
+#, gcc-internal-format
+msgid "cast from pointer to integer of different size"
msgstr ""
-#: config/alpha/alpha.c:4984 config/alpha/alpha.c:4998
-#: config/rs6000/rs6000.c:9456
-#, c-format
-msgid "invalid %%s value"
+#: c-typeck.c:3296
+#, gcc-internal-format
+msgid "cast from function call of type %qT to non-matching type %qT"
msgstr ""
-#: config/alpha/alpha.c:5021
-#, c-format
-msgid "invalid %%C value"
+#: c-typeck.c:3305
+#, gcc-internal-format
+msgid "cast to pointer from integer of different size"
msgstr ""
-#: config/alpha/alpha.c:5058 config/rs6000/rs6000.c:9187
-#: config/rs6000/rs6000.c:9206
-#, c-format
-msgid "invalid %%E value"
+#: c-typeck.c:3317
+#, gcc-internal-format
+msgid "type-punning to incomplete type might break strict-aliasing rules"
msgstr ""
-#: config/alpha/alpha.c:5083 config/alpha/alpha.c:5131
-msgid "unknown relocation unspec"
+#: c-typeck.c:3324
+#, gcc-internal-format
+msgid "dereferencing type-punned pointer will break strict-aliasing rules"
msgstr ""
-#: config/alpha/alpha.c:5092 config/rs6000/rs6000.c:9774
-#, c-format
-msgid "invalid %%xn code"
+#: c-typeck.c:3327
+#, gcc-internal-format
+msgid "dereferencing type-punned pointer might break strict-aliasing rules"
msgstr ""
-#: config/alpha/alpha.c:6091 config/alpha/alpha.c:6094 config/s390/s390.c:7595
-#: config/s390/s390.c:7598
-msgid "bad builtin fcode"
+#: c-typeck.c:3339
+#, gcc-internal-format
+msgid "ISO C forbids conversion of function pointer to object pointer type"
msgstr ""
-#: config/arc/arc.c:413
-#, c-format
-msgid "argument of %qs attribute is not a string constant"
+#: c-typeck.c:3348
+#, gcc-internal-format
+msgid "ISO C forbids conversion of object pointer to function pointer type"
msgstr ""
-#: config/arc/arc.c:420
-#, c-format
-msgid "argument of %qs attribute is not \"ilink1\" or \"ilink2\""
+#: c-typeck.c:3622
+#, gcc-internal-format
+msgid "cannot pass rvalue to reference parameter"
msgstr ""
-#: config/arc/arc.c:1758 config/m32r/m32r.c:1819
-#, c-format
-msgid "invalid operand to %%R code"
+#: c-typeck.c:3731 c-typeck.c:3852
+#, gcc-internal-format
+msgid ""
+"passing argument %d of %qE makes qualified function pointer from unqualified"
msgstr ""
-#: config/arc/arc.c:1790 config/m32r/m32r.c:1842
-#, c-format
-msgid "invalid operand to %%H/%%L code"
+#: c-typeck.c:3734 c-typeck.c:3855
+#, gcc-internal-format
+msgid "assignment makes qualified function pointer from unqualified"
msgstr ""
-#: config/arc/arc.c:1813 config/m32r/m32r.c:1913
-#, c-format
-msgid "invalid operand to %%U code"
+#: c-typeck.c:3737 c-typeck.c:3857
+#, gcc-internal-format
+msgid "initialization makes qualified function pointer from unqualified"
msgstr ""
-#: config/arc/arc.c:1824
-#, c-format
-msgid "invalid operand to %%V code"
+#: c-typeck.c:3740 c-typeck.c:3859
+#, gcc-internal-format
+msgid "return makes qualified function pointer from unqualified"
msgstr ""
-#. Unknown flag.
-#. Undocumented flag.
-#: config/arc/arc.c:1831 config/m32r/m32r.c:1940 config/sparc/sparc.c:7525
-msgid "invalid operand output code"
+#: c-typeck.c:3744 c-typeck.c:3819
+#, gcc-internal-format
+msgid "passing argument %d of %qE discards qualifiers from pointer target type"
msgstr ""
-#: config/arm/arm.c:794
-#, c-format
-msgid "switch -mcpu=%s conflicts with -march= switch"
+#: c-typeck.c:3746 c-typeck.c:3821
+#, gcc-internal-format
+msgid "assignment discards qualifiers from pointer target type"
msgstr ""
-#: config/arm/arm.c:804 config/rs6000/rs6000.c:1228 config/sparc/sparc.c:656
-#, c-format
-msgid "bad value (%s) for %s switch"
+#: c-typeck.c:3748 c-typeck.c:3823
+#, gcc-internal-format
+msgid "initialization discards qualifiers from pointer target type"
msgstr ""
-#: config/arm/arm.c:913
-msgid "target CPU does not support interworking"
+#: c-typeck.c:3750 c-typeck.c:3825
+#, gcc-internal-format
+msgid "return discards qualifiers from pointer target type"
msgstr ""
-#: config/arm/arm.c:919
-msgid "target CPU does not support THUMB instructions"
+#: c-typeck.c:3755
+#, gcc-internal-format
+msgid "ISO C prohibits argument conversion to union type"
msgstr ""
-#: config/arm/arm.c:933
+#: c-typeck.c:3799
+#, gcc-internal-format
msgid ""
-"enabling backtrace support is only meaningful when compiling for the Thumb"
+"ISO C forbids passing argument %d of %qE between function pointer and %<void "
+"*%>"
msgstr ""
-#: config/arm/arm.c:936
-msgid ""
-"enabling callee interworking support is only meaningful when compiling for "
-"the Thumb"
+#: c-typeck.c:3802
+#, gcc-internal-format
+msgid "ISO C forbids assignment between function pointer and %<void *%>"
msgstr ""
-#: config/arm/arm.c:939
-msgid ""
-"enabling caller interworking support is only meaningful when compiling for "
-"the Thumb"
+#: c-typeck.c:3804
+#, gcc-internal-format
+msgid "ISO C forbids initialization between function pointer and %<void *%>"
msgstr ""
-#: config/arm/arm.c:943
-msgid "-mapcs-stack-check incompatible with -mno-apcs-frame"
+#: c-typeck.c:3806
+#, gcc-internal-format
+msgid "ISO C forbids return between function pointer and %<void *%>"
msgstr ""
-#: config/arm/arm.c:951
-msgid "-fpic and -mapcs-reent are incompatible"
+#: c-typeck.c:3835
+#, gcc-internal-format
+msgid "pointer targets in passing argument %d of %qE differ in signedness"
msgstr ""
-#: config/arm/arm.c:954
-msgid "APCS reentrant code not supported. Ignored"
+#: c-typeck.c:3837
+#, gcc-internal-format
+msgid "pointer targets in assignment differ in signedness"
msgstr ""
-#: config/arm/arm.c:962
-msgid "-g with -mno-apcs-frame may not give sensible debugging"
+#: c-typeck.c:3839
+#, gcc-internal-format
+msgid "pointer targets in initialization differ in signedness"
msgstr ""
-#: config/arm/arm.c:970
-msgid "passing floating point arguments in fp regs not yet supported"
+#: c-typeck.c:3841
+#, gcc-internal-format
+msgid "pointer targets in return differ in signedness"
msgstr ""
-#: config/arm/arm.c:1012
-#, c-format
-msgid "invalid ABI option: -mabi=%s"
+#: c-typeck.c:3866
+#, gcc-internal-format
+msgid "passing argument %d of %qE from incompatible pointer type"
msgstr ""
-#: config/arm/arm.c:1018
-msgid "iwmmxt requires an AAPCS compatible ABI for proper operation"
+#: c-typeck.c:3868
+#, gcc-internal-format
+msgid "assignment from incompatible pointer type"
msgstr ""
-#: config/arm/arm.c:1021
-msgid "iwmmxt abi requires an iwmmxt capable cpu"
+#: c-typeck.c:3869
+#, gcc-internal-format
+msgid "initialization from incompatible pointer type"
msgstr ""
-#: config/arm/arm.c:1031
-#, c-format
-msgid "invalid floating point emulation option: -mfpe=%s"
+#: c-typeck.c:3871
+#, gcc-internal-format
+msgid "return from incompatible pointer type"
msgstr ""
-#: config/arm/arm.c:1048
-#, c-format
-msgid "invalid floating point option: -mfpu=%s"
+#: c-typeck.c:3893
+#, gcc-internal-format
+msgid "passing argument %d of %qE makes pointer from integer without a cast"
msgstr ""
-#: config/arm/arm.c:1089
-#, c-format
-msgid "invalid floating point abi: -mfloat-abi=%s"
+#: c-typeck.c:3895
+#, gcc-internal-format
+msgid "assignment makes pointer from integer without a cast"
msgstr ""
-#: config/arm/arm.c:1104
-msgid "-mfloat-abi=hard and VFP"
+#: c-typeck.c:3897
+#, gcc-internal-format
+msgid "initialization makes pointer from integer without a cast"
msgstr ""
-#: config/arm/arm.c:1130
-#, c-format
-msgid "structure size boundary can only be set to %s"
+#: c-typeck.c:3899
+#, gcc-internal-format
+msgid "return makes pointer from integer without a cast"
msgstr ""
-#: config/arm/arm.c:1139
-msgid "-mpic-register= is useless without -fpic"
+#: c-typeck.c:3906
+#, gcc-internal-format
+msgid "passing argument %d of %qE makes integer from pointer without a cast"
msgstr ""
-#: config/arm/arm.c:1146
-#, c-format
-msgid "unable to use '%s' for PIC register"
+#: c-typeck.c:3908
+#, gcc-internal-format
+msgid "assignment makes integer from pointer without a cast"
msgstr ""
-#: config/arm/arm.c:2663 config/arm/arm.c:2681 config/avr/avr.c:4699
-#: config/bfin/bfin.c:2544 config/c4x/c4x.c:4488 config/h8300/h8300.c:5267
-#: config/i386/i386.c:1714 config/i386/i386.c:1760 config/ip2k/ip2k.c:3182
-#: config/m68hc11/m68hc11.c:1162 config/m68k/m68k.c:288
-#: config/mcore/mcore.c:3062 config/ns32k/ns32k.c:1108
-#: config/rs6000/rs6000.c:15896 config/sh/sh.c:7188 config/sh/sh.c:7209
-#: config/sh/sh.c:7244 config/stormy16/stormy16.c:2296 config/v850/v850.c:2105
-#, c-format
-msgid "%qs attribute only applies to functions"
+#: c-typeck.c:3910
+#, gcc-internal-format
+msgid "initialization makes integer from pointer without a cast"
msgstr ""
-#: config/arm/arm.c:10516 config/arm/arm.c:10534
-msgid "predicated Thumb instruction"
+#: c-typeck.c:3912
+#, gcc-internal-format
+msgid "return makes integer from pointer without a cast"
msgstr ""
-#: config/arm/arm.c:10522
-msgid "predicated instruction in conditional sequence"
+#: c-typeck.c:3928
+#, gcc-internal-format
+msgid "incompatible types in assignment"
msgstr ""
-#: config/arm/arm.c:10630 config/arm/arm.c:10640 config/arm/arm.c:10650
-#: config/arm/arm.c:10676 config/arm/arm.c:10694 config/arm/arm.c:10729
-#: config/arm/arm.c:10748 config/arm/arm.c:10763 config/arm/arm.c:10789
-#: config/arm/arm.c:10796 config/arm/arm.c:10803
-#, c-format
-msgid "invalid operand for code '%c'"
+#: c-typeck.c:3931
+#, gcc-internal-format
+msgid "incompatible types in initialization"
msgstr ""
-#: config/arm/arm.c:10689
-msgid "instruction never exectued"
+#: c-typeck.c:3934
+#, gcc-internal-format
+msgid "incompatible types in return"
msgstr ""
-#: config/arm/arm.c:10814
-msgid "missing operand"
+#: c-typeck.c:4015
+#, gcc-internal-format
+msgid "traditional C rejects automatic aggregate initialization"
msgstr ""
-#: config/arm/arm.c:11580
-msgid "unable to compute real location of stacked parameter"
+#: c-typeck.c:4182 c-typeck.c:4197 c-typeck.c:4212
+#, gcc-internal-format
+msgid "(near initialization for %qs)"
msgstr ""
-#. @@@ better error message
-#: config/arm/arm.c:12213 config/arm/arm.c:12250
-msgid "selector must be an immediate"
+#: c-typeck.c:4740 cp/decl.c:4456
+#, gcc-internal-format
+msgid "opaque vector types cannot be initialized"
msgstr ""
-#. @@@ better error message
-#: config/arm/arm.c:12293 config/i386/i386.c:14550 config/i386/i386.c:14584
-msgid "mask must be an immediate"
+#: c-typeck.c:5370
+#, gcc-internal-format
+msgid "unknown field %qE specified in initializer"
msgstr ""
-#: config/arm/arm.c:12943
-msgid "no low registers available for popping high registers"
+#: c-typeck.c:6259
+#, gcc-internal-format
+msgid "traditional C rejects initialization of unions"
msgstr ""
-#: config/arm/arm.c:13161
-msgid "interrupt Service Routines cannot be coded in Thumb mode"
+#: c-typeck.c:6565
+#, gcc-internal-format
+msgid "jump into statement expression"
msgstr ""
-#: config/arm/pe.c:171 config/mcore/mcore.c:2928
-msgid "%Jinitialized variable '%D' is marked dllimport"
+#: c-typeck.c:6571
+#, gcc-internal-format
+msgid "jump into scope of identifier with variably modified type"
msgstr ""
-#: config/arm/pe.c:180
-msgid "%Jstatic variable '%D' is marked dllimport"
+#: c-typeck.c:6608
+#, gcc-internal-format
+msgid "ISO C forbids %<goto *expr;%>"
msgstr ""
-#: config/arm/arm.h:318
-msgid "Generate APCS conformant stack frames"
+#: c-typeck.c:6622 cp/typeck.c:6070
+#, gcc-internal-format
+msgid "function declared %<noreturn%> has a %<return%> statement"
msgstr ""
-#: config/arm/arm.h:321
-msgid "Store function names in object code"
+#: c-typeck.c:6629
+#, gcc-internal-format
+msgid "%<return%> with no value, in function returning non-void"
msgstr ""
-#: config/arm/arm.h:327
-msgid "Pass FP arguments in FP registers"
+#: c-typeck.c:6636
+#, gcc-internal-format
+msgid "%<return%> with a value, in function returning void"
msgstr ""
-#: config/arm/arm.h:330
-msgid "Generate re-entrant, PIC code"
+#: c-typeck.c:6693
+#, gcc-internal-format
+msgid "function returns address of local variable"
msgstr ""
-#: config/arm/arm.h:333
-msgid "Assume target CPU is configured as big endian"
+#: c-typeck.c:6764 cp/semantics.c:906
+#, gcc-internal-format
+msgid "switch quantity not an integer"
msgstr ""
-#: config/arm/arm.h:335
-msgid "Assume target CPU is configured as little endian"
+#: c-typeck.c:6775
+#, gcc-internal-format
+msgid "%<long%> switch expression not converted to %<int%> in ISO C"
msgstr ""
-#: config/arm/arm.h:337
-msgid "Assume big endian bytes, little endian words"
+#: c-typeck.c:6816
+#, gcc-internal-format
+msgid ""
+"case label in statement expression not containing enclosing switch statement"
msgstr ""
-#: config/arm/arm.h:339
-msgid "Support calls between Thumb and ARM instruction sets"
+#: c-typeck.c:6819
+#, gcc-internal-format
+msgid ""
+"%<default%> label in statement expression not containing enclosing switch "
+"statement"
msgstr ""
-#: config/arm/arm.h:342
-msgid "Generate a call to abort if a noreturn function returns"
+#: c-typeck.c:6825
+#, gcc-internal-format
+msgid ""
+"case label in scope of identifier with variably modified type not containing "
+"enclosing switch statement"
msgstr ""
-#: config/arm/arm.h:345
-msgid "Do not move instructions into a function's prologue"
+#: c-typeck.c:6828
+#, gcc-internal-format
+msgid ""
+"%<default%> label in scope of identifier with variably modified type not "
+"containing enclosing switch statement"
msgstr ""
-#: config/arm/arm.h:348
-msgid "Do not load the PIC register in function prologues"
+#: c-typeck.c:6832 cp/parser.c:6181
+#, gcc-internal-format
+msgid "case label not within a switch statement"
msgstr ""
-#: config/arm/arm.h:351
-msgid "Generate call insns as indirect calls, if necessary"
+#: c-typeck.c:6834
+#, gcc-internal-format
+msgid "%<default%> label not within a switch statement"
msgstr ""
-#: config/arm/arm.h:354
-msgid "Compile for the Thumb not the ARM"
+#: c-typeck.c:6910
+#, gcc-internal-format
+msgid "%Hsuggest explicit braces to avoid ambiguous %<else%>"
msgstr ""
-#: config/arm/arm.h:358
-msgid "Thumb: Generate (non-leaf) stack frames even if not needed"
+#: c-typeck.c:6920
+#, gcc-internal-format
+msgid "%Hempty body in an if-statement"
msgstr ""
-#: config/arm/arm.h:361
-msgid "Thumb: Generate (leaf) stack frames even if not needed"
+#: c-typeck.c:6928
+#, gcc-internal-format
+msgid "%Hempty body in an else-statement"
msgstr ""
-#: config/arm/arm.h:364
-msgid "Thumb: Assume non-static functions may be called from ARM code"
+#: c-typeck.c:7037 cp/cp-gimplify.c:118 cp/parser.c:6673
+#, gcc-internal-format
+msgid "break statement not within loop or switch"
msgstr ""
-#: config/arm/arm.h:368
-msgid "Thumb: Assume function pointers may go to non-Thumb aware code"
+#: c-typeck.c:7039 cp/parser.c:6684
+#, gcc-internal-format
+msgid "continue statement not within a loop"
msgstr ""
-#: config/arm/arm.h:372
-msgid "Cirrus: Place NOPs to avoid invalid instruction combinations"
+#: c-typeck.c:7059
+#, gcc-internal-format
+msgid "%Hstatement with no effect"
msgstr ""
-#: config/arm/arm.h:374
-msgid "Cirrus: Do not break up invalid instruction combinations with NOPs"
+#: c-typeck.c:7088
+#, gcc-internal-format
+msgid "expression statement has incomplete type"
msgstr ""
-#: config/arm/arm.h:382
-msgid "Specify the name of the target CPU"
+#: c-typeck.c:7532 c-typeck.c:7571
+#, gcc-internal-format
+msgid "division by zero"
msgstr ""
-#: config/arm/arm.h:384
-msgid "Specify the name of the target architecture"
+#: c-typeck.c:7616 cp/typeck.c:2948
+#, gcc-internal-format
+msgid "right shift count is negative"
msgstr ""
-#: config/arm/arm.h:389
-msgid "Specify the name of the target floating point hardware/format"
+#: c-typeck.c:7623 cp/typeck.c:2954
+#, gcc-internal-format
+msgid "right shift count >= width of type"
msgstr ""
-#: config/arm/arm.h:391
-msgid "Specify if floating point hardware should be used"
+#: c-typeck.c:7644 cp/typeck.c:2973
+#, gcc-internal-format
+msgid "left shift count is negative"
msgstr ""
-#: config/arm/arm.h:393
-msgid "Specify the minimum bit alignment of structures"
+#: c-typeck.c:7647 cp/typeck.c:2975
+#, gcc-internal-format
+msgid "left shift count >= width of type"
msgstr ""
-#: config/arm/arm.h:395
-msgid "Specify the register to be used for PIC addressing"
+#: c-typeck.c:7665 cp/typeck.c:3010
+#, gcc-internal-format
+msgid "comparing floating point with == or != is unsafe"
msgstr ""
-#: config/arm/arm.h:396
-msgid "Specify an ABI"
+#: c-typeck.c:7689 c-typeck.c:7696
+#, gcc-internal-format
+msgid "ISO C forbids comparison of %<void *%> with function pointer"
msgstr ""
-#: config/arm/arm.h:398
-msgid "Alias for -mfloat-abi=soft"
+#: c-typeck.c:7702 c-typeck.c:7748
+#, gcc-internal-format
+msgid "comparison of distinct pointer types lacks a cast"
msgstr ""
-#: config/arm/arm.h:400
-msgid "Alias for -mfloat-abi=hard"
+#: c-typeck.c:7716 c-typeck.c:7721 c-typeck.c:7768 c-typeck.c:7773
+#, gcc-internal-format
+msgid "comparison between pointer and integer"
msgstr ""
-#: config/arm/pe.h:59
-msgid "Ignore dllimport attribute for functions"
+#: c-typeck.c:7740
+#, gcc-internal-format
+msgid "comparison of complete and incomplete pointers"
msgstr ""
-#: config/avr/avr.c:555
-#, c-format
-msgid "large frame pointer change (%d) with -mtiny-stack"
+#: c-typeck.c:7743
+#, gcc-internal-format
+msgid "ISO C forbids ordered comparisons of pointers to functions"
msgstr ""
-#: config/avr/avr.c:1140
-msgid "bad address, not (reg+disp):"
+#: c-typeck.c:7756 c-typeck.c:7763
+#, gcc-internal-format
+msgid "ordered comparison of pointer with integer zero"
msgstr ""
-#: config/avr/avr.c:1147
-msgid "bad address, not post_inc or pre_dec:"
+#: c-typeck.c:7984
+#, gcc-internal-format
+msgid "comparison between signed and unsigned"
msgstr ""
-#: config/avr/avr.c:1158
-msgid "internal compiler error. Bad address:"
+#: c-typeck.c:8030 cp/typeck.c:3417
+#, gcc-internal-format
+msgid "comparison of promoted ~unsigned with constant"
msgstr ""
-#: config/avr/avr.c:1171
-msgid "internal compiler error. Unknown mode:"
+#: c-typeck.c:8038 cp/typeck.c:3425
+#, gcc-internal-format
+msgid "comparison of promoted ~unsigned with unsigned"
msgstr ""
-#: config/avr/avr.c:1794 config/avr/avr.c:2477
-msgid "invalid insn:"
+#: c-typeck.c:8096
+#, gcc-internal-format
+msgid "used array that cannot be converted to pointer where scalar is required"
msgstr ""
-#: config/avr/avr.c:1828 config/avr/avr.c:1914 config/avr/avr.c:1963
-#: config/avr/avr.c:1991 config/avr/avr.c:2086 config/avr/avr.c:2255
-#: config/avr/avr.c:2511 config/avr/avr.c:2623
-msgid "incorrect insn:"
+#: c-typeck.c:8100
+#, gcc-internal-format
+msgid "used struct type value where scalar is required"
msgstr ""
-#: config/avr/avr.c:2010 config/avr/avr.c:2171 config/avr/avr.c:2326
-#: config/avr/avr.c:2689
-msgid "unknown move insn:"
+#: c-typeck.c:8104
+#, gcc-internal-format
+msgid "used union type value where scalar is required"
msgstr ""
-#: config/avr/avr.c:2919
-msgid "bad shift insn:"
+#: calls.c:1914
+#, gcc-internal-format
+msgid "function call has aggregate value"
msgstr ""
-#: config/avr/avr.c:3035 config/avr/avr.c:3483 config/avr/avr.c:3869
-msgid "internal compiler error. Incorrect shift:"
+#: cfghooks.c:90
+#, gcc-internal-format
+msgid "bb %d on wrong place"
msgstr ""
-#: config/avr/avr.c:4673 config/ip2k/ip2k.c:3157
-msgid "only initialized variables can be placed into program memory area"
+#: cfghooks.c:96
+#, gcc-internal-format
+msgid "prev_bb of %d should be %d, not %d"
msgstr ""
-#: config/avr/avr.c:4716
-#, c-format
-msgid "`%s' appears to be a misspelled interrupt handler"
+#: cfghooks.c:113
+#, gcc-internal-format
+msgid "verify_flow_info: Wrong count of block %i %i"
msgstr ""
-#: config/avr/avr.c:4724
-#, c-format
-msgid "`%s' appears to be a misspelled signal handler"
+#: cfghooks.c:119
+#, gcc-internal-format
+msgid "verify_flow_info: Wrong frequency of block %i %i"
msgstr ""
-#: config/avr/avr.c:4793
-msgid "only uninitialized variables can be placed in the .noinit section"
+#: cfghooks.c:127
+#, gcc-internal-format
+msgid "verify_flow_info: Duplicate edge %i->%i"
msgstr ""
-#: config/avr/avr.c:4807
-#, c-format
-msgid "MCU %qs supported for assembler only"
+#: cfghooks.c:133
+#, gcc-internal-format
+msgid "verify_flow_info: Wrong probability of edge %i->%i %i"
msgstr ""
-#: config/avr/avr.h:715
-msgid "trampolines not supported"
+#: cfghooks.c:139
+#, gcc-internal-format
+msgid "verify_flow_info: Wrong count of edge %i->%i %i"
msgstr ""
-#: config/bfin/bfin.c:993
-#, c-format
-msgid "invalid %%j value"
+#: cfghooks.c:151
+#, gcc-internal-format
+msgid "verify_flow_info: Basic block %d succ edge is corrupted"
msgstr ""
-#: config/bfin/bfin.c:1113
-msgid "invalid const_double operand"
+#: cfghooks.c:165 cfgrtl.c:2021
+#, gcc-internal-format
+msgid "Wrong amount of branch edges after unconditional jump %i"
msgstr ""
-#: config/bfin/bfin.c:1728 config/m68k/m68k.c:216
-msgid "-mshared-library-id= specified without -mid-shared-library"
+#: cfghooks.c:173 cfghooks.c:184
+#, gcc-internal-format
+msgid "basic block %d pred edge is corrupted"
msgstr ""
-#: config/bfin/bfin.c:1731 config/m68k/m68k.c:219
-#, c-format
-msgid "-mshared-library-id=%d is not between 0 and %d"
+#: cfghooks.c:185
+#, gcc-internal-format
+msgid "its dest_idx should be %d, not %d"
msgstr ""
-#: config/bfin/bfin.c:2549
-msgid "multiple function type attributes specified"
+#: cfghooks.c:214
+#, gcc-internal-format
+msgid "basic block %i edge lists are corrupted"
msgstr ""
-#: config/c4x/c4x-c.c:71
-#, c-format
-msgid "missing '(' after '#pragma %s' - ignored"
+#: cfghooks.c:227
+#, gcc-internal-format
+msgid "verify_flow_info failed"
msgstr ""
-#: config/c4x/c4x-c.c:74
-#, c-format
-msgid "missing function name in '#pragma %s' - ignored"
+#: cfghooks.c:288
+#, gcc-internal-format
+msgid "%s does not support redirect_edge_and_branch."
msgstr ""
-#: config/c4x/c4x-c.c:79
-#, c-format
-msgid "malformed '#pragma %s' - ignored"
+#: cfghooks.c:306
+#, gcc-internal-format
+msgid "%s does not support redirect_edge_and_branch_force."
msgstr ""
-#: config/c4x/c4x-c.c:81
-#, c-format
-msgid "missing section name in '#pragma %s' - ignored"
+#: cfghooks.c:324
+#, gcc-internal-format
+msgid "%s does not support split_block."
msgstr ""
-#: config/c4x/c4x-c.c:86
-#, c-format
-msgid "missing ')' for '#pragma %s' - ignored"
+#: cfghooks.c:360
+#, gcc-internal-format
+msgid "%s does not support move_block_after."
msgstr ""
-#: config/c4x/c4x-c.c:89
-#, c-format
-msgid "junk at end of '#pragma %s'"
+#: cfghooks.c:373
+#, gcc-internal-format
+msgid "%s does not support delete_basic_block."
msgstr ""
-#: config/c4x/c4x.c:871
-#, c-format
-msgid "ISR %s requires %d words of local vars, max is 32767"
+#: cfghooks.c:405
+#, gcc-internal-format
+msgid "%s does not support split_edge."
msgstr ""
-#: config/c4x/c4x.c:1595
-msgid "using CONST_DOUBLE for address"
+#: cfghooks.c:466
+#, gcc-internal-format
+msgid "%s does not support create_basic_block."
msgstr ""
-#: config/c4x/c4x.c:1733
-msgid "c4x_address_cost: Invalid addressing mode"
+#: cfghooks.c:494
+#, gcc-internal-format
+msgid "%s does not support can_merge_blocks_p."
msgstr ""
-#: config/c4x/c4x.c:1868
-#, c-format
-msgid "c4x_print_operand: %%L inconsistency"
+#: cfghooks.c:505
+#, gcc-internal-format
+msgid "%s does not support predict_edge."
msgstr ""
-#: config/c4x/c4x.c:1874
-#, c-format
-msgid "c4x_print_operand: %%N inconsistency"
+#: cfghooks.c:514
+#, gcc-internal-format
+msgid "%s does not support predicted_by_p."
msgstr ""
-#: config/c4x/c4x.c:1915
-#, c-format
-msgid "c4x_print_operand: %%O inconsistency"
+#: cfghooks.c:528
+#, gcc-internal-format
+msgid "%s does not support merge_blocks."
msgstr ""
-#: config/c4x/c4x.c:2010
-msgid "c4x_print_operand: Bad operand case"
+#: cfghooks.c:574
+#, gcc-internal-format
+msgid "%s does not support make_forwarder_block."
msgstr ""
-#: config/c4x/c4x.c:2051
-msgid "c4x_print_operand_address: Bad post_modify"
+#: cfghooks.c:679
+#, gcc-internal-format
+msgid "%s does not support can_duplicate_block_p."
msgstr ""
-#: config/c4x/c4x.c:2073
-msgid "c4x_print_operand_address: Bad pre_modify"
+#: cfghooks.c:706
+#, gcc-internal-format
+msgid "%s does not support duplicate_block."
msgstr ""
-#: config/c4x/c4x.c:2121 config/c4x/c4x.c:2133 config/c4x/c4x.c:2148
-msgid "c4x_print_operand_address: Bad operand case"
+#: cfghooks.c:772
+#, gcc-internal-format
+msgid "%s does not support block_ends_with_call_p"
msgstr ""
-#: config/c4x/c4x.c:2399
-msgid "c4x_rptb_insert: Cannot find start label"
+#: cfghooks.c:783
+#, gcc-internal-format
+msgid "%s does not support block_ends_with_condjump_p"
msgstr ""
-#: config/c4x/c4x.c:3314 config/c4x/c4x.c:3332
-msgid "mode not QImode"
+#: cfghooks.c:801
+#, gcc-internal-format
+msgid "%s does not support flow_call_edges_add"
msgstr ""
-#: config/c4x/c4x.c:3402
-msgid "invalid indirect memory address"
+#: cfgloop.c:1088
+#, gcc-internal-format
+msgid "Size of loop %d should be %d, not %d."
msgstr ""
-#: config/c4x/c4x.c:3491
-msgid "invalid indirect (S) memory address"
+#: cfgloop.c:1105
+#, gcc-internal-format
+msgid "Bb %d do not belong to loop %d."
msgstr ""
-#: config/c4x/c4x.c:3826
-msgid "c4x_valid_operands: Internal error"
+#: cfgloop.c:1122
+#, gcc-internal-format
+msgid "Loop %d's header does not have exactly 2 entries."
msgstr ""
-#: config/c4x/c4x.c:4265
-msgid "c4x_operand_subword: invalid mode"
+#: cfgloop.c:1129
+#, gcc-internal-format
+msgid "Loop %d's latch does not have exactly 1 successor."
msgstr ""
-#: config/c4x/c4x.c:4268
-msgid "c4x_operand_subword: invalid operand"
+#: cfgloop.c:1134
+#, gcc-internal-format
+msgid "Loop %d's latch does not have header as successor."
msgstr ""
-#. We could handle these with some difficulty.
-#. e.g., *p-- => *(p-=2); *(p+1).
-#: config/c4x/c4x.c:4294
-msgid "c4x_operand_subword: invalid autoincrement"
+#: cfgloop.c:1139
+#, gcc-internal-format
+msgid "Loop %d's latch does not belong directly to it."
msgstr ""
-#: config/c4x/c4x.c:4300
-msgid "c4x_operand_subword: invalid address"
+#: cfgloop.c:1145
+#, gcc-internal-format
+msgid "Loop %d's header does not belong directly to it."
msgstr ""
-#: config/c4x/c4x.c:4311
-msgid "c4x_operand_subword: address not offsettable"
+#: cfgloop.c:1151
+#, gcc-internal-format
+msgid "Loop %d's latch is marked as part of irreducible region."
msgstr ""
-#: config/c4x/c4x.c:4513
-msgid "c4x_rptb_rpts_p: Repeat block top label moved\n"
+#: cfgloop.c:1184
+#, gcc-internal-format
+msgid "Basic block %d should be marked irreducible."
msgstr ""
-#: config/cris/cris.c:722
-msgid "unexpected index-type in cris_print_index"
+#: cfgloop.c:1190
+#, gcc-internal-format
+msgid "Basic block %d should not be marked irreducible."
msgstr ""
-#: config/cris/cris.c:736
-msgid "unexpected base-type in cris_print_base"
+#: cfgloop.c:1198
+#, gcc-internal-format
+msgid "Edge from %d to %d should be marked irreducible."
msgstr ""
-#: config/cris/cris.c:1049
-#, c-format
-msgid "stackframe too big: %d bytes"
+#: cfgloop.c:1205
+#, gcc-internal-format
+msgid "Edge from %d to %d should not be marked irreducible."
msgstr ""
-#: config/cris/cris.c:1126
-msgid "invalid operand for 'b' modifier"
+#: cfgloop.c:1240
+#, gcc-internal-format
+msgid "Wrong single exit %d->%d recorded for loop %d."
msgstr ""
-#: config/cris/cris.c:1139
-msgid "invalid operand for 'v' modifier"
+#: cfgloop.c:1244
+#, gcc-internal-format
+msgid "Right exit is %d->%d."
msgstr ""
-#: config/cris/cris.c:1152
-msgid "invalid operand for 'o' modifier"
+#: cfgloop.c:1261
+#, gcc-internal-format
+msgid "Single exit not recorded for loop %d."
msgstr ""
-#: config/cris/cris.c:1171
-msgid "invalid operand for 'O' modifier"
+#: cfgloop.c:1268
+#, gcc-internal-format
+msgid "Loop %d should not have single exit (%d -> %d)."
msgstr ""
-#: config/cris/cris.c:1192
-msgid "invalid operand for 'P' modifier"
+#: cfgrtl.c:1913
+#, gcc-internal-format
+msgid "end insn %d for block %d not found in the insn stream"
msgstr ""
-#: config/cris/cris.c:1199
-msgid "invalid operand for 'p' modifier"
+#: cfgrtl.c:1927
+#, gcc-internal-format
+msgid "insn %d is in multiple basic blocks (%d and %d)"
msgstr ""
-#: config/cris/cris.c:1238
-msgid "invalid operand for 'z' modifier"
+#: cfgrtl.c:1939
+#, gcc-internal-format
+msgid "head insn %d for block %d not found in the insn stream"
msgstr ""
-#: config/cris/cris.c:1286 config/cris/cris.c:1316
-msgid "invalid operand for 'H' modifier"
+#: cfgrtl.c:1963
+#, gcc-internal-format
+msgid "verify_flow_info: REG_BR_PROB does not match cfg %wi %i"
msgstr ""
-#: config/cris/cris.c:1292
-msgid "bad register"
+#: cfgrtl.c:1978
+#, gcc-internal-format
+msgid "Fallthru edge crosses section boundary (bb %i)"
msgstr ""
-#: config/cris/cris.c:1330
-msgid "invalid operand for 'e' modifier"
+#: cfgrtl.c:2003
+#, gcc-internal-format
+msgid "Missing REG_EH_REGION note in the end of bb %i"
msgstr ""
-#: config/cris/cris.c:1347
-msgid "invalid operand for 'm' modifier"
+#: cfgrtl.c:2011
+#, gcc-internal-format
+msgid "Too many outgoing branch edges from bb %i"
msgstr ""
-#: config/cris/cris.c:1372
-msgid "invalid operand for 'A' modifier"
+#: cfgrtl.c:2016
+#, gcc-internal-format
+msgid "Fallthru edge after unconditional jump %i"
msgstr ""
-#: config/cris/cris.c:1390
-msgid "invalid operand for 'D' modifier"
+#: cfgrtl.c:2027
+#, gcc-internal-format
+msgid "Wrong amount of branch edges after conditional jump %i"
msgstr ""
-#: config/cris/cris.c:1404
-msgid "invalid operand for 'T' modifier"
+#: cfgrtl.c:2032
+#, gcc-internal-format
+msgid "Call edges for non-call insn in bb %i"
msgstr ""
-#: config/cris/cris.c:1413
-msgid "invalid operand modifier letter"
+#: cfgrtl.c:2041
+#, gcc-internal-format
+msgid "Abnormal edges for no purpose in bb %i"
msgstr ""
-#: config/cris/cris.c:1423
-#, c-format
-msgid "internal error: bad register: %d"
+#: cfgrtl.c:2053
+#, gcc-internal-format
+msgid "insn %d inside basic block %d but block_for_insn is NULL"
msgstr ""
-#: config/cris/cris.c:1471
-msgid "unexpected multiplicative operand"
+#: cfgrtl.c:2057
+#, gcc-internal-format
+msgid "insn %d inside basic block %d but block_for_insn is %i"
msgstr ""
-#: config/cris/cris.c:1491
-msgid "unexpected operand"
+#: cfgrtl.c:2071 cfgrtl.c:2081
+#, gcc-internal-format
+msgid "NOTE_INSN_BASIC_BLOCK is missing for block %d"
msgstr ""
-#: config/cris/cris.c:1524 config/cris/cris.c:1534
-msgid "unrecognized address"
+#: cfgrtl.c:2094
+#, gcc-internal-format
+msgid "NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d"
msgstr ""
-#: config/cris/cris.c:1883
-msgid "internal error: sideeffect-insn affecting main effect"
+#: cfgrtl.c:2104
+#, gcc-internal-format
+msgid "in basic block %d:"
msgstr ""
-#. If we get here, the caller got its initial tests wrong.
-#: config/cris/cris.c:2267
-msgid "internal error: cris_side_effect_mode_ok with bad operands"
+#: cfgrtl.c:2141
+#, gcc-internal-format
+msgid "bb prediction set for block %i, but it is not used in RTL land"
msgstr ""
-#: config/cris/cris.c:2344 config/cris/cris.c:2405
-msgid "unrecognized supposed constant"
+#: cfgrtl.c:2159
+#, gcc-internal-format
+msgid "missing barrier after block %i"
msgstr ""
-#: config/cris/cris.c:2449
-msgid "unrecognized supposed constant in cris_global_pic_symbol"
+#: cfgrtl.c:2172
+#, gcc-internal-format
+msgid "verify_flow_info: Incorrect blocks for fallthru %i->%i"
msgstr ""
-#: config/cris/cris.c:2468
-#, c-format
-msgid "-max-stackframe=%d is not usable, not between 0 and %d"
+#: cfgrtl.c:2181
+#, gcc-internal-format
+msgid "verify_flow_info: Incorrect fallthru %i->%i"
msgstr ""
-#: config/cris/cris.c:2496
-#, c-format
-msgid "unknown CRIS version specification in -march= or -mcpu= : %s"
+#: cfgrtl.c:2200
+#, gcc-internal-format
+msgid "basic blocks not laid down consecutively"
msgstr ""
-#: config/cris/cris.c:2532
-#, c-format
-msgid "unknown CRIS cpu version specification in -mtune= : %s"
+#: cfgrtl.c:2239
+#, gcc-internal-format
+msgid "number of bb notes in insn chain (%d) != n_basic_blocks (%d)"
msgstr ""
-#: config/cris/cris.c:2550
-msgid "-fPIC and -fpic are not supported in this configuration"
+#: cgraph.c:761
+#, gcc-internal-format
+msgid "%D renamed after being referenced in assembly"
msgstr ""
-#: config/cris/cris.c:2565
-msgid "that particular -g option is invalid with -maout and -melinux"
+#: cgraphunit.c:587
+#, gcc-internal-format
+msgid "Aux field set for edge %s->%s"
msgstr ""
-#: config/cris/cris.c:2740 config/cris/cris.c:2785
-msgid "unexpected side-effects in address"
+#: cgraphunit.c:599
+#, gcc-internal-format
+msgid "Inlined_to pointer is wrong"
msgstr ""
-#: config/cris/cris.c:3087
-msgid "unexpected PIC symbol"
+#: cgraphunit.c:604
+#, gcc-internal-format
+msgid "Multiple inline callers"
msgstr ""
-#: config/cris/cris.c:3091
-msgid "PIC register isn't set up"
+#: cgraphunit.c:611
+#, gcc-internal-format
+msgid "Inlined_to pointer set for noninline callers"
msgstr ""
-#: config/cris/cris.c:3112
-msgid "emitting PIC operand, but PIC register isn't set up"
+#: cgraphunit.c:617
+#, gcc-internal-format
+msgid "Inlined_to pointer is set but no predecesors found"
msgstr ""
-#: config/cris/aout.h:85
-msgid "Compile for the MMU-less Etrax 100-based elinux system"
+#: cgraphunit.c:622
+#, gcc-internal-format
+msgid "Inlined_to pointer refers to itself"
msgstr ""
-#: config/cris/aout.h:92
-msgid "For elinux, request a specified stack-size for this program"
+#: cgraphunit.c:632
+#, gcc-internal-format
+msgid "Node not found in DECL_ASSEMBLER_NAME hash"
msgstr ""
-#: config/cris/cris.h:352
-msgid "Work around bug in multiplication instruction"
+#: cgraphunit.c:660
+#, gcc-internal-format
+msgid "Shared call_stmt:"
msgstr ""
-#. No "no-etrax" as it does not really imply any model. On the other hand, "etrax" implies the common (and large) subset matching all models.
-#: config/cris/cris.h:358
-msgid "Compile for ETRAX 4 (CRIS v3)"
+#: cgraphunit.c:666
+#, gcc-internal-format
+msgid "Edge points to wrong declaration:"
msgstr ""
-#: config/cris/cris.h:363
-msgid "Compile for ETRAX 100 (CRIS v8)"
+#: cgraphunit.c:675
+#, gcc-internal-format
+msgid "Missing callgraph edge for call stmt:"
msgstr ""
-#: config/cris/cris.h:367
-msgid "Emit verbose debug information in assembly code"
+#: cgraphunit.c:692
+#, gcc-internal-format
+msgid "Edge %s->%s has no corresponding call_stmt"
msgstr ""
-#: config/cris/cris.h:370
-msgid "Do not use condition codes from normal instructions"
+#: cgraphunit.c:704
+#, gcc-internal-format
+msgid "verify_cgraph_node failed."
msgstr ""
-#: config/cris/cris.h:374
-msgid "Do not emit addressing modes with side-effect assignment"
+#: cgraphunit.c:940
+#, gcc-internal-format
+msgid "failed to reclaim unneeded function"
msgstr ""
-#: config/cris/cris.h:377
-msgid "Do not tune stack alignment"
+#: cgraphunit.c:1197
+#, gcc-internal-format
+msgid "Nodes with no released memory found."
msgstr ""
-#: config/cris/cris.h:380
-msgid "Do not tune writable data alignment"
+#: collect2.c:1192
+#, gcc-internal-format
+msgid "unknown demangling style '%s'"
msgstr ""
-#: config/cris/cris.h:383
-msgid "Do not tune code and read-only data alignment"
+#: collect2.c:1515
+#, gcc-internal-format
+msgid "%s terminated with signal %d [%s]%s"
msgstr ""
-#: config/cris/cris.h:392
-msgid "Align code and data to 32 bits"
+#: collect2.c:1533
+#, gcc-internal-format
+msgid "%s returned %d exit status"
msgstr ""
-#: config/cris/cris.h:405
-msgid "Don't align items in code or data"
+#: collect2.c:2195
+#, gcc-internal-format
+msgid "cannot find 'ldd'"
msgstr ""
-#: config/cris/cris.h:408
-msgid "Do not emit function prologue or epilogue"
+#: convert.c:65
+#, gcc-internal-format
+msgid "cannot convert to a pointer type"
msgstr ""
-#. We have to handle this m-option here since we can't wash it off in both CC1_SPEC and CC1PLUS_SPEC.
-#: config/cris/cris.h:412
-msgid "Use the most feature-enabling options allowed by other options"
+#: convert.c:298
+#, gcc-internal-format
+msgid "pointer value used where a floating point value was expected"
msgstr ""
-#. We must call it "override-" since calling it "no-" will cause gcc.c to forget it, if there's a "later" -mbest-lib-options. Kludgy, but needed for some multilibbed files.
-#: config/cris/cris.h:418
-msgid "Override -mbest-lib-options"
+#: convert.c:302
+#, gcc-internal-format
+msgid "aggregate value used where a float was expected"
msgstr ""
-#: config/cris/cris.h:450
-msgid "Generate code for the specified chip or CPU version"
+#: convert.c:327
+#, gcc-internal-format
+msgid "conversion to incomplete type"
msgstr ""
-#: config/cris/cris.h:452
-msgid "Tune alignment for the specified chip or CPU version"
+#: convert.c:684 convert.c:760
+#, gcc-internal-format
+msgid "can't convert between vector values of different size"
msgstr ""
-#: config/cris/cris.h:454
-msgid "Warn when a stackframe is larger than the specified size"
+#: convert.c:690
+#, gcc-internal-format
+msgid "aggregate value used where an integer was expected"
msgstr ""
-#. Node: Caller Saves
-#. (no definitions)
-#. Node: Function entry
-#. See cris.c for TARGET_ASM_FUNCTION_PROLOGUE and
-#. TARGET_ASM_FUNCTION_EPILOGUE.
-#. Node: Profiling
-#: config/cris/cris.h:1040
-msgid "no FUNCTION_PROFILER for CRIS"
+#: convert.c:740
+#, gcc-internal-format
+msgid "pointer value used where a complex was expected"
msgstr ""
-#: config/cris/linux.h:69
-msgid "Together with -fpic and -fPIC, do not use GOTPLT references"
+#: convert.c:744
+#, gcc-internal-format
+msgid "aggregate value used where a complex was expected"
msgstr ""
-#: config/fr30/fr30.c:468
-msgid "fr30_print_operand_address: unhandled address"
+#: convert.c:766
+#, gcc-internal-format
+msgid "can't convert value to a vector"
msgstr ""
-#: config/fr30/fr30.c:492
-#, c-format
-msgid "fr30_print_operand: unrecognized %%p code"
+#: coverage.c:183
+#, gcc-internal-format
+msgid "%qs is not a gcov data file"
msgstr ""
-#: config/fr30/fr30.c:512
-#, c-format
-msgid "fr30_print_operand: unrecognized %%b code"
+#: coverage.c:194
+#, gcc-internal-format
+msgid "%qs is version %q.*s, expected version %q.*s"
msgstr ""
-#: config/fr30/fr30.c:533
-#, c-format
-msgid "fr30_print_operand: unrecognized %%B code"
+#: coverage.c:274 coverage.c:282
+#, gcc-internal-format
+msgid "coverage mismatch for function %u while reading execution counters."
msgstr ""
-#: config/fr30/fr30.c:541
-#, c-format
-msgid "fr30_print_operand: invalid operand to %%A code"
+#: coverage.c:276 coverage.c:359
+#, gcc-internal-format
+msgid "checksum is %x instead of %x"
msgstr ""
-#: config/fr30/fr30.c:558
-#, c-format
-msgid "fr30_print_operand: invalid %%x code"
+#: coverage.c:284 coverage.c:367
+#, gcc-internal-format
+msgid "number of counters is %d instead of %d"
msgstr ""
-#: config/fr30/fr30.c:565
-#, c-format
-msgid "fr30_print_operand: invalid %%F code"
+#: coverage.c:290
+#, gcc-internal-format
+msgid "cannot merge separate %s counters for function %u"
msgstr ""
-#: config/fr30/fr30.c:582
-msgid "fr30_print_operand: unknown code"
+#: coverage.c:311
+#, gcc-internal-format
+msgid "%qs has overflowed"
msgstr ""
-#: config/fr30/fr30.c:611 config/fr30/fr30.c:620 config/fr30/fr30.c:631
-#: config/fr30/fr30.c:644
-msgid "fr30_print_operand: unhandled MEM"
+#: coverage.c:311
+#, gcc-internal-format
+msgid "%qs is corrupted"
msgstr ""
-#: config/frv/frv.c:2509
-msgid "Bad insn to frv_print_operand_address:"
+#: coverage.c:348
+#, gcc-internal-format
+msgid "no coverage for function %qs found."
msgstr ""
-#: config/frv/frv.c:2520
-msgid "Bad register to frv_print_operand_memory_reference_reg:"
+#: coverage.c:356 coverage.c:364
+#, gcc-internal-format
+msgid "coverage mismatch for function %qs while reading counter %qs."
msgstr ""
-#: config/frv/frv.c:2559 config/frv/frv.c:2569 config/frv/frv.c:2578
-#: config/frv/frv.c:2599 config/frv/frv.c:2604
-msgid "Bad insn to frv_print_operand_memory_reference:"
+#: coverage.c:549
+#, gcc-internal-format
+msgid "cannot open %s"
msgstr ""
-#: config/frv/frv.c:2691
-msgid "bad condition code"
+#: coverage.c:584
+#, gcc-internal-format
+msgid "error writing %qs"
msgstr ""
-#: config/frv/frv.c:2766
-msgid "Bad insn in frv_print_operand, bad const_double"
+#: diagnostic.c:588
+#, gcc-internal-format
+msgid "in %s, at %s:%d"
msgstr ""
-#: config/frv/frv.c:2827
-msgid "Bad insn to frv_print_operand, 'e' modifier:"
+#: dominance.c:855
+#, gcc-internal-format
+msgid "dominator of %d status unknown"
msgstr ""
-#: config/frv/frv.c:2835
-msgid "Bad insn to frv_print_operand, 'F' modifier:"
+#: dominance.c:857
+#, gcc-internal-format
+msgid "dominator of %d should be %d, not %d"
msgstr ""
-#: config/frv/frv.c:2851
-msgid "Bad insn to frv_print_operand, 'f' modifier:"
+#: dominance.c:869
+#, gcc-internal-format
+msgid "ENTRY does not dominate bb %d"
msgstr ""
-#: config/frv/frv.c:2865
-msgid "Bad insn to frv_print_operand, 'g' modifier:"
+#: dwarf2out.c:3471
+#, gcc-internal-format
+msgid "DW_LOC_OP %s not implemented\n"
msgstr ""
-#: config/frv/frv.c:2913
-msgid "Bad insn to frv_print_operand, 'L' modifier:"
+#: emit-rtl.c:2201
+#, gcc-internal-format
+msgid "Invalid rtl sharing found in the insn"
msgstr ""
-#: config/frv/frv.c:2926
-msgid "Bad insn to frv_print_operand, 'M/N' modifier:"
+#: emit-rtl.c:2203
+#, gcc-internal-format
+msgid "Shared rtx"
msgstr ""
-#: config/frv/frv.c:2947
-msgid "Bad insn to frv_print_operand, 'O' modifier:"
+#: emit-rtl.c:2205
+#, gcc-internal-format
+msgid "Internal consistency failure"
msgstr ""
-#: config/frv/frv.c:2965
-msgid "Bad insn to frv_print_operand, P modifier:"
+#: emit-rtl.c:3269
+#, gcc-internal-format
+msgid "ICE: emit_insn used where emit_jump_insn needed:\n"
msgstr ""
-#: config/frv/frv.c:2985
-msgid "Bad insn in frv_print_operand, z case"
+#: errors.c:133 java/jv-scan.c:289
+#, gcc-internal-format
+msgid "abort in %s, at %s:%d"
msgstr ""
-#: config/frv/frv.c:3016
-msgid "Bad insn in frv_print_operand, 0 case"
+#: except.c:331
+#, gcc-internal-format
+msgid "exception handling disabled, use -fexceptions to enable"
msgstr ""
-#: config/frv/frv.c:3021
-msgid "frv_print_operand: unknown code"
+#: except.c:2723
+#, gcc-internal-format
+msgid "argument of %<__builtin_eh_return_regno%> must be constant"
msgstr ""
-#: config/frv/frv.c:4391
-msgid "Bad output_move_single operand"
+#: except.c:2854
+#, gcc-internal-format
+msgid "__builtin_eh_return not supported on this target"
msgstr ""
-#: config/frv/frv.c:4518
-msgid "Bad output_move_double operand"
+#: except.c:3664 except.c:3673
+#, gcc-internal-format
+msgid "region_array is corrupted for region %i"
msgstr ""
-#: config/frv/frv.c:4660
-msgid "Bad output_condmove_single operand"
+#: except.c:3678
+#, gcc-internal-format
+msgid "outer block of region %i is wrong"
msgstr ""
-#: config/frv/frv.c:8221
-msgid "accumulator is not a constant integer"
+#: except.c:3683
+#, gcc-internal-format
+msgid "region %i may contain throw and is contained in region that may not"
msgstr ""
-#: config/frv/frv.c:8226
-msgid "accumulator number is out of bounds"
+#: except.c:3689
+#, gcc-internal-format
+msgid "negative nesting depth of region %i"
msgstr ""
-#: config/frv/frv.c:8237
-#, c-format
-msgid "inappropriate accumulator for %qs"
+#: except.c:3709
+#, gcc-internal-format
+msgid "Tree list ends on depth %i"
msgstr ""
-#: config/frv/frv.c:8303
-msgid "invalid IACC argument"
+#: except.c:3714
+#, gcc-internal-format
+msgid "array does not match the region tree"
msgstr ""
-#: config/frv/frv.c:8326
-#, c-format
-msgid "%qs expects a constant argument"
+#: except.c:3720
+#, gcc-internal-format
+msgid "verify_eh_tree failed."
msgstr ""
-#: config/frv/frv.c:8331
-#, c-format
-msgid "constant argument out of range for %qs"
+#: explow.c:1217
+#, gcc-internal-format
+msgid "stack limits not supported on this target"
msgstr ""
-#: config/frv/frv.c:8766
-msgid "media functions are not available unless -mmedia is used"
+#: flow.c:494 flow.c:518 flow.c:540
+#, gcc-internal-format
+msgid "internal consistency failure"
msgstr ""
-#: config/frv/frv.c:8778
-msgid "this media function is only available on the fr500"
+#: fold-const.c:3298 fold-const.c:3309
+#, gcc-internal-format
+msgid "comparison is always %d due to width of bit-field"
msgstr ""
-#: config/frv/frv.c:8806
-msgid "this media function is only available on the fr400 and fr550"
+#: fold-const.c:4880 fold-const.c:4895
+#, gcc-internal-format
+msgid "comparison is always %d"
msgstr ""
-#: config/frv/frv.c:8825
-msgid "this builtin function is only available on the fr405 and fr450"
+#: fold-const.c:5024
+#, gcc-internal-format
+msgid "%<or%> of unmatched not-equal tests is always 1"
msgstr ""
-#: config/frv/frv.c:8834
-msgid "this builtin function is only available on the fr500 and fr550"
+#: fold-const.c:5029
+#, gcc-internal-format
+msgid "%<and%> of mutually exclusive equal-tests is always 0"
msgstr ""
-#: config/frv/frv.c:8846
-msgid "this builtin function is only available on the fr450"
+#: fold-const.c:10444
+#, gcc-internal-format
+msgid "fold check: original tree changed by fold"
msgstr ""
-#. This macro is a C statement to print on `stderr' a string describing the
-#. particular machine description choice. Every machine description should
-#. define `TARGET_VERSION'. For example:
-#.
-#. #ifdef MOTOROLA
-#. #define TARGET_VERSION fprintf (stderr, " (68k, Motorola syntax)");
-#. #else
-#. #define TARGET_VERSION fprintf (stderr, " (68k, MIT syntax)");
-#. #endif
-#: config/frv/frv.h:329
-#, c-format
-msgid " (frv)"
+#: function.c:823 varasm.c:1674
+#, gcc-internal-format
+msgid "%Jsize of variable %qD is too large"
msgstr ""
-#: config/h8300/h8300.c:331
-msgid "-ms2600 is used without -ms"
+#: function.c:1532
+#, gcc-internal-format
+msgid "impossible constraint in %<asm%>"
msgstr ""
-#: config/h8300/h8300.c:337
-msgid "-mn is used without -mh or -ms"
+#: function.c:3446
+#, gcc-internal-format
+msgid "%Jvariable %qD might be clobbered by %<longjmp%> or %<vfork%>"
msgstr ""
-#: config/i386/host-cygwin.c:65
-#, c-format
-msgid "can't extend PCH file: %m"
+#: function.c:3467
+#, gcc-internal-format
+msgid "%Jargument %qD might be clobbered by %<longjmp%> or %<vfork%>"
msgstr ""
-#: config/i386/host-cygwin.c:76
-#, c-format
-msgid "can't set position in PCH file: %m"
+#: function.c:3862
+#, gcc-internal-format
+msgid "function returns an aggregate"
msgstr ""
-#: config/i386/i386.c:1244
-#, c-format
-msgid "code model %s not supported in PIC mode"
+#: function.c:4182
+#, gcc-internal-format
+msgid "%Junused parameter %qD"
msgstr ""
-#: config/i386/i386.c:1254 config/sparc/sparc.c:619
-#, c-format
-msgid "bad value (%s) for -mcmodel= switch"
+#: gcc.c:1232
+#, gcc-internal-format
+msgid "ambiguous abbreviation %s"
msgstr ""
-#: config/i386/i386.c:1269
-#, c-format
-msgid "bad value (%s) for -masm= switch"
+#: gcc.c:1259
+#, gcc-internal-format
+msgid "incomplete '%s' option"
msgstr ""
-#: config/i386/i386.c:1272
-#, c-format
-msgid "code model %qs not supported in the %s bit mode"
+#: gcc.c:1270
+#, gcc-internal-format
+msgid "missing argument to '%s' option"
msgstr ""
-#: config/i386/i386.c:1275
-msgid "code model %<large%> not supported yet"
+#: gcc.c:1283
+#, gcc-internal-format
+msgid "extraneous argument to '%s' option"
msgstr ""
-#: config/i386/i386.c:1277
-#, c-format
-msgid "%i-bit mode not compiled in"
+#: gcc.c:3770
+#, gcc-internal-format
+msgid "warning: -pipe ignored because -save-temps specified"
msgstr ""
-#: config/i386/i386.c:1307 config/i386/i386.c:1331
-msgid "CPU you selected does not support x86-64 instruction set"
+#: gcc.c:4066
+#, gcc-internal-format
+msgid "warning: '-x %s' after last input file has no effect"
msgstr ""
-#: config/i386/i386.c:1313
-#, c-format
-msgid "bad value (%s) for -march= switch"
+#. Catch the case where a spec string contains something like
+#. '%{foo:%*}'. i.e. there is no * in the pattern on the left
+#. hand side of the :.
+#: gcc.c:5135
+#, gcc-internal-format
+msgid "spec failure: '%%*' has not been initialized by pattern match"
msgstr ""
-#: config/i386/i386.c:1344
-#, c-format
-msgid "bad value (%s) for -mtune= switch"
+#: gcc.c:5144
+#, gcc-internal-format
+msgid "warning: use of obsolete %%[ operator in specs"
msgstr ""
-#: config/i386/i386.c:1361
-#, c-format
-msgid "-mregparm=%d is not between 0 and %d"
+#: gcc.c:5225
+#, gcc-internal-format
+msgid "spec failure: unrecognized spec option '%c'"
msgstr ""
-#: config/i386/i386.c:1374
-msgid "-malign-loops is obsolete, use -falign-loops"
+#: gcc.c:6149
+#, gcc-internal-format
+msgid "spec failure: more than one arg to SYSROOT_SUFFIX_SPEC."
msgstr ""
-#: config/i386/i386.c:1379 config/i386/i386.c:1392 config/i386/i386.c:1405
-#, c-format
-msgid "-malign-loops=%d is not between 0 and %d"
+#: gcc.c:6172
+#, gcc-internal-format
+msgid "spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC."
msgstr ""
-#: config/i386/i386.c:1387
-msgid "-malign-jumps is obsolete, use -falign-jumps"
+#: gcc.c:6261
+#, gcc-internal-format
+msgid "unrecognized option '-%s'"
msgstr ""
-#: config/i386/i386.c:1400
-msgid "-malign-functions is obsolete, use -falign-functions"
+#: gcc.c:6449 gcc.c:6512
+#, gcc-internal-format
+msgid "%s: %s compiler not installed on this system"
msgstr ""
-#: config/i386/i386.c:1438
-#, c-format
-msgid "-mpreferred-stack-boundary=%d is not between %d and 12"
+#: gcc.c:6594
+#, gcc-internal-format
+msgid "%s: linker input file unused because linking not done"
msgstr ""
-#: config/i386/i386.c:1450
-#, c-format
-msgid "-mbranch-cost=%d is not between 0 and 5"
+#: gcc.c:6634
+#, gcc-internal-format
+msgid "language %s not recognized"
msgstr ""
-#: config/i386/i386.c:1462
-#, c-format
-msgid "bad value (%s) for -mtls-dialect= switch"
+#: gcc.c:6705
+#, gcc-internal-format
+msgid "%s: %s"
msgstr ""
-#: config/i386/i386.c:1509
-msgid "-malign-double makes no sense in the 64bit mode"
+#: gcse.c:6540
+#, gcc-internal-format
+msgid "%s: %d basic blocks and %d edges/basic block"
msgstr ""
-#: config/i386/i386.c:1511
-msgid "-mrtd calling convention not supported in the 64bit mode"
+#: gcse.c:6553
+#, gcc-internal-format
+msgid "%s: %d basic blocks and %d registers"
msgstr ""
-#: config/i386/i386.c:1540 config/i386/i386.c:1551
-msgid "SSE instruction set disabled, using 387 arithmetics"
+#: ggc-common.c:404 ggc-common.c:412 ggc-common.c:480 ggc-common.c:499
+#: ggc-page.c:2202 ggc-page.c:2233 ggc-page.c:2240 ggc-zone.c:2291
+#: ggc-zone.c:2306
+#, gcc-internal-format
+msgid "can't write PCH file: %m"
msgstr ""
-#: config/i386/i386.c:1556
-msgid "387 instruction set disabled, using SSE arithmetics"
+#: ggc-common.c:492 config/i386/host-cygwin.c:58
+#, gcc-internal-format
+msgid "can't get position in PCH file: %m"
msgstr ""
-#: config/i386/i386.c:1563
-#, c-format
-msgid "bad value (%s) for -mfpmath= switch"
+#: ggc-common.c:502
+#, gcc-internal-format
+msgid "can't write padding to PCH file: %m"
msgstr ""
-#: config/i386/i386.c:1724 config/i386/i386.c:1735
-msgid "fastcall and stdcall attributes are not compatible"
+#: ggc-common.c:557 ggc-common.c:565 ggc-common.c:572 ggc-common.c:575
+#: ggc-common.c:585 ggc-common.c:588 ggc-page.c:2327 ggc-zone.c:2325
+#, gcc-internal-format
+msgid "can't read PCH file: %m"
msgstr ""
-#: config/i386/i386.c:1728 config/i386/i386.c:1784
-msgid "fastcall and regparm attributes are not compatible"
+#: ggc-common.c:580
+#, gcc-internal-format
+msgid "had to relocate PCH"
msgstr ""
-#: config/i386/i386.c:1771
-#, c-format
-msgid "%qs attribute requires an integer constant argument"
+#: ggc-page.c:1445
+#, gcc-internal-format
+msgid "open /dev/zero: %m"
msgstr ""
-#: config/i386/i386.c:1777
-#, c-format
-msgid "argument to %qs attribute larger than %d"
+#: ggc-page.c:2218 ggc-page.c:2224
+#, gcc-internal-format
+msgid "can't write PCH file"
msgstr ""
-#: config/i386/i386.c:2590
-msgid "SSE register return with SSE disabled"
+#: ggc-zone.c:2288 ggc-zone.c:2299
+#, gcc-internal-format
+msgid "can't seek PCH file: %m"
msgstr ""
-#: config/i386/i386.c:2592
-msgid "SSE register argument with SSE disabled"
+#: ggc-zone.c:2302
+#, gcc-internal-format
+msgid "can't write PCH fle: %m"
msgstr ""
-#: config/i386/i386.c:2902
-msgid "SSE vector argument without SSE enabled changes the ABI"
+#: gimple-low.c:202
+#, gcc-internal-format
+msgid "unexpected node"
msgstr ""
-#: config/i386/i386.c:2919
-msgid "MMX vector argument without MMX enabled changes the ABI"
+#: gimplify.c:3408
+#, gcc-internal-format
+msgid "invalid lvalue in asm output %d"
msgstr ""
-#: config/i386/i386.c:3167
-msgid "SSE vector return without SSE enabled changes the ABI"
+#: gimplify.c:3520
+#, gcc-internal-format
+msgid "memory input %d is not directly addressable"
msgstr ""
-#: config/i386/i386.c:6073
-msgid "invalid UNSPEC as operand"
+#: gimplify.c:4393
+#, gcc-internal-format
+msgid "gimplification failed"
msgstr ""
-#: config/i386/i386.c:6311
-msgid "extended registers have no high halves"
+#: global.c:371 global.c:384 global.c:398
+#, gcc-internal-format
+msgid "%s cannot be used in asm here"
msgstr ""
-#: config/i386/i386.c:6326
-msgid "unsupported operand size for extended register"
+#: graph.c:403 passes.c:129 java/jcf-parse.c:1061 java/jcf-parse.c:1196
+#: java/lex.c:1846 objc/objc-act.c:500
+#, gcc-internal-format
+msgid "can't open %s: %m"
msgstr ""
-#: config/i386/i386.c:6642
-msgid ""
-"operand is neither a constant nor a condition code, invalid operand code 'c'"
+#: haifa-sched.c:182
+#, gcc-internal-format
+msgid "fix_sched_param: unknown param: %s"
msgstr ""
-#: config/i386/i386.c:6695
-#, c-format
-msgid "invalid operand code '%c'"
+#. Eventually this should become a hard error IMO.
+#: opts.c:260
+#, gcc-internal-format
+msgid "command line option \"%s\" is valid for %s but not for %s"
msgstr ""
-#: config/i386/i386.c:6738
-msgid "invalid constraints for operand"
+#: opts.c:314
+#, gcc-internal-format
+msgid "command line option %qs is not supported by this configuration"
msgstr ""
-#: config/i386/i386.c:12023
-msgid "unknown insn mode"
+#: opts.c:358
+#, gcc-internal-format
+msgid "missing argument to \"%s\""
msgstr ""
-#: config/i386/i386.c:14278
-#, c-format
-msgid "selector must be an integer constant in the range 0..%i"
+#: opts.c:368
+#, gcc-internal-format
+msgid "argument to \"%s\" should be a non-negative integer"
msgstr ""
-#: config/i386/i386.c:14616
-msgid "shift must be an immediate"
+#: opts.c:456
+#, gcc-internal-format
+msgid "unrecognized command line option \"%s\""
msgstr ""
-#: config/i386/i386.c:15755
-#, c-format
-msgid "%qs incompatible attribute ignored"
+#: opts.c:670
+#, gcc-internal-format
+msgid "-Wuninitialized is not supported without -O"
msgstr ""
-#: config/i386/winnt.c:74
-#, c-format
-msgid "%qs attribute only applies to variables"
+#: opts.c:684
+#, gcc-internal-format
+msgid "-freorder-blocks-and-partition does not work with exceptions"
msgstr ""
-#: config/i386/winnt.c:103
-#, c-format
-msgid ""
-"%qs attribute applies only to initialized variables with external linkage"
+#: opts.c:693
+#, gcc-internal-format
+msgid "-freorder-blocks-and-partition does not work on this architecture."
msgstr ""
-#: config/i386/winnt.c:202
-msgid ""
-"%Jfunction '%D' is defined after prior declaration as dllimport: attribute "
-"ignored"
+#: opts.c:857
+#, gcc-internal-format
+msgid "structure alignment must be a small power of two, not %d"
msgstr ""
-#: config/i386/winnt.c:213
-msgid "%Jinline function '%D' is declared as dllimport: attribute ignored."
+#: opts.c:922
+#, gcc-internal-format
+msgid "unrecognized visibility value \"%s\""
msgstr ""
-#: config/i386/winnt.c:225
-msgid "%Jdefinition of static data member '%D' of dllimport'd class."
+#: opts.c:974
+#, gcc-internal-format
+msgid "unrecognized register name \"%s\""
msgstr ""
-#: config/i386/winnt.c:285
-msgid "%Jinconsistent dll linkage for '%D', dllexport assumed."
+#: opts.c:998
+#, gcc-internal-format
+msgid "unknown tls-model \"%s\""
msgstr ""
-#: config/i386/winnt.c:329 config/sh/symbian.c:279
-#, c-format
-msgid "%qs declared as both exported to and imported from a DLL"
+#: opts.c:1067
+#, gcc-internal-format
+msgid "%s: --param arguments should be of the form NAME=VALUE"
+msgstr ""
+
+#: opts.c:1072
+#, gcc-internal-format
+msgid "invalid --param value %qs"
+msgstr ""
+
+#: opts.c:1169
+#, gcc-internal-format
+msgid "target system does not support debug output"
+msgstr ""
+
+#: opts.c:1176
+#, gcc-internal-format
+msgid "debug format \"%s\" conflicts with prior selection"
+msgstr ""
+
+#: opts.c:1192
+#, gcc-internal-format
+msgid "unrecognised debug output level \"%s\""
+msgstr ""
+
+#: opts.c:1194
+#, gcc-internal-format
+msgid "debug output level %s is too high"
msgstr ""
-#: config/i386/winnt.c:338
+#: params.c:71
+#, gcc-internal-format
+msgid "minimum value of parameter %qs is %u"
+msgstr ""
+
+#: params.c:76
+#, gcc-internal-format
+msgid "maximum value of parameter %qs is %u"
+msgstr ""
+
+#. If we didn't find this parameter, issue an error message.
+#: params.c:85
+#, gcc-internal-format
+msgid "invalid parameter %qs"
+msgstr ""
+
+#: passes.c:1214
+#, gcc-internal-format
msgid ""
-"%Jfailure in redeclaration of '%D': dllimport'd symbol lacks external "
-"linkage."
+"branch target register load optimization is not intended to be run twice"
msgstr ""
-#: config/i386/winnt.c:477
-msgid "%J'%D' defined locally after being referenced with dllimport linkage"
+#: profile.c:284
+#, gcc-internal-format
+msgid "corrupted profile info: run_max * runs < sum_max"
+msgstr ""
+
+#: profile.c:290
+#, gcc-internal-format
+msgid "corrupted profile info: sum_all is smaller than sum_max"
+msgstr ""
+
+#: profile.c:335
+#, gcc-internal-format
+msgid "corrupted profile info: edge from %i to %i exceeds maximal count"
msgstr ""
-#: config/i386/winnt.c:480
+#: profile.c:500
+#, gcc-internal-format
msgid ""
-"%J'%D' redeclared without dllimport attribute after being referenced with "
-"dllimport linkage"
+"corrupted profile info: number of iterations for basic block %d thought to "
+"be %i"
msgstr ""
-#: config/i386/winnt.c:647
-msgid "%J'%D' causes a section type conflict"
+#: profile.c:521
+#, gcc-internal-format
+msgid ""
+"corrupted profile info: number of executions for edge %d-%d thought to be %i"
msgstr ""
-#: config/i386/cygming.h:61
-msgid "Use the Cygwin interface"
+#: reg-stack.c:523
+#, gcc-internal-format
+msgid "output constraint %d must specify a single register"
msgstr ""
-#: config/i386/cygming.h:62
-msgid "Use the Mingw32 interface"
+#: reg-stack.c:533
+#, gcc-internal-format
+msgid "output constraint %d cannot be specified together with \"%s\" clobber"
msgstr ""
-#: config/i386/cygming.h:63
-msgid "Create GUI application"
+#: reg-stack.c:556
+#, gcc-internal-format
+msgid "output regs must be grouped at top of stack"
msgstr ""
-#: config/i386/cygming.h:64
-msgid "Don't set Windows defines"
+#: reg-stack.c:593
+#, gcc-internal-format
+msgid "implicitly popped regs must be grouped at top of stack"
msgstr ""
-#: config/i386/cygming.h:65
-msgid "Set Windows defines"
+#: reg-stack.c:612
+#, gcc-internal-format
+msgid "output operand %d must use %<&%> constraint"
msgstr ""
-#: config/i386/cygming.h:66
-msgid "Create console application"
+#: regclass.c:766
+#, gcc-internal-format
+msgid "can't use '%s' as a %s register"
msgstr ""
-#: config/i386/cygming.h:67
-msgid "Generate code for a DLL"
+#: regclass.c:781 config/ia64/ia64.c:4788 config/ia64/ia64.c:4795
+#: config/pa/pa.c:332 config/pa/pa.c:339
+#, gcc-internal-format
+msgid "unknown register name: %s"
msgstr ""
-#: config/i386/cygming.h:69
-msgid "Ignore dllimport for functions"
+#: regclass.c:791
+#, gcc-internal-format
+msgid "global register variable follows a function definition"
msgstr ""
-#: config/i386/cygming.h:71
-msgid "Use Mingw-specific thread support"
+#: regclass.c:795
+#, gcc-internal-format
+msgid "register used for two global register variables"
msgstr ""
-#: config/i386/cygming.h:185
-#, c-format
-msgid "-f%s ignored for target (all code is position independent)"
+#: regclass.c:800
+#, gcc-internal-format
+msgid "call-clobbered register used for global register variable"
msgstr ""
-#: config/i386/djgpp.h:191
-msgid "-mbnu210 is ignored (option is obsolete)"
+#: regrename.c:1872
+#, gcc-internal-format
+msgid "validate_value_data: [%u] Bad next_regno for empty chain (%u)"
msgstr ""
-#: config/i386/i386-interix.h:257
-msgid "ms-bitfields not supported for objc"
+#: regrename.c:1884
+#, gcc-internal-format
+msgid "validate_value_data: Loop in regno chain (%u)"
msgstr ""
-#. WARNING: Do not mark empty strings for translation, as calling
-#. gettext on an empty string does NOT return an empty
-#. string.
-#. 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.
-#: config/i386/i386.h:337 config/i386/i386.h:339 config/i386/i386.h:341
-#: config/s390/s390.h:134 config/sparc/sparc.h:625 config/sparc/sparc.h:630
-#: config/ns32k/ns32k.opt:28
-msgid "Use hardware fp"
+#: regrename.c:1887
+#, gcc-internal-format
+msgid "validate_value_data: [%u] Bad oldest_regno (%u)"
msgstr ""
-#: config/i386/i386.h:338 config/i386/i386.h:340 config/sparc/sparc.h:627
-#: config/sparc/sparc.h:632 config/alpha/alpha.opt:24
-#: config/ns32k/ns32k.opt:104
-msgid "Do not use hardware fp"
+#: regrename.c:1899
+#, gcc-internal-format
+msgid "validate_value_data: [%u] Non-empty reg in chain (%s %u %i)"
msgstr ""
-#. Deprecated.
-#. Deprecated.
-#. Deprecated.
-#. Deprecated.
-#. Deprecated.
-#. Deprecated.
-#: config/i386/i386.h:349
-msgid "Alternate calling convention"
+#: reload.c:1270
+#, gcc-internal-format
+msgid "cannot reload integer constant operand in %<asm%>"
msgstr ""
-#: config/i386/i386.h:351 config/m68k/m68k.h:336
-msgid "Use normal calling convention"
+#: reload.c:1293
+#, gcc-internal-format
+msgid "impossible register constraint in %<asm%>"
msgstr ""
-#: config/i386/i386.h:353
-msgid "Align some doubles on dword boundary"
+#: reload.c:3550
+#, gcc-internal-format
+msgid "%<&%> constraint used with no register class"
msgstr ""
-#: config/i386/i386.h:355
-msgid "Align doubles on word boundary"
+#: reload.c:3721 reload.c:3953
+#, gcc-internal-format
+msgid "inconsistent operand constraints in an %<asm%>"
msgstr ""
-#: config/i386/i386.h:357
-msgid "Uninitialized locals in .bss"
+#: reload1.c:1241
+#, gcc-internal-format
+msgid "frame size too large for reliable stack checking"
msgstr ""
-#: config/i386/i386.h:359
-msgid "Uninitialized locals in .data"
+#: reload1.c:1244
+#, gcc-internal-format
+msgid "try reducing the number of local variables"
msgstr ""
-#: config/i386/i386.h:361 config/m68k/linux.h:42 config/ns32k/ns32k.opt:52
-msgid "Use IEEE math for fp comparisons"
+#: reload1.c:1895
+#, gcc-internal-format
+msgid "can't find a register in class %qs while reloading %<asm%>"
msgstr ""
-#: config/i386/i386.h:363 config/ns32k/ns32k.opt:68
-msgid "Do not use IEEE math for fp comparisons"
+#: reload1.c:1900
+#, gcc-internal-format
+msgid "unable to find a register to spill in class %qs"
msgstr ""
-#: config/i386/i386.h:365
-msgid "Return values of functions in FPU registers"
+#: reload1.c:3902
+#, gcc-internal-format
+msgid "%<asm%> operand requires impossible reload"
msgstr ""
-#: config/i386/i386.h:367
-msgid "Do not return values of functions in FPU registers"
+#: reload1.c:5026
+#, gcc-internal-format
+msgid "%<asm%> operand constraint incompatible with operand size"
msgstr ""
-#: config/i386/i386.h:369
-msgid "Do not generate sin, cos, sqrt for FPU"
+#: reload1.c:6653
+#, gcc-internal-format
+msgid "output operand is constant in %<asm%>"
msgstr ""
-#: config/i386/i386.h:371
-msgid "Generate sin, cos, sqrt for FPU"
+#: rtl.c:474
+#, gcc-internal-format
+msgid "RTL check: access of elt %d of '%s' with last elt %d in %s, at %s:%d"
msgstr ""
-#: config/i386/i386.h:373
-msgid "Omit the frame pointer in leaf functions"
+#: rtl.c:484
+#, gcc-internal-format
+msgid ""
+"RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d"
msgstr ""
-#: config/i386/i386.h:376
-msgid "Enable stack probing"
+#: rtl.c:494
+#, gcc-internal-format
+msgid ""
+"RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %"
+"s:%d"
msgstr ""
-#. undocumented
-#. undocumented
-#: config/i386/i386.h:381
-msgid "Align destination of the string operations"
+#: rtl.c:503
+#, gcc-internal-format
+msgid "RTL check: expected code '%s', have '%s' in %s, at %s:%d"
msgstr ""
-#: config/i386/i386.h:383
-msgid "Do not align destination of the string operations"
+#: rtl.c:513
+#, gcc-internal-format
+msgid "RTL check: expected code '%s' or '%s', have '%s' in %s, at %s:%d"
msgstr ""
-#: config/i386/i386.h:385
-msgid "Inline all known string operations"
+#: rtl.c:524
+#, gcc-internal-format
+msgid "RTL check: access of elt %d of vector with last elt %d in %s, at %s:%d"
msgstr ""
-#: config/i386/i386.h:387
-msgid "Do not inline all known string operations"
+#: rtl.c:535
+#, gcc-internal-format
+msgid "RTL flag check: %s used with unexpected rtx code '%s' in %s, at %s:%d"
msgstr ""
-#: config/i386/i386.h:389 config/i386/i386.h:393
-msgid "Use push instructions to save outgoing arguments"
+#: stmt.c:317
+#, gcc-internal-format
+msgid "output operand constraint lacks %<=%>"
msgstr ""
-#: config/i386/i386.h:391 config/i386/i386.h:395
-msgid "Do not use push instructions to save outgoing arguments"
+#: stmt.c:332
+#, gcc-internal-format
+msgid "output constraint %qc for operand %d is not at the beginning"
msgstr ""
-#: config/i386/i386.h:397
-msgid "Support MMX built-in functions"
+#: stmt.c:355
+#, gcc-internal-format
+msgid "operand constraint contains incorrectly positioned %<+%> or %<=%>"
msgstr ""
-#: config/i386/i386.h:399
-msgid "Do not support MMX built-in functions"
+#: stmt.c:362 stmt.c:461
+#, gcc-internal-format
+msgid "%<%%%> constraint used with last operand"
msgstr ""
-#: config/i386/i386.h:401
-msgid "Support 3DNow! built-in functions"
+#: stmt.c:381
+#, gcc-internal-format
+msgid "matching constraint not valid in output operand"
msgstr ""
-#: config/i386/i386.h:403
-msgid "Do not support 3DNow! built-in functions"
+#: stmt.c:452
+#, gcc-internal-format
+msgid "input operand constraint contains %qc"
msgstr ""
-#: config/i386/i386.h:405
-msgid "Support MMX and SSE built-in functions and code generation"
+#: stmt.c:494
+#, gcc-internal-format
+msgid "matching constraint references invalid operand number"
msgstr ""
-#: config/i386/i386.h:407
-msgid "Do not support MMX and SSE built-in functions and code generation"
+#: stmt.c:532
+#, gcc-internal-format
+msgid "invalid punctuation %qc in constraint"
msgstr ""
-#: config/i386/i386.h:409
-msgid "Support MMX, SSE and SSE2 built-in functions and code generation"
+#: stmt.c:556
+#, gcc-internal-format
+msgid "matching constraint does not allow a register"
msgstr ""
-#: config/i386/i386.h:411
-msgid "Do not support MMX, SSE and SSE2 built-in functions and code generation"
+#: stmt.c:598
+#, gcc-internal-format
+msgid "asm-specifier for variable %qs conflicts with asm clobber list"
msgstr ""
-#: config/i386/i386.h:413
-msgid "Support MMX, SSE, SSE2 and SSE3 built-in functions and code generation"
+#: stmt.c:686
+#, gcc-internal-format
+msgid "unknown register name %qs in %<asm%>"
msgstr ""
-#: config/i386/i386.h:415
-msgid ""
-"Do not support MMX, SSE, SSE2 and SSE3 built-in functions and code generation"
+#: stmt.c:694
+#, gcc-internal-format
+msgid "PIC register %qs clobbered in %<asm%>"
msgstr ""
-#: config/i386/i386.h:417
-msgid "sizeof(long double) is 16"
+#: stmt.c:741
+#, gcc-internal-format
+msgid "more than %d operands in %<asm%>"
msgstr ""
-#: config/i386/i386.h:419
-msgid "sizeof(long double) is 12"
+#: stmt.c:804
+#, gcc-internal-format
+msgid "output number %d not directly addressable"
msgstr ""
-#: config/i386/i386.h:421
-msgid "Generate 64bit x86-64 code"
+#: stmt.c:883
+#, gcc-internal-format
+msgid "asm operand %d probably doesn%'t match constraints"
msgstr ""
-#: config/i386/i386.h:423
-msgid "Generate 32bit i386 code"
+#: stmt.c:893
+#, gcc-internal-format
+msgid "use of memory input without lvalue in asm operand %d is deprecated"
msgstr ""
-#: config/i386/i386.h:425
-msgid "Use native (MS) bitfield layout"
+#: stmt.c:1040
+#, gcc-internal-format
+msgid "asm clobber conflict with output operand"
msgstr ""
-#: config/i386/i386.h:427
-msgid "Use gcc default bitfield layout"
+#: stmt.c:1045
+#, gcc-internal-format
+msgid "asm clobber conflict with input operand"
msgstr ""
-#: config/i386/i386.h:429
-msgid "Use red-zone in the x86-64 code"
+#: stmt.c:1122
+#, gcc-internal-format
+msgid "too many alternatives in %<asm%>"
msgstr ""
-#: config/i386/i386.h:431
-msgid "Do not use red-zone in the x86-64 code"
+#: stmt.c:1134
+#, gcc-internal-format
+msgid "operand constraints for %<asm%> differ in number of alternatives"
msgstr ""
-#: config/i386/i386.h:433
-#, c-format
-msgid "Use direct references against %gs when accessing tls data"
+#: stmt.c:1187
+#, gcc-internal-format
+msgid "duplicate asm operand name %qs"
msgstr ""
-#: config/i386/i386.h:435
-#, c-format
-msgid "Do not use direct references against %gs when accessing tls data"
+#: stmt.c:1285
+#, gcc-internal-format
+msgid "missing close brace for named operand"
msgstr ""
-#. This macro is similar to `TARGET_SWITCHES' but defines names of
-#. command options that have values. Its definition is an
-#. initializer with a subgrouping for each command option.
-#.
-#. Each subgrouping contains a string constant, that defines the
-#. fixed part of the option name, and the address of a variable. The
-#. variable, type `char *', is set to the variable part of the given
-#. option if the fixed part matches. The actual option name is made
-#. by appending `-m' to the specified name.
-#: config/i386/i386.h:473 config/rs6000/rs6000.h:457 config/s390/s390.h:158
-#: config/sparc/sparc.h:720 config/ia64/ia64.opt:97
-msgid "Schedule code for given CPU"
+#: stmt.c:1313
+#, gcc-internal-format
+msgid "undefined named operand %qs"
msgstr ""
-#: config/i386/i386.h:475
-msgid "Generate floating point mathematics using given instruction set"
+#: stmt.c:1478
+#, gcc-internal-format
+msgid "%Hvalue computed is not used"
msgstr ""
-#: config/i386/i386.h:477 config/s390/s390.h:160
-msgid "Generate code for given CPU"
+#: stor-layout.c:148
+#, gcc-internal-format
+msgid "type size can%'t be explicitly evaluated"
msgstr ""
-#: config/i386/i386.h:479
-msgid "Number of registers used to pass integer arguments"
+#: stor-layout.c:150
+#, gcc-internal-format
+msgid "variable-size type declared outside of any function"
msgstr ""
-#: config/i386/i386.h:481
-msgid "Loop code aligned to this power of 2"
+#: stor-layout.c:454
+#, gcc-internal-format
+msgid "%Jsize of %qD is %d bytes"
msgstr ""
-#: config/i386/i386.h:483
-msgid "Jump targets are aligned to this power of 2"
+#: stor-layout.c:456
+#, gcc-internal-format
+msgid "%Jsize of %qD is larger than %d bytes"
msgstr ""
-#: config/i386/i386.h:485
-msgid "Function starts are aligned to this power of 2"
+#: stor-layout.c:854
+#, gcc-internal-format
+msgid "%Jpacked attribute causes inefficient alignment for %qD"
msgstr ""
-#: config/i386/i386.h:488
-msgid "Attempt to keep stack aligned to this power of 2"
+#: stor-layout.c:857
+#, gcc-internal-format
+msgid "%Jpacked attribute is unnecessary for %qD"
msgstr ""
-#: config/i386/i386.h:490
-msgid "Branches are this expensive (1-5, arbitrary units)"
+#. No, we need to skip space before this field.
+#. Bump the cumulative size to multiple of field alignment.
+#: stor-layout.c:872
+#, gcc-internal-format
+msgid "%Jpadding struct to align %qD"
msgstr ""
-#: config/i386/i386.h:492
-msgid "Use given x86-64 code model"
+#: stor-layout.c:1271
+#, gcc-internal-format
+msgid "padding struct size to alignment boundary"
msgstr ""
-#. Undocumented.
-#. Undocumented.
-#: config/i386/i386.h:498
-msgid "Use given assembler dialect"
+#: stor-layout.c:1301
+#, gcc-internal-format
+msgid "packed attribute causes inefficient alignment for %qs"
msgstr ""
-#: config/i386/i386.h:500
-msgid "Use given thread-local storage dialect"
+#: stor-layout.c:1305
+#, gcc-internal-format
+msgid "packed attribute is unnecessary for %qs"
msgstr ""
-#: config/i386/sco5.h:290
-msgid "Generate ELF output"
+#: stor-layout.c:1311
+#, gcc-internal-format
+msgid "packed attribute causes inefficient alignment"
msgstr ""
-#. If the environment variable DJDIR is not defined, then DJGPP is not installed correctly and GCC will quickly become confused with the default prefix settings. Report the problem now so the user doesn't receive deceptive "file not found" error messages later.
-#. DJDIR is automatically defined by the DJGPP environment config file pointed to by the environment variable DJGPP. Examine DJGPP to try and figure out what's wrong.
-#: config/i386/xm-djgpp.h:62
-msgid "environment variable DJGPP not defined"
+#: stor-layout.c:1313
+#, gcc-internal-format
+msgid "packed attribute is unnecessary"
msgstr ""
-#: config/i386/xm-djgpp.h:64
-#, c-format
-msgid "environment variable DJGPP points to missing file '%s'"
+#: targhooks.c:96
+#, gcc-internal-format
+msgid "__builtin_saveregs not supported by this target"
msgstr ""
-#: config/i386/xm-djgpp.h:67
-#, c-format
-msgid "environment variable DJGPP points to corrupt file '%s'"
+#: tlink.c:484
+#, gcc-internal-format
+msgid "repository file '%s' does not contain command-line arguments"
msgstr ""
-#: config/ia64/ia64-c.c:52
-msgid "malformed #pragma builtin"
+#: tlink.c:705
+#, gcc-internal-format
+msgid ""
+"'%s' was assigned to '%s', but was not defined during recompilation, or vice "
+"versa"
msgstr ""
-#: config/ia64/ia64.c:491 config/m32r/m32r.c:390
-#, c-format
-msgid "invalid argument of %qs attribute"
+#: tlink.c:775
+#, gcc-internal-format
+msgid "ld returned %d exit status"
msgstr ""
-#: config/ia64/ia64.c:503
-msgid "%Jan address area attribute cannot be specified for local variables"
+#: toplev.c:437
+#, gcc-internal-format
+msgid "%s "
msgstr ""
-#: config/ia64/ia64.c:510
-msgid "%Jaddress area of '%s' conflicts with previous declaration"
+#: toplev.c:439
+#, gcc-internal-format
+msgid " %s"
msgstr ""
-#: config/ia64/ia64.c:517
-msgid "%Jaddress area attribute cannot be specified for functions"
+#: toplev.c:504
+#, gcc-internal-format
+msgid "invalid option argument %qs"
msgstr ""
-#: config/ia64/ia64.c:4184
-msgid "ia64_print_operand: unknown code"
+#: toplev.c:594
+#, gcc-internal-format
+msgid "getting core file size maximum limit: %m"
msgstr ""
-#: config/ia64/ia64.c:4557 config/pa/pa.c:329
-msgid "value of -mfixed-range must have form REG1-REG2"
+#: toplev.c:597
+#, gcc-internal-format
+msgid "setting core file size limit to maximum: %m"
msgstr ""
-#: config/ia64/ia64.c:4584 config/pa/pa.c:356
-#, c-format
-msgid "%s-%s is an empty range"
+#: toplev.c:820
+#, gcc-internal-format
+msgid "%J%qF declared %<static%> but never defined"
msgstr ""
-#: config/ia64/ia64.c:4615
-msgid "bad value %<%s%> for -mtls-size= switch"
+#: toplev.c:846
+#, gcc-internal-format
+msgid "%J%qD defined but not used"
msgstr ""
-#: config/ia64/ia64.c:4646
-msgid "bad value %<%s%> for -mtune= switch"
+#: toplev.c:869 toplev.c:892
+#, gcc-internal-format
+msgid "%qs is deprecated (declared at %s:%d)"
msgstr ""
-#: config/ia64/ia64.c:4665
-msgid "not yet implemented: latency-optimized inline square root"
+#: toplev.c:895
+#, gcc-internal-format
+msgid "type is deprecated (declared at %s:%d)"
msgstr ""
-#: config/ip2k/ip2k.c:1087
-msgid "bad operand"
+#: toplev.c:901
+#, gcc-internal-format
+msgid "%qs is deprecated"
msgstr ""
-#: config/iq2000/iq2000.c:1813
-#, c-format
-msgid "gp_offset (%ld) or end_offset (%ld) is less than zero."
+#: toplev.c:903
+#, gcc-internal-format
+msgid "type is deprecated"
msgstr ""
-#: config/iq2000/iq2000.c:2595
-#, c-format
-msgid "argument %qd is not a constant"
+#: toplev.c:1070
+#, gcc-internal-format
+msgid "unrecognized gcc debugging option: %c"
msgstr ""
-#: config/iq2000/iq2000.c:2898 config/xtensa/xtensa.c:1774
-msgid "PRINT_OPERAND_ADDRESS, null pointer"
+#: toplev.c:1217
+#, gcc-internal-format
+msgid "can%'t open %s for writing: %m"
msgstr ""
-#: config/iq2000/iq2000.c:3053
-#, c-format
-msgid "PRINT_OPERAND: Unknown punctuation '%c'"
+#: toplev.c:1554
+#, gcc-internal-format
+msgid "instruction scheduling not supported on this target machine"
msgstr ""
-#: config/iq2000/iq2000.c:3062 config/mips/mips.c:5069
-#: config/xtensa/xtensa.c:1628
-msgid "PRINT_OPERAND null pointer"
+#: toplev.c:1558
+#, gcc-internal-format
+msgid "this target machine does not have delayed branches"
msgstr ""
-#: config/iq2000/iq2000.c:3131
-#, c-format
-msgid "invalid %%P operand"
+#: toplev.c:1572
+#, gcc-internal-format
+msgid "-f%sleading-underscore not supported on this target machine"
msgstr ""
-#: config/iq2000/iq2000.c:3139 config/rs6000/rs6000.c:9385
-#, c-format
-msgid "invalid %%p value"
+#: toplev.c:1646
+#, gcc-internal-format
+msgid "target system does not support the \"%s\" debug format"
msgstr ""
-#: config/iq2000/iq2000.c:3203 config/mips/mips.c:5195
-#, c-format
-msgid "invalid use of %%d, %%x, or %%X"
+#: toplev.c:1658
+#, gcc-internal-format
+msgid "variable tracking requested, but useless unless producing debug info"
msgstr ""
-#: config/m32r/m32r.c:1789
-#, c-format
-msgid "invalid operand to %%s code"
+#: toplev.c:1661
+#, gcc-internal-format
+msgid "variable tracking requested, but not supported by this debug format"
msgstr ""
-#: config/m32r/m32r.c:1796
-#, c-format
-msgid "invalid operand to %%p code"
+#: toplev.c:1681
+#, gcc-internal-format
+msgid "can%'t open %s: %m"
msgstr ""
-#: config/m32r/m32r.c:1851
-msgid "bad insn for 'A'"
+#: toplev.c:1688
+#, gcc-internal-format
+msgid "-ffunction-sections not supported for this target"
msgstr ""
-#: config/m32r/m32r.c:1898
-#, c-format
-msgid "invalid operand to %%T/%%B code"
+#: toplev.c:1693
+#, gcc-internal-format
+msgid "-fdata-sections not supported for this target"
msgstr ""
-#: config/m32r/m32r.c:1921
-#, c-format
-msgid "invalid operand to %%N code"
+#: toplev.c:1700
+#, gcc-internal-format
+msgid "-ffunction-sections disabled; it makes profiling impossible"
msgstr ""
-#: config/m32r/m32r.c:1954
-msgid "pre-increment address is not a register"
+#: toplev.c:1707
+#, gcc-internal-format
+msgid "-fprefetch-loop-arrays not supported for this target"
msgstr ""
-#: config/m32r/m32r.c:1961
-msgid "pre-decrement address is not a register"
+#: toplev.c:1713
+#, gcc-internal-format
+msgid "-fspeculative-prefetching not supported for this target"
msgstr ""
-#: config/m32r/m32r.c:1968
-msgid "post-increment address is not a register"
+#: toplev.c:1719
+#, gcc-internal-format
+msgid ""
+"-fprefetch-loop-arrays not supported for this target (try -march switches)"
msgstr ""
-#: config/m32r/m32r.c:2044 config/m32r/m32r.c:2060
-#: config/rs6000/rs6000.c:16101
-msgid "bad address"
+#: toplev.c:1725
+#, gcc-internal-format
+msgid ""
+"-fspeculative-prefetching not supported for this target (try -march switches)"
msgstr ""
-#: config/m32r/m32r.c:2065
-msgid "lo_sum not of register"
+#: toplev.c:1734
+#, gcc-internal-format
+msgid "-fprefetch-loop-arrays is not supported with -Os"
msgstr ""
-#: config/m68hc11/m68hc11.c:287
-#, c-format
-msgid "-f%s ignored for 68HC11/68HC12 (not supported)"
+#: toplev.c:1740
+#, gcc-internal-format
+msgid "-ffunction-sections may affect debugging on some targets"
msgstr ""
-#: config/m68hc11/m68hc11.c:1247
-msgid "%<trap%> and %<far%> attributes are not compatible, ignoring %<far%>"
+#: toplev.c:1851
+#, gcc-internal-format
+msgid "error writing to %s: %m"
msgstr ""
-#: config/m68hc11/m68hc11.c:1253
-msgid "%<trap%> attribute is already used"
+#: toplev.c:1853 java/jcf-parse.c:1080 java/jcf-write.c:3536
+#, gcc-internal-format
+msgid "error closing %s: %m"
msgstr ""
-#. !!!! SCz wrong here.
-#: config/m68hc11/m68hc11.c:3212 config/m68hc11/m68hc11.c:3596
-msgid "move insn not handled"
+#: tree-cfg.c:1399 tree-cfg.c:2014 tree-cfg.c:2017
+#, gcc-internal-format
+msgid "%Hwill never be executed"
msgstr ""
-#: config/m68hc11/m68hc11.c:3444 config/m68hc11/m68hc11.c:3528
-#: config/m68hc11/m68hc11.c:3799
-msgid "invalid register in the move instruction"
+#: tree-cfg.c:3099
+#, gcc-internal-format
+msgid "SSA name in freelist but still referenced"
msgstr ""
-#: config/m68hc11/m68hc11.c:3478
-msgid "invalid operand in the instruction"
+#: tree-cfg.c:3108
+#, gcc-internal-format
+msgid "ASSERT_EXPR with an always-false condition"
msgstr ""
-#: config/m68hc11/m68hc11.c:3773
-msgid "invalid register in the instruction"
+#: tree-cfg.c:3118
+#, gcc-internal-format
+msgid "GIMPLE register modified with BIT_FIELD_REF"
msgstr ""
-#: config/m68hc11/m68hc11.c:3806
-msgid "operand 1 must be a hard register"
+#: tree-cfg.c:3153
+#, gcc-internal-format
+msgid "invariant not recomputed when ADDR_EXPR changed"
msgstr ""
-#: config/m68hc11/m68hc11.c:3820
-msgid "invalid rotate insn"
+#: tree-cfg.c:3159
+#, gcc-internal-format
+msgid "constant not recomputed when ADDR_EXPR changed"
msgstr ""
-#: config/m68hc11/m68hc11.c:4244
-msgid "registers IX, IY and Z used in the same INSN"
+#: tree-cfg.c:3164
+#, gcc-internal-format
+msgid "side effects not recomputed when ADDR_EXPR changed"
msgstr ""
-#: config/m68hc11/m68hc11.c:4581 config/m68hc11/m68hc11.c:4881
-msgid "cannot do z-register replacement"
+#: tree-cfg.c:3180
+#, gcc-internal-format
+msgid "address taken, but ADDRESSABLE bit not set"
msgstr ""
-#: config/m68hc11/m68hc11.c:4944
-msgid "invalid Z register replacement for insn"
+#: tree-cfg.c:3190
+#, gcc-internal-format
+msgid "non-boolean used in condition"
msgstr ""
-#: config/m68k/m68k.c:233
-msgid "cannot specify both -msep-data and -mid-shared-library"
+#: tree-cfg.c:3195
+#, gcc-internal-format
+msgid "Invalid conditional operand"
msgstr ""
-#: config/m68k/m68k.c:245
-msgid "-fPIC is not currently supported on the 68000 or 68010\n"
+#: tree-cfg.c:3250
+#, gcc-internal-format
+msgid "Invalid reference prefix."
msgstr ""
-#: config/m68k/m68k.c:547 config/rs6000/rs6000.c:12228
-msgid "stack limit expression is not supported"
+#: tree-cfg.c:3315
+#, gcc-internal-format
+msgid "Is not a valid GIMPLE statement."
msgstr ""
-#: config/m68k/m68k.h:240 config/m68k/m68k.h:242
-msgid "Generate code for a 68020"
+#: tree-cfg.c:3335
+#, gcc-internal-format
+msgid "Statement marked for throw, but doesn%'t."
msgstr ""
-#: config/m68k/m68k.h:247 config/m68k/m68k.h:250
-msgid "Generate code for a 68000"
+#: tree-cfg.c:3340
+#, gcc-internal-format
+msgid "Statement marked for throw in middle of block."
msgstr ""
-#: config/m68k/m68k.h:252
-msgid "Use the bit-field instructions"
+#: tree-cfg.c:3435
+#, gcc-internal-format
+msgid "bb_for_stmt (phi) is set to a wrong basic block\n"
msgstr ""
-#: config/m68k/m68k.h:254
-msgid "Do not use the bit-field instructions"
+#: tree-cfg.c:3450
+#, gcc-internal-format
+msgid "PHI def is not a GIMPLE value"
msgstr ""
-#: config/m68k/m68k.h:256
-msgid "Consider type 'int' to be 16 bits wide"
+#: tree-cfg.c:3466 tree-cfg.c:3489
+#, gcc-internal-format
+msgid "Incorrect sharing of tree nodes"
msgstr ""
-#: config/m68k/m68k.h:258
-msgid "Consider type 'int' to be 32 bits wide"
+#: tree-cfg.c:3480
+#, gcc-internal-format
+msgid "bb_for_stmt (stmt) is set to a wrong basic block\n"
msgstr ""
-#: config/m68k/m68k.h:261
-msgid "Generate code with library calls for floating point"
+#: tree-cfg.c:3498
+#, gcc-internal-format
+msgid "verify_stmts failed."
msgstr ""
-#: config/m68k/m68k.h:263
-msgid "Generate code for a 68040, without any new instructions"
+#: tree-cfg.c:3519
+#, gcc-internal-format
+msgid "ENTRY_BLOCK has a statement list associated with it\n"
msgstr ""
-#: config/m68k/m68k.h:266
-msgid "Generate code for a 68060, without any new instructions"
+#: tree-cfg.c:3525
+#, gcc-internal-format
+msgid "EXIT_BLOCK has a statement list associated with it\n"
msgstr ""
-#: config/m68k/m68k.h:270
-msgid "Generate code for a 68030"
+#: tree-cfg.c:3532
+#, gcc-internal-format
+msgid "Fallthru to exit from bb %d\n"
msgstr ""
-#: config/m68k/m68k.h:273
-msgid "Generate code for a 68040"
+#: tree-cfg.c:3554
+#, gcc-internal-format
+msgid "Nonlocal label %s is not first in a sequence of labels in bb %d"
msgstr ""
-#: config/m68k/m68k.h:277
-msgid "Generate code for a 68060"
+#: tree-cfg.c:3563
+#, gcc-internal-format
+msgid "Label %s to block does not match in bb %d\n"
msgstr ""
-#: config/m68k/m68k.h:282
-msgid "Generate code for a 520X"
+#: tree-cfg.c:3572
+#, gcc-internal-format
+msgid "Label %s has incorrect context in bb %d\n"
msgstr ""
-#: config/m68k/m68k.h:286
-msgid "Generate code for a 5206e"
+#: tree-cfg.c:3586
+#, gcc-internal-format
+msgid "Control flow in the middle of basic block %d\n"
msgstr ""
-#: config/m68k/m68k.h:290
-msgid "Generate code for a 528x"
+#: tree-cfg.c:3596
+#, gcc-internal-format
+msgid "Label %s in the middle of basic block %d\n"
msgstr ""
-#: config/m68k/m68k.h:294
-msgid "Generate code for a 5307"
+#: tree-cfg.c:3615
+#, gcc-internal-format
+msgid "Fallthru edge after a control statement in bb %d \n"
msgstr ""
-#: config/m68k/m68k.h:298
-msgid "Generate code for a 5407"
+#: tree-cfg.c:3630
+#, gcc-internal-format
+msgid "Structured COND_EXPR at the end of bb %d\n"
msgstr ""
-#: config/m68k/m68k.h:301
-msgid "Generate code for a 68851"
+#: tree-cfg.c:3643 tree-cfg.c:3681 tree-cfg.c:3694 tree-cfg.c:3765
+#, gcc-internal-format
+msgid "Wrong outgoing edge flags at end of bb %d\n"
msgstr ""
-#: config/m68k/m68k.h:303
-msgid "Do no generate code for a 68851"
+#: tree-cfg.c:3651
+#, gcc-internal-format
+msgid "%<then%> label does not match edge at end of bb %d\n"
msgstr ""
-#: config/m68k/m68k.h:306
-msgid "Generate code for a 68302"
+#: tree-cfg.c:3659
+#, gcc-internal-format
+msgid "%<else%> label does not match edge at end of bb %d\n"
msgstr ""
-#: config/m68k/m68k.h:309
-msgid "Generate code for a 68332"
+#: tree-cfg.c:3669
+#, gcc-internal-format
+msgid "Explicit goto at end of bb %d\n"
msgstr ""
-#: config/m68k/m68k.h:313
-msgid "Generate code for a cpu32"
+#: tree-cfg.c:3699
+#, gcc-internal-format
+msgid "Return edge does not point to exit in bb %d\n"
msgstr ""
-#: config/m68k/m68k.h:316
-msgid "Align variables on a 32-bit boundary"
+#: tree-cfg.c:3732
+#, gcc-internal-format
+msgid "Found default case not at end of case vector"
msgstr ""
-#: config/m68k/m68k.h:318
-msgid "Align variables on a 16-bit boundary"
+#: tree-cfg.c:3738
+#, gcc-internal-format
+msgid ""
+"Case labels not sorted:\n"
+" "
msgstr ""
-#: config/m68k/m68k.h:320
-msgid "Enable separate data segment"
+#: tree-cfg.c:3749
+#, gcc-internal-format
+msgid "No default case found at end of case vector"
msgstr ""
-#: config/m68k/m68k.h:322
-msgid "Disable separate data segment"
+#: tree-cfg.c:3757
+#, gcc-internal-format
+msgid "Extra outgoing edge %d->%d\n"
msgstr ""
-#: config/m68k/m68k.h:324
-msgid "Enable ID based shared library"
+#: tree-cfg.c:3779
+#, gcc-internal-format
+msgid "Missing edge %i->%i"
msgstr ""
-#: config/m68k/m68k.h:326
-msgid "Disable ID based shared library"
+#: tree-cfg.c:5045 tree-cfg.c:5049
+#, gcc-internal-format
+msgid "%H%<noreturn%> function does return"
msgstr ""
-#: config/m68k/m68k.h:328
-msgid "Generate pc-relative code"
+#: tree-cfg.c:5070 tree-cfg.c:5075
+#, gcc-internal-format
+msgid "%Hcontrol reaches end of non-void function"
msgstr ""
-#: config/m68k/m68k.h:330
-msgid "Do not use unaligned memory references"
+#: tree-cfg.c:5135
+#, gcc-internal-format
+msgid "%Jfunction might be possible candidate for attribute %<noreturn%>"
msgstr ""
-#: config/m68k/m68k.h:332
-msgid "Use unaligned memory references"
+#: tree-dump.c:851
+#, gcc-internal-format
+msgid "could not open dump file %qs: %s"
msgstr ""
-#: config/m68k/m68k.h:334
-msgid "Use different calling convention using 'rtd'"
+#: tree-dump.c:967
+#, gcc-internal-format
+msgid "ignoring unknown option %q.*s in %<-fdump-%s%>"
msgstr ""
-#. TARGET_DEFAULT is defined in m68k-none.h, netbsd.h, etc.
-#: config/m68k/m68k.h:344
-msgid "ID of shared library to build"
+#: tree-eh.c:1767
+#, gcc-internal-format
+msgid "EH edge %i->%i is missing %i %i."
msgstr ""
-#: config/mips/mips.c:4266
-#, c-format
-msgid ""
-"-%s conflicts with the other architecture options, which specify a %s "
-"processor"
+#: tree-eh.c:1772
+#, gcc-internal-format
+msgid "EH edge %i->%i miss EH flag."
msgstr ""
-#: config/mips/mips.c:4282
-#, c-format
-msgid "-march=%s is not compatible with the selected ABI"
+#. ??? might not be mistake.
+#: tree-eh.c:1778
+#, gcc-internal-format
+msgid "EH edge %i->%i has duplicated regions."
msgstr ""
-#: config/mips/mips.c:4297
-msgid "-mgp64 used with a 32-bit processor"
+#: tree-eh.c:1812
+#, gcc-internal-format
+msgid "BB %i can not throw but has EH edges"
msgstr ""
-#: config/mips/mips.c:4299
-msgid "-mgp32 used with a 64-bit ABI"
+#: tree-eh.c:1819
+#, gcc-internal-format
+msgid "BB %i last statement has incorrectly set region"
msgstr ""
-#: config/mips/mips.c:4301
-msgid "-mgp64 used with a 32-bit ABI"
+#: tree-eh.c:1830
+#, gcc-internal-format
+msgid "Unnecessary EH edge %i->%i"
msgstr ""
-#: config/mips/mips.c:4319 config/mips/mips.c:4321 config/mips/mips.c:4323
-#: config/mips/mips.c:4356 config/mips/mips.c:4412
-#, c-format
-msgid "unsupported combination: %s"
+#: tree-inline.c:1302
+#, gcc-internal-format
+msgid ""
+"%Jfunction %qF can never be inlined because it uses alloca (override using "
+"the always_inline attribute)"
msgstr ""
-#: config/mips/mips.c:4353
-msgid "-mint64 is a deprecated option"
+#: tree-inline.c:1314
+#, gcc-internal-format
+msgid "%Jfunction %qF can never be inlined because it uses setjmp"
msgstr ""
-#: config/mips/mips.c:4407
+#: tree-inline.c:1328
+#, gcc-internal-format
msgid ""
-"generation of Branch Likely instructions enabled, but not supported by "
-"architecture"
+"%Jfunction %qF can never be inlined because it uses variable argument lists"
msgstr ""
-#: config/mips/mips.c:4424
-msgid "-G is incompatible with PIC code which is the default"
+#: tree-inline.c:1339
+#, gcc-internal-format
+msgid ""
+"%Jfunction %qF can never be inlined because it uses setjmp-longjmp exception "
+"handling"
msgstr ""
-#: config/mips/mips.c:4491
-msgid "-mips3d requires -mpaired-single"
+#: tree-inline.c:1346
+#, gcc-internal-format
+msgid "%Jfunction %qF can never be inlined because it uses non-local goto"
msgstr ""
-#: config/mips/mips.c:4500
-msgid "-mips3d/-mpaired-single must be used with -mfp64 -mhard-float"
+#: tree-inline.c:1357
+#, gcc-internal-format
+msgid ""
+"%Jfunction %qF can never be inlined because it uses __builtin_return or "
+"__builtin_apply_args"
msgstr ""
-#: config/mips/mips.c:4505
-msgid "-mips3d/-mpaired-single must be used with -mips64"
+#: tree-inline.c:1376
+#, gcc-internal-format
+msgid "%Jfunction %qF can never be inlined because it contains a computed goto"
msgstr ""
-#: config/mips/mips.c:4880
-msgid "mips_debugger_offset called with non stack/frame/arg pointer"
+#: tree-inline.c:1390
+#, gcc-internal-format
+msgid ""
+"%Jfunction %qF can never be inlined because it receives a non-local goto"
msgstr ""
-#: config/mips/mips.c:5006
-#, c-format
-msgid "internal error: %%) found without a %%( in assembler pattern"
+#: tree-inline.c:1415
+#, gcc-internal-format
+msgid ""
+"%Jfunction %qF can never be inlined because it uses variable sized variables"
msgstr ""
-#: config/mips/mips.c:5020
-#, c-format
-msgid "internal error: %%] found without a %%[ in assembler pattern"
+#: tree-inline.c:1947 tree-inline.c:1955
+#, gcc-internal-format
+msgid "%Jinlining failed in call to %qF: %s"
msgstr ""
-#: config/mips/mips.c:5033
-#, c-format
-msgid "internal error: %%> found without a %%< in assembler pattern"
+#: tree-inline.c:1948 tree-inline.c:1956
+#, gcc-internal-format
+msgid "called from here"
msgstr ""
-#: config/mips/mips.c:5046
-#, c-format
-msgid "internal error: %%} found without a %%{ in assembler pattern"
+#: tree-mudflap.c:839
+#, gcc-internal-format
+msgid "mudflap checking not yet implemented for ARRAY_RANGE_REF"
msgstr ""
-#: config/mips/mips.c:5060
-#, c-format
-msgid "PRINT_OPERAND: unknown punctuation '%c'"
+#: tree-mudflap.c:1030
+#, gcc-internal-format
+msgid "mudflap cannot track %qs in stub function"
msgstr ""
-#: config/mips/mips.c:5089
-#, c-format
-msgid "PRINT_OPERAND, invalid insn for %%C"
+#: tree-mudflap.c:1257
+#, gcc-internal-format
+msgid "mudflap cannot track unknown size extern %qs"
msgstr ""
-#: config/mips/mips.c:5106
-#, c-format
-msgid "PRINT_OPERAND, invalid insn for %%N"
+#: tree-nomudflap.c:51
+#, gcc-internal-format
+msgid "mudflap: this language is not supported"
msgstr ""
-#: config/mips/mips.c:5115
-#, c-format
-msgid "PRINT_OPERAND, invalid insn for %%F"
+#: tree-optimize.c:850
+#, gcc-internal-format
+msgid "%Jsize of return value of %qD is %u bytes"
msgstr ""
-#: config/mips/mips.c:5124
-#, c-format
-msgid "PRINT_OPERAND, invalid insn for %%W"
+#: tree-optimize.c:853
+#, gcc-internal-format
+msgid "%Jsize of return value of %qD is larger than %wd bytes"
msgstr ""
-#: config/mips/mips.c:5145
-#, c-format
-msgid "invalid %%Y value"
+#: tree-outof-ssa.c:614 tree-outof-ssa.c:629 tree-outof-ssa.c:643
+#: tree-outof-ssa.c:665 tree-outof-ssa.c:1033 tree-outof-ssa.c:1841
+#: tree-ssa-live.c:414 tree-ssa-live.c:1799
+#, gcc-internal-format
+msgid "SSA corruption"
msgstr ""
-#: config/mips/mips.c:5223
-msgid "PRINT_OPERAND, invalid operand for relocation"
+#: tree-outof-ssa.c:2256
+#, gcc-internal-format
+msgid " Pending stmts not issued on PRED edge (%d, %d)\n"
msgstr ""
-#: config/mips/mips.c:7820
-#, c-format
-msgid "cannot handle inconsistent calls to %qs"
+#: tree-outof-ssa.c:2262
+#, gcc-internal-format
+msgid " Pending stmts not issued on SUCC edge (%d, %d)\n"
msgstr ""
-#: config/mips/mips.c:9222
-msgid "the cpu name must be lower case"
+#: tree-outof-ssa.c:2269
+#, gcc-internal-format
+msgid " Pending stmts not issued on ENTRY edge (%d, %d)\n"
msgstr ""
-#. Output assembler code to FILE to increment profiler label # LABELNO
-#. for profiling a function entry.
-#: config/mips/mips.h:2016
-msgid "mips16 function profiling"
+#: tree-outof-ssa.c:2275
+#, gcc-internal-format
+msgid " Pending stmts not issued on EXIT edge (%d, %d)\n"
msgstr ""
-#: config/mmix/mmix.c:229
-#, c-format
-msgid "-f%s not supported: ignored"
+#: tree-profile.c:216
+#, gcc-internal-format
+msgid "unimplemented functionality"
msgstr ""
-#: config/mmix/mmix.c:657
-#, c-format
-msgid "support for mode %qs"
+#: tree-ssa-operands.c:1482
+#, gcc-internal-format
+msgid "internal error"
msgstr ""
-#: config/mmix/mmix.c:671
-#, c-format
-msgid ""
-"too large function value type, needs %d registers, have only %d registers "
-"for this"
+#: tree-ssa.c:111
+#, gcc-internal-format
+msgid "Expected an SSA_NAME object"
msgstr ""
-#: config/mmix/mmix.c:841
-msgid "function_profiler support for MMIX"
+#: tree-ssa.c:117
+#, gcc-internal-format
+msgid "Type mismatch between an SSA_NAME and its symbol."
msgstr ""
-#: config/mmix/mmix.c:863
-msgid "MMIX Internal: Last named vararg would not fit in a register"
+#: tree-ssa.c:123
+#, gcc-internal-format
+msgid "Found an SSA_NAME that had been released into the free pool"
msgstr ""
-#: config/mmix/mmix.c:1471 config/mmix/mmix.c:1601
-msgid "MMIX Internal: Expected a CONST_INT, not this"
+#: tree-ssa.c:129
+#, gcc-internal-format
+msgid "Found a virtual definition for a GIMPLE register"
msgstr ""
-#: config/mmix/mmix.c:1479 config/mmix/mmix.c:1503 config/mmix/mmix.c:1619
-#, c-format
-msgid "MMIX Internal: Bad register: %d"
+#: tree-ssa.c:135
+#, gcc-internal-format
+msgid "Found a real definition for a non-register"
msgstr ""
-#: config/mmix/mmix.c:1550
-msgid "MMIX Internal: Bad value for 'm', not a CONST_INT"
+#: tree-ssa.c:142
+#, gcc-internal-format
+msgid "Found real variable when subvariables should have appeared"
msgstr ""
-#: config/mmix/mmix.c:1569
-msgid "MMIX Internal: Expected a register, not this"
+#: tree-ssa.c:171
+#, gcc-internal-format
+msgid "SSA_NAME created in two different blocks %i and %i"
msgstr ""
-#: config/mmix/mmix.c:1579
-msgid "MMIX Internal: Expected a constant, not this"
+#: tree-ssa.c:180
+#, gcc-internal-format
+msgid "SSA_NAME_DEF_STMT is wrong"
msgstr ""
-#. Presumably there's a missing case above if we get here.
-#: config/mmix/mmix.c:1611
-#, c-format
-msgid "MMIX Internal: Missing %qc case in mmix_print_operand"
+#: tree-ssa.c:238
+#, gcc-internal-format
+msgid "Missing definition"
msgstr ""
-#. We need the original here.
-#: config/mmix/mmix.c:1663
-msgid "MMIX Internal: Cannot decode this operand"
+#: tree-ssa.c:244
+#, gcc-internal-format
+msgid "Definition in block %i does not dominate use in block %i"
msgstr ""
-#: config/mmix/mmix.c:1720
-msgid "MMIX Internal: This is not a recognized address"
+#: tree-ssa.c:252
+#, gcc-internal-format
+msgid "Definition in block %i follows the use"
msgstr ""
-#: config/mmix/mmix.c:1897
-#, c-format
-msgid "stack frame not a multiple of 8 bytes: %d"
+#: tree-ssa.c:259
+#, gcc-internal-format
+msgid "SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set"
msgstr ""
-#: config/mmix/mmix.c:2133
-#, c-format
-msgid "stack frame not a multiple of octabyte: %d"
+#: tree-ssa.c:267
+#, gcc-internal-format
+msgid "No immediate_use list"
msgstr ""
-#: config/mmix/mmix.c:2606 config/mmix/mmix.c:2670
-#, c-format
-msgid "MMIX Internal: %s is not a shiftable int"
+#: tree-ssa.c:279
+#, gcc-internal-format
+msgid "Wrong immediate use list"
msgstr ""
-#: config/mmix/mmix.c:2786
-msgid "MMIX Internal: Trying to output invalidly reversed condition:"
+#: tree-ssa.c:312
+#, gcc-internal-format
+msgid "Incoming edge count does not match number of PHI arguments\n"
msgstr ""
-#: config/mmix/mmix.c:2793
-msgid "MMIX Internal: What's the CC of this?"
+#: tree-ssa.c:327
+#, gcc-internal-format
+msgid "PHI argument is missing for edge %d->%d\n"
msgstr ""
-#: config/mmix/mmix.c:2797
-msgid "MMIX Internal: What is the CC of this?"
+#: tree-ssa.c:336
+#, gcc-internal-format
+msgid "PHI argument is not SSA_NAME, or invariant"
msgstr ""
-#: config/mmix/mmix.c:2867
-msgid "MMIX Internal: This is not a constant:"
+#: tree-ssa.c:348
+#, gcc-internal-format
+msgid "Wrong edge %d->%d for PHI argument\n"
msgstr ""
-#: config/mmix/mmix.h:132
-msgid "Set start-address of the program"
+#: tree-ssa.c:398
+#, gcc-internal-format
+msgid "Non-addressable variable inside an alias set."
msgstr ""
-#: config/mmix/mmix.h:134
-msgid "Set start-address of data"
+#: tree-ssa.c:416
+#, gcc-internal-format
+msgid "Addressable variable that is an alias tag but is not in any alias set."
msgstr ""
-#. FIXME: Provide a way to *load* the epsilon register.
-#: config/mmix/mmix.h:198
-msgid "For intrinsics library: pass all parameters in registers"
+#: tree-ssa.c:426
+#, gcc-internal-format
+msgid "verify_flow_insensitive_alias_info failed."
msgstr ""
-#: config/mmix/mmix.h:201
-msgid "Use register stack for parameters and return value"
+#: tree-ssa.c:468
+#, gcc-internal-format
+msgid "Dereferenced pointers should have a name or a type tag"
msgstr ""
-#: config/mmix/mmix.h:203
-msgid "Use call-clobbered registers for parameters and return value"
+#: tree-ssa.c:476
+#, gcc-internal-format
+msgid ""
+"Pointers with a memory tag, should have points-to sets or point to malloc"
msgstr ""
-#: config/mmix/mmix.h:205
-msgid "Use epsilon-respecting floating point compare instructions"
+#: tree-ssa.c:484
+#, gcc-internal-format
+msgid "Pointer escapes but its name tag is not call-clobbered."
msgstr ""
-#: config/mmix/mmix.h:208
-msgid "Use zero-extending memory loads, not sign-extending ones"
+#: tree-ssa.c:493
+#, gcc-internal-format
+msgid "verify_flow_sensitive_alias_info failed."
msgstr ""
-#: config/mmix/mmix.h:211
+#: tree-ssa.c:570
+#, gcc-internal-format
msgid ""
-"Generate divide results with reminder having the same sign as the divisor "
-"(not the dividend)"
+"Alias set of a pointer's type tag should be a superset of the corresponding "
+"name tag"
msgstr ""
-#: config/mmix/mmix.h:215
-msgid "Prepend global symbols with \":\" (for use with PREFIX)"
+#: tree-ssa.c:586
+#, gcc-internal-format
+msgid ""
+"Two different pointers with identical points-to sets but different name tags"
msgstr ""
-#: config/mmix/mmix.h:217
-msgid "Do not provide a default start-address 0x100 of the program"
+#: tree-ssa.c:618
+#, gcc-internal-format
+msgid "verify_name_tags failed"
msgstr ""
-#: config/mmix/mmix.h:219
-msgid "Link to emit program in ELF format (rather than mmo)"
+#: tree-ssa.c:689
+#, gcc-internal-format
+msgid "AUX pointer initialized for edge %d->%d\n"
msgstr ""
-#: config/mmix/mmix.h:221
-msgid "Use P-mnemonics for branches statically predicted as taken"
+#: tree-ssa.c:712
+#, gcc-internal-format
+msgid "Stmt (%p) marked modified after optimization pass : "
msgstr ""
-#: config/mmix/mmix.h:223
-msgid "Don't use P-mnemonics for branches"
+#: tree-ssa.c:730
+#, gcc-internal-format
+msgid "Statement makes a memory store, but has no V_MAY_DEFS nor V_MUST_DEFS"
msgstr ""
-#: config/mmix/mmix.h:225
-msgid "Use addresses that allocate global registers"
+#: tree-ssa.c:741
+#, gcc-internal-format
+msgid "Statement makes aliased stores, but has no V_MAY_DEFS"
msgstr ""
-#: config/mmix/mmix.h:227
-msgid "Do not use addresses that allocate global registers"
+#: tree-ssa.c:780
+#, gcc-internal-format
+msgid "verify_ssa failed."
msgstr ""
-#: config/mmix/mmix.h:229
-msgid "Generate a single exit point for each function"
+#: tree-ssa.c:1126
+#, gcc-internal-format
+msgid "%H%qD is used uninitialized in this function"
msgstr ""
-#: config/mmix/mmix.h:231
-msgid "Do not generate a single exit point for each function"
+#: tree-ssa.c:1151
+#, gcc-internal-format
+msgid "%H%qD may be used uninitialized in this function"
msgstr ""
-#: config/pa/pa.c:417
-#, c-format
-msgid ""
-"unknown -mschedule= option (%s).\n"
-"Valid options are 700, 7100, 7100LC, 7200, 7300, and 8000\n"
+#: tree-vect-transform.c:597
+#, gcc-internal-format
+msgid "no support for induction"
msgstr ""
-#: config/pa/pa.c:442
-#, c-format
-msgid ""
-"unknown -march= option (%s).\n"
-"Valid options are 1.0, 1.1, and 2.0\n"
+#: tree.c:3312 config/darwin.c:1225 config/arm/arm.c:2808
+#: config/arm/arm.c:2836 config/avr/avr.c:4650 config/h8300/h8300.c:5282
+#: config/h8300/h8300.c:5306 config/i386/i386.c:1770 config/i386/i386.c:15983
+#: config/ia64/ia64.c:515 config/ip2k/ip2k.c:3164
+#: config/m68hc11/m68hc11.c:1118 config/sh/symbian.c:408
+#: config/sh/symbian.c:415
+#, gcc-internal-format
+msgid "%qs attribute ignored"
msgstr ""
-#: config/pa/pa.c:462
-#, c-format
-msgid ""
-"unknown -munix= option (%s).\n"
-"Valid options are 93, 95 and 98.\n"
+#: tree.c:3331
+#, gcc-internal-format
+msgid "%Jfunction %qD definition is marked dllimport."
msgstr ""
-#: config/pa/pa.c:467
-#, c-format
-msgid ""
-"unknown -munix= option (%s).\n"
-"Valid options are 93 and 95.\n"
+#: tree.c:3339
+#, gcc-internal-format
+msgid "%Jvariable %qD definition is marked dllimport."
msgstr ""
-#: config/pa/pa.c:471
-#, c-format
-msgid ""
-"unknown -munix= option (%s).\n"
-"Valid option is 93.\n"
+#: tree.c:3359
+#, gcc-internal-format
+msgid "%Jexternal linkage required for symbol %qD because of %qs attribute."
msgstr ""
-#: config/pa/pa.c:488
-msgid "PIC code generation is not supported in the portable runtime model\n"
+#: tree.c:4622
+#, gcc-internal-format
+msgid "arrays of functions are not meaningful"
msgstr ""
-#: config/pa/pa.c:493
-msgid "PIC code generation is not compatible with fast indirect calls\n"
+#: tree.c:4674
+#, gcc-internal-format
+msgid "function return type cannot be function"
msgstr ""
-#: config/pa/pa.c:498
-msgid "-g is only supported when using GAS on this processor,"
+#: tree.c:5570
+#, gcc-internal-format
+msgid "tree check: %s, have %s in %s, at %s:%d"
msgstr ""
-#: config/pa/pa.c:499
-msgid "-g option disabled"
+#: tree.c:5607
+#, gcc-internal-format
+msgid "tree check: expected none of %s, have %s in %s, at %s:%d"
msgstr ""
-#: config/pa/pa.c:7903
-#, c-format
-msgid ""
-"alignment (%u) for %s exceeds maximum alignment for global common data. "
-"Using %u"
+#: tree.c:5620
+#, gcc-internal-format
+msgid "tree check: expected class %qs, have %qs (%s) in %s, at %s:%d"
msgstr ""
-#: config/pa/pa-hpux.h:96 config/pa/pa64-hpux.h:26
-msgid "Generate cpp defines for server IO"
+#: tree.c:5634
+#, gcc-internal-format
+msgid "tree check: accessed elt %d of tree_vec with %d elts in %s, at %s:%d"
msgstr ""
-#: config/pa/pa-hpux.h:97 config/pa/pa64-hpux.h:28
-msgid "Generate cpp defines for workstation IO"
+#: tree.c:5646
+#, gcc-internal-format
+msgid "tree check: accessed elt %d of phi_node with %d elts in %s, at %s:%d"
+msgstr ""
+
+#: tree.c:5658
+#, gcc-internal-format
+msgid "tree check: accessed operand %d of %s with %d operands in %s, at %s:%d"
+msgstr ""
+
+#: varasm.c:466
+#, gcc-internal-format
+msgid "%J%D causes a section type conflict"
+msgstr ""
+
+#: varasm.c:927
+#, gcc-internal-format
+msgid "%Jregister name not specified for %qD"
+msgstr ""
+
+#: varasm.c:929
+#, gcc-internal-format
+msgid "%Jinvalid register name for %qD"
+msgstr ""
+
+#: varasm.c:931
+#, gcc-internal-format
+msgid "%Jdata type of %qD isn%'t suitable for a register"
msgstr ""
-#: config/pa/pa-hpux10.h:84
+#: varasm.c:934
+#, gcc-internal-format
+msgid "%Jregister specified for %qD isn%'t suitable for data type"
+msgstr ""
+
+#: varasm.c:944
+#, gcc-internal-format
+msgid "global register variable has initial value"
+msgstr ""
+
+#: varasm.c:947
+#, gcc-internal-format
+msgid "volatile register variables don%'t work as you might wish"
+msgstr ""
+
+#: varasm.c:985
+#, gcc-internal-format
+msgid "%Jregister name given for non-register variable %qD"
+msgstr ""
+
+#: varasm.c:1062
+#, gcc-internal-format
+msgid "global destructors not supported on this target"
+msgstr ""
+
+#: varasm.c:1123
+#, gcc-internal-format
+msgid "global constructors not supported on this target"
+msgstr ""
+
+#: varasm.c:1697
+#, gcc-internal-format
msgid ""
-"Specify UNIX standard for predefines and linking.\n"
-"Supported value is 93."
+"%Jalignment of %qD is greater than maximum object file alignment. Using %d"
+msgstr ""
+
+#: varasm.c:1736
+#, gcc-internal-format
+msgid "thread-local COMMON data not implemented"
msgstr ""
-#: config/pa/pa-hpux1010.h:28 config/pa/pa-hpux11.h:99
+#: varasm.c:1761
+#, gcc-internal-format
msgid ""
-"Specify UNIX standard for predefines and linking.\n"
-"Supported values are 93 and 95."
+"%Jrequested alignment for %qD is greater than implemented alignment of %d"
msgstr ""
-#: config/pa/pa-hpux11.h:82
-msgid "-munix=98 option required for C89 Amendment 1 features.\n"
+#: varasm.c:3879
+#, gcc-internal-format
+msgid "initializer for integer value is too complicated"
+msgstr ""
+
+#: varasm.c:3884
+#, gcc-internal-format
+msgid "initializer for floating value is not a floating constant"
msgstr ""
-#: config/pa/pa-hpux1111.h:28
+#: varasm.c:4151
+#, gcc-internal-format
+msgid "invalid initial value for member %qs"
+msgstr ""
+
+#: varasm.c:4350 varasm.c:4394
+#, gcc-internal-format
+msgid "%Jweak declaration of %qD must precede definition"
+msgstr ""
+
+#: varasm.c:4358
+#, gcc-internal-format
msgid ""
-"Specify UNIX standard for predefines and linking.\n"
-"Supported values are 93, 95 and 98."
+"%Jweak declaration of %qD after first use results in unspecified behavior"
msgstr ""
-#. 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.
-#: config/pa/pa.h:254 config/pa/pa.h:260
-msgid "Generate PA1.1 code"
+#: varasm.c:4392
+#, gcc-internal-format
+msgid "%Jweak declaration of %qD must be public"
msgstr ""
-#: config/pa/pa.h:256 config/pa/pa.h:258
-msgid "Generate PA1.0 code"
+#: varasm.c:4401
+#, gcc-internal-format
+msgid "%Jweak declaration of %qD not supported"
msgstr ""
-#: config/pa/pa.h:262
-msgid "Generate PA2.0 code (requires binutils 2.10 or later)"
+#: varasm.c:4430
+#, gcc-internal-format
+msgid "only weak aliases are supported in this configuration"
msgstr ""
-#: config/pa/pa.h:264
-msgid "Disable FP regs"
+#: varasm.c:4598
+#, gcc-internal-format
+msgid "%J%qD aliased to undefined symbol %qE"
msgstr ""
-#: config/pa/pa.h:266
-msgid "Do not disable FP regs"
+#: varasm.c:4601
+#, gcc-internal-format
+msgid "%J%qD aliased to external symbol %qE"
msgstr ""
-#: config/pa/pa.h:268
-msgid "Disable space regs"
+#: varasm.c:4632
+#, gcc-internal-format
+msgid "%Jalias definitions not supported in this configuration"
msgstr ""
-#: config/pa/pa.h:270
-msgid "Do not disable space regs"
+#: varasm.c:4637
+#, gcc-internal-format
+msgid "%Jonly weak aliases are supported in this configuration"
msgstr ""
-#: config/pa/pa.h:272
-msgid "Put jumps in call delay slots"
+#: varasm.c:4692
+#, gcc-internal-format
+msgid "visibility attribute not supported in this configuration; ignored"
msgstr ""
-#: config/pa/pa.h:274
-msgid "Do not put jumps in call delay slots"
+#: varray.c:207
+#, gcc-internal-format
+msgid "virtual array %s[%lu]: element %lu out of bounds in %s, at %s:%d"
msgstr ""
-#: config/pa/pa.h:276
-msgid "Disable indexed addressing"
+#: varray.c:217
+#, gcc-internal-format
+msgid "underflowed virtual array %s in %s, at %s:%d"
msgstr ""
-#: config/pa/pa.h:278
-msgid "Do not disable indexed addressing"
+#: vec.c:153
+#, gcc-internal-format
+msgid "vector %s %s domain error, in %s at %s:%u"
msgstr ""
-#: config/pa/pa.h:280
-msgid "Use portable calling conventions"
+#. Print an error message for unrecognized stab codes.
+#: xcoffout.c:187
+#, gcc-internal-format
+msgid "no sclass for %s stab (0x%x)\n"
msgstr ""
-#: config/pa/pa.h:282
-msgid "Do not use portable calling conventions"
+#: config/darwin-c.c:84
+#, gcc-internal-format
+msgid "too many #pragma options align=reset"
msgstr ""
-#: config/pa/pa.h:284
-msgid "Assume code will be assembled by GAS"
+#: config/darwin-c.c:104 config/darwin-c.c:107 config/darwin-c.c:109
+#: config/darwin-c.c:111
+#, gcc-internal-format
+msgid "malformed '#pragma options', ignoring"
msgstr ""
-#: config/pa/pa.h:286
-msgid "Do not assume code will be assembled by GAS"
+#: config/darwin-c.c:114
+#, gcc-internal-format
+msgid "junk at end of '#pragma options'"
msgstr ""
-#: config/pa/pa.h:288 config/frv/frv.opt:174
-msgid "Use software floating point"
+#: config/darwin-c.c:124
+#, gcc-internal-format
+msgid "malformed '#pragma options align={mac68k|power|reset}', ignoring"
msgstr ""
-#: config/pa/pa.h:290
-msgid "Do not use software floating point"
+#: config/darwin-c.c:136
+#, gcc-internal-format
+msgid "missing '(' after '#pragma unused', ignoring"
msgstr ""
-#: config/pa/pa.h:292
-msgid "Emit long load/store sequences"
+#: config/darwin-c.c:154
+#, gcc-internal-format
+msgid "missing ')' after '#pragma unused', ignoring"
msgstr ""
-#: config/pa/pa.h:294
-msgid "Do not emit long load/store sequences"
+#: config/darwin-c.c:157
+#, gcc-internal-format
+msgid "junk at end of '#pragma unused'"
msgstr ""
-#: config/pa/pa.h:296
-msgid "Generate fast indirect calls"
+#: config/darwin-c.c:383
+#, gcc-internal-format
+msgid "subframework include %s conflicts with framework include"
msgstr ""
-#: config/pa/pa.h:298
-msgid "Do not generate fast indirect calls"
+#: config/darwin.c:1339
+#, gcc-internal-format
+msgid ""
+"internal and protected visibility attributes not supported in this "
+"configuration; ignored"
msgstr ""
-#: config/pa/pa.h:300
-msgid "Generate code for huge switch statements"
+#: config/host-darwin.c:63
+#, gcc-internal-format
+msgid "couldn't unmap pch_address_space: %m\n"
msgstr ""
-#: config/pa/pa.h:302
-msgid "Do not generate code for huge switch statements"
+#: config/sol2-c.c:94 config/sol2-c.c:110
+#, gcc-internal-format
+msgid "malformed %<#pragma align%>, ignoring"
msgstr ""
-#: config/pa/pa.h:304
-msgid "Always generate long calls"
+#: config/sol2-c.c:103
+#, gcc-internal-format
+msgid "invalid alignment for %<#pragma align%>, ignoring"
msgstr ""
-#: config/pa/pa.h:306
-msgid "Generate long calls only when needed"
+#: config/sol2-c.c:118
+#, gcc-internal-format
+msgid "%<#pragma align%> must appear before the declaration of %D, ignoring"
msgstr ""
-#: config/pa/pa.h:308
-msgid "Enable linker optimizations"
+#: config/sol2-c.c:130 config/sol2-c.c:142
+#, gcc-internal-format
+msgid "malformed %<#pragma align%>"
msgstr ""
-#: config/pa/pa.h:332
-msgid ""
-"Specify PA-RISC architecture for code generation.\n"
-"Values are 1.0, 1.1 and 2.0."
+#: config/sol2-c.c:137
+#, gcc-internal-format
+msgid "junk at end of %<#pragma align%>"
msgstr ""
-#: config/pa/pa.h:335
-msgid "Specify range of registers to make fixed."
+#: config/sol2-c.c:158 config/sol2-c.c:165
+#, gcc-internal-format
+msgid "malformed %<#pragma init%>, ignoring"
msgstr ""
-#: config/pa/pa.h:337
-msgid "Specify CPU for scheduling purposes."
+#: config/sol2-c.c:188 config/sol2-c.c:200
+#, gcc-internal-format
+msgid "malformed %<#pragma init%>"
msgstr ""
-#: config/pa/pa64-hpux.h:30
-msgid "Assume code will be linked by GNU ld"
+#: config/sol2-c.c:195
+#, gcc-internal-format
+msgid "junk at end of %<#pragma init%>"
msgstr ""
-#: config/pa/pa64-hpux.h:32
-msgid "Assume code will be linked by HP ld"
+#: config/sol2-c.c:216 config/sol2-c.c:223
+#, gcc-internal-format
+msgid "malformed %<#pragma fini%>, ignoring"
msgstr ""
-#: config/rs6000/host-darwin.c:52
-msgid "Segmentation Fault (code)"
+#: config/sol2-c.c:246 config/sol2-c.c:258
+#, gcc-internal-format
+msgid "malformed %<#pragma fini%>"
msgstr ""
-#: config/rs6000/host-darwin.c:83
-msgid "Out of stack space.\n"
+#: config/sol2-c.c:253
+#, gcc-internal-format
+msgid "junk at end of %<#pragma fini%>"
msgstr ""
-#: config/rs6000/host-darwin.c:104
-#, c-format
-msgid "Try running '%s' in the shell to raise its limit.\n"
+#: config/sol2.c:54
+#, gcc-internal-format
+msgid "%Jignoring %<#pragma align%> for explicitly aligned %<%D%>"
msgstr ""
-#: config/rs6000/host-darwin.c:117
-msgid "Segmentation Fault"
+#. Mach-O supports 'weak imports', and 'weak definitions' in coalesced
+#. sections. machopic_select_section ensures that weak variables go in
+#. coalesced sections. Weak aliases (or any other kind of aliases) are
+#. not supported. Weak symbols that aren't visible outside the .s file
+#. are not supported.
+#: config/darwin.h:378
+#, gcc-internal-format
+msgid "alias definitions not supported in Mach-O; ignored"
msgstr ""
-#: config/rs6000/host-darwin.c:131
-#, c-format
-msgid "While setting up signal stack: %m"
+#: config/windiss.h:37
+#, gcc-internal-format
+msgid "profiler support for WindISS"
msgstr ""
-#: config/rs6000/host-darwin.c:137
-#, c-format
-msgid "While setting up signal handler: %m"
+#: config/alpha/alpha.c:231 config/rs6000/rs6000.c:1537
+#, gcc-internal-format
+msgid "bad value %qs for -mtls-size switch"
msgstr ""
-#. Handle the machine specific pragma longcall. Its syntax is
-#.
-#. # pragma longcall ( TOGGLE )
-#.
-#. where TOGGLE is either 0 or 1.
-#.
-#. rs6000_default_long_calls is set to the value of TOGGLE, changing
-#. whether or not new function declarations receive a longcall
-#. attribute by default.
-#: config/rs6000/rs6000-c.c:46
-msgid "ignoring malformed #pragma longcall"
+#: config/alpha/alpha.c:270
+#, gcc-internal-format
+msgid "-f%s ignored for Unicos/Mk (not supported)"
msgstr ""
-#: config/rs6000/rs6000-c.c:59
-msgid "missing open paren"
+#: config/alpha/alpha.c:294
+#, gcc-internal-format
+msgid "-mieee not supported on Unicos/Mk"
msgstr ""
-#: config/rs6000/rs6000-c.c:61
-msgid "missing number"
+#: config/alpha/alpha.c:305
+#, gcc-internal-format
+msgid "-mieee-with-inexact not supported on Unicos/Mk"
msgstr ""
-#: config/rs6000/rs6000-c.c:63
-msgid "missing close paren"
+#: config/alpha/alpha.c:322
+#, gcc-internal-format
+msgid "bad value %qs for -mtrap-precision switch"
msgstr ""
-#: config/rs6000/rs6000-c.c:66
-msgid "number must be 0 or 1"
+#: config/alpha/alpha.c:336
+#, gcc-internal-format
+msgid "bad value %qs for -mfp-rounding-mode switch"
msgstr ""
-#: config/rs6000/rs6000-c.c:69
-msgid "junk at end of #pragma longcall"
+#: config/alpha/alpha.c:351
+#, gcc-internal-format
+msgid "bad value %qs for -mfp-trap-mode switch"
msgstr ""
-#: config/rs6000/rs6000.c:1252
-msgid "-mmultiple is not supported on little endian systems"
+#: config/alpha/alpha.c:365 config/alpha/alpha.c:377
+#, gcc-internal-format
+msgid "bad value %qs for -mcpu switch"
msgstr ""
-#: config/rs6000/rs6000.c:1259
-msgid "-mstring is not supported on little endian systems"
+#: config/alpha/alpha.c:384
+#, gcc-internal-format
+msgid "trap mode not supported on Unicos/Mk"
msgstr ""
-#: config/rs6000/rs6000.c:1273
-#, c-format
-msgid "unknown -mdebug-%s switch"
+#: config/alpha/alpha.c:391
+#, gcc-internal-format
+msgid "fp software completion requires -mtrap-precision=i"
msgstr ""
-#: config/rs6000/rs6000.c:1285
-msgid ""
-"unknown -mtraceback arg %qs; expecting %<full%>, %<partial%> or %<none%>"
+#: config/alpha/alpha.c:407
+#, gcc-internal-format
+msgid "rounding mode not supported for VAX floats"
msgstr ""
-#: config/rs6000/rs6000.c:1296
-#, c-format
-msgid "Unknown switch -mlong-double-%s"
+#: config/alpha/alpha.c:412
+#, gcc-internal-format
+msgid "trap mode not supported for VAX floats"
msgstr ""
-#: config/rs6000/rs6000.c:1352
-msgid "AltiVec and E500 instructions cannot coexist"
+#: config/alpha/alpha.c:416
+#, gcc-internal-format
+msgid "128-bit long double not supported for VAX floats"
msgstr ""
-#: config/rs6000/rs6000.c:1620
-#, c-format
-msgid "unknown -m%s= option specified: '%s'"
+#: config/alpha/alpha.c:444
+#, gcc-internal-format
+msgid "L%d cache latency unknown for %s"
msgstr ""
-#: config/rs6000/rs6000.c:1641
-#, c-format
-msgid "not configured for ABI: '%s'"
+#: config/alpha/alpha.c:459
+#, gcc-internal-format
+msgid "bad value %qs for -mmemory-latency"
msgstr ""
-#: config/rs6000/rs6000.c:1649
-msgid "Using darwin64 ABI"
+#: config/alpha/alpha.c:6371 config/alpha/alpha.c:6374 config/s390/s390.c:7174
+#: config/s390/s390.c:7177
+#, gcc-internal-format
+msgid "bad builtin fcode"
msgstr ""
-#: config/rs6000/rs6000.c:1654
-msgid "Using old darwin ABI"
+#: config/arc/arc.c:390
+#, gcc-internal-format
+msgid "argument of %qs attribute is not a string constant"
msgstr ""
-#: config/rs6000/rs6000.c:1660
-#, c-format
-msgid "unknown ABI specified: '%s'"
+#: config/arc/arc.c:398
+#, gcc-internal-format
+msgid "argument of %qs attribute is not \"ilink1\" or \"ilink2\""
msgstr ""
-#: config/rs6000/rs6000.c:1677
-msgid "invalid option for -mfloat-gprs"
+#: config/arm/arm.c:861
+#, gcc-internal-format
+msgid "switch -mcpu=%s conflicts with -march= switch"
msgstr ""
-#: config/rs6000/rs6000.c:1693
-msgid ""
-"-malign-power is not supported for 64-bit Darwin; it is incompatible with "
-"the installed C and C++ libraries"
+#: config/arm/arm.c:871 config/rs6000/rs6000.c:1193 config/sparc/sparc.c:686
+#, gcc-internal-format
+msgid "bad value (%s) for %s switch"
msgstr ""
-#: config/rs6000/rs6000.c:1700
-#, c-format
-msgid "unknown -malign-XXXXX option specified: '%s'"
+#: config/arm/arm.c:981
+#, gcc-internal-format
+msgid "target CPU does not support interworking"
msgstr ""
-#: config/rs6000/rs6000.c:3859
-msgid ""
-"GCC vector returned by reference: non-standard ABI extension with no "
-"compatibility guarantee"
+#: config/arm/arm.c:987
+#, gcc-internal-format
+msgid "target CPU does not support THUMB instructions"
msgstr ""
-#: config/rs6000/rs6000.c:3932
+#: config/arm/arm.c:1000
+#, gcc-internal-format
msgid ""
-"Cannot return value in vector register because altivec instructions are "
-"disabled, use -maltivec to enable them."
+"enabling backtrace support is only meaningful when compiling for the Thumb"
msgstr ""
-#: config/rs6000/rs6000.c:4178
+#: config/arm/arm.c:1003
+#, gcc-internal-format
msgid ""
-"Cannot pass argument in vector register because altivec instructions are "
-"disabled, use -maltivec to enable them."
+"enabling callee interworking support is only meaningful when compiling for "
+"the Thumb"
msgstr ""
-#: config/rs6000/rs6000.c:5032
+#: config/arm/arm.c:1006
+#, gcc-internal-format
msgid ""
-"GCC vector passed by reference: non-standard ABI extension with no "
-"compatibility guarantee"
+"enabling caller interworking support is only meaningful when compiling for "
+"the Thumb"
msgstr ""
-#: config/rs6000/rs6000.c:5927
-msgid "argument 1 must be a 5-bit signed literal"
+#: config/arm/arm.c:1010
+#, gcc-internal-format
+msgid "-mapcs-stack-check incompatible with -mno-apcs-frame"
msgstr ""
-#: config/rs6000/rs6000.c:6030 config/rs6000/rs6000.c:6700
-msgid "argument 2 must be a 5-bit unsigned literal"
+#: config/arm/arm.c:1018
+#, gcc-internal-format
+msgid "-fpic and -mapcs-reent are incompatible"
msgstr ""
-#: config/rs6000/rs6000.c:6070
-msgid "argument 1 of __builtin_altivec_predicate must be a constant"
+#: config/arm/arm.c:1021
+#, gcc-internal-format
+msgid "APCS reentrant code not supported. Ignored"
msgstr ""
-#: config/rs6000/rs6000.c:6124
-msgid "argument 1 of __builtin_altivec_predicate is out of range"
+#: config/arm/arm.c:1029
+#, gcc-internal-format
+msgid "-g with -mno-apcs-frame may not give sensible debugging"
msgstr ""
-#: config/rs6000/rs6000.c:6286
-msgid "argument 3 must be a 4-bit unsigned literal"
+#: config/arm/arm.c:1037
+#, gcc-internal-format
+msgid "passing floating point arguments in fp regs not yet supported"
msgstr ""
-#: config/rs6000/rs6000.c:6458
-#, c-format
-msgid "argument to %qs must be a 2-bit unsigned literal"
+#: config/arm/arm.c:1078
+#, gcc-internal-format
+msgid "invalid ABI option: -mabi=%s"
msgstr ""
-#: config/rs6000/rs6000.c:6571
-msgid "argument to dss must be a 2-bit unsigned literal"
+#: config/arm/arm.c:1084
+#, gcc-internal-format
+msgid "iwmmxt requires an AAPCS compatible ABI for proper operation"
msgstr ""
-#: config/rs6000/rs6000.c:6586
-#, c-format
-msgid "invalid parameter combination for %qs AltiVec intrinsic"
+#: config/arm/arm.c:1087
+#, gcc-internal-format
+msgid "iwmmxt abi requires an iwmmxt capable cpu"
msgstr ""
-#: config/rs6000/rs6000.c:6820
-msgid "argument 1 of __builtin_spe_predicate must be a constant"
+#: config/arm/arm.c:1097
+#, gcc-internal-format
+msgid "invalid floating point emulation option: -mfpe=%s"
msgstr ""
-#: config/rs6000/rs6000.c:6893
-msgid "argument 1 of __builtin_spe_predicate is out of range"
+#: config/arm/arm.c:1114
+#, gcc-internal-format
+msgid "invalid floating point option: -mfpu=%s"
msgstr ""
-#: config/rs6000/rs6000.c:9215
-#, c-format
-msgid "invalid %%f value"
+#: config/arm/arm.c:1154
+#, gcc-internal-format
+msgid "invalid floating point abi: -mfloat-abi=%s"
msgstr ""
-#: config/rs6000/rs6000.c:9224
-#, c-format
-msgid "invalid %%F value"
+#: config/arm/arm.c:1161
+#, gcc-internal-format
+msgid "-mfloat-abi=hard and VFP"
msgstr ""
-#: config/rs6000/rs6000.c:9233
-#, c-format
-msgid "invalid %%G value"
+#: config/arm/arm.c:1187
+#, gcc-internal-format
+msgid "structure size boundary can only be set to %s"
msgstr ""
-#: config/rs6000/rs6000.c:9268
-#, c-format
-msgid "invalid %%j code"
+#: config/arm/arm.c:1196
+#, gcc-internal-format
+msgid "-mpic-register= is useless without -fpic"
msgstr ""
-#: config/rs6000/rs6000.c:9278
-#, c-format
-msgid "invalid %%J code"
+#: config/arm/arm.c:1203
+#, gcc-internal-format
+msgid "unable to use '%s' for PIC register"
msgstr ""
-#: config/rs6000/rs6000.c:9288
-#, c-format
-msgid "invalid %%k value"
+#: config/arm/arm.c:2776 config/arm/arm.c:2794 config/avr/avr.c:4670
+#: config/bfin/bfin.c:2557 config/c4x/c4x.c:4484 config/h8300/h8300.c:5258
+#: config/i386/i386.c:1742 config/i386/i386.c:1789 config/ip2k/ip2k.c:3183
+#: config/m68hc11/m68hc11.c:1155 config/m68k/m68k.c:376
+#: config/mcore/mcore.c:3032 config/ns32k/ns32k.c:1109
+#: config/rs6000/rs6000.c:16625 config/sh/sh.c:7397 config/sh/sh.c:7418
+#: config/sh/sh.c:7453 config/stormy16/stormy16.c:2279 config/v850/v850.c:2104
+#, gcc-internal-format
+msgid "%qs attribute only applies to functions"
msgstr ""
-#: config/rs6000/rs6000.c:9308 config/xtensa/xtensa.c:1678
-#, c-format
-msgid "invalid %%K value"
+#: config/arm/arm.c:11579
+#, gcc-internal-format
+msgid "unable to compute real location of stacked parameter"
msgstr ""
-#: config/rs6000/rs6000.c:9375
-#, c-format
-msgid "invalid %%O value"
+#. @@@ better error message
+#: config/arm/arm.c:12209 config/arm/arm.c:12246
+#, gcc-internal-format
+msgid "selector must be an immediate"
msgstr ""
-#: config/rs6000/rs6000.c:9422
-#, c-format
-msgid "invalid %%q value"
+#. @@@ better error message
+#: config/arm/arm.c:12289 config/i386/i386.c:14757 config/i386/i386.c:14791
+#, gcc-internal-format
+msgid "mask must be an immediate"
msgstr ""
-#: config/rs6000/rs6000.c:9466
-#, c-format
-msgid "invalid %%S value"
+#: config/arm/arm.c:12930
+#, gcc-internal-format
+msgid "no low registers available for popping high registers"
msgstr ""
-#: config/rs6000/rs6000.c:9508
-#, c-format
-msgid "invalid %%T value"
+#: config/arm/arm.c:13148
+#, gcc-internal-format
+msgid "interrupt Service Routines cannot be coded in Thumb mode"
msgstr ""
-#: config/rs6000/rs6000.c:9518
-#, c-format
-msgid "invalid %%u value"
+#: config/arm/pe.c:165 config/mcore/mcore.c:2898
+#, gcc-internal-format
+msgid "%Jinitialized variable '%D' is marked dllimport"
msgstr ""
-#: config/rs6000/rs6000.c:9527 config/xtensa/xtensa.c:1648
-#, c-format
-msgid "invalid %%v value"
+#: config/arm/pe.c:174
+#, gcc-internal-format
+msgid "%Jstatic variable '%D' is marked dllimport"
msgstr ""
-#: config/rs6000/rs6000.c:12191
-msgid "stack frame too large"
+#: config/avr/avr.c:525
+#, gcc-internal-format
+msgid "large frame pointer change (%d) with -mtiny-stack"
msgstr ""
-#: config/rs6000/rs6000.c:14709
-msgid "no profiling of 64-bit code for this ABI"
+#: config/avr/avr.c:4643 config/ip2k/ip2k.c:3157
+#, gcc-internal-format
+msgid "only initialized variables can be placed into program memory area"
msgstr ""
-#: config/rs6000/rs6000.c:15799
-msgid "use of %<long%> in AltiVec types is invalid for 64-bit code"
+#: config/avr/avr.c:4687
+#, gcc-internal-format
+msgid "`%s' appears to be a misspelled interrupt handler"
msgstr ""
-#: config/rs6000/rs6000.c:15801
-msgid "use of %<long%> in AltiVec types is deprecated; use %<int%>"
+#: config/avr/avr.c:4695
+#, gcc-internal-format
+msgid "`%s' appears to be a misspelled signal handler"
msgstr ""
-#: config/rs6000/rs6000.c:15805
-msgid "use of %<long long%> in AltiVec types is invalid"
+#: config/avr/avr.c:4764
+#, gcc-internal-format
+msgid "only uninitialized variables can be placed in the .noinit section"
msgstr ""
-#: config/rs6000/rs6000.c:15807
-msgid "use of %<double%> in AltiVec types is invalid"
+#: config/avr/avr.c:4778
+#, gcc-internal-format
+msgid "MCU %qs supported for assembler only"
msgstr ""
-#: config/rs6000/rs6000.c:15809
-msgid "use of %<long double%> in AltiVec types is invalid"
+#: config/avr/avr.h:713
+#, gcc-internal-format
+msgid "trampolines not supported"
msgstr ""
-#: config/rs6000/rs6000.c:15811
-msgid "use of boolean types in AltiVec types is invalid"
+#: config/bfin/bfin.c:1721 config/m68k/m68k.c:294
+#, gcc-internal-format
+msgid "-mshared-library-id=%s is not between 0 and %d"
msgstr ""
-#: config/rs6000/rs6000.c:15813
-msgid "use of %<complex%> in AltiVec types is invalid"
+#: config/bfin/bfin.c:1741
+#, gcc-internal-format
+msgid "-mshared-library-id= specified without -mid-shared-library"
msgstr ""
-#: config/rs6000/rs6000.c:17497
-msgid "AltiVec argument passed to unprototyped function"
+#: config/bfin/bfin.c:2562
+#, gcc-internal-format
+msgid "multiple function type attributes specified"
msgstr ""
-#: config/rs6000/aix.h:204
-msgid "Conform more closely to IBM XLC semantics"
+#: config/c4x/c4x-c.c:71
+#, gcc-internal-format
+msgid "missing '(' after '#pragma %s' - ignored"
msgstr ""
-#: config/rs6000/aix.h:206
-msgid "Default GCC semantics that differ from IBM XLC"
+#: config/c4x/c4x-c.c:74
+#, gcc-internal-format
+msgid "missing function name in '#pragma %s' - ignored"
msgstr ""
-#: config/rs6000/aix41.h:28 config/rs6000/aix43.h:32 config/rs6000/aix51.h:31
-#: config/rs6000/aix52.h:31
-msgid "Support message passing with the Parallel Environment"
+#: config/c4x/c4x-c.c:79
+#, gcc-internal-format
+msgid "malformed '#pragma %s' - ignored"
msgstr ""
-#: config/rs6000/aix43.h:28 config/rs6000/aix51.h:27 config/rs6000/aix52.h:27
-msgid "Compile for 64-bit pointers"
+#: config/c4x/c4x-c.c:81
+#, gcc-internal-format
+msgid "missing section name in '#pragma %s' - ignored"
msgstr ""
-#: config/rs6000/aix43.h:30 config/rs6000/aix51.h:29 config/rs6000/aix52.h:29
-msgid "Compile for 32-bit pointers"
+#: config/c4x/c4x-c.c:86
+#, gcc-internal-format
+msgid "missing ')' for '#pragma %s' - ignored"
msgstr ""
-#: config/rs6000/aix43.h:49 config/rs6000/aix51.h:48 config/rs6000/aix52.h:48
-msgid "-maix64 and POWER architecture are incompatible"
+#: config/c4x/c4x-c.c:89
+#, gcc-internal-format
+msgid "junk at end of '#pragma %s'"
msgstr ""
-#: config/rs6000/aix43.h:54 config/rs6000/aix51.h:53 config/rs6000/aix52.h:53
-msgid "-maix64 requires PowerPC64 architecture remain enabled"
+#: config/c4x/c4x.c:867
+#, gcc-internal-format
+msgid "ISR %s requires %d words of local vars, max is 32767"
msgstr ""
-#: config/rs6000/aix43.h:58 config/rs6000/aix51.h:57 config/rs6000/aix52.h:57
-msgid ""
-"-maix64 required: 64-bit computation with 32-bit addressing not yet supported"
+#. This function is for retrieving a part of an instruction name for
+#. an operator, for immediate output. If that ever happens for
+#. MULT, we need to apply TARGET_MUL_BUG in the caller. Make sure
+#. we notice.
+#: config/cris/cris.c:435
+#, gcc-internal-format
+msgid "MULT case in cris_op_str"
msgstr ""
-#: config/rs6000/darwin.h:69 config/rs6000/sysv4.h:153
-msgid "Generate 64-bit code"
+#: config/cris/cris.c:983
+#, gcc-internal-format
+msgid "internal error: bad register: %d"
msgstr ""
-#: config/rs6000/darwin.h:71 config/rs6000/sysv4.h:155
-msgid "Generate 32-bit code"
+#: config/cris/cris.c:1443
+#, gcc-internal-format
+msgid "internal error: sideeffect-insn affecting main effect"
msgstr ""
-#: config/rs6000/darwin.h:73
-msgid "Generate code suitable for executables (NOT shared libs)"
+#: config/cris/cris.c:1467
+#, gcc-internal-format
+msgid "Unknown cc_attr value"
msgstr ""
-#. The Darwin ABI always includes AltiVec, can't be (validly) turned
-#. off.
-#: config/rs6000/darwin.h:89
-msgid "-mdynamic-no-pic overrides -fpic or -fPIC"
+#. If we get here, the caller got its initial tests wrong.
+#: config/cris/cris.c:1825
+#, gcc-internal-format
+msgid "internal error: cris_side_effect_mode_ok with bad operands"
msgstr ""
-#. Darwin doesn't support -fpic.
-#: config/rs6000/darwin.h:95
-msgid "-fpic is not supported; -fPIC assumed"
+#: config/cris/cris.c:2085
+#, gcc-internal-format
+msgid "-max-stackframe=%d is not usable, not between 0 and %d"
msgstr ""
-#: config/rs6000/darwin.h:113
-msgid "-m64 requires PowerPC64 architecture, enabling"
+#: config/cris/cris.c:2113
+#, gcc-internal-format
+msgid "unknown CRIS version specification in -march= or -mcpu= : %s"
msgstr ""
-#. See note below.
-#. if (rs6000_long_double_size_string == NULL)
-#. rs6000_long_double_type_size = 128;
-#: config/rs6000/eabispe.h:45 config/rs6000/linuxspe.h:62
-msgid "-m64 not supported in this configuration"
+#: config/cris/cris.c:2149
+#, gcc-internal-format
+msgid "unknown CRIS cpu version specification in -mtune= : %s"
msgstr ""
-#: config/rs6000/linux64.h:109
-msgid "-m64 requires a PowerPC64 cpu"
+#: config/cris/cris.c:2167
+#, gcc-internal-format
+msgid "-fPIC and -fpic are not supported in this configuration"
msgstr ""
-#: config/rs6000/linux64.h:221
-msgid "Call mcount for profiling before a function prologue"
+#: config/cris/cris.c:2182
+#, gcc-internal-format
+msgid "that particular -g option is invalid with -maout and -melinux"
msgstr ""
-#: config/rs6000/linux64.h:223
-msgid "Call mcount for profiling after a function prologue"
+#: config/cris/cris.c:2376
+#, gcc-internal-format
+msgid "Unknown src"
msgstr ""
-#. Run-time compilation parameters selecting different hardware subsets.
+#: config/cris/cris.c:2418
+#, gcc-internal-format
+msgid "Unknown dest"
+msgstr ""
+
+#: config/cris/cris.c:2692
+#, gcc-internal-format
+msgid "stackframe too big: %d bytes"
+msgstr ""
+
+#: config/cris/cris.c:3126
+#, gcc-internal-format
+msgid "emitting PIC operand, but PIC register isn't set up"
+msgstr ""
+
+#. Definitions for GCC. Part of the machine description for CRIS.
+#. Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+#. Free Software Foundation, Inc.
+#. Contributed by Axis Communications. Written by Hans-Peter Nilsson.
#.
-#. 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.
-#: config/rs6000/rs6000.h:281
-msgid "Use POWER instruction set"
+#. 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.
+#. After the first "Node:" comment comes all preprocessor directives and
+#. attached declarations described in the info files, the "Using and
+#. Porting GCC" manual (uapgcc), in the same order as found in the "Target
+#. macros" section in the gcc-2.9x CVS edition of 2000-03-17. FIXME: Not
+#. really, but needs an update anyway.
+#.
+#. There is no generic copy-of-uapgcc comment, you'll have to see uapgcc
+#. for that. If applicable, there is a CRIS-specific comment. The order
+#. of macro definitions follow the order in the manual. Every section in
+#. the manual (node in the info pages) has an introductory `Node:
+#. <subchapter>' comment. If no macros are defined for a section, only
+#. the section-comment is present.
+#. Note that other header files (e.g. config/elfos.h, config/linux.h,
+#. config/cris/linux.h and config/cris/aout.h) are responsible for lots of
+#. settings not repeated below. This file contains general CRIS
+#. definitions and definitions for the cris-*-elf subtarget.
+#. We don't want to use gcc_assert for everything, as that can be
+#. compiled out.
+#: config/cris/cris.h:44
+#, gcc-internal-format
+msgid "CRIS-port assertion failed: "
msgstr ""
-#: config/rs6000/rs6000.h:284
-msgid "Use POWER2 instruction set"
+#. Node: Caller Saves
+#. (no definitions)
+#. Node: Function entry
+#. See cris.c for TARGET_ASM_FUNCTION_PROLOGUE and
+#. TARGET_ASM_FUNCTION_EPILOGUE.
+#. Node: Profiling
+#: config/cris/cris.h:857
+#, gcc-internal-format
+msgid "no FUNCTION_PROFILER for CRIS"
msgstr ""
-#: config/rs6000/rs6000.h:286
-msgid "Do not use POWER2 instruction set"
+#: config/frv/frv.c:8209
+#, gcc-internal-format
+msgid "accumulator is not a constant integer"
msgstr ""
-#: config/rs6000/rs6000.h:289
-msgid "Do not use POWER instruction set"
+#: config/frv/frv.c:8214
+#, gcc-internal-format
+msgid "accumulator number is out of bounds"
msgstr ""
-#: config/rs6000/rs6000.h:291
-msgid "Use PowerPC instruction set"
+#: config/frv/frv.c:8225
+#, gcc-internal-format
+msgid "inappropriate accumulator for %qs"
msgstr ""
-#: config/rs6000/rs6000.h:294
-msgid "Do not use PowerPC instruction set"
+#: config/frv/frv.c:8291
+#, gcc-internal-format
+msgid "invalid IACC argument"
msgstr ""
-#: config/rs6000/rs6000.h:296
-msgid "Use PowerPC General Purpose group optional instructions"
+#: config/frv/frv.c:8314
+#, gcc-internal-format
+msgid "%qs expects a constant argument"
msgstr ""
-#: config/rs6000/rs6000.h:298
-msgid "Do not use PowerPC General Purpose group optional instructions"
+#: config/frv/frv.c:8319
+#, gcc-internal-format
+msgid "constant argument out of range for %qs"
msgstr ""
-#: config/rs6000/rs6000.h:300
-msgid "Use PowerPC Graphics group optional instructions"
+#: config/frv/frv.c:8754
+#, gcc-internal-format
+msgid "media functions are not available unless -mmedia is used"
msgstr ""
-#: config/rs6000/rs6000.h:302
-msgid "Do not use PowerPC Graphics group optional instructions"
+#: config/frv/frv.c:8766
+#, gcc-internal-format
+msgid "this media function is only available on the fr500"
msgstr ""
-#: config/rs6000/rs6000.h:304
-msgid "Use PowerPC-64 instruction set"
+#: config/frv/frv.c:8794
+#, gcc-internal-format
+msgid "this media function is only available on the fr400 and fr550"
msgstr ""
-#: config/rs6000/rs6000.h:306
-msgid "Do not use PowerPC-64 instruction set"
+#: config/frv/frv.c:8813
+#, gcc-internal-format
+msgid "this builtin function is only available on the fr405 and fr450"
msgstr ""
-#: config/rs6000/rs6000.h:308
-msgid "Use AltiVec instructions"
+#: config/frv/frv.c:8822
+#, gcc-internal-format
+msgid "this builtin function is only available on the fr500 and fr550"
msgstr ""
-#: config/rs6000/rs6000.h:310
-msgid "Do not use AltiVec instructions"
+#: config/frv/frv.c:8834
+#, gcc-internal-format
+msgid "this builtin function is only available on the fr450"
msgstr ""
-#: config/rs6000/rs6000.h:312
-msgid "Use new mnemonics for PowerPC architecture"
+#: config/h8300/h8300.c:331
+#, gcc-internal-format
+msgid "-ms2600 is used without -ms"
msgstr ""
-#: config/rs6000/rs6000.h:314
-msgid "Use old mnemonics for PowerPC architecture"
+#: config/h8300/h8300.c:337
+#, gcc-internal-format
+msgid "-mn is used without -mh or -ms"
msgstr ""
-#: config/rs6000/rs6000.h:317
-msgid "Put everything in the regular TOC"
+#: config/i386/host-cygwin.c:65
+#, gcc-internal-format
+msgid "can't extend PCH file: %m"
msgstr ""
-#: config/rs6000/rs6000.h:319
-msgid "Place floating point constants in TOC"
+#: config/i386/host-cygwin.c:76
+#, gcc-internal-format
+msgid "can't set position in PCH file: %m"
msgstr ""
-#: config/rs6000/rs6000.h:321
-msgid "Do not place floating point constants in TOC"
+#: config/i386/i386.c:1274
+#, gcc-internal-format
+msgid "code model %s not supported in PIC mode"
msgstr ""
-#: config/rs6000/rs6000.h:323
-msgid "Place symbol+offset constants in TOC"
+#: config/i386/i386.c:1284 config/sparc/sparc.c:650
+#, gcc-internal-format
+msgid "bad value (%s) for -mcmodel= switch"
msgstr ""
-#: config/rs6000/rs6000.h:325
-msgid "Do not place symbol+offset constants in TOC"
+#: config/i386/i386.c:1299
+#, gcc-internal-format
+msgid "bad value (%s) for -masm= switch"
+msgstr ""
+
+#: config/i386/i386.c:1302
+#, gcc-internal-format
+msgid "code model %qs not supported in the %s bit mode"
msgstr ""
-#: config/rs6000/rs6000.h:331
-msgid "Place variable addresses in the regular TOC"
+#: config/i386/i386.c:1305
+#, gcc-internal-format
+msgid "code model %<large%> not supported yet"
msgstr ""
-#: config/rs6000/rs6000.h:333 config/frv/frv.opt:121 config/pdp11/pdp11.opt:72
-msgid "Use hardware floating point"
+#: config/i386/i386.c:1307
+#, gcc-internal-format
+msgid "%i-bit mode not compiled in"
msgstr ""
-#: config/rs6000/rs6000.h:335 config/pdp11/pdp11.opt:84
-msgid "Do not use hardware floating point"
+#: config/i386/i386.c:1337 config/i386/i386.c:1361
+#, gcc-internal-format
+msgid "CPU you selected does not support x86-64 instruction set"
msgstr ""
-#: config/rs6000/rs6000.h:337
-msgid "Generate load/store multiple instructions"
+#: config/i386/i386.c:1343
+#, gcc-internal-format
+msgid "bad value (%s) for -march= switch"
msgstr ""
-#: config/rs6000/rs6000.h:339
-msgid "Do not generate load/store multiple instructions"
+#: config/i386/i386.c:1374
+#, gcc-internal-format
+msgid "bad value (%s) for -mtune= switch"
msgstr ""
-#: config/rs6000/rs6000.h:341
-msgid "Generate string instructions for block moves"
+#: config/i386/i386.c:1391
+#, gcc-internal-format
+msgid "-mregparm=%d is not between 0 and %d"
msgstr ""
-#: config/rs6000/rs6000.h:343
-msgid "Do not generate string instructions for block moves"
+#: config/i386/i386.c:1404
+#, gcc-internal-format
+msgid "-malign-loops is obsolete, use -falign-loops"
msgstr ""
-#: config/rs6000/rs6000.h:345
-msgid "Generate load/store with update instructions"
+#: config/i386/i386.c:1409 config/i386/i386.c:1422 config/i386/i386.c:1435
+#, gcc-internal-format
+msgid "-malign-loops=%d is not between 0 and %d"
msgstr ""
-#: config/rs6000/rs6000.h:347
-msgid "Do not generate load/store with update instructions"
+#: config/i386/i386.c:1417
+#, gcc-internal-format
+msgid "-malign-jumps is obsolete, use -falign-jumps"
msgstr ""
-#: config/rs6000/rs6000.h:349
-msgid "Generate fused multiply/add instructions"
+#: config/i386/i386.c:1430
+#, gcc-internal-format
+msgid "-malign-functions is obsolete, use -falign-functions"
msgstr ""
-#: config/rs6000/rs6000.h:351
-msgid "Do not generate fused multiply/add instructions"
+#: config/i386/i386.c:1468
+#, gcc-internal-format
+msgid "-mpreferred-stack-boundary=%d is not between %d and 12"
msgstr ""
-#: config/rs6000/rs6000.h:355
-msgid "Do not schedule the start and end of the procedure"
+#: config/i386/i386.c:1480
+#, gcc-internal-format
+msgid "-mbranch-cost=%d is not between 0 and 5"
msgstr ""
-#: config/rs6000/rs6000.h:361
-msgid "Return all structures in memory (AIX default)"
+#: config/i386/i386.c:1492
+#, gcc-internal-format
+msgid "bad value (%s) for -mtls-dialect= switch"
msgstr ""
-#: config/rs6000/rs6000.h:363
-msgid "Return small structures in registers (SVR4 default)"
+#: config/i386/i386.c:1539
+#, gcc-internal-format
+msgid "-malign-double makes no sense in the 64bit mode"
msgstr ""
-#: config/rs6000/rs6000.h:369
-msgid "Generate single field mfcr instruction"
+#: config/i386/i386.c:1541
+#, gcc-internal-format
+msgid "-mrtd calling convention not supported in the 64bit mode"
msgstr ""
-#: config/rs6000/rs6000.h:371
-msgid "Do not generate single field mfcr instruction"
+#: config/i386/i386.c:1568 config/i386/i386.c:1579
+#, gcc-internal-format
+msgid "SSE instruction set disabled, using 387 arithmetics"
msgstr ""
-#: config/rs6000/rs6000.h:455 config/sparc/sparc.h:718
-msgid "Use features of and schedule code for given CPU"
+#: config/i386/i386.c:1584
+#, gcc-internal-format
+msgid "387 instruction set disabled, using SSE arithmetics"
msgstr ""
-#: config/rs6000/rs6000.h:458
-msgid "Enable debug output"
+#: config/i386/i386.c:1591
+#, gcc-internal-format
+msgid "bad value (%s) for -mfpmath= switch"
msgstr ""
-#: config/rs6000/rs6000.h:460
-msgid "Select full, part, or no traceback table"
+#: config/i386/i386.c:1752 config/i386/i386.c:1763
+#, gcc-internal-format
+msgid "fastcall and stdcall attributes are not compatible"
msgstr ""
-#: config/rs6000/rs6000.h:461
-msgid "Specify ABI to use"
+#: config/i386/i386.c:1756 config/i386/i386.c:1814
+#, gcc-internal-format
+msgid "fastcall and regparm attributes are not compatible"
msgstr ""
-#: config/rs6000/rs6000.h:463
-msgid "Specify size of long double (64 or 128 bits)"
+#: config/i386/i386.c:1801
+#, gcc-internal-format
+msgid "%qs attribute requires an integer constant argument"
msgstr ""
-#: config/rs6000/rs6000.h:465
-msgid "Specify yes/no if isel instructions should be generated"
+#: config/i386/i386.c:1807
+#, gcc-internal-format
+msgid "argument to %qs attribute larger than %d"
msgstr ""
-#: config/rs6000/rs6000.h:467
-msgid "Specify yes/no if SPE SIMD instructions should be generated"
+#: config/i386/i386.c:2602
+#, gcc-internal-format
+msgid "SSE register return with SSE disabled"
msgstr ""
-#: config/rs6000/rs6000.h:469
-msgid "Specify yes/no if using floating point in the GPRs"
+#: config/i386/i386.c:2604
+#, gcc-internal-format
+msgid "SSE register argument with SSE disabled"
msgstr ""
-#: config/rs6000/rs6000.h:471
-msgid "Specify yes/no if VRSAVE instructions should be generated for AltiVec"
+#: config/i386/i386.c:2919
+#, gcc-internal-format
+msgid "SSE vector argument without SSE enabled changes the ABI"
msgstr ""
-#: config/rs6000/rs6000.h:473
-msgid "Avoid all range limits on call instructions"
+#: config/i386/i386.c:2936
+#, gcc-internal-format
+msgid "MMX vector argument without MMX enabled changes the ABI"
msgstr ""
-#: config/rs6000/rs6000.h:476
-msgid "Warn about deprecated 'vector long ...' AltiVec type usage"
+#: config/i386/i386.c:3189
+#, gcc-internal-format
+msgid "SSE vector return without SSE enabled changes the ABI"
msgstr ""
-#: config/rs6000/rs6000.h:479
-msgid "Determine which dependences between insns are considered costly"
+#: config/i386/i386.c:6348
+#, gcc-internal-format
+msgid "extended registers have no high halves"
msgstr ""
-#: config/rs6000/rs6000.h:481
-msgid "Specify which post scheduling nop insertion scheme to apply"
+#: config/i386/i386.c:6363
+#, gcc-internal-format
+msgid "unsupported operand size for extended register"
msgstr ""
-#: config/rs6000/rs6000.h:483
-msgid "Specify alignment of structure fields default/natural"
+#: config/i386/i386.c:14485
+#, gcc-internal-format
+msgid "selector must be an integer constant in the range 0..%i"
msgstr ""
-#: config/rs6000/rs6000.h:485
-msgid "Specify scheduling priority for dispatch slot restricted insns"
+#: config/i386/i386.c:14823
+#, gcc-internal-format
+msgid "shift must be an immediate"
msgstr ""
-#. Definitions for __builtin_return_address and __builtin_frame_address.
-#. __builtin_return_address (0) should give link register (65), enable
-#. this.
-#. This should be uncommented, so that the link register is used, but
-#. currently this would result in unmatched insns and spilling fixed
-#. registers so we'll leave it for another day. When these problems are
-#. taken care of one additional fetch will be necessary in RETURN_ADDR_RTX.
-#. (mrs)
-#. #define RETURN_ADDR_IN_PREVIOUS_FRAME
-#. Number of bytes into the frame return addresses can be found. See
-#. rs6000_stack_info in rs6000.c for more information on how the different
-#. abi's store the return address.
-#: config/rs6000/rs6000.h:1838
-msgid "RETURN_ADDRESS_OFFSET not supported"
+#: config/i386/i386.c:15993
+#, gcc-internal-format
+msgid "%qs incompatible attribute ignored"
msgstr ""
-#: config/rs6000/sysv4.h:87
-msgid "Select ABI calling convention"
+#: config/i386/winnt.c:74
+#, gcc-internal-format
+msgid "%qs attribute only applies to variables"
msgstr ""
-#: config/rs6000/sysv4.h:88
-msgid "Select method for sdata handling"
+#: config/i386/winnt.c:103
+#, gcc-internal-format
+msgid ""
+"%qs attribute applies only to initialized variables with external linkage"
msgstr ""
-#: config/rs6000/sysv4.h:90 config/alpha/alpha.opt:135 config/ia64/ia64.opt:93
-msgid "Specify bit size of immediate TLS offsets"
+#: config/i386/winnt.c:202
+#, gcc-internal-format
+msgid ""
+"%Jfunction '%D' is defined after prior declaration as dllimport: attribute "
+"ignored"
msgstr ""
-#: config/rs6000/sysv4.h:100
-msgid "Align to the base type of the bit-field"
+#: config/i386/winnt.c:213
+#, gcc-internal-format
+msgid "%Jinline function '%D' is declared as dllimport: attribute ignored."
msgstr ""
-#: config/rs6000/sysv4.h:102
-msgid "Don't align to the base type of the bit-field"
+#: config/i386/winnt.c:225
+#, gcc-internal-format
+msgid "%Jdefinition of static data member '%D' of dllimport'd class."
msgstr ""
-#: config/rs6000/sysv4.h:104
-msgid "Don't assume that unaligned accesses are handled by the system"
+#: config/i386/winnt.c:282
+#, gcc-internal-format
+msgid "%Jinconsistent dll linkage for '%D', dllexport assumed."
msgstr ""
-#: config/rs6000/sysv4.h:106
-msgid "Assume that unaligned accesses are handled by the system"
+#: config/i386/winnt.c:323 config/sh/symbian.c:273
+#, gcc-internal-format
+msgid "%qs declared as both exported to and imported from a DLL"
msgstr ""
-#: config/rs6000/sysv4.h:108 config/rs6000/sysv4.h:112
-msgid "Produce code relocatable at runtime"
+#: config/i386/winnt.c:466
+#, gcc-internal-format
+msgid "%J'%D' defined locally after being referenced with dllimport linkage"
msgstr ""
-#: config/rs6000/sysv4.h:110 config/rs6000/sysv4.h:114
-msgid "Don't produce code relocatable at runtime"
+#: config/i386/winnt.c:469
+#, gcc-internal-format
+msgid ""
+"%J'%D' redeclared without dllimport attribute after being referenced with "
+"dllimport linkage"
msgstr ""
-#: config/rs6000/sysv4.h:116 config/rs6000/sysv4.h:118
-msgid "Produce little endian code"
+#: config/i386/winnt.c:637
+#, gcc-internal-format
+msgid "%J'%D' causes a section type conflict"
msgstr ""
-#: config/rs6000/sysv4.h:120 config/rs6000/sysv4.h:122
-msgid "Produce big endian code"
+#: config/i386/cygming.h:166
+#, gcc-internal-format
+msgid "-f%s ignored for target (all code is position independent)"
msgstr ""
-#: config/rs6000/sysv4.h:123 config/rs6000/sysv4.h:124
-#: config/rs6000/sysv4.h:125 config/rs6000/sysv4.h:126
-#: config/rs6000/sysv4.h:127 config/rs6000/sysv4.h:128
-#: config/rs6000/sysv4.h:138 config/rs6000/sysv4.h:139
-#: config/rs6000/sysv4.h:151 config/rs6000/sysv4.h:157
-msgid "no description yet"
+#: config/i386/djgpp.h:181
+#, gcc-internal-format
+msgid "-mbnu210 is ignored (option is obsolete)"
msgstr ""
-#: config/rs6000/sysv4.h:129
-msgid "Use EABI"
+#: config/i386/i386-interix.h:257
+#, gcc-internal-format
+msgid "ms-bitfields not supported for objc"
msgstr ""
-#: config/rs6000/sysv4.h:130
-msgid "Don't use EABI"
+#: config/ia64/ia64-c.c:52
+#, gcc-internal-format
+msgid "malformed #pragma builtin"
msgstr ""
-#: config/rs6000/sysv4.h:133
-msgid "Do not allow bit-fields to cross word boundaries"
+#: config/ia64/ia64.c:483 config/m32r/m32r.c:373
+#, gcc-internal-format
+msgid "invalid argument of %qs attribute"
msgstr ""
-#: config/rs6000/sysv4.h:135
-msgid "Use alternate register names"
+#: config/ia64/ia64.c:495
+#, gcc-internal-format
+msgid "%Jan address area attribute cannot be specified for local variables"
msgstr ""
-#: config/rs6000/sysv4.h:137
-msgid "Don't use alternate register names"
+#: config/ia64/ia64.c:502
+#, gcc-internal-format
+msgid "%Jaddress area of '%s' conflicts with previous declaration"
msgstr ""
-#: config/rs6000/sysv4.h:141
-msgid "Link with libsim.a, libc.a and sim-crt0.o"
+#: config/ia64/ia64.c:509
+#, gcc-internal-format
+msgid "%Jaddress area attribute cannot be specified for functions"
msgstr ""
-#: config/rs6000/sysv4.h:143
-msgid "Link with libads.a, libc.a and crt0.o"
+#: config/ia64/ia64.c:4776 config/pa/pa.c:320
+#, gcc-internal-format
+msgid "value of -mfixed-range must have form REG1-REG2"
msgstr ""
-#: config/rs6000/sysv4.h:145
-msgid "Link with libyk.a, libc.a and crt0.o"
+#: config/ia64/ia64.c:4803 config/pa/pa.c:347
+#, gcc-internal-format
+msgid "%s-%s is an empty range"
msgstr ""
-#: config/rs6000/sysv4.h:147
-msgid "Link with libmvme.a, libc.a and crt0.o"
+#: config/ia64/ia64.c:4831
+#, gcc-internal-format
+msgid "bad value %<%s%> for -mtls-size= switch"
msgstr ""
-#: config/rs6000/sysv4.h:149
-msgid "Set the PPC_EMB bit in the ELF flags header"
+#: config/ia64/ia64.c:4859
+#, gcc-internal-format
+msgid "bad value %<%s%> for -mtune= switch"
msgstr ""
-#: config/rs6000/sysv4.h:150
-msgid "Use the WindISS simulator"
+#: config/ia64/ia64.c:4878
+#, gcc-internal-format
+msgid "not yet implemented: latency-optimized inline square root"
msgstr ""
-#. 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.
-#: config/rs6000/sysv4.h:219
-#, c-format
-msgid "bad value for -mcall-%s"
+#: config/iq2000/iq2000.c:1808
+#, gcc-internal-format
+msgid "gp_offset (%ld) or end_offset (%ld) is less than zero."
msgstr ""
-#: config/rs6000/sysv4.h:235
-#, c-format
-msgid "bad value for -msdata=%s"
+#: config/iq2000/iq2000.c:2589
+#, gcc-internal-format
+msgid "argument %qd is not a constant"
msgstr ""
-#: config/rs6000/sysv4.h:252
-#, c-format
-msgid "-mrelocatable and -msdata=%s are incompatible"
+#: config/iq2000/iq2000.c:2892 config/xtensa/xtensa.c:1773
+#, gcc-internal-format
+msgid "PRINT_OPERAND_ADDRESS, null pointer"
msgstr ""
-#: config/rs6000/sysv4.h:261
-#, c-format
-msgid "-f%s and -msdata=%s are incompatible"
+#: config/iq2000/iq2000.c:3047
+#, gcc-internal-format
+msgid "PRINT_OPERAND: Unknown punctuation '%c'"
msgstr ""
-#: config/rs6000/sysv4.h:270
-#, c-format
-msgid "-msdata=%s and -mcall-%s are incompatible"
+#: config/iq2000/iq2000.c:3056 config/mips/mips.c:5234
+#: config/xtensa/xtensa.c:1627
+#, gcc-internal-format
+msgid "PRINT_OPERAND null pointer"
msgstr ""
-#: config/rs6000/sysv4.h:279
-msgid "-mrelocatable and -mno-minimal-toc are incompatible"
+#: config/m68hc11/m68hc11.c:279
+#, gcc-internal-format
+msgid "-f%s ignored for 68HC11/68HC12 (not supported)"
msgstr ""
-#: config/rs6000/sysv4.h:285
-#, c-format
-msgid "-mrelocatable and -mcall-%s are incompatible"
+#: config/m68hc11/m68hc11.c:1240
+#, gcc-internal-format
+msgid "%<trap%> and %<far%> attributes are not compatible, ignoring %<far%>"
msgstr ""
-#: config/rs6000/sysv4.h:292
-#, c-format
-msgid "-fPIC and -mcall-%s are incompatible"
+#: config/m68hc11/m68hc11.c:1247
+#, gcc-internal-format
+msgid "%<trap%> attribute is already used"
msgstr ""
-#: config/rs6000/sysv4.h:299
-msgid "-mcall-aixdesc must be big endian"
+#: config/m68k/m68k.c:321
+#, gcc-internal-format
+msgid "cannot specify both -msep-data and -mid-shared-library"
msgstr ""
-#: config/rs6000/sysv4.h:314
-#, c-format
-msgid "-m%s not supported in this configuration"
+#: config/m68k/m68k.c:333
+#, gcc-internal-format
+msgid "-fPIC is not currently supported on the 68000 or 68010\n"
msgstr ""
-#: config/s390/s390.c:1295
-#, c-format
-msgid "Unknown cpu used in -march=%s."
+#: config/m68k/m68k.c:640 config/rs6000/rs6000.c:12914
+#, gcc-internal-format
+msgid "stack limit expression is not supported"
msgstr ""
-#: config/s390/s390.c:1314
-#, c-format
-msgid "Unknown cpu used in -mtune=%s."
+#: config/mips/mips.c:4441
+#, gcc-internal-format
+msgid ""
+"-%s conflicts with the other architecture options, which specify a %s "
+"processor"
msgstr ""
-#: config/s390/s390.c:1319
-#, c-format
-msgid "z/Architecture mode not supported on %s."
+#: config/mips/mips.c:4457
+#, gcc-internal-format
+msgid "-march=%s is not compatible with the selected ABI"
msgstr ""
-#: config/s390/s390.c:1321
-msgid "64-bit ABI not supported in ESA/390 mode."
+#: config/mips/mips.c:4475
+#, gcc-internal-format
+msgid "-mgp64 used with a 32-bit processor"
msgstr ""
-#: config/s390/s390.c:1332
+#: config/mips/mips.c:4477
+#, gcc-internal-format
+msgid "-mgp32 used with a 64-bit ABI"
+msgstr ""
+
+#: config/mips/mips.c:4479
+#, gcc-internal-format
+msgid "-mgp64 used with a 32-bit ABI"
+msgstr ""
+
+#: config/mips/mips.c:4497 config/mips/mips.c:4499 config/mips/mips.c:4501
+#: config/mips/mips.c:4577
+#, gcc-internal-format
+msgid "unsupported combination: %s"
+msgstr ""
+
+#: config/mips/mips.c:4572
+#, gcc-internal-format
msgid ""
-"-mbackchain -mpacked-stack -mhard-float are not supported in combination."
+"generation of Branch Likely instructions enabled, but not supported by "
+"architecture"
msgstr ""
-#: config/s390/s390.c:1339
-msgid "invalid value for -mwarn-framesize"
+#: config/mips/mips.c:4589
+#, gcc-internal-format
+msgid "-G is incompatible with PIC code which is the default"
msgstr ""
-#: config/s390/s390.c:1349
-msgid "invalid value for -mstack-size"
+#: config/mips/mips.c:4656
+#, gcc-internal-format
+msgid "-mips3d requires -mpaired-single"
msgstr ""
-#: config/s390/s390.c:1352
-msgid "stack size must be an exact power of 2"
+#: config/mips/mips.c:4665
+#, gcc-internal-format
+msgid "-mips3d/-mpaired-single must be used with -mfp64 -mhard-float"
msgstr ""
-#: config/s390/s390.c:1358
-msgid "invalid value for -mstack-guard"
+#: config/mips/mips.c:4670
+#, gcc-internal-format
+msgid "-mips3d/-mpaired-single must be used with -mips64"
msgstr ""
-#: config/s390/s390.c:1361
-msgid "stack size must be greater than the stack guard value"
+#: config/mips/mips.c:5171
+#, gcc-internal-format
+msgid "internal error: %%) found without a %%( in assembler pattern"
msgstr ""
-#: config/s390/s390.c:1364
-msgid "stack guard value must be an exact power of 2"
+#: config/mips/mips.c:5185
+#, gcc-internal-format
+msgid "internal error: %%] found without a %%[ in assembler pattern"
msgstr ""
-#: config/s390/s390.c:1367
-msgid "-mstack-size implies use of -mstack-guard"
+#: config/mips/mips.c:5198
+#, gcc-internal-format
+msgid "internal error: %%> found without a %%< in assembler pattern"
msgstr ""
-#: config/s390/s390.c:1371
-msgid "-mstack-guard implies use of -mstack-size"
+#: config/mips/mips.c:5211
+#, gcc-internal-format
+msgid "internal error: %%} found without a %%{ in assembler pattern"
msgstr ""
-#: config/s390/s390.c:3875
-msgid "Cannot decompose address."
+#: config/mips/mips.c:5225
+#, gcc-internal-format
+msgid "PRINT_OPERAND: unknown punctuation '%c'"
msgstr ""
-#: config/s390/s390.c:4067
-msgid "UNKNOWN in print_operand !?"
+#: config/mips/mips.c:7949
+#, gcc-internal-format
+msgid "cannot handle inconsistent calls to %qs"
msgstr ""
-#: config/s390/s390.c:6114
-msgid "Total size of local variables exceeds architecture limit."
+#: config/mips/mips.c:9348
+#, gcc-internal-format
+msgid "the cpu name must be lower case"
msgstr ""
-#: config/s390/s390.c:6650
-#, c-format
-msgid "frame size of %qs is "
+#. Output assembler code to FILE to increment profiler label # LABELNO
+#. for profiling a function entry.
+#: config/mips/mips.h:2041
+#, gcc-internal-format
+msgid "mips16 function profiling"
msgstr ""
-#: config/s390/s390.c:6650
-msgid " bytes"
+#: config/mmix/mmix.c:227
+#, gcc-internal-format
+msgid "-f%s not supported: ignored"
msgstr ""
-#: config/s390/s390.c:6654
-#, c-format
-msgid "%qs uses dynamic stack allocation"
+#: config/mmix/mmix.c:655
+#, gcc-internal-format
+msgid "support for mode %qs"
msgstr ""
-#: config/s390/s390.h:135
-msgid "Don't use hardware fp"
+#: config/mmix/mmix.c:669
+#, gcc-internal-format
+msgid ""
+"too large function value type, needs %d registers, have only %d registers "
+"for this"
msgstr ""
-#: config/s390/s390.h:136
-msgid "Use bras for executable < 64k"
+#: config/mmix/mmix.c:839
+#, gcc-internal-format
+msgid "function_profiler support for MMIX"
msgstr ""
-#: config/s390/s390.h:137
-msgid "Don't use bras"
+#: config/mmix/mmix.c:861
+#, gcc-internal-format
+msgid "MMIX Internal: Last named vararg would not fit in a register"
msgstr ""
-#: config/s390/s390.h:138
-msgid "Additional debug prints"
+#: config/mmix/mmix.c:1476 config/mmix/mmix.c:1500 config/mmix/mmix.c:1616
+#, gcc-internal-format
+msgid "MMIX Internal: Bad register: %d"
msgstr ""
-#: config/s390/s390.h:139
-msgid "Don't print additional debug prints"
+#. Presumably there's a missing case above if we get here.
+#: config/mmix/mmix.c:1608
+#, gcc-internal-format
+msgid "MMIX Internal: Missing %qc case in mmix_print_operand"
msgstr ""
-#: config/s390/s390.h:140
-msgid "64 bit ABI"
+#: config/mmix/mmix.c:1894
+#, gcc-internal-format
+msgid "stack frame not a multiple of 8 bytes: %d"
msgstr ""
-#: config/s390/s390.h:141
-msgid "31 bit ABI"
+#: config/mmix/mmix.c:2130
+#, gcc-internal-format
+msgid "stack frame not a multiple of octabyte: %d"
msgstr ""
-#: config/s390/s390.h:142
-msgid "z/Architecture"
+#: config/mmix/mmix.c:2470 config/mmix/mmix.c:2534
+#, gcc-internal-format
+msgid "MMIX Internal: %s is not a shiftable int"
msgstr ""
-#: config/s390/s390.h:143
-msgid "ESA/390 architecture"
+#: config/pa/pa.c:452
+#, gcc-internal-format
+msgid "PIC code generation is not supported in the portable runtime model\n"
msgstr ""
-#: config/s390/s390.h:144
-msgid "mvcle use"
+#: config/pa/pa.c:457
+#, gcc-internal-format
+msgid "PIC code generation is not compatible with fast indirect calls\n"
msgstr ""
-#: config/s390/s390.h:145
-msgid "mvc&ex"
+#: config/pa/pa.c:462
+#, gcc-internal-format
+msgid "-g is only supported when using GAS on this processor,"
msgstr ""
-#: config/s390/s390.h:146
-msgid "Enable tpf OS tracing code"
+#: config/pa/pa.c:463
+#, gcc-internal-format
+msgid "-g option disabled"
msgstr ""
-#: config/s390/s390.h:147
-msgid "Disable tpf OS tracing code"
+#: config/pa/pa.c:7840
+#, gcc-internal-format
+msgid ""
+"alignment (%u) for %s exceeds maximum alignment for global common data. "
+"Using %u"
msgstr ""
-#: config/s390/s390.h:148
-msgid "Disable fused multiply/add instructions"
+#: config/pa/pa-hpux11.h:85
+#, gcc-internal-format
+msgid "-munix=98 option required for C89 Amendment 1 features.\n"
msgstr ""
-#: config/s390/s390.h:149
-msgid "Enable fused multiply/add instructions"
+#: config/rs6000/host-darwin.c:52
+#, gcc-internal-format
+msgid "Segmentation Fault (code)"
msgstr ""
-#: config/s390/s390.h:150
-msgid "Maintain backchain pointer"
+#: config/rs6000/host-darwin.c:117
+#, gcc-internal-format
+msgid "Segmentation Fault"
msgstr ""
-#: config/s390/s390.h:151
-msgid "Don't maintain backchain pointer"
+#: config/rs6000/host-darwin.c:131
+#, gcc-internal-format
+msgid "While setting up signal stack: %m"
msgstr ""
-#: config/s390/s390.h:152
-msgid "Use packed stack layout"
+#: config/rs6000/host-darwin.c:137
+#, gcc-internal-format
+msgid "While setting up signal handler: %m"
+msgstr ""
+
+#. Handle the machine specific pragma longcall. Its syntax is
+#.
+#. # pragma longcall ( TOGGLE )
+#.
+#. where TOGGLE is either 0 or 1.
+#.
+#. rs6000_default_long_calls is set to the value of TOGGLE, changing
+#. whether or not new function declarations receive a longcall
+#. attribute by default.
+#: config/rs6000/rs6000-c.c:55
+#, gcc-internal-format
+msgid "ignoring malformed #pragma longcall"
msgstr ""
-#: config/s390/s390.h:153
-msgid "Don't use packed stack layout"
+#: config/rs6000/rs6000-c.c:68
+#, gcc-internal-format
+msgid "missing open paren"
msgstr ""
-#: config/s390/s390.h:162
-msgid "Warn if a single function's framesize exceeds the given framesize"
+#: config/rs6000/rs6000-c.c:70
+#, gcc-internal-format
+msgid "missing number"
msgstr ""
-#: config/s390/s390.h:165
-msgid "Warn if a function uses alloca or creates an array with dynamic size"
+#: config/rs6000/rs6000-c.c:72
+#, gcc-internal-format
+msgid "missing close paren"
msgstr ""
-#: config/s390/s390.h:168
-msgid ""
-"Emit extra code in the function prologue in order to trap if the stacksize "
-"exceeds the given limit"
+#: config/rs6000/rs6000-c.c:75
+#, gcc-internal-format
+msgid "number must be 0 or 1"
+msgstr ""
+
+#: config/rs6000/rs6000-c.c:78
+#, gcc-internal-format
+msgid "junk at end of #pragma longcall"
+msgstr ""
+
+#: config/rs6000/rs6000-c.c:2524
+#, gcc-internal-format
+msgid "passing arg %d of %qE discards qualifiers frompointer target type"
+msgstr ""
+
+#: config/rs6000/rs6000-c.c:2567
+#, gcc-internal-format
+msgid "invalid parameter combination for AltiVec intrinsic"
+msgstr ""
+
+#: config/rs6000/rs6000.c:1217
+#, gcc-internal-format
+msgid "-mmultiple is not supported on little endian systems"
+msgstr ""
+
+#: config/rs6000/rs6000.c:1224
+#, gcc-internal-format
+msgid "-mstring is not supported on little endian systems"
+msgstr ""
+
+#: config/rs6000/rs6000.c:1238
+#, gcc-internal-format
+msgid "unknown -mdebug-%s switch"
msgstr ""
-#: config/s390/s390.h:171
+#: config/rs6000/rs6000.c:1250
+#, gcc-internal-format
msgid ""
-"Set the max. number of bytes which has to be left to stack size before a "
-"trap instruction is triggered"
+"unknown -mtraceback arg %qs; expecting %<full%>, %<partial%> or %<none%>"
msgstr ""
-#: config/sh/sh.c:6201
-msgid "__builtin_saveregs not supported by this subtarget"
+#: config/rs6000/rs6000.c:1291
+#, gcc-internal-format
+msgid "AltiVec and E500 instructions cannot coexist"
msgstr ""
-#: config/sh/sh.c:7194
-msgid "attribute interrupt_handler is not compatible with -m5-compact"
+#: config/rs6000/rs6000.c:1520
+#, gcc-internal-format
+msgid "unknown -m%s= option specified: '%s'"
msgstr ""
-#. The sp_switch attribute only has meaning for interrupt functions.
-#. The trap_exit attribute only has meaning for interrupt functions.
-#: config/sh/sh.c:7216 config/sh/sh.c:7251
-#, c-format
-msgid "%qs attribute only applies to interrupt functions"
+#: config/rs6000/rs6000.c:1718
+#, gcc-internal-format
+msgid "not configured for ABI: '%s'"
msgstr ""
-#. The argument must be a constant string.
-#: config/sh/sh.c:7223
-#, c-format
-msgid "%qs attribute argument not a string constant"
+#: config/rs6000/rs6000.c:1728
+#, gcc-internal-format
+msgid "Using darwin64 ABI"
msgstr ""
-#. The argument must be a constant integer.
-#: config/sh/sh.c:7258
-#, c-format
-msgid "%qs attribute argument not an integer constant"
+#: config/rs6000/rs6000.c:1733
+#, gcc-internal-format
+msgid "Using old darwin ABI"
msgstr ""
-#: config/sh/symbian.c:147
+#: config/rs6000/rs6000.c:1738
+#, gcc-internal-format
+msgid "unknown ABI specified: '%s'"
+msgstr ""
+
+#: config/rs6000/rs6000.c:1765
+#, gcc-internal-format
+msgid "invalid option for -mfloat-gprs: '%s'"
+msgstr ""
+
+#: config/rs6000/rs6000.c:1775
+#, gcc-internal-format
+msgid "Unknown switch -mlong-double-%s"
+msgstr ""
+
+#: config/rs6000/rs6000.c:1796
+#, gcc-internal-format
msgid ""
-"%H function '%D' is defined after prior declaration as dllimport: attribute "
-"ignored"
+"-malign-power is not supported for 64-bit Darwin; it is incompatible with "
+"the installed C and C++ libraries"
msgstr ""
-#: config/sh/symbian.c:158
-msgid "%Hinline function '%D' is declared as dllimport: attribute ignored."
+#: config/rs6000/rs6000.c:1804
+#, gcc-internal-format
+msgid "unknown -malign-XXXXX option specified: '%s'"
msgstr ""
-#: config/sh/symbian.c:171
-msgid "%Hdefinition of static data member '%D' of dllimport'd class."
+#: config/rs6000/rs6000.c:3961
+#, gcc-internal-format
+msgid ""
+"GCC vector returned by reference: non-standard ABI extension with no "
+"compatibility guarantee"
msgstr ""
-#: config/sh/symbian.c:286
+#: config/rs6000/rs6000.c:4034
+#, gcc-internal-format
msgid ""
-"%Hfailure in redeclaration of '%D': dllimport'd symbol lacks external "
-"linkage."
+"Cannot return value in vector register because altivec instructions are "
+"disabled, use -maltivec to enable them."
msgstr ""
-#: config/sh/symbian.c:332
-msgid "%H%s '%D' %s after being referenced with dllimport linkage."
+#: config/rs6000/rs6000.c:4280
+#, gcc-internal-format
+msgid ""
+"Cannot pass argument in vector register because altivec instructions are "
+"disabled, use -maltivec to enable them."
msgstr ""
-#: config/sh/symbian.c:436
-msgid "%Hvariable %qD definition is marked dllimport."
+#: config/rs6000/rs6000.c:5132
+#, gcc-internal-format
+msgid ""
+"GCC vector passed by reference: non-standard ABI extension with no "
+"compatibility guarantee"
msgstr ""
-#: config/sh/symbian.c:511
-msgid "%Hexternal linkage required for symbol '%D' because of '%s' attribute."
+#: config/rs6000/rs6000.c:6240
+#, gcc-internal-format
+msgid "argument 1 must be a 5-bit signed literal"
msgstr ""
-#: config/sh/symbian.c:892 cp/tree.c:2290
-#, c-format
-msgid "lang_* check: failed in %s, at %s:%d"
+#: config/rs6000/rs6000.c:6343 config/rs6000/rs6000.c:7010
+#, gcc-internal-format
+msgid "argument 2 must be a 5-bit unsigned literal"
msgstr ""
-#. There are no delay slots on SHmedia.
-#. Relaxation isn't yet supported for SHmedia
-#. -fprofile-arcs needs a working libgcov . In unified tree configurations with newlib, this requires to configure with --with-newlib --with-headers. But there is no way to check here we have a working libgcov, so just assume that we have.
-#: config/sh/sh.h:754
-msgid "Profiling is not supported on this target."
+#: config/rs6000/rs6000.c:6383
+#, gcc-internal-format
+msgid "argument 1 of __builtin_altivec_predicate must be a constant"
msgstr ""
-#: config/sparc/sparc.c:592
-#, c-format
-msgid "%s is not supported by this configuration"
+#: config/rs6000/rs6000.c:6436
+#, gcc-internal-format
+msgid "argument 1 of __builtin_altivec_predicate is out of range"
msgstr ""
-#: config/sparc/sparc.c:599
-msgid "-mlong-double-64 not allowed with -m64"
+#: config/rs6000/rs6000.c:6598
+#, gcc-internal-format
+msgid "argument 3 must be a 4-bit unsigned literal"
msgstr ""
-#: config/sparc/sparc.c:624
-msgid "-mcmodel= is not supported on 32 bit systems"
+#: config/rs6000/rs6000.c:6770
+#, gcc-internal-format
+msgid "argument to %qs must be a 2-bit unsigned literal"
msgstr ""
-#: config/sparc/sparc.c:7333 config/sparc/sparc.c:7339
-#, c-format
-msgid "invalid %%Y operand"
+#: config/rs6000/rs6000.c:6809
+#, gcc-internal-format
+msgid "unresolved overload for Altivec builtin %qE"
msgstr ""
-#: config/sparc/sparc.c:7409
-#, c-format
-msgid "invalid %%A operand"
+#: config/rs6000/rs6000.c:6891
+#, gcc-internal-format
+msgid "argument to dss must be a 2-bit unsigned literal"
msgstr ""
-#: config/sparc/sparc.c:7419
-#, c-format
-msgid "invalid %%B operand"
+#: config/rs6000/rs6000.c:7130
+#, gcc-internal-format
+msgid "argument 1 of __builtin_spe_predicate must be a constant"
msgstr ""
-#: config/sparc/sparc.c:7458
-#, c-format
-msgid "invalid %%c operand"
+#: config/rs6000/rs6000.c:7202
+#, gcc-internal-format
+msgid "argument 1 of __builtin_spe_predicate is out of range"
msgstr ""
-#: config/sparc/sparc.c:7459
-#, c-format
-msgid "invalid %%C operand"
+#: config/rs6000/rs6000.c:12877
+#, gcc-internal-format
+msgid "stack frame too large"
msgstr ""
-#: config/sparc/sparc.c:7480
-#, c-format
-msgid "invalid %%d operand"
+#: config/rs6000/rs6000.c:15439
+#, gcc-internal-format
+msgid "no profiling of 64-bit code for this ABI"
msgstr ""
-#: config/sparc/sparc.c:7481
-#, c-format
-msgid "invalid %%D operand"
+#: config/rs6000/rs6000.c:16528
+#, gcc-internal-format
+msgid "use of %<long%> in AltiVec types is invalid for 64-bit code"
msgstr ""
-#: config/sparc/sparc.c:7497
-#, c-format
-msgid "invalid %%f operand"
+#: config/rs6000/rs6000.c:16530
+#, gcc-internal-format
+msgid "use of %<long%> in AltiVec types is deprecated; use %<int%>"
msgstr ""
-#: config/sparc/sparc.c:7511
-#, c-format
-msgid "invalid %%s operand"
+#: config/rs6000/rs6000.c:16534
+#, gcc-internal-format
+msgid "use of %<long long%> in AltiVec types is invalid"
msgstr ""
-#: config/sparc/sparc.c:7565
-msgid "long long constant not a valid immediate operand"
+#: config/rs6000/rs6000.c:16536
+#, gcc-internal-format
+msgid "use of %<double%> in AltiVec types is invalid"
msgstr ""
-#: config/sparc/sparc.c:7568
-msgid "floating point constant not a valid immediate operand"
+#: config/rs6000/rs6000.c:16538
+#, gcc-internal-format
+msgid "use of %<long double%> in AltiVec types is invalid"
msgstr ""
-#: config/sparc/freebsd.h:77 config/sparc/linux.h:91
-#: config/sparc/linux64.h:111 config/sparc/netbsd-elf.h:201
-msgid "Use 64 bit long doubles"
+#: config/rs6000/rs6000.c:16540
+#, gcc-internal-format
+msgid "use of boolean types in AltiVec types is invalid"
msgstr ""
-#: config/sparc/freebsd.h:78 config/sparc/linux.h:92
-#: config/sparc/linux64.h:112 config/sparc/netbsd-elf.h:202
-msgid "Use 128 bit long doubles"
+#: config/rs6000/rs6000.c:16542
+#, gcc-internal-format
+msgid "use of %<complex%> in AltiVec types is invalid"
msgstr ""
-#: config/sparc/sp64-elf.h:87
-msgid "Generate code for big endian"
+#: config/rs6000/aix43.h:39 config/rs6000/aix51.h:38 config/rs6000/aix52.h:38
+#, gcc-internal-format
+msgid "-maix64 and POWER architecture are incompatible"
msgstr ""
-#: config/sparc/sp64-elf.h:88
-msgid "Generate code for little endian"
+#: config/rs6000/aix43.h:44 config/rs6000/aix51.h:43 config/rs6000/aix52.h:43
+#, gcc-internal-format
+msgid "-maix64 requires PowerPC64 architecture remain enabled"
msgstr ""
-#: config/sparc/sparc.h:635
-msgid "Assume possible double misalignment"
+#: config/rs6000/aix43.h:48 config/rs6000/aix51.h:47 config/rs6000/aix52.h:47
+#, gcc-internal-format
+msgid ""
+"-maix64 required: 64-bit computation with 32-bit addressing not yet supported"
msgstr ""
-#: config/sparc/sparc.h:637
-msgid "Assume all doubles are aligned"
+#. The Darwin ABI always includes AltiVec, can't be (validly) turned
+#. off.
+#: config/rs6000/darwin.h:75
+#, gcc-internal-format
+msgid "-mdynamic-no-pic overrides -fpic or -fPIC"
msgstr ""
-#: config/sparc/sparc.h:639
-msgid "Pass -assert pure-text to linker"
+#. Darwin doesn't support -fpic.
+#: config/rs6000/darwin.h:81
+#, gcc-internal-format
+msgid "-fpic is not supported; -fPIC assumed"
msgstr ""
-#: config/sparc/sparc.h:641
-msgid "Do not pass -assert pure-text to linker"
+#: config/rs6000/darwin.h:88
+#, gcc-internal-format
+msgid "-m64 requires PowerPC64 architecture, enabling"
msgstr ""
-#: config/sparc/sparc.h:643
-msgid "Use ABI reserved registers"
+#. See note below.
+#. if (!rs6000_explicit_options.long_double)
+#. rs6000_long_double_type_size = 128;
+#. See note below.
+#. if (rs6000_long_double_size_string == NULL)
+#. rs6000_long_double_type_size = 128;
+#: config/rs6000/eabispe.h:45 config/rs6000/linuxspe.h:62
+#, gcc-internal-format
+msgid "-m64 not supported in this configuration"
msgstr ""
-#: config/sparc/sparc.h:645
-msgid "Do not use ABI reserved registers"
+#: config/rs6000/linux64.h:109
+#, gcc-internal-format
+msgid "-m64 requires a PowerPC64 cpu"
msgstr ""
-#: config/sparc/sparc.h:647
-msgid "Use hardware quad fp instructions"
+#. Definitions for __builtin_return_address and __builtin_frame_address.
+#. __builtin_return_address (0) should give link register (65), enable
+#. this.
+#. This should be uncommented, so that the link register is used, but
+#. currently this would result in unmatched insns and spilling fixed
+#. registers so we'll leave it for another day. When these problems are
+#. taken care of one additional fetch will be necessary in RETURN_ADDR_RTX.
+#. (mrs)
+#. #define RETURN_ADDR_IN_PREVIOUS_FRAME
+#. Number of bytes into the frame return addresses can be found. See
+#. rs6000_stack_info in rs6000.c for more information on how the different
+#. abi's store the return address.
+#: config/rs6000/rs6000.h:1588
+#, gcc-internal-format
+msgid "RETURN_ADDRESS_OFFSET not supported"
msgstr ""
-#: config/sparc/sparc.h:649
-msgid "Do not use hardware quad fp instructions"
+#. 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.
+#: config/rs6000/sysv4.h:130
+#, gcc-internal-format
+msgid "bad value for -mcall-%s"
msgstr ""
-#: config/sparc/sparc.h:651
-msgid "Compile for v8plus ABI"
+#: config/rs6000/sysv4.h:146
+#, gcc-internal-format
+msgid "bad value for -msdata=%s"
msgstr ""
-#: config/sparc/sparc.h:653
-msgid "Do not compile for v8plus ABI"
+#: config/rs6000/sysv4.h:163
+#, gcc-internal-format
+msgid "-mrelocatable and -msdata=%s are incompatible"
msgstr ""
-#: config/sparc/sparc.h:655
-msgid "Utilize Visual Instruction Set"
+#: config/rs6000/sysv4.h:172
+#, gcc-internal-format
+msgid "-f%s and -msdata=%s are incompatible"
msgstr ""
-#: config/sparc/sparc.h:657
-msgid "Do not utilize Visual Instruction Set"
+#: config/rs6000/sysv4.h:181
+#, gcc-internal-format
+msgid "-msdata=%s and -mcall-%s are incompatible"
msgstr ""
-#: config/sparc/sparc.h:659
-msgid "Pointers are 64-bit"
+#: config/rs6000/sysv4.h:190
+#, gcc-internal-format
+msgid "-mrelocatable and -mno-minimal-toc are incompatible"
msgstr ""
-#: config/sparc/sparc.h:661
-msgid "Pointers are 32-bit"
+#: config/rs6000/sysv4.h:196
+#, gcc-internal-format
+msgid "-mrelocatable and -mcall-%s are incompatible"
msgstr ""
-#: config/sparc/sparc.h:663
-msgid "Use 32-bit ABI"
+#: config/rs6000/sysv4.h:203
+#, gcc-internal-format
+msgid "-fPIC and -mcall-%s are incompatible"
msgstr ""
-#: config/sparc/sparc.h:665
-msgid "Use 64-bit ABI"
+#: config/rs6000/sysv4.h:210
+#, gcc-internal-format
+msgid "-mcall-aixdesc must be big endian"
msgstr ""
-#: config/sparc/sparc.h:667
-msgid "Use stack bias"
+#: config/rs6000/sysv4.h:215
+#, gcc-internal-format
+msgid "-msecure-plt not supported by your assembler"
msgstr ""
-#: config/sparc/sparc.h:669
-msgid "Do not use stack bias"
+#: config/rs6000/sysv4.h:230
+#, gcc-internal-format
+msgid "-m%s not supported in this configuration"
msgstr ""
-#: config/sparc/sparc.h:671
-msgid "Use structs on stronger alignment for double-word copies"
+#: config/s390/s390.c:1136
+#, gcc-internal-format
+msgid "stack guard value must be an exact power of 2"
msgstr ""
-#: config/sparc/sparc.h:673
-msgid "Do not use structs on stronger alignment for double-word copies"
+#: config/s390/s390.c:1143
+#, gcc-internal-format
+msgid "stack size must be an exact power of 2"
msgstr ""
-#: config/sparc/sparc.h:675
-msgid "Optimize tail call instructions in assembler and linker"
+#: config/s390/s390.c:1191
+#, gcc-internal-format
+msgid "z/Architecture mode not supported on %s."
msgstr ""
-#: config/sparc/sparc.h:677
-msgid "Do not optimize tail call instructions in assembler or linker"
+#: config/s390/s390.c:1193
+#, gcc-internal-format
+msgid "64-bit ABI not supported in ESA/390 mode."
msgstr ""
-#: config/sparc/sparc.h:722
-msgid "Use given SPARC code model"
+#: config/s390/s390.c:1204
+#, gcc-internal-format
+msgid ""
+"-mbackchain -mpacked-stack -mhard-float are not supported in combination."
msgstr ""
-#: config/stormy16/stormy16.c:500
-msgid "Constant halfword load operand out of range."
+#: config/s390/s390.c:1210
+#, gcc-internal-format
+msgid "-mstack-size implies use of -mstack-guard"
msgstr ""
-#: config/stormy16/stormy16.c:510
-msgid "Constant arithmetic operand out of range."
+#: config/s390/s390.c:1212
+#, gcc-internal-format
+msgid "stack size must be greater than the stack guard value"
msgstr ""
-#: config/stormy16/stormy16.c:1119
-msgid "Local variable memory requirements exceed capacity."
+#: config/s390/s390.c:1215
+#, gcc-internal-format
+msgid "-mstack-guard implies use of -mstack-size"
msgstr ""
-#: config/stormy16/stormy16.c:1285
-msgid "function_profiler support"
+#: config/s390/s390.c:5682
+#, gcc-internal-format
+msgid "Total size of local variables exceeds architecture limit."
msgstr ""
-#: config/stormy16/stormy16.c:1374
-msgid "cannot use va_start in interrupt function"
+#: config/s390/s390.c:6218
+#, gcc-internal-format
+msgid "frame size of %qs is "
msgstr ""
-#: config/stormy16/stormy16.c:1816 config/stormy16/stormy16.c:1887
-msgid "'B' operand is not constant"
+#: config/s390/s390.c:6218
+#, gcc-internal-format
+msgid " bytes"
msgstr ""
-#: config/stormy16/stormy16.c:1843
-msgid "'B' operand has multiple bits set"
+#: config/s390/s390.c:6222
+#, gcc-internal-format
+msgid "%qs uses dynamic stack allocation"
msgstr ""
-#: config/stormy16/stormy16.c:1869
-msgid "'o' operand is not constant"
+#: config/sh/sh.c:6416
+#, gcc-internal-format
+msgid "__builtin_saveregs not supported by this subtarget"
msgstr ""
-#: config/stormy16/stormy16.c:1901
-msgid "xstormy16_print_operand: unknown code"
+#: config/sh/sh.c:7403
+#, gcc-internal-format
+msgid "attribute interrupt_handler is not compatible with -m5-compact"
msgstr ""
-#: config/stormy16/stormy16.c:1947
-#, c-format
+#. The sp_switch attribute only has meaning for interrupt functions.
+#. The trap_exit attribute only has meaning for interrupt functions.
+#: config/sh/sh.c:7425 config/sh/sh.c:7460
+#, gcc-internal-format
+msgid "%qs attribute only applies to interrupt functions"
+msgstr ""
+
+#. The argument must be a constant string.
+#: config/sh/sh.c:7432
+#, gcc-internal-format
+msgid "%qs attribute argument not a string constant"
+msgstr ""
+
+#. The argument must be a constant integer.
+#: config/sh/sh.c:7467
+#, gcc-internal-format
+msgid "%qs attribute argument not an integer constant"
+msgstr ""
+
+#: config/sh/sh.c:9461
+#, gcc-internal-format
+msgid "r0 needs to be available as a call-clobbered register"
+msgstr ""
+
+#: config/sh/sh.c:9482
+#, gcc-internal-format
+msgid "Need a second call-clobbered general purpose register"
+msgstr ""
+
+#: config/sh/sh.c:9490
+#, gcc-internal-format
+msgid "Need a call-clobbered target register"
+msgstr ""
+
+#: config/sh/symbian.c:147
+#, gcc-internal-format
+msgid ""
+"%H function '%D' is defined after prior declaration as dllimport: attribute "
+"ignored"
+msgstr ""
+
+#: config/sh/symbian.c:159
+#, gcc-internal-format
+msgid "%Hinline function '%D' is declared as dllimport: attribute ignored."
+msgstr ""
+
+#: config/sh/symbian.c:173
+#, gcc-internal-format
+msgid "%Hdefinition of static data member '%D' of dllimport'd class."
+msgstr ""
+
+#: config/sh/symbian.c:280
+#, gcc-internal-format
+msgid ""
+"%Hfailure in redeclaration of '%D': dllimport'd symbol lacks external "
+"linkage."
+msgstr ""
+
+#: config/sh/symbian.c:326
+#, gcc-internal-format
+msgid "%H%s '%D' %s after being referenced with dllimport linkage."
+msgstr ""
+
+#: config/sh/symbian.c:430
+#, gcc-internal-format
+msgid "%Hvariable %qD definition is marked dllimport."
+msgstr ""
+
+#: config/sh/symbian.c:505
+#, gcc-internal-format
+msgid "%Hexternal linkage required for symbol '%D' because of '%s' attribute."
+msgstr ""
+
+#: config/sh/symbian.c:886 cp/tree.c:2287
+#, gcc-internal-format
+msgid "lang_* check: failed in %s, at %s:%d"
+msgstr ""
+
+#. FIXME
+#: config/sh/netbsd-elf.h:95
+#, gcc-internal-format
+msgid "unimplemented-shmedia profiling"
+msgstr ""
+
+#. There are no delay slots on SHmedia.
+#. Relaxation isn't yet supported for SHmedia
+#. After reload, if conversion does little good but can cause ICEs: - find_if_block doesn't do anything for SH because we don't have conditional execution patterns. (We use conditional move patterns, which are handled differently, and only before reload). - find_cond_trap doesn't do anything for the SH because we #. don't have conditional traps. - find_if_case_1 uses redirect_edge_and_branch_force in the only path that does an optimization, and this causes an ICE when branch targets are in registers. - find_if_case_2 doesn't do anything for the SHmedia after reload except when it can redirect a tablejump - and that's rather rare.
+#. -fprofile-arcs needs a working libgcov . In unified tree configurations with newlib, this requires to configure with --with-newlib --with-headers. But there is no way to check here we have a working libgcov, so just assume that we have.
+#: config/sh/sh.h:607
+#, gcc-internal-format
+msgid "Profiling is still experimental for this target."
+msgstr ""
+
+#: config/sparc/sparc.c:623
+#, gcc-internal-format
+msgid "%s is not supported by this configuration"
+msgstr ""
+
+#: config/sparc/sparc.c:630
+#, gcc-internal-format
+msgid "-mlong-double-64 not allowed with -m64"
+msgstr ""
+
+#: config/sparc/sparc.c:655
+#, gcc-internal-format
+msgid "-mcmodel= is not supported on 32 bit systems"
+msgstr ""
+
+#: config/stormy16/stormy16.c:497
+#, gcc-internal-format
+msgid "Constant halfword load operand out of range."
+msgstr ""
+
+#: config/stormy16/stormy16.c:507
+#, gcc-internal-format
+msgid "Constant arithmetic operand out of range."
+msgstr ""
+
+#: config/stormy16/stormy16.c:1110
+#, gcc-internal-format
+msgid "Local variable memory requirements exceed capacity."
+msgstr ""
+
+#: config/stormy16/stormy16.c:1276
+#, gcc-internal-format
+msgid "function_profiler support"
+msgstr ""
+
+#: config/stormy16/stormy16.c:1365
+#, gcc-internal-format
+msgid "cannot use va_start in interrupt function"
+msgstr ""
+
+#: config/stormy16/stormy16.c:1933
+#, gcc-internal-format
msgid "switch statement of size %lu entries too large"
msgstr ""
-#: config/stormy16/stormy16.c:2317
+#: config/stormy16/stormy16.c:2301
+#, gcc-internal-format
msgid "%<__BELOW100__%> attribute only applies to variables"
msgstr ""
-#: config/stormy16/stormy16.c:2324
+#: config/stormy16/stormy16.c:2308
+#, gcc-internal-format
msgid "__BELOW100__ attribute not allowed with auto storage class."
msgstr ""
#: config/v850/v850-c.c:67
+#, gcc-internal-format
msgid "#pragma GHS endXXXX found without previous startXXX"
msgstr ""
#: config/v850/v850-c.c:69
+#, gcc-internal-format
msgid "#pragma GHS endXXX does not match previous startXXX"
msgstr ""
#: config/v850/v850-c.c:94
+#, gcc-internal-format
msgid "cannot set interrupt attribute: no current function"
msgstr ""
#: config/v850/v850-c.c:102
+#, gcc-internal-format
msgid "cannot set interrupt attribute: no such identifier"
msgstr ""
#: config/v850/v850-c.c:147
+#, gcc-internal-format
msgid "junk at end of #pragma ghs section"
msgstr ""
#: config/v850/v850-c.c:164
-#, c-format
+#, gcc-internal-format
msgid "unrecognized section name \"%s\""
msgstr ""
#: config/v850/v850-c.c:179
+#, gcc-internal-format
msgid "malformed #pragma ghs section"
msgstr ""
#: config/v850/v850-c.c:198
+#, gcc-internal-format
msgid "junk at end of #pragma ghs interrupt"
msgstr ""
#: config/v850/v850-c.c:209
+#, gcc-internal-format
msgid "junk at end of #pragma ghs starttda"
msgstr ""
#: config/v850/v850-c.c:220
+#, gcc-internal-format
msgid "junk at end of #pragma ghs startsda"
msgstr ""
#: config/v850/v850-c.c:231
+#, gcc-internal-format
msgid "junk at end of #pragma ghs startzda"
msgstr ""
#: config/v850/v850-c.c:242
+#, gcc-internal-format
msgid "junk at end of #pragma ghs endtda"
msgstr ""
#: config/v850/v850-c.c:253
+#, gcc-internal-format
msgid "junk at end of #pragma ghs endsda"
msgstr ""
#: config/v850/v850-c.c:264
+#, gcc-internal-format
msgid "junk at end of #pragma ghs endzda"
msgstr ""
#: config/v850/v850.c:172
+#, gcc-internal-format
msgid "value passed to %<-m%s%> is too large"
msgstr ""
-#: config/v850/v850.c:360
-msgid "const_double_split got a bad insn:"
-msgstr ""
-
-#: config/v850/v850.c:925
-msgid "output_move_single:"
-msgstr ""
-
-#: config/v850/v850.c:2141
+#: config/v850/v850.c:2140
+#, gcc-internal-format
msgid "%Jdata area attributes cannot be specified for local variables"
msgstr ""
-#: config/v850/v850.c:2152
+#: config/v850/v850.c:2151
+#, gcc-internal-format
msgid "%Jdata area of '%D' conflicts with previous declaration"
msgstr ""
-#: config/v850/v850.c:2282
-#, c-format
+#: config/v850/v850.c:2281
+#, gcc-internal-format
msgid "bogus JR construction: %d\n"
msgstr ""
-#: config/v850/v850.c:2303 config/v850/v850.c:2423
-#, c-format
+#: config/v850/v850.c:2299 config/v850/v850.c:2408
+#, gcc-internal-format
msgid "bad amount of stack space removal: %d"
msgstr ""
-#: config/v850/v850.c:2399
-#, c-format
+#: config/v850/v850.c:2388
+#, gcc-internal-format
msgid "bogus JARL construction: %d\n"
msgstr ""
-#: config/v850/v850.c:2708
-#, c-format
+#: config/v850/v850.c:2687
+#, gcc-internal-format
msgid "Bogus DISPOSE construction: %d\n"
msgstr ""
-#: config/v850/v850.c:2730
-#, c-format
+#: config/v850/v850.c:2706
+#, gcc-internal-format
msgid "Too much stack space to dispose of: %d"
msgstr ""
-#: config/v850/v850.c:2834
-#, c-format
+#: config/v850/v850.c:2808
+#, gcc-internal-format
msgid "Bogus PREPEARE construction: %d\n"
msgstr ""
-#: config/v850/v850.c:2856
-#, c-format
+#: config/v850/v850.c:2827
+#, gcc-internal-format
msgid "Too much stack space to prepare: %d"
msgstr ""
-#: config/xtensa/xtensa.c:746 config/xtensa/xtensa.c:778
-#: config/xtensa/xtensa.c:787
-msgid "bad test"
-msgstr ""
-
-#: config/xtensa/xtensa.c:1506
+#: config/xtensa/xtensa.c:1505
+#, gcc-internal-format
msgid "boolean registers required for the floating-point option"
msgstr ""
-#: config/xtensa/xtensa.c:1552
-#, c-format
+#: config/xtensa/xtensa.c:1551
+#, gcc-internal-format
msgid "-f%s is not supported with CONST16 instructions"
msgstr ""
-#: config/xtensa/xtensa.c:1557
+#: config/xtensa/xtensa.c:1556
+#, gcc-internal-format
msgid "PIC is required but not supported with CONST16 instructions"
msgstr ""
-#: config/xtensa/xtensa.c:1636
-#, c-format
-msgid "invalid %%D value"
-msgstr ""
-
-#: config/xtensa/xtensa.c:1673
-msgid "invalid mask"
-msgstr ""
-
-#: config/xtensa/xtensa.c:1699
-#, c-format
-msgid "invalid %%x value"
-msgstr ""
-
-#: config/xtensa/xtensa.c:1706
-#, c-format
-msgid "invalid %%d value"
-msgstr ""
-
-#: config/xtensa/xtensa.c:1727 config/xtensa/xtensa.c:1737
-#, c-format
-msgid "invalid %%t/%%b value"
-msgstr ""
-
-#: config/xtensa/xtensa.c:1779
-msgid "invalid address"
-msgstr ""
-
-#: config/xtensa/xtensa.c:1804
-msgid "no register in address"
-msgstr ""
-
-#: config/xtensa/xtensa.c:1812
-msgid "address offset not a constant"
-msgstr ""
-
-#: config/xtensa/xtensa.c:2413
+#: config/xtensa/xtensa.c:2414
+#, gcc-internal-format
msgid "only uninitialized variables can be placed in a .bss section"
msgstr ""
-#: config/xtensa/xtensa.h:79
-msgid "Use CONST16 instruction to load constants"
-msgstr ""
-
-#: config/xtensa/xtensa.h:81
-msgid "Use PC-relative L32R instruction to load constants"
-msgstr ""
-
-#: config/xtensa/xtensa.h:83
-msgid "Disable fused multiply/add and multiply/subtract FP instructions"
-msgstr ""
-
-#: config/xtensa/xtensa.h:85
-msgid "Enable fused multiply/add and multiply/subtract FP instructions"
-msgstr ""
-
-#: config/xtensa/xtensa.h:87
-msgid "Intersperse literal pools with code in the text section"
-msgstr ""
-
-#: config/xtensa/xtensa.h:89
-msgid "Put literal pools in a separate literal section"
-msgstr ""
-
-#: config/xtensa/xtensa.h:91
-msgid "Automatically align branch targets to reduce branch penalties"
-msgstr ""
-
-#: config/xtensa/xtensa.h:93
-msgid "Do not automatically align branch targets"
-msgstr ""
-
-#: config/xtensa/xtensa.h:95
-msgid "Use indirect CALLXn instructions for large programs"
-msgstr ""
-
-#: config/xtensa/xtensa.h:97
-msgid "Use direct CALLn instructions for fast calls"
-msgstr ""
-
-#: ada/misc.c:263
-#, c-format
+#: ada/misc.c:262
+#, gcc-internal-format
msgid "missing argument to \"-%s\""
msgstr ""
-#: ada/misc.c:304
+#: ada/misc.c:303
+#, gcc-internal-format
msgid "%<-gnat%> misspelled as %<-gant%>"
msgstr ""
#: cp/call.c:288
+#, gcc-internal-format
msgid "unable to call pointer to member function here"
msgstr ""
#: cp/call.c:2376
+#, gcc-internal-format
msgid "%s %D(%T, %T, %T) <built-in>"
msgstr ""
#: cp/call.c:2381
+#, gcc-internal-format
msgid "%s %D(%T, %T) <built-in>"
msgstr ""
#: cp/call.c:2385
+#, gcc-internal-format
msgid "%s %D(%T) <built-in>"
msgstr ""
#: cp/call.c:2389
+#, gcc-internal-format
msgid "%s %T <conversion>"
msgstr ""
#: cp/call.c:2391
+#, gcc-internal-format
msgid "%J%s %+#D <near match>"
msgstr ""
#: cp/call.c:2393
+#, gcc-internal-format
msgid "%J%s %+#D"
msgstr ""
-#: cp/call.c:2428
-msgid "candidates are:"
-msgstr ""
-
#: cp/call.c:2614
+#, gcc-internal-format
msgid "conversion from %qT to %qT is ambiguous"
msgstr ""
#: cp/call.c:2767 cp/call.c:2825
+#, gcc-internal-format
msgid "no matching function for call to %<%D(%A)%>"
msgstr ""
#: cp/call.c:2770 cp/call.c:2828
+#, gcc-internal-format
msgid "call of overloaded %<%D(%A)%> is ambiguous"
msgstr ""
#. It's no good looking for an overloaded operator() on a
#. pointer-to-member-function.
#: cp/call.c:2896
-#, c-format
+#, gcc-internal-format
msgid ""
"pointer-to-member function %E cannot be called without an object; consider "
"using .* or ->*"
msgstr ""
#: cp/call.c:2965
+#, gcc-internal-format
msgid "no match for call to %<(%T) (%A)%>"
msgstr ""
#: cp/call.c:2974
+#, gcc-internal-format
msgid "call of %<(%T) (%A)%> is ambiguous"
msgstr ""
#: cp/call.c:3012
+#, gcc-internal-format
msgid "%s for ternary %<operator?:%> in %<%E ? %E : %E%>"
msgstr ""
#: cp/call.c:3018
+#, gcc-internal-format
msgid "%s for %<operator%s%> in %<%E%s%>"
msgstr ""
#: cp/call.c:3022
+#, gcc-internal-format
msgid "%s for %<operator[]%> in %<%E[%E]%>"
msgstr ""
#: cp/call.c:3027
+#, gcc-internal-format
msgid "%s for %qs in %<%s %E%>"
msgstr ""
#: cp/call.c:3032
+#, gcc-internal-format
msgid "%s for %<operator%s%> in %<%E %s %E%>"
msgstr ""
#: cp/call.c:3035
+#, gcc-internal-format
msgid "%s for %<operator%s%> in %<%s%E%>"
msgstr ""
#: cp/call.c:3125
+#, gcc-internal-format
msgid "ISO C++ forbids omitting the middle term of a ?: expression"
msgstr ""
#: cp/call.c:3202
+#, gcc-internal-format
msgid "%qE has type %<void%> and is not a throw-expression"
msgstr ""
#: cp/call.c:3241 cp/call.c:3451
+#, gcc-internal-format
msgid "operands to ?: have different types"
msgstr ""
#: cp/call.c:3405
+#, gcc-internal-format
msgid "enumeral mismatch in conditional expression: %qT vs %qT"
msgstr ""
#: cp/call.c:3412
+#, gcc-internal-format
msgid "enumeral and non-enumeral type in conditional expression"
msgstr ""
#: cp/call.c:3706
+#, gcc-internal-format
msgid "no %<%D(int)%> declared for postfix %qs, trying prefix operator instead"
msgstr ""
#: cp/call.c:3779
+#, gcc-internal-format
msgid "comparison between %q#T and %q#T"
msgstr ""
#: cp/call.c:4038
-msgid "no suitable %<operator %s> for %qT"
+#, gcc-internal-format
+msgid "no suitable %<operator %s%> for %qT"
msgstr ""
#: cp/call.c:4055
+#, gcc-internal-format
msgid "%q+#D is private"
msgstr ""
#: cp/call.c:4057
+#, gcc-internal-format
msgid "%q+#D is protected"
msgstr ""
#: cp/call.c:4059
+#, gcc-internal-format
msgid "%q+#D is inaccessible"
msgstr ""
#: cp/call.c:4060
+#, gcc-internal-format
msgid "within this context"
msgstr ""
#: cp/call.c:4149 cp/cvt.c:263
+#, gcc-internal-format
msgid "invalid conversion from %qT to %qT"
msgstr ""
#: cp/call.c:4151
+#, gcc-internal-format
msgid " initializing argument %P of %qD"
msgstr ""
#: cp/call.c:4163
+#, gcc-internal-format
msgid "passing NULL to non-pointer argument %P of %qD"
msgstr ""
#: cp/call.c:4166
+#, gcc-internal-format
msgid "converting to non-pointer type %qT from NULL"
msgstr ""
#: cp/call.c:4174
+#, gcc-internal-format
msgid "passing %qT for argument %P to %qD"
msgstr ""
#: cp/call.c:4177
+#, gcc-internal-format
msgid "converting to %qT from %qT"
msgstr ""
#: cp/call.c:4186
+#, gcc-internal-format
msgid "passing negative value %qE for argument %P to %qD"
msgstr ""
#: cp/call.c:4189
+#, gcc-internal-format
msgid "converting negative value %qE to %qT"
msgstr ""
#: cp/call.c:4331
+#, gcc-internal-format
msgid "cannot bind bitfield %qE to %qT"
msgstr ""
#: cp/call.c:4334 cp/call.c:4350
+#, gcc-internal-format
msgid "cannot bind packed field %qE to %qT"
msgstr ""
#: cp/call.c:4337
+#, gcc-internal-format
msgid "cannot bind rvalue %qE to %qT"
msgstr ""
#: cp/call.c:4446
+#, gcc-internal-format
msgid ""
"cannot pass objects of non-POD type %q#T through %<...%>; call will abort at "
"runtime"
@@ -11981,307 +17158,384 @@ msgstr ""
#. Undefined behavior [expr.call] 5.2.2/7.
#: cp/call.c:4472
+#, gcc-internal-format
msgid ""
"cannot receive objects of non-POD type %q#T through %<...%>; call will abort "
"at runtime"
msgstr ""
#: cp/call.c:4515
+#, gcc-internal-format
msgid "the default argument for parameter %d of %qD has not yet been parsed"
msgstr ""
#: cp/call.c:4720
+#, gcc-internal-format
msgid "passing %qT as %<this%> argument of %q#D discards qualifiers"
msgstr ""
#: cp/call.c:4739
+#, gcc-internal-format
msgid "%qT is not an accessible base of %qT"
msgstr ""
#: cp/call.c:4989
+#, gcc-internal-format
msgid "could not find class$ field in java interface type %qT"
msgstr ""
#: cp/call.c:5249
+#, gcc-internal-format
msgid "call to non-function %qD"
msgstr ""
#: cp/call.c:5274
+#, gcc-internal-format
msgid "request for member %qD in %qE, which is of non-aggregate type %qT"
msgstr ""
#: cp/call.c:5353
+#, gcc-internal-format
msgid "no matching function for call to %<%T::%s(%A)%#V%>"
msgstr ""
#: cp/call.c:5371
+#, gcc-internal-format
msgid "call of overloaded %<%s(%A)%> is ambiguous"
msgstr ""
#: cp/call.c:5395
+#, gcc-internal-format
msgid "cannot call member function %qD without object"
msgstr ""
#: cp/call.c:6000
+#, gcc-internal-format
msgid "passing %qT chooses %qT over %qT"
msgstr ""
-#: cp/call.c:6002 cp/name-lookup.c:4120
+#: cp/call.c:6002 cp/name-lookup.c:4126
+#, gcc-internal-format
msgid " in call to %qD"
msgstr ""
#: cp/call.c:6059
+#, gcc-internal-format
msgid "choosing %qD over %qD"
msgstr ""
#: cp/call.c:6060
+#, gcc-internal-format
msgid " for conversion from %qT to %qT"
msgstr ""
#: cp/call.c:6062
+#, gcc-internal-format
msgid " because conversion sequence for the argument is better"
msgstr ""
#: cp/call.c:6182
+#, gcc-internal-format
msgid ""
"ISO C++ says that these are ambiguous, even though the worst conversion for "
"the first is better than the worst conversion for the second:"
msgstr ""
-#: cp/call.c:6186
-msgid "candidate 1:"
-msgstr ""
-
-#: cp/call.c:6187
-msgid "candidate 2:"
-msgstr ""
-
#: cp/call.c:6323
+#, gcc-internal-format
msgid "could not convert %qE to %qT"
msgstr ""
#: cp/call.c:6454
+#, gcc-internal-format
msgid ""
"invalid initialization of non-const reference of type %qT from a temporary "
"of type %qT"
msgstr ""
#: cp/call.c:6458
+#, gcc-internal-format
msgid ""
"invalid initialization of reference of type %qT from expression of type %qT"
msgstr ""
-#: cp/class.c:272
+#: cp/class.c:273
+#, gcc-internal-format
msgid "cannot convert from base %qT to derived type %qT via virtual base %qT"
msgstr ""
#: cp/class.c:929
+#, gcc-internal-format
msgid "Java class %qT cannot have a destructor"
msgstr ""
#: cp/class.c:931
+#, gcc-internal-format
msgid "Java class %qT cannot have an implicit non-trivial destructor"
msgstr ""
-#: cp/class.c:1031
-msgid "%q#D and %q#D cannot be overloaded"
+#: cp/class.c:1032
+#, gcc-internal-format
+msgid "repeated using declaration %qD"
msgstr ""
-#: cp/class.c:1088
+#: cp/class.c:1034
+#, gcc-internal-format
+msgid "using declaration %qD conflicts with a previous using declaration"
+msgstr ""
+
+#: cp/class.c:1039
+#, gcc-internal-format
+msgid "%q#D cannot be overloaded"
+msgstr ""
+
+#: cp/class.c:1040
+#, gcc-internal-format
+msgid "with %q#D"
+msgstr ""
+
+#: cp/class.c:1095
+#, gcc-internal-format
msgid "conflicting access specifications for method %qD, ignored"
msgstr ""
-#: cp/class.c:1091
-#, c-format
+#: cp/class.c:1098
+#, gcc-internal-format
msgid "conflicting access specifications for field %qE, ignored"
msgstr ""
-#: cp/class.c:1141
+#: cp/class.c:1148
+#, gcc-internal-format
msgid "%qD names constructor"
msgstr ""
-#: cp/class.c:1146
+#: cp/class.c:1153
+#, gcc-internal-format
msgid "%qD invalid in %qT"
msgstr ""
-#: cp/class.c:1154
+#: cp/class.c:1161
+#, gcc-internal-format
msgid "no members matching %qD in %q#T"
msgstr ""
-#: cp/class.c:1186 cp/class.c:1194
+#: cp/class.c:1193 cp/class.c:1201
+#, gcc-internal-format
msgid "%qD invalid in %q#T"
msgstr ""
-#: cp/class.c:1187
+#: cp/class.c:1194
+#, gcc-internal-format
msgid " because of local method %q#D with same name"
msgstr ""
-#: cp/class.c:1195
+#: cp/class.c:1202
+#, gcc-internal-format
msgid " because of local member %q#D with same name"
msgstr ""
-#: cp/class.c:1237
+#: cp/class.c:1244
+#, gcc-internal-format
msgid "base class %q#T has a non-virtual destructor"
msgstr ""
-#: cp/class.c:1551
+#: cp/class.c:1558
+#, gcc-internal-format
msgid "all member functions in class %qT are private"
msgstr ""
-#: cp/class.c:1562
+#: cp/class.c:1569
+#, gcc-internal-format
msgid "%q#T only defines a private destructor and has no friends"
msgstr ""
-#: cp/class.c:1602
+#: cp/class.c:1609
+#, gcc-internal-format
msgid "%q#T only defines private constructors and has no friends"
msgstr ""
-#: cp/class.c:1935
+#: cp/class.c:1942
+#, gcc-internal-format
msgid "no unique final overrider for %qD in %qT"
msgstr ""
#. Here we know it is a hider, and no overrider exists.
-#: cp/class.c:2413
+#: cp/class.c:2420
+#, gcc-internal-format
msgid "%qD was hidden"
msgstr ""
-#: cp/class.c:2414
+#: cp/class.c:2421
+#, gcc-internal-format
msgid " by %qD"
msgstr ""
-#: cp/class.c:2455 cp/decl2.c:1100
+#: cp/class.c:2462 cp/decl2.c:1088
+#, gcc-internal-format
msgid "%q#D invalid; an anonymous union can only have non-static data members"
msgstr ""
-#: cp/class.c:2462 cp/decl2.c:1107
+#: cp/class.c:2469 cp/decl2.c:1095
+#, gcc-internal-format
msgid "private member %q#D in anonymous union"
msgstr ""
-#: cp/class.c:2465 cp/decl2.c:1109
+#: cp/class.c:2472 cp/decl2.c:1097
+#, gcc-internal-format
msgid "protected member %q#D in anonymous union"
msgstr ""
-#: cp/class.c:2632
+#: cp/class.c:2639
+#, gcc-internal-format
msgid "bit-field %q#D with non-integral type"
msgstr ""
-#: cp/class.c:2649
+#: cp/class.c:2656
+#, gcc-internal-format
msgid "bit-field %qD width not an integer constant"
msgstr ""
-#: cp/class.c:2655
+#: cp/class.c:2662
+#, gcc-internal-format
msgid "negative width in bit-field %qD"
msgstr ""
-#: cp/class.c:2660
+#: cp/class.c:2667
+#, gcc-internal-format
msgid "zero width for bit-field %qD"
msgstr ""
-#: cp/class.c:2666
+#: cp/class.c:2673
+#, gcc-internal-format
msgid "width of %qD exceeds its type"
msgstr ""
-#: cp/class.c:2675
+#: cp/class.c:2682
+#, gcc-internal-format
msgid "%qD is too small to hold all values of %q#T"
msgstr ""
-#: cp/class.c:2735
+#: cp/class.c:2742
+#, gcc-internal-format
msgid "member %q#D with constructor not allowed in union"
msgstr ""
-#: cp/class.c:2738
+#: cp/class.c:2745
+#, gcc-internal-format
msgid "member %q#D with destructor not allowed in union"
msgstr ""
-#: cp/class.c:2741
+#: cp/class.c:2748
+#, gcc-internal-format
msgid "member %q#D with copy assignment operator not allowed in union"
msgstr ""
-#: cp/class.c:2764
+#: cp/class.c:2771
+#, gcc-internal-format
msgid "multiple fields in union %qT initialized"
msgstr ""
-#: cp/class.c:2825
+#: cp/class.c:2832
+#, gcc-internal-format
msgid "ignoring packed attribute on unpacked non-POD field %q#D"
msgstr ""
-#: cp/class.c:2885
+#: cp/class.c:2892
+#, gcc-internal-format
msgid "%qD may not be static because it is a member of a union"
msgstr ""
-#: cp/class.c:2890
+#: cp/class.c:2897
+#, gcc-internal-format
msgid "%qD may not have reference type %qT because it is a member of a union"
msgstr ""
-#: cp/class.c:2899
+#: cp/class.c:2906
+#, gcc-internal-format
msgid "field %qD in local class cannot be static"
msgstr ""
-#: cp/class.c:2905
+#: cp/class.c:2912
+#, gcc-internal-format
msgid "field %qD invalidly declared function type"
msgstr ""
-#: cp/class.c:2911
+#: cp/class.c:2918
+#, gcc-internal-format
msgid "field %qD invalidly declared method type"
msgstr ""
-#: cp/class.c:2943
+#: cp/class.c:2950
+#, gcc-internal-format
msgid "non-static reference %q#D in class without a constructor"
msgstr ""
-#: cp/class.c:2990
+#: cp/class.c:2997
+#, gcc-internal-format
msgid "non-static const member %q#D in class without a constructor"
msgstr ""
-#: cp/class.c:3005
+#: cp/class.c:3012
+#, gcc-internal-format
msgid "field %q#D with same name as class"
msgstr ""
-#: cp/class.c:3038
+#: cp/class.c:3045
+#, gcc-internal-format
msgid "%q#T has pointer data members"
msgstr ""
-#: cp/class.c:3042
+#: cp/class.c:3049
+#, gcc-internal-format
msgid " but does not override %<%T(const %T&)%>"
msgstr ""
-#: cp/class.c:3044
+#: cp/class.c:3051
+#, gcc-internal-format
msgid " or %<operator=(const %T&)%>"
msgstr ""
-#: cp/class.c:3047
+#: cp/class.c:3054
+#, gcc-internal-format
msgid " but does not override %<operator=(const %T&)%>"
msgstr ""
-#: cp/class.c:3480
+#: cp/class.c:3487
+#, gcc-internal-format
msgid ""
"offset of empty base %qT may not be ABI-compliant and maychange in a future "
"version of GCC"
msgstr ""
-#: cp/class.c:3592
+#: cp/class.c:3599
+#, gcc-internal-format
msgid "class %qT will be considered nearly empty in a future version of GCC"
msgstr ""
-#: cp/class.c:3674
+#: cp/class.c:3681
+#, gcc-internal-format
msgid "initializer specified for non-virtual method %qD"
msgstr ""
-#: cp/class.c:4337
+#: cp/class.c:4344
+#, gcc-internal-format
msgid ""
"offset of virtual base %qT is not ABI-compliant and may change in a future "
"version of GCC"
msgstr ""
-#: cp/class.c:4436
+#: cp/class.c:4443
+#, gcc-internal-format
msgid "direct base %qT inaccessible in %qT due to ambiguity"
msgstr ""
-#: cp/class.c:4448
+#: cp/class.c:4455
+#, gcc-internal-format
msgid "virtual base %qT inaccessible in %qT due to ambiguity"
msgstr ""
-#: cp/class.c:4625
+#: cp/class.c:4632
+#, gcc-internal-format
msgid ""
"size assigned to %qT may not be ABI-compliant and may change in a future "
"version of GCC"
@@ -12289,74 +17543,90 @@ msgstr ""
#. Versions of G++ before G++ 3.4 did not reset the
#. DECL_MODE.
-#: cp/class.c:4664
+#: cp/class.c:4671
+#, gcc-internal-format
msgid ""
"the offset of %qD may not be ABI-compliant and may change in a future "
"version of GCC"
msgstr ""
-#: cp/class.c:4687
+#: cp/class.c:4699
+#, gcc-internal-format
msgid ""
"offset of %qD is not ABI-compliant and may change in a future version of GCC"
msgstr ""
-#: cp/class.c:4697
+#: cp/class.c:4709
+#, gcc-internal-format
msgid ""
"%qD contains empty classes which may cause base classes to be placed at "
"different locations in a future version of GCC"
msgstr ""
-#: cp/class.c:4757
+#: cp/class.c:4769
+#, gcc-internal-format
msgid ""
"layout of classes derived from empty class %qT may change in a future "
"version of GCC"
msgstr ""
-#: cp/class.c:4898 cp/parser.c:12877
+#: cp/class.c:4910 cp/parser.c:13050
+#, gcc-internal-format
msgid "redefinition of %q#T"
msgstr ""
-#: cp/class.c:5048
+#: cp/class.c:5060
+#, gcc-internal-format
msgid "%q#T has virtual functions but non-virtual destructor"
msgstr ""
-#: cp/class.c:5145
+#: cp/class.c:5157
+#, gcc-internal-format
msgid "trying to finish struct, but kicked out due to previous parse errors"
msgstr ""
-#: cp/class.c:5561
+#: cp/class.c:5573
+#, gcc-internal-format
msgid "language string %<\"%E\"%> not recognized"
msgstr ""
-#: cp/class.c:5648
+#: cp/class.c:5659
+#, gcc-internal-format
msgid "cannot resolve overloaded function %qD based on conversion to type %qT"
msgstr ""
-#: cp/class.c:5773
+#: cp/class.c:5784
+#, gcc-internal-format
msgid "no matches converting function %qD to type %q#T"
msgstr ""
-#: cp/class.c:5796
+#: cp/class.c:5807
+#, gcc-internal-format
msgid "converting overloaded function %qD to type %q#T is ambiguous"
msgstr ""
-#: cp/class.c:5822
+#: cp/class.c:5833
+#, gcc-internal-format
msgid "assuming pointer to member %qD"
msgstr ""
-#: cp/class.c:5825
+#: cp/class.c:5836
+#, gcc-internal-format
msgid "(a pointer to member can only be formed with %<&%E%>)"
msgstr ""
-#: cp/class.c:5870 cp/class.c:5901 cp/class.c:6053 cp/class.c:6060
+#: cp/class.c:5881 cp/class.c:5912 cp/class.c:6064 cp/class.c:6071
+#, gcc-internal-format
msgid "not enough type information"
msgstr ""
-#: cp/class.c:5887
+#: cp/class.c:5898
+#, gcc-internal-format
msgid "argument of type %qT does not match %qT"
msgstr ""
-#: cp/class.c:6037
+#: cp/class.c:6048
+#, gcc-internal-format
msgid "invalid operation on uninstantiated type"
msgstr ""
@@ -12365,193 +17635,246 @@ msgstr ""
#. A name N used in a class S shall refer to the same declaration
#. in its context and when re-evaluated in the completed scope of
#. S.
-#: cp/class.c:6274 cp/decl.c:1102 cp/name-lookup.c:508 cp/pt.c:2204
+#: cp/class.c:6285 cp/decl.c:1099 cp/name-lookup.c:508 cp/pt.c:2205
+#, gcc-internal-format
msgid "declaration of %q#D"
msgstr ""
-#: cp/class.c:6275
+#: cp/class.c:6286
+#, gcc-internal-format
msgid "changes meaning of %qD from %q+#D"
msgstr ""
+#: cp/cp-gimplify.c:120
+#, gcc-internal-format
+msgid "continue statement not within loop or switch"
+msgstr ""
+
+#: cp/cp-gimplify.c:365
+#, gcc-internal-format
+msgid "statement with no effect"
+msgstr ""
+
#: cp/cvt.c:90
+#, gcc-internal-format
msgid "can't convert from incomplete type %qT to %qT"
msgstr ""
#: cp/cvt.c:99
+#, gcc-internal-format
msgid "conversion of %qE from %qT to %qT is ambiguous"
msgstr ""
#: cp/cvt.c:168 cp/cvt.c:237 cp/cvt.c:284
+#, gcc-internal-format
msgid "cannot convert %qE from type %qT to type %qT"
msgstr ""
#: cp/cvt.c:197 cp/cvt.c:201
+#, gcc-internal-format
msgid "pointer to member cast from %qT to %qT is via virtual base"
msgstr ""
#: cp/cvt.c:497
+#, gcc-internal-format
msgid "conversion from %qT to %qT discards qualifiers"
msgstr ""
-#: cp/cvt.c:515 cp/typeck.c:4808
+#: cp/cvt.c:515 cp/typeck.c:4823
+#, gcc-internal-format
msgid "casting %qT to %qT does not dereference pointer"
msgstr ""
#: cp/cvt.c:542
+#, gcc-internal-format
msgid "cannot convert type %qT to type %qT"
msgstr ""
#: cp/cvt.c:670
+#, gcc-internal-format
msgid "conversion from %q#T to %q#T"
msgstr ""
#: cp/cvt.c:682 cp/cvt.c:702
+#, gcc-internal-format
msgid "%q#T used where a %qT was expected"
msgstr ""
#: cp/cvt.c:717
+#, gcc-internal-format
msgid "%q#T used where a floating point value was expected"
msgstr ""
#: cp/cvt.c:764
+#, gcc-internal-format
msgid "conversion from %qT to non-scalar type %qT requested"
msgstr ""
#: cp/cvt.c:798
+#, gcc-internal-format
msgid "pseudo-destructor is not called"
msgstr ""
#: cp/cvt.c:857
+#, gcc-internal-format
msgid "object of incomplete type %qT will not be accessed in %s"
msgstr ""
#: cp/cvt.c:860
+#, gcc-internal-format
msgid "object of type %qT will not be accessed in %s"
msgstr ""
#: cp/cvt.c:876
+#, gcc-internal-format
msgid "object %qE of incomplete type %qT will not be accessed in %s"
msgstr ""
#. [over.over] enumerates the places where we can take the address
#. of an overloaded function, and this is not one of them.
#: cp/cvt.c:892
-#, c-format
+#, gcc-internal-format
msgid "%s cannot resolve address of overloaded function"
msgstr ""
#. Only warn when there is no &.
#: cp/cvt.c:898
-#, c-format
+#, gcc-internal-format
msgid "%s is a reference, not call, to function %qE"
msgstr ""
#: cp/cvt.c:909
-#, c-format
+#, gcc-internal-format
msgid "%s has no effect"
msgstr ""
#: cp/cvt.c:941
+#, gcc-internal-format
msgid "value computed is not used"
msgstr ""
#: cp/cvt.c:1049
+#, gcc-internal-format
msgid "converting NULL to non-pointer type"
msgstr ""
#: cp/cvt.c:1121
+#, gcc-internal-format
msgid "ambiguous default type conversion from %qT"
msgstr ""
#: cp/cvt.c:1123
+#, gcc-internal-format
msgid " candidate conversions include %qD and %qD"
msgstr ""
#: cp/decl.c:361
+#, gcc-internal-format
msgid "label %qD used but not defined"
msgstr ""
#: cp/decl.c:372
+#, gcc-internal-format
msgid "label %qD defined but not used"
msgstr ""
-#: cp/decl.c:1009
+#: cp/decl.c:1005
+#, gcc-internal-format
msgid "%qD was declared %<extern%> and later %<static%>"
msgstr ""
-#: cp/decl.c:1010 cp/decl.c:1475
+#: cp/decl.c:1006 cp/decl.c:1472
+#, gcc-internal-format
msgid "previous declaration of %qD"
msgstr ""
-#: cp/decl.c:1058
+#: cp/decl.c:1054
+#, gcc-internal-format
msgid "%Jfunction %qD redeclared as inline"
msgstr ""
-#: cp/decl.c:1059
+#: cp/decl.c:1056
+#, gcc-internal-format
msgid "%Jprevious declaration of %qD with attribute noinline"
msgstr ""
-#: cp/decl.c:1066
+#: cp/decl.c:1063
+#, gcc-internal-format
msgid "%Jfunction %qD redeclared with attribute noinline"
msgstr ""
-#: cp/decl.c:1068
+#: cp/decl.c:1065
+#, gcc-internal-format
msgid "%Jprevious declaration of %qD was inline"
msgstr ""
-#: cp/decl.c:1089 cp/decl.c:1160
+#: cp/decl.c:1086 cp/decl.c:1157
+#, gcc-internal-format
msgid "shadowing %s function %q#D"
msgstr ""
-#: cp/decl.c:1098
+#: cp/decl.c:1095
+#, gcc-internal-format
msgid "library function %q#D redeclared as non-function %q#D"
msgstr ""
-#: cp/decl.c:1103
+#: cp/decl.c:1100
+#, gcc-internal-format
msgid "conflicts with built-in declaration %q#D"
msgstr ""
-#: cp/decl.c:1155 cp/decl.c:1264 cp/decl.c:1280
+#: cp/decl.c:1152 cp/decl.c:1261 cp/decl.c:1277
+#, gcc-internal-format
msgid "new declaration %q#D"
msgstr ""
-#: cp/decl.c:1156
+#: cp/decl.c:1153
+#, gcc-internal-format
msgid "ambiguates built-in declaration %q#D"
msgstr ""
-#: cp/decl.c:1227
+#: cp/decl.c:1224
+#, gcc-internal-format
msgid "%q#D redeclared as different kind of symbol"
msgstr ""
-#: cp/decl.c:1230
+#: cp/decl.c:1227
+#, gcc-internal-format
msgid "previous declaration of %q#D"
msgstr ""
-#: cp/decl.c:1249
+#: cp/decl.c:1246
+#, gcc-internal-format
msgid "declaration of template %q#D"
msgstr ""
-#: cp/decl.c:1250 cp/name-lookup.c:509
+#: cp/decl.c:1247 cp/name-lookup.c:509
+#, gcc-internal-format
msgid "conflicts with previous declaration %q#D"
msgstr ""
-#: cp/decl.c:1265 cp/decl.c:1281
+#: cp/decl.c:1262 cp/decl.c:1278
+#, gcc-internal-format
msgid "ambiguates old declaration %q#D"
msgstr ""
-#: cp/decl.c:1273
+#: cp/decl.c:1270
+#, gcc-internal-format
msgid "declaration of C function %q#D conflicts with"
msgstr ""
-#: cp/decl.c:1275
+#: cp/decl.c:1272
+#, gcc-internal-format
msgid "previous declaration %q#D here"
msgstr ""
-#: cp/decl.c:1288
+#: cp/decl.c:1285
+#, gcc-internal-format
msgid "conflicting declaration %q#D"
msgstr ""
-#: cp/decl.c:1289
+#: cp/decl.c:1286
+#, gcc-internal-format
msgid "%qD has a previous declaration as %q#D"
msgstr ""
@@ -12562,66 +17885,79 @@ msgstr ""
#. A namespace-name defined at global scope shall not be
#. declared as the name of any other entity in any global scope
#. of the program.
-#: cp/decl.c:1342
+#: cp/decl.c:1339
+#, gcc-internal-format
msgid "declaration of namespace %qD conflicts with"
msgstr ""
-#: cp/decl.c:1343
+#: cp/decl.c:1340
+#, gcc-internal-format
msgid "previous declaration of namespace %qD here"
msgstr ""
-#: cp/decl.c:1355
+#: cp/decl.c:1352
+#, gcc-internal-format
msgid "%q#D previously defined here"
msgstr ""
-#: cp/decl.c:1356
+#: cp/decl.c:1353
+#, gcc-internal-format
msgid "%q#D previously declared here"
msgstr ""
#. Prototype decl follows defn w/o prototype.
-#: cp/decl.c:1365
+#: cp/decl.c:1362
+#, gcc-internal-format
msgid "prototype for %q#D"
msgstr ""
-#: cp/decl.c:1366
+#: cp/decl.c:1363
+#, gcc-internal-format
msgid "%Jfollows non-prototype definition here"
msgstr ""
-#: cp/decl.c:1378
+#: cp/decl.c:1375
+#, gcc-internal-format
msgid "previous declaration of %q#D with %qL linkage"
msgstr ""
-#: cp/decl.c:1380
+#: cp/decl.c:1377
+#, gcc-internal-format
msgid "conflicts with new declaration with %qL linkage"
msgstr ""
-#: cp/decl.c:1403 cp/decl.c:1410
+#: cp/decl.c:1400 cp/decl.c:1407
+#, gcc-internal-format
msgid "default argument given for parameter %d of %q#D"
msgstr ""
-#: cp/decl.c:1405 cp/decl.c:1412
+#: cp/decl.c:1402 cp/decl.c:1409
+#, gcc-internal-format
msgid "after previous specification in %q#D"
msgstr ""
-#: cp/decl.c:1421
+#: cp/decl.c:1418
+#, gcc-internal-format
msgid "%q#D was used before it was declared inline"
msgstr ""
-#: cp/decl.c:1422
+#: cp/decl.c:1419
+#, gcc-internal-format
msgid "%Jprevious non-inline declaration here"
msgstr ""
-#: cp/decl.c:1474
+#: cp/decl.c:1471
+#, gcc-internal-format
msgid "redundant redeclaration of %qD in same scope"
msgstr ""
-#: cp/decl.c:1568
-#, c-format
+#: cp/decl.c:1565
+#, gcc-internal-format
msgid "declaration of %qF throws different exceptions"
msgstr ""
-#: cp/decl.c:1570
-#, c-format
+#: cp/decl.c:1567
+#, gcc-internal-format
msgid "than previous declaration %qF"
msgstr ""
@@ -12633,397 +17969,490 @@ msgstr ""
#. that specialization that would cause an implicit
#. instantiation to take place, in every translation unit in
#. which such a use occurs.
-#: cp/decl.c:1730
+#: cp/decl.c:1728
+#, gcc-internal-format
msgid "explicit specialization of %qD after first use"
msgstr ""
-#: cp/decl.c:1809
+#: cp/decl.c:1807
+#, gcc-internal-format
msgid "%J%qD: visibility attribute ignored because it"
msgstr ""
-#: cp/decl.c:1811
+#: cp/decl.c:1809
+#, gcc-internal-format
msgid "%Jconflicts with previous declaration here"
msgstr ""
-#: cp/decl.c:2151 cp/decl.c:2175 cp/decl.c:2263
+#: cp/decl.c:2150 cp/decl.c:2174 cp/decl.c:2262
+#, gcc-internal-format
msgid "jump to label %qD"
msgstr ""
-#: cp/decl.c:2153 cp/decl.c:2177
+#: cp/decl.c:2152 cp/decl.c:2176
+#, gcc-internal-format
msgid "jump to case label"
msgstr ""
-#: cp/decl.c:2156 cp/decl.c:2180
+#: cp/decl.c:2155 cp/decl.c:2179
+#, gcc-internal-format
msgid "%H from here"
msgstr ""
-#: cp/decl.c:2161
+#: cp/decl.c:2160
+#, gcc-internal-format
msgid " crosses initialization of %q#D"
msgstr ""
-#: cp/decl.c:2164 cp/decl.c:2279
+#: cp/decl.c:2163 cp/decl.c:2278
+#, gcc-internal-format
msgid " enters scope of non-POD %q#D"
msgstr ""
-#: cp/decl.c:2184 cp/decl.c:2283
+#: cp/decl.c:2183 cp/decl.c:2282
+#, gcc-internal-format
msgid " enters try block"
msgstr ""
-#: cp/decl.c:2186 cp/decl.c:2285
+#: cp/decl.c:2185 cp/decl.c:2284
+#, gcc-internal-format
msgid " enters catch block"
msgstr ""
-#: cp/decl.c:2264
+#: cp/decl.c:2263
+#, gcc-internal-format
msgid " from here"
msgstr ""
#. Can't skip init of __exception_info.
-#: cp/decl.c:2275
+#: cp/decl.c:2274
+#, gcc-internal-format
msgid "%J enters catch block"
msgstr ""
-#: cp/decl.c:2277
+#: cp/decl.c:2276
+#, gcc-internal-format
msgid " skips initialization of %q#D"
msgstr ""
-#: cp/decl.c:2311
+#: cp/decl.c:2310
+#, gcc-internal-format
msgid "label named wchar_t"
msgstr ""
-#: cp/decl.c:2314
+#: cp/decl.c:2313
+#, gcc-internal-format
msgid "duplicate label %qD"
msgstr ""
-#: cp/decl.c:2562 cp/parser.c:3525
+#: cp/decl.c:2568 cp/parser.c:3597
+#, gcc-internal-format
msgid "%qD used without template parameters"
msgstr ""
-#: cp/decl.c:2579 cp/decl.c:2670
+#: cp/decl.c:2585 cp/decl.c:2676
+#, gcc-internal-format
msgid "no class template named %q#T in %q#T"
msgstr ""
-#: cp/decl.c:2600 cp/decl.c:2610 cp/decl.c:2630
+#: cp/decl.c:2606 cp/decl.c:2616 cp/decl.c:2636
+#, gcc-internal-format
msgid "no type named %q#T in %q#T"
msgstr ""
-#: cp/decl.c:2679
+#: cp/decl.c:2685
+#, gcc-internal-format
msgid "template parameters do not match template"
msgstr ""
-#: cp/decl.c:2680 cp/friend.c:317 cp/friend.c:325
+#: cp/decl.c:2686 cp/friend.c:317 cp/friend.c:325
+#, gcc-internal-format
msgid "%qD declared here"
msgstr ""
-#: cp/decl.c:3351
+#: cp/decl.c:3358
+#, gcc-internal-format
msgid "%Jan anonymous union cannot have function members"
msgstr ""
-#: cp/decl.c:3369
+#: cp/decl.c:3376
+#, gcc-internal-format
msgid "member %q#D with constructor not allowed in anonymous aggregate"
msgstr ""
-#: cp/decl.c:3373
+#: cp/decl.c:3380
+#, gcc-internal-format
msgid "member %q#D with destructor not allowed in anonymous aggregate"
msgstr ""
-#: cp/decl.c:3377
+#: cp/decl.c:3384
+#, gcc-internal-format
msgid ""
"member %q#D with copy assignment operator not allowed in anonymous aggregate"
msgstr ""
-#: cp/decl.c:3403
+#: cp/decl.c:3410
+#, gcc-internal-format
msgid "multiple types in one declaration"
msgstr ""
-#: cp/decl.c:3407
+#: cp/decl.c:3414
+#, gcc-internal-format
msgid "redeclaration of C++ built-in type %qT"
msgstr ""
-#: cp/decl.c:3444
+#: cp/decl.c:3451
+#, gcc-internal-format
msgid "missing type-name in typedef-declaration"
msgstr ""
-#: cp/decl.c:3452
+#: cp/decl.c:3459
+#, gcc-internal-format
msgid "ISO C++ prohibits anonymous structs"
msgstr ""
-#: cp/decl.c:3459
-#, c-format
+#: cp/decl.c:3466
+#, gcc-internal-format
msgid "%qs can only be specified for functions"
msgstr ""
-#: cp/decl.c:3465
+#: cp/decl.c:3472
+#, gcc-internal-format
msgid "%<friend%> can only be specified inside a class"
msgstr ""
-#: cp/decl.c:3467
+#: cp/decl.c:3474
+#, gcc-internal-format
msgid "%<explicit%> can only be specified for constructors"
msgstr ""
-#: cp/decl.c:3469
+#: cp/decl.c:3476
+#, gcc-internal-format
msgid "a storage class can only be specified for objects and functions"
msgstr ""
-#: cp/decl.c:3475
+#: cp/decl.c:3482
+#, gcc-internal-format
msgid "qualifiers can only be specified for objects and functions"
msgstr ""
-#: cp/decl.c:3505
+#: cp/decl.c:3512
+#, gcc-internal-format
msgid "attribute ignored in declaration of %q#T"
msgstr ""
-#: cp/decl.c:3506
+#: cp/decl.c:3513
+#, gcc-internal-format
msgid "attribute for %q#T must follow the %qs keyword"
msgstr ""
-#: cp/decl.c:3629
+#: cp/decl.c:3636
+#, gcc-internal-format
msgid "function %q#D is initialized like a variable"
msgstr ""
-#: cp/decl.c:3641
+#: cp/decl.c:3648
+#, gcc-internal-format
msgid "declaration of %q#D has %<extern%> and is initialized"
msgstr ""
-#: cp/decl.c:3672
+#: cp/decl.c:3678
+#, gcc-internal-format
msgid "%q#D is not a static member of %q#T"
msgstr ""
-#: cp/decl.c:3678
+#: cp/decl.c:3684
+#, gcc-internal-format
msgid "ISO C++ does not permit %<%T::%D%> to be defined as %<%T::%D%>"
msgstr ""
-#: cp/decl.c:3687
+#: cp/decl.c:3693
+#, gcc-internal-format
msgid ""
"template header not allowed in member definition of explicitly specialized "
"class"
msgstr ""
-#: cp/decl.c:3695
+#: cp/decl.c:3701
+#, gcc-internal-format
msgid "duplicate initialization of %qD"
msgstr ""
-#: cp/decl.c:3733
+#: cp/decl.c:3739
+#, gcc-internal-format
msgid "declaration of %q#D outside of class is not definition"
msgstr ""
-#: cp/decl.c:3782
+#: cp/decl.c:3788
+#, gcc-internal-format
msgid "variable %q#D has initializer but incomplete type"
msgstr ""
-#: cp/decl.c:3789 cp/decl.c:4408
+#: cp/decl.c:3795 cp/decl.c:4416
+#, gcc-internal-format
msgid "elements of array %q#D have incomplete type"
msgstr ""
-#: cp/decl.c:3805
+#: cp/decl.c:3811
+#, gcc-internal-format
msgid "aggregate %q#D has incomplete type and cannot be defined"
msgstr ""
-#: cp/decl.c:3855
+#: cp/decl.c:3861
+#, gcc-internal-format
msgid "%qD declared as reference but not initialized"
msgstr ""
-#: cp/decl.c:3861
+#: cp/decl.c:3867
+#, gcc-internal-format
msgid "ISO C++ forbids use of initializer list to initialize reference %qD"
msgstr ""
-#: cp/decl.c:3887
+#: cp/decl.c:3893
+#, gcc-internal-format
msgid "cannot initialize %qT from %qT"
msgstr ""
-#: cp/decl.c:3920
+#: cp/decl.c:3926
+#, gcc-internal-format
msgid "initializer fails to determine size of %qD"
msgstr ""
-#: cp/decl.c:3925
+#: cp/decl.c:3931
+#, gcc-internal-format
msgid "array size missing in %qD"
msgstr ""
-#: cp/decl.c:3935
+#: cp/decl.c:3941
+#, gcc-internal-format
msgid "zero-size array %qD"
msgstr ""
#. An automatic variable with an incomplete type: that is an error.
#. Don't talk about array types here, since we took care of that
#. message in grokdeclarator.
-#: cp/decl.c:3969
+#: cp/decl.c:3977
+#, gcc-internal-format
msgid "storage size of %qD isn't known"
msgstr ""
-#: cp/decl.c:3991
+#: cp/decl.c:3999
+#, gcc-internal-format
msgid "storage size of %qD isn't constant"
msgstr ""
-#: cp/decl.c:4046
+#: cp/decl.c:4054
+#, gcc-internal-format
msgid ""
"sorry: semantics of inline function static data %q#D are wrong (you'll wind "
"up with multiple copies)"
msgstr ""
-#: cp/decl.c:4049
+#: cp/decl.c:4057
+#, gcc-internal-format
msgid "%J you can work around this by removing the initializer"
msgstr ""
-#: cp/decl.c:4076
+#: cp/decl.c:4084
+#, gcc-internal-format
msgid "uninitialized const %qD"
msgstr ""
-#: cp/decl.c:4141
+#: cp/decl.c:4149
+#, gcc-internal-format
msgid "name %qD used in a GNU-style designated initializer for an array"
msgstr ""
-#: cp/decl.c:4212
+#: cp/decl.c:4220
+#, gcc-internal-format
msgid "brace-enclosed initializer used to initialize %qT"
msgstr ""
-#: cp/decl.c:4277
+#: cp/decl.c:4285
+#, gcc-internal-format
msgid "initializer for %qT must be brace-enclosed"
msgstr ""
-#: cp/decl.c:4293
+#: cp/decl.c:4301
+#, gcc-internal-format
msgid "ISO C++ does not allow designated initializers"
msgstr ""
-#: cp/decl.c:4297
+#: cp/decl.c:4305
+#, gcc-internal-format
msgid "%qT has no non-static data member named %qD"
msgstr ""
-#: cp/decl.c:4361
+#: cp/decl.c:4369
+#, gcc-internal-format
msgid "too many initializers for %qT"
msgstr ""
-#: cp/decl.c:4402
+#: cp/decl.c:4410
+#, gcc-internal-format
msgid "variable-sized object %qD may not be initialized"
msgstr ""
-#: cp/decl.c:4413
+#: cp/decl.c:4421
+#, gcc-internal-format
msgid "%qD has incomplete type"
msgstr ""
-#: cp/decl.c:4467
+#: cp/decl.c:4475
+#, gcc-internal-format
msgid "%qD must be initialized by constructor, not by %<{...}%>"
msgstr ""
-#: cp/decl.c:4503
+#: cp/decl.c:4511
+#, gcc-internal-format
msgid "array %qD initialized by parenthesized string literal %qE"
msgstr ""
-#: cp/decl.c:4518
+#: cp/decl.c:4526
+#, gcc-internal-format
msgid "structure %qD with uninitialized const members"
msgstr ""
-#: cp/decl.c:4520
+#: cp/decl.c:4528
+#, gcc-internal-format
msgid "structure %qD with uninitialized reference members"
msgstr ""
-#: cp/decl.c:4719
+#: cp/decl.c:4730
+#, gcc-internal-format
msgid "assignment (not initialization) in declaration"
msgstr ""
-#: cp/decl.c:4736
+#: cp/decl.c:4747
+#, gcc-internal-format
msgid "cannot initialize %qD to namespace %qD"
msgstr ""
-#: cp/decl.c:4777
+#: cp/decl.c:4788
+#, gcc-internal-format
msgid "shadowing previous type declaration of %q#D"
msgstr ""
-#: cp/decl.c:4807
+#: cp/decl.c:4818
+#, gcc-internal-format
msgid "%qD cannot be thread-local because it has non-POD type %qT"
msgstr ""
-#: cp/decl.c:4822
+#: cp/decl.c:4833
+#, gcc-internal-format
msgid "%qD is thread-local and so cannot be dynamically initialized"
msgstr ""
-#: cp/decl.c:5382
+#: cp/decl.c:5414
+#, gcc-internal-format
msgid "destructor for alien class %qT cannot be a member"
msgstr ""
-#: cp/decl.c:5384
+#: cp/decl.c:5416
+#, gcc-internal-format
msgid "constructor for alien class %qT cannot be a member"
msgstr ""
-#: cp/decl.c:5405
+#: cp/decl.c:5437
+#, gcc-internal-format
msgid "%qD declared as a %<virtual%> %s"
msgstr ""
-#: cp/decl.c:5407
+#: cp/decl.c:5439
+#, gcc-internal-format
msgid "%qD declared as an %<inline%> %s"
msgstr ""
-#: cp/decl.c:5409
+#: cp/decl.c:5441
+#, gcc-internal-format
msgid ""
"%<const%> and %<volatile%> function specifiers on %qD invalid in %s "
"declaration"
msgstr ""
-#: cp/decl.c:5413
+#: cp/decl.c:5445
+#, gcc-internal-format
msgid "%qD declared as a friend"
msgstr ""
-#: cp/decl.c:5419
+#: cp/decl.c:5451
+#, gcc-internal-format
msgid "%qD declared with an exception specification"
msgstr ""
-#: cp/decl.c:5505
+#: cp/decl.c:5537
+#, gcc-internal-format
msgid "cannot declare %<::main%> to be a template"
msgstr ""
-#: cp/decl.c:5507
+#: cp/decl.c:5539
+#, gcc-internal-format
msgid "cannot declare %<::main%> to be inline"
msgstr ""
-#: cp/decl.c:5509
+#: cp/decl.c:5541
+#, gcc-internal-format
msgid "cannot declare %<::main%> to be static"
msgstr ""
-#: cp/decl.c:5513
+#: cp/decl.c:5545
+#, gcc-internal-format
msgid "%<::main%> must return %<int%>"
msgstr ""
-#: cp/decl.c:5543
+#: cp/decl.c:5575
+#, gcc-internal-format
msgid "non-local function %q#D uses anonymous type"
msgstr ""
-#: cp/decl.c:5546 cp/decl.c:5882
+#: cp/decl.c:5578 cp/decl.c:5914
+#, gcc-internal-format
msgid ""
"%q#D does not refer to the unqualified type, so it is not used for linkage"
msgstr ""
-#: cp/decl.c:5552
+#: cp/decl.c:5584
+#, gcc-internal-format
msgid "non-local function %q#D uses local type %qT"
msgstr ""
-#: cp/decl.c:5575
+#: cp/decl.c:5607
+#, gcc-internal-format
msgid "%smember function %qD cannot have cv-qualifier"
msgstr ""
-#: cp/decl.c:5599
+#: cp/decl.c:5631
+#, gcc-internal-format
msgid "defining explicit specialization %qD in friend declaration"
msgstr ""
#. Something like `template <class T> friend void f<T>()'.
-#: cp/decl.c:5609
+#: cp/decl.c:5641
+#, gcc-internal-format
msgid "invalid use of template-id %qD in declaration of primary template"
msgstr ""
-#: cp/decl.c:5637
+#: cp/decl.c:5669
+#, gcc-internal-format
msgid ""
"default arguments are not allowed in declaration of friend template "
"specialization %qD"
msgstr ""
-#: cp/decl.c:5645
+#: cp/decl.c:5677
+#, gcc-internal-format
msgid ""
"%<inline%> is not allowed in declaration of friend template specialization %"
"qD"
msgstr ""
-#: cp/decl.c:5711
+#: cp/decl.c:5743
+#, gcc-internal-format
msgid "definition of implicitly-declared %qD"
msgstr ""
-#: cp/decl.c:5731 cp/decl2.c:712
+#: cp/decl.c:5763 cp/decl2.c:704
+#, gcc-internal-format
msgid "no %q#D member function declared in class %qT"
msgstr ""
@@ -13031,441 +18460,524 @@ msgstr ""
#. no linkage can only be used to declare extern "C"
#. entities. Since it's not always an error in the
#. ISO C++ 90 Standard, we only issue a warning.
-#: cp/decl.c:5879
+#: cp/decl.c:5911
+#, gcc-internal-format
msgid "non-local variable %q#D uses anonymous type"
msgstr ""
-#: cp/decl.c:5888
+#: cp/decl.c:5920
+#, gcc-internal-format
msgid "non-local variable %q#D uses local type %qT"
msgstr ""
-#: cp/decl.c:6005
+#: cp/decl.c:6037
+#, gcc-internal-format
msgid ""
"invalid in-class initialization of static data member of non-integral type %"
"qT"
msgstr ""
-#: cp/decl.c:6015
+#: cp/decl.c:6047
+#, gcc-internal-format
msgid "ISO C++ forbids in-class initialization of non-const static member %qD"
msgstr ""
-#: cp/decl.c:6019
+#: cp/decl.c:6051
+#, gcc-internal-format
msgid ""
"ISO C++ forbids initialization of member constant %qD of non-integral type %"
"qT"
msgstr ""
-#: cp/decl.c:6039
+#: cp/decl.c:6071
+#, gcc-internal-format
msgid "size of array %qD has non-integral type %qT"
msgstr ""
-#: cp/decl.c:6041
+#: cp/decl.c:6073
+#, gcc-internal-format
msgid "size of array has non-integral type %qT"
msgstr ""
-#: cp/decl.c:6077
+#: cp/decl.c:6109
+#, gcc-internal-format
msgid "size of array %qD is negative"
msgstr ""
-#: cp/decl.c:6079
+#: cp/decl.c:6111
+#, gcc-internal-format
msgid "size of array is negative"
msgstr ""
-#: cp/decl.c:6087
+#: cp/decl.c:6119
+#, gcc-internal-format
msgid "ISO C++ forbids zero-size array %qD"
msgstr ""
-#: cp/decl.c:6089
+#: cp/decl.c:6121
+#, gcc-internal-format
msgid "ISO C++ forbids zero-size array"
msgstr ""
-#: cp/decl.c:6096
+#: cp/decl.c:6128
+#, gcc-internal-format
msgid "size of array %qD is not an integral constant-expression"
msgstr ""
-#: cp/decl.c:6099
+#: cp/decl.c:6131
+#, gcc-internal-format
msgid "size of array is not an integral constant-expression"
msgstr ""
-#: cp/decl.c:6104
+#: cp/decl.c:6136
+#, gcc-internal-format
msgid "ISO C++ forbids variable-size array %qD"
msgstr ""
-#: cp/decl.c:6106
+#: cp/decl.c:6138
+#, gcc-internal-format
msgid "ISO C++ forbids variable-size array"
msgstr ""
-#: cp/decl.c:6136
+#: cp/decl.c:6168
+#, gcc-internal-format
msgid "overflow in array dimension"
msgstr ""
-#: cp/decl.c:6210
+#: cp/decl.c:6242
+#, gcc-internal-format
msgid "declaration of %qD as %s"
msgstr ""
-#: cp/decl.c:6212
-#, c-format
+#: cp/decl.c:6244
+#, gcc-internal-format
msgid "creating %s"
msgstr ""
-#: cp/decl.c:6224
+#: cp/decl.c:6256
+#, gcc-internal-format
msgid ""
"declaration of %qD as multidimensional array must have bounds for all "
"dimensions except the first"
msgstr ""
-#: cp/decl.c:6228
+#: cp/decl.c:6260
+#, gcc-internal-format
msgid ""
"multidimensional array must have bounds for all dimensions except the first"
msgstr ""
-#: cp/decl.c:6263
+#: cp/decl.c:6295
+#, gcc-internal-format
msgid "return type specification for constructor invalid"
msgstr ""
-#: cp/decl.c:6273
+#: cp/decl.c:6305
+#, gcc-internal-format
msgid "return type specification for destructor invalid"
msgstr ""
-#: cp/decl.c:6286
+#: cp/decl.c:6318
+#, gcc-internal-format
msgid "operator %qT declared to return %qT"
msgstr ""
-#: cp/decl.c:6288
+#: cp/decl.c:6320
+#, gcc-internal-format
msgid "return type specified for %<operator %T%>"
msgstr ""
-#: cp/decl.c:6310
+#: cp/decl.c:6342
+#, gcc-internal-format
msgid "unnamed variable or field declared void"
msgstr ""
-#: cp/decl.c:6314
-#, c-format
+#: cp/decl.c:6346
+#, gcc-internal-format
msgid "variable or field %qE declared void"
msgstr ""
-#: cp/decl.c:6317
+#: cp/decl.c:6349
+#, gcc-internal-format
msgid "variable or field declared void"
msgstr ""
-#: cp/decl.c:6472
+#: cp/decl.c:6504
+#, gcc-internal-format
msgid "type %qT is not derived from type %qT"
msgstr ""
-#: cp/decl.c:6492 cp/decl.c:6584 cp/decl.c:7728
+#: cp/decl.c:6524 cp/decl.c:6616 cp/decl.c:7737
+#, gcc-internal-format
msgid "declaration of %qD as non-function"
msgstr ""
-#: cp/decl.c:6498
+#: cp/decl.c:6530
+#, gcc-internal-format
msgid "declaration of %qD as non-member"
msgstr ""
-#: cp/decl.c:6528
+#: cp/decl.c:6560
+#, gcc-internal-format
msgid "declarator-id missing; using reserved word %qD"
msgstr ""
-#: cp/decl.c:6617
-#, c-format
+#: cp/decl.c:6649
+#, gcc-internal-format
msgid "two or more data types in declaration of %qs"
msgstr ""
-#: cp/decl.c:6660
+#: cp/decl.c:6692
+#, gcc-internal-format
msgid "ISO C++ does not support %<long long%>"
msgstr ""
-#: cp/decl.c:6682
-#, c-format
+#: cp/decl.c:6714
+#, gcc-internal-format
msgid "duplicate %qs"
msgstr ""
-#: cp/decl.c:6720 cp/decl.c:6722
-#, c-format
+#: cp/decl.c:6752 cp/decl.c:6754
+#, gcc-internal-format
msgid "ISO C++ forbids declaration of %qs with no type"
msgstr ""
-#: cp/decl.c:6747
-#, c-format
+#: cp/decl.c:6779
+#, gcc-internal-format
msgid "short, signed or unsigned invalid for %qs"
msgstr ""
-#: cp/decl.c:6749
-#, c-format
+#: cp/decl.c:6781
+#, gcc-internal-format
msgid "long, short, signed or unsigned invalid for %qs"
msgstr ""
-#: cp/decl.c:6751
-#, c-format
+#: cp/decl.c:6783
+#, gcc-internal-format
msgid "long and short specified together for %qs"
msgstr ""
-#: cp/decl.c:6753
-#, c-format
+#: cp/decl.c:6785
+#, gcc-internal-format
msgid "long or short specified with char for %qs"
msgstr ""
-#: cp/decl.c:6755
-#, c-format
+#: cp/decl.c:6787
+#, gcc-internal-format
msgid "long or short specified with floating type for %qs"
msgstr ""
-#: cp/decl.c:6757
-#, c-format
+#: cp/decl.c:6789
+#, gcc-internal-format
msgid "signed and unsigned given together for %qs"
msgstr ""
-#: cp/decl.c:6763
-#, c-format
+#: cp/decl.c:6795
+#, gcc-internal-format
msgid "long, short, signed or unsigned used invalidly for %qs"
msgstr ""
-#: cp/decl.c:6828
-#, c-format
+#: cp/decl.c:6860
+#, gcc-internal-format
msgid "complex invalid for %qs"
msgstr ""
-#: cp/decl.c:6857
+#: cp/decl.c:6889
+#, gcc-internal-format
msgid "qualifiers are not allowed on declaration of %<operator %T%>"
msgstr ""
-#: cp/decl.c:6869 cp/typeck.c:6375
+#: cp/decl.c:6901 cp/typeck.c:6430
+#, gcc-internal-format
msgid "ignoring %qV qualifiers added to function type %qT"
msgstr ""
-#: cp/decl.c:6892
+#: cp/decl.c:6924
+#, gcc-internal-format
msgid "member %qD cannot be declared both virtual and static"
msgstr ""
-#: cp/decl.c:6899
+#: cp/decl.c:6931
+#, gcc-internal-format
msgid "%<%T::%D%> is not a valid declarator"
msgstr ""
-#: cp/decl.c:6907
+#: cp/decl.c:6939
+#, gcc-internal-format
msgid "typedef declaration invalid in parameter declaration"
msgstr ""
-#: cp/decl.c:6911
+#: cp/decl.c:6943
+#, gcc-internal-format
msgid "storage class specifiers invalid in parameter declarations"
msgstr ""
-#: cp/decl.c:6918
+#: cp/decl.c:6950
+#, gcc-internal-format
msgid "virtual outside class declaration"
msgstr ""
-#: cp/decl.c:6931 cp/decl.c:6938
-#, c-format
+#: cp/decl.c:6963 cp/decl.c:6970
+#, gcc-internal-format
msgid "multiple storage classes in declaration of %qs"
msgstr ""
-#: cp/decl.c:6981
-#, c-format
-msgid "storage class specified for %s %qs"
+#: cp/decl.c:6993
+#, gcc-internal-format
+msgid "storage class specified for %qs"
msgstr ""
-#: cp/decl.c:7018
+#: cp/decl.c:7027
+#, gcc-internal-format
msgid "top-level declaration of %qs specifies %<auto%>"
msgstr ""
-#: cp/decl.c:7030
+#: cp/decl.c:7039
+#, gcc-internal-format
msgid "storage class specifiers invalid in friend function declarations"
msgstr ""
-#: cp/decl.c:7156
+#: cp/decl.c:7165
+#, gcc-internal-format
msgid "destructor cannot be static member function"
msgstr ""
-#: cp/decl.c:7159
+#: cp/decl.c:7168
+#, gcc-internal-format
msgid "destructors may not be cv-qualified"
msgstr ""
-#: cp/decl.c:7179
+#: cp/decl.c:7188
+#, gcc-internal-format
msgid "constructor cannot be static member function"
msgstr ""
-#: cp/decl.c:7182
+#: cp/decl.c:7191
+#, gcc-internal-format
msgid "constructors cannot be declared virtual"
msgstr ""
-#: cp/decl.c:7187
+#: cp/decl.c:7196
+#, gcc-internal-format
msgid "constructors may not be cv-qualified"
msgstr ""
-#: cp/decl.c:7207
-#, c-format
+#: cp/decl.c:7216
+#, gcc-internal-format
msgid "can't initialize friend function %qs"
msgstr ""
#. Cannot be both friend and virtual.
-#: cp/decl.c:7211
+#: cp/decl.c:7220
+#, gcc-internal-format
msgid "virtual functions cannot be friends"
msgstr ""
-#: cp/decl.c:7215
+#: cp/decl.c:7224
+#, gcc-internal-format
msgid "friend declaration not in class definition"
msgstr ""
-#: cp/decl.c:7217
-#, c-format
+#: cp/decl.c:7226
+#, gcc-internal-format
msgid "can't define friend function %qs in a local class definition"
msgstr ""
-#: cp/decl.c:7230
+#: cp/decl.c:7239
+#, gcc-internal-format
msgid "destructors may not have parameters"
msgstr ""
-#: cp/decl.c:7249 cp/decl.c:7256
+#: cp/decl.c:7258 cp/decl.c:7265
+#, gcc-internal-format
msgid "cannot declare reference to %q#T"
msgstr ""
-#: cp/decl.c:7250
+#: cp/decl.c:7259
+#, gcc-internal-format
msgid "cannot declare pointer to %q#T"
msgstr ""
-#: cp/decl.c:7258
+#: cp/decl.c:7267
+#, gcc-internal-format
msgid "cannot declare pointer to %q#T member"
msgstr ""
-#: cp/decl.c:7297
+#: cp/decl.c:7306
+#, gcc-internal-format
msgid "%qD is a namespace"
msgstr ""
-#: cp/decl.c:7336
+#: cp/decl.c:7345
+#, gcc-internal-format
msgid "template-id %qD used as a declarator"
msgstr ""
-#: cp/decl.c:7383
+#: cp/decl.c:7392
+#, gcc-internal-format
msgid "extra qualification %<%T::%> on member %qs ignored"
msgstr ""
-#: cp/decl.c:7402
+#: cp/decl.c:7411
+#, gcc-internal-format
msgid "cannot declare member function %<%T::%s%> within %<%T%>"
msgstr ""
-#: cp/decl.c:7417
+#: cp/decl.c:7426
+#, gcc-internal-format
msgid "cannot declare member %<%T::%s%> within %qT"
msgstr ""
-#: cp/decl.c:7456
+#: cp/decl.c:7465
+#, gcc-internal-format
msgid "data member may not have variably modified type %qT"
msgstr ""
-#: cp/decl.c:7458
+#: cp/decl.c:7467
+#, gcc-internal-format
msgid "parameter may not have variably modified type %qT"
msgstr ""
#. [dcl.fct.spec] The explicit specifier shall only be used in
#. declarations of constructors within a class definition.
-#: cp/decl.c:7466
+#: cp/decl.c:7475
+#, gcc-internal-format
msgid "only declarations of constructors can be %<explicit%>"
msgstr ""
-#: cp/decl.c:7474
+#: cp/decl.c:7483
+#, gcc-internal-format
msgid "non-member %qs cannot be declared %<mutable%>"
msgstr ""
-#: cp/decl.c:7479
+#: cp/decl.c:7488
+#, gcc-internal-format
msgid "non-object member %qs cannot be declared %<mutable%>"
msgstr ""
-#: cp/decl.c:7485
+#: cp/decl.c:7494
+#, gcc-internal-format
msgid "function %qs cannot be declared %<mutable%>"
msgstr ""
-#: cp/decl.c:7490
+#: cp/decl.c:7499
+#, gcc-internal-format
msgid "static %qs cannot be declared %<mutable%>"
msgstr ""
-#: cp/decl.c:7495
+#: cp/decl.c:7504
+#, gcc-internal-format
msgid "const %qs cannot be declared %<mutable%>"
msgstr ""
-#: cp/decl.c:7515
+#: cp/decl.c:7524
+#, gcc-internal-format
msgid "%Jtypedef name may not be a nested-name-specifier"
msgstr ""
-#: cp/decl.c:7531
+#: cp/decl.c:7540
+#, gcc-internal-format
msgid "ISO C++ forbids nested type %qD with same name as enclosing class"
msgstr ""
-#: cp/decl.c:7630
-#, c-format
+#: cp/decl.c:7639
+#, gcc-internal-format
msgid "qualified function types cannot be used to declare %s functions"
msgstr ""
-#: cp/decl.c:7656
+#: cp/decl.c:7665
+#, gcc-internal-format
msgid "type qualifiers specified for friend class declaration"
msgstr ""
-#: cp/decl.c:7661
+#: cp/decl.c:7670
+#, gcc-internal-format
msgid "%<inline%> specified for friend class declaration"
msgstr ""
-#: cp/decl.c:7669
+#: cp/decl.c:7678
+#, gcc-internal-format
msgid "template parameters cannot be friends"
msgstr ""
-#: cp/decl.c:7671
+#: cp/decl.c:7680
+#, gcc-internal-format
msgid "friend declaration requires class-key, i.e. %<friend class %T::%D%>"
msgstr ""
-#: cp/decl.c:7675
+#: cp/decl.c:7684
+#, gcc-internal-format
msgid "friend declaration requires class-key, i.e. %<friend %#T%>"
msgstr ""
-#: cp/decl.c:7688
+#: cp/decl.c:7697
+#, gcc-internal-format
msgid "trying to make class %qT a friend of global scope"
msgstr ""
-#: cp/decl.c:7699
+#: cp/decl.c:7708
+#, gcc-internal-format
msgid "invalid qualifiers on non-member function type"
msgstr ""
-#: cp/decl.c:7718
+#: cp/decl.c:7727
+#, gcc-internal-format
msgid "abstract declarator %qT used as declaration"
msgstr ""
-#: cp/decl.c:7743
+#: cp/decl.c:7752
+#, gcc-internal-format
msgid "cannot use %<::%> in parameter declaration"
msgstr ""
#. Something like struct S { int N::j; };
-#: cp/decl.c:7788
+#: cp/decl.c:7797
+#, gcc-internal-format
msgid "invalid use of %<::%>"
msgstr ""
-#: cp/decl.c:7803
+#: cp/decl.c:7812
+#, gcc-internal-format
msgid "can't make %qD into a method -- not in a class"
msgstr ""
-#: cp/decl.c:7812
+#: cp/decl.c:7821
+#, gcc-internal-format
msgid "function %qD declared virtual inside a union"
msgstr ""
-#: cp/decl.c:7821
+#: cp/decl.c:7830
+#, gcc-internal-format
msgid "%qD cannot be declared virtual, since it is always static"
msgstr ""
-#: cp/decl.c:7839
+#: cp/decl.c:7848
+#, gcc-internal-format
msgid "declaration of %qD as member of %qT"
msgstr ""
-#: cp/decl.c:7915
+#: cp/decl.c:7924
+#, gcc-internal-format
msgid "field %qD has incomplete type"
msgstr ""
-#: cp/decl.c:7917
+#: cp/decl.c:7926
+#, gcc-internal-format
msgid "name %qT has incomplete type"
msgstr ""
-#: cp/decl.c:7926
+#: cp/decl.c:7935
+#, gcc-internal-format
msgid " in instantiation of template %qT"
msgstr ""
-#: cp/decl.c:7936
-#, c-format
+#: cp/decl.c:7945
+#, gcc-internal-format
msgid "%qE is neither function nor member function; cannot be declared friend"
msgstr ""
-#: cp/decl.c:7947
+#: cp/decl.c:7956
+#, gcc-internal-format
msgid "member functions are implicitly friends of their class"
msgstr ""
@@ -13481,81 +18993,98 @@ msgstr ""
#. the rest of the compiler does not correctly
#. handle the initialization unless the member is
#. static so we make it static below.
-#: cp/decl.c:7987
+#: cp/decl.c:7996
+#, gcc-internal-format
msgid "ISO C++ forbids initialization of member %qD"
msgstr ""
-#: cp/decl.c:7989
+#: cp/decl.c:7998
+#, gcc-internal-format
msgid "making %qD static"
msgstr ""
-#: cp/decl.c:8047
+#: cp/decl.c:8056
+#, gcc-internal-format
msgid "storage class %<auto%> invalid for function %qs"
msgstr ""
-#: cp/decl.c:8049
+#: cp/decl.c:8058
+#, gcc-internal-format
msgid "storage class %<register%> invalid for function %qs"
msgstr ""
-#: cp/decl.c:8051
+#: cp/decl.c:8060
+#, gcc-internal-format
msgid "storage class %<__thread%> invalid for function %qs"
msgstr ""
-#: cp/decl.c:8062
+#: cp/decl.c:8071
+#, gcc-internal-format
msgid ""
"%<static%> specified invalid for function %qs declared out of global scope"
msgstr ""
-#: cp/decl.c:8065
+#: cp/decl.c:8074
+#, gcc-internal-format
msgid ""
"%<inline%> specifier invalid for function %qs declared out of global scope"
msgstr ""
-#: cp/decl.c:8073
-#, c-format
+#: cp/decl.c:8082
+#, gcc-internal-format
msgid "virtual non-class function %qs"
msgstr ""
-#: cp/decl.c:8104
+#: cp/decl.c:8113
+#, gcc-internal-format
msgid "cannot declare member function %qD to have static linkage"
msgstr ""
#. FIXME need arm citation
-#: cp/decl.c:8111
+#: cp/decl.c:8120
+#, gcc-internal-format
msgid "cannot declare static function inside another function"
msgstr ""
-#: cp/decl.c:8140
+#: cp/decl.c:8149
+#, gcc-internal-format
msgid ""
"%<static%> may not be used when defining (as opposed to declaring) a static "
"data member"
msgstr ""
-#: cp/decl.c:8147
+#: cp/decl.c:8156
+#, gcc-internal-format
msgid "static member %qD declared %<register%>"
msgstr ""
-#: cp/decl.c:8152
+#: cp/decl.c:8161
+#, gcc-internal-format
msgid "cannot explicitly declare member %q#D to have extern linkage"
msgstr ""
-#: cp/decl.c:8295
+#: cp/decl.c:8304
+#, gcc-internal-format
msgid "default argument for %q#D has type %qT"
msgstr ""
-#: cp/decl.c:8298
+#: cp/decl.c:8307
+#, gcc-internal-format
msgid "default argument for parameter of type %qT has type %qT"
msgstr ""
-#: cp/decl.c:8315
+#: cp/decl.c:8324
+#, gcc-internal-format
msgid "default argument %qE uses local variable %qD"
msgstr ""
-#: cp/decl.c:8383
+#: cp/decl.c:8392
+#, gcc-internal-format
msgid "parameter %qD invalidly declared method type"
msgstr ""
-#: cp/decl.c:8407
+#: cp/decl.c:8416
+#, gcc-internal-format
msgid "parameter %qD includes %s to array of unknown bound %qT"
msgstr ""
@@ -13574,110 +19103,135 @@ msgstr ""
#. or implicitly defined), there's no need to worry about their
#. existence. Theoretically, they should never even be
#. instantiated, but that's hard to forestall.
-#: cp/decl.c:8566
+#: cp/decl.c:8575
+#, gcc-internal-format
msgid "invalid constructor; you probably meant %<%T (const %T&)%>"
msgstr ""
-#: cp/decl.c:8685
+#: cp/decl.c:8694
+#, gcc-internal-format
msgid "%qD may not be declared within a namespace"
msgstr ""
-#: cp/decl.c:8687
+#: cp/decl.c:8696
+#, gcc-internal-format
msgid "%qD may not be declared as static"
msgstr ""
-#: cp/decl.c:8708
+#: cp/decl.c:8717
+#, gcc-internal-format
msgid "%qD must be a nonstatic member function"
msgstr ""
-#: cp/decl.c:8717
+#: cp/decl.c:8726
+#, gcc-internal-format
msgid ""
"%qD must be either a non-static member function or a non-member function"
msgstr ""
-#: cp/decl.c:8737
+#: cp/decl.c:8746
+#, gcc-internal-format
msgid "%qD must have an argument of class or enumerated type"
msgstr ""
-#: cp/decl.c:8771
-#, c-format
+#: cp/decl.c:8787
+#, gcc-internal-format
msgid "conversion to %s%s will never use a type conversion operator"
msgstr ""
#. 13.4.0.3
-#: cp/decl.c:8779
+#: cp/decl.c:8794
+#, gcc-internal-format
msgid "ISO C++ prohibits overloading operator ?:"
msgstr ""
-#: cp/decl.c:8829
+#: cp/decl.c:8844
+#, gcc-internal-format
msgid "postfix %qD must take %<int%> as its argument"
msgstr ""
-#: cp/decl.c:8833
+#: cp/decl.c:8848
+#, gcc-internal-format
msgid "postfix %qD must take %<int%> as its second argument"
msgstr ""
-#: cp/decl.c:8840
+#: cp/decl.c:8855
+#, gcc-internal-format
msgid "%qD must take either zero or one argument"
msgstr ""
-#: cp/decl.c:8842
+#: cp/decl.c:8857
+#, gcc-internal-format
msgid "%qD must take either one or two arguments"
msgstr ""
-#: cp/decl.c:8863
+#: cp/decl.c:8878
+#, gcc-internal-format
msgid "prefix %qD should return %qT"
msgstr ""
-#: cp/decl.c:8869
+#: cp/decl.c:8884
+#, gcc-internal-format
msgid "postfix %qD should return %qT"
msgstr ""
-#: cp/decl.c:8878
+#: cp/decl.c:8893
+#, gcc-internal-format
msgid "%qD must take %<void%>"
msgstr ""
-#: cp/decl.c:8880 cp/decl.c:8888
+#: cp/decl.c:8895 cp/decl.c:8903
+#, gcc-internal-format
msgid "%qD must take exactly one argument"
msgstr ""
-#: cp/decl.c:8890
+#: cp/decl.c:8905
+#, gcc-internal-format
msgid "%qD must take exactly two arguments"
msgstr ""
-#: cp/decl.c:8898
+#: cp/decl.c:8913
+#, gcc-internal-format
msgid "user-defined %qD always evaluates both arguments"
msgstr ""
-#: cp/decl.c:8912
+#: cp/decl.c:8927
+#, gcc-internal-format
msgid "%qD should return by value"
msgstr ""
-#: cp/decl.c:8924 cp/decl.c:8927
+#: cp/decl.c:8939 cp/decl.c:8942
+#, gcc-internal-format
msgid "%qD cannot have default arguments"
msgstr ""
-#: cp/decl.c:8984
+#: cp/decl.c:8999
+#, gcc-internal-format
msgid "using template type parameter %qT after %qs"
msgstr ""
-#: cp/decl.c:8999
+#: cp/decl.c:9014
+#, gcc-internal-format
msgid "using typedef-name %qD after %qs"
msgstr ""
-#: cp/decl.c:9000
+#: cp/decl.c:9015
+#, gcc-internal-format
msgid "%qD has a previous declaration here"
msgstr ""
-#: cp/decl.c:9008
+#: cp/decl.c:9023
+#, gcc-internal-format
msgid "%qT referred to as %qs"
msgstr ""
-#: cp/decl.c:9009 cp/decl.c:9017
+#: cp/decl.c:9024 cp/decl.c:9032
+#, gcc-internal-format
msgid "%qT has a previous declaration here"
msgstr ""
-#: cp/decl.c:9016
+#: cp/decl.c:9031
+#, gcc-internal-format
msgid "%qT referred to as enum"
msgstr ""
@@ -13688,51 +19242,63 @@ msgstr ""
#. void f(class C); // No template header here
#.
#. then the required template argument is missing.
-#: cp/decl.c:9031
+#: cp/decl.c:9046
+#, gcc-internal-format
msgid "template argument required for %<%s %T%>"
msgstr ""
-#: cp/decl.c:9079 cp/name-lookup.c:2596
+#: cp/decl.c:9094 cp/name-lookup.c:2602
+#, gcc-internal-format
msgid "%qD has the same name as the class in which it is declared"
msgstr ""
-#: cp/decl.c:9217
+#: cp/decl.c:9232
+#, gcc-internal-format
msgid "use of enum %q#D without previous declaration"
msgstr ""
-#: cp/decl.c:9235
+#: cp/decl.c:9250
+#, gcc-internal-format
msgid "redeclaration of %qT as a non-template"
msgstr ""
-#: cp/decl.c:9342
+#: cp/decl.c:9357
+#, gcc-internal-format
msgid "derived union %qT invalid"
msgstr ""
-#: cp/decl.c:9348
+#: cp/decl.c:9363
+#, gcc-internal-format
msgid "Java class %qT cannot have multiple bases"
msgstr ""
-#: cp/decl.c:9356
+#: cp/decl.c:9371
+#, gcc-internal-format
msgid "Java class %qT cannot have virtual bases"
msgstr ""
-#: cp/decl.c:9375
+#: cp/decl.c:9390
+#, gcc-internal-format
msgid "base type %qT fails to be a struct or class type"
msgstr ""
-#: cp/decl.c:9408
+#: cp/decl.c:9423
+#, gcc-internal-format
msgid "recursive type %qT undefined"
msgstr ""
-#: cp/decl.c:9410
+#: cp/decl.c:9425
+#, gcc-internal-format
msgid "duplicate base type %qT invalid"
msgstr ""
-#: cp/decl.c:9480
+#: cp/decl.c:9495
+#, gcc-internal-format
msgid "multiple definition of %q#T"
msgstr ""
-#: cp/decl.c:9481
+#: cp/decl.c:9496
+#, gcc-internal-format
msgid "%Jprevious definition here"
msgstr ""
@@ -13740,241 +19306,297 @@ msgstr ""
#.
#. IF no integral type can represent all the enumerator values, the
#. enumeration is ill-formed.
-#: cp/decl.c:9618
+#: cp/decl.c:9633
+#, gcc-internal-format
msgid "no integral type can represent all of the enumerator values for %qT"
msgstr ""
-#: cp/decl.c:9724
+#: cp/decl.c:9739
+#, gcc-internal-format
msgid "enumerator value for %qD not integer constant"
msgstr ""
-#: cp/decl.c:9751
+#: cp/decl.c:9766
+#, gcc-internal-format
msgid "overflow in enumeration values at %qD"
msgstr ""
-#: cp/decl.c:9822
+#: cp/decl.c:9837
+#, gcc-internal-format
msgid "return type %q#T is incomplete"
msgstr ""
-#: cp/decl.c:9937 cp/typeck.c:6134
+#: cp/decl.c:9953 cp/typeck.c:6184
+#, gcc-internal-format
msgid "%<operator=%> should return a reference to %<*this%>"
msgstr ""
-#: cp/decl.c:10265
+#: cp/decl.c:10281
+#, gcc-internal-format
msgid "parameter %qD declared void"
msgstr ""
-#: cp/decl.c:10758
+#: cp/decl.c:10774
+#, gcc-internal-format
msgid "invalid member function declaration"
msgstr ""
-#: cp/decl.c:10773
+#: cp/decl.c:10789
+#, gcc-internal-format
msgid "%qD is already defined in class %qT"
msgstr ""
-#: cp/decl.c:10983
+#: cp/decl.c:10999
+#, gcc-internal-format
msgid "static member function %q#D declared with type qualifiers"
msgstr ""
-#: cp/decl2.c:279
+#: cp/decl2.c:271
+#, gcc-internal-format
msgid "name missing for member function"
msgstr ""
-#: cp/decl2.c:372 cp/decl2.c:386
+#: cp/decl2.c:364 cp/decl2.c:378
+#, gcc-internal-format
msgid "ambiguous conversion for array subscript"
msgstr ""
-#: cp/decl2.c:380
+#: cp/decl2.c:372
+#, gcc-internal-format
msgid "invalid types %<%T[%T]%> for array subscript"
msgstr ""
-#: cp/decl2.c:423
+#: cp/decl2.c:415
+#, gcc-internal-format
msgid "deleting array %q#D"
msgstr ""
-#: cp/decl2.c:429
+#: cp/decl2.c:421
+#, gcc-internal-format
msgid "type %q#T argument given to %<delete%>, expected pointer"
msgstr ""
-#: cp/decl2.c:441
+#: cp/decl2.c:433
+#, gcc-internal-format
msgid ""
"cannot delete a function. Only pointer-to-objects are valid arguments to %"
"<delete%>"
msgstr ""
-#: cp/decl2.c:449
+#: cp/decl2.c:441
+#, gcc-internal-format
msgid "deleting %qT is undefined"
msgstr ""
#. 14.5.2.2 [temp.mem]
#.
#. A local class shall not have member templates.
-#: cp/decl2.c:485
+#: cp/decl2.c:477
+#, gcc-internal-format
msgid "invalid declaration of member template %q#D in local class"
msgstr ""
-#: cp/decl2.c:494
+#: cp/decl2.c:486
+#, gcc-internal-format
msgid "invalid use of %<virtual%> in template declaration of %q#D"
msgstr ""
-#: cp/decl2.c:504 cp/pt.c:2971
+#: cp/decl2.c:496 cp/pt.c:2972
+#, gcc-internal-format
msgid "template declaration of %q#D"
msgstr ""
-#: cp/decl2.c:553
+#: cp/decl2.c:545
+#, gcc-internal-format
msgid "Java method %qD has non-Java return type %qT"
msgstr ""
-#: cp/decl2.c:569
+#: cp/decl2.c:561
+#, gcc-internal-format
msgid "Java method %qD has non-Java parameter type %qT"
msgstr ""
-#: cp/decl2.c:674
+#: cp/decl2.c:666
+#, gcc-internal-format
msgid "prototype for %q#D does not match any in class %qT"
msgstr ""
-#: cp/decl2.c:775
+#: cp/decl2.c:763
+#, gcc-internal-format
msgid "local class %q#T shall not have static data member %q#D"
msgstr ""
-#: cp/decl2.c:783
+#: cp/decl2.c:771
+#, gcc-internal-format
msgid "initializer invalid for static member with constructor"
msgstr ""
-#: cp/decl2.c:786
+#: cp/decl2.c:774
+#, gcc-internal-format
msgid "(an out of class initialization is required)"
msgstr ""
-#: cp/decl2.c:867
+#: cp/decl2.c:855
+#, gcc-internal-format
msgid "member %qD conflicts with virtual function table field name"
msgstr ""
-#: cp/decl2.c:886
+#: cp/decl2.c:874
+#, gcc-internal-format
msgid "applying attributes to template parameters is not implemented"
msgstr ""
-#: cp/decl2.c:896
+#: cp/decl2.c:884
+#, gcc-internal-format
msgid "%qD is already defined in %qT"
msgstr ""
-#: cp/decl2.c:944
+#: cp/decl2.c:932
+#, gcc-internal-format
msgid "field initializer is not constant"
msgstr ""
-#: cp/decl2.c:972
+#: cp/decl2.c:960
+#, gcc-internal-format
msgid "%<asm%> specifiers are not permitted on non-static data members"
msgstr ""
-#: cp/decl2.c:1018
+#: cp/decl2.c:1006
+#, gcc-internal-format
msgid "cannot declare %qD to be a bit-field type"
msgstr ""
-#: cp/decl2.c:1028
+#: cp/decl2.c:1016
+#, gcc-internal-format
msgid "cannot declare bit-field %qD with function type"
msgstr ""
-#: cp/decl2.c:1035
+#: cp/decl2.c:1023
+#, gcc-internal-format
msgid "%qD is already defined in the class %qT"
msgstr ""
-#: cp/decl2.c:1042
+#: cp/decl2.c:1030
+#, gcc-internal-format
msgid "static member %qD cannot be a bit-field"
msgstr ""
-#: cp/decl2.c:1087
+#: cp/decl2.c:1075
+#, gcc-internal-format
msgid "anonymous struct not inside named type"
msgstr ""
-#: cp/decl2.c:1164
+#: cp/decl2.c:1152
+#, gcc-internal-format
msgid "namespace-scope anonymous aggregates must be static"
msgstr ""
-#: cp/decl2.c:1171
+#: cp/decl2.c:1159
+#, gcc-internal-format
msgid "anonymous union with no members"
msgstr ""
-#: cp/decl2.c:1207
+#: cp/decl2.c:1195
+#, gcc-internal-format
msgid "%<operator new%> must return type %qT"
msgstr ""
-#: cp/decl2.c:1216
+#: cp/decl2.c:1204
+#, gcc-internal-format
msgid "%<operator new%> takes type %<size_t%> (%qT) as first parameter"
msgstr ""
-#: cp/decl2.c:1245
+#: cp/decl2.c:1233
+#, gcc-internal-format
msgid "%<operator delete%> must return type %qT"
msgstr ""
-#: cp/decl2.c:1254
+#: cp/decl2.c:1242
+#, gcc-internal-format
msgid "%<operator delete%> takes type %qT as first parameter"
msgstr ""
-#: cp/decl2.c:3006
+#: cp/decl2.c:3064
+#, gcc-internal-format
msgid "inline function %qD used but never defined"
msgstr ""
-#: cp/decl2.c:3154
+#: cp/decl2.c:3215
+#, gcc-internal-format
msgid "default argument missing for parameter %P of %q+#D"
msgstr ""
#. damn ICE suppression
#: cp/error.c:2371
-#, c-format
+#, gcc-internal-format
msgid "unexpected letter %qc in locate_error\n"
msgstr ""
#. Can't throw a reference.
#: cp/except.c:262
+#, gcc-internal-format
msgid "type %qT is disallowed in Java %<throw%> or %<catch%>"
msgstr ""
#: cp/except.c:273
+#, gcc-internal-format
msgid "call to Java %<catch%> or %<throw%> with %<jthrowable%> undefined"
msgstr ""
#. Thrown object must be a Throwable.
#: cp/except.c:280
+#, gcc-internal-format
msgid "type %qT is not derived from %<java::lang::Throwable%>"
msgstr ""
#: cp/except.c:343
+#, gcc-internal-format
msgid "mixing C++ and Java catches in a single translation unit"
msgstr ""
#: cp/except.c:602
+#, gcc-internal-format
msgid "throwing NULL, which has integral, not pointer type"
msgstr ""
#: cp/except.c:625 cp/init.c:1887
+#, gcc-internal-format
msgid "%qD should never be overloaded"
msgstr ""
#: cp/except.c:692
+#, gcc-internal-format
msgid " in thrown expression"
msgstr ""
-#: cp/except.c:836
+#: cp/except.c:839
+#, gcc-internal-format
msgid ""
"expression %qE of abstract class type %qT cannot be used in throw-expression"
msgstr ""
-#: cp/except.c:921
+#: cp/except.c:924
+#, gcc-internal-format
msgid "%Hexception of type %qT will be caught"
msgstr ""
-#: cp/except.c:923
+#: cp/except.c:926
+#, gcc-internal-format
msgid "%H by earlier handler for %qT"
msgstr ""
-#: cp/except.c:953
+#: cp/except.c:956
+#, gcc-internal-format
msgid "%H%<...%> handler must be the last handler for its try block"
msgstr ""
#: cp/friend.c:152
+#, gcc-internal-format
msgid "%qD is already a friend of class %qT"
msgstr ""
#: cp/friend.c:228
+#, gcc-internal-format
msgid "invalid type %qT declared %<friend%>"
msgstr ""
@@ -13986,280 +19608,336 @@ msgstr ""
#. Friend declarations shall not declare partial
#. specializations.
#: cp/friend.c:244 cp/friend.c:274
+#, gcc-internal-format
msgid "partial specialization %qT declared %<friend%>"
msgstr ""
#: cp/friend.c:252
+#, gcc-internal-format
msgid "class %qT is implicitly friends with itself"
msgstr ""
#: cp/friend.c:310
+#, gcc-internal-format
msgid "%qT is not a member of %qT"
msgstr ""
#: cp/friend.c:315
+#, gcc-internal-format
msgid "%qT is not a member class template of %qT"
msgstr ""
#: cp/friend.c:323
+#, gcc-internal-format
msgid "%qT is not a nested class of %qT"
msgstr ""
#. template <class T> friend class T;
#: cp/friend.c:336
+#, gcc-internal-format
msgid "template parameter type %qT declared %<friend%>"
msgstr ""
#. template <class T> friend class A; where A is not a template
#: cp/friend.c:342
+#, gcc-internal-format
msgid "%q#T is not a template"
msgstr ""
#: cp/friend.c:364
+#, gcc-internal-format
msgid "%qD is already a friend of %qT"
msgstr ""
#: cp/friend.c:373
+#, gcc-internal-format
msgid "%qT is already a friend of %qT"
msgstr ""
#: cp/friend.c:497
+#, gcc-internal-format
msgid "member %qD declared as friend before type %qT defined"
msgstr ""
#: cp/friend.c:553
+#, gcc-internal-format
msgid "friend declaration %q#D declares a non-template function"
msgstr ""
#: cp/friend.c:557
+#, gcc-internal-format
msgid ""
"(if this is not what you intended, make sure the function template has "
"already been declared and add <> after the function name here) -Wno-non-"
"template-friend disables this warning"
msgstr ""
-#: cp/g++spec.c:238 java/jvspec.c:417
-#, c-format
-msgid "argument to '%s' missing\n"
-msgstr ""
-
#: cp/init.c:326
+#, gcc-internal-format
msgid "%J%qD should be initialized in the member initialization list"
msgstr ""
#: cp/init.c:373
+#, gcc-internal-format
msgid "%Jdefault-initialization of %q#D, which has reference type"
msgstr ""
#: cp/init.c:379
+#, gcc-internal-format
msgid "%Juninitialized reference member %qD"
msgstr ""
#: cp/init.c:382
+#, gcc-internal-format
msgid "%Juninitialized member %qD with %<const%> type %qT"
msgstr ""
#: cp/init.c:525
+#, gcc-internal-format
msgid "%qD will be initialized after"
msgstr ""
#: cp/init.c:528
+#, gcc-internal-format
msgid "base %qT will be initialized after"
msgstr ""
#: cp/init.c:531
+#, gcc-internal-format
msgid " %q#D"
msgstr ""
#: cp/init.c:533
+#, gcc-internal-format
msgid " base %qT"
msgstr ""
#: cp/init.c:534
+#, gcc-internal-format
msgid "%J when initialized here"
msgstr ""
#: cp/init.c:550
+#, gcc-internal-format
msgid "%Jmultiple initializations given for %qD"
msgstr ""
#: cp/init.c:553
+#, gcc-internal-format
msgid "%Jmultiple initializations given for base %qT"
msgstr ""
#: cp/init.c:620
+#, gcc-internal-format
msgid "%Jinitializations for multiple members of %qT"
msgstr ""
#: cp/init.c:682
+#, gcc-internal-format
msgid ""
"%Jbase class %q#T should be explicitly initialized in the copy constructor"
msgstr ""
#: cp/init.c:906 cp/init.c:925
+#, gcc-internal-format
msgid "class %qT does not have any field named %qD"
msgstr ""
#: cp/init.c:912
+#, gcc-internal-format
msgid ""
"%q#D is a static data member; it can only be initialized at its definition"
msgstr ""
#: cp/init.c:919
+#, gcc-internal-format
msgid "%q#D is not a non-static data member of %qT"
msgstr ""
#: cp/init.c:958
+#, gcc-internal-format
msgid "unnamed initializer for %qT, which has no base classes"
msgstr ""
#: cp/init.c:966
+#, gcc-internal-format
msgid "unnamed initializer for %qT, which uses multiple inheritance"
msgstr ""
#: cp/init.c:1012
+#, gcc-internal-format
msgid "%qD is both a direct base and an indirect virtual base"
msgstr ""
#: cp/init.c:1020
+#, gcc-internal-format
msgid "type %qD is not a direct or virtual base of %qT"
msgstr ""
#: cp/init.c:1023
+#, gcc-internal-format
msgid "type %qD is not a direct base of %qT"
msgstr ""
#: cp/init.c:1103
+#, gcc-internal-format
msgid "bad array initializer"
msgstr ""
#: cp/init.c:1302
+#, gcc-internal-format
msgid "%qT is not an aggregate type"
msgstr ""
#: cp/init.c:1394
+#, gcc-internal-format
msgid "qualified type %qT does not match destructor name %<~%T%>"
msgstr ""
#: cp/init.c:1402
+#, gcc-internal-format
msgid "incomplete type %qT does not have member %qD"
msgstr ""
#: cp/init.c:1421
+#, gcc-internal-format
msgid "%qD is not a member of type %qT"
msgstr ""
#: cp/init.c:1440
+#, gcc-internal-format
msgid "invalid pointer to bit-field %qD"
msgstr ""
#: cp/init.c:1542
+#, gcc-internal-format
msgid "invalid use of non-static member function %qD"
msgstr ""
-#: cp/init.c:1548 cp/semantics.c:1321
+#: cp/init.c:1548 cp/semantics.c:1348
+#, gcc-internal-format
msgid "invalid use of non-static data member %qD"
msgstr ""
#: cp/init.c:1645
+#, gcc-internal-format
msgid "size in array new must have integral type"
msgstr ""
#: cp/init.c:1648
+#, gcc-internal-format
msgid "zero size array reserves no space"
msgstr ""
#: cp/init.c:1656
+#, gcc-internal-format
msgid "new cannot be applied to a reference type"
msgstr ""
#: cp/init.c:1662
+#, gcc-internal-format
msgid "new cannot be applied to a function type"
msgstr ""
#: cp/init.c:1694
+#, gcc-internal-format
msgid "call to Java constructor, while %<jclass%> undefined"
msgstr ""
#: cp/init.c:1710
+#, gcc-internal-format
msgid "can't find class$"
msgstr ""
#: cp/init.c:1838
+#, gcc-internal-format
msgid "invalid type %<void%> for new"
msgstr ""
#: cp/init.c:1848
+#, gcc-internal-format
msgid "uninitialized const in %<new%> of %q#T"
msgstr ""
#: cp/init.c:1882
-#, c-format
+#, gcc-internal-format
msgid "call to Java constructor with %qs undefined"
msgstr ""
#: cp/init.c:1922
+#, gcc-internal-format
msgid "request for member %qD is ambiguous"
msgstr ""
#: cp/init.c:2055
+#, gcc-internal-format
msgid "ISO C++ forbids initialization in array new"
msgstr ""
#: cp/init.c:2530
+#, gcc-internal-format
msgid "initializer ends prematurely"
msgstr ""
#: cp/init.c:2583
+#, gcc-internal-format
msgid "cannot initialize multi-dimensional array with initializer"
msgstr ""
#: cp/init.c:2738
+#, gcc-internal-format
msgid "possible problem detected in invocation of delete operator:"
msgstr ""
#: cp/init.c:2741
+#, gcc-internal-format
msgid ""
"neither the destructor nor the class-specific operator delete will be "
"called, even if they are declared when the class is defined."
msgstr ""
#: cp/init.c:2762
+#, gcc-internal-format
msgid "unknown array size in delete"
msgstr ""
#: cp/init.c:2995
+#, gcc-internal-format
msgid "type to vector delete is neither pointer or array type"
msgstr ""
-#: cp/lex.c:436
-#, c-format
+#: cp/lex.c:468
+#, gcc-internal-format
msgid "junk at end of #pragma %s"
msgstr ""
-#: cp/lex.c:443
-#, c-format
+#: cp/lex.c:475
+#, gcc-internal-format
msgid "invalid #pragma %s"
msgstr ""
-#: cp/lex.c:451
+#: cp/lex.c:483
+#, gcc-internal-format
msgid "#pragma vtable no longer supported"
msgstr ""
-#: cp/lex.c:530
-#, c-format
+#: cp/lex.c:562
+#, gcc-internal-format
msgid "#pragma implementation for %qs appears after file is included"
msgstr ""
-#: cp/lex.c:555
+#: cp/lex.c:587
+#, gcc-internal-format
msgid "junk at end of #pragma GCC java_exceptions"
msgstr ""
-#: cp/lex.c:569
+#: cp/lex.c:601
+#, gcc-internal-format
msgid "%qD not defined"
msgstr ""
-#: cp/lex.c:573
+#: cp/lex.c:605
+#, gcc-internal-format
msgid "%qD was not declared in this scope"
msgstr ""
@@ -14273,53 +19951,69 @@ msgstr ""
#. Note that we have the exact wording of the following message in
#. the manual (trouble.texi, node "Name lookup"), so they need to
#. be kept in synch.
-#: cp/lex.c:610
+#: cp/lex.c:642
+#, gcc-internal-format
msgid ""
"there are no arguments to %qD that depend on a template parameter, so a "
"declaration of %qD must be available"
msgstr ""
-#: cp/lex.c:619
+#: cp/lex.c:651
+#, gcc-internal-format
msgid ""
"(if you use %<-fpermissive%>, G++ will accept your code, but allowing the "
"use of an undeclared name is deprecated)"
msgstr ""
-#: cp/mangle.c:2114
+#: cp/mangle.c:2139
+#, gcc-internal-format
msgid "call_expr cannot be mangled due to a defect in the C++ ABI"
msgstr ""
-#: cp/mangle.c:2122
+#: cp/mangle.c:2147
+#, gcc-internal-format
msgid "zero-operand casts cannot be mangled due to a defect in the C++ ABI"
msgstr ""
-#: cp/mangle.c:2172
+#: cp/mangle.c:2197
+#, gcc-internal-format
msgid "omitted middle operand to %<?:%> operand cannot be mangled"
msgstr ""
-#: cp/mangle.c:2482
+#: cp/mangle.c:2507
+#, gcc-internal-format
msgid "the mangled name of %qD will change in a future version of GCC"
msgstr ""
-#: cp/method.c:445
+#: cp/method.c:456
+#, gcc-internal-format
msgid "generic thunk code fails for method %q#D which uses %<...%>"
msgstr ""
-#: cp/method.c:678
+#: cp/method.c:691
+#, gcc-internal-format
msgid "non-static const member %q#D, can't use default assignment operator"
msgstr ""
-#: cp/method.c:684
+#: cp/method.c:697
+#, gcc-internal-format
msgid "non-static reference member %q#D, can't use default assignment operator"
msgstr ""
-#: cp/method.c:1099
+#: cp/method.c:809
+#, gcc-internal-format
+msgid "%Hsynthesized method %qD first required here "
+msgstr ""
+
+#: cp/method.c:1136
+#, gcc-internal-format
msgid ""
"vtable layout for class %qT may not be ABI-compliantand may change in a "
"future version of GCC due to implicit virtual destructor"
msgstr ""
#: cp/name-lookup.c:693
+#, gcc-internal-format
msgid "redeclaration of %<wchar_t%> as %qT"
msgstr ""
@@ -14330,547 +20024,666 @@ msgstr ""
#.
#. This function shall not be overloaded.
#: cp/name-lookup.c:725
+#, gcc-internal-format
msgid "invalid redeclaration of %qD"
msgstr ""
#: cp/name-lookup.c:726
+#, gcc-internal-format
msgid "as %qD"
msgstr ""
#: cp/name-lookup.c:814
+#, gcc-internal-format
msgid "type mismatch with previous external decl of %q#D"
msgstr ""
#: cp/name-lookup.c:815
+#, gcc-internal-format
msgid "previous external decl of %q#D"
msgstr ""
#: cp/name-lookup.c:897
+#, gcc-internal-format
msgid "extern declaration of %q#D doesn't match"
msgstr ""
#: cp/name-lookup.c:898
+#, gcc-internal-format
msgid "global declaration %q#D"
msgstr ""
#: cp/name-lookup.c:934 cp/name-lookup.c:941
+#, gcc-internal-format
msgid "declaration of %q#D shadows a parameter"
msgstr ""
#. Location of previous decl is not useful in this case.
#: cp/name-lookup.c:966
+#, gcc-internal-format
msgid "declaration of %qD shadows a member of 'this'"
msgstr ""
#: cp/name-lookup.c:972
+#, gcc-internal-format
msgid "declaration of %qD shadows a previous local"
msgstr ""
#: cp/name-lookup.c:979
+#, gcc-internal-format
msgid "declaration of %qD shadows a global declaration"
msgstr ""
#: cp/name-lookup.c:1095
+#, gcc-internal-format
msgid "name lookup of %qD changed"
msgstr ""
#: cp/name-lookup.c:1096
+#, gcc-internal-format
msgid " matches this %qD under ISO standard rules"
msgstr ""
#: cp/name-lookup.c:1098
+#, gcc-internal-format
msgid " matches this %qD under old rules"
msgstr ""
#: cp/name-lookup.c:1116 cp/name-lookup.c:1124
+#, gcc-internal-format
msgid "name lookup of %qD changed for new ISO %<for%> scoping"
msgstr ""
#: cp/name-lookup.c:1118
+#, gcc-internal-format
msgid " cannot use obsolete binding at %qD because it has a destructor"
msgstr ""
#: cp/name-lookup.c:1126
+#, gcc-internal-format
msgid " using obsolete binding at %qD"
msgstr ""
#: cp/name-lookup.c:1179
-#, c-format
+#, gcc-internal-format
msgid "%s %s(%E) %p %d\n"
msgstr ""
#: cp/name-lookup.c:1182
-#, c-format
+#, gcc-internal-format
msgid "%s %s %p %d\n"
msgstr ""
#: cp/name-lookup.c:1308
+#, gcc-internal-format
msgid "XXX is_class_level != (current_scope == class_scope)\n"
msgstr ""
#: cp/name-lookup.c:1864
+#, gcc-internal-format
msgid "%q#D hides constructor for %q#T"
msgstr ""
#: cp/name-lookup.c:1880
+#, gcc-internal-format
msgid "%q#D conflicts with previous using declaration %q#D"
msgstr ""
-#: cp/name-lookup.c:1892
+#: cp/name-lookup.c:1899
+#, gcc-internal-format
msgid "previous non-function declaration %q#D"
msgstr ""
-#: cp/name-lookup.c:1893
+#: cp/name-lookup.c:1900
+#, gcc-internal-format
msgid "conflicts with function declaration %q#D"
msgstr ""
#. It's a nested name with template parameter dependent scope.
#. This can only be using-declaration for class member.
-#: cp/name-lookup.c:1971 cp/name-lookup.c:1996 cp/name-lookup.c:3158
+#: cp/name-lookup.c:1978 cp/name-lookup.c:2003 cp/name-lookup.c:3164
+#, gcc-internal-format
msgid "%qT is not a namespace"
msgstr ""
#. 7.3.3/5
#. A using-declaration shall not name a template-id.
-#: cp/name-lookup.c:1981
+#: cp/name-lookup.c:1988
+#, gcc-internal-format
msgid "a using-declaration cannot specify a template-id. Try %<using %D%>"
msgstr ""
-#: cp/name-lookup.c:1988
+#: cp/name-lookup.c:1995
+#, gcc-internal-format
msgid "namespace %qD not allowed in using-declaration"
msgstr ""
-#: cp/name-lookup.c:2024
+#: cp/name-lookup.c:2031
+#, gcc-internal-format
msgid "%qD not declared"
msgstr ""
-#: cp/name-lookup.c:2036 cp/name-lookup.c:2081 cp/name-lookup.c:2115
+#: cp/name-lookup.c:2051 cp/name-lookup.c:2087 cp/name-lookup.c:2121
+#, gcc-internal-format
msgid "%qD is already declared in this scope"
msgstr ""
-#: cp/name-lookup.c:2121
+#: cp/name-lookup.c:2127
+#, gcc-internal-format
msgid "using declaration %qD introduced ambiguous type %qT"
msgstr ""
-#: cp/name-lookup.c:2692
+#: cp/name-lookup.c:2698
+#, gcc-internal-format
msgid "using-declaration for non-member at class scope"
msgstr ""
-#: cp/name-lookup.c:2697
+#: cp/name-lookup.c:2703
+#, gcc-internal-format
msgid "using-declaration cannot name destructor"
msgstr ""
-#: cp/name-lookup.c:2770
+#: cp/name-lookup.c:2776
+#, gcc-internal-format
msgid "declaration of %qD not in a namespace surrounding %qD"
msgstr ""
-#: cp/name-lookup.c:2778
+#: cp/name-lookup.c:2784
+#, gcc-internal-format
msgid "explicit qualification in declaration of `%D'"
msgstr ""
-#: cp/name-lookup.c:2814
+#: cp/name-lookup.c:2820
+#, gcc-internal-format
msgid "%qD should have been declared inside %qD"
msgstr ""
-#: cp/name-lookup.c:2876
+#: cp/name-lookup.c:2882
+#, gcc-internal-format
msgid "namespace alias %qD not allowed here, assuming %qD"
msgstr ""
#. The parser did not find it, so it's not there.
-#: cp/name-lookup.c:2991
+#: cp/name-lookup.c:2997
+#, gcc-internal-format
msgid "unknown namespace %qD"
msgstr ""
-#: cp/name-lookup.c:3152
+#: cp/name-lookup.c:3158
+#, gcc-internal-format
msgid "namespace %qT undeclared"
msgstr ""
-#: cp/name-lookup.c:3196
+#: cp/name-lookup.c:3202
+#, gcc-internal-format
msgid "strong using only meaningful at namespace scope"
msgstr ""
-#: cp/name-lookup.c:3203
+#: cp/name-lookup.c:3209
+#, gcc-internal-format
msgid "%qD attribute directive ignored"
msgstr ""
-#: cp/name-lookup.c:3338
+#: cp/name-lookup.c:3344
+#, gcc-internal-format
msgid "use of %qD is ambiguous"
msgstr ""
-#: cp/name-lookup.c:3339
+#: cp/name-lookup.c:3345
+#, gcc-internal-format
msgid " first declared as %q#D here"
msgstr ""
-#: cp/name-lookup.c:3341
+#: cp/name-lookup.c:3347
+#, gcc-internal-format
msgid " also declared as %q#D here"
msgstr ""
-#: cp/name-lookup.c:3356
+#: cp/name-lookup.c:3362
+#, gcc-internal-format
msgid "%qD denotes an ambiguous type"
msgstr ""
-#: cp/name-lookup.c:3357
+#: cp/name-lookup.c:3363
+#, gcc-internal-format
msgid "%J first type here"
msgstr ""
-#: cp/name-lookup.c:3358
+#: cp/name-lookup.c:3364
+#, gcc-internal-format
msgid "%J other type here"
msgstr ""
#. This happens for A::B where B is a template, and there are no
#. template arguments.
-#: cp/name-lookup.c:3436 cp/parser.c:4384 cp/typeck.c:1786
+#: cp/name-lookup.c:3442 cp/parser.c:4480 cp/typeck.c:1790
+#, gcc-internal-format
msgid "invalid use of %qD"
msgstr ""
-#: cp/name-lookup.c:3476
+#: cp/name-lookup.c:3482
+#, gcc-internal-format
msgid "%<%D::%D%> is not a template"
msgstr ""
-#: cp/name-lookup.c:3491
+#: cp/name-lookup.c:3497
+#, gcc-internal-format
msgid "%qD undeclared in namespace %qD"
msgstr ""
-#: cp/name-lookup.c:4118
+#: cp/name-lookup.c:4124
+#, gcc-internal-format
msgid "%qD is not a function,"
msgstr ""
-#: cp/name-lookup.c:4119
+#: cp/name-lookup.c:4125
+#, gcc-internal-format
msgid " conflict with %qD"
msgstr ""
-#: cp/name-lookup.c:4905
+#: cp/name-lookup.c:4910
+#, gcc-internal-format
msgid "XXX entering pop_everything ()\n"
msgstr ""
-#: cp/name-lookup.c:4914
+#: cp/name-lookup.c:4919
+#, gcc-internal-format
msgid "XXX leaving pop_everything ()\n"
msgstr ""
-#: cp/parser.c:1797
+#: cp/parser.c:1848
+#, gcc-internal-format
msgid "minimum/maximum operators are deprecated"
msgstr ""
-#: cp/parser.c:1817
+#: cp/parser.c:1868
+#, gcc-internal-format
msgid "%<#pragma%> is not allowed here"
msgstr ""
-#: cp/parser.c:1846
+#: cp/parser.c:1897
+#, gcc-internal-format
msgid "%<%D::%D%> has not been declared"
msgstr ""
-#: cp/parser.c:1849 cp/semantics.c:2379
+#: cp/parser.c:1900 cp/semantics.c:2416
+#, gcc-internal-format
msgid "%<::%D%> has not been declared"
msgstr ""
-#: cp/parser.c:1852
+#: cp/parser.c:1903
+#, gcc-internal-format
msgid "request for member %qD in non-class type %qT"
msgstr ""
-#: cp/parser.c:1855
+#: cp/parser.c:1906
+#, gcc-internal-format
msgid "%<%T::%D%> has not been declared"
msgstr ""
-#: cp/parser.c:1858
+#: cp/parser.c:1909
+#, gcc-internal-format
msgid "%qD has not been declared"
msgstr ""
-#: cp/parser.c:1861
+#: cp/parser.c:1912
+#, gcc-internal-format
msgid "%<%D::%D%> %s"
msgstr ""
-#: cp/parser.c:1863
+#: cp/parser.c:1914
+#, gcc-internal-format
msgid "%<::%D%> %s"
msgstr ""
-#: cp/parser.c:1865
+#: cp/parser.c:1916
+#, gcc-internal-format
msgid "%qD %s"
msgstr ""
-#: cp/parser.c:1917
+#: cp/parser.c:1968
+#, gcc-internal-format
msgid "new types may not be defined in a return type"
msgstr ""
-#: cp/parser.c:1918
+#: cp/parser.c:1969
+#, gcc-internal-format
msgid "(perhaps a semicolon is missing after the definition of %qT)"
msgstr ""
-#: cp/parser.c:1937 cp/pt.c:4341
+#: cp/parser.c:1988 cp/pt.c:4341
+#, gcc-internal-format
msgid "%qT is not a template"
msgstr ""
-#: cp/parser.c:1939
-#, c-format
+#: cp/parser.c:1990
+#, gcc-internal-format
msgid "%qE is not a template"
msgstr ""
-#: cp/parser.c:1941
+#: cp/parser.c:1992
+#, gcc-internal-format
msgid "invalid template-id"
msgstr ""
-#: cp/parser.c:1970
-#, c-format
+#: cp/parser.c:2021
+#, gcc-internal-format
msgid "%s cannot appear in a constant-expression"
msgstr ""
-#: cp/parser.c:1995
-#, c-format
+#: cp/parser.c:2046
+#, gcc-internal-format
msgid "invalid use of template-name %qE without an argument list"
msgstr ""
#. Issue an error message.
-#: cp/parser.c:2000
-#, c-format
+#: cp/parser.c:2051
+#, gcc-internal-format
msgid "%qE does not name a type"
msgstr ""
-#: cp/parser.c:2032
+#: cp/parser.c:2083
+#, gcc-internal-format
msgid "(perhaps %<typename %T::%E%> was intended)"
msgstr ""
-#: cp/parser.c:2047
-#, c-format
+#: cp/parser.c:2098
+#, gcc-internal-format
msgid "%qE in namespace %qE does not name a type"
msgstr ""
-#: cp/parser.c:2050
+#: cp/parser.c:2101
+#, gcc-internal-format
msgid "%qE in class %qT does not name a type"
msgstr ""
-#: cp/parser.c:2759
+#: cp/parser.c:2815
+#, gcc-internal-format
msgid "ISO C++ forbids braced-groups within expressions"
msgstr ""
-#: cp/parser.c:2768
+#: cp/parser.c:2824
+#, gcc-internal-format
msgid "statement-expressions are allowed only inside functions"
msgstr ""
-#: cp/parser.c:2819
+#: cp/parser.c:2875
+#, gcc-internal-format
msgid "%<this%> may not be used in this context"
msgstr ""
-#: cp/parser.c:2955
+#: cp/parser.c:3022
+#, gcc-internal-format
msgid "local variable %qD may not appear in this context"
msgstr ""
-#: cp/parser.c:3327
+#: cp/parser.c:3399
+#, gcc-internal-format
msgid "typedef-name %qD used as destructor declarator"
msgstr ""
-#: cp/parser.c:3984
+#: cp/parser.c:4056
+#, gcc-internal-format
msgid "ISO C++ forbids compound-literals"
msgstr ""
-#: cp/parser.c:4904
+#: cp/parser.c:5000
+#, gcc-internal-format
msgid "array bound forbidden after parenthesized type-id"
msgstr ""
-#: cp/parser.c:4905
+#: cp/parser.c:5001
+#, gcc-internal-format
msgid "try removing the parentheses around the type-id"
msgstr ""
-#: cp/parser.c:5106
+#: cp/parser.c:5203
+#, gcc-internal-format
msgid "expression in new-declarator must have integral or enumeration type"
msgstr ""
-#: cp/parser.c:5295
+#: cp/parser.c:5392
+#, gcc-internal-format
msgid "use of old-style cast"
msgstr ""
-#: cp/parser.c:6065
-#, c-format
+#: cp/parser.c:6171
+#, gcc-internal-format
msgid "case label %qE not within a switch statement"
msgstr ""
-#: cp/parser.c:6608
+#: cp/parser.c:6715
+#, gcc-internal-format
msgid "ISO C++ forbids computed gotos"
msgstr ""
-#: cp/parser.c:6733
+#: cp/parser.c:6840
+#, gcc-internal-format
msgid "extra %<;%>"
msgstr ""
-#: cp/parser.c:7052
+#: cp/parser.c:7162
+#, gcc-internal-format
msgid "mixing declarations and function-definitions is forbidden"
msgstr ""
-#: cp/parser.c:7183
+#: cp/parser.c:7293
+#, gcc-internal-format
msgid "duplicate %<friend%>"
msgstr ""
-#: cp/parser.c:7352
+#: cp/parser.c:7462
+#, gcc-internal-format
msgid "class definition may not be declared a friend"
msgstr ""
-#: cp/parser.c:7665
+#: cp/parser.c:7776
+#, gcc-internal-format
msgid "only constructors take base initializers"
msgstr ""
-#: cp/parser.c:7716
+#: cp/parser.c:7827
+#, gcc-internal-format
msgid "anachronistic old-style base class initializer"
msgstr ""
-#: cp/parser.c:7758
+#: cp/parser.c:7869
+#, gcc-internal-format
msgid ""
"keyword %<typename%> not allowed in this context (a qualified member "
"initializer is implicitly a type)"
msgstr ""
#. Warn that we do not support `export'.
-#: cp/parser.c:8124
+#: cp/parser.c:8235
+#, gcc-internal-format
msgid "keyword %<export%> not implemented, and will be ignored"
msgstr ""
#. Otherwise, emit an error about the invalid digraph, but continue
#. parsing because we got our argument list.
-#: cp/parser.c:8497
+#: cp/parser.c:8608
+#, gcc-internal-format
msgid "%<<::%> cannot begin a template-argument list"
msgstr ""
-#: cp/parser.c:8498
+#: cp/parser.c:8609
+#, gcc-internal-format
msgid ""
"%<<:%> is an alternate spelling for %<[%>. Insert whitespace between %<<%> "
"and %<::%>"
msgstr ""
-#: cp/parser.c:8505
+#: cp/parser.c:8616
+#, gcc-internal-format
msgid "(if you use -fpermissive G++ will accept your code)"
msgstr ""
-#: cp/parser.c:8569
+#: cp/parser.c:8680
+#, gcc-internal-format
msgid "parse error in template argument list"
msgstr ""
#. Explain what went wrong.
-#: cp/parser.c:8682
+#: cp/parser.c:8793
+#, gcc-internal-format
msgid "non-template %qD used as template"
msgstr ""
-#: cp/parser.c:8683
+#: cp/parser.c:8794
+#, gcc-internal-format
msgid "use %<%T::template %D%> to indicate that it is a template"
msgstr ""
-#: cp/parser.c:9272 cp/parser.c:15038
-#, c-format
+#: cp/parser.c:9383 cp/parser.c:15228
+#, gcc-internal-format
msgid "template declaration of %qs"
msgstr ""
-#: cp/parser.c:9715
+#: cp/parser.c:9856
+#, gcc-internal-format
msgid "using %<typename%> outside of template"
msgstr ""
-#: cp/parser.c:9910
+#: cp/parser.c:10052
+#, gcc-internal-format
msgid "type attributes are honored only at type definition"
msgstr ""
#. [namespace.udecl]
#.
#. A using declaration shall not name a template-id.
-#: cp/parser.c:10292
+#: cp/parser.c:10434
+#, gcc-internal-format
msgid "a template-id may not appear in a using-declaration"
msgstr ""
-#: cp/parser.c:10622
+#: cp/parser.c:10764
+#, gcc-internal-format
msgid "an asm-specification is not allowed on a function-definition"
msgstr ""
-#: cp/parser.c:10624
+#: cp/parser.c:10766
+#, gcc-internal-format
msgid "attributes are not allowed on a function-definition"
msgstr ""
-#: cp/parser.c:10755
+#: cp/parser.c:10898
+#, gcc-internal-format
msgid "attributes after parenthesized initializer ignored"
msgstr ""
-#: cp/parser.c:11140
+#: cp/parser.c:11283
+#, gcc-internal-format
msgid "array bound is not an integer constant"
msgstr ""
-#: cp/parser.c:11210
+#: cp/parser.c:11353
+#, gcc-internal-format
msgid "%<%T::%D%> is not a type"
msgstr ""
-#: cp/parser.c:11253
+#: cp/parser.c:11396
+#, gcc-internal-format
msgid "invalid use of constructor as a template"
msgstr ""
-#: cp/parser.c:11254
+#: cp/parser.c:11397
+#, gcc-internal-format
msgid ""
"use %<%T::%D%> instead of %<%T::%T%> to name the constructor in a qualified "
"name"
msgstr ""
-#: cp/parser.c:11442
+#: cp/parser.c:11585
+#, gcc-internal-format
msgid "duplicate cv-qualifier"
msgstr ""
-#: cp/parser.c:11944
+#: cp/parser.c:12117
+#, gcc-internal-format
msgid "file ends in default argument"
msgstr ""
-#: cp/parser.c:12005
+#: cp/parser.c:12178
+#, gcc-internal-format
msgid "deprecated use of default argument for parameter of non-function"
msgstr ""
-#: cp/parser.c:12008
+#: cp/parser.c:12181
+#, gcc-internal-format
msgid "default arguments are only permitted for function parameters"
msgstr ""
-#: cp/parser.c:12750
+#: cp/parser.c:12923
+#, gcc-internal-format
msgid "invalid class name in declaration of %qD"
msgstr ""
-#: cp/parser.c:12761
+#: cp/parser.c:12934
+#, gcc-internal-format
msgid "declaration of %qD in %qD which does not enclose %qD"
msgstr ""
-#: cp/parser.c:12774
+#: cp/parser.c:12947
+#, gcc-internal-format
msgid "extra qualification ignored"
msgstr ""
-#: cp/parser.c:12785
+#: cp/parser.c:12958
+#, gcc-internal-format
msgid "an explicit specialization must be preceded by %<template <>%>"
msgstr ""
-#: cp/parser.c:12878
+#: cp/parser.c:13051
+#, gcc-internal-format
msgid "previous definition of %q#T"
msgstr ""
-#: cp/parser.c:13088
+#: cp/parser.c:13277
+#, gcc-internal-format
msgid "%Hextra %<;%>"
msgstr ""
-#: cp/parser.c:13106
+#: cp/parser.c:13295
+#, gcc-internal-format
msgid "a class-key must be used when declaring a friend"
msgstr ""
-#: cp/parser.c:13120
+#: cp/parser.c:13309
+#, gcc-internal-format
msgid "friend declaration does not name a class or function"
msgstr ""
-#: cp/parser.c:13296
+#: cp/parser.c:13485
+#, gcc-internal-format
msgid "pure-specifier on function-definition"
msgstr ""
-#: cp/parser.c:13574
+#: cp/parser.c:13763
+#, gcc-internal-format
msgid "keyword %<typename%> not allowed outside of templates"
msgstr ""
-#: cp/parser.c:13576
+#: cp/parser.c:13765
+#, gcc-internal-format
msgid ""
"keyword %<typename%> not allowed in this context (the base class is "
"implicitly a type)"
msgstr ""
-#: cp/parser.c:13850
+#: cp/parser.c:14040
+#, gcc-internal-format
msgid "invalid catch parameter"
msgstr ""
-#: cp/parser.c:14425
+#: cp/parser.c:14615
+#, gcc-internal-format
msgid "reference to %qD is ambiguous"
msgstr ""
-#: cp/parser.c:14594
+#: cp/parser.c:14784
+#, gcc-internal-format
msgid "too few template-parameter-lists"
msgstr ""
@@ -14878,147 +20691,202 @@ msgstr ""
#. something like:
#.
#. template <class T> template <class U> void S::f();
-#: cp/parser.c:14609
+#: cp/parser.c:14799
+#, gcc-internal-format
msgid "too many template-parameter-lists"
msgstr ""
#. Skip the entire function.
-#: cp/parser.c:14833
+#: cp/parser.c:15023
+#, gcc-internal-format
msgid "invalid function declaration"
msgstr ""
#. Issue an error message.
-#: cp/parser.c:14870
+#: cp/parser.c:15060
+#, gcc-internal-format
msgid "named return values are no longer supported"
msgstr ""
-#: cp/parser.c:15244
+#: cp/parser.c:15434
+#, gcc-internal-format
msgid "%H%<>>%> should be %<> >%> within a nested template argument list"
msgstr ""
-#: cp/parser.c:15259
+#: cp/parser.c:15449
+#, gcc-internal-format
msgid "spurious %<>>%>, use %<>%> to terminate a template argument list"
msgstr ""
-#: cp/parser.c:15264
+#: cp/parser.c:15454
+#, gcc-internal-format
msgid "missing %<>%> to terminate the template argument list"
msgstr ""
-#: cp/parser.c:15792
+#: cp/parser.c:16003
+#, gcc-internal-format
msgid "%qs tag used in naming %q#T"
msgstr ""
-#: cp/parser.c:15813
+#: cp/parser.c:16024
+#, gcc-internal-format
msgid "%qD redeclared with different access"
msgstr ""
-#: cp/parser.c:15830
+#: cp/parser.c:16041
+#, gcc-internal-format
msgid "%<template%> (as a disambiguator) is only allowed within templates"
msgstr ""
-#: cp/parser.c:16038
+#: cp/parser.c:16278 cp/parser.c:17181 cp/parser.c:17312
+#, gcc-internal-format
+msgid "misplaced `@%D' Objective-C++ construct"
+msgstr ""
+
+#: cp/parser.c:16419
+#, gcc-internal-format
+msgid "`@encode' must specify a type as an argument"
+msgstr ""
+
+#: cp/parser.c:16716
+#, gcc-internal-format
+msgid "invalid Objective-C++ selector name"
+msgstr ""
+
+#: cp/parser.c:17045
+#, gcc-internal-format
+msgid "identifier expected after `@protocol'"
+msgstr ""
+
+#: cp/parser.c:17335
+#, gcc-internal-format
msgid "inter-module optimizations not implemented for C++"
msgstr ""
-#: cp/pt.c:239
+#: cp/pt.c:240
+#, gcc-internal-format
msgid "data member %qD cannot be a member template"
msgstr ""
-#: cp/pt.c:251
+#: cp/pt.c:252
+#, gcc-internal-format
msgid "invalid member template declaration %qD"
msgstr ""
-#: cp/pt.c:573
+#: cp/pt.c:574
+#, gcc-internal-format
msgid "explicit specialization in non-namespace scope %qD"
msgstr ""
-#: cp/pt.c:584
+#: cp/pt.c:585
+#, gcc-internal-format
msgid "enclosing class templates are not explicitly specialized"
msgstr ""
-#: cp/pt.c:668
+#: cp/pt.c:669
+#, gcc-internal-format
msgid "specialization of %qD in different namespace"
msgstr ""
-#: cp/pt.c:669 cp/pt.c:738
+#: cp/pt.c:670 cp/pt.c:739
+#, gcc-internal-format
msgid " from definition of %q#D"
msgstr ""
-#: cp/pt.c:705
+#: cp/pt.c:706
+#, gcc-internal-format
msgid "specialization of %qT after instantiation"
msgstr ""
-#: cp/pt.c:737
+#: cp/pt.c:738
+#, gcc-internal-format
msgid "specializing %q#T in different namespace"
msgstr ""
-#: cp/pt.c:752
+#: cp/pt.c:753
+#, gcc-internal-format
msgid "specialization %qT after instantiation %qT"
msgstr ""
-#: cp/pt.c:764
+#: cp/pt.c:765
+#, gcc-internal-format
msgid "explicit specialization of non-template %qT"
msgstr ""
-#: cp/pt.c:1162
+#: cp/pt.c:1163
+#, gcc-internal-format
msgid "specialization of %qD after instantiation"
msgstr ""
-#: cp/pt.c:1291
+#: cp/pt.c:1292
+#, gcc-internal-format
msgid "%s %+#D"
msgstr ""
-#: cp/pt.c:1347
+#: cp/pt.c:1348
+#, gcc-internal-format
msgid "%qD is not a function template"
msgstr ""
-#: cp/pt.c:1540
+#: cp/pt.c:1541
+#, gcc-internal-format
msgid "template-id %qD for %q+D does not match any template declaration"
msgstr ""
-#: cp/pt.c:1549
+#: cp/pt.c:1550
+#, gcc-internal-format
msgid "ambiguous template specialization %qD for %q+D"
msgstr ""
#. This case handles bogus declarations like template <>
#. template <class T> void f<int>();
-#: cp/pt.c:1780 cp/pt.c:1834
+#: cp/pt.c:1781 cp/pt.c:1835
+#, gcc-internal-format
msgid "template-id %qD in declaration of primary template"
msgstr ""
-#: cp/pt.c:1793
+#: cp/pt.c:1794
+#, gcc-internal-format
msgid "template parameter list used in explicit instantiation"
msgstr ""
-#: cp/pt.c:1799
+#: cp/pt.c:1800
+#, gcc-internal-format
msgid "definition provided for explicit instantiation"
msgstr ""
-#: cp/pt.c:1807
+#: cp/pt.c:1808
+#, gcc-internal-format
msgid "too many template parameter lists in declaration of %qD"
msgstr ""
-#: cp/pt.c:1810
+#: cp/pt.c:1811
+#, gcc-internal-format
msgid "too few template parameter lists in declaration of %qD"
msgstr ""
-#: cp/pt.c:1812
+#: cp/pt.c:1813
+#, gcc-internal-format
msgid "explicit specialization of %qD must be introduced by %<template <>%>"
msgstr ""
-#: cp/pt.c:1831
+#: cp/pt.c:1832
+#, gcc-internal-format
msgid "function template partial specialization %qD is not allowed"
msgstr ""
-#: cp/pt.c:1863
+#: cp/pt.c:1864
+#, gcc-internal-format
msgid "default argument specified in explicit specialization"
msgstr ""
-#: cp/pt.c:1867
+#: cp/pt.c:1868
+#, gcc-internal-format
msgid "template specialization with C linkage"
msgstr ""
-#: cp/pt.c:1894
+#: cp/pt.c:1895
+#, gcc-internal-format
msgid "%qD is not a template function"
msgstr ""
@@ -15030,55 +20898,66 @@ msgstr ""
#. program is ill-formed.
#.
#. Similar language is found in [temp.explicit].
-#: cp/pt.c:1956
+#: cp/pt.c:1957
+#, gcc-internal-format
msgid "specialization of implicitly-declared special member function"
msgstr ""
-#: cp/pt.c:2000
+#: cp/pt.c:2001
+#, gcc-internal-format
msgid "no member function %qD declared in %qT"
msgstr ""
-#: cp/pt.c:2205
+#: cp/pt.c:2206
+#, gcc-internal-format
msgid " shadows template parm %q#D"
msgstr ""
-#: cp/pt.c:2607
+#: cp/pt.c:2608
+#, gcc-internal-format
msgid "template parameters not used in partial specialization:"
msgstr ""
-#: cp/pt.c:2611
+#: cp/pt.c:2612
+#, gcc-internal-format
msgid " %qD"
msgstr ""
-#: cp/pt.c:2622
+#: cp/pt.c:2623
+#, gcc-internal-format
msgid "partial specialization %qT does not specialize any template arguments"
msgstr ""
-#: cp/pt.c:2647
-#, c-format
+#: cp/pt.c:2648
+#, gcc-internal-format
msgid "template argument %qE involves template parameter(s)"
msgstr ""
-#: cp/pt.c:2691
+#: cp/pt.c:2692
+#, gcc-internal-format
msgid "type %qT of template argument %qE depends on template parameter(s)"
msgstr ""
-#: cp/pt.c:2778
+#: cp/pt.c:2779
+#, gcc-internal-format
msgid "no default argument for %qD"
msgstr ""
-#: cp/pt.c:2935
+#: cp/pt.c:2936
+#, gcc-internal-format
msgid "template with C linkage"
msgstr ""
-#: cp/pt.c:2938
+#: cp/pt.c:2939
+#, gcc-internal-format
msgid "template class without a name"
msgstr ""
#. [temp.mem]
#.
#. A destructor shall not be a member template.
-#: cp/pt.c:2946
+#: cp/pt.c:2947
+#, gcc-internal-format
msgid "destructor %qD declared as member template"
msgstr ""
@@ -15087,57 +20966,68 @@ msgstr ""
#. An allocation function can be a function
#. template. ... Template allocation functions shall
#. have two or more parameters.
-#: cp/pt.c:2961
+#: cp/pt.c:2962
+#, gcc-internal-format
msgid "invalid template declaration of %qD"
msgstr ""
-#: cp/pt.c:3042
+#: cp/pt.c:3043
+#, gcc-internal-format
msgid "%qD does not declare a template type"
msgstr ""
-#: cp/pt.c:3048
+#: cp/pt.c:3049
+#, gcc-internal-format
msgid "template definition of non-template %q#D"
msgstr ""
-#: cp/pt.c:3090
+#: cp/pt.c:3091
+#, gcc-internal-format
msgid "expected %d levels of template parms for %q#D, got %d"
msgstr ""
-#: cp/pt.c:3102
+#: cp/pt.c:3103
+#, gcc-internal-format
msgid "got %d template parameters for %q#D"
msgstr ""
-#: cp/pt.c:3105
+#: cp/pt.c:3106
+#, gcc-internal-format
msgid "got %d template parameters for %q#T"
msgstr ""
-#: cp/pt.c:3107
-#, c-format
+#: cp/pt.c:3108
+#, gcc-internal-format
msgid " but %d required"
msgstr ""
-#: cp/pt.c:3203
+#: cp/pt.c:3204
+#, gcc-internal-format
msgid "%qT is not a template type"
msgstr ""
-#: cp/pt.c:3216
+#: cp/pt.c:3217
+#, gcc-internal-format
msgid "template specifiers not specified in declaration of %qD"
msgstr ""
-#: cp/pt.c:3226
+#: cp/pt.c:3227
+#, gcc-internal-format
msgid "previous declaration %qD"
msgstr ""
-#: cp/pt.c:3227
-#, c-format
-msgid "used %d template parameter%s instead of %d"
+#: cp/pt.c:3228
+#, gcc-internal-format
+msgid "used %d template parameter(s) instead of %d"
msgstr ""
#: cp/pt.c:3247
+#, gcc-internal-format
msgid "template parameter %q#D"
msgstr ""
#: cp/pt.c:3248
+#, gcc-internal-format
msgid "redeclared here as %q#D"
msgstr ""
@@ -15146,768 +21036,920 @@ msgstr ""
#. A template-parameter may not be given default arguments
#. by two different declarations in the same scope.
#: cp/pt.c:3258
+#, gcc-internal-format
msgid "redefinition of default argument for %q#D"
msgstr ""
#: cp/pt.c:3259
+#, gcc-internal-format
msgid "%J original definition appeared here"
msgstr ""
#: cp/pt.c:3355
+#, gcc-internal-format
msgid ""
"%qE is not a valid template argument for type %qT because function %qD has "
"not external linkage"
msgstr ""
#: cp/pt.c:3396
+#, gcc-internal-format
msgid ""
"%qE is not a valid template argument for type %qT because string literals "
"can never be used in this context"
msgstr ""
#: cp/pt.c:3471
+#, gcc-internal-format
msgid ""
"%qE is not a valid template argument for type %qT because it is a non-"
"constant expression"
msgstr ""
#: cp/pt.c:3521
+#, gcc-internal-format
msgid ""
"%qE is not a valid template argument for type %qT because it is not a "
"constant pointer"
msgstr ""
#: cp/pt.c:3541
+#, gcc-internal-format
msgid ""
"%qE is not a valid template argument for type %qT because of conflicts in cv-"
"qualification"
msgstr ""
#: cp/pt.c:3548
+#, gcc-internal-format
msgid ""
"%qE is not a valid template argument for type %qT because it is not a lvalue"
msgstr ""
#: cp/pt.c:3561
+#, gcc-internal-format
msgid ""
"%qE is not a valid template argument for type %qT because object %qD has not "
"external linkage"
msgstr ""
#: cp/pt.c:3603
+#, gcc-internal-format
msgid ""
"%qE is not a valid template argument for type %qT because it is a pointer"
msgstr ""
#: cp/pt.c:3605
-#, c-format
+#, gcc-internal-format
msgid "try using %qE instead"
msgstr ""
#: cp/pt.c:3640
+#, gcc-internal-format
msgid ""
"%qE is not a valid template argument for type %qT because it is of type %qT"
msgstr ""
#: cp/pt.c:3643
+#, gcc-internal-format
msgid "standard conversions are not allowed in this context"
msgstr ""
#: cp/pt.c:3812
+#, gcc-internal-format
msgid "to refer to a type member of a template parameter, use %<typename %E%>"
msgstr ""
#: cp/pt.c:3827 cp/pt.c:3846 cp/pt.c:3886
+#, gcc-internal-format
msgid "type/value mismatch at argument %d in template parameter list for %qD"
msgstr ""
#: cp/pt.c:3831
+#, gcc-internal-format
msgid " expected a constant of type %qT, got %qT"
msgstr ""
#: cp/pt.c:3835
-#, c-format
+#, gcc-internal-format
msgid " expected a class template, got %qE"
msgstr ""
#: cp/pt.c:3837
-#, c-format
+#, gcc-internal-format
msgid " expected a type, got %qE"
msgstr ""
#: cp/pt.c:3850
+#, gcc-internal-format
msgid " expected a type, got %qT"
msgstr ""
#: cp/pt.c:3852
+#, gcc-internal-format
msgid " expected a class template, got %qT"
msgstr ""
#: cp/pt.c:3889
+#, gcc-internal-format
msgid " expected a template of type %qD, got %qD"
msgstr ""
#: cp/pt.c:3925
+#, gcc-internal-format
msgid "could not convert template argument %qE to %qT"
msgstr ""
#: cp/pt.c:3964
-#, c-format
+#, gcc-internal-format
msgid "wrong number of template arguments (%d, should be %d)"
msgstr ""
#: cp/pt.c:3968
+#, gcc-internal-format
msgid "provided for %qD"
msgstr ""
#: cp/pt.c:3998
-#, c-format
+#, gcc-internal-format
msgid "template argument %d is invalid"
msgstr ""
#: cp/pt.c:4353
+#, gcc-internal-format
msgid "non-template type %qT used as a template"
msgstr ""
#: cp/pt.c:4355
+#, gcc-internal-format
msgid "for template declaration %qD"
msgstr ""
-#: cp/pt.c:4995
+#: cp/pt.c:4997
+#, gcc-internal-format
msgid ""
"template instantiation depth exceeds maximum of %d (use -ftemplate-depth-NN "
"to increase the maximum) instantiating %qD"
msgstr ""
-#: cp/pt.c:5437
+#: cp/pt.c:5443
+#, gcc-internal-format
msgid "ambiguous class template instantiation for %q#T"
msgstr ""
-#: cp/pt.c:5443
+#: cp/pt.c:5449
+#, gcc-internal-format
msgid "%s %+#T"
msgstr ""
-#: cp/pt.c:6549
+#: cp/pt.c:6555
+#, gcc-internal-format
msgid "instantiation of %qD as type %qT"
msgstr ""
-#: cp/pt.c:6717
+#: cp/pt.c:6725
+#, gcc-internal-format
msgid "invalid parameter type %qT"
msgstr ""
-#: cp/pt.c:6719
+#: cp/pt.c:6727
+#, gcc-internal-format
msgid "in declaration %qD"
msgstr ""
-#: cp/pt.c:6780
+#: cp/pt.c:6801
+#, gcc-internal-format
msgid "function returning an array"
msgstr ""
-#: cp/pt.c:6782
+#: cp/pt.c:6803
+#, gcc-internal-format
msgid "function returning a function"
msgstr ""
-#: cp/pt.c:6809
+#: cp/pt.c:6830
+#, gcc-internal-format
msgid "creating pointer to member function of non-class type %qT"
msgstr ""
-#: cp/pt.c:6977
+#: cp/pt.c:6998
+#, gcc-internal-format
msgid "creating array with size zero"
msgstr ""
-#: cp/pt.c:6991
-#, c-format
+#: cp/pt.c:7012
+#, gcc-internal-format
msgid "creating array with size zero (%qE)"
msgstr ""
-#: cp/pt.c:7208
+#: cp/pt.c:7229
+#, gcc-internal-format
msgid "forming reference to void"
msgstr ""
-#: cp/pt.c:7210
+#: cp/pt.c:7231
+#, gcc-internal-format
msgid "forming %s to reference type %qT"
msgstr ""
-#: cp/pt.c:7247
+#: cp/pt.c:7268
+#, gcc-internal-format
msgid "creating pointer to member of non-class type %qT"
msgstr ""
-#: cp/pt.c:7253
+#: cp/pt.c:7274
+#, gcc-internal-format
msgid "creating pointer to member reference type %qT"
msgstr ""
-#: cp/pt.c:7319
+#: cp/pt.c:7340
+#, gcc-internal-format
msgid "creating array of %qT"
msgstr ""
-#: cp/pt.c:7325
+#: cp/pt.c:7346
+#, gcc-internal-format
msgid "creating array of %qT, which is an abstract class type"
msgstr ""
-#: cp/pt.c:7369
+#: cp/pt.c:7390
+#, gcc-internal-format
msgid "%qT is not a class, struct, or union type"
msgstr ""
-#: cp/pt.c:7404
+#: cp/pt.c:7425
+#, gcc-internal-format
msgid "%qT resolves to %qT, which is not an enumeration type"
msgstr ""
-#: cp/pt.c:7407
+#: cp/pt.c:7428
+#, gcc-internal-format
msgid "%qT resolves to %qT, which is is not a class type"
msgstr ""
-#: cp/pt.c:7468
-#, c-format
+#: cp/pt.c:7489
+#, gcc-internal-format
msgid "use of %qs in template"
msgstr ""
-#: cp/pt.c:7593
-#, c-format
+#: cp/pt.c:7614
+#, gcc-internal-format
msgid ""
"dependent-name %qE is parsed as a non-type, but instantiation yields a type"
msgstr ""
-#: cp/pt.c:7595
+#: cp/pt.c:7616
+#, gcc-internal-format
msgid "say %<typename %E%> if a type is meant"
msgstr ""
-#: cp/pt.c:7714
+#: cp/pt.c:7735
+#, gcc-internal-format
msgid "using invalid field %qD"
msgstr ""
-#: cp/pt.c:8768
+#: cp/pt.c:8789
+#, gcc-internal-format
msgid "%qT is not a class or namespace"
msgstr ""
-#: cp/pt.c:8771
+#: cp/pt.c:8792
+#, gcc-internal-format
msgid "%qD is not a class or namespace"
msgstr ""
-#: cp/pt.c:8911
+#: cp/pt.c:8940
+#, gcc-internal-format
msgid "%qT is/uses anonymous type"
msgstr ""
-#: cp/pt.c:8913
+#: cp/pt.c:8942
+#, gcc-internal-format
msgid "%qT uses local type %qT"
msgstr ""
-#: cp/pt.c:8922
+#: cp/pt.c:8951
+#, gcc-internal-format
msgid "%qT is a variably modified type"
msgstr ""
-#: cp/pt.c:8933
-#, c-format
+#: cp/pt.c:8962
+#, gcc-internal-format
msgid "integral expression %qE is not constant"
msgstr ""
-#: cp/pt.c:8938
+#: cp/pt.c:8967
+#, gcc-internal-format
msgid " trying to instantiate %qD"
msgstr ""
-#: cp/pt.c:9404
+#: cp/pt.c:9433
+#, gcc-internal-format
msgid "incomplete type unification"
msgstr ""
-#: cp/pt.c:10873 cp/pt.c:10944
+#: cp/pt.c:10902 cp/pt.c:10973
+#, gcc-internal-format
msgid "explicit instantiation of non-template %q#D"
msgstr ""
-#: cp/pt.c:10889 cp/pt.c:10939
+#: cp/pt.c:10918 cp/pt.c:10968
+#, gcc-internal-format
msgid "no matching template for %qD found"
msgstr ""
-#: cp/pt.c:10895
+#: cp/pt.c:10924
+#, gcc-internal-format
msgid "explicit instantiation of %q#D"
msgstr ""
-#: cp/pt.c:10931
+#: cp/pt.c:10960
+#, gcc-internal-format
msgid "duplicate explicit instantiation of %q#D"
msgstr ""
-#: cp/pt.c:10953
+#: cp/pt.c:10982
+#, gcc-internal-format
msgid "ISO C++ forbids the use of %<extern%> on explicit instantiations"
msgstr ""
-#: cp/pt.c:10958 cp/pt.c:11048
+#: cp/pt.c:10987 cp/pt.c:11077
+#, gcc-internal-format
msgid "storage class %qD applied to template instantiation"
msgstr ""
-#: cp/pt.c:11020
+#: cp/pt.c:11049
+#, gcc-internal-format
msgid "explicit instantiation of non-template type %qT"
msgstr ""
-#: cp/pt.c:11029
+#: cp/pt.c:11058
+#, gcc-internal-format
msgid "explicit instantiation of %q#T before definition of template"
msgstr ""
-#: cp/pt.c:11037
-#, c-format
+#: cp/pt.c:11066
+#, gcc-internal-format
msgid "ISO C++ forbids the use of %qE on explicit instantiations"
msgstr ""
-#: cp/pt.c:11082
+#: cp/pt.c:11111
+#, gcc-internal-format
msgid "duplicate explicit instantiation of %q#T"
msgstr ""
-#: cp/pt.c:11455
+#: cp/pt.c:11484
+#, gcc-internal-format
msgid "explicit instantiation of %qD but no definition available"
msgstr ""
-#: cp/pt.c:11599
+#: cp/pt.c:11629
+#, gcc-internal-format
msgid ""
"template instantiation depth exceeds maximum of %d (use -ftemplate-depth-NN "
"to increase the maximum) instantiating %q+D, possibly from virtual table "
"generation"
msgstr ""
-#: cp/pt.c:11867
+#: cp/pt.c:11898
+#, gcc-internal-format
msgid "%q#T is not a valid type for a template constant parameter"
msgstr ""
#: cp/repo.c:112
+#, gcc-internal-format
msgid "-frepo must be used with -c"
msgstr ""
#: cp/repo.c:200
-#, c-format
+#, gcc-internal-format
msgid "mysterious repository information in %s"
msgstr ""
#: cp/repo.c:214
-#, c-format
+#, gcc-internal-format
msgid "can't create repository information file %qs"
msgstr ""
#: cp/rtti.c:244
+#, gcc-internal-format
msgid "cannot use typeid with -fno-rtti"
msgstr ""
#: cp/rtti.c:250
+#, gcc-internal-format
msgid "must #include <typeinfo> before using typeid"
msgstr ""
#: cp/rtti.c:322
+#, gcc-internal-format
msgid ""
"cannot create type information for type %qT because its size is variable"
msgstr ""
-#: cp/rtti.c:570 cp/rtti.c:584
+#: cp/rtti.c:571 cp/rtti.c:585
+#, gcc-internal-format
msgid "dynamic_cast of %q#D to %q#T can never succeed"
msgstr ""
-#: cp/rtti.c:663
+#: cp/rtti.c:664
+#, gcc-internal-format
msgid "cannot dynamic_cast %qE (of type %q#T) to type %q#T (%s)"
msgstr ""
#: cp/search.c:257
+#, gcc-internal-format
msgid "%qT is an ambiguous base of %qT"
msgstr ""
#: cp/search.c:275
+#, gcc-internal-format
msgid "%qT is an inaccessible base of %qT"
msgstr ""
#: cp/search.c:1843
+#, gcc-internal-format
msgid "deprecated covariant return type for %q#D"
msgstr ""
#: cp/search.c:1845 cp/search.c:1860 cp/search.c:1866
+#, gcc-internal-format
msgid " overriding %q#D"
msgstr ""
#: cp/search.c:1859
+#, gcc-internal-format
msgid "invalid covariant return type for %q#D"
msgstr ""
#: cp/search.c:1864
+#, gcc-internal-format
msgid "conflicting return type specified for %q#D"
msgstr ""
#: cp/search.c:1875
+#, gcc-internal-format
msgid "looser throw specifier for %q#F"
msgstr ""
#: cp/search.c:1876
+#, gcc-internal-format
msgid " overriding %q#F"
msgstr ""
#. A static member function cannot match an inherited
#. virtual member function.
#: cp/search.c:1969
+#, gcc-internal-format
msgid "%q#D cannot be declared"
msgstr ""
#: cp/search.c:1970
+#, gcc-internal-format
msgid " since %q#D declared in base class"
msgstr ""
-#: cp/semantics.c:1199
-#, c-format
+#: cp/semantics.c:1226
+#, gcc-internal-format
msgid "type of asm operand %qE could not be determined"
msgstr ""
-#: cp/semantics.c:1318
+#: cp/semantics.c:1345
+#, gcc-internal-format
msgid "invalid use of member %qD in static member function"
msgstr ""
-#: cp/semantics.c:1322 cp/semantics.c:1361
+#: cp/semantics.c:1349 cp/semantics.c:1388
+#, gcc-internal-format
msgid "from this location"
msgstr ""
-#: cp/semantics.c:1360
+#: cp/semantics.c:1387
+#, gcc-internal-format
msgid "object missing in reference to %qD"
msgstr ""
-#: cp/semantics.c:1841
+#: cp/semantics.c:1877
+#, gcc-internal-format
msgid "arguments to destructor are not allowed"
msgstr ""
-#: cp/semantics.c:1891
+#: cp/semantics.c:1928
+#, gcc-internal-format
msgid "%<this%> is unavailable for static member functions"
msgstr ""
-#: cp/semantics.c:1897
+#: cp/semantics.c:1934
+#, gcc-internal-format
msgid "invalid use of %<this%> in non-member function"
msgstr ""
-#: cp/semantics.c:1899
+#: cp/semantics.c:1936
+#, gcc-internal-format
msgid "invalid use of %<this%> at top level"
msgstr ""
-#: cp/semantics.c:1923
+#: cp/semantics.c:1960
+#, gcc-internal-format
msgid "invalid qualifying scope in pseudo-destructor name"
msgstr ""
-#: cp/semantics.c:1943
+#: cp/semantics.c:1980
+#, gcc-internal-format
msgid "%qE is not of type %qT"
msgstr ""
-#: cp/semantics.c:2043
+#: cp/semantics.c:2080
+#, gcc-internal-format
msgid "template type parameters must use the keyword %<class%> or %<typename%>"
msgstr ""
-#: cp/semantics.c:2087
+#: cp/semantics.c:2124
+#, gcc-internal-format
msgid ""
"invalid use of type %qT as a default value for a template template-parameter"
msgstr ""
-#: cp/semantics.c:2090
+#: cp/semantics.c:2127
+#, gcc-internal-format
msgid "invalid use of %qD as a default value for a template template-parameter"
msgstr ""
-#: cp/semantics.c:2094
+#: cp/semantics.c:2131
+#, gcc-internal-format
msgid "invalid default argument for a template template parameter"
msgstr ""
-#: cp/semantics.c:2111
+#: cp/semantics.c:2148
+#, gcc-internal-format
msgid "definition of %q#T inside template parameter list"
msgstr ""
-#: cp/semantics.c:2122
+#: cp/semantics.c:2159
+#, gcc-internal-format
msgid "invalid definition of qualified type %qT"
msgstr ""
-#: cp/semantics.c:2338
+#: cp/semantics.c:2375
+#, gcc-internal-format
msgid "invalid base-class specification"
msgstr ""
-#: cp/semantics.c:2347
+#: cp/semantics.c:2384
+#, gcc-internal-format
msgid "base class %qT has cv qualifiers"
msgstr ""
-#: cp/semantics.c:2367
+#: cp/semantics.c:2404
+#, gcc-internal-format
msgid "incomplete type %qT used in nested name specifier"
msgstr ""
-#: cp/semantics.c:2370
+#: cp/semantics.c:2407
+#, gcc-internal-format
msgid "reference to %<%T::%D%> is ambiguous"
msgstr ""
-#: cp/semantics.c:2374 cp/typeck.c:1621
+#: cp/semantics.c:2411 cp/typeck.c:1625
+#, gcc-internal-format
msgid "%qD is not a member of %qT"
msgstr ""
-#: cp/semantics.c:2377
+#: cp/semantics.c:2414
+#, gcc-internal-format
msgid "%qD is not a member of %qD"
msgstr ""
-#: cp/semantics.c:2506
+#: cp/semantics.c:2543
+#, gcc-internal-format
msgid ""
"template parameter %qD of type %qT is not allowed in an integral constant "
"expression because it is not of integral or enumeration type"
msgstr ""
-#: cp/semantics.c:2660
+#: cp/semantics.c:2697
+#, gcc-internal-format
msgid "%qD cannot appear in a constant-expression"
msgstr ""
-#: cp/semantics.c:2668
+#: cp/semantics.c:2705
+#, gcc-internal-format
msgid "use of namespace %qD as expression"
msgstr ""
-#: cp/semantics.c:2673
+#: cp/semantics.c:2710
+#, gcc-internal-format
msgid "use of class template %qT as expression"
msgstr ""
#. Ambiguous reference to base members.
-#: cp/semantics.c:2679
+#: cp/semantics.c:2716
+#, gcc-internal-format
msgid "request for member %qD is ambiguous in multiple inheritance lattice"
msgstr ""
-#: cp/semantics.c:2752
-#, c-format
-msgid "use of %s from containing function"
+#: cp/semantics.c:2790
+#, gcc-internal-format
+msgid "use of %<auto%> variable from containing function"
msgstr ""
-#: cp/semantics.c:2755
+#: cp/semantics.c:2791
+#, gcc-internal-format
+msgid "use of parameter from containing function"
+msgstr ""
+
+#: cp/semantics.c:2792
+#, gcc-internal-format
msgid " %q#D declared here"
msgstr ""
-#: cp/semantics.c:2805
-#, c-format
+#: cp/semantics.c:2842
+#, gcc-internal-format
msgid "type of %qE is unknown"
msgstr ""
#: cp/tree.c:539
+#, gcc-internal-format
msgid "%qV qualifiers cannot be applied to %qT"
msgstr ""
#: cp/tree.c:1741
-#, c-format
+#, gcc-internal-format
msgid "%qE attribute can only be applied to Java class definitions"
msgstr ""
#: cp/tree.c:1770
-#, c-format
+#, gcc-internal-format
msgid "%qE attribute can only be applied to class definitions"
msgstr ""
-#: cp/tree.c:1775
-#, c-format
+#: cp/tree.c:1776
+#, gcc-internal-format
msgid "%qE is obsolete; g++ vtables are now COM-compatible by default"
msgstr ""
-#: cp/tree.c:1799
+#: cp/tree.c:1800
+#, gcc-internal-format
msgid "requested init_priority is not an integer constant"
msgstr ""
-#: cp/tree.c:1820
-#, c-format
+#: cp/tree.c:1821
+#, gcc-internal-format
msgid ""
"can only use %qE attribute on file-scope definitions of objects of class type"
msgstr ""
-#: cp/tree.c:1828
+#: cp/tree.c:1829
+#, gcc-internal-format
msgid "requested init_priority is out of range"
msgstr ""
-#: cp/tree.c:1838
+#: cp/tree.c:1839
+#, gcc-internal-format
msgid "requested init_priority is reserved for internal use"
msgstr ""
-#: cp/tree.c:1848
-#, c-format
+#: cp/tree.c:1849
+#, gcc-internal-format
msgid "%qE attribute is not supported on this platform"
msgstr ""
-#: cp/typeck.c:418 cp/typeck.c:432 cp/typeck.c:525
+#: cp/typeck.c:418 cp/typeck.c:432 cp/typeck.c:532
+#, gcc-internal-format
msgid "%s between distinct pointer types %qT and %qT lacks a cast"
msgstr ""
#: cp/typeck.c:494
+#, gcc-internal-format
msgid ""
"ISO C++ forbids %s between pointer of type %<void *%> and pointer-to-function"
msgstr ""
-#: cp/typeck.c:545
+#: cp/typeck.c:552
+#, gcc-internal-format
msgid "%s between distinct pointer-to-member types %qT and %qT lacks a cast"
msgstr ""
-#: cp/typeck.c:1239
-#, c-format
+#: cp/typeck.c:1241
+#, gcc-internal-format
msgid "invalid application of %qs to a member function"
msgstr ""
-#: cp/typeck.c:1272
-#, c-format
+#: cp/typeck.c:1276
+#, gcc-internal-format
msgid "invalid application of %qs to a bit-field"
msgstr ""
-#: cp/typeck.c:1277
-#, c-format
+#: cp/typeck.c:1281
+#, gcc-internal-format
msgid "ISO C++ forbids applying %qs to an expression of function type"
msgstr ""
-#: cp/typeck.c:1314
+#: cp/typeck.c:1318
+#, gcc-internal-format
msgid "invalid use of non-static member function"
msgstr ""
-#: cp/typeck.c:1481
+#: cp/typeck.c:1485
+#, gcc-internal-format
msgid "deprecated conversion from string constant to %qT'"
msgstr ""
-#: cp/typeck.c:1592 cp/typeck.c:1882
+#: cp/typeck.c:1596 cp/typeck.c:1890
+#, gcc-internal-format
msgid "request for member %qD in %qE, which is of non-class type %qT"
msgstr ""
-#: cp/typeck.c:1619
-#, c-format
+#: cp/typeck.c:1623
+#, gcc-internal-format
msgid "invalid use of nonstatic data member %qE"
msgstr ""
-#: cp/typeck.c:1671 cp/typeck.c:1699
+#: cp/typeck.c:1675 cp/typeck.c:1703
+#, gcc-internal-format
msgid "invalid access to non-static data member %qD of NULL object"
msgstr ""
-#: cp/typeck.c:1674 cp/typeck.c:1701
+#: cp/typeck.c:1678 cp/typeck.c:1705
+#, gcc-internal-format
msgid "(perhaps the %<offsetof%> macro was used incorrectly)"
msgstr ""
-#: cp/typeck.c:1812
+#: cp/typeck.c:1816
+#, gcc-internal-format
msgid "qualified type %qT does not match destructor name ~%qT"
msgstr ""
-#: cp/typeck.c:1818
+#: cp/typeck.c:1822
+#, gcc-internal-format
msgid "the type being destroyed is %qT, but the destructor refers to %qT"
msgstr ""
-#: cp/typeck.c:1928
+#: cp/typeck.c:1936
+#, gcc-internal-format
msgid "%<%D::%D%> is not a member of %qT"
msgstr ""
-#: cp/typeck.c:1939
+#: cp/typeck.c:1947
+#, gcc-internal-format
msgid "%qT is not a base of %qT"
msgstr ""
-#: cp/typeck.c:1958
+#: cp/typeck.c:1966
+#, gcc-internal-format
msgid "%qD has no member named %qE"
msgstr ""
-#: cp/typeck.c:1973
+#: cp/typeck.c:1981
+#, gcc-internal-format
msgid "%qD is not a member template function"
msgstr ""
#. A pointer to incomplete type (other than cv void) can be
#. dereferenced [expr.unary.op]/1
-#: cp/typeck.c:2080
+#: cp/typeck.c:2088
+#, gcc-internal-format
msgid "%qT is not a pointer-to-object type"
msgstr ""
-#: cp/typeck.c:2105
-#, c-format
+#: cp/typeck.c:2113
+#, gcc-internal-format
msgid "invalid use of %qs on pointer to member"
msgstr ""
-#: cp/typeck.c:2111
+#: cp/typeck.c:2119
+#, gcc-internal-format
msgid "invalid type argument"
msgstr ""
-#: cp/typeck.c:2134
+#: cp/typeck.c:2142
+#, gcc-internal-format
msgid "subscript missing in array reference"
msgstr ""
-#: cp/typeck.c:2216
+#: cp/typeck.c:2224
+#, gcc-internal-format
msgid "ISO C++ forbids subscripting non-lvalue array"
msgstr ""
-#: cp/typeck.c:2227
+#: cp/typeck.c:2235
+#, gcc-internal-format
msgid "subscripting array declared %<register%>"
msgstr ""
-#: cp/typeck.c:2310
-#, c-format
+#: cp/typeck.c:2318
+#, gcc-internal-format
msgid "object missing in use of %qE"
msgstr ""
-#: cp/typeck.c:2411
+#: cp/typeck.c:2432
+#, gcc-internal-format
msgid "ISO C++ forbids calling %<::main%> from within program"
msgstr ""
-#: cp/typeck.c:2436
+#: cp/typeck.c:2457
+#, gcc-internal-format
msgid ""
"must use %<.*%> or %<->*%> to call pointer-to-member function in %<%E (...)%>"
msgstr ""
-#: cp/typeck.c:2450
-#, c-format
+#: cp/typeck.c:2471
+#, gcc-internal-format
msgid "%qE cannot be used as a function"
msgstr ""
-#: cp/typeck.c:2529
+#: cp/typeck.c:2550
+#, gcc-internal-format
msgid "too many arguments to %s %q+#D"
msgstr ""
-#: cp/typeck.c:2531 cp/typeck.c:2634
+#: cp/typeck.c:2552 cp/typeck.c:2655
+#, gcc-internal-format
msgid "at this point in file"
msgstr ""
-#: cp/typeck.c:2534
+#: cp/typeck.c:2555
+#, gcc-internal-format
msgid "too many arguments to function"
msgstr ""
-#: cp/typeck.c:2568
+#: cp/typeck.c:2589
+#, gcc-internal-format
msgid "parameter %P of %qD has incomplete type %qT"
msgstr ""
-#: cp/typeck.c:2571
+#: cp/typeck.c:2592
+#, gcc-internal-format
msgid "parameter %P has incomplete type %qT"
msgstr ""
-#: cp/typeck.c:2632
+#: cp/typeck.c:2653
+#, gcc-internal-format
msgid "too few arguments to %s %q+#D"
msgstr ""
-#: cp/typeck.c:2637
+#: cp/typeck.c:2658
+#, gcc-internal-format
msgid "too few arguments to function"
msgstr ""
-#: cp/typeck.c:2784 cp/typeck.c:2794
+#: cp/typeck.c:2805 cp/typeck.c:2815
+#, gcc-internal-format
msgid "assuming cast to type %qT from overloaded function"
msgstr ""
-#: cp/typeck.c:2855
+#: cp/typeck.c:2876
+#, gcc-internal-format
msgid "division by zero in %<%E / 0%>"
msgstr ""
-#: cp/typeck.c:2857
+#: cp/typeck.c:2878
+#, gcc-internal-format
msgid "division by zero in %<%E / 0.%>"
msgstr ""
-#: cp/typeck.c:2891
+#: cp/typeck.c:2912
+#, gcc-internal-format
msgid "division by zero in %<%E %% 0%>"
msgstr ""
-#: cp/typeck.c:2893
+#: cp/typeck.c:2914
+#, gcc-internal-format
msgid "division by zero in %<%E %% 0.%>"
msgstr ""
-#: cp/typeck.c:2973
-#, c-format
+#: cp/typeck.c:2994
+#, gcc-internal-format
msgid "%s rotate count is negative"
msgstr ""
-#: cp/typeck.c:2976
-#, c-format
+#: cp/typeck.c:2997
+#, gcc-internal-format
msgid "%s rotate count >= width of type"
msgstr ""
-#: cp/typeck.c:3010 cp/typeck.c:3015 cp/typeck.c:3111 cp/typeck.c:3116
+#: cp/typeck.c:3031 cp/typeck.c:3036 cp/typeck.c:3132 cp/typeck.c:3137
+#, gcc-internal-format
msgid "ISO C++ forbids comparison between pointer and integer"
msgstr ""
-#: cp/typeck.c:3130
+#: cp/typeck.c:3151
+#, gcc-internal-format
msgid "unordered comparison on non-floating point argument"
msgstr ""
-#: cp/typeck.c:3152
+#: cp/typeck.c:3173
+#, gcc-internal-format
msgid "invalid operands of types %qT and %qT to binary %qO"
msgstr ""
-#: cp/typeck.c:3316
+#: cp/typeck.c:3337
+#, gcc-internal-format
msgid "comparison between types %q#T and %q#T"
msgstr ""
-#: cp/typeck.c:3352
+#: cp/typeck.c:3373
+#, gcc-internal-format
msgid "comparison between signed and unsigned integer expressions"
msgstr ""
@@ -15915,127 +21957,151 @@ msgstr ""
#. performed. Note that pointer-difference and pointer-addition
#. have already been handled above, and so we don't end up here in
#. that case.
-#: cp/typeck.c:3431
+#: cp/typeck.c:3452
+#, gcc-internal-format
msgid "NULL used in arithmetic"
msgstr ""
-#: cp/typeck.c:3489
+#: cp/typeck.c:3510
+#, gcc-internal-format
msgid "ISO C++ forbids using pointer of type %<void *%> in subtraction"
msgstr ""
-#: cp/typeck.c:3491
+#: cp/typeck.c:3512
+#, gcc-internal-format
msgid "ISO C++ forbids using pointer to a function in subtraction"
msgstr ""
-#: cp/typeck.c:3493
+#: cp/typeck.c:3514
+#, gcc-internal-format
msgid "ISO C++ forbids using pointer to a method in subtraction"
msgstr ""
-#: cp/typeck.c:3505
+#: cp/typeck.c:3526
+#, gcc-internal-format
msgid "invalid use of a pointer to an incomplete type in pointer arithmetic"
msgstr ""
-#: cp/typeck.c:3564
-#, c-format
+#: cp/typeck.c:3585
+#, gcc-internal-format
msgid ""
"invalid use of %qE to form a pointer-to-member-function. Use a qualified-id."
msgstr ""
-#: cp/typeck.c:3571
-#, c-format
+#: cp/typeck.c:3592
+#, gcc-internal-format
msgid ""
"parenthesis around %qE cannot be used to form a pointer-to-member-function"
msgstr ""
-#: cp/typeck.c:3594
+#: cp/typeck.c:3615
+#, gcc-internal-format
msgid "taking address of temporary"
msgstr ""
-#: cp/typeck.c:3829
-#, c-format
+#: cp/typeck.c:3849
+#, gcc-internal-format
msgid "ISO C++ forbids %sing an enum"
msgstr ""
-#: cp/typeck.c:3840
+#: cp/typeck.c:3860
+#, gcc-internal-format
msgid "cannot %s a pointer to incomplete type %qT"
msgstr ""
-#: cp/typeck.c:3846
+#: cp/typeck.c:3866
+#, gcc-internal-format
msgid "ISO C++ forbids %sing a pointer of type %qT"
msgstr ""
-#: cp/typeck.c:3871
+#: cp/typeck.c:3891
+#, gcc-internal-format
msgid "cast to non-reference type used as lvalue"
msgstr ""
-#: cp/typeck.c:3906
+#: cp/typeck.c:3926
+#, gcc-internal-format
msgid "invalid use of %<--%> on bool variable %qD"
msgstr ""
#. ARM $3.4
-#: cp/typeck.c:3935
+#: cp/typeck.c:3955
+#, gcc-internal-format
msgid "ISO C++ forbids taking address of function %<::main%>"
msgstr ""
#. An expression like &memfn.
-#: cp/typeck.c:3989
+#: cp/typeck.c:4009
+#, gcc-internal-format
msgid ""
"ISO C++ forbids taking the address of an unqualified or parenthesized non-"
"static member function to form a pointer to member function. Say %<&%T::%D%>"
msgstr ""
-#: cp/typeck.c:3994
+#: cp/typeck.c:4014
+#, gcc-internal-format
msgid ""
"ISO C++ forbids taking the address of a bound member function to form a "
"pointer to member function. Say %<&%T::%D%>"
msgstr ""
-#: cp/typeck.c:4022
+#: cp/typeck.c:4042
+#, gcc-internal-format
msgid "ISO C++ forbids taking the address of a cast to a non-lvalue expression"
msgstr ""
-#: cp/typeck.c:4042
+#: cp/typeck.c:4062
+#, gcc-internal-format
msgid "cannot create pointer to reference member %qD"
msgstr ""
-#: cp/typeck.c:4261
+#: cp/typeck.c:4276
+#, gcc-internal-format
msgid "cannot take the address of %<this%>, which is an rvalue expression"
msgstr ""
-#: cp/typeck.c:4284
+#: cp/typeck.c:4299
+#, gcc-internal-format
msgid "address of explicit register variable %qD requested"
msgstr ""
-#: cp/typeck.c:4289
+#: cp/typeck.c:4304
+#, gcc-internal-format
msgid "address requested for %qD, which is declared %<register%>"
msgstr ""
-#: cp/typeck.c:4355
-#, c-format
+#: cp/typeck.c:4370
+#, gcc-internal-format
msgid "%s expression list treated as compound expression"
msgstr ""
-#: cp/typeck.c:4430
+#: cp/typeck.c:4445
+#, gcc-internal-format
msgid "%s from type %qT to type %qT casts away constness"
msgstr ""
-#: cp/typeck.c:4729
+#: cp/typeck.c:4744
+#, gcc-internal-format
msgid "invalid static_cast from type %qT to type %qT"
msgstr ""
-#: cp/typeck.c:4751
+#: cp/typeck.c:4766
+#, gcc-internal-format
msgid "converting from %qT to %qT"
msgstr ""
-#: cp/typeck.c:4796
+#: cp/typeck.c:4811
+#, gcc-internal-format
msgid "invalid cast of an rvalue expression of type %qT to type %qT"
msgstr ""
-#: cp/typeck.c:4855
+#: cp/typeck.c:4870
+#, gcc-internal-format
msgid "cast from %qT to %qT loses precision"
msgstr ""
-#: cp/typeck.c:4880
+#: cp/typeck.c:4895
+#, gcc-internal-format
msgid "cast from %qT to %qT increases required alignment of target type"
msgstr ""
@@ -16043,972 +22109,825 @@ msgstr ""
#. where possible, and it is necessary in some cases. DR 195
#. addresses this issue, but as of 2004/10/26 is still in
#. drafting.
-#: cp/typeck.c:4894
+#: cp/typeck.c:4909
+#, gcc-internal-format
msgid ""
"ISO C++ forbids casting between pointer-to-function and pointer-to-object"
msgstr ""
-#: cp/typeck.c:4905
+#: cp/typeck.c:4920
+#, gcc-internal-format
msgid "invalid cast from type %qT to type %qT"
msgstr ""
-#: cp/typeck.c:4961
+#: cp/typeck.c:4976
+#, gcc-internal-format
msgid ""
"invalid use of const_cast with type %qT, which is not a pointer, reference, "
"nor a pointer-to-data-member type"
msgstr ""
-#: cp/typeck.c:4970
+#: cp/typeck.c:4985
+#, gcc-internal-format
msgid ""
"invalid use of const_cast with type %qT, which is a pointer or reference to "
"a function type"
msgstr ""
-#: cp/typeck.c:4992
+#: cp/typeck.c:5007
+#, gcc-internal-format
msgid "invalid const_cast of an rvalue of type %qT to type %qT"
msgstr ""
-#: cp/typeck.c:5035
+#: cp/typeck.c:5050
+#, gcc-internal-format
msgid "invalid const_cast from type %qT to type %qT"
msgstr ""
-#: cp/typeck.c:5103 cp/typeck.c:5108
+#: cp/typeck.c:5118 cp/typeck.c:5123
+#, gcc-internal-format
msgid "ISO C++ forbids casting to an array type %qT"
msgstr ""
-#: cp/typeck.c:5116
+#: cp/typeck.c:5131
+#, gcc-internal-format
msgid "invalid cast to function type %qT"
msgstr ""
-#: cp/typeck.c:5332
+#: cp/typeck.c:5347
+#, gcc-internal-format
msgid " in evaluation of %<%Q(%#T, %#T)%>"
msgstr ""
-#: cp/typeck.c:5401
+#: cp/typeck.c:5416
+#, gcc-internal-format
msgid "incompatible types in assignment of %qT to %qT"
msgstr ""
-#: cp/typeck.c:5408
+#: cp/typeck.c:5423
+#, gcc-internal-format
msgid "ISO C++ forbids assignment of arrays"
msgstr ""
-#: cp/typeck.c:5519
+#: cp/typeck.c:5541
+#, gcc-internal-format
msgid " in pointer to member function conversion"
msgstr ""
-#: cp/typeck.c:5525
-msgid " in pointer to member conversion"
-msgstr ""
-
-#. This is a reinterpret cast, we choose to do nothing.
-#: cp/typeck.c:5536 cp/typeck.c:5552
+#: cp/typeck.c:5552 cp/typeck.c:5578
+#, gcc-internal-format
msgid "pointer to member cast via virtual base %qT"
msgstr ""
#: cp/typeck.c:5555
+#, gcc-internal-format
msgid "pointer to member conversion via virtual base %qT"
msgstr ""
-#: cp/typeck.c:5628
+#: cp/typeck.c:5564
+#, gcc-internal-format
+msgid " in pointer to member conversion"
+msgstr ""
+
+#: cp/typeck.c:5652
+#, gcc-internal-format
msgid "invalid conversion to type %qT from type %qT"
msgstr ""
-#: cp/typeck.c:5846
+#: cp/typeck.c:5896
+#, gcc-internal-format
msgid "cannot convert %qT to %qT for argument %qP to %qD"
msgstr ""
-#: cp/typeck.c:5849
+#: cp/typeck.c:5899
+#, gcc-internal-format
msgid "cannot convert %qT to %qT in %s"
msgstr ""
-#: cp/typeck.c:5922 cp/typeck.c:5924
+#: cp/typeck.c:5972 cp/typeck.c:5974
+#, gcc-internal-format
msgid "in passing argument %P of %q+D"
msgstr ""
-#: cp/typeck.c:5974
+#: cp/typeck.c:6024
+#, gcc-internal-format
msgid "returning reference to temporary"
msgstr ""
-#: cp/typeck.c:5981
+#: cp/typeck.c:6031
+#, gcc-internal-format
msgid "reference to non-lvalue returned"
msgstr ""
-#: cp/typeck.c:5993
+#: cp/typeck.c:6043
+#, gcc-internal-format
msgid "reference to local variable %qD returned"
msgstr ""
-#: cp/typeck.c:5996
+#: cp/typeck.c:6046
+#, gcc-internal-format
msgid "address of local variable %qD returned"
msgstr ""
-#: cp/typeck.c:6026
+#: cp/typeck.c:6076
+#, gcc-internal-format
msgid "returning a value from a destructor"
msgstr ""
#. If a return statement appears in a handler of the
#. function-try-block of a constructor, the program is ill-formed.
-#: cp/typeck.c:6034
+#: cp/typeck.c:6084
+#, gcc-internal-format
msgid "cannot return from a handler of a function-try-block of a constructor"
msgstr ""
#. You can't return a value from a constructor.
-#: cp/typeck.c:6037
+#: cp/typeck.c:6087
+#, gcc-internal-format
msgid "returning a value from a constructor"
msgstr ""
-#: cp/typeck.c:6060
+#: cp/typeck.c:6110
+#, gcc-internal-format
msgid "return-statement with no value, in function returning %qT"
msgstr ""
-#: cp/typeck.c:6077
+#: cp/typeck.c:6127
+#, gcc-internal-format
msgid "return-statement with a value, in function returning 'void'"
msgstr ""
-#: cp/typeck.c:6108
+#: cp/typeck.c:6158
+#, gcc-internal-format
msgid ""
"%<operator new%> must not return NULL unless it is declared %<throw()%> (or -"
"fcheck-new is in effect)"
msgstr ""
#: cp/typeck2.c:52
+#, gcc-internal-format
msgid "type %qT is not a base type for type %qT"
msgstr ""
#: cp/typeck2.c:292
+#, gcc-internal-format
msgid "cannot declare variable %q+D to be of abstract type %qT"
msgstr ""
#: cp/typeck2.c:295
+#, gcc-internal-format
msgid "cannot declare parameter %q+D to be of abstract type %qT"
msgstr ""
#: cp/typeck2.c:298
+#, gcc-internal-format
msgid "cannot declare field %q+D to be of abstract type %qT"
msgstr ""
#: cp/typeck2.c:302
+#, gcc-internal-format
msgid "invalid abstract return type for member function %q+#D"
msgstr ""
#: cp/typeck2.c:305
+#, gcc-internal-format
msgid "invalid abstract return type for function %q+#D"
msgstr ""
#. Here we do not have location information, so use error instead
#. of cp_error_at.
#: cp/typeck2.c:310
+#, gcc-internal-format
msgid "invalid abstract type %qT for %qE"
msgstr ""
#: cp/typeck2.c:312
+#, gcc-internal-format
msgid "invalid abstract type for %q+D"
msgstr ""
#: cp/typeck2.c:315
+#, gcc-internal-format
msgid "cannot allocate an object of abstract type %qT"
msgstr ""
#: cp/typeck2.c:323
+#, gcc-internal-format
msgid "%J because the following virtual functions are pure within %qT:"
msgstr ""
#: cp/typeck2.c:327
+#, gcc-internal-format
msgid "%J\t%#D"
msgstr ""
#: cp/typeck2.c:334
+#, gcc-internal-format
msgid "%J since type %qT has pure virtual functions"
msgstr ""
#: cp/typeck2.c:582
+#, gcc-internal-format
msgid "constructor syntax used, but no constructor declared for type %qT"
msgstr ""
#: cp/typeck2.c:596
+#, gcc-internal-format
msgid "cannot initialize arrays using this syntax"
msgstr ""
#: cp/typeck2.c:688
+#, gcc-internal-format
msgid "initializing array with parameter list"
msgstr ""
#: cp/typeck2.c:710
+#, gcc-internal-format
msgid "int-array initialized from non-wide string"
msgstr ""
#: cp/typeck2.c:743
+#, gcc-internal-format
msgid "initializer for scalar variable requires one element"
msgstr ""
#: cp/typeck2.c:750
+#, gcc-internal-format
msgid "braces around scalar initializer for %qT"
msgstr ""
#: cp/typeck2.c:753
+#, gcc-internal-format
msgid "ignoring extra initializers for %qT"
msgstr ""
#: cp/typeck2.c:765
+#, gcc-internal-format
msgid "variable-sized object of type %qT may not be initialized"
msgstr ""
#: cp/typeck2.c:776
+#, gcc-internal-format
msgid "subobject of type %qT must be initialized by constructor, not by %qE"
msgstr ""
#: cp/typeck2.c:842
+#, gcc-internal-format
msgid "aggregate has a partly bracketed initializer"
msgstr ""
#: cp/typeck2.c:880 cp/typeck2.c:969
+#, gcc-internal-format
msgid "non-trivial labeled initializers"
msgstr ""
#: cp/typeck2.c:894
+#, gcc-internal-format
msgid "non-empty initializer for array of empty elements"
msgstr ""
#: cp/typeck2.c:1008 cp/typeck2.c:1023
+#, gcc-internal-format
msgid "missing initializer for member %qD"
msgstr ""
#: cp/typeck2.c:1013
+#, gcc-internal-format
msgid "uninitialized const member %qD"
msgstr ""
#: cp/typeck2.c:1015
+#, gcc-internal-format
msgid "member %qD with uninitialized const fields"
msgstr ""
#: cp/typeck2.c:1017
+#, gcc-internal-format
msgid "member %qD is uninitialized reference"
msgstr ""
#: cp/typeck2.c:1064
+#, gcc-internal-format
msgid "index value instead of field name in union initializer"
msgstr ""
#: cp/typeck2.c:1076
+#, gcc-internal-format
msgid "no field %qD in union being initialized"
msgstr ""
#: cp/typeck2.c:1084
+#, gcc-internal-format
msgid "union %qT with no named members cannot be initialized"
msgstr ""
#: cp/typeck2.c:1119
+#, gcc-internal-format
msgid "excess elements in aggregate initializer"
msgstr ""
#: cp/typeck2.c:1227
+#, gcc-internal-format
msgid "circular pointer delegation detected"
msgstr ""
#: cp/typeck2.c:1240
+#, gcc-internal-format
msgid "base operand of %<->%> has non-pointer type %qT"
msgstr ""
#: cp/typeck2.c:1264
+#, gcc-internal-format
msgid "result of %<operator->()%> yields non-pointer result"
msgstr ""
#: cp/typeck2.c:1266
+#, gcc-internal-format
msgid "base operand of %<->%> is not a pointer"
msgstr ""
#: cp/typeck2.c:1290
+#, gcc-internal-format
msgid "%qE cannot be used as a member pointer, since it is of type %qT"
msgstr ""
#: cp/typeck2.c:1299
+#, gcc-internal-format
msgid ""
"cannot apply member pointer %qE to %qE, which is of non-aggregate type %qT"
msgstr ""
#: cp/typeck2.c:1321
+#, gcc-internal-format
msgid "pointer to member type %qT incompatible with object type %qT"
msgstr ""
#: cp/typeck2.c:1544
+#, gcc-internal-format
msgid "call to function %qD which throws incomplete type %q#T"
msgstr ""
#: cp/typeck2.c:1547
+#, gcc-internal-format
msgid "call to function which throws incomplete type %q#T"
msgstr ""
-#. XXX Not i18n clean.
-#: cp/cp-tree.h:3885
-#, c-format
-msgid "%s is deprecated, please see the documentation for details"
-msgstr ""
-
#: fortran/f95-lang.c:240
+#, gcc-internal-format
msgid "Unexpected type in truthvalue_conversion"
msgstr ""
#: fortran/f95-lang.c:293
-#, c-format
+#, gcc-internal-format
msgid "can't open input file: %s"
msgstr ""
#: fortran/f95-lang.c:620
-#, c-format
+#, gcc-internal-format
msgid "global register variable %qs used in nested function"
msgstr ""
#: fortran/f95-lang.c:624
-#, c-format
+#, gcc-internal-format
msgid "register variable %qs used in nested function"
msgstr ""
#: fortran/f95-lang.c:631
-#, c-format
+#, gcc-internal-format
msgid "address of global register variable %qs requested"
msgstr ""
#: fortran/f95-lang.c:649
-#, c-format
+#, gcc-internal-format
msgid "address of register variable %qs requested"
msgstr ""
-#: fortran/gfortranspec.c:231
-#, c-format
-msgid "overflowed output arg list for '%s'"
-msgstr ""
-
-#: fortran/gfortranspec.c:375
-#, c-format
-msgid "argument to '%s' missing"
-msgstr ""
-
-#: fortran/gfortranspec.c:379
-msgid "no input files; unwilling to write output files"
-msgstr ""
-
-#: fortran/trans-array.c:2849
+#: fortran/trans-array.c:2860
+#, gcc-internal-format
msgid "Possible frontend bug: array constructor not expanded"
msgstr ""
-#: fortran/trans-array.c:3952
+#: fortran/trans-array.c:3983
+#, gcc-internal-format
msgid ""
"Possible frontend bug: Deferred array size without pointer or allocatable "
"attribute."
msgstr ""
-#: fortran/trans-array.c:4112
+#: fortran/trans-array.c:4144
+#, gcc-internal-format
msgid "scalar vector subscript???"
msgstr ""
-#: fortran/trans-array.c:4386
-#, c-format
+#: fortran/trans-array.c:4418
+#, gcc-internal-format
msgid "bad expression type during walk (%d)"
msgstr ""
-#: fortran/trans-const.c:328
-#, c-format
+#: fortran/trans-const.c:305
+#, gcc-internal-format
msgid "gfc_conv_constant_to_tree(): invalid type: %s"
msgstr ""
-#: fortran/trans-decl.c:780
+#: fortran/trans-decl.c:783
+#, gcc-internal-format
msgid "intrinsic variable which isn't a procedure"
msgstr ""
-#: fortran/trans-decl.c:1919
+#: fortran/trans-decl.c:2029
+#, gcc-internal-format
msgid "Function does not return a value"
msgstr ""
#. I don't think this should ever happen.
-#: fortran/trans-decl.c:2018
-#, c-format
+#: fortran/trans-decl.c:2127
+#, gcc-internal-format
msgid "module symbol %s in wrong namespace"
msgstr ""
-#: fortran/trans-decl.c:2032
-#, c-format
+#: fortran/trans-decl.c:2141
+#, gcc-internal-format
msgid "backend decl for module variable %s already exists"
msgstr ""
-#: fortran/trans-decl.c:2114
-#, c-format
+#: fortran/trans-decl.c:2223
+#, gcc-internal-format
msgid "unused parameter %qs"
msgstr ""
-#: fortran/trans-decl.c:2119
-#, c-format
+#: fortran/trans-decl.c:2228
+#, gcc-internal-format
msgid "unused variable %qs"
msgstr ""
-#: fortran/trans-decl.c:2260
+#: fortran/trans-decl.c:2382
+#, gcc-internal-format
msgid "Function return value not set"
msgstr ""
-#: fortran/trans-expr.c:948
+#: fortran/trans-expr.c:994
+#, gcc-internal-format
msgid "Unknown intrinsic op"
msgstr ""
-#: fortran/trans-intrinsic.c:583
-#, c-format
+#: fortran/trans-intrinsic.c:589
+#, gcc-internal-format
msgid "Intrinsic function %s(%d) not recognized"
msgstr ""
-#: fortran/trans-io.c:937
-#, c-format
-msgid "Bad namelist IO basetype (%d)"
-msgstr ""
-
-#: fortran/trans-io.c:1014
-msgid "A format cannot be specified with a namelist"
-msgstr ""
-
-#: fortran/trans-io.c:1312
-#, c-format
+#: fortran/trans-io.c:1399
+#, gcc-internal-format
msgid "Bad IO basetype (%d)"
msgstr ""
-#: fortran/trans-types.c:193
+#: fortran/trans-types.c:194
+#, gcc-internal-format
msgid "integer kind=8 not available for -fdefault-integer-8 option"
msgstr ""
-#: fortran/trans-types.c:205
+#: fortran/trans-types.c:206
+#, gcc-internal-format
msgid "real kind=8 not available for -fdefault-real-8 option"
msgstr ""
-#: fortran/trans-types.c:218
+#: fortran/trans-types.c:219
+#, gcc-internal-format
msgid "Use of -fdefault-double-8 requires -fdefault-real-8"
msgstr ""
-#: fortran/trans-types.c:927
+#: fortran/trans-types.c:931
+#, gcc-internal-format
msgid "Array element size too big"
msgstr ""
#: fortran/trans.c:621
+#, gcc-internal-format
msgid "gfc_trans_code(): Bad statement code"
msgstr ""
#. I changed this from sorry(...) because it should not return.
#. TODO: Remove gfc_todo_error before releasing version 1.0.
#: fortran/trans.h:569
+#, gcc-internal-format
msgid "gfc_todo: Not Implemented: "
msgstr ""
#: java/check-init.c:248
-#, c-format
+#, gcc-internal-format
msgid "Can't reassign a value to the final variable %qs"
msgstr ""
#: java/check-init.c:518 java/check-init.c:531
+#, gcc-internal-format
msgid "variable %qD may not have been initialized"
msgstr ""
#: java/check-init.c:946
-#, c-format
+#, gcc-internal-format
msgid "internal error in check-init: tree code not implemented: %s"
msgstr ""
#: java/check-init.c:1019
+#, gcc-internal-format
msgid "%Jfinal field %qD may not have been initialized"
msgstr ""
-#: java/class.c:746
+#: java/class.c:749
+#, gcc-internal-format
msgid "bad method signature"
msgstr ""
-#: java/class.c:790
+#: java/class.c:794
+#, gcc-internal-format
msgid "misplaced ConstantValue attribute (not in any field)"
msgstr ""
-#: java/class.c:792
-#, c-format
+#: java/class.c:797
+#, gcc-internal-format
msgid "duplicate ConstantValue attribute for field '%s'"
msgstr ""
-#: java/class.c:803
-#, c-format
+#: java/class.c:808
+#, gcc-internal-format
msgid "ConstantValue attribute of field '%s' has wrong type"
msgstr ""
-#: java/class.c:1099
-#, c-format
-msgid "field '%s' not found in class"
-msgstr ""
-
-#: java/class.c:1419
+#: java/class.c:1428
+#, gcc-internal-format
msgid "%Jabstract method in non-abstract class"
msgstr ""
-#: java/class.c:2370
+#: java/class.c:2357
+#, gcc-internal-format
msgid "%Jnon-static method '%D' overrides static method"
msgstr ""
-#: java/decl.c:1275
+#: java/decl.c:1303
+#, gcc-internal-format
msgid "%J'%D' used prior to declaration"
msgstr ""
-#: java/decl.c:1316
-#, c-format
+#: java/decl.c:1344
+#, gcc-internal-format
msgid "declaration of %qs shadows a parameter"
msgstr ""
-#: java/decl.c:1319
-#, c-format
+#: java/decl.c:1347
+#, gcc-internal-format
msgid "declaration of %qs shadows a symbol from the parameter list"
msgstr ""
-#: java/decl.c:1647
+#: java/decl.c:1675
+#, gcc-internal-format
msgid "%Jlabel '%D' used but not defined"
msgstr ""
-#: java/decl.c:1652
+#: java/decl.c:1680
+#, gcc-internal-format
msgid "%Jlabel '%D' defined but not used"
msgstr ""
-#: java/decl.c:1780
+#: java/decl.c:1808
+#, gcc-internal-format
msgid "%JIn %D: overlapped variable and exception ranges at %d"
msgstr ""
-#: java/decl.c:1844
+#: java/decl.c:1871
+#, gcc-internal-format
msgid "bad type in parameter debug info"
msgstr ""
-#: java/decl.c:1853
+#: java/decl.c:1880
+#, gcc-internal-format
msgid "%Jbad PC range for debug info for local '%D'"
msgstr ""
#: java/expr.c:376
-#, c-format
+#, gcc-internal-format
msgid "need to insert runtime check for %s"
msgstr ""
#: java/expr.c:505 java/expr.c:552
-#, c-format
+#, gcc-internal-format
msgid "assert: %s is assign compatible with %s"
msgstr ""
#: java/expr.c:672
+#, gcc-internal-format
msgid "stack underflow - dup* operation"
msgstr ""
#: java/expr.c:1688
-#, c-format
+#, gcc-internal-format
msgid "reference %qs is ambiguous: appears in interface %qs and interface %qs"
msgstr ""
#: java/expr.c:1716
-#, c-format
+#, gcc-internal-format
msgid "field %qs not found"
msgstr ""
-#: java/expr.c:2101
-#, c-format
+#: java/expr.c:2100
+#, gcc-internal-format
msgid "method '%s' not found in class"
msgstr ""
-#: java/expr.c:2306
-#, c-format
+#: java/expr.c:2305
+#, gcc-internal-format
msgid "failed to find class '%s'"
msgstr ""
-#: java/expr.c:2335
-#, c-format
+#: java/expr.c:2334
+#, gcc-internal-format
msgid "class '%s' has no method named '%s' matching signature '%s'"
msgstr ""
-#: java/expr.c:2366
+#: java/expr.c:2365
+#, gcc-internal-format
msgid "invokestatic on non static method"
msgstr ""
-#: java/expr.c:2371
+#: java/expr.c:2370
+#, gcc-internal-format
msgid "invokestatic on abstract method"
msgstr ""
-#: java/expr.c:2379
+#: java/expr.c:2378
+#, gcc-internal-format
msgid "invoke[non-static] on static method"
msgstr ""
-#: java/expr.c:2697
-#, c-format
+#: java/expr.c:2695
+#, gcc-internal-format
msgid "missing field '%s' in '%s'"
msgstr ""
-#: java/expr.c:2704
-#, c-format
+#: java/expr.c:2702
+#, gcc-internal-format
msgid "mismatching signature for field '%s' in '%s'"
msgstr ""
-#: java/expr.c:2726
+#: java/expr.c:2725
+#, gcc-internal-format
msgid "%Jassignment to final field '%D' not in field's class"
msgstr ""
-#: java/expr.c:2731
+#: java/expr.c:2730
+#, gcc-internal-format
msgid "%Jassignment to final static field %qD not in class initializer"
msgstr ""
-#: java/expr.c:2740
+#: java/expr.c:2739
+#, gcc-internal-format
msgid "%Jassignment to final field '%D' not in constructor"
msgstr ""
-#: java/expr.c:2930
+#: java/expr.c:2929
+#, gcc-internal-format
msgid "invalid PC in line number table"
msgstr ""
-#: java/expr.c:2986
-#, c-format
+#: java/expr.c:2985
+#, gcc-internal-format
msgid "unreachable bytecode from %d to before %d"
msgstr ""
-#: java/expr.c:3028
-#, c-format
+#: java/expr.c:3027
+#, gcc-internal-format
msgid "unreachable bytecode from %d to the end of the method"
msgstr ""
#. duplicate code from LOAD macro
-#: java/expr.c:3328
+#: java/expr.c:3327
+#, gcc-internal-format
msgid "unrecogized wide sub-instruction"
msgstr ""
-#: java/gjavah.c:701
+#: java/gjavah.c:712
+#, gcc-internal-format
msgid "static field has same name as method"
msgstr ""
-#. FIXME: i18n bug here. Order of prints should not be
-#. fixed.
-#: java/gjavah.c:899
-#, c-format
-msgid "ignored method '"
-msgstr ""
-
-#: java/gjavah.c:901
-#, c-format
-msgid "' marked virtual\n"
-msgstr ""
-
-#: java/gjavah.c:1249
-#, c-format
+#: java/gjavah.c:1260
+#, gcc-internal-format
msgid "couldn't find class %s"
msgstr ""
-#: java/gjavah.c:1256
-#, c-format
+#: java/gjavah.c:1267
+#, gcc-internal-format
msgid "parse error while reading %s"
msgstr ""
-#: java/gjavah.c:1482 java/gjavah.c:1584 java/gjavah.c:1659
-#, c-format
+#: java/gjavah.c:1493 java/gjavah.c:1595 java/gjavah.c:1670
+#, gcc-internal-format
msgid "unparseable signature: '%s'"
msgstr ""
-#: java/gjavah.c:2049
+#: java/gjavah.c:2060
+#, gcc-internal-format
msgid "Not a valid Java .class file."
msgstr ""
-#: java/gjavah.c:2057 java/jcf-parse.c:746
+#: java/gjavah.c:2068 java/jcf-parse.c:746
+#, gcc-internal-format
msgid "error while parsing constant pool"
msgstr ""
-#: java/gjavah.c:2063
-#, c-format
+#: java/gjavah.c:2074
+#, gcc-internal-format
msgid "error in constant pool entry #%d"
msgstr ""
-#: java/gjavah.c:2206
+#: java/gjavah.c:2217
+#, gcc-internal-format
msgid "class is of array type\n"
msgstr ""
-#: java/gjavah.c:2214
+#: java/gjavah.c:2225
+#, gcc-internal-format
msgid "base class is of array type"
msgstr ""
-#: java/gjavah.c:2330
-#, c-format
-msgid "Try 'gcjh --help' for more information.\n"
-msgstr ""
-
-#: java/gjavah.c:2337
-#, c-format
-msgid ""
-"Usage: gcjh [OPTION]... CLASS...\n"
-"\n"
-msgstr ""
-
-#: java/gjavah.c:2338
-#, c-format
-msgid ""
-"Generate C++ header files from .class files\n"
-"\n"
-msgstr ""
-
-#: java/gjavah.c:2339
-#, c-format
-msgid " -stubs Generate an implementation stub file\n"
-msgstr ""
-
-#: java/gjavah.c:2340
-#, c-format
-msgid " -jni Generate a JNI header or stub\n"
-msgstr ""
-
-#: java/gjavah.c:2342
-#, c-format
-msgid " -add TEXT Insert TEXT into class body\n"
-msgstr ""
-
-#: java/gjavah.c:2343
-#, c-format
-msgid " -append TEXT Insert TEXT after class declaration\n"
-msgstr ""
-
-#: java/gjavah.c:2344
-#, c-format
-msgid " -friend TEXT Insert TEXT as 'friend' declaration\n"
-msgstr ""
-
-#: java/gjavah.c:2345
-#, c-format
-msgid " -prepend TEXT Insert TEXT before start of class\n"
-msgstr ""
-
-#: java/gjavah.c:2347 java/jcf-dump.c:912
-#, c-format
-msgid " --classpath PATH Set path to find .class files\n"
-msgstr ""
-
-#: java/gjavah.c:2348 java/jcf-dump.c:913
-#, c-format
-msgid " -IDIR Append directory to class path\n"
-msgstr ""
-
-#: java/gjavah.c:2349 java/jcf-dump.c:914
-#, c-format
-msgid " --bootclasspath PATH Override built-in class path\n"
-msgstr ""
-
-#: java/gjavah.c:2350 java/jcf-dump.c:915
-#, c-format
-msgid " --extdirs PATH Set extensions directory path\n"
-msgstr ""
-
-#: java/gjavah.c:2351
-#, c-format
-msgid " -d DIRECTORY Set output directory name\n"
-msgstr ""
-
-#: java/gjavah.c:2352 java/jcf-dump.c:916 java/jv-scan.c:114
-#, c-format
-msgid " -o FILE Set output file name\n"
-msgstr ""
-
-#: java/gjavah.c:2353
-#, c-format
-msgid " -td DIRECTORY Set temporary directory name\n"
-msgstr ""
-
-#: java/gjavah.c:2355 java/jcf-dump.c:918 java/jv-scan.c:116
-#, c-format
-msgid " --help Print this help, then exit\n"
-msgstr ""
-
-#: java/gjavah.c:2356 java/jcf-dump.c:919 java/jv-scan.c:117
-#, c-format
-msgid " --version Print version number, then exit\n"
-msgstr ""
-
-#: java/gjavah.c:2357 java/jcf-dump.c:920
-#, c-format
-msgid " -v, --verbose Print extra information while running\n"
-msgstr ""
-
-#: java/gjavah.c:2359
-#, c-format
-msgid ""
-" -M Print all dependencies to stdout;\n"
-" suppress ordinary output\n"
-msgstr ""
-
-#: java/gjavah.c:2361
-#, c-format
-msgid ""
-" -MM Print non-system dependencies to stdout;\n"
-" suppress ordinary output\n"
-msgstr ""
-
-#: java/gjavah.c:2363
-#, c-format
-msgid " -MD Print all dependencies to stdout\n"
-msgstr ""
-
-#: java/gjavah.c:2364
-#, c-format
-msgid " -MMD Print non-system dependencies to stdout\n"
-msgstr ""
-
-#: java/gjavah.c:2367 java/jcf-dump.c:922 java/jv-scan.c:119
-#, c-format
-msgid ""
-"For bug reporting instructions, please see:\n"
-"%s.\n"
-msgstr ""
-
-#: java/gjavah.c:2395 java/gjavah.c:2509
+#: java/gjavah.c:2423 java/gjavah.c:2550
+#, gcc-internal-format
msgid "no classes specified"
msgstr ""
-#: java/gjavah.c:2488
+#: java/gjavah.c:2516
+#, gcc-internal-format
msgid "'-MG' option is unimplemented"
msgstr ""
-#: java/gjavah.c:2517
+#: java/gjavah.c:2558
+#, gcc-internal-format
msgid "can't specify both -o and -MD"
msgstr ""
-#: java/gjavah.c:2528
-#, c-format
-msgid "Processing %s\n"
-msgstr ""
-
-#: java/gjavah.c:2534
-#, c-format
+#: java/gjavah.c:2581
+#, gcc-internal-format
msgid "%s: no such class"
msgstr ""
-#: java/gjavah.c:2538
-#, c-format
-msgid "Found in %s\n"
-msgstr ""
-
-#: java/jcf-dump.c:829
-#, c-format
-msgid "Not a valid Java .class file.\n"
-msgstr ""
-
-#: java/jcf-dump.c:835
-#, c-format
-msgid "error while parsing constant pool\n"
-msgstr ""
-
-#: java/jcf-dump.c:841 java/jcf-parse.c:749
-#, c-format
-msgid "error in constant pool entry #%d\n"
-msgstr ""
-
-#: java/jcf-dump.c:851
-#, c-format
-msgid "error while parsing fields\n"
-msgstr ""
-
-#: java/jcf-dump.c:857
-#, c-format
-msgid "error while parsing methods\n"
-msgstr ""
-
-#: java/jcf-dump.c:863
-#, c-format
-msgid "error while parsing final attributes\n"
-msgstr ""
-
-#: java/jcf-dump.c:900
-#, c-format
-msgid "Try 'jcf-dump --help' for more information.\n"
-msgstr ""
-
-#: java/jcf-dump.c:907
-#, c-format
-msgid ""
-"Usage: jcf-dump [OPTION]... CLASS...\n"
-"\n"
-msgstr ""
-
-#: java/jcf-dump.c:908
-#, c-format
-msgid ""
-"Display contents of a class file in readable form.\n"
-"\n"
-msgstr ""
-
-#: java/jcf-dump.c:909
-#, c-format
-msgid " -c Disassemble method bodies\n"
-msgstr ""
-
-#: java/jcf-dump.c:910
-#, c-format
-msgid " --javap Generate output in 'javap' format\n"
-msgstr ""
-
-#: java/jcf-dump.c:947 java/jcf-dump.c:1015
-#, c-format
-msgid "jcf-dump: no classes specified\n"
-msgstr ""
-
-#: java/jcf-dump.c:1035
-#, c-format
-msgid "Cannot open '%s' for output.\n"
-msgstr ""
-
-#: java/jcf-dump.c:1081
-#, c-format
-msgid "bad format of .zip/.jar archive\n"
-msgstr ""
-
-#: java/jcf-dump.c:1199
-#, c-format
-msgid "Bad byte codes.\n"
-msgstr ""
-
#: java/jcf-io.c:536
-#, c-format
+#, gcc-internal-format
msgid ""
"source file for class %qs is newer than its matching class file. Source "
"file %qs used instead"
msgstr ""
#: java/jcf-parse.c:366
+#, gcc-internal-format
msgid "bad string constant"
msgstr ""
#: java/jcf-parse.c:384
-#, c-format
+#, gcc-internal-format
msgid "bad value constant type %d, index %d"
msgstr ""
#: java/jcf-parse.c:572
-#, c-format
+#, gcc-internal-format
msgid "can't reopen %s: %m"
msgstr ""
#: java/jcf-parse.c:579
-#, c-format
+#, gcc-internal-format
msgid "can't close %s: %m"
msgstr ""
#: java/jcf-parse.c:714 java/jcf-parse.c:720
-#, c-format
+#, gcc-internal-format
msgid "cannot find file for class %s"
msgstr ""
#: java/jcf-parse.c:743
+#, gcc-internal-format
msgid "not a valid Java .class file"
msgstr ""
#. FIXME - where was first time
#: java/jcf-parse.c:761
-#, c-format
+#, gcc-internal-format
msgid "reading class %s for the second time from %s"
msgstr ""
#: java/jcf-parse.c:779
+#, gcc-internal-format
msgid "error while parsing fields"
msgstr ""
#: java/jcf-parse.c:782
+#, gcc-internal-format
msgid "error while parsing methods"
msgstr ""
#: java/jcf-parse.c:785
+#, gcc-internal-format
msgid "error while parsing final attributes"
msgstr ""
#: java/jcf-parse.c:802
+#, gcc-internal-format
msgid ""
"the %<java.lang.Object%> that was found in %qs didn't have the special zero-"
"length %<gnu.gcj.gcj-compiled%> attribute. This generally means that your "
@@ -17017,188 +22936,93 @@ msgid ""
msgstr ""
#: java/jcf-parse.c:836
+#, gcc-internal-format
msgid "%Hduplicate class will only be compiled once"
msgstr ""
#: java/jcf-parse.c:890
+#, gcc-internal-format
msgid "missing Code attribute"
msgstr ""
#: java/jcf-parse.c:1157
+#, gcc-internal-format
msgid "no input file specified"
msgstr ""
#: java/jcf-parse.c:1192
-#, c-format
+#, gcc-internal-format
msgid "can't close input file %s: %m"
msgstr ""
#: java/jcf-parse.c:1239
-#, c-format
+#, gcc-internal-format
msgid "bad zip/jar file %s"
msgstr ""
#: java/jcf-parse.c:1460
-#, c-format
+#, gcc-internal-format
msgid "error while reading %s from zip file"
msgstr ""
-#: java/jcf-write.c:2667
-#, c-format
+#: java/jcf-write.c:2665
+#, gcc-internal-format
msgid ""
"internal error in generate_bytecode_insn - tree code not implemented: %s"
msgstr ""
-#: java/jcf-write.c:3041
+#: java/jcf-write.c:3039
+#, gcc-internal-format
msgid "field initializer type mismatch"
msgstr ""
-#: java/jcf-write.c:3498
-#, c-format
+#: java/jcf-write.c:3496
+#, gcc-internal-format
msgid "can't create directory %s: %m"
msgstr ""
-#: java/jcf-write.c:3531
-#, c-format
+#: java/jcf-write.c:3529
+#, gcc-internal-format
msgid "can't open %s for writing: %m"
msgstr ""
-#: java/jcf-write.c:3551
-#, c-format
+#: java/jcf-write.c:3549
+#, gcc-internal-format
msgid "can't create %s: %m"
msgstr ""
-#: java/jv-scan.c:99
-#, c-format
-msgid "Try 'jv-scan --help' for more information.\n"
-msgstr ""
-
-#: java/jv-scan.c:106
-#, c-format
-msgid ""
-"Usage: jv-scan [OPTION]... FILE...\n"
-"\n"
-msgstr ""
-
-#: java/jv-scan.c:107
-#, c-format
-msgid ""
-"Print useful information read from Java source files.\n"
-"\n"
-msgstr ""
-
-#: java/jv-scan.c:108
-#, c-format
-msgid " --no-assert Don't recognize the assert keyword\n"
-msgstr ""
-
-#: java/jv-scan.c:109
-#, c-format
-msgid " --complexity Print cyclomatic complexity of input file\n"
-msgstr ""
-
-#: java/jv-scan.c:110
-#, c-format
-msgid " --encoding NAME Specify encoding of input file\n"
-msgstr ""
-
-#: java/jv-scan.c:111
-#, c-format
-msgid " --print-main Print name of class containing 'main'\n"
-msgstr ""
-
-#: java/jv-scan.c:112
-#, c-format
-msgid " --list-class List all classes defined in file\n"
-msgstr ""
-
-#: java/jv-scan.c:113
-#, c-format
-msgid ""
-" --list-filename Print input filename when listing class names\n"
-msgstr ""
-
-#: java/jv-scan.c:190
+#: java/jv-scan.c:194
+#, gcc-internal-format
msgid "only one of '--print-main', '--list-class', and '--complexity' allowed"
msgstr ""
-#: java/jv-scan.c:193
-#, c-format
+#: java/jv-scan.c:197
+#, gcc-internal-format
msgid "can't open output file '%s'"
msgstr ""
-#: java/jv-scan.c:229
-#, c-format
+#: java/jv-scan.c:233
+#, gcc-internal-format
msgid "file not found '%s'"
msgstr ""
-#: java/jv-scan.c:251
-#, c-format
-msgid "%s: error: "
-msgstr ""
-
-#: java/jv-scan.c:263
-#, c-format
-msgid "%s: warning: "
-msgstr ""
-
-#: java/jvgenmain.c:48
-#, c-format
-msgid "Usage: %s [OPTIONS]... CLASSNAMEmain [OUTFILE]\n"
-msgstr ""
-
-#: java/jvgenmain.c:98
-#, c-format
-msgid "%s: Cannot open output file: %s\n"
-msgstr ""
-
-#: java/jvgenmain.c:135
-#, c-format
-msgid "%s: Failed to close output file %s\n"
-msgstr ""
-
-#: java/jvspec.c:420
-msgid "can't specify '-D' without '--main'\n"
-msgstr ""
-
-#: java/jvspec.c:423
-#, c-format
-msgid "'%s' is not a valid class name"
-msgstr ""
-
-#: java/jvspec.c:429
-msgid "--resource requires -o"
-msgstr ""
-
#: java/jvspec.c:436
+#, gcc-internal-format
msgid "warning: already-compiled .class files ignored with -C"
msgstr ""
-#: java/jvspec.c:443
-msgid "cannot specify both -C and -o"
-msgstr ""
-
-#: java/jvspec.c:455
-msgid "cannot create temporary file"
-msgstr ""
-
-#: java/jvspec.c:483
-msgid "using both @FILE with multiple files not implemented"
-msgstr ""
-
-#: java/jvspec.c:534
-msgid "cannot specify 'main' class when not linking"
-msgstr ""
-
-#: java/lang.c:621
+#: java/lang.c:624
+#, gcc-internal-format
msgid "can't do dependency tracking with input from stdin"
msgstr ""
-#: java/lang.c:637
+#: java/lang.c:640
+#, gcc-internal-format
msgid "couldn't determine target name for dependency tracking"
msgstr ""
#: java/lex.c:260
+#, gcc-internal-format
msgid ""
"unknown encoding: %qs\n"
"This might mean that your locale's encoding is not supported\n"
@@ -17208,1311 +23032,1129 @@ msgid ""
msgstr ""
#: java/lex.c:631
+#, gcc-internal-format
msgid "internal error - bad unget"
msgstr ""
-#: java/mangle.c:89
-#, c-format
-msgid "can't mangle %s"
-msgstr ""
-
#: java/mangle_name.c:140 java/mangle_name.c:210
+#, gcc-internal-format
msgid "internal error - invalid Utf8 name"
msgstr ""
-#: java/parse-scan.y:878
-#: java/parse.y:965
-#: java/parse.y:1306
-#: java/parse.y:1367
-#: java/parse.y:1575
-#: java/parse.y:1798
-#: java/parse.y:1807
-#: java/parse.y:1818
-#: java/parse.y:1829
-#: java/parse.y:1841
-#: java/parse.y:1856
-#: java/parse.y:1873
-#: java/parse.y:1875
-#: java/parse.y:1956
-#: java/parse.y:2133
-#: java/parse.y:2202
-#: java/parse.y:2366
-#: java/parse.y:2379
-#: java/parse.y:2386
-#: java/parse.y:2393
-#: java/parse.y:2404
-#: java/parse.y:2406
-#: java/parse.y:2444
-#: java/parse.y:2446
-#: java/parse.y:2448
-#: java/parse.y:2469
-#: java/parse.y:2471
-#: java/parse.y:2473
-#: java/parse.y:2489
-#: java/parse.y:2491
-#: java/parse.y:2512
-#: java/parse.y:2514
-#: java/parse.y:2516
-#: java/parse.y:2544
-#: java/parse.y:2546
-#: java/parse.y:2548
-#: java/parse.y:2550
-#: java/parse.y:2568
-#: java/parse.y:2570
-#: java/parse.y:2581
-#: java/parse.y:2592
-#: java/parse.y:2603
-#: java/parse.y:2614
-#: java/parse.y:2625
-#: java/parse.y:2638
-#: java/parse.y:2642
-#: java/parse.y:2644
-#: java/parse.y:2657
-msgid "Missing term"
-msgstr ""
-
-#: java/parse-scan.y:880
-#: java/parse.y:745
-#: java/parse.y:783
-#: java/parse.y:808
-#: java/parse.y:986
-#: java/parse.y:1341
-#: java/parse.y:1551
-#: java/parse.y:1553
-#: java/parse.y:1783
-#: java/parse.y:1809
-#: java/parse.y:1820
-#: java/parse.y:1831
-#: java/parse.y:1843
-#: java/parse.y:1858
-msgid "';' expected"
-msgstr ""
-
-#: java/parse-scan.y:1371
-#: java/parse.y:16331
-msgid "parse error"
-msgstr ""
-
-#: java/parse-scan.y:1373
-#: java/parse.y:16333
-msgid "parse error; also virtual memory exhausted"
-msgstr ""
-
-#: java/parse-scan.y:1375
-#: java/parse.y:16335
-msgid "parse error: cannot back up"
-msgstr ""
-
-#: java/parse.y:743
-#: java/parse.y:781
-msgid "Missing name"
-msgstr ""
-
-#: java/parse.y:771
-#, c-format
+#: java/parse.y:765
+#, gcc-internal-format
msgid "Ambiguous class: %qs and %qs"
msgstr ""
-#: java/parse.y:806
-msgid "'*' expected"
-msgstr ""
-
-#: java/parse.y:820
-msgid "Class or interface declaration expected"
-msgstr ""
-
-#: java/parse.y:837
-#, c-format
+#: java/parse.y:831
+#, gcc-internal-format
msgid "Modifier %qs declared twice"
msgstr ""
-#: java/parse.y:857
-#: java/parse.y:859
-msgid "Missing class name"
-msgstr ""
-
-#: java/parse.y:862
-#: java/parse.y:866
-#: java/parse.y:874
-#: java/parse.y:1026
-#: java/parse.y:1287
-#: java/parse.y:1289
-#: java/parse.y:1618
-#: java/parse.y:1869
-#: java/parse.y:1901
-#: java/parse.y:1963
-msgid "'{' expected"
-msgstr ""
-
-#: java/parse.y:876
-msgid "Missing super class name"
-msgstr ""
-
-#: java/parse.y:886
-#: java/parse.y:902
-msgid "Missing interface name"
-msgstr ""
-
-#: java/parse.y:980
-msgid "Missing variable initializer"
-msgstr ""
-
-#: java/parse.y:997
-msgid "Invalid declaration"
-msgstr ""
-
-#: java/parse.y:1000
-#: java/parse.y:1085
-#: java/parse.y:2148
-#: java/parse.y:2177
-#: java/parse.y:2199
-#: java/parse.y:2203
-#: java/parse.y:2238
-#: java/parse.y:2317
-#: java/parse.y:2327
-#: java/parse.y:2337
-msgid "']' expected"
-msgstr ""
-
-#: java/parse.y:1004
-msgid "Unbalanced ']'"
-msgstr ""
-
-#: java/parse.y:1040
-msgid "Invalid method declaration, method name required"
-msgstr ""
-
-#: java/parse.y:1045
-#: java/parse.y:1050
-#: java/parse.y:1055
-#: java/parse.y:2051
-msgid "Identifier expected"
-msgstr ""
-
-#: java/parse.y:1060
-#: java/parse.y:4717
-msgid "Invalid method declaration, return type required"
-msgstr ""
-
-#: java/parse.y:1080
+#: java/parse.y:1074
+#, gcc-internal-format
msgid "Discouraged form of returned type specification"
msgstr ""
-#: java/parse.y:1083
-#: java/parse.y:1531
-#: java/parse.y:1538
-#: java/parse.y:1547
-#: java/parse.y:1549
-#: java/parse.y:1577
-#: java/parse.y:1686
-#: java/parse.y:1993
-#: java/parse.y:2046
-msgid "')' expected"
-msgstr ""
-
-#: java/parse.y:1099
-msgid "Missing formal parameter term"
-msgstr ""
-
-#: java/parse.y:1114
-#: java/parse.y:1119
-msgid "Missing identifier"
-msgstr ""
-
-#: java/parse.y:1139
-#: java/parse.y:1148
-msgid "Missing class type term"
-msgstr ""
-
-#: java/parse.y:1175
-#, c-format
+#: java/parse.y:1169
+#, gcc-internal-format
msgid ""
"Can't define static initializer in class %qs. Static initializer can only be "
"defined in top-level classes"
msgstr ""
-#: java/parse.y:1304
-msgid "Invalid interface type"
-msgstr ""
-
-#: java/parse.y:1470
+#: java/parse.y:1464
+#, gcc-internal-format
msgid "An empty declaration is a deprecated feature that should not be used"
msgstr ""
-#: java/parse.y:1491
-#: java/parse.y:1665
-#: java/parse.y:1667
-msgid "':' expected"
-msgstr ""
-
-#: java/parse.y:1517
-#: java/parse.y:1522
-#: java/parse.y:1527
-msgid "Invalid expression statement"
-msgstr ""
-
-#: java/parse.y:1545
-#: java/parse.y:1573
-#: java/parse.y:1614
-#: java/parse.y:1682
-#: java/parse.y:1750
-#: java/parse.y:1871
-#: java/parse.y:1949
-#: java/parse.y:2040
-#: java/parse.y:2042
-#: java/parse.y:2055
-#: java/parse.y:2298
-#: java/parse.y:2300
-msgid "'(' expected"
-msgstr ""
-
-#: java/parse.y:1616
-msgid "Missing term or ')'"
-msgstr ""
-
-#: java/parse.y:1663
-msgid "Missing or invalid constant expression"
-msgstr ""
-
-#: java/parse.y:1684
-msgid "Missing term and ')' expected"
-msgstr ""
-
-#: java/parse.y:1723
-msgid "Invalid control expression"
-msgstr ""
-
-#: java/parse.y:1725
-#: java/parse.y:1727
-msgid "Invalid update expression"
-msgstr ""
-
-#: java/parse.y:1752
-msgid "Invalid init statement"
-msgstr ""
-
-#: java/parse.y:1952
-msgid "Missing term or ')' expected"
-msgstr ""
-
-#: java/parse.y:1995
-msgid "'class' or 'this' expected"
-msgstr ""
-
-#: java/parse.y:1997
-#: java/parse.y:1999
-msgid "'class' expected"
-msgstr ""
-
-#: java/parse.y:2044
-msgid "')' or term expected"
-msgstr ""
-
-#: java/parse.y:2146
-#: java/parse.y:2175
-msgid "'[' expected"
-msgstr ""
-
-#: java/parse.y:2253
-msgid "Field expected"
-msgstr ""
-
-#: java/parse.y:2312
-#: java/parse.y:2322
-#: java/parse.y:2332
-msgid "Missing term and ']' expected"
-msgstr ""
-
-#: java/parse.y:2437
-msgid "']' expected, invalid type expression"
-msgstr ""
-
-#: java/parse.y:2440
-msgid "Invalid type expression"
-msgstr ""
-
-#: java/parse.y:2552
-msgid "Invalid reference type"
-msgstr ""
-
-#: java/parse.y:3019
-msgid "Constructor invocation must be first thing in a constructor"
-msgstr ""
-
-#: java/parse.y:3021
-msgid "Only constructors can invoke constructors"
-msgstr ""
-
-#: java/parse.y:3029
-#, c-format
+#: java/parse.y:3027
+#, gcc-internal-format
msgid ": %qs JDK1.1(TM) feature"
msgstr ""
-#: java/parse.y:3109
-#: java/parse.y:3111
-#, c-format
+#: java/parse.y:3107 java/parse.y:3109
+#, gcc-internal-format
msgid ""
"%s.\n"
"%s"
msgstr ""
-#: java/parse.y:3270
+#: java/parse.y:3268
+#, gcc-internal-format
msgid "Missing return statement"
msgstr ""
-#: java/parse.y:3292
-#: java/parse.y:11882
-#: java/parse.y:11886
+#: java/parse.y:3290 java/parse.y:11969
+#: java/parse.y:11973
+#, gcc-internal-format
msgid "Unreachable statement"
msgstr ""
-#: java/parse.y:3302
+#: java/parse.y:3300
+#, gcc-internal-format
msgid "Can't access %s field %<%s.%s%> from %qs"
msgstr ""
-#: java/parse.y:3371
-#, c-format
+#: java/parse.y:3369
+#, gcc-internal-format
msgid "%s %qs already defined in %s:%d"
msgstr ""
-#: java/parse.y:3389
+#: java/parse.y:3387
+#, gcc-internal-format
msgid ""
"Variable %qs is already defined in this method and was declared %<%s %s%> at "
"line %d"
msgstr ""
-#: java/parse.y:3500
-#, c-format
+#: java/parse.y:3498
+#, gcc-internal-format
msgid "Interface %qs repeated"
msgstr ""
-#: java/parse.y:3530
-#, c-format
+#: java/parse.y:3528
+#, gcc-internal-format
msgid "%s name %qs clashes with imported type %qs"
msgstr ""
-#: java/parse.y:3562
+#: java/parse.y:3560
+#, gcc-internal-format
msgid "Public %s %qs must be defined in a file called %<%s.java%>"
msgstr ""
-#: java/parse.y:3577
-#, c-format
+#: java/parse.y:3575
+#, gcc-internal-format
msgid ""
"Inner class %qs can't be static. Static classes can only occur in interfaces "
"and top-level classes"
msgstr ""
-#: java/parse.y:3658
-#, c-format
+#: java/parse.y:3656
+#, gcc-internal-format
msgid ""
"The class name %qs is already defined in this scope. An inner class may not "
"have the same simple name as any of its enclosing classes"
msgstr ""
-#: java/parse.y:3700
+#: java/parse.y:3698
+#, gcc-internal-format
msgid "Qualifier must be a reference"
msgstr ""
-#: java/parse.y:3721
-#, c-format
+#: java/parse.y:3719
+#, gcc-internal-format
msgid "Cyclic inheritance involving %s"
msgstr ""
-#: java/parse.y:3981
+#: java/parse.y:3979
+#, gcc-internal-format
msgid ""
"Redundant use of %<abstract%> modifier. Interface %qs is implicitly abstract"
msgstr ""
-#: java/parse.y:4136
-#, c-format
+#: java/parse.y:4134
+#, gcc-internal-format
msgid "Class %qs can't be declared both abstract and final"
msgstr ""
-#: java/parse.y:4148
+#: java/parse.y:4146
+#, gcc-internal-format
msgid "%<java.lang.Object%> can't extend anything"
msgstr ""
-#: java/parse.y:4385
+#: java/parse.y:4389
+#, gcc-internal-format
msgid "Duplicate variable declaration: %<%s %s%> was %<%s %s%> (%s:%d)"
msgstr ""
-#: java/parse.y:4449
-#, c-format
+#: java/parse.y:4453
+#, gcc-internal-format
msgid "Field %qs can't be static in inner class %qs unless it is final"
msgstr ""
-#: java/parse.y:4692
-#, c-format
+#: java/parse.y:4696
+#, gcc-internal-format
msgid "Class %qs must be declared abstract to define abstract method %qs"
msgstr ""
-#: java/parse.y:4699
-#, c-format
+#: java/parse.y:4703
+#, gcc-internal-format
msgid "native method %qs can't be strictfp"
msgstr ""
-#: java/parse.y:4703
-#, c-format
+#: java/parse.y:4707
+#, gcc-internal-format
msgid "method %qs can't be transient"
msgstr ""
-#: java/parse.y:4706
-#, c-format
+#: java/parse.y:4710
+#, gcc-internal-format
msgid "method %qs can't be volatile"
msgstr ""
-#: java/parse.y:4756
-#: java/parse.y:6497
-#, c-format
+#: java/parse.y:4760 java/parse.y:6489
+#, gcc-internal-format
msgid ""
"Method %qs can't be static in inner class %qs. Only members of interfaces "
"and top-level classes can be static"
msgstr ""
-#: java/parse.y:4911
-#, c-format
+#: java/parse.y:4915
+#, gcc-internal-format
msgid "%s method %qs can't have a body defined"
msgstr ""
-#: java/parse.y:4922
-#, c-format
+#: java/parse.y:4926
+#, gcc-internal-format
msgid "Non native and non abstract method %qs must have a body defined"
msgstr ""
-#: java/parse.y:4992
-#, c-format
+#: java/parse.y:4996
+#, gcc-internal-format
msgid "%s: recursive invocation of constructor %qs"
msgstr ""
-#: java/parse.y:5022
+#: java/parse.y:5026
+#, gcc-internal-format
msgid ""
"Inconsistent member declaration. At most one of %<public%>, %<private%>, or "
"%<protected%> may be specified"
msgstr ""
-#: java/parse.y:5030
+#: java/parse.y:5034
+#, gcc-internal-format
msgid ""
"Inconsistent member declaration. At most one of %<final%> or %<volatile%> "
"may be specified"
msgstr ""
-#: java/parse.y:5120
-#, c-format
+#: java/parse.y:5124
+#, gcc-internal-format
msgid "Variable %qs is used more than once in the argument list of method %qs"
msgstr ""
-#: java/parse.y:5204
-#, c-format
+#: java/parse.y:5208
+#, gcc-internal-format
msgid "%s %qs can't implement/extend %s %qs"
msgstr ""
-#: java/parse.y:5238
-#, c-format
+#: java/parse.y:5242
+#, gcc-internal-format
msgid "Class %qs can't subclass %s %qs"
msgstr ""
-#: java/parse.y:5247
-#, c-format
+#: java/parse.y:5251
+#, gcc-internal-format
msgid "Can't subclass final classes: %s"
msgstr ""
-#: java/parse.y:5433
-#, c-format
+#: java/parse.y:5437
+#, gcc-internal-format
msgid "Cyclic class inheritance%s"
msgstr ""
-#: java/parse.y:6148
-#, c-format
+#: java/parse.y:6140
+#, gcc-internal-format
msgid "Superclass %qs of class %qs not found"
msgstr ""
-#: java/parse.y:6154
-#, c-format
+#: java/parse.y:6146
+#, gcc-internal-format
msgid "Type %qs not found in declaration of field %qs"
msgstr ""
-#: java/parse.y:6160
-#, c-format
+#: java/parse.y:6152
+#, gcc-internal-format
msgid "Type %qs not found in the declaration of the argument %qs of method %qs"
msgstr ""
-#: java/parse.y:6167
-#, c-format
+#: java/parse.y:6159
+#, gcc-internal-format
msgid "Type %qs not found in the declaration of the return type of method %qs"
msgstr ""
-#: java/parse.y:6173
-#, c-format
+#: java/parse.y:6165
+#, gcc-internal-format
msgid "Superinterface %qs of %s %qs not found"
msgstr ""
-#: java/parse.y:6180
-#, c-format
+#: java/parse.y:6172
+#, gcc-internal-format
msgid "Type %qs not found in the declaration of the local variable %qs"
msgstr ""
-#: java/parse.y:6187
+#: java/parse.y:6179
+#, gcc-internal-format
msgid "Class %qs not found in %<throws%>"
msgstr ""
-#: java/parse.y:6244
-#, c-format
+#: java/parse.y:6236
+#, gcc-internal-format
msgid "Duplicate %s declaration %qs"
msgstr ""
-#: java/parse.y:6318
+#: java/parse.y:6310
+#, gcc-internal-format
msgid ""
"Class %qs doesn't define the abstract method %<%s %s%> from %s %<%s%>. This "
"method must be defined or %s %qs must be declared abstract"
msgstr ""
-#: java/parse.y:6474
+#: java/parse.y:6466
+#, gcc-internal-format
msgid ""
"Class %qs in %<throws%> clause must be a subclass of class %<java.lang."
"Throwable%>"
msgstr ""
-#: java/parse.y:6518
-#, c-format
+#: java/parse.y:6510
+#, gcc-internal-format
msgid ""
"Class %qs must override %qs with a public method in order to implement "
"interface %qs"
msgstr ""
-#: java/parse.y:6532
-#: java/parse.y:6755
-#, c-format
+#: java/parse.y:6524 java/parse.y:6747
+#, gcc-internal-format
msgid "Method %qs was defined with return type %qs in class %qs"
msgstr ""
-#: java/parse.y:6549
-#, c-format
+#: java/parse.y:6541
+#, gcc-internal-format
msgid "%s methods can't be overridden. Method %qs is %s in class %qs"
msgstr ""
-#: java/parse.y:6563
-#, c-format
+#: java/parse.y:6555
+#, gcc-internal-format
msgid ""
"Instance methods can't be overridden by a static method. Method %qs is an "
"instance method in class %qs"
msgstr ""
-#: java/parse.y:6586
-#, c-format
+#: java/parse.y:6578
+#, gcc-internal-format
msgid ""
"Methods can't be overridden to be more private. Method %qs is not %s in "
"class %qs"
msgstr ""
-#: java/parse.y:6723
+#: java/parse.y:6715
+#, gcc-internal-format
msgid ""
"Invalid checked exception class %qs in %<throws%> clause. The exception "
"must be a subclass of an exception thrown by %qs from class %qs"
msgstr ""
-#: java/parse.y:6780
-#, c-format
+#: java/parse.y:6772
+#, gcc-internal-format
msgid ""
"Interface %qs inherits method %qs from interface %qs. This method is "
"redefined with a different return type in interface %qs"
msgstr ""
-#: java/parse.y:6955
-#, c-format
+#: java/parse.y:6947
+#, gcc-internal-format
msgid "Class or interface %qs not found in import"
msgstr ""
-#: java/parse.y:7040
-#, c-format
+#: java/parse.y:7036
+#, gcc-internal-format
msgid "malformed .zip archive in CLASSPATH: %s"
msgstr ""
-#: java/parse.y:7111
-#, c-format
+#: java/parse.y:7107
+#, gcc-internal-format
msgid ""
"Can't find default package %qs. Check the CLASSPATH environment variable and "
"the access to the archives"
msgstr ""
-#: java/parse.y:7116
-#, c-format
+#: java/parse.y:7112
+#, gcc-internal-format
msgid "Package %qs not found in import"
msgstr ""
#: java/parse.y:7213
-#, c-format
+#, gcc-internal-format
msgid "Type %qs also potentially defined in package %qs"
msgstr ""
-#: java/parse.y:7358
-#, c-format
+#: java/parse.y:7337
+#, gcc-internal-format
msgid "Nested %s %s is %s; cannot be accessed from here"
msgstr ""
-#: java/parse.y:7396
-#, c-format
+#: java/parse.y:7375
+#, gcc-internal-format
msgid ""
"Can't access %s %qs. Only public classes and interfaces in other packages "
"can be accessed"
msgstr ""
-#: java/parse.y:7434
+#: java/parse.y:7413
+#, gcc-internal-format
msgid "Only %<final%> is allowed as a local variables modifier"
msgstr ""
-#: java/parse.y:8974
-#, c-format
+#: java/parse.y:9046
+#, gcc-internal-format
msgid "No constructor matching %qs found in class %qs"
msgstr ""
-#: java/parse.y:9472
-#, c-format
+#: java/parse.y:9544
+#, gcc-internal-format
msgid "Can't reference %qs before the superclass constructor has been called"
msgstr ""
-#: java/parse.y:9526
-#, c-format
+#: java/parse.y:9598
+#, gcc-internal-format
msgid ""
"Local variable %qs can't be accessed from within the inner class %qs unless "
"it is declared final"
msgstr ""
-#: java/parse.y:9531
-#: java/parse.y:9993
-#, c-format
+#: java/parse.y:9603 java/parse.y:10061
+#, gcc-internal-format
msgid "Undefined variable %qs"
msgstr ""
-#: java/parse.y:9542
-#, c-format
+#: java/parse.y:9614
+#, gcc-internal-format
msgid "Can't make a static reference to nonstatic variable %qs in class %qs"
msgstr ""
-#: java/parse.y:9747
-#: java/parse.y:10602
-#, c-format
+#: java/parse.y:9815 java/parse.y:10689
+#, gcc-internal-format
msgid "No enclosing instance for inner class %qs is in scope%s"
msgstr ""
-#: java/parse.y:9866
-#: java/parse.y:12301
+#: java/parse.y:9934 java/parse.y:12388
+#, gcc-internal-format
msgid "Keyword %<this%> used outside allowed context"
msgstr ""
-#: java/parse.y:9872
-#: java/parse.y:10756
+#: java/parse.y:9940 java/parse.y:10843
+#, gcc-internal-format
msgid ""
"Can't reference %<this%> before the superclass constructor has been called"
msgstr ""
-#: java/parse.y:9888
+#: java/parse.y:9956
+#, gcc-internal-format
msgid ""
"Can't use variable %<%s.this%>: type %qs isn't an outer type of type %qs"
msgstr ""
-#: java/parse.y:9921
+#: java/parse.y:9989
+#, gcc-internal-format
msgid "Keyword %<super%> used outside allowed context"
msgstr ""
-#: java/parse.y:9970
-#, c-format
+#: java/parse.y:10038
+#, gcc-internal-format
msgid "No variable %qs defined in class %qs"
msgstr ""
-#: java/parse.y:9975
-#, c-format
+#: java/parse.y:10043
+#, gcc-internal-format
msgid "Undefined variable or class name: %qs"
msgstr ""
-#: java/parse.y:10046
-#, c-format
+#: java/parse.y:10125
+#, gcc-internal-format
msgid "Can't use type %qs as a qualifier"
msgstr ""
-#: java/parse.y:10065
+#: java/parse.y:10144
+#, gcc-internal-format
msgid "Attempt to reference field %qs in %<%s %s%>"
msgstr ""
-#: java/parse.y:10096
-#, c-format
+#: java/parse.y:10175
+#, gcc-internal-format
msgid "No variable %qs defined in type %qs"
msgstr ""
-#: java/parse.y:10180
+#: java/parse.y:10267
+#, gcc-internal-format
msgid "Attempt to reference field %<new%> in a %qs"
msgstr ""
-#: java/parse.y:10317
-#, c-format
+#: java/parse.y:10404
+#, gcc-internal-format
msgid "The class %qs has been deprecated"
msgstr ""
-#: java/parse.y:10327
-#, c-format
+#: java/parse.y:10414
+#, gcc-internal-format
msgid "The %s %qs in class %qs has been deprecated"
msgstr ""
-#: java/parse.y:10444
-#, c-format
+#: java/parse.y:10531
+#, gcc-internal-format
msgid "Can't invoke a method on primitive type %qs"
msgstr ""
-#: java/parse.y:10459
-#, c-format
+#: java/parse.y:10546
+#, gcc-internal-format
msgid "Can't make static reference to method %qs in interface %qs"
msgstr ""
-#: java/parse.y:10469
-#: java/parse.y:10803
+#: java/parse.y:10556 java/parse.y:10890
+#, gcc-internal-format
msgid "Can't make static reference to method %<%s %s%> in class %qs"
msgstr ""
-#: java/parse.y:10509
+#: java/parse.y:10596
+#, gcc-internal-format
msgid "Can't invoke super constructor on java.lang.Object"
msgstr ""
-#: java/parse.y:10522
-#: java/parse.y:14359
-#, c-format
+#: java/parse.y:10609 java/parse.y:14447
+#, gcc-internal-format
msgid "Class %qs not found in type declaration"
msgstr ""
-#: java/parse.y:10534
-#, c-format
+#: java/parse.y:10621
+#, gcc-internal-format
msgid "Class %qs is an abstract class. It can't be instantiated"
msgstr ""
-#: java/parse.y:10564
-#, c-format
+#: java/parse.y:10651
+#, gcc-internal-format
msgid "No method named %qs in scope"
msgstr ""
-#: java/parse.y:10675
+#: java/parse.y:10762
+#, gcc-internal-format
msgid "Can't access %s %s %<%s.%s%> from %qs"
msgstr ""
-#: java/parse.y:11149
+#: java/parse.y:11236
+#, gcc-internal-format
msgid "Can't find %s %<%s(%s)%> in type %qs%s"
msgstr ""
-#: java/parse.y:11728
+#: java/parse.y:11815
+#, gcc-internal-format
msgid "Constant expression required"
msgstr ""
-#: java/parse.y:11741
+#: java/parse.y:11828
+#, gcc-internal-format
msgid "Incompatible type for case. Can't convert %qs to %<int%>"
msgstr ""
-#: java/parse.y:11775
+#: java/parse.y:11862
+#, gcc-internal-format
msgid "Duplicate case label: %<default%>"
msgstr ""
-#: java/parse.y:12115
+#: java/parse.y:12202
+#, gcc-internal-format
msgid "Incompatible type for %<+=%>. Can't convert %qs to %<java.lang.String%>"
msgstr ""
-#: java/parse.y:12281
-#, c-format
+#: java/parse.y:12368
+#, gcc-internal-format
msgid "missing static field %qs"
msgstr ""
-#: java/parse.y:12286
-#, c-format
+#: java/parse.y:12373
+#, gcc-internal-format
msgid "not a static field %qs"
msgstr ""
-#: java/parse.y:12309
+#: java/parse.y:12396
+#, gcc-internal-format
msgid ""
"Can't reference %<this%> or %<super%> before the superclass constructor has "
"been called"
msgstr ""
-#: java/parse.y:12329
-#, c-format
+#: java/parse.y:12416
+#, gcc-internal-format
msgid "No case for %s"
msgstr ""
-#: java/parse.y:12759
+#: java/parse.y:12846
+#, gcc-internal-format
msgid "Invalid left hand side of assignment"
msgstr ""
-#: java/parse.y:12810
-#, c-format
+#: java/parse.y:12897
+#, gcc-internal-format
msgid "Incompatible type for %s. Can't convert %qs to %qs"
msgstr ""
-#: java/parse.y:12813
-#, c-format
+#: java/parse.y:12900
+#, gcc-internal-format
msgid "Incompatible type for %s. Explicit cast needed to convert %qs to %qs"
msgstr ""
-#: java/parse.y:12985
-#, c-format
+#: java/parse.y:13072
+#, gcc-internal-format
msgid ""
"Constant expression %qs too wide for narrowing primitive conversion to %qs"
msgstr ""
-#: java/parse.y:13276
-#, c-format
+#: java/parse.y:13363
+#, gcc-internal-format
msgid "unregistered operator %s"
msgstr ""
-#: java/parse.y:13425
+#: java/parse.y:13512
+#, gcc-internal-format
msgid ""
"Evaluating this expression will result in an arithmetic exception being "
"thrown"
msgstr ""
-#: java/parse.y:13507
-#, c-format
+#: java/parse.y:13594
+#, gcc-internal-format
msgid ""
"Incompatible type for %qs. Explicit cast needed to convert shift distance "
"from %qs to integral"
msgstr ""
-#: java/parse.y:13512
-#, c-format
+#: java/parse.y:13599
+#, gcc-internal-format
msgid ""
"Incompatible type for %qs. Can't convert shift distance from %qs to integral"
msgstr ""
-#: java/parse.y:13588
+#: java/parse.y:13675
+#, gcc-internal-format
msgid "Invalid argument %qs for %<instanceof%>"
msgstr ""
-#: java/parse.y:13615
-#, c-format
+#: java/parse.y:13702
+#, gcc-internal-format
msgid "Impossible for %qs to be instance of %qs"
msgstr ""
-#: java/parse.y:13746
-#, c-format
+#: java/parse.y:13833
+#, gcc-internal-format
msgid "Incompatible type for %qs. Can't convert %qs to %qs"
msgstr ""
-#: java/parse.y:14220
-#, c-format
+#: java/parse.y:14308
+#, gcc-internal-format
msgid "Invalid argument type %qs to %qs"
msgstr ""
-#: java/parse.y:14450
-#, c-format
+#: java/parse.y:14538
+#, gcc-internal-format
msgid "Invalid cast from %qs to %qs"
msgstr ""
-#: java/parse.y:14497
+#: java/parse.y:14585
+#, gcc-internal-format
msgid "%<[]%> can only be applied to arrays. It can't be applied to %qs"
msgstr ""
-#: java/parse.y:14510
+#: java/parse.y:14598
+#, gcc-internal-format
msgid ""
"Incompatible type for %<[]%>. Explicit cast needed to convert %qs to %<int%>"
msgstr ""
-#: java/parse.y:14514
+#: java/parse.y:14602
+#, gcc-internal-format
msgid "Incompatible type for %<[]%>. Can't convert %qs to %<int%>"
msgstr ""
-#: java/parse.y:14585
+#: java/parse.y:14673
+#, gcc-internal-format
msgid ""
"Incompatible type for dimension in array creation expression. %s convert %qs "
"to %<int%>"
msgstr ""
-#: java/parse.y:14701
-#, c-format
+#: java/parse.y:14789
+#, gcc-internal-format
msgid "Invalid array initializer for non-array type %qs"
msgstr ""
-#: java/parse.y:14788
-#, c-format
+#: java/parse.y:14876
+#, gcc-internal-format
msgid "Incompatible type for array. %s convert %qs to %qs"
msgstr ""
-#: java/parse.y:14857
+#: java/parse.y:14945
+#, gcc-internal-format
msgid "%<return%> inside instance initializer"
msgstr ""
-#: java/parse.y:14861
+#: java/parse.y:14949
+#, gcc-internal-format
msgid "%<return%> inside static initializer"
msgstr ""
-#: java/parse.y:14867
+#: java/parse.y:14955
+#, gcc-internal-format
msgid "%<return%> with%s value from %<%s %s%>"
msgstr ""
-#: java/parse.y:14874
+#: java/parse.y:14962
+#, gcc-internal-format
msgid "%<return%> with value from constructor %qs"
msgstr ""
-#: java/parse.y:14939
+#: java/parse.y:15027
+#, gcc-internal-format
msgid "Incompatible type for %<if%>. Can't convert %qs to %<boolean%>"
msgstr ""
-#: java/parse.y:14972
-#, c-format
+#: java/parse.y:15060
+#, gcc-internal-format
msgid "Declaration of %qs shadows a previous label declaration"
msgstr ""
-#: java/parse.y:14977
-#, c-format
+#: java/parse.y:15065
+#, gcc-internal-format
msgid "This is the location of the previous declaration of label %qs"
msgstr ""
-#: java/parse.y:15224
-#, c-format
+#: java/parse.y:15312
+#, gcc-internal-format
msgid "No label definition found for %qs"
msgstr ""
-#: java/parse.y:15237
+#: java/parse.y:15325
+#, gcc-internal-format
msgid "%<continue%> must be in loop"
msgstr ""
-#: java/parse.y:15240
-#, c-format
+#: java/parse.y:15328
+#, gcc-internal-format
msgid "continue label %qs does not name a loop"
msgstr ""
-#: java/parse.y:15261
+#: java/parse.y:15349
+#, gcc-internal-format
msgid "%<break%> must be in loop or switch"
msgstr ""
-#: java/parse.y:15302
+#: java/parse.y:15390
+#, gcc-internal-format
msgid ""
"Incompatible type for loop conditional. Can't convert %qs to %<boolean%>"
msgstr ""
-#: java/parse.y:15340
+#: java/parse.y:15428
+#, gcc-internal-format
msgid "Incompatible type for %<switch%>. Can't convert %qs to %<int%>"
msgstr ""
#. The case_label_list is in reverse order, so print the
#. outer label first.
-#: java/parse.y:15371
+#: java/parse.y:15459
+#, gcc-internal-format
msgid "duplicate case label: %<"
msgstr ""
-#: java/parse.y:15372
+#: java/parse.y:15460
+#, gcc-internal-format
msgid "%>"
msgstr ""
-#: java/parse.y:15375
+#: java/parse.y:15463
+#, gcc-internal-format
msgid "original label is here"
msgstr ""
-#: java/parse.y:15592
+#: java/parse.y:15680
+#, gcc-internal-format
msgid ""
"Can't catch class %qs. Catch clause parameter type must be a subclass of "
"class %<java.lang.Throwable%>"
msgstr ""
-#: java/parse.y:15616
+#: java/parse.y:15704
+#, gcc-internal-format
msgid "%<catch%> not reached because of the catch clause at line %d"
msgstr ""
-#: java/parse.y:15683
+#: java/parse.y:15771
+#, gcc-internal-format
msgid ""
"Incompatible type for %<synchronized%>. Can't convert %qs to %<java.lang."
"Object%>"
msgstr ""
-#: java/parse.y:15734
+#: java/parse.y:15822
+#, gcc-internal-format
msgid "Can't throw %qs; it must be a subclass of class %<java.lang.Throwable%>"
msgstr ""
-#: java/parse.y:15763
+#: java/parse.y:15851
+#, gcc-internal-format
msgid ""
"Checked exception %qs can't be thrown in instance initializer (not all "
"declared constructor are declaring it in their %<throws%> clause)"
msgstr ""
-#: java/parse.y:15784
+#: java/parse.y:15872
+#, gcc-internal-format
msgid ""
"Checked exception %qs can't be caught by any of the catch clause(s) of the "
"surrounding %<try%> block"
msgstr ""
-#: java/parse.y:15797
-#, c-format
+#: java/parse.y:15885
+#, gcc-internal-format
msgid "Checked exception %qs can't be thrown in initializer"
msgstr ""
-#: java/parse.y:15801
+#: java/parse.y:15889
+#, gcc-internal-format
msgid "Checked exception %qs isn't thrown from a %<try%> block"
msgstr ""
-#: java/parse.y:15807
+#: java/parse.y:15895
+#, gcc-internal-format
msgid ""
"Checked exception %qs doesn't match any of current method's %<throws%> "
"declaration(s)"
msgstr ""
-#: java/parse.y:15859
-#, c-format
+#: java/parse.y:15947
+#, gcc-internal-format
msgid "Exception %qs can't be thrown in initializer"
msgstr ""
-#: java/parse.y:15864
+#: java/parse.y:15952
+#, gcc-internal-format
msgid ""
"Exception %qs must be caught, or it must be declared in the %<throws%> "
"clause of %qs"
msgstr ""
-#: java/parse.y:15977
+#: java/parse.y:16065
+#, gcc-internal-format
msgid "Incompatible type for %<?:%>. Can't convert %qs to %<boolean%>"
msgstr ""
-#: java/parse.y:16045
+#: java/parse.y:16133
+#, gcc-internal-format
msgid "Incompatible type for %<?:%>. Can't convert %qs to %qs"
msgstr ""
#: java/typeck.c:530
+#, gcc-internal-format
msgid "junk at end of signature string"
msgstr ""
#: java/verify-glue.c:387
-#, c-format
+#, gcc-internal-format
msgid "verification failed: %s"
msgstr ""
#: java/verify-glue.c:389
-#, c-format
+#, gcc-internal-format
msgid "verification failed at PC=%d: %s"
msgstr ""
#: java/verify-glue.c:473 java/verify.c:480
+#, gcc-internal-format
msgid "bad pc in exception_table"
msgstr ""
-#: java/verify.c:1476
-#, c-format
+#: java/verify.c:1475
+#, gcc-internal-format
msgid "unknown opcode %d@pc=%d during verification"
msgstr ""
-#: java/verify.c:1551 java/verify.c:1567 java/verify.c:1572
-#, c-format
+#: java/verify.c:1550 java/verify.c:1566 java/verify.c:1571
+#, gcc-internal-format
msgid "verification error at PC=%d"
msgstr ""
#: java/parse.h:125
-#, c-format
+#, gcc-internal-format
msgid "%s method can't be abstract"
msgstr ""
#: java/parse.h:129
-#, c-format
+#, gcc-internal-format
msgid "Constructor can't be %s"
msgstr ""
#. Pedantic warning on obsolete modifiers. Note: when cl is NULL,
#. flags was set artificially, such as for a interface method
#: java/parse.h:161
-#, c-format
+#, gcc-internal-format
msgid "Discouraged redundant use of %qs modifier in declaration of %s"
msgstr ""
#: java/parse.h:168
-#, c-format
+#, gcc-internal-format
msgid "Discouraged redundant use of %qs modifier in declaration of %s %qs"
msgstr ""
#. Standard error messages
#: java/parse.h:352
-#, c-format
+#, gcc-internal-format
msgid "Incompatible type for %qs. Can't convert %qs to boolean"
msgstr ""
#: java/parse.h:357
-#, c-format
+#, gcc-internal-format
msgid "Incompatible type for %qs. Can't convert %qs to numeric type"
msgstr ""
#: java/parse.h:365
-#, c-format
+#, gcc-internal-format
msgid ""
"Incompatible type for %qs. Explicit cast needed to convert %qs to integral"
msgstr ""
#: java/parse.h:370
-#, c-format
+#, gcc-internal-format
msgid "Incompatible type for %qs. Can't convert %qs to integral"
msgstr ""
#: java/parse.h:377
-#, c-format
+#, gcc-internal-format
msgid "Variable %qs may not have been initialized"
msgstr ""
-#: objc/objc-act.c:756
+#: objc/objc-act.c:709
+#, gcc-internal-format
msgid "%<@end%> must appear in an @implementation context"
msgstr ""
-#: objc/objc-act.c:783
+#: objc/objc-act.c:738
+#, gcc-internal-format
msgid "method declaration not in @interface context"
msgstr ""
-#: objc/objc-act.c:794
+#: objc/objc-act.c:749
+#, gcc-internal-format
msgid "method definition not in @implementation context"
msgstr ""
-#: objc/objc-act.c:925
-#, c-format
-msgid "object does not conform to the %qs protocol"
+#: objc/objc-act.c:1101
+#, gcc-internal-format
+msgid "comparison of distinct Objective-C types lacks a cast"
msgstr ""
-#: objc/objc-act.c:1015 objc/objc-act.c:1092
-#, c-format
-msgid "class %qs does not implement the %qs protocol"
+#: objc/objc-act.c:1105
+#, gcc-internal-format
+msgid "initialization from distinct Objective-C type"
msgstr ""
-#: objc/objc-act.c:1198
-#, c-format
+#: objc/objc-act.c:1109
+#, gcc-internal-format
+msgid "assignment from distinct Objective-C type"
+msgstr ""
+
+#: objc/objc-act.c:1113
+#, gcc-internal-format
+msgid "distinct Objective-C type in return"
+msgstr ""
+
+#: objc/objc-act.c:1117
+#, gcc-internal-format
+msgid "passing argument %d of %qE from distinct Objective-C type"
+msgstr ""
+
+#: objc/objc-act.c:1272
+#, gcc-internal-format
msgid "statically allocated instance of Objective-C class %qs"
msgstr ""
-#: objc/objc-act.c:1269
-#, c-format
+#: objc/objc-act.c:1343
+#, gcc-internal-format
msgid "protocol %qs has circular dependency"
msgstr ""
-#: objc/objc-act.c:1291 objc/objc-act.c:5881
-#, c-format
+#: objc/objc-act.c:1365 objc/objc-act.c:6494
+#, gcc-internal-format
msgid "cannot find protocol declaration for %qs"
msgstr ""
-#: objc/objc-act.c:1687 objc/objc-act.c:2836 objc/objc-act.c:6409
-#: objc/objc-act.c:6735 objc/objc-act.c:6788 objc/objc-act.c:6813
-#, c-format
+#: objc/objc-act.c:1783 objc/objc-act.c:3259 objc/objc-act.c:7103
+#: objc/objc-act.c:7439 objc/objc-act.c:7493 objc/objc-act.c:7518
+#, gcc-internal-format
msgid "cannot find interface declaration for %qs"
msgstr ""
-#: objc/objc-act.c:1691
-#, c-format
+#: objc/objc-act.c:1787
+#, gcc-internal-format
msgid "interface %qs does not have valid constant string layout"
msgstr ""
-#: objc/objc-act.c:1696
-#, c-format
+#: objc/objc-act.c:1792
+#, gcc-internal-format
msgid "cannot find reference tag for class %qs"
msgstr ""
-#: objc/objc-act.c:2374
+#: objc/objc-act.c:2470
+#, gcc-internal-format
msgid "%Hcreating selector for nonexistent method %qE"
msgstr ""
-#: objc/objc-act.c:2563
-#, c-format
+#: objc/objc-act.c:2672
+#, gcc-internal-format
msgid "%qs is not an Objective-C class name or alias"
msgstr ""
-#: objc/objc-act.c:2678 objc/objc-act.c:2696 objc/objc-act.c:6672
-#: objc/objc-act.c:6964 objc/objc-act.c:6994
+#: objc/objc-act.c:2787 objc/objc-act.c:2818 objc/objc-act.c:7367
+#: objc/objc-act.c:7668 objc/objc-act.c:7698
+#, gcc-internal-format
msgid "Objective-C declarations may only appear in global scope"
msgstr ""
-#: objc/objc-act.c:2683
-#, c-format
+#: objc/objc-act.c:2792
+#, gcc-internal-format
msgid "cannot find class %qs"
msgstr ""
-#: objc/objc-act.c:2685
-#, c-format
+#: objc/objc-act.c:2794
+#, gcc-internal-format
msgid "class %qs already exists"
msgstr ""
-#: objc/objc-act.c:2716 objc/objc-act.c:6704
-#, c-format
+#: objc/objc-act.c:2838 objc/objc-act.c:7408
+#, gcc-internal-format
msgid "%qs redeclared as different kind of symbol"
msgstr ""
-#: objc/objc-act.c:2718 objc/objc-act.c:6706
+#: objc/objc-act.c:2840 objc/objc-act.c:7410
+#, gcc-internal-format
msgid "%Jprevious declaration of '%D'"
msgstr ""
-#: objc/objc-act.c:2946
+#: objc/objc-act.c:3112
+#, gcc-internal-format
+msgid "strong-cast assignment has been intercepted"
+msgstr ""
+
+#: objc/objc-act.c:3154
+#, gcc-internal-format
+msgid "strong-cast may possibly be needed"
+msgstr ""
+
+#: objc/objc-act.c:3164
+#, gcc-internal-format
+msgid "instance variable assignment has been intercepted"
+msgstr ""
+
+#: objc/objc-act.c:3183
+#, gcc-internal-format
+msgid "pointer arithmetic for garbage-collected objects not allowed"
+msgstr ""
+
+#: objc/objc-act.c:3189
+#, gcc-internal-format
+msgid "global/static variable assignment has been intercepted"
+msgstr ""
+
+#: objc/objc-act.c:3372
+#, gcc-internal-format
msgid "use %<-fobjc-exceptions%> to enable Objective-C exception syntax"
msgstr ""
-#: objc/objc-act.c:3275
+#: objc/objc-act.c:3712
+#, gcc-internal-format
msgid "@catch parameter is not a known Objective-C class type"
msgstr ""
-#: objc/objc-act.c:3291
+#: objc/objc-act.c:3728
+#, gcc-internal-format
msgid "exception of type %<%T%> will be caught"
msgstr ""
-#: objc/objc-act.c:3293
+#: objc/objc-act.c:3730
+#, gcc-internal-format
msgid "%H by earlier handler for %<%T%>"
msgstr ""
-#: objc/objc-act.c:3346
+#: objc/objc-act.c:3783
+#, gcc-internal-format
msgid "%<@try%> without %<@catch%> or %<@finally%>"
msgstr ""
-#: objc/objc-act.c:3393
+#: objc/objc-act.c:3831
+#, gcc-internal-format
msgid "%<@throw%> (rethrow) used outside of a @catch block"
msgstr ""
-#: objc/objc-act.c:3758
+#: objc/objc-act.c:4234
+#, gcc-internal-format
msgid "%Jtype '%D' does not have a known size"
msgstr ""
-#: objc/objc-act.c:4271
+#: objc/objc-act.c:4867
+#, gcc-internal-format
msgid "%J%s %qs"
msgstr ""
-#: objc/objc-act.c:4294 objc/objc-act.c:4313
+#: objc/objc-act.c:4890 objc/objc-act.c:4909
+#, gcc-internal-format
msgid "inconsistent instance variable specification"
msgstr ""
-#: objc/objc-act.c:5169
+#: objc/objc-act.c:5766
+#, gcc-internal-format
msgid "can not use an object as parameter to a method"
msgstr ""
-#: objc/objc-act.c:5377
+#: objc/objc-act.c:5989
+#, gcc-internal-format
msgid "multiple %s named %<%c%s%> found"
msgstr ""
-#: objc/objc-act.c:5602
-#, c-format
+#: objc/objc-act.c:6218
+#, gcc-internal-format
msgid "no super class declared in @interface for %qs"
msgstr ""
-#: objc/objc-act.c:5645
+#: objc/objc-act.c:6256
+#, gcc-internal-format
msgid "found %<-%s%> instead of %<+%s%> in protocol(s)"
msgstr ""
-#: objc/objc-act.c:5704
-#, c-format
+#: objc/objc-act.c:6315
+#, gcc-internal-format
msgid "invalid receiver type %qs"
msgstr ""
-#: objc/objc-act.c:5719
+#: objc/objc-act.c:6330
+#, gcc-internal-format
msgid "%<%c%s%> not found in protocol(s)"
msgstr ""
-#: objc/objc-act.c:5733
+#: objc/objc-act.c:6344
+#, gcc-internal-format
msgid "%qs may not respond to %<%c%s%>"
msgstr ""
-#: objc/objc-act.c:5741
+#: objc/objc-act.c:6352
+#, gcc-internal-format
msgid "no %<%c%s%> method found"
msgstr ""
-#: objc/objc-act.c:5747
+#: objc/objc-act.c:6358
+#, gcc-internal-format
msgid "(Messages without a matching method signature"
msgstr ""
-#: objc/objc-act.c:5748
+#: objc/objc-act.c:6359
+#, gcc-internal-format
msgid "will be assumed to return %<id%> and accept"
msgstr ""
-#: objc/objc-act.c:5749
+#: objc/objc-act.c:6360
+#, gcc-internal-format
msgid "%<...%> as arguments.)"
msgstr ""
-#: objc/objc-act.c:5980
-#, c-format
+#: objc/objc-act.c:6593
+#, gcc-internal-format
msgid "undeclared selector %qs"
msgstr ""
@@ -18525,3347 +24167,186 @@ msgstr ""
#. to an instance variable. It's better to catch the cases
#. where this is done unknowingly than to support the above
#. paradigm.
-#: objc/objc-act.c:6022
-#, c-format
+#: objc/objc-act.c:6635
+#, gcc-internal-format
msgid "instance variable %qs accessed in class method"
msgstr ""
-#: objc/objc-act.c:6234
+#: objc/objc-act.c:6867
+#, gcc-internal-format
msgid "duplicate declaration of method %<%c%s%>"
msgstr ""
-#: objc/objc-act.c:6279
+#: objc/objc-act.c:6928
+#, gcc-internal-format
msgid "duplicate interface declaration for category %<%s(%s)%>"
msgstr ""
-#: objc/objc-act.c:6306
-#, c-format
+#: objc/objc-act.c:6955
+#, gcc-internal-format
msgid "illegal reference type specified for instance variable %qs"
msgstr ""
-#: objc/objc-act.c:6317
-#, c-format
+#: objc/objc-act.c:6966
+#, gcc-internal-format
msgid "instance variable %qs has unknown size"
msgstr ""
-#. vtable pointers are Real Bad(tm), since Obj-C cannot initialize them
-#: objc/objc-act.c:6331
-#, c-format
-msgid "type %qs has virtual member functions"
+#: objc/objc-act.c:6991
+#, gcc-internal-format
+msgid "type `%s' has no default constructor to call"
msgstr ""
-#: objc/objc-act.c:6332
-#, c-format
-msgid "illegal aggregate type %qs specified for instance variable %qs"
+#: objc/objc-act.c:6997
+#, gcc-internal-format
+msgid "destructor for `%s' shall not be run either"
msgstr ""
-#: objc/objc-act.c:6340
-#, c-format
-msgid "type %qs has a user-defined constructor"
+#. Vtable pointers are Real Bad(tm), since Obj-C cannot
+#. initialize them.
+#: objc/objc-act.c:7009
+#, gcc-internal-format
+msgid "type `%s' has virtual member functions"
msgstr ""
-#: objc/objc-act.c:6342
-#, c-format
-msgid "type %qs has a user-defined destructor"
+#: objc/objc-act.c:7010
+#, gcc-internal-format
+msgid "illegal aggregate type `%s' specified for instance variable `%s'"
msgstr ""
-#: objc/objc-act.c:6343
+#: objc/objc-act.c:7020
+#, gcc-internal-format
+msgid "type `%s' has a user-defined constructor"
+msgstr ""
+
+#: objc/objc-act.c:7022
+#, gcc-internal-format
+msgid "type `%s' has a user-defined destructor"
+msgstr ""
+
+#: objc/objc-act.c:7026
+#, gcc-internal-format
msgid ""
"C++ constructors and destructors will not be invoked for Objective-C fields"
msgstr ""
-#: objc/objc-act.c:6433
-#, c-format
+#: objc/objc-act.c:7132
+#, gcc-internal-format
msgid "instance variable %qs is declared private"
msgstr ""
-#: objc/objc-act.c:6442
-#, c-format
+#: objc/objc-act.c:7143
+#, gcc-internal-format
msgid "instance variable %qs is %s; this will be a hard error in the future"
msgstr ""
-#: objc/objc-act.c:6449
-#, c-format
+#: objc/objc-act.c:7150
+#, gcc-internal-format
msgid "instance variable %qs is declared %s"
msgstr ""
-#: objc/objc-act.c:6459
-msgid "static access to object of type %<id%>"
-msgstr ""
-
-#: objc/objc-act.c:6481 objc/objc-act.c:6569
-#, c-format
+#: objc/objc-act.c:7176 objc/objc-act.c:7264
+#, gcc-internal-format
msgid "incomplete implementation of class %qs"
msgstr ""
-#: objc/objc-act.c:6485 objc/objc-act.c:6574
-#, c-format
+#: objc/objc-act.c:7180 objc/objc-act.c:7269
+#, gcc-internal-format
msgid "incomplete implementation of category %qs"
msgstr ""
-#: objc/objc-act.c:6490 objc/objc-act.c:6579
+#: objc/objc-act.c:7185 objc/objc-act.c:7274
+#, gcc-internal-format
msgid "method definition for %<%c%s%> not found"
msgstr ""
-#: objc/objc-act.c:6620
-#, c-format
+#: objc/objc-act.c:7315
+#, gcc-internal-format
msgid "%s %qs does not fully implement the %qs protocol"
msgstr ""
-#: objc/objc-act.c:6678 objc/objc-act.c:8278
+#: objc/objc-act.c:7373 objc/objc-act.c:9041
+#, gcc-internal-format
msgid "%<@end%> missing in implementation context"
msgstr ""
-#: objc/objc-act.c:6691
-#, c-format
+#: objc/objc-act.c:7392
+#, gcc-internal-format
msgid "cannot find interface declaration for %qs, superclass of %qs"
msgstr ""
-#: objc/objc-act.c:6718
-#, c-format
+#: objc/objc-act.c:7422
+#, gcc-internal-format
msgid "reimplementation of class %qs"
msgstr ""
-#: objc/objc-act.c:6749
-#, c-format
+#: objc/objc-act.c:7454
+#, gcc-internal-format
msgid "conflicting super class name %qs"
msgstr ""
-#: objc/objc-act.c:6751
-#, c-format
+#: objc/objc-act.c:7456
+#, gcc-internal-format
msgid "previous declaration of %qs"
msgstr ""
-#: objc/objc-act.c:6765 objc/objc-act.c:6767
-#, c-format
+#: objc/objc-act.c:7470 objc/objc-act.c:7472
+#, gcc-internal-format
msgid "duplicate interface declaration for class %qs"
msgstr ""
-#: objc/objc-act.c:7022
-#, c-format
+#: objc/objc-act.c:7726
+#, gcc-internal-format
msgid "duplicate declaration for protocol %qs"
msgstr ""
#. Add a readable method name to the warning.
-#: objc/objc-act.c:7552
+#: objc/objc-act.c:8285
+#, gcc-internal-format
msgid "%J%s %<%c%s%>"
msgstr ""
-#: objc/objc-act.c:7855
-#, c-format
+#: objc/objc-act.c:8615
+#, gcc-internal-format
msgid "no super class declared in interface for %qs"
msgstr ""
-#: objc/objc-act.c:7903
+#: objc/objc-act.c:8663
+#, gcc-internal-format
msgid "[super ...] must appear in a method context"
msgstr ""
-#: objc/objc-act.c:8560
-#, c-format
+#: objc/objc-act.c:8703
+#, gcc-internal-format
+msgid "method possibly missing a [super dealloc] call"
+msgstr ""
+
+#: objc/objc-act.c:9333
+#, gcc-internal-format
msgid "local declaration of %qs hides instance variable"
msgstr ""
#: treelang/tree1.c:278
+#, gcc-internal-format
msgid "%HDuplicate name %q.*s."
msgstr ""
#: treelang/treetree.c:815
+#, gcc-internal-format
msgid "Global register variable %qD used in nested function."
msgstr ""
#: treelang/treetree.c:819
+#, gcc-internal-format
msgid "Register variable %qD used in nested function."
msgstr ""
#: treelang/treetree.c:825
+#, gcc-internal-format
msgid "Address of global register variable %qD requested."
msgstr ""
#: treelang/treetree.c:830
+#, gcc-internal-format
msgid "Address of register variable %qD requested."
msgstr ""
-
-#: config/sparc/sol2-gld-bi.h:17 config/sparc/sol2-gld-bi.h:22
-#: config/sparc/sol2-bi.h:167 config/sparc/sol2-bi.h:172
-msgid "does not support multilib"
-msgstr ""
-
-#: config/rs6000/darwin.h:130
-msgid " conflicting code gen style switches are used"
-msgstr ""
-
-#: config/mips/mips.h:817 config/arc/arc.h:63
-msgid "may not use both -EB and -EL"
-msgstr ""
-
-#: objc/lang-specs.h:31 objc/lang-specs.h:46
-msgid "GNU Objective C no longer supports traditional compilation"
-msgstr ""
-
-#: config/mips/r3900.h:35
-msgid "-mhard-float not supported"
-msgstr ""
-
-#: config/mips/r3900.h:37
-msgid "-msingle-float and -msoft-float cannot both be specified"
-msgstr ""
-
-#: config/vax/vax.h:50 config/vax/vax.h:51
-msgid "profiling not supported with -mg\n"
-msgstr ""
-
-#: config/vax/netbsd-elf.h:42
-msgid "The -shared option is not currently supported for VAX ELF."
-msgstr ""
-
-#: config/sh/sh.h:685
-msgid "SH2a does not support little-endian"
-msgstr ""
-
-#: config/sparc/linux64.h:211 config/sparc/linux64.h:222
-#: config/sparc/netbsd-elf.h:126 config/sparc/netbsd-elf.h:145
-#: config/sparc/sol2-bi.h:195 config/sparc/sol2-bi.h:205
-msgid "may not use both -m32 and -m64"
-msgstr ""
-
-#: ada/lang-specs.h:34 gcc.c:777 java/jvspec.c:80
-msgid "-pg and -fomit-frame-pointer are incompatible"
-msgstr ""
-
-#: ada/lang-specs.h:35
-msgid "-c or -S required for Ada"
-msgstr ""
-
-#: config/arm/arm.h:153
-msgid "-msoft-float and -mhard_float may not be used together"
-msgstr ""
-
-#: config/arm/arm.h:155
-msgid "-mbig-endian and -mlittle-endian may not be used together"
-msgstr ""
-
-#: gcc.c:750
-msgid "GCC does not support -C or -CC without -E"
-msgstr ""
-
-#: gcc.c:929
-msgid "GNU C no longer supports -traditional without -E"
-msgstr ""
-
-#: gcc.c:945
-msgid "-E required when input is from standard input"
-msgstr ""
-
-#: config/darwin.h:251
-msgid "-current_version only allowed with -dynamiclib"
-msgstr ""
-
-#: config/darwin.h:253
-msgid "-install_name only allowed with -dynamiclib"
-msgstr ""
-
-#: config/darwin.h:258
-msgid "-bundle not allowed with -dynamiclib"
-msgstr ""
-
-#: config/darwin.h:259
-msgid "-bundle_loader not allowed with -dynamiclib"
-msgstr ""
-
-#: config/darwin.h:260
-msgid "-client_name not allowed with -dynamiclib"
-msgstr ""
-
-#: config/darwin.h:265
-msgid "-force_flat_namespace not allowed with -dynamiclib"
-msgstr ""
-
-#: config/darwin.h:267
-msgid "-keep_private_externs not allowed with -dynamiclib"
-msgstr ""
-
-#: config/darwin.h:268
-msgid "-private_bundle not allowed with -dynamiclib"
-msgstr ""
-
-#: config/i386/cygwin.h:29
-msgid "mno-cygwin and mno-win32 are not compatible"
-msgstr ""
-
-#: config/i386/cygwin.h:70 config/i386/mingw32.h:58
-msgid "shared and mdll are not compatible"
-msgstr ""
-
-#: config/lynx.h:71
-msgid "Cannot use mthreads and mlegacy-threads together."
-msgstr ""
-
-#: config/lynx.h:96
-msgid "Cannot use mshared and static together."
-msgstr ""
-
-#: java/lang-specs.h:34
-msgid "-fjni and -femit-class-files are incompatible"
-msgstr ""
-
-#: java/lang-specs.h:35
-msgid "-fjni and -femit-class-file are incompatible"
-msgstr ""
-
-#: java/lang-specs.h:36 java/lang-specs.h:37
-msgid "-femit-class-file should used along with -fsyntax-only"
-msgstr ""
-
-#: config/mcore/mcore.h:57
-msgid "the m210 does not have little endian support"
-msgstr ""
-
-#: config/i386/sco5.h:189
-msgid "-pg not supported on this platform"
-msgstr ""
-
-#: config/i386/sco5.h:190
-msgid "-p and -pp specified - pick one"
-msgstr ""
-
-#: config/i386/sco5.h:264
-msgid "-G and -static are mutually exclusive"
-msgstr ""
-
-#: config/i386/nwld.h:34
-msgid "Static linking is not supported.\n"
-msgstr ""
-
-#: ada/lang.opt:74
-msgid "Specify options to GNAT"
-msgstr ""
-
-#: config/alpha/alpha.opt:28
-msgid "Use fp registers"
-msgstr ""
-
-#: config/alpha/alpha.opt:32
-msgid "Assume GAS"
-msgstr ""
-
-#: config/alpha/alpha.opt:36
-msgid "Do not assume GAS"
-msgstr ""
-
-#: config/alpha/alpha.opt:40
-msgid "Request IEEE-conformant math library routines (OSF/1)"
-msgstr ""
-
-#: config/alpha/alpha.opt:44
-msgid "Emit IEEE-conformant code, without inexact exceptions"
-msgstr ""
-
-#: config/alpha/alpha.opt:51
-msgid "Do not emit complex integer constants to read-only memory"
-msgstr ""
-
-#: config/alpha/alpha.opt:55
-msgid "Use VAX fp"
-msgstr ""
-
-#: config/alpha/alpha.opt:59
-msgid "Do not use VAX fp"
-msgstr ""
-
-#: config/alpha/alpha.opt:63
-msgid "Emit code for the byte/word ISA extension"
-msgstr ""
-
-#: config/alpha/alpha.opt:67
-msgid "Emit code for the motion video ISA extension"
-msgstr ""
-
-#: config/alpha/alpha.opt:71
-msgid "Emit code for the fp move and sqrt ISA extension"
-msgstr ""
-
-#: config/alpha/alpha.opt:75
-msgid "Emit code for the counting ISA extension"
-msgstr ""
-
-#: config/alpha/alpha.opt:79
-msgid "Emit code using explicit relocation directives"
-msgstr ""
-
-#: config/alpha/alpha.opt:83
-msgid "Emit 16-bit relocations to the small data areas"
-msgstr ""
-
-#: config/alpha/alpha.opt:87
-msgid "Emit 32-bit relocations to the small data areas"
-msgstr ""
-
-#: config/alpha/alpha.opt:91
-msgid "Emit direct branches to local functions"
-msgstr ""
-
-#: config/alpha/alpha.opt:95
-msgid "Emit indirect branches to local functions"
-msgstr ""
-
-#: config/alpha/alpha.opt:99
-msgid "Emit rdval instead of rduniq for thread pointer"
-msgstr ""
-
-#: config/alpha/alpha.opt:103
-msgid "Use 128-bit long double"
-msgstr ""
-
-#: config/alpha/alpha.opt:107
-msgid "Use 64-bit long double"
-msgstr ""
-
-#: config/alpha/alpha.opt:111
-msgid "Use features of and schedule given CPU"
-msgstr ""
-
-#: config/alpha/alpha.opt:115
-msgid "Schedule given CPU"
-msgstr ""
-
-#: config/alpha/alpha.opt:119
-msgid "Control the generated fp rounding mode"
-msgstr ""
-
-#: config/alpha/alpha.opt:123
-msgid "Control the IEEE trap mode"
-msgstr ""
-
-#: config/alpha/alpha.opt:127
-msgid "Control the precision given to fp exceptions"
-msgstr ""
-
-#: config/alpha/alpha.opt:131
-msgid "Tune expected memory latency"
-msgstr ""
-
-#: config/arc/arc.opt:33
-msgid "Prepend the name of the cpu to all public symbol names"
-msgstr ""
-
-#: config/arc/arc.opt:43
-msgid "Compile code for ARC variant CPU"
-msgstr ""
-
-#: config/arc/arc.opt:47
-msgid "Put functions in SECTION"
-msgstr ""
-
-#: config/arc/arc.opt:51
-msgid "Put data in SECTION"
-msgstr ""
-
-#: config/arc/arc.opt:55
-msgid "Put read-only data in SECTION"
-msgstr ""
-
-#: config/avr/avr.opt:24
-msgid "Use subroutines for function prologues and epilogues"
-msgstr ""
-
-#: config/avr/avr.opt:28
-msgid "Select the target MCU"
-msgstr ""
-
-#: config/avr/avr.opt:35
-msgid "Use STACK as the initial value of the stack pointer"
-msgstr ""
-
-#: config/avr/avr.opt:39
-msgid "Use an 8-bit 'int' type"
-msgstr ""
-
-#: config/avr/avr.opt:43
-msgid "Change the stack pointer without disabling interrupts"
-msgstr ""
-
-#: config/avr/avr.opt:47
-msgid "Do not generate tablejump insns"
-msgstr ""
-
-#: config/avr/avr.opt:57
-msgid "Use rjmp/rcall (limited range) on >8K devices"
-msgstr ""
-
-#: config/avr/avr.opt:61
-msgid "Output instruction sizes to the asm file"
-msgstr ""
-
-#: config/avr/avr.opt:65
-msgid "Change only the low 8 bits of the stack pointer"
-msgstr ""
-
-#: config/c4x/c4x.opt:24
-msgid "Generate code for C30 CPU"
-msgstr ""
-
-#: config/c4x/c4x.opt:28
-msgid "Generate code for C31 CPU"
-msgstr ""
-
-#: config/c4x/c4x.opt:32
-msgid "Generate code for C32 CPU"
-msgstr ""
-
-#: config/c4x/c4x.opt:36
-msgid "Generate code for C33 CPU"
-msgstr ""
-
-#: config/c4x/c4x.opt:40
-msgid "Generate code for C40 CPU"
-msgstr ""
-
-#: config/c4x/c4x.opt:44
-msgid "Generate code for C44 CPU"
-msgstr ""
-
-#: config/c4x/c4x.opt:48
-msgid "Assume that pointers may be aliased"
-msgstr ""
-
-#: config/c4x/c4x.opt:52
-msgid "Big memory model"
-msgstr ""
-
-#: config/c4x/c4x.opt:56
-msgid "Use the BK register as a general purpose register"
-msgstr ""
-
-#: config/c4x/c4x.opt:60
-msgid "Generate code for CPU"
-msgstr ""
-
-#: config/c4x/c4x.opt:64
-msgid "Enable use of DB instruction"
-msgstr ""
-
-#: config/c4x/c4x.opt:68
-msgid "Enable debugging"
-msgstr ""
-
-#: config/c4x/c4x.opt:72
-msgid "Enable new features under development"
-msgstr ""
-
-#: config/c4x/c4x.opt:76
-msgid "Use fast but approximate float to integer conversion"
-msgstr ""
-
-#: config/c4x/c4x.opt:80
-msgid "Force RTL generation to emit valid 3 operand insns"
-msgstr ""
-
-#: config/c4x/c4x.opt:84
-msgid "Force constants into registers to improve hoisting"
-msgstr ""
-
-#: config/c4x/c4x.opt:88 config/c4x/c4x.opt:112
-msgid "Save DP across ISR in small memory model"
-msgstr ""
-
-#: config/c4x/c4x.opt:92
-msgid "Allow unsigned iteration counts for RPTB/DB"
-msgstr ""
-
-#: config/c4x/c4x.opt:96
-msgid "Pass arguments on the stack"
-msgstr ""
-
-#: config/c4x/c4x.opt:100
-msgid "Use MPYI instruction for C3x"
-msgstr ""
-
-#: config/c4x/c4x.opt:104
-msgid "Enable parallel instructions"
-msgstr ""
-
-#: config/c4x/c4x.opt:108
-msgid "Enable MPY||ADD and MPY||SUB instructions"
-msgstr ""
-
-#: config/c4x/c4x.opt:116
-msgid "Preserve all 40 bits of FP reg across call"
-msgstr ""
-
-#: config/c4x/c4x.opt:120
-msgid "Pass arguments in registers"
-msgstr ""
-
-#: config/c4x/c4x.opt:124
-msgid "Enable use of RTPB instruction"
-msgstr ""
-
-#: config/c4x/c4x.opt:128
-msgid "Enable use of RTPS instruction"
-msgstr ""
-
-#: config/c4x/c4x.opt:132
-msgid "Set the maximum number of iterations for RPTS to N"
-msgstr ""
-
-#: config/c4x/c4x.opt:136
-msgid "Small memory model"
-msgstr ""
-
-#: config/c4x/c4x.opt:140
-msgid "Emit code compatible with TI tools"
-msgstr ""
-
-#: config/fr30/fr30.opt:24
-msgid "Assume small address space"
-msgstr ""
-
-#: config/frv/frv.opt:24
-msgid "Use 4 media accumulators"
-msgstr ""
-
-#: config/frv/frv.opt:28
-msgid "Use 8 media accumulators"
-msgstr ""
-
-#: config/frv/frv.opt:32
-msgid "Enable label alignment optimizations"
-msgstr ""
-
-#: config/frv/frv.opt:36
-msgid "Dynamically allocate cc registers"
-msgstr ""
-
-#: config/frv/frv.opt:43
-msgid "Set the cost of branches"
-msgstr ""
-
-#: config/frv/frv.opt:47
-msgid "Enable conditional execution other than moves/scc"
-msgstr ""
-
-#: config/frv/frv.opt:51
-msgid "Change the maximum length of conditionally-executed sequences"
-msgstr ""
-
-#: config/frv/frv.opt:55
-msgid ""
-"Change the number of temporary registers that are available to conditionally-"
-"executed sequences"
-msgstr ""
-
-#: config/frv/frv.opt:59
-msgid "Enable conditional moves"
-msgstr ""
-
-#: config/frv/frv.opt:63
-msgid "Set the target CPU type"
-msgstr ""
-
-#: config/frv/frv.opt:85
-msgid "Use fp double instructions"
-msgstr ""
-
-#: config/frv/frv.opt:89
-msgid "Change the ABI to allow double word insns"
-msgstr ""
-
-#: config/frv/frv.opt:93
-msgid "Enable Function Descriptor PIC mode"
-msgstr ""
-
-#: config/frv/frv.opt:97
-msgid "Just use icc0/fcc0"
-msgstr ""
-
-#: config/frv/frv.opt:101
-msgid "Only use 32 FPRs"
-msgstr ""
-
-#: config/frv/frv.opt:105
-msgid "Use 64 FPRs"
-msgstr ""
-
-#: config/frv/frv.opt:109
-msgid "Only use 32 GPRs"
-msgstr ""
-
-#: config/frv/frv.opt:113
-msgid "Use 64 GPRs"
-msgstr ""
-
-#: config/frv/frv.opt:117
-msgid "Enable use of GPREL for read-only data in FDPIC"
-msgstr ""
-
-#: config/frv/frv.opt:125
-msgid "Enable inlining of PLT in function calls"
-msgstr ""
-
-#: config/frv/frv.opt:129
-msgid "Enable PIC support for building libraries"
-msgstr ""
-
-#: config/frv/frv.opt:133
-msgid "Follow the EABI linkage requirements"
-msgstr ""
-
-#: config/frv/frv.opt:137
-msgid "Disallow direct calls to global functions"
-msgstr ""
-
-#: config/frv/frv.opt:141
-msgid "Use media instructions"
-msgstr ""
-
-#: config/frv/frv.opt:145
-msgid "Use multiply add/subtract instructions"
-msgstr ""
-
-#: config/frv/frv.opt:149
-msgid "Enable optimizing &&/|| in conditional execution"
-msgstr ""
-
-#: config/frv/frv.opt:153
-msgid "Enable nested conditional execution optimizations"
-msgstr ""
-
-#: config/frv/frv.opt:158
-msgid "Do not mark ABI switches in e_flags"
-msgstr ""
-
-#: config/frv/frv.opt:162
-msgid "Pack VLIW instructions"
-msgstr ""
-
-#: config/frv/frv.opt:166
-msgid "Enable setting GPRs to the result of comparisons"
-msgstr ""
-
-#: config/frv/frv.opt:170
-msgid "Change the amount of scheduler lookahead"
-msgstr ""
-
-#: config/frv/frv.opt:178
-msgid "Assume a large TLS segment"
-msgstr ""
-
-#: config/frv/frv.opt:182
-msgid "Do not assume a large TLS segment"
-msgstr ""
-
-#: config/frv/frv.opt:187
-msgid "Cause gas to print tomcat statistics"
-msgstr ""
-
-#: config/frv/frv.opt:192
-msgid "Link with the library-pic libraries"
-msgstr ""
-
-#: config/frv/frv.opt:196
-msgid "Allow branches to be packed with other instructions"
-msgstr ""
-
-#: config/h8300/h8300.opt:24
-msgid "Generate H8S code"
-msgstr ""
-
-#: config/h8300/h8300.opt:28
-msgid "Generate H8SX code"
-msgstr ""
-
-#: config/h8300/h8300.opt:32
-msgid "Generate H8S/2600 code"
-msgstr ""
-
-#: config/h8300/h8300.opt:36
-msgid "Make integers 32 bits wide"
-msgstr ""
-
-#: config/h8300/h8300.opt:43
-msgid "Use registers for argument passing"
-msgstr ""
-
-#: config/h8300/h8300.opt:47
-msgid "Consider access to byte sized memory slow"
-msgstr ""
-
-#: config/h8300/h8300.opt:51
-msgid "Enable linker relaxing"
-msgstr ""
-
-#: config/h8300/h8300.opt:55
-msgid "Generate H8/300H code"
-msgstr ""
-
-#: config/h8300/h8300.opt:59
-msgid "Enable the normal mode"
-msgstr ""
-
-#: config/h8300/h8300.opt:63
-msgid "Use H8/300 alignment rules"
-msgstr ""
-
-#: config/i860/i860.opt:24
-msgid "Generate code which uses the FPU"
-msgstr ""
-
-#: config/i860/i860.opt:28 config/i860/i860.opt:32
-msgid "Do not generate code which uses the FPU"
-msgstr ""
-
-#: config/ia64/ia64.opt:3
-msgid "Generate big endian code"
-msgstr ""
-
-#: config/ia64/ia64.opt:7
-msgid "Generate little endian code"
-msgstr ""
-
-#: config/ia64/ia64.opt:11
-msgid "Generate code for GNU as"
-msgstr ""
-
-#: config/ia64/ia64.opt:15
-msgid "Generate code for GNU ld"
-msgstr ""
-
-#: config/ia64/ia64.opt:19
-msgid "Emit stop bits before and after volatile extended asms"
-msgstr ""
-
-#: config/ia64/ia64.opt:23
-msgid "Use in/loc/out register names"
-msgstr ""
-
-#: config/ia64/ia64.opt:30
-msgid "Enable use of sdata/scommon/sbss"
-msgstr ""
-
-#: config/ia64/ia64.opt:34
-msgid "Generate code without GP reg"
-msgstr ""
-
-#: config/ia64/ia64.opt:38
-msgid "gp is constant (but save/restore gp on indirect calls)"
-msgstr ""
-
-#: config/ia64/ia64.opt:42
-msgid "Generate self-relocatable code"
-msgstr ""
-
-#: config/ia64/ia64.opt:46
-msgid "Generate inline floating point division, optimize for latency"
-msgstr ""
-
-#: config/ia64/ia64.opt:50
-msgid "Generate inline floating point division, optimize for throughput"
-msgstr ""
-
-#: config/ia64/ia64.opt:57
-msgid "Generate inline integer division, optimize for latency"
-msgstr ""
-
-#: config/ia64/ia64.opt:61
-msgid "Generate inline integer division, optimize for throughput"
-msgstr ""
-
-#: config/ia64/ia64.opt:65
-msgid "Do not inline integer division"
-msgstr ""
-
-#: config/ia64/ia64.opt:69
-msgid "Generate inline square root, optimize for latency"
-msgstr ""
-
-#: config/ia64/ia64.opt:73
-msgid "Generate inline square root, optimize for throughput"
-msgstr ""
-
-#: config/ia64/ia64.opt:77
-msgid "Do not inline square root"
-msgstr ""
-
-#: config/ia64/ia64.opt:81
-msgid "Enable Dwarf 2 line debug info via GNU as"
-msgstr ""
-
-#: config/ia64/ia64.opt:85
-msgid "Enable earlier placing stop bits for better scheduling"
-msgstr ""
-
-#: config/ia64/ia64.opt:89
-msgid "Specify range of registers to make fixed"
-msgstr ""
-
-#: config/ia64/ilp32.opt:3
-msgid "Generate ILP32 code"
-msgstr ""
-
-#: config/ia64/ilp32.opt:7
-msgid "Generate LP64 code"
-msgstr ""
-
-#: config/iq2000/iq2000.opt:24
-msgid "Specify CPU for code generation purposes"
-msgstr ""
-
-#: config/iq2000/iq2000.opt:28
-msgid "Specify CPU for scheduling purposes"
-msgstr ""
-
-#: config/iq2000/iq2000.opt:32 config/mips/mips.opt:74
-msgid "Use ROM instead of RAM"
-msgstr ""
-
-#: config/iq2000/iq2000.opt:36
-msgid "Use GP relative sdata/sbss sections"
-msgstr ""
-
-#: config/iq2000/iq2000.opt:41
-msgid "No default crt0.o"
-msgstr ""
-
-#: config/iq2000/iq2000.opt:45 config/mips/mips.opt:210
-msgid "Put uninitialized constants in ROM (needs -membedded-data)"
-msgstr ""
-
-#: config/m32r/m32r.opt:24
-msgid "Compile for the m32rx"
-msgstr ""
-
-#: config/m32r/m32r.opt:28
-msgid "Compile for the m32r2"
-msgstr ""
-
-#: config/m32r/m32r.opt:32
-msgid "Compile for the m32r"
-msgstr ""
-
-#: config/m32r/m32r.opt:36
-msgid "Align all loops to 32 byte boundary"
-msgstr ""
-
-#: config/m32r/m32r.opt:40
-msgid "Prefer branches over conditional execution"
-msgstr ""
-
-#: config/m32r/m32r.opt:44
-msgid "Give branches their default cost"
-msgstr ""
-
-#: config/m32r/m32r.opt:48
-msgid "Display compile time statistics"
-msgstr ""
-
-#: config/m32r/m32r.opt:52
-msgid "Specify cache flush function"
-msgstr ""
-
-#: config/m32r/m32r.opt:56
-msgid "Specify cache flush trap number"
-msgstr ""
-
-#: config/m32r/m32r.opt:60
-msgid "Only issue one instruction per cycle"
-msgstr ""
-
-#: config/m32r/m32r.opt:64
-msgid "Allow two instructions to be issued per cycle"
-msgstr ""
-
-#: config/m32r/m32r.opt:68
-msgid "Code size: small, medium or large"
-msgstr ""
-
-#: config/m32r/m32r.opt:72
-msgid "Don't call any cache flush functions"
-msgstr ""
-
-#: config/m32r/m32r.opt:76
-msgid "Don't call any cache flush trap"
-msgstr ""
-
-#: config/m32r/m32r.opt:83
-msgid "Small data area: none, sdata, use"
-msgstr ""
-
-#: config/m68hc11/m68hc11.opt:24 config/m68hc11/m68hc11.opt:32
-msgid "Compile for a 68HC11"
-msgstr ""
-
-#: config/m68hc11/m68hc11.opt:28 config/m68hc11/m68hc11.opt:36
-msgid "Compile for a 68HC12"
-msgstr ""
-
-#: config/m68hc11/m68hc11.opt:42 config/m68hc11/m68hc11.opt:46
-msgid "Compile for a 68HCS12"
-msgstr ""
-
-#: config/m68hc11/m68hc11.opt:50
-msgid "Auto pre/post decrement increment allowed"
-msgstr ""
-
-#: config/m68hc11/m68hc11.opt:54
-msgid "Min/max instructions allowed"
-msgstr ""
-
-#: config/m68hc11/m68hc11.opt:58
-msgid "Use call and rtc for function calls and returns"
-msgstr ""
-
-#: config/m68hc11/m68hc11.opt:62
-msgid "Auto pre/post decrement increment not allowed"
-msgstr ""
-
-#: config/m68hc11/m68hc11.opt:66
-msgid "Use jsr and rts for function calls and returns"
-msgstr ""
-
-#: config/m68hc11/m68hc11.opt:70
-msgid "Min/max instructions not allowed"
-msgstr ""
-
-#: config/m68hc11/m68hc11.opt:74
-msgid "Use direct addressing mode for soft registers"
-msgstr ""
-
-#: config/m68hc11/m68hc11.opt:78
-msgid "Compile with 32-bit integer mode"
-msgstr ""
-
-#: config/m68hc11/m68hc11.opt:83
-msgid "Specify the register allocation order"
-msgstr ""
-
-#: config/m68hc11/m68hc11.opt:87
-msgid "Do not use direct addressing mode for soft registers"
-msgstr ""
-
-#: config/m68hc11/m68hc11.opt:91
-msgid "Compile with 16-bit integer mode"
-msgstr ""
-
-#: config/m68hc11/m68hc11.opt:95
-msgid "Indicate the number of soft registers available"
-msgstr ""
-
-#: config/mcore/mcore.opt:24
-msgid "Generate code for the M*Core M210"
-msgstr ""
-
-#: config/mcore/mcore.opt:28
-msgid "Generate code for the M*Core M340"
-msgstr ""
-
-#: config/mcore/mcore.opt:32
-msgid "Set maximum alignment to 4"
-msgstr ""
-
-#: config/mcore/mcore.opt:36
-msgid "Force functions to be aligned to a 4 byte boundary"
-msgstr ""
-
-#: config/mcore/mcore.opt:40
-msgid "Set maximum alignment to 8"
-msgstr ""
-
-#: config/mcore/mcore.opt:44
-msgid "Generate big-endian code"
-msgstr ""
-
-#: config/mcore/mcore.opt:48
-msgid "Emit call graph information"
-msgstr ""
-
-#: config/mcore/mcore.opt:52
-msgid "Use the divide instruction"
-msgstr ""
-
-#: config/mcore/mcore.opt:56
-msgid "Inline constants if it can be done in 2 insns or less"
-msgstr ""
-
-#: config/mcore/mcore.opt:60
-msgid "Generate little-endian code"
-msgstr ""
-
-#: config/mcore/mcore.opt:68
-msgid "Use arbitrary sized immediates in bit operations"
-msgstr ""
-
-#: config/mcore/mcore.opt:72
-msgid "Prefer word accesses over byte accesses"
-msgstr ""
-
-#: config/mcore/mcore.opt:76
-msgid "Set the maximum amount for a single stack increment operation"
-msgstr ""
-
-#: config/mcore/mcore.opt:80
-msgid "Always treat bitfields as int-sized"
-msgstr ""
-
-#: config/mips/mips.opt:24
-msgid "Generate code that conforms to the given ABI"
-msgstr ""
-
-#: config/mips/mips.opt:28
-msgid "Use SVR4-style PIC"
-msgstr ""
-
-#: config/mips/mips.opt:32
-msgid "Use PMC-style 'mad' instructions"
-msgstr ""
-
-#: config/mips/mips.opt:36
-msgid "Generate code for the given ISA"
-msgstr ""
-
-#: config/mips/mips.opt:40
-msgid "Use Branch Likely instructions, overriding the architecture default"
-msgstr ""
-
-#: config/mips/mips.opt:44
-msgid "Trap on integer divide by zero"
-msgstr ""
-
-#: config/mips/mips.opt:48
-msgid "Use branch-and-break sequences to check for integer divide by zero"
-msgstr ""
-
-#: config/mips/mips.opt:52
-msgid "Use trap instructions to check for integer divide by zero"
-msgstr ""
-
-#: config/mips/mips.opt:56
-msgid ""
-"Allow hardware floating-point instructions to cover both 32-bit and 64-bit "
-"operations"
-msgstr ""
-
-#: config/mips/mips.opt:66
-msgid "Use big-endian byte order"
-msgstr ""
-
-#: config/mips/mips.opt:70
-msgid "Use little-endian byte order"
-msgstr ""
-
-#: config/mips/mips.opt:78
-msgid "Use NewABI-style %reloc() assembly operators"
-msgstr ""
-
-#: config/mips/mips.opt:82
-msgid "Work around certain R4000 errata"
-msgstr ""
-
-#: config/mips/mips.opt:86
-msgid "Work around certain R4400 errata"
-msgstr ""
-
-#: config/mips/mips.opt:90
-msgid "Work around errata for early SB-1 revision 2 cores"
-msgstr ""
-
-#: config/mips/mips.opt:94
-msgid "Work around certain VR4120 errata"
-msgstr ""
-
-#: config/mips/mips.opt:98
-msgid "Work around VR4130 mflo/mfhi errata"
-msgstr ""
-
-#: config/mips/mips.opt:102
-msgid "Work around an early 4300 hardware bug"
-msgstr ""
-
-#: config/mips/mips.opt:106
-msgid "FP exceptions are enabled"
-msgstr ""
-
-#: config/mips/mips.opt:110
-msgid "Use 32-bit floating-point registers"
-msgstr ""
-
-#: config/mips/mips.opt:114
-msgid "Use 64-bit floating-point registers"
-msgstr ""
-
-#: config/mips/mips.opt:118
-msgid "Use FUNC to flush the cache before calling stack trampolines"
-msgstr ""
-
-#: config/mips/mips.opt:122
-msgid "Generate floating-point multiply-add instructions"
-msgstr ""
-
-#: config/mips/mips.opt:126
-msgid "Use 32-bit general registers"
-msgstr ""
-
-#: config/mips/mips.opt:130
-msgid "Use 64-bit general registers"
-msgstr ""
-
-#: config/mips/mips.opt:134
-msgid "Allow the use of hardware floating-point instructions"
-msgstr ""
-
-#: config/mips/mips.opt:138
-msgid "Use a 64-bit int type"
-msgstr ""
-
-#: config/mips/mips.opt:142
-msgid "Generate code for ISA level N"
-msgstr ""
-
-#: config/mips/mips.opt:146
-msgid "Generate mips16 code"
-msgstr ""
-
-#: config/mips/mips.opt:150
-msgid "Use MIPS-3D instructions"
-msgstr ""
-
-#: config/mips/mips.opt:154
-msgid "Use indirect calls"
-msgstr ""
-
-#: config/mips/mips.opt:158
-msgid "Use a 32-bit long type"
-msgstr ""
-
-#: config/mips/mips.opt:162
-msgid "Use a 64-bit long type"
-msgstr ""
-
-#: config/mips/mips.opt:166
-msgid "Don't optimize block moves"
-msgstr ""
-
-#: config/mips/mips.opt:170
-msgid "Use the mips-tfile postpass"
-msgstr ""
-
-#: config/mips/mips.opt:174
-msgid "Do not use a cache-flushing function before calling stack trampolines"
-msgstr ""
-
-#: config/mips/mips.opt:178
-msgid "Generate normal-mode code"
-msgstr ""
-
-#: config/mips/mips.opt:182
-msgid "Do not use MIPS-3D instructions"
-msgstr ""
-
-#: config/mips/mips.opt:186
-msgid "Use paired-single floating-point instructions"
-msgstr ""
-
-#: config/mips/mips.opt:190
-msgid ""
-"Restrict the use of hardware floating-point instructions to 32-bit operations"
-msgstr ""
-
-#: config/mips/mips.opt:194
-msgid "Prevent the use of all hardware floating-point instructions"
-msgstr ""
-
-#: config/mips/mips.opt:198
-msgid "Optimize lui/addiu address loads"
-msgstr ""
-
-#: config/mips/mips.opt:202
-msgid "Assume all symbols have 32-bit values"
-msgstr ""
-
-#: config/mips/mips.opt:206
-msgid "Optimize the output for PROCESSOR"
-msgstr ""
-
-#: config/mips/mips.opt:214
-msgid "Perform VR4130-specific alignment optimizations"
-msgstr ""
-
-#: config/mips/mips.opt:218
-msgid "Lift restrictions on GOT size"
-msgstr ""
-
-#: config/mn10300/mn10300.opt:24
-msgid "Target the AM33 processor"
-msgstr ""
-
-#: config/mn10300/mn10300.opt:28
-msgid "Target the AM33/2.0 processor"
-msgstr ""
-
-#: config/mn10300/mn10300.opt:32
-msgid "Work around hardware multiply bug"
-msgstr ""
-
-#: config/mn10300/mn10300.opt:37
-msgid "Enable linker relaxations"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:24
-msgid "Optimize for 32032"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:32
-msgid "Optimize for 32332"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:36
-msgid "Use the 32381 fpu"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:40
-msgid "Optimize for 32532"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:44
-msgid "Use bit-field instructions"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:48
-msgid "Generate code for high memory"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:56
-msgid "Use multiply-accumulate fp instructions"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:60
-msgid "Do not use bit-field instructions"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:64
-msgid "Generate code for low memory"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:72
-msgid "Do not use multiply-accumulate fp instructions"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:76
-msgid "Pass all arguments on the stack"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:80
-msgid "Use the normal calling convention"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:84
-msgid "Do not use register sb"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:88
-msgid "Do not use the 'small register classes' kludge"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:92
-msgid "Pass some arguments in registers"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:96
-msgid "Use an alternative calling convention"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:100
-msgid "Register sb is zero, use it for absolute addressing"
-msgstr ""
-
-#: config/ns32k/ns32k.opt:108
-msgid "Use the 'small register classes' kludge"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:24
-msgid "Generate code for an 11/10"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:28
-msgid "Generate code for an 11/40"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:32
-msgid "Generate code for an 11/45"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:36
-msgid "Use 16-bit abs patterns"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:40
-msgid "Return floating-point results in ac0 (fr0 in Unix assembler syntax)"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:44
-msgid "Do not use inline patterns for copying memory"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:48
-msgid "Use inline patterns for copying memory"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:52
-msgid "Do not pretend that branches are expensive"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:56
-msgid "Pretend that branches are expensive"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:60
-msgid "Use the DEC assembler syntax"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:64
-msgid "Use 32 bit float"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:68
-msgid "Use 64 bit float"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:76
-msgid "Use 16 bit int"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:80
-msgid "Use 32 bit int"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:88
-msgid "Target has split I&D"
-msgstr ""
-
-#: config/pdp11/pdp11.opt:92
-msgid "Use UNIX assembler syntax"
-msgstr ""
-
-#: config/stormy16/stormy16.opt:25
-msgid "Provide libraries for the simulator"
-msgstr ""
-
-#: config/v850/v850.opt:24
-msgid "Use registers r2 and r5"
-msgstr ""
-
-#: config/v850/v850.opt:28
-msgid "Use 4 byte entries in switch tables"
-msgstr ""
-
-#: config/v850/v850.opt:32
-msgid "Enable backend debugging"
-msgstr ""
-
-#: config/v850/v850.opt:36
-msgid "Do not use the callt instruction"
-msgstr ""
-
-#: config/v850/v850.opt:40
-msgid "Reuse r30 on a per function basis"
-msgstr ""
-
-#: config/v850/v850.opt:44
-msgid "Support Green Hills ABI"
-msgstr ""
-
-#: config/v850/v850.opt:48
-msgid "Prohibit PC relative function calls"
-msgstr ""
-
-#: config/v850/v850.opt:52
-msgid "Use stubs for function prologues"
-msgstr ""
-
-#: config/v850/v850.opt:56
-msgid "Set the max size of data eligible for the SDA area"
-msgstr ""
-
-#: config/v850/v850.opt:60
-msgid "Enable the use of the short load instructions"
-msgstr ""
-
-#: config/v850/v850.opt:64
-msgid "Same as: -mep -mprolog-function"
-msgstr ""
-
-#: config/v850/v850.opt:68
-msgid "Set the max size of data eligible for the TDA area"
-msgstr ""
-
-#: config/v850/v850.opt:72
-msgid "Enforce strict alignment"
-msgstr ""
-
-#: config/v850/v850.opt:79
-msgid "Compile for the v850 processor"
-msgstr ""
-
-#: config/v850/v850.opt:83
-msgid "Compile for the v850e processor"
-msgstr ""
-
-#: config/v850/v850.opt:87
-msgid "Compile for the v850e1 processor"
-msgstr ""
-
-#: config/v850/v850.opt:91
-msgid "Set the max size of data eligible for the ZDA area"
-msgstr ""
-
-#: config/vax/vax.opt:24 config/vax/vax.opt:28
-msgid "Target DFLOAT double precision code"
-msgstr ""
-
-#: config/vax/vax.opt:32 config/vax/vax.opt:36
-msgid "Generate GFLOAT double precision code"
-msgstr ""
-
-#: config/vax/vax.opt:40
-msgid "Generate code for GNU assembler (gas)"
-msgstr ""
-
-#: config/vax/vax.opt:44
-msgid "Generate code for UNIX assembler"
-msgstr ""
-
-#: config/vax/vax.opt:48
-msgid "Use VAXC structure conventions"
-msgstr ""
-
-#: config/bfin/bfin.opt:24
-msgid "Omit frame pointer for leaf functions"
-msgstr ""
-
-#: config/bfin/bfin.opt:28
-msgid "Program is entirely located in low 64k of memory."
-msgstr ""
-
-#: config/bfin/bfin.opt:32
-msgid "Avoid speculative loads by inserting CSYNC or equivalent"
-msgstr ""
-
-#: config/bfin/bfin.opt:36
-msgid "Enabled ID based shared library"
-msgstr ""
-
-#: java/lang.opt:66
-msgid "Warn if a deprecated compiler feature, class, method, or field is used"
-msgstr ""
-
-#: java/lang.opt:70
-msgid "Warn if deprecated empty statements are found"
-msgstr ""
-
-#: java/lang.opt:74
-msgid "Warn if .class files are out of date"
-msgstr ""
-
-#: java/lang.opt:78
-msgid "Warn if modifiers are specified when not necessary"
-msgstr ""
-
-#: java/lang.opt:82
-msgid "Deprecated; use --classpath instead"
-msgstr ""
-
-#: java/lang.opt:86
-msgid "Permit the use of the assert keyword"
-msgstr ""
-
-#: java/lang.opt:108
-msgid "Replace system path"
-msgstr ""
-
-#: java/lang.opt:112
-msgid "Generate checks for references to NULL"
-msgstr ""
-
-#: java/lang.opt:116
-msgid "Set class path"
-msgstr ""
-
-#: java/lang.opt:123
-msgid "Output a class file"
-msgstr ""
-
-#: java/lang.opt:127
-msgid "Alias for -femit-class-file"
-msgstr ""
-
-#: java/lang.opt:131
-msgid "Choose input encoding (defaults from your locale)"
-msgstr ""
-
-#: java/lang.opt:135
-msgid "Set the extension directory path"
-msgstr ""
-
-#: java/lang.opt:139
-msgid "Input file is a file with a list of filenames to compile"
-msgstr ""
-
-#: java/lang.opt:143
-msgid "Always check for non gcj generated classes archives"
-msgstr ""
-
-#: java/lang.opt:147
-msgid ""
-"Assume the runtime uses a hash table to map an object to its synchronization "
-"structure"
-msgstr ""
-
-#: java/lang.opt:151
-msgid "Use offset tables for virtual method calls"
-msgstr ""
-
-#: java/lang.opt:158
-msgid "Assume native functions are implemented using JNI"
-msgstr ""
-
-#: java/lang.opt:162
-msgid "Enable optimization of static class initialization code"
-msgstr ""
-
-#: java/lang.opt:169
-msgid "Enable assignability checks for stores into object arrays"
-msgstr ""
-
-#: java/lang.opt:173
-msgid "Generate code for the Boehm GC"
-msgstr ""
-
-#: java/lang.opt:177
-msgid "Call a library routine to do integer divisions"
-msgstr ""
-
-#: c.opt:42
-msgid ""
-"Assert the <answer> to <question>. Putting '-' before <question> disables "
-"the <answer> to <question>"
-msgstr ""
-
-#: c.opt:46
-msgid "Do not discard comments"
-msgstr ""
-
-#: c.opt:50
-msgid "Do not discard comments in macro expansions"
-msgstr ""
-
-#: c.opt:54
-msgid ""
-"Define a <macro> with <val> as its value. If just <macro> is given, <val> "
-"is taken to be 1"
-msgstr ""
-
-#: c.opt:61
-msgid "Add <dir> to the end of the main framework include path"
-msgstr ""
-
-#: c.opt:65
-msgid "Print the name of header files as they are used"
-msgstr ""
-
-#: c.opt:69 c.opt:725
-msgid "Add <dir> to the end of the main include path"
-msgstr ""
-
-#: c.opt:73
-msgid "Generate make dependencies"
-msgstr ""
-
-#: c.opt:77
-msgid "Generate make dependencies and compile"
-msgstr ""
-
-#: c.opt:81
-msgid "Write dependency output to the given file"
-msgstr ""
-
-#: c.opt:85
-msgid "Treat missing header files as generated files"
-msgstr ""
-
-#: c.opt:89
-msgid "Like -M but ignore system header files"
-msgstr ""
-
-#: c.opt:93
-msgid "Like -MD but ignore system header files"
-msgstr ""
-
-#: c.opt:97
-msgid "Generate phony targets for all headers"
-msgstr ""
-
-#: c.opt:101
-msgid "Add a MAKE-quoted target"
-msgstr ""
-
-#: c.opt:105
-msgid "Add an unquoted target"
-msgstr ""
-
-#: c.opt:109
-msgid "Do not generate #line directives"
-msgstr ""
-
-#: c.opt:113
-msgid "Undefine <macro>"
-msgstr ""
-
-#: c.opt:117
-msgid ""
-"Warn about things that will change when compiling with an ABI-compliant "
-"compiler"
-msgstr ""
-
-#: c.opt:121
-msgid "Enable most warning messages"
-msgstr ""
-
-#: c.opt:125
-msgid "Warn about casting functions to incompatible types"
-msgstr ""
-
-#: c.opt:129
-msgid "Warn about casts which discard qualifiers"
-msgstr ""
-
-#: c.opt:133
-msgid "Warn about subscripts whose type is \"char\""
-msgstr ""
-
-#: c.opt:137
-msgid ""
-"Warn about possibly nested block comments, and C++ comments spanning more "
-"than one physical line"
-msgstr ""
-
-#: c.opt:141
-msgid "Synonym for -Wcomment"
-msgstr ""
-
-#: c.opt:145
-msgid "Warn about possibly confusing type conversions"
-msgstr ""
-
-#: c.opt:149
-msgid "Warn when all constructors and destructors are private"
-msgstr ""
-
-#: c.opt:153
-msgid "Warn when a declaration is found after a statement"
-msgstr ""
-
-#: c.opt:157
-msgid "Warn about deprecated compiler features"
-msgstr ""
-
-#: c.opt:161
-msgid "Warn about compile-time integer division by zero"
-msgstr ""
-
-#: c.opt:165
-msgid "Warn about violations of Effective C++ style rules"
-msgstr ""
-
-#: c.opt:169
-msgid "Warn about stray tokens after #elif and #endif"
-msgstr ""
-
-#: c.opt:177
-msgid "Make implicit function declarations an error"
-msgstr ""
-
-#: c.opt:181
-msgid "Warn if testing floating point numbers for equality"
-msgstr ""
-
-#: c.opt:185
-msgid "Warn about printf/scanf/strftime/strfmon format string anomalies"
-msgstr ""
-
-#: c.opt:189
-msgid "Warn if passing too many arguments to a function for its format string"
-msgstr ""
-
-#: c.opt:193
-msgid "Warn about format strings that are not literals"
-msgstr ""
-
-#: c.opt:197
-msgid "Warn about possible security problems with format functions"
-msgstr ""
-
-#: c.opt:201
-msgid "Warn about strftime formats yielding 2-digit years"
-msgstr ""
-
-#: c.opt:205
-msgid "Warn about zero-length formats"
-msgstr ""
-
-#: c.opt:212
-msgid "Warn about variables which are initialized to themselves."
-msgstr ""
-
-#: c.opt:219
-msgid "Warn about implicit function declarations"
-msgstr ""
-
-#: c.opt:223
-msgid "Warn when a declaration does not specify a type"
-msgstr ""
-
-#: c.opt:227
-msgid "Deprecated. This switch has no effect."
-msgstr ""
-
-#: c.opt:231
-msgid "Warn about invalid uses of the \"offsetof\" macro"
-msgstr ""
-
-#: c.opt:235
-msgid "Warn about PCH files that are found but not used"
-msgstr ""
-
-#: c.opt:239
-msgid "Do not warn about using \"long long\" when -pedantic"
-msgstr ""
-
-#: c.opt:243
-msgid "Warn about suspicious declarations of \"main\""
-msgstr ""
-
-#: c.opt:247
-msgid "Warn about possibly missing braces around initializers"
-msgstr ""
-
-#: c.opt:251
-msgid "Warn about global functions without previous declarations"
-msgstr ""
-
-#: c.opt:255
-msgid "Warn about missing fields in struct initializers"
-msgstr ""
-
-#: c.opt:259
-msgid "Warn about functions which might be candidates for format attributes"
-msgstr ""
-
-#: c.opt:263
-msgid "Warn about user-specified include directories that do not exist"
-msgstr ""
-
-#: c.opt:267
-msgid "Warn about global functions without prototypes"
-msgstr ""
-
-#: c.opt:271
-msgid "Warn about use of multi-character character constants"
-msgstr ""
-
-#: c.opt:275
-msgid "Warn about \"extern\" declarations not at file scope"
-msgstr ""
-
-#: c.opt:279
-msgid ""
-"Warn when non-templatized friend functions are declared within a template"
-msgstr ""
-
-#: c.opt:283
-msgid "Warn about non-virtual destructors"
-msgstr ""
-
-#: c.opt:287
-msgid ""
-"Warn about NULL being passed to argument slots marked as requiring non-NULL"
-msgstr ""
-
-#: c.opt:291
-msgid "Warn about non-normalised Unicode strings"
-msgstr ""
-
-#: c.opt:295
-msgid "Warn if a C-style cast is used in a program"
-msgstr ""
-
-#: c.opt:299
-msgid "Warn if an old-style parameter definition is used"
-msgstr ""
-
-#: c.opt:303
-msgid "Warn about overloaded virtual function names"
-msgstr ""
-
-#: c.opt:307
-msgid "Warn about possibly missing parentheses"
-msgstr ""
-
-#: c.opt:311
-msgid "Warn when converting the type of pointers to member functions"
-msgstr ""
-
-#: c.opt:315
-msgid "Warn about function pointer arithmetic"
-msgstr ""
-
-#: c.opt:319
-msgid "Warn if inherited methods are unimplemented"
-msgstr ""
-
-#: c.opt:323
-msgid "Warn about multiple declarations of the same object"
-msgstr ""
-
-#: c.opt:327
-msgid "Warn when the compiler reorders code"
-msgstr ""
-
-#: c.opt:331
-msgid ""
-"Warn whenever a function's return type defaults to \"int\" (C), or about "
-"inconsistent return types (C++)"
-msgstr ""
-
-#: c.opt:335
-msgid "Warn if a selector has multiple methods"
-msgstr ""
-
-#: c.opt:339
-msgid "Warn about possible violations of sequence point rules"
-msgstr ""
-
-#: c.opt:343
-msgid "Warn about signed-unsigned comparisons"
-msgstr ""
-
-#: c.opt:347
-msgid "Warn when overload promotes from unsigned to signed"
-msgstr ""
-
-#: c.opt:351
-msgid "Warn about unprototyped function declarations"
-msgstr ""
-
-#: c.opt:355
-msgid "Warn when synthesis behavior differs from Cfront"
-msgstr ""
-
-#: c.opt:359 common.opt:130
-msgid "Do not suppress warnings from system headers"
-msgstr ""
-
-#: c.opt:363
-msgid "Warn about features not present in traditional C"
-msgstr ""
-
-#: c.opt:367
-msgid ""
-"Warn if trigraphs are encountered that might affect the meaning of the "
-"program"
-msgstr ""
-
-#: c.opt:371
-msgid "Warn about @selector()s without previously declared methods"
-msgstr ""
-
-#: c.opt:375
-msgid "Warn if an undefined macro is used in an #if directive"
-msgstr ""
-
-#: c.opt:379
-msgid "Warn about unrecognized pragmas"
-msgstr ""
-
-#: c.opt:383
-msgid "Warn about macros defined in the main file that are not used"
-msgstr ""
-
-#: c.opt:387
-msgid "Do not warn about using variadic macros when -pedantic"
-msgstr ""
-
-#: c.opt:391
-msgid "Give strings the type \"array of char\""
-msgstr ""
-
-#: c.opt:395
-msgid "Warn when a pointer differs in signedness in an assignment."
-msgstr ""
-
-#: c.opt:399
-msgid "A synonym for -std=c89 (for C) or -std=c++98 (for C++)."
-msgstr ""
-
-#: c.opt:407
-msgid "Enforce class member access control semantics"
-msgstr ""
-
-#: c.opt:414
-msgid "Change when template instances are emitted"
-msgstr ""
-
-#: c.opt:418
-msgid "Recognize the \"asm\" keyword"
-msgstr ""
-
-#: c.opt:422
-msgid "Recognize built-in functions"
-msgstr ""
-
-#: c.opt:429
-msgid "Check the return value of new"
-msgstr ""
-
-#: c.opt:433
-msgid "Allow the arguments of the '?' operator to have different types"
-msgstr ""
-
-#: c.opt:437
-msgid "Reduce the size of object files"
-msgstr ""
-
-#: c.opt:441
-msgid "Make string literals \"const char[]\" not \"char[]\""
-msgstr ""
-
-#: c.opt:445
-msgid "Use class <name> for constant strings"
-msgstr ""
-
-#: c.opt:449
-msgid "Inline member functions by default"
-msgstr ""
-
-#: c.opt:453
-msgid "Permit '$' as an identifier character"
-msgstr ""
-
-#: c.opt:460
-msgid "Generate code to check exception specifications"
-msgstr ""
-
-#: c.opt:467
-msgid "Convert all strings and character constants to character set <cset>"
-msgstr ""
-
-#: c.opt:471
-msgid "Specify the default character set for source files."
-msgstr ""
-
-#: c.opt:485
-msgid "Scope of for-init-statement variables is local to the loop"
-msgstr ""
-
-#: c.opt:489
-msgid "Do not assume that standard C libraries and \"main\" exist"
-msgstr ""
-
-#: c.opt:493
-msgid "Recognize GNU-defined keywords"
-msgstr ""
-
-#: c.opt:497
-msgid "Generate code for GNU runtime environment"
-msgstr ""
-
-#: c.opt:510
-msgid "Assume normal C execution environment"
-msgstr ""
-
-#: c.opt:514
-msgid "Enable support for huge objects"
-msgstr ""
-
-#: c.opt:518
-msgid "Export functions even if they can be inlined"
-msgstr ""
-
-#: c.opt:522
-msgid "Emit implicit instantiations of inline templates"
-msgstr ""
-
-#: c.opt:526
-msgid "Emit implicit instantiations of templates"
-msgstr ""
-
-#: c.opt:533
-msgid "Don't warn about uses of Microsoft extensions"
-msgstr ""
-
-#: c.opt:543
-msgid "Generate code for NeXT (Apple Mac OS X) runtime environment"
-msgstr ""
-
-#: c.opt:547
-msgid "Assume that receivers of Objective-C messages may be nil"
-msgstr ""
-
-#: c.opt:557
-msgid "Enable Objective-C exception and synchronization syntax"
-msgstr ""
-
-#: c.opt:561
-msgid "Enable Objective-C setjmp exception handling runtime"
-msgstr ""
-
-#: c.opt:565
-msgid "Recognize C++ kewords like \"compl\" and \"xor\""
-msgstr ""
-
-#: c.opt:569
-msgid "Enable optional diagnostics"
-msgstr ""
-
-#: c.opt:576
-msgid "Look for and use PCH files even when preprocessing"
-msgstr ""
-
-#: c.opt:580
-msgid "Downgrade conformance errors to warnings"
-msgstr ""
-
-#: c.opt:584
-msgid "Treat the input file as already preprocessed"
-msgstr ""
-
-#: c.opt:588
-msgid ""
-"Used in Fix-and-Continue mode to indicate that object files may be swapped "
-"in at runtime"
-msgstr ""
-
-#: c.opt:592
-msgid "Enable automatic template instantiation"
-msgstr ""
-
-#: c.opt:596
-msgid "Generate run time type descriptor information"
-msgstr ""
-
-#: c.opt:600
-msgid "Use the same size for double as for float"
-msgstr ""
-
-#: c.opt:604
-msgid "Use the narrowest integer type possible for enumeration types"
-msgstr ""
-
-#: c.opt:608
-msgid "Force the underlying type for \"wchar_t\" to be \"unsigned short\""
-msgstr ""
-
-#: c.opt:612
-msgid "When \"signed\" or \"unsigned\" is not given make the bitfield signed"
-msgstr ""
-
-#: c.opt:616
-msgid "Make \"char\" signed by default"
-msgstr ""
-
-#: c.opt:623
-msgid "Display statistics accumulated during compilation"
-msgstr ""
-
-#: c.opt:630
-msgid "Distance between tab stops for column reporting"
-msgstr ""
-
-#: c.opt:634
-msgid "Specify maximum template instantiation depth"
-msgstr ""
-
-#: c.opt:641
-msgid "Do not generate thread-safe code for initializing local statics."
-msgstr ""
-
-#: c.opt:645
-msgid "When \"signed\" or \"unsigned\" is not given make the bitfield unsigned"
-msgstr ""
-
-#: c.opt:649
-msgid "Make \"char\" unsigned by default"
-msgstr ""
-
-#: c.opt:653
-msgid "Use __cxa_atexit to register destructors"
-msgstr ""
-
-#: c.opt:657
-msgid "Marks all inlined methods as having hidden visibility"
-msgstr ""
-
-#: c.opt:661
-msgid "Discard unused virtual functions"
-msgstr ""
-
-#: c.opt:665
-msgid "Implement vtables using thunks"
-msgstr ""
-
-#: c.opt:669
-msgid "Emit common-like symbols as weak symbols"
-msgstr ""
-
-#: c.opt:673
-msgid ""
-"Convert all wide strings and character constants to character set <cset>"
-msgstr ""
-
-#: c.opt:677
-msgid "Generate a #line directive pointing at the current working directory"
-msgstr ""
-
-#: c.opt:681
-msgid "Emit cross referencing information"
-msgstr ""
-
-#: c.opt:685
-msgid ""
-"Generate lazy class lookup (via objc_getClass()) for use in Zero-Link mode"
-msgstr ""
-
-#: c.opt:689
-msgid "Dump declarations to a .decl file"
-msgstr ""
-
-#: c.opt:693 c.opt:721
-msgid "Add <dir> to the end of the system include path"
-msgstr ""
-
-#: c.opt:697
-msgid "Accept definition of macros in <file>"
-msgstr ""
-
-#: c.opt:701
-msgid "Include the contents of <file> before other files"
-msgstr ""
-
-#: c.opt:705
-msgid "Specify <path> as a prefix for next two options"
-msgstr ""
-
-#: c.opt:709
-msgid "Set <dir> to be the system root directory"
-msgstr ""
-
-#: c.opt:713
-msgid "Add <dir> to the start of the system include path"
-msgstr ""
-
-#: c.opt:717
-msgid "Add <dir> to the end of the quote include path"
-msgstr ""
-
-#: c.opt:735
-msgid ""
-"Do not search standard system include directories (those specified with -"
-"isystem will still be used)"
-msgstr ""
-
-#: c.opt:739
-msgid "Do not search standard system include directories for C++"
-msgstr ""
-
-#: c.opt:755
-msgid "Generate C header of platform-specific features"
-msgstr ""
-
-#: c.opt:759
-msgid "Remap file names when including files"
-msgstr ""
-
-#: c.opt:763
-msgid "Conform to the ISO 1998 C++ standard"
-msgstr ""
-
-#: c.opt:767 c.opt:795
-msgid "Conform to the ISO 1990 C standard"
-msgstr ""
-
-#: c.opt:771 c.opt:803
-msgid "Conform to the ISO 1999 C standard"
-msgstr ""
-
-#: c.opt:775
-msgid "Deprecated in favor of -std=c99"
-msgstr ""
-
-#: c.opt:779
-msgid "Conform to the ISO 1998 C++ standard with GNU extensions"
-msgstr ""
-
-#: c.opt:783
-msgid "Conform to the ISO 1990 C standard with GNU extensions"
-msgstr ""
-
-#: c.opt:787
-msgid "Conform to the ISO 1999 C standard with GNU extensions"
-msgstr ""
-
-#: c.opt:791
-msgid "Deprecated in favor of -std=gnu99"
-msgstr ""
-
-#: c.opt:799
-msgid "Conform to the ISO 1990 C standard as amended in 1994"
-msgstr ""
-
-#: c.opt:807
-msgid "Deprecated in favor of -std=iso9899:1999"
-msgstr ""
-
-#: c.opt:811
-msgid "Enable traditional preprocessing"
-msgstr ""
-
-#: c.opt:815
-msgid "Support ISO C trigraphs"
-msgstr ""
-
-#: c.opt:819
-msgid "Do not predefine system-specific and GCC-specific macros"
-msgstr ""
-
-#: c.opt:823
-msgid "Enable verbose output"
-msgstr ""
-
-#: common.opt:28
-msgid "Display this information"
-msgstr ""
-
-#: common.opt:32
-msgid ""
-"Set parameter <param> to value. See below for a complete list of parameters"
-msgstr ""
-
-#: common.opt:42
-msgid ""
-"Put global and static data smaller than <number> bytes into a special "
-"section (on some targets)"
-msgstr ""
-
-#: common.opt:46
-msgid "Set optimization level to <number>"
-msgstr ""
-
-#: common.opt:50
-msgid "Optimize for space rather than speed"
-msgstr ""
-
-#: common.opt:54
-msgid "This switch is deprecated; use -Wextra instead"
-msgstr ""
-
-#: common.opt:58
-msgid "Warn about returning structures, unions or arrays"
-msgstr ""
-
-#: common.opt:62
-msgid "Warn about pointer casts which increase alignment"
-msgstr ""
-
-#: common.opt:66
-msgid "Warn about uses of __attribute__((deprecated)) declarations"
-msgstr ""
-
-#: common.opt:70
-msgid "Warn when an optimization pass is disabled"
-msgstr ""
-
-#: common.opt:74
-msgid "Treat all warnings as errors"
-msgstr ""
-
-#: common.opt:78
-msgid "Print extra (possibly unwanted) warnings"
-msgstr ""
-
-#: common.opt:82
-msgid "Exit on the first error occurred"
-msgstr ""
-
-#: common.opt:86
-msgid "Warn when an inlined function cannot be inlined"
-msgstr ""
-
-#: common.opt:90
-msgid "Warn if an object is larger than <number> bytes"
-msgstr ""
-
-#: common.opt:94
-msgid ""
-"Warn about functions which might be candidates for __attribute__((noreturn))"
-msgstr ""
-
-#: common.opt:98
-msgid "Warn when the packed attribute has no effect on struct layout"
-msgstr ""
-
-#: common.opt:102
-msgid "Warn when padding is required to align structure members"
-msgstr ""
-
-#: common.opt:106
-msgid "Warn when one local variable shadows another"
-msgstr ""
-
-#: common.opt:110 common.opt:114
-msgid "Warn about code which might break strict aliasing rules"
-msgstr ""
-
-#: common.opt:118
-msgid "Warn about enumerated switches, with no default, missing a case"
-msgstr ""
-
-#: common.opt:122
-msgid "Warn about enumerated switches missing a \"default:\" statement"
-msgstr ""
-
-#: common.opt:126
-msgid "Warn about all enumerated switches missing a specific case"
-msgstr ""
-
-#: common.opt:134
-msgid "Warn about uninitialized automatic variables"
-msgstr ""
-
-#: common.opt:138
-msgid "Warn about code that will never be executed"
-msgstr ""
-
-#: common.opt:142
-msgid "Enable all -Wunused- warnings"
-msgstr ""
-
-#: common.opt:146
-msgid "Warn when a function is unused"
-msgstr ""
-
-#: common.opt:150 fortran/lang.opt:70
-msgid "Warn when a label is unused"
-msgstr ""
-
-#: common.opt:154
-msgid "Warn when a function parameter is unused"
-msgstr ""
-
-#: common.opt:158
-msgid "Warn when an expression value is unused"
-msgstr ""
-
-#: common.opt:162
-msgid "Warn when a variable is unused"
-msgstr ""
-
-#: common.opt:166
-msgid "Emit declaration information into <file>"
-msgstr ""
-
-#: common.opt:179
-msgid "Enable dumps from specific passes of the compiler"
-msgstr ""
-
-#: common.opt:183
-msgid "Set the file basename to be used for dumps"
-msgstr ""
-
-#: common.opt:201
-msgid "Align the start of functions"
-msgstr ""
-
-#: common.opt:208
-msgid "Align labels which are only reached by jumping"
-msgstr ""
-
-#: common.opt:215
-msgid "Align all labels"
-msgstr ""
-
-#: common.opt:222
-msgid "Align the start of loops"
-msgstr ""
-
-#: common.opt:236
-msgid "Specify that arguments may alias each other and globals"
-msgstr ""
-
-#: common.opt:240
-msgid "Assume arguments may alias globals but not each other"
-msgstr ""
-
-#: common.opt:244
-msgid "Assume arguments alias neither each other nor globals"
-msgstr ""
-
-#: common.opt:248
-msgid "Generate unwind tables that are exact at each instruction boundary"
-msgstr ""
-
-#: common.opt:256
-msgid "Generate code to check bounds before indexing arrays"
-msgstr ""
-
-#: common.opt:260
-msgid "Replace add, compare, branch with branch on count register"
-msgstr ""
-
-#: common.opt:264
-msgid "Use profiling information for branch probabilities"
-msgstr ""
-
-#: common.opt:268
-msgid ""
-"Perform branch target load optimization before prologue / epilogue threading"
-msgstr ""
-
-#: common.opt:272
-msgid ""
-"Perform branch target load optimization after prologue / epilogue threading"
-msgstr ""
-
-#: common.opt:276
-msgid ""
-"Restrict target load migration not to re-use registers in any basic block"
-msgstr ""
-
-#: common.opt:280
-msgid "Mark <register> as being preserved across functions"
-msgstr ""
-
-#: common.opt:284
-msgid "Mark <register> as being corrupted by function calls"
-msgstr ""
-
-#: common.opt:291
-msgid "Save registers around function calls"
-msgstr ""
-
-#: common.opt:295
-msgid "Do not put uninitialized globals in the common section"
-msgstr ""
-
-#: common.opt:299
-msgid "Perform a register copy-propagation optimization pass"
-msgstr ""
-
-#: common.opt:303
-msgid "Perform cross-jumping optimization"
-msgstr ""
-
-#: common.opt:307
-msgid "When running CSE, follow jumps to their targets"
-msgstr ""
-
-#: common.opt:311
-msgid "When running CSE, follow conditional jumps"
-msgstr ""
-
-#: common.opt:315
-msgid "Omit range reduction step when performing complex division"
-msgstr ""
-
-#: common.opt:319
-msgid "Place data items into their own section"
-msgstr ""
-
-#: common.opt:325
-msgid "Defer popping functions args from stack until later"
-msgstr ""
-
-#: common.opt:329
-msgid "Attempt to fill delay slots of branch instructions"
-msgstr ""
-
-#: common.opt:333
-msgid "Delete useless null pointer checks"
-msgstr ""
-
-#: common.opt:337
-msgid ""
-"How often to emit source location at the beginning of line-wrapped "
-"diagnostics"
-msgstr ""
-
-#: common.opt:341
-msgid "Dump various compiler internals to a file"
-msgstr ""
-
-#: common.opt:345
-msgid ""
-"Suppress output of instruction numbers and line number notes in debugging "
-"dumps"
-msgstr ""
-
-#: common.opt:349
-msgid "Perform DWARF2 duplicate elimination"
-msgstr ""
-
-#: common.opt:353 common.opt:357
-msgid "Perform unused type elimination in debug info"
-msgstr ""
-
-#: common.opt:361
-msgid "Enable exception handling"
-msgstr ""
-
-#: common.opt:365
-msgid "Perform a number of minor, expensive optimizations"
-msgstr ""
-
-#: common.opt:372
-msgid "Assume no NaNs or infinities are generated"
-msgstr ""
-
-#: common.opt:376
-msgid "Mark <register> as being unavailable to the compiler"
-msgstr ""
-
-#: common.opt:380
-msgid "Don't allocate floats and doubles in extended-precision registers"
-msgstr ""
-
-#: common.opt:386
-msgid "Copy memory address constants into registers before use"
-msgstr ""
-
-#: common.opt:392
-msgid "Copy memory operands into registers before use"
-msgstr ""
-
-#: common.opt:399
-msgid "Allow function addresses to be held in registers"
-msgstr ""
-
-#: common.opt:403
-msgid "Place each function into its own section"
-msgstr ""
-
-#: common.opt:407
-msgid "Perform global common subexpression elimination"
-msgstr ""
-
-#: common.opt:411
-msgid ""
-"Perform enhanced load motion during global common subexpression elimination"
-msgstr ""
-
-#: common.opt:415
-msgid "Perform store motion after global common subexpression elimination"
-msgstr ""
-
-#: common.opt:419
-msgid ""
-"Perform redundant load after store elimination in global common subexpression"
-msgstr ""
-
-#: common.opt:424
-msgid ""
-"Perform global common subexpression elimination after register allocation"
-msgstr ""
-
-#: common.opt:429
-msgid "Enable guessing of branch probabilities"
-msgstr ""
-
-#: common.opt:437
-msgid "Process #ident directives"
-msgstr ""
-
-#: common.opt:441
-msgid "Perform conversion of conditional jumps to branchless equivalents"
-msgstr ""
-
-#: common.opt:445
-msgid "Perform conversion of conditional jumps to conditional execution"
-msgstr ""
-
-#: common.opt:453
-msgid "Do not generate .size directives"
-msgstr ""
-
-#: common.opt:462
-msgid "Pay attention to the \"inline\" keyword"
-msgstr ""
-
-#: common.opt:466
-msgid "Integrate simple functions into their callers"
-msgstr ""
-
-#: common.opt:473
-msgid "Limit the size of inlined functions to <number>"
-msgstr ""
-
-#: common.opt:477
-msgid "Instrument function entry and exit with profiling calls"
-msgstr ""
-
-#: common.opt:481
-msgid "Optimize induction variables on trees"
-msgstr ""
-
-#: common.opt:485
-msgid "Generate code for functions even if they are fully inlined"
-msgstr ""
-
-#: common.opt:489
-msgid "Emit static const variables even if they are not used"
-msgstr ""
-
-#: common.opt:493
-msgid "Give external symbols a leading underscore"
-msgstr ""
-
-#: common.opt:497
-msgid "Perform loop optimizations"
-msgstr ""
-
-#: common.opt:501
-msgid "Perform loop optimizations using the new loop optimizer"
-msgstr ""
-
-#: common.opt:505
-msgid "Set errno after built-in math functions"
-msgstr ""
-
-#: common.opt:509
-msgid "Report on permanent memory allocation"
-msgstr ""
-
-#: common.opt:516
-msgid "Attempt to merge identical constants and constant variables"
-msgstr ""
-
-#: common.opt:520
-msgid "Attempt to merge identical constants across compilation units"
-msgstr ""
-
-#: common.opt:524
-msgid ""
-"Limit diagnostics to <number> characters per line. 0 suppresses line-"
-"wrapping"
-msgstr ""
-
-#: common.opt:528
-msgid "Perform SMS based modulo scheduling before the first scheduling pass"
-msgstr ""
-
-#: common.opt:532
-msgid "Move loop invariant computations out of loops"
-msgstr ""
-
-#: common.opt:536
-msgid ""
-"Add mudflap bounds-checking instrumentation for single-threaded program."
-msgstr ""
-
-#: common.opt:540
-msgid "Add mudflap bounds-checking instrumentation for multi-threaded program."
-msgstr ""
-
-#: common.opt:544
-msgid "Ignore read operations when inserting mudflap instrumentation."
-msgstr ""
-
-#: common.opt:548
-msgid ""
-"Enable/Disable the traditional scheduling in loops that already passed "
-"modulo scheduling"
-msgstr ""
-
-#: common.opt:552
-msgid "Support synchronous non-call exceptions"
-msgstr ""
-
-#: common.opt:556
-msgid "When possible do not generate stack frames"
-msgstr ""
-
-#: common.opt:560
-msgid "Do the full register move optimization pass"
-msgstr ""
-
-#: common.opt:564
-msgid "Optimize sibling and tail recursive calls"
-msgstr ""
-
-#: common.opt:568
-msgid "Pack structure members together without holes"
-msgstr ""
-
-#: common.opt:572
-msgid "Set initial maximum structure member alignment"
-msgstr ""
-
-#: common.opt:576
-msgid "Return small aggregates in memory, not registers"
-msgstr ""
-
-#: common.opt:580
-msgid "Perform loop peeling"
-msgstr ""
-
-#: common.opt:584
-msgid "Enable machine specific peephole optimizations"
-msgstr ""
-
-#: common.opt:588
-msgid "Enable an RTL peephole pass before sched2"
-msgstr ""
-
-#: common.opt:592
-msgid "Generate position-independent code if possible (large mode)"
-msgstr ""
-
-#: common.opt:596
-msgid ""
-"Generate position-independent code for executables if possible (large mode)"
-msgstr ""
-
-#: common.opt:600
-msgid "Generate position-independent code if possible (small mode)"
-msgstr ""
-
-#: common.opt:604
-msgid ""
-"Generate position-independent code for executables if possible (small mode)"
-msgstr ""
-
-#: common.opt:608
-msgid "Generate prefetch instructions, if available, for arrays in loops"
-msgstr ""
-
-#: common.opt:612
-msgid "Enable basic program profiling code"
-msgstr ""
-
-#: common.opt:616
-msgid "Insert arc-based program profiling code"
-msgstr ""
-
-#: common.opt:620
-msgid ""
-"Enable common options for generating profile info for profile feedback "
-"directed optimizations"
-msgstr ""
-
-#: common.opt:624
-msgid ""
-"Enable common options for performing profile feedback directed optimizations"
-msgstr ""
-
-#: common.opt:628
-msgid "Insert code to profile values of expressions"
-msgstr ""
-
-#: common.opt:635
-msgid "Make compile reproducible using <string>"
-msgstr ""
-
-#: common.opt:639
-msgid "Return small aggregates in registers"
-msgstr ""
-
-#: common.opt:643
-msgid "Enables a register move optimization"
-msgstr ""
-
-#: common.opt:647
-msgid "Perform a register renaming optimization pass"
-msgstr ""
-
-#: common.opt:651
-msgid "Reorder basic blocks to improve code placement"
-msgstr ""
-
-#: common.opt:655
-msgid "Reorder basic blocks and partition into hot and cold sections"
-msgstr ""
-
-#: common.opt:659
-msgid "Reorder functions to improve code placement"
-msgstr ""
-
-#: common.opt:663
-msgid "Add a common subexpression elimination pass after loop optimizations"
-msgstr ""
-
-#: common.opt:667
-msgid "Run the loop optimizer twice"
-msgstr ""
-
-#: common.opt:671
-msgid "Disable optimizations that assume default FP rounding behavior"
-msgstr ""
-
-#: common.opt:675
-msgid "Enable scheduling across basic blocks"
-msgstr ""
-
-#: common.opt:679
-msgid "Allow speculative motion of non-loads"
-msgstr ""
-
-#: common.opt:683
-msgid "Allow speculative motion of some loads"
-msgstr ""
-
-#: common.opt:687
-msgid "Allow speculative motion of more loads"
-msgstr ""
-
-#: common.opt:691
-msgid "Set the verbosity level of the scheduler"
-msgstr ""
-
-#: common.opt:695
-msgid "If scheduling post reload, do superblock scheduling"
-msgstr ""
-
-#: common.opt:699
-msgid "If scheduling post reload, do trace scheduling"
-msgstr ""
-
-#: common.opt:703
-msgid "Reschedule instructions before register allocation"
-msgstr ""
-
-#: common.opt:707
-msgid "Reschedule instructions after register allocation"
-msgstr ""
-
-#: common.opt:713
-msgid "Allow premature scheduling of queued insns"
-msgstr ""
-
-#: common.opt:717
-msgid "Set number of queued insns that can be prematurely scheduled"
-msgstr ""
-
-#: common.opt:725 common.opt:729
-msgid ""
-"Set dependence distance checking in premature scheduling of queued insns"
-msgstr ""
-
-#: common.opt:733
-msgid "Mark data as shared rather than private"
-msgstr ""
-
-#: common.opt:737
-msgid "Show column numbers in diagnostics, when available. Default on."
-msgstr ""
-
-#: common.opt:741
-msgid "Disable optimizations observable by IEEE signaling NaNs"
-msgstr ""
-
-#: common.opt:745
-msgid "Convert floating point constants to single precision constants"
-msgstr ""
-
-#: common.opt:749
-msgid "Use value profiling for speculative prefetching"
-msgstr ""
-
-#: common.opt:753
-msgid "Split lifetimes of induction variables when loops are unrolled."
-msgstr ""
-
-#: common.opt:757
-msgid "Apply variable expansion when loops are unrolled."
-msgstr ""
-
-#: common.opt:763
-msgid "Insert stack checking code into the program"
-msgstr ""
-
-#: common.opt:770
-msgid "Trap if the stack goes past <register>"
-msgstr ""
-
-#: common.opt:774
-msgid "Trap if the stack goes past symbol <name>"
-msgstr ""
-
-#: common.opt:778
-msgid "Perform strength reduction optimizations"
-msgstr ""
-
-#: common.opt:786
-msgid "Assume strict aliasing rules apply"
-msgstr ""
-
-#: common.opt:790
-msgid "Check for syntax errors, then stop"
-msgstr ""
-
-#: common.opt:794
-msgid "Create data files needed by \"gcov\""
-msgstr ""
-
-#: common.opt:798
-msgid "Perform jump threading optimizations"
-msgstr ""
-
-#: common.opt:802
-msgid "Report the time taken by each compiler pass"
-msgstr ""
-
-#: common.opt:806
-msgid "Set the default thread-local storage code generation model"
-msgstr ""
-
-#: common.opt:810
-msgid "Perform superblock formation via tail duplication"
-msgstr ""
-
-#: common.opt:817
-msgid "Assume floating-point operations can trap"
-msgstr ""
-
-#: common.opt:821
-msgid "Trap for signed overflow in addition, subtraction and multiplication"
-msgstr ""
-
-#: common.opt:825
-msgid "Use tree-ssa based implementation of profiling"
-msgstr ""
-
-#: common.opt:829
-msgid "Enable SSA-CCP optimization on trees"
-msgstr ""
-
-#: common.opt:833
-msgid "Enable loop header copying on trees"
-msgstr ""
-
-#: common.opt:837
-msgid "Coalesce memory temporaries in the SSA->normal pass"
-msgstr ""
-
-#: common.opt:841
-msgid "Replace SSA temporaries with better names in copies."
-msgstr ""
-
-#: common.opt:845
-msgid "Enable SSA dead code elimination optimization on trees"
-msgstr ""
-
-#: common.opt:849
-msgid "Enable dominator optimizations"
-msgstr ""
-
-#: common.opt:853
-msgid "Enable dead store elimination"
-msgstr ""
-
-#: common.opt:857
-msgid "Enable Full Redundancy Elimination (FRE) on trees"
-msgstr ""
-
-#: common.opt:861
-msgid "Enable loop invariant motion on trees"
-msgstr ""
-
-#: common.opt:865
-msgid "Enable linear loop transforms on trees"
-msgstr ""
-
-#: common.opt:869
-msgid "Create canonical induction variables in loops"
-msgstr ""
-
-#: common.opt:873
-msgid "Enable loop optimizations on tree level"
-msgstr ""
-
-#: common.opt:877
-msgid "Enable SSA-PRE optimization on trees"
-msgstr ""
-
-#: common.opt:881
-msgid "Perform structural alias analysis"
-msgstr ""
-
-#: common.opt:885
-msgid "Enable SSA code sinking on trees"
-msgstr ""
-
-#: common.opt:889
-msgid "Perform scalar replacement of aggregates"
-msgstr ""
-
-#: common.opt:893
-msgid "Replace temporary expressions in the SSA->normal pass"
-msgstr ""
-
-#: common.opt:897
-msgid "Perform live range splitting during the SSA->normal pass."
-msgstr ""
-
-#: common.opt:901
-msgid "Compile whole compilation unit at a time"
-msgstr ""
-
-#: common.opt:905
-msgid "Perform loop unrolling when iteration count is known"
-msgstr ""
-
-#: common.opt:909
-msgid "Perform loop unrolling for all loops"
-msgstr ""
-
-#: common.opt:917
-msgid "Allow math optimizations that may violate IEEE or ISO standards"
-msgstr ""
-
-#: common.opt:921
-msgid "Perform loop unswitching"
-msgstr ""
-
-#: common.opt:925
-msgid "Just generate unwind tables for exception handling"
-msgstr ""
-
-#: common.opt:929
-msgid "Perform variable tracking"
-msgstr ""
-
-#: common.opt:933
-msgid "Enable loop vectorization on trees"
-msgstr ""
-
-#: common.opt:937
-msgid "Set the verbosity level of the vectorizer"
-msgstr ""
-
-#: common.opt:947
-msgid "Add extra commentary to assembler output"
-msgstr ""
-
-#: common.opt:951
-msgid "Set the default symbol visibility"
-msgstr ""
-
-#: common.opt:956
-msgid "Use expression value profiles in optimizations"
-msgstr ""
-
-#: common.opt:960
-msgid "Construct webs and split unrelated uses of single variable"
-msgstr ""
-
-#: common.opt:964
-msgid "Assume signed arithmetic overflow wraps around"
-msgstr ""
-
-#: common.opt:968
-msgid "Put zero initialized data in the bss section"
-msgstr ""
-
-#: common.opt:972
-msgid "Generate debug information in default format"
-msgstr ""
-
-#: common.opt:976
-msgid "Generate debug information in COFF format"
-msgstr ""
-
-#: common.opt:980
-msgid "Generate debug information in DWARF v2 format"
-msgstr ""
-
-#: common.opt:984
-msgid "Generate debug information in default extended format"
-msgstr ""
-
-#: common.opt:988
-msgid "Generate debug information in STABS format"
-msgstr ""
-
-#: common.opt:992
-msgid "Generate debug information in extended STABS format"
-msgstr ""
-
-#: common.opt:996
-msgid "Generate debug information in VMS format"
-msgstr ""
-
-#: common.opt:1000
-msgid "Generate debug information in XCOFF format"
-msgstr ""
-
-#: common.opt:1004
-msgid "Generate debug information in extended XCOFF format"
-msgstr ""
-
-#: common.opt:1008
-msgid "Place output into <file>"
-msgstr ""
-
-#: common.opt:1012
-msgid "Enable function profiling"
-msgstr ""
-
-#: common.opt:1016
-msgid "Issue warnings needed for strict compliance to the standard"
-msgstr ""
-
-#: common.opt:1020
-msgid "Like -pedantic but issue them as errors"
-msgstr ""
-
-#: common.opt:1024
-msgid "Do not display functions compiled or elapsed time"
-msgstr ""
-
-#: common.opt:1028
-msgid "Display the compiler's version"
-msgstr ""
-
-#: common.opt:1032
-msgid "Suppress warnings"
-msgstr ""
-
-#: treelang/lang.opt:30
-msgid "Trace lexical analysis"
-msgstr ""
-
-#: treelang/lang.opt:34
-msgid "Trace the parsing process"
-msgstr ""
-
-#: fortran/lang.opt:30
-msgid "Add a directory for INCLUDE and MODULE searching"
-msgstr ""
-
-#: fortran/lang.opt:34
-msgid "Put MODULE files in 'directory'"
-msgstr ""
-
-#: fortran/lang.opt:42
-msgid "Warn about possible aliasing of dummy arguments"
-msgstr ""
-
-#: fortran/lang.opt:46
-msgid "Warn about implicit conversion"
-msgstr ""
-
-#: fortran/lang.opt:50
-msgid "Warn about calls with implicit interface"
-msgstr ""
-
-#: fortran/lang.opt:54
-msgid "Warn about truncated source lines"
-msgstr ""
-
-#: fortran/lang.opt:58
-msgid "Warn about usage of non-standard intrinsics"
-msgstr ""
-
-#: fortran/lang.opt:62
-msgid "Warn about \"suspicious\" constructs"
-msgstr ""
-
-#: fortran/lang.opt:66
-msgid "Warn about underflow of numerical constant expressions"
-msgstr ""
-
-#: fortran/lang.opt:74
-msgid "Set the default double precision kind to an 8 byte wide type"
-msgstr ""
-
-#: fortran/lang.opt:78
-msgid "Set the default integer kind to an 8 byte wide type"
-msgstr ""
-
-#: fortran/lang.opt:82
-msgid "Set the default real kind to an 8 byte wide type"
-msgstr ""
-
-#: fortran/lang.opt:86
-msgid "Allow dollar signs in entity names"
-msgstr ""
-
-#: fortran/lang.opt:90
-msgid "Display the code tree after parsing."
-msgstr ""
-
-#: fortran/lang.opt:94
-msgid "Assume that the source file is fixed form"
-msgstr ""
-
-#: fortran/lang.opt:98
-msgid "Assume that the source file is free form"
-msgstr ""
-
-#: fortran/lang.opt:102
-msgid "Append underscores to externally visible names"
-msgstr ""
-
-#: fortran/lang.opt:106
-msgid "Append a second underscore if the name already contains an underscore"
-msgstr ""
-
-#: fortran/lang.opt:110
-msgid ""
-"Specify that no implicit typing is allowed, unless overridden by explicit "
-"IMPLICIT statements"
-msgstr ""
-
-#: fortran/lang.opt:114
-msgid "Allow arbitrary character line width in fixed mode"
-msgstr ""
-
-#: fortran/lang.opt:118
-msgid "Use n as character line width in fixed mode"
-msgstr ""
-
-#: fortran/lang.opt:122
-msgid "Maximum identifier length."
-msgstr ""
-
-#: fortran/lang.opt:126
-msgid "Size in bytes of the largest array that will be put on the stack"
-msgstr ""
-
-#: fortran/lang.opt:130
-msgid "Set default accessibility of module entities to PRIVATE"
-msgstr ""
-
-#: fortran/lang.opt:134
-msgid "Don't generate code, just do syntax and semantics checking"
-msgstr ""
-
-#: fortran/lang.opt:138
-msgid "Try to layout derived types as compact as possible"
-msgstr ""
-
-#: fortran/lang.opt:142
-msgid "Copy array sections into a contiguous block on procedure entry"
-msgstr ""
-
-#: fortran/lang.opt:146
-msgid "Set the kind for a real with the 'q' exponent to 'n'"
-msgstr ""
-
-#: fortran/lang.opt:150
-msgid "Conform to the ISO Fortran 95 standard."
-msgstr ""
-
-#: fortran/lang.opt:154
-msgid "Conform to the ISO Fortran 2003 standard."
-msgstr ""
-
-#: fortran/lang.opt:158
-msgid "Conform nothing in particular."
-msgstr ""
diff --git a/gcc/po/sv.po b/gcc/po/sv.po
index dff8663fdcc..1a3c7381fe9 100644
--- a/gcc/po/sv.po
+++ b/gcc/po/sv.po
@@ -1,35 +1,16 @@
-# Swedish translation for the GNU CC.
-# Copyright (C) 2000 Free Software Foundation, Inc.
+# Swedish messages for GCC.
+# Copyright © 2000, 2005 Free Software Foundation, Inc.
# Dennis Björklund <db@zigo.dhs.org>, 2000, 2001, 2002.
-#
-# Kom ihåg att i svenskan så använder vi "" för citat
-# och inte '' som det är i originaluttrycken.
-#
-# Jag har gjort en liten ordlista över uttryck som kan finnas i
-# översättningen
-#
-# http://www.zigo.dhs.org/~dennis/gcc/
-#
-# Denna lista är inte komplett men är det någon som vill hjälpa till
-# att översätta gcc och har åsikter om hur dessa uttryck skall skrivas
-# så ta kontakt så kan vi uppdatera den.
-#
-# Det mesta av övdersättningen som finns nu kommer från tiden
-# innan version 3.0 av gcc. Dessvärre så fungerade aldrig gcc
-# med översättningar korrekt då, så den kom inte till användning.
-# Jag har överfört de gamla strängarna till dagens version (3.2)
-# så det finns en början, men det är mycket kvar. Men vill någon hjälpa
-# till så vore det jättebra. Jag kommer översätta en bit då och då
-# i mån av tid, men det är en stor fil med komplicerade uttryck så
-# det tar en stund att bli klar.
+# Göran Uddeborg <goeran@uddeborg.se>, 2005.
+# $Revision: 1.2 $
#
msgid ""
msgstr ""
-"Project-Id-Version: gcc 3.2\n"
+"Project-Id-Version: gcc 4.0.0\n"
"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n"
"POT-Creation-Date: 2005-04-20 21:41-0700\n"
-"PO-Revision-Date: 2002-08-26 12:58+0200\n"
-"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"PO-Revision-Date: 2005-05-31 11:09+0200\n"
+"Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
"Language-Team: Swedish <sv@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
@@ -508,7 +489,6 @@ msgid "%J%qD defined both normally and as an alias"
msgstr "\"%s\" är definierad både normalt och som ett alias"
#: c-common.c:4579
-#, fuzzy
msgid "alias argument not a string"
msgstr "aliasargumentet är inte en sträng"
@@ -2545,9 +2525,8 @@ msgid "used struct type value where scalar is required"
msgstr "struct-värde använt där skalär krävs"
#: c-objc-common.c:252
-#, fuzzy
msgid "used union type value where scalar is required"
-msgstr "union-värde använt där skalär krävs"
+msgstr "värde av uniontyp använt där skalär krävs"
#: c-opts.c:144
#, fuzzy, c-format
diff --git a/gcc/postreload-gcse.c b/gcc/postreload-gcse.c
index 3734ed1c609..b821db1a122 100644
--- a/gcc/postreload-gcse.c
+++ b/gcc/postreload-gcse.c
@@ -439,7 +439,7 @@ dump_hash_table_entry (void **slot, void *filep)
fprintf (file, "expr: ");
print_rtl (file, expr->expr);
fprintf (file,"\nhashcode: %u\n", expr->hash);
- fprintf (file,"list of occurences:\n");
+ fprintf (file,"list of occurrences:\n");
occr = expr->avail_occr;
while (occr)
{
diff --git a/gcc/predict.c b/gcc/predict.c
index 961a39526a1..61cc5402e74 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -171,8 +171,8 @@ rtl_predicted_by_p (basic_block bb, enum br_predictor predictor)
bool
tree_predicted_by_p (basic_block bb, enum br_predictor predictor)
{
- struct edge_prediction *i = bb_ann (bb)->predictions;
- for (i = bb_ann (bb)->predictions; i; i = i->next)
+ struct edge_prediction *i;
+ for (i = bb->predictions; i; i = i->next)
if (i->predictor == predictor)
return true;
return false;
@@ -231,13 +231,36 @@ rtl_predict_edge (edge e, enum br_predictor predictor, int probability)
void
tree_predict_edge (edge e, enum br_predictor predictor, int probability)
{
- struct edge_prediction *i = ggc_alloc (sizeof (struct edge_prediction));
+ gcc_assert (profile_status != PROFILE_GUESSED);
+ if ((e->src != ENTRY_BLOCK_PTR && EDGE_COUNT (e->src->succs) > 1)
+ && flag_guess_branch_prob && optimize)
+ {
+ struct edge_prediction *i = ggc_alloc (sizeof (struct edge_prediction));
+
+ i->next = e->src->predictions;
+ e->src->predictions = i;
+ i->probability = probability;
+ i->predictor = predictor;
+ i->edge = e;
+ }
+}
- i->next = bb_ann (e->src)->predictions;
- bb_ann (e->src)->predictions = i;
- i->probability = probability;
- i->predictor = predictor;
- i->edge = e;
+/* Remove all predictions on given basic block that are attached
+ to edge E. */
+void
+remove_predictions_associated_with_edge (edge e)
+{
+ if (e->src->predictions)
+ {
+ struct edge_prediction **prediction = &e->src->predictions;
+ while (*prediction)
+ {
+ if ((*prediction)->edge == e)
+ *prediction = (*prediction)->next;
+ else
+ prediction = &((*prediction)->next);
+ }
+ }
}
/* Return true when we can store prediction on insn INSN.
@@ -488,7 +511,7 @@ combine_predictions_for_bb (FILE *file, basic_block bb)
{
if (!bb->count)
set_even_probabilities (bb);
- bb_ann (bb)->predictions = NULL;
+ bb->predictions = NULL;
if (file)
fprintf (file, "%i edges in bb %i predicted to even probabilities\n",
nedges, bb->index);
@@ -500,7 +523,7 @@ combine_predictions_for_bb (FILE *file, basic_block bb)
/* We implement "first match" heuristics and use probability guessed
by predictor with smallest index. */
- for (pred = bb_ann (bb)->predictions; pred; pred = pred->next)
+ for (pred = bb->predictions; pred; pred = pred->next)
{
int predictor = pred->predictor;
int probability = pred->probability;
@@ -546,7 +569,7 @@ combine_predictions_for_bb (FILE *file, basic_block bb)
combined_probability = best_probability;
dump_prediction (file, PRED_COMBINED, combined_probability, bb, true);
- for (pred = bb_ann (bb)->predictions; pred; pred = pred->next)
+ for (pred = bb->predictions; pred; pred = pred->next)
{
int predictor = pred->predictor;
int probability = pred->probability;
@@ -556,7 +579,7 @@ combine_predictions_for_bb (FILE *file, basic_block bb)
dump_prediction (file, predictor, probability, bb,
!first_match || best_predictor == predictor);
}
- bb_ann (bb)->predictions = NULL;
+ bb->predictions = NULL;
if (!bb->count)
{
@@ -1904,11 +1927,16 @@ choose_function_section (void)
UNLIKELY_EXECUTED_TEXT_SECTION_NAME);
}
+static bool
+gate_estimate_probability (void)
+{
+ return flag_guess_branch_prob;
+}
struct tree_opt_pass pass_profile =
{
"profile", /* name */
- NULL, /* gate */
+ gate_estimate_probability, /* gate */
tree_estimate_probability, /* execute */
NULL, /* sub */
NULL, /* next */
diff --git a/gcc/profile.c b/gcc/profile.c
index 4ab2553188b..b1514a523ab 100644
--- a/gcc/profile.c
+++ b/gcc/profile.c
@@ -1141,6 +1141,7 @@ branch_prob (void)
free_edge_list (el);
if (flag_branch_probabilities)
profile_status = PROFILE_READ;
+ coverage_end_function ();
}
/* Union find algorithm implementation for the basic blocks using
diff --git a/gcc/protoize.c b/gcc/protoize.c
index b7c2ec6669c..e9f177ea73f 100644
--- a/gcc/protoize.c
+++ b/gcc/protoize.c
@@ -505,12 +505,12 @@ static char * saved_repl_write_ptr;
/* Translate and output an error message. */
static void
-notice (const char *msgid, ...)
+notice (const char *cmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
- vfprintf (stderr, _(msgid), ap);
+ va_start (ap, cmsgid);
+ vfprintf (stderr, _(cmsgid), ap);
va_end (ap);
}
diff --git a/gcc/read-rtl.c b/gcc/read-rtl.c
index 1b1a329d2ff..1fa0896fd74 100644
--- a/gcc/read-rtl.c
+++ b/gcc/read-rtl.c
@@ -243,7 +243,7 @@ uses_mode_macro_p (rtx x, int mode)
static void
apply_mode_macro (rtx x, int mode)
{
- PUT_MODE (x, mode);
+ PUT_MODE (x, (enum machine_mode) mode);
}
/* Implementations of the macro_group callbacks for codes. */
@@ -269,7 +269,7 @@ uses_code_macro_p (rtx x, int code)
static void
apply_code_macro (rtx x, int code)
{
- PUT_CODE (x, code);
+ PUT_CODE (x, (enum rtx_code) code);
}
/* Map a code or mode attribute string P to the underlying string for
@@ -321,7 +321,7 @@ mode_attr_index (struct map_value **mode_maps, const char *string)
/* Copy the attribute string into permanent storage, without the
angle brackets around it. */
obstack_grow0 (&string_obstack, string + 1, strlen (string) - 2);
- p = (char *) obstack_finish (&string_obstack);
+ p = XOBFINISH (&string_obstack, char *);
mv = XNEW (struct map_value);
mv->number = *mode_maps == 0 ? 0 : (*mode_maps)->number + 1;
@@ -363,7 +363,7 @@ apply_mode_maps (rtx x, struct map_value *mode_maps, struct mapping *macro,
v = map_attr_string (pm->string, macro, value);
if (v)
- PUT_MODE (x, find_mode (v->string, infile));
+ PUT_MODE (x, (enum machine_mode) find_mode (v->string, infile));
else
*unknown = pm->string;
return;
@@ -404,7 +404,7 @@ apply_macro_to_string (const char *string, struct mapping *macro, int value)
if (base != copy)
{
obstack_grow (&string_obstack, base, strlen (base) + 1);
- copy = obstack_finish (&string_obstack);
+ copy = XOBFINISH (&string_obstack, char *);
copy_rtx_ptr_loc (copy, string);
return copy;
}
@@ -785,7 +785,7 @@ join_c_conditions (const char *cond1, const char *cond2)
obstack_ptr_grow (&joined_conditions_obstack, result);
obstack_ptr_grow (&joined_conditions_obstack, cond1);
obstack_ptr_grow (&joined_conditions_obstack, cond2);
- entry = obstack_finish (&joined_conditions_obstack);
+ entry = XOBFINISH (&joined_conditions_obstack, const void **);
*htab_find_slot (joined_conditions, entry, INSERT) = entry;
return result;
}
@@ -798,7 +798,7 @@ join_c_conditions (const char *cond1, const char *cond2)
void
print_c_condition (const char *cond)
{
- const void **halves = htab_find (joined_conditions, &cond);
+ const char **halves = (const char **) htab_find (joined_conditions, &cond);
if (halves != 0)
{
printf ("(");
@@ -998,7 +998,7 @@ read_quoted_string (FILE *infile)
}
obstack_1grow (&string_obstack, 0);
- return (char *) obstack_finish (&string_obstack);
+ return XOBFINISH (&string_obstack, char *);
}
/* Read a braced string (a la Tcl) onto the string obstack. Caller
@@ -1036,7 +1036,7 @@ read_braced_string (FILE *infile)
}
obstack_1grow (&string_obstack, 0);
- return (char *) obstack_finish (&string_obstack);
+ return XOBFINISH (&string_obstack, char *);
}
/* Read some kind of string constant. This is the high-level routine
@@ -1311,7 +1311,7 @@ check_code_macro (struct mapping *macro, FILE *infile)
struct map_value *v;
enum rtx_code bellwether;
- bellwether = macro->values->number;
+ bellwether = (enum rtx_code) macro->values->number;
for (v = macro->values->next; v != 0; v = v->next)
if (strcmp (GET_RTX_FORMAT (bellwether), GET_RTX_FORMAT (v->number)) != 0)
fatal_with_file_and_line (infile, "code macro `%s' combines "
@@ -1449,7 +1449,7 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps)
check_code_macro (read_mapping (&codes, codes.macros, infile), infile);
goto again;
}
- real_code = find_macro (&codes, tmp_char, infile);
+ real_code = (enum rtx_code) find_macro (&codes, tmp_char, infile);
bellwether_code = BELLWETHER_CODE (real_code);
/* If we end up with an insn expression then we free this space below. */
@@ -1470,7 +1470,7 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps)
mode = find_macro (&modes, tmp_char, infile);
else
mode = mode_attr_index (mode_maps, tmp_char);
- PUT_MODE (return_rtx, mode);
+ PUT_MODE (return_rtx, (enum machine_mode) mode);
if (GET_MODE (return_rtx) != mode)
fatal_with_file_and_line (infile, "mode too large");
}
@@ -1581,7 +1581,7 @@ read_rtx_1 (FILE *infile, struct map_value **mode_maps)
obstack_grow (&string_obstack, fn, strlen (fn));
sprintf (line_name, ":%d", read_rtx_lineno);
obstack_grow (&string_obstack, line_name, strlen (line_name)+1);
- stringbuf = (char *) obstack_finish (&string_obstack);
+ stringbuf = XOBFINISH (&string_obstack, char *);
}
if (star_if_braced)
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c
index a49d9e9a108..7ee3be2d010 100644
--- a/gcc/reg-stack.c
+++ b/gcc/reg-stack.c
@@ -208,7 +208,7 @@ typedef struct block_info_def
struct stack_def stack_out; /* Output stack configuration. */
HARD_REG_SET out_reg_set; /* Stack regs live on output. */
int done; /* True if block already converted. */
- int predecessors; /* Number of predecessors that needs
+ int predecessors; /* Number of predecessors that need
to be visited. */
} *block_info;
@@ -224,6 +224,11 @@ enum emit_where
/* The block we're currently working on. */
static basic_block current_block;
+/* In the current_block, whether we're processing the first register
+ stack or call instruction, i.e. the the regstack is currently the
+ same as BLOCK_INFO(current_block)->stack_in. */
+static bool starting_stack_p;
+
/* This is the register file for all register after conversion. */
static rtx
FP_mode_reg[LAST_STACK_REG+1-FIRST_STACK_REG][(int) MAX_MACHINE_MODE];
@@ -237,7 +242,6 @@ static rtx not_a_num;
/* Forward declarations */
static int stack_regs_mentioned_p (rtx pat);
-static void straighten_stack (rtx, stack);
static void pop_stack (stack, int);
static rtx *get_true_reg (rtx *);
@@ -248,7 +252,6 @@ static void replace_reg (rtx *, int);
static void remove_regno_note (rtx, enum reg_note, unsigned int);
static int get_hard_regnum (stack, rtx);
static rtx emit_pop_insn (rtx, stack, rtx, enum emit_where);
-static void emit_swap_insn (rtx, stack, rtx);
static void swap_to_top(rtx, stack, rtx, rtx);
static bool move_for_stack_reg (rtx, stack, rtx);
static bool move_nan_for_stack_reg (rtx, stack, rtx);
@@ -259,14 +262,8 @@ static bool subst_stack_regs_pat (rtx, stack, rtx);
static void subst_asm_stack_regs (rtx, stack);
static bool subst_stack_regs (rtx, stack);
static void change_stack (rtx, stack, stack, enum emit_where);
-static int convert_regs_entry (void);
-static void convert_regs_exit (void);
-static int convert_regs_1 (FILE *, basic_block);
-static int convert_regs_2 (FILE *, basic_block);
-static int convert_regs (FILE *);
static void print_stack (FILE *, stack);
static rtx next_flags_user (rtx);
-static bool compensate_edge (edge, FILE *);
/* Return nonzero if any stack register is mentioned somewhere within PAT. */
@@ -350,8 +347,7 @@ next_flags_user (rtx insn)
return NULL_RTX;
}
-/* Reorganize the stack into ascending numbers,
- after this insn. */
+/* Reorganize the stack into ascending numbers, before this insn. */
static void
straighten_stack (rtx insn, stack regstack)
@@ -371,7 +367,7 @@ straighten_stack (rtx insn, stack regstack)
for (top = temp_stack.top = regstack->top; top >= 0; top--)
temp_stack.reg[top] = FIRST_STACK_REG + temp_stack.top - top;
- change_stack (insn, regstack, &temp_stack, EMIT_AFTER);
+ change_stack (insn, regstack, &temp_stack, EMIT_BEFORE);
}
/* Pop a register from the stack. */
@@ -398,101 +394,6 @@ pop_stack (stack regstack, int regno)
}
}
-/* Convert register usage from "flat" register file usage to a "stack
- register file. FILE is the dump file, if used.
-
- Construct a CFG and run life analysis. Then convert each insn one
- by one. Run a last cleanup_cfg pass, if optimizing, to eliminate
- code duplication created when the converter inserts pop insns on
- the edges. */
-
-bool
-reg_to_stack (FILE *file)
-{
- basic_block bb;
- int i;
- int max_uid;
-
- /* Clean up previous run. */
- stack_regs_mentioned_data = 0;
-
- /* See if there is something to do. Flow analysis is quite
- expensive so we might save some compilation time. */
- for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
- if (regs_ever_live[i])
- break;
- if (i > LAST_STACK_REG)
- return false;
-
- /* Ok, floating point instructions exist. If not optimizing,
- build the CFG and run life analysis.
- Also need to rebuild life when superblock scheduling is done
- as it don't update liveness yet. */
- if (!optimize
- || (flag_sched2_use_superblocks
- && flag_schedule_insns_after_reload))
- {
- count_or_remove_death_notes (NULL, 1);
- life_analysis (file, PROP_DEATH_NOTES);
- }
- mark_dfs_back_edges ();
-
- /* Set up block info for each basic block. */
- alloc_aux_for_blocks (sizeof (struct block_info_def));
- FOR_EACH_BB_REVERSE (bb)
- {
- edge e;
- edge_iterator ei;
-
- FOR_EACH_EDGE (e, ei, bb->preds)
- if (!(e->flags & EDGE_DFS_BACK)
- && e->src != ENTRY_BLOCK_PTR)
- BLOCK_INFO (bb)->predecessors++;
- }
-
- /* Create the replacement registers up front. */
- for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
- {
- enum machine_mode mode;
- for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
- mode != VOIDmode;
- mode = GET_MODE_WIDER_MODE (mode))
- FP_MODE_REG (i, mode) = gen_rtx_REG (mode, i);
- for (mode = GET_CLASS_NARROWEST_MODE (MODE_COMPLEX_FLOAT);
- mode != VOIDmode;
- mode = GET_MODE_WIDER_MODE (mode))
- FP_MODE_REG (i, mode) = gen_rtx_REG (mode, i);
- }
-
- ix86_flags_rtx = gen_rtx_REG (CCmode, FLAGS_REG);
-
- /* A QNaN for initializing uninitialized variables.
-
- ??? We can't load from constant memory in PIC mode, because
- we're inserting these instructions before the prologue and
- the PIC register hasn't been set up. In that case, fall back
- on zero, which we can get from `ldz'. */
-
- if (flag_pic)
- not_a_num = CONST0_RTX (SFmode);
- else
- {
- not_a_num = gen_lowpart (SFmode, GEN_INT (0x7fc00000));
- not_a_num = force_const_mem (SFmode, not_a_num);
- }
-
- /* Allocate a cache for stack_regs_mentioned. */
- max_uid = get_max_uid ();
- VARRAY_CHAR_INIT (stack_regs_mentioned_data, max_uid + 1,
- "stack_regs_mentioned cache");
-
- convert_regs (file);
-
- free_aux_for_blocks ();
- return true;
-}
-
-
/* Return a pointer to the REG expression within PAT. If PAT is not a
REG, possible enclosed by a conversion rtx, return the inner part of
PAT that stopped the search. */
@@ -965,6 +866,16 @@ emit_swap_insn (rtx insn, stack regstack, rtx reg)
return;
}
+ /* Avoid emitting the swap if this is the first register stack insn
+ of the current_block. Instead update the current_block's stack_in
+ and let compensate edges take care of this for us. */
+ if (current_block && starting_stack_p)
+ {
+ BLOCK_INFO (current_block)->stack_in = *regstack;
+ starting_stack_p = false;
+ return;
+ }
+
swap_rtx = gen_swapxf (FP_MODE_REG (hard_regno, XFmode),
FP_MODE_REG (FIRST_STACK_REG, XFmode));
@@ -1231,9 +1142,9 @@ swap_rtx_condition (rtx insn)
pat = PATTERN (insn);
}
- /* See if this is, or ends in, a fnstsw, aka unspec 9. If so, we're
- not doing anything with the cc value right now. We may be able to
- search for one though. */
+ /* See if this is, or ends in, a fnstsw. If so, we're not doing anything
+ with the cc value right now. We may be able to search for one
+ though. */
if (GET_CODE (pat) == SET
&& GET_CODE (SET_SRC (pat)) == UNSPEC
@@ -1252,9 +1163,13 @@ swap_rtx_condition (rtx insn)
return 0;
}
+ /* We haven't found it. */
+ if (insn == BB_END (current_block))
+ return 0;
+
/* So we've found the insn using this value. If it is anything
- other than sahf, aka unspec 10, or the value does not die
- (meaning we'd have to search further), then we must give up. */
+ other than sahf or the value does not die (meaning we'd have
+ to search further), then we must give up. */
pat = PATTERN (insn);
if (GET_CODE (pat) != SET
|| GET_CODE (SET_SRC (pat)) != UNSPEC
@@ -2302,7 +2217,7 @@ subst_stack_regs (rtx insn, stack regstack)
if (top >= 0)
{
- straighten_stack (PREV_INSN (insn), regstack);
+ straighten_stack (insn, regstack);
/* Now mark the arguments as dead after the call. */
@@ -2393,6 +2308,19 @@ change_stack (rtx insn, stack old, stack new, enum emit_where where)
int reg;
int update_end = 0;
+ /* Stack adjustments for the first insn in a block update the
+ current_block's stack_in instead of inserting insns directly.
+ compensate_edges will add the necessary code later. */
+ if (current_block
+ && starting_stack_p
+ && where == EMIT_BEFORE)
+ {
+ BLOCK_INFO (current_block)->stack_in = *new;
+ starting_stack_p = false;
+ *old = *new;
+ return;
+ }
+
/* We will be inserting new insns "backwards". If we are to insert
after INSN, find the next insn, and insert before it. */
@@ -2604,25 +2532,6 @@ convert_regs_entry (void)
int inserted = 0;
edge e;
edge_iterator ei;
- basic_block block;
-
- FOR_EACH_BB_REVERSE (block)
- {
- block_info bi = BLOCK_INFO (block);
- int reg;
-
- /* Set current register status at last instruction `uninitialized'. */
- bi->stack_in.top = -2;
-
- /* Copy live_at_end and live_at_start into temporaries. */
- for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; reg++)
- {
- if (REGNO_REG_SET_P (block->global_live_at_end, reg))
- SET_HARD_REG_BIT (bi->out_reg_set, reg);
- if (REGNO_REG_SET_P (block->global_live_at_start, reg))
- SET_HARD_REG_BIT (bi->stack_in.reg_set, reg);
- }
- }
/* Load something into each stack register live at function entry.
Such live registers can be caused by uninitialized variables or
@@ -2694,131 +2603,115 @@ convert_regs_exit (void)
}
}
-/* Adjust the stack of this block on exit to match the stack of the
- target block, or copy stack info into the stack of the successor
- of the successor hasn't been processed yet. */
+/* Copy the stack info from the end of edge E's source block to the
+ start of E's destination block. */
+
+static void
+propagate_stack (edge e)
+{
+ stack src_stack = &BLOCK_INFO (e->src)->stack_out;
+ stack dest_stack = &BLOCK_INFO (e->dest)->stack_in;
+ int reg;
+
+ /* Preserve the order of the original stack, but check whether
+ any pops are needed. */
+ dest_stack->top = -1;
+ for (reg = 0; reg <= src_stack->top; ++reg)
+ if (TEST_HARD_REG_BIT (dest_stack->reg_set, src_stack->reg[reg]))
+ dest_stack->reg[++dest_stack->top] = src_stack->reg[reg];
+}
+
+
+/* Adjust the stack of edge E's source block on exit to match the stack
+ of it's target block upon input. The stack layouts of both blocks
+ should have been defined by now. */
+
static bool
compensate_edge (edge e, FILE *file)
{
- basic_block block = e->src, target = e->dest;
- block_info bi = BLOCK_INFO (block);
- struct stack_def regstack, tmpstack;
+ basic_block source = e->src, target = e->dest;
stack target_stack = &BLOCK_INFO (target)->stack_in;
+ stack source_stack = &BLOCK_INFO (source)->stack_out;
+ struct stack_def regstack;
int reg;
- current_block = block;
- regstack = bi->stack_out;
if (file)
- fprintf (file, "Edge %d->%d: ", block->index, target->index);
+ fprintf (file, "Edge %d->%d: ", source->index, target->index);
+
+ gcc_assert (target_stack->top != -2);
- if (target_stack->top == -2)
+ /* Check whether stacks are identical. */
+ if (target_stack->top == source_stack->top)
{
- /* The target block hasn't had a stack order selected.
- We need merely ensure that no pops are needed. */
- for (reg = regstack.top; reg >= 0; --reg)
- if (!TEST_HARD_REG_BIT (target_stack->reg_set, regstack.reg[reg]))
+ for (reg = target_stack->top; reg >= 0; --reg)
+ if (target_stack->reg[reg] != source_stack->reg[reg])
break;
if (reg == -1)
{
if (file)
- fprintf (file, "new block; copying stack position\n");
-
- /* change_stack kills values in regstack. */
- tmpstack = regstack;
-
- change_stack (BB_END (block), &tmpstack, target_stack, EMIT_AFTER);
+ fprintf (file, "no changes needed\n");
return false;
}
-
- if (file)
- fprintf (file, "new block; pops needed\n");
}
- else
- {
- if (target_stack->top == regstack.top)
- {
- for (reg = target_stack->top; reg >= 0; --reg)
- if (target_stack->reg[reg] != regstack.reg[reg])
- break;
- if (reg == -1)
- {
- if (file)
- fprintf (file, "no changes needed\n");
- return false;
- }
- }
-
- if (file)
- {
- fprintf (file, "correcting stack to ");
- print_stack (file, target_stack);
- }
+ if (file)
+ {
+ fprintf (file, "correcting stack to ");
+ print_stack (file, target_stack);
}
- /* Care for non-call EH edges specially. The normal return path have
- values in registers. These will be popped en masse by the unwind
- library. */
- if ((e->flags & (EDGE_EH | EDGE_ABNORMAL_CALL)) == EDGE_EH)
- target_stack->top = -1;
-
- /* Other calls may appear to have values live in st(0), but the
+ /* Abnormal calls may appear to have values live in st(0), but the
abnormal return path will not have actually loaded the values. */
- else if (e->flags & EDGE_ABNORMAL_CALL)
+ if (e->flags & EDGE_ABNORMAL_CALL)
{
/* Assert that the lifetimes are as we expect -- one value
live at st(0) on the end of the source block, and no
- values live at the beginning of the destination block. */
- HARD_REG_SET tmp;
-
- CLEAR_HARD_REG_SET (tmp);
- GO_IF_HARD_REG_EQUAL (target_stack->reg_set, tmp, eh1);
- gcc_unreachable ();
- eh1:
-
- /* We are sure that there is st(0) live, otherwise we won't compensate.
+ values live at the beginning of the destination block.
For complex return values, we may have st(1) live as well. */
- SET_HARD_REG_BIT (tmp, FIRST_STACK_REG);
- if (TEST_HARD_REG_BIT (regstack.reg_set, FIRST_STACK_REG + 1))
- SET_HARD_REG_BIT (tmp, FIRST_STACK_REG + 1);
- GO_IF_HARD_REG_EQUAL (regstack.reg_set, tmp, eh2);
- gcc_unreachable ();
- eh2:
+ gcc_assert (source_stack->top == 0 || source_stack->top == 1);
+ gcc_assert (target_stack->top == -1);
+ return false;
+ }
- target_stack->top = -1;
+ /* Handle non-call EH edges specially. The normal return path have
+ values in registers. These will be popped en masse by the unwind
+ library. */
+ if (e->flags & EDGE_EH)
+ {
+ gcc_assert (target_stack->top == -1);
+ return false;
}
+ /* We don't support abnormal edges. Global takes care to
+ avoid any live register across them, so we should never
+ have to insert instructions on such edges. */
+ gcc_assert (! (e->flags & EDGE_ABNORMAL));
+
+ /* Make a copy of source_stack as change_stack is destructive. */
+ regstack = *source_stack;
+
/* It is better to output directly to the end of the block
instead of to the edge, because emit_swap can do minimal
insn scheduling. We can do this when there is only one
edge out, and it is not abnormal. */
- else if (EDGE_COUNT (block->succs) == 1 && !(e->flags & EDGE_ABNORMAL))
+ if (EDGE_COUNT (source->succs) == 1)
{
- /* change_stack kills values in regstack. */
- tmpstack = regstack;
-
- change_stack (BB_END (block), &tmpstack, target_stack,
- (JUMP_P (BB_END (block))
- ? EMIT_BEFORE : EMIT_AFTER));
+ current_block = source;
+ change_stack (BB_END (source), &regstack, target_stack,
+ (JUMP_P (BB_END (source)) ? EMIT_BEFORE : EMIT_AFTER));
}
else
{
rtx seq, after;
- /* We don't support abnormal edges. Global takes care to
- avoid any live register across them, so we should never
- have to insert instructions on such edges. */
- gcc_assert (!(e->flags & EDGE_ABNORMAL));
-
current_block = NULL;
start_sequence ();
/* ??? change_stack needs some point to emit insns after. */
after = emit_note (NOTE_INSN_DELETED);
- tmpstack = regstack;
- change_stack (after, &tmpstack, target_stack, EMIT_BEFORE);
+ change_stack (after, &regstack, target_stack, EMIT_BEFORE);
seq = get_insns ();
end_sequence ();
@@ -2829,72 +2722,97 @@ compensate_edge (edge e, FILE *file)
return false;
}
+/* Traverse all non-entry edges in the CFG, and emit the necessary
+ edge compensation code to change the stack from stack_out of the
+ source block to the stack_in of the destination block. */
+
+static bool
+compensate_edges (FILE *file)
+{
+ bool inserted = false;
+ basic_block bb;
+
+ starting_stack_p = false;
+
+ FOR_EACH_BB (bb)
+ if (bb != ENTRY_BLOCK_PTR)
+ {
+ edge e;
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ inserted |= compensate_edge (e, file);
+ }
+ return inserted;
+}
+
+/* Select the better of two edges E1 and E2 to use to determine the
+ stack layout for their shared destination basic block. This is
+ typically the more frequently executed. The edge E1 may be NULL
+ (in which case E2 is returned), but E2 is always non-NULL. */
+
+static edge
+better_edge (edge e1, edge e2)
+{
+ if (!e1)
+ return e2;
+
+ if (EDGE_FREQUENCY (e1) > EDGE_FREQUENCY (e2))
+ return e1;
+ if (EDGE_FREQUENCY (e1) < EDGE_FREQUENCY (e2))
+ return e2;
+
+ if (e1->count > e2->count)
+ return e1;
+ if (e1->count < e2->count)
+ return e2;
+
+ /* Prefer critical edges to minimize inserting compensation code on
+ critical edges. */
+
+ if (EDGE_CRITICAL_P (e1) != EDGE_CRITICAL_P (e2))
+ return EDGE_CRITICAL_P (e1) ? e1 : e2;
+
+ /* Avoid non-deterministic behaviour. */
+ return (e1->src->index < e2->src->index) ? e1 : e2;
+}
+
/* Convert stack register references in one block. */
-static int
+static void
convert_regs_1 (FILE *file, basic_block block)
{
struct stack_def regstack;
block_info bi = BLOCK_INFO (block);
- int inserted, reg;
+ int reg;
rtx insn, next;
- edge e, beste = NULL;
bool control_flow_insn_deleted = false;
- edge_iterator ei;
- inserted = 0;
any_malformed_asm = false;
- /* Find the edge we will copy stack from. It should be the most frequent
- one as it will get cheapest after compensation code is generated,
- if multiple such exists, take one with largest count, prefer critical
- one (as splitting critical edges is more expensive), or one with lowest
- index, to avoid random changes with different orders of the edges. */
- FOR_EACH_EDGE (e, ei, block->preds)
- {
- if (e->flags & EDGE_DFS_BACK)
- ;
- else if (! beste)
- beste = e;
- else if (EDGE_FREQUENCY (beste) < EDGE_FREQUENCY (e))
- beste = e;
- else if (EDGE_FREQUENCY (beste) > EDGE_FREQUENCY (e))
- ;
- else if (beste->count < e->count)
- beste = e;
- else if (beste->count > e->count)
- ;
- else if ((EDGE_CRITICAL_P (e) != 0)
- != (EDGE_CRITICAL_P (beste) != 0))
- {
- if (EDGE_CRITICAL_P (e))
- beste = e;
- }
- else if (e->src->index < beste->src->index)
- beste = e;
- }
-
- /* Initialize stack at block entry. */
+ /* Choose an initial stack layout, if one hasn't already been chosen. */
if (bi->stack_in.top == -2)
{
+ edge e, beste = NULL;
+ edge_iterator ei;
+
+ /* Select the best incoming edge (typically the most frequent) to
+ use as a template for this basic block. */
+ FOR_EACH_EDGE (e, ei, block->preds)
+ if (BLOCK_INFO (e->src)->done)
+ beste = better_edge (beste, e);
+
if (beste)
- inserted |= compensate_edge (beste, file);
+ propagate_stack (beste);
else
{
/* No predecessors. Create an arbitrary input stack. */
- int reg;
-
bi->stack_in.top = -1;
for (reg = LAST_STACK_REG; reg >= FIRST_STACK_REG; --reg)
if (TEST_HARD_REG_BIT (bi->stack_in.reg_set, reg))
bi->stack_in.reg[++bi->stack_in.top] = reg;
}
}
- else
- /* Entry blocks do have stack already initialized. */
- beste = NULL;
-
- current_block = block;
if (file)
{
@@ -2904,8 +2822,11 @@ convert_regs_1 (FILE *file, basic_block block)
/* Process all insns in this block. Keep track of NEXT so that we
don't process insns emitted while substituting in INSN. */
+ current_block = block;
next = BB_HEAD (block);
regstack = bi->stack_in;
+ starting_stack_p = true;
+
do
{
insn = next;
@@ -2928,6 +2849,7 @@ convert_regs_1 (FILE *file, basic_block block)
print_stack (file, &regstack);
}
control_flow_insn_deleted |= subst_stack_regs (insn, &regstack);
+ starting_stack_p = false;
}
}
while (next);
@@ -2993,38 +2915,15 @@ convert_regs_1 (FILE *file, basic_block block)
gcc_assert (any_malformed_asm);
win:
bi->stack_out = regstack;
-
- /* Compensate the back edges, as those wasn't visited yet. */
- FOR_EACH_EDGE (e, ei, block->succs)
- {
- if (e->flags & EDGE_DFS_BACK
- || (e->dest == EXIT_BLOCK_PTR))
- {
- gcc_assert (BLOCK_INFO (e->dest)->done
- || e->dest == block);
- inserted |= compensate_edge (e, file);
- }
- }
- FOR_EACH_EDGE (e, ei, block->preds)
- {
- if (e != beste && !(e->flags & EDGE_DFS_BACK)
- && e->src != ENTRY_BLOCK_PTR)
- {
- gcc_assert (BLOCK_INFO (e->src)->done);
- inserted |= compensate_edge (e, file);
- }
- }
-
- return inserted;
+ bi->done = true;
}
/* Convert registers in all blocks reachable from BLOCK. */
-static int
+static void
convert_regs_2 (FILE *file, basic_block block)
{
basic_block *stack, *sp;
- int inserted;
/* We process the blocks in a top-down manner, in a way such that one block
is only processed after all its predecessors. The number of predecessors
@@ -3035,7 +2934,6 @@ convert_regs_2 (FILE *file, basic_block block)
*sp++ = block;
- inserted = 0;
do
{
edge e;
@@ -3064,21 +2962,18 @@ convert_regs_2 (FILE *file, basic_block block)
*sp++ = e->dest;
}
- inserted |= convert_regs_1 (file, block);
- BLOCK_INFO (block)->done = 1;
+ convert_regs_1 (file, block);
}
while (sp != stack);
free (stack);
-
- return inserted;
}
/* Traverse all basic blocks in a function, converting the register
references in each insn from the "flat" register file that gcc uses,
to the stack-like registers the 387 uses. */
-static int
+static void
convert_regs (FILE *file)
{
int inserted;
@@ -3099,7 +2994,7 @@ convert_regs (FILE *file)
/* Process all blocks reachable from all entry points. */
FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
- inserted |= convert_regs_2 (file, e->dest);
+ convert_regs_2 (file, e->dest);
/* ??? Process all unreachable blocks. Though there's no excuse
for keeping these even when not optimizing. */
@@ -3108,8 +3003,11 @@ convert_regs (FILE *file)
block_info bi = BLOCK_INFO (b);
if (! bi->done)
- inserted |= convert_regs_2 (file, b);
+ convert_regs_2 (file, b);
}
+
+ inserted |= compensate_edges (file);
+
clear_aux_for_blocks ();
fixup_abnormal_edges ();
@@ -3118,8 +3016,114 @@ convert_regs (FILE *file)
if (file)
fputc ('\n', file);
+}
+
+/* Convert register usage from "flat" register file usage to a "stack
+ register file. FILE is the dump file, if used.
- return inserted;
+ Construct a CFG and run life analysis. Then convert each insn one
+ by one. Run a last cleanup_cfg pass, if optimizing, to eliminate
+ code duplication created when the converter inserts pop insns on
+ the edges. */
+
+bool
+reg_to_stack (FILE *file)
+{
+ basic_block bb;
+ int i;
+ int max_uid;
+
+ /* Clean up previous run. */
+ stack_regs_mentioned_data = 0;
+
+ /* See if there is something to do. Flow analysis is quite
+ expensive so we might save some compilation time. */
+ for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
+ if (regs_ever_live[i])
+ break;
+ if (i > LAST_STACK_REG)
+ return false;
+
+ /* Ok, floating point instructions exist. If not optimizing,
+ build the CFG and run life analysis.
+ Also need to rebuild life when superblock scheduling is done
+ as it don't update liveness yet. */
+ if (!optimize
+ || (flag_sched2_use_superblocks
+ && flag_schedule_insns_after_reload))
+ {
+ count_or_remove_death_notes (NULL, 1);
+ life_analysis (file, PROP_DEATH_NOTES);
+ }
+ mark_dfs_back_edges ();
+
+ /* Set up block info for each basic block. */
+ alloc_aux_for_blocks (sizeof (struct block_info_def));
+ FOR_EACH_BB (bb)
+ {
+ block_info bi = BLOCK_INFO (bb);
+ edge_iterator ei;
+ edge e;
+ int reg;
+
+ FOR_EACH_EDGE (e, ei, bb->preds)
+ if (!(e->flags & EDGE_DFS_BACK)
+ && e->src != ENTRY_BLOCK_PTR)
+ bi->predecessors++;
+
+ /* Set current register status at last instruction `uninitialized'. */
+ bi->stack_in.top = -2;
+
+ /* Copy live_at_end and live_at_start into temporaries. */
+ for (reg = FIRST_STACK_REG; reg <= LAST_STACK_REG; reg++)
+ {
+ if (REGNO_REG_SET_P (bb->global_live_at_end, reg))
+ SET_HARD_REG_BIT (bi->out_reg_set, reg);
+ if (REGNO_REG_SET_P (bb->global_live_at_start, reg))
+ SET_HARD_REG_BIT (bi->stack_in.reg_set, reg);
+ }
+ }
+
+ /* Create the replacement registers up front. */
+ for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++)
+ {
+ enum machine_mode mode;
+ for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
+ mode != VOIDmode;
+ mode = GET_MODE_WIDER_MODE (mode))
+ FP_MODE_REG (i, mode) = gen_rtx_REG (mode, i);
+ for (mode = GET_CLASS_NARROWEST_MODE (MODE_COMPLEX_FLOAT);
+ mode != VOIDmode;
+ mode = GET_MODE_WIDER_MODE (mode))
+ FP_MODE_REG (i, mode) = gen_rtx_REG (mode, i);
+ }
+
+ ix86_flags_rtx = gen_rtx_REG (CCmode, FLAGS_REG);
+
+ /* A QNaN for initializing uninitialized variables.
+
+ ??? We can't load from constant memory in PIC mode, because
+ we're inserting these instructions before the prologue and
+ the PIC register hasn't been set up. In that case, fall back
+ on zero, which we can get from `ldz'. */
+
+ if (flag_pic)
+ not_a_num = CONST0_RTX (SFmode);
+ else
+ {
+ not_a_num = gen_lowpart (SFmode, GEN_INT (0x7fc00000));
+ not_a_num = force_const_mem (SFmode, not_a_num);
+ }
+
+ /* Allocate a cache for stack_regs_mentioned. */
+ max_uid = get_max_uid ();
+ VARRAY_CHAR_INIT (stack_regs_mentioned_data, max_uid + 1,
+ "stack_regs_mentioned cache");
+
+ convert_regs (file);
+
+ free_aux_for_blocks ();
+ return true;
}
#endif /* STACK_REGS */
diff --git a/gcc/reload.h b/gcc/reload.h
index a2bb51d86fe..40b27ed3f8d 100644
--- a/gcc/reload.h
+++ b/gcc/reload.h
@@ -253,6 +253,13 @@ extern rtx *reg_equiv_memory_loc;
extern rtx *reg_equiv_address;
extern rtx *reg_equiv_mem;
+/* Element N is the list of insns that initialized reg N from its equivalent
+ constant or memory slot. */
+extern GTY((length("reg_equiv_init_size"))) rtx *reg_equiv_init;
+
+/* The size of the previous array, for GC purposes. */
+extern GTY(()) int reg_equiv_init_size;
+
/* All the "earlyclobber" operands of the current insn
are recorded here. */
extern int n_earlyclobbers;
diff --git a/gcc/reload1.c b/gcc/reload1.c
index b2d06211d8e..83c58129a65 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -108,7 +108,8 @@ static unsigned int *reg_max_ref_width;
/* Element N is the list of insns that initialized reg N from its equivalent
constant or memory slot. */
-static rtx *reg_equiv_init;
+rtx *reg_equiv_init;
+int reg_equiv_init_size;
/* Vector to remember old contents of reg_renumber before spilling. */
static short *reg_old_renumber;
@@ -319,7 +320,7 @@ static int eliminate_regs_in_insn (rtx, int);
static void update_eliminable_offsets (void);
static void mark_not_eliminable (rtx, rtx, void *);
static void set_initial_elim_offsets (void);
-static void verify_initial_elim_offsets (void);
+static bool verify_initial_elim_offsets (void);
static void set_initial_label_offsets (void);
static void set_offsets_for_label (rtx);
static void init_elim_table (void);
@@ -331,7 +332,6 @@ static void count_pseudo (int);
static void order_regs_for_reload (struct insn_chain *);
static void reload_as_needed (int);
static int reload_reg_class_lower (const void *, const void *);
-static int function_invariant_p (rtx);
static void choose_reload_regs (struct insn_chain *);
static void emit_input_reload_insns (struct insn_chain *, struct reload *,
rtx, int);
@@ -668,7 +668,6 @@ reload (rtx first, int global)
reg_equiv_constant = xcalloc (max_regno, sizeof (rtx));
reg_equiv_mem = xcalloc (max_regno, sizeof (rtx));
- reg_equiv_init = xcalloc (max_regno, sizeof (rtx));
reg_equiv_address = xcalloc (max_regno, sizeof (rtx));
reg_max_ref_width = xcalloc (max_regno, sizeof (int));
reg_old_renumber = xcalloc (max_regno, sizeof (short));
@@ -696,101 +695,88 @@ reload (rtx first, int global)
&& GET_MODE (insn) != VOIDmode)
PUT_MODE (insn, VOIDmode);
+ if (INSN_P (insn))
+ scan_paradoxical_subregs (PATTERN (insn));
+
if (set != 0 && REG_P (SET_DEST (set)))
{
rtx note = find_reg_note (insn, REG_EQUIV, NULL_RTX);
- if (note
- && (! function_invariant_p (XEXP (note, 0))
- || ! flag_pic
- /* A function invariant is often CONSTANT_P but may
- include a register. We promise to only pass
- CONSTANT_P objects to LEGITIMATE_PIC_OPERAND_P. */
- || (CONSTANT_P (XEXP (note, 0))
- && LEGITIMATE_PIC_OPERAND_P (XEXP (note, 0)))))
+ rtx x;
+
+ if (! note)
+ continue;
+
+ i = REGNO (SET_DEST (set));
+ x = XEXP (note, 0);
+
+ if (i <= LAST_VIRTUAL_REGISTER)
+ continue;
+
+ if (! function_invariant_p (x)
+ || ! flag_pic
+ /* A function invariant is often CONSTANT_P but may
+ include a register. We promise to only pass
+ CONSTANT_P objects to LEGITIMATE_PIC_OPERAND_P. */
+ || (CONSTANT_P (x)
+ && LEGITIMATE_PIC_OPERAND_P (x)))
{
- rtx x = XEXP (note, 0);
- i = REGNO (SET_DEST (set));
- if (i > LAST_VIRTUAL_REGISTER)
+ /* It can happen that a REG_EQUIV note contains a MEM
+ that is not a legitimate memory operand. As later
+ stages of reload assume that all addresses found
+ in the reg_equiv_* arrays were originally legitimate,
+ we ignore such REG_EQUIV notes. */
+ if (memory_operand (x, VOIDmode))
{
- /* It can happen that a REG_EQUIV note contains a MEM
- that is not a legitimate memory operand. As later
- stages of reload assume that all addresses found
- in the reg_equiv_* arrays were originally legitimate,
-
- It can also happen that a REG_EQUIV note contains a
- readonly memory location. If the destination pseudo
- is set from some other value (typically a different
- pseudo), and the destination pseudo does not get a
- hard reg, then reload will replace the destination
- pseudo with its equivalent memory location. This
- is horribly bad as it creates a store to a readonly
- memory location and a runtime segfault. To avoid
- this problem we reject readonly memory locations
- for equivalences. This is overly conservative as
- we could find all sets of the destination pseudo
- and remove them as they should be redundant. */
- if (memory_operand (x, VOIDmode) && ! MEM_READONLY_P (x))
+ /* Always unshare the equivalence, so we can
+ substitute into this insn without touching the
+ equivalence. */
+ reg_equiv_memory_loc[i] = copy_rtx (x);
+ }
+ else if (function_invariant_p (x))
+ {
+ if (GET_CODE (x) == PLUS)
{
- /* Always unshare the equivalence, so we can
- substitute into this insn without touching the
- equivalence. */
- reg_equiv_memory_loc[i] = copy_rtx (x);
+ /* This is PLUS of frame pointer and a constant,
+ and might be shared. Unshare it. */
+ reg_equiv_constant[i] = copy_rtx (x);
+ num_eliminable_invariants++;
}
- else if (function_invariant_p (x))
+ else if (x == frame_pointer_rtx
+ || x == arg_pointer_rtx)
{
- if (GET_CODE (x) == PLUS)
- {
- /* This is PLUS of frame pointer and a constant,
- and might be shared. Unshare it. */
- reg_equiv_constant[i] = copy_rtx (x);
- num_eliminable_invariants++;
- }
- else if (x == frame_pointer_rtx
- || x == arg_pointer_rtx)
- {
- reg_equiv_constant[i] = x;
- num_eliminable_invariants++;
- }
- else if (LEGITIMATE_CONSTANT_P (x))
- reg_equiv_constant[i] = x;
- else
- {
- reg_equiv_memory_loc[i]
- = force_const_mem (GET_MODE (SET_DEST (set)), x);
- if (!reg_equiv_memory_loc[i])
- continue;
- }
+ reg_equiv_constant[i] = x;
+ num_eliminable_invariants++;
}
+ else if (LEGITIMATE_CONSTANT_P (x))
+ reg_equiv_constant[i] = x;
else
- continue;
-
- /* If this register is being made equivalent to a MEM
- and the MEM is not SET_SRC, the equivalencing insn
- is one with the MEM as a SET_DEST and it occurs later.
- So don't mark this insn now. */
- if (!MEM_P (x)
- || rtx_equal_p (SET_SRC (set), x))
- reg_equiv_init[i]
- = gen_rtx_INSN_LIST (VOIDmode, insn, reg_equiv_init[i]);
+ {
+ reg_equiv_memory_loc[i]
+ = force_const_mem (GET_MODE (SET_DEST (set)), x);
+ if (! reg_equiv_memory_loc[i])
+ reg_equiv_init[i] = NULL_RTX;
+ }
+ }
+ else
+ {
+ reg_equiv_init[i] = NULL_RTX;
+ continue;
}
}
+ else
+ reg_equiv_init[i] = NULL_RTX;
}
-
- /* If this insn is setting a MEM from a register equivalent to it,
- this is the equivalencing insn. */
- else if (set && MEM_P (SET_DEST (set))
- && REG_P (SET_SRC (set))
- && reg_equiv_memory_loc[REGNO (SET_SRC (set))]
- && rtx_equal_p (SET_DEST (set),
- reg_equiv_memory_loc[REGNO (SET_SRC (set))]))
- reg_equiv_init[REGNO (SET_SRC (set))]
- = gen_rtx_INSN_LIST (VOIDmode, insn,
- reg_equiv_init[REGNO (SET_SRC (set))]);
-
- if (INSN_P (insn))
- scan_paradoxical_subregs (PATTERN (insn));
}
+ if (dump_file)
+ for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
+ if (reg_equiv_init[i])
+ {
+ fprintf (dump_file, "init_insns for %u: ", i);
+ print_inline_rtx (dump_file, reg_equiv_init[i], 20);
+ fprintf (dump_file, "\n");
+ }
+
init_elim_table ();
first_label_num = get_first_label_num ();
@@ -959,6 +945,13 @@ reload (rtx first, int global)
if (starting_frame_size != get_frame_size ())
something_changed = 1;
+ /* Even if the frame size remained the same, we might still have
+ changed elimination offsets, e.g. if find_reloads called
+ force_const_mem requiring the back end to allocate a constant
+ pool base register that needs to be saved on the stack. */
+ else if (!verify_initial_elim_offsets ())
+ something_changed = 1;
+
{
HARD_REG_SET to_spill;
CLEAR_HARD_REG_SET (to_spill);
@@ -1018,8 +1011,7 @@ reload (rtx first, int global)
gcc_assert (old_frame_size == get_frame_size ());
- if (num_eliminable)
- verify_initial_elim_offsets ();
+ gcc_assert (verify_initial_elim_offsets ());
}
/* If we were able to eliminate the frame pointer, show that it is no
@@ -1198,7 +1190,7 @@ reload (rtx first, int global)
free (offsets_at);
free (reg_equiv_mem);
- free (reg_equiv_init);
+ reg_equiv_init = 0;
free (reg_equiv_address);
free (reg_max_ref_width);
free (reg_old_renumber);
@@ -5422,23 +5414,32 @@ mark_not_eliminable (rtx dest, rtx x, void *data ATTRIBUTE_UNUSED)
where something illegal happened during reload_as_needed that could
cause incorrect code to be generated if we did not check for it. */
-static void
+static bool
verify_initial_elim_offsets (void)
{
HOST_WIDE_INT t;
+ if (!num_eliminable)
+ return true;
+
#ifdef ELIMINABLE_REGS
- struct elim_table *ep;
+ {
+ struct elim_table *ep;
- for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
- {
- INITIAL_ELIMINATION_OFFSET (ep->from, ep->to, t);
- gcc_assert (t == ep->initial_offset);
- }
+ for (ep = reg_eliminate; ep < &reg_eliminate[NUM_ELIMINABLE_REGS]; ep++)
+ {
+ INITIAL_ELIMINATION_OFFSET (ep->from, ep->to, t);
+ if (t != ep->initial_offset)
+ return false;
+ }
+ }
#else
INITIAL_FRAME_POINTER_OFFSET (t);
- gcc_assert (t == reg_eliminate[0].initial_offset);
+ if (t != reg_eliminate[0].initial_offset)
+ return false;
#endif
+
+ return true;
}
/* Reset all offsets on eliminable registers to their initial values. */
@@ -5974,7 +5975,7 @@ reload_as_needed (int live_known)
pic_offset_table_rtx is not, and we must not spill these things to
memory. */
-static int
+int
function_invariant_p (rtx x)
{
if (CONSTANT_P (x))
diff --git a/gcc/rtl-error.c b/gcc/rtl-error.c
index db795929e66..3521c1d361a 100644
--- a/gcc/rtl-error.c
+++ b/gcc/rtl-error.c
@@ -87,22 +87,22 @@ diagnostic_for_asm (rtx insn, const char *msg, va_list *args_ptr,
}
void
-error_for_asm (rtx insn, const char *msgid, ...)
+error_for_asm (rtx insn, const char *gmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
- diagnostic_for_asm (insn, msgid, &ap, DK_ERROR);
+ va_start (ap, gmsgid);
+ diagnostic_for_asm (insn, gmsgid, &ap, DK_ERROR);
va_end (ap);
}
void
-warning_for_asm (rtx insn, const char *msgid, ...)
+warning_for_asm (rtx insn, const char *gmsgid, ...)
{
va_list ap;
- va_start (ap, msgid);
- diagnostic_for_asm (insn, msgid, &ap, DK_WARNING);
+ va_start (ap, gmsgid);
+ diagnostic_for_asm (insn, gmsgid, &ap, DK_WARNING);
va_end (ap);
}
diff --git a/gcc/rtl.c b/gcc/rtl.c
index 2f52544ee0c..0c46c6066c0 100644
--- a/gcc/rtl.c
+++ b/gcc/rtl.c
@@ -33,7 +33,11 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "rtl.h"
#include "real.h"
#include "ggc.h"
-#include "errors.h"
+#ifdef GENERATOR_FILE
+# include "errors.h"
+#else
+# include "toplev.h"
+#endif
/* Indexed by rtx code, gives number of operands for an rtx with that code.
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 2eb5d9c84b8..69091ab36d0 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2062,6 +2062,9 @@ extern void dbr_schedule (rtx, FILE *);
extern void dump_local_alloc (FILE *);
extern int local_alloc (void);
+/* In reload1.c */
+extern int function_invariant_p (rtx);
+
/* In reg-stack.c */
extern bool reg_to_stack (FILE *);
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index da9774e488b..2561e32f661 100644
--- a/gcc/rtlanal.c
+++ b/gcc/rtlanal.c
@@ -1309,8 +1309,18 @@ reg_overlap_mentioned_p (rtx x, rtx in)
fmt = GET_RTX_FORMAT (GET_CODE (in));
for (i = GET_RTX_LENGTH (GET_CODE (in)) - 1; i >= 0; i--)
- if (fmt[i] == 'e' && reg_overlap_mentioned_p (x, XEXP (in, i)))
- return 1;
+ if (fmt[i] == 'e')
+ {
+ if (reg_overlap_mentioned_p (x, XEXP (in, i)))
+ return 1;
+ }
+ else if (fmt[i] == 'E')
+ {
+ int j;
+ for (j = XVECLEN (in, i) - 1; j >= 0; --j)
+ if (reg_overlap_mentioned_p (x, XVECEXP (in, i, j)))
+ return 1;
+ }
return 0;
}
@@ -3033,13 +3043,37 @@ unsigned int
subreg_regno_offset (unsigned int xregno, enum machine_mode xmode,
unsigned int offset, enum machine_mode ymode)
{
- int nregs_xmode, nregs_ymode;
+ int nregs_xmode, nregs_ymode, nregs_xmode_unit_int;
int mode_multiple, nregs_multiple;
int y_offset;
+ enum machine_mode xmode_unit, xmode_unit_int;
gcc_assert (xregno < FIRST_PSEUDO_REGISTER);
- nregs_xmode = hard_regno_nregs[xregno][xmode];
+ if (GET_MODE_INNER (xmode) == VOIDmode)
+ xmode_unit = xmode;
+ else
+ xmode_unit = GET_MODE_INNER (xmode);
+
+ if (FLOAT_MODE_P (xmode_unit))
+ {
+ xmode_unit_int = int_mode_for_mode (xmode_unit);
+ if (xmode_unit_int == BLKmode)
+ /* It's probably bad to be here; a port should have an integer mode
+ that's the same size as anything of which it takes a SUBREG. */
+ xmode_unit_int = xmode_unit;
+ }
+ else
+ xmode_unit_int = xmode_unit;
+
+ nregs_xmode_unit_int = hard_regno_nregs[xregno][xmode_unit_int];
+
+ /* Adjust nregs_xmode to allow for 'holes'. */
+ if (nregs_xmode_unit_int != hard_regno_nregs[xregno][xmode_unit])
+ nregs_xmode = nregs_xmode_unit_int * GET_MODE_NUNITS (xmode);
+ else
+ nregs_xmode = hard_regno_nregs[xregno][xmode];
+
nregs_ymode = hard_regno_nregs[xregno][ymode];
/* If this is a big endian paradoxical subreg, which uses more actual
@@ -3054,7 +3088,7 @@ subreg_regno_offset (unsigned int xregno, enum machine_mode xmode,
if (offset == 0 || nregs_xmode == nregs_ymode)
return 0;
- /* size of ymode must not be greater than the size of xmode. */
+ /* Size of ymode must not be greater than the size of xmode. */
mode_multiple = GET_MODE_SIZE (xmode) / GET_MODE_SIZE (ymode);
gcc_assert (mode_multiple != 0);
@@ -3069,36 +3103,82 @@ subreg_regno_offset (unsigned int xregno, enum machine_mode xmode,
xmode - The mode of xregno.
offset - The byte offset.
ymode - The mode of a top level SUBREG (or what may become one).
- RETURN - The regno offset which would be used. */
+ RETURN - Whether the offset is representable. */
bool
subreg_offset_representable_p (unsigned int xregno, enum machine_mode xmode,
unsigned int offset, enum machine_mode ymode)
{
- int nregs_xmode, nregs_ymode;
+ int nregs_xmode, nregs_ymode, nregs_xmode_unit, nregs_xmode_unit_int;
int mode_multiple, nregs_multiple;
int y_offset;
+ enum machine_mode xmode_unit, xmode_unit_int;
gcc_assert (xregno < FIRST_PSEUDO_REGISTER);
- nregs_xmode = hard_regno_nregs[xregno][xmode];
+ if (GET_MODE_INNER (xmode) == VOIDmode)
+ xmode_unit = xmode;
+ else
+ xmode_unit = GET_MODE_INNER (xmode);
+
+ if (FLOAT_MODE_P (xmode_unit))
+ {
+ xmode_unit_int = int_mode_for_mode (xmode_unit);
+ if (xmode_unit_int == BLKmode)
+ /* It's probably bad to be here; a port should have an integer mode
+ that's the same size as anything of which it takes a SUBREG. */
+ xmode_unit_int = xmode_unit;
+ }
+ else
+ xmode_unit_int = xmode_unit;
+
+ nregs_xmode_unit = hard_regno_nregs[xregno][xmode_unit];
+ nregs_xmode_unit_int = hard_regno_nregs[xregno][xmode_unit_int];
+
+ /* If there are holes in a non-scalar mode in registers, we expect
+ that it is made up of its units concatenated together. */
+ if (nregs_xmode_unit != nregs_xmode_unit_int)
+ {
+ gcc_assert (nregs_xmode_unit * GET_MODE_NUNITS (xmode)
+ == hard_regno_nregs[xregno][xmode]);
+
+ /* You can only ask for a SUBREG of a value with holes in the middle
+ if you don't cross the holes. (Such a SUBREG should be done by
+ picking a different register class, or doing it in memory if
+ necessary.) An example of a value with holes is XCmode on 32-bit
+ x86 with -m128bit-long-double; it's represented in 6 32-bit registers,
+ 3 for each part, but in memory it's two 128-bit parts.
+ Padding is assumed to be at the end (not necessarily the 'high part')
+ of each unit. */
+ if (nregs_xmode_unit != nregs_xmode_unit_int
+ && (offset / GET_MODE_SIZE (xmode_unit_int) + 1
+ < GET_MODE_NUNITS (xmode))
+ && (offset / GET_MODE_SIZE (xmode_unit_int)
+ != ((offset + GET_MODE_SIZE (ymode) - 1)
+ / GET_MODE_SIZE (xmode_unit_int))))
+ return false;
+
+ nregs_xmode = nregs_xmode_unit_int * GET_MODE_NUNITS (xmode);
+ }
+ else
+ nregs_xmode = hard_regno_nregs[xregno][xmode];
+
nregs_ymode = hard_regno_nregs[xregno][ymode];
- /* Paradoxical subregs are always valid. */
+ /* Paradoxical subregs are otherwise valid. */
if (offset == 0
&& nregs_ymode > nregs_xmode
&& (GET_MODE_SIZE (ymode) > UNITS_PER_WORD
? WORDS_BIG_ENDIAN : BYTES_BIG_ENDIAN))
return true;
- /* Lowpart subregs are always valid. */
+ /* Lowpart subregs are otherwise valid. */
if (offset == subreg_lowpart_offset (ymode, xmode))
return true;
- /* This should always pass, otherwise we don't know how to verify the
- constraint. These conditions may be relaxed but subreg_offset would
- need to be redesigned. */
+ /* This should always pass, otherwise we don't know how to verify
+ the constraint. These conditions may be relaxed but
+ subreg_regno_offset would need to be redesigned. */
gcc_assert ((GET_MODE_SIZE (xmode) % GET_MODE_SIZE (ymode)) == 0);
- gcc_assert ((GET_MODE_SIZE (ymode) % nregs_ymode) == 0);
gcc_assert ((nregs_xmode % nregs_ymode) == 0);
/* The XMODE value can be seen as a vector of NREGS_XMODE
@@ -3109,7 +3189,7 @@ subreg_offset_representable_p (unsigned int xregno, enum machine_mode xmode,
/ nregs_xmode,
MODE_INT, 0));
- /* size of ymode must not be greater than the size of xmode. */
+ /* Size of ymode must not be greater than the size of xmode. */
mode_multiple = GET_MODE_SIZE (xmode) / GET_MODE_SIZE (ymode);
gcc_assert (mode_multiple != 0);
diff --git a/gcc/sbitmap.c b/gcc/sbitmap.c
index 7c912a922af..cbc5775dbb6 100644
--- a/gcc/sbitmap.c
+++ b/gcc/sbitmap.c
@@ -691,8 +691,10 @@ int
sbitmap_first_set_bit (sbitmap bmap)
{
unsigned int n;
+ sbitmap_iterator sbi;
- EXECUTE_IF_SET_IN_SBITMAP (bmap, 0, n, { return n; });
+ EXECUTE_IF_SET_IN_SBITMAP (bmap, 0, n, sbi)
+ return n;
return -1;
}
diff --git a/gcc/sbitmap.h b/gcc/sbitmap.h
index edaa0580ebf..7f40d8ae43c 100644
--- a/gcc/sbitmap.h
+++ b/gcc/sbitmap.h
@@ -55,36 +55,87 @@ typedef SBITMAP_ELT_TYPE *sbitmap_ptr;
((BITMAP)->elms [(BITNO) / SBITMAP_ELT_BITS] \
&= ~((SBITMAP_ELT_TYPE) 1 << (BITNO) % SBITMAP_ELT_BITS))
-/* Loop over all elements of SBITSET, starting with MIN. */
-#define EXECUTE_IF_SET_IN_SBITMAP(SBITMAP, MIN, N, CODE) \
-do { \
- unsigned int word_num_ = (MIN) / (unsigned int) SBITMAP_ELT_BITS; \
- unsigned int bit_num_ = (MIN) % (unsigned int) SBITMAP_ELT_BITS; \
- unsigned int size_ = (SBITMAP)->size; \
- SBITMAP_ELT_TYPE *ptr_ = (SBITMAP)->elms; \
- SBITMAP_ELT_TYPE word_; \
- \
- if (word_num_ < size_) \
- { \
- word_ = ptr_[word_num_] >> bit_num_; \
- \
- while (1) \
- { \
- for (; word_ != 0; word_ >>= 1, bit_num_++) \
- { \
- if ((word_ & 1) != 0) \
- { \
- (N) = word_num_ * SBITMAP_ELT_BITS + bit_num_; \
- CODE; \
- } \
- } \
- word_num_++; \
- if (word_num_ >= size_) \
- break; \
- bit_num_ = 0, word_ = ptr_[word_num_]; \
- } \
- } \
-} while (0)
+/* The iterator for sbitmap. */
+typedef struct {
+ /* The pointer to the first word of the bitmap. */
+ SBITMAP_ELT_TYPE *ptr;
+
+ /* The size of the bitmap. */
+ unsigned int size;
+
+ /* The current word index. */
+ unsigned int word_num;
+
+ /* The current bit index (not modulo SBITMAP_ELT_BITS). */
+ unsigned int bit_num;
+
+ /* The words currently visited. */
+ SBITMAP_ELT_TYPE word;
+} sbitmap_iterator;
+
+/* Initialize the iterator I with sbitmap BMP and the initial index
+ MIN. */
+
+static inline void
+sbitmap_iter_init (sbitmap_iterator *i, sbitmap bmp, unsigned int min)
+{
+ i->word_num = min / (unsigned int) SBITMAP_ELT_BITS;
+ i->bit_num = min;
+ i->size = bmp->size;
+ i->ptr = bmp->elms;
+
+ if (i->word_num >= i->size)
+ i->word = 0;
+ else
+ i->word = (i->ptr[i->word_num]
+ >> (i->bit_num % (unsigned int) SBITMAP_ELT_BITS));
+}
+
+/* Return true if we have more bits to visit, in which case *N is set
+ to the index of the bit to be visited. Otherwise, return
+ false. */
+
+static inline bool
+sbitmap_iter_cond (sbitmap_iterator *i, unsigned int *n)
+{
+ /* Skip words that are zeros. */
+ for (; i->word == 0; i->word = i->ptr[i->word_num])
+ {
+ i->word_num++;
+
+ /* If we have reached the end, break. */
+ if (i->word_num >= i->size)
+ return false;
+
+ i->bit_num = i->word_num * SBITMAP_ELT_BITS;
+ }
+
+ /* Skip bits that are zero. */
+ for (; (i->word & 1) == 0; i->word >>= 1)
+ i->bit_num++;
+
+ *n = i->bit_num;
+
+ return true;
+}
+
+/* Advance to the next bit. */
+
+static inline void
+sbitmap_iter_next (sbitmap_iterator *i)
+{
+ i->word >>= 1;
+ i->bit_num++;
+}
+
+/* Loop over all elements of SBITMAP, starting with MIN. In each
+ iteration, N is set to the index of the bit being visited. ITER is
+ an instance of sbitmap_iterator used to iterate the bitmap. */
+
+#define EXECUTE_IF_SET_IN_SBITMAP(SBITMAP, MIN, N, ITER) \
+ for (sbitmap_iter_init (&(ITER), (SBITMAP), (MIN)); \
+ sbitmap_iter_cond (&(ITER), &(N)); \
+ sbitmap_iter_next (&(ITER)))
#define EXECUTE_IF_SET_IN_SBITMAP_REV(SBITMAP, N, CODE) \
do { \
diff --git a/gcc/sched-rgn.c b/gcc/sched-rgn.c
index 7c6afbe3581..4196e6d7e93 100644
--- a/gcc/sched-rgn.c
+++ b/gcc/sched-rgn.c
@@ -351,7 +351,8 @@ is_cfg_nonregular (void)
static void
extract_edgelst (sbitmap set, edgelst *el)
{
- int i;
+ unsigned int i;
+ sbitmap_iterator sbi;
/* edgelst table space is reused in each call to extract_edgelst. */
edgelst_last = 0;
@@ -360,11 +361,11 @@ extract_edgelst (sbitmap set, edgelst *el)
el->nr_members = 0;
/* Iterate over each word in the bitset. */
- EXECUTE_IF_SET_IN_SBITMAP (set, 0, i,
- {
- edgelst_table[edgelst_last++] = rgn_edges[i];
- el->nr_members++;
- });
+ EXECUTE_IF_SET_IN_SBITMAP (set, 0, i, sbi)
+ {
+ edgelst_table[edgelst_last++] = rgn_edges[i];
+ el->nr_members++;
+ }
}
/* Functions for the construction of regions. */
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index d7e9da6062f..338978992df 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -145,6 +145,7 @@ avoid_constant_pool_reference (rtx x)
{
rtx c, tmp, addr;
enum machine_mode cmode;
+ HOST_WIDE_INT offset = 0;
switch (GET_CODE (x))
{
@@ -173,26 +174,40 @@ avoid_constant_pool_reference (rtx x)
/* Call target hook to avoid the effects of -fpic etc.... */
addr = targetm.delegitimize_address (addr);
+ /* Split the address into a base and integer offset. */
+ if (GET_CODE (addr) == CONST
+ && GET_CODE (XEXP (addr, 0)) == PLUS
+ && GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST_INT)
+ {
+ offset = INTVAL (XEXP (XEXP (addr, 0), 1));
+ addr = XEXP (XEXP (addr, 0), 0);
+ }
+
if (GET_CODE (addr) == LO_SUM)
addr = XEXP (addr, 1);
- if (GET_CODE (addr) != SYMBOL_REF
- || ! CONSTANT_POOL_ADDRESS_P (addr))
- return x;
-
- c = get_pool_constant (addr);
- cmode = get_pool_mode (addr);
-
- /* If we're accessing the constant in a different mode than it was
- originally stored, attempt to fix that up via subreg simplifications.
- If that fails we have no choice but to return the original memory. */
- if (cmode != GET_MODE (x))
+ /* If this is a constant pool reference, we can turn it into its
+ constant and hope that simplifications happen. */
+ if (GET_CODE (addr) == SYMBOL_REF
+ && CONSTANT_POOL_ADDRESS_P (addr))
{
- c = simplify_subreg (GET_MODE (x), c, cmode, 0);
- return c ? c : x;
+ c = get_pool_constant (addr);
+ cmode = get_pool_mode (addr);
+
+ /* If we're accessing the constant in a different mode than it was
+ originally stored, attempt to fix that up via subreg simplifications.
+ If that fails we have no choice but to return the original memory. */
+ if (offset != 0 || cmode != GET_MODE (x))
+ {
+ rtx tem = simplify_subreg (GET_MODE (x), c, cmode, offset);
+ if (tem && CONSTANT_P (tem))
+ return tem;
+ }
+ else
+ return c;
}
- return c;
+ return x;
}
/* Make a unary operation by first seeing if it folds and otherwise making
diff --git a/gcc/stmt.c b/gcc/stmt.c
index d1e71dea4f1..6df6eaa3e2e 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -2437,7 +2437,7 @@ expand_case (tree exp)
if (compare_tree_int (minval, 0) > 0
&& compare_tree_int (maxval, GET_MODE_BITSIZE (word_mode)) < 0)
{
- minval = fold_convert (index_type, integer_zero_node);
+ minval = build_int_cst (index_type, 0);
range = maxval;
}
emit_case_bit_tests (index_type, index_expr, minval, range,
@@ -2458,6 +2458,7 @@ expand_case (tree exp)
#ifndef ASM_OUTPUT_ADDR_DIFF_ELT
|| flag_pic
#endif
+ || !flag_jump_tables
|| TREE_CONSTANT (index_expr)
/* If neither casesi or tablejump is available, we can
only go this way. */
@@ -2522,7 +2523,7 @@ expand_case (tree exp)
&& compare_tree_int (minval, 0) > 0
&& compare_tree_int (minval, 3) < 0)
{
- minval = fold_convert (index_type, integer_zero_node);
+ minval = build_int_cst (index_type, 0);
range = maxval;
}
@@ -2829,7 +2830,8 @@ node_has_low_bound (case_node_ptr node, tree index_type)
return 0;
low_minus_one = fold_build2 (MINUS_EXPR, TREE_TYPE (node->low),
- node->low, integer_one_node);
+ node->low,
+ build_int_cst (TREE_TYPE (node->low), 1));
/* If the subtraction above overflowed, we can't verify anything.
Otherwise, look for a parent that tests our value - 1. */
@@ -2879,7 +2881,8 @@ node_has_high_bound (case_node_ptr node, tree index_type)
return 0;
high_plus_one = fold_build2 (PLUS_EXPR, TREE_TYPE (node->high),
- node->high, integer_one_node);
+ node->high,
+ build_int_cst (TREE_TYPE (node->high), 1));
/* If the addition above overflowed, we can't verify anything.
Otherwise, look for a parent that tests our value + 1. */
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index cffb81c7f62..12581c5072c 100644
--- a/gcc/stor-layout.c
+++ b/gcc/stor-layout.c
@@ -851,11 +851,11 @@ place_field (record_layout_info rli, tree field)
if (TYPE_ALIGN (type) > desired_align)
{
if (STRICT_ALIGNMENT)
- warning (0, "%Jpacked attribute causes inefficient alignment "
- "for %qD", field, field);
+ warning (OPT_Wattributes, "%Jpacked attribute causes "
+ "inefficient alignment for %qD", field, field);
else
- warning (0, "%Jpacked attribute is unnecessary for %qD",
- field, field);
+ warning (OPT_Wattributes, "%Jpacked attribute is "
+ "unnecessary for %qD", field, field);
}
}
else
@@ -869,8 +869,7 @@ place_field (record_layout_info rli, tree field)
/* No, we need to skip space before this field.
Bump the cumulative size to multiple of field alignment. */
- if (warn_padded)
- warning (0, "%Jpadding struct to align %qD", field, field);
+ warning (OPT_Wpadded, "%Jpadding struct to align %qD", field, field);
/* If the alignment is still within offset_align, just align
the bit position. */
@@ -1299,17 +1298,19 @@ finalize_record_size (record_layout_info rli)
name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (rli->t)));
if (STRICT_ALIGNMENT)
- warning (0, "packed attribute causes inefficient "
+ warning (OPT_Wattributes, "packed attribute causes inefficient "
"alignment for %qs", name);
else
- warning (0, "packed attribute is unnecessary for %qs", name);
+ warning (OPT_Wattributes,
+ "packed attribute is unnecessary for %qs", name);
}
else
{
if (STRICT_ALIGNMENT)
- warning (0, "packed attribute causes inefficient alignment");
+ warning (OPT_Wattributes,
+ "packed attribute causes inefficient alignment");
else
- warning (0, "packed attribute is unnecessary");
+ warning (OPT_Wattributes, "packed attribute is unnecessary");
}
}
}
diff --git a/gcc/stringpool.c b/gcc/stringpool.c
index ec744715993..f75fb935519 100644
--- a/gcc/stringpool.c
+++ b/gcc/stringpool.c
@@ -95,7 +95,7 @@ ggc_alloc_string (const char *contents, int length)
return digit_string (contents[0] - '0');
obstack_grow0 (&string_stack, contents, length);
- return obstack_finish (&string_stack);
+ return XOBFINISH (&string_stack, const char *);
}
/* Return an IDENTIFIER_NODE whose name is TEXT (a null-terminated string).
diff --git a/gcc/stub-objc.c b/gcc/stub-objc.c
index ed9ac97258f..f889bb9a941 100644
--- a/gcc/stub-objc.c
+++ b/gcc/stub-objc.c
@@ -63,11 +63,22 @@ objc_is_reserved_word (tree ARG_UNUSED (ident))
return 0;
}
-int
-objc_comptypes (tree ARG_UNUSED (lhs), tree ARG_UNUSED (rhs),
- int ARG_UNUSED (reflexive))
+bool
+objc_compare_types (tree ARG_UNUSED (ltyp), tree ARG_UNUSED (rtyp),
+ int ARG_UNUSED (argno), tree ARG_UNUSED (callee))
+{
+ return false;
+}
+
+void
+objc_volatilize_decl (tree ARG_UNUSED (decl))
+{
+}
+
+bool
+objc_type_quals_match (tree ARG_UNUSED (ltyp), tree ARG_UNUSED (rtyp))
{
- return -1;
+ return false;
}
tree
diff --git a/gcc/system.h b/gcc/system.h
index 4eac3691481..9969356b3ad 100644
--- a/gcc/system.h
+++ b/gcc/system.h
@@ -692,7 +692,7 @@ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN;
HANDLE_PRAGMA_REDEFINE_EXTNAME HANDLE_PRAGMA_EXTERN_PREFIX \
MUST_PASS_IN_STACK FUNCTION_ARG_PASS_BY_REFERENCE \
VECTOR_MODE_SUPPORTED_P TARGET_SUPPORTS_HIDDEN \
- FUNCTION_ARG_PARTIAL_NREGS
+ FUNCTION_ARG_PARTIAL_NREGS ASM_OUTPUT_DWARF_DTPREL
/* Other obsolete target macros, or macros that used to be in target
headers and were not used, and may be obsolete or may never have
@@ -738,7 +738,8 @@ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN;
NON_SAVING_SETJMP TARGET_LATE_RTL_PROLOGUE_EPILOGUE \
CASE_DROPS_THROUGH TARGET_BELL TARGET_BS TARGET_CR TARGET_DIGIT0 \
TARGET_ESC TARGET_FF TARGET_NEWLINE TARGET_TAB TARGET_VT \
- LINK_LIBGCC_SPECIAL DONT_ACCESS_GBLS_AFTER_EPILOGUE
+ LINK_LIBGCC_SPECIAL DONT_ACCESS_GBLS_AFTER_EPILOGUE \
+ TARGET_OPTIONS TARGET_SWITCHES EXTRA_CC_MODES
/* 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 27e851123f2..fb04095b77d 100644
--- a/gcc/target-def.h
+++ b/gcc/target-def.h
@@ -137,6 +137,10 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define TARGET_HAVE_NAMED_SECTIONS false
#endif
+#ifndef TARGET_INVALID_WITHIN_DOLOOP
+#define TARGET_INVALID_WITHIN_DOLOOP default_invalid_within_doloop
+#endif
+
#ifndef TARGET_HAVE_TLS
#define TARGET_HAVE_TLS false
#endif
@@ -187,6 +191,10 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define TARGET_ASM_MARK_DECL_PRESERVED hook_void_constcharptr
#endif
+#ifndef TARGET_ASM_OUTPUT_DWARF_DTPREL
+#define TARGET_ASM_OUTPUT_DWARF_DTPREL NULL
+#endif
+
#define TARGET_ASM_ALIGNED_INT_OP \
{TARGET_ASM_ALIGNED_HI_OP, \
TARGET_ASM_ALIGNED_SI_OP, \
@@ -228,7 +236,8 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
TARGET_ASM_FILE_START, \
TARGET_ASM_FILE_END, \
TARGET_ASM_EXTERNAL_LIBCALL, \
- TARGET_ASM_MARK_DECL_PRESERVED}
+ TARGET_ASM_MARK_DECL_PRESERVED, \
+ TARGET_ASM_OUTPUT_DWARF_DTPREL}
/* Scheduler hooks. All of these default to null pointers, which
haifa-sched.c looks for and handles. */
@@ -375,6 +384,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define TARGET_GET_PCH_VALIDITY default_get_pch_validity
#define TARGET_PCH_VALID_P default_pch_valid_p
+#define TARGET_CHECK_PCH_TARGET_FLAGS NULL
#define TARGET_DEFAULT_SHORT_ENUMS hook_bool_void_false
@@ -547,12 +557,14 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
TARGET_GIMPLIFY_VA_ARG_EXPR, \
TARGET_GET_PCH_VALIDITY, \
TARGET_PCH_VALID_P, \
+ TARGET_CHECK_PCH_TARGET_FLAGS, \
TARGET_DEFAULT_SHORT_ENUMS, \
TARGET_BUILTIN_SETJMP_FRAME_VALUE, \
TARGET_MD_ASM_CLOBBERS, \
TARGET_DWARF_CALLING_CONVENTION, \
TARGET_DWARF_HANDLE_FRAME_UNSPEC, \
TARGET_STDARG_OPTIMIZE_HOOK, \
+ TARGET_INVALID_WITHIN_DOLOOP, \
TARGET_CALLS, \
TARGET_CXX, \
TARGET_HAVE_NAMED_SECTIONS, \
diff --git a/gcc/target.h b/gcc/target.h
index f141f04095f..d6b9f5e3ef2 100644
--- a/gcc/target.h
+++ b/gcc/target.h
@@ -180,6 +180,9 @@ struct gcc_target
linker to not dead code strip this symbol. */
void (*mark_decl_preserved) (const char *);
+ /* Output a DTP-relative reference to a TLS symbol. */
+ void (*output_dwarf_dtprel) (FILE *file, int size, rtx x);
+
} asm_out;
/* Functions relating to instruction scheduling. */
@@ -485,6 +488,11 @@ struct gcc_target
void * (* get_pch_validity) (size_t *);
const char * (* pch_valid_p) (const void *, size_t);
+ /* If nonnull, this function checks whether a PCH file with the
+ given set of target flags can be used. It returns NULL if so,
+ otherwise it returns an error message. */
+ const char *(*check_pch_target_flags) (int);
+
/* True if the compiler should give an enum type only as many
bytes as it takes to represent the range of possible values of
that type. */
@@ -520,6 +528,10 @@ struct gcc_target
to be checked for va_list references. */
bool (*stdarg_optimize_hook) (struct stdarg_info *ai, tree lhs, tree rhs);
+ /* Returns NULL if target supports the insn within a doloop block,
+ otherwise it returns an error message. */
+ const char * (*invalid_within_doloop) (rtx);
+
/* Functions relating to calls - argument passing, returns, etc. */
struct calls {
bool (*promote_function_args) (tree fntype);
diff --git a/gcc/targhooks.c b/gcc/targhooks.c
index 2bf11a431eb..1de5809db13 100644
--- a/gcc/targhooks.c
+++ b/gcc/targhooks.c
@@ -262,6 +262,30 @@ default_scalar_mode_supported_p (enum machine_mode mode)
}
}
+/* NULL if INSN insn is valid within a low-overhead loop, otherwise returns
+ an error message.
+
+ This function checks whether a given INSN is valid within a low-overhead
+ loop. If INSN is invalid it returns the reason for that, otherwise it
+ returns NULL. A called function may clobber any special registers required
+ for low-overhead looping. Additionally, some targets (eg, PPC) use the count
+ register for branch on table instructions. We reject the doloop pattern in
+ these cases. */
+
+const char *
+default_invalid_within_doloop (rtx insn)
+{
+ if (CALL_P (insn))
+ return "Function call in loop.";
+
+ if (JUMP_P (insn)
+ && (GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
+ || GET_CODE (PATTERN (insn)) == ADDR_VEC))
+ return "Computed branch in the loop.";
+
+ return NULL;
+}
+
bool
hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false (
CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
diff --git a/gcc/targhooks.h b/gcc/targhooks.h
index ae6cf53c2a0..8de68a29537 100644
--- a/gcc/targhooks.h
+++ b/gcc/targhooks.h
@@ -46,6 +46,8 @@ extern void default_unwind_emit (FILE *, rtx);
extern bool default_scalar_mode_supported_p (enum machine_mode);
+extern const char * default_invalid_within_doloop (rtx);
+
/* These are here, and not in hooks.[ch], because not all users of
hooks.h include tm.h, and thus we don't have CUMULATIVE_ARGS. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 41d08b2585d..adcfe2dd5ad 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,912 @@
+2005-06-15 Joseph S. Myers <joseph@codesourcery.com>
+
+ * gcc.dg/noncompile/20040203-3.c: Update expected message.
+
+2005-06-15 David Ung <davidu@mips.com>
+
+ * gcc.target/mips/mips16e-extends.c: New test for testing the
+ generation of MIPS16e zeb/zeh, seb/seh instructions.
+
+2005-06-15 Diego Novillo <dnovillo@redhat.com>
+
+ PR 22018
+ * gcc.dg/tree-ssa/vrp13.c: Add multiplication tests.
+ * gcc.dg/tree-ssa/pr22018.c: New test.
+
+2005-06-15 Aldy Hernandez <aldyh@redhat.com>
+
+ * gcc.dg/simd-1.c: Update error messages.
+ * gcc.dg/simd-1b.c: Re-enable tests. Update error messages.
+ * gcc.dg/simd-2.c: Update error messages.
+ * gcc.dg/simd-4.c: New.
+
+2005-06-15 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/20678
+ * g++.dg/other/crash-4.C: New.
+
+2005-06-14 Devang Patel <dpatel@apple.com>
+
+ * gcc.dg/vect/vect-ifcvt-1.c: Remove.
+
+2005-06-14 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/21929
+ * g++.dg/parse/crash11.C: Update
+
+2005-06-13 Jeff Law <law@redhat.com>
+
+ * gcc.dg/tree-ssa/20030807-10.c: VRP is now expected to
+ perform the desired transformations.
+ * gcc.dg/tree-ssa/20030806-6.c: Similarly.
+ * gcc.dg/tree-ssa/20040514-2.c: Similarly.
+
+2005-06-13 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
+
+ PR fortran/22038
+ * gfortran.dg/forall_1.f90: Un-XFAIL.
+
+2005-06-13 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/21929
+ * g++.dg/parse/crash26.C: New.
+
+ PR c++/20789
+ * g++.dg/init/member1.C: New.
+
+2005-06-13 Jakub Jelinek <jakub@redhat.com>
+
+ * gfortran.dg/altreturn_1.f90: New test.
+
+2005-06-13 Zdenek Dvorak <dvorakz@suse.cz>
+
+ PR middle-end/21985
+ * gcc.dg/tree-ssa/pr21985.c: New test.
+
+2005-06-12 James A. Morrison <phython@gcc.gnu.org>
+
+ * ggcc.dg/pr14796-1.c: Add tests for (X << C) >> C.
+
+2005-06-12 Roger Sayle <roger@eyesopen.com>
+
+ PR c++/21930
+ * g++.dg/other/error10.C: New test case.
+
+2005-06-12 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ PR libfortran/19155
+ * gfortran.dg/pr19155.f: Add test.
+
+2005-06-12 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
+
+ * gfortran.dg/f2c_7.f90: New test.
+
+ * gfortran.dg/forall_1.f90: XFAILed.
+
+2005-06-12 James A. Morrison <phython@gcc.gnu.org>
+
+ * gcc.dg/pr14796-1.c: New.
+ * gcc.dg/pr14796-2.c: New.
+
+2005-06-11 Steven G. Kargl <kargls@comcast.net>
+
+ PR fortran/17792
+ PR fortran/21375
+ * gfortran.dg/deallocate_stat.f90: New test.
+
+2005-06-11 Thomas Koenig <Thomas.Koenig@online.de>
+
+ * gfortran.fortran-torture/execute/in-pack.f90: New test.
+
+2005-06-10 Dorit Nuzman <dorit@il.ibm.com>
+
+ * gfortran.dg/vect/vect-4.f90: Update comments. Only one unaligned
+ access will be generated when this loop is vectorized. Test that
+ accesses with same alignment were detected.
+ * gcc.dg/vect/vect-dv-2.c: Remove "vect_no_align" from xfail.
+ Test that accesses with same alignment were detected.
+ * gcc.dg/vect/vect-ifcvt-1.c: Likewise.
+ * gcc.dg/vect/vect-91.c: New test. Test that accesses with same
+ alignment were detected.
+
+2005-06-09 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * gcc.dg/Wcxx-compat-1.c: New.
+
+2005-06-09 Thomas Koenig <Thomas.Koenig@online.de>
+
+ PR libfortran/21480
+ * gfortran.dg/reshape-complex.f90: Add a test for a packed
+ complex array.
+
+2005-06-09 Nathan Sidwell <nathan@codesourcery.com>
+
+ * gcc.dg/alias-8.c: New.
+
+2005-06-08 Joseph S. Myers <joseph@codesourcery.com>
+
+ * gcc.dg/format/cmn_err-1.c: Update.
+
+2005-06-08 James A. Morrison <phython@gcc.gnu.org>
+
+ PR target/20666
+ * gcc.target/sparc/fexpand-2.c: New.
+ * gcc.target/sparc/fpmerge-2.c: New.
+ * gcc.target/sparc/fpmul-2.c: New.
+ * gcc.target/sparc/noresult.c: New.
+ * gcc.target/sparc/pdist-2.c: New.
+ * gcc.target/sparc/pdist-3.c: New.
+
+2005-06-08 Alex V. Breger <atrus.ru@atrus.ru>
+
+ PR testsuite/21702
+ * gcc.target/i386/i386.exp: Fix comment typo.
+
+2005-06-08 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/19497
+ * g++.dg/inherit/using5.C: New.
+ * g++.dg/inherit/using6.C: New.
+
+2005-06-08 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ PR c++/19894
+ * g++.dg/template/ptrmem15.C: New test.
+
+ PR c++/20563
+ * g++.dg/ext/label4.C: New test.
+
+2005-06-08 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ * gcc.dg/tls/debug-1.c: New test.
+
+2005-06-07 Dale Johannesen <dalej@apple.com>
+
+ * gcc.target/i386/movq.c: New.
+
+2005-06-07 Dale Johannesen <dalej@apple.com>
+
+ * gcc.dg/20050607-1.c: New.
+
+2005-06-07 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/21850
+ * gcc.c-torture/execute/20050607-1.c: New test.
+
+2005-06-07 Thomas Koenig <Thomas.Koenig@online.de>
+
+ PR libfortran/21926
+ * gfortran.fortran-torture/execute/intrinsic_matmul.f90:
+ Test case where the return array has lowest stride one,
+ but isn't packed.
+
+2005-06-07 Adrian Straetling <straetling@de.ibm.com>
+
+ * lib/target-supports.exp (check_effective_target_sync_int_long):
+ Add s390 and s390x targets.
+
+2005-06-07 Zdenek Dvorak <dvorakz@suse.cz>
+
+ * gcc.dg/tree-ssa/loop-2.c: Update outcome.
+ * gcc.dg/tree-ssa/loop-3.c: Update outcome.
+ * gcc.dg/tree-ssa/loop-4.c: Update outcome.
+ * gcc.dg/tree-ssa/loop-9.c: New test.
+
+2005-06-07 Nathan Sidwell <nathan@codesourcery.com>
+
+ * g++.dg/parse/defarg10.C: New.
+
+2005-06-06 Jakub Jelinek <jakub@redhat.com>
+
+ PR regression/21897
+ * gcc.c-torture/execute/20050604-1.c: New test.
+
+2005-06-06 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR 21903
+ * g++.dg/parse/defarg9.C: New.
+
+ PR c++/20637
+ * g++.dg/inherit/using4.C: New.
+ * g++.dg/overload/error1.C: Adjust expected errors.
+ * g++.old-deja/g++.benjamin/warn02.C: Likewise.
+ * g++.old-deja/g++.brendan/arm2.C: Likewise.
+ * g++.old-deja/g++.other/redecl2.C: Likewise.
+ * g++.old-deja/g++.other/redecl4.C: Likewise.
+ * g++.old-deja/g++.pt/memtemp78.C: Likewise.
+
+2005-06-05 David Billinghurst <David.Billinghurst@riotinto.com>
+
+ * gfortran.dg/f2c_5.f90: Add -w to dg-options
+
+2005-06-05 David Billinghurst <David.Billinghurst@riotinto.com>
+
+ * lib/gfortran.exp (gfortran_target_compile): Call
+ dg-additional-files-options
+ * gfortran.dg/f2c_4.f90: New file
+ * gfortran.dg/f2c_4.c: New file
+ * gfortran.dg/f2c_5.f90: New file
+ * gfortran.dg/f2c_5.c: New file
+
+2005-06-05 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
+
+ * gfortran.dg/forall_1.f90: Set previously uninitialized variable.
+
+ PR fortran/21912
+ * gfortran.dg/array_constructor_4.f90: New test.
+
+2005-06-05 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/21619
+ * g++.dg/ext/builtin9.C: New test.
+
+2005-06-05 Dale Johannesen <dalej@apple.com>
+
+ * gcc.c-torture/execute/20050603-1.c: Move to gcc.dg.
+ * gcc.c-torture/execute/20050603-2.c: Ditto.
+
+2005-06-05 Dorit Nuzman <dorit@il.ibm.com>
+
+ * gcc.dg/vect/vect-62: Check that second loop is not vectorized.
+ * gcc.dg/vect/vect-reduc-1.c: New.
+ * gcc.dg/vect/vect-reduc-2.c: New.
+ * gcc.dg/vect/vect-reduc-3.c: New.
+
+2005-06-04 Dale Johannesen <dalej@apple.com>
+
+ * gcc.c-torture/execute/20050603-1.c: New.
+ * gcc.c-torture/execute/20050603-2.c: New.
+ * gcc.dg/20050603-3.c: New.
+
+2005-06-04 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
+
+ PR fortran/19195
+ * gfortran.dg/debug_1.f90: New test.
+
+ * gfortran.dg/forall_1.f90: New test.
+
+2005-06-04 Erik Edelmann <erik.edelmann@iki.fi>
+
+ * gfortran.dg/array_constructor_3.f90: New test.
+
+2005-06-04 Tobias Schl"uter <tobias.schlueter@physik.uni-muenchen.de>
+
+ * gfortran.dg/ret_pointer_1.f90: Un-XFAIL.
+
+2005-06-04 Hans-Peter Nilsson <hp@axis.com>
+
+ * g++.dg/opt/crossjump1.C: Gate -fPIC usage on target fpic.
+
+2005-06-04 Joseph S. Myers <joseph@codesourcery.com>
+
+ PR c/21873
+ * gcc.dg/init-excess-1.c: New test.
+
+2005-06-03 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/21853
+ * g++.dg/expr/static_cast6.C: New test.
+
+2005-06-03 Diego Novillo <dnovillo@redhat.com>
+
+ * gcc.dg/tree-ssa/vrp14.c: New test.
+
+2005-06-03 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/21336
+ * g++.dg/template/new2.C: New test.
+
+2005-06-03 Josh Conner <jconner@apple.com>
+
+ * gcc.dg/ppc-vector-memcpy.c (foo): Use non-zero values for
+ all entries in initializer.
+
+2005-06-03 Richard Guenther <rguenth@gcc.gnu.org>
+
+ PR middle-end/21858
+ * gcc.dg/pr21858.c: New testcase.
+
+2005-06-03 Paolo Bonzini <bonzini@gnu.org>
+
+ PR tree-optimization/21292
+
+ * lib/target-supports.exp (check_effective_target_vect_cmdline_needed):
+ New.
+ * gcc.dg/tree-ssa/gen-vect-11.c, gcc.dg/tree-ssa/gen-vect-11a.c,
+ gcc.dg/tree-ssa/gen-vect-11b.c, gcc.dg/tree-ssa/gen-vect-11c.c,
+ gcc.dg/tree-ssa/gen-vect-2.c, gcc.dg/tree-ssa/gen-vect-25.c,
+ gcc.dg/tree-ssa/gen-vect-26.c, gcc.dg/tree-ssa/gen-vect-28.c,
+ gcc.dg/tree-ssa/gen-vect-32.c: Require it.
+
+2005-06-02 Richard Henderson <rth@redhat.com>
+
+ * gcc.dg/sync-2.c: Use -march=i486 for i386.
+
+2005-06-02 Richard Guenther <rguenth@gcc.gnu.org>
+
+ * gcc.dg/wtypequal.c: New testcase.
+
+2005-06-02 Diego Novillo <dnovillo@redhat.com>
+
+ PR 21582
+ * gcc.dg/tree-ssa/pr21582.c: New test.
+
+2005-06-02 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/21280
+ * g++.dg/opt/interface2.h: New.
+ * g++.dg/opt/interface2.C: New.
+ * g++.dg/init/ctor4.C: Adjust error lines.
+ * g++.old-deja/g++.bob/inherit2.C: Likewise.
+ * g++.old-deja/g++.bugs/900205_04.C: Likewise.
+ * g++.old-deja/g++.jason/opeq3.C: Likewise.
+ * g++.old-deja/g++.pt/assign1.C: Likewise.
+ * g++.old-deja/g++.pt/crash20.C: Likewise.
+
+2005-06-02 Dorit Nuzman <dorit@il.ibm.com>
+
+ PR tree-optimization/21734
+ * g++.dg/vect/pr21734_1.cc: New.
+ * g++.dg/vect/pr21734_2.cc: New.
+
+2005-06-02 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/20350
+ * g++.dg/template/spec24.C: New.
+
+ PR c++/21151
+ * g++.dg/pch/local-1.C: New.
+ * g++.dg/pch/local-1.Hs: New.
+
+2005-06-01 Diego Novillo <dnovillo@redhat.com>
+
+ PR 14341, PR 21332, PR 20701, PR 21086, PR 21090
+ PR 21289, PR 21348, PR 21367, PR 21368, PR 21458.
+ * gcc.dg/tree-ssa/pr14341.c: New test.
+ * gcc.dg/tree-ssa/pr14841.c: New test.
+ * gcc.dg/tree-ssa/pr20701.c: New test.
+ * gcc.dg/tree-ssa/pr21086.c: New test.
+ * gcc.dg/tree-ssa/pr21090.c: New test.
+ * gcc.dg/tree-ssa/pr21332.c: New test.
+ * gcc.dg/tree-ssa/pr21458.c: New test.
+ * gcc.dg/tree-ssa/pr21658.c: New test.
+ * gcc.dg/tree-ssa/vrp01.c: New test.
+ * gcc.dg/tree-ssa/vrp02.c: New test.
+ * gcc.dg/tree-ssa/vrp03.c: New test.
+ * gcc.dg/tree-ssa/vrp04.c: New test.
+ * gcc.dg/tree-ssa/vrp05.c: New test.
+ * gcc.dg/tree-ssa/vrp06.c: New test.
+ * gcc.dg/tree-ssa/vrp07.c: New test.
+ * gcc.dg/tree-ssa/vrp08.c: New test.
+ * gcc.dg/tree-ssa/vrp09.c: New test.
+ * gcc.dg/tree-ssa/vrp10.c: New test.
+ * gcc.dg/tree-ssa/vrp11.c: New test.
+ * gcc.dg/tree-ssa/vrp12.c: New test.
+ * gcc.dg/tree-ssa/vrp13.c: New test.
+
+2005-06-01 Alexandre Oliva <aoliva@redhat.com>
+
+ PR 21029
+ * gcc.dg/tree-ssa/pr21029.c: New test.
+
+2005-06-01 Roger Sayle <roger@eyesopen.com>
+
+ * gfortran.dg/logint-1.f: New test case.
+ * gfortran.dg/logint-2.f: Likewise.
+ * gfortran.dg/logint-3.f: Likewise.
+
+2005-06-01 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/21536
+ PR c/20760
+ * gcc.dg/20050527-1.c: New test.
+
+ * gcc.dg/i386-sse-12.c: New test.
+
+ PR fortran/21729
+ * gfortran.dg/implicit_5.f90: New test.
+
+2005-06-01 Feng Wang <fengwang@nudt.edu.cn>
+
+ PR fortran/20883
+ * gfortran/assign_4.f90: New test.
+ * gfortran/assign_2.f90: Change compile to run.
+
+2005-05-31 Geoffrey Keating <geoffk@geoffk.org>
+
+ * lib/target-supports.exp
+ (check_effective_target_sync_char_short): New.
+ * gcc.dg/sync-2.c: New.
+
+2005-05-31 Zdenek Dvorak <dvorakz@suse.cz>
+
+ PR tree-optimization/21817
+ * gcc.dg/torture/pr21817-1.c: New.
+
+2005-05-31 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/21165
+ * g++.dg/template/init5.C: New.
+
+2005-05-31 Paul Thomas <pault@gcc.gnu.org>
+
+ * gfortran.dg/char_initialiser_actual.f90:
+ Test character initialisers as actual arguments.
+ * gfortran.dg/char_pointer_comp_assign.f90:
+ Test character pointer structure component assignments.
+ * gfortran.dg/char_array_structure_constructor.f90:
+ Test character components in structure constructors.
+
+2005-05-31 Andrew pinski <pinskia@physics.uc.edu>
+
+ PR middle-end/20931
+ * g++.dg/opt/pr20931.C: New test.
+
+2005-05-31 Andreas Jaeger <aj@suse.de>
+
+ PR testsuite/20772
+ * g++.dg/abi/dtor1.C, g++.dg/abi/empty10.C, g++.dg/abi/layout3.C,
+ g++.dg/eh/simd-2.C, g++.dg/opt/cse2.C,
+ g++.old-deja/g++.ext/asmspec1.C,
+ g++.old-deja/g++.other/regstack.C,
+ gcc.dg/20000614-1.c, gcc.dg/20000807-1.c, gcc.dg/20000904-1.c,
+ gcc.dg/20001127-1.c, gcc.dg/20010202-1.c, gcc.dg/20010520-1.c,
+ gcc.dg/20011009-1.c, gcc.dg/20011029-2.c, gcc.dg/20020224-1.c,
+ gcc.dg/20020531-1.c, gcc.dg/20020616-1.c, gcc.dg/980226-1.c,
+ gcc.dg/980414-1.c, gcc.dg/980520-1.c, gcc.dg/980709-1.c,
+ gcc.dg/990117-1.c, gcc.dg/990130-1.c, gcc.dg/990213-2.c,
+ gcc.dg/990214-1.c, gcc.dg/991129-1.c, gcc.dg/991209-1.c,
+ gcc.dg/991214-1.c, gcc.dg/asm-1.c, gcc.dg/attr-returns_twice-1.c,
+ gcc.dg/clobbers.c, gcc.dg/i386-387-7.c, gcc.dg/i386-387-8.c,
+ gcc.dg/i386-3dnowA-1.c, gcc.dg/i386-3dnowA-2.c, gcc.dg/i386-asm-1.c
+ gcc.dg/i386-asm-2.c, gcc.dg/i386-asm-3.c, gcc.dg/i386-bitfield3.c
+ gcc.dg/i386-call-1.c, gcc.dg/i386-memset-1.c,
+ gcc.dg/i386-signbit-3.c, gcc.dg/i386-ssefn-1.c,
+ gcc.dg/i386-ssefn-2.c, gcc.dg/i386-ssefn-3.c, gcc.dg/i386-ssefn-4.c
+ gcc.dg/i386-volatile-1.c, gcc.dg/i386-xorps.c, gcc.dg/pr12092-1.c
+ gcc.dg/pr14289-1.c, gcc.dg/pr19236-1.c, gcc.dg/pr20204.c,
+ gcc.dg/pr9771-1.c, gcc.dg/register-var-1.c,
+ gcc.dg/sibcall-5.c, gcc.dg/charset/asm3.c,
+ gcc.dg/cpp/trad/num-sign.c: Run tests also on x86_64.
+
+2005-05-31 Jeff Law <law@redhat.com>
+
+ * gcc.dg/tree-ssa/foldaddr-1.c: New test.
+
+2005-05-30 Paolo Carlini <pcarlini@suse.de>
+
+ PR middle-end/21743
+ * gcc.dg/builtins-1.c: Activate disabled clog test.
+ * gcc.dg/torture/builtin-attr-1.c: Likewise.
+
+2005-05-29 Paul Thomas <pault@gcc.gnu.org>
+
+ * gfortran.dg/char_pointer_assign.f90:
+ Test character-pointer assignments and pointer assignments.
+ * gfortran.dg/char_pointer_dummy.f90:
+ Test character-pointer dummy arguments.
+ * gfortran.dg/char_pointer_func.f90:
+ Test character-pointer function returns.
+ * gfortran.dg/char_pointer_dependency.f90:
+ Test character-pointer functions with dependencies.
+
+2005-05-30 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/21784
+ * g++.dg/lookup/using14.C: New test.
+
+2005-05-30 Kazu Hirata <kazu@cs.umass.edu>
+
+ * gcc.dg/c99-math-double-1.c, gcc.dg/c99-math-float-1.c,
+ gcc.dg/c99-math-long-double-1.c, gcc.dg/c99-math.h: Remove
+ trailing ^M.
+
+2005-05-29 Geoffrey Keating <geoffk@apple.com>
+
+ PR c++/17413
+ * g++.dg/template/local5.C: New.
+
+ PR target/21761
+ * gcc.c-torture/compile/pr21761.c: New.
+
+ * g++.old-deja/g++.eh/badalloc1.C: Make XFAIL only on darwin
+ before darwin8.
+
+2005-05-30 Steven G. Kargl
+
+ PR fortran/20846
+ * gfortran.dg/inquire_8.f90: New test.
+
+2005-05-29 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ PR libfortran/21376
+ * gfortran.dg/output_exponents_1.f90: New test.
+
+2005-05-29 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ PR libfortran/20006
+ * gfortran.dg/dollar_edit_descriptor-1.f: New test.
+
+2005-05-28 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/21210
+ * g++.dg/ext/complex1.C: New test.
+
+ PR c++/21340
+ * g++.dg/init/ctor6.C: New test.
+
+2005-05-29 Jan Hubicka <jh@suse.cz>
+
+ * gcc.c-torture/compile/pr21562.c: New.
+
+2005-05-28 Steven G. Kargl <kargls@comcast.net>
+
+ * gfortran.dg/subnormal_1.f90: New test.
+
+2005-05-28 Jan Hubicka <jh@suse.cz>
+
+ * tree-prof.exp: Fix comment.
+ * value-prof-1.c: New.
+ * value-prof-2.c: New.
+ * value-prof-3.c: New.
+ * value-prof-4.c: New.
+
+2005-05-27 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/21614
+ * g++.dg/expr/ptrmem6.C: New test.
+ * g++.dg/expr/ptrmem6a.C: Likewise.
+
+2005-05-27 Kazu Hirata <kazu@cs.umass.edu>
+
+ PR tree-optimization/21658
+ * gcc.dg/tree-ssa/pr21658.c: New.
+
+2005-05-27 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/21455
+ * g++.dg/inherit/ptrmem3.C: New.
+
+ PR c++/21681
+ * g++.dg/parse/template16.C: New.
+
+2005-05-27 Andreas Jaeger <aj@suse.de>
+
+ * gcc.dg/setjmp-2.c: Only run in 32-bit.
+
+ * gcc.dg/i386-sse-8.c: Run test on all archs.
+
+2005-05-26 Mike Stump <mrs@apple.com>
+
+ * objc.dg/isa-field-1.m: Only run on darwin.
+ * objc.dg/lookup-1.m: Likewise.
+ * objc.dg/try-catch-8.m: Likewise.
+
+2005-05-26 Roger Sayle <roger@eyesopen.com>
+
+ PR tree-optimization/9814
+ * gcc.dg/pr9814-1.c: New test case.
+
+2005-05-26 Ziemowit Laski <zlaski@apple.com>
+
+ * objc.dg/comp-types-8.m, objc.dg/encode-6.m,
+ objc.dg/extra-semi.m, objc.dg/fix-and-continue-2.m,
+ objc.dg/isa-field-1.m, objc.dg/lookup-1.m, objc.dg/method-15.m,
+ objc.dg/method-16.m, objc.dg/method-17.m, objc.dg/method-18.m,
+ objc.dg/method-19.m, objc.dg/next-runtime-1.m,
+ objc.dg/no-extra-load.m, objc.dg/pragma-1.m, objc.dg/stubify-1.m,
+ objc.dg/stubify-2.m, objc.dg/super-class-4.m,
+ objc.dg/super-dealloc-1.m, objc.dg/super-dealloc-2.m,
+ objc.dg/try-catch-6.m, objc.dg/try-catch-7.m,
+ objc.dg/try-catch-8.m: New.
+
+2005-05-26 Janis Johnson <janis187@us.ibm.com>
+
+ * lib/obj-c++.exp (obj-c++_target_compile): Declare global variable,
+ remove extraneous semicolons.
+
+2005-05-26 Ziemowit Laski <zlaski@apple.com>
+
+ * obj-c++.dg/comp-types-12.mm: New.
+ * objc.dg/comp-types-11.m: New.
+ * objc.dg/selector-4.m: New.
+
+2005-05-26 Andreas Jaeger <aj@suse.de>
+
+ PR testsuite/20772
+ * g++.old-deja/g++.ext/attrib1.C, g++.old-deja/g++.ext/attrib2.C,
+ g++.old-deja/g++.ext/attrib3.C,
+ g++.old-deja/g++.other/store-expr1.C,
+ g++.old-deja/g++.other/store-expr2.C, g++.dg/opt/longbranch2.C,
+ gcc.dg/20000609-1.c, gcc.dg/20000720-1.c, gcc.dg/20011107-1.c,
+ gcc.dg/20011119-1.c, gcc.dg/20020108-1.c, gcc.dg/20020122-2.c,
+ gcc.dg/20020122-3.c, gcc.dg/20020201-3.c, gcc.dg/20020206-1.c,
+ gcc.dg/20020218-1.c, gcc.dg/20020310-1.c, gcc.dg/20020411-1.c,
+ gcc.dg/20020418-2.c, gcc.dg/20020426-1.c, gcc.dg/20020426-2.c,
+ gcc.dg/20020517-1.c, gcc.dg/20020523-1.c, gcc.dg/20020523-2.c,
+ gcc.dg/20020729-1.c, gcc.dg/20030204-1.c, gcc.dg/20030826-2.c,
+ gcc.dg/20030926-1.c, gcc.dg/20031202-1.c, gcc.dg/980312-1.c,
+ gcc.dg/980313-1.c, gcc.dg/990424-1.c, gcc.dg/990524-1.c,
+ gcc.dg/991230-1.c, gcc.dg/i386-387-1.c, gcc.dg/i386-387-2.c,
+ gcc.dg/i386-387-3.c, gcc.dg/i386-387-4.c, gcc.dg/i386-387-5.c,
+ gcc.dg/i386-387-6.c, gcc.dg/i386-bitfield1.c,
+ gcc.dg/i386-bitfield2.c, gcc.dg/i386-loop-1.c,
+ gcc.dg/i386-loop-2.c, gcc.dg/i386-loop-3.c, gcc.dg/i386-pic-1.c,
+ gcc.dg/i386-regparm.c, gcc.dg/i386-signbit-1.c,
+ gcc.dg/i386-signbit-2.c, gcc.dg/i386-sse-5.c, gcc.dg/i386-sse-8.c,
+ gcc.dg/i386-unroll-1.c, gcc.dg/tls/opt-1.c, gcc.dg/tls/opt-2.c,
+ gcc.dg/unroll-1.c: Handle 32-bit x86-64 compilation.
+
+2005-05-26 Andreas Jaeger <aj@suse.de>
+
+ * gcc.c-torture/execute/ieee/ieee.exp: Set float-store for 32-bit
+ x86-64 compilation.
+
+2005-05-26 Andreas Jaeger <aj@suse.de>
+
+ PR testsuite/20772
+ * gfortran.dg/promotion.f90, gcc.misc-tests/i386-pf-3dnow-1.c,
+ gcc.misc-tests/i386-pf-athlon-1.c,
+ gcc.misc-tests/i386-pf-none-1.c, gcc.misc-tests/i386-pf-sse-1.c,
+ g++.dg/opt/mmx1.C, g++.dg/other/big-struct.C,
+ g++.dg/abi/bitfield3.C, g++.dg/abi/bitfield8.C,
+ g++.dg/abi/bitfield9.C, g++.dg/abi/empty7.C, g++.dg/abi/empty9.C,
+ g++.dg/abi/layout4.C, g++.dg/abi/thunk1.C, g++.dg/abi/thunk2.C,
+ g++.dg/abi/vbase11.C, g++.dg/abi/vthunk2.C, g++.dg/abi/vthunk3.C,
+ g++.dg/ext/attrib8.C: Run also on x86_64 compiling 32-bit x86
+ programs.
+
+ * g++.dg/opt/reg-stack4.C, g++.dg/eh/simd-1.C, g++.dg/eh/simd-1.C,
+ gcc.dg/setjmp-2.c, gcc.dg/short-compare-1.c,
+ gcc.dg/short-compare-2.c, gcc.target/i386/asm-1.c: Handle 32-bit
+ x86-64 compilation.
+
+ * g++.dg/warn/register-var-1.C, g++.dg/charset/asm2.c: Run also on
+ x86_64.
+
+ * gcc.dg/i386-pentium4-not-mull.c: Change option handling to use
+ effective-target ilp32.
+
+2005-05-26 David Ung <davidu@mips.com>
+
+ * gcc.target/mips/ext_ins.c: New test for testing the generation
+ of MIPS32/64 rev 2 ext/ins instructions.
+
+2005-05-26 Andreas Jaeger <aj@suse.de>
+
+ * treelang/compile/unsigned.tree: Use gimple instead of
+ nonexisting generic dump.
+
+2005-05-26 Paolo Bonzini <bonzini@gnu.org>
+
+ * gcc.dg/vect/vect-7.c: Remove xfail for alpha.
+
+2005-05-26 Andreas Jaeger <aj@suse.de>
+
+ * gcc.dg/tree-ssa/ssa-pre-14.c (foo): Use correct type for strlen.
+
+2005-05-26 Thomas Koenig <Thomas.Koenig@online.de>
+
+ PR libfortran/17283
+ * gfortran.fortran-torture/execute/intrinsic_unpack.f90:
+ Test callee-allocated memory with write statements.
+
+2005-05-25 Roger Sayle <roger@eyesopen.com>
+
+ PR middle-end/21709
+ * gcc.dg/pr21709-1.c: New test case.
+
+2005-05-25 Ziemowit Laski <zlaski@apple.com>
+ Mike Stump <mrs@apple.com>
+
+ * objc/execute/next_mapping.h: Update for C++.
+
+ * obj-c++.dg/selector-1.mm: Move to...
+ * obj-c++.dg/selector-4.mm: here...
+
+ * obj-c++.dg/basic.mm: New.
+ * obj-c++.dg/comp-types-1.mm: New.
+ * obj-c++.dg/cxx-class-1.mm: New.
+ * obj-c++.dg/cxx-ivars-1.mm: New.
+ * obj-c++.dg/cxx-ivars-2.mm: New.
+ * obj-c++.dg/cxx-ivars-3.mm: New.
+ * obj-c++.dg/cxx-scope-1.mm: New.
+ * obj-c++.dg/cxx-scope-2.mm: New.
+ * obj-c++.dg/defs.mm: New.
+ * obj-c++.dg/empty-private-1.mm: New.
+ * obj-c++.dg/encode-1.mm: New.
+ * obj-c++.dg/encode-2.mm: New.
+ * obj-c++.dg/encode-3.mm: New.
+ * obj-c++.dg/extern-c-1.mm: New.
+ * obj-c++.dg/extra-semi.mm: New.
+ * obj-c++.dg/fix-and-continue-2.mm: New.
+ * obj-c++.dg/isa-field-1.mm: New.
+ * obj-c++.dg/ivar-list-semi.mm: New.
+ * obj-c++.dg/local-decl-1.mm: New.
+ * obj-c++.dg/lookup-1.mm: New.
+ * obj-c++.dg/lookup-2.mm: New.
+ * obj-c++.dg/method-1.mm: New.
+ * obj-c++.dg/method-2.mm: New.
+ * obj-c++.dg/method-3.mm: New.
+ * obj-c++.dg/method-4.mm: New.
+ * obj-c++.dg/method-5.mm: New.
+ * obj-c++.dg/method-6.mm: New.
+ * obj-c++.dg/method-7.mm: New.
+ * obj-c++.dg/no-extra-load.mm: New.
+ * obj-c++.dg/overload-1.mm: New.
+ * obj-c++.dg/pragma-1.mm: New.
+ * obj-c++.dg/pragma-2.mm: New.
+ * obj-c++.dg/private-1.mm: New.
+ * obj-c++.dg/private-2.mm: New.
+ * obj-c++.dg/proto-qual-1.mm: New.
+ * obj-c++.dg/qual-types-1.mm: New.
+ * obj-c++.dg/stubify-1.mm: New.
+ * obj-c++.dg/stubify-2.mm: New.
+ * obj-c++.dg/super-class-1.mm: New.
+ * obj-c++.dg/super-class-2.mm: New.
+ * obj-c++.dg/super-dealloc-1.mm: New.
+ * obj-c++.dg/super-dealloc-2.mm: New.
+ * obj-c++.dg/template-1.mm: New.
+ * obj-c++.dg/template-2.mm: New.
+ * obj-c++.dg/template-3.mm: New.
+ * obj-c++.dg/template-4.mm: New.
+ * obj-c++.dg/template-5.mm: New.
+ * obj-c++.dg/template-6.mm: New.
+ * obj-c++.dg/try-catch-1.mm: New.
+ * obj-c++.dg/try-catch-2.mm: New.
+ * obj-c++.dg/try-catch-3.mm: New.
+ * obj-c++.dg/try-catch-4.mm: New.
+ * obj-c++.dg/try-catch-5.mm: New.
+ * obj-c++.dg/try-catch-6.mm: New.
+ * obj-c++.dg/try-catch-7.mm: New.
+ * obj-c++.dg/try-catch-8.mm: New.
+ * obj-c++.dg/try-catch-9.mm: New.
+ * obj-c++.dg/va-meth-1.mm: New.
+
+2005-05-25 Ziemowit Laski <zlaski@apple.com>
+
+ * obj-c++.dg/selector-1.mm: New.
+ * obj-c++.dg/selector-2.mm: New.
+
+2005-05-25 Ziemowit Laski <zlaski@apple.com>
+
+ * obj-c++.dg/selector-3.mm: New.
+ * objc.dg/selector-3.m: New.
+
+2005-05-25 Ziemowit Laski <zlaski@apple.com>
+
+ * objc.dg/selector-2.m: Remove "-fgnu-runtime"; be flexible
+ about where warning appears.
+
+2005-05-25 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * gcc.dg/tree-ssa/stdarg-2.c: Add tests for s390*-*-linux* targets.
+ * gcc.dg/tree-ssa/stdarg-3.c: Likewise.
+ * gcc.dg/tree-ssa/stdarg-4.c: Likewise.
+ * gcc.dg/tree-ssa/stdarg-5.c: Likewise.
+
+2005-05-25 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * gcc.dg/20050524-1.c: New test.
+
+2005-05-25 Jan Hubicka <jh@suse.cz>
+
+ * gcc.dg/tree-prof/inliner-1.c: New.
+
+2005-05-25 Janis Johnson <janis187@us.ibm.com>
+
+ * gcc.dg/tree-prof: New directory.
+ * gcc.dg/tree-prof/tree-prof.exp: New.
+
+2005-05-25 DJ Delorie <dj@redhat.com>
+
+ * gcc.dg/Wattributes-1.c: New.
+ * gcc.dg/Wattributes-2.c: New.
+ * gcc.dg/Wattributes-3.c: New.
+
+20005-05-24 Janis Johnson <janis187@us.ibm.com>
+
+ PR tree-optimization/19833
+ * gcc.dg/uninit-4.c: Remove xfail.
+ * gcc.dg/uninit-9.c: Ditto.
+
+2005-05-24 Ziemowit Laski <zlaski@apple.com>
+
+ * obj-c++.dg/bitfield-[1-5].mm: New.
+ * obj-c++.dg/class-protocol-1.mm: New.
+ * obj-c++.dg/comp-types-1[0-1].mm: New.
+ * obj-c++.dg/comp-types-[2-9].mm: New.
+ * obj-c++.dg/encode-[4-8].mm: New.
+ * obj-c++.dg/layout-1.mm: New.
+ * obj-c++.dg/method-1[0-9].mm: New.
+ * obj-c++.dg/method-2[0-1].mm: New.
+ * obj-c++.dg/method-[8-9].mm: New.
+ * obj-c++.dg/objc-gc-3.mm: New.
+ * obj-c++.dg/try-catch-10.mm: New.
+ * objc.dg/bitfield-5.m: New.
+ * objc.dg/comp-types-10.m: New.
+ * objc.dg/comp-types-9.m: New.
+ * objc.dg/layout-1.m: New.
+ * objc.dg/objc-gc-4.m: New.
+ * objc.dg/try-catch-9.m: New.
+ * objc.dg/class-protocol-1.m: Tweak diagnostics.
+ * objc.dg/comp-types-1.m: Likewise.
+ * objc.dg/comp-types-[5-6].m: Likewise.
+ * objc.dg/method-9.m: Likewise.
+
+2005-05-24 Janis Johnson <janis187@us.ibm.com>
+
+ * gcc.dg/altivec-vec-merge.c: Make test usable on GNU/Linux targets
+ and on hardware without VMX support.
+
+ * gcc.dg/altivec-vec-merge.c: Renamed from ppc-vec-merge.c.
+
+ * gcc.dg/ppc64-abi-2.c: Remove code that is now invalid.
+
+ * lib/profopt.exp (dg-final-generate, dg-final-use,
+ profopt-final-code, profopt-get-options): New.
+ (profopt-execute): Process test directives.
+
+ * lib/gcc-dg.exp (cleanup-ipa-dump): New.
+ (cleanup-coverage-files, cleanup-repo-files, cleanup-rtl-dump,
+ cleanup-tree-dump, cleanup-saved-temps): Update comments.
+
+2005-05-24 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR C++/21645
+ * g++.dg/init/ctor5.C: New test.
+
+2005-05-24 Ira Rosen <irar@il.ibm.com>
+
+ * gcc.dg/vect/vect-none.c: Split into vect-106.c, vect-107.c,
+ vect-108.c, vect-109.c, vect-110.c, vect-111.c, vect-112.c,
+ vect-113.c, vect-114.c.
+
+2005-05-23 Adam Nemet <anemet@lnxw.com>
+
+ * gcc.dg/const-elim-1.c: Remove xfails.
+
+2005-05-23 Jeff Law <law@redhat.com>
+
+ * gcc.c-torture/compile/pr21638.c: New test.
+ * gcc.c-torture/compile/20050520-1.c: New test.
+
+2005-05-23 Nick Clifton <nickc@redhat.com>
+
+ * gcc.c-torture/execute/20020720-1.x: Fix m32r target selector to
+ be a proper triple, ie: m32r*-*-*.
+ * g++.old-deja/g++.jason/thunk3.C: Likewise.
+
+2004-05-21 Andrew Pinski <pinskia@physics.uc.edu>
+
+ PR middle-end/21331
+ PR tree-opt/21293
+ * gcc.c-torture/compile/pr21293.c: New test.
+ * gcc.c-torture/execute/pr21331.c: New test.
+
+2004-05-20 Richard Henderson <rth@redhat.com>
+
+ * g++.dg/other/stdarg3.C: Spell "hpux*" correctly.
+
+2005-05-20 Ziemowit Laski <zlaski@apple.com>
+
+ * obj-c++-dg.exp: Add.
+ * obj-c++.exp: Add.
+ * obj-c++.dg/dg.exp: Add.
+
+2005-05-20 Kazuhiro Inaoka <inaoka.kazuhiro@renesas.com>
+
+ * g++.old-deja/g++.jason/thunk3.C: XFAIL on m32r*-*.
+ * gcc.c-torture/execute/20020720-1.x: Add xfail for m32r*-*.
+
+2005-05-20 Bjoern Haase <bjoern.m.haase@web.de>
+
+ * gcc.c-torture/execute/20020720-1.x: Add xfail for avr-*-*.
+
+2004-05-19 Richard Henderson <rth@redhat.com>
+
+ * g++.dg/other/stdarg3.C: Only use -mlp64 for hpux.
+
2005-05-19 Janis Johnson <janis187@us.ibm.com>
* gcc.dg/altivec-21.c: Use dg-error only for ilp32.
@@ -24,7 +933,7 @@
2005-05-18 Devang Patel <dpatel@apple.com>
* g++.dg/opt/20050511-1.C: New test.
-
+
2005-05-18 Thomas Koenig <Thomas.Koenig@online.de>
PR libfortran/21127
@@ -53,7 +962,7 @@
2005-05-17 Mark Mitchell <mark@codesourcery.com>
* gcc.dg/compat/struct-layout-1_generate.c (iterative_hash):
- Remove little-endian optimizations.
+ Remove little-endian optimizations.
2005-05-17 Jeff Law <law@redhat.com>
@@ -110,7 +1019,7 @@
* gcc.dg/compat/struct-layout-1.exp: Do not link with libiberty.
* gcc.dg/compat/struct-layout-1_generate.c (config.h): Do not include.
(limits.h): Include unconditionally.
- (stdlib.h): Likewise.
+ (stdlib.h): Likewise.
(hashtab.h): Do not include.
(getopt.h): Likewise.
(stddef.h): Include.
@@ -126,7 +1035,7 @@
(e_insert): Likewise.
(output): Use, instead of libiberty hashtable functions.
(main): Do not use getopt. Do not call htab_create.
-
+
2005-05-16 David Billinghurst <David.Billinghurst@riotinto.com>
PR libstdc++/21526
@@ -309,7 +1218,7 @@
2005-05-05 Mark Mitchell <mark@codesourcery.com>
PR c++/21352
- * g++.dg/template/crash37.C: New test.
+ * g++.dg/template/crash37.C: New test.
2005-05-05 Paul Brook <paul@codesourcery.com>
@@ -441,7 +1350,7 @@
PR tree-optimization/21272
* gcc.dg/vect/vect-ifcvt-10.c: New test.
-
+
2005-04-29 Jakub Jelinek <jakub@redhat.com>
PR fortran/13082
@@ -574,7 +1483,7 @@
2005-04-25 Devang Patel <dpatel@apple.com>
* gcc.dg/stabs-attrib-vect-darwin.c: New test.
-
+
2005-04-25 Andrew Pinski <pinskia@physics.uc.edu>
PR testsuite/21062
@@ -674,7 +1583,7 @@
PR optimization/20994
* gcc.dg/tree-ssa/ifc-3.c: New test.
-
+
2005-04-20 Joseph S. Myers <joseph@codesourcery.com>
PR c/12913
@@ -684,7 +1593,7 @@
2005-04-19 Richard Henderson <rth@redhat.com>
- * lib/target-supports.exp (check_effective_target_vect_int_mult):
+ * lib/target-supports.exp (check_effective_target_vect_int_mult):
Fix typo in exists check.
(check_effective_target_sync_int_long): New.
* gcc.dg/ia64-sync-1.c: Enable for all effective-target sync_int_long.
@@ -751,7 +1660,7 @@
2005-04-18 Laurent GUERBY <laurent@guerby.net>
* ada/acats/run_all.sh: Use sync when executable not present.
-
+
2005-04-18 Devang Patel <dpatel@apple.com>
* gcc.dg/vect/vect-11.c: Require effective target vect_int_mult.
@@ -824,7 +1733,7 @@
* typeck.c (cxx_sizeof_or_alignof_type): Check whether the type to
which sizeof/alignof is dependent, rather than just whether we are
processing_template_decl.
-
+
2005-04-15 Thomas Koenig <Thomas.Koenig@online.de>
* gfortran.fortran-torture/execute/intrinsic_spread.f90:
@@ -849,7 +1758,7 @@
* gcc.dg/builtins-53.c: Include builtins-config.h.
Check floorf, ceilf, floorl and ceill transformations
only when HAVE_C99_RUNTIME is defined.
-
+
2005-04-15 Alexandre Oliva <aoliva@redhat.com>
PR middle-end/20739
@@ -997,12 +1906,12 @@
* gcc.dg/vect/vect-ifcvt-6.c: New test.
* gcc.dg/vect/vect-ifcvt-7.c: New test.
* gcc.dg/vect/vect-none.c: Now one loop is vectorized.
-
+
2004-04-11 Devang Patel <dpatel@apple.com>
* gcc.dg/vect/vect-dv-1.c: New test.
* gcc.dg/vect/vect-dv-2.c: New test.
-
+
2005-04-11 Diego Novillo <dnovillo@redhat.com>
PR tree-optimization/20933
@@ -1025,7 +1934,7 @@
* gcc.dg/builtins-53.c: Also check (int)ceil* and
(long long int)ceil*.
-
+
2005-04-10 Mark Mitchell <mark@codesourcery.com>
* g++.dg/warn/Wdtor1.C: Declare template in system header with
@@ -1194,7 +2103,7 @@
2005-04-06 Dorit Naishlos <dorit@il.ibm.com>
- * gfortran.dg/vect/vect-5.f90: xfail for lp64.
+ * gfortran.dg/vect/vect-5.f90: xfail for lp64.
2005-04-05 Mark Mitchell <mark@codesourcery.com>
@@ -1241,7 +2150,7 @@
* lib/target-supports.exp (check_effective_target_vect_shif): New.
* gcc.dg/vect/vect-shift-1.c: New test.
-
+
2005-04-05 Francois-Xavier Coudert <coudert@clipper.ens.fr>
PR libfortran/20755
@@ -1713,7 +2622,7 @@
(g++_init): Make sure that CXXFLAGS is set.
* lib/gcc-defs.exp (gcc-set-multilib-library-path): New function.
* lib/gcc-dg.exp: Use gcc-set-multilib-library-path.
- * lib/gfortran.exp (gfortran_link_flags): Likewise.
+ * lib/gfortran.exp (gfortran_link_flags): Likewise.
* lib/objc.exp (objc_init): Likewise.
* lib/treelang.exp (treelang_init): Likewise.
@@ -1797,7 +2706,7 @@
* gfortran.dg/pr18025.f90: New test.
2005-03-23 Dale Johannesen <dalej@apple.com>
-
+
* gcc.dg/20020312-2.c: Fix for non-PowerPC Darwin.
2005-03-23 Mark Mitchell <mark@codesourcery.com>
@@ -1866,7 +2775,7 @@
2005-03-21 Stuart Hastings <stuart@apple.com>
* gcc.target/i386/sse-2.c: New.
-
+
2005-03-21 Uros Bizjak <uros@kss-loka.si>
* gcc.dg/builtins-46.c: Also check lrint* and llrint*.
@@ -1885,7 +2794,7 @@
2005-03-21 Paolo Carlini <pcarlini@suse.de>
- PR c++/20147
+ PR c++/20147
* g++.dg/ext/stmtexpr4.C: New test.
2005-03-20 Roger Sayle <roger@eyesopen.com>
@@ -2209,7 +3118,7 @@
PR c++/20142
* g++.dg/init/array18.C: Add dg-do run marker.
-
+
PR c++/20142
* g++.dg/init/array18.C: New test.
@@ -2309,13 +3218,13 @@
* objc.dg/stabs-1.m: hppa*64*-*-* doesn't have stabs.
-2005-03-05 Steven G. Kargl <kargls@comcast.net>
+2005-03-05 Steven G. Kargl <kargls@comcast.net>
* gfortran.dg/pr19936_1.f90: New test.
* gfortran.dg/pr19936_2.f90: New test.
* gfortran.dg/pr19936_3.f90: New test.
-2005-03-05 Steven G. Kargl <kargls@comcast.net>
+2005-03-05 Steven G. Kargl <kargls@comcast.net>
Paul Thomas <prthomas@drfccad.cea.fr>
* gfortran.dg/PR19754_1.f90: New test.
@@ -2524,7 +3433,7 @@
* g++.dg/parse/error27.C: New test.
* g++.dg/template/qualttp15.C: Adjust error markers.
* g++.old-deja/g++.other/struct1.C: Likewise.
-
+
PR c++/20153
* g++.dg/template/error17.C: New test.
@@ -2554,7 +3463,7 @@
PR 19952
* g++.dg/tree-ssa/pr19952.C: New test.
-
+
2005-02-22 Mark Mitchell <mark@codesourcery.com>
PR c++/19883
@@ -28860,7 +29769,7 @@ Thu Apr 27 15:58:18 MET DST 2000 Jan Hubicka <jh@suse.cz>
* gcc.c-torture/compile/labels-2.c: New test.
-1999-12-27 Martin von L�is <loewis@informatik.hu-berlin.de>
+1999-12-27 Martin von L�is <loewis@informatik.hu-berlin.de>
* gcc.c-torture/execute/991227-1.c: New test.
@@ -28868,7 +29777,7 @@ Thu Apr 27 15:58:18 MET DST 2000 Jan Hubicka <jh@suse.cz>
* g++.old-deja/g++.pt/instantiate6.C: Remove excess errors XFAIL.
-1999-12-21 Martin von L�is <loewis@informatik.hu-berlin.de>
+1999-12-21 Martin von L�is <loewis@informatik.hu-berlin.de>
* gcc.c-torture/execute/991221-1.c: New test.
diff --git a/gcc/testsuite/ada/acats/tests/c3/c352001.a b/gcc/testsuite/ada/acats/tests/c3/c352001.a
deleted file mode 100644
index 04b094f1ff3..00000000000
--- a/gcc/testsuite/ada/acats/tests/c3/c352001.a
+++ /dev/null
@@ -1,270 +0,0 @@
---
--- C352001.A
---
--- Grant of Unlimited Rights
---
--- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687,
--- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained
--- unlimited rights in the software and documentation contained herein.
--- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making
--- this public release, the Government intends to confer upon all
--- recipients unlimited rights equal to those held by the Government.
--- These rights include rights to use, duplicate, release or disclose the
--- released technical data and computer software in whole or in part, in
--- any manner and for any purpose whatsoever, and to have or permit others
--- to do so.
---
--- DISCLAIMER
---
--- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
--- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
--- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
--- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
--- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
--- PARTICULAR PURPOSE OF SAID MATERIAL.
---*
---
--- OBJECTIVE:
--- Check that the predefined Character type comprises 256 positions.
--- Check that the names of the non-graphic characters are usable with
--- the attributes (Wide_)Image and (Wide_)Value, and that these
--- attributes produce the correct result.
---
--- TEST DESCRIPTION:
--- Build two tables of nongraphic characters from positions of Row 00
--- (0000-001F and 007F-009F) of the ISO 10646 Basic Multilingual Plane.
--- Fill the first table with compiler created strings. Fill the second
--- table with strings defined by the language. Compare the two tables.
--- Check 256 positions of the predefined character type. Use attributes
--- (Wide_)Image and (Wide_)Value to check the values of the non-graphic
--- characters and the last 2 characters.
---
---
--- CHANGE HISTORY:
--- 20 Jun 95 SAIC Initial prerelease version.
--- 27 Jan 96 SAIC Revised for 2.1. Hid values, added "del" case.
---
---!
-
-with Ada.Characters.Handling;
-with Report;
-procedure C352001 is
-
- Lower_Bound : Integer := 0;
- Middle_Bound : Integer := 31;
- Upper_Bound : Integer := 159;
- Half_Bound : Integer := 127;
- Max_Bound : Integer := 255;
-
- type Dyn_String is access String;
- type Value_Result is array (Character) of Dyn_String;
-
- Table_Of_Character : Value_Result;
- TC_Table : Value_Result;
-
- function CVII(K : Natural) return Character is
- begin
- return Character'Val( Report.Ident_Int(K) );
- end CVII;
-
- function "=" (L, R : String) return Boolean is
- UCL : String (L'First .. L'Last);
- UCR : String (R'First .. R'last);
- begin
- UCL := Ada.Characters.Handling.To_Upper (L);
- UCR := Ada.Characters.Handling.To_Upper (R);
- if UCL'Last /= UCR'Last then
- return False;
- else
- for I in UCL'First .. UCR'Last loop
- if UCL (I) /= UCR (I) then
- return False;
- end if;
- end loop;
- return True;
- end if;
- end "=";
-
-begin
-
- Report.Test ("C352001", "Check that, the predefined Character type " &
- "comprises 256 positions. Check that the names of the " &
- "non-graphic characters are usable with the attributes " &
- "(Wide_)Image and (Wide_)Value, and that these attributes " &
- "produce the correct result");
-
- -- Fill table with strings (positions of Row 00 (0000-001F) of the ISO
- -- 10646 Basic Multilingual Plane created by the compiler.
-
- for I in CVII(Lower_Bound) .. CVII(Middle_Bound) loop
- Table_Of_Character (I) := new String'(Character'Image(I));
- end loop;
-
- -- Fill table with strings (positions of Row 00 (007F-009F) of the ISO
- -- 10646 Basic Multilingual Plane created by the compiler.
-
- for I in CVII(Half_Bound) .. CVII(Upper_Bound) loop
- Table_Of_Character (I) := new String'(Character'Image(I));
- end loop;
-
- -- Fill table with strings (positions of Row 00 (0000-001F) of the ISO
- -- 10646 Basic Multilingual Plane defined by the language.
-
- TC_Table (CVII(0)) := new String'("nul");
- TC_Table (CVII(1)) := new String'("soh");
- TC_Table (CVII(2)) := new String'("stx");
- TC_Table (CVII(3)) := new String'("etx");
- TC_Table (CVII(4)) := new String'("eot");
- TC_Table (CVII(5)) := new String'("enq");
- TC_Table (CVII(6)) := new String'("ack");
- TC_Table (CVII(7)) := new String'("bel");
- TC_Table (CVII(8)) := new String'("bs");
- TC_Table (CVII(9)) := new String'("ht");
- TC_Table (CVII(10)) := new String'("lf");
- TC_Table (CVII(11)) := new String'("vt");
- TC_Table (CVII(12)) := new String'("ff");
- TC_Table (CVII(13)) := new String'("cr");
- TC_Table (CVII(14)) := new String'("so");
- TC_Table (CVII(15)) := new String'("si");
- TC_Table (CVII(16)) := new String'("dle");
- TC_Table (CVII(17)) := new String'("dc1");
- TC_Table (CVII(18)) := new String'("dc2");
- TC_Table (CVII(19)) := new String'("dc3");
- TC_Table (CVII(20)) := new String'("dc4");
- TC_Table (CVII(21)) := new String'("nak");
- TC_Table (CVII(22)) := new String'("syn");
- TC_Table (CVII(23)) := new String'("etb");
- TC_Table (CVII(24)) := new String'("can");
- TC_Table (CVII(25)) := new String'("em");
- TC_Table (CVII(26)) := new String'("sub");
- TC_Table (CVII(27)) := new String'("esc");
- TC_Table (CVII(28)) := new String'("fs");
- TC_Table (CVII(29)) := new String'("gs");
- TC_Table (CVII(30)) := new String'("rs");
- TC_Table (CVII(31)) := new String'("us");
- TC_Table (CVII(127)) := new String'("del");
-
- -- Fill table with strings (positions of Row 00 (007F-009F) of the ISO
- -- 10646 Basic Multilingual Plane defined by the language.
-
- TC_Table (CVII(128)) := new String'("reserved_128");
- TC_Table (CVII(129)) := new String'("reserved_129");
- TC_Table (CVII(130)) := new String'("bph");
- TC_Table (CVII(131)) := new String'("nbh");
- TC_Table (CVII(132)) := new String'("reserved_132");
- TC_Table (CVII(133)) := new String'("nel");
- TC_Table (CVII(134)) := new String'("ssa");
- TC_Table (CVII(135)) := new String'("esa");
- TC_Table (CVII(136)) := new String'("hts");
- TC_Table (CVII(137)) := new String'("htj");
- TC_Table (CVII(138)) := new String'("vts");
- TC_Table (CVII(139)) := new String'("pld");
- TC_Table (CVII(140)) := new String'("plu");
- TC_Table (CVII(141)) := new String'("ri");
- TC_Table (CVII(142)) := new String'("ss2");
- TC_Table (CVII(143)) := new String'("ss3");
- TC_Table (CVII(144)) := new String'("dcs");
- TC_Table (CVII(145)) := new String'("pu1");
- TC_Table (CVII(146)) := new String'("pu2");
- TC_Table (CVII(147)) := new String'("sts");
- TC_Table (CVII(148)) := new String'("cch");
- TC_Table (CVII(149)) := new String'("mw");
- TC_Table (CVII(150)) := new String'("spa");
- TC_Table (CVII(151)) := new String'("epa");
- TC_Table (CVII(152)) := new String'("sos");
- TC_Table (CVII(153)) := new String'("reserved_153");
- TC_Table (CVII(154)) := new String'("sci");
- TC_Table (CVII(155)) := new String'("csi");
- TC_Table (CVII(156)) := new String'("st");
- TC_Table (CVII(157)) := new String'("osc");
- TC_Table (CVII(158)) := new String'("pm");
- TC_Table (CVII(159)) := new String'("apc");
-
-
- -- Compare the first half of two tables.
- for I in CVII(Lower_Bound) .. CVII(Middle_Bound) loop
- if TC_Table(I).all /= Table_Of_Character(I).all then
- Report.Failed("Value of character#" & Integer'Image(Character'Pos(I)) &
- " is not the same in the first half of the table");
- end if;
- end loop;
-
-
- -- Compare the second half of two tables.
- for I in CVII(Half_Bound) .. CVII(Upper_Bound) loop
- if TC_Table(I).all /= Table_Of_Character(I).all then
- Report.Failed("Value of character#" & Integer'Image(Character'Pos(I)) &
- " is not the same in the second half of the table");
- end if;
- end loop;
-
-
- -- Check the first character.
- if Character'Image( Character'First ) /= "NUL" then
- Report.Failed("Value of character#" &
- Integer'Image(Character'Pos (Character'First)) &
- " is not NUL");
- end if;
-
-
- -- Check that the names of the non-graphic characters are usable with
- -- Image and Value attributes.
- if Character'Value( Character'Image( CVII(153) )) /=
- CVII( 153 ) then
- Report.Failed ("Value of character#" &
- Integer'Image( Character'Pos(CVII(153)) ) &
- " is not reserved_153");
- end if;
-
-
- for I in CVII(Lower_Bound) .. CVII(Max_Bound) loop
- if Character'Value(
- Report.Ident_Str(
- Character'Image(CVII(Character'Pos(I)))))
- /= CVII( Character'Pos(I)) then
- Report.Failed ("Value of character#" &
- Integer'Image( Character'Pos(I) ) &
- " is not the same as the predefined character type");
- end if;
- end loop;
-
-
- -- Check Wide_Character attributes.
- for I in Wide_Character'Val(Lower_Bound) .. Wide_Character'Val(Max_Bound)
- loop
- if Wide_Character'Wide_Value(
- Report.Ident_Wide_Str(
- Wide_Character'Wide_Image(
- Wide_Character'Val(Wide_Character'Pos(I)))))
- /= Wide_Character'Val(Wide_Character'Pos(I))
- then
- Report.Failed ("Value of the predefined Wide_Character type " &
- "is not correct");
- end if;
- end loop;
-
-
- if Wide_Character'Value( Wide_Character'Image(Wide_Character'Val(132)) )
- /= Wide_Character'Val( Report.Ident_Int(132) ) then
- Report.Failed ("Wide_Character at 132 is not reserved_132");
- end if;
-
-
- if Wide_Character'Image( Wide_Character'First ) /= "NUL" then
- Report.Failed ("Wide_Character'First is not NUL");
- end if;
-
-
- if Wide_Character'Image
- (Wide_Character'Pred (Wide_Character'Last) ) /= "FFFE" then
- Report.Failed ("Wide_Character at 65534 is not FFFE");
- end if;
-
-
- if Wide_Character'Image(Wide_Character'Last) /= "FFFF" then
- Report.Failed ("Wide_Character'Last is not FFFF");
- end if;
-
- Report.Result;
-
-end C352001;
diff --git a/gcc/testsuite/g++.dg/abi/bitfield3.C b/gcc/testsuite/g++.dg/abi/bitfield3.C
index 864abc33b8d..b96c9ed8d93 100644
--- a/gcc/testsuite/g++.dg/abi/bitfield3.C
+++ b/gcc/testsuite/g++.dg/abi/bitfield3.C
@@ -1,10 +1,10 @@
// Test for oversized bitfield alignment in structs on IA-32
-// { dg-do run { target i?86-*-* } }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
// { dg-options "-O2" }
// Cygwin and mingw32 default to MASK_ALIGN_DOUBLE. Override to ensure
// 4-byte alignment.
// { dg-options "-mno-align-double" { target i?86-*-cygwin* i?86-*-mingw* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-require-effective-target ilp32 }
struct A
{
diff --git a/gcc/testsuite/g++.dg/abi/bitfield8.C b/gcc/testsuite/g++.dg/abi/bitfield8.C
index 6130ae45739..58e74be08fb 100644
--- a/gcc/testsuite/g++.dg/abi/bitfield8.C
+++ b/gcc/testsuite/g++.dg/abi/bitfield8.C
@@ -1,6 +1,7 @@
-// { dg-do run { target i?86-*-* } }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
// { dg-options "-fabi-version=0" }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-require-effective-target ilp32 }
+
struct A {
virtual void f() {}
diff --git a/gcc/testsuite/g++.dg/abi/bitfield9.C b/gcc/testsuite/g++.dg/abi/bitfield9.C
index 0d744c7318f..0d3a8bf8985 100644
--- a/gcc/testsuite/g++.dg/abi/bitfield9.C
+++ b/gcc/testsuite/g++.dg/abi/bitfield9.C
@@ -1,4 +1,5 @@
-// { dg-do run { target i?86-*-* } }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// { dg-options -w }
struct X {
diff --git a/gcc/testsuite/g++.dg/abi/dtor1.C b/gcc/testsuite/g++.dg/abi/dtor1.C
index 9ec44ae7520..f9425e013df 100644
--- a/gcc/testsuite/g++.dg/abi/dtor1.C
+++ b/gcc/testsuite/g++.dg/abi/dtor1.C
@@ -1,5 +1,5 @@
-// { dg-do compile { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// { dg-options "-fabi-version=0" }
struct A {
diff --git a/gcc/testsuite/g++.dg/abi/empty10.C b/gcc/testsuite/g++.dg/abi/empty10.C
index 9147e9692f5..ae992944dee 100644
--- a/gcc/testsuite/g++.dg/abi/empty10.C
+++ b/gcc/testsuite/g++.dg/abi/empty10.C
@@ -1,5 +1,5 @@
-// { dg-do run { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// { dg-options "-fabi-version=0 -w" }
struct E {};
diff --git a/gcc/testsuite/g++.dg/abi/empty7.C b/gcc/testsuite/g++.dg/abi/empty7.C
index 5ff75e65d97..0a665a84531 100644
--- a/gcc/testsuite/g++.dg/abi/empty7.C
+++ b/gcc/testsuite/g++.dg/abi/empty7.C
@@ -1,5 +1,5 @@
-// { dg-do run { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// { dg-options "-fabi-version=0" }
struct S1 {};
diff --git a/gcc/testsuite/g++.dg/abi/empty9.C b/gcc/testsuite/g++.dg/abi/empty9.C
index 3c4b71f100f..06e616adb30 100644
--- a/gcc/testsuite/g++.dg/abi/empty9.C
+++ b/gcc/testsuite/g++.dg/abi/empty9.C
@@ -1,5 +1,5 @@
-// { dg-do run { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// { dg-options "-w -fabi-version=0" }
struct E1 {};
diff --git a/gcc/testsuite/g++.dg/abi/layout3.C b/gcc/testsuite/g++.dg/abi/layout3.C
index 121310862db..a30a85219fd 100644
--- a/gcc/testsuite/g++.dg/abi/layout3.C
+++ b/gcc/testsuite/g++.dg/abi/layout3.C
@@ -1,5 +1,5 @@
-// { dg-do run { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// { dg-options "-fabi-version=0 -w" }
struct S {
diff --git a/gcc/testsuite/g++.dg/abi/layout4.C b/gcc/testsuite/g++.dg/abi/layout4.C
index 13d3648d6f5..da3c2f5d8c7 100644
--- a/gcc/testsuite/g++.dg/abi/layout4.C
+++ b/gcc/testsuite/g++.dg/abi/layout4.C
@@ -1,5 +1,5 @@
-// { dg-do run { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// { dg-options "-fabi-version=1" }
struct C4
diff --git a/gcc/testsuite/g++.dg/abi/thunk1.C b/gcc/testsuite/g++.dg/abi/thunk1.C
index 5508882359f..343a2aa6e27 100644
--- a/gcc/testsuite/g++.dg/abi/thunk1.C
+++ b/gcc/testsuite/g++.dg/abi/thunk1.C
@@ -1,5 +1,6 @@
-// { dg-do compile { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
+
struct A {
virtual void f ();
diff --git a/gcc/testsuite/g++.dg/abi/thunk2.C b/gcc/testsuite/g++.dg/abi/thunk2.C
index c1f88682df9..e6b2924cfdb 100644
--- a/gcc/testsuite/g++.dg/abi/thunk2.C
+++ b/gcc/testsuite/g++.dg/abi/thunk2.C
@@ -1,5 +1,5 @@
-// { dg-do compile { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// { dg-options -w }
struct A {
diff --git a/gcc/testsuite/g++.dg/abi/vbase11.C b/gcc/testsuite/g++.dg/abi/vbase11.C
index 1dcc75647ca..8c854b9c13e 100644
--- a/gcc/testsuite/g++.dg/abi/vbase11.C
+++ b/gcc/testsuite/g++.dg/abi/vbase11.C
@@ -1,5 +1,5 @@
-// { dg-do run { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// { dg-options "-fabi-version=0" }
struct A { virtual void f(); char c1; };
diff --git a/gcc/testsuite/g++.dg/abi/vthunk2.C b/gcc/testsuite/g++.dg/abi/vthunk2.C
index 698c691cc0a..9b6f14c50e2 100644
--- a/gcc/testsuite/g++.dg/abi/vthunk2.C
+++ b/gcc/testsuite/g++.dg/abi/vthunk2.C
@@ -1,5 +1,5 @@
-// { dg-do compile { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do compile { target i?86-*-* x86_64-*-*} }
+// { dg-require-effective-target ilp32 }
struct c0 {
virtual void f ();
diff --git a/gcc/testsuite/g++.dg/abi/vthunk3.C b/gcc/testsuite/g++.dg/abi/vthunk3.C
index 969cd2da84c..59fbbdc4be3 100644
--- a/gcc/testsuite/g++.dg/abi/vthunk3.C
+++ b/gcc/testsuite/g++.dg/abi/vthunk3.C
@@ -1,5 +1,5 @@
-// { dg-do compile { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// { dg-options "-fabi-version=0" }
struct A {
diff --git a/gcc/testsuite/g++.dg/charset/asm2.c b/gcc/testsuite/g++.dg/charset/asm2.c
index 8ae2212fd26..7fb1959d260 100644
--- a/gcc/testsuite/g++.dg/charset/asm2.c
+++ b/gcc/testsuite/g++.dg/charset/asm2.c
@@ -1,6 +1,6 @@
/* Test for complex asm statements. Make sure it compiles
then test for some of the asm statements not being translated. */
-/* { dg-do compile { target i?86-*-* } }
+/* { dg-do compile { target i?86-*-* x86_64-*-* } }
{ dg-require-iconv "IBM1047" }
{ dg-final { scan-assembler "std" } }
{ dg-final { scan-assembler "cld" } }
diff --git a/gcc/testsuite/g++.dg/conversion/simd2.C b/gcc/testsuite/g++.dg/conversion/simd2.C
new file mode 100644
index 00000000000..a67df561ebd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/conversion/simd2.C
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+/* Test generic operations on vectors. */
+
+int __attribute__((vector_size(16))) a, b, c;
+int __attribute__((vector_size(8))) d;
+void foo()
+{
+ a = b ^ c;
+ a = b + c;
+ a = b - c;
+ a = b * c;
+ a = b / c;
+ a = -b;
+ a = d + b; /* { dg-error "can't convert between vector" } */
+}
diff --git a/gcc/testsuite/g++.dg/conversion/simd3.C b/gcc/testsuite/g++.dg/conversion/simd3.C
new file mode 100644
index 00000000000..f7b28d45229
--- /dev/null
+++ b/gcc/testsuite/g++.dg/conversion/simd3.C
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+typedef int myint;
+
+float __attribute__((vector_size(16))) b;
+int __attribute__((vector_size(16))) d;
+myint __attribute__((vector_size(16))) d2;
+unsigned int __attribute__((vector_size(16))) e;
+
+void foo()
+{
+ b + d; /* { dg-error "invalid operands to binary" } */
+ d += e;
+ d2 += d;
+}
diff --git a/gcc/testsuite/g++.dg/eh/simd-1.C b/gcc/testsuite/g++.dg/eh/simd-1.C
index fe71b78043f..e7c30dbf3bd 100644
--- a/gcc/testsuite/g++.dg/eh/simd-1.C
+++ b/gcc/testsuite/g++.dg/eh/simd-1.C
@@ -2,6 +2,7 @@
// Contributed by Aldy Hernandez (aldy@quesejoda.com).
// { dg-options "-O" }
// { dg-options "-O -w" { target i?86-*-* } }
+// { dg-options "-O -w" { target { x86_64-*-* && ilp32 } } }
// { dg-do run }
typedef int __attribute__((vector_size (8))) vecint;
diff --git a/gcc/testsuite/g++.dg/eh/simd-2.C b/gcc/testsuite/g++.dg/eh/simd-2.C
index 9d9dce509bd..c012670190c 100644
--- a/gcc/testsuite/g++.dg/eh/simd-2.C
+++ b/gcc/testsuite/g++.dg/eh/simd-2.C
@@ -2,6 +2,7 @@
// Contributed by Aldy Hernandez (aldy@quesejoda.com).
// { dg-options "-O" }
// { dg-options "-O -w" { target i?86-*-* } }
+// { dg-options "-O -w" { target { x86_64-*-* && ilp32 } } }
// { dg-options "-O -w -maltivec" { target powerpc*-*-linux* } }
// { dg-do run }
diff --git a/gcc/testsuite/g++.dg/expr/ptrmem6.C b/gcc/testsuite/g++.dg/expr/ptrmem6.C
new file mode 100644
index 00000000000..0c75385fbd0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/expr/ptrmem6.C
@@ -0,0 +1,12 @@
+// PR C++/21614
+// { dg-additional-sources "ptrmem6a.C" }
+// { dg-do run }
+
+extern struct Z *p;
+extern int (Z::*m) ();
+
+int main () {
+ if ((p->*m)() == 7)
+ return 0;
+ return 1;
+}
diff --git a/gcc/testsuite/g++.dg/expr/ptrmem6a.C b/gcc/testsuite/g++.dg/expr/ptrmem6a.C
new file mode 100644
index 00000000000..8dad81c5889
--- /dev/null
+++ b/gcc/testsuite/g++.dg/expr/ptrmem6a.C
@@ -0,0 +1,9 @@
+struct Z {
+ int f();
+};
+
+int Z::f() { return 7; }
+
+struct Z z;
+int (Z::*m)() = &Z::f;
+struct Z*p = &z;
diff --git a/gcc/testsuite/g++.dg/expr/static_cast6.C b/gcc/testsuite/g++.dg/expr/static_cast6.C
new file mode 100644
index 00000000000..90f32f1d793
--- /dev/null
+++ b/gcc/testsuite/g++.dg/expr/static_cast6.C
@@ -0,0 +1,15 @@
+// PR c++/21853
+
+struct blah {
+ int a;
+};
+
+int main( int argc, char ** argv ) {
+ int blah::* ptdma = &blah::a;
+
+ const void *ptdmv = static_cast< void * >( &ptdma );
+
+ int blah::* const ptdmb = * static_cast< int blah::* const * >( ptdmv );
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/ext/attrib8.C b/gcc/testsuite/g++.dg/ext/attrib8.C
index df2d48fecf4..7d99132c175 100644
--- a/gcc/testsuite/g++.dg/ext/attrib8.C
+++ b/gcc/testsuite/g++.dg/ext/attrib8.C
@@ -1,6 +1,6 @@
// PR 8656
-// { dg-do compile { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
extern int * (__attribute__((stdcall)) *fooPtr)( void);
int * __attribute__((stdcall)) myFn01( void) { return 0; }
diff --git a/gcc/testsuite/g++.dg/ext/builtin9.C b/gcc/testsuite/g++.dg/ext/builtin9.C
new file mode 100644
index 00000000000..6b2b712deab
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/builtin9.C
@@ -0,0 +1,3 @@
+// PR c++/21619
+// { dg-options "" }
+int f[__builtin_constant_p(&"Hello"[0])?1:-1];
diff --git a/gcc/testsuite/g++.dg/ext/label4.C b/gcc/testsuite/g++.dg/ext/label4.C
new file mode 100644
index 00000000000..80b50a79981
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/label4.C
@@ -0,0 +1,6 @@
+// PR c++/20563: ICE (--enable-checking), infinite loop (--disable-checking)
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// { dg-do compile }
+
+__label__ *l; // { dg-error "before" }
diff --git a/gcc/testsuite/g++.dg/inherit/ptrmem3.C b/gcc/testsuite/g++.dg/inherit/ptrmem3.C
new file mode 100644
index 00000000000..0c06c65df20
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/ptrmem3.C
@@ -0,0 +1,17 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 27 May 2005 <nathan@codesourcery.com>
+
+// Origin:Andrew Pinski pinskia@gcc.gnu.org
+// PR 21455 bogus error with pointer to member of incomplete
+
+class XMLFile;
+
+typedef bool (XMLFile::*ParserFunctionPtr)();
+
+struct ParserElement
+{
+ ParserFunctionPtr getPreFunc() const { return preFunc; }
+ ParserFunctionPtr getPostFunc() const { return postFunc; }
+ ParserFunctionPtr preFunc;
+ ParserFunctionPtr postFunc;
+};
diff --git a/gcc/testsuite/g++.dg/inherit/using4.C b/gcc/testsuite/g++.dg/inherit/using4.C
new file mode 100644
index 00000000000..a0b38737e1e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/using4.C
@@ -0,0 +1,14 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 6 Jun 2005 <nathan@codesourcery.com>
+
+// PR 20613:uninformative diagnostic
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+
+struct B {
+ void f();
+};
+
+struct D : B {
+ using B::f;
+ using B::f; // { dg-error "repeated" }
+};
diff --git a/gcc/testsuite/g++.dg/inherit/using5.C b/gcc/testsuite/g++.dg/inherit/using5.C
new file mode 100644
index 00000000000..896c2d461de
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/using5.C
@@ -0,0 +1,17 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 8 Jun 2005 <nathan@codesourcery.com>
+
+// PR 19496: Missing error during parsing.
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+
+template<int> struct A
+{
+ A::A; // { dg-error "not a base" }
+};
+
+struct B
+{
+ void f ();
+ using B::f; // { dg-error "not a base" }
+};
+
diff --git a/gcc/testsuite/g++.dg/inherit/using6.C b/gcc/testsuite/g++.dg/inherit/using6.C
new file mode 100644
index 00000000000..46c23ce582e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/using6.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 8 Jun 2005 <nathan@codesourcery.com>
+
+struct A
+{
+ operator int ();
+};
+
+template <typename T> struct TPL : A
+{
+ using A::operator T; // { dg-error "operator float" }
+};
+
+TPL<int> i;
+TPL<float> j; // { dg-error "instantiated" }
diff --git a/gcc/testsuite/g++.dg/init/ctor4.C b/gcc/testsuite/g++.dg/init/ctor4.C
index b217b204000..70643ec4e10 100644
--- a/gcc/testsuite/g++.dg/init/ctor4.C
+++ b/gcc/testsuite/g++.dg/init/ctor4.C
@@ -6,7 +6,7 @@ public:
foo();
};
-class bar: public foo {
+class bar: public foo {// { dg-error "uninitialized" }
private:
int &a;
};
@@ -16,5 +16,5 @@ foo::foo() {
int main(int argc, char **argv)
{
- bar x; // { dg-error "uninitialized" }
+ bar x; // { dg-error "synthesized" }
}
diff --git a/gcc/testsuite/g++.dg/init/ctor5.C b/gcc/testsuite/g++.dg/init/ctor5.C
new file mode 100644
index 00000000000..cc933188201
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/ctor5.C
@@ -0,0 +1,17 @@
+// PR C++/21645
+// We were crashing because we forgot to update the type for
+// the cloned argument for the cloned ctor.
+
+struct color {
+ ~color();
+};
+struct style {
+ color col;
+ style (color);
+};
+
+style::style(color c)
+ : col(c)
+{
+}
+
diff --git a/gcc/testsuite/g++.dg/init/ctor6.C b/gcc/testsuite/g++.dg/init/ctor6.C
new file mode 100644
index 00000000000..a25ecab1fa7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/ctor6.C
@@ -0,0 +1,20 @@
+// PR c++/21340
+
+struct Base{};
+struct Iterator : virtual Base {};
+bool operator==(const Iterator&, const Iterator&);
+struct IteratorI : Iterator {};
+struct Obj
+{
+ bool operator==(const Obj&) const;
+};
+template <int>bool dummy()
+{
+ Obj lhs, rhs;
+ return lhs == rhs;
+}
+int
+main(int argc, char** argv)
+{
+ IteratorI* it2 = new IteratorI();
+}
diff --git a/gcc/testsuite/g++.dg/init/member1.C b/gcc/testsuite/g++.dg/init/member1.C
new file mode 100644
index 00000000000..1c89d5a1d43
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/member1.C
@@ -0,0 +1,18 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 13 Jun 2005 <nathan@codesourcery.com>
+
+// Origin: Ivan Godard <igodard@pacbell.net>
+// Bug 20789: ICE on invalid
+
+template<typename> struct A;
+
+template<int> struct B {};
+
+template<typename T> struct C
+{
+ static const int i = A<T>::i; // { dg-error "incomplete" }
+ static const int j = i; // { dg-error "initialized by a non-const" }
+ B<j> b; // { dg-error "not a valid template arg" }
+};
+
+C<int> c;
diff --git a/gcc/testsuite/g++.dg/lookup/using14.C b/gcc/testsuite/g++.dg/lookup/using14.C
new file mode 100644
index 00000000000..c953bccc21d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/using14.C
@@ -0,0 +1,9 @@
+// PR c++/21784
+// { dg-options "" }
+
+namespace mine
+{
+ int cpow;
+}
+
+using mine::cpow;
diff --git a/gcc/testsuite/g++.dg/opt/complex1.C b/gcc/testsuite/g++.dg/opt/complex1.C
new file mode 100644
index 00000000000..0066c26c83b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/complex1.C
@@ -0,0 +1,9 @@
+// PR tree-opt/21994
+// { dg-do compile }
+// { dg-options "-O2" }
+
+_Complex float f(void);
+_Complex float g(void) throw()
+{
+ return f();
+}
diff --git a/gcc/testsuite/g++.dg/opt/crossjump1.C b/gcc/testsuite/g++.dg/opt/crossjump1.C
index 3bb95d1810c..01abdc07102 100644
--- a/gcc/testsuite/g++.dg/opt/crossjump1.C
+++ b/gcc/testsuite/g++.dg/opt/crossjump1.C
@@ -1,6 +1,7 @@
// PR middle-end/21492
// { dg-do compile }
-// { dg-options "-Os -fPIC" }
+// { dg-options "-Os" }
+// { dg-options "-Os -fPIC" { target fpic } }
extern char *bar (const char *, const char *);
extern char *baz (char *, const char *);
diff --git a/gcc/testsuite/g++.dg/opt/cse2.C b/gcc/testsuite/g++.dg/opt/cse2.C
index 5a04bf53ecb..325169dff34 100644
--- a/gcc/testsuite/g++.dg/opt/cse2.C
+++ b/gcc/testsuite/g++.dg/opt/cse2.C
@@ -1,6 +1,6 @@
// This testcase caused ICE on IA-32 in simplify_unary_operation
// CSE did not assume SUBREGs changing mode from integral to floating.
-// { dg-do run { target i?86-*-* sparc*-*-* } }
+// { dg-do run { target i?86-*-* sparc*-*-* x86_64-*-* } }
// { dg-options "-O2" }
struct A
diff --git a/gcc/testsuite/g++.dg/opt/interface2.C b/gcc/testsuite/g++.dg/opt/interface2.C
new file mode 100644
index 00000000000..e75e425893d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/interface2.C
@@ -0,0 +1,19 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 2 Jun 2005 <nathan@codesourcery.com>
+
+// PR 21280
+// Origin: Jens Maurer <jens.maurer@gmx.net>
+
+#include "interface2.h"
+
+struct A
+{
+ A() { }
+ virtual ~A() { }
+};
+
+int main()
+{
+ A a;
+ C<A> c(a);
+}
diff --git a/gcc/testsuite/g++.dg/opt/interface2.h b/gcc/testsuite/g++.dg/opt/interface2.h
new file mode 100644
index 00000000000..dc059047230
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/interface2.h
@@ -0,0 +1,11 @@
+#pragma interface
+
+template<class T>
+struct C
+{
+ explicit C(const T& t) : a(t) { }
+ virtual ~C() { }
+ T a;
+};
+
+
diff --git a/gcc/testsuite/g++.dg/opt/longbranch2.C b/gcc/testsuite/g++.dg/opt/longbranch2.C
index 88594b04ef7..dbc8a1d94d2 100644
--- a/gcc/testsuite/g++.dg/opt/longbranch2.C
+++ b/gcc/testsuite/g++.dg/opt/longbranch2.C
@@ -2,8 +2,9 @@
// Originator: thor@math.tu-berlin.de
// { dg-do compile }
-// { dg-options "-O3 -funroll-loops -mtune=k6 -fomit-frame-pointer" { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-options "-O3 -funroll-loops -mtune=k6 -fomit-frame-pointer" { target { i?86-*-* && ilp32 } } }
+// { dg-options "-O3 -funroll-loops -mtune=k6 -fomit-frame-pointer" { target { x86_64-*-* && ilp32 } } }
+
// This used to fail to assemble because of an out-of-range 'loop' instructions.
diff --git a/gcc/testsuite/g++.dg/opt/mmx1.C b/gcc/testsuite/g++.dg/opt/mmx1.C
index e433d554aea..f13b2f844af 100644
--- a/gcc/testsuite/g++.dg/opt/mmx1.C
+++ b/gcc/testsuite/g++.dg/opt/mmx1.C
@@ -3,7 +3,8 @@
// mmx -> mmx register moves.
// { dg-do compile }
// { dg-options "-O2" }
-// { dg-options "-fno-exceptions -O2 -mmmx -fPIC" { target i?86-*-* } }
+// { dg-options "-fno-exceptions -O2 -mmmx -fPIC" { target { i?86-*-* && ilp32 } } }
+// { dg-options "-fno-exceptions -O2 -mmmx -fPIC" { target { x86_64-*-* && ilp32 } } }
struct A {
unsigned a0;
diff --git a/gcc/testsuite/g++.dg/opt/pr20931.C b/gcc/testsuite/g++.dg/opt/pr20931.C
new file mode 100644
index 00000000000..01518c06d24
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/pr20931.C
@@ -0,0 +1,13 @@
+// PR middle-end
+// This testcase ICEd because fold checking saw a type change which
+// is allowed as TYPE_CONTAINS_PLACEHOLDER_INTERNAL could change.
+// { dg-do compile }
+// { dg-options "-O2" }
+
+int
+__finite (double __x) throw ()
+{
+ return (__extension__
+ (((((union { double __d; int __i[2]; }) {__d: __x}).__i[1]
+ | 0x800fffffu) + 1) >> 31));
+}
diff --git a/gcc/testsuite/g++.dg/opt/reg-stack4.C b/gcc/testsuite/g++.dg/opt/reg-stack4.C
index 9ea77c23230..9d52845db64 100644
--- a/gcc/testsuite/g++.dg/opt/reg-stack4.C
+++ b/gcc/testsuite/g++.dg/opt/reg-stack4.C
@@ -5,8 +5,8 @@
// deleted a valid edge.
// { dg-do compile }
-// { dg-options "-mtune=i586 -O2" { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-options "-mtune=i586 -O2" { target { i?86-*-* && ilp32 } } }
+// { dg-options "-mtune=i586 -O2" { target { x86_64-*-* && ilp32 } } }
struct array {
double data;
diff --git a/gcc/testsuite/g++.dg/other/big-struct.C b/gcc/testsuite/g++.dg/other/big-struct.C
index b00683135f3..dcf230dd69c 100644
--- a/gcc/testsuite/g++.dg/other/big-struct.C
+++ b/gcc/testsuite/g++.dg/other/big-struct.C
@@ -1,4 +1,5 @@
-// { dg-do compile { target i?86-*-* } }
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
struct A
{
diff --git a/gcc/testsuite/g++.dg/other/crash-4.C b/gcc/testsuite/g++.dg/other/crash-4.C
new file mode 100644
index 00000000000..35f23e8ccc0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/crash-4.C
@@ -0,0 +1,19 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 14 Jun 2005 <nathan@codesourcery.com>
+
+// PR 20678: ICE on error message
+// Origin: Andrew Pinski pinskia@gcc.gnu.org
+
+struct a
+{
+ a(const a&);
+};
+struct b
+{ // { dg-error "cannot bind packed field" }
+ a aa __attribute__((packed));
+};
+struct c
+{
+ b bb;
+ c(const b& __a): bb(__a) {} // { dg-error "synthesized" }
+};
diff --git a/gcc/testsuite/g++.dg/other/error10.C b/gcc/testsuite/g++.dg/other/error10.C
new file mode 100644
index 00000000000..d8025801f13
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/error10.C
@@ -0,0 +1,15 @@
+// PR c++/21930
+// Test case by Volker Reichelt
+// { dg-do compile }
+
+template<int> struct A {};
+
+template<int N>
+void foo(const A<N> &a)
+{ -A<N>(a); } // { dg-error "\\(\\(const A<0>\\*\\)a\\)" "" }
+
+void bar()
+{
+ foo(A<0>()); // { dg-error "instantiated from here" "" }
+}
+
diff --git a/gcc/testsuite/g++.dg/other/stdarg3.C b/gcc/testsuite/g++.dg/other/stdarg3.C
index 3d11dffae1f..0e7abd8dda2 100644
--- a/gcc/testsuite/g++.dg/other/stdarg3.C
+++ b/gcc/testsuite/g++.dg/other/stdarg3.C
@@ -3,7 +3,7 @@
// PR 20375: ICE
// Origin: Joseph S. Myers <jsm28@gcc.gnu.org>
-// { dg-options "-mlp64" { target "ia64-*-*" } }
+// { dg-options "-mlp64" { target "ia64-*-hpux*" } }
union U
{
diff --git a/gcc/testsuite/g++.dg/overload/error1.C b/gcc/testsuite/g++.dg/overload/error1.C
index fcaa445201e..dd10d9053da 100644
--- a/gcc/testsuite/g++.dg/overload/error1.C
+++ b/gcc/testsuite/g++.dg/overload/error1.C
@@ -2,6 +2,6 @@
struct S
{
- void f () {}
- int f () { return 0; } // { dg-error "" "" }
+ void f () {} // { dg-error "with" "" }
+ int f () { return 0; } // { dg-error "overloaded" "" }
};
diff --git a/gcc/testsuite/g++.dg/parse/crash11.C b/gcc/testsuite/g++.dg/parse/crash11.C
index 4fa7ff23c73..eb5cf3c245c 100644
--- a/gcc/testsuite/g++.dg/parse/crash11.C
+++ b/gcc/testsuite/g++.dg/parse/crash11.C
@@ -20,7 +20,7 @@ struct B
struct Template
{
typedef typename A<A<TP>::Template> // { dg-error "mismatch|class template" }
- ::template Template<T>::Type Type; // { dg-error "unqualified-id" }
+ ::template Template<T>::Type Type; // { dg-error "" }
};
};
template <typename T>
diff --git a/gcc/testsuite/g++.dg/parse/crash26.C b/gcc/testsuite/g++.dg/parse/crash26.C
new file mode 100644
index 00000000000..2b4f165f8b9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash26.C
@@ -0,0 +1,12 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 13 Jun 2005 <nathan@codesourcery.com>
+
+// Origin: Volker Reichelt <reichelt@gcc.gnu.org>
+// Bug 21929: ICE on invalid
+
+template<int> struct A
+{
+ struct B;
+};
+
+template<> struct A<void>::B {}; // { dg-error "mismatch|expected|name a type|extra" }
diff --git a/gcc/testsuite/g++.dg/parse/defarg10.C b/gcc/testsuite/g++.dg/parse/defarg10.C
new file mode 100644
index 00000000000..ca228ac6492
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg10.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 7 Jun 2005 <nathan@codesourcery.com>
+
+// From java library.
+
+void Foo (int = 0);
+
+class Class
+{
+ friend void Foo (int);
+};
diff --git a/gcc/testsuite/g++.dg/parse/defarg9.C b/gcc/testsuite/g++.dg/parse/defarg9.C
new file mode 100644
index 00000000000..8496cfb26c1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/defarg9.C
@@ -0,0 +1,20 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 6 Jun 2005 <nathan@codesourcery.com>
+
+// PR 21903:Reject legal with default arg confusion
+// Origin: Wolfgang Bangerth <bangerth@dealii.org>
+
+
+struct O {
+ template<typename T> struct B {
+ void set (T, bool=true);
+ };
+
+ struct D : public B<int> {};
+};
+
+void x ()
+{
+ O::D d;
+ d.set(1);
+}
diff --git a/gcc/testsuite/g++.dg/parse/template16.C b/gcc/testsuite/g++.dg/parse/template16.C
new file mode 100644
index 00000000000..bc41b0f4591
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/template16.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 26 May 2005 <nathan@codesourcery.com>
+
+// Origin:Volker Reichelt reichelt@gcc.gnu.org
+// PR 21681. ICE with inappropriate access check.
+
+template<int X> struct A;
+
+struct B
+{
+ template<int N> void foo()
+ {
+ A<N>::X::Y;
+ }
+};
diff --git a/gcc/testsuite/g++.dg/pch/local-1.C b/gcc/testsuite/g++.dg/pch/local-1.C
new file mode 100644
index 00000000000..75847e5c19b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pch/local-1.C
@@ -0,0 +1,6 @@
+#include "local-1.H"
+int main()
+{
+ func<int> ();
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/pch/local-1.Hs b/gcc/testsuite/g++.dg/pch/local-1.Hs
new file mode 100644
index 00000000000..56a6c7e4744
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pch/local-1.Hs
@@ -0,0 +1,7 @@
+template<typename T> void func()
+{
+ struct object
+ {
+ object() {}
+ };
+}
diff --git a/gcc/testsuite/g++.dg/template/init5.C b/gcc/testsuite/g++.dg/template/init5.C
new file mode 100644
index 00000000000..ab529beb98f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/init5.C
@@ -0,0 +1,11 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 31 May 2005 <nathan@codesourcery.com>
+
+// PR 21165. ICE on valid
+// Origin:Volker Reichelt reichelt@gcc.gnu.org
+
+template<typename T> bool foo()
+{
+ const int i = T();
+ return i > 0;
+}
diff --git a/gcc/testsuite/g++.dg/template/new2.C b/gcc/testsuite/g++.dg/template/new2.C
new file mode 100644
index 00000000000..682ca6e1862
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/new2.C
@@ -0,0 +1,14 @@
+// PR c++/21336
+
+typedef __SIZE_TYPE__ size_t;
+template<class _T> void* operator new( size_t Size, _T&);
+struct B {
+ int a;
+ int* m() {
+ return new(a) int;
+ }
+};
+B* n() {
+ return new B();
+}
+
diff --git a/gcc/testsuite/g++.dg/template/ptrmem15.C b/gcc/testsuite/g++.dg/template/ptrmem15.C
new file mode 100644
index 00000000000..553d2953fd9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ptrmem15.C
@@ -0,0 +1,9 @@
+// PR c++/19894
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+template<typename T> struct A
+{
+ T A::* p; // { dg-error "void" }
+};
+
+A<void> a; // { dg-error "instantiated" }
diff --git a/gcc/testsuite/g++.dg/template/spec24.C b/gcc/testsuite/g++.dg/template/spec24.C
new file mode 100644
index 00000000000..08848952e53
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/spec24.C
@@ -0,0 +1,22 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 1 June 2005 <nathan@codesourcery.com>
+
+// PR 20350: ICE on member specialization with later initialization
+// Origin: Carlo Wood carlo@gcc.gnu.org
+
+template <int i> struct Mutex
+{
+ static int mutex;
+};
+
+template <int i>
+int Mutex<i>::mutex = {1};
+
+template <> int Mutex<0>::mutex;
+template <> int Mutex<0>::mutex = 0;
+
+void g()
+{
+ Mutex<0>::mutex = 0;
+}
+
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr22005.C b/gcc/testsuite/g++.dg/tree-ssa/pr22005.C
new file mode 100644
index 00000000000..cdaac2b889b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr22005.C
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+struct cl_string
+{
+ union{ int i; };
+ cl_string ();
+};
+struct cl_print_univpoly_flags { cl_string univpoly_varname; };
+struct cl_print_flags: cl_print_univpoly_flags {int i;};
+cl_print_flags default_print_flags;
diff --git a/gcc/testsuite/g++.dg/vect/pr21734_1.cc b/gcc/testsuite/g++.dg/vect/pr21734_1.cc
new file mode 100644
index 00000000000..c65d9fcaa81
--- /dev/null
+++ b/gcc/testsuite/g++.dg/vect/pr21734_1.cc
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+struct A
+{
+ int a[4];
+ int& operator[](int i) { return a[i]; }
+};
+
+struct B : public A
+{
+ int& operator[](int i) { return A::operator[](i); }
+};
+
+void foo(B &b)
+{
+ for (int i=0; i<4; ++i)
+ b[i] = 0;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/g++.dg/vect/pr21734_2.cc b/gcc/testsuite/g++.dg/vect/pr21734_2.cc
new file mode 100644
index 00000000000..58efedf18f3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/vect/pr21734_2.cc
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+struct A
+{
+ int a[4];
+ int* operator[](int i) { return &a[i]; }
+};
+
+void foo(A a1, A &a2)
+{
+ a1[1][1]=0;
+ for (int i=0; i<4; ++i)
+ a2.a[i]=0;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/g++.dg/warn/register-var-1.C b/gcc/testsuite/g++.dg/warn/register-var-1.C
index 88e4a6419a0..3396d211385 100644
--- a/gcc/testsuite/g++.dg/warn/register-var-1.C
+++ b/gcc/testsuite/g++.dg/warn/register-var-1.C
@@ -1,6 +1,6 @@
/* PR/18160 */
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* This should yield an error even without -pedantic. */
/* { dg-options "-ansi" } */
diff --git a/gcc/testsuite/g++.old-deja/g++.benjamin/warn02.C b/gcc/testsuite/g++.old-deja/g++.benjamin/warn02.C
index a2599aa1c94..248e1ed9ff1 100644
--- a/gcc/testsuite/g++.old-deja/g++.benjamin/warn02.C
+++ b/gcc/testsuite/g++.old-deja/g++.benjamin/warn02.C
@@ -31,16 +31,16 @@ class C
class D
{
public:
- int foo2() {return b;}
- int foo2() {return b;} // { dg-error "" }
+ int foo2() {return b;} // { dg-error "with" }
+ int foo2() {return b;} // { dg-error "overloaded" }
int b;
};
class E
{
public:
- int foo2();
- int foo2(); // { dg-error "" }
+ int foo2(); // { dg-error "with" }
+ int foo2(); // { dg-error "overloaded" }
int b;
};
diff --git a/gcc/testsuite/g++.old-deja/g++.bob/inherit2.C b/gcc/testsuite/g++.old-deja/g++.bob/inherit2.C
index e943a1caa18..9a64de4dc3e 100644
--- a/gcc/testsuite/g++.old-deja/g++.bob/inherit2.C
+++ b/gcc/testsuite/g++.old-deja/g++.bob/inherit2.C
@@ -6,11 +6,11 @@ public:
void z();
A(void) {}
private:
- A(const A &) { abort(); } // { dg-error "" }
+ A(const A &) { abort(); } // { dg-error "private" }
const A& operator =(const A &) { abort(); }
};
-class B : public A {
+class B : public A { // { dg-error "within" }
public:
B(void) {}
};
@@ -20,5 +20,5 @@ void f(B b) {
void g() {
B h;
- f(h); // { dg-error "" }
+ f(h); // { dg-error "synthesized|argument" }
}
diff --git a/gcc/testsuite/g++.old-deja/g++.brendan/arm2.C b/gcc/testsuite/g++.old-deja/g++.brendan/arm2.C
index 2cfa6b98b0b..fb1ee429d37 100644
--- a/gcc/testsuite/g++.old-deja/g++.brendan/arm2.C
+++ b/gcc/testsuite/g++.old-deja/g++.brendan/arm2.C
@@ -8,12 +8,12 @@
class X {
public:
- int foo();
- static int foo(); // error: redeclaration// { dg-error "" } .*
+ int foo(); // { dg-error "with" }
+ static int foo(); // error: redeclaration// { dg-error "overloaded" } .*
};
class Y {
public:
- static int foo();
- int foo(); // error: redeclaration// { dg-error "" } .*
+ static int foo(); // { dg-error "with" }
+ int foo(); // error: redeclaration// { dg-error "overloaded" } .*
};
diff --git a/gcc/testsuite/g++.old-deja/g++.bugs/900205_04.C b/gcc/testsuite/g++.old-deja/g++.bugs/900205_04.C
index a2c84fadb9e..d93181ebb1e 100644
--- a/gcc/testsuite/g++.old-deja/g++.bugs/900205_04.C
+++ b/gcc/testsuite/g++.old-deja/g++.bugs/900205_04.C
@@ -23,9 +23,9 @@ struct0::struct0 (int, void *) // { dg-error "note" }
{
}
-struct struct0_derived_struct_0 : public struct0 { // { dg-error "" }
+struct struct0_derived_struct_0 : public struct0 { // { dg-error "no matching" }
};
-struct0_derived_struct_0 object;
+struct0_derived_struct_0 object; // { dg-error "synthesized" }
int main () { return 0; }
diff --git a/gcc/testsuite/g++.old-deja/g++.eh/badalloc1.C b/gcc/testsuite/g++.old-deja/g++.eh/badalloc1.C
index 1cd7bf458a7..3c9941d65c8 100644
--- a/gcc/testsuite/g++.old-deja/g++.eh/badalloc1.C
+++ b/gcc/testsuite/g++.old-deja/g++.eh/badalloc1.C
@@ -1,4 +1,4 @@
-// { dg-do run { xfail xstormy16-*-* *-*-darwin* } }
+// { dg-do run { xfail xstormy16-*-* *-*-darwin[1-7]* } }
// Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 6 June 2000 <nathan@codesourcery.com>
diff --git a/gcc/testsuite/g++.old-deja/g++.ext/asmspec1.C b/gcc/testsuite/g++.old-deja/g++.ext/asmspec1.C
index 146f3ac7348..97d4b8e6bfc 100644
--- a/gcc/testsuite/g++.old-deja/g++.ext/asmspec1.C
+++ b/gcc/testsuite/g++.old-deja/g++.ext/asmspec1.C
@@ -1,4 +1,4 @@
-// { dg-do assemble { target i?86-*-* } }
+// { dg-do assemble { target i?86-*-* x86_64-*-* } }
// Origin: Anthony Green <green@cygnus.com>
void foo ()
diff --git a/gcc/testsuite/g++.old-deja/g++.ext/attrib1.C b/gcc/testsuite/g++.old-deja/g++.ext/attrib1.C
index bdc3ade8b74..e879791665d 100644
--- a/gcc/testsuite/g++.old-deja/g++.ext/attrib1.C
+++ b/gcc/testsuite/g++.old-deja/g++.ext/attrib1.C
@@ -1,5 +1,5 @@
-// { dg-do assemble { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do assemble { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// Test for using prefix attributes in a parameter decl.
// Contributed by Jason Merrill <jason@cygnus.com>
diff --git a/gcc/testsuite/g++.old-deja/g++.ext/attrib2.C b/gcc/testsuite/g++.old-deja/g++.ext/attrib2.C
index c60ff823130..09b2bf2e67d 100644
--- a/gcc/testsuite/g++.old-deja/g++.ext/attrib2.C
+++ b/gcc/testsuite/g++.old-deja/g++.ext/attrib2.C
@@ -1,5 +1,5 @@
-// { dg-do run { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// Test that stdcall doesn't prevent us from using op delete.
// Contributed by Jason Merrill <jason@cygnus.com>
diff --git a/gcc/testsuite/g++.old-deja/g++.ext/attrib3.C b/gcc/testsuite/g++.old-deja/g++.ext/attrib3.C
index 492cd9d7c49..7d9c70e3b75 100644
--- a/gcc/testsuite/g++.old-deja/g++.ext/attrib3.C
+++ b/gcc/testsuite/g++.old-deja/g++.ext/attrib3.C
@@ -1,5 +1,5 @@
-// { dg-do run { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// Test for proper handling of attributes in template instantiation.
// Contributed by Jason Merrill <jason@cygnus.com>
diff --git a/gcc/testsuite/g++.old-deja/g++.jason/opeq3.C b/gcc/testsuite/g++.old-deja/g++.jason/opeq3.C
index 50b749eb628..1267fafbe49 100644
--- a/gcc/testsuite/g++.old-deja/g++.jason/opeq3.C
+++ b/gcc/testsuite/g++.old-deja/g++.jason/opeq3.C
@@ -1,7 +1,7 @@
// { dg-do assemble }
// Bug: g++ generates code for assignment in invalid situations.
-class X {
+class X { // { dg-error "assignment" }
int& a;
public:
X(int& i): a(i) { };
@@ -11,5 +11,5 @@ void foo ()
{
int one=1, two=2;
X a(one), b(two);
- a = b; // { dg-error "" } no assignment semantics defined
+ a = b; // { dg-error "synthesized" }
}
diff --git a/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C b/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C
index e04e62828cd..1b235ef58e9 100644
--- a/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C
+++ b/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C
@@ -1,4 +1,4 @@
-// { dg-do run { xfail rs6000-*-* powerpc-*-eabi m68k-*-coff mn10300-*-* v850-*-* sh-*-* sh64-*-* h8*-*-* xtensa-*-* } }
+// { dg-do run { xfail rs6000-*-* powerpc-*-eabi m68k-*-coff mn10300-*-* v850-*-* sh-*-* sh64-*-* h8*-*-* xtensa-*-* m32r*-*-* } }
// Test that variadic function calls using thunks work right.
// Note that this will break on any target that uses the generic thunk
// support, because it doesn't support variadic functions.
diff --git a/gcc/testsuite/g++.old-deja/g++.other/redecl2.C b/gcc/testsuite/g++.old-deja/g++.other/redecl2.C
index 70f703b8ee0..0d6ccf669f0 100644
--- a/gcc/testsuite/g++.old-deja/g++.other/redecl2.C
+++ b/gcc/testsuite/g++.old-deja/g++.other/redecl2.C
@@ -1,9 +1,9 @@
// { dg-do assemble }
struct S {
- S(int);
- S(int); // { dg-error "" } already declared
+ S(int); // { dg-error "with" }
+ S(int); // { dg-error "overloaded" } already declared
- ~S();
- ~S(); // { dg-error "" } already declared
+ ~S();// { dg-error "with" }
+ ~S(); // { dg-error "overloaded" } already declared
};
diff --git a/gcc/testsuite/g++.old-deja/g++.other/redecl4.C b/gcc/testsuite/g++.old-deja/g++.other/redecl4.C
index 9b7f8c5910d..e3355dafc41 100644
--- a/gcc/testsuite/g++.old-deja/g++.other/redecl4.C
+++ b/gcc/testsuite/g++.old-deja/g++.other/redecl4.C
@@ -1,7 +1,7 @@
// { dg-do assemble }
int main() {
struct A {
- void f();
- void f(); // { dg-error "" } already declared
+ void f(); // { dg-error "with" } already declared
+ void f(); // { dg-error "overloaded" } already declared
};
}
diff --git a/gcc/testsuite/g++.old-deja/g++.other/regstack.C b/gcc/testsuite/g++.old-deja/g++.other/regstack.C
index 5be2fcd9974..5b833473332 100644
--- a/gcc/testsuite/g++.old-deja/g++.other/regstack.C
+++ b/gcc/testsuite/g++.old-deja/g++.other/regstack.C
@@ -1,4 +1,4 @@
-// { dg-do run { target i?86-*-* } }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
// { dg-options "-O2" }
inline double foo (double x)
diff --git a/gcc/testsuite/g++.old-deja/g++.other/store-expr1.C b/gcc/testsuite/g++.old-deja/g++.other/store-expr1.C
index 49456242b4e..31c81a02dd3 100644
--- a/gcc/testsuite/g++.old-deja/g++.other/store-expr1.C
+++ b/gcc/testsuite/g++.old-deja/g++.other/store-expr1.C
@@ -1,5 +1,5 @@
-// { dg-do run { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// { dg-options "-mtune=i686 -O2 -fpic" }
// { dg-bogus "\[Uu\]nresolved symbol .(_GLOBAL_OFFSET_TABLE_|\[_.A-Za-z\]\[_.0-9A-Za-z\]*@(PLT|GOT|GOTOFF))" "PIC unsupported" { xfail *-*-netware* } 0 }
class G {};
diff --git a/gcc/testsuite/g++.old-deja/g++.other/store-expr2.C b/gcc/testsuite/g++.old-deja/g++.other/store-expr2.C
index d35e3b77dfa..99e0943b3b6 100644
--- a/gcc/testsuite/g++.old-deja/g++.other/store-expr2.C
+++ b/gcc/testsuite/g++.old-deja/g++.other/store-expr2.C
@@ -1,5 +1,5 @@
-// { dg-do run { target i?86-*-* } }
-// { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } }
+// { dg-do run { target i?86-*-* x86_64-*-*} }
+// { dg-require-effective-target ilp32 }
// { dg-options "-mtune=i686 -O2" }
class G {};
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/assign1.C b/gcc/testsuite/g++.old-deja/g++.pt/assign1.C
index 5f6ad345513..9f2a4bf065b 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/assign1.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/assign1.C
@@ -1,8 +1,8 @@
-// { dg-do assemble }
+// { dg-do compile }
// Origin: Mark Mitchell <mark@codesourcery.com>
template <class T>
-struct S {
+struct S { // { dg-error "assignment" }
S();
T t;
};
@@ -10,5 +10,5 @@ struct S {
void f()
{
S<const int> s;
- s = s; // { dg-error "" } generated assignment operator is illegal
+ s = s; // { dg-error "synthesized" }
}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash20.C b/gcc/testsuite/g++.old-deja/g++.pt/crash20.C
index 44f6c8c447a..f910294e65c 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/crash20.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/crash20.C
@@ -1,9 +1,16 @@
-// { dg-do assemble }
+// { dg-do compile }
template <class T = int>
-struct A { const T x; A() : x(0) { } A(T x) : x(x) { } };
+struct A { // { dg-error "assignment" }
+ const T x;
+ A() : x(0) { } A(T x) : x(x) { }
+};
template <class B>
-void func () { B y; y = B(); } // { dg-error "" } can't use default assignment
+void func ()
+{
+ B y;
+ y = B(); // { dg-error "synthesized" }
+}
int main (void) { func< A<> >(); }
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/memtemp78.C b/gcc/testsuite/g++.old-deja/g++.pt/memtemp78.C
index cd54f3a7c9e..73348351f0d 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/memtemp78.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/memtemp78.C
@@ -23,10 +23,10 @@ template struct B<int>;
struct C
{
template <class U>
- void f() {}
+ void f() {} // { dg-error "with" } redeclaration
template <class U>
- void f() {} // { dg-error "" } redeclaration
+ void f() {} // { dg-error "overloaded" } redeclaration
};
@@ -42,15 +42,15 @@ template struct D<int, double>;
template <class T, class U>
struct D2
{
- void f(T);
- void f(U); // { dg-error "" } redeclaration
+ void f(T); // { dg-error "with" } redeclaration
+ void f(U); // { dg-error "overloaded" } redeclaration
};
template struct D2<int, int>;
struct E
{
- void f();
- void f(); // { dg-error "" } redeclaration
+ void f(); // { dg-error "with" } redeclaration
+ void f(); // { dg-error "overloaded" } redeclaration
};
diff --git a/gcc/testsuite/gcc.c-torture/compile/20050423-1.c b/gcc/testsuite/gcc.c-torture/compile/20050423-1.c
new file mode 100644
index 00000000000..fee5eb9093e
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20050423-1.c
@@ -0,0 +1,16 @@
+/* PR tree-optimization/20742 */
+
+int
+foo (int x, int y)
+{
+ register int a = y + 57;
+ register int b = y + 31;
+
+ while (x-- > 0)
+ {
+ #define TEN(x) x x x x x x x x x x
+ TEN (TEN (a += b; b -= a;))
+ TEN (TEN (a += b; b -= a;))
+ }
+ return a + b;
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/20050520-1.c b/gcc/testsuite/gcc.c-torture/compile/20050520-1.c
new file mode 100644
index 00000000000..9e2f6c8c74b
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20050520-1.c
@@ -0,0 +1,13 @@
+struct s { int x[4]; };
+struct s gs;
+
+void
+bar (void)
+{
+ struct s *s;
+ int i;
+
+ s = &gs;
+ for (i = 0; i < 4; i++)
+ ((char*) (&s->x[i]))[0] = 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr21293.c b/gcc/testsuite/gcc.c-torture/compile/pr21293.c
new file mode 100644
index 00000000000..54184b3e039
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr21293.c
@@ -0,0 +1,12 @@
+/* Testcase from Dale Johannesen <dalej@gcc.gnu.org>. */
+struct {
+double x[1];
+} g;
+void k( double *, double*);
+void h(int Tmp8)
+{
+ int i;
+ for(i = 1;i <= Tmp8;i++)
+ k(&g.x[ + -1],&g.x[ Tmp8 + -1]);
+}
+
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr21562.c b/gcc/testsuite/gcc.c-torture/compile/pr21562.c
new file mode 100644
index 00000000000..d100b28dd45
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr21562.c
@@ -0,0 +1,25 @@
+/* { dg-options "-O3 -fno-inline" } */
+struct foo { int a, b, c; };
+void abort(void);
+void exit(int);
+
+void
+brother (int a, int b, int c)
+{
+ if (a)
+ abort ();
+}
+
+void
+sister (struct foo f, int b, int c)
+{
+ brother ((f.b == b), b, c);
+}
+
+int
+main ()
+{
+ struct foo f = { 7, 8, 9 };
+ sister (f, 1, 2);
+ exit (0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr21638.c b/gcc/testsuite/gcc.c-torture/compile/pr21638.c
new file mode 100644
index 00000000000..36fd0104aeb
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr21638.c
@@ -0,0 +1,21 @@
+typedef struct hashhdr {
+ int bitmaps[32];
+} HASHHDR;
+
+static void
+swap_header_copy(HASHHDR *srcp, HASHHDR *destp)
+{
+ int i;
+ for (i = 0; i < 32; i++)
+ ((char *)&(destp->bitmaps[i]))[0] = ((char *)&(srcp->bitmaps[i]))[1];
+}
+
+int
+flush_meta(HASHHDR *whdrp1)
+{
+ HASHHDR *whdrp;
+ HASHHDR whdr;
+ whdrp = &whdr;
+ swap_header_copy(whdrp1, whdrp);
+ return (0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr21761.c b/gcc/testsuite/gcc.c-torture/compile/pr21761.c
new file mode 100644
index 00000000000..b9ca5c91965
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr21761.c
@@ -0,0 +1,9 @@
+void f1()
+{
+ long bit=0, exponent;
+ exponent = -exponent;
+ for (bit = 1; exponent; bit <<= 1)
+ if (exponent & bit)
+ exponent ^= bit;
+}
+
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr21839.c b/gcc/testsuite/gcc.c-torture/compile/pr21839.c
new file mode 100644
index 00000000000..c02085c2dfd
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr21839.c
@@ -0,0 +1,12 @@
+ typedef struct { } spinlock_t;
+typedef struct {
+ unsigned sequence;
+ spinlock_t lock;
+} seqlock_t;
+void ext3_new_inode(seqlock_t *rsv_seqlock)
+{
+ *rsv_seqlock = (seqlock_t) { 0, (spinlock_t) { } };
+
+}
+
+
diff --git a/gcc/testsuite/gcc.c-torture/execute/20020720-1.x b/gcc/testsuite/gcc.c-torture/execute/20020720-1.x
index 6791a1f5d12..8d14adc2f26 100644
--- a/gcc/testsuite/gcc.c-torture/execute/20020720-1.x
+++ b/gcc/testsuite/gcc.c-torture/execute/20020720-1.x
@@ -29,7 +29,8 @@ set torture_eval_before_compile {
set compiler_conditional_xfail_data {
"This test fails to optimize completely on certain platforms." \
{ "xtensa-*-*" "sh-*-*" "arm*-*-*" "strongarm*-*-*" "xscale*-*-*" \
- "h8300*-*-*" "frv-*-*" "powerpc*-*-*" "rs6000-*-*" "bfin*-*" } \
+ "h8300*-*-*" "frv-*-*" "powerpc*-*-*" "rs6000-*-*" "bfin*-*" \
+ "m32r*-*-*" "avr-*-*"} \
{ "*" } \
{ "-O0" }
}
diff --git a/gcc/testsuite/gcc.c-torture/execute/20050604-1.c b/gcc/testsuite/gcc.c-torture/execute/20050604-1.c
new file mode 100644
index 00000000000..70097aa14cb
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20050604-1.c
@@ -0,0 +1,39 @@
+/* PR regression/21897 */
+
+extern void abort (void);
+
+typedef short v4hi __attribute__ ((vector_size (8)));
+typedef float v4sf __attribute__ ((vector_size (16)));
+
+union
+{
+ v4hi v;
+ short s[4];
+} u;
+
+union
+{
+ v4sf v;
+ float f[4];
+} v;
+
+void
+foo (void)
+{
+ unsigned int i;
+ for (i = 0; i < 2; i++)
+ u.v += (v4hi) { 12, 14 };
+ for (i = 0; i < 2; i++)
+ v.v += (v4sf) { 18.0, 20.0, 22 };
+}
+
+int
+main (void)
+{
+ foo ();
+ if (u.s[0] != 24 || u.s[1] != 28 || u.s[2] || u.s[3])
+ abort ();
+ if (v.f[0] != 36.0 || v.f[1] != 40.0 || v.f[2] != 44.0 || v.f[3] != 0.0)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/20050607-1.c b/gcc/testsuite/gcc.c-torture/execute/20050607-1.c
new file mode 100644
index 00000000000..41579bbba5e
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20050607-1.c
@@ -0,0 +1,16 @@
+/* PR middle-end/21850 */
+
+extern void abort (void);
+
+typedef int V2SI __attribute__ ((vector_size (8)));
+
+int
+main (void)
+{
+#if (__INT_MAX__ == 2147483647) \
+ && (__LONG_LONG_MAX__ == 9223372036854775807LL)
+ if (((int)(long long)(V2SI){ 2, 2 }) != 2)
+ abort ();
+#endif
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/ieee/ieee.exp b/gcc/testsuite/gcc.c-torture/execute/ieee/ieee.exp
index ff508d3f420..64bbdad7e84 100644
--- a/gcc/testsuite/gcc.c-torture/execute/ieee/ieee.exp
+++ b/gcc/testsuite/gcc.c-torture/execute/ieee/ieee.exp
@@ -1,6 +1,6 @@
#
# Expect driver script for GCC Regression Tests
-# Copyright (C) 1993, 1996, 2001 Free Software Foundation
+# Copyright (C) 1993, 1996, 2001, 2005 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
@@ -38,6 +38,9 @@ set additional_flags ""
if [istarget "i\[34567\]86-*-*"] then {
lappend additional_flags "-ffloat-store"
}
+if { [istarget "x86_64-*-*"] && [check_effective_target_ilp32] } then {
+ lappend additional_flags "-ffloat-store"
+}
if [istarget "m68k-*-*"] then {
lappend additional_flags "-ffloat-store"
}
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr21331.c b/gcc/testsuite/gcc.c-torture/execute/pr21331.c
new file mode 100644
index 00000000000..4d95878e631
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr21331.c
@@ -0,0 +1,15 @@
+void abort (void);
+
+int bar (void) { return -1; }
+
+unsigned long
+foo ()
+{ unsigned long retval;
+ retval = bar ();
+ if (retval == -1) return 0;
+ return 3; }
+
+main ()
+{ if (foo () != 0) abort ();
+ return 0; }
+
diff --git a/gcc/testsuite/gcc.dg/20000609-1.c b/gcc/testsuite/gcc.dg/20000609-1.c
index dfa64983ef2..5d452ac9d82 100644
--- a/gcc/testsuite/gcc.dg/20000609-1.c
+++ b/gcc/testsuite/gcc.dg/20000609-1.c
@@ -1,6 +1,7 @@
-/* { dg-do run { target i?86-*-* } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O1 -ffast-math -march=i686" } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+
/* Sanity check for fp_jcc_* with TARGET_CMOVE. */
diff --git a/gcc/testsuite/gcc.dg/20000614-1.c b/gcc/testsuite/gcc.dg/20000614-1.c
index abc8ca2f714..507596787a6 100644
--- a/gcc/testsuite/gcc.dg/20000614-1.c
+++ b/gcc/testsuite/gcc.dg/20000614-1.c
@@ -1,4 +1,4 @@
-/* { dg-do run { target i?86-*-* } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O2" } */
void bar(char *p)
diff --git a/gcc/testsuite/gcc.dg/20000720-1.c b/gcc/testsuite/gcc.dg/20000720-1.c
index 89b570d750a..65bf68544b4 100644
--- a/gcc/testsuite/gcc.dg/20000720-1.c
+++ b/gcc/testsuite/gcc.dg/20000720-1.c
@@ -1,5 +1,5 @@
-/* { dg-do compile { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-mpreferred-stack-boundary=2 -march=i586 -O2 -fomit-frame-pointer" } */
extern void *foo(void *a, const void *b, unsigned c);
diff --git a/gcc/testsuite/gcc.dg/20000807-1.c b/gcc/testsuite/gcc.dg/20000807-1.c
index f6547649483..360e3245989 100644
--- a/gcc/testsuite/gcc.dg/20000807-1.c
+++ b/gcc/testsuite/gcc.dg/20000807-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-Os -fpic" } */
#include <string.h>
diff --git a/gcc/testsuite/gcc.dg/20000904-1.c b/gcc/testsuite/gcc.dg/20000904-1.c
index c6238e35099..31f937cab71 100644
--- a/gcc/testsuite/gcc.dg/20000904-1.c
+++ b/gcc/testsuite/gcc.dg/20000904-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O0 -fpic" } */
static struct {
diff --git a/gcc/testsuite/gcc.dg/20001127-1.c b/gcc/testsuite/gcc.dg/20001127-1.c
index 6ac76e29e92..f63d1149322 100644
--- a/gcc/testsuite/gcc.dg/20001127-1.c
+++ b/gcc/testsuite/gcc.dg/20001127-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O2" } */
extern inline float bar (float x)
diff --git a/gcc/testsuite/gcc.dg/20010202-1.c b/gcc/testsuite/gcc.dg/20010202-1.c
index f600373b8a3..5f789042eba 100644
--- a/gcc/testsuite/gcc.dg/20010202-1.c
+++ b/gcc/testsuite/gcc.dg/20010202-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* sparc*-*-* } } */
+/* { dg-do compile { target i?86-*-* sparc*-*-* x86_64-*-* } } */
/* { dg-options "-O2" } */
extern void abort (void);
diff --git a/gcc/testsuite/gcc.dg/20010520-1.c b/gcc/testsuite/gcc.dg/20010520-1.c
index c96dbc4eee5..97ee32b0b82 100644
--- a/gcc/testsuite/gcc.dg/20010520-1.c
+++ b/gcc/testsuite/gcc.dg/20010520-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-w" } */
void f ()
diff --git a/gcc/testsuite/gcc.dg/20011009-1.c b/gcc/testsuite/gcc.dg/20011009-1.c
index dbf32e63fba..b78d99e997b 100644
--- a/gcc/testsuite/gcc.dg/20011009-1.c
+++ b/gcc/testsuite/gcc.dg/20011009-1.c
@@ -1,4 +1,4 @@
-/* { 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/20011029-2.c b/gcc/testsuite/gcc.dg/20011029-2.c
index 6fdc6216678..07ef1a806fe 100644
--- a/gcc/testsuite/gcc.dg/20011029-2.c
+++ b/gcc/testsuite/gcc.dg/20011029-2.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O2" } */
int foo (int s)
diff --git a/gcc/testsuite/gcc.dg/20011107-1.c b/gcc/testsuite/gcc.dg/20011107-1.c
index a53f4f1912e..0d09427a0b4 100644
--- a/gcc/testsuite/gcc.dg/20011107-1.c
+++ b/gcc/testsuite/gcc.dg/20011107-1.c
@@ -1,5 +1,5 @@
-/* { dg-do compile { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2 -mtune=k6" } */
void
diff --git a/gcc/testsuite/gcc.dg/20011119-1.c b/gcc/testsuite/gcc.dg/20011119-1.c
index 5758f8b1bf0..bbdf104d1c8 100644
--- a/gcc/testsuite/gcc.dg/20011119-1.c
+++ b/gcc/testsuite/gcc.dg/20011119-1.c
@@ -1,6 +1,7 @@
/* Test for reload failing to eliminate from argp to sp. */
-/* { dg-do run { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" "-fpic" "-fPIC" } { "" } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-skip-if "" { "*-*-*" } { "-fpic" "-fPIC" } { "" } } */
/* { dg-options "-O2 -fomit-frame-pointer" } */
static int ustrsize (const char *s);
diff --git a/gcc/testsuite/gcc.dg/20020108-1.c b/gcc/testsuite/gcc.dg/20020108-1.c
index 03b97d1fec6..32d24fdca3e 100644
--- a/gcc/testsuite/gcc.dg/20020108-1.c
+++ b/gcc/testsuite/gcc.dg/20020108-1.c
@@ -5,8 +5,9 @@
is not valid general_operand in HImode. */
/* { dg-do compile } */
/* { dg-options "-O2" } */
-/* { dg-options "-O2 -mtune=i686" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-O2 -mtune=i686" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-O2 -mtune=i686" { target { x86_64-*-* && ilp32 } } } */
+
void
foo (unsigned short *cp)
diff --git a/gcc/testsuite/gcc.dg/20020122-2.c b/gcc/testsuite/gcc.dg/20020122-2.c
index de92bd82880..5dca0dba4c4 100644
--- a/gcc/testsuite/gcc.dg/20020122-2.c
+++ b/gcc/testsuite/gcc.dg/20020122-2.c
@@ -3,8 +3,8 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fprefetch-loop-arrays -w" } */
-/* { dg-options "-O2 -fprefetch-loop-arrays -march=athlon" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-O2 -fprefetch-loop-arrays -march=athlon" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-O2 -fprefetch-loop-arrays -march=athlon" { target { x86_64-*-* && ilp32 } } } */
extern int access( char* );
extern int a();
diff --git a/gcc/testsuite/gcc.dg/20020122-3.c b/gcc/testsuite/gcc.dg/20020122-3.c
index 4aafc4777c9..bcf257527c0 100644
--- a/gcc/testsuite/gcc.dg/20020122-3.c
+++ b/gcc/testsuite/gcc.dg/20020122-3.c
@@ -4,8 +4,8 @@
/* { dg-do compile } */
/* { dg-options "-Os -fprefetch-loop-arrays -w" } */
-/* { dg-options "-Os -fprefetch-loop-arrays -mtune=pentium3 -w" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-Os -fprefetch-loop-arrays -mtune=pentium3 -w" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-Os -fprefetch-loop-arrays -mtune=pentium3 -w" { target { x86_64-*-* && ilp32 } } } */
int foo (int *p, int n)
{
diff --git a/gcc/testsuite/gcc.dg/20020201-3.c b/gcc/testsuite/gcc.dg/20020201-3.c
index 66a48022b16..e95c44fbdfb 100644
--- a/gcc/testsuite/gcc.dg/20020201-3.c
+++ b/gcc/testsuite/gcc.dg/20020201-3.c
@@ -1,7 +1,7 @@
/* This testcase ICEd because a SFmode variable was given a MMX register
for which there is no movsf exists. */
-/* { dg-do compile { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2 -march=i686 -mmmx -fno-strict-aliasing" } */
struct A { unsigned int a, b; };
diff --git a/gcc/testsuite/gcc.dg/20020206-1.c b/gcc/testsuite/gcc.dg/20020206-1.c
index 1bdb25de166..26c36c43b8e 100644
--- a/gcc/testsuite/gcc.dg/20020206-1.c
+++ b/gcc/testsuite/gcc.dg/20020206-1.c
@@ -4,8 +4,9 @@
/* { dg-do run } */
/* { dg-options "-O2 -fprefetch-loop-arrays -w" } */
-/* { dg-options "-O2 -fprefetch-loop-arrays -mtune=pentium3 -w" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-O2 -fprefetch-loop-arrays -mtune=pentium3 -w" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-O2 -fprefetch-loop-arrays -mtune=pentium3 -w" { target { x86_64-*-* && ilp32 } } } */
+
struct reload
{
diff --git a/gcc/testsuite/gcc.dg/20020218-1.c b/gcc/testsuite/gcc.dg/20020218-1.c
index 240c3d7e2ab..bef4d66fc13 100644
--- a/gcc/testsuite/gcc.dg/20020218-1.c
+++ b/gcc/testsuite/gcc.dg/20020218-1.c
@@ -1,6 +1,6 @@
/* Verify that X86-64 only SSE registers aren't restored on IA-32. */
-/* { dg-do compile { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2 -msse" } */
/* { dg-final { scan-assembler-not "xmm8" } } */
diff --git a/gcc/testsuite/gcc.dg/20020224-1.c b/gcc/testsuite/gcc.dg/20020224-1.c
index a286b6b0599..c37de2e21b7 100644
--- a/gcc/testsuite/gcc.dg/20020224-1.c
+++ b/gcc/testsuite/gcc.dg/20020224-1.c
@@ -3,7 +3,7 @@
expected the callee to pop up the hidden return structure pointer,
while callee was actually not poping it up (as the hidden argument
was passed in register). */
-/* { dg-do run { target i?86-*-* } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O2 -fomit-frame-pointer" } */
extern void abort (void);
diff --git a/gcc/testsuite/gcc.dg/20020310-1.c b/gcc/testsuite/gcc.dg/20020310-1.c
index 6067e190622..345199dcd72 100644
--- a/gcc/testsuite/gcc.dg/20020310-1.c
+++ b/gcc/testsuite/gcc.dg/20020310-1.c
@@ -2,8 +2,8 @@
This testcase was miscompiled because of an rtx sharing bug. */
/* { dg-do run } */
/* { dg-options "-O2" } */
-/* { dg-options "-O2 -mtune=i586" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-O2 -mtune=i586" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-O2 -mtune=i586" { target { x86_64-*-* && ilp32 } } } */
struct A
{
diff --git a/gcc/testsuite/gcc.dg/20020411-1.c b/gcc/testsuite/gcc.dg/20020411-1.c
index 0413ed9b56b..8908c32afaf 100644
--- a/gcc/testsuite/gcc.dg/20020411-1.c
+++ b/gcc/testsuite/gcc.dg/20020411-1.c
@@ -3,8 +3,8 @@
for its mode. */
/* { dg-do compile } */
/* { dg-options "-O2" } */
-/* { dg-options "-O2 -march=i686" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-O2 -march=i686" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-O2 -march=i686" { target { x86_64-*-* && ilp32 } } } */
#if __INT_MAX__ > 32767
diff --git a/gcc/testsuite/gcc.dg/20020418-2.c b/gcc/testsuite/gcc.dg/20020418-2.c
index 8a15b2644f5..07722ce758f 100644
--- a/gcc/testsuite/gcc.dg/20020418-2.c
+++ b/gcc/testsuite/gcc.dg/20020418-2.c
@@ -1,8 +1,8 @@
/* PR optimization/6010 */
/* { dg-do compile } */
/* { dg-options "-O2 -funroll-all-loops" } */
-/* { dg-options "-O2 -funroll-all-loops -march=pentium3" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-O2 -funroll-all-loops -march=pentium3" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-O2 -funroll-all-loops -march=pentium3" { target { x86_64-*-* && ilp32 } } } */
void bar (float);
diff --git a/gcc/testsuite/gcc.dg/20020426-1.c b/gcc/testsuite/gcc.dg/20020426-1.c
index 67b09b3f80d..31be74712c0 100644
--- a/gcc/testsuite/gcc.dg/20020426-1.c
+++ b/gcc/testsuite/gcc.dg/20020426-1.c
@@ -1,6 +1,6 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-msoft-float -mfp-ret-in-387" } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
void f() {
__builtin_apply(0, 0, 0);
diff --git a/gcc/testsuite/gcc.dg/20020426-2.c b/gcc/testsuite/gcc.dg/20020426-2.c
index 19bf991b346..6bb53cf598c 100644
--- a/gcc/testsuite/gcc.dg/20020426-2.c
+++ b/gcc/testsuite/gcc.dg/20020426-2.c
@@ -2,8 +2,8 @@
Distilled from zlib sources. */
/* { dg-do run } */
/* { dg-options "-O2" } */
-/* { dg-options "-O2 -frename-registers -fomit-frame-pointer -fPIC -mtune=i686" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-O2 -frename-registers -fomit-frame-pointer -fPIC -mtune=i686" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-O2 -frename-registers -fomit-frame-pointer -fPIC -mtune=i686" { target { x86_64-*-* && ilp32 } } } */
/* { dg-bogus "\[Uu\]nresolved symbol .(_GLOBAL_OFFSET_TABLE_|\[_.A-Za-z\]\[_.0-9A-Za-z\]*@(PLT|GOT|GOTOFF))" "PIC unsupported" { xfail *-*-netware* } 0 } */
extern void exit (int);
diff --git a/gcc/testsuite/gcc.dg/20020517-1.c b/gcc/testsuite/gcc.dg/20020517-1.c
index 72b252900d4..bde20095594 100644
--- a/gcc/testsuite/gcc.dg/20020517-1.c
+++ b/gcc/testsuite/gcc.dg/20020517-1.c
@@ -2,8 +2,8 @@
was not sign-extended for QImode. */
/* { dg-do run } */
/* { dg-options "-O2" } */
-/* { dg-options "-O2 -mtune=i686" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-O2 -mtune=i686" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-O2 -mtune=i686" { target { x86_64-*-* && ilp32 } } } */
#include <limits.h>
diff --git a/gcc/testsuite/gcc.dg/20020523-1.c b/gcc/testsuite/gcc.dg/20020523-1.c
index d29f20ae2e6..51ae5ecb689 100644
--- a/gcc/testsuite/gcc.dg/20020523-1.c
+++ b/gcc/testsuite/gcc.dg/20020523-1.c
@@ -1,8 +1,8 @@
/* PR target/6753
This testcase was miscompiled because sse_mov?fcc_const0*
patterns were missing earlyclobber. */
-/* { dg-do run { target i386-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-march=pentium3 -msse -ffast-math -O2" } */
extern void abort (void);
diff --git a/gcc/testsuite/gcc.dg/20020523-2.c b/gcc/testsuite/gcc.dg/20020523-2.c
index 086f1d469e6..ebe8bb8f5cd 100644
--- a/gcc/testsuite/gcc.dg/20020523-2.c
+++ b/gcc/testsuite/gcc.dg/20020523-2.c
@@ -1,8 +1,8 @@
/* PR target/6753
This testcase was miscompiled because sse_mov?fcc_const0*
patterns were missing earlyclobber. */
-/* { dg-do run { target i386-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-march=pentium3 -msse -ffast-math -O2" } */
#include "i386-cpuid.h"
diff --git a/gcc/testsuite/gcc.dg/20020531-1.c b/gcc/testsuite/gcc.dg/20020531-1.c
index 19f198fcac1..dfefc17c45a 100644
--- a/gcc/testsuite/gcc.dg/20020531-1.c
+++ b/gcc/testsuite/gcc.dg/20020531-1.c
@@ -1,7 +1,7 @@
/* PR optimization/6842
This testcase caused ICE when trying to optimize V8QI subreg of VOIDmode
CONST_DOUBLE. */
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O2 -mmmx" } */
typedef unsigned char __v8qi __attribute__ ((vector_size (8)));
diff --git a/gcc/testsuite/gcc.dg/20020616-1.c b/gcc/testsuite/gcc.dg/20020616-1.c
index 4630664d957..6db78425596 100644
--- a/gcc/testsuite/gcc.dg/20020616-1.c
+++ b/gcc/testsuite/gcc.dg/20020616-1.c
@@ -1,5 +1,5 @@
/* PR opt/6722 */
-/* { dg-do run { target i?86-*-* } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O2" } */
register int k asm("%ebx");
diff --git a/gcc/testsuite/gcc.dg/20020729-1.c b/gcc/testsuite/gcc.dg/20020729-1.c
index 929b5c361bd..eeab6985422 100644
--- a/gcc/testsuite/gcc.dg/20020729-1.c
+++ b/gcc/testsuite/gcc.dg/20020729-1.c
@@ -1,5 +1,5 @@
-/* { dg-do compile { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2 -march=k6" } */
static inline void *
diff --git a/gcc/testsuite/gcc.dg/20030204-1.c b/gcc/testsuite/gcc.dg/20030204-1.c
index 33a9eb229f9..0d4286c08cf 100644
--- a/gcc/testsuite/gcc.dg/20030204-1.c
+++ b/gcc/testsuite/gcc.dg/20030204-1.c
@@ -1,8 +1,9 @@
/* PR optimization/8555 */
/* { dg-do compile } */
/* { dg-options "-O -ffast-math -funroll-loops" } */
-/* { dg-options "-march=pentium3 -O -ffast-math -funroll-loops" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-march=pentium3 -O -ffast-math -funroll-loops" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-march=pentium3 -O -ffast-math -funroll-loops" { target { x86_64-*-* && ilp32 } } } */
+
float foo (float *a, int i)
{
diff --git a/gcc/testsuite/gcc.dg/20030826-2.c b/gcc/testsuite/gcc.dg/20030826-2.c
index e69c5346a26..6ad7e9a1292 100644
--- a/gcc/testsuite/gcc.dg/20030826-2.c
+++ b/gcc/testsuite/gcc.dg/20030826-2.c
@@ -1,7 +1,7 @@
/* { dg-do run } */
/* { dg-options "-O2 -fomit-frame-pointer" } */
-/* { dg-options "-O2 -fomit-frame-pointer -march=i386" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-O2 -fomit-frame-pointer -march=i386" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-O2 -fomit-frame-pointer -march=i386" { target { x86_64-*-* && ilp32 } } } */
extern void abort (void);
extern void exit (int);
diff --git a/gcc/testsuite/gcc.dg/20030926-1.c b/gcc/testsuite/gcc.dg/20030926-1.c
index 09931b378dd..866ebb808d5 100644
--- a/gcc/testsuite/gcc.dg/20030926-1.c
+++ b/gcc/testsuite/gcc.dg/20030926-1.c
@@ -1,8 +1,8 @@
/* PR optimization/11741 */
/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O2 -minline-all-stringops" } */
-/* { dg-options "-O2 -minline-all-stringops -march=pentium4" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-O2 -minline-all-stringops -march=pentium4" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-O2 -minline-all-stringops -march=pentium4" { target { x86_64-*-* && ilp32 } } } */
extern void *memcpy (void *, const void *, __SIZE_TYPE__);
extern __SIZE_TYPE__ strlen (const char *);
diff --git a/gcc/testsuite/gcc.dg/20031202-1.c b/gcc/testsuite/gcc.dg/20031202-1.c
index ac443a28425..4290f86889b 100644
--- a/gcc/testsuite/gcc.dg/20031202-1.c
+++ b/gcc/testsuite/gcc.dg/20031202-1.c
@@ -1,7 +1,7 @@
/* { dg-do run } */
/* { dg-options "-O2" } */
-/* { dg-options "-O2 -mtune=i686" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-O2 -mtune=i686" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-O2 -mtune=i686" { target { x86_64-*-* && ilp32 } } } */
extern void abort (void);
extern void exit (int);
diff --git a/gcc/testsuite/gcc.dg/20050524-1.c b/gcc/testsuite/gcc.dg/20050524-1.c
new file mode 100644
index 00000000000..f15c51d628a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20050524-1.c
@@ -0,0 +1,34 @@
+/* This test case used to abort due to a reload bug with
+ elimination offsets. */
+
+/* { dg-do run { target s390*-*-* } } */
+/* { dg-options "-O2 -mpacked-stack" } */
+
+extern void abort (void);
+
+double bar (double) __attribute__ ((noinline));
+double bar (double x) { return x; }
+
+double
+foo (int j, double f0, double f2, double f4, double f6, double x) __attribute__ ((noinline));
+
+double
+foo (int j, double f0, double f2, double f4, double f6, double x)
+{
+ if (j)
+ return bar (x) + 4.0;
+ else
+ return bar (x);
+}
+
+int
+main (void)
+{
+ if (foo (0, 0, 0, 0, 0, 10) != 10)
+ abort ();
+ if (foo (1, 0, 0, 0, 0, 10) != 14)
+ abort ();
+
+ return 0;
+}
+
diff --git a/gcc/testsuite/gcc.dg/20050527-1.c b/gcc/testsuite/gcc.dg/20050527-1.c
new file mode 100644
index 00000000000..1b32324471f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20050527-1.c
@@ -0,0 +1,55 @@
+/* PR c/21536 */
+/* { dg-do run } */
+/* { dg-options "-O2 -Wuninitialized" } */
+
+typedef __SIZE_TYPE__ size_t;
+extern void *malloc (size_t);
+extern void free (void *);
+
+void *
+foo (int x, int y)
+{
+ void *d = malloc (x * y * sizeof (double));
+ double (*e)[x][y] = d;
+ x += 10;
+ y += 10;
+ if (x > 18)
+ (*e)[x - 12][y - 12] = 0.0;
+ else
+ (*e)[x - 11][y - 11] = 1.0;
+ return d;
+}
+
+void *
+bar (int x, int y)
+{
+ void *d = malloc (x * y * sizeof (double));
+ struct S
+ {
+ double (*e)[x][y];
+ double (*f)[x][y];
+ } s;
+ s.e = d;
+ s.f = d;
+ x += 10;
+ y += 10;
+ if (x > 18)
+ (*s.e)[x - 12][y - 12] = 0.0;
+ else
+ (*s.e)[x - 11][y - 11] = 1.0;
+ if (x > 16)
+ (*s.f)[x - 13][y - 13] = 0.0;
+ else
+ (*s.f)[x - 14][y - 14] = 1.0;
+ return d;
+}
+
+int
+main ()
+{
+ void *d1 = foo (10, 10);
+ void *d2 = bar (10, 10);
+ free (d1);
+ free (d2);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/20050603-1.c b/gcc/testsuite/gcc.dg/20050603-1.c
new file mode 100644
index 00000000000..041551ba5ae
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20050603-1.c
@@ -0,0 +1,24 @@
+/* { dg-do run { target powerpc*-*-* } } */
+/* { dg-options "-O2" } */
+#include <locale.h>
+#include <stdlib.h>
+register int *testreg asm ("r29");
+
+int x;
+int y;
+int *ext_func (int *p) { return p; }
+
+void test_reg_save_restore (int*) __attribute__((noinline));
+void
+test_reg_save_restore (int *p)
+{
+ setlocale (LC_ALL, "C");
+ testreg = ext_func(p);
+}
+main() {
+ testreg = &x;
+ test_reg_save_restore (&y);
+ if (testreg != &y)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/20050603-2.c b/gcc/testsuite/gcc.dg/20050603-2.c
new file mode 100644
index 00000000000..363e3cdf35c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20050603-2.c
@@ -0,0 +1,21 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+#include <stdlib.h>
+struct s {
+ unsigned short f: 16;
+ unsigned short y: 8;
+ unsigned short g: 2;
+ unsigned int x;
+};
+
+void set (struct s*, int) __attribute__((noinline));
+void set (struct s* p, int flags) {
+ p->g = flags << 1;
+}
+main() {
+ struct s foo = {0 , 0, 3, 0};
+ set (&foo, -1);
+ if (foo.g != 2)
+ abort();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/20050603-3.c b/gcc/testsuite/gcc.dg/20050603-3.c
new file mode 100644
index 00000000000..35be6602155
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20050603-3.c
@@ -0,0 +1,15 @@
+/* { dg-do compile { target "powerpc-*-*" } } */
+/* { dg-options "-O2" } */
+struct Q
+{
+ long x:20;
+ long y:4;
+ long z:8;
+}b;
+/* This should generate a single rl[w]imi. */
+void rotins (unsigned int x)
+{
+ b.y = (x<<12) | (x>>20);
+}
+
+/* { dg-final { scan-assembler-not "inm" } } */
diff --git a/gcc/testsuite/gcc.dg/20050607-1.c b/gcc/testsuite/gcc.dg/20050607-1.c
new file mode 100644
index 00000000000..18cbf45919c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20050607-1.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-Wpadded" }
+/* The struct internally constructed for the nested function should
+ not result in a warning from -Wpadded. */
+extern int baz(int (*) (int));
+int foo(void)
+{
+ int k = 3;
+ int bar(int x) {
+ return x + k;
+ }
+ return baz(bar);
+}
diff --git a/gcc/testsuite/gcc.dg/980226-1.c b/gcc/testsuite/gcc.dg/980226-1.c
index f9d915f22d4..52ff614ed3a 100644
--- a/gcc/testsuite/gcc.dg/980226-1.c
+++ b/gcc/testsuite/gcc.dg/980226-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options -O2 } */
extern int printf (const char *, ...);
diff --git a/gcc/testsuite/gcc.dg/980312-1.c b/gcc/testsuite/gcc.dg/980312-1.c
index 83f1488745a..edf3cf5d79d 100644
--- a/gcc/testsuite/gcc.dg/980312-1.c
+++ b/gcc/testsuite/gcc.dg/980312-1.c
@@ -1,5 +1,5 @@
-/* { dg-do link { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do link { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2 -march=pentiumpro" } */
extern __inline double
diff --git a/gcc/testsuite/gcc.dg/980313-1.c b/gcc/testsuite/gcc.dg/980313-1.c
index 75566222116..889654fc792 100644
--- a/gcc/testsuite/gcc.dg/980313-1.c
+++ b/gcc/testsuite/gcc.dg/980313-1.c
@@ -1,5 +1,5 @@
-/* { dg-do link { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do link { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2 -march=pentiumpro" } */
extern __inline double
diff --git a/gcc/testsuite/gcc.dg/980414-1.c b/gcc/testsuite/gcc.dg/980414-1.c
index 59382ef2c49..e179c8137c0 100644
--- a/gcc/testsuite/gcc.dg/980414-1.c
+++ b/gcc/testsuite/gcc.dg/980414-1.c
@@ -1,6 +1,6 @@
/* Test double on x86. */
-/* { 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/980520-1.c b/gcc/testsuite/gcc.dg/980520-1.c
index e1401824f54..b11f0d3a893 100644
--- a/gcc/testsuite/gcc.dg/980520-1.c
+++ b/gcc/testsuite/gcc.dg/980520-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options -O2 } */
int bug(void)
diff --git a/gcc/testsuite/gcc.dg/980709-1.c b/gcc/testsuite/gcc.dg/980709-1.c
index a4359300587..01b6bfe358e 100644
--- a/gcc/testsuite/gcc.dg/980709-1.c
+++ b/gcc/testsuite/gcc.dg/980709-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options -O2 } */
extern __inline__ int test_and_set_bit(int nr, volatile void * addr)
diff --git a/gcc/testsuite/gcc.dg/990117-1.c b/gcc/testsuite/gcc.dg/990117-1.c
index 6d71787f305..24c56f2febf 100644
--- a/gcc/testsuite/gcc.dg/990117-1.c
+++ b/gcc/testsuite/gcc.dg/990117-1.c
@@ -1,5 +1,5 @@
-/* { dg-do compile { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2 -march=pentiumpro" } */
extern __inline double
diff --git a/gcc/testsuite/gcc.dg/990130-1.c b/gcc/testsuite/gcc.dg/990130-1.c
index 3e711c2febb..57e046b22a6 100644
--- a/gcc/testsuite/gcc.dg/990130-1.c
+++ b/gcc/testsuite/gcc.dg/990130-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options -O0 } */
typedef int SItype __attribute__ ((mode (SI)));
diff --git a/gcc/testsuite/gcc.dg/990213-2.c b/gcc/testsuite/gcc.dg/990213-2.c
index a0a13b560f9..d095e3723f9 100644
--- a/gcc/testsuite/gcc.dg/990213-2.c
+++ b/gcc/testsuite/gcc.dg/990213-2.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-fPIC" } */
struct normal_encoding {};
diff --git a/gcc/testsuite/gcc.dg/990214-1.c b/gcc/testsuite/gcc.dg/990214-1.c
index 7ad81b6b90b..b3cb519a471 100644
--- a/gcc/testsuite/gcc.dg/990214-1.c
+++ b/gcc/testsuite/gcc.dg/990214-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-fPIC" } */
typedef int int64_t __attribute__ ((__mode__ ( __DI__ ))) ;
diff --git a/gcc/testsuite/gcc.dg/990424-1.c b/gcc/testsuite/gcc.dg/990424-1.c
index d479754a9ef..5b5af818076 100644
--- a/gcc/testsuite/gcc.dg/990424-1.c
+++ b/gcc/testsuite/gcc.dg/990424-1.c
@@ -1,8 +1,8 @@
/* Test that stack alignment is preserved with pending_stack_adjust
with stdcall functions. */
-/* { dg-do run { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options -mpreferred-stack-boundary=4 } */
void __attribute__((stdcall)) foo(int a, int b, int c);
diff --git a/gcc/testsuite/gcc.dg/990524-1.c b/gcc/testsuite/gcc.dg/990524-1.c
index 203c1dd452d..ee4ebd62671 100644
--- a/gcc/testsuite/gcc.dg/990524-1.c
+++ b/gcc/testsuite/gcc.dg/990524-1.c
@@ -1,5 +1,5 @@
-/* { dg-do compile { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2 -march=pentiumpro" } */
typedef struct t_anim_info {
diff --git a/gcc/testsuite/gcc.dg/991129-1.c b/gcc/testsuite/gcc.dg/991129-1.c
index 24faefddaff..489b7f987fa 100644
--- a/gcc/testsuite/gcc.dg/991129-1.c
+++ b/gcc/testsuite/gcc.dg/991129-1.c
@@ -1,6 +1,6 @@
/* Test against a problem in push_reload. */
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
/* { dg-options "-O2" } */
unsigned long foo (unsigned long long x, unsigned long y)
diff --git a/gcc/testsuite/gcc.dg/991209-1.c b/gcc/testsuite/gcc.dg/991209-1.c
index 2381922c660..ab455da098d 100644
--- a/gcc/testsuite/gcc.dg/991209-1.c
+++ b/gcc/testsuite/gcc.dg/991209-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
/* { dg-options "-ansi -pedantic" } */
int foo ()
diff --git a/gcc/testsuite/gcc.dg/991214-1.c b/gcc/testsuite/gcc.dg/991214-1.c
index 68b6b927916..cfe3a9a4121 100644
--- a/gcc/testsuite/gcc.dg/991214-1.c
+++ b/gcc/testsuite/gcc.dg/991214-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
/* { dg-options "-O2" } */
/* Test against a problem with the combiner substituting explicit hard reg
diff --git a/gcc/testsuite/gcc.dg/991230-1.c b/gcc/testsuite/gcc.dg/991230-1.c
index 1cb66f5c379..b87d0e2e3cb 100644
--- a/gcc/testsuite/gcc.dg/991230-1.c
+++ b/gcc/testsuite/gcc.dg/991230-1.c
@@ -1,5 +1,5 @@
-/* { dg-do run { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O -ffast-math -mtune=i486" } */
/* Test that floating point greater-than tests are compiled correctly with
diff --git a/gcc/testsuite/gcc.dg/Wattributes-1.c b/gcc/testsuite/gcc.dg/Wattributes-1.c
new file mode 100644
index 00000000000..29e07e41275
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wattributes-1.c
@@ -0,0 +1,6 @@
+/* { dg-do compile } */
+/* { dg-options -Wattributes } */
+
+void __attribute__((dj)) foo() { } /* { dg-warning "attribute directive ignored" } */
+
+int j __attribute__((unrecognized)); /* { dg-warning "attribute directive ignored" } */
diff --git a/gcc/testsuite/gcc.dg/Wattributes-2.c b/gcc/testsuite/gcc.dg/Wattributes-2.c
new file mode 100644
index 00000000000..6918704202d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wattributes-2.c
@@ -0,0 +1,6 @@
+/* { dg-do compile } */
+/* { dg-options -Wno-attributes } */
+
+void __attribute__((dj)) foo() { } /* { dg-bogus "attribute directive ignored" } */
+
+int j __attribute__((unrecognized)); /* { dg-bogus "attribute directive ignored" } */
diff --git a/gcc/testsuite/gcc.dg/Wattributes-3.c b/gcc/testsuite/gcc.dg/Wattributes-3.c
new file mode 100644
index 00000000000..59d14c7b926
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wattributes-3.c
@@ -0,0 +1,5 @@
+/* { dg-do compile } */
+
+void __attribute__((dj)) foo() { } /* { dg-warning "attribute directive ignored" } */
+
+int j __attribute__((unrecognized)); /* { dg-warning "attribute directive ignored" } */
diff --git a/gcc/testsuite/gcc.dg/Wcxx-compat-1.c b/gcc/testsuite/gcc.dg/Wcxx-compat-1.c
new file mode 100644
index 00000000000..91500421e85
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wcxx-compat-1.c
@@ -0,0 +1,11 @@
+/* PR c/21759 */
+/* { dg-options "-Wc++-compat" } */
+
+int
+main(void)
+{
+ void *p = 0;
+ int *q = p; /* { dg-warning "not permitted" } */
+ double* t = (void *)0;
+ return p != q;
+}
diff --git a/gcc/testsuite/gcc.dg/alias-8.c b/gcc/testsuite/gcc.dg/alias-8.c
new file mode 100644
index 00000000000..690f1b62da9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/alias-8.c
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-Wstrict-aliasing=2 -fstrict-aliasing" }
+
+struct s {
+ char *p;
+};
+
+void
+func(struct s *ptr)
+{
+ *(void **)&ptr->p = 0; /* { dg-warning "type-punned pointer" } */
+}
diff --git a/gcc/testsuite/gcc.dg/ppc-vec-merge.c b/gcc/testsuite/gcc.dg/altivec-vec-merge.c
index 9eef9847a82..19a682facea 100644
--- a/gcc/testsuite/gcc.dg/ppc-vec-merge.c
+++ b/gcc/testsuite/gcc.dg/altivec-vec-merge.c
@@ -1,5 +1,8 @@
/* { dg-do run { target powerpc*-*-* } } */
-/* { dg-options "-faltivec -O2" } */
+/* { dg-options "-maltivec -O2" } */
+
+#include <altivec.h>
+#include "altivec_check.h"
int printf(const char * , ...);
extern void abort();
@@ -595,6 +598,8 @@ if (1){
int main(int argc, char **argv)
{
char toto[32] __attribute__((aligned(16)));
+
+ altivec_check (); /* Exit if hardware doesn't support AltiVec. */
foo(toto, toto, 0, 0);
return 0;
}
diff --git a/gcc/testsuite/gcc.dg/asm-1.c b/gcc/testsuite/gcc.dg/asm-1.c
index 1f509422e97..ac4b6be4b10 100644
--- a/gcc/testsuite/gcc.dg/asm-1.c
+++ b/gcc/testsuite/gcc.dg/asm-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
struct x {
int selector;
diff --git a/gcc/testsuite/gcc.dg/attr-returns_twice-1.c b/gcc/testsuite/gcc.dg/attr-returns_twice-1.c
index 9d3f6f10997..9eb082f4b03 100644
--- a/gcc/testsuite/gcc.dg/attr-returns_twice-1.c
+++ b/gcc/testsuite/gcc.dg/attr-returns_twice-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-W" } */
int newsetjmp(void) __attribute__((returns_twice));
diff --git a/gcc/testsuite/gcc.dg/builtins-1.c b/gcc/testsuite/gcc.dg/builtins-1.c
index 74144f7befa..640576a50a7 100644
--- a/gcc/testsuite/gcc.dg/builtins-1.c
+++ b/gcc/testsuite/gcc.dg/builtins-1.c
@@ -190,7 +190,7 @@ CPTEST1 (ccos)
CPTEST1 (ccosh)
CPTEST1 (cexp)
CPTEST1RETFP (cimag)
-/*CPTEST1 (clog)*/
+CPTEST1 (clog)
CPTEST1 (conj)
CPTEST2 (cpow)
CPTEST1 (cproj)
diff --git a/gcc/testsuite/gcc.dg/c99-math-double-1.c b/gcc/testsuite/gcc.dg/c99-math-double-1.c
index 227b6e26cac..54bdf60dfe7 100644
--- a/gcc/testsuite/gcc.dg/c99-math-double-1.c
+++ b/gcc/testsuite/gcc.dg/c99-math-double-1.c
@@ -1,18 +1,18 @@
-/* { dg-do run { target *-*-solaris2.1[0-9]* } } */
-/* { dg-options "-std=c99 -O" } */
-
-#include <math.h>
-#include "c99-math.h"
-
-int main(void)
-{
- double nan = NAN;
- double inf = INFINITY;
- double huge = HUGE_VAL;
- double norm = __DBL_MIN__;
- double zero = 0.0;
-
- C99_MATH_TESTS (nan, inf, huge, norm, zero)
-
- return 0;
-}
+/* { dg-do run { target *-*-solaris2.1[0-9]* } } */
+/* { dg-options "-std=c99 -O" } */
+
+#include <math.h>
+#include "c99-math.h"
+
+int main(void)
+{
+ double nan = NAN;
+ double inf = INFINITY;
+ double huge = HUGE_VAL;
+ double norm = __DBL_MIN__;
+ double zero = 0.0;
+
+ C99_MATH_TESTS (nan, inf, huge, norm, zero)
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/c99-math-float-1.c b/gcc/testsuite/gcc.dg/c99-math-float-1.c
index 9dd4e9a0483..ba27a710bde 100644
--- a/gcc/testsuite/gcc.dg/c99-math-float-1.c
+++ b/gcc/testsuite/gcc.dg/c99-math-float-1.c
@@ -1,18 +1,18 @@
-/* { dg-do run { target *-*-solaris2.1[0-9]* } } */
-/* { dg-options "-std=c99 -O" } */
-
-#include <math.h>
-#include "c99-math.h"
-
-int main(void)
-{
- float nan = NAN;
- float inf = INFINITY;
- float huge = HUGE_VALF;
- float norm = __FLT_MIN__;
- float zero = 0.0f;
-
- C99_MATH_TESTS (nan, inf, huge, norm, zero)
-
- return 0;
-}
+/* { dg-do run { target *-*-solaris2.1[0-9]* } } */
+/* { dg-options "-std=c99 -O" } */
+
+#include <math.h>
+#include "c99-math.h"
+
+int main(void)
+{
+ float nan = NAN;
+ float inf = INFINITY;
+ float huge = HUGE_VALF;
+ float norm = __FLT_MIN__;
+ float zero = 0.0f;
+
+ C99_MATH_TESTS (nan, inf, huge, norm, zero)
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/c99-math-long-double-1.c b/gcc/testsuite/gcc.dg/c99-math-long-double-1.c
index 43d15885473..a8fa4d21fc1 100644
--- a/gcc/testsuite/gcc.dg/c99-math-long-double-1.c
+++ b/gcc/testsuite/gcc.dg/c99-math-long-double-1.c
@@ -1,18 +1,18 @@
-/* { dg-do run { target *-*-solaris2.1[0-9]* } } */
-/* { dg-options "-std=c99 -O" } */
-
-#include <math.h>
-#include "c99-math.h"
-
-int main(void)
-{
- long double nan = NAN;
- long double inf = INFINITY;
- long double huge = HUGE_VALL;
- long double norm = __LDBL_MIN__;
- long double zero = 0.0l;
-
- C99_MATH_TESTS (nan, inf, huge, norm, zero)
-
- return 0;
-}
+/* { dg-do run { target *-*-solaris2.1[0-9]* } } */
+/* { dg-options "-std=c99 -O" } */
+
+#include <math.h>
+#include "c99-math.h"
+
+int main(void)
+{
+ long double nan = NAN;
+ long double inf = INFINITY;
+ long double huge = HUGE_VALL;
+ long double norm = __LDBL_MIN__;
+ long double zero = 0.0l;
+
+ C99_MATH_TESTS (nan, inf, huge, norm, zero)
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/c99-math.h b/gcc/testsuite/gcc.dg/c99-math.h
index a1e217c8ef3..3f42f67319d 100644
--- a/gcc/testsuite/gcc.dg/c99-math.h
+++ b/gcc/testsuite/gcc.dg/c99-math.h
@@ -1,111 +1,111 @@
-#include <math.h>
-
-extern void abort(void);
-
-#define C99_MATH_TESTS(nan, inf, huge, norm, zero) \
-{ \
- if (fpclassify (nan) != FP_NAN) \
- abort (); \
- \
- if (fpclassify (inf) != FP_INFINITE) \
- abort (); \
- \
- if (fpclassify (huge) != FP_INFINITE) \
- abort (); \
- \
- if (fpclassify (norm) != FP_NORMAL) \
- abort (); \
- \
- if (fpclassify (zero) != FP_ZERO) \
- abort (); \
- \
- \
- if (!isnan (nan)) \
- abort (); \
- \
- if (isnan (inf)) \
- abort (); \
- \
- if (isnan (huge)) \
- abort (); \
- \
- if (isnan (norm)) \
- abort (); \
- \
- if (isnan (zero)) \
- abort (); \
- \
- \
- if (isinf (nan)) \
- abort (); \
- \
- if (!isinf (inf)) \
- abort (); \
- \
- if (!isinf (huge)) \
- abort (); \
- \
- if (isnan (norm)) \
- abort (); \
- \
- if (isinf (zero)) \
- abort (); \
- \
- \
- if (isfinite (nan)) \
- abort (); \
- \
- if (isfinite (inf)) \
- abort (); \
- \
- if (isfinite (huge)) \
- abort (); \
- \
- if (!isfinite (norm)) \
- abort (); \
- \
- if (!isfinite (zero)) \
- abort (); \
- \
- \
- if (isnormal (nan)) \
- abort (); \
- \
- if (isnormal (inf)) \
- abort (); \
- \
- if (isnormal (huge)) \
- abort (); \
- \
- if (!isnormal (norm)) \
- abort (); \
- \
- if (isnormal (zero)) \
- abort (); \
- \
- \
- if (signbit (norm)) \
- abort (); \
- \
- if (!signbit (-(norm))) \
- abort (); \
- \
- \
- if (!isgreater ((inf), (norm))) \
- abort (); \
- \
- if (!isgreaterequal ((inf), (huge))) \
- abort (); \
- \
- if (!isless ((norm), (inf))) \
- abort (); \
- \
- if (!islessequal ((huge), (inf))) \
- abort (); \
- \
- if (!islessgreater ((inf), (norm))) \
- abort (); \
- \
- if (!isunordered ((nan), (norm))) \
- abort (); \
-}
+#include <math.h>
+
+extern void abort(void);
+
+#define C99_MATH_TESTS(nan, inf, huge, norm, zero) \
+{ \
+ if (fpclassify (nan) != FP_NAN) \
+ abort (); \
+ \
+ if (fpclassify (inf) != FP_INFINITE) \
+ abort (); \
+ \
+ if (fpclassify (huge) != FP_INFINITE) \
+ abort (); \
+ \
+ if (fpclassify (norm) != FP_NORMAL) \
+ abort (); \
+ \
+ if (fpclassify (zero) != FP_ZERO) \
+ abort (); \
+ \
+ \
+ if (!isnan (nan)) \
+ abort (); \
+ \
+ if (isnan (inf)) \
+ abort (); \
+ \
+ if (isnan (huge)) \
+ abort (); \
+ \
+ if (isnan (norm)) \
+ abort (); \
+ \
+ if (isnan (zero)) \
+ abort (); \
+ \
+ \
+ if (isinf (nan)) \
+ abort (); \
+ \
+ if (!isinf (inf)) \
+ abort (); \
+ \
+ if (!isinf (huge)) \
+ abort (); \
+ \
+ if (isnan (norm)) \
+ abort (); \
+ \
+ if (isinf (zero)) \
+ abort (); \
+ \
+ \
+ if (isfinite (nan)) \
+ abort (); \
+ \
+ if (isfinite (inf)) \
+ abort (); \
+ \
+ if (isfinite (huge)) \
+ abort (); \
+ \
+ if (!isfinite (norm)) \
+ abort (); \
+ \
+ if (!isfinite (zero)) \
+ abort (); \
+ \
+ \
+ if (isnormal (nan)) \
+ abort (); \
+ \
+ if (isnormal (inf)) \
+ abort (); \
+ \
+ if (isnormal (huge)) \
+ abort (); \
+ \
+ if (!isnormal (norm)) \
+ abort (); \
+ \
+ if (isnormal (zero)) \
+ abort (); \
+ \
+ \
+ if (signbit (norm)) \
+ abort (); \
+ \
+ if (!signbit (-(norm))) \
+ abort (); \
+ \
+ \
+ if (!isgreater ((inf), (norm))) \
+ abort (); \
+ \
+ if (!isgreaterequal ((inf), (huge))) \
+ abort (); \
+ \
+ if (!isless ((norm), (inf))) \
+ abort (); \
+ \
+ if (!islessequal ((huge), (inf))) \
+ abort (); \
+ \
+ if (!islessgreater ((inf), (norm))) \
+ abort (); \
+ \
+ if (!isunordered ((nan), (norm))) \
+ abort (); \
+}
diff --git a/gcc/testsuite/gcc.dg/charset/asm3.c b/gcc/testsuite/gcc.dg/charset/asm3.c
index 8ae2212fd26..842bd5cfcfa 100644
--- a/gcc/testsuite/gcc.dg/charset/asm3.c
+++ b/gcc/testsuite/gcc.dg/charset/asm3.c
@@ -1,6 +1,6 @@
/* Test for complex asm statements. Make sure it compiles
then test for some of the asm statements not being translated. */
-/* { dg-do compile { target i?86-*-* } }
+/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } }
{ dg-require-iconv "IBM1047" }
{ dg-final { scan-assembler "std" } }
{ dg-final { scan-assembler "cld" } }
diff --git a/gcc/testsuite/gcc.dg/clobbers.c b/gcc/testsuite/gcc.dg/clobbers.c
index 474a396a051..44c46b0bf02 100644
--- a/gcc/testsuite/gcc.dg/clobbers.c
+++ b/gcc/testsuite/gcc.dg/clobbers.c
@@ -1,6 +1,6 @@
/* Test asm clobbers on x86. */
-/* { dg-do run { target i?86-*-* } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
extern void abort (void);
diff --git a/gcc/testsuite/gcc.dg/const-compare.c b/gcc/testsuite/gcc.dg/const-compare.c
new file mode 100644
index 00000000000..d9c1b77f22b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/const-compare.c
@@ -0,0 +1,29 @@
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-m64 -O1 -static" } */
+typedef unsigned long long uint64_t;
+
+static int
+match(name, pat)
+ uint64_t *name, *pat;
+{
+ int ok=0, negate_range;
+ uint64_t c, k;
+
+ c = *pat++;
+ switch (c & 0xffffffffffULL) {
+ case ((uint64_t)(('[')|0x8000000000ULL)):
+ if ((negate_range = ((*pat & 0xffffffffffULL) == ((uint64_t)(('!')|0x8000000000ULL)) )) != '\0')
+ ++pat;
+ while (((c = *pat++) & 0xffffffffffULL) )
+ if ((*pat & 0xffffffffffULL) == ((uint64_t)(('-')|0x8000000000ULL)))
+ {
+ pat += 2;
+ }
+
+ if (ok == negate_range)
+ return(0);
+ break;
+ }
+ return(*name == '\0');
+}
+
diff --git a/gcc/testsuite/gcc.dg/const-elim-1.c b/gcc/testsuite/gcc.dg/const-elim-1.c
index bbfab37f0a4..c9c57a2784d 100644
--- a/gcc/testsuite/gcc.dg/const-elim-1.c
+++ b/gcc/testsuite/gcc.dg/const-elim-1.c
@@ -7,13 +7,7 @@
/* { dg-do compile } */
/* { dg-options "-O2 -std=c99" } */
-/* This test fails on all processors where we use a block move to
- initialize "S" in test2. The RTL optimizers are not clever enough
- to eliminate the block move, so the constant gets emitted.
- Currently known targets with this problem: all ARM; PA32 ("hppa*.*"
- matches "hppa2.0w" but not "hppa64"); PPC if string instructions
- are enabled (notably under AIX). */
-/* { dg-final { scan-assembler-not "L\\\$?C\[^A-Z\]" { xfail arm-*-* strongarm-*-* xscale-*-* hppa-*-* hppa*.*-*-* powerpc*-*-aix* } } } */
+/* { dg-final { scan-assembler-not "L\\\$?C\[^A-Z\]" } } */
#define I (__extension__ 1.0iF)
diff --git a/gcc/testsuite/gcc.dg/cpp/trad/num-sign.c b/gcc/testsuite/gcc.dg/cpp/trad/num-sign.c
index 7522bbf41e2..64f12c07211 100644
--- a/gcc/testsuite/gcc.dg/cpp/trad/num-sign.c
+++ b/gcc/testsuite/gcc.dg/cpp/trad/num-sign.c
@@ -1,6 +1,6 @@
/* Copyright (C) 2001 Free Software Foundation, Inc. */
-/* { dg-do preprocess { target i?86-*-* } } */
+/* { dg-do preprocess { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
/* Tests that traditional numbers are signed, unless otherwise
specified. This test assumes a 32 bit target.
diff --git a/gcc/testsuite/gcc.dg/format/cmn-err-1.c b/gcc/testsuite/gcc.dg/format/cmn-err-1.c
index 3fb2fd2ff46..5da83c45129 100644
--- a/gcc/testsuite/gcc.dg/format/cmn-err-1.c
+++ b/gcc/testsuite/gcc.dg/format/cmn-err-1.c
@@ -25,6 +25,7 @@ int main()
ll, ll, ll, ll, ll, ll, ll);
cmn_err_func (0, "%b %s", i, "\01Foo", string);
cmn_err_func (0, "%p", string);
+ cmn_err_func (0, "%16b", i, "\01Foo");
cmn_err_func (0, "%i", i); /* { dg-error "unknown|too many" } */
cmn_err_func (0, "%d", l); /* { dg-error "expects type" } */
diff --git a/gcc/testsuite/gcc.dg/i386-387-1.c b/gcc/testsuite/gcc.dg/i386-387-1.c
index 7be1ba34aaa..9b31dcaed55 100644
--- a/gcc/testsuite/gcc.dg/i386-387-1.c
+++ b/gcc/testsuite/gcc.dg/i386-387-1.c
@@ -1,6 +1,6 @@
/* Verify that -mno-fancy-math-387 works. */
-/* { dg-do compile { target "i?86-*-*" } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O -ffast-math -mfpmath=387 -mno-fancy-math-387 -march=i386" } */
/* { dg-final { scan-assembler "call\t_?sin" } } */
/* { dg-final { scan-assembler "call\t_?cos" } } */
diff --git a/gcc/testsuite/gcc.dg/i386-387-2.c b/gcc/testsuite/gcc.dg/i386-387-2.c
index ebbe619df36..7358866eceb 100644
--- a/gcc/testsuite/gcc.dg/i386-387-2.c
+++ b/gcc/testsuite/gcc.dg/i386-387-2.c
@@ -1,6 +1,6 @@
/* Verify that -march overrides -mno-fancy-math-387. */
-/* { dg-do compile { target "i?86-*-*" } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O -ffast-math -mfpmath=387 -march=i686 -mno-fancy-math-387" } */
/* { dg-final { scan-assembler "fsin" } } */
/* { dg-final { scan-assembler "fcos" } } */
diff --git a/gcc/testsuite/gcc.dg/i386-387-3.c b/gcc/testsuite/gcc.dg/i386-387-3.c
index b68928a1adf..ed80f78187d 100644
--- a/gcc/testsuite/gcc.dg/i386-387-3.c
+++ b/gcc/testsuite/gcc.dg/i386-387-3.c
@@ -1,6 +1,6 @@
/* Verify that 387 mathematical constants are recognized. */
-/* { dg-do compile { target "i?86-*-*" } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2 -march=i686" } */
/* { dg-final { scan-assembler "fldpi" } } */
diff --git a/gcc/testsuite/gcc.dg/i386-387-4.c b/gcc/testsuite/gcc.dg/i386-387-4.c
index dbe340ca4b6..55398275570 100644
--- a/gcc/testsuite/gcc.dg/i386-387-4.c
+++ b/gcc/testsuite/gcc.dg/i386-387-4.c
@@ -1,5 +1,5 @@
-/* { dg-do compile { target "i?86-*-*" } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2 -march=i686" } */
/* { dg-final { scan-assembler "fldpi" } } */
diff --git a/gcc/testsuite/gcc.dg/i386-387-5.c b/gcc/testsuite/gcc.dg/i386-387-5.c
index d438b254db9..fd3106e0270 100644
--- a/gcc/testsuite/gcc.dg/i386-387-5.c
+++ b/gcc/testsuite/gcc.dg/i386-387-5.c
@@ -1,6 +1,6 @@
/* Verify that -mno-fancy-math-387 works. */
-/* { dg-do compile { target "i?86-*-*" } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O -ffast-math -mfpmath=387 -mno-fancy-math-387 -march=i386" } */
/* { dg-final { scan-assembler "call\t_?atan" } } */
/* { dg-final { scan-assembler "call\t_?log1p" } } */
diff --git a/gcc/testsuite/gcc.dg/i386-387-6.c b/gcc/testsuite/gcc.dg/i386-387-6.c
index ab6412b7aff..b3ad64dac48 100644
--- a/gcc/testsuite/gcc.dg/i386-387-6.c
+++ b/gcc/testsuite/gcc.dg/i386-387-6.c
@@ -1,6 +1,6 @@
/* Verify that -march overrides -mno-fancy-math-387. */
-/* { dg-do compile { target "i?86-*-*" } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O -ffast-math -mfpmath=387 -march=i686 -mno-fancy-math-387" } */
/* { dg-final { scan-assembler "fpatan" } } */
/* { dg-final { scan-assembler "fyl2xp1" } } */
diff --git a/gcc/testsuite/gcc.dg/i386-387-7.c b/gcc/testsuite/gcc.dg/i386-387-7.c
index 1a40cd719d8..edcdac1ae3f 100644
--- a/gcc/testsuite/gcc.dg/i386-387-7.c
+++ b/gcc/testsuite/gcc.dg/i386-387-7.c
@@ -1,5 +1,5 @@
/* Verify that 387 fsincos instruction is generated. */
-/* { dg-do compile { target "i?86-*-*" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O -ffast-math -march=i686" } */
/* { dg-final { scan-assembler "fsincos" } } */
diff --git a/gcc/testsuite/gcc.dg/i386-387-8.c b/gcc/testsuite/gcc.dg/i386-387-8.c
index 67c16d92c18..6af895998d0 100644
--- a/gcc/testsuite/gcc.dg/i386-387-8.c
+++ b/gcc/testsuite/gcc.dg/i386-387-8.c
@@ -1,6 +1,7 @@
/* Verify that 387 fptan instruction is generated. Also check fptan
peephole2 optimizer. */
-/* { dg-do compile { target "i?86-*-*" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2 -ffast-math -march=i686" } */
/* { dg-final { scan-assembler "fptan" } } */
/* { dg-final { scan-assembler-not "fld1" } } */
diff --git a/gcc/testsuite/gcc.dg/i386-3dnowA-1.c b/gcc/testsuite/gcc.dg/i386-3dnowA-1.c
index b5327b3d9ec..80209b00c29 100644
--- a/gcc/testsuite/gcc.dg/i386-3dnowA-1.c
+++ b/gcc/testsuite/gcc.dg/i386-3dnowA-1.c
@@ -1,4 +1,4 @@
-/* { dg-do assemble { target i?86-*-* } } */
+/* { dg-do assemble { target i?86-*-* x86_64-*-* } } */
/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2 -Werror-implicit-function-declaration -m3dnow -march=athlon" } */
diff --git a/gcc/testsuite/gcc.dg/i386-3dnowA-2.c b/gcc/testsuite/gcc.dg/i386-3dnowA-2.c
index ea336af4147..0cce3b1318c 100644
--- a/gcc/testsuite/gcc.dg/i386-3dnowA-2.c
+++ b/gcc/testsuite/gcc.dg/i386-3dnowA-2.c
@@ -1,4 +1,4 @@
-/* { dg-do assemble { target i?86-*-* } } */
+/* { dg-do assemble { target i?86-*-* x86_64-*-* } } */
/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O0 -Werror-implicit-function-declaration -m3dnow -march=athlon" } */
diff --git a/gcc/testsuite/gcc.dg/i386-asm-1.c b/gcc/testsuite/gcc.dg/i386-asm-1.c
index a23e0a09298..e871dd9343f 100644
--- a/gcc/testsuite/gcc.dg/i386-asm-1.c
+++ b/gcc/testsuite/gcc.dg/i386-asm-1.c
@@ -1,6 +1,6 @@
/* PR inline-asm/11676 */
-/* { dg-do run { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2" } */
extern void abort (void);
diff --git a/gcc/testsuite/gcc.dg/i386-asm-2.c b/gcc/testsuite/gcc.dg/i386-asm-2.c
index e143ea36978..7e9ecb7797d 100644
--- a/gcc/testsuite/gcc.dg/i386-asm-2.c
+++ b/gcc/testsuite/gcc.dg/i386-asm-2.c
@@ -1,5 +1,6 @@
/* PR opt/13862 */
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O" } */
typedef struct _fame_syntax_t_ {
diff --git a/gcc/testsuite/gcc.dg/i386-asm-3.c b/gcc/testsuite/gcc.dg/i386-asm-3.c
index f60f7d6378a..19bf1534521 100644
--- a/gcc/testsuite/gcc.dg/i386-asm-3.c
+++ b/gcc/testsuite/gcc.dg/i386-asm-3.c
@@ -1,5 +1,5 @@
/* PR inline-asm/6806 */
-/* { 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/i386-bitfield1.c b/gcc/testsuite/gcc.dg/i386-bitfield1.c
index 5b53acf8dfd..e285ba0526a 100644
--- a/gcc/testsuite/gcc.dg/i386-bitfield1.c
+++ b/gcc/testsuite/gcc.dg/i386-bitfield1.c
@@ -1,6 +1,6 @@
// Test for bitfield alignment in structs on IA-32
-// { dg-do run { target i?86-*-* } }
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// { dg-options "-O2" }
// { dg-options "-mno-align-double -mno-ms-bitfields" { target i?86-*-interix* i?86-*-cygwin* i?86-*-mingw*} }
diff --git a/gcc/testsuite/gcc.dg/i386-bitfield2.c b/gcc/testsuite/gcc.dg/i386-bitfield2.c
index f77a4ab4097..54f5c8dbfd3 100644
--- a/gcc/testsuite/gcc.dg/i386-bitfield2.c
+++ b/gcc/testsuite/gcc.dg/i386-bitfield2.c
@@ -1,6 +1,6 @@
// Test for bitfield alignment in structs on IA-32
-// { dg-do run { target i?86-*-* } }
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
// { dg-options "-O2" }
// { dg-options "-mno-align-double -mno-ms-bitfields" { target i?86-*-interix* i?86-*-cygwin* i?86-*-mingw* } }
diff --git a/gcc/testsuite/gcc.dg/i386-bitfield3.c b/gcc/testsuite/gcc.dg/i386-bitfield3.c
index 781c2f7ba4e..111f5f28c42 100644
--- a/gcc/testsuite/gcc.dg/i386-bitfield3.c
+++ b/gcc/testsuite/gcc.dg/i386-bitfield3.c
@@ -1,5 +1,5 @@
// Test for bitfield alignment in structs on IA-32
-// { dg-do run { target i?86-*-* } }
+// { dg-do run { target i?86-*-* x86_64-*-* } }
// { dg-options "-O2" }
// { dg-options "-mno-align-double -mno-ms-bitfields" { target *-*-interix* } }
diff --git a/gcc/testsuite/gcc.dg/i386-call-1.c b/gcc/testsuite/gcc.dg/i386-call-1.c
index 9cd49da3b2f..3c3d642babd 100644
--- a/gcc/testsuite/gcc.dg/i386-call-1.c
+++ b/gcc/testsuite/gcc.dg/i386-call-1.c
@@ -1,6 +1,6 @@
/* PR optimization/11304 */
/* Originator: <manuel.serrano@sophia.inria.fr> */
-/* { dg-do run { target i?86-*-* } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O -fomit-frame-pointer" } */
/* Verify that %eax is always restored after a call. */
diff --git a/gcc/testsuite/gcc.dg/i386-loop-1.c b/gcc/testsuite/gcc.dg/i386-loop-1.c
index 9aa23ef900f..479c80a2d7a 100644
--- a/gcc/testsuite/gcc.dg/i386-loop-1.c
+++ b/gcc/testsuite/gcc.dg/i386-loop-1.c
@@ -1,6 +1,6 @@
/* PR optimization/9888 */
-/* { dg-do run { target i?86-*-* } } */
-/* { dg-xfail-if "" { *-*-* } { "-m64" } { "" } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-mtune=k6 -O3" } */
/* Verify that GCC doesn't emit out of range 'loop' instructions. */
diff --git a/gcc/testsuite/gcc.dg/i386-loop-2.c b/gcc/testsuite/gcc.dg/i386-loop-2.c
index 548819a336c..8994eada46e 100644
--- a/gcc/testsuite/gcc.dg/i386-loop-2.c
+++ b/gcc/testsuite/gcc.dg/i386-loop-2.c
@@ -1,7 +1,7 @@
/* PR optimization/9888 */
/* Originator: Jim Bray <jb@as220.org> */
-/* { dg-do run { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-mtune=k6 -Os" } */
enum reload_type
diff --git a/gcc/testsuite/gcc.dg/i386-loop-3.c b/gcc/testsuite/gcc.dg/i386-loop-3.c
index 394b4e99246..4e046b28acb 100644
--- a/gcc/testsuite/gcc.dg/i386-loop-3.c
+++ b/gcc/testsuite/gcc.dg/i386-loop-3.c
@@ -1,8 +1,8 @@
/* PR target/11044 */
/* Originator: Tim McGrath <misty-@charter.net> */
/* Testcase contributed by Eric Botcazou <ebotcazou@libertysurf.fr> */
-/* { dg-do run { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-mtune=k6 -O3 -ffast-math -funroll-loops" } */
extern void *memset (void *, int, __SIZE_TYPE__);
diff --git a/gcc/testsuite/gcc.dg/i386-memset-1.c b/gcc/testsuite/gcc.dg/i386-memset-1.c
index b87a05b8df7..4da21b97ee0 100644
--- a/gcc/testsuite/gcc.dg/i386-memset-1.c
+++ b/gcc/testsuite/gcc.dg/i386-memset-1.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002 Free Software Foundation.
+/* Copyright (C) 2002, 2005 Free Software Foundation.
Test -minline-all-stringops memset with various combinations of pointer
alignments and lengths to make sure builtin optimizations are correct.
@@ -7,7 +7,7 @@
Written by Michael Meissner, March 9, 2002.
Target by Roger Sayle, April 25, 2002. */
-/* { dg-do run { target "i?86-*-*" } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O2 -minline-all-stringops" } */
extern void *memset (void *, int, __SIZE_TYPE__);
diff --git a/gcc/testsuite/gcc.dg/i386-pentium4-not-mull.c b/gcc/testsuite/gcc.dg/i386-pentium4-not-mull.c
index 2df07822ded..2ae7512cb48 100644
--- a/gcc/testsuite/gcc.dg/i386-pentium4-not-mull.c
+++ b/gcc/testsuite/gcc.dg/i386-pentium4-not-mull.c
@@ -1,7 +1,6 @@
/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
-/* { dg-options "-O2 -march=pentium4" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
-/* { dg-options "-O2 -march=pentium4 -m32" { target x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-O2 -march=pentium4" } */
/* { dg-final { scan-assembler-not "imull" } } */
/* Should be done not using imull. */
diff --git a/gcc/testsuite/gcc.dg/i386-pic-1.c b/gcc/testsuite/gcc.dg/i386-pic-1.c
index 8fa2caf67f7..7762230c2f6 100644
--- a/gcc/testsuite/gcc.dg/i386-pic-1.c
+++ b/gcc/testsuite/gcc.dg/i386-pic-1.c
@@ -1,6 +1,6 @@
/* PR target/8340 */
-/* { dg-do compile { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-fPIC" } */
int foo ()
diff --git a/gcc/testsuite/gcc.dg/i386-regparm.c b/gcc/testsuite/gcc.dg/i386-regparm.c
index 601688f6489..e3cd8b090ff 100644
--- a/gcc/testsuite/gcc.dg/i386-regparm.c
+++ b/gcc/testsuite/gcc.dg/i386-regparm.c
@@ -1,5 +1,5 @@
-/* { dg-do compile { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-W -Wall" } */
/* Verify that GCC correctly detects non-matching regparm attributes. */
diff --git a/gcc/testsuite/gcc.dg/i386-signbit-1.c b/gcc/testsuite/gcc.dg/i386-signbit-1.c
index 57c1f5f2cb3..adb351a2772 100644
--- a/gcc/testsuite/gcc.dg/i386-signbit-1.c
+++ b/gcc/testsuite/gcc.dg/i386-signbit-1.c
@@ -1,6 +1,6 @@
/* PR optimization/8746 */
-/* { dg-do run { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O1 -mtune=i586" } */
extern void abort (void);
diff --git a/gcc/testsuite/gcc.dg/i386-signbit-2.c b/gcc/testsuite/gcc.dg/i386-signbit-2.c
index 3e35249dadd..8ca63965062 100644
--- a/gcc/testsuite/gcc.dg/i386-signbit-2.c
+++ b/gcc/testsuite/gcc.dg/i386-signbit-2.c
@@ -1,6 +1,6 @@
/* PR optimization/8746 */
-/* { dg-do run { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O1 -mtune=i586" } */
extern void abort (void);
diff --git a/gcc/testsuite/gcc.dg/i386-signbit-3.c b/gcc/testsuite/gcc.dg/i386-signbit-3.c
index 882e6421415..a08ca498142 100644
--- a/gcc/testsuite/gcc.dg/i386-signbit-3.c
+++ b/gcc/testsuite/gcc.dg/i386-signbit-3.c
@@ -1,6 +1,6 @@
/* PR optimization/8746 */
-/* { dg-do run { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O1 -mtune=i586" } */
extern void abort (void);
diff --git a/gcc/testsuite/gcc.dg/i386-sse-12.c b/gcc/testsuite/gcc.dg/i386-sse-12.c
new file mode 100644
index 00000000000..83cc91588cf
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/i386-sse-12.c
@@ -0,0 +1,12 @@
+/* Test that {,x,e,p}mmintrin.h and mm_malloc.h are
+ usable with -std=c89 -pedantic-errors. */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-options "-std=c89 -pedantic-errors -msse3" } */
+
+#include <mmintrin.h>
+#include <xmmintrin.h>
+#include <emmintrin.h>
+#include <pmmintrin.h>
+#include <mm_malloc.h>
+
+int dummy;
diff --git a/gcc/testsuite/gcc.dg/i386-sse-5.c b/gcc/testsuite/gcc.dg/i386-sse-5.c
index a35e5d60cb6..ced075ae97d 100644
--- a/gcc/testsuite/gcc.dg/i386-sse-5.c
+++ b/gcc/testsuite/gcc.dg/i386-sse-5.c
@@ -1,6 +1,7 @@
-/* { dg-do compile { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-Winline -O2 -march=i386" } */
+
typedef double v2df __attribute__ ((vector_size (16)));
v2df p;
q(v2df t)
diff --git a/gcc/testsuite/gcc.dg/i386-sse-8.c b/gcc/testsuite/gcc.dg/i386-sse-8.c
index 7ae52fdca7c..ec3acc16906 100644
--- a/gcc/testsuite/gcc.dg/i386-sse-8.c
+++ b/gcc/testsuite/gcc.dg/i386-sse-8.c
@@ -1,11 +1,10 @@
-/* PR target/14313 */
+/* PR target/14343 */
/* Origin: <Pawe Sikora <pluto@ds14.agh.edu.pl> */
/* The xstormy16 doesn't support V2DI. */
/* { dg-do compile { xfail xstormy16-*-* } } */
/* { dg-options "" } */
-/* { dg-options "-march=pentium3" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-march=pentium3" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
int main()
{
diff --git a/gcc/testsuite/gcc.dg/i386-ssefn-1.c b/gcc/testsuite/gcc.dg/i386-ssefn-1.c
index a8b0b14e73c..548c580571f 100644
--- a/gcc/testsuite/gcc.dg/i386-ssefn-1.c
+++ b/gcc/testsuite/gcc.dg/i386-ssefn-1.c
@@ -1,7 +1,8 @@
/* Test argument passing with SSE and local functions
Written by Paolo Bonzini, 25 January 2005 */
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-final { scan-assembler "movss" } } */
/* { dg-final { scan-assembler "mulss" } } */
/* { dg-final { scan-assembler-not "movsd" } } */
diff --git a/gcc/testsuite/gcc.dg/i386-ssefn-2.c b/gcc/testsuite/gcc.dg/i386-ssefn-2.c
index 0e1970032e9..ded8b724f94 100644
--- a/gcc/testsuite/gcc.dg/i386-ssefn-2.c
+++ b/gcc/testsuite/gcc.dg/i386-ssefn-2.c
@@ -1,7 +1,8 @@
/* Test argument passing with SSE2 and local functions
Written by Paolo Bonzini, 25 January 2005 */
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-final { scan-assembler "movss" } } */
/* { dg-final { scan-assembler "mulss" } } */
/* { dg-final { scan-assembler "movsd" } } */
diff --git a/gcc/testsuite/gcc.dg/i386-ssefn-3.c b/gcc/testsuite/gcc.dg/i386-ssefn-3.c
index 2816919f7c2..c1b61301f34 100644
--- a/gcc/testsuite/gcc.dg/i386-ssefn-3.c
+++ b/gcc/testsuite/gcc.dg/i386-ssefn-3.c
@@ -1,7 +1,7 @@
/* Execution test for argument passing with SSE and local functions
Written by Paolo Bonzini, 25 January 2005 */
-/* { dg-do run { target i?86-*-* } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O2 -msse -mfpmath=sse" } */
#include <assert.h>
#include "i386-cpuid.h"
diff --git a/gcc/testsuite/gcc.dg/i386-ssefn-4.c b/gcc/testsuite/gcc.dg/i386-ssefn-4.c
index 353afcec0a1..a28382e2826 100644
--- a/gcc/testsuite/gcc.dg/i386-ssefn-4.c
+++ b/gcc/testsuite/gcc.dg/i386-ssefn-4.c
@@ -1,7 +1,7 @@
/* Execution test for argument passing with SSE2 and local functions
Written by Paolo Bonzini, 25 January 2005 */
-/* { dg-do run { target i?86-*-* } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O2 -msse2 -mfpmath=sse" } */
#include <assert.h>
#include "i386-cpuid.h"
diff --git a/gcc/testsuite/gcc.dg/i386-unroll-1.c b/gcc/testsuite/gcc.dg/i386-unroll-1.c
index 8ffd2ebe110..e681474725a 100644
--- a/gcc/testsuite/gcc.dg/i386-unroll-1.c
+++ b/gcc/testsuite/gcc.dg/i386-unroll-1.c
@@ -1,6 +1,6 @@
/* PR optimization/8599 */
-/* { dg-do run { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-mtune=k6 -O2 -funroll-loops" } */
extern void exit (int);
diff --git a/gcc/testsuite/gcc.dg/i386-volatile-1.c b/gcc/testsuite/gcc.dg/i386-volatile-1.c
index 633ea5022ec..8a37df48b20 100644
--- a/gcc/testsuite/gcc.dg/i386-volatile-1.c
+++ b/gcc/testsuite/gcc.dg/i386-volatile-1.c
@@ -1,6 +1,6 @@
/* PR optimization/11381 */
/* Originator: <tobias@ringstrom.mine.nu> */
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O" } */
/* Verify that the comparison is not optimized away. */
diff --git a/gcc/testsuite/gcc.dg/i386-xorps.c b/gcc/testsuite/gcc.dg/i386-xorps.c
index 86daa794ab4..0cf7532a1b9 100644
--- a/gcc/testsuite/gcc.dg/i386-xorps.c
+++ b/gcc/testsuite/gcc.dg/i386-xorps.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-Os -msse2" } */
typedef float __m128 __attribute__ ((vector_size (16)));
diff --git a/gcc/testsuite/gcc.dg/init-excess-1.c b/gcc/testsuite/gcc.dg/init-excess-1.c
new file mode 100644
index 00000000000..ade6fd0859d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/init-excess-1.c
@@ -0,0 +1,48 @@
+/* Test for various cases of excess initializers for empty objects:
+ bug 21873. Various versions of GCC ICE, hang or loop repeating
+ diagnostics on various of these tests. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+struct s0 { };
+struct s1 { int a; };
+struct s2 { int a; int b; };
+
+int a0[0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+int a1[0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+int a2[0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+int a3[1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+int a4[][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+int a5[][0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+int a6[][0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+int a7[][1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+
+struct s0 b0[0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s0 b1[0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s0 b2[0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s0 b3[1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s0 b4[][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s0 b5[][0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s0 b6[][0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s0 b7[][1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s0 b8[1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s0 b9[] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+
+struct s1 c0[0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s1 c1[0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s1 c2[0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s1 c3[1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s1 c4[][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s1 c5[][0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s1 c6[][0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s1 c7[][1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+
+struct s2 d0[0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s2 d1[0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s2 d2[0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s2 d3[1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s2 d4[][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s2 d5[][0][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s2 d6[][0][1] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
+struct s2 d7[][1][0] = { 1, 2 }; /* { dg-warning "excess elements|near init" } */
diff --git a/gcc/testsuite/gcc.dg/noncompile/20040203-3.c b/gcc/testsuite/gcc.dg/noncompile/20040203-3.c
index bd57c4dfe43..5b90c3ee844 100644
--- a/gcc/testsuite/gcc.dg/noncompile/20040203-3.c
+++ b/gcc/testsuite/gcc.dg/noncompile/20040203-3.c
@@ -12,5 +12,5 @@ int bug_or(void) { return (f().c || 1); } /* { dg-error "array that cannot be c
int bug_and(void) { return (f().c && 1); } /* { dg-error "array that cannot be converted" } */
int bug_cond(void) { return (f().c ? 1 : 0); } /* { dg-error "array that cannot be converted" } */
int bug_cond2(void) { return (f().c ? : 0); } /* { dg-error "array that cannot be converted" } */
-int bug_not(void) { return !f().c; } /* { dg-error "array that cannot be converted" } */
+int bug_not(void) { return !f().c; } /* { dg-error "wrong type argument to unary exclamation mark" } */
int bug_bool(void) { return (_Bool) f().c; } /* { dg-error "array that cannot be converted" } */
diff --git a/gcc/testsuite/gcc.dg/ppc-vector-memcpy.c b/gcc/testsuite/gcc.dg/ppc-vector-memcpy.c
index 630ff2e88b1..99ca85e972c 100644
--- a/gcc/testsuite/gcc.dg/ppc-vector-memcpy.c
+++ b/gcc/testsuite/gcc.dg/ppc-vector-memcpy.c
@@ -5,6 +5,6 @@
void foo(void)
{
- int x[8] __attribute__((aligned(128))) = { 1 };
+ int x[8] __attribute__((aligned(128))) = { 1, 1, 1, 1, 1, 1, 1, 1 };
bar (x);
}
diff --git a/gcc/testsuite/gcc.dg/ppc64-abi-2.c b/gcc/testsuite/gcc.dg/ppc64-abi-2.c
index e6baa25f4a3..93ce7195d0c 100644
--- a/gcc/testsuite/gcc.dg/ppc64-abi-2.c
+++ b/gcc/testsuite/gcc.dg/ppc64-abi-2.c
@@ -302,8 +302,6 @@ fcvevv (char *s, vector int x, ...)
abort();
}
-void fnp_cvvvv();
-
int __attribute__((no_instrument_function, noinline))
main1()
{
@@ -313,7 +311,6 @@ main1()
fcvi (s, v, 2);
fcvv (s, v, w);
- fnp_cvvvv (s, v, w, v, w);
fcivv (s, 1, v, w);
fcevv (s, v, w);
fciievv (s, 1, 2, v, w);
diff --git a/gcc/testsuite/gcc.dg/pr12092-1.c b/gcc/testsuite/gcc.dg/pr12092-1.c
index 1b29452881f..80c7546d9fb 100644
--- a/gcc/testsuite/gcc.dg/pr12092-1.c
+++ b/gcc/testsuite/gcc.dg/pr12092-1.c
@@ -1,6 +1,6 @@
/* PR rtl-optimization/12092 */
/* Test case reduced by Andrew Pinski <pinskia@physics.uc.edu> */
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2 -mtune=i486 -march=pentium4 -fprefetch-loop-arrays" } */
diff --git a/gcc/testsuite/gcc.dg/pr14289-1.c b/gcc/testsuite/gcc.dg/pr14289-1.c
index 652916325c2..71317d542c7 100644
--- a/gcc/testsuite/gcc.dg/pr14289-1.c
+++ b/gcc/testsuite/gcc.dg/pr14289-1.c
@@ -1,5 +1,5 @@
/* PR middle-end/14289 */
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O0" } */
register int a[2] asm("ebx");
diff --git a/gcc/testsuite/gcc.dg/pr14796-1.c b/gcc/testsuite/gcc.dg/pr14796-1.c
new file mode 100644
index 00000000000..7ddc4fe3467
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr14796-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+int f (int a) {
+ return (a << 3) << 6;
+}
+
+int g (int b) {
+ return (b >> 5) << 5;
+}
+
+unsigned long long h (unsigned long long c) {
+ return (c << 60) >> 60;
+}
+
+int l (int d) {
+ return (d << 6) >> 6;
+}
+
+/* { dg-final { scan-tree-dump "a << 9" "gimple" } } */
+/* { dg-final { scan-tree-dump "b & -32" "gimple" } } */
+/* { dg-final { scan-tree-dump "c & 15" "gimple" } } */
+/* { dg-final { scan-tree-dump "d << 6" "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc/testsuite/gcc.dg/pr14796-2.c b/gcc/testsuite/gcc.dg/pr14796-2.c
new file mode 100644
index 00000000000..de4ec27da91
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr14796-2.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+int f (int a) {
+ return (a << 31) << 6;
+}
+
+unsigned int g (unsigned int a) {
+ return (a >> 7) >> 25;
+}
+
+int h (int b) {
+ return (b >> 30) >> 30;
+}
+
+long long j (long long c) {
+ return (c >> 35) << 35;
+}
+/* { dg-final { scan-tree-dump-times "= 0" 2 "gimple" } } */
+/* { dg-final { scan-tree-dump "b >> 31" "gimple" } } */
+/* { dg-final { scan-tree-dump "c & -34359738368" "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */
diff --git a/gcc/testsuite/gcc.dg/pr19236-1.c b/gcc/testsuite/gcc.dg/pr19236-1.c
index 77365aa4074..73b75384384 100644
--- a/gcc/testsuite/gcc.dg/pr19236-1.c
+++ b/gcc/testsuite/gcc.dg/pr19236-1.c
@@ -1,5 +1,5 @@
/* PR target/19236 */
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-ffast-math" } */
extern float log1pf (float);
diff --git a/gcc/testsuite/gcc.dg/pr20204.c b/gcc/testsuite/gcc.dg/pr20204.c
index ad85af5baa3..7f24abc5529 100644
--- a/gcc/testsuite/gcc.dg/pr20204.c
+++ b/gcc/testsuite/gcc.dg/pr20204.c
@@ -1,4 +1,4 @@
-/* { dg-do run { target i?86-*-* } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
/* { dg-options "-O2" } */
void *x (void *pdst, const void *psrc, unsigned int pn)
diff --git a/gcc/testsuite/gcc.dg/pr21709-1.c b/gcc/testsuite/gcc.dg/pr21709-1.c
new file mode 100644
index 00000000000..0d6f20f3260
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr21709-1.c
@@ -0,0 +1,6 @@
+/* PR middle-end/21709 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+double _Complex f(void) { return 1.0iF / 0.0; }
+
diff --git a/gcc/testsuite/gcc.dg/pr21858.c b/gcc/testsuite/gcc.dg/pr21858.c
new file mode 100644
index 00000000000..41cd240c8cc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr21858.c
@@ -0,0 +1,15 @@
+/* Fold used to create a GT_EXPR of pointer vs. integer types,
+ which caused us to ICE in VRP. */
+
+/* { dg-do compile } */
+/* { dg-options "-Os -w" } */
+
+unsigned int dsdblm_GetBlockAddress();
+void error_LocalAssert(void);
+int dsdblm_CreateBlock(unsigned int address)
+{
+ address = dsdblm_GetBlockAddress();
+ if (address >= (void*)0x00020000)
+ error_LocalAssert();
+ return address;
+}
diff --git a/gcc/testsuite/gcc.dg/pr9771-1.c b/gcc/testsuite/gcc.dg/pr9771-1.c
index 1e3bc036aee..30e42de60b1 100644
--- a/gcc/testsuite/gcc.dg/pr9771-1.c
+++ b/gcc/testsuite/gcc.dg/pr9771-1.c
@@ -1,5 +1,6 @@
/* PR rtl-optimization/9771 */
-/* { dg-do run { target i?86-*-* } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2 -fomit-frame-pointer -ffixed-ebp" } */
extern void abort(void);
diff --git a/gcc/testsuite/gcc.dg/pr9814-1.c b/gcc/testsuite/gcc.dg/pr9814-1.c
new file mode 100644
index 00000000000..51b79f7839b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr9814-1.c
@@ -0,0 +1,107 @@
+/* PR tree-optimization/9814 */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+extern void abort(void);
+
+int test1(int x)
+{
+ if (x & 2)
+ x |= 2;
+ return x;
+}
+
+int test2(int x)
+{
+ if (!(x & 2))
+ x |= 2;
+ return x;
+}
+
+int test3(int x)
+{
+ if (x & 2)
+ x ^= 2;
+ return x;
+}
+
+int test4(int x)
+{
+ if (!(x & 2))
+ x ^= 2;
+ return x;
+}
+
+int test5(int x)
+{
+ if (x & 2)
+ x &= ~2;
+ return x;
+}
+
+int test6(int x)
+{
+ if (!(x & 2))
+ x &= ~2;
+ return x;
+}
+
+int main()
+{
+ if (test1(0) != 0)
+ abort();
+ if (test1(2) != 2)
+ abort();
+ if (test1(5) != 5)
+ abort();
+ if (test1(7) != 7)
+ abort();
+
+ if (test2(0) != 2)
+ abort();
+ if (test2(2) != 2)
+ abort();
+ if (test2(5) != 7)
+ abort();
+ if (test2(7) != 7)
+ abort();
+
+ if (test3(0) != 0)
+ abort();
+ if (test3(2) != 0)
+ abort();
+ if (test3(5) != 5)
+ abort();
+ if (test3(7) != 5)
+ abort();
+
+ if (test4(0) != 2)
+ abort();
+ if (test4(2) != 2)
+ abort();
+ if (test4(5) != 7)
+ abort();
+ if (test4(7) != 7)
+ abort();
+
+ if (test5(0) != 0)
+ abort();
+ if (test5(2) != 0)
+ abort();
+ if (test5(5) != 5)
+ abort();
+ if (test5(7) != 5)
+ abort();
+
+ if (test6(0) != 0)
+ abort();
+ if (test6(2) != 2)
+ abort();
+ if (test6(5) != 5)
+ abort();
+ if (test6(7) != 7)
+ abort();
+
+ return 0;
+}
+
diff --git a/gcc/testsuite/gcc.dg/register-var-1.c b/gcc/testsuite/gcc.dg/register-var-1.c
index 6869b034dcf..a27d56c4b66 100644
--- a/gcc/testsuite/gcc.dg/register-var-1.c
+++ b/gcc/testsuite/gcc.dg/register-var-1.c
@@ -1,6 +1,6 @@
/* PR/18160 */
-/* { dg-do compile { target i?86-*-* } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
/* This should yield an error even without -pedantic. */
/* { dg-options "-ansi" } */
diff --git a/gcc/testsuite/gcc.dg/setjmp-2.c b/gcc/testsuite/gcc.dg/setjmp-2.c
index 6c89f8e9697..b44ac666145 100644
--- a/gcc/testsuite/gcc.dg/setjmp-2.c
+++ b/gcc/testsuite/gcc.dg/setjmp-2.c
@@ -1,8 +1,9 @@
/* PR middle-end/17813 */
/* Origin: Tom Hughes <tom@compton.nu> */
/* { dg-do run { target i?86-*-linux* x86_64-*-linux* } } */
-/* { dg-options "-O -fomit-frame-pointer -march=i386" { target i?86-*-linux* } } */
-/* { dg-options "-O -fomit-frame-pointer -m32 -march=i386" { target x86_64-*-linux* } } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-O -fomit-frame-pointer -march=i386" { target { i?86-*-linux* && ilp32 } } } */
+/* { dg-options "-O -fomit-frame-pointer -march=i386" { target { x86_64-*-linux* && ilp32 } } } */
#include <setjmp.h>
#include <signal.h>
diff --git a/gcc/testsuite/gcc.dg/short-compare-1.c b/gcc/testsuite/gcc.dg/short-compare-1.c
index 7ecca243a7c..8c02a893347 100644
--- a/gcc/testsuite/gcc.dg/short-compare-1.c
+++ b/gcc/testsuite/gcc.dg/short-compare-1.c
@@ -4,7 +4,7 @@
/* { dg-do run } */
/* { dg-options "-O" } */
/* { dg-options "-O -mtune=i686" { target { i?86-*-* && ilp32 } } } */
-/* { dg-options "-O -m32 -mtune=i686" { target x86_64-*-* } } */
+/* { dg-options "-O -mtune=i686" { target { x86_64-*-* && ilp32 } } } */
extern void abort(void);
diff --git a/gcc/testsuite/gcc.dg/short-compare-2.c b/gcc/testsuite/gcc.dg/short-compare-2.c
index 736e1510e8d..1c2192e821a 100644
--- a/gcc/testsuite/gcc.dg/short-compare-2.c
+++ b/gcc/testsuite/gcc.dg/short-compare-2.c
@@ -5,7 +5,7 @@
/* { dg-do run } */
/* { dg-options "-O" } */
/* { dg-options "-O -mtune=i686" { target { i?86-*-* && ilp32 } } } */
-/* { dg-options "-O -m32 -mtune=i686" { target x86_64-*-* } } */
+/* { dg-options "-O -mtune=i686" { target { x86_64-*-* && ilp32 } } } */
extern void abort();
diff --git a/gcc/testsuite/gcc.dg/sibcall-5.c b/gcc/testsuite/gcc.dg/sibcall-5.c
index da95f13e25c..d94750099fe 100644
--- a/gcc/testsuite/gcc.dg/sibcall-5.c
+++ b/gcc/testsuite/gcc.dg/sibcall-5.c
@@ -1,5 +1,6 @@
/* Check that indirect sibcalls understand regparm. */
-/* { dg-do run { target i?86-*-* } } */
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
/* { dg-options "-O2" } */
extern void abort (void);
diff --git a/gcc/testsuite/gcc.dg/simd-1.c b/gcc/testsuite/gcc.dg/simd-1.c
index e36c5beec5c..faf33dd00fb 100644
--- a/gcc/testsuite/gcc.dg/simd-1.c
+++ b/gcc/testsuite/gcc.dg/simd-1.c
@@ -54,8 +54,8 @@ hanneke ()
a = -b;
/* Operators on incompatible SIMD types. */
- a = b + c; /* { dg-error "can't convert between vector values of different size" } */
- a = b - c; /* { dg-error "can't convert between vector values of different size" } */
- a = b * c; /* { dg-error "can't convert between vector values of different size" } */
- a = b / c; /* { dg-error "can't convert between vector values of different size" } */
+ a = b + c; /* { dg-error "invalid operands to binary +" } */
+ a = b - c; /* { dg-error "invalid operands to binary -" } */
+ a = b * c; /* { dg-error "invalid operands to binary *" } */
+ a = b / c; /* { dg-error "invalid operands to binary /" } */
}
diff --git a/gcc/testsuite/gcc.dg/simd-1b.c b/gcc/testsuite/gcc.dg/simd-1b.c
index d40fb0469ca..56d94b91c68 100644
--- a/gcc/testsuite/gcc.dg/simd-1b.c
+++ b/gcc/testsuite/gcc.dg/simd-1b.c
@@ -14,23 +14,23 @@ void
hanneke ()
{
/* Operators on compatible SIMD types. */
- a %= b; /* { dg-bogus "invalid operands to binary %" "" { xfail *-*-* } } */
+ a %= b; /* { dg-error "invalid operands to binary %" } */
c &= d;
a |= b;
c ^= d;
- a >>= b; /* { dg-bogus "invalid operands to binary >>" "" { xfail *-*-* } } */
- c <<= d; /* { dg-bogus "invalid operands to binary <<" "" { xfail *-*-* } } */
+ a >>= b; /* { dg-error "invalid operands to binary >>" } */
+ c <<= d; /* { dg-error "invalid operands to binary <<" } */
a = +b;
c = ~d;
/* Operators on incompatible SIMD types. */
-/* a = b % c; { dg*error "can't convert between vector values of different size" } */
- a = b % c; /* { dg-bogus "invalid operands to binary %" "" { xfail *-*-* } } */
- d = c & b; /* { dg-error "can't convert between vector values of different size" } */
- a = b | c; /* { dg-error "can't convert between vector values of different size" } */
- d = c ^ b; /* { dg-error "can't convert between vector values of different size" } */
-/* a = b >> c; { dg*error "can't convert between vector values of different size" } */
- a = b >> c; /* { dg-bogus "invalid operands to binary >>" "" { xfail *-*-* } } */
-/* d = c << b; { dg*error "can't convert between vector values of different size" } */
- d = c << b; /* { dg-bogus "invalid operands to binary <<" "" { xfail *-*-* } } */
+ a = b % c; /* { dg-error "invalid operands to binary" } */
+ a = b % c; /* { dg-error "invalid operands to binary" } */
+ d = c & b; /* { dg-error "invalid operands to binary" } */
+ a = b | c; /* { dg-error "invalid operands to binary" } */
+ d = c ^ b; /* { dg-error "invalid operands to binary" } */
+ a = b >> c; /* { dg-error "invalid operands to binary" } */
+ a = b >> c; /* { dg-error "invalid operands to binary" } */
+ d = c << b; /* { dg-error "invalid operands to binary" } */
+ d = c << b; /* { dg-error "invalid operands to binary" } */
}
diff --git a/gcc/testsuite/gcc.dg/simd-2.c b/gcc/testsuite/gcc.dg/simd-2.c
index 20d4a07d46c..09e28a7798a 100644
--- a/gcc/testsuite/gcc.dg/simd-2.c
+++ b/gcc/testsuite/gcc.dg/simd-2.c
@@ -33,11 +33,10 @@ hanneke ()
foo = a; /* { dg-error "incompatible types in assignment" } */
/* Casted assignment between scalar and SIMD of same size. */
- foo = (typeof (foo)) foo2; /* { dg-bogus "aggregate value used where a float was expected" "" { xfail *-*-* } } */
+ foo = (typeof (foo)) foo2; /* { dg-error "aggregate value used where a float was expected" } */
/* Casted assignment between scalar and SIMD of different size. */
-/* foo1 = (typeof (foo1)) foo2; { dg*error "can't convert between vector values of different size" } */
- foo1 = (typeof (foo1)) foo2; /* { dg-bogus "aggregate value used where a float was expected" "" { xfail *-*-* } } */
+ foo1 = (typeof (foo1)) foo2; /* { dg-error "aggregate value used where a float was expected" } */
/* Operators on compatible SIMD types. */
a += b + b;
@@ -48,8 +47,8 @@ hanneke ()
c = -d;
/* Operators on incompatible SIMD types. */
- a = b + c; /* { dg-error "can't convert between vector values of different size" } */
- a = b - c; /* { dg-error "can't convert between vector values of different size" } */
- a = b * c; /* { dg-error "can't convert between vector values of different size" } */
- a = b / c; /* { dg-error "can't convert between vector values of different size" } */
+ a = b + c; /* { dg-error "invalid operands to binary" } */
+ a = b - c; /* { dg-error "invalid operands to binary" } */
+ a = b * c; /* { dg-error "invalid operands to binary" } */
+ a = b / c; /* { dg-error "invalid operands to binary" } */
}
diff --git a/gcc/testsuite/gcc.dg/simd-3.c b/gcc/testsuite/gcc.dg/simd-3.c
new file mode 100644
index 00000000000..34ad75d9602
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/simd-3.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-maltivec" { target powerpc-*-* } } */
+
+__attribute__ ((vector_size (2))) signed char v1, v2, v3;
+void
+one (void)
+{
+ v1 = v2 + v3;
+}
+
+__attribute__ ((vector_size (8))) signed char v4, v5, v6;
+void
+two (void)
+{
+ v4 = v5 + v6;
+}
diff --git a/gcc/testsuite/gcc.dg/simd-4.c b/gcc/testsuite/gcc.dg/simd-4.c
new file mode 100644
index 00000000000..f7b28d45229
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/simd-4.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+typedef int myint;
+
+float __attribute__((vector_size(16))) b;
+int __attribute__((vector_size(16))) d;
+myint __attribute__((vector_size(16))) d2;
+unsigned int __attribute__((vector_size(16))) e;
+
+void foo()
+{
+ b + d; /* { dg-error "invalid operands to binary" } */
+ d += e;
+ d2 += d;
+}
diff --git a/gcc/testsuite/gcc.dg/sync-2.c b/gcc/testsuite/gcc.dg/sync-2.c
new file mode 100644
index 00000000000..4d4ac19477b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/sync-2.c
@@ -0,0 +1,101 @@
+/* { dg-do run } */
+/* { dg-require-effective-target sync_char_short } */
+/* { dg-options "-march=i486" { target i?86-*-* } } */
+/* { dg-options "-march=i486" { target { x86_64-*-* && ilp32 } } } */
+
+/* Test functionality of the intrinsics for 'short' and 'char'. */
+
+extern void abort (void);
+extern void *memcpy (void *, const void *, __SIZE_TYPE__);
+
+static char AI[18];
+static char init_qi[18] = { 3,5,7,9,0,0,0,0,-1,0,0,0,0,0,-1,0,0,0 };
+static char test_qi[18] = { 3,5,7,9,1,4,22,-12,7,8,9,7,1,-12,7,8,9,7 };
+
+static void
+do_qi (void)
+{
+ if (__sync_fetch_and_add(AI+4, 1) != 0)
+ abort ();
+ if (__sync_fetch_and_add(AI+5, 4) != 0)
+ abort ();
+ if (__sync_fetch_and_add(AI+6, 22) != 0)
+ abort ();
+ if (__sync_fetch_and_sub(AI+7, 12) != 0)
+ abort ();
+ if (__sync_fetch_and_and(AI+8, 7) != -1)
+ abort ();
+ if (__sync_fetch_and_or(AI+9, 8) != 0)
+ abort ();
+ if (__sync_fetch_and_xor(AI+10, 9) != 0)
+ abort ();
+ if (__sync_fetch_and_nand(AI+11, 7) != 0)
+ abort ();
+
+ if (__sync_add_and_fetch(AI+12, 1) != 1)
+ abort ();
+ if (__sync_sub_and_fetch(AI+13, 12) != -12)
+ abort ();
+ if (__sync_and_and_fetch(AI+14, 7) != 7)
+ abort ();
+ if (__sync_or_and_fetch(AI+15, 8) != 8)
+ abort ();
+ if (__sync_xor_and_fetch(AI+16, 9) != 9)
+ abort ();
+ if (__sync_nand_and_fetch(AI+17, 7) != 7)
+ abort ();
+}
+
+static short AL[18];
+static short init_hi[18] = { 3,5,7,9,0,0,0,0,-1,0,0,0,0,0,-1,0,0,0 };
+static short test_hi[18] = { 3,5,7,9,1,4,22,-12,7,8,9,7,1,-12,7,8,9,7 };
+
+static void
+do_hi (void)
+{
+ if (__sync_fetch_and_add(AL+4, 1) != 0)
+ abort ();
+ if (__sync_fetch_and_add(AL+5, 4) != 0)
+ abort ();
+ if (__sync_fetch_and_add(AL+6, 22) != 0)
+ abort ();
+ if (__sync_fetch_and_sub(AL+7, 12) != 0)
+ abort ();
+ if (__sync_fetch_and_and(AL+8, 7) != -1)
+ abort ();
+ if (__sync_fetch_and_or(AL+9, 8) != 0)
+ abort ();
+ if (__sync_fetch_and_xor(AL+10, 9) != 0)
+ abort ();
+ if (__sync_fetch_and_nand(AL+11, 7) != 0)
+ abort ();
+
+ if (__sync_add_and_fetch(AL+12, 1) != 1)
+ abort ();
+ if (__sync_sub_and_fetch(AL+13, 12) != -12)
+ abort ();
+ if (__sync_and_and_fetch(AL+14, 7) != 7)
+ abort ();
+ if (__sync_or_and_fetch(AL+15, 8) != 8)
+ abort ();
+ if (__sync_xor_and_fetch(AL+16, 9) != 9)
+ abort ();
+ if (__sync_nand_and_fetch(AL+17, 7) != 7)
+ abort ();
+}
+
+int main()
+{
+ memcpy(AI, init_qi, sizeof(init_qi));
+ memcpy(AL, init_hi, sizeof(init_hi));
+
+ do_qi ();
+ do_hi ();
+
+ if (memcmp (AI, test_qi, sizeof(test_qi)))
+ abort ();
+ if (memcmp (AL, test_hi, sizeof(test_hi)))
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/tls/debug-1.c b/gcc/testsuite/gcc.dg/tls/debug-1.c
new file mode 100644
index 00000000000..719f0645771
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tls/debug-1.c
@@ -0,0 +1,4 @@
+/* { dg-do assemble } */
+/* { dg-options "-g" } */
+
+__thread int i;
diff --git a/gcc/testsuite/gcc.dg/tls/opt-1.c b/gcc/testsuite/gcc.dg/tls/opt-1.c
index f817c04e151..f7dcceee7c8 100644
--- a/gcc/testsuite/gcc.dg/tls/opt-1.c
+++ b/gcc/testsuite/gcc.dg/tls/opt-1.c
@@ -1,7 +1,7 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fPIC" } */
-/* { dg-options "-O2 -fPIC -mtune=i686" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-O2 -fPIC -mtune=i686" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-O2 -fPIC -mtune=i686" { target { x86_64-*-* && ilp32 } } } */
extern __thread int thr;
diff --git a/gcc/testsuite/gcc.dg/tls/opt-2.c b/gcc/testsuite/gcc.dg/tls/opt-2.c
index 6dc2b0e05aa..dde54f00674 100644
--- a/gcc/testsuite/gcc.dg/tls/opt-2.c
+++ b/gcc/testsuite/gcc.dg/tls/opt-2.c
@@ -4,8 +4,8 @@
on IA-32. */
/* { dg-do link } */
/* { dg-options "-O2 -ftls-model=initial-exec" } */
-/* { dg-options "-O2 -ftls-model=initial-exec -march=i686" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-O2 -ftls-model=initial-exec -march=i686" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-O2 -ftls-model=initial-exec -march=i686" { target { x86_64-*-* && ilp32 } } } */
__thread int thr;
diff --git a/gcc/testsuite/gcc.dg/torture/builtin-attr-1.c b/gcc/testsuite/gcc.dg/torture/builtin-attr-1.c
index 0e521d84e3f..4bf77892bab 100644
--- a/gcc/testsuite/gcc.dg/torture/builtin-attr-1.c
+++ b/gcc/testsuite/gcc.dg/torture/builtin-attr-1.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003 Free Software Foundation.
+/* Copyright (C) 2003, 2005 Free Software Foundation.
Verify that the `const' function attribute is applied to various
builtins and that these functions are optimized away by the
@@ -393,7 +393,7 @@ CPTEST1 (ccos)
CPTEST1 (ccosh)
CPTEST1 (cexp)
CPTEST1R (cimag)
-/*CPTEST1 (clog)*/
+CPTEST1 (clog)
CPTEST1 (conj)
CPTEST2 (cpow)
CPTEST1 (cproj)
diff --git a/gcc/testsuite/gcc.dg/torture/pr21817-1.c b/gcc/testsuite/gcc.dg/torture/pr21817-1.c
new file mode 100644
index 00000000000..524c798c990
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr21817-1.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+
+typedef float v4sf __attribute__((vector_size(16)));
+v4sf value;
+void foo(void)
+{
+ unsigned int band;
+ for(band=0; band < 2; band++)
+ {
+ value += (v4sf){1e9f,1e9f,1e9f,1e9f};
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/tree-prof/inliner-1.c b/gcc/testsuite/gcc.dg/tree-prof/inliner-1.c
new file mode 100644
index 00000000000..9a1cd01f337
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-prof/inliner-1.c
@@ -0,0 +1,37 @@
+/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-all" } */
+int a;
+int b[100];
+void abort (void);
+
+inline void
+cold_function ()
+{
+ int i;
+ for (i = 0; i < 99; i++)
+ if (b[i] / (b[i+1] + 1))
+ abort ();
+}
+
+inline void
+hot_function ()
+{
+ int i;
+ for (i = 0; i < 99; i++)
+ if (b[i] / (b[i+1] + 1))
+ abort ();
+}
+
+main ()
+{
+ if (a)
+ cold_function ();
+ else
+ hot_function ();
+ return 0;
+}
+
+/* cold function should be inlined, while hot function should not.
+ Look for "cold_function () [tail call];" call statement not for the
+ declaration or other apperances of the string in dump. */
+/* { dg-final-use { scan-tree-dump "cold_function ..;" "optimized"} } */
+/* { dg-final-use { scan-tree-dump-not "hot_function ..;" "optimized"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp b/gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp
new file mode 100644
index 00000000000..9559a80e187
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-prof/tree-prof.exp
@@ -0,0 +1,53 @@
+# Copyright (C) 2001, 2002, 2004, 2005 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.
+
+# Test the functionality of programs compiled with profile-directed block
+# ordering using -fprofile-generate followed by -fbranch-use.
+
+load_lib target-supports.exp
+
+# Some targets don't support tree profiling.
+if { ![check_profiling_available "-ftree-based-profiling"] } {
+ return
+}
+
+# The procedures in profopt.exp need these parameters.
+set tool gcc
+set prof_ext "gcda gcno"
+
+# Override the list defined in profopt.exp.
+set PROFOPT_OPTIONS [list {}]
+
+if $tracelevel then {
+ strace $tracelevel
+}
+
+# Load support procs.
+load_lib profopt.exp
+
+# These are globals used by profopt-execute. The first is options
+# needed to generate profile data, the second is options to use the
+# profile data.
+set profile_option "-ftree-based-profiling -fprofile-generate"
+set feedback_option "-ftree-based-profiling -fprofile-use"
+
+foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.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
+ }
+ profopt-execute $src
+}
diff --git a/gcc/testsuite/gcc.dg/tree-prof/val-prof-1.c b/gcc/testsuite/gcc.dg/tree-prof/val-prof-1.c
new file mode 100644
index 00000000000..db3bc950f5a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-prof/val-prof-1.c
@@ -0,0 +1,20 @@
+/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */
+int a[1000];
+int b = 256;
+int c = 257;
+main ()
+{
+ int i;
+ int n;
+ for (i = 0; i < 1000; i++)
+ {
+ if (i % 17)
+ n = c;
+ else n = b;
+ a[i] /= n;
+ }
+ return 0;
+}
+/* { dg-final-use { scan-tree-dump "Div.mod by constant n=257 transformation on insn" "tree_profile"} } */
+/* { dg-final-use { scan-tree-dump "if \\(n != 257\\)" "optimized"} } */
+/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-prof/val-prof-2.c b/gcc/testsuite/gcc.dg/tree-prof/val-prof-2.c
new file mode 100644
index 00000000000..c11f7ea20e4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-prof/val-prof-2.c
@@ -0,0 +1,30 @@
+/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */
+unsigned int a[1000];
+unsigned int b = 256;
+unsigned int c = 1024;
+unsigned int d = 17;
+main ()
+{
+ int i;
+ unsigned int n;
+ for (i = 0; i < 1000; i++)
+ {
+ a[i]=100*i;
+ }
+ for (i = 0; i < 1000; i++)
+ {
+ if (i % 2)
+ n = b;
+ else if (i % 3)
+ n = c;
+ else
+ n = d;
+ a[i] %= n;
+ }
+ return 0;
+}
+/* { dg-final-use { scan-tree-dump "Mod power of 2 transformation on insn" "tree_profile"} } */
+/* This is part of code checking that n is power of 2, so we are sure that the transformation
+ didn't get optimized out. */
+/* { dg-final-use { scan-tree-dump "n \\+ \\-1" "optimized"} } */
+/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-prof/val-prof-3.c b/gcc/testsuite/gcc.dg/tree-prof/val-prof-3.c
new file mode 100644
index 00000000000..91ebd376177
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-prof/val-prof-3.c
@@ -0,0 +1,30 @@
+/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */
+unsigned int a[1000];
+unsigned int b = 257;
+unsigned int c = 1023;
+unsigned int d = 19;
+main ()
+{
+ int i;
+ unsigned int n;
+ for (i = 0; i < 1000; i++)
+ {
+ a[i]=18;
+ }
+ for (i = 0; i < 1000; i++)
+ {
+ if (i % 2)
+ n = b;
+ else if (i % 3)
+ n = c;
+ else
+ n = d;
+ a[i] %= n;
+ }
+ return 0;
+}
+/* { dg-final-use { scan-tree-dump "Mod subtract transformation on insn" "tree_profile"} } */
+/* This is part of code checking that n is greater than the divisor so we are sure that it
+ didn't get optimized out. */
+/* { dg-final-use { scan-tree-dump "if \\(n \\>" "optimized"} } */
+/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-prof/val-prof-4.c b/gcc/testsuite/gcc.dg/tree-prof/val-prof-4.c
new file mode 100644
index 00000000000..4fff1123beb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-prof/val-prof-4.c
@@ -0,0 +1,30 @@
+/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-tree_profile" } */
+unsigned int a[1000];
+unsigned int b = 999;
+unsigned int c = 1002;
+unsigned int d = 1003;
+main ()
+{
+ int i;
+ unsigned int n;
+ for (i = 0; i < 1000; i++)
+ {
+ a[i]=1000+i;
+ }
+ for (i = 0; i < 1000; i++)
+ {
+ if (i % 2)
+ n = b;
+ else if (i % 3)
+ n = c;
+ else
+ n = d;
+ a[i] %= n;
+ }
+ return 0;
+}
+/* { dg-final-use { scan-tree-dump "Mod subtract transformation on insn" "tree_profile"} } */
+/* This is part of code checking that n is greater than the divisor so we are sure that it
+ didn't get optimized out. */
+/* { dg-final-use { scan-tree-dump "if \\(n \\>" "optimized"} } */
+/* { dg-final-use { scan-tree-dump-not "Invalid sum" "optimized"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20030807-10.c b/gcc/testsuite/gcc.dg/tree-ssa/20030807-10.c
index 5865543a5a6..a7c98bf886a 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/20030807-10.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/20030807-10.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O1 -fdump-tree-dom3" } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
extern const unsigned char mode_size[];
@@ -18,9 +18,9 @@ subreg_highpart_offset (outermode, innermode)
}
/* There should be one mask with the value 3. */
-/* { dg-final { scan-tree-dump-times " \& 3" 1 "dom3"} } */
+/* { dg-final { scan-tree-dump-times " \& 3" 1 "vrp"} } */
/* There should be one right shift by 2 places. */
-/* { dg-final { scan-tree-dump-times " >> 2" 1 "dom3"} } */
+/* { dg-final { scan-tree-dump-times " >> 2" 1 "vrp"} } */
-/* { dg-final { cleanup-tree-dump "dom3" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20030807-6.c b/gcc/testsuite/gcc.dg/tree-ssa/20030807-6.c
index e01c43876a0..12a623adcb6 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/20030807-6.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/20030807-6.c
@@ -1,8 +1,8 @@
/* { dg-do compile } */
-/* { dg-options "-O1 -fdump-tree-dom3" } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
-static void
+void
foo (distance, i, j)
int distance[13][13];
int i, j;
@@ -11,7 +11,7 @@ foo (distance, i, j)
distance[i][0] = ((distance[i][j]) < 0 ? -(distance[i][j]) : (distance[i][j]));
}
-static void
+void
foo2 (distance, i, j)
int distance[13][13];
int i, j;
@@ -20,7 +20,7 @@ foo2 (distance, i, j)
distance[i][0] = ((distance[i][j]) < 0 ? -(distance[i][j]) : (distance[i][j]));
}
-static void
+void
foo3 (distance, i, j)
int distance[13][13];
int i, j;
@@ -29,7 +29,7 @@ foo3 (distance, i, j)
distance[i][0] = ((distance[i][j]) < 0 ? -(distance[i][j]) : (distance[i][j]));
}
-static void
+void
foo4 (distance, i, j)
double distance[13][13];
int i, j;
@@ -39,5 +39,5 @@ foo4 (distance, i, j)
}
/* There should be no ABS_EXPR. */
-/* { dg-final { scan-tree-dump-times "ABS_EXPR " 0 "dom3"} } */
-/* { dg-final { cleanup-tree-dump "dom3" } } */
+/* { dg-final { scan-tree-dump-times "ABS_EXPR " 0 "vrp"} } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/20040514-2.c b/gcc/testsuite/gcc.dg/tree-ssa/20040514-2.c
index 98cf3a283ba..11f76671604 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/20040514-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/20040514-2.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O1 -fdump-tree-dom3" } */
+/* { dg-options "-O2 -fdump-tree-phiopt1" } */
int
foo2 (distance, i, j)
int distance;
@@ -12,7 +12,6 @@ foo2 (distance, i, j)
}
/* There should be one ABS_EXPR and no conditionals. */
-/* { dg-final { scan-tree-dump-times "ABS_EXPR " 1 "dom3"} } */
-/* { dg-final { scan-tree-dump-times "if " 0 "dom3"} } */
+/* { dg-final { scan-tree-dump-times "ABS_EXPR " 1 "phiopt1"} } */
+/* { dg-final { scan-tree-dump-times "if " 0 "phiopt1"} } */
-/* { dg-final { cleanup-tree-dump "dom3" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-1.c b/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-1.c
new file mode 100644
index 00000000000..2c040278436
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/foldaddr-1.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-original" } */
+
+
+char *a;
+int foo(char *b)
+{
+ return a+5+(long)b == (long)b+a;
+}
+
+/* Folding should have determined that the two addresses were
+ not identical and thus collapsed the function into a trivial
+ "return 0". */
+/* { dg-final { scan-tree-dump-times "return 0" 1 "original"} } */
+/* { dg-final { cleanup-tree-dump "original" } } */
+
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11.c b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11.c
index bc6c2869d75..faba5451436 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11.c
@@ -1,4 +1,4 @@
-/* { dg-do run } */
+/* { dg-do run { target vect_cmdline_needed } } */
/* { dg-options "-O2 -ftree-vectorize -ftree-vectorizer-verbose=3 -fdump-tree-vect-stats" } */
#include <stdlib.h>
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11a.c b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11a.c
index 75ec7ce8863..7fbbc0cf37e 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11a.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11a.c
@@ -1,4 +1,4 @@
-/* { dg-do run } */
+/* { dg-do run { target vect_cmdline_needed } } */
/* { dg-options "-O2 -ftree-vectorize -ftree-vectorizer-verbose=3 -fdump-tree-vect-stats" } */
#include <stdlib.h>
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11b.c b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11b.c
index 20833533468..c1c33c3ce1d 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11b.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11b.c
@@ -1,4 +1,4 @@
-/* { dg-do run } */
+/* { dg-do run { target vect_cmdline_needed } } */
/* { dg-options "-O2 -ftree-vectorize -ftree-vectorizer-verbose=3 -fdump-tree-vect-stats" } */
#include <stdlib.h>
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11c.c b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11c.c
index 8632ae42b3a..e57554b8d4e 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11c.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-11c.c
@@ -1,4 +1,4 @@
-/* { dg-do run } */
+/* { dg-do run { target vect_cmdline_needed } } */
/* { dg-options "-O2 -ftree-vectorize -ftree-vectorizer-verbose=3 -fdump-tree-vect-stats" } */
#include <stdlib.h>
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-2.c b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-2.c
index be89c268258..8bee1522dc9 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-2.c
@@ -1,4 +1,4 @@
-/* { dg-do run } */
+/* { dg-do run { target vect_cmdline_needed } } */
/* { dg-options "-O2 -ftree-vectorize -ftree-vectorizer-verbose=3 -fdump-tree-vect-stats" } */
#include <stdlib.h>
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-25.c b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-25.c
index 5cfec85144a..e6127d8b8e6 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-25.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-25.c
@@ -1,4 +1,4 @@
-/* { dg-do run } */
+/* { dg-do run { target vect_cmdline_needed } } */
/* { dg-options "-O2 -ftree-vectorize -ftree-vectorizer-verbose=3 -fdump-tree-vect-stats" } */
#include <stdlib.h>
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c
index b90413aa4bf..bd6a51390e1 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-26.c
@@ -1,4 +1,4 @@
-/* { dg-do run } */
+/* { dg-do run { target vect_cmdline_needed } } */
/* { dg-options "-O2 -ftree-vectorize -ftree-vectorizer-verbose=3 -fdump-tree-vect-stats" } */
#include <stdlib.h>
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c
index 0d017529357..4f3bcf84375 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-28.c
@@ -1,4 +1,4 @@
-/* { dg-do run } */
+/* { dg-do run { target vect_cmdline_needed } } */
/* { dg-options "-O2 -ftree-vectorize -ftree-vectorizer-verbose=3 -fdump-tree-vect-stats" } */
#include <stdlib.h>
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-32.c b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-32.c
index 681c7071685..1a46a309daf 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-32.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/gen-vect-32.c
@@ -1,4 +1,4 @@
-/* { dg-do run } */
+/* { dg-do run { target vect_cmdline_needed } } */
/* { dg-options "-O2 -ftree-vectorize -ftree-vectorizer-verbose=3 -fdump-tree-vect-stats" } */
#include <stdlib.h>
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/loop-2.c b/gcc/testsuite/gcc.dg/tree-ssa/loop-2.c
index 381e34e08f9..e086499ca27 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/loop-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/loop-2.c
@@ -21,9 +21,12 @@ void xxx(void)
arr_base[iter].y = 17 * iter;
}
-/* Access to arr_base[iter].y should be strength reduced. */
+/* Access to arr_base[iter].y should be strength reduced, i.e., there should
+ be no multiplication. */
-/* { dg-final { scan-tree-dump-times "arr_base\[^\\n\\r\]*=" 0 "vars" } } */
+/* { dg-final { scan-tree-dump-times " \\* \[^\\n\\r\]*=" 0 "vars" } } */
+/* { dg-final { scan-tree-dump-times "\[^\\n\\r\]*= \\* " 0 "vars" } } */
+/* { dg-final { scan-tree-dump-times "MEM" 1 "vars" } } */
/* 17 * iter should be strength reduced. */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/loop-3.c b/gcc/testsuite/gcc.dg/tree-ssa/loop-3.c
index 35f127e14ad..63e582b6f43 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/loop-3.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/loop-3.c
@@ -20,7 +20,8 @@ void xxx(void)
/* Access to arr_base[iter].y should not be strength reduced, since
we have a memory mode including multiplication by 4. */
-/* { dg-final { scan-tree-dump-times "arr_base.*=" 1 "vars" } } */
+/* { dg-final { scan-tree-dump-times "MEM" 1 "vars" } } */
+/* { dg-final { scan-tree-dump-times "step:" 1 "vars" } } */
/* And original induction variable should be preserved. */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/loop-4.c b/gcc/testsuite/gcc.dg/tree-ssa/loop-4.c
index 6a6b97d9925..49e5a41e0d5 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/loop-4.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/loop-4.c
@@ -32,9 +32,11 @@ void xxx(void)
-- induction variable with base 0, the memory access of form
*(iv + &arr_base[0].y) = ...
- In any case, we should not have 'arr_base[.*] =' */
+ In any case, we should not have any multiplication. */
-/* { dg-final { scan-tree-dump-times "arr_base\[.*\]\.y =" 0 "vars" } } */
+/* { dg-final { scan-tree-dump-times " \\* \[^\\n\\r\]*=" 0 "vars" } } */
+/* { dg-final { scan-tree-dump-times "\[^\\n\\r\]*= \\* " 0 "vars" } } */
+/* { dg-final { scan-tree-dump-times "MEM" 1 "vars" } } */
/* And the original induction variable should be eliminated. */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/loop-7.c b/gcc/testsuite/gcc.dg/tree-ssa/loop-7.c
index 462df8c90bd..a4597b196d7 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/loop-7.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/loop-7.c
@@ -31,5 +31,5 @@ int xxx (void)
Calls to cst_fun2 and pure_fun2 should not be, since calling
with k = 0 may be invalid. */
-/* { dg-final { scan-tree-dump-times "Moving statement" 2 "lim" } } */
+/* { dg-final { scan-tree-dump-times "Moving statement" 3 "lim" } } */
/* { dg-final { cleanup-tree-dump "lim" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/loop-9.c b/gcc/testsuite/gcc.dg/tree-ssa/loop-9.c
new file mode 100644
index 00000000000..a03ce7214c8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/loop-9.c
@@ -0,0 +1,24 @@
+/* Without TARGET_MEM_REFs, dom creates code like
+
+ i1 = 4 * i;
+ *(p + i1) = i;
+ *(p + i1 + 4) = i
+
+ causing us to have unnecessary multiplication by 4 in the
+ result. */
+
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+
+void foo (int *p)
+{
+ int i;
+
+ for (i = 0; i < 100; i++)
+ {
+ p[i] = i;
+ p[i + 1] = i;
+ }
+}
+
+/* { dg-final { scan-assembler-times "lea" 0 { target i?86-*-* x86_64-*-* } } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr14341.c b/gcc/testsuite/gcc.dg/tree-ssa/pr14341.c
new file mode 100644
index 00000000000..07f51b78d84
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr14341.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
+
+void fn_call (int);
+int h(int, int);
+void t()
+{
+ int i;
+ int x;
+ for( i = 0; i < 100000000; i++ ){
+ fn_call (i < 100000000);
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "fn_call \\(1\\)" 1 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr14841.c b/gcc/testsuite/gcc.dg/tree-ssa/pr14841.c
index 4acc6ce3fc8..4f9c759da90 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr14841.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr14841.c
@@ -25,5 +25,5 @@ foo (void)
link_error ();
}
-/* { dg-final { scan-tree-dump-times "with if \\(0\\)" 1 "store_ccp"} } */
+/* { dg-final { scan-tree-dump-times "Folded statement: if " 1 "store_ccp"} } */
/* { dg-final { cleanup-tree-dump "store_ccp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr20701.c b/gcc/testsuite/gcc.dg/tree-ssa/pr20701.c
new file mode 100644
index 00000000000..a02c317b5d9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr20701.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
+
+typedef struct {
+ int code;
+} *rtx;
+
+int
+can_combine_p (rtx insn, rtx elt)
+{
+ rtx set;
+
+ set = 0;
+ if (insn->code == 3)
+ set = insn;
+ else
+ {
+ set = elt;
+ if (set == 0)
+ return 0;
+ }
+
+ if (set == 0)
+ return 1;
+
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate.*to 0" 1 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21029.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21029.c
new file mode 100644
index 00000000000..de2595aee55
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21029.c
@@ -0,0 +1,118 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -fwrapv" } */
+
+/* PR tree-optimization/21029
+
+ f() used to get optimized to an infinite loop by tree-vrp, because
+ j is assumed to be non-negative. Even though the conversion from
+ unsigned to signed has unspecified results if the expression value
+ is not representable in the signed type, the compiler itself (e.g.,
+ the Ada front end) depends on wrap-around behavior. */
+
+unsigned int f(void) {
+ unsigned char i = 123;
+ signed char j;
+
+ do
+ if ((j = (signed char) i) < 0)
+ break;
+ else
+ i++;
+ while (1);
+
+ return i;
+}
+
+/* Now let's torture it a bit further. Narrowing conversions need
+ similar treatment. */
+
+unsigned int f1 (void) {
+ unsigned short i = 123;
+ signed char j;
+
+ do
+ if ((j = (signed char) i) < 0)
+ break;
+ else
+ i++;
+ while (1);
+
+ return i;
+}
+
+/* And so do widening conversions. */
+
+unsigned int f2 (void) {
+ unsigned char i = 123;
+ signed short j;
+
+ do
+ if ((j = (signed short) (signed char) i) < 0)
+ break;
+ else
+ i++;
+ while (1);
+
+ return i;
+}
+
+/* Check same-sign truncations with an increment that turns into
+ decrements. */
+
+unsigned int f3 (void) {
+ signed short i = 5;
+ signed char j;
+
+ do
+ if ((j = (signed char) i) < 0)
+ break;
+ else
+ i += 255;
+ while (1);
+
+ return i;
+}
+
+/* Check that the truncation above doesn't confuse the result of the
+ test after a widening conversion. */
+
+unsigned int f4 (void) {
+ signed short i = -123;
+ signed int j;
+
+ do
+ if ((j = (signed int) (signed char) i) > 0)
+ break;
+ else
+ i += 255;
+ while (1);
+
+ return i;
+}
+
+/* Even if we omit the widening truncation, the narrowing truncation
+ is implementation-defined. */
+
+unsigned int f5 (void) {
+ signed long i = -123;
+ signed char j;
+
+ do
+ if ((j = (signed char) i) > 0)
+ break;
+ else
+ i += 255;
+ while (1);
+
+ return i;
+}
+
+int main (void) {
+ f ();
+ f1 ();
+ f2 ();
+ f3 ();
+ f4 ();
+ f5 ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c
new file mode 100644
index 00000000000..547d1c8d78b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21086.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
+
+int
+foo (int *p)
+{
+ int a = *p;
+ int b = p != 0;
+
+ *p = b;
+
+ if (b)
+ return a;
+ else
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate " 2 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21090.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21090.c
new file mode 100644
index 00000000000..e6b3c885b9c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21090.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
+
+int g, h;
+
+int
+foo (int a)
+{
+ int *p;
+
+ if (a)
+ p = &g;
+ else
+ p = &h;
+
+ if (p != 0)
+ return 1;
+ else
+ return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate.*to 1" 1 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21332.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21332.c
new file mode 100644
index 00000000000..8dd75ccc574
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21332.c
@@ -0,0 +1,28 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+// this testcase fails also on amd64:
+
+extern void abort (void);
+
+int f ()
+{
+ return -1;
+}
+
+int main ()
+{
+ int b, c, i;
+
+ b = 0;
+ c = f ();
+ if (c <= 0)
+ {
+ c = -c;
+ for (i = 0; i < c; i++)
+ b = 1;
+ if (!b)
+ abort ();
+ }
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21458.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21458.c
new file mode 100644
index 00000000000..0222e7a697b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21458.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
+
+extern void g (void);
+extern void bar (int);
+
+int
+foo (int a)
+{
+ int i;
+
+ for (i = 1; i < 100; i++)
+ {
+ if (i)
+ g ();
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate.*to 1" 1 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21582.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21582.c
new file mode 100644
index 00000000000..eee5d94c28d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21582.c
@@ -0,0 +1,28 @@
+/* { dg-do link } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
+
+static inline void do_thing(char *s, int *p, char *q)
+{
+ /* This should be folded away. */
+ if (s == 0 || q == 0)
+ link_error ();
+
+ /* This should not be folded as 'p' is not marked nonnull. */
+ if (p)
+ *p = 3;
+}
+
+void __attribute__((nonnull (1, 3))) do_other_thing(char *s, int *p, char *q)
+{
+ do_thing(s, p, q);
+}
+
+int i;
+
+main()
+{
+ do_other_thing ("xxx", &i, "yyy");
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate p_.*" 0 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21658.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21658.c
new file mode 100644
index 00000000000..2fa45b40a71
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21658.c
@@ -0,0 +1,21 @@
+/* PR tree-optimization/21658
+ CCP did not propagate an ADDR_EXPR far enough, preventing the "if"
+ statement below from being folded. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-ccp-details" } */
+
+void link_error (void);
+
+void
+f (void)
+{
+ int a[10];
+ int *p = &a[5];
+ int *q = p - 1;
+ if (q != &a[4])
+ link_error ();
+}
+
+/* { dg-final { scan-tree-dump-times "Folded statement: if " 1 "ccp"} } */
+/* { dg-final { cleanup-tree-dump "ccp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21985.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21985.c
new file mode 100644
index 00000000000..e94031045b4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21985.c
@@ -0,0 +1,32 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-vars" } */
+
+struct
+{
+ struct
+ {
+ int a;
+ int b;
+ } a[100];
+} a;
+
+void foo(unsigned);
+unsigned *bar (void);
+
+int
+main (void)
+{
+ unsigned *b = bar ();
+
+ /* This should be folded. */
+ foo (&a.a[50].a - &a.a[33].b);
+ foo ((unsigned) &a.a[50].b - (unsigned) &a);
+
+ /* And this should not. */
+ foo ((unsigned) &b - (unsigned) b);
+ return 0;
+}
+
+/* Two of the calls to foo should be folded to just foo(constant). */
+
+/* { dg-final { scan-tree-dump-times "foo \\(\[0-9\]*\\)" 2 "vars" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr22018.c b/gcc/testsuite/gcc.dg/tree-ssa/pr22018.c
new file mode 100644
index 00000000000..d4d332c2fc9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr22018.c
@@ -0,0 +1,32 @@
+/* { dg-do run } */
+/* { dg-options -O2 } */
+
+void abort (void);
+void g(int);
+void f(int l)
+{
+ unsigned i;
+ for (i = 0; i < l; i++)
+ {
+ int y = i;
+ /* VRP was wrongfully computing z's range to be [0, 0] instead
+ of [-INF, 0]. */
+ int z = y*-32;
+ g(z);
+ }
+}
+
+void g(int i)
+{
+ static int x = 0;
+ if (i == 0)
+ x ++;
+ if (x > 1)
+ abort ();
+}
+
+int main(void)
+{
+ f(3);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-1.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-1.c
new file mode 100644
index 00000000000..b9cdff36285
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+int a, b, c, d;
+extern int printf (const char *, ...);
+int main(void)
+{
+ int e;
+ int f;
+ /* We should be able to transform these into the same expression, and only have two additions. */
+ e = a + b;
+ e = e + c;
+ f = c + a;
+ f = f + b;
+ printf ("%d %d\n", e, f);
+}
+
+/* { dg-final { scan-tree-dump-times "a \\\+ b" 1 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-2.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-2.c
new file mode 100644
index 00000000000..6171fb903e5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-2.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized -fdump-tree-reassoc-details" } */
+extern int a0, a1, a2, a3, a4;
+int f ()
+{
+int b0, b1, b2, b3, b4;
+ /* this can be optimized to four additions... */
+ b4 = a4 + a3 + a2 + a1 + a0;
+ b3 = a3 + a2 + a1 + a0;
+ b2 = a2 + a1 + a0;
+ b1 = a1 + a0;
+ /* This is actually 0 */
+ return b4 - b3 + b2 - b1 - a4 - a2;
+}
+/* { dg-final { scan-tree-dump-times "Reassociating by rank" 3 "reassoc" } } */
+/* { dg-final { scan-tree-dump-times "return 0" 1 "optimized" { xfail *-*-* } } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
+/* { dg-final { cleanup-tree-dump "reassoc" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-14.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-14.c
new file mode 100644
index 00000000000..2371cfa1a58
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-14.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+extern __SIZE_TYPE__ strlen (const char *) __attribute__ ((__pure__));
+
+void
+foo (const char *str)
+{
+ __SIZE_TYPE__ a = strlen (str);
+ __SIZE_TYPE__ b = strlen (str);
+ if (a != b)
+ link_error ();
+}
+/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/stdarg-2.c b/gcc/testsuite/gcc.dg/tree-ssa/stdarg-2.c
index 77a430fd3ce..0672e50fe86 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/stdarg-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/stdarg-2.c
@@ -24,6 +24,7 @@ f1 (int i, ...)
/* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save 0 GPR units and 0 FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save 0 GPR units and 0 FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save 0 GPR units and 0 FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save 0 GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save 0 GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save 0 GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -42,6 +43,7 @@ f2 (int i, ...)
/* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save \[148\] GPR units and 0 FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save \[148\] GPR units and 0 FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save 8 GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save 1 GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save \[148\] GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save \[148\] GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -55,6 +57,7 @@ f3 (int i, ...)
}
/* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 0 GPR units and \[1-9\]\[0-9\]* FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 0 GPR units and \[1-9\]\[0-9\]* FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
+/* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 0 GPR units and 1 FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 8 GPR units and 2" "stdarg" { target alpha*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save \[1-9\]\[0-9\]* GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save \[1-9\]\[0-9\]* GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -71,6 +74,7 @@ f4 (int i, ...)
/* { dg-final { scan-tree-dump "f4: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f4: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f4: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f4: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f4: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f4: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -87,6 +91,7 @@ f5 (int i, ...)
/* { dg-final { scan-tree-dump "f5: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f5: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f5: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f5: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f5: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f5: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -105,6 +110,7 @@ f6 (int i, ...)
/* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save (3|12|24) GPR units and 0 FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save (3|12|24) GPR units and 0 FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save 24 GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save 3 GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save (3|12|24) GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save (3|12|24) GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -120,6 +126,7 @@ f7 (int i, ...)
/* { dg-final { scan-tree-dump "f7: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f7: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f7: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f7: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f7: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f7: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -137,6 +144,7 @@ f8 (int i, ...)
/* { dg-final { scan-tree-dump "f8: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f8: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f8: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f8: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f8: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f8: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -152,6 +160,7 @@ f9 (int i, ...)
/* { dg-final { scan-tree-dump "f9: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f9: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f9: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f9: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f9: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f9: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -169,6 +178,7 @@ f10 (int i, ...)
/* { dg-final { scan-tree-dump "f10: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f10: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f10: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f10: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f10: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f10: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -187,6 +197,7 @@ f11 (int i, ...)
/* { dg-final { scan-tree-dump "f11: va_list escapes 0, needs to save (3|12|24) GPR units and 0 FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f11: va_list escapes 0, needs to save (3|12|24) GPR units and 0 FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f11: va_list escapes 0, needs to save 24 GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f11: va_list escapes 0, needs to save 3 GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f11: va_list escapes 0, needs to save (3|12|24) GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f11: va_list escapes 0, needs to save (3|12|24) GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -205,6 +216,7 @@ f12 (int i, ...)
/* { dg-final { scan-tree-dump "f12: va_list escapes 0, needs to save 0 GPR units and \[1-9\]\[0-9\]* FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f12: va_list escapes 0, needs to save 0 GPR units and \[1-9\]\[0-9\]* FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f12: va_list escapes 0, needs to save 24 GPR units and 2" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f12: va_list escapes 0, needs to save 0 GPR units and 3 FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f12: va_list escapes 0, needs to save \[1-9]\[0-9\]* GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f12: va_list escapes 0, needs to save \[1-9]\[0-9\]* GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -223,6 +235,7 @@ f13 (int i, ...)
/* { dg-final { scan-tree-dump "f13: va_list escapes 0, needs to save 0 GPR units and \[1-9\]\[0-9\]* FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f13: va_list escapes 0, needs to save 0 GPR units and \[1-9\]\[0-9\]* FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f13: va_list escapes 0, needs to save 24 GPR units and 2" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f13: va_list escapes 0, needs to save 0 GPR units and 3 FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f13: va_list escapes 0, needs to save \[1-9]\[0-9\]* GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f13: va_list escapes 0, needs to save \[1-9]\[0-9\]* GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -241,6 +254,7 @@ f14 (int i, ...)
/* { dg-final { scan-tree-dump "f14: va_list escapes 0, needs to save \[148\] GPR units and \[1-9\]\[0-9\]* FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f14: va_list escapes 0, needs to save \[148\] GPR units and \[1-9\]\[0-9\]* FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f14: va_list escapes 0, needs to save 24 GPR units and 3" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f14: va_list escapes 0, needs to save 1 GPR units and 2 FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f14: va_list escapes 0, needs to save \[1-9]\[0-9\]* GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f14: va_list escapes 0, needs to save \[1-9]\[0-9\]* GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -263,6 +277,7 @@ f15 (int i, ...)
/* { dg-final { scan-tree-dump "f15: va_list escapes 0, needs to save \[148\] GPR units and \[1-9\]\[0-9\]* FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f15: va_list escapes 0, needs to save \[148\] GPR units and \[1-9\]\[0-9\]* FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f15: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f15: va_list escapes 0, needs to save 1 GPR units and 2 FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump-not "f15: va_list escapes 0, needs to save 0 GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump-not "f15: va_list escapes 0, needs to save 0 GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
/* { dg-final { cleanup-tree-dump "stdarg" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/stdarg-3.c b/gcc/testsuite/gcc.dg/tree-ssa/stdarg-3.c
index 306f7a93ec8..ac3aeb94a1e 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/stdarg-3.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/stdarg-3.c
@@ -23,6 +23,7 @@ f1 (int i, ...)
/* { dg-final { scan-tree-dump "f1: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f1: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f1: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f1: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f1: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f1: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -36,6 +37,7 @@ f2 (int i, ...)
/* { dg-final { scan-tree-dump "f2: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f2: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f2: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f2: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f2: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f2: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -52,6 +54,7 @@ f3 (int i, ...)
/* { dg-final { scan-tree-dump "f3: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f3: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f3: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f3: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f3: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f3: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -66,6 +69,7 @@ f4 (int i, ...)
/* { dg-final { scan-tree-dump "f4: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f4: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f4: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f4: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f4: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f4: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -80,6 +84,7 @@ f5 (int i, ...)
/* { dg-final { scan-tree-dump "f5: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f5: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f5: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f5: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f5: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f5: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -96,6 +101,7 @@ f6 (int i, ...)
/* { dg-final { scan-tree-dump "f6: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f6: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f6: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f6: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f6: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f6: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -110,6 +116,7 @@ f7 (int i, ...)
/* { dg-final { scan-tree-dump "f7: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f7: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f7: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f7: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f7: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f7: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -124,6 +131,7 @@ f8 (int i, ...)
/* { dg-final { scan-tree-dump "f8: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f8: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f8: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f8: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f8: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f8: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -138,6 +146,7 @@ f10 (int i, ...)
/* { dg-final { scan-tree-dump "f10: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f10: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f10: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f10: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f10: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f10: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -152,6 +161,7 @@ f11 (int i, ...)
/* { dg-final { scan-tree-dump "f11: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f11: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f11: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f11: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f11: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f11: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -166,6 +176,7 @@ f12 (int i, ...)
/* { dg-final { scan-tree-dump "f12: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f12: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f12: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f12: va_list escapes 1, needs to save all GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f12: va_list escapes 1, needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f12: va_list escapes 1, needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
/* { dg-final { cleanup-tree-dump "stdarg" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/stdarg-4.c b/gcc/testsuite/gcc.dg/tree-ssa/stdarg-4.c
index 840d04a1f49..61e12f3c12c 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/stdarg-4.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/stdarg-4.c
@@ -26,6 +26,7 @@ f1 (int i, ...)
/* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save all GPR units and 0 FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save all GPR units and 0 FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save all GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save all GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f1: va_list escapes \[01\], needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f1: va_list escapes \[01\], needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -41,6 +42,7 @@ f2 (int i, ...)
/* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save 0 GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save 0 GPR units and all FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save all GPR units and 2" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save 0 GPR units and all FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f2: va_list escapes \[01\], needs to save all GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f2: va_list escapes \[01\], needs to save all GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -62,6 +64,7 @@ f3 (int i, ...)
/* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save \[148\] GPR units and 0 FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save \[148\] GPR units and 0 FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 8 GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 1 GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save \[148\] GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save \[148\] GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
@@ -81,6 +84,7 @@ f4 (int i, ...)
/* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save 0 GPR units and \[1-9\]\[0-9\]* FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save 0 GPR units and \[1-9\]\[0-9\]* FPR units" "stdarg" { target { powerpc*-*-linux* && ilp32 } } } } */
/* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save 8 GPR units and 2" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save 0 GPR units and 1 FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save \[148\] GPR units" "stdarg" { target i?86-*-* ia64-*-* } } } */
/* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save \[148\] GPR units" "stdarg" { target { powerpc*-*-* && lp64 } } } } */
/* { dg-final { cleanup-tree-dump "stdarg" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/stdarg-5.c b/gcc/testsuite/gcc.dg/tree-ssa/stdarg-5.c
index ff7b104bceb..bd62f2bdfef 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/stdarg-5.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/stdarg-5.c
@@ -24,6 +24,7 @@ f1 (int i, ...)
}
/* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save 0 GPR units and 0 FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save all GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f1: va_list escapes 0, needs to save all GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
void
f2 (int i, ...)
@@ -36,6 +37,7 @@ f2 (int i, ...)
}
/* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save all GPR units and all FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save all GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f2: va_list escapes 0, needs to save all GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
/* Here va_arg can be executed at most as many times as va_start. */
void
@@ -53,6 +55,7 @@ f3 (int i, ...)
}
/* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 0 GPR units and 0 FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 32 GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f3: va_list escapes 0, needs to save 1 GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
void
f4 (int i, ...)
@@ -70,6 +73,7 @@ f4 (int i, ...)
}
/* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save 16 GPR units and 16 FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save 24 GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f4: va_list escapes 0, needs to save 2 GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
void
f5 (int i, ...)
@@ -83,6 +87,7 @@ f5 (int i, ...)
}
/* { dg-final { scan-tree-dump "f5: va_list escapes 0, needs to save 16 GPR units and 0 FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f5: va_list escapes 0, needs to save 32 GPR units and 1" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f5: va_list escapes 0, needs to save (4|2) GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
void
f6 (int i, ...)
@@ -96,6 +101,7 @@ f6 (int i, ...)
}
/* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save 8 GPR units and 32 FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save 32 GPR units and 3" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f6: va_list escapes 0, needs to save (3|2) GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
void
f7 (int i, ...)
@@ -109,4 +115,5 @@ f7 (int i, ...)
}
/* { dg-final { scan-tree-dump "f7: va_list escapes 0, needs to save 0 GPR units and 64 FPR units" "stdarg" { target { x86_64-*-* && lp64 } } } } */
/* { dg-final { scan-tree-dump "f7: va_list escapes 0, needs to save 32 GPR units and 2" "stdarg" { target alpha*-*-linux* } } } */
+/* { dg-final { scan-tree-dump "f7: va_list escapes 0, needs to save 2 GPR units and 0 FPR units" "stdarg" { target s390*-*-linux* } } } */
/* { dg-final { cleanup-tree-dump "stdarg" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp01.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp01.c
new file mode 100644
index 00000000000..1edda2941fa
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp01.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
+
+foo (int *p, int i)
+{
+ int x;
+
+ if (i > 10)
+ {
+ if (p)
+ {
+ x = *p;
+ p = 0;
+ }
+ }
+ else
+ p = 0;
+
+ /* This should be folded to if (1), but only if we insert an
+ assertion on the ELSE edge from the inner 'if (p)'. */
+ if (p == 0)
+ return x + 1;
+
+ return i;
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 1" 1 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp02.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp02.c
new file mode 100644
index 00000000000..61cb3087c86
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp02.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
+
+struct A
+{
+ int a;
+ int b;
+};
+
+foo (struct A *p, struct A *q)
+{
+ int x = p->a;
+ if (p == q)
+ return q->a;
+
+ /* We should fold this to 'if (1)' but the assertion for 'p == q'
+ was overwriting the assertion 'p != 0' from the first dereference
+ of 'p'. */
+ if (p)
+ return x + p->b;
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 1" 1 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp03.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp03.c
new file mode 100644
index 00000000000..20fcb917eb3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp03.c
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
+
+struct A
+{
+ int a;
+ int b;
+};
+
+foo (struct A *p, struct A *q)
+{
+ int *r = 0;
+
+ if (p)
+ {
+ if (p == q)
+ {
+ /* This should be folded to 'if (1)' because q is [p, p]
+ and p is ~[0, 0]. */
+ if (q)
+ r = &q->a;
+
+ /* This should be folded to 'if (1)' because q should be
+ ~[0, 0] and thus &q->a should be ~[0, 0]. */
+ if (r)
+ return 5;
+ }
+ }
+
+ return q->a;
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate q_.*to 1" 1 "vrp" } } */
+/* { dg-final { scan-tree-dump-times "Folding predicate r_.*to 1" 1 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp04.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp04.c
new file mode 100644
index 00000000000..26322483f03
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp04.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
+
+foo (int a, int b)
+{
+ if (a == b)
+ /* This should be folded to if (1) */
+ if (a == b)
+ return a + b;
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate a_.*to 1" 1 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp05.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp05.c
new file mode 100644
index 00000000000..767d3e1dead
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp05.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
+
+foo (int k, int j)
+{
+ if (k >= 10)
+ {
+ if (j > k)
+ {
+ /* We should fold this to if (1). */
+ if (j > 0)
+ return j;
+ }
+ }
+
+ return j;
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate j_.*to 1" 1 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp06.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp06.c
new file mode 100644
index 00000000000..a92db95749a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp06.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
+
+foo (int i, int j, int a)
+{
+ if (i >= 10)
+ if (i <= 30)
+ if (i == j)
+ {
+ a--;
+
+ /* This should fold to 'if (0)'. */
+ if (i < 0)
+ i = baz ();
+
+ /* This should fold to 'if (1)'. */
+ if (j > 0)
+ a--;
+
+ /* This should fold to 'if (0)'. */
+ if (i != j)
+ return 0;
+ }
+
+ return i + a + j;
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate i_.*to 0" 1 "vrp" } } */
+/* { dg-final { scan-tree-dump-times "Folding predicate j_.*to 1" 1 "vrp" } } */
+/* { dg-final { scan-tree-dump-times "Folding predicate i_.*to 0" 1 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp07.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp07.c
new file mode 100644
index 00000000000..49df596b04e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp07.c
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp-details" } */
+
+foo (int i, int *p)
+{
+ int j;
+
+ if (i > 10)
+ {
+ if (p)
+ {
+ j = *p;
+ /* This should be folded to if (1) because of the parent 'if
+ (p)'. But the dereference of p above does not need an
+ assertion. */
+ if (p)
+ return j + 1;
+ }
+ }
+ else
+ {
+ j = *p - 3;
+ /* This should be folded to if (0), because p has just been
+ dereferenced. But we were not inserting enough ASSERT_EXPRs
+ to figure it out. */
+ if (!p)
+ return j - 4;
+ }
+
+ return i;
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 1" 1 "vrp" } } */
+/* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 0" 1 "vrp" } } */
+/* { dg-final { scan-tree-dump-times "PREDICATE: p_\[0-9\] ne_expr 0B" 2 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp08.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp08.c
new file mode 100644
index 00000000000..5bf43fe9f37
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp08.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-tree-fre -fdump-tree-vrp-details" } */
+
+/* Compile with -fno-tree-fre -O2 to prevent CSEing *p. */
+foo (int a, int *p)
+{
+ int x = *p + 2;
+ int y = *p - 1;
+ int z = *p + 9;
+
+ /* This should be folded to if (1), but only one ASSERT_EXPR should
+ be inserted. */
+ if (p)
+ a = x + y + z;
+ else
+ a = x - y;
+
+ return a;
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate p_.*to 1" 1 "vrp" } } */
+/* { dg-final { scan-tree-dump-times "PREDICATE: p_. ne_expr 0" 1 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp09.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp09.c
new file mode 100644
index 00000000000..6a2c98344d0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp09.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
+
+foo (int *p)
+{
+ int x = baz ();
+
+ if (p == 0)
+ goto L78;
+ else
+ {
+ x = *p;
+ /* This should be folded to if (1). */
+ if (p)
+ x = x + 1;
+L78:
+ /* This should not be folded to if (1). */
+ if (p)
+ {
+ x = baz (*p);
+ /* This should be folded to if (1). */
+ if (p)
+ return x + 3;
+ }
+
+ return x - 3;
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate p_.. != 0B to 1" 2 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp10.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp10.c
new file mode 100644
index 00000000000..5a745845948
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp10.c
@@ -0,0 +1,25 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+extern void abort (void);
+
+foo (int k, int j)
+{
+ if (k >= 10)
+ {
+ if (j > k)
+ {
+ /* We should fold this to if (0). */
+ if (j < 10)
+ abort ();
+ }
+ }
+
+ return j;
+}
+
+main()
+{
+ foo (10, 3);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp11.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp11.c
new file mode 100644
index 00000000000..b9e5fca71f9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp11.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp" } */
+
+foo (int k, int j, int z)
+{
+ if (k > z)
+ {
+ if (j > k)
+ {
+ /* We should fold this to if (1). */
+ if (j > z)
+ return j;
+ }
+ }
+
+ return j;
+}
+
+/* { dg-final { scan-tree-dump-times "Folding predicate.*to 1" 1 "vrp" } } */
+/* { dg-final { cleanup-tree-dump "vrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp12.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp12.c
new file mode 100644
index 00000000000..1714a561cd5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp12.c
@@ -0,0 +1,23 @@
+/* { dg-do link } */
+/* { dg-options -O2 } */
+
+foo (int i)
+{
+ int x;
+
+ x = i;
+ if (i < -10)
+ {
+ x = __builtin_abs (i);
+ /* VRP was incorrectly folding this to if (1). */
+ if (x < 0)
+ link_error ();
+ }
+
+ return x;
+}
+
+main()
+{
+ foo (-30);
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp13.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp13.c
new file mode 100644
index 00000000000..4b3afdbc8c6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp13.c
@@ -0,0 +1,258 @@
+/* { dg-do run } */
+/* { dg-options -O2 } */
+
+extern void abort (void);
+
+foo_div (int i, int j)
+{
+ int k;
+
+ /* [-INF, -1] / [1, +INF] should not give [-1, -1]. */
+ if (i <= -1)
+ if (j >= 1)
+ {
+ k = i / j;
+ if (k == -1)
+ abort ();
+
+ return k;
+ }
+
+ /* [-20, -10] / [2, 10] should give [-10, -1]. */
+ if (i >= -20)
+ if (i <= -10)
+ if (j >= 2)
+ if (j <= 10)
+ {
+ k = i / j;
+ if (k < -10)
+ link_error ();
+ if (k > -1)
+ link_error ();
+
+ return k;
+ }
+
+ /* [-20, -10] / [-10, -2] should give [1, 10]. */
+ if (i >= -20)
+ if (i <= -10)
+ if (j >= -10)
+ if (j <= -2)
+ {
+ k = i / j;
+ if (k < 1)
+ link_error ();
+ if (k > 10)
+ link_error ();
+
+ return k;
+ }
+
+ /* [-20, 10] / [2, 10] should give [-10, 5]. */
+ if (i >= -20)
+ if (i <= 10)
+ if (j >= 2)
+ if (j <= 10)
+ {
+ k = i / j;
+ if (k < -10)
+ link_error ();
+ if (k > 5)
+ link_error ();
+
+ return k;
+ }
+
+ /* [-20, 10] / [-10, -2] should give [-5, 10]. */
+ if (i >= -20)
+ if (i <= 10)
+ if (j >= -10)
+ if (j <= -2)
+ {
+ k = i / j;
+ if (k < -5)
+ link_error ();
+ if (k > 10)
+ link_error ();
+
+ return k;
+ }
+
+ /* [10, 20] / [2, 10] should give [1, 10]. */
+ if (i >= 10)
+ if (i <= 20)
+ if (j >= 2)
+ if (j <= 10)
+ {
+ k = i / j;
+ if (k < 1)
+ link_error ();
+ if (k > 10)
+ link_error ();
+
+ return k;
+ }
+
+ /* [10, 20] / [-10, -2] should give [-10, -1]. */
+ if (i >= 10)
+ if (i <= 20)
+ if (j >= -10)
+ if (j <= -2)
+ {
+ k = i / j;
+ if (k > -1)
+ link_error ();
+ if (k < -10)
+ link_error ();
+
+ return k;
+ }
+
+ abort ();
+}
+
+
+foo_mult (int i, int j)
+{
+ int k;
+
+ /* [-20, -10] * [2, 10] should give [-200, -20]. */
+ if (i >= -20)
+ if (i <= -10)
+ if (j >= 2)
+ if (j <= 10)
+ {
+ k = i * j;
+ if (k < -200)
+ link_error ();
+ if (k > -20)
+ link_error ();
+
+ return k;
+ }
+
+ /* [-20, -10] * [-10, -2] should give [20, 200]. */
+ if (i >= -20)
+ if (i <= -10)
+ if (j >= -10)
+ if (j <= -2)
+ {
+ k = i * j;
+ if (k < 20)
+ link_error ();
+ if (k > 200)
+ link_error ();
+
+ return k;
+ }
+
+ /* [-20, 10] * [2, 10] should give [-200, 100]. */
+ if (i >= -20)
+ if (i <= 10)
+ if (j >= 2)
+ if (j <= 10)
+ {
+ k = i * j;
+ if (k < -200)
+ link_error ();
+ if (k > 100)
+ link_error ();
+
+ return k;
+ }
+
+ /* [-20, 10] * [-10, -2] should give [-100, 200]. */
+ if (i >= -20)
+ if (i <= 10)
+ if (j >= -10)
+ if (j <= -2)
+ {
+ k = i * j;
+ if (k < -100)
+ link_error ();
+ if (k > 200)
+ link_error ();
+
+ return k;
+ }
+
+ /* [10, 20] * [2, 10] should give [20, 200]. */
+ if (i >= 10)
+ if (i <= 20)
+ if (j >= 2)
+ if (j <= 10)
+ {
+ k = i * j;
+ if (k < 20)
+ link_error ();
+ if (k > 200)
+ link_error ();
+
+ return k;
+ }
+
+ /* [10, 20] * [-10, -2] should give [-200, -20]. */
+ if (i >= 10)
+ if (i <= 20)
+ if (j >= -10)
+ if (j <= -2)
+ {
+ k = i * j;
+ if (k < -200)
+ link_error ();
+ if (k > -20)
+ link_error ();
+
+ return k;
+ }
+
+ abort ();
+}
+
+
+main()
+{
+ if (foo_div (-10, 5) != -2)
+ abort ();
+
+ if (foo_div (-16, 4) != -4)
+ abort ();
+
+ if (foo_div (-15, -5) != 3)
+ abort ();
+
+ if (foo_div (8, 2) != 4)
+ abort ();
+
+ if (foo_div (10, -2) != -5)
+ abort ();
+
+ if (foo_div (20, 5) != 4)
+ abort ();
+
+ if (foo_div (15, -3) != -5)
+ abort ();
+
+ if (foo_mult (-10, 5) != -50)
+ abort ();
+
+ if (foo_mult (-16, 4) != -64)
+ abort ();
+
+ if (foo_mult (-15, -5) != 75)
+ abort ();
+
+ if (foo_mult (8, 2) != 16)
+ abort ();
+
+ if (foo_mult (10, -2) != -20)
+ abort ();
+
+ if (foo_mult (20, 5) != 100)
+ abort ();
+
+ if (foo_mult (15, -3) != -45)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp14.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp14.c
new file mode 100644
index 00000000000..833a73dcadc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp14.c
@@ -0,0 +1,46 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+struct tree_decl
+{
+ union tree_decl_u1 {
+ int f;
+ long i;
+ struct tree_decl_u1_a {
+ unsigned int align : 24;
+ unsigned int off_align : 8;
+ } a;
+ } u1;
+};
+
+extern void abort (void);
+
+unsigned int
+assemble_variable (struct tree_decl decl)
+{
+ unsigned int align;
+
+ align = decl.u1.a.align;
+
+ if (align > (1 << ((8 * 4) < 64 ? (8 * 4) - 2 : 62)))
+ align = (1 << ((8 * 4) < 64 ? (8 * 4) - 2 : 62));
+
+ /* VRP should not be propagating 0 to the RHS of this assignment.
+ But it was erroneously applying a cast operation between types of
+ different precision. align is an unsigned int with range [0,
+ 0x4000000] but the .align field holds only 24 bits. So the cast
+ was returning a [0, 0] range. */
+ decl.u1.a.align = align;
+
+ return decl.u1.a.align;
+}
+
+main ()
+{
+ struct tree_decl decl;
+ decl.u1.a.align = 13;
+ unsigned int x = assemble_variable (decl);
+ if (x == 0)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/uninit-4.c b/gcc/testsuite/gcc.dg/uninit-4.c
index 3a8d917df28..d39ecac77c4 100644
--- a/gcc/testsuite/gcc.dg/uninit-4.c
+++ b/gcc/testsuite/gcc.dg/uninit-4.c
@@ -23,7 +23,7 @@ extern struct operation cpp_lex (void);
void
cpp_parse_expr (void)
{
- int rprio; /* { dg-bogus "rprio" "uninitialized variable warning PR19833" { xfail { powerpc*-*-* && lp64 } } } */
+ int rprio; /* { dg-bogus "rprio" "uninitialized variable warning PR19833" } */
struct operation op;
for (;;)
diff --git a/gcc/testsuite/gcc.dg/uninit-9.c b/gcc/testsuite/gcc.dg/uninit-9.c
index 62681f9e0fd..2a8ccb69f32 100644
--- a/gcc/testsuite/gcc.dg/uninit-9.c
+++ b/gcc/testsuite/gcc.dg/uninit-9.c
@@ -23,7 +23,7 @@ func(struct foo *list, int count)
{
int n_clobbers = 0;
int i;
- struct foo **clob_list; /* { dg-bogus "clob_list" "uninitialized variable warning" { xfail *-*-* } } */
+ struct foo **clob_list; /* { dg-bogus "clob_list" "uninitialized variable warning" } */
if(list[0].type == PARALLEL)
{
diff --git a/gcc/testsuite/gcc.dg/unroll-1.c b/gcc/testsuite/gcc.dg/unroll-1.c
index 2ea694f3521..7b09cd1d209 100644
--- a/gcc/testsuite/gcc.dg/unroll-1.c
+++ b/gcc/testsuite/gcc.dg/unroll-1.c
@@ -1,8 +1,9 @@
/* PR optimization/8599 */
/* { dg-do run } */
/* { dg-options "-O2 -funroll-loops" } */
-/* { dg-options "-mtune=k6 -O2 -funroll-loops" { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-options "-mtune=k6 -O2 -funroll-loops" { target { i?86-*-* && ilp32 } } } */
+/* { dg-options "-mtune=k6 -O2 -funroll-loops" { target { x86_64-*-* && ilp32 } } } */
+
extern void abort (void);
diff --git a/gcc/testsuite/gcc.dg/vect/vect-106.c b/gcc/testsuite/gcc.dg/vect/vect-106.c
new file mode 100644
index 00000000000..43e43a6cd1f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-106.c
@@ -0,0 +1,40 @@
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+
+int
+main1 (void)
+{
+ int i;
+ short sb[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+ int ia[N];
+
+ /* Type cast. */
+ for (i = 0; i < N; i++)
+ {
+ ia[i] = (int) sb[i];
+ }
+
+
+ /* Check results. */
+ for (i = 0; i < N; i++)
+ {
+ if (ia[i] != (int) sb[i])
+ abort();
+ }
+
+ return 0;
+}
+
+int main (void)
+{
+ check_vect ();
+ return main1 ();
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
diff --git a/gcc/testsuite/gcc.dg/vect/vect-107.c b/gcc/testsuite/gcc.dg/vect/vect-107.c
new file mode 100644
index 00000000000..f8031afad11
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-107.c
@@ -0,0 +1,42 @@
+/* { dg-require-effective-target vect_float } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+
+int
+main1 (void)
+{
+ int i;
+ float a[N];
+ float b[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+ float c[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
+ float d[N] = {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30};
+
+ /* Strided access pattern. */
+ for (i = 0; i < N/2; i++)
+ {
+ a[i] = b[2*i+1] * c[2*i+1] - b[2*i] * c[2*i];
+ d[i] = b[2*i] * c[2*i+1] + b[2*i+1] * c[2*i];
+ }
+
+ /* Check results. */
+ for (i = 0; i < N/2; i++)
+ {
+ if (a[i] != b[2*i+1] * c[2*i+1] - b[2*i] * c[2*i]
+ || d[i] != b[2*i] * c[2*i+1] + b[2*i+1] * c[2*i])
+ abort();
+ }
+
+ return 0;
+}
+
+int main (void)
+{
+ check_vect ();
+ return main1 ();
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-108.c b/gcc/testsuite/gcc.dg/vect/vect-108.c
new file mode 100644
index 00000000000..2fa61d02f09
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-108.c
@@ -0,0 +1,40 @@
+/* { dg-require-effective-target vect_int_mult } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+
+int
+main1 (void)
+{
+ int i;
+ int ic[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+ int ib[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+ int ia[N];
+
+ /* This loop is vectorized on platforms that support vect_int_mult. */
+ for (i = 0; i < N; i++)
+ {
+ ia[i] = ib[i] * ic[i];
+ }
+
+ /* Check results. */
+ for (i = 0; i < N; i++)
+ {
+ if (ia[i] != ib[i] * ic[i])
+ abort ();
+ }
+
+ return 0;
+}
+
+int main (void)
+{
+ check_vect ();
+ return main1 ();
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
diff --git a/gcc/testsuite/gcc.dg/vect/vect-109.c b/gcc/testsuite/gcc.dg/vect/vect-109.c
new file mode 100644
index 00000000000..ba6b2cee3d6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-109.c
@@ -0,0 +1,44 @@
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+
+int
+main1 ()
+{
+ int i;
+ short sc[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+ short sb[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+ short sa[N];
+ int ic[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+ int ib[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+ int ia[N];
+
+ /* Two types with different nunits in vector. */
+ for (i = 0; i < N; i++)
+ {
+ ia[i] = ib[i] + ic[i];
+ sa[i] = sb[i] + sc[i];
+ }
+
+ /* Check results. */
+ for (i = 0; i < N; i++)
+ {
+ if (ia[i] != ib[i] + ic[i] || sa[i] != sb[i] + sc[i])
+ abort();
+ }
+
+ return 0;
+}
+
+int main (void)
+{
+ check_vect ();
+ return main1 ();
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
diff --git a/gcc/testsuite/gcc.dg/vect/vect-110.c b/gcc/testsuite/gcc.dg/vect/vect-110.c
new file mode 100644
index 00000000000..3fa4f414685
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-110.c
@@ -0,0 +1,40 @@
+/* { dg-require-effective-target vect_float } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+
+int
+main1 (void)
+{
+ int i;
+ float a[N];
+ float b[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+ float c[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
+
+ /* Too conservative dependence test. */
+ for (i = 0; i < N - 1; i++){
+ a[i] = b[i] + c[i];
+ a[i+1] = b[i] + c[i];
+ }
+
+ /* Check results. */
+ for (i = 0; i < N - 1; i++){
+ if (a[i] != b[i] + c[i])
+ abort ();
+ }
+
+ return 0;
+}
+
+int main (void)
+{
+ check_vect ();
+ return main1 ();
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
+
diff --git a/gcc/testsuite/gcc.dg/vect/vect-111.c b/gcc/testsuite/gcc.dg/vect/vect-111.c
new file mode 100644
index 00000000000..8fb3f72d95e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-111.c
@@ -0,0 +1,38 @@
+/* { dg-require-effective-target vect_float } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+
+int
+main1 (void)
+{
+ int i;
+ float a[N];
+ float b[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+
+ /* Condition in loop. */
+ /* This loop is vectorized on platforms that support vect_condition. */
+ for (i = 0; i < N; i++)
+ {
+ a[i] = (b[i] > 0 ? b[i] : 0);
+ }
+
+ for (i = 0; i < N; i++)
+ {
+ if (a[i] != b[i])
+ abort ();
+ }
+ return 0;
+}
+
+int main (void)
+{
+ check_vect ();
+ return main1 ();
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target powerpc*-*-* } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target i?86-*-* x86_64-*-* ia64-*-* } } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-112.c b/gcc/testsuite/gcc.dg/vect/vect-112.c
new file mode 100644
index 00000000000..8363f302d2f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-112.c
@@ -0,0 +1,38 @@
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+
+int
+main1 (void)
+{
+ int i;
+ int diff = 0;
+ char cb[N] = {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};
+ char cc[N] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
+
+ /* Cross-iteration cycle. */
+ diff = 0;
+ for (i = 0; i < N; i++) {
+ diff += (cb[i] - cc[i]);
+ }
+
+ /* Check results. */
+ if (diff != 16)
+ abort();
+
+ return 0;
+}
+
+int main (void)
+{
+ check_vect ();
+ return main1 ();
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
+
diff --git a/gcc/testsuite/gcc.dg/vect/vect-113.c b/gcc/testsuite/gcc.dg/vect/vect-113.c
new file mode 100644
index 00000000000..e09a16b3655
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-113.c
@@ -0,0 +1,36 @@
+/* { dg-require-effective-target vect_float } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+
+int
+main1 (void)
+{
+ int i;
+ float a[N];
+
+ /* Induction. */
+ for ( i = 0; i < N; i++)
+ {
+ a[i] = i;
+ }
+
+ for ( i = 0; i < N; i++)
+ {
+ if (a[i] != i)
+ abort ();
+ }
+
+ return 0;
+}
+
+int main (void)
+{
+ check_vect ();
+ return main1 ();
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-114.c b/gcc/testsuite/gcc.dg/vect/vect-114.c
new file mode 100644
index 00000000000..41ecd48680e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-114.c
@@ -0,0 +1,39 @@
+/* { dg-require-effective-target vect_float } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+
+int
+main1 (void)
+{
+ int i;
+ float a[N];
+ float b[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+
+ /* Reverse access and forward access. */
+ for (i = N; i > 0; i--)
+ {
+ a[N-i] = b[i-1];
+ }
+
+ /* Check results. */
+ for (i = 0; i <N; i++)
+ {
+ if (a[i] != b[N-1-i])
+ abort ();
+ }
+
+ return 0;
+}
+
+int main (void)
+{
+ check_vect ();
+ return main1 ();
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
diff --git a/gcc/testsuite/gcc.dg/vect/vect-62.c b/gcc/testsuite/gcc.dg/vect/vect-62.c
index f696aa355b8..433b8bf3571 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-62.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-62.c
@@ -32,7 +32,9 @@ int main1 ()
}
/* Multidimensional array. Aligned. The "inner" dimensions
- are invariant in the inner loop. Store. */
+ are invariant in the inner loop. Vectorizable, but the
+ vectorizer detects that everything is invariant and that
+ the loop is better left untouched. (it should be optimized away). */
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
@@ -62,6 +64,7 @@ int main (void)
return main1 ();
}
-/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+/* { dg-final { scan-tree-dump-times "not vectorized: redundant loop. no profit to vectorize." 1 "vect" } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-7.c b/gcc/testsuite/gcc.dg/vect/vect-7.c
index c753de8cd81..e359bbe2c56 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-7.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-7.c
@@ -45,7 +45,7 @@ int main (void)
return main1 ();
}
-/* Fails for targets that don't vectorize PLUS. */
-/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { xfail alpha*-*-* } } } */
+/* Fails for 32-bit targets that don't vectorize PLUS. */
+/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" } } */
/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-77.c b/gcc/testsuite/gcc.dg/vect/vect-77.c
index 14da163a778..8557b298bf8 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-77.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-77.c
@@ -39,7 +39,7 @@ int main (void)
return 0;
}
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail { lp64 || vect_no_align } } } } */
-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { xfail { lp64 || vect_no_align } } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail { vect_no_align } } } } */
+/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { xfail { vect_no_align } } } } */
/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-78.c b/gcc/testsuite/gcc.dg/vect/vect-78.c
index e22efcac7c6..a059f308b9c 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-78.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-78.c
@@ -40,7 +40,7 @@ int main (void)
return 0;
}
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail { lp64 || vect_no_align } } } } */
-/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { xfail { lp64 || vect_no_align } } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail { vect_no_align } } } } */
+/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { xfail { vect_no_align } } } } */
/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 0 "vect" } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-91.c b/gcc/testsuite/gcc.dg/vect/vect-91.c
new file mode 100644
index 00000000000..80afd692d35
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-91.c
@@ -0,0 +1,70 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 256
+
+extern int a[N];
+
+/* The alignment of 'pa' is unknown.
+ Yet we do know that both the read access and write access have
+ the same alignment. Peeling to align one of the accesses will
+ align the other.
+
+ Not vectorized yet due to problems in dataref analysis that
+ are fixed in autovect-branch but not yet in mainline. */
+
+int
+main1 (int * pa)
+{
+ int i;
+
+ for (i = 0; i < N; i++)
+ {
+ pa[i] = pa[i] + 1;
+ }
+
+ return 0;
+}
+
+/* The alignment of 'a' is unknown.
+ Yet we do know that both the read access and write access have
+ the same alignment. Peeling to align one of the accesses will
+ align the other. */
+
+int
+main2 ()
+{
+ int i;
+
+ for (i = 0; i < N; i++)
+ {
+ a[i] = a[i] + 1;
+ }
+
+ return 0;
+}
+
+int
+main3 ()
+{
+ int i;
+
+ for (i = 0; i < N; i++)
+ {
+ a[i] = a[i+20];
+ }
+
+ return 0;
+}
+
+/* Currently only the loops in main2 and main3 get vectorized. After the merge
+ of the datarefs-analysis cleanups from autovect-branch to mainline, the loop
+ in main1 will also be vectorized. */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" } } */
+/* { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 0 "vect" } } */
+/* { dg-final { scan-tree-dump-times "accesses have the same alignment." 2 "vect" } } */
+/* { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 2 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-dv-2.c b/gcc/testsuite/gcc.dg/vect/vect-dv-2.c
index 24d5eb3c4b9..69d619ed1ea 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-dv-2.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-dv-2.c
@@ -69,5 +69,6 @@ int main ()
-/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { xfail vect_no_align } } } */
+/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "accesses have the same alignment." 2 "vect" } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-1.c b/gcc/testsuite/gcc.dg/vect/vect-ifcvt-1.c
deleted file mode 100644
index 715e9906974..00000000000
--- a/gcc/testsuite/gcc.dg/vect/vect-ifcvt-1.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/* { dg-require-effective-target vect_condition } */
-
-#include <stdarg.h>
-#include <signal.h>
-
-#define N 64
-#define MAX 42
-
-extern void abort(void);
-
-int main ()
-{
- int A[N];
- int B[N];
- int C[N];
- int D[N];
-
- int i, j;
-
- for (i = 0; i < N; i++)
- {
- A[i] = i;
- B[i] = i;
- C[i] = i;
- D[i] = i;
- }
-
- /* Vectorizable */
- for (i = 0; i < 16; i++)
- {
- A[i] = A[i+20];
- }
-
- /* check results: */
- for (i = 0; i < 16; i++)
- {
- if (A[i] != A[i+20])
- abort ();
- }
-
- /* Vectorizable */
- for (i = 0; i < 16; i++)
- {
- B[i] = B[i] + 5;
- }
-
- /* check results: */
- for (i = 0; i < 16; i++)
- {
- if (B[i] != C[i] + 5)
- abort ();
- }
-
- /* Not vectorizable */
- for (i = 0; i < 4; i++)
- {
- C[i] = C[i+3];
- }
-
- /* check results: */
- for (i = 0; i < 4; i++)
- {
- if (C[i] != D[i+3])
- abort ();
- }
-
-
- return 0;
-}
-
-
-
-/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { xfail vect_no_align } } } */
-/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-none.c b/gcc/testsuite/gcc.dg/vect/vect-none.c
deleted file mode 100644
index e36f4871cd4..00000000000
--- a/gcc/testsuite/gcc.dg/vect/vect-none.c
+++ /dev/null
@@ -1,191 +0,0 @@
-/* { dg-do compile } */
-/* { dg-require-effective-target vect_int } */
-/* { dg-require-effective-target vect_float } */
-
-#define N 16
-
-extern void abort (void);
-
-int iadd_results[N] = {0,6,12,18,24,30,36,42,48,54,60,66,72,78,84,90};
-float fadd_results[N] = {0.0,6.0,12.0,18.0,24.0,30.0,36.0,42.0,48.0,54.0,60.0,66.0,72.0,78.0,84.0,90.0};
-float fmul_results[N] = {0.0,3.0,12.0,27.0,48.0,75.0,108.0,147.0,192.0,243.0,300.0,363.0,432.0,507.0,588.0,675.0};
-float fresults1[N] = {192.00,240.00,288.00,336.00,384.00,432.00,480.00,528.00,48.00,54.00,60.00,66.00,72.00,78.00,84.00,90.00};
-float fresults2[N] = {0.00,6.00,12.00,18.00,24.00,30.00,36.00,42.00,0.00,54.00,120.00,198.00,288.00,390.00,504.00,630.00};
-
-/****************************************************/
-void icheck_results (int *a, int *results)
-{
- int i;
- for (i = 0; i < N; i++)
- {
- if (a[i] != results[i])
- abort ();
- }
-}
-
-void fcheck_results (float *a, float *results)
-{
- int i;
- for (i = 0; i < N; i++)
- {
- if (a[i] != results[i])
- abort ();
- }
-}
-
-void
-fbar_mul (float *a)
-{
- fcheck_results (a, fmul_results);
-}
-
-void
-fbar_add (float *a)
-{
- fcheck_results (a, fadd_results);
-}
-
-void
-ibar_add (int *a)
-{
- icheck_results (a, iadd_results);
-}
-
-void
-fbar1 (float *a)
-{
- fcheck_results (a, fresults1);
-}
-
-void
-fbar2 (float *a)
-{
- fcheck_results (a, fresults2);
-}
-
-
-/* None of the loops below is currently vectorizable. The vectorizer will
- be enhanced to vectorize most of these loops. */
-
-int
-foo (int n)
-{
- int i,j;
- float a[N];
- float e[N];
- float b[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
- float c[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
- float d[N] = {0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30};
- short sc[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
- short sb[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
- short sa[N];
- int ic[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
- int ib[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
- int ia[N];
- int diff = 0;
- char cb[N];
- char cc[N];
- char image[N][N];
- char block[N][N];
-
-
- /* Test 1 - type cast. */
- for (i = 0; i < N; i++)
- {
- ia[i] = (int) sb[i];
- }
- fbar (a);
-
-
- /* Test 2 - strided access pattern. */
- for (i = 0; i < N/2; i++)
- {
- a[i] = b[2*i+1] * c[2*i+1] - b[2*i] * c[2*i];
- d[i] = b[2*i] * c[2*i+1] + b[2*i+1] * c[2*i];
- }
- fbar (a);
-
-
- /* Test 3 - no target support for integer mult. */
- /* This loop is vectorized on platforms that support vect_int_mult. */
- for (i = 0; i < N; i++)
- {
- ia[i] = ib[i] * ic[i];
- }
- ibar (ia);
-
-
- /* Test 4 - two types with different nunits in vector. */
- for (i = 0; i < N; i++)
- {
- ia[i] = ib[i] + ic[i];
- sa[i] = sb[i] + sc[i];
- }
- ibar (ia);
- sbar (sa);
-
-
- /* Test 5 - too conservative dependence test. */
- for (i = 0; i < N; i++){
- a[i] = b[i] + c[i];
- a[i+1] = b[i] + c[i];
- }
- fbar (a);
-
-
- /* Test 6 - condition in loop. */
- /* This loop is vectorized on platformst that support vect_condition. */
- for (i = 0; i < N; i++){
- a[i] = (b[i] > 0 ? b[i] : 0);
- }
- fbar (a);
-
-
- /* Test 7 - cross-iteration cycle. */
- diff = 0;
- for (i = 0; i < N; i++) {
- diff += (cb[i] - cc[i]);
- }
- ibar (&diff);
-
-
- /* Test 8 - outer-loop not attempted; inner-loop has cross
- iteration cycle and multi-dimensional arrays. */
- diff = 0;
- for (i = 0; i < N; i++) {
- for (i = 0; i < N; i++) {
- diff += (image[i][j] - block[i][j]);
- }
- }
- ibar (&diff);
-
-
- /* Test 9 - induction. */
- for ( i = 0; i < N; i++) {
- a[i] = i;
- }
- fbar (a);
-
-
- /* Test 10 - reverse access and forward access. */
- for (i = N; i > 0; i--)
- {
- a[N-i] = b[i-1];
- }
- /* check results: */
- for (i = 0; i <N; i++)
- {
- if (a[i] != b[N-1-i])
- abort ();
- }
-
- return 0;
-}
-
-/* { dg-final { scan-tree-dump-times "vectorized " 3 "vect"} } */
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 3 "vect" { xfail powerpc*-*-* i?86-*-* x86_64-*-* } } } */
-/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { target powerpc*-*-* } } } */
-/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 2 "vect" { target powerpc*-*-* } } } */
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { target i?86-*-* x86_64-*-* ia64-*-* } } } */
-/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 2 "vect" { target i?86-*-* x86_64-*-* ia64-*-* } } } */
-/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-1.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-1.c
new file mode 100644
index 00000000000..1c3d555f5d4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-1.c
@@ -0,0 +1,56 @@
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+#define DIFF 242
+
+/* Test vectorization of reduction of unsigned-int. */
+/* Not supported yet. */
+
+int main1 (unsigned int x, unsigned int max_result)
+{
+ int i;
+ unsigned int ub[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+ unsigned int uc[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
+ unsigned int udiff = 2;
+ unsigned int umax = x;
+ unsigned int umin = 10;
+
+ /* Summation. */
+ for (i = 0; i < N; i++) {
+ udiff += (ub[i] - uc[i]);
+ }
+
+ /* Maximum. */
+ for (i = 0; i < N; i++) {
+ umax = umax < uc[i] ? uc[i] : umax;
+ }
+
+ /* Minimum. */
+ for (i = 0; i < N; i++) {
+ umin = umin > uc[i] ? uc[i] : umin;
+ }
+
+ /* check results: */
+ if (udiff != DIFF)
+ abort ();
+ if (umax != max_result)
+ abort ();
+ if (umin != 0)
+ abort ();
+
+ return 0;
+}
+
+int main (void)
+{
+ check_vect ();
+
+ return main1 (100, 100);
+ return main1 (0, 15);
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "not vectorized: unsupported use in stmt." 3 "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-2.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-2.c
new file mode 100644
index 00000000000..fd5e94b5004
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-2.c
@@ -0,0 +1,54 @@
+
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+#define DIFF 242
+
+/* Test vectorization of reduction of signed-int. */
+/* Not supported yet. */
+
+int main1 (int x, int max_result)
+{
+ int i;
+ int b[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+ int c[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
+ int diff = 2;
+ int max = x;
+ int min = 10;
+
+ for (i = 0; i < N; i++) {
+ diff += (b[i] - c[i]);
+ }
+
+ for (i = 0; i < N; i++) {
+ max = max < c[i] ? c[i] : max;
+ }
+
+ for (i = 0; i < N; i++) {
+ min = min > c[i] ? c[i] : min;
+ }
+
+ /* check results: */
+ if (diff != DIFF)
+ abort ();
+ if (max != max_result)
+ abort ();
+ if (min != 0)
+ abort ();
+
+ return 0;
+}
+
+int main (void)
+{
+ check_vect ();
+
+ return main1 (100, 100);
+ return main1 (0, 15);
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 3 loops" 1 "vect" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "not vectorized: unsupported use in stmt." 3 "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-3.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-3.c
new file mode 100644
index 00000000000..86fbc4bdec1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-3.c
@@ -0,0 +1,41 @@
+/* { dg-require-effective-target vect_int } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+#define DIFF 240
+
+/* Test vectorization of reduction of unsigned-int in the presence
+ of unknown-loop-bound. */
+/* Not supported yet. */
+
+int main1 (int n)
+{
+ int i;
+ unsigned int ub[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+ unsigned int uc[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
+ unsigned int udiff;
+
+ udiff = 0;
+ for (i = 0; i < n; i++) {
+ udiff += (ub[i] - uc[i]);
+ }
+
+ /* check results: */
+ if (udiff != DIFF)
+ abort ();
+
+ return 0;
+}
+
+int main (void)
+{
+ check_vect ();
+
+ return main1 (N);
+ return main1 (N-1);
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "not vectorized: unsupported use in stmt." 1 "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/wtypequal.c b/gcc/testsuite/gcc.dg/wtypequal.c
new file mode 100644
index 00000000000..9a7189929d3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/wtypequal.c
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+
+int *__restrict *p;
+void f(void)
+{
+ __typeof(*p) *q = p; /* { dg-bogus "discards qualifiers" } */
+}
diff --git a/gcc/testsuite/gcc.misc-tests/i386-pf-3dnow-1.c b/gcc/testsuite/gcc.misc-tests/i386-pf-3dnow-1.c
index e4961cf6c51..ffb2e79530b 100644
--- a/gcc/testsuite/gcc.misc-tests/i386-pf-3dnow-1.c
+++ b/gcc/testsuite/gcc.misc-tests/i386-pf-3dnow-1.c
@@ -1,8 +1,8 @@
/* Test that the correct data prefetch instructions are generated for i386
variants that use 3DNow! prefetch instructions. */
-/* { dg-do compile { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-*} } */
+/* { dg-require-effective-target ilp32 } */
extern void exit (int);
diff --git a/gcc/testsuite/gcc.misc-tests/i386-pf-athlon-1.c b/gcc/testsuite/gcc.misc-tests/i386-pf-athlon-1.c
index 08d046bf1c8..8d5ad1efe7d 100644
--- a/gcc/testsuite/gcc.misc-tests/i386-pf-athlon-1.c
+++ b/gcc/testsuite/gcc.misc-tests/i386-pf-athlon-1.c
@@ -2,8 +2,8 @@
variants that use 3DNow! prefetchw or SSE prefetch instructions with
locality hints. */
-/* { dg-do compile { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
extern void exit (int);
diff --git a/gcc/testsuite/gcc.misc-tests/i386-pf-none-1.c b/gcc/testsuite/gcc.misc-tests/i386-pf-none-1.c
index 155e0f4ac02..d87a2100dda 100644
--- a/gcc/testsuite/gcc.misc-tests/i386-pf-none-1.c
+++ b/gcc/testsuite/gcc.misc-tests/i386-pf-none-1.c
@@ -1,8 +1,8 @@
/* Test that data prefetch instructions are not generated for i386 variants
that do not support those instructions. */
-/* { dg-do compile { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
extern void exit (int);
diff --git a/gcc/testsuite/gcc.misc-tests/i386-pf-sse-1.c b/gcc/testsuite/gcc.misc-tests/i386-pf-sse-1.c
index 7d1ed99ecbc..fb47c9dfc53 100644
--- a/gcc/testsuite/gcc.misc-tests/i386-pf-sse-1.c
+++ b/gcc/testsuite/gcc.misc-tests/i386-pf-sse-1.c
@@ -1,8 +1,8 @@
/* Test that the correct data prefetch instructions are generated for i386
variants that use SSE prefetch instructions. */
-/* { dg-do compile { target i?86-*-* } } */
-/* { dg-skip-if "" { i?86-*-* } { "-m64" } { "" } } */
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
extern void exit (int);
diff --git a/gcc/testsuite/gcc.target/i386/i386.exp b/gcc/testsuite/gcc.target/i386/i386.exp
index 4b92d4ab0a8..1e7bdf4b546 100644
--- a/gcc/testsuite/gcc.target/i386/i386.exp
+++ b/gcc/testsuite/gcc.target/i386/i386.exp
@@ -16,7 +16,7 @@
# GCC testsuite that uses the `dg.exp' driver.
-# Exit immediately if this isn't a SPARC target.
+# Exit immediately if this isn't a x86 target.
if { ![istarget i?86*-*-*] && ![istarget x86_64-*-*] } then {
return
}
diff --git a/gcc/testsuite/gcc.target/i386/movq.c b/gcc/testsuite/gcc.target/i386/movq.c
new file mode 100644
index 00000000000..cdb35ede8de
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/movq.c
@@ -0,0 +1,8 @@
+/* { dg-do compile { target "i?86*-*-*" } }
+/* { dg-options "-Os -march=pentium4 -mtune=prescott" } */
+register char foo asm("edi");
+char x;
+int bar() {
+ foo = x;
+}
+/* { dg-final { scan-assembler "movz" } } */
diff --git a/gcc/testsuite/gcc.target/mips/ext_ins.c b/gcc/testsuite/gcc.target/mips/ext_ins.c
new file mode 100644
index 00000000000..77df1d2ba87
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/ext_ins.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-mips-options "-march=mips32r2" } */
+/* { dg-final { scan-assembler "ext" } } */
+/* { dg-final { scan-assembler "ins" } } */
+
+struct A
+{
+ unsigned int i : 2;
+ unsigned int j : 3;
+ unsigned int k : 4;
+ unsigned int l : 5;
+};
+
+void func (struct A);
+
+unsigned int f1 (struct A a)
+{
+ return a.j;
+}
+
+void f2 (int i)
+{
+ struct A c;
+ c.j = i;
+ func (c);
+}
diff --git a/gcc/testsuite/gcc.target/mips/mips16e-extends.c b/gcc/testsuite/gcc.target/mips/mips16e-extends.c
new file mode 100644
index 00000000000..0523aa563c5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/mips16e-extends.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-mips-options "-Os -march=mips32 -mips16" } */
+
+short cksum16 (unsigned long n)
+{
+ unsigned long l;
+ l = validate (n, (n >> 16) + (n & 0xffff));
+ return l;
+}
+
+char cksum8 (unsigned long n)
+{
+ unsigned long l;
+ l = validate (n, (n >> 8) + (n & 0xff));
+ return l;
+}
+
+/* { dg-final { scan-assembler "zeh" } } */
+/* { dg-final { scan-assembler "seh" } } */
+/* { dg-final { scan-assembler "zeb" } } */
+/* { dg-final { scan-assembler "seb" } } */
diff --git a/gcc/testsuite/gcc.target/sparc/fexpand-2.c b/gcc/testsuite/gcc.target/sparc/fexpand-2.c
new file mode 100644
index 00000000000..38b4e72fa09
--- /dev/null
+++ b/gcc/testsuite/gcc.target/sparc/fexpand-2.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-final_cleanup -mcpu=ultrasparc -mvis" } */
+typedef short vec16 __attribute__((vector_size(8)));
+typedef unsigned char vec8 __attribute__((vector_size(4)));
+
+vec16 foo () {
+ vec8 a = {(unsigned char)1,(unsigned char)2,(unsigned char)4,(unsigned char)8};
+ return __builtin_vis_fexpand (a);
+}
+
+/* { dg-final { scan-tree-dump "{ 16, 32, 64, 128 }" "final_cleanup" } } */
diff --git a/gcc/testsuite/gcc.target/sparc/fpmerge-2.c b/gcc/testsuite/gcc.target/sparc/fpmerge-2.c
new file mode 100644
index 00000000000..ad66c199e44
--- /dev/null
+++ b/gcc/testsuite/gcc.target/sparc/fpmerge-2.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-mcpu=ultrasparc -mvis -O1 -fdump-tree-final_cleanup" } */
+typedef unsigned char pixel __attribute__((vector_size(8)));
+typedef unsigned char vec8 __attribute__((vector_size(4)));
+
+#define _(ARG) (unsigned char)ARG
+
+pixel foo () {
+ vec8 a = { _(1), _(3), _(5), _(7) };
+ vec8 b = { _(2), _(4), _(6), _(8) };
+ return __builtin_vis_fpmerge (a, b);
+}
+
+/* { dg-final { scan-assembler-not "fpmerge\t%" } } */
+/* { dg-final { scan-tree-dump "{ 1, 2, 3, 4, 5, 6, 7, 8 }" "final_cleanup" } } */
diff --git a/gcc/testsuite/gcc.target/sparc/fpmul-2.c b/gcc/testsuite/gcc.target/sparc/fpmul-2.c
new file mode 100644
index 00000000000..32170bda4e5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/sparc/fpmul-2.c
@@ -0,0 +1,47 @@
+/* { dg-do compile } */
+/* { dg-options "-mcpu=ultrasparc -mvis -O1 -fdump-tree-final_cleanup" } */
+
+typedef int vec32 __attribute__((vector_size(8)));
+typedef short vec16 __attribute__((vector_size(8)));
+typedef unsigned char vec8 __attribute__((vector_size(8)));
+
+typedef unsigned char pixel __attribute__((vector_size(4)));
+typedef short pixel16 __attribute__((vector_size(4)));
+
+vec16 foo1 () {
+ pixel a = { (unsigned char)1, (unsigned char)2, (unsigned char)3, (unsigned char)4 };
+ vec16 b = { (short)1, (short)2, (short)3, (short)4 };
+ return __builtin_vis_fmul8x16 (a, b);
+}
+
+vec16 foo1_1 () {
+ pixel a = { (unsigned char)1, (unsigned char)1, (unsigned char)1, (unsigned char)1 };
+ vec16 b = { (short)256, (short)512, (short)1024, (short)2048 };
+ return __builtin_vis_fmul8x16 (a, b);
+}
+
+vec16 foo1_2 () {
+ pixel a = { (unsigned char)255, (unsigned char)255, (unsigned char)255, (unsigned char)255 };
+ vec16 b = { (short)256, (short)512, (short)1024, (short)32767 };
+ return __builtin_vis_fmul8x16 (a, b);
+}
+/* { dg-final { scan-assembler-not "fmul8x16\t%" } } */
+/* { dg-final { scan-tree-dump "{ 0, 0, 0, 0 }" "final_cleanup" } } */
+/* { dg-final { scan-tree-dump "{ 1, 2, 4, 8 }" "final_cleanup" } } */
+/* { dg-final { scan-tree-dump "{ 255, 510, 1020, 32639 }" "final_cleanup" } } */
+
+vec16 foo2 () {
+ pixel a = { 1, 2, 3, 4 };
+ pixel16 b = { 256, 512 };
+ return __builtin_vis_fmul8x16au (a, b);
+}
+/* { dg-final { scan-assembler-not "fmul8x16au\t%" } } */
+/* { dg-final { scan-tree-dump "{ 1, 2, 3, 4 }" "final_cleanup" } } */
+
+vec16 foo3 () {
+ pixel a = { 1, 2, 3, 4 };
+ pixel16 b = { 256, 512 };
+ return __builtin_vis_fmul8x16al (a, b);
+}
+/* { dg-final { scan-assembler-not "fmul8x16al\t%" } } */
+/* { dg-final { scan-tree-dump "{ 2, 4, 6, 8 }" "final_cleanup" } } */
diff --git a/gcc/testsuite/gcc.target/sparc/noresult.c b/gcc/testsuite/gcc.target/sparc/noresult.c
new file mode 100644
index 00000000000..f32805d3547
--- /dev/null
+++ b/gcc/testsuite/gcc.target/sparc/noresult.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-mcpu=ultrasparc -mvis" } */
+typedef short vec16 __attribute__((vector_size(8)));
+typedef char vec8 __attribute__((vector_size(4)));
+
+void foo (vec16 a) {
+ __builtin_vis_fpack16 (a);
+}
+
+/* { dg-final { scan-assembler-not "fpack16\t%" } } */
diff --git a/gcc/testsuite/gcc.target/sparc/pdist-2.c b/gcc/testsuite/gcc.target/sparc/pdist-2.c
new file mode 100644
index 00000000000..0095d0e02f8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/sparc/pdist-2.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-mcpu=ultrasparc -mvis -O1 -fdump-tree-final_cleanup" } */
+
+typedef long long int64_t;
+typedef unsigned char vec8 __attribute__((vector_size(8)));
+
+#define _(A) (unsigned char)A
+
+int64_t foo () {
+ int64_t d = 2;
+ vec8 a = { _(1), _(2), _(3), _(4), _(5), _(6), _(7), _(255) };
+ vec8 b = { _(2), _(4), _(8), _(16), _(32), _(64), _(128), _(8) };
+ d = __builtin_vis_pdist (a, b, d);
+ return d;
+}
+
+/* { dg-final { scan-assembler-not "pdist\t%" } } */
+/* { dg-final { scan-tree-dump "return 475" "final_cleanup" } } */
diff --git a/gcc/testsuite/gcc.target/sparc/pdist-3.c b/gcc/testsuite/gcc.target/sparc/pdist-3.c
new file mode 100644
index 00000000000..e4d6cb53ed0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/sparc/pdist-3.c
@@ -0,0 +1,36 @@
+/* { dg-do run } */
+/* { dg-options "-mcpu=ultrasparc -mvis -O1" } */
+
+typedef long long int64_t;
+typedef unsigned char vec8 __attribute__((vector_size(8)));
+
+extern void abort ();
+extern void exit (int);
+
+#define _(A) (unsigned char)A
+
+int64_t foo (vec8 a, vec8 b) {
+ int64_t d = 2;
+ d = __builtin_vis_pdist (a, b, d);
+ return d;
+}
+
+int64_t bar () {
+ int64_t d = 2;
+ vec8 a = { _(1), _(2), _(3), _(4), _(5), _(6), _(7), _(255) };
+ vec8 b = { _(2), _(4), _(8), _(16), _(32), _(64), _(128), _(8) };
+ d = __builtin_vis_pdist (a, b, d);
+ return d;
+}
+
+
+static vec8 a = { 1, 2, 3, 4, 5, 6, 7, 255 };
+static vec8 b = { 2, 4, 8, 16, 32, 64, 128, 8 };
+
+int main (int argc, char *argv[]) {
+
+ if (foo (a, b) != bar ())
+ abort ();
+
+ exit (0);
+}
diff --git a/gcc/testsuite/gfortran.dg/altreturn_1.f90 b/gcc/testsuite/gfortran.dg/altreturn_1.f90
new file mode 100644
index 00000000000..0849358697f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/altreturn_1.f90
@@ -0,0 +1,7 @@
+! { dg-do compile }
+ subroutine foo (a)
+ real t, a, baz
+ call bar (*10)
+ t = 2 * baz ()
+ IF (t.gt.0) t = baz ()
+10 END
diff --git a/gcc/testsuite/gfortran.dg/array_constructor_3.f90 b/gcc/testsuite/gfortran.dg/array_constructor_3.f90
new file mode 100644
index 00000000000..7ddd1f4191f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/array_constructor_3.f90
@@ -0,0 +1,5 @@
+! { dg-do compile }
+! Check that empty array constructors are rejected
+program hum
+ print *, (//) { dg-error "Empty array constructor" }
+end program hum
diff --git a/gcc/testsuite/gfortran.dg/array_constructor_4.f90 b/gcc/testsuite/gfortran.dg/array_constructor_4.f90
new file mode 100644
index 00000000000..cae65156793
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/array_constructor_4.f90
@@ -0,0 +1,23 @@
+! { dg-do run }
+! PR 21912
+! We didn't adapt the exit condition to negative steps in array constructors,
+! leaving the resulting arrays uninitialized.
+integer :: i(5), n, m, l, k
+
+n = 5
+i = (/ (m, m = n, 1, -1) /)
+if (any (i /= (/ 5, 4, 3, 2, 1 /))) call abort
+
+k = 1
+
+i(5:1:-1) = (/ (m, m = n, k, -1) /)
+if (any (i /= (/ 1, 2, 3, 4, 5 /))) call abort
+
+l = -1
+
+i = (/ (m, m = n, 1, l) /)
+if (any (i /= (/ 5, 4, 3, 2, 1 /))) call abort
+
+i(5:1:-1) = (/ (m, m = n, k, l) /)
+if (any (i /= (/ 1, 2, 3, 4, 5 /))) call abort
+end
diff --git a/gcc/testsuite/gfortran.dg/assign_2.f90 b/gcc/testsuite/gfortran.dg/assign_2.f90
index 4119cd94f58..6db1f2fe85c 100644
--- a/gcc/testsuite/gfortran.dg/assign_2.f90
+++ b/gcc/testsuite/gfortran.dg/assign_2.f90
@@ -1,4 +1,4 @@
-! { dg-do compile }
+! { dg-do run }
! Option passed to avoid excess errors from obsolete warning
! { dg-options "-w" }
! PR18827
diff --git a/gcc/testsuite/gfortran.dg/assign_4.f90 b/gcc/testsuite/gfortran.dg/assign_4.f90
new file mode 100644
index 00000000000..f958e985904
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/assign_4.f90
@@ -0,0 +1,4 @@
+! { dg-do compile }
+! PR fortran/20883
+ write (*, a) b ! { dg-error "must be of type CHARACTER or INTEGER" }
+ end
diff --git a/gcc/testsuite/gfortran.dg/char_array_structure_constructor.f90 b/gcc/testsuite/gfortran.dg/char_array_structure_constructor.f90
new file mode 100755
index 00000000000..0b6c05c3321
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/char_array_structure_constructor.f90
@@ -0,0 +1,28 @@
+! { dg-do run }
+! This test the fix of PR19107, where character array actual
+! arguments in derived type constructors caused an ICE.
+! It also checks that the scalar counterparts are OK.
+! Contributed by Paul Thomas pault@gcc.gnu.org
+!
+MODULE global
+ TYPE :: dt
+ CHARACTER(4) a
+ CHARACTER(4) b(2)
+ END TYPE
+ TYPE (dt), DIMENSION(:), ALLOCATABLE, SAVE :: c
+END MODULE global
+program char_array_structure_constructor
+ USE global
+ call alloc (2)
+ if ((any (c%a /= "wxyz")) .OR. &
+ (any (c%b(1) /= "abcd")) .OR. &
+ (any (c%b(2) /= "efgh"))) call abort ()
+contains
+ SUBROUTINE alloc (n)
+ USE global
+ ALLOCATE (c(n), STAT=IALLOC_FLAG)
+ DO i = 1,n
+ c (i) = dt ("wxyz",(/"abcd","efgh"/))
+ ENDDO
+ end subroutine alloc
+END program char_array_structure_constructor
diff --git a/gcc/testsuite/gfortran.dg/char_initialiser_actual.f90 b/gcc/testsuite/gfortran.dg/char_initialiser_actual.f90
new file mode 100755
index 00000000000..3796f7ee21c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/char_initialiser_actual.f90
@@ -0,0 +1,27 @@
+! { dg do-run }
+! Tests passing of character array initialiser as actual argument.
+! Fixes PR18109.
+! Contributed by Paul Thomas pault@gcc.gnu.org
+program char_initialiser
+ character*5, dimension(3) :: x
+ character*5, dimension(:), pointer :: y
+ x=(/"is Ja","ne Fo","nda"/)
+ call sfoo ("is Ja", x(1))
+ call afoo ((/"is Ja","ne Fo","nda"/), x)
+ y => pfoo ((/"is Ja","ne Fo","nda"/))
+ call afoo (y, x)
+contains
+ subroutine sfoo(ch1, ch2)
+ character*(*) :: ch1, ch2
+ if (ch1 /= ch2) call abort ()
+ end subroutine sfoo
+ subroutine afoo(ch1, ch2)
+ character*(*), dimension(:) :: ch1, ch2
+ if (any(ch1 /= ch2)) call abort ()
+ end subroutine afoo
+ function pfoo(ch2)
+ character*5, dimension(:), target :: ch2
+ character*5, dimension(:), pointer :: pfoo
+ pfoo => ch2
+ end function pfoo
+end program
diff --git a/gcc/testsuite/gfortran.dg/char_pointer_assign.f90 b/gcc/testsuite/gfortran.dg/char_pointer_assign.f90
new file mode 100644
index 00000000000..ee3da524528
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/char_pointer_assign.f90
@@ -0,0 +1,41 @@
+! { dg-do run }
+program char_pointer_assign
+! Test character pointer assignments, required
+! to fix PR18890 and PR21297
+! Provided by Paul Thomas pault@gcc.gnu.org
+ implicit none
+ character*4, target :: t1
+ character*4, target :: t2(4) =(/"lmno","lmno","lmno","lmno"/)
+ character*4 :: const
+ character*4, pointer :: c1, c3
+ character*4, pointer :: c2(:), c4(:)
+ allocate (c3, c4(4))
+! Scalars first.
+ c3 = "lmno" ! pointer = constant
+ t1 = c3 ! target = pointer
+ c1 => t1 ! pointer =>target
+ c1(2:3) = "nm"
+ c3 = c1 ! pointer = pointer
+ c3(1:1) = "o"
+ c3(4:4) = "l"
+ c1 => c3 ! pointer => pointer
+ if (t1 /= "lnmo") call abort ()
+ if (c1 /= "onml") call abort ()
+
+! Now arrays.
+ c4 = "lmno" ! pointer = constant
+ t2 = c4 ! target = pointer
+ c2 => t2 ! pointer =>target
+ const = c2(1)
+ const(2:3) ="nm" ! c2(:)(2:3) = "nm" is still broken
+ c2 = const
+ c4 = c2 ! pointer = pointer
+ const = c4(1)
+ const(1:1) ="o" ! c4(:)(1:1) = "o" is still broken
+ const(4:4) ="l" ! c4(:)(4:4) = "l" is still broken
+ c4 = const
+ c2 => c4 ! pointer => pointer
+ if (any (t2 /= "lnmo")) call abort ()
+ if (any (c2 /= "onml")) call abort ()
+ deallocate (c3, c4)
+end program char_pointer_assign \ No newline at end of file
diff --git a/gcc/testsuite/gfortran.dg/char_pointer_comp_assign.f90 b/gcc/testsuite/gfortran.dg/char_pointer_comp_assign.f90
new file mode 100755
index 00000000000..4e2d853b185
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/char_pointer_comp_assign.f90
@@ -0,0 +1,31 @@
+! { dg-do run }
+! This test the fix of PR18283, where assignments of scalar,
+! character pointer components of derived types caused an ICE.
+! It also checks that the array counterparts remain operational.
+! Contributed by Paul Thomas pault@gcc.gnu.org
+!
+program char_pointer_comp_assign
+ implicit none
+ type :: dt
+ character (len=4), pointer :: scalar
+ character (len=4), pointer :: array(:)
+ end type dt
+ type (dt) :: a
+ character (len=4), target :: scalar_t ="abcd"
+ character (len=4), target :: array_t(2) = (/"abcd","efgh"/)
+
+! Do assignments first
+ allocate (a%scalar, a%array(2))
+ a%scalar = scalar_t
+ if (a%scalar /= "abcd") call abort ()
+ a%array = array_t
+ if (any(a%array /= (/"abcd","efgh"/))) call abort ()
+ deallocate (a%scalar, a%array)
+
+! Now do pointer assignments.
+ a%scalar => scalar_t
+ if (a%scalar /= "abcd") call abort ()
+ a%array => array_t
+ if (any(a%array /= (/"abcd","efgh"/))) call abort ()
+
+end program char_pointer_comp_assign
diff --git a/gcc/testsuite/gfortran.dg/char_pointer_dependency.f90 b/gcc/testsuite/gfortran.dg/char_pointer_dependency.f90
new file mode 100644
index 00000000000..94976cbb33c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/char_pointer_dependency.f90
@@ -0,0 +1,24 @@
+! { dg-do run }
+! Test assignments from character pointer functions with dependencies
+! are correctly resolved.
+! Provided by Paul Thomas pault@gcc.gnu.org
+program char_pointer_dependency
+ implicit none
+ character*4, pointer :: c2(:)
+ allocate (c2(2))
+ c2 = (/"abcd","efgh"/)
+ c2 = afoo (c2)
+ if (c2(1) /= "efgh") call abort ()
+ if (c2(2) /= "abcd") call abort ()
+ deallocate (c2)
+contains
+ function afoo (ac0) result (ac1)
+ integer :: j
+ character*4 :: ac0(:)
+ character*4, pointer :: ac1(:)
+ allocate (ac1(2))
+ do j = 1,2
+ ac1(j) = ac0(3-j)
+ end do
+ end function afoo
+end program char_pointer_dependency
diff --git a/gcc/testsuite/gfortran.dg/char_pointer_dummy.f90 b/gcc/testsuite/gfortran.dg/char_pointer_dummy.f90
new file mode 100644
index 00000000000..1935de51113
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/char_pointer_dummy.f90
@@ -0,0 +1,33 @@
+! { dg-do run }
+program char_pointer_dummy
+! Test character pointer dummy arguments, required
+! to fix PR16939 and PR18689
+! Provided by Paul Thomas pault@gcc.gnu.org
+ implicit none
+ character*4 :: c0
+ character*4, pointer :: c1
+ character*4, pointer :: c2(:)
+ allocate (c1, c2(1))
+! Check that we have not broken non-pointer characters.
+ c0 = "wxyz"
+ call foo (c0)
+! Now the pointers
+ c1 = "wxyz"
+ call sfoo (c1)
+ c2 = "wxyz"
+ call afoo (c2)
+ deallocate (c1, c2)
+contains
+ subroutine foo (cc1)
+ character*4 :: cc1
+ if (cc1 /= "wxyz") call abort ()
+ end subroutine foo
+ subroutine sfoo (sc1)
+ character*4, pointer :: sc1
+ if (sc1 /= "wxyz") call abort ()
+ end subroutine sfoo
+ subroutine afoo (ac1)
+ character*4, pointer :: ac1(:)
+ if (ac1(1) /= "wxyz") call abort ()
+ end subroutine afoo
+end program char_pointer_dummy \ No newline at end of file
diff --git a/gcc/testsuite/gfortran.dg/char_pointer_func.f90 b/gcc/testsuite/gfortran.dg/char_pointer_func.f90
new file mode 100644
index 00000000000..ddca76f40b2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/char_pointer_func.f90
@@ -0,0 +1,42 @@
+! { dg-do run }
+program char_pointer_func
+! Test assignments from character pointer functions, required
+! to fix PR17192 and PR17202
+! Provided by Paul Thomas pault@gcc.gnu.org
+ implicit none
+ character*4 :: c0
+ character*4, pointer :: c1
+ character*4, pointer :: c2(:)
+ allocate (c1, c2(1))
+! Check that we have not broken non-pointer characters.
+ c0 = foo ()
+ if (c0 /= "abcd") call abort ()
+! Value assignments
+ c1 = sfoo ()
+ if (c1 /= "abcd") call abort ()
+ c2 = afoo (c0)
+ if (c2(1) /= "abcd") call abort ()
+ deallocate (c1, c2)
+! Pointer assignments
+ c1 => sfoo ()
+ if (c1 /= "abcd") call abort ()
+ c2 => afoo (c0)
+ if (c2(1) /= "abcd") call abort ()
+ deallocate (c1, c2)
+contains
+ function foo () result (cc1)
+ character*4 :: cc1
+ cc1 = "abcd"
+ end function foo
+ function sfoo () result (sc1)
+ character*4, pointer :: sc1
+ allocate (sc1)
+ sc1 = "abcd"
+ end function sfoo
+ function afoo (c0) result (ac1)
+ character*4 :: c0
+ character*4, pointer :: ac1(:)
+ allocate (ac1(1))
+ ac1 = "abcd"
+ end function afoo
+end program char_pointer_func
diff --git a/gcc/testsuite/gfortran.dg/deallocate_stat.f90 b/gcc/testsuite/gfortran.dg/deallocate_stat.f90
new file mode 100644
index 00000000000..b691f21c74e
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/deallocate_stat.f90
@@ -0,0 +1,77 @@
+! { dg-do run }
+! PR 17792
+! PR 21375
+! Test that the STAT argument to DEALLOCATE works with POINTERS and
+! ALLOCATABLE arrays.
+program deallocate_stat
+
+ implicit none
+
+ integer i
+ real, pointer :: a1(:), a2(:,:), a3(:,:,:), a4(:,:,:,:), &
+ & a5(:,:,:,:,:), a6(:,:,:,:,:,:), a7(:,:,:,:,:,:,:)
+
+ real, allocatable :: b1(:), b2(:,:), b3(:,:,:), b4(:,:,:,:), &
+ & b5(:,:,:,:,:), b6(:,:,:,:,:,:), b7(:,:,:,:,:,:,:)
+
+ allocate(a1(2), a2(2,2), a3(2,2,2), a4(2,2,2,2), a5(2,2,2,2,2))
+ allocate(a6(2,2,2,2,2,2), a7(2,2,2,2,2,2,2))
+
+ a1 = 1. ; a2 = 2. ; a3 = 3. ; a4 = 4. ; a5 = 5. ; a6 = 6. ; a7 = 7.
+
+ i = 13
+ deallocate(a1, stat=i) ; if (i /= 0) call abort
+ deallocate(a2, stat=i) ; if (i /= 0) call abort
+ deallocate(a3, stat=i) ; if (i /= 0) call abort
+ deallocate(a4, stat=i) ; if (i /= 0) call abort
+ deallocate(a5, stat=i) ; if (i /= 0) call abort
+ deallocate(a6, stat=i) ; if (i /= 0) call abort
+ deallocate(a7, stat=i) ; if (i /= 0) call abort
+
+ i = 14
+ deallocate(a1, stat=i) ; if (i /= 1) call abort
+ deallocate(a2, stat=i) ; if (i /= 1) call abort
+ deallocate(a3, stat=i) ; if (i /= 1) call abort
+ deallocate(a4, stat=i) ; if (i /= 1) call abort
+ deallocate(a5, stat=i) ; if (i /= 1) call abort
+ deallocate(a6, stat=i) ; if (i /= 1) call abort
+ deallocate(a7, stat=i) ; if (i /= 1) call abort
+
+ allocate(b1(2), b2(2,2), b3(2,2,2), b4(2,2,2,2), b5(2,2,2,2,2))
+ allocate(b6(2,2,2,2,2,2), b7(2,2,2,2,2,2,2))
+
+ b1 = 1. ; b2 = 2. ; b3 = 3. ; b4 = 4. ; b5 = 5. ; b6 = 6. ; b7 = 7.
+
+ i = 13
+ deallocate(b1, stat=i) ; if (i /= 0) call abort
+ deallocate(b2, stat=i) ; if (i /= 0) call abort
+ deallocate(b3, stat=i) ; if (i /= 0) call abort
+ deallocate(b4, stat=i) ; if (i /= 0) call abort
+ deallocate(b5, stat=i) ; if (i /= 0) call abort
+ deallocate(b6, stat=i) ; if (i /= 0) call abort
+ deallocate(b7, stat=i) ; if (i /= 0) call abort
+
+ i = 14
+ deallocate(b1, stat=i) ; if (i /= 1) call abort
+ deallocate(b2, stat=i) ; if (i /= 1) call abort
+ deallocate(b3, stat=i) ; if (i /= 1) call abort
+ deallocate(b4, stat=i) ; if (i /= 1) call abort
+ deallocate(b5, stat=i) ; if (i /= 1) call abort
+ deallocate(b6, stat=i) ; if (i /= 1) call abort
+ deallocate(b7, stat=i) ; if (i /= 1) call abort
+
+
+ allocate(a1(2), a2(2,2), a3(2,2,2), b4(2,2,2,2), b5(2,2,2,2,2))
+ allocate(b6(2,2,2,2,2,2))
+
+ a1 = 1. ; a2 = 2. ; a3 = 3. ; b4 = 4. ; b5 = 5. ; b6 = 6.
+
+ i = 13
+ deallocate(a1, stat=i) ; if (i /= 0) call abort
+ deallocate(a2, a1, stat=i) ; if (i /= 1) call abort
+ deallocate(a1, a3, a2, stat=i) ; if (i /= 2) call abort
+ deallocate(b4, stat=i) ; if (i /= 0) call abort
+ deallocate(b4, b5, stat=i) ; if (i /= 1) call abort
+ deallocate(b4, b5, b6, stat=i) ; if (i /= 2) call abort
+
+end program deallocate_stat
diff --git a/gcc/testsuite/gfortran.dg/debug_1.f90 b/gcc/testsuite/gfortran.dg/debug_1.f90
new file mode 100644
index 00000000000..808f41c7084
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/debug_1.f90
@@ -0,0 +1,20 @@
+subroutine gfc_debug_bug (n,m,k,ax,bx,c)
+! above line must be the first line
+! { dg-do compile }
+! { dg-options "-g" }
+! PR 19195
+! we set line numbers wrongly, which made the compiler choke when emitting
+! debug information.
+ implicit none
+ integer :: n, m
+ integer :: k(n+m)
+ real :: ax(:), bx(n), c(n+m)
+
+ integer :: i
+ real :: f
+
+ i = k(n)
+ f = c(n)
+ f = bx(n)
+ f = ax(n)
+end subroutine gfc_debug_bug
diff --git a/gcc/testsuite/gfortran.dg/dollar_edit_descriptor-1.f b/gcc/testsuite/gfortran.dg/dollar_edit_descriptor-1.f
new file mode 100644
index 00000000000..af22c453636
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/dollar_edit_descriptor-1.f
@@ -0,0 +1,13 @@
+! { dg-do run }
+! { dg-options "-w" }
+! PR libfortran/20006
+ character*5 c
+ open (42,status='scratch')
+ write (42,'(A,$)') 'abc'
+ write (42,'(A)') 'de'
+ rewind (42)
+ read (42,'(A)') c
+ close (42)
+
+ if (c /= 'abcde') call abort
+ end
diff --git a/gcc/testsuite/gfortran.dg/f2c_4.c b/gcc/testsuite/gfortran.dg/f2c_4.c
new file mode 100755
index 00000000000..0d64fc89b14
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/f2c_4.c
@@ -0,0 +1,9 @@
+extern double f2c_4b__(double *);
+extern void abort (void);
+
+void f2c_4a__(void) {
+ double a,b;
+ a = 1023.0;
+ b=f2c_4b__(&a);
+ if ( a != b ) abort();
+}
diff --git a/gcc/testsuite/gfortran.dg/f2c_4.f90 b/gcc/testsuite/gfortran.dg/f2c_4.f90
new file mode 100755
index 00000000000..a03b4f8b593
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/f2c_4.f90
@@ -0,0 +1,14 @@
+! { dg-do run }
+! { dg-additional-sources f2c_4.c }
+! { dg-options "-ff2c -w" }
+
+! Check -ff2c calling conventions
+! Return value of REAL function is promoted to C type double
+! Addional underscore appended to function name
+call f2c_4a()
+end
+
+real function f2c_4b(x)
+ double precision x
+ f2c_4b = x
+end
diff --git a/gcc/testsuite/gfortran.dg/f2c_5.c b/gcc/testsuite/gfortran.dg/f2c_5.c
new file mode 100755
index 00000000000..bb57556d011
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/f2c_5.c
@@ -0,0 +1,9 @@
+extern float f2c_5b_(double *);
+extern void abort (void);
+
+void f2c_5a_(void) {
+ double a,b;
+ a = 1023.0;
+ b=f2c_5b_(&a);
+ if ( a != b ) abort();
+}
diff --git a/gcc/testsuite/gfortran.dg/f2c_5.f90 b/gcc/testsuite/gfortran.dg/f2c_5.f90
new file mode 100755
index 00000000000..cfc37c82e39
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/f2c_5.f90
@@ -0,0 +1,12 @@
+! { dg-do run }
+! { dg-additional-sources f2c_5.c }
+! { dg-options "-fno-f2c -w" }
+! Check calling conventions without -ff2c
+program f2c_5
+ call f2c_5a()
+end
+
+real function f2c_5b(x)
+ double precision x
+ f2c_5b = x
+end
diff --git a/gcc/testsuite/gfortran.dg/f2c_7.f90 b/gcc/testsuite/gfortran.dg/f2c_7.f90
new file mode 100644
index 00000000000..c15ff7a0f2c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/f2c_7.f90
@@ -0,0 +1,57 @@
+! { dg-do run }
+! { dg-options "-ff2c" }
+! Verifies that array results work with -ff2c
+! try all permutations of result clause in function yes/no
+! and result clause in interface yes/no
+! this is not possible in Fortran 77, but this exercises a previously
+! buggy codepath
+function c() result (r)
+ complex :: r(5)
+ r = 0.
+end function c
+
+function d()
+ complex :: d(5)
+ d = 1.
+end function d
+
+subroutine test_without_result
+interface
+ function c
+ complex :: c(5)
+ end function c
+end interface
+interface
+ function d
+ complex :: d(5)
+ end function d
+end interface
+complex z(5)
+z = c()
+if (any(z /= 0.)) call abort ()
+z = d()
+if (any(z /= 1.)) call abort ()
+end subroutine test_without_result
+
+subroutine test_with_result
+interface
+ function c result(r)
+ complex :: r(5)
+ end function c
+end interface
+interface
+ function d result(r)
+ complex :: r(5)
+ end function d
+end interface
+complex z(5)
+z = c()
+if (any(z /= 0.)) call abort ()
+z = d()
+if (any(z /= 1.)) call abort ()
+end subroutine test_with_result
+
+call test_without_result
+call test_with_result
+end
+
diff --git a/gcc/testsuite/gfortran.dg/forall_1.f90 b/gcc/testsuite/gfortran.dg/forall_1.f90
new file mode 100644
index 00000000000..35fcfdd7fd2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/forall_1.f90
@@ -0,0 +1,28 @@
+! { dg-do run }
+! tests FORALL statements with a mask
+dimension i2(15,10), i1(15)
+type a
+ sequence
+ integer k
+end type a
+type(a) :: a1(10), a2(5,5)
+
+i1 = (/ 0, 1, 2, 3, 4, 0, 6, 7, 8, 9, 10, 0, 0, 13, 14 /)
+forall (i=1:15, i1(i) /= 0)
+ i1(i) = 0
+end forall
+if (any(i1 /= 0)) call abort
+
+a1(:)%k = i1(1:10)
+forall (i=1:10, a1(i)%k == 0)
+ a1(i)%k = i
+end forall
+if (any (a1(:)%k /= (/ (i, i=1,10) /))) call abort
+
+forall (i=1:15, j=1:10, a1(j)%k <= j)
+ i2(i,j) = j + i*11
+end forall
+do i=1,15
+ if (any (i2(i,:) /= (/ (i*11 + j, j=1,10) /))) call abort
+end do
+end
diff --git a/gcc/testsuite/gfortran.dg/implicit_5.f90 b/gcc/testsuite/gfortran.dg/implicit_5.f90
new file mode 100644
index 00000000000..c0573b61ed2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/implicit_5.f90
@@ -0,0 +1,22 @@
+! PR fortran/21729
+! { dg-do compile }
+function f1 () ! { dg-error "has no IMPLICIT type" "f1" }
+ implicit none
+end function f1
+function f2 () result (r2) ! { dg-error "has no IMPLICIT type" "r2" }
+ implicit none
+end function f2
+function f3 () ! { dg-error "has no IMPLICIT type" "f3" }
+ implicit none
+entry e3 () ! { dg-error "has no IMPLICIT type" "e3" }
+end function f3
+function f4 ()
+ implicit none
+ real f4
+entry e4 () ! { dg-error "has no IMPLICIT type" "e4" }
+end function f4
+function f5 () ! { dg-error "has no IMPLICIT type" "f5" }
+ implicit none
+entry e5 ()
+ real e5
+end function f5
diff --git a/gcc/testsuite/gfortran.dg/inquire_8.f90 b/gcc/testsuite/gfortran.dg/inquire_8.f90
new file mode 100644
index 00000000000..1d30973b01d
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/inquire_8.f90
@@ -0,0 +1,10 @@
+! { dg-do compile }
+! fortran/pr20846
+program inquire_8
+ character(len=20) :: n = 'data'
+ integer :: d = 23
+ logical a
+ inquire(file=n,unit=d,opened=a) ! { dg-error "contain both FILE and UNIT" }
+ inquire(unit=d,file=n,opened=a) ! { dg-error "contain both FILE and UNIT" }
+ inquire(opened=a) ! { dg-error "requires either FILE or UNIT" }
+end program inquire_8
diff --git a/gcc/testsuite/gfortran.dg/logint-1.f b/gcc/testsuite/gfortran.dg/logint-1.f
new file mode 100644
index 00000000000..d6349100860
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/logint-1.f
@@ -0,0 +1,43 @@
+c { dg-do compile }
+c { dg-options "-O2 -std=legacy" }
+ LOGICAL*1 l1
+ LOGICAL*2 l2
+ LOGICAL*4 l4
+ INTEGER*1 i1
+ INTEGER*2 i2
+ INTEGER*4 i4
+
+ i1 = .TRUE.
+ i2 = .TRUE.
+ i4 = .TRUE.
+
+ i1 = .FALSE.
+ i2 = .FALSE.
+ i4 = .FALSE.
+
+ i1 = l1
+ i2 = l1
+ i4 = l1
+
+ i1 = l2
+ i2 = l2
+ i4 = l2
+
+ i1 = l4
+ i2 = l4
+ i4 = l4
+
+ l1 = i1
+ l2 = i1
+ l4 = i1
+
+ l1 = i2
+ l2 = i2
+ l4 = i2
+
+ l1 = i4
+ l2 = i4
+ l4 = i4
+
+ END
+
diff --git a/gcc/testsuite/gfortran.dg/logint-2.f b/gcc/testsuite/gfortran.dg/logint-2.f
new file mode 100644
index 00000000000..a5fcf230a91
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/logint-2.f
@@ -0,0 +1,43 @@
+c { dg-do compile }
+c { dg-options "-O2 -std=f95" }
+ LOGICAL*1 l1
+ LOGICAL*2 l2
+ LOGICAL*4 l4
+ INTEGER*1 i1
+ INTEGER*2 i2
+ INTEGER*4 i4
+
+ i1 = .TRUE. ! { dg-error "convert" }
+ i2 = .TRUE. ! { dg-error "convert" }
+ i4 = .TRUE. ! { dg-error "convert" }
+
+ i1 = .FALSE. ! { dg-error "convert" }
+ i2 = .FALSE. ! { dg-error "convert" }
+ i4 = .FALSE. ! { dg-error "convert" }
+
+ i1 = l1 ! { dg-error "convert" }
+ i2 = l1 ! { dg-error "convert" }
+ i4 = l1 ! { dg-error "convert" }
+
+ i1 = l2 ! { dg-error "convert" }
+ i2 = l2 ! { dg-error "convert" }
+ i4 = l2 ! { dg-error "convert" }
+
+ i1 = l4 ! { dg-error "convert" }
+ i2 = l4 ! { dg-error "convert" }
+ i4 = l4 ! { dg-error "convert" }
+
+ l1 = i1 ! { dg-error "convert" }
+ l2 = i1 ! { dg-error "convert" }
+ l4 = i1 ! { dg-error "convert" }
+
+ l1 = i2 ! { dg-error "convert" }
+ l2 = i2 ! { dg-error "convert" }
+ l4 = i2 ! { dg-error "convert" }
+
+ l1 = i4 ! { dg-error "convert" }
+ l2 = i4 ! { dg-error "convert" }
+ l4 = i4 ! { dg-error "convert" }
+
+ END
+
diff --git a/gcc/testsuite/gfortran.dg/logint-3.f b/gcc/testsuite/gfortran.dg/logint-3.f
new file mode 100644
index 00000000000..cf927ab8e83
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/logint-3.f
@@ -0,0 +1,43 @@
+c { dg-do compile }
+c { dg-options "-O2" }
+ LOGICAL*1 l1
+ LOGICAL*2 l2
+ LOGICAL*4 l4
+ INTEGER*1 i1
+ INTEGER*2 i2
+ INTEGER*4 i4
+
+ i1 = .TRUE. ! { dg-warning "Extension: Conversion" }
+ i2 = .TRUE. ! { dg-warning "Extension: Conversion" }
+ i4 = .TRUE. ! { dg-warning "Extension: Conversion" }
+
+ i1 = .FALSE. ! { dg-warning "Extension: Conversion" }
+ i2 = .FALSE. ! { dg-warning "Extension: Conversion" }
+ i4 = .FALSE. ! { dg-warning "Extension: Conversion" }
+
+ i1 = l1 ! { dg-warning "Extension: Conversion" }
+ i2 = l1 ! { dg-warning "Extension: Conversion" }
+ i4 = l1 ! { dg-warning "Extension: Conversion" }
+
+ i1 = l2 ! { dg-warning "Extension: Conversion" }
+ i2 = l2 ! { dg-warning "Extension: Conversion" }
+ i4 = l2 ! { dg-warning "Extension: Conversion" }
+
+ i1 = l4 ! { dg-warning "Extension: Conversion" }
+ i2 = l4 ! { dg-warning "Extension: Conversion" }
+ i4 = l4 ! { dg-warning "Extension: Conversion" }
+
+ l1 = i1 ! { dg-warning "Extension: Conversion" }
+ l2 = i1 ! { dg-warning "Extension: Conversion" }
+ l4 = i1 ! { dg-warning "Extension: Conversion" }
+
+ l1 = i2 ! { dg-warning "Extension: Conversion" }
+ l2 = i2 ! { dg-warning "Extension: Conversion" }
+ l4 = i2 ! { dg-warning "Extension: Conversion" }
+
+ l1 = i4 ! { dg-warning "Extension: Conversion" }
+ l2 = i4 ! { dg-warning "Extension: Conversion" }
+ l4 = i4 ! { dg-warning "Extension: Conversion" }
+
+ END
+
diff --git a/gcc/testsuite/gfortran.dg/output_exponents_1.f90 b/gcc/testsuite/gfortran.dg/output_exponents_1.f90
new file mode 100644
index 00000000000..b645e6231a3
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/output_exponents_1.f90
@@ -0,0 +1,13 @@
+! { dg-do run }
+! PR 21376
+! we used to take the logarithm of zero in this special case
+ character*10 c
+ write (c,'(e10.4)') 1.0
+ if(c /= "0.1000E+01") call abort
+ write (c,'(e10.4)') 0.0
+ if(c /= "0.0000E+00") call abort
+ write (c,'(e10.4)') 1.0d100
+ if(c /= "0.1000+101") call abort
+ write (c,'(e10.4)') 1.0d-102
+ if(c /= "0.1000-101") call abort
+end
diff --git a/gcc/testsuite/gfortran.dg/pr19155.f b/gcc/testsuite/gfortran.dg/pr19155.f
index ccd391520b1..6387c3f9ce3 100644
--- a/gcc/testsuite/gfortran.dg/pr19155.f
+++ b/gcc/testsuite/gfortran.dg/pr19155.f
@@ -5,6 +5,7 @@
! but doesn't require us to issue an error. Since g77 accepts this as zero,
! we do the same.
real a
+ character*10 c
a = 42
open (19,status='scratch')
write (19,'(A15)') 'E+00'
@@ -12,4 +13,8 @@
read (19,'(E15.8)') a
if (a .ne. 0) call abort
close (19)
+
+ c = "+ "
+ read (c,"(F10.4)") a
+ if (a /= 0) call abort
end
diff --git a/gcc/testsuite/gfortran.dg/promotion.f90 b/gcc/testsuite/gfortran.dg/promotion.f90
index d1b9b686e58..80716093136 100644
--- a/gcc/testsuite/gfortran.dg/promotion.f90
+++ b/gcc/testsuite/gfortran.dg/promotion.f90
@@ -1,4 +1,5 @@
-! { dg-do run { target i?86-*-* } }
+! { dg-do run { target i?86-*-* x86_64-*-* } }
+! { dg-require-effective-target ilp32 }
! { dg-options "-fdefault-integer-8 -fdefault-real-8" }
program a
logical l
diff --git a/gcc/testsuite/gfortran.dg/reshape-complex.f90 b/gcc/testsuite/gfortran.dg/reshape-complex.f90
index 87c80498494..72cafe4f464 100644
--- a/gcc/testsuite/gfortran.dg/reshape-complex.f90
+++ b/gcc/testsuite/gfortran.dg/reshape-complex.f90
@@ -1,11 +1,16 @@
! { dg-do run }
! PR 21127: Reshape of complex didn't work.
+! PR 21480: Reshape of packed complex arrays didn't work either.
program main
complex, dimension(8) :: b
complex, dimension(2,2) :: a
+ complex, dimension(2) :: c,d
integer :: i
b = (/(i,i=1,8)/)
a = reshape(b(1:8:2),shape(a))
if (a(1,1) /= (1.0, 0.0) .or. a(2,1) /= (3.0, 0.0) .or. &
a(1,2) /= (5.0, 0.0) .or. a(2,2) /= (7.0, 0.0)) call abort
+ c = (/( 3.14, -3.14), (2.71, -2.71)/)
+ d = reshape(c, shape (d))
+ if (any (c .ne. d)) call abort
end
diff --git a/gcc/testsuite/gfortran.dg/ret_pointer_1.f90 b/gcc/testsuite/gfortran.dg/ret_pointer_1.f90
index 5e87d1f1d2b..765f20a2f18 100644
--- a/gcc/testsuite/gfortran.dg/ret_pointer_1.f90
+++ b/gcc/testsuite/gfortran.dg/ret_pointer_1.f90
@@ -1,7 +1,4 @@
-! PR16898 : XFAILed because of problems with aliasing of array descriptors.
-! Basically a and r get put in different alias sets, then the rtl optimizars
-! wreak havoc when foo is inlined.
-! { dg-do run { xfail *-*-* } }
+! { dg-do run }
! Test functions returning array pointers
program ret_pointer_1
integer, pointer, dimension(:) :: a
diff --git a/gcc/testsuite/gfortran.dg/subnormal_1.f90 b/gcc/testsuite/gfortran.dg/subnormal_1.f90
new file mode 100644
index 00000000000..4fbde58078b
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/subnormal_1.f90
@@ -0,0 +1,11 @@
+! { dg-do run }
+! { dg-options "-Wno-underflow" }
+! Check that the chopping of bits of subnormal numbers works.
+!
+program chop
+ real x
+ x = 1.
+ if (tiny(x)/2. /= tiny(x)/2. - (nearest(tiny(x),1.) - tiny(x))/2.) then
+ call abort
+ end if
+end program chop
diff --git a/gcc/testsuite/gfortran.dg/vect/vect-4.f90 b/gcc/testsuite/gfortran.dg/vect/vect-4.f90
index 77664f8fa08..e83c05c5e50 100644
--- a/gcc/testsuite/gfortran.dg/vect/vect-4.f90
+++ b/gcc/testsuite/gfortran.dg/vect/vect-4.f90
@@ -1,14 +1,18 @@
! { dg-do compile }
! { dg-require-effective-target vect_float }
+! Peeling to align the store to Y will also align the load from Y.
+! The load from X may still be misaligned.
+
SUBROUTINE SAXPY(X, Y, A)
DIMENSION X(64), Y(64)
Y = Y + A * X
END
-! fail to vectorize until the patch that ignores dependence-distance 0 is
-! brought from autovect.
+! fail to vectorize due to aliasing problems in dataref analysis that are
+! solved in autvect-branch but not yet in mainline.
! { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } }
! { dg-final { scan-tree-dump-times "Alignment of access forced using peeling" 1 "vect" { xfail *-*-* } } }
-! { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 2 "vect" { xfail *-*-* } } }
+! { dg-final { scan-tree-dump-times "Vectorizing an unaligned access" 1 "vect" { xfail *-*-* } } }
+! { dg-final { scan-tree-dump-times "accesses have the same alignment." 1 "vect" { xfail *-*-* } } }
! { dg-final { cleanup-tree-dump "vect" } }
diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/in-pack.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/in-pack.f90
new file mode 100644
index 00000000000..b9ea2683240
--- /dev/null
+++ b/gcc/testsuite/gfortran.fortran-torture/execute/in-pack.f90
@@ -0,0 +1,92 @@
+! Check in_pack and in_unpack for integer and comlex types, with
+! alignment issues thrown in for good measure.
+
+program main
+ implicit none
+
+ complex(kind=4) :: a4(5),b4(5),aa4(5),bb4(5)
+ real(kind=4) :: r4(100)
+ equivalence(a4(1),r4(1)),(b4(1),r4(12))
+
+ complex(kind=8) :: a8(5),b8(5),aa8(5),bb8(5)
+ real(kind=8) :: r8(100)
+ equivalence(a8(1),r8(1)),(b8(1),r8(12))
+
+ integer(kind=4) :: i4(5),ii4(5)
+ integer(kind=8) :: i8(5),ii8(5)
+
+ integer :: i
+
+ a4 = (/(cmplx(i,-i,kind=4),i=1,5)/)
+ b4 = (/(2*cmplx(i,-i,kind=4),i=1,5)/)
+ call csub4(a4(5:1:-1),b4(5:1:-1),5)
+ aa4 = (/(cmplx(5-i+1,i-5-1,kind=4),i=1,5)/)
+ if (any(aa4 /= a4)) call abort
+ bb4 = (/(2*cmplx(5-i+1,i-5-1,kind=4),i=1,5)/)
+ if (any(bb4 /= b4)) call abort
+
+ a8 = (/(cmplx(i,-i,kind=8),i=1,5)/)
+ b8 = (/(2*cmplx(i,-i,kind=8),i=1,5)/)
+ call csub8(a8(5:1:-1),b8(5:1:-1),5)
+ aa8 = (/(cmplx(5-i+1,i-5-1,kind=8),i=1,5)/)
+ if (any(aa8 /= a8)) call abort
+ bb8 = (/(2*cmplx(5-i+1,i-5-1,kind=8),i=1,5)/)
+ if (any(bb8 /= b8)) call abort
+
+ i4 = (/(i, i=1,5)/)
+ call isub4(i4(5:1:-1),5)
+ ii4 = (/(5-i+1,i=1,5)/)
+ if (any(ii4 /= i4)) call abort
+
+ i8 = (/(i,i=1,5)/)
+ call isub8(i8(5:1:-1),5)
+ ii8 = (/(5-i+1,i=1,5)/)
+ if (any(ii8 /= i8)) call abort
+
+end program main
+
+subroutine csub4(a,b,n)
+ implicit none
+ complex(kind=4), dimension(n) :: a,b
+ complex(kind=4), dimension(n) :: aa, bb
+ integer :: n, i
+ aa = (/(cmplx(n-i+1,i-n-1,kind=4),i=1,n)/)
+ if (any(aa /= a)) call abort
+ bb = (/(2*cmplx(n-i+1,i-n-1,kind=4),i=1,5)/)
+ if (any(bb /= b)) call abort
+ a = (/(cmplx(i,-i,kind=4),i=1,5)/)
+ b = (/(2*cmplx(i,-i,kind=4),i=1,5)/)
+end subroutine csub4
+
+subroutine csub8(a,b,n)
+ implicit none
+ complex(kind=8), dimension(n) :: a,b
+ complex(kind=8), dimension(n) :: aa, bb
+ integer :: n, i
+ aa = (/(cmplx(n-i+1,i-n-1,kind=8),i=1,n)/)
+ if (any(aa /= a)) call abort
+ bb = (/(2*cmplx(n-i+1,i-n-1,kind=8),i=1,5)/)
+ if (any(bb /= b)) call abort
+ a = (/(cmplx(i,-i,kind=8),i=1,5)/)
+ b = (/(2*cmplx(i,-i,kind=8),i=1,5)/)
+end subroutine csub8
+
+subroutine isub4(a,n)
+ implicit none
+ integer(kind=4), dimension(n) :: a
+ integer(kind=4), dimension(n) :: aa
+ integer :: n, i
+ aa = (/(n-i+1,i=1,n)/)
+ if (any(aa /= a)) call abort
+ a = (/(i,i=1,5)/)
+end subroutine isub4
+
+subroutine isub8(a,n)
+ implicit none
+ integer(kind=8), dimension(n) :: a
+ integer(kind=8), dimension(n) :: aa
+ integer :: n, i
+ aa = (/(n-i+1,i=1,n)/)
+ if (any(aa /= a)) call abort
+ a = (/(i,i=1,5)/)
+end subroutine isub8
diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_matmul.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_matmul.f90
index 4b195d267bd..9364f1e1d8b 100644
--- a/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_matmul.f90
+++ b/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_matmul.f90
@@ -7,6 +7,8 @@ program intrinsic_matmul
integer, dimension(3) :: y
integer, dimension(2, 2) :: r
integer, dimension(3) :: v
+ real, dimension (2,2) :: aa
+ real, dimension (4,2) :: cc
a = reshape((/1, 2, 2, 3, 3, 4/), (/2, 3/))
b = reshape((/1, 2, 3, 3, 4, 5/), (/3, 2/))
@@ -21,4 +23,10 @@ program intrinsic_matmul
v(1:2) = matmul(a, y)
if (any(v(1:2) .ne. (/14, 20/))) call abort
+
+ aa = reshape((/ 1.0, 1.0, 0.0, 1.0/), shape(aa))
+ cc = 42.
+ cc(1:2,1:2) = matmul(aa, transpose(aa))
+ if (any(cc(1:2,1:2) .ne. reshape((/ 1.0, 1.0, 1.0, 2.0 /), (/2,2/)))) call abort
+ if (any(cc(3:4,1:2) .ne. 42.)) call abort
end program
diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_unpack.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_unpack.f90
index 807aadf136f..88f09c321b4 100644
--- a/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_unpack.f90
+++ b/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_unpack.f90
@@ -2,6 +2,7 @@
program intrinsic_unpack
integer, dimension(3, 3) :: a, b
logical, dimension(3, 3) :: mask;
+ character(len=50) line1, line2
integer i
mask = reshape ((/.false.,.true.,.false.,.true.,.false.,.false.,&
@@ -10,6 +11,9 @@ program intrinsic_unpack
b = unpack ((/2, 3, 4/), mask, a)
if (any (b .ne. reshape ((/1, 2, 0, 3, 1, 0, 0, 0, 4/), (/3, 3/)))) &
call abort
+ write (line1,'(10I4)') b
+ write (line2,'(10I4)') unpack((/2, 3, 4/), mask, a)
+ if (line1 .ne. line2) call abort
b = -1
b = unpack ((/2, 3, 4/), mask, 0)
if (any (b .ne. reshape ((/0, 2, 0, 3, 0, 0, 0, 0, 4/), (/3, 3/)))) &
diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp
index bcc803c57f5..ab2f18992af 100644
--- a/gcc/testsuite/lib/gcc-dg.exp
+++ b/gcc/testsuite/lib/gcc-dg.exp
@@ -307,8 +307,8 @@ proc remove-build-file { pat } {
# Remove compiler-generated coverage files for the current test.
proc cleanup-coverage-files { } {
- # This assumes that we are two frames down from dg-test, and that
- # it still stores the filename of the testcase in a local variable "name".
+ # This assumes that we are two frames down from dg-test or some other proc
+ # that stores the filename of the testcase in a local variable "name".
# A cleaner solution would require a new DejaGnu release.
upvar 2 name testcase
remove-build-file "[file rootname [file tail $testcase]].gc??"
@@ -323,8 +323,8 @@ proc cleanup-coverage-files { } {
# Remove compiler-generated files from -repo for the current test.
proc cleanup-repo-files { } {
- # This assumes that we are two frames down from dg-test, and that
- # it still stores the filename of the testcase in a local variable "name".
+ # This assumes that we are two frames down from dg-test or some other proc
+ # that stores the filename of the testcase in a local variable "name".
# A cleaner solution would require a new DejaGnu release.
upvar 2 name testcase
remove-build-file "[file rootname [file tail $testcase]].o"
@@ -343,8 +343,8 @@ proc cleanup-repo-files { } {
#
# SUFFIX is the filename suffix pattern.
proc cleanup-rtl-dump { suffix } {
- # This assumes that we are two frames down from dg-test, and that
- # it still stores the filename of the testcase in a local variable "name".
+ # This assumes that we are two frames down from dg-test or some other proc
+ # that stores the filename of the testcase in a local variable "name".
# A cleaner solution would require a new DejaGnu release.
upvar 2 name testcase
remove-build-file "[file tail $testcase].??.$suffix"
@@ -361,9 +361,9 @@ proc cleanup-rtl-dump { suffix } {
#
# SUFFIX is the file suffix pattern.
proc cleanup-tree-dump { suffix } {
- # This assumes that we are two frames down from dg-test, and that
- # it still stores the filename of the testcase in a local variable "name".
- # A cleaner solution would require a new dejagnu release.
+ # This assumes that we are two frames down from dg-test or some other proc
+ # that stores the filename of the testcase in a local variable "name".
+ # A cleaner solution would require a new DejaGnu release.
upvar 2 name testcase
remove-build-file "[file tail $testcase].t??.$suffix"
@@ -375,6 +375,24 @@ proc cleanup-tree-dump { suffix } {
}
}
+# Remove a specific ipa dump file for the current test.
+#
+# SUFFIX is the file suffix pattern.
+proc cleanup-ipa-dump { suffix } {
+ # This assumes that we are two frames down from dg-test or some other proc
+ # that stores the filename of the testcase in a local variable "name".
+ # A cleaner solution would require a new DejaGnu release.
+ upvar 2 name testcase
+ remove-build-file "[file tail $testcase].i??.$suffix"
+
+ # Clean up dump files for additional source files.
+ if [info exists additional_sources] {
+ foreach srcfile $additional_sources {
+ remove-build-file "[file tail $srcfile].i??.$suffix"
+ }
+ }
+}
+
# Remove files kept by --save-temps for the current test.
#
# Currently this is only .i files, but more can be added if there are
@@ -382,8 +400,8 @@ proc cleanup-tree-dump { suffix } {
proc cleanup-saved-temps { } {
global additional_sources
- # This assumes that we are two frames down from dg-test, and that
- # it still stores the filename of the testcase in a local variable "name".
+ # This assumes that we are two frames down from dg-test or some other proc
+ # that stores the filename of the testcase in a local variable "name".
# A cleaner solution would require a new DejaGnu release.
upvar 2 name testcase
remove-build-file "[file rootname [file tail $testcase]].ii"
diff --git a/gcc/testsuite/lib/gfortran.exp b/gcc/testsuite/lib/gfortran.exp
index 43a104e1f51..850df4f0f03 100644
--- a/gcc/testsuite/lib/gfortran.exp
+++ b/gcc/testsuite/lib/gfortran.exp
@@ -188,6 +188,6 @@ proc gfortran_target_compile { source dest type options } {
lappend options "compiler=$GFORTRAN_UNDER_TEST"
set options [concat "$ALWAYS_GFORTRANFLAGS" $options]
-
+ set options [dg-additional-files-options $options $source]
return [target_compile $source $dest $type $options]
}
diff --git a/gcc/testsuite/lib/obj-c++-dg.exp b/gcc/testsuite/lib/obj-c++-dg.exp
new file mode 100644
index 00000000000..a6d14b72c1e
--- /dev/null
+++ b/gcc/testsuite/lib/obj-c++-dg.exp
@@ -0,0 +1,28 @@
+# Copyright (C) 2004 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.
+
+# Define obj-c++ callbacks for dg.exp.
+
+load_lib gcc-dg.exp
+
+proc obj-c++-dg-test { prog do_what extra_tool_flags } {
+ return [gcc-dg-test-1 obj-c++_target_compile $prog $do_what $extra_tool_flags]
+}
+
+
+proc obj-c++-dg-prune { system text } {
+ return [gcc-dg-prune $system $text]
+}
diff --git a/gcc/testsuite/lib/obj-c++.exp b/gcc/testsuite/lib/obj-c++.exp
new file mode 100644
index 00000000000..e88e011bb2c
--- /dev/null
+++ b/gcc/testsuite/lib/obj-c++.exp
@@ -0,0 +1,366 @@
+# Copyright (C) 2004 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# This file was written by Rob Savoye (rob@cygnus.com)
+# Many modifications by Jeffrey Wheat (cassidy@cygnus.com)
+# With modifications by Mike Stump <mrs@cygnus.com>.
+
+#
+# obj-c++ support library routines
+#
+load_lib prune.exp
+load_lib gcc-defs.exp
+
+#
+# OBJCXX_UNDER_TEST is the compiler under test.
+#
+
+
+set gpp_compile_options ""
+
+#
+# obj-c++_version -- extract and print the version number of the compiler
+#
+
+proc obj-c++_version { } {
+ global OBJCXX_UNDER_TEST
+
+ obj-c++_init
+
+ # ignore any arguments after the command
+ set compiler [lindex $OBJCXX_UNDER_TEST 0]
+
+ # verify that the compiler exists
+ if { [is_remote host] || [which $compiler] != 0 } then {
+ set tmp [remote_exec host "$compiler -v"]
+ set status [lindex $tmp 0];
+ set output [lindex $tmp 1];
+ regexp " version \[^\n\r\]*" $output version
+ if { $status == 0 && [info exists version] } then {
+ if [is_remote host] {
+ clone_output "$compiler $version\n"
+ } else {
+ clone_output "[which $compiler] $version\n"
+ }
+ } else {
+ clone_output "Couldn't determine version of [which $compiler]\n"
+ }
+ } else {
+ # compiler does not exist (this should have already been detected)
+ warning "$compiler does not exist"
+ }
+}
+
+#
+# obj-c++_include_flags -- provide new version of obj-c++_include_flags
+# (originally from libgloss.exp) which knows about the gcc tree structure
+#
+proc obj-c++_include_flags { paths } {
+ global srcdir
+ global HAVE_LIBSTDCXX_V3
+ global TESTING_IN_BUILD_TREE
+
+ set flags ""
+
+ if { [is_remote host] || ! [info exists TESTING_IN_BUILD_TREE] } {
+ return "${flags}"
+ }
+
+ set gccpath ${paths}
+
+ set odir [lookfor_file ${gccpath} libstdc++-v3]
+ if { ${odir} != "" } {
+ append flags [exec sh ${odir}/scripts/testsuite_flags --build-includes]
+ }
+
+ return "$flags"
+}
+
+#
+# obj-c++_link_flags -- provide new version of obj-c++_link_flags
+# (originally from libgloss.exp) which knows about the gcc tree structure
+#
+
+proc obj-c++_link_flags { paths } {
+ global rootme
+ global srcdir
+ global ld_library_path
+ global OBJCXX_UNDER_TEST
+
+ set gccpath ${paths}
+ set libio_dir ""
+ set flags ""
+ set ld_library_path "."
+
+ if { $gccpath != "" } {
+ if [file exists "${gccpath}/lib/libstdc++.a"] {
+ append ld_library_path ":${gccpath}/lib"
+ }
+ if [file exists "${gccpath}/libg++/libg++.a"] {
+ append flags "-L${gccpath}/libg++ "
+ append ld_library_path ":${gccpath}/libg++"
+ }
+ if [file exists "${gccpath}/libstdc++/libstdc++.a"] {
+ append flags "-L${gccpath}/libstdc++ "
+ append ld_library_path ":${gccpath}/libstdc++"
+ }
+ if [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.a"] {
+ append flags " -L${gccpath}/libstdc++-v3/src/.libs "
+ append ld_library_path ":${gccpath}/libstdc++-v3/src/.libs"
+ }
+ if [file exists "${gccpath}/libiberty/libiberty.a"] {
+ append flags "-L${gccpath}/libiberty "
+ }
+ if [file exists "${gccpath}/librx/librx.a"] {
+ append flags "-L${gccpath}/librx "
+ }
+ append ld_library_path ":${rootme}"
+ set compiler [lindex $OBJCXX_UNDER_TEST 0]
+ if { [is_remote host] == 0 && [which $compiler] != 0 } {
+ foreach i "[exec $compiler --print-multi-lib]" {
+ set mldir ""
+ regexp -- "\[a-z0-9=/\.-\]*;" $i mldir
+ set mldir [string trimright $mldir "\;@"]
+ if { "$mldir" == "." } {
+ continue
+ }
+ if { [llength [glob -nocomplain ${rootme}/${mldir}/libgcc_s*.so.*]] == 1 } {
+ append ld_library_path ":${rootme}/${mldir}"
+ }
+ }
+ }
+ } else {
+ global tool_root_dir;
+
+ set libgpp [lookfor_file ${tool_root_dir} libg++];
+ if { $libgpp != "" } {
+ append flags "-L${libgpp} ";
+ append ld_library_path ":${libgpp}"
+ }
+ set libstdcpp [lookfor_file ${tool_root_dir} libstdc++];
+ if { $libstdcpp != "" } {
+ append flags "-L${libstdcpp} ";
+ append ld_library_path ":${libstdcpp}"
+ }
+ set libiberty [lookfor_file ${tool_root_dir} libiberty];
+ if { $libiberty != "" } {
+ append flags "-L${libiberty} ";
+ }
+ set librx [lookfor_file ${tool_root_dir} librx];
+ if { $librx != "" } {
+ append flags "-L${librx} ";
+ }
+ }
+
+ # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
+ # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
+ # (for the 64-bit ABI). The right way to do this would be to modify
+ # unix.exp -- but that's not an option since it's part of DejaGNU
+ # proper, so we do it here.
+ # The same applies to Darwin (DYLD_LIBRARY_PATH), Solaris 32 bit
+ # (LD_LIBRARY_PATH_32), Solaris 64 bit (LD_LIBRARY_PATH_64), and HP-UX
+ # (SHLIB_PATH).
+ # Doing this does cause trouble when testing cross-compilers.
+ if {![is_remote target]} {
+ global env;
+ if [info exists env(LD_LIBRARY_PATH)] {
+ # If we've already added these directories once, keep the
+ # existing path.
+ if {$ld_library_path == $env(LD_LIBRARY_PATH)
+ || [string first $ld_library_path: \
+ $env(LD_LIBRARY_PATH)] == 0} {
+ set ld_library_path $env(LD_LIBRARY_PATH)
+ } elseif { $env(LD_LIBRARY_PATH) != "" } {
+ append ld_library_path ":$env(LD_LIBRARY_PATH)"
+ }
+ }
+ 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
+ setenv LD_LIBRARY_PATH_32 $ld_library_path
+ setenv LD_LIBRARY_PATH_64 $ld_library_path
+ setenv DYLD_LIBRARY_PATH $ld_library_path
+ }
+
+ return "$flags"
+}
+
+#
+# obj-c++_init -- called at the start of each subdir of tests
+#
+
+proc obj-c++_init { args } {
+ global subdir
+ global gpp_initialized
+ global base_dir
+ global tmpdir
+ global libdir
+ global gluefile wrap_flags;
+ global objdir srcdir
+ global ALWAYS_OBJCXXFLAGS
+ global TOOL_EXECUTABLE TOOL_OPTIONS
+ global OBJCXX_UNDER_TEST
+ global TESTING_IN_BUILD_TREE
+ global target_triplet
+
+ if ![info exists OBJCXX_UNDER_TEST] then {
+ if [info exists TOOL_EXECUTABLE] {
+ set OBJCXX_UNDER_TEST $TOOL_EXECUTABLE;
+ } else {
+ if { [is_remote host] || ! [info exists TESTING_IN_BUILD_TREE] } {
+ set OBJCXX_UNDER_TEST [transform c++]
+ } else {
+ set OBJCXX_UNDER_TEST [findfile $base_dir/../g++ "$base_dir/../g++ -B$base_dir/../" [findfile $base_dir/g++ "$base_dir/g++ -B$base_dir/" [transform c++]]]
+ }
+ }
+ }
+
+ # Bleah, nasty. Bad taste.
+ if [ishost "*-dos-*" ] {
+ regsub "c\\+\\+" "$OBJCXX_UNDER_TEST" "gcc" OBJCXX_UNDER_TEST
+ }
+
+ if ![is_remote host] {
+ if { [which $OBJCXX_UNDER_TEST] == 0 } then {
+ perror "OBJCXX_UNDER_TEST ($OBJCXX_UNDER_TEST) does not exist"
+ exit 1
+ }
+ }
+ if ![info exists tmpdir] {
+ set tmpdir "/tmp"
+ }
+
+ if [info exists gluefile] {
+ unset gluefile
+ }
+
+ obj-c++_maybe_build_wrapper "${tmpdir}/obj-c++-testglue.o"
+
+ set ALWAYS_OBJCXXFLAGS ""
+
+ if ![is_remote host] {
+ if [info exists TOOL_OPTIONS] {
+ lappend ALWAYS_OBJCXXFLAGS "additional_flags=[obj-c++_include_flags [get_multilibs ${TOOL_OPTIONS}] ]";
+ lappend ALWAYS_OBJCXXFLAGS "ldflags=[obj-c++_link_flags [get_multilibs ${TOOL_OPTIONS}] ]";
+ } else {
+ lappend ALWAYS_OBJCXXFLAGS "additional_flags=[obj-c++_include_flags [get_multilibs] ]";
+ lappend ALWAYS_OBJCXXFLAGS "ldflags=[obj-c++_link_flags [get_multilibs] ]";
+ }
+ }
+
+ if [info exists TOOL_OPTIONS] {
+ lappend ALWAYS_OBJCXXFLAGS "additional_flags=$TOOL_OPTIONS";
+ }
+
+ # Make sure that lines are not wrapped. That can confuse the
+ # error-message parsing machinery.
+ lappend ALWAYS_OBJCXXFLAGS "additional_flags=-fmessage-length=0"
+
+ if { [string match "powerpc-*-darwin*" $target_triplet] } {
+ lappend ALWAYS_OBJCXXFLAGS "ldflags=-multiply_defined suppress"
+ }
+
+ verbose -log "ALWAYS_OBJCXXFLAGS set to $ALWAYS_OBJCXXFLAGS"
+
+ verbose "obj-c++ is initialized" 3
+}
+
+#
+# obj-c++_target_compile -- compile a source file
+#
+
+proc obj-c++_target_compile { source dest type options } {
+ global tmpdir
+ global srcdir
+ global gpp_compile_options
+ global gluefile wrap_flags
+ global ALWAYS_OBJCXXFLAGS
+ global OBJCXX_UNDER_TEST
+
+ lappend options "libs=-lobjc"
+
+ if { [target_info needs_status_wrapper] != "" && [info exists gluefile] } {
+ lappend options "libs=${gluefile}"
+ lappend options "ldflags=${wrap_flags}"
+ }
+
+ # If we have built libobjc along with the compiler (which usually
+ # _is not_ the case on Mac OS X systems), point the test harness
+ # at it (and associated headers).
+
+ set objcpath "[get_multilibs]"
+
+ set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc.a]
+ if { $libobjc_dir == ""} {
+ verbose "see if we have -fgnu-runtime in [target_info name]"
+ if [regexp ".*-fgnu-runtime.*" [target_info name]] {
+ set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.a]
+ }
+ }
+ if { $libobjc_dir != "" } {
+ set objc_include_dir "${srcdir}/../../libobjc"
+ lappend options "additional_flags=-I${objc_include_dir}"
+ set libobjc_dir [file dirname ${libobjc_dir}]
+ set objc_link_flags "-L${libobjc_dir}"
+ lappend options "additional_flags=${objc_link_flags}"
+ append ld_library_path ":${libobjc_dir}"
+ }
+
+ lappend options "additional_flags=[libio_include_flags]"
+ lappend options "compiler=$OBJCXX_UNDER_TEST";
+
+ set options [concat $gpp_compile_options $options]
+
+ set options [concat "$ALWAYS_OBJCXXFLAGS" $options];
+
+ if { [regexp "(^| )-frepo( |$)" $options] && \
+ [regexp "\.o(|bj)$" $dest] } then {
+ regsub "\.o(|bj)$" $dest ".rpo" rponame
+ exec rm -f $rponame
+ }
+
+ set options [dg-additional-files-options $options $source]
+
+ set result [target_compile $source $dest $type $options]
+
+ return $result
+}
+
+#
+# ${tool}_option_help
+#
+
+proc ${tool}_option_help { } {
+ send_user " --additional_options,OPTIONS\t\tUse OPTIONS to compile the testcase files. OPTIONS should be comma-separated.\n"
+}
+
+#
+# ${tool}_option_proc
+#
+
+proc ${tool}_option_proc { option } {
+ if [regexp "^--additional_options," $option] {
+ global gpp_compile_options
+ regsub "--additional_options," $option "" option
+ foreach x [split $option ","] {
+ lappend gpp_compile_options "additional_flags=$x"
+ }
+ return 1;
+ } else {
+ return 0
+ }
+}
diff --git a/gcc/testsuite/lib/profopt.exp b/gcc/testsuite/lib/profopt.exp
index b24dfff74f0..b23a926c074 100644
--- a/gcc/testsuite/lib/profopt.exp
+++ b/gcc/testsuite/lib/profopt.exp
@@ -1,4 +1,4 @@
-# Copyright (C) 2001, 2004 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2004, 2005 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
@@ -30,6 +30,9 @@
# profile-directed test run is nonzero then the performance check will
# be done.
+load_lib dg.exp
+load_lib gcc-dg.exp
+
global PROFOPT_OPTIONS perf_delta
# The including .exp file must define these.
@@ -116,6 +119,90 @@ proc profopt-perf-value { testcase perf_ext optstr } {
}
#
+# dg-final-generate -- process code to run after the profile-generate step
+#
+# ARGS is the line number of the directive followed by the commands.
+#
+proc dg-final-generate { args } {
+ global generate_final_code
+
+ if { [llength $args] > 2 } {
+ error "[lindex $args 0]: too many arguments"
+ return
+ }
+ append generate_final_code "[lindex $args 1]\n"
+}
+
+#
+# dg-final-use -- process code to run after the profile-use step
+#
+# ARGS is the line number of the directive followed by the commands.
+#
+proc dg-final-use { args } {
+ global use_final_code
+
+ if { [llength $args] > 2 } {
+ error "[lindex $args 0]: too many arguments"
+ return
+ }
+ append use_final_code "[lindex $args 1]\n"
+}
+
+#
+# profopt-final-code -- run final code
+#
+# WHICH is "generate" or "use".
+# FINAL_CODE is the TCL code to run.
+# TESTCASE is the name of the test, for error messages.
+#
+proc profopt-final-code { which final_code name } {
+ # This is copied from dg-test in dg.exp of DejaGnu.
+ regsub -all "\\\\(\[{}\])" $final_code "\\1" final_code
+ proc profopt-final-proc { args } $final_code
+ if [catch "profopt-final-proc $name" errmsg] {
+ perror "$name: error executing dg-final-${which}: $errmsg"
+ unresolved "$name: Error executing dg-final-${which}: $errmsg"
+ }
+}
+
+#
+# profopt-get-options -- process test directives
+#
+# SRC is the full pathname of the testcase.
+#
+proc profopt-get-options { src } {
+ # dg-options sets a variable called dg-extra-tool-flags.
+ set dg-extra-tool-flags ""
+
+ # dg-require-* sets dg-do-what.
+ upvar dg-do-what dg-do-what
+
+ set tmp [dg-get-options $src]
+ foreach op $tmp {
+ set cmd [lindex $op 0]
+ if { ![string compare "dg-options" $cmd] \
+ || ![string compare "dg-skip-if" $cmd] \
+ || ![string compare "dg-final-generate" $cmd] \
+ || ![string compare "dg-final-use" $cmd] \
+ || [string match "dg-require-*" $cmd] } {
+ set status [catch "$op" errmsg]
+ if { $status != 0 } {
+ perror "src: $errmsg for \"$op\"\n"
+ unresolved "$src: $errmsg for \"$op\""
+ return
+ }
+ } else {
+ # Ignore unrecognized dg- commands, but warn about them.
+ warning "compat.exp does not support $cmd"
+ }
+ }
+
+ # Return flags to use for compiling the primary source file and for
+ # linking.
+ return ${dg-extra-tool-flags}
+}
+
+#
# c-prof-execute -- compile for profiling and then feedback, then normal
#
# SRC is the full pathname of the testcase.
@@ -124,6 +211,7 @@ proc profopt-execute { src } {
global srcdir tmpdir
global prof_option_list
global tool profile_option feedback_option prof_ext perf_ext perf_delta
+ global generate_final_code use_final_code
global verbose
if ![info exists profile_option] {
@@ -162,10 +250,22 @@ proc profopt-execute { src } {
profopt-cleanup $testcase $perf_ext
}
+ # Process test directives.
+
+ set generate_final_code ""
+ set use_final_code ""
+ set dg-do-what [list "run" "" P]
+ set extra_flags [profopt-get-options $src]
+ if { [lindex ${dg-do-what} 1 ] == "N" } {
+ unsupported "$src"
+ verbose "$src not supported on this target, skipping it" 3
+ return
+ }
+
# Compile for profiling.
set options ""
- lappend options "additional_flags=$option $profile_option"
+ lappend options "additional_flags=$option $extra_flags $profile_option"
set optstr "$option $profile_option"
set comp_output [${tool}_target_compile "$src" "$execname1" executable $options]
if ![${tool}_check_compile "$testcase compilation" $optstr $execname1 $comp_output] {
@@ -179,6 +279,7 @@ proc profopt-execute { src } {
set result [${tool}_load $execname1 "" ""]
set status [lindex $result 0]
+ set missing_file 0
# Make sure the profile data was generated, and fail if not.
if { $status == "pass" } {
set basename [file tail $testcase]
@@ -187,26 +288,34 @@ proc profopt-execute { src } {
set files [glob -nocomplain $base.$ext]
if { $files == "" } {
set status "fail"
+ set missing_file 1
fail "$testcase execution: file $base.$ext does not exist, $option $profile_option"
- } else {
- $status "$testcase execution, $optstr"
}
}
- } else {
+ }
+ if { $missing_file == 0 } {
$status "$testcase execution, $optstr"
}
+
+ # If there is dg-final code to execute for the generate step, do it
+ # even if it failed; it might clean up temporary files.
+ if ![string match $generate_final_code ""] {
+ profopt-final-code "generate" $generate_final_code $testcase
+ }
+
+ remote_file build delete $execname1
+
# Quit for this round if it failed
if { $status != "pass" } {
unresolved "$testcase compilation, $option $feedback_option"
unresolved "$testcase execution, $option $feedback_option"
continue
}
- remote_file build delete $execname1
# Compile with feedback-directed optimizations.
set options ""
- lappend options "additional_flags=$option $feedback_option"
+ lappend options "additional_flags=$option $extra_flags $feedback_option"
set optstr "$option $feedback_option"
set comp_output [${tool}_target_compile "$src" "$execname2" "executable" $options]
if ![${tool}_check_compile "$testcase compilation" $optstr $execname2 $comp_output] {
@@ -219,13 +328,19 @@ proc profopt-execute { src } {
set result [${tool}_load "$execname2" "" ""]
set status [lindex $result 0]
$status "$testcase execution, $optstr"
- if { $status != "pass" } {
- continue
+
+ # If there is dg-final code to execute for the use step, do it.
+ if ![string match $use_final_code ""] {
+ profopt-final-code "use" $use_final_code $testcase
}
# Remove the profiling data files.
profopt-cleanup $testcase $prof_ext
+ if { $status != "pass" } {
+ continue
+ }
+
# If the test is not expected to produce performance data then
# we're done now.
if ![info exists perf_ext] {
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index ac6dda5fd57..03781699775 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -725,6 +725,28 @@ proc check_effective_target_lp64 { } {
return $et_lp64_saved
}
+# Return 1 if the target needs a command line argument to enable a SIMD
+# instruction set.
+#
+# This won't change for different subtargets so cache the result.
+
+proc check_effective_target_vect_cmdline_needed { } {
+ global et_vect_cmdline_needed_saved
+
+ if [info exists et_vect_cmdline_needed_saved] {
+ verbose "check_effective_target_vect_cmdline_needed: using cached result" 2
+ } else {
+ set et_vect_cmdline_needed_saved 1
+ if { [istarget ia64-*-*]
+ || [istarget x86_64-*-*] } {
+ set et_vect_cmdline_needed_saved 0
+ }
+ }
+
+ verbose "check_effective_target_vect_cmdline_needed: returning $et_vect_cmdline_needed_saved" 2
+ return $et_vect_cmdline_needed_saved
+}
+
# Return 1 if the target supports hardware vectors of int, 0 otherwise.
#
# This won't change for different subtargets so cache the result.
@@ -981,6 +1003,7 @@ proc check_effective_target_sync_int_long { } {
|| [istarget i?86-*-*]
|| [istarget x86_64-*-*]
|| [istarget alpha*-*-*]
+ || [istarget s390*-*-*]
|| [istarget powerpc*-*-*] } {
set et_sync_int_long_saved 1
}
@@ -990,6 +1013,29 @@ proc check_effective_target_sync_int_long { } {
return $et_sync_int_long_saved
}
+# Return 1 if the target supports atomic operations on "char" and "short".
+
+proc check_effective_target_sync_char_short { } {
+ global et_sync_char_short_saved
+
+ if [info exists et_sync_char_short_saved] {
+ verbose "check_effective_target_sync_char_short: using cached result" 2
+ } else {
+ set et_sync_char_short_saved 0
+# This is intentionally powerpc but not rs6000, rs6000 doesn't have the
+# load-reserved/store-conditional instructions.
+ if { [istarget ia64-*-*]
+ || [istarget i?86-*-*]
+ || [istarget x86_64-*-*]
+ || [istarget powerpc*-*-*] } {
+ set et_sync_char_short_saved 1
+ }
+ }
+
+ verbose "check_effective_target_sync_char_short: returning $et_sync_char_short_saved" 2
+ return $et_sync_char_short_saved
+}
+
# Return 1 if the target matches the effective target 'arg', 0 otherwise.
# This can be used with any check_* proc that takes no argument and
# returns only 1 or 0. It could be used with check_* procs that take
diff --git a/gcc/testsuite/obj-c++.dg/basic.mm b/gcc/testsuite/obj-c++.dg/basic.mm
new file mode 100644
index 00000000000..5a9fb430e06
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/basic.mm
@@ -0,0 +1,21 @@
+// A basic sanity check for Objective-C++.
+// { dg-do run }
+
+#include <objc/Object.h>
+#include <iostream>
+
+@interface Greeter : Object
+- (void) greet: (const char *)msg;
+@end
+
+@implementation Greeter
+- (void) greet: (const char *)msg { std::cout << msg; }
+@end
+
+int
+main ()
+{
+ std::cout << "Hello from C++\n";
+ Greeter *obj = [Greeter new];
+ [obj greet: "Hello from Objective-C\n"];
+}
diff --git a/gcc/testsuite/obj-c++.dg/bitfield-1.mm b/gcc/testsuite/obj-c++.dg/bitfield-1.mm
new file mode 100644
index 00000000000..c7920251d06
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/bitfield-1.mm
@@ -0,0 +1,113 @@
+/* Check if ObjC class layout follows the ABI (informally)
+ set in the past. ObjC structs must be laid out as if
+ all ivars, including those inherited from superclasses,
+ were defined at once (i.e., any padding introduced for
+ superclasses should be removed). */
+/* Contributed by Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-options "-Wpadded -Wabi" } */
+/* { dg-do run } */
+
+#include <objc/objc.h>
+#include <objc/Object.h>
+#include <stdlib.h>
+
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+enum Enum { zero, one, two, three, four };
+
+@interface Base: Object {
+@public
+ unsigned a: 2;
+ int b: 3;
+ enum Enum c: 4;
+ unsigned d: 5;
+} /* { dg-warning "padding struct size to alignment boundary" } */
+@end
+
+struct Base_0 { /* { dg-warning "padding struct size to alignment boundary" } */
+ Class isa;
+ unsigned a: 2;
+ int b: 3;
+ enum Enum c: 4;
+ unsigned d: 5;
+};
+
+@interface Derived: Base {
+@public
+ signed e: 5;
+ unsigned f: 4;
+ enum Enum g: 3;
+}
+@end
+
+struct Derived_0 {
+ Class isa;
+ unsigned a: 2;
+ int b: 3;
+ enum Enum c: 4;
+ unsigned d: 5;
+ signed e: 5;
+ int f: 4;
+ enum Enum g: 3;
+};
+
+@interface Leaf: Derived {
+@public
+ signed h: 2;
+}
+@end
+
+struct Leaf_0 {
+ Class isa;
+ unsigned a: 2;
+ int b: 3;
+ enum Enum c: 4;
+ unsigned d: 5;
+ signed e: 5;
+ unsigned f: 4;
+ enum Enum g: 3;
+ signed h: 2;
+};
+
+/* Note that the semicolon after @defs(...) is optional. */
+
+typedef struct { @defs(Base) } Base_t; /* { dg-warning "padding struct size to alignment boundary" } */
+typedef struct { @defs(Derived); } Derived_t;
+typedef struct { @defs(Leaf); } Leaf_t;
+
+int main(void)
+{
+ struct Leaf_0 l_0;
+ Leaf *l = (Leaf *)&l_0;
+ Leaf_t *l_t = (Leaf_t *)&l_0;
+
+ CHECK_IF(sizeof(Base_t) == sizeof(Base));
+ CHECK_IF(sizeof(Derived_t) == sizeof(Derived));
+ CHECK_IF(sizeof(Leaf_t) == sizeof(Leaf));
+
+ CHECK_IF(sizeof(struct Base_0) == sizeof(Base));
+ CHECK_IF(sizeof(struct Derived_0) == sizeof(Derived));
+ CHECK_IF(sizeof(struct Leaf_0) == sizeof(Leaf));
+
+ l_0.isa = (Class)0;
+ l_0.a = 3;
+ l_0.b = 0;
+ l_0.c = three;
+ l_0.d = 31;
+ l_0.e = 0;
+ l_0.f = 15;
+ l_0.g = zero;
+ l_0.h = -2;
+
+ CHECK_IF(!l_t->isa);
+ CHECK_IF(l->a == 3 && l_t->a == 3);
+ CHECK_IF(!l->b && !l_t->b);
+ CHECK_IF(l->c == three && l_t->c == three);
+ CHECK_IF(l->d == 31 && l_t->d == 31);
+ CHECK_IF(!l->e && !l_t->e);
+ CHECK_IF(l->f == 15 && l_t->f == 15);
+ CHECK_IF(l->g == zero && l_t->g == zero);
+ CHECK_IF(l->h == -2 && l_t->h == -2);
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/bitfield-2.mm b/gcc/testsuite/obj-c++.dg/bitfield-2.mm
new file mode 100644
index 00000000000..7f778b5a4d9
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/bitfield-2.mm
@@ -0,0 +1,78 @@
+/* Check if bitfield ivars are inherited correctly (i.e., without
+ being "promoted" to ints). */
+/* Contributed by Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-do run } */
+
+#include <objc/Object.h>
+#include <stdlib.h>
+
+#define CHECK_IF(expr) if(!(expr)) abort();
+
+@interface Base: Object
+{
+ int full;
+ int full2: 32;
+ int _refs: 8;
+ int field2: 3;
+ unsigned f3: 8;
+ short cc;
+ unsigned g: 16;
+ int r2: 8;
+ int r3: 8;
+ int r4: 2;
+ int r5: 8;
+ char c;
+}
+- (void)setValues;
+@end
+
+@interface Derived: Base
+{
+ char d;
+ int _field3: 6;
+}
+- (void)checkValues;
+@end
+
+@implementation Base
+-(void)setValues {
+ full = 1;
+ full2 = 2;
+ _refs = 3;
+ field2 = 1;
+ f3 = 6;
+ cc = 7;
+ g = 8;
+ r2 = 9;
+ r3 = 10;
+ r4 = 1;
+ r5 = 12;
+ c = 13;
+}
+@end
+
+@implementation Derived
+-(void)checkValues {
+ CHECK_IF(full == 1);
+ CHECK_IF(full2 == 2);
+ CHECK_IF(_refs == 3);
+ CHECK_IF(field2 == 1);
+ CHECK_IF(f3 == 6);
+ CHECK_IF(cc == 7);
+ CHECK_IF(g == 8);
+ CHECK_IF(r2 == 9);
+ CHECK_IF(r3 == 10);
+ CHECK_IF(r4 == 1);
+ CHECK_IF(r5 == 12);
+ CHECK_IF(c == 13);
+}
+@end
+
+int main(void) {
+ Derived *obj = [[Derived alloc] init];
+
+ [obj setValues];
+ [obj checkValues];
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/bitfield-3.mm b/gcc/testsuite/obj-c++.dg/bitfield-3.mm
new file mode 100644
index 00000000000..d607a3efc9d
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/bitfield-3.mm
@@ -0,0 +1,57 @@
+/* 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 -fsigned-char" } */
+/* { dg-do run { target *-*-darwin* } } */
+
+typedef struct objc_object { struct objc_class *class_pointer; } *id;
+
+extern "C" {
+ extern void abort(void);
+ extern int strcmp(const char *, const char *);
+}
+
+#define CHECK_IF(expr) if(!(expr)) abort();
+
+@interface Base
+{
+ struct objc_class *isa;
+ int full;
+ int full2: 32;
+ int _refs: 8;
+ int field2: 3;
+ unsigned f3: 8;
+ short cc;
+ unsigned g: 16;
+ int r2: 8;
+ int r3: 8;
+ int r4: 2;
+ int r5: 8;
+ char c;
+}
+@end
+
+@interface Derived: Base
+{
+ char d;
+ int _field3: 6;
+}
+@end
+
+@implementation Base
+@end
+
+@implementation Derived
+@end
+
+int main(void) {
+ const char *s1r = "{Base=#ib32b8b3b8sb16b8b8b2b8c}";
+ const char *s1 = @encode(Base);
+ const char *s2r = "{Derived=#ib32b8b3b8sb16b8b8b2b8ccb6}";
+ const char *s2 = @encode(Derived);
+
+ CHECK_IF(!strcmp(s1r, s1));
+ CHECK_IF(!strcmp(s2r, s2));
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/bitfield-4.mm b/gcc/testsuite/obj-c++.dg/bitfield-4.mm
new file mode 100644
index 00000000000..4aa2a8b39df
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/bitfield-4.mm
@@ -0,0 +1,51 @@
+/* Check if the @defs() construct preserves the correct
+ layout of bitfields. */
+/* Contributed by Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-options "-lobjc -Wpadded" } */
+/* { dg-do run } */
+
+#include <objc/Object.h>
+
+extern "C" {
+ extern void abort(void);
+ extern int strcmp(const char *str1, const char *str2);
+}
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+enum Enum { one, two, three, four };
+
+@interface Base: Object {
+ unsigned a: 2;
+ int b: 3;
+ enum Enum c: 4;
+ unsigned d: 5;
+} /* { dg-warning "padding struct size to alignment boundary" } */
+@end
+
+@interface Derived: Base {
+ signed e: 5;
+ int f: 4;
+ enum Enum g: 3;
+}
+@end
+
+/* Note that the semicolon after @defs(...) is optional. */
+
+typedef struct { @defs(Base) } Base_t; /* { dg-warning "padding struct size to alignment boundary" } */
+typedef struct { @defs(Derived); } Derived_t;
+
+int main(void)
+{
+ CHECK_IF(sizeof(Base_t) == sizeof(Base));
+ CHECK_IF(sizeof(Derived_t) == sizeof(Derived));
+
+#ifdef __NEXT_RUNTIME__
+ CHECK_IF(!strcmp(@encode(Base), "{Base=#b2b3b4b5}"));
+ CHECK_IF(!strcmp(@encode(Derived), "{Derived=#b2b3b4b5b5b4b3}"));
+
+ CHECK_IF(!strcmp(@encode(Base_t), "{?=#b2b3b4b5}"));
+ CHECK_IF(!strcmp(@encode(Derived_t), "{?=#b2b3b4b5b5b4b3}"));
+#endif /* __NEXT_RUNTIME__ */
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/bitfield-5.mm b/gcc/testsuite/obj-c++.dg/bitfield-5.mm
new file mode 100644
index 00000000000..b6716df8d97
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/bitfield-5.mm
@@ -0,0 +1,29 @@
+
+/* Make sure that bitfield types are printed correctly, and that ivar redeclaration
+ (@interface vs. @implementation) checks take the bitfield width into account. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+/* { dg-do compile } */
+
+@interface Base {
+ int i;
+}
+@end
+
+@interface WithBitfields: Base {
+ void *isa;
+ unsigned a: 3;
+ signed b: 4;
+ int c: 5;
+}
+@end
+
+@implementation WithBitfields {
+ char *isa; /* { dg-error "conflicting instance variable type .char \\*isa." } */
+ /* { dg-error "previous declaration of .void \\*isa." "" { target *-*-* } 13 } */
+ unsigned a: 5; /* { dg-error "conflicting instance variable type .unsigned( int)? a: 5." } */
+ /* { dg-error "previous declaration of .unsigned( int)? a: 3." "" { target *-*-* } 14 } */
+ signed b: 4; /* This one is fine. */
+ int c: 3; /* { dg-error "conflicting instance variable type .int c: 3." } */
+ /* { dg-error "previous declaration of .int c: 5." "" { target *-*-* } 16 } */
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/class-protocol-1.mm b/gcc/testsuite/obj-c++.dg/class-protocol-1.mm
new file mode 100644
index 00000000000..b8200d0c0b3
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/class-protocol-1.mm
@@ -0,0 +1,442 @@
+
+/* Check Class <protocol> types */
+/* Author: David Ayers <d.ayers@inode.at> */
+/* { dg-do compile } */
+
+#include <objc/objc.h>
+#include <objc/objc-api.h>
+
+@protocol MyProto1
++(void)doItClass1;
+-(void)doItInstance1;
+@end
+
+@protocol MyProto2
++(void)doItClass2;
+-(void)doItInstance2;
+@end
+
+@interface MyClass1 <MyProto1>
+{
+ Class isa;
+}
+@end
+@implementation MyClass1
++(void)doItClass1{}
+-(void)doItInstance1{}
+@end
+
+@interface MyClass2 : MyClass1 <MyProto2>
+@end
+@implementation MyClass2
++(void)doItClass2{}
+-(void)doItInstance2{}
+@end
+
+@interface MyClass3
+{
+ Class isa;
+}
+@end
+@interface MyClass4 : MyClass3 <MyProto1>
+@end
+
+/*----------------------------------------*/
+
+Class cls = 0;
+Class <MyProto1> clsP1 = 0;
+Class <MyProto2> clsP2 = 0;
+
+void
+testSimple(void)
+{
+ [cls doItClass1];
+ [cls doItInstance1];
+ [cls doItClass2];
+ [cls doItInstance2];
+
+ [clsP1 doItClass1];
+ [clsP1 doItInstance1]; /* { dg-warning "instead of" } */
+ [clsP1 doItClass2]; /* { dg-warning "not found in protocol" } */
+ [clsP1 doItInstance2]; /* { dg-warning "not found in protocol" } */
+
+ [clsP2 doItClass1]; /* { dg-warning "not found in protocol" } */
+ [clsP2 doItInstance1]; /* { dg-warning "not found in protocol" } */
+ [clsP2 doItClass2];
+ [clsP2 doItInstance2]; /* { dg-warning "instead of" } */
+
+ [MyClass1 doItClass1];
+ [MyClass1 doItInstance1];
+ [MyClass1 doItClass2]; /* { dg-warning "may not respond to" } */
+ [MyClass1 doItInstance2]; /* { dg-warning "may not respond to" } */
+
+ [MyClass2 doItClass1];
+ [MyClass2 doItInstance1];
+ [MyClass2 doItClass2];
+ [MyClass2 doItInstance2]; /* { dg-warning "may not respond to" } */
+
+ [MyClass3 doItClass1]; /* { dg-warning "may not respond to" } */
+ [MyClass3 doItInstance1]; /* { dg-warning "may not respond to" } */
+
+ [MyClass4 doItClass1];
+ [MyClass4 doItInstance1]; /* { dg-warning "may not respond to" } */
+}
+
+/*----------------------------------------*/
+/* Protocols declared by categories */
+
+@protocol MyProto3
++(void)doItClass3;
+-(void)doItInstance3;
+@end
+@protocol MyProto4
++(void)doItClass4;
+-(void)doItInstance4;
+@end
+
+@interface MyClass1 (Category1) <MyProto3>
+@end
+@interface MyClass2 (Category2) <MyProto4>
+@end
+
+void
+testCategory(void)
+{
+ [cls doItClass3];
+ [cls doItInstance3];
+ [cls doItClass4];
+ [cls doItInstance4];
+
+ [MyClass1 doItClass3];
+ [MyClass1 doItInstance3];
+ [MyClass1 doItClass4]; /* { dg-warning "may not respond" } */
+ [MyClass1 doItInstance4]; /* { dg-warning "may not respond" } */
+
+ [MyClass2 doItClass3];
+ [MyClass2 doItInstance3];
+ [MyClass2 doItClass4];
+ [MyClass2 doItInstance4]; /* { dg-warning "may not respond" } */
+
+}
+
+/*----------------------------------------*/
+/* Inherited protocols declared by categories */
+
+@protocol MyProto5 <MyProto1>
++(void)doItClass5;
+-(void)doItInstance5;
+@end
+
+@protocol MyProto6 <MyProto2>
++(void)doItClass6;
+-(void)doItInstance6;
+@end
+
+@interface MyClass1 (Category3) <MyProto5>
+@end
+@interface MyClass2 (Category4) <MyProto6>
+@end
+
+Class <MyProto5> clsP5 = 0;
+Class <MyProto6> clsP6 = 0;
+
+void
+testCategoryInherited(void)
+{
+ [cls doItClass5];
+ [cls doItInstance5];
+ [cls doItClass6];
+ [cls doItInstance6];
+
+ [clsP5 doItClass1];
+ [clsP5 doItInstance1]; /* { dg-warning "instead of" } */
+ [clsP5 doItClass2]; /* { dg-warning "not found in protocol" } */
+ [clsP5 doItInstance2]; /* { dg-warning "not found in protocol" } */
+
+ [clsP6 doItClass1]; /* { dg-warning "not found in protocol" } */
+ [clsP6 doItInstance1]; /* { dg-warning "not found in protocol" } */
+ [clsP6 doItClass2];
+ [clsP6 doItInstance2]; /* { dg-warning "instead of" } */
+
+
+ [MyClass1 doItClass5];
+ [MyClass1 doItInstance5];
+ [MyClass1 doItClass6]; /* { dg-warning "may not respond" } */
+ [MyClass1 doItInstance6]; /* { dg-warning "may not respond" } */
+
+ [MyClass2 doItClass5];
+ [MyClass2 doItInstance5];
+ [MyClass2 doItClass6];
+ [MyClass2 doItInstance6]; /* { dg-warning "may not respond" } */
+
+}
+
+/*----------------------------------------*/
+/* Forward declared root protocols */
+
+@protocol FwProto;
+
+@interface MyClass1 (Forward) <FwProto>
+@end
+
+Class <FwProto> clsP7 = 0;
+
+void
+testForwardeDeclared1(void)
+{
+ [cls doItClass7]; /* { dg-warning "no .\\+doItClass7. method found" } */
+ [cls doItInstance7]; /* { dg-warning "no .\\+doItInstance7. method found" } */
+
+ [clsP7 doItClass7]; /* { dg-warning "not found in protocol" } */
+ /* { dg-warning "no .\\+doItClass7. method found" "" { target *-*-* } 190 } */
+ [clsP7 doItInstance7]; /* { dg-warning "not found in protocol" } */
+ /* { dg-warning "no .\\+doItInstance7. method found" "" { target *-*-* } 192 } */
+
+ [MyClass1 doItClass7]; /* { dg-warning "may not respond" } */
+ [MyClass1 doItInstance7]; /* { dg-warning "may not respond" } */
+
+ [MyClass2 doItClass7]; /* { dg-warning "may not respond" } */
+ [MyClass2 doItInstance7]; /* { dg-warning "may not respond" } */
+
+}
+
+@protocol FwProto
++(void)doItClass7;
+-(void)doItInstance7;
+@end
+
+void
+testForwardeDeclared2(void)
+{
+ [cls doItClass7];
+ [cls doItInstance7];
+
+ [clsP7 doItClass7];
+ [clsP7 doItInstance7]; /* { dg-warning "instead of" } */
+
+ [MyClass1 doItClass7];
+ [MyClass1 doItInstance7];
+
+ [MyClass2 doItClass7];
+ [MyClass2 doItInstance7];
+}
+
+/*----------------------------------------*/
+/* Inherited non root protocols */
+
+@protocol MyProto8
++(void)doItClass8;
+-(void)doItInstance8;
+@end
+
+@protocol MyProto9 <MyProto8>
++(void)doItClass9;
+-(void)doItInstance9;
+@end
+
+@interface MyClass1 (InheritedNonRoot) <MyProto9>
+@end
+
+Class <MyProto8> clsP8 = 0;
+Class <MyProto9> clsP9 = 0;
+
+void
+testInheritedNonRoot(void)
+{
+ [cls doItClass8];
+ [cls doItInstance8];
+ [cls doItClass9];
+ [cls doItInstance9];
+
+ [clsP8 doItClass8];
+ [clsP8 doItInstance8]; /* { dg-warning "instead of" } */
+ [clsP8 doItClass9]; /* { dg-warning "not found in protocol" } */
+ [clsP8 doItInstance9]; /* { dg-warning "not found in protocol" } */
+
+ [clsP9 doItClass8];
+ [clsP9 doItInstance8]; /* { dg-warning "instead of" } */
+ [clsP9 doItClass9];
+ [clsP9 doItInstance9]; /* { dg-warning "instead of" } */
+
+ [MyClass1 doItClass8];
+ [MyClass1 doItInstance8];
+ [MyClass1 doItClass9];
+ [MyClass1 doItInstance9];
+
+ [MyClass2 doItClass8];
+ [MyClass2 doItInstance8];
+ [MyClass2 doItClass9];
+ [MyClass2 doItInstance9];
+
+}
+
+/*----------------------------------------*/
+/* Prototype mismatch */
+
+@protocol MyOtherProto1
++(id)doItClass1;
+-(id)doItInstance1;
+@end
+@interface MyOtherClass1 <MyOtherProto1>
+@end
+
+Class <MyOtherProto1> oclsP1;
+
+void
+testPrototypeMismatch(void)
+{
+ id tmp1 = [oclsP1 doItClass1];
+ id tmp2 = [oclsP1 doItInstance1]; /* { dg-warning "instead of" } */
+
+ [clsP1 doItClass1];
+ [clsP1 doItInstance1]; /* { dg-warning "instead of" } */
+}
+
+id obj = nil;
+id <MyProto1> objP1 = nil;
+id <MyProto2> objP2 = nil;
+id <MyProto5> objP5 = nil;
+int num = 0;
+void *ptr = 0;
+
+MyClass1 *mc1 = nil;
+
+void
+testComptypes(void)
+{
+ { /* id <protocol>, id <protocol> */
+ objP1 == objP2; /* { dg-warning "lacks a cast" } */
+ objP2 == objP1; /* { dg-warning "lacks a cast" } */
+
+ objP1 == objP5;
+ objP5 == objP1;
+ }
+ { /* id <protocol>, SomeClass * */
+ mc1 == objP1;
+ objP1 == mc1;
+
+ mc1 == objP2; /* { dg-warning "lacks a cast" } */
+ objP2 == mc1; /* { dg-warning "lacks a cast" } */
+ }
+ { /* id <protocol>, id */
+ obj == objP1;
+ objP1 == obj;
+ }
+ { /* id <protocol>, Class */
+ cls == objP1; /* { dg-warning "lacks a cast" } */
+ objP1 == cls; /* { dg-warning "lacks a cast" } */
+ }
+ { /* id <protocol>, non-ObjC */
+ num == objP1; /* { dg-warning "between pointer" } */
+ objP1 == num; /* { dg-warning "between pointer" } */
+
+ ptr == objP1;
+ objP1 == ptr;
+ }
+ { /* Class <protocol>, Class <protocol> */
+ clsP1 == clsP2; /* { dg-warning "lacks a cast" } */
+ clsP2 == clsP1; /* { dg-warning "lacks a cast" } */
+
+ clsP1 == clsP5;
+ clsP5 == clsP1;
+ }
+ { /* Class <protocol>, SomeClass * */
+ mc1 == clsP1; /* { dg-warning "lacks a cast" } */
+ clsP1 == mc1; /* { dg-warning "lacks a cast" } */
+ }
+ { /* Class <protocol>, id */
+ obj == clsP1;
+ clsP1 == obj;
+ }
+ { /* Class <protocol>, Class */
+ cls == clsP1;
+ clsP1 == cls;
+ }
+ { /* Class <protocol>, non-ObjC */
+ num == clsP1; /* { dg-warning "between pointer" } */
+ clsP1 == num; /* { dg-warning "between pointer" } */
+
+ ptr == clsP1;
+ clsP1 == ptr;
+ }
+ { /* Class <protocol>, id <protocol> */
+ clsP1 == objP1; /* { dg-warning "lacks a cast" } */
+ objP1 == clsP1; /* { dg-warning "lacks a cast" } */
+ }
+
+ { /* id <protocol>, id <protocol> */
+ objP1 = objP2; /* { dg-warning "does not conform" } */
+ objP2 = objP1; /* { dg-warning "does not conform" } */
+
+ objP1 = objP5;
+ objP5 = objP1; /* { dg-warning "does not conform" } */
+ }
+ { /* id <protocol>, SomeClass * */
+ mc1 = objP1;
+ objP1 = mc1;
+
+ mc1 = objP2; /* { dg-warning "does not conform" } */
+ objP2 = mc1; /* { dg-warning "does not implement" } */
+ }
+ { /* id <protocol>, id */
+ obj = objP1;
+ objP1 = obj;
+ }
+ { /* id <protocol>, Class */
+ cls = objP1; /* { dg-warning "distinct Objective\\-C type" } */
+ objP1 = cls; /* { dg-warning "distinct Objective\\-C type" } */
+ }
+ { /* id <protocol>, non-ObjC */
+ num = objP1; /* { dg-error "invalid conversion" } */
+ objP1 = num; /* { dg-error "invalid conversion" } */
+
+ ptr = objP1;
+ objP1 = ptr; /* { dg-error "invalid conversion" } */
+ }
+ { /* Class <protocol>, Class <protocol> */
+ clsP1 = clsP2; /* { dg-warning "does not conform" } */
+ clsP2 = clsP1; /* { dg-warning "does not conform" } */
+
+ clsP1 = clsP5;
+ clsP5 = clsP1; /* { dg-warning "does not conform" } */
+ }
+ { /* Class <protocol>, SomeClass * */
+ /* These combinations should always elicit a warning. */
+ mc1 = clsP1; /* { dg-warning "distinct Objective\\-C type" } */
+ clsP1 = mc1; /* { dg-warning "distinct Objective\\-C type" } */
+
+ mc1 = clsP2; /* { dg-warning "distinct Objective\\-C type" } */
+ clsP2 = mc1; /* { dg-warning "distinct Objective\\-C type" } */
+ }
+ { /* Class <protocol>, id */
+ obj = clsP1;
+ clsP1 = obj;
+ }
+ { /* Class <protocol>, Class */
+ cls = clsP1;
+ clsP1 = cls;
+ }
+ { /* Class <protocol>, non-ObjC */
+ num = clsP1; /* { dg-error "invalid conversion" } */
+ clsP1 = num; /* { dg-error "invalid conversion" } */
+
+ ptr = clsP1;
+ clsP1 = ptr; /* { dg-error "invalid conversion" } */
+ }
+ { /* Class <protocol>, id <protocol> */
+ clsP1 = objP1; /* { dg-warning "distinct Objective\\-C type" } */
+ objP1 = clsP1; /* { dg-warning "distinct Objective\\-C type" } */
+ }
+}
+
+int main ()
+{
+ testSimple();
+ testCategory();
+ testCategoryInherited();
+ return(0);
+}
+
+/* { dg-warning "Messages without a matching method signature" "" { target *-*-* } 0 } */
+/* { dg-warning "will be assumed to return .id. and accept" "" { target *-*-* } 0 } */
+/* { dg-warning ".\.\.\.. as arguments" "" { target *-*-* } 0 } */
diff --git a/gcc/testsuite/obj-c++.dg/comp-types-1.mm b/gcc/testsuite/obj-c++.dg/comp-types-1.mm
new file mode 100644
index 00000000000..6d4e86e4b2a
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/comp-types-1.mm
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+@interface A
++ new;
+@end
+
+@interface B : A
+@end
+
+int main(int argc, char **argv) {
+ B *b = [B new];
+ A *a = b;
+
+ return (b == a);
+}
+
diff --git a/gcc/testsuite/obj-c++.dg/comp-types-10.mm b/gcc/testsuite/obj-c++.dg/comp-types-10.mm
new file mode 100644
index 00000000000..3abcde5bec6
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/comp-types-10.mm
@@ -0,0 +1,19 @@
+/* Yet another mysterious gimplifier crasher. */
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+@class NSString;
+@protocol NSObject
+@end
+@interface NSObject <NSObject> {
+}
+@end
+void __setRetained(id *ivar, id value) {
+ *ivar = value;
+}
+static NSString *_logProcessPrefix = 0;
+@implementation NSObject (ScopeAdditions)
++ (void)setObjectLogProcessPrefix:(NSString *)processPrefix {
+ __setRetained(&_logProcessPrefix, processPrefix);
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/comp-types-11.mm b/gcc/testsuite/obj-c++.dg/comp-types-11.mm
new file mode 100644
index 00000000000..8cd53404f52
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/comp-types-11.mm
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+@protocol Foo
+- (id)meth1;
+- (id)meth2:(int)arg;
+@end
+
+@interface Derived1: Object
+@end
+
+@interface Derived2: Object
++ (Derived1 *)new;
+@end
+
+id<Foo> func(void) {
+ Object *o = [Object new];
+ return o; /* { dg-warning "class .Object. does not implement the .Foo. protocol" } */
+}
+
+@implementation Derived2
++ (Derived1 *)new {
+ Derived2 *o = [super new];
+ return o; /* { dg-warning "distinct Objective\\-C type in return" } */
+}
+@end
+
diff --git a/gcc/testsuite/obj-c++.dg/comp-types-12.mm b/gcc/testsuite/obj-c++.dg/comp-types-12.mm
new file mode 100644
index 00000000000..b041759ca65
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/comp-types-12.mm
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+#include <objc/Object.h>
+
+@interface Derived: Object
+@end
+
+extern Object* foo(void);
+static Derived *test(void)
+{
+ Derived *m = foo(); /* { dg-warning "initialization from distinct Objective\\-C type" } */
+
+ return m;
+}
+
diff --git a/gcc/testsuite/obj-c++.dg/comp-types-2.mm b/gcc/testsuite/obj-c++.dg/comp-types-2.mm
new file mode 100644
index 00000000000..07043785a22
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/comp-types-2.mm
@@ -0,0 +1,88 @@
+/* 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 "distinct Objective\\-C type" } */
+ obj_c = obj_cp; /* { dg-warning "distinct Objective\\-C type" } */
+ obj_c = obj_C; /* { dg-warning "distinct Objective\\-C 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" } */
+ obj_p = obj_cp; /* Ok */
+ obj_p = obj_C; /* { dg-warning "distinct Objective\\-C type" } */
+
+ /* Assigning to a 'MyOtherClass *' variable should always generate
+ a warning, unless done from an 'id' or an 'id<MyProtocol>' (since
+ MyOtherClass implements MyProtocol). */
+ obj_cp = obj; /* Ok */
+ obj_cp = obj_c; /* { dg-warning "distinct Objective\\-C type" } */
+ obj_cp = obj_p; /* Ok */
+ obj_cp = obj_C; /* { dg-warning "distinct Objective\\-C 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 "lacks a cast" } */
+ if (obj_p == obj_c) ; /* { dg-warning "lacks a cast" } */
+ 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/obj-c++.dg/comp-types-3.mm b/gcc/testsuite/obj-c++.dg/comp-types-3.mm
new file mode 100644
index 00000000000..2bea01534a7
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/comp-types-3.mm
@@ -0,0 +1,38 @@
+/* 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/obj-c++.dg/comp-types-4.mm b/gcc/testsuite/obj-c++.dg/comp-types-4.mm
new file mode 100644
index 00000000000..6867f82785d
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/comp-types-4.mm
@@ -0,0 +1,64 @@
+/* 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/obj-c++.dg/comp-types-5.mm b/gcc/testsuite/obj-c++.dg/comp-types-5.mm
new file mode 100644
index 00000000000..99f6772bd42
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/comp-types-5.mm
@@ -0,0 +1,74 @@
+/* Test errors for assignments and comparisons between ObjC and C++ types. */
+/* Author: Nicola Pero <nicola@brainstorm.co.uk>. */
+/* { dg-do compile } */
+
+#include <objc/objc.h>
+
+/* The NeXT runtime headers do not define NULL. */
+#ifndef NULL
+#define NULL ((void *)0)
+#endif
+
+@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 = (int *)NULL;
+
+ /* These should all generate warnings. */
+
+ obj = i; /* { dg-error "invalid conversion" } */
+ obj = j; /* { dg-error "cannot convert" } */
+
+ obj_p = i; /* { dg-error "invalid conversion" } */
+ obj_p = j; /* { dg-error "cannot convert" } */
+
+ obj_c = i; /* { dg-error "invalid conversion" } */
+ obj_c = j; /* { dg-error "cannot convert" } */
+
+ obj_C = i; /* { dg-error "invalid conversion" } */
+ obj_C = j; /* { dg-error "cannot convert" } */
+
+ i = obj; /* { dg-error "invalid conversion" } */
+ i = obj_p; /* { dg-error "invalid conversion" } */
+ i = obj_c; /* { dg-error "invalid conversion" } */
+ i = obj_C; /* { dg-error "invalid conversion" } */
+
+ j = obj; /* { dg-error "cannot convert" } */
+ j = obj_p; /* { dg-error "cannot convert" } */
+ j = obj_c; /* { dg-error "cannot convert" } */
+ j = obj_C; /* { dg-error "cannot convert" } */
+
+ if (obj == i) ; /* { dg-error "comparison between pointer and integer" } */
+ if (i == obj) ; /* { dg-error "comparison between pointer and integer" } */
+ if (obj == j) ; /* { dg-error "lacks a cast" } */
+ if (j == obj) ; /* { dg-error "lacks a cast" } */
+
+ if (obj_c == i) ; /*{ dg-error "comparison between pointer and integer" }*/
+ if (i == obj_c) ; /*{ dg-error "comparison between pointer and integer" }*/
+ if (obj_c == j) ; /* { dg-error "lacks a cast" } */
+ if (j == obj_c) ; /* { dg-error "lacks a cast" } */
+
+ if (obj_p == i) ; /*{ dg-error "comparison between pointer and integer" }*/
+ if (i == obj_p) ; /*{ dg-error "comparison between pointer and integer" }*/
+ if (obj_p == j) ; /* { dg-error "lacks a cast" } */
+ if (j == obj_p) ; /* { dg-error "lacks a cast" } */
+
+ if (obj_C == i) ; /*{ dg-error "comparison between pointer and integer" }*/
+ if (i == obj_C) ; /*{ dg-error "comparison between pointer and integer" }*/
+ if (obj_C == j) ; /* { dg-error "lacks a cast" } */
+ if (j == obj_C) ; /* { dg-error "lacks a cast" } */
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/comp-types-6.mm b/gcc/testsuite/obj-c++.dg/comp-types-6.mm
new file mode 100644
index 00000000000..23b84edd374
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/comp-types-6.mm
@@ -0,0 +1,33 @@
+/* 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; /* Ok */
+ obj_p = obj_cp; /* Ok */
+
+ 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/obj-c++.dg/comp-types-7.mm b/gcc/testsuite/obj-c++.dg/comp-types-7.mm
new file mode 100644
index 00000000000..e23558114bc
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/comp-types-7.mm
@@ -0,0 +1,38 @@
+/* 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 "distinct Objective\\-C type" } */
+ obj_cp2 = obj_p; /* { dg-warning "distinct Objective\\-C 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/obj-c++.dg/comp-types-8.mm b/gcc/testsuite/obj-c++.dg/comp-types-8.mm
new file mode 100644
index 00000000000..490f4ff1938
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/comp-types-8.mm
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+
+/* We used to ICE because we removed the cast to List_linked*
+ in -[ListIndex_linked next]. */
+
+@interface List
+{
+@public
+ int firstLink;
+}
+@end
+
+@interface ListIndex_linked
+{
+@public
+ List *collection;
+ int link;
+}
+@end
+
+@interface List_linked: List
+@end
+
+@implementation List
+@end
+
+@implementation ListIndex_linked
+- next
+{
+ link = ((List_linked*)collection)->firstLink;
+}
+@end
+
diff --git a/gcc/testsuite/obj-c++.dg/comp-types-9.mm b/gcc/testsuite/obj-c++.dg/comp-types-9.mm
new file mode 100644
index 00000000000..f092c9e2796
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/comp-types-9.mm
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+
+/* Another gimplifier ICE... */
+
+#include <objc/Object.h>
+
+@interface MyView: Object {
+ int _frame;
+}
+- (void)_finalize;
+@end
+
+@interface MyViewTemplate: MyView {
+ void *_className;
+}
+- (id)createRealObject;
+@end
+
+@implementation MyViewTemplate
+- (id)createRealObject {
+ id realObj;
+ *(MyView *)realObj = *(MyView *)self;
+ return realObj;
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/cxx-class-1.mm b/gcc/testsuite/obj-c++.dg/cxx-class-1.mm
new file mode 100644
index 00000000000..64fed0f8bc0
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/cxx-class-1.mm
@@ -0,0 +1,18 @@
+/* Test that Objective-C++ is able to chew through a simple C++ class hierarchy.
+ This was broken in earlier ObjC++ incarnations. */
+
+struct foo
+{
+ foo(void *a) {};
+};
+
+struct bar : foo
+{
+ bar() : foo((char*)0) {};
+};
+
+class apple : foo
+{
+public:
+ apple() : foo(0) { };
+};
diff --git a/gcc/testsuite/obj-c++.dg/cxx-ivars-1.mm b/gcc/testsuite/obj-c++.dg/cxx-ivars-1.mm
new file mode 100644
index 00000000000..6e5812cf8e0
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/cxx-ivars-1.mm
@@ -0,0 +1,42 @@
+// Check if ivars may be accessed via the C++ dot notation.
+
+// { dg-do run }
+// { dg-options "-fno-objc-call-cxx-cdtors" }
+
+#include <objc/Object.h>
+#include <stdlib.h>
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+struct cxx_struct {
+ int a, b;
+ void set_values (int _a, int _b = 3) {
+ a = _a; b = _b;
+ }
+ ~cxx_struct (void) {
+ a = b = 99;
+ }
+};
+
+@interface Manip : Object {
+ int c;
+ cxx_struct s; // { dg-warning "user-defined destructor" }
+ // { dg-warning "constructors and destructors will not be invoked" "" { target *-*-* } 22 }
+}
+- (void) manipulate_ivars;
+@end
+
+@implementation Manip
+- (void) manipulate_ivars {
+ s.set_values (7);
+ CHECK_IF (s.a == 7 && s.b == 3);
+ s.~cxx_struct();
+ CHECK_IF (s.a == 99 && s.b == 99);
+}
+@end
+
+int main (void)
+{
+ Manip *obj = [Manip new];
+ [obj manipulate_ivars];
+ [obj free];
+}
diff --git a/gcc/testsuite/obj-c++.dg/cxx-ivars-2.mm b/gcc/testsuite/obj-c++.dg/cxx-ivars-2.mm
new file mode 100644
index 00000000000..bf9ca6af44a
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/cxx-ivars-2.mm
@@ -0,0 +1,76 @@
+// Check if the '- .cxx_construct' and '-.cxx_destruct' methods get called
+// and if they perform their desired function.
+
+// { dg-do run }
+// { dg-options "-fobjc-call-cxx-cdtors" }
+
+#include <objc/Object.h>
+#include <stdlib.h>
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+static int ctor1_called, ctor2_called, dtor1_called;
+
+struct bar {
+ int a, b;
+ bar(void) {
+ a = 5; b = 6;
+ ctor1_called++;
+ }
+ ~bar(void) {
+ a = b = 99;
+ dtor1_called++;
+ }
+};
+
+struct boo: bar {
+ int c;
+ boo(int _c = 9): c(_c) {
+ ctor2_called++;
+ }
+};
+
+@interface Baz: Object {
+@public
+ bar aa;
+}
+@end
+
+@implementation Baz
+@end
+
+@interface Foo: Baz {
+@public
+ int a;
+ boo bb;
+ bar b;
+ float c;
+ bar d;
+}
+@end
+
+@implementation Foo
+@end
+
+int main (void)
+{
+ CHECK_IF(!ctor1_called && !ctor2_called && !dtor1_called); /* are we sane? */
+
+ Baz *baz = [Baz new];
+ CHECK_IF(ctor1_called && !ctor2_called && !dtor1_called);
+ CHECK_IF(baz->aa.a == 5 && baz->aa.b == 6);
+ ctor1_called = 0; /* reset */
+
+ [baz free];
+ CHECK_IF(!ctor1_called && !ctor2_called && dtor1_called);
+ dtor1_called = 0; /* reset */
+
+ Foo *foo = [Foo new];
+ CHECK_IF(ctor1_called && ctor2_called && !dtor1_called);
+ CHECK_IF(foo->bb.a == 5 && foo->bb.b == 6 && foo->bb.c == 9);
+ CHECK_IF(foo->b.a == 5 && foo->b.b == 6);
+ CHECK_IF(foo->d.a == 5 && foo->d.b == 6);
+ ctor1_called = ctor2_called = 0; /* reset */
+
+ [foo free];
+ CHECK_IF(!ctor1_called && !ctor2_called && dtor1_called);
+}
diff --git a/gcc/testsuite/obj-c++.dg/cxx-ivars-3.mm b/gcc/testsuite/obj-c++.dg/cxx-ivars-3.mm
new file mode 100644
index 00000000000..ca5e5eda450
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/cxx-ivars-3.mm
@@ -0,0 +1,46 @@
+// Check if ObjC classes with non-POD C++ ivars are specially marked in the metadata.
+
+// { dg-do run { target *-*-darwin* } }
+// { dg-options "-fobjc-call-cxx-cdtors -fnext-runtime" }
+
+#include <objc/objc-runtime.h>
+#include <stdlib.h>
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+#ifndef CLS_HAS_CXX_STRUCTORS
+#define CLS_HAS_CXX_STRUCTORS 0x2000L
+#endif
+
+struct cxx_struct {
+ int a, b;
+ cxx_struct (void) { a = b = 55; }
+};
+
+@interface Foo {
+ int c;
+ cxx_struct s;
+}
+@end
+
+@interface Bar: Foo {
+ float f;
+}
+@end
+
+@implementation Foo
+@end
+
+@implementation Bar
+@end
+
+int main (void)
+{
+ Class cls;
+
+ cls = objc_getClass("Foo");
+ CHECK_IF(cls->info & CLS_HAS_CXX_STRUCTORS);
+ cls = objc_getClass("Bar");
+ CHECK_IF(!(cls->info & CLS_HAS_CXX_STRUCTORS));
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/cxx-scope-1.mm b/gcc/testsuite/obj-c++.dg/cxx-scope-1.mm
new file mode 100644
index 00000000000..952facceb71
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/cxx-scope-1.mm
@@ -0,0 +1,53 @@
+/* Handle C++ scoping ('::') operators in ObjC message receivers gracefully. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+
+/* { dg-do run } */
+
+#include <objc/Object.h>
+#include <stdlib.h>
+
+@class Derived;
+
+Derived *inst[3];
+
+struct CxxClass {
+ static Derived *get_instance(int);
+};
+
+Derived *CxxClass::get_instance(int offs) {
+ return inst[offs];
+}
+
+@interface Derived: Object {
+ int value;
+}
+-(id)initWithValue:(int)val;
+-(int)derived_meth;
+@end
+
+@implementation Derived
+-(id)initWithValue:(int)val {
+ [super init];
+ value = val;
+ return self;
+}
+- (int)derived_meth {
+ return value;
+}
+@end
+
+int main(void) {
+ int r;
+ inst[1] = [[::Derived alloc] initWithValue:7];
+ inst[2] = [[Derived alloc] initWithValue:77];
+
+ r = [CxxClass::get_instance(2) derived_meth];
+ if (r != 77)
+ abort();
+
+ r = [CxxClass::get_instance(1) derived_meth];
+ if (r != 7)
+ abort();
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/cxx-scope-2.mm b/gcc/testsuite/obj-c++.dg/cxx-scope-2.mm
new file mode 100644
index 00000000000..a5bce398325
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/cxx-scope-2.mm
@@ -0,0 +1,19 @@
+/* Make sure Objective-C++ can distinguish ObjC classes from C++ classes. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+#include <iostream>
+#include <string>
+
+@interface iostream: Object
+@end
+
+int main(void) {
+ id i = [std::iostream new]; /* { dg-warning "not an Objective\\-C class name or alias" } */
+ i = [iostream new];
+ i = [std::basic_string<char> new]; /* { dg-warning "not an Objective\\-C class name or alias" } */
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/defs.mm b/gcc/testsuite/obj-c++.dg/defs.mm
new file mode 100644
index 00000000000..3027985ed0c
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/defs.mm
@@ -0,0 +1,43 @@
+/* Check @defs() in Objective-C++ */
+/* Contributed by Devang Patel <dpatel@apple.com> */
+
+/* { dg-options "-lobjc" } */
+/* { dg-do run } */
+
+#include <stdlib.h>
+#include <objc/objc.h>
+#include <objc/Object.h>
+
+extern void abort(void);
+
+@interface A : Object
+{
+ @public
+ int a;
+}
+@end
+
+struct A_defs
+{
+ @defs(A);
+};
+
+@implementation A
+- init
+{
+ a = 42;
+ return self;
+}
+@end
+
+
+int main()
+{
+ A *a = [A init];
+ struct A_defs *a_defs = (struct A_defs *)a;
+
+ if (a->a != a_defs->a)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/dg.exp b/gcc/testsuite/obj-c++.dg/dg.exp
new file mode 100644
index 00000000000..f2c969f7672
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/dg.exp
@@ -0,0 +1,37 @@
+# GCC Objective-C++ testsuite that uses the `dg.exp' driver.
+# Copyright (C) 2004 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.
+
+# Load support procs.
+load_lib obj-c++-dg.exp
+
+# If a testcase doesn't have special options, use these.
+global DEFAULT_OBJCXXFLAGS
+if ![info exists DEFAULT_OBJCXXFLAGS] then {
+ set DEFAULT_OBJCXXFLAGS " -ansi -pedantic-errors -Wno-long-long"
+}
+
+# Initialize `dg'.
+dg-init
+
+# Gather a list of all tests.
+set tests [lsort [find $srcdir/$subdir *.mm]]
+
+# Main loop.
+dg-runtest $tests "" $DEFAULT_OBJCXXFLAGS
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/obj-c++.dg/empty-private-1.mm b/gcc/testsuite/obj-c++.dg/empty-private-1.mm
new file mode 100644
index 00000000000..b8b90b07ecd
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/empty-private-1.mm
@@ -0,0 +1,9 @@
+/* Test for no entry after @private token. */
+
+/* { do-do compile } */
+
+@interface foo
+{
+@private
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/encode-1.mm b/gcc/testsuite/obj-c++.dg/encode-1.mm
new file mode 100644
index 00000000000..c5f5ea969ab
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/encode-1.mm
@@ -0,0 +1,23 @@
+/* Test for graceful encoding of const-qualified fields and parameters. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+
+/* { dg-do compile } */
+
+struct Cxx {
+ const struct Cxx *next;
+};
+
+@interface ObjC {
+ const struct Cxx *obj;
+}
+- (ObjC *)initWithCxx: (struct Cxx *const)c and: (const struct Cxx *)d;
+@end
+
+@implementation ObjC
+- (ObjC *)initWithCxx: (struct Cxx *const)c and: (const struct Cxx *)d {
+ obj = d;
+ return self;
+}
+@end
+
+/* { dg-final { scan-assembler "@\[0-9\]+@0:\[0-9\]+r\\^{Cxx=\\^r{Cxx}}\[0-9\]+\\^r{Cxx}" } } */
diff --git a/gcc/testsuite/obj-c++.dg/encode-2.mm b/gcc/testsuite/obj-c++.dg/encode-2.mm
new file mode 100644
index 00000000000..232ac0e8fc9
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/encode-2.mm
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+template <class T>
+struct Vec {
+ T x, y;
+ int z;
+};
+
+Vec<double> dd;
+const char *enc = @encode(Vec<float>);
+const char *enc2 = @encode(Vec<double>);
+
+/* { dg-final { scan-assembler "{Vec<float>=ffi}" } } */
+/* { dg-final { scan-assembler "{Vec<double>=ddi}" } } */
diff --git a/gcc/testsuite/obj-c++.dg/encode-3.mm b/gcc/testsuite/obj-c++.dg/encode-3.mm
new file mode 100644
index 00000000000..c67a972ddce
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/encode-3.mm
@@ -0,0 +1,30 @@
+/* { dg-do run } */
+
+#include <stdlib.h>
+#include <string.h>
+
+template <class T>
+struct Vec {
+ T x, y;
+ long z;
+ long long zz;
+};
+
+Vec<double> dd;
+const char *enc = @encode(Vec<float>);
+const char *enc2 = @encode(Vec<double>);
+
+int main(void) {
+ char *encode = @encode(long);
+
+ if (strcmp (encode, "l"))
+ abort();
+
+ if (strcmp (enc, "{Vec<float>=fflq}"))
+ abort();
+
+ if (strcmp (enc2, "{Vec<double>=ddlq}"))
+ abort();
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/encode-4.mm b/gcc/testsuite/obj-c++.dg/encode-4.mm
new file mode 100644
index 00000000000..25c0b509f8d
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/encode-4.mm
@@ -0,0 +1,105 @@
+/* Test Objective-C method encodings. */
+
+/* The _encoded_ parameter offsets for Objective-C methods are
+ computed inductively as follows:
+ - The first paramter (self) has offset 0;
+ - The k-th parameter (k > 1) has offset equal to the
+ sum of:
+ - the offset of the k-1-st paramter
+ - the (void *)-promoted size of the k-1-st parameter.
+
+ Note that the encoded offsets need not correspond
+ to the actual placement of parameters (relative to 'self')
+ on the stack! Your target's ABI may have very different
+ opinions on the matter. */
+
+/* Contributed by Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-do run } */
+
+
+#include <objc/objc.h>
+#include <objc/Object.h>
+
+#ifdef __NEXT_RUNTIME__
+#define METHOD Method
+#define OBJC_GETCLASS objc_getClass
+#define CLASS_GETINSTANCEMETHOD class_getInstanceMethod
+#else
+#include <objc/objc-api.h>
+#define METHOD Method_t
+#define OBJC_GETCLASS objc_get_class
+#define CLASS_GETINSTANCEMETHOD class_get_instance_method
+#endif
+
+extern "C" {
+ extern int sscanf(const char *str, const char *format, ...);
+ extern void abort(void);
+}
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+@interface Foo: Object
+typedef struct { float x, y; } XXPoint;
+typedef struct { float width, height; } XXSize;
+typedef struct _XXRect { XXPoint origin; XXSize size; } XXRect;
+-(id)setRect:(XXRect)r withInt:(int)i;
+-(void) char:(signed char)c float:(float)f double:(double)d long:(long)l;
+@end
+
+XXRect my_rect;
+unsigned offs1, offs2, offs3, offs4, offs5, offs6, offs7;
+
+@implementation Foo
+-(id)setRect:(XXRect)r withInt:(int)i {
+ unsigned offs = sizeof(self);
+ CHECK_IF(offs == offs3);
+ offs += sizeof(_cmd);
+ CHECK_IF(offs == offs4);
+ offs += sizeof(r);
+ CHECK_IF(offs == offs5);
+ offs += sizeof(i);
+ CHECK_IF(offs == offs1);
+ return nil;
+}
+-(void) char:(signed char)c float:(float)f double:(double)d long:(long)l {
+ unsigned offs = sizeof(self);
+ CHECK_IF(offs == offs3);
+ offs += sizeof(_cmd);
+ CHECK_IF(offs == offs4);
+ offs += sizeof((int)c);
+ CHECK_IF(offs == offs5);
+ offs += sizeof(f);
+ CHECK_IF(offs == offs6);
+ offs += sizeof(d);
+ CHECK_IF(offs == offs7);
+ offs += sizeof(l);
+ CHECK_IF(offs == offs1);
+}
+@end
+
+
+int main(void) {
+ Foo *foo = [[Foo alloc] init];
+ Class fooClass = OBJC_GETCLASS("Foo");
+ METHOD meth;
+ const char *string;
+
+ meth = CLASS_GETINSTANCEMETHOD(fooClass, @selector(setRect:withInt:));
+ offs2 = 9999;
+ sscanf(meth->method_types, "@%u@%u:%u{_XXRect={?=ff}{?=ff}}%ui%u", &offs1, &offs2, &offs3,
+ &offs4, &offs5);
+ CHECK_IF(!offs2);
+ [foo setRect:my_rect withInt:123];
+
+ meth = CLASS_GETINSTANCEMETHOD(fooClass, @selector(char:float:double:long:));
+ offs2 = 9999;
+ if (sizeof (long) == 8)
+ string = "v%u@%u:%uc%uf%ud%uq%u";
+ else
+ string = "v%u@%u:%uc%uf%ud%ul%u";
+ sscanf(meth->method_types, string, &offs1, &offs2, &offs3,
+ &offs4, &offs5, &offs6, &offs7);
+ CHECK_IF(!offs2);
+ [foo char:'c' float:2.3 double:3.5 long:2345L];
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/encode-5.mm b/gcc/testsuite/obj-c++.dg/encode-5.mm
new file mode 100644
index 00000000000..9a36326a355
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/encode-5.mm
@@ -0,0 +1,74 @@
+/* Method encoding tests for stand-alone @protocol declarations. */
+/* Contributed by Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-do run } */
+
+#include <objc/Protocol.h>
+#ifdef __cplusplus
+#define ProtoBool bool
+#else
+#define ProtoBool _Bool
+#endif
+
+#ifndef __NEXT_RUNTIME__
+#include <objc/objc-api.h>
+#endif
+
+extern "C" {
+ extern int sscanf(const char *str, const char *format, ...);
+ extern void abort(void);
+}
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+enum Enum {
+ zero, one, two, three
+};
+typedef enum Enum Enum;
+typedef signed char ObjCBool; /* as used by the NeXT runtime */
+
+@protocol Proto
+union __XXAngle { unsigned int alpha, beta; };
+typedef struct { float x, y; union __XXAngle a; } XXPoint;
+typedef struct { double width, height; } XXSize;
+typedef struct _XXRect { XXPoint origin; XXSize size; struct _XXRect *next; } XXRect;
+- (void) char:(signed char)c float:(float)f double:(double)d unsigned:(unsigned)u short:(short)s long:(long)l;
+- (void *)setRect:(XXRect)r withBool:(ProtoBool)b withInt:(int)i;
++ (Enum *)getEnum:(XXPoint *)pt enum:(enum Enum)e bool:(ObjCBool)b;
++ (ProtoBool **)getBool:(ObjCBool **)b;
+@end
+
+Protocol *proto = @protocol(Proto);
+struct objc_method_description *meth;
+unsigned totsize, offs0, offs1, offs2, offs3, offs4, offs5, offs6, offs7;
+
+static void scan_initial(const char *pattern) {
+ totsize = offs0 = offs1 = offs2 = offs3 = offs4 = offs5 = offs6 = offs7 = (unsigned)-1;
+ sscanf(meth->types, pattern, &totsize, &offs0, &offs1, &offs2, &offs3,
+ &offs4, &offs5, &offs6, &offs7);
+ CHECK_IF(!offs0 && offs1 == sizeof(id) && offs2 == offs1 + sizeof(SEL) && totsize >= offs2);
+}
+
+int main(void) {
+ const char *string;
+
+ meth = [proto descriptionForInstanceMethod: @selector(char:float:double:unsigned:short:long:)];
+ if (sizeof (long) == 8)
+ string = "v%u@%u:%uc%uf%ud%uI%us%uq%u";
+ else
+ string = "v%u@%u:%uc%uf%ud%uI%us%ul%u";
+ scan_initial(string);
+ CHECK_IF(offs3 == offs2 + sizeof(int) && offs4 == offs3 + sizeof(float));
+ CHECK_IF(offs5 == offs4 + sizeof(double) && offs6 == offs5 + sizeof(unsigned));
+ CHECK_IF(offs7 == offs6 + sizeof(int) && totsize == offs7 + sizeof(long));
+ meth = [proto descriptionForInstanceMethod: @selector(setRect:withBool:withInt:)];
+ scan_initial("^v%u@%u:%u{_XXRect={?=ff(__XXAngle=II)}{?=dd}^{_XXRect}}%uB%ui%u");
+ CHECK_IF(offs3 == offs2 + sizeof(XXRect) && offs4 == offs3 + sizeof(int));
+ CHECK_IF(totsize == offs4 + sizeof(int));
+ meth = [proto descriptionForClassMethod: @selector(getEnum:enum:bool:)];
+ scan_initial("^i%u@%u:%u^{?=ff(__XXAngle=II)}%ui%uc%u");
+ CHECK_IF(offs3 == offs2 + sizeof(XXPoint *) && offs4 == offs3 + sizeof(enum Enum));
+ CHECK_IF(totsize == offs4 + sizeof(int)); /* 'ObjCBool' is really 'char' */
+ meth = [proto descriptionForClassMethod: @selector(getBool:)];
+ scan_initial("^^B%u@%u:%u^*%u");
+ CHECK_IF(totsize == offs2 + sizeof(ObjCBool **));
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/encode-6.mm b/gcc/testsuite/obj-c++.dg/encode-6.mm
new file mode 100644
index 00000000000..1ee11714def
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/encode-6.mm
@@ -0,0 +1,75 @@
+/* Encoding tests for ObjC class layouts. */
+/* Contributed by Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-options "-lobjc" } */
+/* { dg-do run } */
+
+#include <objc/Object.h>
+#ifdef __NEXT_RUNTIME__
+#include <objc/objc-class.h>
+#define OBJC_GETCLASS objc_getClass
+#else
+#include <objc/objc-api.h>
+#define OBJC_GETCLASS objc_get_class
+#endif
+
+extern "C" {
+ extern void abort(void);
+ extern int strcmp(const char *s1, const char *s2);
+}
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+@class Int1, Int2;
+struct Nested;
+
+struct Innermost {
+ unsigned char a, b;
+ struct Nested *encl;
+};
+
+struct Nested {
+ float a, b;
+ Int1 *next;
+ struct Innermost innermost;
+};
+
+@interface Int1: Object {
+ signed char a, b;
+ Int2 *int2;
+ struct Nested nested;
+}
+@end
+
+@interface Int2: Int1 {
+ struct Innermost *innermost;
+ Int1 *base;
+}
+@end
+
+@implementation Int1
+@end
+
+@implementation Int2
+@end
+
+struct objc_ivar *ivar;
+
+static void check_ivar(const char *name, const char *type) {
+ CHECK_IF(!strcmp(ivar->ivar_name, name));
+ CHECK_IF(!strcmp(ivar->ivar_type, type));
+ ivar++;
+}
+
+int main(void) {
+ ivar = ((Class)OBJC_GETCLASS("Int1"))->ivars->ivar_list;
+ check_ivar("a", "c");
+ check_ivar("b", "c");
+ check_ivar("int2", "@\"Int2\"");
+ check_ivar("nested",
+ "{Nested=\"a\"f\"b\"f\"next\"@\"Int1\"\"innermost\"{Innermost=\"a\"C\"b\"C\"encl\"^{Nested}}}");
+
+ ivar = ((Class)OBJC_GETCLASS("Int2"))->ivars->ivar_list;
+ check_ivar("innermost", "^{Innermost=CC^{Nested}}");
+ check_ivar("base", "@\"Int1\"");
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/encode-7.mm b/gcc/testsuite/obj-c++.dg/encode-7.mm
new file mode 100644
index 00000000000..f2cb693b1b7
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/encode-7.mm
@@ -0,0 +1,78 @@
+/* Check if array arguments of ObjC methods are decayed to pointer types
+ in a proper fashion:
+ (1) The _encodings_ for the array arguments should remain to be '[4i]' and
+ such, since this has been the case since at least gcc 3.3.
+ (2) However, when building the static C functions out of ObjC method signatures,
+ we need to decay the arrays into pointers (as C does).
+ (3) If array size is not known (e.g., 'int a[]'), then the type shall be
+ encoded as a pointer. */
+
+/* Contributed by Alexander Malmberg <alexander@malmberg.org> */
+
+#include <objc/Object.h>
+#include <stdlib.h>
+#include <stdio.h>
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+#ifdef __NEXT_RUNTIME__
+#define METHOD Method
+#define OBJC_GETCLASS objc_getClass
+#define CLASS_GETINSTANCEMETHOD class_getInstanceMethod
+#else
+#include <objc/objc-api.h>
+#define METHOD Method_t
+#define OBJC_GETCLASS objc_get_class
+#define CLASS_GETINSTANCEMETHOD class_get_instance_method
+#endif
+
+@interface Test : Object
+{ float j; }
+-(void) test2: (int [5])a with: (int [])b;
+-(id) test3: (Test **)b; /* { dg-warning "previous declaration of .\\-\\(id\\)test3:\\(Test \\*\\*\\)b." } */
+@end
+
+@implementation Test
+-(void) test2: (int [5])a with: (int [])b
+{
+ a[3] = *b;
+}
+-(void) test3: (Test [3][4])b { /* { dg-warning "conflicting types for .\\-\\(void\\)test3:\\(Test \\\[3\\\]\\\[4\\\]\\)b." } */
+}
+@end
+
+int bb[6] = { 0, 1, 2, 3, 4, 5 };
+int *b = bb;
+Test *cc[4];
+Test **c = cc;
+
+int offs1, offs2, offs3, offs4, offs5, offs6;
+
+int main(int argc, char **argv)
+{
+ Class testClass = OBJC_GETCLASS("Test");
+ METHOD meth;
+
+ cc[0] = [Test new];
+ CHECK_IF (bb[3] == 3);
+ [*c test2: b with: bb + 4];
+ CHECK_IF (bb[3] == 4);
+ bb[3] = 0;
+ [*c test2: bb with: bb + 5];
+ CHECK_IF (bb[3] == 5);
+
+ meth = CLASS_GETINSTANCEMETHOD(testClass, @selector(test2:with:));
+ offs1 = offs2 = offs3 = offs4 = offs5 = offs6 = -1;
+ sscanf(meth->method_types, "v%d@%d:%d[%di]%d^i%d", &offs1, &offs2, &offs3,
+ &offs4, &offs5, &offs6);
+ CHECK_IF (!offs2 && offs4 == 5 && offs3 > 0);
+ CHECK_IF (offs5 == 2 * offs3 && offs6 == 3 * offs3 && offs1 == 4 * offs3);
+
+ meth = CLASS_GETINSTANCEMETHOD(testClass, @selector(test3:));
+ offs1 = offs2 = offs3 = offs4 = offs5 = offs6 = -1;
+ sscanf(meth->method_types, "v%d@%d:%d[%d[%d{Test=#f}]]%d", &offs1, &offs2, &offs3,
+ &offs4, &offs5, &offs6);
+ CHECK_IF (!offs2 && offs4 == 3 && offs5 == 4 && offs3 > 0);
+ CHECK_IF (offs6 == 2 * offs3 && offs1 == 3 * offs3);
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/encode-8.mm b/gcc/testsuite/obj-c++.dg/encode-8.mm
new file mode 100644
index 00000000000..5f61cb87be4
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/encode-8.mm
@@ -0,0 +1,23 @@
+/* Test if the Objective-C @encode machinery distinguishes between
+ 'BOOL *' (which should be encoded as '^c') and 'char *' (which
+ should be encoded as '*'). */
+/* Contributed by Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-options "-lobjc" } */
+/* { dg-do run } */
+
+#include <string.h>
+#include <stdlib.h>
+#include <objc/objc.h>
+
+int main(void) {
+ const char *BOOL_ptr = @encode(BOOL *);
+ const char *char_ptr = @encode(char *);
+
+ if(strcmp(BOOL_ptr, "^c"))
+ abort();
+
+ if(strcmp(char_ptr, "*"))
+ abort();
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/extern-c-1.mm b/gcc/testsuite/obj-c++.dg/extern-c-1.mm
new file mode 100644
index 00000000000..c5fec6fbe93
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/extern-c-1.mm
@@ -0,0 +1,18 @@
+/* Test extern c support inside @implementation */
+/* Devang Patel <dpatel@apple.com>. */
+
+#include <objc/objc.h>
+
+@interface Extern
+@end
+
+@implementation Extern
+
+extern "C" void NSRegisterElement(id element);
+
+- init {
+ NSRegisterElement(self);
+ return self;
+}
+
+@end
diff --git a/gcc/testsuite/obj-c++.dg/extra-semi.mm b/gcc/testsuite/obj-c++.dg/extra-semi.mm
new file mode 100644
index 00000000000..ad555962dbb
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/extra-semi.mm
@@ -0,0 +1,10 @@
+/* Allow extra semicolons in between method declarations,
+ for old times' sake. */
+
+/* { dg-do compile } */
+
+@interface Foo
+ -(Foo *) expiration;
+ -(void) setExpiration:(Foo *) date;;
+ -(int) getVersion;
+@end
diff --git a/gcc/testsuite/obj-c++.dg/fix-and-continue-2.mm b/gcc/testsuite/obj-c++.dg/fix-and-continue-2.mm
new file mode 100644
index 00000000000..33cb8467dcd
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/fix-and-continue-2.mm
@@ -0,0 +1,24 @@
+/* Static variables, even if local, require indirect access through a stub
+ if -mfix-and-continue is enabled. */
+
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+
+/* { dg-do assemble { target *-*-darwin* } } */
+/* { dg-options "-mfix-and-continue" } */
+
+#include <objc/Object.h>
+
+@interface Foo: Object
++ (Object *)indexableFileTypes;
+@end
+
+@implementation Foo
++ (Object *)indexableFileTypes
+{
+ static Object *fileTypes = 0;
+ if(!fileTypes) {
+ fileTypes = [Object new];
+ }
+ return fileTypes;
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/isa-field-1.mm b/gcc/testsuite/obj-c++.dg/isa-field-1.mm
new file mode 100644
index 00000000000..ce1d9ff2d8f
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/isa-field-1.mm
@@ -0,0 +1,43 @@
+/* Ensure there are no bizarre difficulties with accessing the 'isa' field of objects. */
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+@interface Object (Test)
+- (Class) test1: (id)object;
+@end
+
+@interface Derived: Object
+- (Class) test2: (id)object;
+@end
+
+@implementation Object (Test)
+
+Class test1(id object) {
+ Class cls = object->isa;
+ return cls;
+}
+- (Class) test1: (id)object {
+ Class cls = object->isa;
+ return cls;
+}
+
+@end
+
+@implementation Derived
+
+Class test2(id object) {
+ Class cls = object->isa;
+ return cls;
+}
+- (Class) test2: (id)object {
+ Class cls = object->isa;
+ return cls;
+}
+
+@end
+
+Class test3(id object) {
+ Class cls = object->isa;
+ return cls;
+}
diff --git a/gcc/testsuite/obj-c++.dg/ivar-list-semi.mm b/gcc/testsuite/obj-c++.dg/ivar-list-semi.mm
new file mode 100644
index 00000000000..21bd3a3bec0
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/ivar-list-semi.mm
@@ -0,0 +1,12 @@
+/* Allow for an optional semicolon following the ivar block. */
+/* Contributed by: Ziemowit Laski <zlaski@apple.com>. */
+
+#include <objc/Object.h>
+
+@interface Tink : Object {
+@private
+ unsigned long mCode[4];
+};
+- (id)initWithProc:(void *)inProc;
+- (void *)getUniqueProc;
+@end
diff --git a/gcc/testsuite/obj-c++.dg/layout-1.mm b/gcc/testsuite/obj-c++.dg/layout-1.mm
new file mode 100644
index 00000000000..fe8ab3d083d
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/layout-1.mm
@@ -0,0 +1,15 @@
+/* Ensure that we do not get bizarre warnings referring to
+ __attribute__((packed)) or some such. */
+/* { dg-do compile } */
+/* { dg-options "-Wpadded -Wpacked -Wabi" } */
+
+#include <objc/Object.h>
+
+@interface Derived1: Object
+{ }
+@end
+
+@interface Derived2: Object
+- (id) foo;
+@end
+
diff --git a/gcc/testsuite/obj-c++.dg/local-decl-1.mm b/gcc/testsuite/obj-c++.dg/local-decl-1.mm
new file mode 100644
index 00000000000..0d7389d2c2f
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/local-decl-1.mm
@@ -0,0 +1,44 @@
+/* Test for ivar access inside of class methods. It should be allowed
+ (with a warning), but only if no other declarations with the same
+ name are seen. */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+@interface Sprite: Object {
+ int sprite, spree;
+}
++ (void)setFoo:(int)foo;
++ (void)setSprite:(int)sprite;
+- (void)setFoo:(int)foo;
+- (void)setSprite:(int)sprite;
+@end
+
+int spree = 23;
+
+@implementation Sprite
++ (void)setFoo:(int)foo {
+ sprite = foo; /* { dg-warning "instance variable .sprite. accessed in class method" } */
+ spree = foo;
+}
++ (void)setSprite:(int)sprite {
+ int spree;
+ sprite = 15;
+ spree = 17;
+ ((Sprite *)self)->sprite = 16; /* NB: This is how one _should_ access */
+ ((Sprite *)self)->spree = 18; /* ivars from within class methods! */
+}
+- (void)setFoo:(int)foo {
+ sprite = foo;
+ spree = foo;
+}
+- (void)setSprite:(int)sprite {
+ int spree;
+ sprite = 15; /* { dg-warning "local declaration of .sprite. hides instance variable" } */
+ self->sprite = 16;
+ spree = 17; /* { dg-warning "local declaration of .spree. hides instance variable" } */
+ self->spree = 18;
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/lookup-1.mm b/gcc/testsuite/obj-c++.dg/lookup-1.mm
new file mode 100644
index 00000000000..e149e5c6119
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/lookup-1.mm
@@ -0,0 +1,8 @@
+/* Simple test to check Objectivec-C++ qualified type lookup. */
+/* Devang Patel <dpatel@apple.com>. */
+
+@interface A
+{
+ A *ap;
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/lookup-2.mm b/gcc/testsuite/obj-c++.dg/lookup-2.mm
new file mode 100644
index 00000000000..f694ec9301c
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/lookup-2.mm
@@ -0,0 +1,56 @@
+/* { dg-do run } */
+
+#include <objc/Object.h>
+#include <stdlib.h>
+
+class MyWidget {
+ public:
+ int a;
+ MyWidget(void) { a = 17; }
+};
+
+MyWidget gWidget;
+
+@protocol MyProto
+- (MyWidget *)widget;
+@end
+
+@interface Foo: Object
+@end
+
+@interface Bar: Foo <MyProto>
+@end
+
+@interface Container: Object
++ (MyWidget *)elementForView:(Foo *)view;
+@end
+
+@implementation Foo
+@end
+
+@implementation Bar
+- (MyWidget *)widget {
+ return &gWidget;
+}
+@end
+
+@implementation Container
++ (MyWidget *)elementForView:(Foo *)view
+{
+ MyWidget *widget = nil;
+ if ([view conformsTo:@protocol(MyProto)]) {
+ widget = [(Foo <MyProto> *)view widget];
+ }
+ return widget;
+}
+@end
+
+int main(void) {
+ id view = [Bar new];
+ MyWidget *w = [Container elementForView: view];
+
+ if (!w || w->a != 17)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/method-1.mm b/gcc/testsuite/obj-c++.dg/method-1.mm
new file mode 100644
index 00000000000..fdab6b7a9c3
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-1.mm
@@ -0,0 +1,30 @@
+/* Test whether casting 'id' to a specific class removes method lookup
+ ambiguity. */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-do compile } */
+
+#include <objc/objc.h>
+
+@class Int1, Int2;
+
+@interface Int1
++ (Int1 *)classMethod1;
++ (id)classMethod2;
+- (Int1 *)instanceMethod:(Int2 *)arg; /* { dg-bogus "using" } */
+@end
+
+@interface Int2: Int1
++ (Int1 *)classMethod1;
++ (id)classMethod2;
+- (id)int2Method;
+- (int)instanceMethod:(int)arg; /* { dg-bogus "also found" } */
+@end
+
+int main(void) {
+ id i = [(Int2 *)[Int1 classMethod1] int2Method]; /* { dg-bogus "may not respond to" } */
+ int j = [(Int2 *)[Int2 classMethod2] instanceMethod: 45]; /* { dg-bogus "multiple methods" } */
+ /* { dg-bogus "invalid conversion" "" { target *-*-* } 25 } */
+ /* { dg-bogus "invalid conversion" "" { target *-*-* } 25 } */
+ return j;
+}
diff --git a/gcc/testsuite/obj-c++.dg/method-10.mm b/gcc/testsuite/obj-c++.dg/method-10.mm
new file mode 100644
index 00000000000..4c7ccb8b8a7
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-10.mm
@@ -0,0 +1,45 @@
+/* Test for sending messages to aliased classes (and instances thereof). */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-options "-lobjc" } */
+/* { dg-do run } */
+
+#include <objc/Object.h>
+
+extern "C" void abort(void);
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+@interface Int1: Object
++ (int) classMeth;
+- (int) instanceMeth;
+@end
+
+@interface Int2: Object
++ (int) classMeth;
+- (int) instanceMeth;
+@end
+
+@implementation Int1
++ (int) classMeth { return 345; }
+- (int) instanceMeth { return 697; }
+@end
+
+@implementation Int2
++ (int) classMeth { return 1345; }
+- (int) instanceMeth { return 1697; }
+@end
+
+typedef Int1 Int1Typedef;
+@compatibility_alias Int1Alias Int1Typedef;
+@compatibility_alias Int2Alias Int2;
+typedef Int2Alias Int2Typedef;
+
+int main(void) {
+ Int1Alias *int1alias = [[Int1Typedef alloc] init];
+ Int2Typedef *int2typedef = [[Int2Alias alloc] init];
+
+ CHECK_IF([Int1Typedef classMeth] == 345 && [Int2Alias classMeth] == 1345);
+ CHECK_IF([int1alias instanceMeth] == 697 && [int2typedef instanceMeth] == 1697);
+ CHECK_IF([(Int2Typedef *)int1alias instanceMeth] == 697);
+ CHECK_IF([(Int1Alias *)int2typedef instanceMeth] == 1697);
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/method-11.mm b/gcc/testsuite/obj-c++.dg/method-11.mm
new file mode 100644
index 00000000000..c8d092df74d
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-11.mm
@@ -0,0 +1,25 @@
+/* Check if class references (generated for the NeXT runtime) are appropriately
+ folded. This test is safe to run on all targets. */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-options "-fnext-runtime" } */
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+typedef Object ObjectTypedef1;
+typedef ObjectTypedef1 ObjectTypedef2;
+@compatibility_alias ObjectAlias1 ObjectTypedef2;
+@compatibility_alias ObjectAlias2 ObjectAlias1;
+typedef ObjectAlias2 ObjectTypedef3;
+
+void foo(void) {
+ id obj = [Object new];
+ obj = [ObjectTypedef1 new];
+ obj = [ObjectTypedef2 new];
+ obj = [ObjectTypedef3 new];
+ obj = [ObjectAlias1 new];
+ obj = [ObjectAlias2 new];
+}
+
+/* { dg-final { scan-assembler "_OBJC_CLASS_REFERENCES_0" } } */
+/* { dg-final { scan-assembler-not "_OBJC_CLASS_REFERENCES_1" } } */
diff --git a/gcc/testsuite/obj-c++.dg/method-12.mm b/gcc/testsuite/obj-c++.dg/method-12.mm
new file mode 100644
index 00000000000..21f4bb9f44d
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-12.mm
@@ -0,0 +1,31 @@
+/* Check that sending messages to variables of type 'Class' does not involve instance methods, unless they reside in root classes. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+/* { dg-options "-Wstrict-selector-match" } */
+/* { dg-do compile } */
+
+#include <objc/Protocol.h>
+
+@interface Base
+- (unsigned)port;
+@end
+
+@interface Derived: Base
+- (Object *)port;
++ (Protocol *)port;
+- (id)starboard;
+@end
+
+void foo(void) {
+ Class receiver;
+
+ [receiver port]; /* { dg-warning "multiple methods named .\\+port. found" } */
+ /* { dg-warning "using .\\-\\(unsigned( int)?\\)port." "" { target *-*-* } 9 } */
+ /* { dg-warning "also found .\\+\\(Protocol \\*\\)port." "" { target *-*-* } 14 } */
+
+ [receiver starboard]; /* { dg-warning "no .\\+starboard. method found" } */
+ /* { dg-warning "Messages without a matching method signature" "" { target *-*-* } 25 } */
+ /* { dg-warning "will be assumed to return .id. and accept" "" { target *-*-* } 25 } */
+ /* { dg-warning ".\.\.\.. as arguments" "" { target *-*-* } 25 } */
+
+ [Class port]; /* { dg-error ".Class. is not an Objective\\-C class name or alias" } */
+}
diff --git a/gcc/testsuite/obj-c++.dg/method-13.mm b/gcc/testsuite/obj-c++.dg/method-13.mm
new file mode 100644
index 00000000000..adf6dfe26d8
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-13.mm
@@ -0,0 +1,27 @@
+/* Check if finding multiple signatures for a method is handled gracefully. Author: Ziemowit Laski <zlaski@apple.com> */
+/* { dg-options "-Wstrict-selector-match" } */
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+@interface Class1
+- (void)setWindow:(Object *)wdw;
+@end
+
+@interface Class2
+- (void)setWindow:(Class1 *)window;
+@end
+
+id foo(void) {
+ Object *obj = [[Object alloc] init];
+ id obj2 = obj;
+ [obj setWindow:nil]; /* { dg-warning ".Object. may not respond to .\\-setWindow:." } */
+ /* { dg-warning "Messages without a matching method signature" "" { target *-*-* } 18 } */
+ /* { dg-warning "will be assumed to return .id. and accept" "" { target *-*-* } 18 } */
+ /* { dg-warning ".\.\.\.. as arguments" "" { target *-*-* } 18 } */
+ [obj2 setWindow:nil]; /* { dg-warning "multiple methods named .\\-setWindow:. found" } */
+ /* { dg-warning "using .\\-\\(void\\)setWindow:\\(Object \\*\\)wdw." "" { target *-*-* } 8 } */
+ /* { dg-warning "also found .\\-\\(void\\)setWindow:\\(Class1 \\*\\)window." "" { target *-*-* } 12 } */
+
+ return obj;
+}
diff --git a/gcc/testsuite/obj-c++.dg/method-14.mm b/gcc/testsuite/obj-c++.dg/method-14.mm
new file mode 100644
index 00000000000..4a13b7d6cbb
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-14.mm
@@ -0,0 +1,14 @@
+/* Check if casting the receiver type causes method lookup to succeed. This was broken
+ in Objective-C++. */
+/* Contributed by Ziemowit Laski <zlaski@apple.com> */
+/* { dg-do compile } */
+
+@interface A
+@end
+
+@interface B: A
+- (void)f;
+@end
+
+void g(A *p) { [(B *)p f]; }
+
diff --git a/gcc/testsuite/obj-c++.dg/method-15.mm b/gcc/testsuite/obj-c++.dg/method-15.mm
new file mode 100644
index 00000000000..9d9099e9f7e
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-15.mm
@@ -0,0 +1,43 @@
+/* Check if finding multiple signatures for a method is handled gracefully when method lookup succeeds (see also method-7.m). */
+/* Contributed by Ziemowit Laski <zlaski@apple.com> */
+/* { dg-options "-Wstrict-selector-match" } */
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+@protocol MyObject
+- (id)initWithData:(Object *)data;
+@end
+
+@protocol SomeOther
+- (id)initWithData:(int)data;
+@end
+
+@protocol MyCoding
+- (id)initWithData:(id<MyObject, MyCoding>)data;
+@end
+
+@interface NTGridDataObject: Object <MyCoding>
+{
+ Object<MyCoding> *_data;
+}
++ (NTGridDataObject*)dataObject:(id<MyObject, MyCoding>)data;
+@end
+
+@implementation NTGridDataObject
+- (id)initWithData:(id<MyObject, MyCoding>)data {
+ return data;
+}
++ (NTGridDataObject*)dataObject:(id<MyObject, MyCoding>)data
+{
+ NTGridDataObject *result = [[NTGridDataObject alloc] initWithData:data];
+ /* { dg-warning "multiple methods named .\\-initWithData:. found" "" { target *-*-* } 33 } */
+ /* { dg-warning "using .\\-\\(id\\)initWithData:\\(Object \\*\\)data." "" { target *-*-* } 9 } */
+ /* { dg-warning "also found .\\-\\(id\\)initWithData:\\(id <MyObject, MyCoding>\\)data." "" { target *-*-* } 17 } */
+ /* { dg-warning "also found .\\-\\(id\\)initWithData:\\(int\\)data." "" { target *-*-* } 13 } */
+
+ /* The following warning is a consequence of picking the "wrong" method signature. */
+ /* { dg-warning "passing argument 1 of .initWithData:. from distinct Objective\\-C type" "" { target *-*-* } 33 } */
+ return result;
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/method-16.mm b/gcc/testsuite/obj-c++.dg/method-16.mm
new file mode 100644
index 00000000000..f4a9efcd72c
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-16.mm
@@ -0,0 +1,34 @@
+
+/* Ensure that we indeed cannot obtain the value of a message send
+ if the chosen method signature returns 'void'. There used to
+ exist a cheesy hack that allowed it. While at it, check that
+ the first lexically occurring method signature gets picked
+ when sending messages to 'id'. */
+/* Contributed by Ziemowit Laski <zlaski@apple.com> */
+/* { dg-do compile } */
+
+#include <objc/objc.h>
+
+@interface Object1
+- (void)initWithData:(Object1 *)data;
+@end
+
+@interface Object2
+- (id)initWithData:(Object1 *)data;
+@end
+
+@interface Object3
+- (id)initWithData:(Object2 *)data;
+@end
+
+void foo(void) {
+ id obj1, obj2 = 0;
+ obj2 = [obj1 initWithData: obj2];
+ /* { dg-warning "multiple methods named .\\-initWithData:. found" "" { target *-*-* } 26 } */
+ /* { dg-warning "using .\\-\\(void\\)initWithData:\\(Object1 \\*\\)data." "" { target *-*-* } 13 } */
+ /* { dg-warning "also found .\\-\\(id\\)initWithData:\\(Object1 \\*\\)data." "" { target *-*-* } 17 } */
+ /* { dg-warning "also found .\\-\\(id\\)initWithData:\\(Object2 \\*\\)data." "" { target *-*-* } 21 } */
+
+ /* The following error is a consequence of picking the "wrong" method signature. */
+ /* { dg-error "void value not ignored as it ought to be" "" { target *-*-* } 26 } */
+}
diff --git a/gcc/testsuite/obj-c++.dg/method-17.mm b/gcc/testsuite/obj-c++.dg/method-17.mm
new file mode 100644
index 00000000000..556830f3449
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-17.mm
@@ -0,0 +1,32 @@
+/* When there is only one candidate method available, make sure the
+ compiler uses its argument/return types when constructing the
+ message sends (so that proper C/C++ argument conversions may
+ take place). */
+/* { dg-do run } */
+
+#include <objc/Object.h>
+extern "C" void abort(void);
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+static double d = 4.5920234e2;
+
+@interface Foo : Object
+-(void) brokenType: (int)x floatingPoint: (double)y;
+@end
+
+
+@implementation Foo
+-(void) brokenType: (int)x floatingPoint: (double)y
+{
+ CHECK_IF(x == 459);
+ CHECK_IF(y == d);
+}
+@end
+
+int main(void)
+{
+ Foo *foo=[Foo new];
+ [foo brokenType: (int)d floatingPoint: d];
+ return 0;
+}
+
diff --git a/gcc/testsuite/obj-c++.dg/method-18.mm b/gcc/testsuite/obj-c++.dg/method-18.mm
new file mode 100644
index 00000000000..411caac111a
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-18.mm
@@ -0,0 +1,25 @@
+/* Contributed by Igor Seleznev <selez@mail.ru>. */
+/* This used to be broken. */
+
+#include <objc/objc.h>
+
+@interface A
++ (A *)currentContext;
+@end
+
+@interface B
++ (B *)currentContext;
+@end
+
+int main()
+{
+ [A currentContext]; /* { dg-bogus "multiple declarations" } */
+ return 0;
+}
+
+@implementation A
++ (A *)currentContext { return nil; }
+@end
+@implementation B
++ (B *)currentContext { return nil; }
+@end
diff --git a/gcc/testsuite/obj-c++.dg/method-19.mm b/gcc/testsuite/obj-c++.dg/method-19.mm
new file mode 100644
index 00000000000..55890f5b404
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-19.mm
@@ -0,0 +1,81 @@
+/* Test if instance methods of root classes are used as class methods, if no
+ "real" methods are found. For receivers of type 'id' and 'Class', all
+ root classes must be considered. */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-do run } */
+
+#include <objc/objc.h>
+
+#ifdef __NEXT_RUNTIME__
+#include <objc/objc-runtime.h>
+#define OBJC_GETCLASS objc_getClass
+#else
+#include <objc/objc-api.h>
+#define OBJC_GETCLASS objc_get_class
+#endif
+
+extern "C" {
+ extern void abort(void);
+ extern int strcmp(const char *, const char *);
+}
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+@protocol Proto
+- (const char *) method4;
+@end
+
+@interface Root
+{ Class isa; }
++ (const char *) method2;
+@end
+
+@interface Derived: Root
+- (const char *) method1;
+- (const char *) method2;
+- (const char *) method3;
+@end
+
+@interface Root (Categ)
+- (const char *) method3;
+@end
+
+@implementation Root (Categ)
+- (const char *) method3 { return "Root(Categ)::-method3"; }
+- (const char *) method4 { return "Root(Categ)::-method4"; }
+@end
+
+@implementation Derived
+- (const char *) method1 { return "Derived::-method1"; }
+- (const char *) method2 { return "Derived::-method2"; }
+- (const char *) method3 { return "Derived::-method3"; }
+@end
+
+@implementation Root
+#ifdef __NEXT_RUNTIME__
++ initialize { return self; }
+#endif
+- (const char *) method1 { return "Root::-method1"; }
++ (const char *) method2 { return "Root::+method2"; }
+@end
+
+int main(void)
+{
+ Class obj = OBJC_GETCLASS("Derived");
+
+ /* None of the following should elicit compiler-time warnings. */
+
+ CHECK_IF(!strcmp([Root method1], "Root::-method1"));
+ CHECK_IF(!strcmp([Root method2], "Root::+method2"));
+ CHECK_IF(!strcmp([Root method3], "Root(Categ)::-method3"));
+ CHECK_IF(!strcmp([Root method4], "Root(Categ)::-method4"));
+ CHECK_IF(!strcmp([Derived method1], "Root::-method1"));
+ CHECK_IF(!strcmp([Derived method2], "Root::+method2"));
+ CHECK_IF(!strcmp([Derived method3], "Root(Categ)::-method3"));
+ CHECK_IF(!strcmp([Derived method4], "Root(Categ)::-method4"));
+ CHECK_IF(!strcmp([obj method1], "Root::-method1"));
+ CHECK_IF(!strcmp([obj method2], "Root::+method2"));
+ CHECK_IF(!strcmp([obj method3], "Root(Categ)::-method3"));
+ CHECK_IF(!strcmp([obj method4], "Root(Categ)::-method4"));
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/method-2.mm b/gcc/testsuite/obj-c++.dg/method-2.mm
new file mode 100644
index 00000000000..a76055e4716
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-2.mm
@@ -0,0 +1,56 @@
+/* Test if prior method lookup at method @implementation time is not
+ overly aggressive, leading to methods being found in other classes. */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+@class NSString;
+
+@protocol NSMenuItem
++ (void)setUsesUserKeyEquivalents:(BOOL)flag;
++ (BOOL)usesUserKeyEquivalents;
+@end
+
+@interface NSMenuItem : Object <NSMenuItem> {
+ @private
+ id _menu;
+}
+@end
+
+@interface NSResponder : Object <NSMenuItem>
+{
+ id _nextResponder;
+}
+@end
+
+@interface Object(NSMenuValidation)
+- (BOOL)validateMenuItem:(id <NSMenuItem>)menuItem;
+@end
+
+@interface NSResponder (NSStandardKeyBindingMethods)
+- (void)insertText:(id)insertString;
+- (void)doCommandBySelector:(SEL)aSelector;
+@end
+
+@interface NSView : NSResponder
+{
+ id _superview;
+ id _subviews;
+}
+@end
+
+@interface SKTGraphicView : NSView {
+ @private
+ float _gridSpacing;
+}
+@end
+
+@implementation SKTGraphicView
+- (BOOL)validateMenuItem:(NSMenuItem *)item {
+ return (BOOL)1;
+}
+- (void)insertText:(NSString *)str {
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/method-20.mm b/gcc/testsuite/obj-c++.dg/method-20.mm
new file mode 100644
index 00000000000..96982254aa9
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-20.mm
@@ -0,0 +1,17 @@
+/* Test if context-sensitive "in", "out", "byref", etc., qualifiers can be
+ used as method selectors. */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-do compile } */
+
+@interface Foo
+- (void)insertNewButtonImage:(Foo *)newButtonImage in:(Foo *)buttonCell;
++ (oneway void)oneway:(int)i2 byref:(int)i3 out:(float)f4 bycopy:(float)f5;
+@end
+
+@implementation Foo
+- (void)insertNewButtonImage:(Foo *)newButtonImage in:(Foo *)buttonCell { }
++ (oneway void)oneway:(int)i2 byref:(int)i3 out:(float)f4 bycopy:(float)f5 { }
+@end
+
+/* { dg-final { scan-assembler "insertNewButtonImage:in:" } } */
+/* { dg-final { scan-assembler "oneway:byref:out:bycopy:" } } */
diff --git a/gcc/testsuite/obj-c++.dg/method-21.mm b/gcc/testsuite/obj-c++.dg/method-21.mm
new file mode 100644
index 00000000000..94291a5a106
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-21.mm
@@ -0,0 +1,25 @@
+/* Test for spurious "may or may not return a value" warnings. */
+/* { dg-do compile } */
+/* { dg-options "-Wextra" } */
+
+#include <objc/Object.h>
+
+@interface Foo: Object
+- (id) meth1;
+- (void) meth2;
+@end
+
+extern int bar;
+
+@implementation Foo
+- (id) meth1 {
+ if (bar)
+ return [Object new];
+ return; /* { dg-error "return.statement with no value" } */
+}
+- (void) meth2 {
+ if (!bar)
+ return;
+ bar = 0;
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/method-3.mm b/gcc/testsuite/obj-c++.dg/method-3.mm
new file mode 100644
index 00000000000..9dab8c5b332
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-3.mm
@@ -0,0 +1,24 @@
+/* Do not warn about "slightly" mismatched method signatures if
+ -Wstrict-selector-match is off. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wno-strict-selector-match" } */
+
+#include <objc/objc.h>
+
+@interface Base
+- (id) meth1: (Base *)arg1;
+- (id) window;
+@end
+
+@interface Derived: Base
+- (id) meth1: (Derived *)arg1;
+- (Base *) window;
+@end
+
+void foo(void) {
+ id r;
+
+ [r meth1:r];
+ [r window];
+}
diff --git a/gcc/testsuite/obj-c++.dg/method-4.mm b/gcc/testsuite/obj-c++.dg/method-4.mm
new file mode 100644
index 00000000000..1d8d7ea4607
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-4.mm
@@ -0,0 +1,24 @@
+/* Warn about "slightly" mismatched method signatures if
+ -Wstrict-selector-match is on. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wstrict-selector-match" } */
+
+#include <objc/objc.h>
+
+@interface Base
+- (id) meth1: (Base *)arg1; /* { dg-warning "using .\\-\\(id\\)meth1:\\(Base \\*\\)arg1." } */
+- (id) window; /* { dg-warning "using .\\-\\(id\\)window" } */
+@end
+
+@interface Derived: Base
+- (id) meth1: (Derived *)arg1; /* { dg-warning "also found .\\-\\(id\\)meth1:\\(Derived \\*\\)arg1." } */
+- (Base *) window; /* { dg-warning "also found .\\-\\(Base \\*\\)window." } */
+@end
+
+void foo(void) {
+ id r;
+
+ [r meth1:r]; /* { dg-warning "multiple methods named .\\-meth1:. found" } */
+ [r window]; /* { dg-warning "multiple methods named .\\-window. found" } */
+}
diff --git a/gcc/testsuite/obj-c++.dg/method-5.mm b/gcc/testsuite/obj-c++.dg/method-5.mm
new file mode 100644
index 00000000000..17c841a4661
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-5.mm
@@ -0,0 +1,30 @@
+/* Do not warn about "slightly" mismatched method signatures if
+ -Wstrict-selector-match is off. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wno-strict-selector-match" } */
+
+#include <objc/objc.h>
+
+typedef enum { en1_1, en1_2 } En1;
+typedef enum { en2_1, en2_2 } En2;
+typedef struct { int a, b; } St1;
+typedef struct { unsigned a, b; } St2;
+
+@interface Base
+- (id) meth1: (En1)arg1;
+- (St1) window;
+@end
+
+@interface Derived: Base
+- (id) meth1: (En2)arg1;
+- (St2)window;
+@end
+
+void foo(void) {
+ id r;
+ En1 en;
+
+ [r meth1:en];
+ [r window];
+}
diff --git a/gcc/testsuite/obj-c++.dg/method-6.mm b/gcc/testsuite/obj-c++.dg/method-6.mm
new file mode 100644
index 00000000000..5fc0d73d375
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-6.mm
@@ -0,0 +1,19 @@
+/* The following should NOT generate "may not respond to" warnings,
+ since a forward-declared @class (instance) should be treated like a
+ 'Class') ('id'). */
+
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+@class NotKnown;
+
+void foo(NotKnown *n) {
+ [NotKnown new];
+ [n nonexistent_method]; /* { dg-warning "no .\\-nonexistent_method. method found" } */
+}
+
+/* { dg-warning "Messages without a matching method signature" "" { target *-*-* } 0 } */
+/* { dg-warning "will be assumed to return .id. and accept" "" { target *-*-* } 0 } */
+/* { dg-warning ".\.\.\.. as arguments" "" { target *-*-* } 0 } */
+
diff --git a/gcc/testsuite/obj-c++.dg/method-7.mm b/gcc/testsuite/obj-c++.dg/method-7.mm
new file mode 100644
index 00000000000..e9e2d3a4307
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-7.mm
@@ -0,0 +1,21 @@
+/* Check if sending messages to "underspecified" objects is handled gracefully. */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-do compile } */
+
+@class UnderSpecified;
+typedef struct NotAClass {
+ int a, b;
+} NotAClass;
+
+void foo(UnderSpecified *u, NotAClass *n) {
+ [n nonexistent_method]; /* { dg-warning "invalid receiver type" } */
+ /* { dg-warning "no .\\-nonexistent_method. method found" "" { target *-*-* } 12 } */
+ [NotAClass nonexistent_method]; /* { dg-error ".NotAClass. is not an Objective\\-C class name or alias" } */
+ [u nonexistent_method]; /* { dg-warning "no .\\-nonexistent_method. method found" } */
+ [UnderSpecified nonexistent_method]; /* { dg-warning "no .\\+nonexistent_method. method found" } */
+}
+
+/* { dg-warning "Messages without a matching method signature" "" { target *-*-* } 0 } */
+/* { dg-warning "will be assumed to return .id. and accept" "" { target *-*-* } 0 } */
+/* { dg-warning ".\.\.\.. as arguments" "" { target *-*-* } 0 } */
diff --git a/gcc/testsuite/obj-c++.dg/method-8.mm b/gcc/testsuite/obj-c++.dg/method-8.mm
new file mode 100644
index 00000000000..310437a0023
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-8.mm
@@ -0,0 +1,30 @@
+/* Tests of duplication. */
+/* { dg-do compile } */
+
+@interface class1
+- (int) meth1;
+- (void) meth1; /* { dg-error "duplicate declaration of method .\\-meth1." } */
+@end
+
+@interface class2
++ (void) meth1;
++ (int) meth1; /* { dg-error "duplicate declaration of method .\\+meth1." } */
+@end
+
+@interface class3
+- (int) meth1;
+@end
+
+@implementation class3
+- (int) meth1 { return 0; } /* { dg-error "previously defined here" } */
+- (int) meth1 { return 0; } /* { dg-error "redefinition of" } */
+@end
+
+@interface class4
++ (void) meth1;
+@end
+
+@implementation class4
++ (void) meth1 {} /* { dg-error "previously defined here" } */
++ (void) meth1 {} /* { dg-error "redefinition of" } */
+@end
diff --git a/gcc/testsuite/obj-c++.dg/method-9.mm b/gcc/testsuite/obj-c++.dg/method-9.mm
new file mode 100644
index 00000000000..4509c4aa477
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/method-9.mm
@@ -0,0 +1,33 @@
+/* Test for lookup of class (factory) methods. */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-do compile } */
+
+@interface MyBase
+- (void) rootInstanceMethod;
+@end
+
+@interface MyIntermediate: MyBase
+@end
+
+@interface MyDerived: MyIntermediate
+- (void) instanceMethod;
++ (void) classMethod;
+@end
+
+@implementation MyDerived
+- (void) instanceMethod {
+}
+
++ (void) classMethod { /* If a class method is not found, the root */
+ [self rootInstanceMethod]; /* class is searched for an instance method */
+ [MyIntermediate rootInstanceMethod]; /* with the same name. */
+
+ [self instanceMethod]; /* { dg-warning ".MyDerived. may not respond to .\\+instanceMethod." } */
+ [MyDerived instanceMethod]; /* { dg-warning ".MyDerived. may not respond to .\\+instanceMethod." } */
+}
+@end
+
+/* { dg-warning "Messages without a matching method signature" "" { target *-*-* } 0 } */
+/* { dg-warning "will be assumed to return .id. and accept" "" { target *-*-* } 0 } */
+/* { dg-warning ".\.\.\.. as arguments" "" { target *-*-* } 0 } */
+
diff --git a/gcc/testsuite/obj-c++.dg/no-extra-load.mm b/gcc/testsuite/obj-c++.dg/no-extra-load.mm
new file mode 100644
index 00000000000..7b4a3607561
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/no-extra-load.mm
@@ -0,0 +1,24 @@
+// Radar 3926484
+
+// { dg-do compile }
+
+#include <objc/Object.h>
+#include <iostream>
+
+@interface Greeter : Object
+- (void) greet: (const char *)msg;
+@end
+
+@implementation Greeter
+- (void) greet: (const char *)msg { std::cout << msg; }
+@end
+
+int
+main ()
+{
+ std::cout << "Hello from C++\n";
+ Greeter *obj = [Greeter new];
+ [obj greet: "Hello from Objective-C\n"];
+}
+
+/* { dg-final { scan-assembler-not "L_objc_msgSend\\\$non_lazy_ptr" } } */
diff --git a/gcc/testsuite/obj-c++.dg/objc-gc-3.mm b/gcc/testsuite/obj-c++.dg/objc-gc-3.mm
new file mode 100644
index 00000000000..df0a44cd8dd
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/objc-gc-3.mm
@@ -0,0 +1,63 @@
+/* Test looking up fields in superclasses in the context of write-barriers
+ (where component references get rewritten). */
+/* Contributed by Ziemowit Laski <zlaski@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-fobjc-gc" } */
+
+#include <objc/Object.h>
+
+@class MyWindow;
+
+@interface MyDocument : Object {
+ MyWindow *_window;
+}
+@end
+
+@interface MyFileDocument : MyDocument {
+ struct {
+ unsigned int autoClose:1;
+ unsigned int openForUI:1;
+ unsigned int isClosing:1;
+ unsigned int needsDiskCheck:1;
+ unsigned int isWritable:1;
+ unsigned int representsFileOnDisk:1;
+ unsigned int RESERVED:26;
+ } _fdFlags;
+}
+@end
+
+@interface MyTextFileDocument : MyFileDocument {
+ Object *_textStorage;
+ struct __tfdFlags {
+ unsigned int immutable:1;
+ unsigned int lineEnding:2;
+ unsigned int isClosing:1;
+ unsigned int settingsAreSet:1;
+ unsigned int usesTabs:1;
+ unsigned int isUTF8WithBOM:1;
+ unsigned int wrapsLines:1;
+ unsigned int usingDefaultLanguage:1;
+ unsigned int RESERVED:23;
+ } _tfdFlags;
+ int _tabWidth;
+ int _indentWidth;
+}
+@end
+
+@interface MyRTFFileDocument : MyTextFileDocument
+- (BOOL)readFromFile:(const char *)fileName ofType:(const char *)type;
+@end
+
+@implementation MyRTFFileDocument
+- (BOOL)readFromFile:(const char *)fileName ofType:(const char *)type {
+ if (_textStorage && fileName) {
+ [_textStorage free];
+ return YES;
+ } else if (type) {
+ _textStorage = [MyRTFFileDocument new];
+ return NO;
+ }
+ return (fileName && type);
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/overload-1.mm b/gcc/testsuite/obj-c++.dg/overload-1.mm
new file mode 100644
index 00000000000..d4999897d25
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/overload-1.mm
@@ -0,0 +1,11 @@
+// Make sure we can overload on ObjC classes
+// Radar 3960754
+
+// { dg-do compile }
+
+@class A, B;
+
+struct X {
+ void call(A*);
+ void call(B*);
+};
diff --git a/gcc/testsuite/obj-c++.dg/pragma-1.mm b/gcc/testsuite/obj-c++.dg/pragma-1.mm
new file mode 100644
index 00000000000..3d3539ed3f3
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/pragma-1.mm
@@ -0,0 +1,11 @@
+/* It is OK to use #pragma inside @interface body. This test checks that. */
+/* Devang Patel <dpatel@apple.com>. */
+
+@interface A
+{
+ int p;
+}
++(int) foo;
+#pragma Mark foobar
+-(int) bar;
+@end
diff --git a/gcc/testsuite/obj-c++.dg/pragma-2.mm b/gcc/testsuite/obj-c++.dg/pragma-2.mm
new file mode 100644
index 00000000000..14c4d7928a2
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/pragma-2.mm
@@ -0,0 +1,23 @@
+/* It is OK to use #pragma inside @implementation body. This test checks that. */
+/* Ziemowit Laski <zlaski@apple.com>. */
+
+@interface A
+{
+ int p;
+}
++(int) foo;
+-(int) bar;
+@end
+
+@implementation A
+#pragma mark -
+#pragma mark init / dealloc
++ (int)foo {
+ return 1;
+}
+#pragma mark -
+#pragma mark Private Functions
+- (int)bar {
+ return 2;
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/private-1.mm b/gcc/testsuite/obj-c++.dg/private-1.mm
new file mode 100644
index 00000000000..c4ec5ffb9b1
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/private-1.mm
@@ -0,0 +1,60 @@
+/* Test errors for accessing @private and @protected variables. */
+/* Based on work by: Nicola Pero <nicola@brainstorm.co.uk>. */
+
+/* { dg-do compile } */
+
+#include <objc/objc.h>
+
+@interface MySuperClass
+{
+@private
+ int _private;
+
+@protected
+ int _protected;
+
+@public
+ int _public;
+}
+- (void) test;
+@end
+
+@implementation MySuperClass
+- (void) test
+{
+ _private = 12; /* Ok */
+ _protected = 12; /* Ok */
+ _public = 12; /* Ok */
+}
+@end
+
+
+@interface MyClass : MySuperClass
+@end
+
+@implementation MyClass
+- (void) test
+{
+ /* Private variables simply don't exist in the subclass. */
+ _private = 12; /* { dg-error "._private. was not declared in this scope" } */
+
+ _protected = 12; /* Ok */
+ _public = 12; /* Ok */
+}
+@end
+
+int main (void)
+{
+ MyClass *m = nil;
+
+ if (m != nil)
+ {
+ int access;
+
+ access = m->_private; /* { dg-error "is @private" } */
+ access = m->_protected; /* { dg-error "is @protected" } */
+ access = m->_public; /* Ok */
+ }
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/private-2.mm b/gcc/testsuite/obj-c++.dg/private-2.mm
new file mode 100644
index 00000000000..3e6ff118d23
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/private-2.mm
@@ -0,0 +1,56 @@
+/* Test warnings for shadowing instance variables. */
+/* Based on work by: Nicola Pero <nicola@brainstorm.co.uk>. */
+
+/* { dg-do compile } */
+
+#include <objc/objc.h>
+
+@interface MySuperClass
+{
+@private
+ int _private;
+
+@protected
+ int _protected;
+
+@public
+ int _public;
+}
+- (void) test;
+@end
+
+@implementation MySuperClass
+- (void) test
+{
+ /* FIXME: I wonder if the warnings shouldn't be better generated
+ when the variable is declared, rather than used! */
+ int _private = 12;
+ int _protected = 12;
+ int _public = 12;
+ int a;
+
+ a = _private; /* { dg-warning "hides instance variable" } */
+ a = _protected; /* { dg-warning "hides instance variable" } */
+ a = _public; /* { dg-warning "hides instance variable" } */
+}
+@end
+
+
+@interface MyClass : MySuperClass
+@end
+
+@implementation MyClass
+- (void) test
+{
+ int _private = 12;
+ int _protected = 12;
+ int _public = 12;
+ int a;
+
+ /* The private variable can be shadowed without warnings, because
+ * it's invisible, and not accessible, to the subclass! */
+ a = _private; /* Ok */
+ a = _protected; /* { dg-warning "hides instance variable" } */
+ a = _public; /* { dg-warning "hides instance variable" } */
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/proto-qual-1.mm b/gcc/testsuite/obj-c++.dg/proto-qual-1.mm
new file mode 100644
index 00000000000..d9bbf3aa9b5
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/proto-qual-1.mm
@@ -0,0 +1,52 @@
+/* Check that protocol qualifiers are compiled and encoded properly. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+
+/* { dg-do run } */
+
+#include <objc/Protocol.h>
+#ifndef __NEXT_RUNTIME__
+#include <objc/objc-api.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+
+/* The encoded parameter sizes will be rounded up to match pointer alignment. */
+#define ROUND(s,a) (a * ((s + a - 1) / a))
+#define aligned_sizeof(T) ROUND(sizeof(T),__alignof(void *))
+
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+@protocol Retain
++ (oneway void)retainArgument:(out bycopy id)arg1 with:(in signed char **)arg2;
+- (bycopy) address:(byref inout id)location with:(out short unsigned **)arg2;
+@end
+
+@interface Foo <Retain>
++ (oneway void)retainArgument:(out bycopy id)arg with:(in signed char **)arg2;
+@end
+
+@implementation Foo
++ (oneway void)retainArgument:(out bycopy id)arg1 with:(in signed char **)arg2 { }
+- (bycopy) address:(byref inout id)location with:(out short unsigned **)arg2 { return nil; }
+@end
+
+Protocol *proto = @protocol(Retain);
+struct objc_method_description *meth;
+unsigned totsize, offs0, offs1, offs2, offs3, offs4, offs5, offs6, offs7;
+
+static void scan_initial(const char *pattern) {
+ totsize = offs0 = offs1 = offs2 = offs3 = offs4 = offs5 = offs6 = offs7 = (unsigned)-1;
+ sscanf(meth->types, pattern, &totsize, &offs0, &offs1, &offs2, &offs3,
+ &offs4, &offs5, &offs6, &offs7);
+ CHECK_IF(!offs0 && offs1 == aligned_sizeof(id) && offs2 == offs1 + aligned_sizeof(SEL) && totsize >= offs2);
+}
+
+int main(void) {
+ meth = [proto descriptionForInstanceMethod: @selector(address:with:)];
+ scan_initial("O@%u@%u:%uNR@%uo^^S%u");
+ CHECK_IF(offs3 == offs2 + aligned_sizeof(id) && totsize == offs3 + aligned_sizeof(unsigned));
+ meth = [proto descriptionForClassMethod: @selector(retainArgument:with:)];
+ scan_initial("Vv%u@%u:%uOo@%un^*%u");
+ CHECK_IF(offs3 == offs2 + aligned_sizeof(id) && totsize == offs3 + aligned_sizeof(char **));
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/qual-types-1.mm b/gcc/testsuite/obj-c++.dg/qual-types-1.mm
new file mode 100644
index 00000000000..db8195cb4eb
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/qual-types-1.mm
@@ -0,0 +1,68 @@
+/* Test if ObjC++ can distinguish protocol qualifiers from
+ template arguments. */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-do run } */
+
+#include <objc/Object.h>
+#include <stdlib.h>
+
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+@protocol Zone
++ allocFromZone:(void *)zone;
+- copyFromZone:(void *)zone;
+@end
+
+@protocol Init <Zone>
++ initialize;
+- init;
+@end
+
+@interface Foo: Object
+{ @public int val; }
+- init;
+@end
+
+template <class T, class U> struct X {
+ T x; U y;
+};
+
+X<int, float> xx;
+
+template <typename T> struct Holder
+{
+ T *obj;
+ static int counter;
+ Holder(void) { obj = [[T alloc] init]; }
+ ~Holder(void) { [obj free]; --counter; }
+ id <Init, Zone> getObjId(void) { return obj; }
+ Object <Zone, Init> *getObj(void) { return obj; }
+};
+
+typedef Holder <Foo <Init, Zone> > FooHolder;
+
+@implementation Foo
+-(id) init {
+ [super init];
+ val = ++FooHolder::counter;
+ return self;
+}
+@end
+
+template <typename T>
+int Holder<T>::counter = 0;
+
+int main (void) {
+ CHECK_IF(FooHolder::counter == 0);
+ {
+ FooHolder holder;
+ CHECK_IF(holder.obj->val == 1);
+ CHECK_IF(FooHolder::counter == 1);
+ FooHolder holder2;
+ CHECK_IF(holder2.obj->val == 2);
+ CHECK_IF(FooHolder::counter == 2);
+ }
+ CHECK_IF(FooHolder::counter == 0);
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/selector-1.mm b/gcc/testsuite/obj-c++.dg/selector-1.mm
new file mode 100644
index 00000000000..d34f8c89cd6
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/selector-1.mm
@@ -0,0 +1,30 @@
+/* Test whether including C++ keywords such as 'and', 'or',
+ 'not', etc., is allowed inside ObjC selectors (as it must be). */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-do compile } */
+
+@interface Int1
++ (int)and_eq:(int)arg1 and:(int)arg2;
+- (int)or_eq:(int)arg1 or:(int)arg3;
+- (int)not:(int)arg1 xor:(int)arg2;
+- (void)bitand:(char)c1 bitor:(char)c2;
+- (void)compl:(float)f1 xor_eq:(double)d1;
+- (void)not_eq;
+@end
+
+@implementation Int1
++ (int)and_eq:(int)arg1 and:(int)arg2 { return arg1 + arg2; }
+- (int)or_eq:(int)arg1 or:(int)arg3 { return arg1 + arg3; }
+- (int)not:(int)arg1 xor:(int)arg2 { return arg1 + arg2; }
+- (void)bitand:(char)c1 bitor:(char)c2 { }
+- (void)compl:(float)f1 xor_eq:(double)d1 { }
+- (void)not_eq { }
+@end
+
+/* { dg-final { scan-assembler "\\+\\\[Int1 and_eq:and:\\]|c_Int1__and_eq_and" } } */
+/* { dg-final { scan-assembler "\\-\\\[Int1 or_eq:or:\\]|i_Int1__or_eq_or" } } */
+/* { dg-final { scan-assembler "\\-\\\[Int1 not:xor:\\]|i_Int1__not_xor" } } */
+/* { dg-final { scan-assembler "\\-\\\[Int1 bitand:bitor:\\]|i_Int1__bitand_bitor" } } */
+/* { dg-final { scan-assembler "\\-\\\[Int1 compl:xor_eq:\\]|i_Int1__compl_xor_eq" } } */
+/* { dg-final { scan-assembler "\\-\\\[Int1 not_eq\\]|i_Int1__not_eq" } } */
diff --git a/gcc/testsuite/obj-c++.dg/selector-2.mm b/gcc/testsuite/obj-c++.dg/selector-2.mm
new file mode 100644
index 00000000000..09fbc252836
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/selector-2.mm
@@ -0,0 +1,17 @@
+/* Test that we don't ICE when issuing a -Wselector warning. */
+/* { dg-options "-Wselector" } */
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+@interface Foo
+@end
+@implementation Foo
+-(void) foo
+{
+ SEL a;
+ a = @selector(b1ar);
+}
+@end
+/* { dg-warning "creating selector for nonexistent method .b1ar." "" { target *-*-* } 0 } */
+
diff --git a/gcc/testsuite/obj-c++.dg/selector-3.mm b/gcc/testsuite/obj-c++.dg/selector-3.mm
new file mode 100644
index 00000000000..49f7e417208
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/selector-3.mm
@@ -0,0 +1,26 @@
+/* Test warning for non-existent selectors. */
+/* This is the "-fgnu-runtime" variant of objc.dg/selector-1.m. */
+/* { dg-options "-Wselector -fgnu-runtime" } */
+/* { dg-do compile } */
+
+typedef struct objc_object { struct objc_class *class_pointer; } *id;
+typedef const struct objc_selector *SEL;
+
+@interface Foo
+- (void) foo;
+- (void) bar;
+@end
+
+@implementation Foo
+- (void) bar
+{
+}
+
+- (void) foo
+{
+ SEL a,b,c;
+ a = @selector(b1ar);
+ b = @selector(bar);
+}
+@end /* { dg-warning "creating selector for nonexistent method .b1ar." } */
+
diff --git a/gcc/testsuite/obj-c++.dg/selector-4.mm b/gcc/testsuite/obj-c++.dg/selector-4.mm
new file mode 100644
index 00000000000..690cc44b698
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/selector-4.mm
@@ -0,0 +1,26 @@
+/* Test warning for non existing selectors. */
+/* Contributed by Devang Patel <dpatel@apple.com>. */
+
+/* { dg-options "-Wselector -fnext-runtime" } */
+/* { dg-do compile } */
+
+typedef struct objc_object { struct objc_class *class_pointer; } *id;
+typedef struct objc_selector *SEL;
+
+@interface Foo
+- (void) foo;
+- (void) bar;
+@end
+
+@implementation Foo
+- (void) bar
+{
+}
+
+- (void) foo
+{
+ SEL a,b,c;
+ a = @selector(b1ar); /* { dg-warning "creating selector for nonexistent method .b1ar." } */
+ b = @selector(bar);
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/stubify-1.mm b/gcc/testsuite/obj-c++.dg/stubify-1.mm
new file mode 100644
index 00000000000..dd7ce3badc7
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/stubify-1.mm
@@ -0,0 +1,37 @@
+/* All calls must be properly stubified. Complain about any "call
+ _objc_msgSend<end-of-line>" without the $stub suffix. */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-Os -mdynamic-no-pic -fno-exceptions" } */
+
+typedef struct objc_object { } *id ;
+int x = 41 ;
+
+extern "C" {
+ extern id objc_msgSend(id self, char * op, ...);
+ extern int bogonic (int, int, int);
+}
+
+@interface Document {}
+- (Document *) window;
+- (Document *) class;
+- (Document *) close;
+@end
+@implementation Document
+- (Document *) class { }
+- (Document *) close { }
+- (Document *) window { }
+- (void)willEndCloseSheet:(void *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo {
+ [[self window] close];
+ ((void (*)(id, char *, int))objc_msgSend)([self class], (char *)contextInfo, 1);
+ ((void (*)(id, char *, int))bogonic)([self class], (char *)contextInfo, 1);
+ bogonic (3, 4, 5);
+ x++;
+}
+@end
+
+/* { dg-final { scan-assembler-not "\(bl|call\)\[ \t\]+_objc_msgSend\n" } } */
+/* { dg-final { scan-assembler "\(bl|call\)\[ \t\]+L_objc_msgSend\\\$stub\n" } } */
+/* { dg-final { scan-assembler-not "\(bl|call\)\[ \t\]+_bogonic\n" } } */
+/* { dg-final { scan-assembler "\(bl|call\)\[ \t\]+L_bogonic\\\$stub\n" } } */
+/* { dg-final { scan-assembler-not "\\\$non_lazy_ptr" } } */
diff --git a/gcc/testsuite/obj-c++.dg/stubify-2.mm b/gcc/testsuite/obj-c++.dg/stubify-2.mm
new file mode 100644
index 00000000000..0bbfd312d65
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/stubify-2.mm
@@ -0,0 +1,31 @@
+/* All calls must be properly stubified. */
+/* Testcase extracted from TextEdit:Document.m. */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-mdynamic-no-pic -fdump-rtl-jump" } */
+
+typedef struct objc_object { } *id ;
+int x = 41 ;
+extern id objc_msgSend(id self, char * op, ...);
+extern int bogonic (int, int, int) ;
+@interface Document {}
+- (Document *) window;
+- (Document *) class;
+- (Document *) close;
+@end
+@implementation Document
+- (Document *) class { }
+- (Document *) close { }
+- (Document *) window { }
+- (void)willEndCloseSheet:(void *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo {
+ [[self window] close];
+ ((void (*)(id, char *, int))objc_msgSend)([self class], (char *)contextInfo, 1);
+ ((void (*)(id, char *, int))bogonic)([self class], (char *)contextInfo, 1);
+ bogonic (3, 4, 5);
+ x++;
+}
+@end
+
+/* Any symbol_ref of an un-stubified objc_msgSend is an error; look
+ for "objc_msgSend" in quotes, without the $stub suffix. */
+/* { dg-final { scan-file-not stubify-2.mm.03.jump "symbol_ref.*\"objc_msgSend\"" } } */
diff --git a/gcc/testsuite/obj-c++.dg/super-class-1.mm b/gcc/testsuite/obj-c++.dg/super-class-1.mm
new file mode 100644
index 00000000000..78870369780
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/super-class-1.mm
@@ -0,0 +1,30 @@
+/* Test calling super from within a category method. */
+
+/* { dg-do compile } */
+
+#include <objc/objc.h>
+
+@interface NSObject
+@end
+@interface NSMenuItem: NSObject
+@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 "invalid use of undefined type" } */
+} /* { dg-bogus "forward declaration of" "" { target *-*-* } 28 } */
+@end
diff --git a/gcc/testsuite/obj-c++.dg/super-class-2.mm b/gcc/testsuite/obj-c++.dg/super-class-2.mm
new file mode 100644
index 00000000000..41e2fd2bfee
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/super-class-2.mm
@@ -0,0 +1,35 @@
+/* Bail out gracefully if attempting to derive from a class that has only been
+ forward-declared (via @class). Conversely, @compatibility_alias declarations
+ should be traversed to find the @interface. */
+
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+@class MyWpModule;
+
+@compatibility_alias MyObject Object;
+@compatibility_alias FictitiousModule MyWpModule;
+
+@protocol MySelTarget
+- (id) meth1;
+@end
+
+@protocol Img
+- (id) meth2;
+@end
+
+@interface FunnyModule: FictitiousModule <Img> /* { dg-error ".MyWpModule., superclass of .FunnyModule." } */
+- (id) meth2;
+@end
+
+@interface MyProjWpModule : MyWpModule <MySelTarget, Img> /* { dg-error ".MyWpModule., superclass of .MyProjWpModule." } */ {
+ id i1, i2;
+}
+- (id) meth1;
+- (id) meth2;
+@end
+
+@interface AnotherModule: MyObject <MySelTarget>
+- (id) meth1;
+@end
diff --git a/gcc/testsuite/obj-c++.dg/super-dealloc-1.mm b/gcc/testsuite/obj-c++.dg/super-dealloc-1.mm
new file mode 100644
index 00000000000..0ab177bb73c
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/super-dealloc-1.mm
@@ -0,0 +1,46 @@
+/* Check for warnings about missing [super dealloc] calls. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+
+/* { dg-do compile } */
+
+@interface Foo {
+ void *isa;
+}
+- (void) dealloc;
+- (void) some_other;
+@end
+
+@interface Bar: Foo {
+ void *casa;
+}
+- (void) dealloc;
+@end
+
+@interface Baz: Bar {
+ void *usa;
+}
+- (void) dealloc;
+@end
+
+@implementation Foo
+- (void) dealloc {
+ isa = 0; /* Should not warn here. */
+}
+- (void) some_other {
+ isa = (void *)-1;
+}
+@end
+
+@implementation Bar
+- (void) dealloc {
+ casa = 0;
+ [super some_other];
+} /* { dg-warning "method possibly missing a .super dealloc. call" } */
+@end
+
+@implementation Baz
+- (void) dealloc {
+ usa = 0;
+ [super dealloc]; /* Should not warn here. */
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/super-dealloc-2.mm b/gcc/testsuite/obj-c++.dg/super-dealloc-2.mm
new file mode 100644
index 00000000000..80dcf495062
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/super-dealloc-2.mm
@@ -0,0 +1,46 @@
+/* Check for warnings about missing [super dealloc] calls. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+
+/* { dg-do compile } */
+
+@interface Foo {
+ void *isa;
+}
+- (void) dealloc;
+- (void) some_other;
+@end
+
+@interface Bar: Foo {
+ void *casa;
+}
+- (void) dealloc0;
+@end
+
+@interface Baz: Bar {
+ void *usa;
+}
+- (void) dealloc;
+@end
+
+@implementation Foo
+- (void) dealloc {
+ isa = 0; /* Should not warn here. */
+}
+- (void) some_other {
+ isa = (void *)-1;
+}
+@end
+
+@implementation Bar
+- (void) dealloc0 {
+ casa = 0;
+ [super some_other]; /* Should not warn here. */
+}
+@end
+
+@implementation Baz
+- (void) dealloc {
+ usa = 0;
+ [super dealloc0];
+} /* { dg-warning "method possibly missing a .super dealloc. call" } */
+@end
diff --git a/gcc/testsuite/obj-c++.dg/template-1.mm b/gcc/testsuite/obj-c++.dg/template-1.mm
new file mode 100644
index 00000000000..4b0a3df6c63
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/template-1.mm
@@ -0,0 +1,49 @@
+/* Test for using ObjC classes as C++ template parameters. */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-do run } */
+
+#include <objc/Object.h>
+#include <stdlib.h>
+
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+@interface Base: Object
+- (int) meth;
+@end
+
+@interface Derived: Base
+- (int) meth;
+@end
+
+static int count = 0;
+
+template <class T> struct Templ
+{
+ T *m;
+ int i;
+ Templ(): i(55), m([[T alloc] init]) { count++; }
+ ~Templ() { [m free]; count--; }
+};
+
+@implementation Base
+- (int) meth { return 333; }
+@end
+
+@implementation Derived
+- (int) meth { return 666; }
+@end
+
+int main (void) {
+ CHECK_IF(count == 0);
+ {
+ Templ<Derived> derived;
+ CHECK_IF(derived.i == 55 && count == 1);
+ Templ<Base> base;
+ CHECK_IF(base.i == 55 && count == 2);
+ CHECK_IF([base.m meth] == 333);
+ CHECK_IF([derived.m meth] == 666);
+ }
+ CHECK_IF(count == 0);
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/template-2.mm b/gcc/testsuite/obj-c++.dg/template-2.mm
new file mode 100644
index 00000000000..346dab6c2ec
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/template-2.mm
@@ -0,0 +1,29 @@
+/* Test if ObjC classes (and pointers thereto) can participate
+ in C++ overloading. Correct handling of cv-qualifiers is
+ key here. */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-do compile } */
+
+@interface foo {
+ int a, b;
+}
+@end
+
+struct bar {
+ int c, d;
+};
+
+template <class _Tp>
+struct allocator {
+ typedef _Tp* pointer;
+ typedef const _Tp* const_pointer;
+ typedef _Tp& reference;
+ typedef const _Tp& const_reference;
+
+ pointer address(reference __x) const { return &__x; }
+ const_pointer address(const_reference __x) const { return &__x; }
+};
+
+allocator<bar *> b;
+allocator<foo *> d;
diff --git a/gcc/testsuite/obj-c++.dg/template-3.mm b/gcc/testsuite/obj-c++.dg/template-3.mm
new file mode 100644
index 00000000000..662e44db470
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/template-3.mm
@@ -0,0 +1,80 @@
+/* Test for passing arguments to ObjC methods in the context of template
+ expansion. */
+/* Contributed by Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-do run } */
+
+#include <objc/Object.h>
+#include <stdlib.h>
+
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+@interface ObjCClass : Object
+{
+@public
+ int info;
+}
+-(id) init;
+-(id) initWithInformation: (int) whatInfo;
+-(id) initWithInformation: (int) whatInfo andInfo: (int) info2;
+@end
+
+void foo(int info) {
+ ObjCClass *mObj1 = [[ObjCClass alloc] init];
+ ObjCClass *mObj2 = [[ObjCClass alloc] initWithInformation: info];
+ ObjCClass *mObj3 = [[ObjCClass alloc] initWithInformation: info andInfo: 39];
+
+ CHECK_IF(mObj1->info == 666);
+ CHECK_IF(mObj2->info == info);
+ CHECK_IF(mObj3->info == info + 39);
+}
+
+template <class WrappedObjCClass>
+class ObjCObjectWrapper
+{
+ public:
+ ObjCObjectWrapper(int info);
+ WrappedObjCClass *mObj1, *mObj2, *mObj3;
+};
+
+template <class WrappedObjCClass>
+ObjCObjectWrapper<WrappedObjCClass>::ObjCObjectWrapper(int info)
+{
+ mObj1 = [[WrappedObjCClass alloc] init];
+ mObj2 = [[WrappedObjCClass alloc] initWithInformation: info];
+ mObj3 = [[WrappedObjCClass alloc] initWithInformation: info andInfo: 67];
+}
+
+@implementation ObjCClass
+-(id) init {
+ return [self initWithInformation:666];
+}
+-(id) initWithInformation: (int) whatInfo {
+ [super init];
+ info = whatInfo;
+ return self;
+}
+-(id) initWithInformation: (int) whatInfo andInfo: (int) info2 {
+ [super init];
+ info = whatInfo + info2;
+ return self;
+}
+@end
+
+ObjCObjectWrapper<ObjCClass> staticInstance(42);
+
+int main(void) {
+ ObjCObjectWrapper<ObjCClass> stackInstance(47);
+
+ foo(89);
+
+ CHECK_IF(staticInstance.mObj1->info == 666);
+ CHECK_IF(staticInstance.mObj2->info == 42);
+ CHECK_IF(staticInstance.mObj3->info == 42 + 67);
+
+ CHECK_IF(stackInstance.mObj1->info == 666);
+ CHECK_IF(stackInstance.mObj2->info == 47);
+ CHECK_IF(stackInstance.mObj3->info == 47 + 67);
+
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/template-4.mm b/gcc/testsuite/obj-c++.dg/template-4.mm
new file mode 100644
index 00000000000..6500cfff17b
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/template-4.mm
@@ -0,0 +1,81 @@
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-do run } */
+
+#include <objc/Object.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+#ifdef __NEXT_RUNTIME__
+/* The following ain't pretty, but does allow us to have just one copy
+ of next_mapping.h. */
+#include "../objc/execute/next_mapping.h"
+#else
+#include <objc/NXConstStr.h>
+#endif
+
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+template <class ARR, class TYPE> class TestT
+{
+public:
+ TYPE k;
+ int abc(ARR *array) {
+ return [array count] * k;
+ }
+ TestT(TYPE _k): k(_k) { }
+};
+
+template <class TYPE>
+const char *getDesc(void) {
+ return [TYPE name];
+}
+
+@class Array;
+
+template <class TYPE>
+int abc(TYPE *xyz, Array *array) {
+ return [xyz count] + [array count];
+}
+
+@interface Array: Object {
+ id *arr;
+ int count;
+}
++ (id)arrayWithObjects:(id)first, ... ;
+- (int)count;
+@end
+
+@implementation Array
++ (id)arrayWithObjects:(id)first, ... {
+ Array *a = [Array new];
+ a->count = 0;
+ a->arr = (id *) calloc(8, sizeof(id));
+
+ va_list args;
+ va_start (args, first);
+
+ a->arr[a->count++] = first;
+
+ for (id el; el = va_arg(args, id); a->count++)
+ a->arr[a->count] = el;
+
+ return a;
+}
+- (int)count {
+ return count;
+}
+@end
+
+int main(void) {
+ CHECK_IF(!strcmp ([@"Object" cString], getDesc<Object>()));
+ CHECK_IF(!strcmp ([@"Array" cString], getDesc<Array>()));
+
+ Array* a1 = [Array arrayWithObjects:@"One", @"Two", @"Three", nil];
+ Array* a2 = [Array arrayWithObjects:@"Four", @"Five", nil];
+
+ TestT<Array, int> t(7);
+ CHECK_IF(t.abc(a1) + t.abc(a2) == 35);
+ CHECK_IF(abc(a1, a2) * t.k == 35);
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/template-5.mm b/gcc/testsuite/obj-c++.dg/template-5.mm
new file mode 100644
index 00000000000..79ed57d157e
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/template-5.mm
@@ -0,0 +1,17 @@
+// Test that extern template does not get emitted.
+// Author: Matt Austern <austern@apple.com>
+
+// { dg-do compile }
+// { dg-options "" }
+// { dg-final { scan-assembler-not ".globl __ZN3FooIiE5identEi" } }
+
+template <typename X>
+struct Foo {
+ X ident(X x) { return x; }
+};
+
+extern template struct Foo<int>;
+
+int abcde(Foo<int>& foo, int n) {
+ return foo.ident(n);
+}
diff --git a/gcc/testsuite/obj-c++.dg/template-6.mm b/gcc/testsuite/obj-c++.dg/template-6.mm
new file mode 100644
index 00000000000..c9b82c0c7ab
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/template-6.mm
@@ -0,0 +1,16 @@
+// Test that extern template does not get emitted.
+// Author: Matt Austern <austern@apple.com>
+
+// { dg-do compile }
+// { dg-options "" }
+// { dg-final { scan-assembler-not ".globl __ZN3FooIiE5identEi" } }
+
+template <typename X>
+ struct Foo { X ident(X x); };
+
+template <typename X>
+ X Foo<X>::ident(X x) { return x; }
+
+extern template struct Foo<int>;
+
+int abcde(Foo<int>& foo, int n) { return foo.ident(n); }
diff --git a/gcc/testsuite/obj-c++.dg/try-catch-1.mm b/gcc/testsuite/obj-c++.dg/try-catch-1.mm
new file mode 100644
index 00000000000..db9b02f2acf
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/try-catch-1.mm
@@ -0,0 +1,42 @@
+/* Test if the compiler accepts @throw / @try..@catch..@finally syntax. */
+/* Developed by Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-options "-fobjc-exceptions" } */
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+#include <stdio.h>
+#include <setjmp.h>
+
+@interface Frob: Object
+@end
+
+@implementation Frob: Object
+@end
+
+static int exc_control = 0;
+
+int proc() {
+ if(exc_control) {
+ printf ("Throwing (%d)... ", exc_control);
+ @throw [Frob new];
+ }
+ return 1;
+}
+
+int foo()
+{
+ @try {
+ return proc();
+ }
+ @catch (Frob* ex) {
+ if(exc_control > 1) {
+ printf("Rethrowing (%d)... ", exc_control);
+ @throw;
+ }
+ return 0;
+ }
+ @finally {
+ printf("In @finally block (%d)... ", exc_control);
+ }
+}
diff --git a/gcc/testsuite/obj-c++.dg/try-catch-10.mm b/gcc/testsuite/obj-c++.dg/try-catch-10.mm
new file mode 100644
index 00000000000..5f6daa42bf3
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/try-catch-10.mm
@@ -0,0 +1,25 @@
+/* Check that taking the address of a local variable marked 'volatile'
+ by the compiler does not generate untoward errors. */
+/* Developed by Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-options "-fobjc-exceptions" } */
+/* { dg-do compile } */
+
+
+void foo (int *arg1, int *arg2)
+{
+ *arg1 = *arg2;
+}
+
+void bar (int arg) {
+ int rcvr;
+
+ @try {
+ rcvr = arg;
+ }
+ @finally {
+ int *rcvr0 = &rcvr;
+ foo (rcvr0, &arg);
+ }
+}
+
diff --git a/gcc/testsuite/obj-c++.dg/try-catch-2.mm b/gcc/testsuite/obj-c++.dg/try-catch-2.mm
new file mode 100644
index 00000000000..77ef1535adc
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/try-catch-2.mm
@@ -0,0 +1,78 @@
+/* Test out '@catch(id foo) {...}', which should catch
+ all uncaught exceptions. */
+/* Developed by Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-options "-fobjc-exceptions" } */
+/* { dg-do run } */
+
+#include <objc/Object.h>
+#include <stdio.h>
+
+/* The following is not required in actual user code; we include it
+ here to check that the compiler generates an internal definition of
+ _setjmp that is consistent with what <setjmp.h> provides. */
+#include <setjmp.h>
+
+extern "C" void abort(void);
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+@interface Frob: Object
+@end
+
+@implementation Frob: Object
+@end
+
+static Frob* _connection = nil;
+
+//--------------------------------------------------------------------
+
+
+void test (Object* sendPort)
+{
+ int cleanupPorts = 1;
+ Frob* receivePort = nil;
+
+ @try {
+ printf ("receivePort = %p\n", receivePort);
+ printf ("sendPort = %p\n", sendPort);
+ printf ("cleanupPorts = %d\n", cleanupPorts);
+ printf ("---\n");
+
+ receivePort = (Frob *) -1;
+ _connection = (Frob *) -1;
+ printf ("receivePort = %p\n", receivePort);
+ printf ("sendPort = %p\n", sendPort);
+ printf ("cleanupPorts = %d\n", cleanupPorts);
+ printf ("---\n");
+
+ receivePort = nil;
+ sendPort = nil;
+ cleanupPorts = 0;
+
+ printf ("receivePort = %p\n", receivePort);
+ printf ("sendPort = %p\n", sendPort);
+ printf ("cleanupPorts = %d\n", cleanupPorts);
+ printf ("---\n");
+
+ @throw [Object new];
+ }
+ @catch(Frob *obj) {
+ printf ("Exception caught by incorrect handler!\n");
+ CHECK_IF(0);
+ }
+ @catch(id exc) {
+ printf ("Exception caught by correct handler.\n");
+ printf ("receivePort = %p (expected 0x0)\n", receivePort);
+ printf ("sendPort = %p (expected 0x0)\n", sendPort);
+ printf ("cleanupPorts = %d (expected 0)\n", cleanupPorts);
+ printf ("---");
+ CHECK_IF(!receivePort);
+ CHECK_IF(!sendPort);
+ CHECK_IF(!cleanupPorts);
+ }
+}
+
+int main (void) {
+ test((Object *)-1);
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/try-catch-3.mm b/gcc/testsuite/obj-c++.dg/try-catch-3.mm
new file mode 100644
index 00000000000..9341ce55bd2
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/try-catch-3.mm
@@ -0,0 +1,18 @@
+/* Test if caught exception objects are accessible inside the
+ @catch block. (Yes, I managed to break this.) */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+
+/* { dg-do compile } */
+/* { dg-options "-fobjc-exceptions" } */
+
+#include <objc/Object.h>
+
+const char *foo(void)
+{
+ @try {
+ return "foo";
+ }
+ @catch (Object* theException) {
+ return [theException name];
+ }
+}
diff --git a/gcc/testsuite/obj-c++.dg/try-catch-4.mm b/gcc/testsuite/obj-c++.dg/try-catch-4.mm
new file mode 100644
index 00000000000..8dc0331209c
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/try-catch-4.mm
@@ -0,0 +1,25 @@
+/* Check that the compiler does not incorrectly complain about
+ exceptions being caught by previous @catch blocks. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+
+/* { dg-do compile } */
+/* { dg-options "-Wall -fobjc-exceptions" } */
+
+@interface Exception
+@end
+
+@interface FooException : Exception
+@end
+
+extern void foo();
+
+void test()
+{
+ @try {
+ foo();
+ }
+ @catch (FooException* fe) {
+ }
+ @catch (Exception* e) {
+ }
+}
diff --git a/gcc/testsuite/obj-c++.dg/try-catch-5.mm b/gcc/testsuite/obj-c++.dg/try-catch-5.mm
new file mode 100644
index 00000000000..f12d7e2cc1d
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/try-catch-5.mm
@@ -0,0 +1,26 @@
+/* Check that the compiler does correctly complain about
+ exceptions being caught by previous @catch blocks. */
+/* Force the use of NeXT runtime to see that we don't ICE after
+ generating the warning message. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wall -fnext-runtime -fobjc-exceptions" } */
+
+@interface Exception
+@end
+
+@interface FooException : Exception
+@end
+
+extern void foo();
+
+void test()
+{
+ @try {
+ foo();
+ }
+ @catch (Exception* e) { /* { dg-warning "earlier handler" } */
+ }
+ @catch (FooException* fe) { /* { dg-warning "will be caught" } */
+ }
+}
diff --git a/gcc/testsuite/obj-c++.dg/try-catch-6.mm b/gcc/testsuite/obj-c++.dg/try-catch-6.mm
new file mode 100644
index 00000000000..e0022b29903
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/try-catch-6.mm
@@ -0,0 +1,14 @@
+/* A very simple @try-@catch example. */
+
+/* { dg-do compile } */
+/* { dg-options "-fobjc-exceptions" } */
+
+int foo(void) {
+ @try {
+ return 2;
+ }
+ @catch (id foo) {
+ return 1;
+ }
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/try-catch-7.mm b/gcc/testsuite/obj-c++.dg/try-catch-7.mm
new file mode 100644
index 00000000000..e322672aeea
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/try-catch-7.mm
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-fobjc-exceptions" } */
+
+#include <objc/Object.h>
+
+int main (int argc, const char * argv[]) {
+ Object * pool = [Object new];
+ int a;
+
+ if ( 1 ) {
+ @try {
+ a = 1;
+ }
+ @catch (Object *e) {
+ a = 2;
+ }
+ @finally {
+ a = 3;
+ }
+ }
+
+ [pool free];
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/try-catch-8.mm b/gcc/testsuite/obj-c++.dg/try-catch-8.mm
new file mode 100644
index 00000000000..b1e1cd191c6
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/try-catch-8.mm
@@ -0,0 +1,27 @@
+/* Test for graceful compilation of @synchronized statements. */
+
+/* { dg-do compile } */
+/* { dg-options "-fobjc-exceptions" } */
+
+#include <objc/Object.h>
+
+@interface Derived: Object
+- (id) meth;
+@end
+
+@implementation Derived
+- (id) meth {
+ return self;
+}
+
+static Derived* rewriteDict(void) {
+ static Derived *sDict = 0;
+ if (sDict == 0) {
+ @synchronized ([Derived class]) {
+ if (sDict == 0)
+ sDict = [Derived new];
+ }
+ }
+ return sDict;
+}
+@end
diff --git a/gcc/testsuite/obj-c++.dg/try-catch-9.mm b/gcc/testsuite/obj-c++.dg/try-catch-9.mm
new file mode 100644
index 00000000000..18721b4ee43
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/try-catch-9.mm
@@ -0,0 +1,65 @@
+/* Check that local variables that get modified inside the @try
+ block survive until the @catch block is reached. */
+/* Developed by Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-options "-fobjc-exceptions -O2" } */
+/* { dg-do run } */
+
+#include <objc/Object.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+int gi1 = 9, gi2 = 19;
+float gf1 = 9.0, gf2 = 19.0;
+id obj2 = nil;
+
+void foo (int arg1, float *arg2)
+{
+ int *pi = &gi1;
+ float *pf = &gf1;
+ id obj1 = nil;
+ int local1 = 45, local2 = 47;
+ float local3 = 3.0, local4 = 4.0;
+ register int local5 = 15;
+ static float local6 = 16.0;
+
+ @try {
+ local1 = 123;
+ local2 = 345;
+ local3 = 5.0;
+ local4 = 6.0;
+ local5 = 17;
+ local6 = 18.0;
+ pi = &gi2;
+ pf = &gf2;
+ obj2 = obj1 = [Object new];
+ arg1 = 17;
+ arg2 = &gf2;
+
+ @throw [Object new];
+ }
+ @catch (Object *obj) {
+ if (local1 != 123 || local2 != 345 || local3 != 5.0
+ || local4 != 6.0 || local5 != 17 || local6 != 18.0) {
+ printf("Abort 1\n");
+ abort();
+ }
+ if (pi != &gi2 || pf != &gf2) {
+ printf("Abort 2\n");
+ abort();
+ }
+ if (!obj1 || obj1 != obj2) {
+ printf("Abort 3\n");
+ abort();
+ }
+ if (arg1 != 17 || arg2 != &gf2) {
+ printf("Abort 4\n");
+ abort();
+ }
+ }
+}
+
+int main(void) {
+ foo(15, &gf1);
+ return 0;
+}
diff --git a/gcc/testsuite/obj-c++.dg/va-meth-1.mm b/gcc/testsuite/obj-c++.dg/va-meth-1.mm
new file mode 100644
index 00000000000..6d24b7f8d5b
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/va-meth-1.mm
@@ -0,0 +1,74 @@
+/* Based on objc/execute/va_method.m, by Nicola Pero */
+
+/* { dg-do run } */
+
+#include <objc/Object.h>
+#include <stdarg.h>
+#include <stdlib.h>
+
+/* Test methods with "C-style" trailing arguments, with or without ellipsis. */
+
+@interface MathClass: Object
+/* sum positive numbers; -1 ends the list */
++ (int) sum: (int) firstNumber, int secondNumber, ...;
++ (int) prod: (int) firstNumber, int secondNumber, int thirdNumber;
++ (int) minimum: (int) firstNumber, ...;
+@end
+
+extern "C" int some_func(id self, SEL _cmd, int firstN, int secondN, int thirdN, ...) {
+ return firstN + secondN + thirdN;
+}
+
+@implementation MathClass
++ (int) sum: (int) firstNumber, int secondNumber, ...
+{
+ va_list ap;
+ int sum = 0, number = 0;
+
+ va_start (ap, secondNumber);
+ number = firstNumber + secondNumber;
+
+ while (number >= 0)
+ {
+ sum += number;
+ number = va_arg (ap, int);
+ }
+
+ va_end (ap);
+
+ return sum;
+}
++ (int) prod: (int) firstNumber, int secondNumber, int thirdNumber {
+ return firstNumber * secondNumber * thirdNumber;
+}
++ (int) minimum: (int) firstNumber, ...
+{
+ va_list ap;
+ int minimum = 999, number = 0;
+
+ va_start (ap, firstNumber);
+ number = firstNumber;
+
+ while (number >= 0)
+ {
+ minimum = (minimum < number ? minimum: number);
+ number = va_arg (ap, int);
+ }
+
+ va_end (ap);
+
+ return minimum;
+}
+@end
+
+int main (void)
+{
+ if ([MathClass sum: 1, 2, 3, 4, 5, -1] != 15)
+ abort ();
+ if ([MathClass prod: 4, 5, 6] != 120)
+ abort ();
+ if ([MathClass minimum: 17, 9, 133, 84, 35, -1] != 9)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/objc.dg/bitfield-5.m b/gcc/testsuite/objc.dg/bitfield-5.m
new file mode 100644
index 00000000000..ddd3b03a309
--- /dev/null
+++ b/gcc/testsuite/objc.dg/bitfield-5.m
@@ -0,0 +1,113 @@
+/* Check ObjC class layout follows the ABI (informally)
+ set in the past. ObjC structs must be laid out as if
+ all ivars, including those inherited from superclasses,
+ were defined at once (i.e., any padding introduced for
+ superclasses should be removed). */
+/* Contributed by Ziemowit Laski <zlaski@apple.com>. */
+/* { dg-options "-Wpadded" } */
+/* { dg-do run } */
+
+#include <objc/objc.h>
+#include <objc/Object.h>
+#include <stdlib.h>
+
+#define CHECK_IF(expr) if(!(expr)) abort()
+
+enum Enum { zero, one, two, three, four };
+
+@interface Base: Object {
+@public
+ unsigned a: 2;
+ int b: 3;
+ enum Enum c: 4;
+ unsigned d: 5;
+} /* { dg-warning "padding struct size to alignment boundary" } */
+@end
+
+struct Base_0 {
+ Class isa;
+ unsigned a: 2;
+ int b: 3;
+ enum Enum c: 4;
+ unsigned d: 5;
+}; /* { dg-warning "padding struct size to alignment boundary" } */
+
+@interface Derived: Base {
+@public
+ signed e: 5;
+ unsigned f: 4;
+ enum Enum g: 3;
+} /* { dg-warning "padding struct size to alignment boundary" } */
+@end
+
+struct Derived_0 {
+ Class isa;
+ unsigned a: 2;
+ int b: 3;
+ enum Enum c: 4;
+ unsigned d: 5;
+ signed e: 5;
+ int f: 4;
+ enum Enum g: 3;
+}; /* { dg-warning "padding struct size to alignment boundary" } */
+
+@interface Leaf: Derived {
+@public
+ signed h: 2;
+} /* { dg-warning "padding struct size to alignment boundary" } */
+@end
+
+struct Leaf_0 {
+ Class isa;
+ unsigned a: 2;
+ int b: 3;
+ enum Enum c: 4;
+ unsigned d: 5;
+ signed e: 5;
+ unsigned f: 4;
+ enum Enum g: 3;
+ signed h: 2;
+}; /* { dg-warning "padding struct size to alignment boundary" } */
+
+/* Note that the semicolon after @defs(...) is optional. */
+
+typedef struct { @defs(Base) } Base_t; /* { dg-warning "padding struct size to alignment boundary" } */
+typedef struct { @defs(Derived); } Derived_t; /* { dg-warning "padding struct size to alignment boundary" } */
+typedef struct { @defs(Leaf); } Leaf_t; /* { dg-warning "padding struct size to alignment boundary" } */
+
+int main(void)
+{
+ struct Leaf_0 l_0;
+ Leaf *l = (Leaf *)&l_0;
+ Leaf_t *l_t = (Leaf_t *)&l_0;
+
+ CHECK_IF(sizeof(Base_t) == sizeof(Base));
+ CHECK_IF(sizeof(Derived_t) == sizeof(Derived));
+ CHECK_IF(sizeof(Leaf_t) == sizeof(Leaf));
+
+ CHECK_IF(sizeof(struct Base_0) == sizeof(Base));
+ CHECK_IF(sizeof(struct Derived_0) == sizeof(Derived));
+ CHECK_IF(sizeof(struct Leaf_0) == sizeof(Leaf));
+
+ l_0.isa = (Class)0;
+ l_0.a = 3;
+ l_0.b = 0;
+ l_0.c = three;
+ l_0.d = 31;
+ l_0.e = 0;
+ l_0.f = 15;
+ l_0.g = zero;
+ l_0.h = -2;
+
+ CHECK_IF(!l_t->isa);
+ CHECK_IF(l->a == 3 && l_t->a == 3);
+ CHECK_IF(!l->b && !l_t->b);
+ CHECK_IF(l->c == three && l_t->c == three);
+ CHECK_IF(l->d == 31 && l_t->d == 31);
+ CHECK_IF(!l->e && !l_t->e);
+ CHECK_IF(l->f == 15 && l_t->f == 15);
+ CHECK_IF(l->g == zero && l_t->g == zero);
+ CHECK_IF(l->h == -2 && l_t->h == -2);
+
+ return 0;
+}
diff --git a/gcc/testsuite/objc.dg/class-protocol-1.m b/gcc/testsuite/objc.dg/class-protocol-1.m
index ffa2435f5c0..f97f2317962 100644
--- a/gcc/testsuite/objc.dg/class-protocol-1.m
+++ b/gcc/testsuite/objc.dg/class-protocol-1.m
@@ -313,9 +313,9 @@ testComptypes(void)
{ /* id <protocol>, SomeClass * */
mc1 == objP1;
objP1 == mc1;
-
- mc1 == objP2; /* { dg-warning "does not implement" } */
- objP2 == mc1; /* { dg-warning "does not implement" } */
+
+ mc1 == objP2; /* { dg-warning "lacks a cast" } */
+ objP2 == mc1; /* { dg-warning "lacks a cast" } */
}
{ /* id <protocol>, id */
obj == objP1;
@@ -371,10 +371,10 @@ testComptypes(void)
objP5 = objP1; /* { dg-warning "does not conform" } */
}
{ /* id <protocol>, SomeClass * */
- mc1 = objP1; /* { dg-warning "incompatible" } */ /* FIXME: should be "" */
+ mc1 = objP1;
objP1 = mc1;
-
- mc1 = objP2; /* { dg-warning "incompatible" } */ /* FIXME: should be "does not implement" */
+
+ mc1 = objP2; /* { dg-warning "does not conform" } */
objP2 = mc1; /* { dg-warning "does not implement" } */
}
{ /* id <protocol>, id */
@@ -382,8 +382,8 @@ testComptypes(void)
objP1 = obj;
}
{ /* id <protocol>, Class */
- cls = objP1; /* { dg-warning "incompatible" } */
- objP1 = cls; /* { dg-warning "incompatible" } */
+ cls = objP1; /* { dg-warning "distinct Objective\\-C type" } */
+ objP1 = cls; /* { dg-warning "distinct Objective\\-C type" } */
}
{ /* id <protocol>, non-ObjC */
num = objP1; /* { dg-warning "makes integer" } */
@@ -401,11 +401,11 @@ testComptypes(void)
}
{ /* Class <protocol>, SomeClass * */
/* These combinations should always elicit a warning. */
- mc1 = clsP1; /* { dg-warning "incompatible" } */
- clsP1 = mc1; /* { dg-warning "incompatible" } */
+ mc1 = clsP1; /* { dg-warning "distinct Objective\\-C type" } */
+ clsP1 = mc1; /* { dg-warning "distinct Objective\\-C type" } */
- mc1 = clsP2; /* { dg-warning "incompatible" } */
- clsP2 = mc1; /* { dg-warning "incompatible" } */
+ mc1 = clsP2; /* { dg-warning "distinct Objective\\-C type" } */
+ clsP2 = mc1; /* { dg-warning "distinct Objective\\-C type" } */
}
{ /* Class <protocol>, id */
obj = clsP1;
@@ -423,8 +423,8 @@ testComptypes(void)
clsP1 = ptr;
}
{ /* Class <protocol>, id <protocol> */
- clsP1 = objP1; /* { dg-warning "incompatible" } */
- objP1 = clsP1; /* { dg-warning "incompatible" } */
+ clsP1 = objP1; /* { dg-warning "distinct Objective\\-C type" } */
+ objP1 = clsP1; /* { dg-warning "distinct Objective\\-C type" } */
}
}
diff --git a/gcc/testsuite/objc.dg/comp-types-1.m b/gcc/testsuite/objc.dg/comp-types-1.m
index 310b22634c0..5bf59a73cba 100644
--- a/gcc/testsuite/objc.dg/comp-types-1.m
+++ b/gcc/testsuite/objc.dg/comp-types-1.m
@@ -32,9 +32,9 @@ int main()
/* 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" } */
+ obj_c = obj_p; /* { dg-warning "distinct Objective\\-C type" } */
+ obj_c = obj_cp; /* { dg-warning "distinct Objective\\-C type" } */
+ obj_c = obj_C; /* { dg-warning "distinct Objective\\-C type" } */
/* Assigning to an 'id<MyProtocol>' variable should generate a
warning if done from a 'MyClass *' (which doesn't implement
@@ -43,14 +43,15 @@ int main()
obj_p = obj; /* Ok */
obj_p = obj_c; /* { dg-warning "does not implement" } */
obj_p = obj_cp; /* Ok */
- obj_p = obj_C; /* { dg-warning "incompatible pointer type" } */
+ obj_p = obj_C; /* { dg-warning "distinct Objective\\-C type" } */
/* Assigning to a 'MyOtherClass *' variable should always generate
- a warning, unless done from an 'id' */
+ a warning, unless done from an 'id' or an 'id<MyProtocol>' (since
+ MyOtherClass implements MyProtocol). */
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" } */
+ obj_cp = obj_c; /* { dg-warning "distinct Objective\\-C type" } */
+ obj_cp = obj_p; /* Ok */
+ obj_cp = obj_C; /* { dg-warning "distinct Objective\\-C type" } */
/* Any comparison involving an 'id' must be without warnings. */
if (obj == obj_p) ; /* Ok */ /*Bogus warning here in 2.95.4*/
@@ -64,8 +65,8 @@ int main()
/* 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_p) ; /* { dg-warning "lacks a cast" } */
+ if (obj_p == obj_c) ; /* { dg-warning "lacks a cast" } */
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" } */
diff --git a/gcc/testsuite/objc.dg/comp-types-10.m b/gcc/testsuite/objc.dg/comp-types-10.m
new file mode 100644
index 00000000000..8cd53404f52
--- /dev/null
+++ b/gcc/testsuite/objc.dg/comp-types-10.m
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+@protocol Foo
+- (id)meth1;
+- (id)meth2:(int)arg;
+@end
+
+@interface Derived1: Object
+@end
+
+@interface Derived2: Object
++ (Derived1 *)new;
+@end
+
+id<Foo> func(void) {
+ Object *o = [Object new];
+ return o; /* { dg-warning "class .Object. does not implement the .Foo. protocol" } */
+}
+
+@implementation Derived2
++ (Derived1 *)new {
+ Derived2 *o = [super new];
+ return o; /* { dg-warning "distinct Objective\\-C type in return" } */
+}
+@end
+
diff --git a/gcc/testsuite/objc.dg/comp-types-11.m b/gcc/testsuite/objc.dg/comp-types-11.m
new file mode 100644
index 00000000000..b041759ca65
--- /dev/null
+++ b/gcc/testsuite/objc.dg/comp-types-11.m
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+#include <objc/Object.h>
+
+@interface Derived: Object
+@end
+
+extern Object* foo(void);
+static Derived *test(void)
+{
+ Derived *m = foo(); /* { dg-warning "initialization from distinct Objective\\-C type" } */
+
+ return m;
+}
+
diff --git a/gcc/testsuite/objc.dg/comp-types-5.m b/gcc/testsuite/objc.dg/comp-types-5.m
index f4d3dfc94e9..c112ecbe54d 100644
--- a/gcc/testsuite/objc.dg/comp-types-5.m
+++ b/gcc/testsuite/objc.dg/comp-types-5.m
@@ -19,8 +19,8 @@ int main()
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. */
+ obj_cp = obj_p; /* Ok */
+ obj_p = obj_cp; /* Ok */
if (obj_cp == obj) ; /* Ok */
if (obj == obj_cp) ; /* Ok */
diff --git a/gcc/testsuite/objc.dg/comp-types-6.m b/gcc/testsuite/objc.dg/comp-types-6.m
index 9403b532fd3..e23558114bc 100644
--- a/gcc/testsuite/objc.dg/comp-types-6.m
+++ b/gcc/testsuite/objc.dg/comp-types-6.m
@@ -1,6 +1,7 @@
/* Test assignments and comparisons involving category protocols. */
/* Author: Nicola Pero <nicola@brainstorm.co.uk>. */
/* { dg-do compile } */
+
#include <objc/objc.h>
@protocol MyProtocol
@@ -23,8 +24,8 @@ int main()
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_cp = obj_p; /* { dg-warning "distinct Objective\\-C type" } */
+ obj_cp2 = obj_p; /* { dg-warning "distinct Objective\\-C type" } */
obj_p = obj_cp; /* Ok */
obj_p = obj_cp2; /* Ok */
diff --git a/gcc/testsuite/objc.dg/comp-types-8.m b/gcc/testsuite/objc.dg/comp-types-8.m
new file mode 100644
index 00000000000..7f9c64a6f2e
--- /dev/null
+++ b/gcc/testsuite/objc.dg/comp-types-8.m
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* Another gimplifier ICE... */
+
+#include <objc/Object.h>
+
+@interface MyView: Object {
+ int _frame;
+}
+- (void)_finalize;
+@end
+
+@interface MyViewTemplate: MyView {
+ void *_className;
+}
+- (id)createRealObject;
+@end
+
+@implementation MyViewTemplate
+- (id)createRealObject {
+ id realObj;
+ *(MyView *)realObj = *(MyView *)self;
+ return realObj;
+}
+@end
diff --git a/gcc/testsuite/objc.dg/comp-types-9.m b/gcc/testsuite/objc.dg/comp-types-9.m
new file mode 100644
index 00000000000..3abcde5bec6
--- /dev/null
+++ b/gcc/testsuite/objc.dg/comp-types-9.m
@@ -0,0 +1,19 @@
+/* Yet another mysterious gimplifier crasher. */
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+@class NSString;
+@protocol NSObject
+@end
+@interface NSObject <NSObject> {
+}
+@end
+void __setRetained(id *ivar, id value) {
+ *ivar = value;
+}
+static NSString *_logProcessPrefix = 0;
+@implementation NSObject (ScopeAdditions)
++ (void)setObjectLogProcessPrefix:(NSString *)processPrefix {
+ __setRetained(&_logProcessPrefix, processPrefix);
+}
+@end
diff --git a/gcc/testsuite/objc.dg/encode-6.m b/gcc/testsuite/objc.dg/encode-6.m
new file mode 100644
index 00000000000..263b02ad0f3
--- /dev/null
+++ b/gcc/testsuite/objc.dg/encode-6.m
@@ -0,0 +1,22 @@
+/* Test for graceful encoding of const-qualified fields and parameters. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+/* { dg-do compile } */
+
+struct Cxx {
+ const struct Cxx *next;
+};
+
+@interface ObjC {
+ const struct Cxx *obj;
+}
+- (ObjC *)initWithCxx: (struct Cxx *const)c and: (const struct Cxx *)d;
+@end
+
+@implementation ObjC
+- (ObjC *)initWithCxx: (struct Cxx *const)c and: (const struct Cxx *)d {
+ obj = d;
+ return self;
+}
+@end
+
+/* { dg-final { scan-assembler "@\[0-9\]+@0:\[0-9\]+r\\^{Cxx=\\^r{Cxx}}\[0-9\]+\\^r{Cxx}" } } */
diff --git a/gcc/testsuite/objc.dg/extra-semi.m b/gcc/testsuite/objc.dg/extra-semi.m
new file mode 100644
index 00000000000..ad555962dbb
--- /dev/null
+++ b/gcc/testsuite/objc.dg/extra-semi.m
@@ -0,0 +1,10 @@
+/* Allow extra semicolons in between method declarations,
+ for old times' sake. */
+
+/* { dg-do compile } */
+
+@interface Foo
+ -(Foo *) expiration;
+ -(void) setExpiration:(Foo *) date;;
+ -(int) getVersion;
+@end
diff --git a/gcc/testsuite/objc.dg/fix-and-continue-2.m b/gcc/testsuite/objc.dg/fix-and-continue-2.m
new file mode 100644
index 00000000000..33cb8467dcd
--- /dev/null
+++ b/gcc/testsuite/objc.dg/fix-and-continue-2.m
@@ -0,0 +1,24 @@
+/* Static variables, even if local, require indirect access through a stub
+ if -mfix-and-continue is enabled. */
+
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+
+/* { dg-do assemble { target *-*-darwin* } } */
+/* { dg-options "-mfix-and-continue" } */
+
+#include <objc/Object.h>
+
+@interface Foo: Object
++ (Object *)indexableFileTypes;
+@end
+
+@implementation Foo
++ (Object *)indexableFileTypes
+{
+ static Object *fileTypes = 0;
+ if(!fileTypes) {
+ fileTypes = [Object new];
+ }
+ return fileTypes;
+}
+@end
diff --git a/gcc/testsuite/objc.dg/isa-field-1.m b/gcc/testsuite/objc.dg/isa-field-1.m
new file mode 100644
index 00000000000..6398b608d82
--- /dev/null
+++ b/gcc/testsuite/objc.dg/isa-field-1.m
@@ -0,0 +1,43 @@
+/* Ensure there are no bizarre difficulties with accessing the 'isa' field of objects. */
+/* { dg-do compile { target *-*-darwin* } } */
+
+#include <objc/Object.h>
+
+@interface Object (Test)
+- (Class) test1: (id)object;
+@end
+
+@interface Derived: Object
+- (Class) test2: (id)object;
+@end
+
+@implementation Object (Test)
+
+Class test1(id object) {
+ Class cls = object->isa;
+ return cls;
+}
+- (Class) test1: (id)object {
+ Class cls = object->isa;
+ return cls;
+}
+
+@end
+
+@implementation Derived
+
+Class test2(id object) {
+ Class cls = object->isa;
+ return cls;
+}
+- (Class) test2: (id)object {
+ Class cls = object->isa;
+ return cls;
+}
+
+@end
+
+Class test3(id object) {
+ Class cls = object->isa;
+ return cls;
+}
diff --git a/gcc/testsuite/objc.dg/layout-1.m b/gcc/testsuite/objc.dg/layout-1.m
new file mode 100644
index 00000000000..6fb114217ab
--- /dev/null
+++ b/gcc/testsuite/objc.dg/layout-1.m
@@ -0,0 +1,15 @@
+/* Ensure that we do not get bizarre warnings referring to
+ __attribute__((packed)) or some such. */
+/* { dg-do compile } */
+/* { dg-options "-Wpadded -Wpacked" } */
+
+#include <objc/Object.h>
+
+@interface Derived1: Object
+{ }
+@end
+
+@interface Derived2: Object
+- (id) foo;
+@end
+
diff --git a/gcc/testsuite/objc.dg/lookup-1.m b/gcc/testsuite/objc.dg/lookup-1.m
new file mode 100644
index 00000000000..71fc61ea04e
--- /dev/null
+++ b/gcc/testsuite/objc.dg/lookup-1.m
@@ -0,0 +1,54 @@
+/* { dg-do run { target *-*-darwin* } } */
+
+#include <objc/Object.h>
+#include <stdlib.h>
+
+typedef struct MyWidget {
+ int a;
+} MyWidget;
+
+MyWidget gWidget = { 17 };
+
+@protocol MyProto
+- (MyWidget *)widget;
+@end
+
+@interface Foo: Object
+@end
+
+@interface Bar: Foo <MyProto>
+@end
+
+@interface Container: Object
++ (MyWidget *)elementForView:(Foo *)view;
+@end
+
+@implementation Foo
+@end
+
+@implementation Bar
+- (MyWidget *)widget {
+ return &gWidget;
+}
+@end
+
+@implementation Container
++ (MyWidget *)elementForView:(Foo *)view
+{
+ MyWidget *widget = nil;
+ if ([view conformsTo:@protocol(MyProto)]) {
+ widget = [(Foo <MyProto> *)view widget];
+ }
+ return widget;
+}
+@end
+
+int main(void) {
+ id view = [Bar new];
+ MyWidget *w = [Container elementForView: view];
+
+ if (!w || w->a != 17)
+ abort ();
+
+ return 0;
+}
diff --git a/gcc/testsuite/objc.dg/method-15.m b/gcc/testsuite/objc.dg/method-15.m
new file mode 100644
index 00000000000..0ba3625a817
--- /dev/null
+++ b/gcc/testsuite/objc.dg/method-15.m
@@ -0,0 +1,56 @@
+/* Test if prior method lookup at method @implementation time is not
+ overly aggressive, leading to methods being found in other classes. */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+@class NSString;
+
+@protocol NSMenuItem
++ (void)setUsesUserKeyEquivalents:(BOOL)flag;
++ (BOOL)usesUserKeyEquivalents;
+@end
+
+@interface NSMenuItem : Object <NSMenuItem> {
+ @private
+ id _menu;
+}
+@end
+
+@interface NSResponder : Object <NSMenuItem>
+{
+ id _nextResponder;
+}
+@end
+
+@interface Object(NSMenuValidation)
+- (BOOL)validateMenuItem:(id <NSMenuItem>)menuItem;
+@end
+
+@interface NSResponder (NSStandardKeyBindingMethods)
+- (void)insertText:(id)insertString;
+- (void)doCommandBySelector:(SEL)aSelector;
+@end
+
+@interface NSView : NSResponder
+{
+ id _superview;
+ id _subviews;
+}
+@end
+
+@interface SKTGraphicView : NSView {
+ @private
+ float _gridSpacing;
+}
+@end
+
+@implementation SKTGraphicView
+- (BOOL)validateMenuItem:(NSMenuItem *)item {
+ return (BOOL)1;
+}
+- (void)insertText:(NSString *)str {
+}
+@end
diff --git a/gcc/testsuite/objc.dg/method-16.m b/gcc/testsuite/objc.dg/method-16.m
new file mode 100644
index 00000000000..c8394ffbb88
--- /dev/null
+++ b/gcc/testsuite/objc.dg/method-16.m
@@ -0,0 +1,24 @@
+/* Do not warn about "slightly" mismatched method signatures if
+ -Wstrict-selector-match is off. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wno-strict-selector-match" } */
+
+#include <objc/objc.h>
+
+@interface Base
+- (id) meth1: (Base *)arg1;
+- (id) window;
+@end
+
+@interface Derived: Base
+- (id) meth1: (Derived *)arg1;
+- (Base *)window;
+@end
+
+void foo(void) {
+ id r;
+
+ [r meth1:r];
+ [r window];
+}
diff --git a/gcc/testsuite/objc.dg/method-17.m b/gcc/testsuite/objc.dg/method-17.m
new file mode 100644
index 00000000000..5e28ddc1bb7
--- /dev/null
+++ b/gcc/testsuite/objc.dg/method-17.m
@@ -0,0 +1,26 @@
+/* Test for spurious "may or may not return a value" warnings. */
+
+/* { dg-do compile } */
+/* { dg-options "-Wextra" } */
+
+#include <objc/Object.h>
+
+@interface Foo: Object
+- (id) meth1;
+- (void) meth2;
+@end
+
+extern int bar;
+
+@implementation Foo
+- (id) meth1 {
+ if (bar)
+ return [Object new];
+ return;
+} /* { dg-warning "this function may return with or without a value" } */
+- (void) meth2 {
+ if (!bar)
+ return;
+ bar = 0;
+} /* { dg-bogus "this function may return with or without a value" } */
+@end
diff --git a/gcc/testsuite/objc.dg/method-18.m b/gcc/testsuite/objc.dg/method-18.m
new file mode 100644
index 00000000000..77fd3ef1b7f
--- /dev/null
+++ b/gcc/testsuite/objc.dg/method-18.m
@@ -0,0 +1,29 @@
+/* Do not warn about "slightly" mismatched method signatures if
+ -Wstrict-selector-match is off. */
+/* { dg-do compile } */
+/* { dg-options "-Wno-strict-selector-match" } */
+
+#include <objc/objc.h>
+
+typedef enum { en1_1, en1_2 } En1;
+typedef enum { en2_1, en2_2 } En2;
+typedef struct { int a, b; } St1;
+typedef struct { unsigned a, b; } St2;
+
+@interface Base
+- (id) meth1: (En1)arg1;
+- (St1) window;
+@end
+
+@interface Derived: Base
+- (id) meth1: (En2)arg1;
+- (St2)window;
+@end
+
+void foo(void) {
+ id r;
+ En1 en;
+
+ [r meth1:en];
+ [r window];
+}
diff --git a/gcc/testsuite/objc.dg/method-19.m b/gcc/testsuite/objc.dg/method-19.m
new file mode 100644
index 00000000000..47163711b3d
--- /dev/null
+++ b/gcc/testsuite/objc.dg/method-19.m
@@ -0,0 +1,17 @@
+/* The following should NOT generate "may not respond to" warnings, since a forward-declared
+ @class (instance) should be treated like a 'Class') ('id'). */
+
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+@class NotKnown;
+
+void foo(NotKnown *n) {
+ [NotKnown new];
+ [n nonexistent_method]; /* { dg-warning "no .\\-nonexistent_method. method found" } */
+}
+
+/* { dg-warning "Messages without a matching method signature" "" { target *-*-* } 0 } */
+/* { dg-warning "will be assumed to return .id. and accept" "" { target *-*-* } 0 } */
+/* { dg-warning ".\.\.\.. as arguments" "" { target *-*-* } 0 } */
diff --git a/gcc/testsuite/objc.dg/method-9.m b/gcc/testsuite/objc.dg/method-9.m
index 28f6a1be621..ade5d64e71a 100644
--- a/gcc/testsuite/objc.dg/method-9.m
+++ b/gcc/testsuite/objc.dg/method-9.m
@@ -39,7 +39,7 @@
/* { dg-warning "also found .\\-\\(id\\)initWithData:\\(int\\)data." "" { target *-*-* } 15 } */
/* The following warning is a consequence of picking the "wrong" method signature. */
- /* { dg-warning "passing argument 1 of .initWithData:. from incompatible pointer type" "" { target *-*-* } 35 } */
+ /* { dg-warning "passing argument 1 of .initWithData:. from distinct Objective\\-C type" "" { target *-*-* } 35 } */
return result;
}
@end
diff --git a/gcc/testsuite/objc.dg/next-runtime-1.m b/gcc/testsuite/objc.dg/next-runtime-1.m
new file mode 100644
index 00000000000..db14897fe8d
--- /dev/null
+++ b/gcc/testsuite/objc.dg/next-runtime-1.m
@@ -0,0 +1,18 @@
+/* Test that the correct version number (6) is set in the module descriptor
+ when compiling for the NeXT runtime. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-fnext-runtime" } */
+
+#include <objc/Object.h>
+
+@interface FooBar: Object
+- (void)boo;
+@end
+
+@implementation FooBar
+- (void)boo { }
+@end
+
+/* { dg-final { scan-assembler "L_OBJC_MODULES:\n\[ \t\]*\.long\t6\n" } } */
diff --git a/gcc/testsuite/objc.dg/no-extra-load.m b/gcc/testsuite/objc.dg/no-extra-load.m
new file mode 100644
index 00000000000..9b50e8358ba
--- /dev/null
+++ b/gcc/testsuite/objc.dg/no-extra-load.m
@@ -0,0 +1,6 @@
+/* { dg-do compile { target *-*-darwin* } } */
+
+#import <Foundation/Foundation.h>
+main() { [NSObject new]; }
+
+/* { dg-final { scan-assembler-not "L_objc_msgSend\\\$non_lazy_ptr" } } */
diff --git a/gcc/testsuite/objc.dg/objc-gc-4.m b/gcc/testsuite/objc.dg/objc-gc-4.m
new file mode 100644
index 00000000000..df0a44cd8dd
--- /dev/null
+++ b/gcc/testsuite/objc.dg/objc-gc-4.m
@@ -0,0 +1,63 @@
+/* Test looking up fields in superclasses in the context of write-barriers
+ (where component references get rewritten). */
+/* Contributed by Ziemowit Laski <zlaski@apple.com> */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-fobjc-gc" } */
+
+#include <objc/Object.h>
+
+@class MyWindow;
+
+@interface MyDocument : Object {
+ MyWindow *_window;
+}
+@end
+
+@interface MyFileDocument : MyDocument {
+ struct {
+ unsigned int autoClose:1;
+ unsigned int openForUI:1;
+ unsigned int isClosing:1;
+ unsigned int needsDiskCheck:1;
+ unsigned int isWritable:1;
+ unsigned int representsFileOnDisk:1;
+ unsigned int RESERVED:26;
+ } _fdFlags;
+}
+@end
+
+@interface MyTextFileDocument : MyFileDocument {
+ Object *_textStorage;
+ struct __tfdFlags {
+ unsigned int immutable:1;
+ unsigned int lineEnding:2;
+ unsigned int isClosing:1;
+ unsigned int settingsAreSet:1;
+ unsigned int usesTabs:1;
+ unsigned int isUTF8WithBOM:1;
+ unsigned int wrapsLines:1;
+ unsigned int usingDefaultLanguage:1;
+ unsigned int RESERVED:23;
+ } _tfdFlags;
+ int _tabWidth;
+ int _indentWidth;
+}
+@end
+
+@interface MyRTFFileDocument : MyTextFileDocument
+- (BOOL)readFromFile:(const char *)fileName ofType:(const char *)type;
+@end
+
+@implementation MyRTFFileDocument
+- (BOOL)readFromFile:(const char *)fileName ofType:(const char *)type {
+ if (_textStorage && fileName) {
+ [_textStorage free];
+ return YES;
+ } else if (type) {
+ _textStorage = [MyRTFFileDocument new];
+ return NO;
+ }
+ return (fileName && type);
+}
+@end
diff --git a/gcc/testsuite/objc.dg/pragma-1.m b/gcc/testsuite/objc.dg/pragma-1.m
new file mode 100644
index 00000000000..14c4d7928a2
--- /dev/null
+++ b/gcc/testsuite/objc.dg/pragma-1.m
@@ -0,0 +1,23 @@
+/* It is OK to use #pragma inside @implementation body. This test checks that. */
+/* Ziemowit Laski <zlaski@apple.com>. */
+
+@interface A
+{
+ int p;
+}
++(int) foo;
+-(int) bar;
+@end
+
+@implementation A
+#pragma mark -
+#pragma mark init / dealloc
++ (int)foo {
+ return 1;
+}
+#pragma mark -
+#pragma mark Private Functions
+- (int)bar {
+ return 2;
+}
+@end
diff --git a/gcc/testsuite/objc.dg/selector-2.m b/gcc/testsuite/objc.dg/selector-2.m
index 5584f1511b6..09fbc252836 100644
--- a/gcc/testsuite/objc.dg/selector-2.m
+++ b/gcc/testsuite/objc.dg/selector-2.m
@@ -1,5 +1,5 @@
/* Test that we don't ICE when issuing a -Wselector warning. */
-/* { dg-options "-Wselector -fgnu-runtime" } */
+/* { dg-options "-Wselector" } */
/* { dg-do compile } */
#include <objc/Object.h>
@@ -12,5 +12,6 @@
SEL a;
a = @selector(b1ar);
}
-@end /* { dg-warning "creating selector for nonexistent method .b1ar." } */
+@end
+/* { dg-warning "creating selector for nonexistent method .b1ar." "" { target *-*-* } 0 } */
diff --git a/gcc/testsuite/objc.dg/selector-3.m b/gcc/testsuite/objc.dg/selector-3.m
new file mode 100644
index 00000000000..49f7e417208
--- /dev/null
+++ b/gcc/testsuite/objc.dg/selector-3.m
@@ -0,0 +1,26 @@
+/* Test warning for non-existent selectors. */
+/* This is the "-fgnu-runtime" variant of objc.dg/selector-1.m. */
+/* { dg-options "-Wselector -fgnu-runtime" } */
+/* { dg-do compile } */
+
+typedef struct objc_object { struct objc_class *class_pointer; } *id;
+typedef const struct objc_selector *SEL;
+
+@interface Foo
+- (void) foo;
+- (void) bar;
+@end
+
+@implementation Foo
+- (void) bar
+{
+}
+
+- (void) foo
+{
+ SEL a,b,c;
+ a = @selector(b1ar);
+ b = @selector(bar);
+}
+@end /* { dg-warning "creating selector for nonexistent method .b1ar." } */
+
diff --git a/gcc/testsuite/objc.dg/selector-4.m b/gcc/testsuite/objc.dg/selector-4.m
new file mode 100644
index 00000000000..d34f8c89cd6
--- /dev/null
+++ b/gcc/testsuite/objc.dg/selector-4.m
@@ -0,0 +1,30 @@
+/* Test whether including C++ keywords such as 'and', 'or',
+ 'not', etc., is allowed inside ObjC selectors (as it must be). */
+/* Author: Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-do compile } */
+
+@interface Int1
++ (int)and_eq:(int)arg1 and:(int)arg2;
+- (int)or_eq:(int)arg1 or:(int)arg3;
+- (int)not:(int)arg1 xor:(int)arg2;
+- (void)bitand:(char)c1 bitor:(char)c2;
+- (void)compl:(float)f1 xor_eq:(double)d1;
+- (void)not_eq;
+@end
+
+@implementation Int1
++ (int)and_eq:(int)arg1 and:(int)arg2 { return arg1 + arg2; }
+- (int)or_eq:(int)arg1 or:(int)arg3 { return arg1 + arg3; }
+- (int)not:(int)arg1 xor:(int)arg2 { return arg1 + arg2; }
+- (void)bitand:(char)c1 bitor:(char)c2 { }
+- (void)compl:(float)f1 xor_eq:(double)d1 { }
+- (void)not_eq { }
+@end
+
+/* { dg-final { scan-assembler "\\+\\\[Int1 and_eq:and:\\]|c_Int1__and_eq_and" } } */
+/* { dg-final { scan-assembler "\\-\\\[Int1 or_eq:or:\\]|i_Int1__or_eq_or" } } */
+/* { dg-final { scan-assembler "\\-\\\[Int1 not:xor:\\]|i_Int1__not_xor" } } */
+/* { dg-final { scan-assembler "\\-\\\[Int1 bitand:bitor:\\]|i_Int1__bitand_bitor" } } */
+/* { dg-final { scan-assembler "\\-\\\[Int1 compl:xor_eq:\\]|i_Int1__compl_xor_eq" } } */
+/* { dg-final { scan-assembler "\\-\\\[Int1 not_eq\\]|i_Int1__not_eq" } } */
diff --git a/gcc/testsuite/objc.dg/stubify-1.m b/gcc/testsuite/objc.dg/stubify-1.m
new file mode 100644
index 00000000000..2b1aa61cf59
--- /dev/null
+++ b/gcc/testsuite/objc.dg/stubify-1.m
@@ -0,0 +1,33 @@
+/* All calls must be properly stubified. Complain about any "call
+ _objc_msgSend<end-of-line>" without the $stub suffix. */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-Os -mdynamic-no-pic" } */
+
+typedef struct objc_object { } *id ;
+int x = 41 ;
+extern id objc_msgSend(id self, char * op, ...);
+extern int bogonic (int, int, int) ;
+@interface Document {}
+- (Document *) window;
+- (Document *) class;
+- (Document *) close;
+@end
+@implementation Document
+- (Document *) class { }
+- (Document *) close { }
+- (Document *) window { }
+- (void)willEndCloseSheet:(void *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo {
+ [[self window] close];
+ ((void (*)(id, char *, int))objc_msgSend)([self class], (char *)contextInfo, 1);
+ ((void (*)(id, char *, int))bogonic)([self class], (char *)contextInfo, 1);
+ bogonic (3, 4, 5);
+ x++;
+}
+@end
+
+/* { dg-final { scan-assembler-not "\(bl|call\)\[ \t\]+_objc_msgSend\n" } } */
+/* { dg-final { scan-assembler "\(bl|call\)\[ \t\]+L_objc_msgSend\\\$stub\n" } } */
+/* { dg-final { scan-assembler-not "\(bl|call\)\[ \t\]+_bogonic\n" } } */
+/* { dg-final { scan-assembler "\(bl|call\)\[ \t\]+L_bogonic\\\$stub\n" } } */
+/* { dg-final { scan-assembler-not "\\\$non_lazy_ptr" } } */
diff --git a/gcc/testsuite/objc.dg/stubify-2.m b/gcc/testsuite/objc.dg/stubify-2.m
new file mode 100644
index 00000000000..6e9b3a019fd
--- /dev/null
+++ b/gcc/testsuite/objc.dg/stubify-2.m
@@ -0,0 +1,31 @@
+/* All calls must be properly stubified. */
+/* Testcase extracted from TextEdit:Document.m. */
+
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-mdynamic-no-pic -fdump-rtl-jump" } */
+
+typedef struct objc_object { } *id ;
+int x = 41 ;
+extern id objc_msgSend(id self, char * op, ...);
+extern int bogonic (int, int, int) ;
+@interface Document {}
+- (Document *) window;
+- (Document *) class;
+- (Document *) close;
+@end
+@implementation Document
+- (Document *) class { }
+- (Document *) close { }
+- (Document *) window { }
+- (void)willEndCloseSheet:(void *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo {
+ [[self window] close];
+ ((void (*)(id, char *, int))objc_msgSend)([self class], (char *)contextInfo, 1);
+ ((void (*)(id, char *, int))bogonic)([self class], (char *)contextInfo, 1);
+ bogonic (3, 4, 5);
+ x++;
+}
+@end
+
+/* Any symbol_ref of an un-stubified objc_msgSend is an error; look
+ for "objc_msgSend" in quotes, without the $stub suffix. */
+/* { dg-final { scan-file-not stubify-2.m.03.jump "symbol_ref.*\"objc_msgSend\"" } } */
diff --git a/gcc/testsuite/objc.dg/super-class-4.m b/gcc/testsuite/objc.dg/super-class-4.m
new file mode 100644
index 00000000000..5248123e79a
--- /dev/null
+++ b/gcc/testsuite/objc.dg/super-class-4.m
@@ -0,0 +1,34 @@
+/* Bail out gracefully if attempting to derive from a class that has only been
+ forward-declared (via @class). Conversely, @compatibility_alias declarations
+ should be traversed to find the @interface. */
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+@class MyWpModule;
+
+@compatibility_alias MyObject Object;
+@compatibility_alias FictitiousModule MyWpModule;
+
+@protocol MySelTarget
+- (id) meth1;
+@end
+
+@protocol Img
+- (id) meth2;
+@end
+
+@interface FunnyModule: FictitiousModule <Img> /* { dg-error ".MyWpModule., superclass of .FunnyModule." } */
+- (id) meth2;
+@end
+
+@interface MyProjWpModule : MyWpModule <MySelTarget, Img> /* { dg-error ".MyWpModule., superclass of .MyProjWpModule." } */ {
+ id i1, i2;
+}
+- (id) meth1;
+- (id) meth2;
+@end
+
+@interface AnotherModule: MyObject <MySelTarget>
+- (id) meth1;
+@end
diff --git a/gcc/testsuite/objc.dg/super-dealloc-1.m b/gcc/testsuite/objc.dg/super-dealloc-1.m
new file mode 100644
index 00000000000..0ab177bb73c
--- /dev/null
+++ b/gcc/testsuite/objc.dg/super-dealloc-1.m
@@ -0,0 +1,46 @@
+/* Check for warnings about missing [super dealloc] calls. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+
+/* { dg-do compile } */
+
+@interface Foo {
+ void *isa;
+}
+- (void) dealloc;
+- (void) some_other;
+@end
+
+@interface Bar: Foo {
+ void *casa;
+}
+- (void) dealloc;
+@end
+
+@interface Baz: Bar {
+ void *usa;
+}
+- (void) dealloc;
+@end
+
+@implementation Foo
+- (void) dealloc {
+ isa = 0; /* Should not warn here. */
+}
+- (void) some_other {
+ isa = (void *)-1;
+}
+@end
+
+@implementation Bar
+- (void) dealloc {
+ casa = 0;
+ [super some_other];
+} /* { dg-warning "method possibly missing a .super dealloc. call" } */
+@end
+
+@implementation Baz
+- (void) dealloc {
+ usa = 0;
+ [super dealloc]; /* Should not warn here. */
+}
+@end
diff --git a/gcc/testsuite/objc.dg/super-dealloc-2.m b/gcc/testsuite/objc.dg/super-dealloc-2.m
new file mode 100644
index 00000000000..80dcf495062
--- /dev/null
+++ b/gcc/testsuite/objc.dg/super-dealloc-2.m
@@ -0,0 +1,46 @@
+/* Check for warnings about missing [super dealloc] calls. */
+/* Author: Ziemowit Laski <zlaski@apple.com> */
+
+/* { dg-do compile } */
+
+@interface Foo {
+ void *isa;
+}
+- (void) dealloc;
+- (void) some_other;
+@end
+
+@interface Bar: Foo {
+ void *casa;
+}
+- (void) dealloc0;
+@end
+
+@interface Baz: Bar {
+ void *usa;
+}
+- (void) dealloc;
+@end
+
+@implementation Foo
+- (void) dealloc {
+ isa = 0; /* Should not warn here. */
+}
+- (void) some_other {
+ isa = (void *)-1;
+}
+@end
+
+@implementation Bar
+- (void) dealloc0 {
+ casa = 0;
+ [super some_other]; /* Should not warn here. */
+}
+@end
+
+@implementation Baz
+- (void) dealloc {
+ usa = 0;
+ [super dealloc0];
+} /* { dg-warning "method possibly missing a .super dealloc. call" } */
+@end
diff --git a/gcc/testsuite/objc.dg/try-catch-6.m b/gcc/testsuite/objc.dg/try-catch-6.m
new file mode 100644
index 00000000000..5276f0f68d1
--- /dev/null
+++ b/gcc/testsuite/objc.dg/try-catch-6.m
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-fobjc-exceptions" } */
+
+#include <objc/Object.h>
+
+int main (int argc, const char * argv[]) {
+ Object * pool = [Object new];
+ int a;
+
+ if ( 1 ) {
+
+ @try {
+ a = 1;
+ }
+ @catch (Object *e) {
+ a = 2;
+ }
+ @finally {
+ a = 3;
+ }
+ }
+
+ [pool free];
+ return 0;
+}
diff --git a/gcc/testsuite/objc.dg/try-catch-7.m b/gcc/testsuite/objc.dg/try-catch-7.m
new file mode 100644
index 00000000000..b1e1cd191c6
--- /dev/null
+++ b/gcc/testsuite/objc.dg/try-catch-7.m
@@ -0,0 +1,27 @@
+/* Test for graceful compilation of @synchronized statements. */
+
+/* { dg-do compile } */
+/* { dg-options "-fobjc-exceptions" } */
+
+#include <objc/Object.h>
+
+@interface Derived: Object
+- (id) meth;
+@end
+
+@implementation Derived
+- (id) meth {
+ return self;
+}
+
+static Derived* rewriteDict(void) {
+ static Derived *sDict = 0;
+ if (sDict == 0) {
+ @synchronized ([Derived class]) {
+ if (sDict == 0)
+ sDict = [Derived new];
+ }
+ }
+ return sDict;
+}
+@end
diff --git a/gcc/testsuite/objc.dg/try-catch-8.m b/gcc/testsuite/objc.dg/try-catch-8.m
new file mode 100644
index 00000000000..1e5230edffe
--- /dev/null
+++ b/gcc/testsuite/objc.dg/try-catch-8.m
@@ -0,0 +1,65 @@
+/* Check that local variables that get modified inside the @try
+ block survive until the @catch block is reached. */
+/* Developed by Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-options "-fobjc-exceptions -O2" } */
+/* { dg-do run { target *-*-darwin* } } */
+
+#include <objc/Object.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+int gi1 = 9, gi2 = 19;
+float gf1 = 9.0, gf2 = 19.0;
+id obj2 = nil;
+
+void foo (int arg1, float *arg2)
+{
+ int *pi = &gi1;
+ float *pf = &gf1;
+ id obj1 = nil;
+ int local1 = 45, local2 = 47;
+ float local3 = 3.0, local4 = 4.0;
+ register int local5 = 15;
+ static float local6 = 16.0;
+
+ @try {
+ local1 = 123;
+ local2 = 345;
+ local3 = 5.0;
+ local4 = 6.0;
+ local5 = 17;
+ local6 = 18.0;
+ pi = &gi2;
+ pf = &gf2;
+ obj2 = obj1 = [Object new];
+ arg1 = 17;
+ arg2 = &gf2;
+
+ @throw [Object new];
+ }
+ @catch (Object *obj) {
+ if (local1 != 123 || local2 != 345 || local3 != 5.0 || local4 != 6.0
+ || local5 != 17 || local6 != 18.0) {
+ printf("Abort 1\n");
+ abort();
+ }
+ if(pi != &gi2 || pf != &gf2) {
+ printf("Abort 2\n");
+ abort();
+ }
+ if(!obj1 || obj1 != obj2) {
+ printf("Abort 3\n");
+ abort();
+ }
+ if(arg1 != 17 || arg2 != &gf2) {
+ printf("Abort 4\n");
+ abort();
+ }
+ }
+}
+
+int main(void) {
+ foo(15, &gf1);
+ return 0;
+}
diff --git a/gcc/testsuite/objc.dg/try-catch-9.m b/gcc/testsuite/objc.dg/try-catch-9.m
new file mode 100644
index 00000000000..5f6daa42bf3
--- /dev/null
+++ b/gcc/testsuite/objc.dg/try-catch-9.m
@@ -0,0 +1,25 @@
+/* Check that taking the address of a local variable marked 'volatile'
+ by the compiler does not generate untoward errors. */
+/* Developed by Ziemowit Laski <zlaski@apple.com>. */
+
+/* { dg-options "-fobjc-exceptions" } */
+/* { dg-do compile } */
+
+
+void foo (int *arg1, int *arg2)
+{
+ *arg1 = *arg2;
+}
+
+void bar (int arg) {
+ int rcvr;
+
+ @try {
+ rcvr = arg;
+ }
+ @finally {
+ int *rcvr0 = &rcvr;
+ foo (rcvr0, &arg);
+ }
+}
+
diff --git a/gcc/testsuite/objc/execute/next_mapping.h b/gcc/testsuite/objc/execute/next_mapping.h
index 0a361896e12..41d40fdf0dc 100644
--- a/gcc/testsuite/objc/execute/next_mapping.h
+++ b/gcc/testsuite/objc/execute/next_mapping.h
@@ -8,6 +8,8 @@
#include <objc/objc-class.h>
#include <objc/Object.h>
#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
#define objc_get_class(C) objc_getClass(C)
#define objc_get_meta_class(C) objc_getMetaClass(C)
@@ -45,22 +47,28 @@
/* The following is necessary to "cover" the bf*.m test cases on NeXT. */
#undef MAX
+#undef MIN
+#undef ROUND
+
+#ifdef __cplusplus
+#define MAX(X, Y) ((X > Y) ? X : Y)
+#define MIN(X, Y) ((X < Y) ? X : Y)
+#define ROUND(V, A) (A * ((V + A - 1) / A))
+#else
#define MAX(X, Y) \
({ typeof (X) __x = (X), __y = (Y); \
(__x > __y ? __x : __y); })
-
-#undef MIN
#define MIN(X, Y) \
({ typeof (X) __x = (X), __y = (Y); \
(__x < __y ? __x : __y); })
-
-#undef ROUND
#define ROUND(V, A) \
({ typeof (V) __v = (V); typeof (A) __a = (A); \
__a * ((__v+__a - 1)/__a); })
+#endif
#define BITS_PER_UNIT __CHAR_BIT__
-#define STRUCTURE_SIZE_BOUNDARY (BITS_PER_UNIT * sizeof (struct{char a;}))
+typedef struct{ char a; } __small_struct;
+#define STRUCTURE_SIZE_BOUNDARY (BITS_PER_UNIT * sizeof (__small_struct))
/* Not sure why the following are missing from NeXT objc headers... */
@@ -104,7 +112,7 @@ struct objc_struct_layout
unsigned int record_align;
};
-typedef union {
+typedef union arglist {
char *arg_ptr;
char arg_regs[sizeof (char*)];
} *arglist_t; /* argument frame */
@@ -117,6 +125,7 @@ void objc_layout_structure (const char *type,
BOOL objc_layout_structure_next_member (struct objc_struct_layout *layout);
void objc_layout_finish_structure (struct objc_struct_layout *layout,
unsigned int *size, unsigned int *align);
+int objc_aligned_size (const char *type);
/*
return the size of an object specified by type
@@ -193,10 +202,6 @@ objc_sizeof_type (const char *type)
return sizeof (double);
break;
- case _C_VOID:
- return sizeof (void);
- break;
-
case _C_PTR:
case _C_ATOM:
case _C_CHARPTR:
diff --git a/gcc/testsuite/treelang/compile/unsigned.tree b/gcc/testsuite/treelang/compile/unsigned.tree
index 03e7a2a0038..67f3404df90 100644
--- a/gcc/testsuite/treelang/compile/unsigned.tree
+++ b/gcc/testsuite/treelang/compile/unsigned.tree
@@ -1,5 +1,5 @@
// { dg-do compile }
-// { dg-options "-fdump-tree-generic" }
+// { dg-options "-fdump-tree-gimple" }
external_reference void abort ();
external_reference void exit (int status);
external_definition int main (int argc, int argv);
@@ -16,5 +16,5 @@ main
}
return +1;
}
-// { dg-final { scan-tree-dump-not "\\\(int\\\)" "generic" } }
-// { dg-final { cleanup-tree-dump "generic" } }
+// { dg-final { scan-tree-dump-not "\\\(int\\\)" "gimple" } }
+// { dg-final { cleanup-tree-dump "gimple" } }
diff --git a/gcc/timevar.c b/gcc/timevar.c
index 589b59cf820..ad9e5f5f914 100644
--- a/gcc/timevar.c
+++ b/gcc/timevar.c
@@ -1,5 +1,5 @@
/* Timing variables for measuring compiler performance.
- Copyright (C) 2000, 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by Alex Samuel <samuel@codesourcery.com>
This file is part of GCC.
diff --git a/gcc/timevar.def b/gcc/timevar.def
index f6f099f0b88..9b706abc361 100644
--- a/gcc/timevar.def
+++ b/gcc/timevar.def
@@ -60,6 +60,7 @@ DEFTIMEVAR (TV_CPP , "preprocessing")
DEFTIMEVAR (TV_LEX , "lexical analysis")
DEFTIMEVAR (TV_PARSE , "parser")
DEFTIMEVAR (TV_NAME_LOOKUP , "name lookup")
+DEFTIMEVAR (TV_INLINE_HEURISTICS , "inline heuristics")
DEFTIMEVAR (TV_INTEGRATION , "integration")
DEFTIMEVAR (TV_TREE_GIMPLIFY , "tree gimplify")
DEFTIMEVAR (TV_TREE_EH , "tree eh")
@@ -81,6 +82,7 @@ DEFTIMEVAR (TV_TREE_SRA , "tree SRA")
DEFTIMEVAR (TV_TREE_STORE_CCP , "tree STORE-CCP")
DEFTIMEVAR (TV_TREE_CCP , "tree CCP")
DEFTIMEVAR (TV_TREE_SPLIT_EDGES , "tree split crit edges")
+DEFTIMEVAR (TV_TREE_REASSOC , "tree reassociation")
DEFTIMEVAR (TV_TREE_PRE , "tree PRE")
DEFTIMEVAR (TV_TREE_REDPHI , "tree redundant PHIs")
DEFTIMEVAR (TV_TREE_FRE , "tree FRE")
diff --git a/gcc/timevar.h b/gcc/timevar.h
index f62f76e6383..e4eaca261d5 100644
--- a/gcc/timevar.h
+++ b/gcc/timevar.h
@@ -1,5 +1,5 @@
/* Timing variables for measuring compiler performance.
- Copyright (C) 2000, 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by Alex Samuel <samuel@codesourcery.com>
This file is part of GCC.
diff --git a/gcc/tlink.c b/gcc/tlink.c
index 44e516ba0e8..e8fe756b762 100644
--- a/gcc/tlink.c
+++ b/gcc/tlink.c
@@ -311,7 +311,7 @@ obstack_fgets (FILE *stream, struct obstack *ob)
if (obstack_object_size (ob) == 0)
return NULL;
obstack_1grow (ob, '\0');
- return obstack_finish (ob);
+ return XOBFINISH (ob, char *);
}
static char *
@@ -528,7 +528,7 @@ recompile_files (void)
done:
obstack_ptr_grow (&temporary_obstack, f->main);
obstack_ptr_grow (&temporary_obstack, NULL);
- argv = obstack_finish (&temporary_obstack);
+ argv = XOBFINISH (&temporary_obstack, char **);
if (tlink_verbose)
fprintf (stderr, _("collect: recompiling %s\n"), f->main);
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 9f1bb79e8f3..0d309092702 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -374,40 +374,6 @@ static const param_info lang_independent_params[] = {
{ NULL, 0, 0, 0, NULL }
};
-#ifdef TARGET_SWITCHES
-/* Here is a table, controlled by the tm.h file, listing each -m switch
- and which bits in `target_switches' it should set or clear.
- If VALUE is positive, it is bits to set.
- If VALUE is negative, -VALUE is bits to clear.
- (The sign bit is not used so there is no confusion.) */
-
-static const struct
-{
- const char *const name;
- const int value;
- const char *const description;
-}
-target_switches[] = TARGET_SWITCHES;
-#endif
-
-/* This table is similar, but allows the switch to have a value. */
-
-#ifdef TARGET_OPTIONS
-static const struct
-{
- const char *const prefix;
- const char **const variable;
- const char *const description;
- const char *const value;
-}
-target_options[] = TARGET_OPTIONS;
-#endif
-
-/* Nonzero means warn about function definitions that default the return type
- or that use a null return and have a return-type other than void. */
-
-int warn_return_type;
-
/* Output files for assembler code (real compiler output)
and debugging dumps. */
@@ -1062,92 +1028,6 @@ compile_file (void)
targetm.asm_out.file_end ();
}
-/* Display help for target options. */
-void
-display_target_options (void)
-{
- int undoc;
-#if defined (TARGET_SWITCHES) || defined (TARGET_OPTIONS)
- int i;
-#endif
- unsigned int cli;
- static bool displayed = false;
-
- /* Avoid double printing for --help --target-help. */
- if (displayed)
- return;
-
- displayed = true;
-
- for (cli = 0; cli < cl_options_count; cli++)
- if ((cl_options[cli].flags & (CL_TARGET | CL_UNDOCUMENTED)) == CL_TARGET)
- break;
-
- if (cli < cl_options_count
-#ifdef TARGET_SWITCHES
- || ARRAY_SIZE (target_switches) > 1
-#endif
-#ifdef TARGET_OPTIONS
- || ARRAY_SIZE (target_options) > 1
-#endif
- )
- {
- int doc = cli < cl_options_count;
-
- undoc = 0;
-
- printf (_("\nTarget specific options:\n"));
-
-#ifdef TARGET_SWITCHES
- for (i = ARRAY_SIZE (target_switches); i--;)
- {
- const char *option = target_switches[i].name;
- const char *description = target_switches[i].description;
-
- if (option == NULL || *option == 0)
- continue;
- else if (description == NULL)
- {
- undoc = 1;
-
- if (extra_warnings)
- printf (_(" -m%-23s [undocumented]\n"), option);
- }
- else if (*description != 0)
- doc += printf (" -m%-23s %s\n", option, _(description));
- }
-#endif
-
-#ifdef TARGET_OPTIONS
- for (i = ARRAY_SIZE (target_options); i--;)
- {
- const char *option = target_options[i].prefix;
- const char *description = target_options[i].description;
-
- if (option == NULL || *option == 0)
- continue;
- else if (description == NULL)
- {
- undoc = 1;
-
- if (extra_warnings)
- printf (_(" -m%-23s [undocumented]\n"), option);
- }
- else if (*description != 0)
- doc += printf (" -m%-23s %s\n", option, _(description));
- }
-#endif
- print_filtered_help (CL_TARGET);
- if (undoc)
- {
- if (doc)
- printf (_("\nThere are undocumented target specific options as well.\n"));
- else
- printf (_(" They exist, but they are not documented.\n"));
- }
- }
-}
-
/* Parse a -d... command line switch. */
void
@@ -1198,64 +1078,6 @@ const char *const debug_type_names[] =
"none", "stabs", "coff", "dwarf-2", "xcoff", "vms"
};
-/* Decode -m switches. */
-/* Decode the switch -mNAME. */
-
-void
-set_target_switch (const char *name)
-{
-#if defined (TARGET_SWITCHES) || defined (TARGET_OPTIONS)
- size_t j;
-#endif
- int valid_target_option = 0;
-
-#ifdef TARGET_SWITCHES
- for (j = 0; j < ARRAY_SIZE (target_switches); j++)
- if (!strcmp (target_switches[j].name, name))
- {
- if (target_switches[j].value < 0)
- target_flags &= ~-target_switches[j].value;
- else
- target_flags |= target_switches[j].value;
- if (name[0] != 0)
- {
- if (target_switches[j].value < 0)
- target_flags_explicit |= -target_switches[j].value;
- else
- target_flags_explicit |= target_switches[j].value;
- }
- valid_target_option = 1;
- }
-#endif
-
-#ifdef TARGET_OPTIONS
- if (!valid_target_option)
- for (j = 0; j < ARRAY_SIZE (target_options); j++)
- {
- int len = strlen (target_options[j].prefix);
- if (target_options[j].value)
- {
- if (!strcmp (target_options[j].prefix, name))
- {
- *target_options[j].variable = target_options[j].value;
- valid_target_option = 1;
- }
- }
- else
- {
- if (!strncmp (target_options[j].prefix, name, len))
- {
- *target_options[j].variable = name + len;
- valid_target_option = 1;
- }
- }
- }
-#endif
-
- if (name[0] != 0 && !valid_target_option)
- error ("invalid option %qs", name);
-}
-
/* Print version information to FILE.
Each line begins with INDENT (for the case where FILE is the
assembler output file). */
@@ -1364,31 +1186,6 @@ print_switch_values (FILE *file, int pos, int max,
pos = print_single_switch (file, pos, max, indent, sep, term,
"", cl_options[j].opt_text);
- /* Print target specific options. */
-
-#ifdef TARGET_SWITCHES
- for (j = 0; j < ARRAY_SIZE (target_switches); j++)
- if (target_switches[j].name[0] != '\0'
- && target_switches[j].value > 0
- && ((target_switches[j].value & target_flags)
- == target_switches[j].value))
- {
- pos = print_single_switch (file, pos, max, indent, sep, term,
- "-m", target_switches[j].name);
- }
-#endif
-
-#ifdef TARGET_OPTIONS
- for (j = 0; j < ARRAY_SIZE (target_options); j++)
- if (*target_options[j].variable != NULL)
- {
- char prefix[256];
- sprintf (prefix, "-m%s", target_options[j].prefix);
- pos = print_single_switch (file, pos, max, indent, sep, term,
- prefix, *target_options[j].variable);
- }
-#endif
-
fprintf (file, "%s", term);
}
@@ -1439,6 +1236,21 @@ init_asm_output (const char *name)
}
}
+/* Return true if the state of option OPTION should be stored in PCH files
+ and checked by default_pch_valid_p. Store the option's current state
+ in STATE if so. */
+
+static inline bool
+option_affects_pch_p (int option, struct cl_option_state *state)
+{
+ if ((cl_options[option].flags & CL_TARGET) == 0)
+ return false;
+ if (cl_options[option].flag_var == &target_flags)
+ if (targetm.check_pch_target_flags)
+ return false;
+ return get_option_state (option, state);
+}
+
/* Default version of get_pch_validity.
By default, every flag difference is fatal; that will be mostly right for
most targets, but completely right for very few. */
@@ -1446,51 +1258,58 @@ init_asm_output (const char *name)
void *
default_get_pch_validity (size_t *len)
{
-#ifdef TARGET_OPTIONS
+ struct cl_option_state state;
size_t i;
-#endif
char *result, *r;
- *len = sizeof (target_flags) + 2;
-#ifdef TARGET_OPTIONS
- for (i = 0; i < ARRAY_SIZE (target_options); i++)
- {
- *len += 1;
- if (*target_options[i].variable)
- *len += strlen (*target_options[i].variable);
- }
-#endif
+ *len = 2;
+ if (targetm.check_pch_target_flags)
+ *len += sizeof (target_flags);
+ for (i = 0; i < cl_options_count; i++)
+ if (option_affects_pch_p (i, &state))
+ *len += state.size;
result = r = xmalloc (*len);
r[0] = flag_pic;
r[1] = flag_pie;
r += 2;
- memcpy (r, &target_flags, sizeof (target_flags));
- r += sizeof (target_flags);
-
-#ifdef TARGET_OPTIONS
- for (i = 0; i < ARRAY_SIZE (target_options); i++)
+ if (targetm.check_pch_target_flags)
{
- const char *str = *target_options[i].variable;
- size_t l;
- if (! str)
- str = "";
- l = strlen (str) + 1;
- memcpy (r, str, l);
- r += l;
+ memcpy (r, &target_flags, sizeof (target_flags));
+ r += sizeof (target_flags);
}
-#endif
+
+ for (i = 0; i < cl_options_count; i++)
+ if (option_affects_pch_p (i, &state))
+ {
+ memcpy (r, state.data, state.size);
+ r += state.size;
+ }
return result;
}
+/* Return a message which says that a PCH file was created with a different
+ setting of OPTION. */
+
+static const char *
+pch_option_mismatch (const char *option)
+{
+ char *r;
+
+ asprintf (&r, _("created and used with differing settings of '%s'"), option);
+ if (r == NULL)
+ return _("out of memory");
+ return r;
+}
+
/* Default version of pch_valid_p. */
const char *
default_pch_valid_p (const void *data_p, size_t len)
{
+ struct cl_option_state state;
const char *data = (const char *)data_p;
- const char *flag_that_differs = NULL;
size_t i;
/* -fpic and -fpie also usually make a PCH invalid. */
@@ -1501,68 +1320,29 @@ default_pch_valid_p (const void *data_p, size_t len)
data += 2;
/* Check target_flags. */
- if (memcmp (data, &target_flags, sizeof (target_flags)) != 0)
+ if (targetm.check_pch_target_flags)
{
int tf;
+ const char *r;
memcpy (&tf, data, sizeof (target_flags));
-#ifdef TARGET_SWITCHES
- for (i = 0; i < ARRAY_SIZE (target_switches); i++)
- {
- int bits;
-
- bits = target_switches[i].value;
- if (bits < 0)
- bits = -bits;
- if ((target_flags & bits) != (tf & bits))
- {
- flag_that_differs = target_switches[i].name;
- goto make_message;
- }
- }
-#endif
- for (i = 0; i < cl_options_count; i++)
- if (cl_options[i].flag_var == &target_flags
- && (cl_options[i].var_value & (target_flags ^ tf)) != 0)
- {
- flag_that_differs = cl_options[i].opt_text + 2;
- goto make_message;
- }
- gcc_unreachable ();
+ data += sizeof (target_flags);
+ len -= sizeof (target_flags);
+ r = targetm.check_pch_target_flags (tf);
+ if (r != NULL)
+ return r;
}
- data += sizeof (target_flags);
- len -= sizeof (target_flags);
- /* Check string options. */
-#ifdef TARGET_OPTIONS
- for (i = 0; i < ARRAY_SIZE (target_options); i++)
- {
- const char *str = *target_options[i].variable;
- size_t l;
- if (! str)
- str = "";
- l = strlen (str) + 1;
- if (len < l || memcmp (data, str, l) != 0)
- {
- flag_that_differs = target_options[i].prefix;
- goto make_message;
- }
- data += l;
- len -= l;
- }
-#endif
+ for (i = 0; i < cl_options_count; i++)
+ if (option_affects_pch_p (i, &state))
+ {
+ if (memcmp (data, state.data, state.size) != 0)
+ return pch_option_mismatch (cl_options[i].opt_text);
+ data += state.size;
+ len -= state.size;
+ }
return NULL;
-
- make_message:
- {
- char *r;
- asprintf (&r, _("created and used with differing settings of '-m%s'"),
- flag_that_differs);
- if (r == NULL)
- return _("out of memory");
- return r;
- }
}
/* Default tree printer. Handles declarations only. */
@@ -1575,7 +1355,7 @@ default_tree_printer (pretty_printer * pp, text_info *text)
{
case 'D':
t = va_arg (*text->args_ptr, tree);
- if (DECL_DEBUG_EXPR (t) && DECL_DEBUG_EXPR_IS_FROM (t))
+ if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t))
t = DECL_DEBUG_EXPR (t);
break;
@@ -1987,7 +1767,6 @@ backend_init (void)
init_alias_once ();
init_loop ();
init_reload ();
- init_function_once ();
init_varasm_once ();
/* The following initialization functions need to generate rtl, so
diff --git a/gcc/toplev.h b/gcc/toplev.h
index cf11d29441b..7e759e16c63 100644
--- a/gcc/toplev.h
+++ b/gcc/toplev.h
@@ -138,9 +138,7 @@ extern int time_report;
extern int flag_tree_based_profiling;
/* Things to do with target switches. */
-extern void display_target_options (void);
extern void print_version (FILE *, const char *);
-extern void set_target_switch (const char *);
extern void * default_get_pch_validity (size_t *);
extern const char * default_pch_valid_p (const void *, size_t);
diff --git a/gcc/tree-browser.c b/gcc/tree-browser.c
index df1c7e9cc2d..f07cf968fce 100644
--- a/gcc/tree-browser.c
+++ b/gcc/tree-browser.c
@@ -23,7 +23,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "tree.h"
#include "tree-inline.h"
#include "diagnostic.h"
diff --git a/gcc/tree-browser.def b/gcc/tree-browser.def
index 57fb1df8044..ef14492d83f 100644
--- a/gcc/tree-browser.def
+++ b/gcc/tree-browser.def
@@ -33,7 +33,7 @@ DEFTBCODE (TB_UPDATE_UP, "update", "Update information about parent expre
DEFTBCODE (TB_VERBOSE, "verbose", "Sets/unsets verbose mode (default is on).")
/* Walking commands. */
-DEFTBCODE (TB_FUN, "fun", "Go to the curent function declaration.")
+DEFTBCODE (TB_FUN, "fun", "Go to the current function declaration.")
DEFTBCODE (TB_NEXT, "nx", "Go to the next expression in a BIND_EXPR.")
DEFTBCODE (TB_PREV, "pr", "Go to the previous expression in a BIND_EXPR.")
DEFTBCODE (TB_UP, "up", "Go to the parent tree node.")
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 9eeb7839287..6a72250e328 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -29,7 +29,6 @@ Boston, MA 02111-1307, USA. */
#include "hard-reg-set.h"
#include "basic-block.h"
#include "output.h"
-#include "errors.h"
#include "flags.h"
#include "function.h"
#include "expr.h"
@@ -45,6 +44,7 @@ Boston, MA 02111-1307, USA. */
#include "cfgloop.h"
#include "cfglayout.h"
#include "hashtab.h"
+#include "tree-ssa-propagate.h"
/* This file contains functions for building the Control Flow Graph (CFG)
for a function tree. */
@@ -94,9 +94,6 @@ static bool found_computed_goto;
/* Basic blocks and flowgraphs. */
static basic_block create_bb (void *, void *, basic_block);
-static void create_block_annotation (basic_block);
-static void free_blocks_annotations (void);
-static void clear_blocks_annotations (void);
static void make_blocks (tree);
static void factor_computed_gotos (void);
@@ -110,27 +107,21 @@ static void make_goto_expr_edges (basic_block);
static edge tree_redirect_edge_and_branch (edge, basic_block);
static edge tree_try_redirect_by_replacing_jump (edge, basic_block);
static void split_critical_edges (void);
-static bool remove_fallthru_edge (VEC(edge,gc) *);
/* Various helpers. */
static inline bool stmt_starts_bb_p (tree, tree);
static int tree_verify_flow_info (void);
static void tree_make_forwarder_block (edge);
-static bool tree_forwarder_block_p (basic_block, bool);
static void tree_cfg2vcg (FILE *);
/* Flowgraph optimization and cleanup. */
static void tree_merge_blocks (basic_block, basic_block);
static bool tree_can_merge_blocks_p (basic_block, basic_block);
static void remove_bb (basic_block);
-static bool cleanup_control_flow (void);
-static bool cleanup_control_expr_graph (basic_block, block_stmt_iterator);
static edge find_taken_edge_computed_goto (basic_block, tree);
static edge find_taken_edge_cond_expr (basic_block, tree);
static edge find_taken_edge_switch_expr (basic_block, tree);
static tree find_case_label_for_value (tree, tree);
-static bool phi_alternatives_equal (basic_block, edge, edge);
-static bool cleanup_forwarder_blocks (void);
void
init_empty_tree_cfg (void)
@@ -148,9 +139,6 @@ init_empty_tree_cfg (void)
ENTRY_BLOCK_PTR->next_bb = EXIT_BLOCK_PTR;
EXIT_BLOCK_PTR->prev_bb = ENTRY_BLOCK_PTR;
-
- create_block_annotation (ENTRY_BLOCK_PTR);
- create_block_annotation (EXIT_BLOCK_PTR);
}
/*---------------------------------------------------------------------------
@@ -321,37 +309,6 @@ factor_computed_gotos (void)
}
-/* Create annotations for a single basic block. */
-
-static void
-create_block_annotation (basic_block bb)
-{
- /* Verify that the tree_annotations field is clear. */
- gcc_assert (!bb->tree_annotations);
- bb->tree_annotations = ggc_alloc_cleared (sizeof (struct bb_ann_d));
-}
-
-
-/* Free the annotations for all the basic blocks. */
-
-static void free_blocks_annotations (void)
-{
- clear_blocks_annotations ();
-}
-
-
-/* Clear the annotations for all the basic blocks. */
-
-static void
-clear_blocks_annotations (void)
-{
- basic_block bb;
-
- FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
- bb->tree_annotations = NULL;
-}
-
-
/* Build a flowgraph for the statement_list STMT_LIST. */
static void
@@ -430,12 +387,9 @@ create_bb (void *h, void *e, basic_block after)
/* Add the newly created block to the array. */
BASIC_BLOCK (last_basic_block) = bb;
- create_block_annotation (bb);
-
n_basic_blocks++;
last_basic_block++;
- initialize_bb_rbi (bb);
return bb;
}
@@ -683,7 +637,7 @@ edge_to_cases_cleanup (void *p)
/* Start recording information mapping edges to case labels. */
-static void
+void
start_recording_case_labels (void)
{
gcc_assert (edge_to_cases == NULL);
@@ -704,7 +658,7 @@ recording_case_labels_p (void)
/* Stop recording information mapping edges to case labels and
remove any information we have recorded. */
-static void
+void
end_recording_case_labels (void)
{
htab_delete (edge_to_cases);
@@ -919,73 +873,6 @@ make_goto_expr_edges (basic_block bb)
Flowgraph analysis
---------------------------------------------------------------------------*/
-/* Remove unreachable blocks and other miscellaneous clean up work. */
-
-bool
-cleanup_tree_cfg (void)
-{
- bool retval = false;
-
- timevar_push (TV_TREE_CLEANUP_CFG);
-
- retval = cleanup_control_flow ();
- retval |= delete_unreachable_blocks ();
-
- /* cleanup_forwarder_blocks can redirect edges out of SWITCH_EXPRs,
- which can get expensive. So we want to enable recording of edge
- to CASE_LABEL_EXPR mappings around the call to
- cleanup_forwarder_blocks. */
- start_recording_case_labels ();
- retval |= cleanup_forwarder_blocks ();
- end_recording_case_labels ();
-
-#ifdef ENABLE_CHECKING
- if (retval)
- {
- gcc_assert (!cleanup_control_flow ());
- gcc_assert (!delete_unreachable_blocks ());
- gcc_assert (!cleanup_forwarder_blocks ());
- }
-#endif
-
- /* Merging the blocks creates no new opportunities for the other
- optimizations, so do it here. */
- retval |= merge_seq_blocks ();
-
- compact_blocks ();
-
-#ifdef ENABLE_CHECKING
- verify_flow_info ();
-#endif
- timevar_pop (TV_TREE_CLEANUP_CFG);
- return retval;
-}
-
-
-/* Cleanup cfg and repair loop structures. */
-
-void
-cleanup_tree_cfg_loop (void)
-{
- bitmap changed_bbs = BITMAP_ALLOC (NULL);
-
- cleanup_tree_cfg ();
-
- fix_loop_structure (current_loops, changed_bbs);
- calculate_dominance_info (CDI_DOMINATORS);
-
- /* This usually does nothing. But sometimes parts of cfg that originally
- were inside a loop get out of it due to edge removal (since they
- become unreachable by back edges from latch). */
- rewrite_into_loop_closed_ssa (changed_bbs, TODO_update_ssa);
-
- BITMAP_FREE (changed_bbs);
-
-#ifdef ENABLE_CHECKING
- verify_loop_structure (current_loops);
-#endif
-}
-
/* Cleanup useless labels in basic blocks. This is something we wish
to do early because it allows us to group case labels before creating
the edges for the CFG, and it speeds up block statement iterators in
@@ -1364,11 +1251,31 @@ replace_uses_by (tree name, tree val)
and we would never process them. */
for (i = 0; VEC_iterate (tree, stmts, i, stmt); i++)
{
+ tree rhs;
+
fold_stmt_inplace (stmt);
+
+ rhs = get_rhs (stmt);
+ if (TREE_CODE (rhs) == ADDR_EXPR)
+ recompute_tree_invarant_for_addr_expr (rhs);
+
update_stmt (stmt);
}
VEC_free (tree, heap, stmts);
+
+ /* Also update the trees stored in loop structures. */
+ if (current_loops)
+ {
+ struct loop *loop;
+
+ for (i = 0; i < current_loops->num; i++)
+ {
+ loop = current_loops->parray[i];
+ if (loop)
+ substitute_in_loop_info (loop, name, val);
+ }
+ }
}
/* Merge block B into block A. */
@@ -2102,192 +2009,16 @@ remove_bb (basic_block bb)
loop above, so the last statement we process is the first statement
in the block. */
#ifdef USE_MAPPED_LOCATION
- if (warn_notreached && loc > BUILTINS_LOCATION)
- warning (0, "%Hwill never be executed", &loc);
+ if (loc > BUILTINS_LOCATION)
+ warning (OPT_Wunreachable_code, "%Hwill never be executed", &loc);
#else
- if (warn_notreached && loc)
- warning (0, "%Hwill never be executed", loc);
+ if (loc)
+ warning (OPT_Wunreachable_code, "%Hwill never be executed", loc);
#endif
remove_phi_nodes_and_edges_for_unreachable_block (bb);
}
-/* A list of all the noreturn calls passed to modify_stmt.
- cleanup_control_flow uses it to detect cases where a mid-block
- indirect call has been turned into a noreturn call. When this
- happens, all the instructions after the call are no longer
- reachable and must be deleted as dead. */
-
-VEC(tree,gc) *modified_noreturn_calls;
-
-/* Try to remove superfluous control structures. */
-
-static bool
-cleanup_control_flow (void)
-{
- basic_block bb;
- block_stmt_iterator bsi;
- bool retval = false;
- tree stmt;
-
- /* Detect cases where a mid-block call is now known not to return. */
- while (VEC_length (tree, modified_noreturn_calls))
- {
- stmt = VEC_pop (tree, modified_noreturn_calls);
- bb = bb_for_stmt (stmt);
- if (bb != NULL && last_stmt (bb) != stmt && noreturn_call_p (stmt))
- split_block (bb, stmt);
- }
-
- FOR_EACH_BB (bb)
- {
- bsi = bsi_last (bb);
-
- if (bsi_end_p (bsi))
- continue;
-
- stmt = bsi_stmt (bsi);
- if (TREE_CODE (stmt) == COND_EXPR
- || TREE_CODE (stmt) == SWITCH_EXPR)
- retval |= cleanup_control_expr_graph (bb, bsi);
-
- /* If we had a computed goto which has a compile-time determinable
- destination, then we can eliminate the goto. */
- if (TREE_CODE (stmt) == GOTO_EXPR
- && TREE_CODE (GOTO_DESTINATION (stmt)) == ADDR_EXPR
- && TREE_CODE (TREE_OPERAND (GOTO_DESTINATION (stmt), 0)) == LABEL_DECL)
- {
- edge e;
- tree label;
- edge_iterator ei;
- basic_block target_block;
- bool removed_edge = false;
-
- /* First look at all the outgoing edges. Delete any outgoing
- edges which do not go to the right block. For the one
- edge which goes to the right block, fix up its flags. */
- label = TREE_OPERAND (GOTO_DESTINATION (stmt), 0);
- target_block = label_to_block (label);
- for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
- {
- if (e->dest != target_block)
- {
- removed_edge = true;
- remove_edge (e);
- }
- else
- {
- /* Turn off the EDGE_ABNORMAL flag. */
- e->flags &= ~EDGE_ABNORMAL;
-
- /* And set EDGE_FALLTHRU. */
- e->flags |= EDGE_FALLTHRU;
- ei_next (&ei);
- }
- }
-
- /* If we removed one or more edges, then we will need to fix the
- dominators. It may be possible to incrementally update them. */
- if (removed_edge)
- free_dominance_info (CDI_DOMINATORS);
-
- /* Remove the GOTO_EXPR as it is not needed. The CFG has all the
- relevant information we need. */
- bsi_remove (&bsi);
- retval = true;
- }
-
- /* Check for indirect calls that have been turned into
- noreturn calls. */
- if (noreturn_call_p (stmt) && remove_fallthru_edge (bb->succs))
- {
- free_dominance_info (CDI_DOMINATORS);
- retval = true;
- }
- }
- return retval;
-}
-
-
-/* Disconnect an unreachable block in the control expression starting
- at block BB. */
-
-static bool
-cleanup_control_expr_graph (basic_block bb, block_stmt_iterator bsi)
-{
- edge taken_edge;
- bool retval = false;
- tree expr = bsi_stmt (bsi), val;
-
- if (!single_succ_p (bb))
- {
- edge e;
- edge_iterator ei;
-
- switch (TREE_CODE (expr))
- {
- case COND_EXPR:
- val = COND_EXPR_COND (expr);
- break;
-
- case SWITCH_EXPR:
- val = SWITCH_COND (expr);
- if (TREE_CODE (val) != INTEGER_CST)
- return false;
- break;
-
- default:
- gcc_unreachable ();
- }
-
- taken_edge = find_taken_edge (bb, val);
- if (!taken_edge)
- return false;
-
- /* Remove all the edges except the one that is always executed. */
- for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
- {
- if (e != taken_edge)
- {
- taken_edge->probability += e->probability;
- taken_edge->count += e->count;
- remove_edge (e);
- retval = true;
- }
- else
- ei_next (&ei);
- }
- if (taken_edge->probability > REG_BR_PROB_BASE)
- taken_edge->probability = REG_BR_PROB_BASE;
- }
- else
- taken_edge = single_succ_edge (bb);
-
- bsi_remove (&bsi);
- taken_edge->flags = EDGE_FALLTHRU;
-
- /* We removed some paths from the cfg. */
- free_dominance_info (CDI_DOMINATORS);
-
- return retval;
-}
-
-/* Remove any fallthru edge from EV. Return true if an edge was removed. */
-
-static bool
-remove_fallthru_edge (VEC(edge,gc) *ev)
-{
- edge_iterator ei;
- edge e;
-
- FOR_EACH_EDGE (e, ei, ev)
- if ((e->flags & EDGE_FALLTHRU) != 0)
- {
- remove_edge (e);
- return true;
- }
- return false;
-}
/* Given a basic block BB ending with COND_EXPR or SWITCH_EXPR, and a
predicate VAL, return the edge that will be taken out of the block.
@@ -2418,31 +2149,6 @@ find_case_label_for_value (tree switch_expr, tree val)
}
-/* If all the PHI nodes in DEST have alternatives for E1 and E2 and
- those alternatives are equal in each of the PHI nodes, then return
- true, else return false. */
-
-static bool
-phi_alternatives_equal (basic_block dest, edge e1, edge e2)
-{
- int n1 = e1->dest_idx;
- int n2 = e2->dest_idx;
- tree phi;
-
- for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
- {
- tree val1 = PHI_ARG_DEF (phi, n1);
- tree val2 = PHI_ARG_DEF (phi, n2);
-
- gcc_assert (val1 != NULL_TREE);
- gcc_assert (val2 != NULL_TREE);
-
- if (!operand_equal_for_phi_arg_p (val1, val2))
- return false;
- }
-
- return true;
-}
/*---------------------------------------------------------------------------
@@ -2553,11 +2259,6 @@ dump_cfg_stats (FILE *file)
total += size;
fprintf (file, fmt_str_1, "Edges", num_edges, SCALE (size), LABEL (size));
- size = n_basic_blocks * sizeof (struct bb_ann_d);
- total += size;
- fprintf (file, fmt_str_1, "Basic block annotations", n_basic_blocks,
- SCALE (size), LABEL (size));
-
fprintf (file, "---------------------------------------------------------\n");
fprintf (file, fmt_str_3, "Total memory used by CFG data", SCALE (total),
LABEL (total));
@@ -2867,13 +2568,7 @@ disband_implicit_edges (void)
void
delete_tree_cfg_annotations (void)
{
- basic_block bb;
- if (n_basic_blocks > 0)
- free_blocks_annotations ();
-
label_to_block_map = NULL;
- FOR_EACH_BB (bb)
- bb->rbi = NULL;
}
@@ -3421,32 +3116,67 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
break;
case ADDR_EXPR:
- /* ??? tree-ssa-alias.c may have overlooked dead PHI nodes, missing
- dead PHIs that take the address of something. But if the PHI
- result is dead, the fact that it takes the address of anything
- is irrelevant. Because we can not tell from here if a PHI result
- is dead, we just skip this check for PHIs altogether. This means
- we may be missing "valid" checks, but what can you do?
- This was PR19217. */
- if (in_phi)
- break;
+ {
+ bool old_invariant;
+ bool old_constant;
+ bool old_side_effects;
+ bool new_invariant;
+ bool new_constant;
+ bool new_side_effects;
+
+ /* ??? tree-ssa-alias.c may have overlooked dead PHI nodes, missing
+ dead PHIs that take the address of something. But if the PHI
+ result is dead, the fact that it takes the address of anything
+ is irrelevant. Because we can not tell from here if a PHI result
+ is dead, we just skip this check for PHIs altogether. This means
+ we may be missing "valid" checks, but what can you do?
+ This was PR19217. */
+ if (in_phi)
+ break;
- /* Skip any references (they will be checked when we recurse down the
- tree) and ensure that any variable used as a prefix is marked
- addressable. */
- for (x = TREE_OPERAND (t, 0);
- handled_component_p (x);
- x = TREE_OPERAND (x, 0))
- ;
-
- if (TREE_CODE (x) != VAR_DECL && TREE_CODE (x) != PARM_DECL)
- return NULL;
- if (!TREE_ADDRESSABLE (x))
- {
- error ("address taken, but ADDRESSABLE bit not set");
- return x;
- }
- break;
+ old_invariant = TREE_INVARIANT (t);
+ old_constant = TREE_CONSTANT (t);
+ old_side_effects = TREE_SIDE_EFFECTS (t);
+
+ recompute_tree_invarant_for_addr_expr (t);
+ new_invariant = TREE_INVARIANT (t);
+ new_side_effects = TREE_SIDE_EFFECTS (t);
+ new_constant = TREE_CONSTANT (t);
+
+ if (old_invariant != new_invariant)
+ {
+ error ("invariant not recomputed when ADDR_EXPR changed");
+ return t;
+ }
+
+ if (old_constant != new_constant)
+ {
+ error ("constant not recomputed when ADDR_EXPR changed");
+ return t;
+ }
+ if (old_side_effects != new_side_effects)
+ {
+ error ("side effects not recomputed when ADDR_EXPR changed");
+ return t;
+ }
+
+ /* Skip any references (they will be checked when we recurse down the
+ tree) and ensure that any variable used as a prefix is marked
+ addressable. */
+ for (x = TREE_OPERAND (t, 0);
+ handled_component_p (x);
+ x = TREE_OPERAND (x, 0))
+ ;
+
+ if (TREE_CODE (x) != VAR_DECL && TREE_CODE (x) != PARM_DECL)
+ return NULL;
+ if (!TREE_ADDRESSABLE (x))
+ {
+ error ("address taken, but ADDRESSABLE bit not set");
+ return x;
+ }
+ break;
+ }
case COND_EXPR:
x = COND_EXPR_COND (t);
@@ -3455,6 +3185,11 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
error ("non-boolean used in condition");
return x;
}
+ if (!is_gimple_condexpr (x))
+ {
+ error ("Invalid conditional operand");
+ return x;
+ }
break;
case NOP_EXPR:
@@ -4099,447 +3834,6 @@ tree_make_forwarder_block (edge fallthru)
}
-/* Return true if basic block BB does nothing except pass control
- flow to another block and that we can safely insert a label at
- the start of the successor block.
-
- As a precondition, we require that BB be not equal to
- ENTRY_BLOCK_PTR. */
-
-static bool
-tree_forwarder_block_p (basic_block bb, bool phi_wanted)
-{
- block_stmt_iterator bsi;
-
- /* BB must have a single outgoing edge. */
- if (single_succ_p (bb) != 1
- /* If PHI_WANTED is false, BB must not have any PHI nodes.
- Otherwise, BB must have PHI nodes. */
- || (phi_nodes (bb) != NULL_TREE) != phi_wanted
- /* BB may not be a predecessor of EXIT_BLOCK_PTR. */
- || single_succ (bb) == EXIT_BLOCK_PTR
- /* Nor should this be an infinite loop. */
- || single_succ (bb) == bb
- /* BB may not have an abnormal outgoing edge. */
- || (single_succ_edge (bb)->flags & EDGE_ABNORMAL))
- return false;
-
-#if ENABLE_CHECKING
- gcc_assert (bb != ENTRY_BLOCK_PTR);
-#endif
-
- /* Now walk through the statements backward. We can ignore labels,
- anything else means this is not a forwarder block. */
- for (bsi = bsi_last (bb); !bsi_end_p (bsi); bsi_prev (&bsi))
- {
- tree stmt = bsi_stmt (bsi);
-
- switch (TREE_CODE (stmt))
- {
- case LABEL_EXPR:
- if (DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
- return false;
- break;
-
- default:
- return false;
- }
- }
-
- if (find_edge (ENTRY_BLOCK_PTR, bb))
- return false;
-
- if (current_loops)
- {
- basic_block dest;
- /* Protect loop latches, headers and preheaders. */
- if (bb->loop_father->header == bb)
- return false;
- dest = EDGE_SUCC (bb, 0)->dest;
-
- if (dest->loop_father->header == dest)
- return false;
- }
-
- return true;
-}
-
-/* Return true if BB has at least one abnormal incoming edge. */
-
-static inline bool
-has_abnormal_incoming_edge_p (basic_block bb)
-{
- edge e;
- edge_iterator ei;
-
- FOR_EACH_EDGE (e, ei, bb->preds)
- if (e->flags & EDGE_ABNORMAL)
- return true;
-
- return false;
-}
-
-/* Removes forwarder block BB. Returns false if this failed. If a new
- forwarder block is created due to redirection of edges, it is
- stored to worklist. */
-
-static bool
-remove_forwarder_block (basic_block bb, basic_block **worklist)
-{
- edge succ = single_succ_edge (bb), e, s;
- basic_block dest = succ->dest;
- tree label;
- tree phi;
- edge_iterator ei;
- block_stmt_iterator bsi, bsi_to;
- bool seen_abnormal_edge = false;
-
- /* We check for infinite loops already in tree_forwarder_block_p.
- However it may happen that the infinite loop is created
- afterwards due to removal of forwarders. */
- if (dest == bb)
- return false;
-
- /* If the destination block consists of a nonlocal label, do not merge
- it. */
- label = first_stmt (dest);
- if (label
- && TREE_CODE (label) == LABEL_EXPR
- && DECL_NONLOCAL (LABEL_EXPR_LABEL (label)))
- return false;
-
- /* If there is an abnormal edge to basic block BB, but not into
- dest, problems might occur during removal of the phi node at out
- of ssa due to overlapping live ranges of registers.
-
- If there is an abnormal edge in DEST, the problems would occur
- anyway since cleanup_dead_labels would then merge the labels for
- two different eh regions, and rest of exception handling code
- does not like it.
-
- So if there is an abnormal edge to BB, proceed only if there is
- no abnormal edge to DEST and there are no phi nodes in DEST. */
- if (has_abnormal_incoming_edge_p (bb))
- {
- seen_abnormal_edge = true;
-
- if (has_abnormal_incoming_edge_p (dest)
- || phi_nodes (dest) != NULL_TREE)
- return false;
- }
-
- /* If there are phi nodes in DEST, and some of the blocks that are
- predecessors of BB are also predecessors of DEST, check that the
- phi node arguments match. */
- if (phi_nodes (dest))
- {
- FOR_EACH_EDGE (e, ei, bb->preds)
- {
- s = find_edge (e->src, dest);
- if (!s)
- continue;
-
- if (!phi_alternatives_equal (dest, succ, s))
- return false;
- }
- }
-
- /* Redirect the edges. */
- for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); )
- {
- if (e->flags & EDGE_ABNORMAL)
- {
- /* If there is an abnormal edge, redirect it anyway, and
- move the labels to the new block to make it legal. */
- s = redirect_edge_succ_nodup (e, dest);
- }
- else
- s = redirect_edge_and_branch (e, dest);
-
- if (s == e)
- {
- /* Create arguments for the phi nodes, since the edge was not
- here before. */
- for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
- add_phi_arg (phi, PHI_ARG_DEF (phi, succ->dest_idx), s);
- }
- else
- {
- /* The source basic block might become a forwarder. We know
- that it was not a forwarder before, since it used to have
- at least two outgoing edges, so we may just add it to
- worklist. */
- if (tree_forwarder_block_p (s->src, false))
- *(*worklist)++ = s->src;
- }
- }
-
- if (seen_abnormal_edge)
- {
- /* Move the labels to the new block, so that the redirection of
- the abnormal edges works. */
-
- bsi_to = bsi_start (dest);
- for (bsi = bsi_start (bb); !bsi_end_p (bsi); )
- {
- label = bsi_stmt (bsi);
- gcc_assert (TREE_CODE (label) == LABEL_EXPR);
- bsi_remove (&bsi);
- bsi_insert_before (&bsi_to, label, BSI_CONTINUE_LINKING);
- }
- }
-
- /* Update the dominators. */
- if (dom_info_available_p (CDI_DOMINATORS))
- {
- basic_block dom, dombb, domdest;
-
- dombb = get_immediate_dominator (CDI_DOMINATORS, bb);
- domdest = get_immediate_dominator (CDI_DOMINATORS, dest);
- if (domdest == bb)
- {
- /* Shortcut to avoid calling (relatively expensive)
- nearest_common_dominator unless necessary. */
- dom = dombb;
- }
- else
- dom = nearest_common_dominator (CDI_DOMINATORS, domdest, dombb);
-
- set_immediate_dominator (CDI_DOMINATORS, dest, dom);
- }
-
- /* And kill the forwarder block. */
- delete_basic_block (bb);
-
- return true;
-}
-
-/* Removes forwarder blocks. */
-
-static bool
-cleanup_forwarder_blocks (void)
-{
- basic_block bb;
- bool changed = false;
- basic_block *worklist = xmalloc (sizeof (basic_block) * n_basic_blocks);
- basic_block *current = worklist;
-
- FOR_EACH_BB (bb)
- {
- if (tree_forwarder_block_p (bb, false))
- *current++ = bb;
- }
-
- while (current != worklist)
- {
- bb = *--current;
- changed |= remove_forwarder_block (bb, &current);
- }
-
- free (worklist);
- return changed;
-}
-
-/* Merge the PHI nodes at BB into those at BB's sole successor. */
-
-static void
-remove_forwarder_block_with_phi (basic_block bb)
-{
- edge succ = single_succ_edge (bb);
- basic_block dest = succ->dest;
- tree label;
- basic_block dombb, domdest, dom;
-
- /* We check for infinite loops already in tree_forwarder_block_p.
- However it may happen that the infinite loop is created
- afterwards due to removal of forwarders. */
- if (dest == bb)
- return;
-
- /* If the destination block consists of a nonlocal label, do not
- merge it. */
- label = first_stmt (dest);
- if (label
- && TREE_CODE (label) == LABEL_EXPR
- && DECL_NONLOCAL (LABEL_EXPR_LABEL (label)))
- return;
-
- /* Redirect each incoming edge to BB to DEST. */
- while (EDGE_COUNT (bb->preds) > 0)
- {
- edge e = EDGE_PRED (bb, 0), s;
- tree phi;
-
- s = find_edge (e->src, dest);
- if (s)
- {
- /* We already have an edge S from E->src to DEST. If S and
- E->dest's sole successor edge have the same PHI arguments
- at DEST, redirect S to DEST. */
- if (phi_alternatives_equal (dest, s, succ))
- {
- e = redirect_edge_and_branch (e, dest);
- PENDING_STMT (e) = NULL_TREE;
- continue;
- }
-
- /* PHI arguments are different. Create a forwarder block by
- splitting E so that we can merge PHI arguments on E to
- DEST. */
- e = single_succ_edge (split_edge (e));
- }
-
- s = redirect_edge_and_branch (e, dest);
-
- /* redirect_edge_and_branch must not create a new edge. */
- gcc_assert (s == e);
-
- /* Add to the PHI nodes at DEST each PHI argument removed at the
- destination of E. */
- for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
- {
- tree def = PHI_ARG_DEF (phi, succ->dest_idx);
-
- if (TREE_CODE (def) == SSA_NAME)
- {
- tree var;
-
- /* If DEF is one of the results of PHI nodes removed during
- redirection, replace it with the PHI argument that used
- to be on E. */
- for (var = PENDING_STMT (e); var; var = TREE_CHAIN (var))
- {
- tree old_arg = TREE_PURPOSE (var);
- tree new_arg = TREE_VALUE (var);
-
- if (def == old_arg)
- {
- def = new_arg;
- break;
- }
- }
- }
-
- add_phi_arg (phi, def, s);
- }
-
- PENDING_STMT (e) = NULL;
- }
-
- /* Update the dominators. */
- dombb = get_immediate_dominator (CDI_DOMINATORS, bb);
- domdest = get_immediate_dominator (CDI_DOMINATORS, dest);
- if (domdest == bb)
- {
- /* Shortcut to avoid calling (relatively expensive)
- nearest_common_dominator unless necessary. */
- dom = dombb;
- }
- else
- dom = nearest_common_dominator (CDI_DOMINATORS, domdest, dombb);
-
- set_immediate_dominator (CDI_DOMINATORS, dest, dom);
-
- /* Remove BB since all of BB's incoming edges have been redirected
- to DEST. */
- delete_basic_block (bb);
-}
-
-/* This pass merges PHI nodes if one feeds into another. For example,
- suppose we have the following:
-
- goto <bb 9> (<L9>);
-
-<L8>:;
- tem_17 = foo ();
-
- # tem_6 = PHI <tem_17(8), tem_23(7)>;
-<L9>:;
-
- # tem_3 = PHI <tem_6(9), tem_2(5)>;
-<L10>:;
-
- Then we merge the first PHI node into the second one like so:
-
- goto <bb 9> (<L10>);
-
-<L8>:;
- tem_17 = foo ();
-
- # tem_3 = PHI <tem_23(7), tem_2(5), tem_17(8)>;
-<L10>:;
-*/
-
-static void
-merge_phi_nodes (void)
-{
- basic_block *worklist = xmalloc (sizeof (basic_block) * n_basic_blocks);
- basic_block *current = worklist;
- basic_block bb;
-
- calculate_dominance_info (CDI_DOMINATORS);
-
- /* Find all PHI nodes that we may be able to merge. */
- FOR_EACH_BB (bb)
- {
- basic_block dest;
-
- /* Look for a forwarder block with PHI nodes. */
- if (!tree_forwarder_block_p (bb, true))
- continue;
-
- dest = single_succ (bb);
-
- /* We have to feed into another basic block with PHI
- nodes. */
- if (!phi_nodes (dest)
- /* We don't want to deal with a basic block with
- abnormal edges. */
- || has_abnormal_incoming_edge_p (bb))
- continue;
-
- if (!dominated_by_p (CDI_DOMINATORS, dest, bb))
- {
- /* If BB does not dominate DEST, then the PHI nodes at
- DEST must be the only users of the results of the PHI
- nodes at BB. */
- *current++ = bb;
- }
- }
-
- /* Now let's drain WORKLIST. */
- while (current != worklist)
- {
- bb = *--current;
- remove_forwarder_block_with_phi (bb);
- }
-
- free (worklist);
-}
-
-static bool
-gate_merge_phi (void)
-{
- return 1;
-}
-
-struct tree_opt_pass pass_merge_phi = {
- "mergephi", /* name */
- gate_merge_phi, /* gate */
- merge_phi_nodes, /* execute */
- NULL, /* sub */
- NULL, /* next */
- 0, /* static_pass_number */
- TV_TREE_MERGE_PHI, /* tv_id */
- PROP_cfg | PROP_ssa, /* properties_required */
- 0, /* properties_provided */
- 0, /* properties_destroyed */
- 0, /* todo_flags_start */
- TODO_dump_func | TODO_ggc_collect /* todo_flags_finish */
- | TODO_verify_ssa,
- 0 /* letter */
-};
-
/* Return a non-special label in the head of basic block BLOCK.
Create one if it doesn't exist. */
@@ -4862,7 +4156,7 @@ tree_duplicate_bb (basic_block bb)
/* Basic block BB_COPY was created by code duplication. Add phi node
arguments for edges going out of BB_COPY. The blocks that were
- duplicated have rbi->duplicated set to one. */
+ duplicated have BB_DUPLICATED set. */
void
add_phi_args_after_copy_bb (basic_block bb_copy)
@@ -4872,15 +4166,15 @@ add_phi_args_after_copy_bb (basic_block bb_copy)
edge_iterator ei;
tree phi, phi_copy, phi_next, def;
- bb = bb_copy->rbi->original;
+ bb = get_bb_original (bb_copy);
FOR_EACH_EDGE (e_copy, ei, bb_copy->succs)
{
if (!phi_nodes (e_copy->dest))
continue;
- if (e_copy->dest->rbi->duplicated)
- dest = e_copy->dest->rbi->original;
+ if (e_copy->dest->flags & BB_DUPLICATED)
+ dest = get_bb_original (e_copy->dest);
else
dest = e_copy->dest;
@@ -4891,8 +4185,8 @@ add_phi_args_after_copy_bb (basic_block bb_copy)
In this case we are not looking for edge to dest, but to
duplicated block whose original was dest. */
FOR_EACH_EDGE (e, ei, bb->succs)
- if (e->dest->rbi->duplicated
- && e->dest->rbi->original == dest)
+ if ((e->dest->flags & BB_DUPLICATED)
+ && get_bb_original (e->dest) == dest)
break;
gcc_assert (e != NULL);
@@ -4919,13 +4213,13 @@ add_phi_args_after_copy (basic_block *region_copy, unsigned n_region)
unsigned i;
for (i = 0; i < n_region; i++)
- region_copy[i]->rbi->duplicated = 1;
+ region_copy[i]->flags |= BB_DUPLICATED;
for (i = 0; i < n_region; i++)
add_phi_args_after_copy_bb (region_copy[i]);
for (i = 0; i < n_region; i++)
- region_copy[i]->rbi->duplicated = 0;
+ region_copy[i]->flags &= ~BB_DUPLICATED;
}
/* Duplicates a REGION (set of N_REGION basic blocks) with just a single
@@ -4999,6 +4293,8 @@ tree_duplicate_sese_region (edge entry, edge exit,
/* Record blocks outside the region that are dominated by something
inside. */
doms = xmalloc (sizeof (basic_block) * n_basic_blocks);
+ initialize_original_copy_tables ();
+
n_doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region, doms);
total_freq = entry->dest->frequency;
@@ -5022,7 +4318,7 @@ tree_duplicate_sese_region (edge entry, edge exit,
}
/* Redirect the entry and add the phi node arguments. */
- redirected = redirect_edge_and_branch (entry, entry->dest->rbi->copy);
+ redirected = redirect_edge_and_branch (entry, get_bb_copy (entry->dest));
gcc_assert (redirected != NULL);
flush_pending_stmts (entry);
@@ -5031,7 +4327,7 @@ tree_duplicate_sese_region (edge entry, edge exit,
region, but was dominated by something inside needs recounting as
well. */
set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
- doms[n_doms++] = entry->dest->rbi->original;
+ doms[n_doms++] = get_bb_original (entry->dest);
iterate_fix_dominators (CDI_DOMINATORS, doms, n_doms);
free (doms);
@@ -5044,6 +4340,7 @@ tree_duplicate_sese_region (edge entry, edge exit,
if (free_region_copy)
free (region_copy);
+ free_original_copy_tables ();
return true;
}
diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c
new file mode 100644
index 00000000000..f250f1fc05e
--- /dev/null
+++ b/gcc/tree-cfgcleanup.c
@@ -0,0 +1,756 @@
+/* CFG cleanup for trees.
+ Copyright (C) 2001, 2002, 2003, 2004, 2005 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. */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
+#include "tree.h"
+#include "rtl.h"
+#include "tm_p.h"
+#include "hard-reg-set.h"
+#include "basic-block.h"
+#include "output.h"
+#include "errors.h"
+#include "flags.h"
+#include "function.h"
+#include "expr.h"
+#include "ggc.h"
+#include "langhooks.h"
+#include "diagnostic.h"
+#include "tree-flow.h"
+#include "timevar.h"
+#include "tree-dump.h"
+#include "tree-pass.h"
+#include "toplev.h"
+#include "except.h"
+#include "cfgloop.h"
+#include "cfglayout.h"
+#include "hashtab.h"
+#include "tree-ssa-propagate.h"
+
+/* Remove any fallthru edge from EV. Return true if an edge was removed. */
+
+static bool
+remove_fallthru_edge (VEC(edge,gc) *ev)
+{
+ edge_iterator ei;
+ edge e;
+
+ FOR_EACH_EDGE (e, ei, ev)
+ if ((e->flags & EDGE_FALLTHRU) != 0)
+ {
+ remove_edge (e);
+ return true;
+ }
+ return false;
+}
+
+/* Disconnect an unreachable block in the control expression starting
+ at block BB. */
+
+static bool
+cleanup_control_expr_graph (basic_block bb, block_stmt_iterator bsi)
+{
+ edge taken_edge;
+ bool retval = false;
+ tree expr = bsi_stmt (bsi), val;
+
+ if (!single_succ_p (bb))
+ {
+ edge e;
+ edge_iterator ei;
+
+ switch (TREE_CODE (expr))
+ {
+ case COND_EXPR:
+ val = COND_EXPR_COND (expr);
+ break;
+
+ case SWITCH_EXPR:
+ val = SWITCH_COND (expr);
+ if (TREE_CODE (val) != INTEGER_CST)
+ return false;
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+
+ taken_edge = find_taken_edge (bb, val);
+ if (!taken_edge)
+ return false;
+
+ /* Remove all the edges except the one that is always executed. */
+ for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
+ {
+ if (e != taken_edge)
+ {
+ taken_edge->probability += e->probability;
+ taken_edge->count += e->count;
+ remove_edge (e);
+ retval = true;
+ }
+ else
+ ei_next (&ei);
+ }
+ if (taken_edge->probability > REG_BR_PROB_BASE)
+ taken_edge->probability = REG_BR_PROB_BASE;
+ }
+ else
+ taken_edge = single_succ_edge (bb);
+
+ bsi_remove (&bsi);
+ taken_edge->flags = EDGE_FALLTHRU;
+
+ /* We removed some paths from the cfg. */
+ free_dominance_info (CDI_DOMINATORS);
+
+ return retval;
+}
+
+/* A list of all the noreturn calls passed to modify_stmt.
+ cleanup_control_flow uses it to detect cases where a mid-block
+ indirect call has been turned into a noreturn call. When this
+ happens, all the instructions after the call are no longer
+ reachable and must be deleted as dead. */
+
+VEC(tree,gc) *modified_noreturn_calls;
+
+/* Try to remove superfluous control structures. */
+
+static bool
+cleanup_control_flow (void)
+{
+ basic_block bb;
+ block_stmt_iterator bsi;
+ bool retval = false;
+ tree stmt;
+
+ /* Detect cases where a mid-block call is now known not to return. */
+ while (VEC_length (tree, modified_noreturn_calls))
+ {
+ stmt = VEC_pop (tree, modified_noreturn_calls);
+ bb = bb_for_stmt (stmt);
+ if (bb != NULL && last_stmt (bb) != stmt && noreturn_call_p (stmt))
+ split_block (bb, stmt);
+ }
+
+ FOR_EACH_BB (bb)
+ {
+ bsi = bsi_last (bb);
+
+ if (bsi_end_p (bsi))
+ continue;
+
+ stmt = bsi_stmt (bsi);
+ if (TREE_CODE (stmt) == COND_EXPR
+ || TREE_CODE (stmt) == SWITCH_EXPR)
+ retval |= cleanup_control_expr_graph (bb, bsi);
+
+ /* If we had a computed goto which has a compile-time determinable
+ destination, then we can eliminate the goto. */
+ if (TREE_CODE (stmt) == GOTO_EXPR
+ && TREE_CODE (GOTO_DESTINATION (stmt)) == ADDR_EXPR
+ && TREE_CODE (TREE_OPERAND (GOTO_DESTINATION (stmt), 0)) == LABEL_DECL)
+ {
+ edge e;
+ tree label;
+ edge_iterator ei;
+ basic_block target_block;
+ bool removed_edge = false;
+
+ /* First look at all the outgoing edges. Delete any outgoing
+ edges which do not go to the right block. For the one
+ edge which goes to the right block, fix up its flags. */
+ label = TREE_OPERAND (GOTO_DESTINATION (stmt), 0);
+ target_block = label_to_block (label);
+ for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
+ {
+ if (e->dest != target_block)
+ {
+ removed_edge = true;
+ remove_edge (e);
+ }
+ else
+ {
+ /* Turn off the EDGE_ABNORMAL flag. */
+ e->flags &= ~EDGE_ABNORMAL;
+
+ /* And set EDGE_FALLTHRU. */
+ e->flags |= EDGE_FALLTHRU;
+ ei_next (&ei);
+ }
+ }
+
+ /* If we removed one or more edges, then we will need to fix the
+ dominators. It may be possible to incrementally update them. */
+ if (removed_edge)
+ free_dominance_info (CDI_DOMINATORS);
+
+ /* Remove the GOTO_EXPR as it is not needed. The CFG has all the
+ relevant information we need. */
+ bsi_remove (&bsi);
+ retval = true;
+ }
+
+ /* Check for indirect calls that have been turned into
+ noreturn calls. */
+ if (noreturn_call_p (stmt) && remove_fallthru_edge (bb->succs))
+ {
+ free_dominance_info (CDI_DOMINATORS);
+ retval = true;
+ }
+ }
+ return retval;
+}
+
+/* Return true if basic block BB does nothing except pass control
+ flow to another block and that we can safely insert a label at
+ the start of the successor block.
+
+ As a precondition, we require that BB be not equal to
+ ENTRY_BLOCK_PTR. */
+
+static bool
+tree_forwarder_block_p (basic_block bb, bool phi_wanted)
+{
+ block_stmt_iterator bsi;
+
+ /* BB must have a single outgoing edge. */
+ if (single_succ_p (bb) != 1
+ /* If PHI_WANTED is false, BB must not have any PHI nodes.
+ Otherwise, BB must have PHI nodes. */
+ || (phi_nodes (bb) != NULL_TREE) != phi_wanted
+ /* BB may not be a predecessor of EXIT_BLOCK_PTR. */
+ || single_succ (bb) == EXIT_BLOCK_PTR
+ /* Nor should this be an infinite loop. */
+ || single_succ (bb) == bb
+ /* BB may not have an abnormal outgoing edge. */
+ || (single_succ_edge (bb)->flags & EDGE_ABNORMAL))
+ return false;
+
+#if ENABLE_CHECKING
+ gcc_assert (bb != ENTRY_BLOCK_PTR);
+#endif
+
+ /* Now walk through the statements backward. We can ignore labels,
+ anything else means this is not a forwarder block. */
+ for (bsi = bsi_last (bb); !bsi_end_p (bsi); bsi_prev (&bsi))
+ {
+ tree stmt = bsi_stmt (bsi);
+
+ switch (TREE_CODE (stmt))
+ {
+ case LABEL_EXPR:
+ if (DECL_NONLOCAL (LABEL_EXPR_LABEL (stmt)))
+ return false;
+ break;
+
+ default:
+ return false;
+ }
+ }
+
+ if (find_edge (ENTRY_BLOCK_PTR, bb))
+ return false;
+
+ if (current_loops)
+ {
+ basic_block dest;
+ /* Protect loop latches, headers and preheaders. */
+ if (bb->loop_father->header == bb)
+ return false;
+ dest = EDGE_SUCC (bb, 0)->dest;
+
+ if (dest->loop_father->header == dest)
+ return false;
+ }
+
+ return true;
+}
+
+/* Return true if BB has at least one abnormal incoming edge. */
+
+static inline bool
+has_abnormal_incoming_edge_p (basic_block bb)
+{
+ edge e;
+ edge_iterator ei;
+
+ FOR_EACH_EDGE (e, ei, bb->preds)
+ if (e->flags & EDGE_ABNORMAL)
+ return true;
+
+ return false;
+}
+
+/* If all the PHI nodes in DEST have alternatives for E1 and E2 and
+ those alternatives are equal in each of the PHI nodes, then return
+ true, else return false. */
+
+static bool
+phi_alternatives_equal (basic_block dest, edge e1, edge e2)
+{
+ int n1 = e1->dest_idx;
+ int n2 = e2->dest_idx;
+ tree phi;
+
+ for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
+ {
+ tree val1 = PHI_ARG_DEF (phi, n1);
+ tree val2 = PHI_ARG_DEF (phi, n2);
+
+ gcc_assert (val1 != NULL_TREE);
+ gcc_assert (val2 != NULL_TREE);
+
+ if (!operand_equal_for_phi_arg_p (val1, val2))
+ return false;
+ }
+
+ return true;
+}
+
+/* Removes forwarder block BB. Returns false if this failed. If a new
+ forwarder block is created due to redirection of edges, it is
+ stored to worklist. */
+
+static bool
+remove_forwarder_block (basic_block bb, basic_block **worklist)
+{
+ edge succ = single_succ_edge (bb), e, s;
+ basic_block dest = succ->dest;
+ tree label;
+ tree phi;
+ edge_iterator ei;
+ block_stmt_iterator bsi, bsi_to;
+ bool seen_abnormal_edge = false;
+
+ /* We check for infinite loops already in tree_forwarder_block_p.
+ However it may happen that the infinite loop is created
+ afterwards due to removal of forwarders. */
+ if (dest == bb)
+ return false;
+
+ /* If the destination block consists of a nonlocal label, do not merge
+ it. */
+ label = first_stmt (dest);
+ if (label
+ && TREE_CODE (label) == LABEL_EXPR
+ && DECL_NONLOCAL (LABEL_EXPR_LABEL (label)))
+ return false;
+
+ /* If there is an abnormal edge to basic block BB, but not into
+ dest, problems might occur during removal of the phi node at out
+ of ssa due to overlapping live ranges of registers.
+
+ If there is an abnormal edge in DEST, the problems would occur
+ anyway since cleanup_dead_labels would then merge the labels for
+ two different eh regions, and rest of exception handling code
+ does not like it.
+
+ So if there is an abnormal edge to BB, proceed only if there is
+ no abnormal edge to DEST and there are no phi nodes in DEST. */
+ if (has_abnormal_incoming_edge_p (bb))
+ {
+ seen_abnormal_edge = true;
+
+ if (has_abnormal_incoming_edge_p (dest)
+ || phi_nodes (dest) != NULL_TREE)
+ return false;
+ }
+
+ /* If there are phi nodes in DEST, and some of the blocks that are
+ predecessors of BB are also predecessors of DEST, check that the
+ phi node arguments match. */
+ if (phi_nodes (dest))
+ {
+ FOR_EACH_EDGE (e, ei, bb->preds)
+ {
+ s = find_edge (e->src, dest);
+ if (!s)
+ continue;
+
+ if (!phi_alternatives_equal (dest, succ, s))
+ return false;
+ }
+ }
+
+ /* Redirect the edges. */
+ for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); )
+ {
+ if (e->flags & EDGE_ABNORMAL)
+ {
+ /* If there is an abnormal edge, redirect it anyway, and
+ move the labels to the new block to make it legal. */
+ s = redirect_edge_succ_nodup (e, dest);
+ }
+ else
+ s = redirect_edge_and_branch (e, dest);
+
+ if (s == e)
+ {
+ /* Create arguments for the phi nodes, since the edge was not
+ here before. */
+ for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
+ add_phi_arg (phi, PHI_ARG_DEF (phi, succ->dest_idx), s);
+ }
+ else
+ {
+ /* The source basic block might become a forwarder. We know
+ that it was not a forwarder before, since it used to have
+ at least two outgoing edges, so we may just add it to
+ worklist. */
+ if (tree_forwarder_block_p (s->src, false))
+ *(*worklist)++ = s->src;
+ }
+ }
+
+ if (seen_abnormal_edge)
+ {
+ /* Move the labels to the new block, so that the redirection of
+ the abnormal edges works. */
+
+ bsi_to = bsi_start (dest);
+ for (bsi = bsi_start (bb); !bsi_end_p (bsi); )
+ {
+ label = bsi_stmt (bsi);
+ gcc_assert (TREE_CODE (label) == LABEL_EXPR);
+ bsi_remove (&bsi);
+ bsi_insert_before (&bsi_to, label, BSI_CONTINUE_LINKING);
+ }
+ }
+
+ /* Update the dominators. */
+ if (dom_info_available_p (CDI_DOMINATORS))
+ {
+ basic_block dom, dombb, domdest;
+
+ dombb = get_immediate_dominator (CDI_DOMINATORS, bb);
+ domdest = get_immediate_dominator (CDI_DOMINATORS, dest);
+ if (domdest == bb)
+ {
+ /* Shortcut to avoid calling (relatively expensive)
+ nearest_common_dominator unless necessary. */
+ dom = dombb;
+ }
+ else
+ dom = nearest_common_dominator (CDI_DOMINATORS, domdest, dombb);
+
+ set_immediate_dominator (CDI_DOMINATORS, dest, dom);
+ }
+
+ /* And kill the forwarder block. */
+ delete_basic_block (bb);
+
+ return true;
+}
+
+/* Removes forwarder blocks. */
+
+static bool
+cleanup_forwarder_blocks (void)
+{
+ basic_block bb;
+ bool changed = false;
+ basic_block *worklist = xmalloc (sizeof (basic_block) * n_basic_blocks);
+ basic_block *current = worklist;
+
+ FOR_EACH_BB (bb)
+ {
+ if (tree_forwarder_block_p (bb, false))
+ *current++ = bb;
+ }
+
+ while (current != worklist)
+ {
+ bb = *--current;
+ changed |= remove_forwarder_block (bb, &current);
+ }
+
+ free (worklist);
+ return changed;
+}
+
+/* Remove unreachable blocks and other miscellaneous clean up work. */
+
+bool
+cleanup_tree_cfg (void)
+{
+ bool retval = false;
+
+ timevar_push (TV_TREE_CLEANUP_CFG);
+
+ retval = cleanup_control_flow ();
+ retval |= delete_unreachable_blocks ();
+
+ /* cleanup_forwarder_blocks can redirect edges out of SWITCH_EXPRs,
+ which can get expensive. So we want to enable recording of edge
+ to CASE_LABEL_EXPR mappings around the call to
+ cleanup_forwarder_blocks. */
+ start_recording_case_labels ();
+ retval |= cleanup_forwarder_blocks ();
+ end_recording_case_labels ();
+
+#ifdef ENABLE_CHECKING
+ if (retval)
+ {
+ gcc_assert (!cleanup_control_flow ());
+ gcc_assert (!delete_unreachable_blocks ());
+ gcc_assert (!cleanup_forwarder_blocks ());
+ }
+#endif
+
+ /* Merging the blocks creates no new opportunities for the other
+ optimizations, so do it here. */
+ retval |= merge_seq_blocks ();
+
+ compact_blocks ();
+
+#ifdef ENABLE_CHECKING
+ verify_flow_info ();
+#endif
+ timevar_pop (TV_TREE_CLEANUP_CFG);
+ return retval;
+}
+
+/* Cleanup cfg and repair loop structures. */
+
+void
+cleanup_tree_cfg_loop (void)
+{
+ bitmap changed_bbs = BITMAP_ALLOC (NULL);
+
+ cleanup_tree_cfg ();
+
+ fix_loop_structure (current_loops, changed_bbs);
+ calculate_dominance_info (CDI_DOMINATORS);
+
+ /* This usually does nothing. But sometimes parts of cfg that originally
+ were inside a loop get out of it due to edge removal (since they
+ become unreachable by back edges from latch). */
+ rewrite_into_loop_closed_ssa (changed_bbs, TODO_update_ssa);
+
+ BITMAP_FREE (changed_bbs);
+
+#ifdef ENABLE_CHECKING
+ verify_loop_structure (current_loops);
+#endif
+}
+
+/* Merge the PHI nodes at BB into those at BB's sole successor. */
+
+static void
+remove_forwarder_block_with_phi (basic_block bb)
+{
+ edge succ = single_succ_edge (bb);
+ basic_block dest = succ->dest;
+ tree label;
+ basic_block dombb, domdest, dom;
+
+ /* We check for infinite loops already in tree_forwarder_block_p.
+ However it may happen that the infinite loop is created
+ afterwards due to removal of forwarders. */
+ if (dest == bb)
+ return;
+
+ /* If the destination block consists of a nonlocal label, do not
+ merge it. */
+ label = first_stmt (dest);
+ if (label
+ && TREE_CODE (label) == LABEL_EXPR
+ && DECL_NONLOCAL (LABEL_EXPR_LABEL (label)))
+ return;
+
+ /* Redirect each incoming edge to BB to DEST. */
+ while (EDGE_COUNT (bb->preds) > 0)
+ {
+ edge e = EDGE_PRED (bb, 0), s;
+ tree phi;
+
+ s = find_edge (e->src, dest);
+ if (s)
+ {
+ /* We already have an edge S from E->src to DEST. If S and
+ E->dest's sole successor edge have the same PHI arguments
+ at DEST, redirect S to DEST. */
+ if (phi_alternatives_equal (dest, s, succ))
+ {
+ e = redirect_edge_and_branch (e, dest);
+ PENDING_STMT (e) = NULL_TREE;
+ continue;
+ }
+
+ /* PHI arguments are different. Create a forwarder block by
+ splitting E so that we can merge PHI arguments on E to
+ DEST. */
+ e = single_succ_edge (split_edge (e));
+ }
+
+ s = redirect_edge_and_branch (e, dest);
+
+ /* redirect_edge_and_branch must not create a new edge. */
+ gcc_assert (s == e);
+
+ /* Add to the PHI nodes at DEST each PHI argument removed at the
+ destination of E. */
+ for (phi = phi_nodes (dest); phi; phi = PHI_CHAIN (phi))
+ {
+ tree def = PHI_ARG_DEF (phi, succ->dest_idx);
+
+ if (TREE_CODE (def) == SSA_NAME)
+ {
+ tree var;
+
+ /* If DEF is one of the results of PHI nodes removed during
+ redirection, replace it with the PHI argument that used
+ to be on E. */
+ for (var = PENDING_STMT (e); var; var = TREE_CHAIN (var))
+ {
+ tree old_arg = TREE_PURPOSE (var);
+ tree new_arg = TREE_VALUE (var);
+
+ if (def == old_arg)
+ {
+ def = new_arg;
+ break;
+ }
+ }
+ }
+
+ add_phi_arg (phi, def, s);
+ }
+
+ PENDING_STMT (e) = NULL;
+ }
+
+ /* Update the dominators. */
+ dombb = get_immediate_dominator (CDI_DOMINATORS, bb);
+ domdest = get_immediate_dominator (CDI_DOMINATORS, dest);
+ if (domdest == bb)
+ {
+ /* Shortcut to avoid calling (relatively expensive)
+ nearest_common_dominator unless necessary. */
+ dom = dombb;
+ }
+ else
+ dom = nearest_common_dominator (CDI_DOMINATORS, domdest, dombb);
+
+ set_immediate_dominator (CDI_DOMINATORS, dest, dom);
+
+ /* Remove BB since all of BB's incoming edges have been redirected
+ to DEST. */
+ delete_basic_block (bb);
+}
+
+/* This pass merges PHI nodes if one feeds into another. For example,
+ suppose we have the following:
+
+ goto <bb 9> (<L9>);
+
+<L8>:;
+ tem_17 = foo ();
+
+ # tem_6 = PHI <tem_17(8), tem_23(7)>;
+<L9>:;
+
+ # tem_3 = PHI <tem_6(9), tem_2(5)>;
+<L10>:;
+
+ Then we merge the first PHI node into the second one like so:
+
+ goto <bb 9> (<L10>);
+
+<L8>:;
+ tem_17 = foo ();
+
+ # tem_3 = PHI <tem_23(7), tem_2(5), tem_17(8)>;
+<L10>:;
+*/
+
+static void
+merge_phi_nodes (void)
+{
+ basic_block *worklist = xmalloc (sizeof (basic_block) * n_basic_blocks);
+ basic_block *current = worklist;
+ basic_block bb;
+
+ calculate_dominance_info (CDI_DOMINATORS);
+
+ /* Find all PHI nodes that we may be able to merge. */
+ FOR_EACH_BB (bb)
+ {
+ basic_block dest;
+
+ /* Look for a forwarder block with PHI nodes. */
+ if (!tree_forwarder_block_p (bb, true))
+ continue;
+
+ dest = single_succ (bb);
+
+ /* We have to feed into another basic block with PHI
+ nodes. */
+ if (!phi_nodes (dest)
+ /* We don't want to deal with a basic block with
+ abnormal edges. */
+ || has_abnormal_incoming_edge_p (bb))
+ continue;
+
+ if (!dominated_by_p (CDI_DOMINATORS, dest, bb))
+ {
+ /* If BB does not dominate DEST, then the PHI nodes at
+ DEST must be the only users of the results of the PHI
+ nodes at BB. */
+ *current++ = bb;
+ }
+ }
+
+ /* Now let's drain WORKLIST. */
+ while (current != worklist)
+ {
+ bb = *--current;
+ remove_forwarder_block_with_phi (bb);
+ }
+
+ free (worklist);
+}
+
+static bool
+gate_merge_phi (void)
+{
+ return 1;
+}
+
+struct tree_opt_pass pass_merge_phi = {
+ "mergephi", /* name */
+ gate_merge_phi, /* gate */
+ merge_phi_nodes, /* execute */
+ NULL, /* sub */
+ NULL, /* next */
+ 0, /* static_pass_number */
+ TV_TREE_MERGE_PHI, /* tv_id */
+ PROP_cfg | PROP_ssa, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ TODO_dump_func | TODO_ggc_collect /* todo_flags_finish */
+ | TODO_verify_ssa,
+ 0 /* letter */
+};
diff --git a/gcc/tree-chrec.c b/gcc/tree-chrec.c
index cb72df0aad3..ee171506140 100644
--- a/gcc/tree-chrec.c
+++ b/gcc/tree-chrec.c
@@ -28,11 +28,12 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
#include "tree.h"
#include "diagnostic.h"
#include "varray.h"
+#include "cfgloop.h"
+#include "tree-flow.h"
#include "tree-chrec.h"
#include "tree-pass.h"
#include "params.h"
@@ -294,7 +295,9 @@ chrec_fold_plus_1 (enum tree_code code,
&& size < PARAM_VALUE (PARAM_SCEV_MAX_EXPR_SIZE))
return build2 (code, type, op0, op1);
else if (size < PARAM_VALUE (PARAM_SCEV_MAX_EXPR_SIZE))
- return fold_build2 (code, type, op0, op1);
+ return fold_build2 (code, type,
+ fold_convert (type, op0),
+ fold_convert (type, op1));
else
return chrec_dont_know;
}
@@ -724,12 +727,16 @@ reset_evolution_in_loop (unsigned loop_num,
{
if (TREE_CODE (chrec) == POLYNOMIAL_CHREC
&& CHREC_VARIABLE (chrec) > loop_num)
- return build2
- (TREE_CODE (chrec),
- build_int_cst (NULL_TREE, CHREC_VARIABLE (chrec)),
- reset_evolution_in_loop (loop_num, CHREC_LEFT (chrec), new_evol),
- reset_evolution_in_loop (loop_num, CHREC_RIGHT (chrec), new_evol));
-
+ {
+ tree left = reset_evolution_in_loop (loop_num, CHREC_LEFT (chrec),
+ new_evol);
+ tree right = reset_evolution_in_loop (loop_num, CHREC_RIGHT (chrec),
+ new_evol);
+ return build3 (POLYNOMIAL_CHREC, TREE_TYPE (left),
+ build_int_cst (NULL_TREE, CHREC_VARIABLE (chrec)),
+ left, right);
+ }
+
while (TREE_CODE (chrec) == POLYNOMIAL_CHREC
&& CHREC_VARIABLE (chrec) == loop_num)
chrec = CHREC_LEFT (chrec);
@@ -904,6 +911,57 @@ tree_contains_chrecs (tree expr, int *size)
}
}
+/* Recursive helper function. */
+
+static bool
+evolution_function_is_invariant_rec_p (tree chrec, int loopnum)
+{
+ if (evolution_function_is_constant_p (chrec))
+ return true;
+
+ if (TREE_CODE (chrec) == SSA_NAME
+ && expr_invariant_in_loop_p (current_loops->parray[loopnum],
+ chrec))
+ return true;
+
+ if (TREE_CODE (chrec) == POLYNOMIAL_CHREC
+ && CHREC_VARIABLE (chrec) == (unsigned) loopnum)
+ return false;
+
+ switch (TREE_CODE_LENGTH (TREE_CODE (chrec)))
+ {
+ case 2:
+ if (!evolution_function_is_invariant_rec_p (TREE_OPERAND (chrec, 1),
+ loopnum))
+ return false;
+
+ case 1:
+ if (!evolution_function_is_invariant_rec_p (TREE_OPERAND (chrec, 0),
+ loopnum))
+ return false;
+ return true;
+
+ default:
+ return false;
+ }
+
+ return false;
+}
+
+/* Return true if CHREC is invariant in loop LOOPNUM, false otherwise. */
+
+bool
+evolution_function_is_invariant_p (tree chrec, int loopnum)
+{
+ if (evolution_function_is_constant_p (chrec))
+ return true;
+
+ if (current_loops != NULL)
+ return evolution_function_is_invariant_rec_p (chrec, loopnum);
+
+ return false;
+}
+
/* Determine whether the given tree is an affine multivariate
evolution. */
@@ -1014,11 +1072,17 @@ nb_vars_in_chrec (tree chrec)
-/* Convert CHREC to TYPE. The following is rule is always true:
- TREE_TYPE (chrec) == TREE_TYPE (CHREC_LEFT (chrec)) == TREE_TYPE
- (CHREC_RIGHT (chrec)). An example of what could happen when adding
- two chrecs and the type of the CHREC_RIGHT is different than
- CHREC_LEFT is:
+/* Convert CHREC to TYPE. When the analyzer knows the context in
+ which the CHREC is built, it sets AT_STMT to the statement that
+ contains the definition of the analyzed variable, otherwise the
+ conversion is less accurate: the information is used for
+ determining a more accurate estimation of the number of iterations.
+ By default AT_STMT could be safely set to NULL_TREE.
+
+ The following rule is always true: TREE_TYPE (chrec) ==
+ TREE_TYPE (CHREC_LEFT (chrec)) == TREE_TYPE (CHREC_RIGHT (chrec)).
+ An example of what could happen when adding two chrecs and the type
+ of the CHREC_RIGHT is different than CHREC_LEFT is:
{(uint) 0, +, (uchar) 10} +
{(uint) 0, +, (uchar) 250}
@@ -1033,11 +1097,10 @@ nb_vars_in_chrec (tree chrec)
*/
tree
-chrec_convert (tree type,
- tree chrec)
+chrec_convert (tree type, tree chrec, tree at_stmt)
{
- tree ct;
-
+ tree ct, res;
+
if (automatically_generated_chrec_p (chrec))
return chrec;
@@ -1045,43 +1108,44 @@ chrec_convert (tree type,
if (ct == type)
return chrec;
- if (TYPE_PRECISION (ct) < TYPE_PRECISION (type))
- return count_ev_in_wider_type (type, chrec);
-
- switch (TREE_CODE (chrec))
+ if (evolution_function_is_affine_p (chrec))
{
- case POLYNOMIAL_CHREC:
+ tree step = convert_step (current_loops->parray[CHREC_VARIABLE (chrec)],
+ type, CHREC_LEFT (chrec), CHREC_RIGHT (chrec),
+ at_stmt);
+ if (!step)
+ return fold_convert (type, chrec);
+
return build_polynomial_chrec (CHREC_VARIABLE (chrec),
- chrec_convert (type,
- CHREC_LEFT (chrec)),
- chrec_convert (type,
- CHREC_RIGHT (chrec)));
+ chrec_convert (type, CHREC_LEFT (chrec),
+ at_stmt),
+ step);
+ }
- default:
- {
- tree res = fold_convert (type, chrec);
+ if (TREE_CODE (chrec) == POLYNOMIAL_CHREC)
+ return chrec_dont_know;
- /* Don't propagate overflows. */
- if (CONSTANT_CLASS_P (res))
- {
- TREE_CONSTANT_OVERFLOW (res) = 0;
- TREE_OVERFLOW (res) = 0;
- }
+ res = fold_convert (type, chrec);
- /* But reject constants that don't fit in their type after conversion.
- This can happen if TYPE_MIN_VALUE or TYPE_MAX_VALUE are not the
- natural values associated with TYPE_PRECISION and TYPE_UNSIGNED,
- and can cause problems later when computing niters of loops. Note
- that we don't do the check before converting because we don't want
- to reject conversions of negative chrecs to unsigned types. */
- if (TREE_CODE (res) == INTEGER_CST
- && TREE_CODE (type) == INTEGER_TYPE
- && !int_fits_type_p (res, type))
- res = chrec_dont_know;
-
- return res;
- }
+ /* Don't propagate overflows. */
+ if (CONSTANT_CLASS_P (res))
+ {
+ TREE_CONSTANT_OVERFLOW (res) = 0;
+ TREE_OVERFLOW (res) = 0;
}
+
+ /* But reject constants that don't fit in their type after conversion.
+ This can happen if TYPE_MIN_VALUE or TYPE_MAX_VALUE are not the
+ natural values associated with TYPE_PRECISION and TYPE_UNSIGNED,
+ and can cause problems later when computing niters of loops. Note
+ that we don't do the check before converting because we don't want
+ to reject conversions of negative chrecs to unsigned types. */
+ if (TREE_CODE (res) == INTEGER_CST
+ && TREE_CODE (type) == INTEGER_TYPE
+ && !int_fits_type_p (res, type))
+ res = chrec_dont_know;
+
+ return res;
}
/* Returns the type of the chrec. */
diff --git a/gcc/tree-chrec.h b/gcc/tree-chrec.h
index d101c9b14c7..723c8918e28 100644
--- a/gcc/tree-chrec.h
+++ b/gcc/tree-chrec.h
@@ -67,8 +67,7 @@ tree_is_chrec (tree expr)
extern tree chrec_fold_plus (tree, tree, tree);
extern tree chrec_fold_minus (tree, tree, tree);
extern tree chrec_fold_multiply (tree, tree, tree);
-extern tree chrec_convert (tree, tree);
-extern tree count_ev_in_wider_type (tree, tree);
+extern tree chrec_convert (tree, tree, tree);
extern tree chrec_type (tree);
/* Operations. */
@@ -146,6 +145,7 @@ evolution_function_is_constant_p (tree chrec)
}
}
+extern bool evolution_function_is_invariant_p (tree, int);
/* Determine whether the given tree is an affine evolution function or not. */
static inline bool
@@ -157,8 +157,10 @@ evolution_function_is_affine_p (tree chrec)
switch (TREE_CODE (chrec))
{
case POLYNOMIAL_CHREC:
- if (evolution_function_is_constant_p (CHREC_LEFT (chrec))
- && evolution_function_is_constant_p (CHREC_RIGHT (chrec)))
+ if (evolution_function_is_invariant_p (CHREC_LEFT (chrec),
+ CHREC_VARIABLE (chrec))
+ && evolution_function_is_invariant_p (CHREC_RIGHT (chrec),
+ CHREC_VARIABLE (chrec)))
return true;
else
return false;
diff --git a/gcc/tree-complex.c b/gcc/tree-complex.c
index 97951d0be95..1fa76a900c3 100644
--- a/gcc/tree-complex.c
+++ b/gcc/tree-complex.c
@@ -1,4 +1,4 @@
-/* Lower complex number and vector operations to scalar operations.
+/* Lower complex number operations to scalar operations.
Copyright (C) 2004, 2005 Free Software Foundation, Inc.
This file is part of GCC.
@@ -21,54 +21,449 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "config.h"
#include "system.h"
#include "coretypes.h"
-#include "tree.h"
#include "tm.h"
+#include "tree.h"
#include "rtl.h"
-#include "expr.h"
-#include "insn-codes.h"
-#include "diagnostic.h"
-#include "optabs.h"
-#include "machmode.h"
-#include "langhooks.h"
+#include "real.h"
+#include "flags.h"
#include "tree-flow.h"
#include "tree-gimple.h"
#include "tree-iterator.h"
#include "tree-pass.h"
-#include "flags.h"
-#include "ggc.h"
+#include "tree-ssa-propagate.h"
+
+
+/* For each complex ssa name, a lattice value. We're interested in finding
+ out whether a complex number is degenerate in some way, having only real
+ or only complex parts. */
+
+typedef enum
+{
+ UNINITIALIZED = 0,
+ ONLY_REAL = 1,
+ ONLY_IMAG = 2,
+ VARYING = 3
+} complex_lattice_t;
+
+#define PAIR(a, b) ((a) << 2 | (b))
+
+DEF_VEC_I(complex_lattice_t);
+DEF_VEC_ALLOC_I(complex_lattice_t, heap);
+
+static VEC(complex_lattice_t, heap) *complex_lattice_values;
+
+/* For each complex variable, a pair of variables for the components. */
+static VEC(tree, heap) *complex_variable_components;
+
+
+/* Return true if T is not a zero constant. In the case of real values,
+ we're only interested in +0.0. */
+
+static int
+some_nonzerop (tree t)
+{
+ int zerop = false;
+
+ if (TREE_CODE (t) == REAL_CST)
+ zerop = REAL_VALUES_IDENTICAL (TREE_REAL_CST (t), dconst0);
+ else if (TREE_CODE (t) == INTEGER_CST)
+ zerop = integer_zerop (t);
+
+ return !zerop;
+}
+
+/* Compute a lattice value from T. It may be a gimple_val, or, as a
+ special exception, a COMPLEX_EXPR. */
+
+static complex_lattice_t
+find_lattice_value (tree t)
+{
+ tree real, imag;
+ int r, i;
+ complex_lattice_t ret;
+
+ switch (TREE_CODE (t))
+ {
+ case SSA_NAME:
+ return VEC_index (complex_lattice_t, complex_lattice_values,
+ SSA_NAME_VERSION (t));
+
+ case COMPLEX_CST:
+ real = TREE_REALPART (t);
+ imag = TREE_IMAGPART (t);
+ break;
+
+ case COMPLEX_EXPR:
+ real = TREE_OPERAND (t, 0);
+ imag = TREE_OPERAND (t, 1);
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+
+ r = some_nonzerop (real);
+ i = some_nonzerop (imag);
+ ret = r*ONLY_REAL + i*ONLY_IMAG;
+
+ /* ??? On occasion we could do better than mapping 0+0i to real, but we
+ certainly don't want to leave it UNINITIALIZED, which eventually gets
+ mapped to VARYING. */
+ if (ret == UNINITIALIZED)
+ ret = ONLY_REAL;
+
+ return ret;
+}
+
+/* Determine if LHS is something for which we're interested in seeing
+ simulation results. */
+
+static bool
+is_complex_reg (tree lhs)
+{
+ return TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE && is_gimple_reg (lhs);
+}
+
+/* Mark the incoming parameters to the function as VARYING. */
+
+static void
+init_parameter_lattice_values (void)
+{
+ tree parm;
+
+ for (parm = DECL_ARGUMENTS (cfun->decl); parm ; parm = TREE_CHAIN (parm))
+ if (is_complex_reg (parm) && var_ann (parm) != NULL)
+ {
+ tree ssa_name = default_def (parm);
+ VEC_replace (complex_lattice_t, complex_lattice_values,
+ SSA_NAME_VERSION (ssa_name), VARYING);
+ }
+}
+
+/* Initialize DONT_SIMULATE_AGAIN for each stmt and phi. Return false if
+ we found no statements we want to simulate, and thus there's nothing for
+ the entire pass to do. */
+
+static bool
+init_dont_simulate_again (void)
+{
+ basic_block bb;
+ block_stmt_iterator bsi;
+ tree phi;
+ bool saw_a_complex_value = false;
+
+ FOR_EACH_BB (bb)
+ {
+ for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
+ DONT_SIMULATE_AGAIN (phi) = !is_complex_reg (PHI_RESULT (phi));
+
+ for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
+ {
+ tree stmt = bsi_stmt (bsi);
+ bool dsa = true;
+
+ if (TREE_CODE (stmt) == MODIFY_EXPR
+ && is_complex_reg (TREE_OPERAND (stmt, 0)))
+ {
+ dsa = false;
+ saw_a_complex_value = true;
+ }
+
+ DONT_SIMULATE_AGAIN (stmt) = dsa;
+ }
+ }
+
+ return saw_a_complex_value;
+}
+
+
+/* Evaluate statement STMT against the complex lattice defined above. */
+
+static enum ssa_prop_result
+complex_visit_stmt (tree stmt, edge *taken_edge_p ATTRIBUTE_UNUSED,
+ tree *result_p)
+{
+ complex_lattice_t new_l, old_l, op1_l, op2_l;
+ unsigned int ver;
+ tree lhs, rhs;
+
+ /* These conditions should be satisfied due to the initial filter
+ set up in init_dont_simulate_again. */
+ gcc_assert (TREE_CODE (stmt) == MODIFY_EXPR);
+
+ lhs = TREE_OPERAND (stmt, 0);
+ rhs = TREE_OPERAND (stmt, 1);
+
+ gcc_assert (TREE_CODE (lhs) == SSA_NAME);
+ gcc_assert (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE);
+
+ *result_p = lhs;
+ ver = SSA_NAME_VERSION (lhs);
+ old_l = VEC_index (complex_lattice_t, complex_lattice_values, ver);
+
+ switch (TREE_CODE (rhs))
+ {
+ case SSA_NAME:
+ case COMPLEX_EXPR:
+ case COMPLEX_CST:
+ new_l = find_lattice_value (rhs);
+ break;
+
+ case PLUS_EXPR:
+ case MINUS_EXPR:
+ op1_l = find_lattice_value (TREE_OPERAND (rhs, 0));
+ op2_l = find_lattice_value (TREE_OPERAND (rhs, 1));
+
+ /* We've set up the lattice values such that IOR neatly
+ models addition. */
+ new_l = op1_l | op2_l;
+ break;
+
+ case MULT_EXPR:
+ case RDIV_EXPR:
+ case TRUNC_DIV_EXPR:
+ case CEIL_DIV_EXPR:
+ case FLOOR_DIV_EXPR:
+ case ROUND_DIV_EXPR:
+ op1_l = find_lattice_value (TREE_OPERAND (rhs, 0));
+ op2_l = find_lattice_value (TREE_OPERAND (rhs, 1));
+
+ /* Obviously, if either varies, so does the result. */
+ if (op1_l == VARYING || op2_l == VARYING)
+ new_l = VARYING;
+ /* Don't prematurely promote variables if we've not yet seen
+ their inputs. */
+ else if (op1_l == UNINITIALIZED)
+ new_l = op2_l;
+ else if (op2_l == UNINITIALIZED)
+ new_l = op1_l;
+ else
+ {
+ /* At this point both numbers have only one component. If the
+ numbers are of opposite kind, the result is imaginary,
+ otherwise the result is real. The add/subtract translates
+ the real/imag from/to 0/1; the ^ performs the comparison. */
+ new_l = ((op1_l - ONLY_REAL) ^ (op2_l - ONLY_REAL)) + ONLY_REAL;
+
+ /* Don't allow the lattice value to flip-flop indefinitely. */
+ new_l |= old_l;
+ }
+ break;
+
+ case NEGATE_EXPR:
+ case CONJ_EXPR:
+ new_l = find_lattice_value (TREE_OPERAND (rhs, 0));
+ break;
+
+ default:
+ new_l = VARYING;
+ break;
+ }
+
+ /* If nothing changed this round, let the propagator know. */
+ if (new_l == old_l)
+ return SSA_PROP_NOT_INTERESTING;
+
+ VEC_replace (complex_lattice_t, complex_lattice_values, ver, new_l);
+ return new_l == VARYING ? SSA_PROP_VARYING : SSA_PROP_INTERESTING;
+}
+
+/* Evaluate a PHI node against the complex lattice defined above. */
+
+static enum ssa_prop_result
+complex_visit_phi (tree phi)
+{
+ complex_lattice_t new_l, old_l;
+ unsigned int ver;
+ tree lhs;
+ int i;
+
+ lhs = PHI_RESULT (phi);
+
+ /* This condition should be satisfied due to the initial filter
+ set up in init_dont_simulate_again. */
+ gcc_assert (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE);
+
+ /* We've set up the lattice values such that IOR neatly models PHI meet. */
+ new_l = UNINITIALIZED;
+ for (i = PHI_NUM_ARGS (phi) - 1; i >= 0; --i)
+ new_l |= find_lattice_value (PHI_ARG_DEF (phi, i));
+
+ ver = SSA_NAME_VERSION (lhs);
+ old_l = VEC_index (complex_lattice_t, complex_lattice_values, ver);
+
+ if (new_l == old_l)
+ return SSA_PROP_NOT_INTERESTING;
+
+ VEC_replace (complex_lattice_t, complex_lattice_values, ver, new_l);
+ return new_l == VARYING ? SSA_PROP_VARYING : SSA_PROP_INTERESTING;
+}
+
+/* For each referenced complex gimple register, set up a pair of registers
+ to hold the components of the complex value. */
+
+static void
+create_components (void)
+{
+ size_t k, n;
+
+ n = num_referenced_vars;
+ complex_variable_components = VEC_alloc (tree, heap, 2*n);
+ VEC_safe_grow (tree, heap, complex_variable_components, 2*n);
+
+ for (k = 0; k < n; ++k)
+ {
+ tree var = referenced_var (k);
+ tree r = NULL, i = NULL;
+ if (var != NULL
+ && TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE
+ && is_gimple_reg (var))
+ {
+ tree inner_type = TREE_TYPE (TREE_TYPE (var));
+
+ r = make_rename_temp (inner_type, "CR");
+ i = make_rename_temp (inner_type, "CI");
+ DECL_SOURCE_LOCATION (r) = DECL_SOURCE_LOCATION (var);
+ DECL_SOURCE_LOCATION (i) = DECL_SOURCE_LOCATION (var);
+ DECL_ARTIFICIAL (r) = 1;
+ DECL_ARTIFICIAL (i) = 1;
+
+ if (DECL_NAME (var) && !DECL_IGNORED_P (var))
+ {
+ const char *name = IDENTIFIER_POINTER (DECL_NAME (var));
+
+ DECL_NAME (r) = get_identifier (ACONCAT ((name, "$real", NULL)));
+ DECL_NAME (i) = get_identifier (ACONCAT ((name, "$imag", NULL)));
+
+ SET_DECL_DEBUG_EXPR (r, build1 (REALPART_EXPR, inner_type, var));
+ SET_DECL_DEBUG_EXPR (i, build1 (IMAGPART_EXPR, inner_type, var));
+ DECL_DEBUG_EXPR_IS_FROM (r) = 1;
+ DECL_DEBUG_EXPR_IS_FROM (i) = 1;
+
+ DECL_IGNORED_P (r) = 0;
+ DECL_IGNORED_P (i) = 0;
+
+ TREE_NO_WARNING (r) = TREE_NO_WARNING (var);
+ TREE_NO_WARNING (i) = TREE_NO_WARNING (var);
+ }
+ else
+ {
+ DECL_IGNORED_P (r) = 1;
+ DECL_IGNORED_P (i) = 1;
+ TREE_NO_WARNING (r) = 1;
+ TREE_NO_WARNING (i) = 1;
+ }
+ }
+
+ VEC_replace (tree, complex_variable_components, 2*k, r);
+ VEC_replace (tree, complex_variable_components, 2*k + 1, i);
+ }
+}
/* Extract the real or imaginary part of a complex variable or constant.
Make sure that it's a proper gimple_val and gimplify it if not.
Emit any new code before BSI. */
static tree
-extract_component (block_stmt_iterator *bsi, tree t, bool imagpart_p)
+extract_component (block_stmt_iterator *bsi, tree t, bool imagpart_p,
+ bool gimple_p)
{
- tree ret, inner_type;
-
- inner_type = TREE_TYPE (TREE_TYPE (t));
switch (TREE_CODE (t))
{
case COMPLEX_CST:
- ret = (imagpart_p ? TREE_IMAGPART (t) : TREE_REALPART (t));
- break;
+ return imagpart_p ? TREE_IMAGPART (t) : TREE_REALPART (t);
case COMPLEX_EXPR:
- ret = TREE_OPERAND (t, imagpart_p);
- break;
+ return TREE_OPERAND (t, imagpart_p);
case VAR_DECL:
case PARM_DECL:
- ret = build1 ((imagpart_p ? IMAGPART_EXPR : REALPART_EXPR),
- inner_type, t);
- break;
+ case INDIRECT_REF:
+ case COMPONENT_REF:
+ case ARRAY_REF:
+ {
+ tree inner_type = TREE_TYPE (TREE_TYPE (t));
+
+ t = build1 ((imagpart_p ? IMAGPART_EXPR : REALPART_EXPR),
+ inner_type, unshare_expr (t));
+
+ if (gimple_p)
+ t = gimplify_val (bsi, inner_type, t);
+
+ return t;
+ }
+
+ case SSA_NAME:
+ {
+ tree def = SSA_NAME_DEF_STMT (t);
+
+ if (TREE_CODE (def) == MODIFY_EXPR)
+ {
+ def = TREE_OPERAND (def, 1);
+ if (TREE_CODE (def) == COMPLEX_CST)
+ return imagpart_p ? TREE_IMAGPART (def) : TREE_REALPART (def);
+ if (TREE_CODE (def) == COMPLEX_EXPR)
+ {
+ def = TREE_OPERAND (def, imagpart_p);
+ if (TREE_CONSTANT (def))
+ return def;
+ }
+ }
+
+ return VEC_index (tree, complex_variable_components,
+ var_ann (SSA_NAME_VAR (t))->uid * 2 + imagpart_p);
+ }
default:
gcc_unreachable ();
}
+}
- return gimplify_val (bsi, inner_type, ret);
+/* Update the complex components of the ssa name on the lhs of STMT. */
+
+static void
+update_complex_components (block_stmt_iterator *bsi, tree stmt, tree r, tree i)
+{
+ unsigned int uid = var_ann (SSA_NAME_VAR (TREE_OPERAND (stmt, 0)))->uid;
+ tree v, x;
+
+ v = VEC_index (tree, complex_variable_components, 2*uid);
+ x = build2 (MODIFY_EXPR, TREE_TYPE (v), v, r);
+ SET_EXPR_LOCUS (x, EXPR_LOCUS (stmt));
+ TREE_BLOCK (x) = TREE_BLOCK (stmt);
+ bsi_insert_after (bsi, x, BSI_NEW_STMT);
+
+ v = VEC_index (tree, complex_variable_components, 2*uid + 1);
+ x = build2 (MODIFY_EXPR, TREE_TYPE (v), v, i);
+ SET_EXPR_LOCUS (x, EXPR_LOCUS (stmt));
+ TREE_BLOCK (x) = TREE_BLOCK (stmt);
+ bsi_insert_after (bsi, x, BSI_NEW_STMT);
+}
+
+static void
+update_complex_components_on_edge (edge e, tree stmt, tree lhs, tree r, tree i)
+{
+ unsigned int uid = var_ann (SSA_NAME_VAR (lhs))->uid;
+ tree v, x;
+
+ v = VEC_index (tree, complex_variable_components, 2*uid);
+ x = build2 (MODIFY_EXPR, TREE_TYPE (v), v, r);
+ if (stmt)
+ {
+ SET_EXPR_LOCUS (x, EXPR_LOCUS (stmt));
+ TREE_BLOCK (x) = TREE_BLOCK (stmt);
+ }
+ bsi_insert_on_edge (e, x);
+
+ v = VEC_index (tree, complex_variable_components, 2*uid + 1);
+ x = build2 (MODIFY_EXPR, TREE_TYPE (v), v, i);
+ if (stmt)
+ {
+ SET_EXPR_LOCUS (x, EXPR_LOCUS (stmt));
+ TREE_BLOCK (x) = TREE_BLOCK (stmt);
+ }
+ bsi_insert_on_edge (e, x);
}
/* Update an assignment to a complex variable in place. */
@@ -76,15 +471,164 @@ extract_component (block_stmt_iterator *bsi, tree t, bool imagpart_p)
static void
update_complex_assignment (block_stmt_iterator *bsi, tree r, tree i)
{
- tree stmt = bsi_stmt (*bsi);
+ tree stmt, mod;
tree type;
+ mod = stmt = bsi_stmt (*bsi);
if (TREE_CODE (stmt) == RETURN_EXPR)
- stmt = TREE_OPERAND (stmt, 0);
+ mod = TREE_OPERAND (mod, 0);
+ else if (in_ssa_p)
+ update_complex_components (bsi, stmt, r, i);
- type = TREE_TYPE (TREE_OPERAND (stmt, 1));
- TREE_OPERAND (stmt, 1) = build (COMPLEX_EXPR, type, r, i);
- mark_stmt_modified (stmt);
+ type = TREE_TYPE (TREE_OPERAND (mod, 1));
+ TREE_OPERAND (mod, 1) = build (COMPLEX_EXPR, type, r, i);
+ update_stmt (stmt);
+}
+
+/* Generate code at the entry point of the function to initialize the
+ component variables for a complex parameter. */
+
+static void
+update_parameter_components (void)
+{
+ edge entry_edge = single_succ_edge (ENTRY_BLOCK_PTR);
+ tree parm;
+
+ for (parm = DECL_ARGUMENTS (cfun->decl); parm ; parm = TREE_CHAIN (parm))
+ {
+ tree type = TREE_TYPE (parm);
+ tree ssa_name, r, i;
+
+ if (TREE_CODE (type) != COMPLEX_TYPE || !is_gimple_reg (parm))
+ continue;
+
+ type = TREE_TYPE (type);
+ ssa_name = default_def (parm);
+
+ r = build1 (REALPART_EXPR, type, ssa_name);
+ i = build1 (IMAGPART_EXPR, type, ssa_name);
+ update_complex_components_on_edge (entry_edge, NULL, ssa_name, r, i);
+ }
+}
+
+/* Generate code to set the component variables of a complex variable
+ to match the PHI statements in block BB. */
+
+static void
+update_phi_components (basic_block bb)
+{
+ tree phi;
+
+ for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
+ if (is_complex_reg (PHI_RESULT (phi)))
+ {
+ unsigned int i, n;
+ tree lhs = PHI_RESULT (phi);
+
+ for (i = 0, n = PHI_NUM_ARGS (phi); i < n; ++i)
+ {
+ edge e = PHI_ARG_EDGE (phi, i);
+ tree arg = PHI_ARG_DEF (phi, i);
+ tree r, i;
+
+ r = extract_component (NULL, arg, 0, false);
+ i = extract_component (NULL, arg, 1, false);
+ update_complex_components_on_edge (e, NULL, lhs, r, i);
+ }
+ }
+}
+
+/* Mark each virtual op in STMT for ssa update. */
+
+static void
+update_all_vops (tree stmt)
+{
+ ssa_op_iter iter;
+ tree sym;
+
+ FOR_EACH_SSA_TREE_OPERAND (sym, stmt, iter, SSA_OP_ALL_VIRTUALS)
+ {
+ if (TREE_CODE (sym) == SSA_NAME)
+ sym = SSA_NAME_VAR (sym);
+ mark_sym_for_renaming (sym);
+ }
+}
+
+/* Expand a complex move to scalars. */
+
+static void
+expand_complex_move (block_stmt_iterator *bsi, tree stmt, tree type,
+ tree lhs, tree rhs)
+{
+ tree inner_type = TREE_TYPE (type);
+ tree r, i;
+
+ if (TREE_CODE (lhs) == SSA_NAME)
+ {
+ if (is_ctrl_altering_stmt (bsi_stmt (*bsi)))
+ {
+ edge_iterator ei;
+ edge e;
+
+ /* The value is not assigned on the exception edges, so we need not
+ concern ourselves there. We do need to update on the fallthru
+ edge. Find it. */
+ FOR_EACH_EDGE (e, ei, bsi->bb->succs)
+ if (e->flags & EDGE_FALLTHRU)
+ goto found_fallthru;
+ gcc_unreachable ();
+ found_fallthru:
+
+ r = build1 (REALPART_EXPR, inner_type, lhs);
+ i = build1 (IMAGPART_EXPR, inner_type, lhs);
+ update_complex_components_on_edge (e, stmt, lhs, r, i);
+ }
+ else if (TREE_CODE (rhs) == CALL_EXPR || TREE_SIDE_EFFECTS (rhs))
+ {
+ r = build1 (REALPART_EXPR, inner_type, lhs);
+ i = build1 (IMAGPART_EXPR, inner_type, lhs);
+ update_complex_components (bsi, stmt, r, i);
+ }
+ else
+ {
+ update_all_vops (bsi_stmt (*bsi));
+ r = extract_component (bsi, rhs, 0, true);
+ i = extract_component (bsi, rhs, 1, true);
+ update_complex_assignment (bsi, r, i);
+ }
+ }
+ else if (TREE_CODE (rhs) == SSA_NAME && !TREE_SIDE_EFFECTS (lhs))
+ {
+ tree x;
+
+ r = extract_component (bsi, rhs, 0, false);
+ i = extract_component (bsi, rhs, 1, false);
+
+ x = build1 (REALPART_EXPR, inner_type, unshare_expr (lhs));
+ x = build2 (MODIFY_EXPR, inner_type, x, r);
+ bsi_insert_before (bsi, x, BSI_SAME_STMT);
+
+ if (stmt == bsi_stmt (*bsi))
+ {
+ x = build1 (IMAGPART_EXPR, inner_type, unshare_expr (lhs));
+ TREE_OPERAND (stmt, 0) = x;
+ TREE_OPERAND (stmt, 1) = i;
+ TREE_TYPE (stmt) = inner_type;
+ }
+ else
+ {
+ x = build1 (IMAGPART_EXPR, inner_type, unshare_expr (lhs));
+ x = build2 (MODIFY_EXPR, inner_type, x, i);
+ bsi_insert_before (bsi, x, BSI_SAME_STMT);
+
+ stmt = bsi_stmt (*bsi);
+ gcc_assert (TREE_CODE (stmt) == RETURN_EXPR);
+ TREE_OPERAND (stmt, 0) = lhs;
+ }
+
+ update_all_vops (stmt);
+ update_stmt (stmt);
+ }
}
/* Expand complex addition to scalars:
@@ -95,12 +639,72 @@ update_complex_assignment (block_stmt_iterator *bsi, tree r, tree i)
static void
expand_complex_addition (block_stmt_iterator *bsi, tree inner_type,
tree ar, tree ai, tree br, tree bi,
- enum tree_code code)
+ enum tree_code code,
+ complex_lattice_t al, complex_lattice_t bl)
{
tree rr, ri;
- rr = gimplify_build2 (bsi, code, inner_type, ar, br);
- ri = gimplify_build2 (bsi, code, inner_type, ai, bi);
+ switch (PAIR (al, bl))
+ {
+ case PAIR (ONLY_REAL, ONLY_REAL):
+ rr = gimplify_build2 (bsi, code, inner_type, ar, br);
+ ri = ai;
+ break;
+
+ case PAIR (ONLY_REAL, ONLY_IMAG):
+ rr = ar;
+ if (code == MINUS_EXPR)
+ ri = gimplify_build2 (bsi, MINUS_EXPR, inner_type, ai, bi);
+ else
+ ri = bi;
+ break;
+
+ case PAIR (ONLY_IMAG, ONLY_REAL):
+ if (code == MINUS_EXPR)
+ rr = gimplify_build2 (bsi, MINUS_EXPR, inner_type, ar, br);
+ else
+ rr = br;
+ ri = ai;
+ break;
+
+ case PAIR (ONLY_IMAG, ONLY_IMAG):
+ rr = ar;
+ ri = gimplify_build2 (bsi, code, inner_type, ai, bi);
+ break;
+
+ case PAIR (VARYING, ONLY_REAL):
+ rr = gimplify_build2 (bsi, code, inner_type, ar, br);
+ ri = ai;
+ break;
+
+ case PAIR (VARYING, ONLY_IMAG):
+ rr = ar;
+ ri = gimplify_build2 (bsi, MINUS_EXPR, inner_type, ai, bi);
+ break;
+
+ case PAIR (ONLY_REAL, VARYING):
+ if (code == MINUS_EXPR)
+ goto general;
+ rr = gimplify_build2 (bsi, code, inner_type, ar, br);
+ ri = bi;
+ break;
+
+ case PAIR (ONLY_IMAG, VARYING):
+ if (code == MINUS_EXPR)
+ goto general;
+ rr = br;
+ ri = gimplify_build2 (bsi, MINUS_EXPR, inner_type, ai, bi);
+ break;
+
+ case PAIR (VARYING, VARYING):
+ general:
+ rr = gimplify_build2 (bsi, code, inner_type, ar, br);
+ ri = gimplify_build2 (bsi, code, inner_type, ai, bi);
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
update_complex_assignment (bsi, rr, ri);
}
@@ -137,6 +741,14 @@ expand_complex_libcall (block_stmt_iterator *bsi, tree ar, tree ai,
TREE_OPERAND (stmt, 1)
= build3 (CALL_EXPR, type, build_fold_addr_expr (fn), args, NULL);
update_stmt (stmt);
+
+ if (in_ssa_p)
+ {
+ tree lhs = TREE_OPERAND (stmt, 0);
+ update_complex_components (bsi, stmt,
+ build1 (REALPART_EXPR, type, lhs),
+ build1 (IMAGPART_EXPR, type, lhs));
+ }
}
/* Expand complex multiplication to scalars:
@@ -145,29 +757,81 @@ expand_complex_libcall (block_stmt_iterator *bsi, tree ar, tree ai,
static void
expand_complex_multiplication (block_stmt_iterator *bsi, tree inner_type,
- tree ar, tree ai, tree br, tree bi)
+ tree ar, tree ai, tree br, tree bi,
+ complex_lattice_t al, complex_lattice_t bl)
{
- tree t1, t2, t3, t4, rr, ri;
+ tree rr, ri;
- if (flag_complex_method == 2 && SCALAR_FLOAT_TYPE_P (inner_type))
+ if (al < bl)
{
- expand_complex_libcall (bsi, ar, ai, br, bi, MULT_EXPR);
- return;
+ complex_lattice_t tl;
+ rr = ar, ar = br, br = rr;
+ ri = ai, ai = bi, bi = ri;
+ tl = al, al = bl, bl = tl;
}
- t1 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, br);
- t2 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, bi);
- t3 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, bi);
+ switch (PAIR (al, bl))
+ {
+ case PAIR (ONLY_REAL, ONLY_REAL):
+ rr = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, br);
+ ri = ai;
+ break;
- /* Avoid expanding redundant multiplication for the common
- case of squaring a complex number. */
- if (ar == br && ai == bi)
- t4 = t3;
- else
- t4 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, br);
+ case PAIR (ONLY_IMAG, ONLY_REAL):
+ rr = ar;
+ if (TREE_CODE (ai) == REAL_CST
+ && REAL_VALUES_IDENTICAL (TREE_REAL_CST (ai), dconst1))
+ ri = br;
+ else
+ ri = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, br);
+ break;
+
+ case PAIR (ONLY_IMAG, ONLY_IMAG):
+ rr = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, bi);
+ rr = gimplify_build1 (bsi, NEGATE_EXPR, inner_type, rr);
+ ri = ar;
+ break;
- rr = gimplify_build2 (bsi, MINUS_EXPR, inner_type, t1, t2);
- ri = gimplify_build2 (bsi, PLUS_EXPR, inner_type, t3, t4);
+ case PAIR (VARYING, ONLY_REAL):
+ rr = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, br);
+ ri = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, br);
+ break;
+
+ case PAIR (VARYING, ONLY_IMAG):
+ rr = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, bi);
+ rr = gimplify_build1 (bsi, NEGATE_EXPR, inner_type, rr);
+ ri = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, bi);
+ break;
+
+ case PAIR (VARYING, VARYING):
+ if (flag_complex_method == 2 && SCALAR_FLOAT_TYPE_P (inner_type))
+ {
+ expand_complex_libcall (bsi, ar, ai, br, bi, MULT_EXPR);
+ return;
+ }
+ else
+ {
+ tree t1, t2, t3, t4;
+
+ t1 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, br);
+ t2 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, bi);
+ t3 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ar, bi);
+
+ /* Avoid expanding redundant multiplication for the common
+ case of squaring a complex number. */
+ if (ar == br && ai == bi)
+ t4 = t3;
+ else
+ t4 = gimplify_build2 (bsi, MULT_EXPR, inner_type, ai, br);
+
+ rr = gimplify_build2 (bsi, MINUS_EXPR, inner_type, t1, t2);
+ ri = gimplify_build2 (bsi, PLUS_EXPR, inner_type, t3, t4);
+ }
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
update_complex_assignment (bsi, rr, ri);
}
@@ -349,31 +1013,77 @@ expand_complex_div_wide (block_stmt_iterator *bsi, tree inner_type,
static void
expand_complex_division (block_stmt_iterator *bsi, tree inner_type,
tree ar, tree ai, tree br, tree bi,
- enum tree_code code)
+ enum tree_code code,
+ complex_lattice_t al, complex_lattice_t bl)
{
- switch (flag_complex_method)
+ tree rr, ri;
+
+ switch (PAIR (al, bl))
{
- case 0:
- /* straightforward implementation of complex divide acceptable. */
- expand_complex_div_straight (bsi, inner_type, ar, ai, br, bi, code);
+ case PAIR (ONLY_REAL, ONLY_REAL):
+ rr = gimplify_build2 (bsi, code, inner_type, ar, br);
+ ri = ai;
break;
- case 2:
- if (SCALAR_FLOAT_TYPE_P (inner_type))
- {
- expand_complex_libcall (bsi, ar, ai, br, bi, code);
- return;
- }
- /* FALLTHRU */
+ case PAIR (ONLY_REAL, ONLY_IMAG):
+ rr = ai;
+ ri = gimplify_build2 (bsi, code, inner_type, ar, bi);
+ ri = gimplify_build1 (bsi, NEGATE_EXPR, inner_type, ri);
+ break;
+
+ case PAIR (ONLY_IMAG, ONLY_REAL):
+ rr = ar;
+ ri = gimplify_build2 (bsi, code, inner_type, ai, br);
+ break;
- case 1:
- /* wide ranges of inputs must work for complex divide. */
- expand_complex_div_wide (bsi, inner_type, ar, ai, br, bi, code);
+ case PAIR (ONLY_IMAG, ONLY_IMAG):
+ rr = gimplify_build2 (bsi, code, inner_type, ai, bi);
+ ri = ar;
break;
+ case PAIR (VARYING, ONLY_REAL):
+ rr = gimplify_build2 (bsi, code, inner_type, ar, br);
+ ri = gimplify_build2 (bsi, code, inner_type, ai, br);
+ break;
+
+ case PAIR (VARYING, ONLY_IMAG):
+ rr = gimplify_build2 (bsi, code, inner_type, ai, bi);
+ ri = gimplify_build2 (bsi, code, inner_type, ar, bi);
+ ri = gimplify_build1 (bsi, NEGATE_EXPR, inner_type, ri);
+
+ case PAIR (ONLY_REAL, VARYING):
+ case PAIR (ONLY_IMAG, VARYING):
+ case PAIR (VARYING, VARYING):
+ switch (flag_complex_method)
+ {
+ case 0:
+ /* straightforward implementation of complex divide acceptable. */
+ expand_complex_div_straight (bsi, inner_type, ar, ai, br, bi, code);
+ break;
+
+ case 2:
+ if (SCALAR_FLOAT_TYPE_P (inner_type))
+ {
+ expand_complex_libcall (bsi, ar, ai, br, bi, code);
+ break;
+ }
+ /* FALLTHRU */
+
+ case 1:
+ /* wide ranges of inputs must work for complex divide. */
+ expand_complex_div_wide (bsi, inner_type, ar, ai, br, bi, code);
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+ return;
+
default:
gcc_unreachable ();
}
+
+ update_complex_assignment (bsi, rr, ri);
}
/* Expand complex negation to scalars:
@@ -439,7 +1149,7 @@ expand_complex_comparison (block_stmt_iterator *bsi, tree ar, tree ai,
gcc_unreachable ();
}
- mark_stmt_modified (stmt);
+ update_stmt (stmt);
}
/* Process one statement. If we identify a complex operation, expand it. */
@@ -450,6 +1160,7 @@ expand_complex_operations_1 (block_stmt_iterator *bsi)
tree stmt = bsi_stmt (*bsi);
tree rhs, type, inner_type;
tree ac, ar, ai, bc, br, bi;
+ complex_lattice_t al, bl;
enum tree_code code;
switch (TREE_CODE (stmt))
@@ -503,14 +1214,30 @@ expand_complex_operations_1 (block_stmt_iterator *bsi)
break;
default:
+ {
+ tree lhs = TREE_OPERAND (stmt, 0);
+ tree rhs = TREE_OPERAND (stmt, 1);
+
+ if (TREE_CODE (type) == COMPLEX_TYPE)
+ expand_complex_move (bsi, stmt, type, lhs, rhs);
+ else if ((TREE_CODE (rhs) == REALPART_EXPR
+ || TREE_CODE (rhs) == IMAGPART_EXPR)
+ && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME)
+ {
+ TREE_OPERAND (stmt, 1)
+ = extract_component (bsi, TREE_OPERAND (rhs, 0),
+ TREE_CODE (rhs) == IMAGPART_EXPR, false);
+ update_stmt (stmt);
+ }
+ }
return;
}
/* Extract the components of the two complex values. Make sure and
handle the common case of the same value used twice specially. */
ac = TREE_OPERAND (rhs, 0);
- ar = extract_component (bsi, ac, 0);
- ai = extract_component (bsi, ac, 1);
+ ar = extract_component (bsi, ac, 0, true);
+ ai = extract_component (bsi, ac, 1, true);
if (TREE_CODE_CLASS (code) == tcc_unary)
bc = br = bi = NULL;
@@ -521,20 +1248,40 @@ expand_complex_operations_1 (block_stmt_iterator *bsi)
br = ar, bi = ai;
else
{
- br = extract_component (bsi, bc, 0);
- bi = extract_component (bsi, bc, 1);
+ br = extract_component (bsi, bc, 0, true);
+ bi = extract_component (bsi, bc, 1, true);
}
}
+ if (in_ssa_p)
+ {
+ al = find_lattice_value (ac);
+ if (al == UNINITIALIZED)
+ al = VARYING;
+
+ if (TREE_CODE_CLASS (code) == tcc_unary)
+ bl = UNINITIALIZED;
+ else if (ac == bc)
+ bl = al;
+ else
+ {
+ bl = find_lattice_value (bc);
+ if (bl == UNINITIALIZED)
+ bl = VARYING;
+ }
+ }
+ else
+ al = bl = VARYING;
+
switch (code)
{
case PLUS_EXPR:
case MINUS_EXPR:
- expand_complex_addition (bsi, inner_type, ar, ai, br, bi, code);
+ expand_complex_addition (bsi, inner_type, ar, ai, br, bi, code, al, bl);
break;
case MULT_EXPR:
- expand_complex_multiplication (bsi, inner_type, ar, ai, br, bi);
+ expand_complex_multiplication (bsi, inner_type, ar, ai, br, bi, al, bl);
break;
case TRUNC_DIV_EXPR:
@@ -542,7 +1289,7 @@ expand_complex_operations_1 (block_stmt_iterator *bsi)
case FLOOR_DIV_EXPR:
case ROUND_DIV_EXPR:
case RDIV_EXPR:
- expand_complex_division (bsi, inner_type, ar, ai, br, bi, code);
+ expand_complex_division (bsi, inner_type, ar, ai, br, bi, code, al, bl);
break;
case NEGATE_EXPR:
@@ -561,464 +1308,73 @@ expand_complex_operations_1 (block_stmt_iterator *bsi)
default:
gcc_unreachable ();
}
- update_stmt_if_modified (stmt);
-}
-
-/* Build a constant of type TYPE, made of VALUE's bits replicated
- every TYPE_SIZE (INNER_TYPE) bits to fit TYPE's precision. */
-static tree
-build_replicated_const (tree type, tree inner_type, HOST_WIDE_INT value)
-{
- int width = tree_low_cst (TYPE_SIZE (inner_type), 1);
- int n = HOST_BITS_PER_WIDE_INT / width;
- unsigned HOST_WIDE_INT low, high, mask;
- tree ret;
-
- gcc_assert (n);
-
- if (width == HOST_BITS_PER_WIDE_INT)
- low = value;
- else
- {
- mask = ((HOST_WIDE_INT)1 << width) - 1;
- low = (unsigned HOST_WIDE_INT) ~0 / mask * (value & mask);
- }
-
- if (TYPE_PRECISION (type) < HOST_BITS_PER_WIDE_INT)
- low &= ((HOST_WIDE_INT)1 << TYPE_PRECISION (type)) - 1, high = 0;
- else if (TYPE_PRECISION (type) == HOST_BITS_PER_WIDE_INT)
- high = 0;
- else if (TYPE_PRECISION (type) == 2 * HOST_BITS_PER_WIDE_INT)
- high = low;
- else
- gcc_unreachable ();
-
- ret = build_int_cst_wide (type, low, high);
- return ret;
-}
-
-static GTY(()) tree vector_inner_type;
-static GTY(()) tree vector_last_type;
-static GTY(()) int vector_last_nunits;
-
-/* Return a suitable vector types made of SUBPARTS units each of mode
- "word_mode" (the global variable). */
-static tree
-build_word_mode_vector_type (int nunits)
-{
- if (!vector_inner_type)
- vector_inner_type = lang_hooks.types.type_for_mode (word_mode, 1);
- else if (vector_last_nunits == nunits)
- {
- gcc_assert (TREE_CODE (vector_last_type) == VECTOR_TYPE);
- return vector_last_type;
- }
-
- /* We build a new type, but we canonicalize it nevertheless,
- because it still saves some memory. */
- vector_last_nunits = nunits;
- vector_last_type = type_hash_canon (nunits,
- build_vector_type (vector_inner_type,
- nunits));
- return vector_last_type;
-}
-
-typedef tree (*elem_op_func) (block_stmt_iterator *,
- tree, tree, tree, tree, tree, enum tree_code);
-
-static inline tree
-tree_vec_extract (block_stmt_iterator *bsi, tree type,
- tree t, tree bitsize, tree bitpos)
-{
- if (bitpos)
- return gimplify_build3 (bsi, BIT_FIELD_REF, type, t, bitsize, bitpos);
-
- /* Build a conversion; VIEW_CONVERT_EXPR is very expensive unless T will
- anyway be stored in memory, so prefer NOP_EXPR. */
- else if (TYPE_MODE (type) == BLKmode)
- return gimplify_build1 (bsi, VIEW_CONVERT_EXPR, type, t);
- else
- return gimplify_build1 (bsi, NOP_EXPR, type, t);
-}
-
-static tree
-do_unop (block_stmt_iterator *bsi, tree inner_type, tree a,
- tree b ATTRIBUTE_UNUSED, tree bitpos, tree bitsize,
- enum tree_code code)
-{
- a = tree_vec_extract (bsi, inner_type, a, bitsize, bitpos);
- return gimplify_build1 (bsi, code, inner_type, a);
-}
-
-static tree
-do_binop (block_stmt_iterator *bsi, tree inner_type, tree a, tree b,
- tree bitpos, tree bitsize, enum tree_code code)
-{
- a = tree_vec_extract (bsi, inner_type, a, bitsize, bitpos);
- b = tree_vec_extract (bsi, inner_type, b, bitsize, bitpos);
- return gimplify_build2 (bsi, code, inner_type, a, b);
-}
-
-/* Expand vector addition to scalars. This does bit twiddling
- in order to increase parallelism:
-
- a + b = (((int) a & 0x7f7f7f7f) + ((int) b & 0x7f7f7f7f)) ^
- (a ^ b) & 0x80808080
-
- a - b = (((int) a | 0x80808080) - ((int) b & 0x7f7f7f7f)) ^
- (a ^ ~b) & 0x80808080
-
- -b = (0x80808080 - ((int) b & 0x7f7f7f7f)) ^ (~b & 0x80808080)
-
- This optimization should be done only if 4 vector items or more
- fit into a word. */
-static tree
-do_plus_minus (block_stmt_iterator *bsi, tree word_type, tree a, tree b,
- tree bitpos ATTRIBUTE_UNUSED, tree bitsize ATTRIBUTE_UNUSED,
- enum tree_code code)
-{
- tree inner_type = TREE_TYPE (TREE_TYPE (a));
- unsigned HOST_WIDE_INT max;
- tree low_bits, high_bits, a_low, b_low, result_low, signs;
-
- max = GET_MODE_MASK (TYPE_MODE (inner_type));
- low_bits = build_replicated_const (word_type, inner_type, max >> 1);
- high_bits = build_replicated_const (word_type, inner_type, max & ~(max >> 1));
-
- a = tree_vec_extract (bsi, word_type, a, bitsize, bitpos);
- b = tree_vec_extract (bsi, word_type, b, bitsize, bitpos);
-
- signs = gimplify_build2 (bsi, BIT_XOR_EXPR, word_type, a, b);
- b_low = gimplify_build2 (bsi, BIT_AND_EXPR, word_type, b, low_bits);
- if (code == PLUS_EXPR)
- a_low = gimplify_build2 (bsi, BIT_AND_EXPR, word_type, a, low_bits);
- else
- {
- a_low = gimplify_build2 (bsi, BIT_IOR_EXPR, word_type, a, high_bits);
- signs = gimplify_build1 (bsi, BIT_NOT_EXPR, word_type, signs);
- }
-
- signs = gimplify_build2 (bsi, BIT_AND_EXPR, word_type, signs, high_bits);
- result_low = gimplify_build2 (bsi, code, word_type, a_low, b_low);
- return gimplify_build2 (bsi, BIT_XOR_EXPR, word_type, result_low, signs);
-}
-
-static tree
-do_negate (block_stmt_iterator *bsi, tree word_type, tree b,
- tree unused ATTRIBUTE_UNUSED, tree bitpos ATTRIBUTE_UNUSED,
- tree bitsize ATTRIBUTE_UNUSED,
- enum tree_code code ATTRIBUTE_UNUSED)
-{
- tree inner_type = TREE_TYPE (TREE_TYPE (b));
- HOST_WIDE_INT max;
- tree low_bits, high_bits, b_low, result_low, signs;
-
- max = GET_MODE_MASK (TYPE_MODE (inner_type));
- low_bits = build_replicated_const (word_type, inner_type, max >> 1);
- high_bits = build_replicated_const (word_type, inner_type, max & ~(max >> 1));
-
- b = tree_vec_extract (bsi, word_type, b, bitsize, bitpos);
-
- b_low = gimplify_build2 (bsi, BIT_AND_EXPR, word_type, b, low_bits);
- signs = gimplify_build1 (bsi, BIT_NOT_EXPR, word_type, b);
- signs = gimplify_build2 (bsi, BIT_AND_EXPR, word_type, signs, high_bits);
- result_low = gimplify_build2 (bsi, MINUS_EXPR, word_type, high_bits, b_low);
- return gimplify_build2 (bsi, BIT_XOR_EXPR, word_type, result_low, signs);
-}
-
-/* Expand a vector operation to scalars, by using many operations
- whose type is the vector type's inner type. */
-static tree
-expand_vector_piecewise (block_stmt_iterator *bsi, elem_op_func f,
- tree type, tree inner_type,
- tree a, tree b, enum tree_code code)
-{
- tree head, *chain = &head;
- tree part_width = TYPE_SIZE (inner_type);
- tree index = bitsize_int (0);
- int nunits = TYPE_VECTOR_SUBPARTS (type);
- int delta = tree_low_cst (part_width, 1)
- / tree_low_cst (TYPE_SIZE (TREE_TYPE (type)), 1);
- int i;
-
- for (i = 0; i < nunits;
- i += delta, index = int_const_binop (PLUS_EXPR, index, part_width, 0))
- {
- tree result = f (bsi, inner_type, a, b, index, part_width, code);
- *chain = tree_cons (NULL_TREE, result, NULL_TREE);
- chain = &TREE_CHAIN (*chain);
- }
-
- return build1 (CONSTRUCTOR, type, head);
}
-/* Expand a vector operation to scalars with the freedom to use
- a scalar integer type, or to use a different size for the items
- in the vector type. */
-static tree
-expand_vector_parallel (block_stmt_iterator *bsi, elem_op_func f, tree type,
- tree a, tree b,
- enum tree_code code)
-{
- tree result, compute_type;
- enum machine_mode mode;
- int n_words = tree_low_cst (TYPE_SIZE_UNIT (type), 1) / UNITS_PER_WORD;
-
- /* We have three strategies. If the type is already correct, just do
- the operation an element at a time. Else, if the vector is wider than
- one word, do it a word at a time; finally, if the vector is smaller
- than one word, do it as a scalar. */
- if (TYPE_MODE (TREE_TYPE (type)) == word_mode)
- return expand_vector_piecewise (bsi, f,
- type, TREE_TYPE (type),
- a, b, code);
- else if (n_words > 1)
- {
- tree word_type = build_word_mode_vector_type (n_words);
- result = expand_vector_piecewise (bsi, f,
- word_type, TREE_TYPE (word_type),
- a, b, code);
- result = gimplify_val (bsi, word_type, result);
- }
- else
- {
- /* Use a single scalar operation with a mode no wider than word_mode. */
- mode = mode_for_size (tree_low_cst (TYPE_SIZE (type), 1), MODE_INT, 0);
- compute_type = lang_hooks.types.type_for_mode (mode, 1);
- result = f (bsi, compute_type, a, b, NULL_TREE, NULL_TREE, code);
- }
-
- return result;
-}
-
-/* Expand a vector operation to scalars; for integer types we can use
- special bit twiddling tricks to do the sums a word at a time, using
- function F_PARALLEL instead of F. These tricks are done only if
- they can process at least four items, that is, only if the vector
- holds at least four items and if a word can hold four items. */
-static tree
-expand_vector_addition (block_stmt_iterator *bsi,
- elem_op_func f, elem_op_func f_parallel,
- tree type, tree a, tree b, enum tree_code code)
-{
- int parts_per_word = UNITS_PER_WORD
- / tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (type)), 1);
-
- if (INTEGRAL_TYPE_P (TREE_TYPE (type))
- && parts_per_word >= 4
- && TYPE_VECTOR_SUBPARTS (type) >= 4)
- return expand_vector_parallel (bsi, f_parallel,
- type, a, b, code);
- else
- return expand_vector_piecewise (bsi, f,
- type, TREE_TYPE (type),
- a, b, code);
-}
-
-static tree
-expand_vector_operation (block_stmt_iterator *bsi, tree type, tree compute_type,
- tree rhs, enum tree_code code)
-{
- enum machine_mode compute_mode = TYPE_MODE (compute_type);
-
- /* If the compute mode is not a vector mode (hence we are not decomposing
- a BLKmode vector to smaller, hardware-supported vectors), we may want
- to expand the operations in parallel. */
- if (GET_MODE_CLASS (compute_mode) != MODE_VECTOR_INT
- && GET_MODE_CLASS (compute_mode) != MODE_VECTOR_FLOAT)
- switch (code)
- {
- case PLUS_EXPR:
- case MINUS_EXPR:
- if (!TYPE_TRAP_SIGNED (type))
- return expand_vector_addition (bsi, do_binop, do_plus_minus, type,
- TREE_OPERAND (rhs, 0),
- TREE_OPERAND (rhs, 1), code);
- break;
-
- case NEGATE_EXPR:
- if (!TYPE_TRAP_SIGNED (type))
- return expand_vector_addition (bsi, do_unop, do_negate, type,
- TREE_OPERAND (rhs, 0),
- NULL_TREE, code);
- break;
-
- case BIT_AND_EXPR:
- case BIT_IOR_EXPR:
- case BIT_XOR_EXPR:
- return expand_vector_parallel (bsi, do_binop, type,
- TREE_OPERAND (rhs, 0),
- TREE_OPERAND (rhs, 1), code);
-
- case BIT_NOT_EXPR:
- return expand_vector_parallel (bsi, do_unop, type,
- TREE_OPERAND (rhs, 0),
- NULL_TREE, code);
-
- default:
- break;
- }
-
- if (TREE_CODE_CLASS (code) == tcc_unary)
- return expand_vector_piecewise (bsi, do_unop, type, compute_type,
- TREE_OPERAND (rhs, 0),
- NULL_TREE, code);
- else
- return expand_vector_piecewise (bsi, do_binop, type, compute_type,
- TREE_OPERAND (rhs, 0),
- TREE_OPERAND (rhs, 1), code);
-}
-/* Return a type for the widest vector mode whose components are of mode
- INNER_MODE, or NULL_TREE if none is found. */
-static tree
-type_for_widest_vector_mode (enum machine_mode inner_mode, optab op)
-{
- enum machine_mode best_mode = VOIDmode, mode;
- int best_nunits = 0;
-
- if (GET_MODE_CLASS (inner_mode) == MODE_FLOAT)
- mode = MIN_MODE_VECTOR_FLOAT;
- else
- mode = MIN_MODE_VECTOR_INT;
-
- for (; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
- if (GET_MODE_INNER (mode) == inner_mode
- && GET_MODE_NUNITS (mode) > best_nunits
- && op->handlers[mode].insn_code != CODE_FOR_nothing)
- best_mode = mode, best_nunits = GET_MODE_NUNITS (mode);
-
- if (best_mode == VOIDmode)
- return NULL_TREE;
- else
- return lang_hooks.types.type_for_mode (best_mode, 1);
-}
-
-/* Process one statement. If we identify a vector operation, expand it. */
+/* Entry point for complex operation lowering during optimization. */
static void
-expand_vector_operations_1 (block_stmt_iterator *bsi)
+tree_lower_complex (void)
{
- tree stmt = bsi_stmt (*bsi);
- tree *p_lhs, *p_rhs, lhs, rhs, type, compute_type;
- enum tree_code code;
- enum machine_mode compute_mode;
- optab op;
-
- switch (TREE_CODE (stmt))
- {
- case RETURN_EXPR:
- stmt = TREE_OPERAND (stmt, 0);
- if (!stmt || TREE_CODE (stmt) != MODIFY_EXPR)
- return;
-
- /* FALLTHRU */
-
- case MODIFY_EXPR:
- p_lhs = &TREE_OPERAND (stmt, 0);
- p_rhs = &TREE_OPERAND (stmt, 1);
- lhs = *p_lhs;
- rhs = *p_rhs;
- break;
-
- default:
- return;
- }
+ int old_last_basic_block;
+ block_stmt_iterator bsi;
+ basic_block bb;
- type = TREE_TYPE (rhs);
- if (TREE_CODE (type) != VECTOR_TYPE)
+ if (!init_dont_simulate_again ())
return;
- code = TREE_CODE (rhs);
- if (TREE_CODE_CLASS (code) != tcc_unary
- && TREE_CODE_CLASS (code) != tcc_binary)
- return;
+ complex_lattice_values = VEC_alloc (complex_lattice_t, heap, num_ssa_names);
+ VEC_safe_grow (complex_lattice_t, heap,
+ complex_lattice_values, num_ssa_names);
+ memset (VEC_address (complex_lattice_t, complex_lattice_values), 0,
+ num_ssa_names * sizeof(complex_lattice_t));
+ init_parameter_lattice_values ();
- if (code == NOP_EXPR || code == VIEW_CONVERT_EXPR)
- return;
-
- gcc_assert (code != CONVERT_EXPR);
- op = optab_for_tree_code (code, type);
-
- /* Optabs will try converting a negation into a subtraction, so
- look for it as well. TODO: negation of floating-point vectors
- might be turned into an exclusive OR toggling the sign bit. */
- if (op == NULL
- && code == NEGATE_EXPR
- && INTEGRAL_TYPE_P (TREE_TYPE (type)))
- op = optab_for_tree_code (MINUS_EXPR, type);
-
- /* For very wide vectors, try using a smaller vector mode. */
- compute_type = type;
- if (TYPE_MODE (type) == BLKmode && op)
- {
- tree vector_compute_type
- = type_for_widest_vector_mode (TYPE_MODE (TREE_TYPE (type)), op);
- if (vector_compute_type != NULL_TREE)
- compute_type = vector_compute_type;
- }
+ ssa_propagate (complex_visit_stmt, complex_visit_phi);
- /* If we are breaking a BLKmode vector into smaller pieces,
- type_for_widest_vector_mode has already looked into the optab,
- so skip these checks. */
- if (compute_type == type)
- {
- compute_mode = TYPE_MODE (compute_type);
- if ((GET_MODE_CLASS (compute_mode) == MODE_VECTOR_INT
- || GET_MODE_CLASS (compute_mode) == MODE_VECTOR_FLOAT)
- && op != NULL
- && op->handlers[compute_mode].insn_code != CODE_FOR_nothing)
- return;
- else
- /* There is no operation in hardware, so fall back to scalars. */
- compute_type = TREE_TYPE (type);
- }
+ create_components ();
+ update_parameter_components ();
- rhs = expand_vector_operation (bsi, type, compute_type, rhs, code);
- if (lang_hooks.types_compatible_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))
- *p_rhs = rhs;
- else
+ old_last_basic_block = last_basic_block;
+ FOR_EACH_BB (bb)
{
- /* Build a conversion; VIEW_CONVERT_EXPR is very expensive unless T will
- be stored in memory anyway, so prefer NOP_EXPR. We should also try
- performing the VIEW_CONVERT_EXPR on the left side of the
- assignment. */
- if (TYPE_MODE (TREE_TYPE (rhs)) == BLKmode)
- *p_rhs = gimplify_build1 (bsi, VIEW_CONVERT_EXPR, TREE_TYPE (lhs), rhs);
- else
- *p_rhs = gimplify_build1 (bsi, NOP_EXPR, TREE_TYPE (lhs), rhs);
+ if (bb->index >= old_last_basic_block)
+ continue;
+ update_phi_components (bb);
+ for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
+ expand_complex_operations_1 (&bsi);
}
- mark_stmt_modified (bsi_stmt (*bsi));
-}
-
-/* Use this to lower vector operations introduced by the vectorizer,
- if it may need the bit-twiddling tricks implemented in this file. */
+ bsi_commit_edge_inserts ();
-static bool
-gate_expand_vector_operations (void)
-{
- return flag_tree_vectorize != 0;
+ VEC_free (tree, heap, complex_variable_components);
+ VEC_free (complex_lattice_t, heap, complex_lattice_values);
}
-static void
-expand_vector_operations (void)
+struct tree_opt_pass pass_lower_complex =
{
- block_stmt_iterator bsi;
- basic_block bb;
+ "cplxlower", /* name */
+ 0, /* gate */
+ tree_lower_complex, /* execute */
+ NULL, /* sub */
+ NULL, /* next */
+ 0, /* static_pass_number */
+ 0, /* tv_id */
+ PROP_ssa, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ TODO_dump_func | TODO_ggc_collect
+ | TODO_update_ssa
+ | TODO_verify_stmts, /* todo_flags_finish */
+ 0 /* letter */
+};
- FOR_EACH_BB (bb)
- {
- for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
- {
- expand_vector_operations_1 (&bsi);
- update_stmt_if_modified (bsi_stmt (bsi));
- }
- }
-}
+
+/* Entry point for complex operation lowering without optimization. */
static void
-tree_lower_operations (void)
+tree_lower_complex_O0 (void)
{
int old_last_basic_block = last_basic_block;
block_stmt_iterator bsi;
@@ -1029,38 +1385,21 @@ tree_lower_operations (void)
if (bb->index >= old_last_basic_block)
continue;
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
- {
- expand_complex_operations_1 (&bsi);
- expand_vector_operations_1 (&bsi);
- }
+ expand_complex_operations_1 (&bsi);
}
}
-
-struct tree_opt_pass pass_lower_vector_ssa =
+static bool
+gate_no_optimization (void)
{
- "veclower", /* name */
- gate_expand_vector_operations, /* gate */
- expand_vector_operations, /* execute */
- NULL, /* sub */
- NULL, /* next */
- 0, /* static_pass_number */
- 0, /* tv_id */
- PROP_cfg, /* properties_required */
- 0, /* properties_provided */
- 0, /* properties_destroyed */
- 0, /* todo_flags_start */
- TODO_dump_func | TODO_update_ssa /* todo_flags_finish */
- | TODO_ggc_collect | TODO_verify_ssa
- | TODO_verify_stmts | TODO_verify_flow,
- 0 /* letter */
-};
+ return optimize == 0;
+}
-struct tree_opt_pass pass_pre_expand =
+struct tree_opt_pass pass_lower_complex_O0 =
{
- "oplower", /* name */
- 0, /* gate */
- tree_lower_operations, /* execute */
+ "cplxlower0", /* name */
+ gate_no_optimization, /* gate */
+ tree_lower_complex_O0, /* execute */
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
@@ -1073,5 +1412,3 @@ struct tree_opt_pass pass_pre_expand =
| TODO_verify_stmts, /* todo_flags_finish */
0 /* letter */
};
-
-#include "gt-tree-complex.h"
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index b1d160545bb..e4917df71af 100644
--- a/gcc/tree-data-ref.c
+++ b/gcc/tree-data-ref.c
@@ -78,7 +78,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
#include "tree.h"
@@ -448,32 +447,21 @@ dump_ddrs (FILE *file, varray_type ddrs)
-/* Compute the lowest iteration bound for LOOP. It is an
- INTEGER_CST. */
+/* Initialize LOOP->ESTIMATED_NB_ITERATIONS with the lowest safe
+ approximation of the number of iterations for LOOP. */
static void
compute_estimated_nb_iterations (struct loop *loop)
{
- tree estimation;
- struct nb_iter_bound *bound, *next;
-
- for (bound = loop->bounds; bound; bound = next)
- {
- next = bound->next;
- estimation = bound->bound;
-
- if (TREE_CODE (estimation) != INTEGER_CST)
- continue;
-
- if (loop->estimated_nb_iterations)
- {
- /* Update only if estimation is smaller. */
- if (tree_int_cst_lt (estimation, loop->estimated_nb_iterations))
- loop->estimated_nb_iterations = estimation;
- }
- else
- loop->estimated_nb_iterations = estimation;
- }
+ struct nb_iter_bound *bound;
+
+ for (bound = loop->bounds; bound; bound = bound->next)
+ if (TREE_CODE (bound->bound) == INTEGER_CST
+ /* Update only when there is no previous estimation. */
+ && (chrec_contains_undetermined (loop->estimated_nb_iterations)
+ /* Or when the current estimation is smaller. */
+ || tree_int_cst_lt (bound->bound, loop->estimated_nb_iterations)))
+ loop->estimated_nb_iterations = bound->bound;
}
/* Estimate the number of iterations from the size of the data and the
@@ -539,7 +527,7 @@ analyze_array_indexes (struct loop *loop,
access_fn = instantiate_parameters
(loop, analyze_scalar_evolution (loop, opnd1));
- if (loop->estimated_nb_iterations == NULL_TREE)
+ if (chrec_contains_undetermined (loop->estimated_nb_iterations))
estimate_niter_from_size_of_data (loop, opnd0, access_fn, stmt);
VEC_safe_push (tree, heap, *access_fns, access_fn);
@@ -1130,8 +1118,12 @@ compute_overlap_steps_for_affine_1_2 (tree chrec_a, tree chrec_b,
numiter_z = current_loops->parray[CHREC_VARIABLE (chrec_b)]
->estimated_nb_iterations;
- if (numiter_x == NULL_TREE || numiter_y == NULL_TREE
- || numiter_z == NULL_TREE)
+ if (chrec_contains_undetermined (numiter_x)
+ || chrec_contains_undetermined (numiter_y)
+ || chrec_contains_undetermined (numiter_z)
+ || TREE_CODE (numiter_x) != INTEGER_CST
+ || TREE_CODE (numiter_y) != INTEGER_CST
+ || TREE_CODE (numiter_z) != INTEGER_CST)
{
*overlaps_a = chrec_dont_know;
*overlaps_b = chrec_dont_know;
@@ -1279,7 +1271,10 @@ analyze_subscript_affine_affine (tree chrec_a,
if (TREE_CODE (numiter_b) != INTEGER_CST)
numiter_b = current_loops->parray[CHREC_VARIABLE (chrec_b)]
->estimated_nb_iterations;
- if (numiter_a == NULL_TREE || numiter_b == NULL_TREE)
+ if (chrec_contains_undetermined (numiter_a)
+ || chrec_contains_undetermined (numiter_b)
+ || TREE_CODE (numiter_a) != INTEGER_CST
+ || TREE_CODE (numiter_b) != INTEGER_CST)
{
*overlaps_a = chrec_dont_know;
*overlaps_b = chrec_dont_know;
@@ -1380,7 +1375,10 @@ analyze_subscript_affine_affine (tree chrec_a,
if (TREE_CODE (numiter_b) != INTEGER_CST)
numiter_b = current_loops->parray[CHREC_VARIABLE (chrec_b)]
->estimated_nb_iterations;
- if (numiter_a == NULL_TREE || numiter_b == NULL_TREE)
+ if (chrec_contains_undetermined (numiter_a)
+ || chrec_contains_undetermined (numiter_b)
+ || TREE_CODE (numiter_a) != INTEGER_CST
+ || TREE_CODE (numiter_b) != INTEGER_CST)
{
*overlaps_a = chrec_dont_know;
*overlaps_b = chrec_dont_know;
@@ -2178,6 +2176,25 @@ compute_affine_dependence (struct data_dependence_relation *ddr)
fprintf (dump_file, ")\n");
}
+/* This computes the dependence relation for the same data
+ reference into DDR. */
+
+static void
+compute_self_dependence (struct data_dependence_relation *ddr)
+{
+ unsigned int i;
+
+ for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
+ {
+ struct subscript *subscript = DDR_SUBSCRIPT (ddr, i);
+
+ /* The accessed index overlaps for each iteration. */
+ SUB_CONFLICTS_IN_A (subscript) = integer_zero_node;
+ SUB_CONFLICTS_IN_B (subscript) = integer_zero_node;
+ SUB_LAST_CONFLICT (subscript) = chrec_dont_know;
+ }
+}
+
typedef struct data_dependence_relation *ddr_p;
DEF_VEC_P(ddr_p);
@@ -2197,8 +2214,11 @@ compute_all_dependences (varray_type datarefs,
N = VARRAY_ACTIVE_SIZE (datarefs);
+ /* Note that we specifically skip i == j because it's a self dependence, and
+ use compute_self_dependence below. */
+
for (i = 0; i < N; i++)
- for (j = i; j < N; j++)
+ for (j = i + 1; j < N; j++)
{
struct data_reference *a, *b;
struct data_dependence_relation *ddr;
@@ -2211,6 +2231,22 @@ compute_all_dependences (varray_type datarefs,
compute_affine_dependence (ddr);
compute_subscript_distance (ddr);
}
+
+ /* Compute self dependence relation of each dataref to itself. */
+
+ for (i = 0; i < N; i++)
+ {
+ struct data_reference *a, *b;
+ struct data_dependence_relation *ddr;
+
+ a = VARRAY_GENERIC_PTR (datarefs, i);
+ b = VARRAY_GENERIC_PTR (datarefs, i);
+ ddr = initialize_data_dependence_relation (a, b);
+
+ VEC_safe_push (ddr_p, heap, *dependence_relations, ddr);
+ compute_self_dependence (ddr);
+ compute_subscript_distance (ddr);
+ }
}
/* Search the data references in LOOP, and record the information into
@@ -2307,11 +2343,11 @@ find_data_references_in_loop (struct loop *loop, varray_type *datarefs)
/* When there are no defs in the loop, the loop is parallel. */
if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_VIRTUAL_DEFS))
- bb->loop_father->parallel_p = false;
+ loop->parallel_p = false;
}
- if (bb->loop_father->estimated_nb_iterations == NULL_TREE)
- compute_estimated_nb_iterations (bb->loop_father);
+ if (chrec_contains_undetermined (loop->estimated_nb_iterations))
+ compute_estimated_nb_iterations (loop);
}
free (bbs);
diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c
index 6876a65ba82..4288c2c3c70 100644
--- a/gcc/tree-dfa.c
+++ b/gcc/tree-dfa.c
@@ -31,7 +31,6 @@ Boston, MA 02111-1307, USA. */
#include "hard-reg-set.h"
#include "basic-block.h"
#include "output.h"
-#include "errors.h"
#include "timevar.h"
#include "expr.h"
#include "ggc.h"
@@ -186,7 +185,6 @@ create_stmt_ann (tree t)
return ann;
}
-
/* Create a new annotation for a tree T. */
tree_ann_t
diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
index 9f641e186d2..0820e6738e1 100644
--- a/gcc/tree-eh.c
+++ b/gcc/tree-eh.c
@@ -36,6 +36,7 @@ Boston, MA 02111-1307, USA. */
#include "timevar.h"
#include "langhooks.h"
#include "ggc.h"
+#include "toplev.h"
/* Nonzero if we are using EH to handle cleanups. */
@@ -1826,7 +1827,7 @@ verify_eh_edges (tree stmt)
{
if ((e->flags & EDGE_EH) && !e->aux)
{
- error ("Unnecesary EH edge %i->%i", bb->index, e->dest->index);
+ error ("Unnecessary EH edge %i->%i", bb->index, e->dest->index);
mark_eh_edge_found_error = true;
return true;
}
@@ -1868,6 +1869,13 @@ tree_could_trap_p (tree expr)
restart:
switch (code)
{
+ case TARGET_MEM_REF:
+ /* For TARGET_MEM_REFs use the information based on the original
+ reference. */
+ expr = TMR_ORIGINAL (expr);
+ code = TREE_CODE (expr);
+ goto restart;
+
case COMPONENT_REF:
case REALPART_EXPR:
case IMAGPART_EXPR:
@@ -2009,29 +2017,31 @@ bool
tree_can_throw_internal (tree stmt)
{
int region_nr;
+ bool is_resx = false;
if (TREE_CODE (stmt) == RESX_EXPR)
- region_nr = TREE_INT_CST_LOW (TREE_OPERAND (stmt, 0));
+ region_nr = TREE_INT_CST_LOW (TREE_OPERAND (stmt, 0)), is_resx = true;
else
region_nr = lookup_stmt_eh_region (stmt);
if (region_nr < 0)
return false;
- return can_throw_internal_1 (region_nr);
+ return can_throw_internal_1 (region_nr, is_resx);
}
bool
tree_can_throw_external (tree stmt)
{
int region_nr;
+ bool is_resx = false;
if (TREE_CODE (stmt) == RESX_EXPR)
- region_nr = TREE_INT_CST_LOW (TREE_OPERAND (stmt, 0));
+ region_nr = TREE_INT_CST_LOW (TREE_OPERAND (stmt, 0)), is_resx = true;
else
region_nr = lookup_stmt_eh_region (stmt);
if (region_nr < 0)
return tree_could_throw_p (stmt);
else
- return can_throw_external_1 (region_nr);
+ return can_throw_external_1 (region_nr, is_resx);
}
/* Given a statement OLD_STMT and a new statement NEW_STMT that has replaced
diff --git a/gcc/tree-flow-inline.h b/gcc/tree-flow-inline.h
index 063d1a47e12..68f8562fc3a 100644
--- a/gcc/tree-flow-inline.h
+++ b/gcc/tree-flow-inline.h
@@ -66,7 +66,6 @@ get_stmt_ann (tree stmt)
return (ann) ? ann : create_stmt_ann (stmt);
}
-
/* Return the annotation type for annotation ANN. */
static inline enum tree_ann_type
ann_type (tree_ann_t ann)
@@ -238,7 +237,7 @@ set_ssa_use_from_ptr (use_operand_p use, tree val)
link_imm_use (use, val);
}
-/* Link ssa_imm_use node LINKNODE into the chain for DEF, with use occuring
+/* Link ssa_imm_use node LINKNODE into the chain for DEF, with use occurring
in STMT. */
static inline void
link_imm_use_stmt (ssa_use_operand_t *linknode, tree def, tree stmt)
@@ -267,7 +266,7 @@ relink_imm_use (ssa_use_operand_t *node, ssa_use_operand_t *old)
}
}
-/* Relink ssa_imm_use node LINKNODE into the chain for OLD, with use occuring
+/* Relink ssa_imm_use node LINKNODE into the chain for OLD, with use occurring
in STMT. */
static inline void
relink_imm_use_stmt (ssa_use_operand_t *linknode, ssa_use_operand_t *old, tree stmt)
@@ -494,19 +493,12 @@ addresses_taken (tree stmt)
return ann ? ann->addresses_taken : NULL;
}
-/* Return the basic_block annotation for BB. */
-static inline bb_ann_t
-bb_ann (basic_block bb)
-{
- return (bb_ann_t)bb->tree_annotations;
-}
-
/* Return the PHI nodes for basic block BB, or NULL if there are no
PHI nodes. */
static inline tree
phi_nodes (basic_block bb)
{
- return bb_ann (bb)->phi_nodes;
+ return bb->phi_nodes;
}
/* Set list of phi nodes of a basic block BB to L. */
@@ -516,7 +508,7 @@ set_phi_nodes (basic_block bb, tree l)
{
tree phi;
- bb_ann (bb)->phi_nodes = l;
+ bb->phi_nodes = l;
for (phi = l; phi; phi = PHI_CHAIN (phi))
set_bb_for_stmt (phi, bb);
}
diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h
index 3fc5d98ab49..5941b5e22d6 100644
--- a/gcc/tree-flow.h
+++ b/gcc/tree-flow.h
@@ -83,34 +83,6 @@ struct ptr_info_def GTY(())
};
-/* Types of value ranges. */
-enum value_range_type { VR_UNDEFINED, VR_RANGE, VR_ANTI_RANGE, VR_VARYING };
-
-
-/* Ranges of values that can be associated with an SSA_NAME after VRP
- has executed. */
-struct value_range_def GTY(())
-{
- /* Lattice value represented by this range. */
- enum value_range_type type;
-
- /* Minimum and maximum values represented by this range. These
- values are _CST nodes that should be interpreted as follows:
-
- - If TYPE == VR_UNDEFINED then MIN and MAX must be NULL.
-
- - If TYPE == VR_RANGE then MIN holds the minimum value and
- MAX holds the maximum value of the range [MIN, MAX].
-
- - If TYPE == ANTI_RANGE the variable is known to NOT
- take any values in the range [MIN, MAX]. */
- tree min;
- tree max;
-};
-
-typedef struct value_range_def value_range;
-
-
/*---------------------------------------------------------------------------
Tree annotations stored in tree_common.ann
---------------------------------------------------------------------------*/
@@ -121,6 +93,10 @@ struct tree_ann_common_d GTY(())
/* Annotation type. */
enum tree_ann_type type;
+ /* Auxiliary info specific to a pass. At all times, this
+ should either point to valid data or be NULL. */
+ PTR GTY ((skip (""))) aux;
+
/* The value handle for this expression. Used by GVN-PRE. */
tree GTY((skip)) value_handle;
};
@@ -308,7 +284,7 @@ struct stmt_ann_d GTY(())
unsigned makes_clobbering_call : 1;
/* Basic block that contains this statement. */
- basic_block GTY ((skip (""))) bb;
+ basic_block bb;
/* Operand cache for stmt. */
struct stmt_operands_d GTY ((skip (""))) operands;
@@ -321,10 +297,6 @@ struct stmt_ann_d GTY(())
pass which needs statement UIDs. */
unsigned int uid;
- /* Auxiliary info specific to a pass. At all times, this
- should either point to valid data or be NULL. */
- PTR GTY ((skip (""))) aux;
-
/* Linked list of histograms for value-based profiling. This is really a
struct histogram_value*. We use void* to avoid having to export that
everywhere, and to avoid having to put it in GC memory. */
@@ -377,28 +349,7 @@ struct edge_prediction GTY((chain_next ("%h.next")))
int probability;
};
-/*---------------------------------------------------------------------------
- Block annotations stored in basic_block.tree_annotations
----------------------------------------------------------------------------*/
-struct bb_ann_d GTY(())
-{
- /* Chain of PHI nodes for this block. */
- tree phi_nodes;
-
- /* Nonzero if this block contains an escape point (see is_escape_site). */
- unsigned has_escape_site : 1;
-
- /* Nonzero if one or more incoming edges to this block should be threaded
- to an outgoing edge of this block. */
- unsigned incoming_edge_threaded : 1;
-
- struct edge_prediction *predictions;
-};
-
-typedef struct bb_ann_d *bb_ann_t;
-
/* Accessors for basic block annotations. */
-static inline bb_ann_t bb_ann (basic_block);
static inline tree phi_nodes (basic_block);
static inline void set_phi_nodes (basic_block, tree);
@@ -510,8 +461,6 @@ extern void debug_loop_ir (void);
extern void print_loop_ir (FILE *);
extern void cleanup_dead_labels (void);
extern void group_case_labels (void);
-extern bool cleanup_tree_cfg (void);
-extern void cleanup_tree_cfg_loop (void);
extern tree first_stmt (basic_block);
extern tree last_stmt (basic_block);
extern tree *last_stmt_ptr (basic_block);
@@ -544,6 +493,12 @@ extern tree gimplify_build3 (block_stmt_iterator *, enum tree_code,
extern void init_empty_tree_cfg (void);
extern void fold_cond_expr_cond (void);
extern void replace_uses_by (tree, tree);
+extern void start_recording_case_labels (void);
+extern void end_recording_case_labels (void);
+
+/* In tree-cfgcleanup.c */
+extern bool cleanup_tree_cfg (void);
+extern void cleanup_tree_cfg_loop (void);
/* In tree-pretty-print.c. */
extern void dump_generic_bb (FILE *, basic_block, int, int);
@@ -587,6 +542,7 @@ extern void debug_points_to_info_for (tree);
extern bool may_be_aliased (tree);
extern struct ptr_info_def *get_ptr_info (tree);
extern void add_type_alias (tree, tree);
+extern void new_type_alias (tree, tree);
extern void count_uses_and_derefs (tree, tree, unsigned *, unsigned *, bool *);
static inline subvar_t get_subvars_for_var (tree);
static inline bool ref_contains_array_ref (tree);
@@ -635,12 +591,8 @@ bool fold_stmt_inplace (tree);
tree widen_bitfield (tree, tree, tree);
/* In tree-vrp.c */
-value_range *get_value_range (tree);
-void dump_value_range (FILE *, value_range *);
-void debug_value_range (value_range *);
-void dump_all_value_ranges (FILE *);
-void debug_all_value_ranges (void);
bool expr_computes_nonzero (tree);
+tree vrp_evaluate_conditional (tree, bool);
/* In tree-ssa-dom.c */
extern void dump_dominator_optimization_stats (FILE *);
@@ -706,7 +658,8 @@ tree find_loop_niter (struct loop *, edge *);
tree loop_niter_by_eval (struct loop *, edge);
tree find_loop_niter_by_eval (struct loop *, edge *);
void estimate_numbers_of_iterations (struct loops *);
-tree can_count_iv_in_wider_type (struct loop *, tree, tree, tree, tree);
+bool scev_probably_wraps_p (tree, tree, tree, tree, struct loop *, bool *);
+tree convert_step (struct loop *, tree, tree, tree, tree);
void free_numbers_of_iterations_estimates (struct loops *);
void rewrite_into_loop_closed_ssa (bitmap, unsigned);
void verify_loop_closed_ssa (void);
@@ -727,6 +680,7 @@ bool tree_duplicate_loop_to_header_edge (struct loop *, edge, struct loops *,
struct loop *tree_ssa_loop_version (struct loops *, struct loop *, tree,
basic_block *);
tree expand_simple_operations (tree);
+void substitute_in_loop_info (struct loop *, tree, tree);
/* In tree-ssa-loop-im.c */
/* The possibilities of statement movement. */
@@ -783,12 +737,79 @@ void insert_edge_copies (tree, basic_block);
extern void linear_transform_loops (struct loops *);
/* In tree-ssa-loop-ivopts.c */
-extern bool expr_invariant_in_loop_p (struct loop *, tree);
+bool expr_invariant_in_loop_p (struct loop *, tree);
+bool multiplier_allowed_in_address_p (HOST_WIDE_INT);
+unsigned multiply_by_cost (HOST_WIDE_INT, enum machine_mode);
+
+/* In tree-ssa-threadupdate.c. */
+extern bool thread_through_all_blocks (bitmap);
/* In gimplify.c */
tree force_gimple_operand (tree, tree *, bool, tree);
tree force_gimple_operand_bsi (block_stmt_iterator *, tree, bool, tree);
+/* In tree-ssa-structalias.c */
+bool find_what_p_points_to (tree);
+
+/* In tree-ssa-address.c */
+
+/* Affine combination of trees. We keep track of at most MAX_AFF_ELTS elements
+ to make things simpler; this is sufficient in most cases. */
+
+#define MAX_AFF_ELTS 8
+
+struct affine_tree_combination
+{
+ /* Type of the result of the combination. */
+ tree type;
+
+ /* Mask modulo that the operations are performed. */
+ unsigned HOST_WIDE_INT mask;
+
+ /* Constant offset. */
+ unsigned HOST_WIDE_INT offset;
+
+ /* Number of elements of the combination. */
+ unsigned n;
+
+ /* Elements and their coefficients. */
+ tree elts[MAX_AFF_ELTS];
+ unsigned HOST_WIDE_INT coefs[MAX_AFF_ELTS];
+
+ /* Remainder of the expression. */
+ tree rest;
+};
+
+/* Description of a memory address. */
+
+struct mem_address
+{
+ tree symbol, base, index, step, offset;
+};
+
+tree create_mem_ref (block_stmt_iterator *, tree,
+ struct affine_tree_combination *);
+rtx addr_for_mem_ref (struct mem_address *, bool);
+void get_address_description (tree, struct mem_address *);
+tree maybe_fold_tmr (tree);
+/* This structure is simply used during pushing fields onto the fieldstack
+ to track the offset of the field, since bitpos_of_field gives it relative
+ to its immediate containing type, and we want it relative to the ultimate
+ containing object. */
+
+struct fieldoff
+{
+ tree field;
+ HOST_WIDE_INT offset;
+};
+typedef struct fieldoff fieldoff_s;
+
+DEF_VEC_O(fieldoff_s);
+DEF_VEC_ALLOC_O(fieldoff_s,heap);
+int push_fields_onto_fieldstack (tree, VEC(fieldoff_s,heap) **,
+ HOST_WIDE_INT, bool *);
+void sort_fieldstack (VEC(fieldoff_s,heap) *);
+
#include "tree-flow-inline.h"
#endif /* _TREE_FLOW_H */
diff --git a/gcc/tree-gimple.c b/gcc/tree-gimple.c
index e723b472177..3bf773b23ea 100644
--- a/gcc/tree-gimple.c
+++ b/gcc/tree-gimple.c
@@ -260,12 +260,10 @@ is_gimple_id (tree t)
bool
is_gimple_reg_type (tree type)
{
- return (!AGGREGATE_TYPE_P (type)
- && TREE_CODE (type) != COMPLEX_TYPE);
+ return !AGGREGATE_TYPE_P (type);
}
-
-/* Return true if T is a scalar register variable. */
+/* Return true if T is a non-aggregate register variable. */
bool
is_gimple_reg (tree t)
@@ -275,6 +273,7 @@ is_gimple_reg (tree t)
if (!is_gimple_variable (t))
return false;
+
if (!is_gimple_reg_type (TREE_TYPE (t)))
return false;
@@ -301,6 +300,11 @@ is_gimple_reg (tree t)
if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t))
return false;
+ /* Complex values must have been put into ssa form. That is, no
+ assignments to the individual components. */
+ if (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE)
+ return DECL_COMPLEX_GIMPLE_REG_P (t);
+
return true;
}
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index decd9cde6af..8b940ca8bf4 100644
--- a/gcc/tree-if-conv.c
+++ b/gcc/tree-if-conv.c
@@ -84,7 +84,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "tree.h"
#include "c-common.h"
#include "flags.h"
@@ -840,7 +839,7 @@ process_phi_nodes (struct loop *loop)
release_phi_node (phi);
phi = next;
}
- bb_ann (bb)->phi_nodes = NULL;
+ bb->phi_nodes = NULL;
}
return;
}
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 118f493e299..db4b1e91306 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -385,6 +385,17 @@ remap_decls (tree decls, inline_data *id)
{
tree new_var;
+ /* We can not chain the local static declarations into the unexpanded_var_list
+ as we can't duplicate them or break one decl rule. Go ahead and link
+ them into unexpanded_var_list. */
+ if (!lang_hooks.tree_inlining.auto_var_in_fn_p (old_var, id->callee)
+ && !DECL_EXTERNAL (old_var))
+ {
+ cfun->unexpanded_var_list = tree_cons (NULL_TREE, old_var,
+ cfun->unexpanded_var_list);
+ continue;
+ }
+
/* Remap the variable. */
new_var = remap_decl (old_var, id);
@@ -575,8 +586,6 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data)
knows not to copy VAR_DECLs, etc., so this is safe. */
else
{
- tree old_node = *tp;
-
/* Here we handle trees that are not completely rewritten.
First we detect some inlining-induced bogosities for
discarding. */
@@ -613,7 +622,21 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data)
n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
if (n)
{
- *tp = build_fold_indirect_ref ((tree)n->value);
+ /* If we happen to get an ADDR_EXPR in n->value, strip
+ it manually here as we'll eventually get ADDR_EXPRs
+ which lie about their types pointed to. In this case
+ build_fold_indirect_ref wouldn't strip the INDIRECT_REF,
+ but we absolutely rely on that. As fold_indirect_ref
+ does other useful transformations, try that first, though. */
+ tree type = TREE_TYPE (TREE_TYPE ((tree)n->value));
+ *tp = fold_indirect_ref_1 (type, (tree)n->value);
+ if (! *tp)
+ {
+ if (TREE_CODE ((tree)n->value) == ADDR_EXPR)
+ *tp = TREE_OPERAND ((tree)n->value, 0);
+ else
+ *tp = build1 (INDIRECT_REF, type, (tree)n->value);
+ }
*walk_subtrees = 0;
return NULL;
}
@@ -626,41 +649,7 @@ copy_body_r (tree *tp, int *walk_subtrees, void *data)
&& IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (*tp))))
TREE_BLOCK (*tp) = id->block;
- /* We're duplicating a CALL_EXPR. Find any corresponding
- callgraph edges and update or duplicate them. */
- if (TREE_CODE (*tp) == CALL_EXPR && id->node && get_callee_fndecl (*tp))
- {
- if (id->saving_p)
- {
- struct cgraph_node *node;
- struct cgraph_edge *edge;
-
- /* We're saving a copy of the body, so we'll update the
- callgraph nodes in place. Note that we avoid
- altering the original callgraph node; we begin with
- the first clone. */
- for (node = id->node->next_clone;
- node;
- node = node->next_clone)
- {
- edge = cgraph_edge (node, old_node);
- gcc_assert (edge);
- edge->call_expr = *tp;
- }
- }
- else
- {
- struct cgraph_edge *edge;
-
- /* We're cloning or inlining this body; duplicate the
- associate callgraph nodes. */
- edge = cgraph_edge (id->current_node, old_node);
- if (edge)
- cgraph_clone_edge (edge, id->node, *tp,
- REG_BR_PROB_BASE, 1);
- }
- }
- else if (TREE_CODE (*tp) == RESX_EXPR && id->eh_region_offset)
+ if (TREE_CODE (*tp) == RESX_EXPR && id->eh_region_offset)
TREE_OPERAND (*tp, 0) =
build_int_cst
(NULL_TREE,
@@ -720,7 +709,43 @@ copy_bb (inline_data *id, basic_block bb, int frequency_scale, int count_scale)
this is signalled by making stmt pointer NULL. */
if (stmt)
{
+ tree call, decl;
bsi_insert_after (&copy_bsi, stmt, BSI_NEW_STMT);
+ call = get_call_expr_in (stmt);
+ /* We're duplicating a CALL_EXPR. Find any corresponding
+ callgraph edges and update or duplicate them. */
+ if (call && (decl = get_callee_fndecl (call)))
+ {
+ if (id->saving_p)
+ {
+ struct cgraph_node *node;
+ struct cgraph_edge *edge;
+
+ /* We're saving a copy of the body, so we'll update the
+ callgraph nodes in place. Note that we avoid
+ altering the original callgraph node; we begin with
+ the first clone. */
+ for (node = id->node->next_clone;
+ node;
+ node = node->next_clone)
+ {
+ edge = cgraph_edge (node, orig_stmt);
+ gcc_assert (edge);
+ edge->call_stmt = stmt;
+ }
+ }
+ else
+ {
+ struct cgraph_edge *edge;
+
+ /* We're cloning or inlining this body; duplicate the
+ associate callgraph nodes. */
+ edge = cgraph_edge (id->current_node, orig_stmt);
+ if (edge)
+ cgraph_clone_edge (edge, id->node, stmt,
+ REG_BR_PROB_BASE, 1);
+ }
+ }
/* If you think we can abort here, you are wrong.
There is no region 0 in tree land. */
gcc_assert (lookup_stmt_eh_region_fn (id->callee_cfun, orig_stmt)
@@ -766,24 +791,24 @@ copy_edges_for_bb (basic_block bb, int count_scale)
/* Use the indices from the original blocks to create edges for the
new ones. */
FOR_EACH_EDGE (old_edge, ei, bb->succs)
- {
- edge new;
+ if (!(old_edge->flags & EDGE_EH))
+ {
+ edge new;
- flags = old_edge->flags;
+ flags = old_edge->flags;
- /* Return edges do get a FALLTHRU flag when the get inlined. */
- if (old_edge->dest->index == EXIT_BLOCK && !old_edge->flags
- && old_edge->dest->aux != EXIT_BLOCK_PTR)
- flags |= EDGE_FALLTHRU;
- new = make_edge (new_bb, old_edge->dest->aux, flags);
- new->count = old_edge->count * count_scale / REG_BR_PROB_BASE;
- new->probability = old_edge->probability;
- }
+ /* Return edges do get a FALLTHRU flag when the get inlined. */
+ if (old_edge->dest->index == EXIT_BLOCK && !old_edge->flags
+ && old_edge->dest->aux != EXIT_BLOCK_PTR)
+ flags |= EDGE_FALLTHRU;
+ new = make_edge (new_bb, old_edge->dest->aux, flags);
+ new->count = old_edge->count * count_scale / REG_BR_PROB_BASE;
+ new->probability = old_edge->probability;
+ }
if (bb->index == ENTRY_BLOCK || bb->index == EXIT_BLOCK)
return;
- tree_purge_dead_eh_edges (new_bb);
for (bsi = bsi_start (new_bb); !bsi_end_p (bsi);)
{
tree copy_stmt;
@@ -805,9 +830,7 @@ copy_edges_for_bb (basic_block bb, int count_scale)
into a COMPONENT_REF which doesn't. If the copy
can throw, the original could also throw. */
- if (TREE_CODE (copy_stmt) == RESX_EXPR
- || (tree_could_throw_p (copy_stmt)
- && lookup_stmt_eh_region (copy_stmt) > 0))
+ if (tree_can_throw_internal (copy_stmt))
{
if (!bsi_end_p (bsi))
/* Note that bb's predecessor edges aren't necessarily
@@ -1287,7 +1310,7 @@ inline_forbidden_p_1 (tree *nodep, int *walk_subtrees ATTRIBUTE_UNUSED,
&& !lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)))
{
inline_forbidden_reason
- = N_("%Jfunction %qF can never be inlined because it uses "
+ = G_("%Jfunction %qF can never be inlined because it uses "
"alloca (override using the always_inline attribute)");
return node;
}
@@ -1299,7 +1322,7 @@ inline_forbidden_p_1 (tree *nodep, int *walk_subtrees ATTRIBUTE_UNUSED,
if (setjmp_call_p (t))
{
inline_forbidden_reason
- = N_("%Jfunction %qF can never be inlined because it uses setjmp");
+ = G_("%Jfunction %qF can never be inlined because it uses setjmp");
return node;
}
@@ -1313,7 +1336,7 @@ inline_forbidden_p_1 (tree *nodep, int *walk_subtrees ATTRIBUTE_UNUSED,
case BUILT_IN_NEXT_ARG:
case BUILT_IN_VA_END:
inline_forbidden_reason
- = N_("%Jfunction %qF can never be inlined because it "
+ = G_("%Jfunction %qF can never be inlined because it "
"uses variable argument lists");
return node;
@@ -1324,14 +1347,14 @@ inline_forbidden_p_1 (tree *nodep, int *walk_subtrees ATTRIBUTE_UNUSED,
function calling __builtin_longjmp to be inlined into the
function calling __builtin_setjmp, Things will Go Awry. */
inline_forbidden_reason
- = N_("%Jfunction %qF can never be inlined because "
+ = G_("%Jfunction %qF can never be inlined because "
"it uses setjmp-longjmp exception handling");
return node;
case BUILT_IN_NONLOCAL_GOTO:
/* Similarly. */
inline_forbidden_reason
- = N_("%Jfunction %qF can never be inlined because "
+ = G_("%Jfunction %qF can never be inlined because "
"it uses non-local goto");
return node;
@@ -1342,7 +1365,7 @@ inline_forbidden_p_1 (tree *nodep, int *walk_subtrees ATTRIBUTE_UNUSED,
been inlined into. Similarly __builtin_return would
return from the function the inline has been inlined into. */
inline_forbidden_reason
- = N_("%Jfunction %qF can never be inlined because "
+ = G_("%Jfunction %qF can never be inlined because "
"it uses __builtin_return or __builtin_apply_args");
return node;
@@ -1361,7 +1384,7 @@ inline_forbidden_p_1 (tree *nodep, int *walk_subtrees ATTRIBUTE_UNUSED,
if (TREE_CODE (t) != LABEL_DECL)
{
inline_forbidden_reason
- = N_("%Jfunction %qF can never be inlined "
+ = G_("%Jfunction %qF can never be inlined "
"because it contains a computed goto");
return node;
}
@@ -1375,7 +1398,7 @@ inline_forbidden_p_1 (tree *nodep, int *walk_subtrees ATTRIBUTE_UNUSED,
because we cannot remap the destination label used in the
function that is performing the non-local goto. */
inline_forbidden_reason
- = N_("%Jfunction %qF can never be inlined "
+ = G_("%Jfunction %qF can never be inlined "
"because it receives a non-local goto");
return node;
}
@@ -1400,7 +1423,7 @@ inline_forbidden_p_1 (tree *nodep, int *walk_subtrees ATTRIBUTE_UNUSED,
if (variably_modified_type_p (TREE_TYPE (t), NULL))
{
inline_forbidden_reason
- = N_("%Jfunction %qF can never be inlined "
+ = G_("%Jfunction %qF can never be inlined "
"because it uses variable sized variables");
return node;
}
@@ -1805,28 +1828,25 @@ estimate_num_insns (tree expr)
return num;
}
+typedef struct function *function_p;
+
+DEF_VEC_P(function_p);
+DEF_VEC_ALLOC_P(function_p,heap);
+
/* Initialized with NOGC, making this poisonous to the garbage collector. */
-static varray_type cfun_stack;
+static VEC(function_p,heap) *cfun_stack;
void
push_cfun (struct function *new_cfun)
{
- static bool initialized = false;
-
- if (!initialized)
- {
- VARRAY_GENERIC_PTR_NOGC_INIT (cfun_stack, 20, "cfun_stack");
- initialized = true;
- }
- VARRAY_PUSH_GENERIC_PTR (cfun_stack, cfun);
+ VEC_safe_push (function_p, heap, cfun_stack, cfun);
cfun = new_cfun;
}
void
pop_cfun (void)
{
- cfun = (struct function *)VARRAY_TOP_GENERIC_PTR (cfun_stack);
- VARRAY_POP (cfun_stack);
+ cfun = VEC_pop (function_p, cfun_stack);
}
/* Install new lexical TREE_BLOCK underneath 'current_block'. */
@@ -1910,7 +1930,7 @@ expand_call_inline (basic_block bb, tree stmt, tree *tp, void *data)
if (!id->current_node->analyzed)
goto egress;
- cg_edge = cgraph_edge (id->current_node, t);
+ cg_edge = cgraph_edge (id->current_node, stmt);
/* Constant propagation on argument done during previous inlining
may create new direct call. Produce an edge for it. */
@@ -1923,7 +1943,7 @@ expand_call_inline (basic_block bb, tree stmt, tree *tp, void *data)
constant propagating arguments. In all other cases we hit a bug
(incorrect node sharing is most common reason for missing edges. */
gcc_assert (dest->needed || !flag_unit_at_a_time);
- cgraph_create_edge (id->node, dest, t,
+ cgraph_create_edge (id->node, dest, stmt,
bb->count, bb->loop_depth)->inline_failed
= N_("originally indirect function call not considered for inlining");
goto egress;
diff --git a/gcc/tree-into-ssa.c b/gcc/tree-into-ssa.c
index 4a95072414d..1daea76b02c 100644
--- a/gcc/tree-into-ssa.c
+++ b/gcc/tree-into-ssa.c
@@ -31,7 +31,6 @@ Boston, MA 02111-1307, USA. */
#include "hard-reg-set.h"
#include "basic-block.h"
#include "output.h"
-#include "errors.h"
#include "expr.h"
#include "function.h"
#include "diagnostic.h"
@@ -107,8 +106,8 @@ static VEC(tree,heap) *block_defs_stack;
/* Basic block vectors used in this file ought to be allocated in the
heap. We use pointer vector, because ints can be easily passed by
value. */
-DEF_VEC_P(int);
-DEF_VEC_ALLOC_P(int,heap);
+DEF_VEC_I(int);
+DEF_VEC_ALLOC_I(int,heap);
/* Set of existing SSA names being replaced by update_ssa. */
static sbitmap old_ssa_names;
@@ -1750,7 +1749,7 @@ rewrite_into_ssa (void)
sbitmap_zero (interesting_blocks);
/* Initialize dominance frontier. */
- dfs = (bitmap *) xmalloc (last_basic_block * sizeof (bitmap *));
+ dfs = (bitmap *) xmalloc (last_basic_block * sizeof (bitmap));
FOR_EACH_BB (bb)
dfs[bb->index] = BITMAP_ALLOC (NULL);
@@ -2034,6 +2033,7 @@ prepare_names_to_update (bitmap blocks, bool insert_phi_p)
{
unsigned i;
bitmap_iterator bi;
+ sbitmap_iterator sbi;
/* If a name N from NEW_SSA_NAMES is also marked to be released,
remove it from NEW_SSA_NAMES so that we don't try to visit its
@@ -2047,17 +2047,17 @@ prepare_names_to_update (bitmap blocks, bool insert_phi_p)
/* First process names in NEW_SSA_NAMES. Otherwise, uses of old
names may be considered to be live-in on blocks that contain
definitions for their replacements. */
- EXECUTE_IF_SET_IN_SBITMAP (new_ssa_names, 0, i,
- prepare_def_site_for (ssa_name (i), blocks, insert_phi_p));
+ EXECUTE_IF_SET_IN_SBITMAP (new_ssa_names, 0, i, sbi)
+ prepare_def_site_for (ssa_name (i), blocks, insert_phi_p);
/* If an old name is in NAMES_TO_RELEASE, we cannot remove it from
OLD_SSA_NAMES, but we have to ignore its definition site. */
- EXECUTE_IF_SET_IN_SBITMAP (old_ssa_names, 0, i,
+ EXECUTE_IF_SET_IN_SBITMAP (old_ssa_names, 0, i, sbi)
{
if (names_to_release == NULL || !bitmap_bit_p (names_to_release, i))
prepare_def_site_for (ssa_name (i), blocks, insert_phi_p);
prepare_use_sites_for (ssa_name (i), blocks, insert_phi_p);
- });
+ }
}
@@ -2106,12 +2106,14 @@ dump_update_ssa (FILE *file)
if (new_ssa_names && sbitmap_first_set_bit (new_ssa_names) >= 0)
{
+ sbitmap_iterator sbi;
+
fprintf (file, "\nSSA replacement table\n");
fprintf (file, "N_i -> { O_1 ... O_j } means that N_i replaces "
"O_1, ..., O_j\n\n");
- EXECUTE_IF_SET_IN_SBITMAP (new_ssa_names, 0, i,
- dump_names_replaced_by (file, ssa_name (i)));
+ EXECUTE_IF_SET_IN_SBITMAP (new_ssa_names, 0, i, sbi)
+ dump_names_replaced_by (file, ssa_name (i));
fprintf (file, "\n");
fprintf (file, "Number of virtual NEW -> OLD mappings: %7u\n",
@@ -2347,10 +2349,11 @@ ssa_names_to_replace (void)
{
unsigned i;
bitmap ret;
+ sbitmap_iterator sbi;
ret = BITMAP_ALLOC (NULL);
- EXECUTE_IF_SET_IN_SBITMAP (old_ssa_names, 0, i,
- bitmap_set_bit (ret, i));
+ EXECUTE_IF_SET_IN_SBITMAP (old_ssa_names, 0, i, sbi)
+ bitmap_set_bit (ret, i);
return ret;
}
@@ -2517,6 +2520,7 @@ static void
switch_virtuals_to_full_rewrite (void)
{
unsigned i;
+ sbitmap_iterator sbi;
if (dump_file)
{
@@ -2532,13 +2536,13 @@ switch_virtuals_to_full_rewrite (void)
/* Remove all virtual names from NEW_SSA_NAMES and OLD_SSA_NAMES.
Note that it is not really necessary to remove the mappings from
REPL_TBL, that would only waste time. */
- EXECUTE_IF_SET_IN_SBITMAP (new_ssa_names, 0, i,
+ EXECUTE_IF_SET_IN_SBITMAP (new_ssa_names, 0, i, sbi)
if (!is_gimple_reg (ssa_name (i)))
- RESET_BIT (new_ssa_names, i));
+ RESET_BIT (new_ssa_names, i);
- EXECUTE_IF_SET_IN_SBITMAP (old_ssa_names, 0, i,
+ EXECUTE_IF_SET_IN_SBITMAP (old_ssa_names, 0, i, sbi)
if (!is_gimple_reg (ssa_name (i)))
- RESET_BIT (old_ssa_names, i));
+ RESET_BIT (old_ssa_names, i);
bitmap_ior_into (syms_to_rename, update_ssa_stats.virtual_symbols);
}
@@ -2617,6 +2621,7 @@ update_ssa (unsigned update_flags)
unsigned i;
sbitmap tmp;
bool insert_phi_p;
+ sbitmap_iterator sbi;
if (!need_ssa_update_p ())
return;
@@ -2679,6 +2684,10 @@ update_ssa (unsigned update_flags)
for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
{
tree stmt = bsi_stmt (si);
+ /* We are going to use the operand cache API, such as
+ SET_USE, SET_DEF, and FOR_EACH_IMM_USE_FAST. The operand
+ cache for each statement should be up-to-date. */
+ gcc_assert (!stmt_modified_p (stmt));
REWRITE_THIS_STMT (stmt) = 0;
REGISTER_DEFS_IN_THIS_STMT (stmt) = 0;
}
@@ -2736,13 +2745,15 @@ update_ssa (unsigned update_flags)
/* If the caller requested PHI nodes to be added, compute
dominance frontiers. */
- dfs = xmalloc (last_basic_block * sizeof (bitmap *));
+ dfs = xmalloc (last_basic_block * sizeof (bitmap));
FOR_EACH_BB (bb)
dfs[bb->index] = BITMAP_ALLOC (NULL);
compute_dominance_frontiers (dfs);
if (sbitmap_first_set_bit (old_ssa_names) >= 0)
{
+ sbitmap_iterator sbi;
+
/* insert_update_phi_nodes_for will call add_new_name_mapping
when inserting new PHI nodes, so the set OLD_SSA_NAMES
will grow while we are traversing it (but it will not
@@ -2750,9 +2761,9 @@ update_ssa (unsigned update_flags)
for traversal. */
sbitmap tmp = sbitmap_alloc (old_ssa_names->n_bits);
sbitmap_copy (tmp, old_ssa_names);
- EXECUTE_IF_SET_IN_SBITMAP (tmp, 0, i,
+ EXECUTE_IF_SET_IN_SBITMAP (tmp, 0, i, sbi)
insert_updated_phi_nodes_for (ssa_name (i), dfs, blocks,
- update_flags));
+ update_flags);
sbitmap_free (tmp);
}
@@ -2773,8 +2784,8 @@ update_ssa (unsigned update_flags)
/* Reset the current definition for name and symbol before renaming
the sub-graph. */
- EXECUTE_IF_SET_IN_SBITMAP (old_ssa_names, 0, i,
- set_current_def (ssa_name (i), NULL_TREE));
+ EXECUTE_IF_SET_IN_SBITMAP (old_ssa_names, 0, i, sbi)
+ set_current_def (ssa_name (i), NULL_TREE);
EXECUTE_IF_SET_IN_BITMAP (syms_to_rename, 0, i, bi)
set_current_def (referenced_var (i), NULL_TREE);
diff --git a/gcc/tree-loop-linear.c b/gcc/tree-loop-linear.c
index 5c289964774..741c95df4d2 100644
--- a/gcc/tree-loop-linear.c
+++ b/gcc/tree-loop-linear.c
@@ -24,7 +24,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
#include "tree.h"
#include "target.h"
diff --git a/gcc/tree-mudflap.c b/gcc/tree-mudflap.c
index 04282a88320..1ed0159fed5 100644
--- a/gcc/tree-mudflap.c
+++ b/gcc/tree-mudflap.c
@@ -22,7 +22,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "config.h"
-#include "errors.h"
#include "system.h"
#include "coretypes.h"
#include "tm.h"
@@ -45,6 +44,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "langhooks.h"
#include "ggc.h"
#include "cgraph.h"
+#include "toplev.h"
/* Internal function decls */
@@ -528,14 +528,11 @@ mf_build_check_statement_for (tree base, tree limit,
make_edge (cond_bb, then_bb, EDGE_TRUE_VALUE);
make_single_succ_edge (then_bb, join_bb, EDGE_FALLTHRU);
- /* We expect that the conditional jump we will construct will not
- be taken very often as it basically is an exception condition. */
- predict_edge_def (single_pred_edge (then_bb), PRED_MUDFLAP, NOT_TAKEN);
-
/* Mark the pseudo-fallthrough edge from cond_bb to join_bb. */
e = find_edge (cond_bb, join_bb);
e->flags = EDGE_FALSE_VALUE;
- predict_edge_def (e, PRED_MUDFLAP, TAKEN);
+ e->count = cond_bb->count;
+ e->probability = REG_BR_PROB_BASE;
/* Update dominance info. Note that bb_join's data was
updated by split_block. */
@@ -710,7 +707,7 @@ mf_decl_eligible_p (tree decl)
/* The type of the variable must be complete. */
&& COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (decl))
/* The decl hasn't been decomposed somehow. */
- && DECL_VALUE_EXPR (decl) == NULL);
+ && !DECL_HAS_VALUE_EXPR_P (decl));
}
@@ -838,6 +835,14 @@ mf_xform_derefs_1 (block_stmt_iterator *iter, tree *tp,
integer_one_node));
break;
+ case TARGET_MEM_REF:
+ addr = tree_mem_ref_addr (ptr_type_node, t);
+ base = addr;
+ limit = fold_build2 (MINUS_EXPR, ptr_type_node,
+ fold_build2 (PLUS_EXPR, ptr_type_node, base, size),
+ build_int_cst_type (ptr_type_node, 1));
+ break;
+
case ARRAY_RANGE_REF:
warning (0, "mudflap checking not yet implemented for ARRAY_RANGE_REF");
return;
@@ -1252,7 +1257,7 @@ mudflap_finish_file (void)
Perform registration for non-static objects regardless of
TREE_USED or TREE_ADDRESSABLE, because they may be used
from other compilation units. */
- if (TREE_STATIC (obj) && ! TREE_ADDRESSABLE (obj))
+ if (! TREE_PUBLIC (obj) && ! TREE_ADDRESSABLE (obj))
continue;
if (! COMPLETE_TYPE_P (TREE_TYPE (obj)))
diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c
index b1ab217340b..1721bca9745 100644
--- a/gcc/tree-nested.c
+++ b/gcc/tree-nested.c
@@ -148,12 +148,15 @@ create_tmp_var_for (struct nesting_info *info, tree type, const char *prefix)
return tmp_var;
}
-/* Take the address of EXP. Mark it for addressability as necessary. */
+/* Take the address of EXP to be used within function CONTEXT.
+ Mark it for addressability as necessary. */
tree
-build_addr (tree exp)
+build_addr (tree exp, tree context)
{
tree base = exp;
+ tree save_context;
+ tree retval;
while (handled_component_p (base))
base = TREE_OPERAND (base, 0);
@@ -161,7 +164,18 @@ build_addr (tree exp)
if (DECL_P (base))
TREE_ADDRESSABLE (base) = 1;
- return build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (exp)), exp);
+ /* Building the ADDR_EXPR will compute a set of properties for
+ that ADDR_EXPR. Those properties are unfortunately context
+ specific. ie, they are dependent on CURRENT_FUNCTION_DECL.
+
+ Temporarily set CURRENT_FUNCTION_DECL to the desired context,
+ build the ADDR_EXPR, then restore CURRENT_FUNCTION_DECL. That
+ way the properties are for the ADDR_EXPR are computed properly. */
+ save_context = current_function_decl;
+ current_function_decl = context;
+ retval = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (exp)), exp);
+ current_function_decl = save_context;;
+ return retval;
}
/* Insert FIELD into TYPE, sorted by alignment requirements. */
@@ -716,7 +730,7 @@ get_static_chain (struct nesting_info *info, tree target_context,
if (info->context == target_context)
{
- x = build_addr (info->frame_decl);
+ x = build_addr (info->frame_decl, target_context);
}
else
{
@@ -857,9 +871,14 @@ convert_nonlocal_reference (tree *tp, int *walk_subtrees, void *data)
if (wi->changed)
{
+ tree save_context;
+
/* If we changed anything, then TREE_INVARIANT is be wrong,
since we're no longer directly referencing a decl. */
+ save_context = current_function_decl;
+ current_function_decl = info->context;
recompute_tree_invarant_for_addr_expr (t);
+ current_function_decl = save_context;
/* If the callback converted the address argument in a context
where we only accept variables (and min_invariant, presumably),
@@ -982,10 +1001,15 @@ convert_local_reference (tree *tp, int *walk_subtrees, void *data)
/* If we converted anything ... */
if (wi->changed)
{
+ tree save_context;
+
/* Then the frame decl is now addressable. */
TREE_ADDRESSABLE (info->frame_decl) = 1;
+ save_context = current_function_decl;
+ current_function_decl = info->context;
recompute_tree_invarant_for_addr_expr (t);
+ current_function_decl = save_context;
/* If we are in a context where we only accept values, then
compute the address into a temporary. */
@@ -1092,10 +1116,10 @@ convert_nl_goto_reference (tree *tp, int *walk_subtrees, void *data)
/* Build: __builtin_nl_goto(new_label, &chain->nl_goto_field). */
field = get_nl_goto_field (i);
x = get_frame_field (info, target_context, field, &wi->tsi);
- x = build_addr (x);
+ x = build_addr (x, target_context);
x = tsi_gimplify_val (info, x, &wi->tsi);
arg = tree_cons (NULL, x, NULL);
- x = build_addr (new_label);
+ x = build_addr (new_label, target_context);
arg = tree_cons (NULL, x, arg);
x = implicit_built_in_decls[BUILT_IN_NONLOCAL_GOTO];
x = build_function_call_expr (x, arg);
@@ -1190,7 +1214,7 @@ convert_tramp_reference (tree *tp, int *walk_subtrees, void *data)
/* Compute the address of the field holding the trampoline. */
x = get_frame_field (info, target_context, x, &wi->tsi);
- x = build_addr (x);
+ x = build_addr (x, target_context);
x = tsi_gimplify_val (info, x, &wi->tsi);
arg = tree_cons (NULL, x, NULL);
@@ -1303,7 +1327,12 @@ finalize_nesting_tree_1 (struct nesting_info *root)
out at this time. */
if (root->frame_type)
{
+ /* In some cases the frame type will trigger the -Wpadded warning.
+ This is not helpful; suppress it. */
+ int save_warn_padded = warn_padded;
+ warn_padded = 0;
layout_type (root->frame_type);
+ warn_padded = save_warn_padded;
layout_decl (root->frame_decl, 0);
}
@@ -1322,7 +1351,7 @@ finalize_nesting_tree_1 (struct nesting_info *root)
continue;
if (use_pointer_in_frame (p))
- x = build_addr (p);
+ x = build_addr (p, context);
else
x = p;
@@ -1358,15 +1387,15 @@ finalize_nesting_tree_1 (struct nesting_info *root)
if (DECL_NO_STATIC_CHAIN (i->context))
x = null_pointer_node;
else
- x = build_addr (root->frame_decl);
+ x = build_addr (root->frame_decl, context);
arg = tree_cons (NULL, x, NULL);
- x = build_addr (i->context);
+ x = build_addr (i->context, context);
arg = tree_cons (NULL, x, arg);
x = build (COMPONENT_REF, TREE_TYPE (field),
root->frame_decl, field, NULL_TREE);
- x = build_addr (x);
+ x = build_addr (x, context);
arg = tree_cons (NULL, x, arg);
x = implicit_built_in_decls[BUILT_IN_INIT_TRAMPOLINE];
diff --git a/gcc/tree-nomudflap.c b/gcc/tree-nomudflap.c
index e47ebaca947..00ebd6d6858 100644
--- a/gcc/tree-nomudflap.c
+++ b/gcc/tree-nomudflap.c
@@ -21,7 +21,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "config.h"
-#include "errors.h"
#include "system.h"
#include "coretypes.h"
#include "tm.h"
@@ -38,6 +37,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "tree-mudflap.h"
#include "tree-pass.h"
#include "ggc.h"
+#include "toplev.h"
diff --git a/gcc/tree-optimize.c b/gcc/tree-optimize.c
index 7c9beb812dc..0812b6422c5 100644
--- a/gcc/tree-optimize.c
+++ b/gcc/tree-optimize.c
@@ -375,13 +375,14 @@ init_tree_optimization_passes (void)
NEXT_PASS (pass_lower_cf);
NEXT_PASS (pass_lower_eh);
NEXT_PASS (pass_build_cfg);
- NEXT_PASS (pass_pre_expand);
+ NEXT_PASS (pass_lower_complex_O0);
+ NEXT_PASS (pass_lower_vector);
NEXT_PASS (pass_warn_function_return);
+ NEXT_PASS (pass_tree_profile);
*p = NULL;
p = &all_passes;
NEXT_PASS (pass_fixup_cfg);
- NEXT_PASS (pass_tree_profile);
NEXT_PASS (pass_init_datastructures);
NEXT_PASS (pass_all_optimizations);
NEXT_PASS (pass_warn_function_noreturn);
@@ -395,7 +396,9 @@ init_tree_optimization_passes (void)
NEXT_PASS (pass_referenced_vars);
NEXT_PASS (pass_create_structure_vars);
NEXT_PASS (pass_build_ssa);
+ NEXT_PASS (pass_build_pta);
NEXT_PASS (pass_may_alias);
+ NEXT_PASS (pass_del_pta);
NEXT_PASS (pass_rename_ssa_copies);
NEXT_PASS (pass_early_warn_uninitialized);
@@ -411,11 +414,14 @@ init_tree_optimization_passes (void)
NEXT_PASS (pass_dominator);
NEXT_PASS (pass_phiopt);
+ NEXT_PASS (pass_build_pta);
NEXT_PASS (pass_may_alias);
+ NEXT_PASS (pass_del_pta);
NEXT_PASS (pass_tail_recursion);
NEXT_PASS (pass_profile);
NEXT_PASS (pass_ch);
NEXT_PASS (pass_stdarg);
+ NEXT_PASS (pass_lower_complex);
NEXT_PASS (pass_sra);
/* FIXME: SRA may generate arbitrary gimple code, exposing new
aliased and call-clobbered variables. As mentioned below,
@@ -438,6 +444,7 @@ init_tree_optimization_passes (void)
NEXT_PASS (pass_may_alias);
NEXT_PASS (pass_cse_reciprocals);
NEXT_PASS (pass_split_crit_edges);
+ NEXT_PASS (pass_reassoc);
NEXT_PASS (pass_pre);
NEXT_PASS (pass_sink_code);
NEXT_PASS (pass_loop);
@@ -478,6 +485,9 @@ init_tree_optimization_passes (void)
NEXT_PASS (pass_iv_canon);
NEXT_PASS (pass_if_conversion);
NEXT_PASS (pass_vectorize);
+ /* NEXT_PASS (pass_may_alias) cannot be done again because the
+ vectorizer creates alias relations that are not supported by
+ pass_may_alias. */
NEXT_PASS (pass_lower_vector_ssa);
NEXT_PASS (pass_complete_unroll);
NEXT_PASS (pass_iv_optimize);
@@ -682,7 +692,9 @@ tree_lowering_passes (tree fn)
void
ipa_passes (void)
{
- execute_pass_list (all_ipa_passes);
+ bitmap_obstack_initialize (NULL);
+ execute_pass_list (all_ipa_passes);
+ bitmap_obstack_release (NULL);
}
diff --git a/gcc/tree-outof-ssa.c b/gcc/tree-outof-ssa.c
index ae24275547d..a7b4f3f26a7 100644
--- a/gcc/tree-outof-ssa.c
+++ b/gcc/tree-outof-ssa.c
@@ -32,7 +32,6 @@ Boston, MA 02111-1307, USA. */
#include "hard-reg-set.h"
#include "basic-block.h"
#include "output.h"
-#include "errors.h"
#include "expr.h"
#include "function.h"
#include "diagnostic.h"
@@ -46,6 +45,7 @@ Boston, MA 02111-1307, USA. */
#include "tree-dump.h"
#include "tree-ssa-live.h"
#include "tree-pass.h"
+#include "toplev.h"
/* Flags to pass to remove_ssa_form. */
@@ -53,6 +53,9 @@ Boston, MA 02111-1307, USA. */
#define SSANORM_COMBINE_TEMPS 0x2
#define SSANORM_COALESCE_PARTITIONS 0x4
+DEF_VEC_I(int);
+DEF_VEC_ALLOC_I(int,heap);
+
/* Used to hold all the components required to do SSA PHI elimination.
The node and pred/succ list is a simple linear list of nodes and
edges represented as pairs of nodes.
@@ -82,7 +85,7 @@ typedef struct _elim_graph {
VEC(tree,heap) *nodes;
/* The predecessor and successor edge list. */
- varray_type edge_list;
+ VEC(int,heap) *edge_list;
/* Visited vector. */
sbitmap visited;
@@ -155,14 +158,14 @@ create_temp (tree t)
name = "temp";
tmp = create_tmp_var (type, name);
- if (DECL_DEBUG_EXPR (t) && DECL_DEBUG_EXPR_IS_FROM (t))
+ if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t))
{
- DECL_DEBUG_EXPR (tmp) = DECL_DEBUG_EXPR (t);
+ SET_DECL_DEBUG_EXPR (tmp, DECL_DEBUG_EXPR (t));
DECL_DEBUG_EXPR_IS_FROM (tmp) = 1;
}
else if (!DECL_IGNORED_P (t))
{
- DECL_DEBUG_EXPR (tmp) = t;
+ SET_DECL_DEBUG_EXPR (tmp, t);
DECL_DEBUG_EXPR_IS_FROM (tmp) = 1;
}
DECL_ARTIFICIAL (tmp) = DECL_ARTIFICIAL (t);
@@ -220,7 +223,7 @@ new_elim_graph (int size)
g->nodes = VEC_alloc (tree, heap, 30);
g->const_copies = VEC_alloc (tree, heap, 20);
- VARRAY_INT_INIT (g->edge_list, 20, "Elimination Edge List");
+ g->edge_list = VEC_alloc (int, heap, 20);
VARRAY_INT_INIT (g->stack, 30, " Elimination Stack");
g->visited = sbitmap_alloc (size);
@@ -235,7 +238,7 @@ static inline void
clear_elim_graph (elim_graph g)
{
VEC_truncate (tree, g->nodes, 0);
- VARRAY_POP_ALL (g->edge_list);
+ VEC_truncate (int, g->edge_list, 0);
}
@@ -245,6 +248,7 @@ static inline void
delete_elim_graph (elim_graph g)
{
sbitmap_free (g->visited);
+ VEC_free (int, heap, g->edge_list);
VEC_free (tree, heap, g->const_copies);
VEC_free (tree, heap, g->nodes);
free (g);
@@ -280,8 +284,8 @@ elim_graph_add_node (elim_graph g, tree node)
static inline void
elim_graph_add_edge (elim_graph g, int pred, int succ)
{
- VARRAY_PUSH_INT (g->edge_list, pred);
- VARRAY_PUSH_INT (g->edge_list, succ);
+ VEC_safe_push (int, heap, g->edge_list, pred);
+ VEC_safe_push (int, heap, g->edge_list, succ);
}
@@ -293,12 +297,12 @@ elim_graph_remove_succ_edge (elim_graph g, int node)
{
int y;
unsigned x;
- for (x = 0; x < VARRAY_ACTIVE_SIZE (g->edge_list); x += 2)
- if (VARRAY_INT (g->edge_list, x) == node)
+ for (x = 0; x < VEC_length (int, g->edge_list); x += 2)
+ if (VEC_index (int, g->edge_list, x) == node)
{
- VARRAY_INT (g->edge_list, x) = -1;
- y = VARRAY_INT (g->edge_list, x + 1);
- VARRAY_INT (g->edge_list, x + 1) = -1;
+ VEC_replace (int, g->edge_list, x, -1);
+ y = VEC_index (int, g->edge_list, x + 1);
+ VEC_replace (int, g->edge_list, x + 1, -1);
return y;
}
return -1;
@@ -313,12 +317,12 @@ elim_graph_remove_succ_edge (elim_graph g, int node)
do { \
unsigned x_; \
int y_; \
- for (x_ = 0; x_ < VARRAY_ACTIVE_SIZE ((GRAPH)->edge_list); x_ += 2) \
+ for (x_ = 0; x_ < VEC_length (int, (GRAPH)->edge_list); x_ += 2) \
{ \
- y_ = VARRAY_INT ((GRAPH)->edge_list, x_); \
+ y_ = VEC_index (int, (GRAPH)->edge_list, x_); \
if (y_ != (NODE)) \
continue; \
- (VAR) = VARRAY_INT ((GRAPH)->edge_list, x_ + 1); \
+ (VAR) = VEC_index (int, (GRAPH)->edge_list, x_ + 1); \
CODE; \
} \
} while (0)
@@ -332,12 +336,12 @@ do { \
do { \
unsigned x_; \
int y_; \
- for (x_ = 0; x_ < VARRAY_ACTIVE_SIZE ((GRAPH)->edge_list); x_ += 2) \
+ for (x_ = 0; x_ < VEC_length (int, (GRAPH)->edge_list); x_ += 2) \
{ \
- y_ = VARRAY_INT ((GRAPH)->edge_list, x_ + 1); \
+ y_ = VEC_index (int, (GRAPH)->edge_list, x_ + 1); \
if (y_ != (NODE)) \
continue; \
- (VAR) = VARRAY_INT ((GRAPH)->edge_list, x_); \
+ (VAR) = VEC_index (int, (GRAPH)->edge_list, x_); \
CODE; \
} \
} while (0)
@@ -691,6 +695,7 @@ coalesce_ssa_name (var_map map, int flags)
conflict_graph graph;
basic_block bb;
coalesce_list_p cl = NULL;
+ sbitmap_iterator sbi;
if (num_var_partitions (map) <= 1)
return NULL;
@@ -793,7 +798,7 @@ coalesce_ssa_name (var_map map, int flags)
/* Assign root variable as partition representative for each live on entry
partition. */
- EXECUTE_IF_SET_IN_SBITMAP (live, 0, x,
+ EXECUTE_IF_SET_IN_SBITMAP (live, 0, x, sbi)
{
var = root_var (rv, root_var_find (rv, x));
ann = var_ann (var);
@@ -813,7 +818,7 @@ coalesce_ssa_name (var_map map, int flags)
change_partition_var (map, var, x);
}
- });
+ }
sbitmap_free (live);
diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h
index e2446344142..2c405d278ae 100644
--- a/gcc/tree-pass.h
+++ b/gcc/tree-pass.h
@@ -126,7 +126,7 @@ struct dump_file_info
chains for virtuals (e.g., DCE). */
#define TODO_update_ssa_no_phi (1 << 8)
-/* Insert PHI nodes everywhere they are needed. No prunning of the
+/* Insert PHI nodes everywhere they are needed. No pruning of the
IDF is done. This is used by passes that need the PHI nodes for
O_j even if it means that some arguments will come from the default
definition of O_j's symbol (e.g., pass_linear_transform).
@@ -192,7 +192,9 @@ extern struct tree_opt_pass pass_may_alias;
extern struct tree_opt_pass pass_split_crit_edges;
extern struct tree_opt_pass pass_pre;
extern struct tree_opt_pass pass_profile;
-extern struct tree_opt_pass pass_pre_expand;
+extern struct tree_opt_pass pass_lower_complex_O0;
+extern struct tree_opt_pass pass_lower_complex;
+extern struct tree_opt_pass pass_lower_vector;
extern struct tree_opt_pass pass_lower_vector_ssa;
extern struct tree_opt_pass pass_fold_builtins;
extern struct tree_opt_pass pass_stdarg;
@@ -219,8 +221,12 @@ extern struct tree_opt_pass pass_store_ccp;
extern struct tree_opt_pass pass_store_copy_prop;
extern struct tree_opt_pass pass_vrp;
extern struct tree_opt_pass pass_create_structure_vars;
+extern struct tree_opt_pass pass_build_pta;
+extern struct tree_opt_pass pass_del_pta;
extern struct tree_opt_pass pass_uncprop;
+extern struct tree_opt_pass pass_reassoc;
+/* IPA Passes */
extern struct tree_opt_pass pass_ipa_inline;
#endif /* GCC_TREE_PASS_H */
diff --git a/gcc/tree-phinodes.c b/gcc/tree-phinodes.c
index ca01c8c52d1..7faedc907be 100644
--- a/gcc/tree-phinodes.c
+++ b/gcc/tree-phinodes.c
@@ -314,7 +314,7 @@ reserve_phi_args_for_new_edge (basic_block bb)
int len = EDGE_COUNT (bb->preds);
int cap = ideal_phi_node_len (len + 4);
- for (loc = &(bb_ann (bb)->phi_nodes);
+ for (loc = &(bb->phi_nodes);
*loc;
loc = &PHI_CHAIN (*loc))
{
@@ -354,7 +354,7 @@ create_phi_node (tree var, basic_block bb)
/* Add the new PHI node to the list of PHI nodes for block BB. */
PHI_CHAIN (phi) = phi_nodes (bb);
- bb_ann (bb)->phi_nodes = phi;
+ bb->phi_nodes = phi;
/* Associate BB to the PHI node. */
set_bb_for_stmt (phi, bb);
@@ -450,7 +450,7 @@ remove_phi_node (tree phi, tree prev)
}
else
{
- for (loc = &(bb_ann (bb_for_stmt (phi))->phi_nodes);
+ for (loc = &(bb_for_stmt (phi)->phi_nodes);
*loc != phi;
loc = &PHI_CHAIN (*loc))
;
diff --git a/gcc/tree-pretty-print.c b/gcc/tree-pretty-print.c
index 52bf437ff98..a079f3efb2a 100644
--- a/gcc/tree-pretty-print.c
+++ b/gcc/tree-pretty-print.c
@@ -23,7 +23,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "tree.h"
#include "diagnostic.h"
#include "real.h"
@@ -444,6 +443,64 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
pp_string (buffer, "::");
break;
+ case TARGET_MEM_REF:
+ {
+ const char *sep = "";
+ tree tmp;
+
+ pp_string (buffer, "MEM[");
+
+ tmp = TMR_SYMBOL (node);
+ if (tmp)
+ {
+ pp_string (buffer, sep);
+ sep = ", ";
+ pp_string (buffer, "symbol: ");
+ dump_generic_node (buffer, tmp, spc, flags, false);
+ }
+ tmp = TMR_BASE (node);
+ if (tmp)
+ {
+ pp_string (buffer, sep);
+ sep = ", ";
+ pp_string (buffer, "base: ");
+ dump_generic_node (buffer, tmp, spc, flags, false);
+ }
+ tmp = TMR_INDEX (node);
+ if (tmp)
+ {
+ pp_string (buffer, sep);
+ sep = ", ";
+ pp_string (buffer, "index: ");
+ dump_generic_node (buffer, tmp, spc, flags, false);
+ }
+ tmp = TMR_STEP (node);
+ if (tmp)
+ {
+ pp_string (buffer, sep);
+ sep = ", ";
+ pp_string (buffer, "step: ");
+ dump_generic_node (buffer, tmp, spc, flags, false);
+ }
+ tmp = TMR_OFFSET (node);
+ if (tmp)
+ {
+ pp_string (buffer, sep);
+ sep = ", ";
+ pp_string (buffer, "offset: ");
+ dump_generic_node (buffer, tmp, spc, flags, false);
+ }
+ pp_string (buffer, "]");
+ if (flags & TDF_DETAILS)
+ {
+ pp_string (buffer, "{");
+ dump_generic_node (buffer, TMR_ORIGINAL (node), spc, flags,
+ false);
+ pp_string (buffer, "}");
+ }
+ }
+ break;
+
case ARRAY_TYPE:
{
tree tmp;
@@ -2341,8 +2398,7 @@ dump_generic_bb_buff (pretty_printer *buffer, basic_block bb,
dump_bb_header (buffer, bb, indent, flags);
- if (bb_ann (bb))
- dump_phi_nodes (buffer, bb, indent, flags);
+ dump_phi_nodes (buffer, bb, indent, flags);
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
{
diff --git a/gcc/tree-profile.c b/gcc/tree-profile.c
index 2c91fc3859f..d611168635e 100644
--- a/gcc/tree-profile.c
+++ b/gcc/tree-profile.c
@@ -143,7 +143,7 @@ tree_gen_interval_profiler (histogram_value value, unsigned tag, unsigned base)
tree steps = build_int_cst_type (unsigned_type_node, value->hdata.intvl.steps);
ref_ptr = force_gimple_operand_bsi (&bsi,
- build_addr (ref),
+ build_addr (ref, current_function_decl),
true, NULL_TREE);
val = prepare_instrumented_value (&bsi, value);
args = tree_cons (NULL_TREE, ref_ptr,
@@ -168,7 +168,7 @@ tree_gen_pow2_profiler (histogram_value value, unsigned tag, unsigned base)
tree args, call, val;
ref_ptr = force_gimple_operand_bsi (&bsi,
- build_addr (ref),
+ build_addr (ref, current_function_decl),
true, NULL_TREE);
val = prepare_instrumented_value (&bsi, value);
args = tree_cons (NULL_TREE, ref_ptr,
@@ -191,7 +191,7 @@ tree_gen_one_value_profiler (histogram_value value, unsigned tag, unsigned base)
tree args, call, val;
ref_ptr = force_gimple_operand_bsi (&bsi,
- build_addr (ref),
+ build_addr (ref, current_function_decl),
true, NULL_TREE);
val = prepare_instrumented_value (&bsi, value);
args = tree_cons (NULL_TREE, ref_ptr,
diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c
index 4ff50e61890..49806b2e45d 100644
--- a/gcc/tree-scalar-evolution.c
+++ b/gcc/tree-scalar-evolution.c
@@ -235,7 +235,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
#include "tree.h"
@@ -350,33 +349,6 @@ find_var_scev_info (tree var)
return &res->chrec;
}
-/* Tries to express CHREC in wider type TYPE. */
-
-tree
-count_ev_in_wider_type (tree type, tree chrec)
-{
- tree base, step;
- struct loop *loop;
-
- if (!evolution_function_is_affine_p (chrec))
- return fold_convert (type, chrec);
-
- base = CHREC_LEFT (chrec);
- step = CHREC_RIGHT (chrec);
- loop = current_loops->parray[CHREC_VARIABLE (chrec)];
-
- /* TODO -- if we knew the statement at that the conversion occurs,
- we could pass it to can_count_iv_in_wider_type and get a better
- result. */
- step = can_count_iv_in_wider_type (loop, type, base, step, NULL_TREE);
- if (!step)
- return fold_convert (type, chrec);
- base = chrec_convert (type, base);
-
- return build_polynomial_chrec (CHREC_VARIABLE (chrec),
- base, step);
-}
-
/* Return true when CHREC contains symbolic names defined in
LOOP_NB. */
@@ -1053,6 +1025,7 @@ static bool follow_ssa_edge (struct loop *loop, tree, tree, tree *);
static bool
follow_ssa_edge_in_rhs (struct loop *loop,
+ tree at_stmt,
tree rhs,
tree halting_phi,
tree *evolution_of_loop)
@@ -1072,9 +1045,10 @@ follow_ssa_edge_in_rhs (struct loop *loop,
{
case NOP_EXPR:
/* This assignment is under the form "a_1 = (cast) rhs. */
- res = follow_ssa_edge_in_rhs (loop, TREE_OPERAND (rhs, 0), halting_phi,
- evolution_of_loop);
- *evolution_of_loop = chrec_convert (TREE_TYPE (rhs), *evolution_of_loop);
+ res = follow_ssa_edge_in_rhs (loop, at_stmt, TREE_OPERAND (rhs, 0),
+ halting_phi, evolution_of_loop);
+ *evolution_of_loop = chrec_convert (TREE_TYPE (rhs),
+ *evolution_of_loop, at_stmt);
break;
case INTEGER_CST:
@@ -1108,7 +1082,7 @@ follow_ssa_edge_in_rhs (struct loop *loop,
if (res)
*evolution_of_loop = add_to_evolution
(loop->num,
- chrec_convert (type_rhs, *evolution_of_loop),
+ chrec_convert (type_rhs, *evolution_of_loop, at_stmt),
PLUS_EXPR, rhs1);
else
@@ -1120,7 +1094,7 @@ follow_ssa_edge_in_rhs (struct loop *loop,
if (res)
*evolution_of_loop = add_to_evolution
(loop->num,
- chrec_convert (type_rhs, *evolution_of_loop),
+ chrec_convert (type_rhs, *evolution_of_loop, at_stmt),
PLUS_EXPR, rhs0);
}
}
@@ -1134,7 +1108,8 @@ follow_ssa_edge_in_rhs (struct loop *loop,
evolution_of_loop);
if (res)
*evolution_of_loop = add_to_evolution
- (loop->num, chrec_convert (type_rhs, *evolution_of_loop),
+ (loop->num, chrec_convert (type_rhs, *evolution_of_loop,
+ at_stmt),
PLUS_EXPR, rhs1);
}
}
@@ -1148,7 +1123,8 @@ follow_ssa_edge_in_rhs (struct loop *loop,
evolution_of_loop);
if (res)
*evolution_of_loop = add_to_evolution
- (loop->num, chrec_convert (type_rhs, *evolution_of_loop),
+ (loop->num, chrec_convert (type_rhs, *evolution_of_loop,
+ at_stmt),
PLUS_EXPR, rhs0);
}
@@ -1175,7 +1151,8 @@ follow_ssa_edge_in_rhs (struct loop *loop,
evolution_of_loop);
if (res)
*evolution_of_loop = add_to_evolution
- (loop->num, chrec_convert (type_rhs, *evolution_of_loop),
+ (loop->num, chrec_convert (type_rhs, *evolution_of_loop,
+ at_stmt),
MINUS_EXPR, rhs1);
}
else
@@ -1392,7 +1369,8 @@ follow_ssa_edge_inner_loop_phi (struct loop *outer_loop,
/* Follow the edges that exit the inner loop. */
bb = PHI_ARG_EDGE (loop_phi_node, i)->src;
if (!flow_bb_inside_loop_p (loop, bb))
- res = res || follow_ssa_edge_in_rhs (outer_loop, arg, halting_phi,
+ res = res || follow_ssa_edge_in_rhs (outer_loop, loop_phi_node,
+ arg, halting_phi,
evolution_of_loop);
}
@@ -1405,7 +1383,7 @@ follow_ssa_edge_inner_loop_phi (struct loop *outer_loop,
/* Otherwise, compute the overall effect of the inner loop. */
ev = compute_overall_effect_of_inner_loop (loop, ev);
- return follow_ssa_edge_in_rhs (outer_loop, ev, halting_phi,
+ return follow_ssa_edge_in_rhs (outer_loop, loop_phi_node, ev, halting_phi,
evolution_of_loop);
}
@@ -1457,7 +1435,7 @@ follow_ssa_edge (struct loop *loop,
return false;
case MODIFY_EXPR:
- return follow_ssa_edge_in_rhs (loop,
+ return follow_ssa_edge_in_rhs (loop, def,
TREE_OPERAND (def, 1),
halting_phi,
evolution_of_loop);
@@ -1666,14 +1644,14 @@ interpret_condition_phi (struct loop *loop, tree condition_phi)
analyze the effect of an inner loop: see interpret_loop_phi. */
static tree
-interpret_rhs_modify_expr (struct loop *loop,
+interpret_rhs_modify_expr (struct loop *loop, tree at_stmt,
tree opnd1, tree type)
{
tree res, opnd10, opnd11, chrec10, chrec11;
-
+
if (is_gimple_min_invariant (opnd1))
- return chrec_convert (type, opnd1);
-
+ return chrec_convert (type, opnd1, at_stmt);
+
switch (TREE_CODE (opnd1))
{
case PLUS_EXPR:
@@ -1681,8 +1659,8 @@ interpret_rhs_modify_expr (struct loop *loop,
opnd11 = TREE_OPERAND (opnd1, 1);
chrec10 = analyze_scalar_evolution (loop, opnd10);
chrec11 = analyze_scalar_evolution (loop, opnd11);
- chrec10 = chrec_convert (type, chrec10);
- chrec11 = chrec_convert (type, chrec11);
+ chrec10 = chrec_convert (type, chrec10, at_stmt);
+ chrec11 = chrec_convert (type, chrec11, at_stmt);
res = chrec_fold_plus (type, chrec10, chrec11);
break;
@@ -1691,15 +1669,15 @@ interpret_rhs_modify_expr (struct loop *loop,
opnd11 = TREE_OPERAND (opnd1, 1);
chrec10 = analyze_scalar_evolution (loop, opnd10);
chrec11 = analyze_scalar_evolution (loop, opnd11);
- chrec10 = chrec_convert (type, chrec10);
- chrec11 = chrec_convert (type, chrec11);
+ chrec10 = chrec_convert (type, chrec10, at_stmt);
+ chrec11 = chrec_convert (type, chrec11, at_stmt);
res = chrec_fold_minus (type, chrec10, chrec11);
break;
case NEGATE_EXPR:
opnd10 = TREE_OPERAND (opnd1, 0);
chrec10 = analyze_scalar_evolution (loop, opnd10);
- chrec10 = chrec_convert (type, chrec10);
+ chrec10 = chrec_convert (type, chrec10, at_stmt);
res = chrec_fold_minus (type, build_int_cst (type, 0), chrec10);
break;
@@ -1708,25 +1686,27 @@ interpret_rhs_modify_expr (struct loop *loop,
opnd11 = TREE_OPERAND (opnd1, 1);
chrec10 = analyze_scalar_evolution (loop, opnd10);
chrec11 = analyze_scalar_evolution (loop, opnd11);
- chrec10 = chrec_convert (type, chrec10);
- chrec11 = chrec_convert (type, chrec11);
+ chrec10 = chrec_convert (type, chrec10, at_stmt);
+ chrec11 = chrec_convert (type, chrec11, at_stmt);
res = chrec_fold_multiply (type, chrec10, chrec11);
break;
case SSA_NAME:
- res = chrec_convert (type, analyze_scalar_evolution (loop, opnd1));
+ res = chrec_convert (type, analyze_scalar_evolution (loop, opnd1),
+ at_stmt);
break;
case ASSERT_EXPR:
opnd10 = ASSERT_EXPR_VAR (opnd1);
- res = chrec_convert (type, analyze_scalar_evolution (loop, opnd10));
+ res = chrec_convert (type, analyze_scalar_evolution (loop, opnd10),
+ at_stmt);
break;
case NOP_EXPR:
case CONVERT_EXPR:
opnd10 = TREE_OPERAND (opnd1, 0);
chrec10 = analyze_scalar_evolution (loop, opnd10);
- res = chrec_convert (type, chrec10);
+ res = chrec_convert (type, chrec10, at_stmt);
break;
default:
@@ -1776,7 +1756,7 @@ analyze_scalar_evolution_1 (struct loop *loop, tree var, tree res)
return chrec_dont_know;
if (TREE_CODE (var) != SSA_NAME)
- return interpret_rhs_modify_expr (loop, var, type);
+ return interpret_rhs_modify_expr (loop, NULL_TREE, var, type);
def = SSA_NAME_DEF_STMT (var);
bb = bb_for_stmt (def);
@@ -1810,7 +1790,7 @@ analyze_scalar_evolution_1 (struct loop *loop, tree var, tree res)
switch (TREE_CODE (def))
{
case MODIFY_EXPR:
- res = interpret_rhs_modify_expr (loop, TREE_OPERAND (def, 1), type);
+ res = interpret_rhs_modify_expr (loop, def, TREE_OPERAND (def, 1), type);
break;
case PHI_NODE:
@@ -2094,7 +2074,7 @@ instantiate_parameters_1 (struct loop *loop, tree chrec,
if (op0 == TREE_OPERAND (chrec, 0))
return chrec;
- return chrec_convert (TREE_TYPE (chrec), op0);
+ return chrec_convert (TREE_TYPE (chrec), op0, NULL_TREE);
case SCEV_NOT_KNOWN:
return chrec_dont_know;
@@ -2504,8 +2484,8 @@ initialize_scalar_evolutions_analyzer (void)
chrec_not_analyzed_yet = NULL_TREE;
chrec_dont_know = make_node (SCEV_NOT_KNOWN);
chrec_known = make_node (SCEV_KNOWN);
- TREE_TYPE (chrec_dont_know) = NULL_TREE;
- TREE_TYPE (chrec_known) = NULL_TREE;
+ TREE_TYPE (chrec_dont_know) = void_type_node;
+ TREE_TYPE (chrec_known) = void_type_node;
}
}
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 78cd03b7bf5..7abdd3de34e 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -25,7 +25,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
#include "tree.h"
@@ -1095,7 +1094,7 @@ build_element_name (struct sra_elt *elt)
{
build_element_name_1 (elt);
obstack_1grow (&sra_obstack, '\0');
- return obstack_finish (&sra_obstack);
+ return XOBFINISH (&sra_obstack, char *);
}
/* Instantiate an element as an independent variable. */
@@ -1126,9 +1125,9 @@ instantiate_element (struct sra_elt *elt)
DECL_NAME (var) = get_identifier (pretty_name);
obstack_free (&sra_obstack, pretty_name);
- DECL_DEBUG_EXPR (var) = generate_element_ref (elt);
+ SET_DECL_DEBUG_EXPR (var, generate_element_ref (elt));
DECL_DEBUG_EXPR_IS_FROM (var) = 1;
-
+
DECL_IGNORED_P (var) = 0;
TREE_NO_WARNING (var) = TREE_NO_WARNING (base);
}
diff --git a/gcc/tree-ssa-address.c b/gcc/tree-ssa-address.c
new file mode 100644
index 00000000000..67bbc4a1d6d
--- /dev/null
+++ b/gcc/tree-ssa-address.c
@@ -0,0 +1,707 @@
+/* Memory address lowering and addressing mode selection.
+ Copyright (C) 2004 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. */
+
+/* Utility functions for manipulation with TARGET_MEM_REFs -- tree expressions
+ that directly map to addressing modes of the target. */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
+#include "tree.h"
+#include "rtl.h"
+#include "tm_p.h"
+#include "hard-reg-set.h"
+#include "basic-block.h"
+#include "output.h"
+#include "diagnostic.h"
+#include "tree-flow.h"
+#include "tree-dump.h"
+#include "tree-pass.h"
+#include "timevar.h"
+#include "flags.h"
+#include "tree-inline.h"
+#include "insn-config.h"
+#include "recog.h"
+#include "expr.h"
+#include "ggc.h"
+
+/* TODO -- handling of symbols (according to Richard Hendersons
+ comments, http://gcc.gnu.org/ml/gcc-patches/2005-04/msg00949.html):
+
+ There are at least 5 different kinds of symbols that we can run up against:
+
+ (1) binds_local_p, small data area.
+ (2) binds_local_p, eg local statics
+ (3) !binds_local_p, eg global variables
+ (4) thread local, local_exec
+ (5) thread local, !local_exec
+
+ Now, (1) won't appear often in an array context, but it certainly can.
+ All you have to do is set -GN high enough, or explicitly mark any
+ random object __attribute__((section (".sdata"))).
+
+ All of these affect whether or not a symbol is in fact a valid address.
+ The only one tested here is (3). And that result may very well
+ be incorrect for (4) or (5).
+
+ An incorrect result here does not cause incorrect results out the
+ back end, because the expander in expr.c validizes the address. However
+ it would be nice to improve the handling here in order to produce more
+ precise results. */
+
+/* A "template" for memory address, used to determine whether the address is
+ valid for mode. */
+
+struct mem_addr_template GTY (())
+{
+ rtx ref; /* The template. */
+ rtx * GTY ((skip)) step_p; /* The point in template where the step should be
+ filled in. */
+ rtx * GTY ((skip)) off_p; /* The point in template where the offset should
+ be filled in. */
+};
+
+/* The templates. Each of the five bits of the index corresponds to one
+ component of TARGET_MEM_REF being present, see TEMPL_IDX. */
+
+static GTY (()) struct mem_addr_template templates[32];
+
+#define TEMPL_IDX(SYMBOL, BASE, INDEX, STEP, OFFSET) \
+ (((SYMBOL != 0) << 4) \
+ | ((BASE != 0) << 3) \
+ | ((INDEX != 0) << 2) \
+ | ((STEP != 0) << 1) \
+ | (OFFSET != 0))
+
+/* Stores address for memory reference with parameters SYMBOL, BASE, INDEX,
+ STEP and OFFSET to *ADDR. Stores pointers to where step is placed to
+ *STEP_P and offset to *OFFSET_P. */
+
+static void
+gen_addr_rtx (rtx symbol, rtx base, rtx index, rtx step, rtx offset,
+ rtx *addr, rtx **step_p, rtx **offset_p)
+{
+ rtx act_elem;
+
+ *addr = NULL_RTX;
+ if (step_p)
+ *step_p = NULL;
+ if (offset_p)
+ *offset_p = NULL;
+
+ if (index)
+ {
+ act_elem = index;
+ if (step)
+ {
+ act_elem = gen_rtx_MULT (Pmode, act_elem, step);
+
+ if (step_p)
+ *step_p = &XEXP (act_elem, 1);
+ }
+
+ *addr = act_elem;
+ }
+
+ if (base)
+ {
+ if (*addr)
+ *addr = gen_rtx_PLUS (Pmode, *addr, base);
+ else
+ *addr = base;
+ }
+
+ if (symbol)
+ {
+ act_elem = symbol;
+ if (offset)
+ {
+ act_elem = gen_rtx_CONST (Pmode,
+ gen_rtx_PLUS (Pmode, act_elem, offset));
+ if (offset_p)
+ *offset_p = &XEXP (XEXP (act_elem, 0), 1);
+ }
+
+ if (*addr)
+ *addr = gen_rtx_PLUS (Pmode, *addr, act_elem);
+ else
+ *addr = act_elem;
+ }
+ else if (offset)
+ {
+ if (*addr)
+ {
+ *addr = gen_rtx_PLUS (Pmode, *addr, offset);
+ if (offset_p)
+ *offset_p = &XEXP (*addr, 1);
+ }
+ else
+ {
+ *addr = offset;
+ if (offset_p)
+ *offset_p = addr;
+ }
+ }
+
+ if (!*addr)
+ *addr = const0_rtx;
+}
+
+/* Returns address for TARGET_MEM_REF with parameters given by ADDR.
+ If REALLY_EXPAND is false, just make fake registers instead
+ of really expanding the operands, and perform the expansion in-place
+ by using one of the "templates". */
+
+rtx
+addr_for_mem_ref (struct mem_address *addr, bool really_expand)
+{
+ rtx address, sym, bse, idx, st, off;
+ static bool templates_initialized = false;
+ struct mem_addr_template *templ;
+
+ if (addr->step && !integer_onep (addr->step))
+ st = immed_double_const (TREE_INT_CST_LOW (addr->step),
+ TREE_INT_CST_HIGH (addr->step), Pmode);
+ else
+ st = NULL_RTX;
+
+ if (addr->offset && !integer_zerop (addr->offset))
+ off = immed_double_const (TREE_INT_CST_LOW (addr->offset),
+ TREE_INT_CST_HIGH (addr->offset), Pmode);
+ else
+ off = NULL_RTX;
+
+ if (!really_expand)
+ {
+ /* Reuse the templates for addresses, so that we do not waste memory. */
+ if (!templates_initialized)
+ {
+ unsigned i;
+
+ templates_initialized = true;
+ sym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup ("test_symbol"));
+ bse = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1);
+ idx = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 2);
+
+ for (i = 0; i < 32; i++)
+ gen_addr_rtx ((i & 16 ? sym : NULL_RTX),
+ (i & 8 ? bse : NULL_RTX),
+ (i & 4 ? idx : NULL_RTX),
+ (i & 2 ? const0_rtx : NULL_RTX),
+ (i & 1 ? const0_rtx : NULL_RTX),
+ &templates[i].ref,
+ &templates[i].step_p,
+ &templates[i].off_p);
+ }
+
+ templ = templates + TEMPL_IDX (addr->symbol, addr->base, addr->index,
+ st, off);
+ if (st)
+ *templ->step_p = st;
+ if (off)
+ *templ->off_p = off;
+
+ return templ->ref;
+ }
+
+ /* Otherwise really expand the expressions. */
+ sym = (addr->symbol
+ ? expand_expr (build_addr (addr->symbol, current_function_decl),
+ NULL_RTX, Pmode, EXPAND_NORMAL)
+ : NULL_RTX);
+ bse = (addr->base
+ ? expand_expr (addr->base, NULL_RTX, Pmode, EXPAND_NORMAL)
+ : NULL_RTX);
+ idx = (addr->index
+ ? expand_expr (addr->index, NULL_RTX, Pmode, EXPAND_NORMAL)
+ : NULL_RTX);
+
+ gen_addr_rtx (sym, bse, idx, st, off, &address, NULL, NULL);
+ return address;
+}
+
+/* Returns address of MEM_REF in TYPE. */
+
+tree
+tree_mem_ref_addr (tree type, tree mem_ref)
+{
+ tree addr = NULL_TREE;
+ tree act_elem;
+ tree step = TMR_STEP (mem_ref), offset = TMR_OFFSET (mem_ref);
+
+ act_elem = TMR_INDEX (mem_ref);
+ if (act_elem)
+ {
+ act_elem = fold_convert (type, act_elem);
+
+ if (step)
+ act_elem = fold_build2 (MULT_EXPR, type, act_elem,
+ fold_convert (type, step));
+ addr = act_elem;
+ }
+
+ act_elem = TMR_BASE (mem_ref);
+ if (act_elem)
+ {
+ act_elem = fold_convert (type, act_elem);
+
+ if (addr)
+ addr = fold_build2 (PLUS_EXPR, type, addr, act_elem);
+ else
+ addr = act_elem;
+ }
+
+ act_elem = TMR_SYMBOL (mem_ref);
+ if (act_elem)
+ {
+ act_elem = fold_convert (type, build_addr (act_elem,
+ current_function_decl));
+ if (addr)
+ addr = fold_build2 (PLUS_EXPR, type, addr, act_elem);
+ else
+ addr = act_elem;
+ }
+
+ if (!zero_p (offset))
+ {
+ act_elem = fold_convert (type, offset);
+
+ if (addr)
+ addr = fold_build2 (PLUS_EXPR, type, addr, act_elem);
+ else
+ addr = act_elem;
+ }
+
+ if (!addr)
+ addr = build_int_cst (type, 0);
+
+ return addr;
+}
+
+/* Returns true if a memory reference in MODE and with parameters given by
+ ADDR is valid on the current target. */
+
+static bool
+valid_mem_ref_p (enum machine_mode mode, struct mem_address *addr)
+{
+ rtx address;
+
+ address = addr_for_mem_ref (addr, false);
+ if (!address)
+ return false;
+
+ return memory_address_p (mode, address);
+}
+
+/* Checks whether a TARGET_MEM_REF with type TYPE and parameters given by ADDR
+ is valid on the current target and if so, creates and returns the
+ TARGET_MEM_REF. */
+
+static tree
+create_mem_ref_raw (tree type, struct mem_address *addr)
+{
+ if (!valid_mem_ref_p (TYPE_MODE (type), addr))
+ return NULL_TREE;
+
+ if (addr->step && integer_onep (addr->step))
+ addr->step = NULL_TREE;
+
+ if (addr->offset && zero_p (addr->offset))
+ addr->offset = NULL_TREE;
+
+ return build7 (TARGET_MEM_REF, type,
+ addr->symbol, addr->base, addr->index,
+ addr->step, addr->offset, NULL, NULL);
+}
+
+/* Returns true if OBJ is an object whose address is a link time constant. */
+
+static bool
+fixed_address_object_p (tree obj)
+{
+ return (TREE_CODE (obj) == VAR_DECL
+ && (TREE_STATIC (obj)
+ || DECL_EXTERNAL (obj)));
+}
+
+/* Adds COEF * ELT to PARTS. TYPE is the type of the address we
+ construct. */
+
+static void
+add_to_parts (struct mem_address *parts, tree type, tree elt,
+ unsigned HOST_WIDE_INT coef)
+{
+ /* Check if this is a symbol. */
+ if (!parts->symbol
+ && coef == 1
+ && TREE_CODE (elt) == ADDR_EXPR
+ && fixed_address_object_p (TREE_OPERAND (elt, 0)))
+ {
+ parts->symbol = TREE_OPERAND (elt, 0);
+ return;
+ }
+
+ if (coef != 1)
+ elt = fold_build2 (MULT_EXPR, type, fold_convert (type, elt),
+ build_int_cst_type (type, coef));
+ else
+ elt = fold_convert (type, elt);
+
+ if (!parts->base)
+ {
+ parts->base = elt;
+ return;
+ }
+
+ if (!parts->index)
+ {
+ parts->index = elt;
+ return;
+ }
+
+ /* Add ELT to base. */
+ parts->base = fold_build2 (PLUS_EXPR, type, parts->base, elt);
+}
+
+/* Finds the most expensive multiplication in ADDR that can be
+ expressed in an addressing mode and move the corresponding
+ element(s) to PARTS. TYPE is the type of the address we
+ construct. */
+
+static void
+most_expensive_mult_to_index (struct mem_address *parts, tree type,
+ struct affine_tree_combination *addr)
+{
+ unsigned HOST_WIDE_INT best_mult = 0;
+ unsigned best_mult_cost = 0, acost;
+ tree mult_elt = NULL_TREE, elt;
+ unsigned i, j;
+
+ for (i = 0; i < addr->n; i++)
+ {
+ if (addr->coefs[i] == 1
+ || !multiplier_allowed_in_address_p (addr->coefs[i]))
+ continue;
+
+ acost = multiply_by_cost (addr->coefs[i], Pmode);
+
+ if (acost > best_mult_cost)
+ {
+ best_mult_cost = acost;
+ best_mult = addr->coefs[i];
+ }
+ }
+
+ if (!best_mult)
+ return;
+
+ for (i = j = 0; i < addr->n; i++)
+ {
+ if (addr->coefs[i] != best_mult)
+ {
+ addr->coefs[j] = addr->coefs[i];
+ addr->elts[j] = addr->elts[i];
+ j++;
+ continue;
+ }
+
+ elt = fold_convert (type, addr->elts[i]);
+ if (!mult_elt)
+ mult_elt = elt;
+ else
+ mult_elt = fold_build2 (PLUS_EXPR, type, mult_elt, elt);
+ }
+ addr->n = j;
+
+ parts->index = mult_elt;
+ parts->step = build_int_cst_type (type, best_mult);
+}
+
+/* Splits address ADDR into PARTS.
+
+ TODO -- be more clever about the distribution of the elements of ADDR
+ to PARTS. Some architectures do not support anything but single
+ register in address, possibly with a small integer offset; while
+ create_mem_ref will simplify the address to an acceptable shape
+ later, it would be a small bit more efficient to know that asking
+ for complicated addressing modes is useless. */
+
+static void
+addr_to_parts (struct affine_tree_combination *addr, tree type,
+ struct mem_address *parts)
+{
+ unsigned i;
+
+ parts->symbol = NULL_TREE;
+ parts->base = NULL_TREE;
+ parts->index = NULL_TREE;
+ parts->step = NULL_TREE;
+
+ if (addr->offset)
+ parts->offset = build_int_cst_type (type, addr->offset);
+ else
+ parts->offset = NULL_TREE;
+
+ /* First move the most expensive feasible multiplication
+ to index. */
+ most_expensive_mult_to_index (parts, type, addr);
+
+ /* Then try to process the remaining elements. */
+ for (i = 0; i < addr->n; i++)
+ add_to_parts (parts, type, addr->elts[i], addr->coefs[i]);
+ if (addr->rest)
+ add_to_parts (parts, type, addr->rest, 1);
+}
+
+/* Force the PARTS to register. */
+
+static void
+gimplify_mem_ref_parts (block_stmt_iterator *bsi, struct mem_address *parts)
+{
+ if (parts->base)
+ parts->base = force_gimple_operand_bsi (bsi, parts->base,
+ true, NULL_TREE);
+ if (parts->index)
+ parts->index = force_gimple_operand_bsi (bsi, parts->index,
+ true, NULL_TREE);
+}
+
+/* Creates and returns a TARGET_MEM_REF for address ADDR. If necessary
+ computations are emitted in front of BSI. TYPE is the mode
+ of created memory reference. */
+
+tree
+create_mem_ref (block_stmt_iterator *bsi, tree type,
+ struct affine_tree_combination *addr)
+{
+ tree mem_ref, tmp;
+ tree addr_type = build_pointer_type (type);
+ struct mem_address parts;
+
+ addr_to_parts (addr, addr_type, &parts);
+ gimplify_mem_ref_parts (bsi, &parts);
+ mem_ref = create_mem_ref_raw (type, &parts);
+ if (mem_ref)
+ return mem_ref;
+
+ /* The expression is too complicated. Try making it simpler. */
+
+ if (parts.step && !integer_onep (parts.step))
+ {
+ /* Move the multiplication to index. */
+ gcc_assert (parts.index);
+ parts.index = force_gimple_operand_bsi (bsi,
+ build2 (MULT_EXPR, addr_type,
+ parts.index, parts.step),
+ true, NULL_TREE);
+ parts.step = NULL_TREE;
+
+ mem_ref = create_mem_ref_raw (type, &parts);
+ if (mem_ref)
+ return mem_ref;
+ }
+
+ if (parts.symbol)
+ {
+ tmp = build_addr (parts.symbol, current_function_decl);
+
+ /* Add the symbol to base, eventually forcing it to register. */
+ if (parts.base)
+ parts.base = force_gimple_operand_bsi (bsi,
+ build2 (PLUS_EXPR, addr_type,
+ parts.base, tmp),
+ true, NULL_TREE);
+ else
+ parts.base = tmp;
+ parts.symbol = NULL_TREE;
+
+ mem_ref = create_mem_ref_raw (type, &parts);
+ if (mem_ref)
+ return mem_ref;
+ }
+
+ if (parts.base)
+ {
+ /* Add base to index. */
+ if (parts.index)
+ parts.index = force_gimple_operand_bsi (bsi,
+ build2 (PLUS_EXPR, addr_type,
+ parts.base,
+ parts.index),
+ true, NULL_TREE);
+ else
+ parts.index = parts.base;
+ parts.base = NULL_TREE;
+
+ mem_ref = create_mem_ref_raw (type, &parts);
+ if (mem_ref)
+ return mem_ref;
+ }
+
+ if (parts.offset && !integer_zerop (parts.offset))
+ {
+ /* Try adding offset to index. */
+ if (parts.index)
+ parts.index = force_gimple_operand_bsi (bsi,
+ build2 (PLUS_EXPR, addr_type,
+ parts.index,
+ parts.offset),
+ true, NULL_TREE);
+ else
+ parts.index = parts.offset, bsi;
+
+ parts.offset = NULL_TREE;
+
+ mem_ref = create_mem_ref_raw (type, &parts);
+ if (mem_ref)
+ return mem_ref;
+ }
+
+ /* Verify that the address is in the simplest possible shape
+ (only a register). If we cannot create such a memory reference,
+ something is really wrong. */
+ gcc_assert (parts.symbol == NULL_TREE);
+ gcc_assert (parts.base == NULL_TREE);
+ gcc_assert (!parts.step || integer_onep (parts.step));
+ gcc_assert (!parts.offset || integer_zerop (parts.offset));
+ gcc_unreachable ();
+}
+
+/* Copies components of the address from OP to ADDR. */
+
+void
+get_address_description (tree op, struct mem_address *addr)
+{
+ addr->symbol = TMR_SYMBOL (op);
+ addr->base = TMR_BASE (op);
+ addr->index = TMR_INDEX (op);
+ addr->step = TMR_STEP (op);
+ addr->offset = TMR_OFFSET (op);
+}
+
+/* Copies the additional information attached to target_mem_ref FROM to TO. */
+
+void
+copy_mem_ref_info (tree to, tree from)
+{
+ /* Copy the annotation, to preserve the aliasing information. */
+ TMR_TAG (to) = TMR_TAG (from);
+
+ /* And the info about the original reference. */
+ TMR_ORIGINAL (to) = TMR_ORIGINAL (from);
+}
+
+/* Move constants in target_mem_ref REF to offset. Returns the new target
+ mem ref if anything changes, NULL_TREE otherwise. */
+
+tree
+maybe_fold_tmr (tree ref)
+{
+ struct mem_address addr;
+ bool changed = false;
+ tree ret, off;
+
+ get_address_description (ref, &addr);
+
+ if (addr.base && TREE_CODE (addr.base) == INTEGER_CST)
+ {
+ if (addr.offset)
+ addr.offset = fold_binary_to_constant (PLUS_EXPR, ptr_type_node,
+ addr.offset, addr.base);
+ else
+ addr.offset = addr.base;
+
+ addr.base = NULL_TREE;
+ changed = true;
+ }
+
+ if (addr.index && TREE_CODE (addr.index) == INTEGER_CST)
+ {
+ off = addr.index;
+ if (addr.step)
+ {
+ off = fold_binary_to_constant (MULT_EXPR, ptr_type_node,
+ off, addr.step);
+ addr.step = NULL_TREE;
+ }
+
+ if (addr.offset)
+ {
+ addr.offset = fold_binary_to_constant (PLUS_EXPR, ptr_type_node,
+ addr.offset, off);
+ }
+ else
+ addr.offset = off;
+
+ addr.index = NULL_TREE;
+ changed = true;
+ }
+
+ if (!changed)
+ return NULL_TREE;
+
+ ret = create_mem_ref_raw (TREE_TYPE (ref), &addr);
+ if (!ret)
+ return NULL_TREE;
+
+ copy_mem_ref_info (ret, ref);
+ return ret;
+}
+
+/* Dump PARTS to FILE. */
+
+extern void dump_mem_address (FILE *, struct mem_address *);
+void
+dump_mem_address (FILE *file, struct mem_address *parts)
+{
+ if (parts->symbol)
+ {
+ fprintf (file, "symbol: ");
+ print_generic_expr (file, parts->symbol, TDF_SLIM);
+ fprintf (file, "\n");
+ }
+ if (parts->base)
+ {
+ fprintf (file, "base: ");
+ print_generic_expr (file, parts->base, TDF_SLIM);
+ fprintf (file, "\n");
+ }
+ if (parts->index)
+ {
+ fprintf (file, "index: ");
+ print_generic_expr (file, parts->index, TDF_SLIM);
+ fprintf (file, "\n");
+ }
+ if (parts->step)
+ {
+ fprintf (file, "step: ");
+ print_generic_expr (file, parts->step, TDF_SLIM);
+ fprintf (file, "\n");
+ }
+ if (parts->offset)
+ {
+ fprintf (file, "offset: ");
+ print_generic_expr (file, parts->offset, TDF_SLIM);
+ fprintf (file, "\n");
+ }
+}
+
+#include "gt-tree-ssa-address.h"
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index 5e796c1da52..3098549d881 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -642,7 +642,6 @@ compute_points_to_and_addr_escape (struct alias_info *ai)
FOR_EACH_BB (bb)
{
- bb_ann_t block_ann = bb_ann (bb);
block_stmt_iterator si;
for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
@@ -666,9 +665,6 @@ compute_points_to_and_addr_escape (struct alias_info *ai)
mark_call_clobbered (var);
}
- if (stmt_escapes_p)
- block_ann->has_escape_site = 1;
-
FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
{
var_ann_t v_ann = var_ann (SSA_NAME_VAR (op));
@@ -878,7 +874,16 @@ static void
compute_flow_sensitive_aliasing (struct alias_info *ai)
{
size_t i;
-
+
+ for (i = 0; i < VARRAY_ACTIVE_SIZE (ai->processed_ptrs); i++)
+ {
+ tree ptr = VARRAY_TREE (ai->processed_ptrs, i);
+ struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
+ if (pi->pt_anything || pi->pt_vars == NULL)
+ {
+ find_what_p_points_to (ptr);
+ }
+ }
create_name_tags (ai);
for (i = 0; i < VARRAY_ACTIVE_SIZE (ai->processed_ptrs); i++)
@@ -1077,12 +1082,13 @@ compute_flow_insensitive_aliasing (struct alias_info *ai)
if (sbitmap_first_set_bit (may_aliases2) >= 0)
{
- size_t k;
+ unsigned int k;
+ sbitmap_iterator sbi;
/* Add all the aliases for TAG2 into TAG1's alias set.
FIXME, update grouping heuristic counters. */
- EXECUTE_IF_SET_IN_SBITMAP (may_aliases2, 0, k,
- add_may_alias (tag1, referenced_var (k)));
+ EXECUTE_IF_SET_IN_SBITMAP (may_aliases2, 0, k, sbi)
+ add_may_alias (tag1, referenced_var (k));
sbitmap_a_or_b (may_aliases1, may_aliases1, may_aliases2);
}
else
@@ -1137,11 +1143,12 @@ total_alias_vops_cmp (const void *p, const void *q)
static void
group_aliases_into (tree tag, sbitmap tag_aliases, struct alias_info *ai)
{
- size_t i;
+ unsigned int i;
var_ann_t tag_ann = var_ann (tag);
size_t num_tag_refs = VARRAY_UINT (ai->num_references, tag_ann->uid);
+ sbitmap_iterator sbi;
- EXECUTE_IF_SET_IN_SBITMAP (tag_aliases, 0, i,
+ EXECUTE_IF_SET_IN_SBITMAP (tag_aliases, 0, i, sbi)
{
tree var = referenced_var (i);
var_ann_t ann = var_ann (var);
@@ -1161,7 +1168,7 @@ group_aliases_into (tree tag, sbitmap tag_aliases, struct alias_info *ai)
itself won't be removed. We will merely replace them with
references to TAG. */
ai->total_alias_vops -= num_tag_refs;
- });
+ }
/* We have reduced the number of virtual operands that TAG makes on
behalf of all the variables formerly aliased with it. However,
@@ -2780,81 +2787,72 @@ found_tag:
}
-/* This structure is simply used during pushing fields onto the fieldstack
- to track the offset of the field, since bitpos_of_field gives it relative
- to its immediate containing type, and we want it relative to the ultimate
- containing object. */
+/* Create a new type tag for PTR. Construct the may-alias list of this type
+ tag so that it has the aliasing of VAR.
-typedef struct fieldoff
-{
- tree field;
- HOST_WIDE_INT offset;
-} fieldoff_s;
+ Note, the set of aliases represented by the new type tag are not marked
+ for renaming. */
-DEF_VEC_O (fieldoff_s);
-DEF_VEC_ALLOC_O(fieldoff_s,heap);
+void
+new_type_alias (tree ptr, tree var)
+{
+ var_ann_t p_ann = var_ann (ptr);
+ tree tag_type = TREE_TYPE (TREE_TYPE (ptr));
+ var_ann_t v_ann = var_ann (var);
+ tree tag;
+ subvar_t svars;
-/* Return the position, in bits, of FIELD_DECL from the beginning of its
- structure.
- Return -1 if the position is conditional or otherwise non-constant
- integer. */
+ gcc_assert (p_ann->type_mem_tag == NULL_TREE);
+ gcc_assert (v_ann->mem_tag_kind == NOT_A_TAG);
-static HOST_WIDE_INT
-bitpos_of_field (const tree fdecl)
-{
+ /* Add VAR to the may-alias set of PTR's new type tag. If VAR has
+ subvars, add the subvars to the tag instead of the actual var. */
+ if (var_can_have_subvars (var)
+ && (svars = get_subvars_for_var (var)))
+ {
+ subvar_t sv;
- if (TREE_CODE (DECL_FIELD_OFFSET (fdecl)) != INTEGER_CST
- || TREE_CODE (DECL_FIELD_BIT_OFFSET (fdecl)) != INTEGER_CST)
- return -1;
+ tag = create_memory_tag (tag_type, true);
+ p_ann->type_mem_tag = tag;
- return (tree_low_cst (DECL_FIELD_OFFSET (fdecl), 1) * 8)
- + tree_low_cst (DECL_FIELD_BIT_OFFSET (fdecl), 1);
-}
+ for (sv = svars; sv; sv = sv->next)
+ add_may_alias (tag, sv->var);
+ }
+ else
+ {
+ /* The following is based on code in add_stmt_operand to ensure that the
+ same defs/uses/vdefs/vuses will be found after replacing a reference
+ to var (or ARRAY_REF to var) with an INDIRECT_REF to ptr whose value
+ is the address of var. */
+ varray_type aliases = v_ann->may_aliases;
+
+ if ((aliases != NULL)
+ && (VARRAY_ACTIVE_SIZE (aliases) == 1))
+ {
+ tree ali = VARRAY_TREE (aliases, 0);
-/* Given a TYPE, and a vector of field offsets FIELDSTACK, push all the fields
- of TYPE onto fieldstack, recording their offsets along the way.
- OFFSET is used to keep track of the offset in this entire structure, rather
- than just the immediately containing structure. Returns the number
- of fields pushed. */
+ if (get_var_ann (ali)->mem_tag_kind == TYPE_TAG)
+ {
+ p_ann->type_mem_tag = ali;
+ return;
+ }
+ }
-static int
-push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack,
- HOST_WIDE_INT offset)
-{
- tree field;
- int count = 0;
+ tag = create_memory_tag (tag_type, true);
+ p_ann->type_mem_tag = tag;
- for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
- if (TREE_CODE (field) == FIELD_DECL)
- {
- bool push = false;
-
- if (!var_can_have_subvars (field))
- push = true;
- else if (!(push_fields_onto_fieldstack
- (TREE_TYPE (field), fieldstack,
- offset + bitpos_of_field (field)))
- && DECL_SIZE (field)
- && !integer_zerop (DECL_SIZE (field)))
- /* Empty structures may have actual size, like in C++. So
- see if we didn't push any subfields and the size is
- nonzero, push the field onto the stack */
- push = true;
-
- if (push)
- {
- fieldoff_s *pair;
+ if (aliases == NULL)
+ add_may_alias (tag, var);
+ else
+ {
+ size_t i;
- pair = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL);
- pair->field = field;
- pair->offset = offset + bitpos_of_field (field);
- count++;
- }
- }
- return count;
+ for (i = 0; i < VARRAY_ACTIVE_SIZE (aliases); i++)
+ add_may_alias (tag, VARRAY_TREE (aliases, i));
+ }
+ }
}
-
/* This represents the used range of a variable. */
typedef struct used_part
@@ -2894,22 +2892,6 @@ get_or_create_used_part_for (size_t uid)
return up;
}
-/* qsort comparison function for two fieldoff's PA and PB */
-
-static int
-fieldoff_compare (const void *pa, const void *pb)
-{
- const fieldoff_s *foa = (const fieldoff_s *)pa;
- const fieldoff_s *fob = (const fieldoff_s *)pb;
- HOST_WIDE_INT foasize, fobsize;
-
- if (foa->offset != fob->offset)
- return foa->offset - fob->offset;
-
- foasize = TREE_INT_CST_LOW (DECL_SIZE (foa->field));
- fobsize = TREE_INT_CST_LOW (DECL_SIZE (fob->field));
- return foasize - fobsize;
-}
/* Given an aggregate VAR, create the subvariables that represent its
fields. */
@@ -2925,7 +2907,7 @@ create_overlap_variables_for (tree var)
return;
up = used_portions[uid];
- push_fields_onto_fieldstack (TREE_TYPE (var), &fieldstack, 0);
+ push_fields_onto_fieldstack (TREE_TYPE (var), &fieldstack, 0, NULL);
if (VEC_length (fieldoff_s, fieldstack) != 0)
{
subvar_t *subvars;
@@ -2993,10 +2975,7 @@ create_overlap_variables_for (tree var)
/* Otherwise, create the variables. */
subvars = lookup_subvars_for_var (var);
- qsort (VEC_address (fieldoff_s, fieldstack),
- VEC_length (fieldoff_s, fieldstack),
- sizeof (fieldoff_s),
- fieldoff_compare);
+ sort_fieldstack (fieldstack);
for (i = VEC_length (fieldoff_s, fieldstack);
VEC_iterate (fieldoff_s, fieldstack, --i, fo);)
diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c
index 45472f402ab..6816dafd6c1 100644
--- a/gcc/tree-ssa-ccp.c
+++ b/gcc/tree-ssa-ccp.c
@@ -199,7 +199,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "ggc.h"
#include "basic-block.h"
#include "output.h"
-#include "errors.h"
#include "expr.h"
#include "function.h"
#include "diagnostic.h"
@@ -228,7 +227,7 @@ typedef enum
(i.e., a V_MAY_DEF or V_MUST_DEF), CONST_VAL[I].MEM_REF will
contain the actual memory reference used to store (i.e., the LHS of
the assignment doing the store). */
-prop_value_t *const_val;
+static prop_value_t *const_val;
/* True if we are also propagating constants in stores and loads. */
static bool do_store_ccp;
@@ -581,7 +580,7 @@ static void
ccp_finalize (void)
{
/* Perform substitutions based on the known constant values. */
- substitute_and_fold (const_val);
+ substitute_and_fold (const_val, false);
free (const_val);
}
@@ -849,27 +848,7 @@ ccp_fold (tree stmt)
op0 = get_value (op0, true)->value;
}
- retval = fold_unary_to_constant (code, TREE_TYPE (rhs), op0);
-
- /* If we folded, but did not create an invariant, then we can not
- use this expression. */
- if (retval && ! is_gimple_min_invariant (retval))
- return NULL;
-
- /* If we could not fold the expression, but the arguments are all
- constants and gimple values, then build and return the new
- expression.
-
- In some cases the new expression is still something we can
- use as a replacement for an argument. This happens with
- NOP conversions of types for example.
-
- In other cases the new expression can not be used as a
- replacement for an argument (as it would create non-gimple
- code). But the new expression can still be used to derive
- other constants. */
- if (! retval && is_gimple_min_invariant (op0))
- return build1 (code, TREE_TYPE (rhs), op0);
+ return fold_unary (code, TREE_TYPE (rhs), op0);
}
/* Binary and comparison operators. We know one or both of the
@@ -900,29 +879,7 @@ ccp_fold (tree stmt)
op1 = val->value;
}
- retval = fold_binary_to_constant (code, TREE_TYPE (rhs), op0, op1);
-
- /* If we folded, but did not create an invariant, then we can not
- use this expression. */
- if (retval && ! is_gimple_min_invariant (retval))
- return NULL;
-
- /* If we could not fold the expression, but the arguments are all
- constants and gimple values, then build and return the new
- expression.
-
- In some cases the new expression is still something we can
- use as a replacement for an argument. This happens with
- NOP conversions of types for example.
-
- In other cases the new expression can not be used as a
- replacement for an argument (as it would create non-gimple
- code). But the new expression can still be used to derive
- other constants. */
- if (! retval
- && is_gimple_min_invariant (op0)
- && is_gimple_min_invariant (op1))
- return build (code, TREE_TYPE (rhs), op0, op1);
+ return fold_binary (code, TREE_TYPE (rhs), op0, op1);
}
/* We may be able to fold away calls to builtin functions if their
@@ -1917,7 +1874,6 @@ maybe_fold_stmt_addition (tree expr)
return t;
}
-
/* Subroutine of fold_stmt called via walk_tree. We perform several
simplifications of EXPR_P, mostly having to do with pointer arithmetic. */
@@ -1991,6 +1947,10 @@ fold_stmt_r (tree *expr_p, int *walk_subtrees, void *data)
}
break;
+ case TARGET_MEM_REF:
+ t = maybe_fold_tmr (expr);
+ break;
+
default:
return NULL_TREE;
}
diff --git a/gcc/tree-ssa-copy.c b/gcc/tree-ssa-copy.c
index 5f4033d3a9b..10b09898dbc 100644
--- a/gcc/tree-ssa-copy.c
+++ b/gcc/tree-ssa-copy.c
@@ -29,7 +29,6 @@ Boston, MA 02111-1307, USA. */
#include "ggc.h"
#include "basic-block.h"
#include "output.h"
-#include "errors.h"
#include "expr.h"
#include "function.h"
#include "diagnostic.h"
@@ -475,24 +474,31 @@ static void
dump_copy_of (FILE *dump_file, tree var)
{
tree val;
+ sbitmap visited;
print_generic_expr (dump_file, var, dump_flags);
if (TREE_CODE (var) != SSA_NAME)
return;
-
+
+ visited = sbitmap_alloc (num_ssa_names);
+ sbitmap_zero (visited);
+ SET_BIT (visited, SSA_NAME_VERSION (var));
+
fprintf (dump_file, " copy-of chain: ");
val = var;
print_generic_expr (dump_file, val, 0);
fprintf (dump_file, " ");
- while (copy_of[SSA_NAME_VERSION (val)].value
- && copy_of[SSA_NAME_VERSION (val)].value != val)
+ while (copy_of[SSA_NAME_VERSION (val)].value)
{
fprintf (dump_file, "-> ");
val = copy_of[SSA_NAME_VERSION (val)].value;
print_generic_expr (dump_file, val, 0);
fprintf (dump_file, " ");
+ if (TEST_BIT (visited, SSA_NAME_VERSION (val)))
+ break;
+ SET_BIT (visited, SSA_NAME_VERSION (val));
}
val = get_copy_of_val (var)->value;
@@ -502,6 +508,8 @@ dump_copy_of (FILE *dump_file, tree var)
fprintf (dump_file, "[COPY]");
else
fprintf (dump_file, "[NOT A COPY]");
+
+ sbitmap_free (visited);
}
@@ -887,7 +895,7 @@ fini_copy_prop (void)
copy_of[i].value = get_last_copy_of (var);
}
- substitute_and_fold (copy_of);
+ substitute_and_fold (copy_of, false);
free (cached_last_copy_of);
free (copy_of);
diff --git a/gcc/tree-ssa-copyrename.c b/gcc/tree-ssa-copyrename.c
index 393bfb600c6..6656e6ee543 100644
--- a/gcc/tree-ssa-copyrename.c
+++ b/gcc/tree-ssa-copyrename.c
@@ -253,7 +253,7 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug)
!= get_alias_set (TREE_TYPE (TREE_TYPE (root2))))
{
if (debug)
- fprintf (debug, " : 2 different alasing sets. No coalesce.\n");
+ fprintf (debug, " : 2 different aliasing sets. No coalesce.\n");
return;
}
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index 92c9e9b935a..f6e62dc9c7f 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -47,7 +47,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
/* These RTL headers are needed for basic-block.h. */
@@ -280,6 +279,15 @@ mark_stmt_if_obviously_necessary (tree stmt, bool aggressive)
tree op, def;
ssa_op_iter iter;
+ /* With non-call exceptions, we have to assume that all statements could
+ throw. If a statement may throw, it is inherently necessary. */
+ if (flag_non_call_exceptions
+ && tree_could_throw_p (stmt))
+ {
+ mark_stmt_necessary (stmt, true);
+ return;
+ }
+
/* Statements that are implicitly live. Most function calls, asm and return
statements are required. Labels and BIND_EXPR nodes are kept because
they are control flow, and we have no way of knowing whether they can be
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index 692dd705b2f..03365619ed9 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -31,7 +31,6 @@ Boston, MA 02111-1307, USA. */
#include "basic-block.h"
#include "cfgloop.h"
#include "output.h"
-#include "errors.h"
#include "expr.h"
#include "function.h"
#include "diagnostic.h"
@@ -141,6 +140,10 @@ static VEC(tree,heap) *const_and_copies_stack;
know their exact value. */
static bitmap nonzero_vars;
+/* Bitmap of blocks that are scheduled to be threaded through. This
+ is used to communicate with thread_through_blocks. */
+static bitmap threaded_blocks;
+
/* Stack of SSA_NAMEs which need their NONZERO_VARS property cleared
when the current block is finalized.
@@ -224,12 +227,17 @@ struct vrp_element
with useful information is very low. */
static htab_t vrp_data;
+typedef struct vrp_element *vrp_element_p;
+
+DEF_VEC_P(vrp_element_p);
+DEF_VEC_ALLOC_P(vrp_element_p,heap);
+
/* An entry in the VRP_DATA hash table. We record the variable and a
varray of VRP_ELEMENT records associated with that variable. */
struct vrp_hash_elt
{
tree var;
- varray_type records;
+ VEC(vrp_element_p,heap) *records;
};
/* Array of variables which have their values constrained by operations
@@ -264,8 +272,7 @@ static void record_cond (tree, tree);
static void record_const_or_copy (tree, tree);
static void record_equality (tree, tree);
static tree update_rhs_and_lookup_avail_expr (tree, tree, bool);
-static tree simplify_rhs_and_lookup_avail_expr (struct dom_walk_data *,
- tree, int);
+static tree simplify_rhs_and_lookup_avail_expr (tree, int);
static tree simplify_cond_and_lookup_avail_expr (tree, stmt_ann_t, int);
static tree simplify_switch_and_lookup_avail_expr (tree, int);
static tree find_equivalent_equality_comparison (tree);
@@ -273,8 +280,7 @@ static void record_range (tree, basic_block);
static bool extract_range_from_cond (tree, tree *, tree *, int *);
static void record_equivalences_from_phis (basic_block);
static void record_equivalences_from_incoming_edge (basic_block);
-static bool eliminate_redundant_computations (struct dom_walk_data *,
- tree, stmt_ann_t);
+static bool eliminate_redundant_computations (tree, stmt_ann_t);
static void record_equivalences_from_stmt (tree, int, stmt_ann_t);
static void thread_across_edge (struct dom_walk_data *, edge);
static void dom_opt_finalize_block (struct dom_walk_data *, basic_block);
@@ -346,6 +352,18 @@ free_all_edge_infos (void)
}
}
+/* Free an instance of vrp_hash_elt. */
+
+static void
+vrp_free (void *data)
+{
+ struct vrp_hash_elt *elt = data;
+ struct VEC(vrp_element_p,heap) **vrp_elt = &elt->records;
+
+ VEC_free (vrp_element_p, heap, *vrp_elt);
+ free (elt);
+}
+
/* Jump threading, redundancy elimination and const/copy propagation.
This pass may expose new symbols that need to be renamed into SSA. For
@@ -363,13 +381,15 @@ tree_ssa_dominator_optimize (void)
/* Create our hash tables. */
avail_exprs = htab_create (1024, real_avail_expr_hash, avail_expr_eq, free);
- vrp_data = htab_create (ceil_log2 (num_ssa_names), vrp_hash, vrp_eq, free);
+ vrp_data = htab_create (ceil_log2 (num_ssa_names), vrp_hash, vrp_eq,
+ vrp_free);
avail_exprs_stack = VEC_alloc (tree, heap, 20);
const_and_copies_stack = VEC_alloc (tree, heap, 20);
nonzero_vars_stack = VEC_alloc (tree, heap, 20);
vrp_variables_stack = VEC_alloc (tree, heap, 20);
stmts_to_rescan = VEC_alloc (tree, heap, 20);
nonzero_vars = BITMAP_ALLOC (NULL);
+ threaded_blocks = BITMAP_ALLOC (NULL);
need_eh_cleanup = BITMAP_ALLOC (NULL);
/* Setup callbacks for the generic dominator tree walker. */
@@ -423,15 +443,6 @@ tree_ssa_dominator_optimize (void)
/* Recursively walk the dominator tree optimizing statements. */
walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
- /* If we exposed any new variables, go ahead and put them into
- SSA form now, before we handle jump threading. This simplifies
- interactions between rewriting of _DECL nodes into SSA form
- and rewriting SSA_NAME nodes into SSA form after block
- duplication and CFG manipulation. */
- update_ssa (TODO_update_ssa);
-
- free_all_edge_infos ();
-
{
block_stmt_iterator bsi;
basic_block bb;
@@ -444,8 +455,17 @@ tree_ssa_dominator_optimize (void)
}
}
+ /* If we exposed any new variables, go ahead and put them into
+ SSA form now, before we handle jump threading. This simplifies
+ interactions between rewriting of _DECL nodes into SSA form
+ and rewriting SSA_NAME nodes into SSA form after block
+ duplication and CFG manipulation. */
+ update_ssa (TODO_update_ssa);
+
+ free_all_edge_infos ();
+
/* Thread jumps, creating duplicate blocks as needed. */
- cfg_altered |= thread_through_all_blocks ();
+ cfg_altered |= thread_through_all_blocks (threaded_blocks);
/* Removal of statements may make some EH edges dead. Purge
such edges from the CFG as needed. */
@@ -480,6 +500,7 @@ tree_ssa_dominator_optimize (void)
/* Reinitialize the various tables. */
bitmap_clear (nonzero_vars);
+ bitmap_clear (threaded_blocks);
htab_empty (avail_exprs);
htab_empty (vrp_data);
@@ -523,6 +544,7 @@ tree_ssa_dominator_optimize (void)
/* Free nonzero_vars. */
BITMAP_FREE (nonzero_vars);
+ BITMAP_FREE (threaded_blocks);
BITMAP_FREE (need_eh_cleanup);
VEC_free (tree, heap, avail_exprs_stack);
@@ -830,7 +852,7 @@ thread_across_edge (struct dom_walk_data *walk_data, edge e)
else
edge_info = allocate_edge_info (e);
edge_info->redirection_target = taken_edge;
- bb_ann (e->dest)->incoming_edge_threaded = true;
+ bitmap_set_bit (threaded_blocks, e->dest->index);
}
}
}
@@ -1109,7 +1131,7 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb)
the array backwards popping off records associated with our
block. Once we hit a record not associated with our block
we are done. */
- varray_type var_vrp_records;
+ VEC(vrp_element_p,heap) **var_vrp_records;
if (var == NULL)
break;
@@ -1120,17 +1142,17 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb)
slot = htab_find_slot (vrp_data, &vrp_hash_elt, NO_INSERT);
vrp_hash_elt_p = (struct vrp_hash_elt *) *slot;
- var_vrp_records = vrp_hash_elt_p->records;
+ var_vrp_records = &vrp_hash_elt_p->records;
- while (VARRAY_ACTIVE_SIZE (var_vrp_records) > 0)
+ while (VEC_length (vrp_element_p, *var_vrp_records) > 0)
{
struct vrp_element *element
- = (struct vrp_element *)VARRAY_TOP_GENERIC_PTR (var_vrp_records);
+ = VEC_last (vrp_element_p, *var_vrp_records);
if (element->bb != bb)
break;
- VARRAY_POP (var_vrp_records);
+ VEC_pop (vrp_element_p, *var_vrp_records);
}
}
@@ -1691,8 +1713,7 @@ simple_iv_increment_p (tree stmt)
the hash table and return the result. Otherwise return NULL. */
static tree
-simplify_rhs_and_lookup_avail_expr (struct dom_walk_data *walk_data,
- tree stmt, int insert)
+simplify_rhs_and_lookup_avail_expr (tree stmt, int insert)
{
tree rhs = TREE_OPERAND (stmt, 1);
enum tree_code rhs_code = TREE_CODE (rhs);
@@ -1816,127 +1837,6 @@ simplify_rhs_and_lookup_avail_expr (struct dom_walk_data *walk_data,
dont_fold_assoc:;
}
- /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
- and BIT_AND_EXPR respectively if the first operand is greater
- than zero and the second operand is an exact power of two. */
- if ((rhs_code == TRUNC_DIV_EXPR || rhs_code == TRUNC_MOD_EXPR)
- && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0)))
- && integer_pow2p (TREE_OPERAND (rhs, 1)))
- {
- tree val;
- tree op = TREE_OPERAND (rhs, 0);
-
- if (TYPE_UNSIGNED (TREE_TYPE (op)))
- {
- val = integer_one_node;
- }
- else
- {
- tree dummy_cond = walk_data->global_data;
-
- if (! dummy_cond)
- {
- dummy_cond = build (GT_EXPR, boolean_type_node,
- op, integer_zero_node);
- dummy_cond = build (COND_EXPR, void_type_node,
- dummy_cond, NULL, NULL);
- walk_data->global_data = dummy_cond;
- }
- else
- {
- TREE_SET_CODE (COND_EXPR_COND (dummy_cond), GT_EXPR);
- TREE_OPERAND (COND_EXPR_COND (dummy_cond), 0) = op;
- TREE_OPERAND (COND_EXPR_COND (dummy_cond), 1)
- = integer_zero_node;
- }
- val = simplify_cond_and_lookup_avail_expr (dummy_cond, NULL, false);
- }
-
- if (val && integer_onep (val))
- {
- tree t;
- tree op0 = TREE_OPERAND (rhs, 0);
- tree op1 = TREE_OPERAND (rhs, 1);
-
- if (rhs_code == TRUNC_DIV_EXPR)
- t = build (RSHIFT_EXPR, TREE_TYPE (op0), op0,
- build_int_cst (NULL_TREE, tree_log2 (op1)));
- else
- t = build (BIT_AND_EXPR, TREE_TYPE (op0), op0,
- local_fold (build (MINUS_EXPR, TREE_TYPE (op1),
- op1, integer_one_node)));
-
- result = update_rhs_and_lookup_avail_expr (stmt, t, insert);
- }
- }
-
- /* Transform ABS (X) into X or -X as appropriate. */
- if (rhs_code == ABS_EXPR
- && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0))))
- {
- tree val;
- tree op = TREE_OPERAND (rhs, 0);
- tree type = TREE_TYPE (op);
-
- if (TYPE_UNSIGNED (type))
- {
- val = integer_zero_node;
- }
- else
- {
- tree dummy_cond = walk_data->global_data;
-
- if (! dummy_cond)
- {
- dummy_cond = build (LE_EXPR, boolean_type_node,
- op, integer_zero_node);
- dummy_cond = build (COND_EXPR, void_type_node,
- dummy_cond, NULL, NULL);
- walk_data->global_data = dummy_cond;
- }
- else
- {
- TREE_SET_CODE (COND_EXPR_COND (dummy_cond), LE_EXPR);
- TREE_OPERAND (COND_EXPR_COND (dummy_cond), 0) = op;
- TREE_OPERAND (COND_EXPR_COND (dummy_cond), 1)
- = build_int_cst (type, 0);
- }
- val = simplify_cond_and_lookup_avail_expr (dummy_cond, NULL, false);
-
- if (!val)
- {
- TREE_SET_CODE (COND_EXPR_COND (dummy_cond), GE_EXPR);
- TREE_OPERAND (COND_EXPR_COND (dummy_cond), 0) = op;
- TREE_OPERAND (COND_EXPR_COND (dummy_cond), 1)
- = build_int_cst (type, 0);
-
- val = simplify_cond_and_lookup_avail_expr (dummy_cond,
- NULL, false);
-
- if (val)
- {
- if (integer_zerop (val))
- val = integer_one_node;
- else if (integer_onep (val))
- val = integer_zero_node;
- }
- }
- }
-
- if (val
- && (integer_onep (val) || integer_zerop (val)))
- {
- tree t;
-
- if (integer_onep (val))
- t = build1 (NEGATE_EXPR, TREE_TYPE (op), op);
- else
- t = op;
-
- result = update_rhs_and_lookup_avail_expr (stmt, t, insert);
- }
- }
-
/* Optimize *"foo" into 'f'. This is done here rather than
in fold to avoid problems with stuff like &*"foo". */
if (TREE_CODE (rhs) == INDIRECT_REF || TREE_CODE (rhs) == ARRAY_REF)
@@ -2034,7 +1934,7 @@ simplify_cond_and_lookup_avail_expr (tree stmt,
int limit;
tree low, high, cond_low, cond_high;
int lowequal, highequal, swapped, no_overlap, subset, cond_inverted;
- varray_type vrp_records;
+ VEC(vrp_element_p,heap) **vrp_records;
struct vrp_element *element;
struct vrp_hash_elt vrp_hash_elt, *vrp_hash_elt_p;
void **slot;
@@ -2087,11 +1987,9 @@ simplify_cond_and_lookup_avail_expr (tree stmt,
return NULL;
vrp_hash_elt_p = (struct vrp_hash_elt *) *slot;
- vrp_records = vrp_hash_elt_p->records;
- if (vrp_records == NULL)
- return NULL;
+ vrp_records = &vrp_hash_elt_p->records;
- limit = VARRAY_ACTIVE_SIZE (vrp_records);
+ limit = VEC_length (vrp_element_p, *vrp_records);
/* If we have no value range records for this variable, or we are
unable to extract a range for this condition, then there is
@@ -2123,8 +2021,7 @@ simplify_cond_and_lookup_avail_expr (tree stmt,
conditional into the current range.
These properties also help us avoid unnecessary work. */
- element
- = (struct vrp_element *)VARRAY_GENERIC_PTR (vrp_records, limit - 1);
+ element = VEC_last (vrp_element_p, *vrp_records);
if (element->high && element->low)
{
@@ -2163,8 +2060,7 @@ simplify_cond_and_lookup_avail_expr (tree stmt,
{
/* Get the high/low value from the previous element. */
struct vrp_element *prev
- = (struct vrp_element *)VARRAY_GENERIC_PTR (vrp_records,
- limit - 2);
+ = VEC_index (vrp_element_p, *vrp_records, limit - 2);
low = prev->low;
high = prev->high;
@@ -2402,7 +2298,7 @@ record_edge_info (basic_block bb)
{
tree labels = SWITCH_LABELS (stmt);
int i, n_labels = TREE_VEC_LENGTH (labels);
- tree *info = xcalloc (n_basic_blocks, sizeof (tree));
+ tree *info = xcalloc (last_basic_block, sizeof (tree));
edge e;
edge_iterator ei;
@@ -2582,8 +2478,7 @@ propagate_to_outgoing_edges (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
table. */
static bool
-eliminate_redundant_computations (struct dom_walk_data *walk_data,
- tree stmt, stmt_ann_t ann)
+eliminate_redundant_computations (tree stmt, stmt_ann_t ann)
{
tree *expr_p, def = NULL_TREE;
bool insert = true;
@@ -2612,7 +2507,7 @@ eliminate_redundant_computations (struct dom_walk_data *walk_data,
then try to simplify the RHS and lookup the new RHS in the
hash table. */
if (! cached_lhs && TREE_CODE (stmt) == MODIFY_EXPR)
- cached_lhs = simplify_rhs_and_lookup_avail_expr (walk_data, stmt, insert);
+ cached_lhs = simplify_rhs_and_lookup_avail_expr (stmt, insert);
/* Similarly if this is a COND_EXPR and we did not find its
expression in the hash table, simplify the condition and
try again. */
@@ -2908,7 +2803,6 @@ cprop_into_stmt (tree stmt)
bool may_have_exposed_new_symbols = false;
use_operand_p op_p;
ssa_op_iter iter;
- tree rhs;
FOR_EACH_SSA_USE_OPERAND (op_p, stmt, iter, SSA_OP_ALL_USES)
{
@@ -2916,13 +2810,6 @@ cprop_into_stmt (tree stmt)
may_have_exposed_new_symbols |= cprop_operand (stmt, op_p);
}
- if (may_have_exposed_new_symbols)
- {
- rhs = get_rhs (stmt);
- if (rhs && TREE_CODE (rhs) == ADDR_EXPR)
- recompute_tree_invarant_for_addr_expr (rhs);
- }
-
return may_have_exposed_new_symbols;
}
@@ -2943,8 +2830,8 @@ cprop_into_stmt (tree stmt)
the variable in the LHS in the CONST_AND_COPIES table. */
static void
-optimize_stmt (struct dom_walk_data *walk_data, basic_block bb,
- block_stmt_iterator si)
+optimize_stmt (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
+ basic_block bb, block_stmt_iterator si)
{
stmt_ann_t ann;
tree stmt, old_stmt;
@@ -2971,6 +2858,8 @@ optimize_stmt (struct dom_walk_data *walk_data, basic_block bb,
fold its RHS before checking for redundant computations. */
if (ann->modified)
{
+ tree rhs;
+
/* Try to fold the statement making sure that STMT is kept
up to date. */
if (fold_stmt (bsi_stmt_ptr (si)))
@@ -2985,6 +2874,10 @@ optimize_stmt (struct dom_walk_data *walk_data, basic_block bb,
}
}
+ rhs = get_rhs (stmt);
+ if (rhs && TREE_CODE (rhs) == ADDR_EXPR)
+ recompute_tree_invarant_for_addr_expr (rhs);
+
/* Constant/copy propagation above may change the set of
virtual operands associated with this statement. Folding
may remove the need for some virtual operands.
@@ -3008,7 +2901,7 @@ optimize_stmt (struct dom_walk_data *walk_data, basic_block bb,
if (may_optimize_p)
may_have_exposed_new_symbols
- |= eliminate_redundant_computations (walk_data, stmt, ann);
+ |= eliminate_redundant_computations (stmt, ann);
/* Record any additional equivalences created by this statement. */
if (TREE_CODE (stmt) == MODIFY_EXPR)
@@ -3306,7 +3199,7 @@ record_range (tree cond, basic_block bb)
{
struct vrp_hash_elt *vrp_hash_elt;
struct vrp_element *element;
- varray_type *vrp_records_p;
+ VEC(vrp_element_p,heap) **vrp_records_p;
void **slot;
@@ -3318,7 +3211,7 @@ record_range (tree cond, basic_block bb)
if (*slot == NULL)
*slot = (void *) vrp_hash_elt;
else
- free (vrp_hash_elt);
+ vrp_free (vrp_hash_elt);
vrp_hash_elt = (struct vrp_hash_elt *) *slot;
vrp_records_p = &vrp_hash_elt->records;
@@ -3329,10 +3222,7 @@ record_range (tree cond, basic_block bb)
element->cond = cond;
element->bb = bb;
- if (*vrp_records_p == NULL)
- VARRAY_GENERIC_PTR_INIT (*vrp_records_p, 2, "vrp records");
-
- VARRAY_PUSH_GENERIC_PTR (*vrp_records_p, element);
+ VEC_safe_push (vrp_element_p, heap, *vrp_records_p, element);
VEC_safe_push (tree, heap, vrp_variables_stack, TREE_OPERAND (cond, 0));
}
}
diff --git a/gcc/tree-ssa-dse.c b/gcc/tree-ssa-dse.c
index 23b9d4ac9c2..19b93f7b3d3 100644
--- a/gcc/tree-ssa-dse.c
+++ b/gcc/tree-ssa-dse.c
@@ -22,7 +22,6 @@ Boston, MA 02111-1307, USA. */
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
#include "tree.h"
#include "rtl.h"
@@ -135,7 +134,7 @@ dse_initialize_block_local_data (struct dom_walk_data *walk_data,
bool recycled)
{
struct dse_block_local_data *bd
- = VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
+ = VEC_last (void_p, walk_data->block_data_stack);
/* If we are given a recycled block local data structure, ensure any
bitmap associated with the block is cleared. */
@@ -163,7 +162,7 @@ dse_optimize_stmt (struct dom_walk_data *walk_data,
block_stmt_iterator bsi)
{
struct dse_block_local_data *bd
- = VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
+ = VEC_last (void_p, walk_data->block_data_stack);
struct dse_global_data *dse_gd = walk_data->global_data;
tree stmt = bsi_stmt (bsi);
stmt_ann_t ann = stmt_ann (stmt);
@@ -195,7 +194,7 @@ dse_optimize_stmt (struct dom_walk_data *walk_data,
/* We want to verify that each virtual definition in STMT has
precisely one use and that all the virtual definitions are
used by the same single statement. When complete, we
- want USE_STMT to refer to the one statment which uses
+ want USE_STMT to refer to the one statement which uses
all of the virtual definitions from STMT. */
use_stmt = NULL;
FOR_EACH_SSA_MUST_AND_MAY_DEF_OPERAND (var1, var2, stmt, op_iter)
@@ -298,7 +297,7 @@ static void
dse_record_phis (struct dom_walk_data *walk_data, basic_block bb)
{
struct dse_block_local_data *bd
- = VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
+ = VEC_last (void_p, walk_data->block_data_stack);
struct dse_global_data *dse_gd = walk_data->global_data;
tree phi;
@@ -314,7 +313,7 @@ dse_finalize_block (struct dom_walk_data *walk_data,
basic_block bb ATTRIBUTE_UNUSED)
{
struct dse_block_local_data *bd
- = VARRAY_TOP_GENERIC_PTR (walk_data->block_data_stack);
+ = VEC_last (void_p, walk_data->block_data_stack);
struct dse_global_data *dse_gd = walk_data->global_data;
bitmap stores = dse_gd->stores;
unsigned int i;
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index e4cae683f49..754f0821c06 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -22,7 +22,6 @@ Boston, MA 02111-1307, USA. */
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
#include "tree.h"
#include "rtl.h"
@@ -446,12 +445,16 @@ static void
tidy_after_forward_propagate_addr (tree stmt)
{
mark_new_vars_to_rename (stmt);
- update_stmt (stmt);
/* We may have turned a trapping insn into a non-trapping insn. */
if (maybe_clean_or_replace_eh_stmt (stmt, stmt)
&& tree_purge_dead_eh_edges (bb_for_stmt (stmt)))
cfg_changed = true;
+
+ if (TREE_CODE (TREE_OPERAND (stmt, 1)) == ADDR_EXPR)
+ recompute_tree_invarant_for_addr_expr (TREE_OPERAND (stmt, 1));
+
+ update_stmt (stmt);
}
/* STMT defines LHS which is contains the address of the 0th element
@@ -556,7 +559,8 @@ forward_propagate_addr_expr (tree stmt)
if (bb_for_stmt (use_stmt)->loop_depth > stmt_loop_depth)
return false;
- /* Strip away any outer COMPONENT_REF/ARRAY_REF nodes from the LHS. */
+ /* Strip away any outer COMPONENT_REF/ARRAY_REF nodes from the LHS.
+ ADDR_EXPR will not appear on the LHS. */
lhs = TREE_OPERAND (use_stmt, 0);
while (TREE_CODE (lhs) == COMPONENT_REF || TREE_CODE (lhs) == ARRAY_REF)
lhs = TREE_OPERAND (lhs, 0);
@@ -587,9 +591,12 @@ forward_propagate_addr_expr (tree stmt)
return true;
}
- /* Strip away any outer COMPONENT_REF/ARRAY_REF nodes from the RHS. */
+ /* Strip away any outer COMPONENT_REF, ARRAY_REF or ADDR_EXPR
+ nodes from the RHS. */
rhs = TREE_OPERAND (use_stmt, 1);
- while (TREE_CODE (rhs) == COMPONENT_REF || TREE_CODE (rhs) == ARRAY_REF)
+ while (TREE_CODE (rhs) == COMPONENT_REF
+ || TREE_CODE (rhs) == ARRAY_REF
+ || TREE_CODE (rhs) == ADDR_EXPR)
rhs = TREE_OPERAND (rhs, 0);
/* Now see if the RHS node is an INDIRECT_REF using NAME. If so,
diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c
index f40df907d6a..8f7bf77cda0 100644
--- a/gcc/tree-ssa-live.c
+++ b/gcc/tree-ssa-live.c
@@ -37,7 +37,7 @@ Boston, MA 02111-1307, USA. */
#include "hashtab.h"
#include "tree-dump.h"
#include "tree-ssa-live.h"
-#include "errors.h"
+#include "toplev.h"
static void live_worklist (tree_live_info_p, int *, int);
static tree_live_info_p new_tree_live_info (var_map);
@@ -185,7 +185,8 @@ void
compact_var_map (var_map map, int flags)
{
sbitmap used;
- int x, limit, count, tmp, root, root_i;
+ int tmp, root, root_i;
+ unsigned int x, limit, count;
tree var;
root_var_p rv = NULL;
@@ -238,10 +239,12 @@ compact_var_map (var_map map, int flags)
/* Build a compacted partitioning. */
if (count != limit)
{
+ sbitmap_iterator sbi;
+
map->compact_to_partition = (int *)xmalloc (count * sizeof (int));
count = 0;
/* SSA renaming begins at 1, so skip 0 when compacting. */
- EXECUTE_IF_SET_IN_SBITMAP (used, 1, x,
+ EXECUTE_IF_SET_IN_SBITMAP (used, 1, x, sbi)
{
map->partition_to_compact[x] = count;
map->compact_to_partition[count] = x;
@@ -249,7 +252,7 @@ compact_var_map (var_map map, int flags)
if (TREE_CODE (var) != SSA_NAME)
change_partition_var (map, var, count);
count++;
- });
+ }
}
else
{
@@ -408,9 +411,11 @@ create_ssa_var_map (int flags)
sbitmap_a_and_b (both, used_in_real_ops, used_in_virtual_ops);
if (sbitmap_first_set_bit (both) >= 0)
{
- EXECUTE_IF_SET_IN_SBITMAP (both, 0, i,
+ sbitmap_iterator sbi;
+
+ EXECUTE_IF_SET_IN_SBITMAP (both, 0, i, sbi)
fprintf (stderr, "Variable %s used in real and virtual operands\n",
- get_name (referenced_var (i))));
+ get_name (referenced_var (i)));
internal_error ("SSA corruption");
}
@@ -1281,8 +1286,8 @@ add_conflicts_if_valid (tpa_p tpa, conflict_graph graph,
}
}
-DEF_VEC_P(int);
-DEF_VEC_ALLOC_P(int,heap);
+DEF_VEC_I(int);
+DEF_VEC_ALLOC_I(int,heap);
/* Return a conflict graph for the information contained in LIVE_INFO. Only
conflicts between items in the same TPA list are added. If optional
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index 26244ce2aee..b7a57f61ede 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -102,7 +102,7 @@ struct lim_aux_data
#define LIM_DATA(STMT) (TREE_CODE (STMT) == PHI_NODE \
? NULL \
- : (struct lim_aux_data *) (stmt_ann (STMT)->aux))
+ : (struct lim_aux_data *) (stmt_ann (STMT)->common.aux))
/* Description of a memory reference location for store motion. */
@@ -129,7 +129,7 @@ struct mem_ref
table, but the hash function depends
on values of pointers. Thus we cannot use
htab_traverse, since then we would get
- misscompares during bootstrap (although the
+ miscompares during bootstrap (although the
produced code would be correct). */
};
@@ -201,6 +201,18 @@ for_each_index (tree *addr_p, bool (*cbck) (tree, tree *, void *), void *data)
case PARM_DECL:
case STRING_CST:
case RESULT_DECL:
+ case VECTOR_CST:
+ return true;
+
+ case TARGET_MEM_REF:
+ idx = &TMR_BASE (*addr_p);
+ if (*idx
+ && !cbck (*addr_p, idx, data))
+ return false;
+ idx = &TMR_INDEX (*addr_p);
+ if (*idx
+ && !cbck (*addr_p, idx, data))
+ return false;
return true;
default:
@@ -627,11 +639,11 @@ determine_invariantness_stmt (struct dom_walk_data *dw_data ATTRIBUTE_UNUSED,
bsi_insert_after (&bsi, stmt2, BSI_NEW_STMT);
SSA_NAME_DEF_STMT (lhs) = stmt2;
- /* Continue processing with invariant reciprocal statment. */
+ /* Continue processing with invariant reciprocal statement. */
stmt = stmt1;
}
- stmt_ann (stmt)->aux = xcalloc (1, sizeof (struct lim_aux_data));
+ stmt_ann (stmt)->common.aux = xcalloc (1, sizeof (struct lim_aux_data));
LIM_DATA (stmt)->always_executed_in = outermost;
if (maybe_never && pos == MOVE_PRESERVE_EXECUTION)
@@ -722,7 +734,7 @@ move_computations_stmt (struct dom_walk_data *dw_data ATTRIBUTE_UNUSED,
cost = LIM_DATA (stmt)->cost;
level = LIM_DATA (stmt)->tgt_loop;
free_lim_aux_data (LIM_DATA (stmt));
- stmt_ann (stmt)->aux = NULL;
+ stmt_ann (stmt)->common.aux = NULL;
if (!level)
{
@@ -951,7 +963,7 @@ schedule_sm (struct loop *loop, edge *exits, unsigned n_exits, tree ref,
/* Emit the load & stores. */
load = build (MODIFY_EXPR, void_type_node, tmp_var, ref);
- get_stmt_ann (load)->aux = xcalloc (1, sizeof (struct lim_aux_data));
+ get_stmt_ann (load)->common.aux = xcalloc (1, sizeof (struct lim_aux_data));
LIM_DATA (load)->max_loop = loop;
LIM_DATA (load)->tgt_loop = loop;
diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c
index 80aecdc2c3a..c38c2f2b007 100644
--- a/gcc/tree-ssa-loop-ivcanon.c
+++ b/gcc/tree-ssa-loop-ivcanon.c
@@ -226,6 +226,7 @@ try_unroll_loop_completely (struct loops *loops ATTRIBUTE_UNUSED,
old_cond = COND_EXPR_COND (cond);
COND_EXPR_COND (cond) = dont_exit;
update_stmt (cond);
+ initialize_original_copy_tables ();
if (!tree_duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop),
loops, n_unroll, NULL,
@@ -233,8 +234,10 @@ try_unroll_loop_completely (struct loops *loops ATTRIBUTE_UNUSED,
{
COND_EXPR_COND (cond) = old_cond;
update_stmt (cond);
+ free_original_copy_tables ();
return false;
}
+ free_original_copy_tables ();
}
COND_EXPR_COND (cond) = do_exit;
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index f60082ab31a..2d474d3713f 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -1389,7 +1389,7 @@ idx_find_step (tree base, tree *idx, void *data)
{
struct ifs_ivopts_data *dta = data;
struct iv *iv;
- tree step, type, iv_type, iv_step, lbound, off;
+ tree step, iv_step, lbound, off;
struct loop *loop = dta->ivopts_data->current_loop;
if (TREE_CODE (base) == MISALIGNED_INDIRECT_REF
@@ -1430,8 +1430,6 @@ idx_find_step (tree base, tree *idx, void *data)
if (!iv->step)
return true;
- iv_type = TREE_TYPE (iv->base);
- type = build_pointer_type (TREE_TYPE (base));
if (TREE_CODE (base) == ARRAY_REF)
{
step = array_ref_element_size (base);
@@ -1442,13 +1440,10 @@ idx_find_step (tree base, tree *idx, void *data)
}
else
/* The step for pointer arithmetics already is 1 byte. */
- step = build_int_cst (type, 1);
+ step = build_int_cst (sizetype, 1);
- if (TYPE_PRECISION (iv_type) < TYPE_PRECISION (type))
- iv_step = can_count_iv_in_wider_type (dta->ivopts_data->current_loop,
- type, iv->base, iv->step, dta->stmt);
- else
- iv_step = fold_convert (iv_type, iv->step);
+ iv_step = convert_step (dta->ivopts_data->current_loop,
+ sizetype, iv->base, iv->step, dta->stmt);
if (!iv_step)
{
@@ -1456,12 +1451,12 @@ idx_find_step (tree base, tree *idx, void *data)
return false;
}
- step = fold_build2 (MULT_EXPR, type, step, iv_step);
+ step = fold_build2 (MULT_EXPR, sizetype, step, iv_step);
if (!*dta->step_p)
*dta->step_p = step;
else
- *dta->step_p = fold_build2 (PLUS_EXPR, type, *dta->step_p, step);
+ *dta->step_p = fold_build2 (PLUS_EXPR, sizetype, *dta->step_p, step);
return true;
}
@@ -1496,6 +1491,11 @@ may_be_unaligned_p (tree ref)
int unsignedp, volatilep;
unsigned base_align;
+ /* TARGET_MEM_REFs are translated directly to valid MEMs on the target,
+ thus they are not misaligned. */
+ if (TREE_CODE (ref) == TARGET_MEM_REF)
+ return false;
+
/* The test below is basically copy of what expr.c:normal_inner_ref
does to check whether the object must be loaded by parts when
STRICT_ALIGNMENT is true. */
@@ -1513,31 +1513,12 @@ may_be_unaligned_p (tree ref)
return false;
}
-/* Builds ADDR_EXPR of object OBJ. If OBJ is an INDIRECT_REF, the indirect_ref
- is stripped instead. */
-
-static tree
-build_addr_strip_iref (tree obj)
-{
- tree type;
-
- if (TREE_CODE (obj) == INDIRECT_REF)
- {
- type = build_pointer_type (TREE_TYPE (obj));
- obj = fold_convert (type, TREE_OPERAND (obj, 0));
- }
- else
- obj = build_addr (obj);
-
- return obj;
-}
-
/* Finds addresses in *OP_P inside STMT. */
static void
find_interesting_uses_address (struct ivopts_data *data, tree stmt, tree *op_p)
{
- tree base = unshare_expr (*op_p), step = NULL;
+ tree base = *op_p, step = NULL;
struct iv *civ;
struct ifs_ivopts_data ifs_ivopts_data;
@@ -1556,17 +1537,63 @@ find_interesting_uses_address (struct ivopts_data *data, tree stmt, tree *op_p)
&& may_be_unaligned_p (base))
goto fail;
- ifs_ivopts_data.ivopts_data = data;
- ifs_ivopts_data.stmt = stmt;
- ifs_ivopts_data.step_p = &step;
- if (!for_each_index (&base, idx_find_step, &ifs_ivopts_data)
- || zero_p (step))
- goto fail;
+ base = unshare_expr (base);
+
+ if (TREE_CODE (base) == TARGET_MEM_REF)
+ {
+ tree type = build_pointer_type (TREE_TYPE (base));
+ tree astep;
+
+ if (TMR_BASE (base)
+ && TREE_CODE (TMR_BASE (base)) == SSA_NAME)
+ {
+ civ = get_iv (data, TMR_BASE (base));
+ if (!civ)
+ goto fail;
+
+ TMR_BASE (base) = civ->base;
+ step = civ->step;
+ }
+ if (TMR_INDEX (base)
+ && TREE_CODE (TMR_INDEX (base)) == SSA_NAME)
+ {
+ civ = get_iv (data, TMR_INDEX (base));
+ if (!civ)
+ goto fail;
+
+ TMR_INDEX (base) = civ->base;
+ astep = civ->step;
+
+ if (astep)
+ {
+ if (TMR_STEP (base))
+ astep = fold_build2 (MULT_EXPR, type, TMR_STEP (base), astep);
- gcc_assert (TREE_CODE (base) != ALIGN_INDIRECT_REF);
- gcc_assert (TREE_CODE (base) != MISALIGNED_INDIRECT_REF);
+ if (step)
+ step = fold_build2 (PLUS_EXPR, type, step, astep);
+ else
+ step = astep;
+ }
+ }
+
+ if (zero_p (step))
+ goto fail;
+ base = tree_mem_ref_addr (type, base);
+ }
+ else
+ {
+ ifs_ivopts_data.ivopts_data = data;
+ ifs_ivopts_data.stmt = stmt;
+ ifs_ivopts_data.step_p = &step;
+ if (!for_each_index (&base, idx_find_step, &ifs_ivopts_data)
+ || zero_p (step))
+ goto fail;
- base = build_addr_strip_iref (base);
+ gcc_assert (TREE_CODE (base) != ALIGN_INDIRECT_REF);
+ gcc_assert (TREE_CODE (base) != MISALIGNED_INDIRECT_REF);
+
+ base = build_fold_addr_expr (base);
+ }
civ = alloc_iv (base, step);
record_use (data, op_p, civ, stmt, USE_ADDRESS);
@@ -1859,7 +1886,7 @@ strip_offset_1 (tree expr, bool inside_addr, bool top_compref,
if (op0 == TREE_OPERAND (expr, 0))
return orig_expr;
- expr = build_addr_strip_iref (op0);
+ expr = build_fold_addr_expr (op0);
return fold_convert (orig_type, expr);
case INDIRECT_REF:
@@ -1886,7 +1913,7 @@ strip_offset_1 (tree expr, bool inside_addr, bool top_compref,
TREE_OPERAND (expr, 1) = op1;
/* Inside address, we might strip the top level component references,
- thus changing type of the expresion. Handling of ADDR_EXPR
+ thus changing type of the expression. Handling of ADDR_EXPR
will fix that. */
expr = fold_convert (orig_type, expr);
@@ -2635,33 +2662,6 @@ constant_multiple_of (tree type, tree top, tree bot)
}
}
-/* Affine combination of trees. We keep track of at most MAX_AFF_ELTS elements
- to make things simpler; this is sufficient in most cases. */
-
-#define MAX_AFF_ELTS 8
-
-struct affine_tree_combination
-{
- /* Type of the result of the combination. */
- tree type;
-
- /* Mask modulo that the operations are performed. */
- unsigned HOST_WIDE_INT mask;
-
- /* Constant offset. */
- unsigned HOST_WIDE_INT offset;
-
- /* Number of elements of the combination. */
- unsigned n;
-
- /* Elements and their coefficients. */
- tree elts[MAX_AFF_ELTS];
- unsigned HOST_WIDE_INT coefs[MAX_AFF_ELTS];
-
- /* Remainder of the expression. */
- tree rest;
-};
-
/* Sets COMB to CST. */
static void
@@ -2847,7 +2847,7 @@ tree_to_aff_combination (tree expr, tree type,
if (bitpos % BITS_PER_UNIT != 0)
break;
aff_combination_const (comb, type, bitpos / BITS_PER_UNIT);
- core = build_addr_strip_iref (core);
+ core = build_fold_addr_expr (core);
if (TREE_CODE (core) == ADDR_EXPR)
aff_combination_add_elt (comb, core, 1);
else
@@ -2914,6 +2914,19 @@ add_elt_to_tree (tree expr, tree type, tree elt, unsigned HOST_WIDE_INT scale,
return fold_build2 (code, type, expr, elt);
}
+/* Copies the tree elements of COMB to ensure that they are not shared. */
+
+static void
+unshare_aff_combination (struct affine_tree_combination *comb)
+{
+ unsigned i;
+
+ for (i = 0; i < comb->n; i++)
+ comb->elts[i] = unshare_expr (comb->elts[i]);
+ if (comb->rest)
+ comb->rest = unshare_expr (comb->rest);
+}
+
/* Makes tree from the affine combination COMB. */
static tree
@@ -2924,6 +2937,11 @@ aff_combination_to_tree (struct affine_tree_combination *comb)
unsigned i;
unsigned HOST_WIDE_INT off, sgn;
+ /* Handle the special case produced by get_computation_aff when
+ the type does not fit in HOST_WIDE_INT. */
+ if (comb->n == 0 && comb->offset == 0)
+ return fold_convert (type, expr);
+
gcc_assert (comb->n == MAX_AFF_ELTS || comb->rest == NULL_TREE);
for (i = 0; i < comb->n; i++)
@@ -2945,49 +2963,14 @@ aff_combination_to_tree (struct affine_tree_combination *comb)
comb->mask);
}
-/* Folds X + RATIO * Y in TYPE. */
-
-static tree
-fold_affine_sum (tree type, tree x, tree y, HOST_WIDE_INT ratio)
-{
- enum tree_code code;
- tree cst;
- struct affine_tree_combination cx, cy;
-
- if (TYPE_PRECISION (type) > HOST_BITS_PER_WIDE_INT)
- {
- if (ratio == 1)
- return fold_build2 (PLUS_EXPR, type, x, y);
- if (ratio == -1)
- return fold_build2 (MINUS_EXPR, type, x, y);
-
- if (ratio < 0)
- {
- code = MINUS_EXPR;
- ratio = -ratio;
- }
- else
- code = PLUS_EXPR;
-
- cst = build_int_cst_type (type, ratio);
- y = fold_build2 (MULT_EXPR, type, y, cst);
- return fold_build2 (code, type, x, y);
- }
-
- tree_to_aff_combination (x, type, &cx);
- tree_to_aff_combination (y, type, &cy);
- aff_combination_scale (&cy, ratio);
- aff_combination_add (&cx, &cy);
-
- return aff_combination_to_tree (&cx);
-}
-
/* Determines the expression by that USE is expressed from induction variable
- CAND at statement AT in LOOP. */
+ CAND at statement AT in LOOP. The expression is stored in a decomposed
+ form into AFF. Returns false if USE cannot be expressed using CAND. */
-static tree
-get_computation_at (struct loop *loop,
- struct iv_use *use, struct iv_cand *cand, tree at)
+static bool
+get_computation_aff (struct loop *loop,
+ struct iv_use *use, struct iv_cand *cand, tree at,
+ struct affine_tree_combination *aff)
{
tree ubase = use->iv->base;
tree ustep = use->iv->step;
@@ -2999,11 +2982,12 @@ get_computation_at (struct loop *loop,
tree ratio;
unsigned HOST_WIDE_INT ustepi, cstepi;
HOST_WIDE_INT ratioi;
+ struct affine_tree_combination cbase_aff, expr_aff;
if (TYPE_PRECISION (utype) > TYPE_PRECISION (ctype))
{
/* We do not have a precision to express the values of use. */
- return NULL_TREE;
+ return false;
}
expr = var_at_stmt (loop, cand, at);
@@ -3041,7 +3025,7 @@ get_computation_at (struct loop *loop,
/* TODO maybe consider case when ustep divides cstep and the ratio is
a power of 2 (so that the division is fast to execute)? We would
need to be much more careful with overflows etc. then. */
- return NULL_TREE;
+ return false;
}
ratio = build_int_cst_type (uutype, ratioi);
@@ -3050,7 +3034,7 @@ get_computation_at (struct loop *loop,
{
ratio = constant_multiple_of (uutype, ustep, cstep);
if (!ratio)
- return NULL_TREE;
+ return false;
/* Ratioi is only used to detect special cases when the multiplicative
factor is 1 or -1, so if we cannot convert ratio to HOST_WIDE_INT,
@@ -3079,34 +3063,71 @@ get_computation_at (struct loop *loop,
happen, fold is able to apply the distributive law to obtain this form
anyway. */
- if (ratioi == 1)
- {
- delta = fold_affine_sum (uutype, ubase, cbase, -1);
- expr = fold_build2 (PLUS_EXPR, uutype, expr, delta);
- }
- else if (ratioi == -1)
- {
- delta = fold_affine_sum (uutype, ubase, cbase, 1);
- expr = fold_build2 (MINUS_EXPR, uutype, delta, expr);
- }
- else
+ if (TYPE_PRECISION (uutype) > HOST_BITS_PER_WIDE_INT)
{
- if (ratioi)
- delta = fold_affine_sum (uutype, ubase, cbase, -ratioi);
+ /* Let's compute in trees and just return the result in AFF. This case
+ should not be very common, and fold itself is not that bad either,
+ so making the aff. functions more complicated to handle this case
+ is not that urgent. */
+ if (ratioi == 1)
+ {
+ delta = fold_build2 (MINUS_EXPR, uutype, ubase, cbase);
+ expr = fold_build2 (PLUS_EXPR, uutype, expr, delta);
+ }
+ else if (ratioi == -1)
+ {
+ delta = fold_build2 (PLUS_EXPR, uutype, ubase, cbase);
+ expr = fold_build2 (MINUS_EXPR, uutype, delta, expr);
+ }
else
{
- delta = fold_build2 (MULT_EXPR, uutype, ratio, cbase);
- delta = fold_affine_sum (uutype, ubase, delta, -1);
+ delta = fold_build2 (MULT_EXPR, uutype, cbase, ratio);
+ delta = fold_build2 (MINUS_EXPR, uutype, ubase, delta);
+ expr = fold_build2 (MULT_EXPR, uutype, ratio, expr);
+ expr = fold_build2 (PLUS_EXPR, uutype, delta, expr);
}
- expr = fold_build2 (MULT_EXPR, uutype, ratio, expr);
- expr = fold_build2 (PLUS_EXPR, uutype, delta, expr);
+
+ aff->type = uutype;
+ aff->n = 0;
+ aff->offset = 0;
+ aff->mask = 0;
+ aff->rest = expr;
+ return true;
}
- return fold_convert (utype, expr);
+ /* If we got here, the types fits in HOST_WIDE_INT, thus it must be
+ possible to compute ratioi. */
+ gcc_assert (ratioi);
+
+ tree_to_aff_combination (ubase, uutype, aff);
+ tree_to_aff_combination (cbase, uutype, &cbase_aff);
+ tree_to_aff_combination (expr, uutype, &expr_aff);
+ aff_combination_scale (&cbase_aff, -ratioi);
+ aff_combination_scale (&expr_aff, ratioi);
+ aff_combination_add (aff, &cbase_aff);
+ aff_combination_add (aff, &expr_aff);
+
+ return true;
+}
+
+/* Determines the expression by that USE is expressed from induction variable
+ CAND at statement AT in LOOP. The computation is unshared. */
+
+static tree
+get_computation_at (struct loop *loop,
+ struct iv_use *use, struct iv_cand *cand, tree at)
+{
+ struct affine_tree_combination aff;
+ tree type = TREE_TYPE (use->iv->base);
+
+ if (!get_computation_aff (loop, use, cand, at, &aff))
+ return NULL_TREE;
+ unshare_aff_combination (&aff);
+ return fold_convert (type, aff_combination_to_tree (&aff));
}
/* Determines the expression by that USE is expressed from induction variable
- CAND in LOOP. */
+ CAND in LOOP. The computation is unshared. */
static tree
get_computation (struct loop *loop, struct iv_use *use, struct iv_cand *cand)
@@ -3128,8 +3149,8 @@ add_cost (enum machine_mode mode)
start_sequence ();
force_operand (gen_rtx_fmt_ee (PLUS, mode,
- gen_raw_REG (mode, FIRST_PSEUDO_REGISTER),
- gen_raw_REG (mode, FIRST_PSEUDO_REGISTER + 1)),
+ gen_raw_REG (mode, LAST_VIRTUAL_REGISTER + 1),
+ gen_raw_REG (mode, LAST_VIRTUAL_REGISTER + 2)),
NULL_RTX);
seq = get_insns ();
end_sequence ();
@@ -3178,7 +3199,7 @@ mbc_entry_eq (const void *entry1, const void *entry2)
/* Returns cost of multiplication by constant CST in MODE. */
-static unsigned
+unsigned
multiply_by_cost (HOST_WIDE_INT cst, enum machine_mode mode)
{
static htab_t costs;
@@ -3200,8 +3221,8 @@ multiply_by_cost (HOST_WIDE_INT cst, enum machine_mode mode)
(*cached)->cst = cst;
start_sequence ();
- expand_mult (mode, gen_raw_REG (mode, FIRST_PSEUDO_REGISTER), GEN_INT (cst),
- NULL_RTX, 0);
+ expand_mult (mode, gen_raw_REG (mode, LAST_VIRTUAL_REGISTER + 1),
+ gen_int_mode (cst, mode), NULL_RTX, 0);
seq = get_insns ();
end_sequence ();
@@ -3216,6 +3237,47 @@ multiply_by_cost (HOST_WIDE_INT cst, enum machine_mode mode)
return cost;
}
+/* Returns true if multiplying by RATIO is allowed in address. */
+
+bool
+multiplier_allowed_in_address_p (HOST_WIDE_INT ratio)
+{
+#define MAX_RATIO 128
+ static sbitmap valid_mult;
+
+ if (!valid_mult)
+ {
+ rtx reg1 = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1);
+ rtx addr;
+ HOST_WIDE_INT i;
+
+ valid_mult = sbitmap_alloc (2 * MAX_RATIO + 1);
+ sbitmap_zero (valid_mult);
+ addr = gen_rtx_fmt_ee (MULT, Pmode, reg1, NULL_RTX);
+ for (i = -MAX_RATIO; i <= MAX_RATIO; i++)
+ {
+ XEXP (addr, 1) = gen_int_mode (i, Pmode);
+ if (memory_address_p (Pmode, addr))
+ SET_BIT (valid_mult, i + MAX_RATIO);
+ }
+
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, " allowed multipliers:");
+ for (i = -MAX_RATIO; i <= MAX_RATIO; i++)
+ if (TEST_BIT (valid_mult, i + MAX_RATIO))
+ fprintf (dump_file, " %d", (int) i);
+ fprintf (dump_file, "\n");
+ fprintf (dump_file, "\n");
+ }
+ }
+
+ if (ratio > MAX_RATIO || ratio < -MAX_RATIO)
+ return false;
+
+ return TEST_BIT (valid_mult, ratio + MAX_RATIO);
+}
+
/* Returns cost of address in shape symbol + var + OFFSET + RATIO * index.
If SYMBOL_PRESENT is false, symbol is omitted. If VAR_PRESENT is false,
variable is omitted. The created memory accesses MODE.
@@ -3226,8 +3288,7 @@ static unsigned
get_address_cost (bool symbol_present, bool var_present,
unsigned HOST_WIDE_INT offset, HOST_WIDE_INT ratio)
{
-#define MAX_RATIO 128
- static sbitmap valid_mult;
+ static bool initialized = false;
static HOST_WIDE_INT rat, off;
static HOST_WIDE_INT min_offset, max_offset;
static unsigned costs[2][2][2][2];
@@ -3239,16 +3300,17 @@ get_address_cost (bool symbol_present, bool var_present,
unsigned HOST_WIDE_INT mask;
unsigned bits;
- if (!valid_mult)
+ if (!initialized)
{
HOST_WIDE_INT i;
+ initialized = true;
- reg1 = gen_raw_REG (Pmode, FIRST_PSEUDO_REGISTER);
+ reg1 = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1);
addr = gen_rtx_fmt_ee (PLUS, Pmode, reg1, NULL_RTX);
for (i = 1; i <= 1 << 20; i <<= 1)
{
- XEXP (addr, 1) = GEN_INT (i);
+ XEXP (addr, 1) = gen_int_mode (i, Pmode);
if (!memory_address_p (Pmode, addr))
break;
}
@@ -3257,7 +3319,7 @@ get_address_cost (bool symbol_present, bool var_present,
for (i = 1; i <= 1 << 20; i <<= 1)
{
- XEXP (addr, 1) = GEN_INT (-i);
+ XEXP (addr, 1) = gen_int_mode (-i, Pmode);
if (!memory_address_p (Pmode, addr))
break;
}
@@ -3270,29 +3332,13 @@ get_address_cost (bool symbol_present, bool var_present,
fprintf (dump_file, " max offset %d\n", (int) max_offset);
}
- valid_mult = sbitmap_alloc (2 * MAX_RATIO + 1);
- sbitmap_zero (valid_mult);
rat = 1;
- addr = gen_rtx_fmt_ee (MULT, Pmode, reg1, NULL_RTX);
- for (i = -MAX_RATIO; i <= MAX_RATIO; i++)
- {
- XEXP (addr, 1) = GEN_INT (i);
- if (memory_address_p (Pmode, addr))
- {
- SET_BIT (valid_mult, i + MAX_RATIO);
- rat = i;
- }
- }
-
- if (dump_file && (dump_flags & TDF_DETAILS))
- {
- fprintf (dump_file, " allowed multipliers:");
- for (i = -MAX_RATIO; i <= MAX_RATIO; i++)
- if (TEST_BIT (valid_mult, i + MAX_RATIO))
- fprintf (dump_file, " %d", (int) i);
- fprintf (dump_file, "\n");
- fprintf (dump_file, "\n");
- }
+ for (i = 2; i <= MAX_RATIO; i++)
+ if (multiplier_allowed_in_address_p (i))
+ {
+ rat = i;
+ break;
+ }
}
bits = GET_MODE_BITSIZE (Pmode);
@@ -3306,8 +3352,7 @@ get_address_cost (bool symbol_present, bool var_present,
offset_p = (s_offset != 0
&& min_offset <= s_offset && s_offset <= max_offset);
ratio_p = (ratio != 1
- && -MAX_RATIO <= ratio && ratio <= MAX_RATIO
- && TEST_BIT (valid_mult, ratio + MAX_RATIO));
+ && multiplier_allowed_in_address_p (ratio));
if (ratio != 1 && !ratio_p)
cost += multiply_by_cost (ratio, Pmode);
@@ -3323,10 +3368,10 @@ get_address_cost (bool symbol_present, bool var_present,
{
acost = 0;
- addr = gen_raw_REG (Pmode, FIRST_PSEUDO_REGISTER);
- reg1 = gen_raw_REG (Pmode, FIRST_PSEUDO_REGISTER + 1);
+ addr = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1);
+ reg1 = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 2);
if (ratio_p)
- addr = gen_rtx_fmt_ee (MULT, Pmode, addr, GEN_INT (rat));
+ addr = gen_rtx_fmt_ee (MULT, Pmode, addr, gen_int_mode (rat, Pmode));
if (var_present)
addr = gen_rtx_fmt_ee (PLUS, Pmode, addr, reg1);
@@ -3338,10 +3383,10 @@ get_address_cost (bool symbol_present, bool var_present,
base = gen_rtx_fmt_e (CONST, Pmode,
gen_rtx_fmt_ee (PLUS, Pmode,
base,
- GEN_INT (off)));
+ gen_int_mode (off, Pmode)));
}
else if (offset_p)
- base = GEN_INT (off);
+ base = gen_int_mode (off, Pmode);
else
base = NULL_RTX;
@@ -5283,8 +5328,7 @@ rewrite_use_nonlinear_expr (struct ivopts_data *data,
return;
}
- comp = unshare_expr (get_computation (data->current_loop,
- use, cand));
+ comp = get_computation (data->current_loop, use, cand);
switch (TREE_CODE (use->stmt))
{
case PHI_NODE:
@@ -5369,78 +5413,60 @@ unshare_and_remove_ssa_names (tree ref)
return ref;
}
-/* Rewrites base of memory access OP with expression WITH in statement
- pointed to by BSI. */
+/* Extract the alias analysis info for the memory reference REF. There are
+ several ways how this information may be stored and what precisely is
+ its semantics depending on the type of the reference, but there always is
+ somewhere hidden one _DECL node that is used to determine the set of
+ virtual operands for the reference. The code below deciphers this jungle
+ and extracts this single useful piece of information. */
-static void
-rewrite_address_base (block_stmt_iterator *bsi, tree *op, tree with)
+static tree
+get_ref_tag (tree ref)
{
- tree bvar, var, new_name, copy, name;
- tree orig;
-
- var = bvar = get_base_address (*op);
+ tree var = get_base_address (ref);
+ tree tag;
- if (!var || TREE_CODE (with) != SSA_NAME)
- goto do_rewrite;
+ if (!var)
+ return NULL_TREE;
- gcc_assert (TREE_CODE (var) != ALIGN_INDIRECT_REF);
- gcc_assert (TREE_CODE (var) != MISALIGNED_INDIRECT_REF);
if (TREE_CODE (var) == INDIRECT_REF)
var = TREE_OPERAND (var, 0);
if (TREE_CODE (var) == SSA_NAME)
{
- name = var;
+ if (SSA_NAME_PTR_INFO (var))
+ {
+ tag = SSA_NAME_PTR_INFO (var)->name_mem_tag;
+ if (tag)
+ return tag;
+ }
+
var = SSA_NAME_VAR (var);
}
- else if (DECL_P (var))
- name = NULL_TREE;
- else
- goto do_rewrite;
-
- /* We need to add a memory tag for the variable. But we do not want
- to add it to the temporary used for the computations, since this leads
- to problems in redundancy elimination when there are common parts
- in two computations referring to the different arrays. So we copy
- the variable to a new temporary. */
- copy = build2 (MODIFY_EXPR, void_type_node, NULL_TREE, with);
-
- if (name)
- new_name = duplicate_ssa_name (name, copy);
- else
+
+ if (DECL_P (var))
{
- tree tag = var_ann (var)->type_mem_tag;
- tree new_ptr = create_tmp_var (TREE_TYPE (with), "ruatmp");
- add_referenced_tmp_var (new_ptr);
+ tag = var_ann (var)->type_mem_tag;
if (tag)
- var_ann (new_ptr)->type_mem_tag = tag;
- else
- add_type_alias (new_ptr, var);
- new_name = make_ssa_name (new_ptr, copy);
- }
+ return tag;
- TREE_OPERAND (copy, 0) = new_name;
- bsi_insert_before (bsi, copy, BSI_SAME_STMT);
- with = new_name;
-
-do_rewrite:
-
- orig = NULL_TREE;
- gcc_assert (TREE_CODE (*op) != ALIGN_INDIRECT_REF);
- gcc_assert (TREE_CODE (*op) != MISALIGNED_INDIRECT_REF);
-
- if (TREE_CODE (*op) == INDIRECT_REF)
- orig = REF_ORIGINAL (*op);
- if (!orig)
- orig = unshare_and_remove_ssa_names (*op);
+ return var;
+ }
- *op = build1 (INDIRECT_REF, TREE_TYPE (*op), with);
+ return NULL_TREE;
+}
- /* Record the original reference, for purposes of alias analysis. */
- REF_ORIGINAL (*op) = orig;
+/* Copies the reference information from OLD_REF to NEW_REF. */
- /* Virtual operands in the original statement may have to be renamed
- because of the replacement. */
- mark_new_vars_to_rename (bsi_stmt (*bsi));
+static void
+copy_ref_info (tree new_ref, tree old_ref)
+{
+ if (TREE_CODE (old_ref) == TARGET_MEM_REF)
+ copy_mem_ref_info (new_ref, old_ref);
+ else
+ {
+ TMR_TAG (new_ref) = get_ref_tag (old_ref);
+ TMR_ORIGINAL (new_ref) = unshare_and_remove_ssa_names (old_ref);
+ }
}
/* Rewrites USE (address that is an iv) using candidate CAND. */
@@ -5449,16 +5475,16 @@ static void
rewrite_use_address (struct ivopts_data *data,
struct iv_use *use, struct iv_cand *cand)
{
- tree comp = unshare_expr (get_computation (data->current_loop,
- use, cand));
+ struct affine_tree_combination aff;
block_stmt_iterator bsi = bsi_for_stmt (use->stmt);
- tree stmts;
- tree op = force_gimple_operand (comp, &stmts, true, NULL_TREE);
+ tree ref;
- if (stmts)
- bsi_insert_before (&bsi, stmts, BSI_SAME_STMT);
+ get_computation_aff (data->current_loop, use, cand, use->stmt, &aff);
+ unshare_aff_combination (&aff);
- rewrite_address_base (&bsi, use->op_p, op);
+ ref = create_mem_ref (&bsi, TREE_TYPE (*use->op_p), &aff);
+ copy_ref_info (ref, *use->op_p);
+ *use->op_p = ref;
}
/* Rewrites USE (the condition such that one of the arguments is an iv) using
@@ -5495,7 +5521,7 @@ rewrite_use_compare (struct ivopts_data *data,
/* The induction variable elimination failed; just express the original
giv. */
- comp = unshare_expr (get_computation (data->current_loop, use, cand));
+ comp = get_computation (data->current_loop, use, cand);
cond = *use->op_p;
op_p = &TREE_OPERAND (cond, 0);
@@ -5645,13 +5671,12 @@ rewrite_use_outer (struct ivopts_data *data,
if (!cand->iv)
{
struct cost_pair *cp = get_use_iv_cost (data, use, cand);
- value = cp->value;
+ value = unshare_expr (cp->value);
}
else
value = get_computation_at (data->current_loop,
use, cand, last_stmt (exit->src));
- value = unshare_expr (value);
op = force_gimple_operand (value, &stmts, true, SSA_NAME_VAR (tgt));
/* If we will preserve the iv anyway and we would need to perform
@@ -5956,25 +5981,5 @@ tree_ssa_iv_optimize (struct loops *loops)
loop = loop->outer;
}
- /* FIXME. IV opts introduces new aliases and call-clobbered
- variables, which need to be renamed. However, when we call the
- renamer, not all statements will be scanned for operands. In
- particular, the newly introduced aliases may appear in statements
- that are considered "unmodified", so the renamer will not get a
- chance to rename those operands.
-
- Work around this problem by forcing an operand re-scan on every
- statement. This will not be necessary once the new operand
- scanner is implemented. */
- if (need_ssa_update_p ())
- {
- basic_block bb;
- block_stmt_iterator si;
- FOR_EACH_BB (bb)
- for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
- update_stmt (bsi_stmt (si));
- }
-
- rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
tree_ssa_iv_optimize_finalize (loops, &data);
}
diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c
index ff8f8998604..50989710dc4 100644
--- a/gcc/tree-ssa-loop-manip.c
+++ b/gcc/tree-ssa-loop-manip.c
@@ -566,13 +566,13 @@ copy_phi_node_args (unsigned first_new_block)
unsigned i;
for (i = first_new_block; i < (unsigned) last_basic_block; i++)
- BASIC_BLOCK (i)->rbi->duplicated = 1;
+ BASIC_BLOCK (i)->flags |= BB_DUPLICATED;
for (i = first_new_block; i < (unsigned) last_basic_block; i++)
add_phi_args_after_copy_bb (BASIC_BLOCK (i));
for (i = first_new_block; i < (unsigned) last_basic_block; i++)
- BASIC_BLOCK (i)->rbi->duplicated = 0;
+ BASIC_BLOCK (i)->flags &= ~BB_DUPLICATED;
}
diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c
index 38f7b42d46c..73424ee098a 100644
--- a/gcc/tree-ssa-loop-niter.c
+++ b/gcc/tree-ssa-loop-niter.c
@@ -1348,6 +1348,15 @@ estimate_numbers_of_iterations_loop (struct loop *loop)
unsigned i, n_exits;
struct tree_niter_desc niter_desc;
+ /* Give up if we already have tried to compute an estimation. */
+ if (loop->estimated_nb_iterations == chrec_dont_know
+ /* Or when we already have an estimation. */
+ || (loop->estimated_nb_iterations != NULL_TREE
+ && TREE_CODE (loop->estimated_nb_iterations) == INTEGER_CST))
+ return;
+ else
+ loop->estimated_nb_iterations = chrec_dont_know;
+
exits = get_loop_exit_edges (loop, &n_exits);
for (i = 0; i < n_exits; i++)
{
@@ -1368,7 +1377,7 @@ estimate_numbers_of_iterations_loop (struct loop *loop)
free (exits);
/* Analyzes the bounds of arrays accessed in the loop. */
- if (loop->estimated_nb_iterations == NULL_TREE)
+ if (chrec_contains_undetermined (loop->estimated_nb_iterations))
{
varray_type datarefs;
VARRAY_GENERIC_PTR_INIT (datarefs, 3, "datarefs");
@@ -1445,13 +1454,18 @@ stmt_dominates_stmt_p (tree s1, tree s2)
return dominated_by_p (CDI_DOMINATORS, bb2, bb1);
}
-/* Checks whether it is correct to count the induction variable BASE + STEP * I
- at AT_STMT in wider TYPE, using the fact that statement OF is executed at
- most BOUND times in the loop. If it is possible, return the value of step
- of the induction variable in the TYPE, otherwise return NULL_TREE.
+/* Return true when it is possible to prove that the induction
+ variable does not wrap: vary outside the type specified bounds.
+ Checks whether BOUND < VALID_NITER that means in the context of iv
+ conversion that all the iterations in the loop are safe: not
+ producing wraps.
+
+ The statement NITER_BOUND->AT_STMT is executed at most
+ NITER_BOUND->BOUND times in the loop.
- ADDITIONAL is the additional condition recorded for operands of the bound.
- This is useful in the following case, created by loop header copying:
+ NITER_BOUND->ADDITIONAL is the additional condition recorded for
+ operands of the bound. This is useful in the following case,
+ created by loop header copying:
i = 0;
if (n > 0)
@@ -1465,108 +1479,213 @@ stmt_dominates_stmt_p (tree s1, tree s2)
assumption "n > 0" says us that the value of the number of iterations is at
most MAX_TYPE - 1 (without this assumption, it might overflow). */
-static tree
-can_count_iv_in_wider_type_bound (tree type, tree base, tree step,
- tree at_stmt,
- tree bound,
- tree additional,
- tree of)
+static bool
+proved_non_wrapping_p (tree at_stmt,
+ struct nb_iter_bound *niter_bound,
+ tree new_type,
+ tree valid_niter)
{
- tree inner_type = TREE_TYPE (base), b, bplusstep, new_step, new_step_abs;
- tree valid_niter, extreme, unsigned_type, delta, bound_type;
tree cond;
+ tree bound = niter_bound->bound;
+
+ if (TYPE_PRECISION (new_type) > TYPE_PRECISION (TREE_TYPE (bound)))
+ bound = fold_convert (unsigned_type_for (new_type), bound);
+ else
+ valid_niter = fold_convert (TREE_TYPE (bound), valid_niter);
+
+ /* After the statement niter_bound->at_stmt we know that anything is
+ executed at most BOUND times. */
+ if (at_stmt && stmt_dominates_stmt_p (niter_bound->at_stmt, at_stmt))
+ cond = fold_build2 (GE_EXPR, boolean_type_node, valid_niter, bound);
+
+ /* Before the statement niter_bound->at_stmt we know that anything
+ is executed at most BOUND + 1 times. */
+ else
+ cond = fold_build2 (GT_EXPR, boolean_type_node, valid_niter, bound);
+
+ if (nonzero_p (cond))
+ return true;
+
+ /* Try taking additional conditions into account. */
+ cond = fold_build2 (TRUTH_OR_EXPR, boolean_type_node,
+ invert_truthvalue (niter_bound->additional),
+ cond);
+
+ if (nonzero_p (cond))
+ return true;
- b = fold_convert (type, base);
- bplusstep = fold_convert (type,
- fold_build2 (PLUS_EXPR, inner_type, base, step));
- new_step = fold_build2 (MINUS_EXPR, type, bplusstep, b);
- if (TREE_CODE (new_step) != INTEGER_CST)
+ return false;
+}
+
+/* Checks whether it is correct to count the induction variable BASE +
+ STEP * I at AT_STMT in a wider type NEW_TYPE, using the bounds on
+ numbers of iterations of a LOOP. If it is possible, return the
+ value of step of the induction variable in the NEW_TYPE, otherwise
+ return NULL_TREE. */
+
+static tree
+convert_step_widening (struct loop *loop, tree new_type, tree base, tree step,
+ tree at_stmt)
+{
+ struct nb_iter_bound *bound;
+ tree base_in_new_type, base_plus_step_in_new_type, step_in_new_type;
+ tree delta, step_abs;
+ tree unsigned_type, valid_niter;
+
+ /* Compute the new step. For example, {(uchar) 100, +, (uchar) 240}
+ is converted to {(uint) 100, +, (uint) 0xfffffff0} in order to
+ keep the values of the induction variable unchanged: 100, 84, 68,
+ ...
+
+ Another example is: (uint) {(uchar)100, +, (uchar)3} is converted
+ to {(uint)100, +, (uint)3}.
+
+ Before returning the new step, verify that the number of
+ iterations is less than DELTA / STEP_ABS (i.e. in the previous
+ example (256 - 100) / 3) such that the iv does not wrap (in which
+ case the operations are too difficult to be represented and
+ handled: the values of the iv should be taken modulo 256 in the
+ wider type; this is not implemented). */
+ base_in_new_type = fold_convert (new_type, base);
+ base_plus_step_in_new_type =
+ fold_convert (new_type,
+ fold_build2 (PLUS_EXPR, TREE_TYPE (base), base, step));
+ step_in_new_type = fold_build2 (MINUS_EXPR, new_type,
+ base_plus_step_in_new_type,
+ base_in_new_type);
+
+ if (TREE_CODE (step_in_new_type) != INTEGER_CST)
return NULL_TREE;
- switch (compare_trees (bplusstep, b))
+ switch (compare_trees (base_plus_step_in_new_type, base_in_new_type))
{
case -1:
- extreme = upper_bound_in_type (type, inner_type);
- delta = fold_build2 (MINUS_EXPR, type, extreme, b);
- new_step_abs = new_step;
- break;
+ {
+ tree extreme = upper_bound_in_type (new_type, TREE_TYPE (base));
+ delta = fold_build2 (MINUS_EXPR, new_type, extreme,
+ base_in_new_type);
+ step_abs = step_in_new_type;
+ break;
+ }
case 1:
- extreme = lower_bound_in_type (type, inner_type);
- new_step_abs = fold_build1 (NEGATE_EXPR, type, new_step);
- delta = fold_build2 (MINUS_EXPR, type, b, extreme);
- break;
+ {
+ tree extreme = lower_bound_in_type (new_type, TREE_TYPE (base));
+ delta = fold_build2 (MINUS_EXPR, new_type, base_in_new_type,
+ extreme);
+ step_abs = fold_build1 (NEGATE_EXPR, new_type, step_in_new_type);
+ break;
+ }
case 0:
- return new_step;
+ return step_in_new_type;
default:
return NULL_TREE;
}
- unsigned_type = unsigned_type_for (type);
+ unsigned_type = unsigned_type_for (new_type);
delta = fold_convert (unsigned_type, delta);
- new_step_abs = fold_convert (unsigned_type, new_step_abs);
+ step_abs = fold_convert (unsigned_type, step_abs);
valid_niter = fold_build2 (FLOOR_DIV_EXPR, unsigned_type,
- delta, new_step_abs);
+ delta, step_abs);
- bound_type = TREE_TYPE (bound);
- if (TYPE_PRECISION (type) > TYPE_PRECISION (bound_type))
- bound = fold_convert (unsigned_type, bound);
- else
- valid_niter = fold_convert (bound_type, valid_niter);
-
- if (at_stmt && stmt_dominates_stmt_p (of, at_stmt))
- {
- /* After the statement OF we know that anything is executed at most
- BOUND times. */
- cond = fold_build2 (GE_EXPR, boolean_type_node, valid_niter, bound);
- }
- else
+ estimate_numbers_of_iterations_loop (loop);
+ for (bound = loop->bounds; bound; bound = bound->next)
+ if (proved_non_wrapping_p (at_stmt, bound, new_type, valid_niter))
+ return step_in_new_type;
+
+ /* Fail when the loop has no bound estimations, or when no bound can
+ be used for verifying the conversion. */
+ return NULL_TREE;
+}
+
+/* Return false only when the induction variable BASE + STEP * I is
+ known to not overflow: i.e. when the number of iterations is small
+ enough with respect to the step and initial condition in order to
+ keep the evolution confined in TYPEs bounds. Return true when the
+ iv is known to overflow or when the property is not computable.
+
+ Initialize INIT_IS_MAX to true when the evolution goes from
+ INIT_IS_MAX to LOWER_BOUND_IN_TYPE, false in the contrary case, not
+ defined when the function returns true. */
+
+bool
+scev_probably_wraps_p (tree type, tree base, tree step,
+ tree at_stmt, struct loop *loop,
+ bool *init_is_max)
+{
+ struct nb_iter_bound *bound;
+ tree delta, step_abs;
+ tree unsigned_type, valid_niter;
+ tree base_plus_step = fold_build2 (PLUS_EXPR, type, base, step);
+
+ switch (compare_trees (base_plus_step, base))
{
- /* Before the statement OF we know that anything is executed at most
- BOUND + 1 times. */
- cond = fold_build2 (GT_EXPR, boolean_type_node, valid_niter, bound);
+ case -1:
+ {
+ tree extreme = upper_bound_in_type (type, TREE_TYPE (base));
+ delta = fold_build2 (MINUS_EXPR, type, extreme, base);
+ step_abs = step;
+ *init_is_max = false;
+ break;
+ }
+
+ case 1:
+ {
+ tree extreme = lower_bound_in_type (type, TREE_TYPE (base));
+ delta = fold_build2 (MINUS_EXPR, type, base, extreme);
+ step_abs = fold_build1 (NEGATE_EXPR, type, step);
+ *init_is_max = true;
+ break;
+ }
+
+ case 0:
+ /* This means step is equal to 0. This should not happen. It
+ could happen in convert step, but not here. Safely answer
+ don't know as in the default case. */
+
+ default:
+ return true;
}
- if (nonzero_p (cond))
- return new_step;
+ /* After having set INIT_IS_MAX, we can return false: when not using
+ wrapping arithmetic, signed types don't wrap. */
+ if (!flag_wrapv && !TYPE_UNSIGNED (type))
+ return false;
- /* Try taking additional conditions into account. */
- cond = fold_build2 (TRUTH_OR_EXPR, boolean_type_node,
- invert_truthvalue (additional),
- cond);
- if (nonzero_p (cond))
- return new_step;
+ unsigned_type = unsigned_type_for (type);
+ delta = fold_convert (unsigned_type, delta);
+ step_abs = fold_convert (unsigned_type, step_abs);
+ valid_niter = fold_build2 (FLOOR_DIV_EXPR, unsigned_type, delta, step_abs);
- return NULL_TREE;
+ estimate_numbers_of_iterations_loop (loop);
+ for (bound = loop->bounds; bound; bound = bound->next)
+ if (proved_non_wrapping_p (at_stmt, bound, type, valid_niter))
+ return false;
+
+ /* At this point we still don't have a proof that the iv does not
+ overflow: give up. */
+ return true;
}
-/* Checks whether it is correct to count the induction variable BASE + STEP * I
- at AT_STMT in wider TYPE, using the bounds on numbers of iterations of a
- LOOP. If it is possible, return the value of step of the induction variable
- in the TYPE, otherwise return NULL_TREE. */
+/* Return the conversion to NEW_TYPE of the STEP of an induction
+ variable BASE + STEP * I at AT_STMT. */
tree
-can_count_iv_in_wider_type (struct loop *loop, tree type, tree base, tree step,
- tree at_stmt)
+convert_step (struct loop *loop, tree new_type, tree base, tree step,
+ tree at_stmt)
{
- struct nb_iter_bound *bound;
- tree new_step;
+ tree base_type = TREE_TYPE (base);
- for (bound = loop->bounds; bound; bound = bound->next)
- {
- new_step = can_count_iv_in_wider_type_bound (type, base, step,
- at_stmt,
- bound->bound,
- bound->additional,
- bound->at_stmt);
-
- if (new_step)
- return new_step;
- }
+ /* When not using wrapping arithmetic, signed types don't wrap. */
+ if (!flag_wrapv && !TYPE_UNSIGNED (base_type))
+ return fold_convert (new_type, step);
- return NULL_TREE;
+ if (TYPE_PRECISION (new_type) > TYPE_PRECISION (base_type))
+ return convert_step_widening (loop, new_type, base, step, at_stmt);
+
+ return fold_convert (new_type, step);
}
/* Frees the information on upper bounds on numbers of iterations of LOOP. */
@@ -1600,3 +1719,21 @@ free_numbers_of_iterations_estimates (struct loops *loops)
free_numbers_of_iterations_estimates_loop (loop);
}
}
+
+/* Substitute value VAL for ssa name NAME inside expressions held
+ at LOOP. */
+
+void
+substitute_in_loop_info (struct loop *loop, tree name, tree val)
+{
+ struct nb_iter_bound *bound;
+
+ loop->nb_iterations = simplify_replace_tree (loop->nb_iterations, name, val);
+ loop->estimated_nb_iterations
+ = simplify_replace_tree (loop->estimated_nb_iterations, name, val);
+ for (bound = loop->bounds; bound; bound = bound->next)
+ {
+ bound->bound = simplify_replace_tree (bound->bound, name, val);
+ bound->additional = simplify_replace_tree (bound->additional, name, val);
+ }
+}
diff --git a/gcc/tree-ssa-loop-unswitch.c b/gcc/tree-ssa-loop-unswitch.c
index cb235f0a4e5..21dc6b5f9ff 100644
--- a/gcc/tree-ssa-loop-unswitch.c
+++ b/gcc/tree-ssa-loop-unswitch.c
@@ -249,6 +249,7 @@ tree_unswitch_single_loop (struct loops *loops, struct loop *loop, int num)
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, ";; Unswitching loop\n");
+ initialize_original_copy_tables ();
/* Unswitch the loop on this condition. */
nloop = tree_unswitch_loop (loops, loop, bbs[i], cond);
if (!nloop)
@@ -256,6 +257,7 @@ tree_unswitch_single_loop (struct loops *loops, struct loop *loop, int num)
/* Update the SSA form after unswitching. */
update_ssa (TODO_update_ssa);
+ free_original_copy_tables ();
/* Invoke itself on modified loops. */
tree_unswitch_single_loop (loops, nloop, num + 1);
diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c
index a64778656b0..12bfc780bd3 100644
--- a/gcc/tree-ssa-operands.c
+++ b/gcc/tree-ssa-operands.c
@@ -26,12 +26,12 @@ Boston, MA 02111-1307, USA. */
#include "flags.h"
#include "function.h"
#include "diagnostic.h"
-#include "errors.h"
#include "tree-flow.h"
#include "tree-inline.h"
#include "tree-pass.h"
#include "ggc.h"
#include "timevar.h"
+#include "toplev.h"
#include "langhooks.h"
@@ -152,6 +152,7 @@ static void note_addressable (tree, stmt_ann_t);
static void get_expr_operands (tree, tree *, int);
static void get_asm_expr_operands (tree);
static void get_indirect_ref_operands (tree, tree, int);
+static void get_tmr_operands (tree, tree, int);
static void get_call_expr_operands (tree, tree);
static inline void append_def (tree *);
static inline void append_use (tree *);
@@ -1289,6 +1290,10 @@ get_expr_operands (tree stmt, tree *expr_p, int flags)
get_indirect_ref_operands (stmt, expr, flags);
return;
+ case TARGET_MEM_REF:
+ get_tmr_operands (stmt, expr, flags);
+ return;
+
case ARRAY_REF:
case ARRAY_RANGE_REF:
/* Treat array references as references to the virtual variable
@@ -1672,6 +1677,30 @@ get_indirect_ref_operands (tree stmt, tree expr, int flags)
get_expr_operands (stmt, pptr, opf_none);
}
+/* A subroutine of get_expr_operands to handle TARGET_MEM_REF. */
+
+static void
+get_tmr_operands (tree stmt, tree expr, int flags)
+{
+ tree tag = TMR_TAG (expr);
+
+ /* First record the real operands. */
+ get_expr_operands (stmt, &TMR_BASE (expr), opf_none);
+ get_expr_operands (stmt, &TMR_INDEX (expr), opf_none);
+
+ /* MEM_REFs should never be killing. */
+ flags &= ~opf_kill_def;
+
+ if (TMR_SYMBOL (expr))
+ note_addressable (TMR_SYMBOL (expr), stmt_ann (stmt));
+
+ if (tag)
+ add_stmt_operand (&tag, stmt_ann (stmt), flags);
+ else
+ /* Something weird, so ensure that we will be careful. */
+ stmt_ann (stmt)->has_volatile_ops = true;
+}
+
/* A subroutine of get_expr_operands to handle CALL_EXPR. */
static void
@@ -1759,7 +1788,7 @@ add_stmt_operand (tree *var_p, stmt_ann_t s_ann, int flags)
/* If the variable cannot be modified and this is a V_MAY_DEF change
it into a VUSE. This happens when read-only variables are marked
- call-clobbered and/or aliased to writeable variables. So we only
+ call-clobbered and/or aliased to writable variables. So we only
check that this only happens on non-specific stores.
Note that if this is a specific store, i.e. associated with a
diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
index 65faf3a5ba9..bf532220ad1 100644
--- a/gcc/tree-ssa-phiopt.c
+++ b/gcc/tree-ssa-phiopt.c
@@ -22,7 +22,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
#include "tree.h"
#include "rtl.h"
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 2482a1329cf..6ec3cdc194b 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -24,7 +24,6 @@ Boston, MA 02111-1307, USA. */
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
#include "tree.h"
#include "basic-block.h"
@@ -178,6 +177,8 @@ Boston, MA 02111-1307, USA. */
useful only for debugging, since we don't do identity lookups. */
+static bool in_fre = false;
+
/* A value set element. Basically a single linked list of
expressions/values. */
typedef struct value_set_node
@@ -2030,17 +2031,32 @@ create_value_expr_from (tree expr, basic_block block, tree stmt)
if (code == TREE_LIST)
{
+ tree op = NULL_TREE;
tree temp = NULL_TREE;
if (TREE_CHAIN (vexpr))
temp = create_value_expr_from (TREE_CHAIN (vexpr), block, stmt);
TREE_CHAIN (vexpr) = temp ? temp : TREE_CHAIN (vexpr);
+
+ /* Recursively value-numberize reference ops. */
+ if (REFERENCE_CLASS_P (TREE_VALUE (vexpr)))
+ {
+ tree tempop;
+ op = TREE_VALUE (vexpr);
+ tempop = create_value_expr_from (op, block, stmt);
+ op = tempop ? tempop : op;
+
+ TREE_VALUE (vexpr) = vn_lookup_or_add (op, stmt);
+ }
+ else
+ {
+ op = TREE_VALUE (vexpr);
+ TREE_VALUE (vexpr) = vn_lookup_or_add (TREE_VALUE (vexpr), NULL);
+ }
/* This is the equivalent of inserting op into EXP_GEN like we
do below */
- if (!is_undefined_value (TREE_VALUE (vexpr)))
- value_insert_into_set (EXP_GEN (block), TREE_VALUE (vexpr));
-
- TREE_VALUE (vexpr) = vn_lookup_or_add (TREE_VALUE (vexpr), NULL);
+ if (!is_undefined_value (op))
+ value_insert_into_set (EXP_GEN (block), op);
return vexpr;
}
@@ -2108,8 +2124,8 @@ can_value_number_call (tree stmt)
tree call = get_call_expr_in (stmt);
/* This is a temporary restriction until we translate vuses through
- phi nodes. */
- if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
+ phi nodes. This is only needed for PRE, of course. */
+ if (!in_fre && !ZERO_SSA_OPERANDS (stmt, SSA_OP_ALL_VIRTUALS))
return false;
if (call_expr_flags (call) & (ECF_PURE | ECF_CONST))
return true;
@@ -2454,6 +2470,8 @@ static void
init_pre (bool do_fre)
{
basic_block bb;
+
+ in_fre = do_fre;
inserted_exprs = NULL;
vn_init ();
diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c
index ee8b1652627..37c644b50c4 100644
--- a/gcc/tree-ssa-propagate.c
+++ b/gcc/tree-ssa-propagate.c
@@ -30,7 +30,6 @@
#include "ggc.h"
#include "basic-block.h"
#include "output.h"
-#include "errors.h"
#include "expr.h"
#include "function.h"
#include "diagnostic.h"
@@ -774,6 +773,7 @@ struct prop_stats_d
{
long num_const_prop;
long num_copy_prop;
+ long num_pred_folded;
};
static struct prop_stats_d prop_stats;
@@ -965,6 +965,11 @@ static void
replace_phi_args_in (tree phi, prop_value_t *prop_value)
{
int i;
+ bool replaced = false;
+ tree prev_phi = NULL;
+
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ prev_phi = unshare_expr (phi);
for (i = 0; i < PHI_NUM_ARGS (phi); i++)
{
@@ -982,6 +987,7 @@ replace_phi_args_in (tree phi, prop_value_t *prop_value)
prop_stats.num_copy_prop++;
propagate_value (PHI_ARG_DEF_PTR (phi, i), val);
+ replaced = true;
/* If we propagated a copy and this argument flows
through an abnormal edge, update the replacement
@@ -992,19 +998,79 @@ replace_phi_args_in (tree phi, prop_value_t *prop_value)
}
}
}
+
+ if (replaced && dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, "Folded PHI node: ");
+ print_generic_stmt (dump_file, prev_phi, TDF_SLIM);
+ fprintf (dump_file, " into: ");
+ print_generic_stmt (dump_file, phi, TDF_SLIM);
+ fprintf (dump_file, "\n");
+ }
+}
+
+
+/* If STMT has a predicate whose value can be computed using the value
+ range information computed by VRP, compute its value and return true.
+ Otherwise, return false. */
+
+static bool
+fold_predicate_in (tree stmt)
+{
+ tree *pred_p = NULL;
+ tree val;
+
+ if (TREE_CODE (stmt) == MODIFY_EXPR
+ && COMPARISON_CLASS_P (TREE_OPERAND (stmt, 1)))
+ pred_p = &TREE_OPERAND (stmt, 1);
+ else if (TREE_CODE (stmt) == COND_EXPR)
+ pred_p = &COND_EXPR_COND (stmt);
+ else
+ return false;
+
+ val = vrp_evaluate_conditional (*pred_p, true);
+ if (val)
+ {
+ if (dump_file)
+ {
+ fprintf (dump_file, "Folding predicate ");
+ print_generic_expr (dump_file, *pred_p, 0);
+ fprintf (dump_file, " to ");
+ print_generic_expr (dump_file, val, 0);
+ fprintf (dump_file, "\n");
+ }
+
+ prop_stats.num_pred_folded++;
+ *pred_p = val;
+ return true;
+ }
+
+ return false;
}
-/* Perform final substitution and folding of propagated values. */
+/* Perform final substitution and folding of propagated values.
+
+ PROP_VALUE[I] contains the single value that should be substituted
+ at every use of SSA name N_I. If PROP_VALUE is NULL, no values are
+ substituted.
+
+ If USE_RANGES_P is true, statements that contain predicate
+ expressions are evaluated with a call to vrp_evaluate_conditional.
+ This will only give meaningful results when called from tree-vrp.c
+ (the information used by vrp_evaluate_conditional is built by the
+ VRP pass). */
void
-substitute_and_fold (prop_value_t *prop_value)
+substitute_and_fold (prop_value_t *prop_value, bool use_ranges_p)
{
basic_block bb;
+ if (prop_value == NULL && !use_ranges_p)
+ return;
+
if (dump_file && (dump_flags & TDF_DETAILS))
- fprintf (dump_file,
- "\nSubstituing values and folding statements\n\n");
+ fprintf (dump_file, "\nSubstituing values and folding statements\n\n");
memset (&prop_stats, 0, sizeof (prop_stats));
@@ -1014,46 +1080,58 @@ substitute_and_fold (prop_value_t *prop_value)
block_stmt_iterator i;
tree phi;
- /* Propagate our known values into PHI nodes. */
- for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
- {
- if (dump_file && (dump_flags & TDF_DETAILS))
- {
- fprintf (dump_file, "Replaced ");
- print_generic_stmt (dump_file, phi, TDF_SLIM);
- }
-
+ /* Propagate known values into PHI nodes. */
+ if (prop_value)
+ for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
replace_phi_args_in (phi, prop_value);
- if (dump_file && (dump_flags & TDF_DETAILS))
- {
- fprintf (dump_file, " with ");
- print_generic_stmt (dump_file, phi, TDF_SLIM);
- fprintf (dump_file, "\n");
- }
- }
-
for (i = bsi_start (bb); !bsi_end_p (i); bsi_next (&i))
{
bool replaced_address, did_replace;
+ tree prev_stmt = NULL;
tree stmt = bsi_stmt (i);
+ /* Ignore ASSERT_EXPRs. They are used by VRP to generate
+ range information for names and they are discarded
+ afterwards. */
+ if (TREE_CODE (stmt) == MODIFY_EXPR
+ && TREE_CODE (TREE_OPERAND (stmt, 1)) == ASSERT_EXPR)
+ continue;
+
/* Replace the statement with its folded version and mark it
folded. */
+ did_replace = false;
+ replaced_address = false;
if (dump_file && (dump_flags & TDF_DETAILS))
+ prev_stmt = unshare_expr (stmt);
+
+ /* If we have range information, see if we can fold
+ predicate expressions. */
+ if (use_ranges_p)
+ did_replace = fold_predicate_in (stmt);
+
+ if (prop_value)
{
- fprintf (dump_file, "Replaced ");
- print_generic_stmt (dump_file, stmt, TDF_SLIM);
+ /* Only replace real uses if we couldn't fold the
+ statement using value range information (value range
+ information is not collected on virtuals, so we only
+ need to check this for real uses). */
+ if (!did_replace)
+ did_replace |= replace_uses_in (stmt, &replaced_address,
+ prop_value);
+
+ did_replace |= replace_vuses_in (stmt, &replaced_address,
+ prop_value);
}
- replaced_address = false;
- did_replace = replace_uses_in (stmt, &replaced_address, prop_value);
- did_replace |= replace_vuses_in (stmt, &replaced_address, prop_value);
+ /* If we made a replacement, fold and cleanup the statement. */
if (did_replace)
{
tree old_stmt = stmt;
+ tree rhs;
+
fold_stmt (bsi_stmt_ptr (i));
- stmt = bsi_stmt(i);
+ stmt = bsi_stmt (i);
/* If we folded a builtin function, we'll likely
need to rename VDEFs. */
@@ -1063,13 +1141,19 @@ substitute_and_fold (prop_value_t *prop_value)
remove EH edges. */
if (maybe_clean_or_replace_eh_stmt (old_stmt, stmt))
tree_purge_dead_eh_edges (bb);
- }
- if (dump_file && (dump_flags & TDF_DETAILS))
- {
- fprintf (dump_file, " with ");
- print_generic_stmt (dump_file, stmt, TDF_SLIM);
- fprintf (dump_file, "\n");
+ rhs = get_rhs (stmt);
+ if (TREE_CODE (rhs) == ADDR_EXPR)
+ recompute_tree_invarant_for_addr_expr (rhs);
+
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, "Folded statement: ");
+ print_generic_stmt (dump_file, prev_stmt, TDF_SLIM);
+ fprintf (dump_file, " into: ");
+ print_generic_stmt (dump_file, stmt, TDF_SLIM);
+ fprintf (dump_file, "\n");
+ }
}
}
}
@@ -1080,6 +1164,9 @@ substitute_and_fold (prop_value_t *prop_value)
prop_stats.num_const_prop);
fprintf (dump_file, "Copies propagated: %6ld\n",
prop_stats.num_copy_prop);
+ fprintf (dump_file, "Predicates folded: %6ld\n",
+ prop_stats.num_pred_folded);
}
}
+
#include "gt-tree-ssa-propagate.h"
diff --git a/gcc/tree-ssa-propagate.h b/gcc/tree-ssa-propagate.h
index f0124f45204..f7265fe0e6c 100644
--- a/gcc/tree-ssa-propagate.h
+++ b/gcc/tree-ssa-propagate.h
@@ -73,6 +73,39 @@ struct prop_value_d {
typedef struct prop_value_d prop_value_t;
+/* Type of value ranges. See value_range_d for a description of these
+ types. */
+enum value_range_type { VR_UNDEFINED, VR_RANGE, VR_ANTI_RANGE, VR_VARYING };
+
+/* Range of values that can be associated with an SSA_NAME after VRP
+ has executed. */
+struct value_range_d
+{
+ /* Lattice value represented by this range. */
+ enum value_range_type type;
+
+ /* Minimum and maximum values represented by this range. These
+ values should be interpreted as follows:
+
+ - If TYPE is VR_UNDEFINED or VR_VARYING then MIN and MAX must
+ be NULL.
+
+ - If TYPE == VR_RANGE then MIN holds the minimum value and
+ MAX holds the maximum value of the range [MIN, MAX].
+
+ - If TYPE == ANTI_RANGE the variable is known to NOT
+ take any values in the range [MIN, MAX]. */
+ tree min;
+ tree max;
+
+ /* Set of SSA names whose value ranges are equivalent to this one.
+ This set is only valid when TYPE is VR_RANGE or VR_ANTI_RANGE. */
+ bitmap equiv;
+};
+
+typedef struct value_range_d value_range_t;
+
+
/* Call-back functions used by the value propagation engine. */
typedef enum ssa_prop_result (*ssa_prop_visit_stmt_fn) (tree, edge *, tree *);
typedef enum ssa_prop_result (*ssa_prop_visit_phi_fn) (tree);
@@ -87,6 +120,6 @@ bool stmt_makes_single_load (tree);
bool stmt_makes_single_store (tree);
prop_value_t *get_value_loaded_by (tree, prop_value_t *);
bool replace_uses_in (tree, bool *, prop_value_t *);
-void substitute_and_fold (prop_value_t *);
+void substitute_and_fold (prop_value_t *, bool);
#endif /* _TREE_SSA_PROPAGATE_H */
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
new file mode 100644
index 00000000000..68a29100b6b
--- /dev/null
+++ b/gcc/tree-ssa-reassoc.c
@@ -0,0 +1,638 @@
+/* Reassociation for trees.
+ Copyright (C) 2005 Free Software Foundation, Inc.
+ Contributed by Daniel Berlin <dan@dberlin.org>
+
+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 "coretypes.h"
+#include "tm.h"
+#include "errors.h"
+#include "ggc.h"
+#include "tree.h"
+#include "basic-block.h"
+#include "diagnostic.h"
+#include "tree-inline.h"
+#include "tree-flow.h"
+#include "tree-gimple.h"
+#include "tree-dump.h"
+#include "timevar.h"
+#include "hashtab.h"
+#include "tree-iterator.h"
+#include "tree-pass.h"
+
+/* This is a simple global reassociation pass that uses a combination
+ of heuristics and a hashtable to try to expose more operations to
+ CSE.
+
+ The basic idea behind the heuristic is to rank expressions by
+ depth of the computation tree and loop depth, and try to produce
+ expressions consisting of small rank operations, as they are more
+ likely to reoccur. In addition, we use a hashtable to try to see
+ if we can transpose an operation into something we have seen
+ before.
+
+ Note that the way the hashtable is structured will sometimes find
+ matches that will not expose additional redundancies, since it is
+ not unwound as we traverse back up one branch of the dominator
+ tree and down another. However, the cost of improving this is
+ probably not worth the additional benefits it will bring. */
+
+/* Statistics */
+static struct
+{
+ int reassociated_by_rank;
+ int reassociated_by_match;
+} reassociate_stats;
+
+
+
+/* Seen binary operator hashtable. */
+static htab_t seen_binops;
+
+/* Binary operator struct. */
+
+typedef struct seen_binop_d
+{
+ tree op1;
+ tree op2;
+} *seen_binop_t;
+
+/* Return a SEEN_BINOP_T if we have seen an associative binary
+ operator with OP1 and OP2 in it. */
+
+static seen_binop_t
+find_seen_binop (tree op1, tree op2)
+{
+ void **slot;
+ struct seen_binop_d sbd;
+ sbd.op1 = op1;
+ sbd.op2 = op2;
+ slot = htab_find_slot (seen_binops, &sbd, NO_INSERT);
+ if (!slot)
+ return NULL;
+ return ((seen_binop_t) *slot);
+}
+
+/* Insert a binary operator consisting of OP1 and OP2 into the
+ SEEN_BINOP table. */
+
+static void
+insert_seen_binop (tree op1, tree op2)
+{
+ void **slot;
+ seen_binop_t new_pair = xmalloc (sizeof (*new_pair));
+ new_pair->op1 = op1;
+ new_pair->op2 = op2;
+ slot = htab_find_slot (seen_binops, new_pair, INSERT);
+ if (*slot != NULL)
+ free (*slot);
+ *slot = new_pair;
+}
+
+/* Return the hash value for a seen binop structure pointed to by P.
+ Because all the binops we consider are associative, we just add the
+ hash value for op1 and op2. */
+
+static hashval_t
+seen_binop_hash (const void *p)
+{
+ const seen_binop_t sb = (seen_binop_t) p;
+ return iterative_hash_expr (sb->op1, 0) + iterative_hash_expr (sb->op2, 0);
+}
+
+/* Return true if two seen binop structures pointed to by P1 and P2 are equal.
+ We have to check the operators both ways because we don't know what
+ order they appear in the table. */
+
+static int
+seen_binop_eq (const void *p1, const void *p2)
+{
+ const seen_binop_t sb1 = (seen_binop_t) p1;
+ const seen_binop_t sb2 = (seen_binop_t) p2;
+ return (sb1->op1 == sb2->op1 && sb1->op2 == sb2->op2)
+ || (sb1->op2 == sb2->op1 && sb1->op1 == sb2->op2);
+}
+
+/* Value rank structure. */
+
+typedef struct valrank_d
+{
+ tree e;
+ unsigned int rank;
+} *valrank_t;
+
+/* Starting rank number for a given basic block, so that we can rank
+ operations using unmovable instructions in that BB based on the bb
+ depth. */
+static unsigned int *bb_rank;
+
+/* Value rank hashtable. */
+static htab_t value_rank;
+
+
+/* Look up the value rank structure for expression E. */
+
+static valrank_t
+find_value_rank (tree e)
+{
+ void **slot;
+ struct valrank_d vrd;
+ vrd.e = e;
+ slot = htab_find_slot (value_rank, &vrd, NO_INSERT);
+ if (!slot)
+ return NULL;
+ return ((valrank_t) *slot);
+}
+
+/* Insert {E,RANK} into the value rank hashtable. */
+
+static void
+insert_value_rank (tree e, unsigned int rank)
+{
+ void **slot;
+ valrank_t new_pair = xmalloc (sizeof (*new_pair));
+ new_pair->e = e;
+ new_pair->rank = rank;
+ slot = htab_find_slot (value_rank, new_pair, INSERT);
+ gcc_assert (*slot == NULL);
+ *slot = new_pair;
+
+}
+
+
+/* Return the hash value for a value rank structure */
+
+static hashval_t
+valrank_hash (const void *p)
+{
+ const valrank_t vr = (valrank_t) p;
+ return iterative_hash_expr (vr->e, 0);
+}
+
+/* Return true if two value rank structures are equal. */
+
+static int
+valrank_eq (const void *p1, const void *p2)
+{
+ const valrank_t vr1 = (valrank_t) p1;
+ const valrank_t vr2 = (valrank_t) p2;
+ return vr1->e == vr2->e;
+}
+
+
+/* Initialize the reassociation pass. */
+
+static void
+init_reassoc (void)
+{
+ int i;
+ unsigned int rank = 2;
+
+ tree param;
+ int *bbs = xmalloc ((last_basic_block + 1) * sizeof (int));
+
+ memset (&reassociate_stats, 0, sizeof (reassociate_stats));
+
+ /* Reverse RPO (Reverse Post Order) will give us something where
+ deeper loops come later. */
+ flow_reverse_top_sort_order_compute (bbs);
+ bb_rank = xcalloc (last_basic_block + 1, sizeof (unsigned int));
+ value_rank = htab_create (511, valrank_hash,
+ valrank_eq, free);
+ seen_binops = htab_create (511, seen_binop_hash,
+ seen_binop_eq, free);
+
+ /* Give each argument a distinct rank. */
+ for (param = DECL_ARGUMENTS (current_function_decl);
+ param;
+ param = TREE_CHAIN (param))
+ {
+ if (default_def (param) != NULL)
+ {
+ tree def = default_def (param);
+ insert_value_rank (def, ++rank);
+ }
+ }
+ /* Give the chain decl a distinct rank. */
+ if (cfun->static_chain_decl != NULL)
+ {
+ tree def = default_def (cfun->static_chain_decl);
+ if (def != NULL)
+ insert_value_rank (def, ++rank);
+ }
+
+ /* Set up rank for each BB */
+ for (i = 0; i < n_basic_blocks; i++)
+ bb_rank[bbs[i]] = ++rank << 16;
+
+ free (bbs);
+ calculate_dominance_info (CDI_DOMINATORS);
+
+}
+
+/* Cleanup after the reassociation pass, and print stats if
+ requested. */
+
+static void
+fini_reassoc (void)
+{
+
+ if (dump_file && (dump_flags & TDF_STATS))
+ {
+ fprintf (dump_file, "Reassociation stats:\n");
+ fprintf (dump_file, "Reassociated by rank: %d\n", reassociate_stats.reassociated_by_rank);
+ fprintf (dump_file, "Reassociated by match: %d\n", reassociate_stats.reassociated_by_match);
+ }
+ htab_delete (value_rank);
+ htab_delete (seen_binops);
+ free (bb_rank);
+}
+
+/* Given an expression E, return the rank of the expression. */
+
+static unsigned int
+get_rank (tree e)
+{
+ valrank_t vr;
+
+ /* Constants have rank 0. */
+ if (is_gimple_min_invariant (e))
+ return 0;
+
+ /* SSA_NAME's have the rank of the expression they are the result
+ of.
+ For globals and uninitialized values, the rank is 0.
+ For function arguments, use the pre-setup rank.
+ For PHI nodes, stores, asm statements, etc, we use the rank of
+ the BB.
+ For simple operations, the rank is the maximum rank of any of
+ its operands, or the bb_rank, whichever is less.
+ I make no claims that this is optimal, however, it gives good
+ results. */
+
+ if (TREE_CODE (e) == SSA_NAME)
+ {
+ tree stmt;
+ tree rhs;
+ unsigned int rank, maxrank;
+ int i;
+
+ if (TREE_CODE (SSA_NAME_VAR (e)) == PARM_DECL
+ && e == default_def (SSA_NAME_VAR (e)))
+ return find_value_rank (e)->rank;
+
+ stmt = SSA_NAME_DEF_STMT (e);
+ if (bb_for_stmt (stmt) == NULL)
+ return 0;
+
+ if (TREE_CODE (stmt) != MODIFY_EXPR
+ || !ZERO_SSA_OPERANDS (stmt, SSA_OP_VIRTUAL_DEFS))
+ return bb_rank[bb_for_stmt (stmt)->index];
+
+ /* If we already have a rank for this expression, use that. */
+ vr = find_value_rank (e);
+ if (vr)
+ return vr->rank;
+
+ /* Otherwise, find the maximum rank for the operands, or the bb
+ rank, whichever is less. */
+ rank = 0;
+ maxrank = bb_rank[bb_for_stmt(stmt)->index];
+ rhs = TREE_OPERAND (stmt, 1);
+ if (TREE_CODE_LENGTH (TREE_CODE (rhs)) == 0)
+ rank = MAX (rank, get_rank (rhs));
+ else
+ {
+ for (i = 0;
+ i < TREE_CODE_LENGTH (TREE_CODE (rhs))
+ && TREE_OPERAND (rhs, i)
+ && rank != maxrank; i++)
+ rank = MAX(rank, get_rank (TREE_OPERAND (rhs, i)));
+ }
+
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, "Rank for ");
+ print_generic_expr (dump_file, e, 0);
+ fprintf (dump_file, " is %d\n", (rank + 1));
+ }
+
+ /* Note the rank in the hashtable so we don't recompute it. */
+ insert_value_rank (e, (rank + 1));
+ return (rank + 1);
+ }
+
+ /* Globals, etc, are rank 0 */
+ return 0;
+}
+
+
+/* Decide whether we should transpose RHS and some operand of
+ LHSDEFOP.
+ If yes, then return true and set TAKEOP to the operand number of LHSDEFOP to
+ switch RHS for.
+ Otherwise, return false. */
+
+static bool
+should_transpose (tree rhs ATTRIBUTE_UNUSED,
+ unsigned int rhsrank,
+ tree lhsdefop, unsigned int *takeop)
+{
+ /* Attempt to expose the low ranked
+ arguments to CSE if we have something like:
+ a = <rank 2> + c (rank 1)
+ b = a (rank 3) + d (rank 1)
+ We want to transform this into:
+ a = c + d
+ b = <rank 2> + <rank 3>
+
+ The op finding part wouldn't be necessary if
+ we could swap the operands above and not have
+ update_stmt change them back on us.
+ */
+ unsigned int lowrankop;
+ unsigned int lowrank;
+ unsigned int highrank;
+ unsigned int highrankop;
+ unsigned int temp;
+
+ lowrankop = 0;
+ *takeop = 1;
+ lowrank = get_rank (TREE_OPERAND (lhsdefop, 0));
+ temp = get_rank (TREE_OPERAND (lhsdefop, 1));
+ highrank = temp;
+ highrankop = 1;
+ if (temp < lowrank)
+ {
+ lowrankop = 1;
+ highrankop = 0;
+ *takeop = 0;
+ highrank = lowrank;
+ lowrank = temp;
+ }
+
+ /* If highrank == lowrank, then we had something
+ like:
+ a = <rank 1> + <rank 1>
+ already, so there is no guarantee that
+ swapping our argument in is going to be
+ better.
+ If we run reassoc twice, we could probably
+ have a flag that switches this behavior on,
+ so that we try once without it, and once with
+ it, so that redundancy elimination sees it
+ both ways.
+ */
+
+ if (lowrank == rhsrank && highrank != lowrank)
+ return true;
+
+ /* Also, see if the LHS's high ranked op should be switched with our
+ RHS simply because it is greater in rank than our current RHS. */
+ if (TREE_CODE (TREE_OPERAND (lhsdefop, 0)) == SSA_NAME)
+ {
+ tree iop = SSA_NAME_DEF_STMT (TREE_OPERAND (lhsdefop, highrankop));
+ if (TREE_CODE (iop) == MODIFY_EXPR)
+ iop = TREE_OPERAND (iop, 1);
+ if (TREE_CODE (iop) == TREE_CODE (lhsdefop))
+ *takeop = 1;
+ if (rhsrank < get_rank (TREE_OPERAND (lhsdefop, *takeop)))
+ return true;
+ }
+
+ return false;
+}
+
+/* Attempt to reassociate the associative binary operator BEXPR, which
+ is in the statement pointed to by CURRBSI. Return true if we
+ changed the statement. */
+
+static bool
+reassociate_expr (tree bexpr, block_stmt_iterator *currbsi)
+{
+ tree lhs = TREE_OPERAND (bexpr, 0);
+ tree rhs = TREE_OPERAND (bexpr, 1);
+ tree lhsdef;
+ tree lhsi;
+ bool changed = false;
+ unsigned int lhsrank = get_rank (lhs);
+ unsigned int rhsrank = get_rank (rhs);
+
+ /* I don't want to get into the business of floating point
+ reassociation. */
+ if (!INTEGRAL_TYPE_P (TREE_TYPE (lhs))
+ || !INTEGRAL_TYPE_P (TREE_TYPE (rhs)))
+ return false;
+
+ /* We want the greater ranked operand to be our "LHS" for simplicity
+ sake. There is no point in actually modifying the expression, as
+ update_stmt will simply resort the operands anyway. */
+ if (lhsrank < rhsrank)
+ {
+ tree temp;
+ unsigned int temp1;
+ temp = lhs;
+ lhs = rhs;
+ rhs = temp;
+ temp1 = lhsrank;
+ lhsrank = rhsrank;
+ rhsrank = temp1;
+ }
+
+ /* If the high ranked operand is an SSA_NAME, and the binary
+ operator is not something we've already seen somewhere else
+ (i.e., it may be redundant), attempt to reassociate it.
+
+ We can't reassociate expressions unless the expression we are
+ going to reassociate with is only used in our current expression,
+ or else we may screw up other computations, like so:
+
+ a = b + c
+ e = a + d
+
+ g = a + f
+
+ We cannot reassociate and rewrite the "a = ..." ,
+ because that would change the value of the computation of
+ "g = a + f". */
+ if (TREE_CODE (lhs) == SSA_NAME && !find_seen_binop (lhs, rhs))
+ {
+ lhsdef = SSA_NAME_DEF_STMT (lhs);
+ if (TREE_CODE (lhsdef) == MODIFY_EXPR)
+ {
+ lhsi = TREE_OPERAND (lhsdef, 1);
+ if (TREE_CODE (lhsi) == TREE_CODE (bexpr))
+ {
+ use_operand_p use;
+ tree usestmt;
+ if (single_imm_use (lhs, &use, &usestmt))
+ {
+ unsigned int takeop = 0;
+ unsigned int otherop = 1;
+ bool foundmatch = false;
+ bool foundrank = false;
+
+ /* If we can easily transpose this into an operation
+ we've already seen, let's do that.
+ otherwise, let's try to expose low ranked ops to
+ CSE. */
+ if (find_seen_binop (TREE_OPERAND (lhsi, 1), rhs))
+ {
+ takeop = 0;
+ otherop = 1;
+ foundmatch = true;
+ }
+ else if (find_seen_binop (TREE_OPERAND (lhsi, 0),
+ rhs))
+ {
+ takeop = 1;
+ otherop = 0;
+ foundmatch = true;
+ }
+ else if (should_transpose (rhs, rhsrank, lhsi,
+ &takeop))
+ {
+ foundrank = true;
+ }
+ if (foundmatch || foundrank)
+ {
+ block_stmt_iterator lhsbsi = bsi_for_stmt (lhsdef);
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, "Reassociating by %s\n",
+ foundmatch ? "match" : "rank");
+ fprintf (dump_file, "Before LHS:");
+ print_generic_stmt (dump_file, lhsi, 0);
+ fprintf (dump_file, "Before curr expr:");
+ print_generic_stmt (dump_file, bexpr, 0);
+ }
+ TREE_OPERAND (bexpr, 0) = TREE_OPERAND (lhsi, takeop);
+ TREE_OPERAND (lhsi, takeop) = rhs;
+ TREE_OPERAND (bexpr, 1) = TREE_OPERAND (lhsdef, 0);
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, "After LHS:");
+ print_generic_stmt (dump_file, lhsi, 0);
+ fprintf (dump_file, "After curr expr:");
+ print_generic_stmt (dump_file, bexpr, 0);
+ }
+ bsi_move_before (&lhsbsi, currbsi);
+ update_stmt (lhsdef);
+ update_stmt (bsi_stmt (*currbsi));
+ lhsbsi = bsi_for_stmt (lhsdef);
+ update_stmt (bsi_stmt (lhsbsi));
+
+ /* If update_stmt didn't reorder our operands,
+ we'd like to recurse on the expression we
+ just reassociated and reassociate it
+ top-down, exposing further opportunities.
+ Unfortunately, update_stmt does reorder them,
+ so we can't do this cheaply. */
+ if (!foundmatch)
+ reassociate_stats.reassociated_by_rank++;
+ else
+ reassociate_stats.reassociated_by_match++;
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return changed;
+}
+
+/* Reassociate expressions in basic block BB and its dominator as
+ children , return true if any
+ expressions changed. */
+
+static bool
+reassociate_bb (basic_block bb)
+{
+ bool changed = false;
+ block_stmt_iterator bsi;
+ basic_block son;
+
+ for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
+ {
+ tree stmt = bsi_stmt (bsi);
+
+ if (TREE_CODE (stmt) == MODIFY_EXPR)
+ {
+ tree rhs = TREE_OPERAND (stmt, 1);
+ if (associative_tree_code (TREE_CODE (rhs)))
+ {
+ if (reassociate_expr (rhs, &bsi))
+ {
+ changed = true;
+ update_stmt (stmt);
+ }
+ insert_seen_binop (TREE_OPERAND (rhs, 0),
+ TREE_OPERAND (rhs, 1));
+ }
+ }
+ }
+ for (son = first_dom_son (CDI_DOMINATORS, bb);
+ son;
+ son = next_dom_son (CDI_DOMINATORS, son))
+ {
+ changed |= reassociate_bb (son);
+ }
+ return changed;
+}
+
+
+static bool
+do_reassoc (void)
+{
+ bool changed = false;
+
+ changed = reassociate_bb (ENTRY_BLOCK_PTR);
+
+ return changed;
+}
+
+
+/* Gate and execute functions for Reassociation. */
+
+static void
+execute_reassoc (void)
+{
+ init_reassoc ();
+ do_reassoc ();
+ fini_reassoc ();
+}
+
+struct tree_opt_pass pass_reassoc =
+{
+ "reassoc", /* name */
+ NULL, /* gate */
+ execute_reassoc, /* execute */
+ NULL, /* sub */
+ NULL, /* next */
+ 0, /* static_pass_number */
+ TV_TREE_REASSOC, /* tv_id */
+ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ TODO_update_ssa | TODO_dump_func
+ | TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
+ 0 /* letter */
+};
diff --git a/gcc/tree-ssa-sink.c b/gcc/tree-ssa-sink.c
index a234be8347c..6bd77ab9f95 100644
--- a/gcc/tree-ssa-sink.c
+++ b/gcc/tree-ssa-sink.c
@@ -23,7 +23,6 @@ Boston, MA 02111-1307, USA. */
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
#include "tree.h"
#include "basic-block.h"
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
new file mode 100644
index 00000000000..5ca2a5cc98f
--- /dev/null
+++ b/gcc/tree-ssa-structalias.c
@@ -0,0 +1,3209 @@
+/* Tree based points-to analysis
+ Copyright (C) 2005 Free Software Foundation, Inc.
+ Contributed by Daniel Berlin <dberlin@dberlin.org>
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+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.
+
+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; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
+#include "ggc.h"
+#include "obstack.h"
+#include "bitmap.h"
+#include "tree-ssa-structalias.h"
+#include "flags.h"
+#include "rtl.h"
+#include "tm_p.h"
+#include "hard-reg-set.h"
+#include "basic-block.h"
+#include "output.h"
+#include "errors.h"
+#include "expr.h"
+#include "diagnostic.h"
+#include "tree.h"
+#include "c-common.h"
+#include "tree-flow.h"
+#include "tree-inline.h"
+#include "varray.h"
+#include "c-tree.h"
+#include "tree-gimple.h"
+#include "hashtab.h"
+#include "function.h"
+#include "cgraph.h"
+#include "tree-pass.h"
+#include "timevar.h"
+#include "alloc-pool.h"
+#include "splay-tree.h"
+
+/* The idea behind this analyzer is to generate set constraints from the
+ program, then solve the resulting constraints in order to generate the
+ points-to sets.
+
+ Set constraints are a way of modeling program analysis problems that
+ involve sets. They consist of an inclusion constraint language,
+ describing the variables (each variable is a set) and operations that
+ are involved on the variables, and a set of rules that derive facts
+ from these operations. To solve a system of set constraints, you derive
+ all possible facts under the rules, which gives you the correct sets
+ as a consequence.
+
+ See "Efficient Field-sensitive pointer analysis for C" by "David
+ J. Pearce and Paul H. J. Kelly and Chris Hankin, at
+ http://citeseer.ist.psu.edu/pearce04efficient.html
+
+ Also see "Ultra-fast Aliasing Analysis using CLA: A Million Lines
+ of C Code in a Second" by ""Nevin Heintze and Olivier Tardieu" at
+ http://citeseer.ist.psu.edu/heintze01ultrafast.html
+
+ There are three types of constraint expressions, DEREF, ADDRESSOF, and
+ SCALAR. Each constraint expression consists of a constraint type,
+ a variable, and an offset.
+
+ SCALAR is a constraint expression type used to represent x, whether
+ it appears on the LHS or the RHS of a statement.
+ DEREF is a constraint expression type used to represent *x, whether
+ it appears on the LHS or the RHS of a statement.
+ ADDRESSOF is a constraint expression used to represent &x, whether
+ it appears on the LHS or the RHS of a statement.
+
+ Each pointer variable in the program is assigned an integer id, and
+ each field of a structure variable is assigned an integer id as well.
+
+ Structure variables are linked to their list of fields through a "next
+ field" in each variable that points to the next field in offset
+ order.
+ Each variable for a structure field has
+
+ 1. "size", that tells the size in bits of that field.
+ 2. "fullsize, that tells the size in bits of the entire structure.
+ 3. "offset", that tells the offset in bits from the beginning of the
+ structure to this field.
+
+ Thus,
+ struct f
+ {
+ int a;
+ int b;
+ } foo;
+ int *bar;
+
+ looks like
+
+ foo.a -> id 1, size 32, offset 0, fullsize 64, next foo.b
+ foo.b -> id 2, size 32, offset 32, fullsize 64, next NULL
+ bar -> id 3, size 32, offset 0, fullsize 32, next NULL
+
+
+ In order to solve the system of set constraints, the following is
+ done:
+
+ 1. Each constraint variable x has a solution set associated with it,
+ Sol(x).
+
+ 2. Constraints are separated into direct, copy, and complex.
+ Direct constraints are ADDRESSOF constraints that require no extra
+ processing, such as P = &Q
+ Copy constraints are those of the form P = Q.
+ Complex constraints are all the constraints involving dereferences.
+
+ 3. All direct constraints of the form P = &Q are processed, such
+ that Q is added to Sol(P)
+
+ 4. All complex constraints for a given constraint variable are stored in a
+ linked list attached to that variable's node.
+
+ 5. A directed graph is built out of the copy constraints. Each
+ constraint variable is a node in the graph, and an edge from
+ Q to P is added for each copy constraint of the form P = Q
+
+ 6. The graph is then walked, and solution sets are
+ propagated along the copy edges, such that an edge from Q to P
+ causes Sol(P) <- Sol(P) union Sol(Q).
+
+ 7. As we visit each node, all complex constraints associated with
+ that node are processed by adding appropriate copy edges to the graph, or the
+ appropriate variables to the solution set.
+
+ 8. The process of walking the graph is iterated until no solution
+ sets change.
+
+ Prior to walking the graph in steps 6 and 7, We perform static
+ cycle elimination on the constraint graph, as well
+ as off-line variable substitution.
+
+ TODO: Adding offsets to pointer-to-structures can be handled (IE not punted
+ on and turned into anything), but isn't. You can just see what offset
+ inside the pointed-to struct it's going to access.
+
+ TODO: Constant bounded arrays can be handled as if they were structs of the
+ same number of elements.
+
+ TODO: Modeling heap and incoming pointers becomes much better if we
+ add fields to them as we discover them, which we could do.
+
+ TODO: We could handle unions, but to be honest, it's probably not
+ worth the pain or slowdown. */
+
+static bool use_field_sensitive = true;
+static unsigned int create_variable_info_for (tree, const char *);
+static struct constraint_expr get_constraint_for (tree);
+static void build_constraint_graph (void);
+
+static bitmap_obstack ptabitmap_obstack;
+static bitmap_obstack iteration_obstack;
+DEF_VEC_P(constraint_t);
+DEF_VEC_ALLOC_P(constraint_t,gc);
+
+static struct constraint_stats
+{
+ unsigned int total_vars;
+ unsigned int collapsed_vars;
+ unsigned int unified_vars_static;
+ unsigned int unified_vars_dynamic;
+ unsigned int iterations;
+} stats;
+
+struct variable_info
+{
+ /* ID of this variable */
+ unsigned int id;
+
+ /* Name of this variable */
+ const char *name;
+
+ /* Tree that this variable is associated with. */
+ tree decl;
+
+ /* Offset of this variable, in bits, from the base variable */
+ unsigned HOST_WIDE_INT offset;
+
+ /* Size of the variable, in bits. */
+ unsigned HOST_WIDE_INT size;
+
+ /* Full size of the base variable, in bits. */
+ unsigned HOST_WIDE_INT fullsize;
+
+ /* A link to the variable for the next field in this structure. */
+ struct variable_info *next;
+
+ /* Node in the graph that represents the constraints and points-to
+ solution for the variable. */
+ unsigned int node;
+
+ /* True if the address of this variable is taken. Needed for
+ variable substitution. */
+ unsigned int address_taken:1;
+
+ /* True if this variable is the target of a dereference. Needed for
+ variable substitution. */
+ unsigned int indirect_target:1;
+
+ /* True if this is a variable created by the constraint analysis, such as
+ heap variables and constraints we had to break up. */
+ unsigned int is_artificial_var:1;
+
+ /* True for variables whose size is not known or variable. */
+ unsigned int is_unknown_size_var:1;
+
+ /* True for variables that have unions somewhere in them. */
+ unsigned int has_union:1;
+
+ /* Points-to set for this variable. */
+ bitmap solution;
+
+ /* Variable ids represented by this node. */
+ bitmap variables;
+
+ /* Vector of complex constraints for this node. Complex
+ constraints are those involving dereferences. */
+ VEC(constraint_t,gc) *complex;
+};
+typedef struct variable_info *varinfo_t;
+
+static varinfo_t first_vi_for_offset (varinfo_t, unsigned HOST_WIDE_INT);
+
+/* Pool of variable info structures. */
+static alloc_pool variable_info_pool;
+
+DEF_VEC_P(varinfo_t);
+
+DEF_VEC_ALLOC_P(varinfo_t, gc);
+
+/* Table of variable info structures for constraint variables. Indexed directly
+ by variable info id. */
+static VEC(varinfo_t,gc) *varmap;
+#define get_varinfo(n) VEC_index(varinfo_t, varmap, n)
+
+/* Variable that represents the unknown pointer. */
+static varinfo_t var_anything;
+static tree anything_tree;
+static unsigned int anything_id;
+
+/* Variable that represents the NULL pointer. */
+static varinfo_t var_nothing;
+static tree nothing_tree;
+static unsigned int nothing_id;
+
+/* Variable that represents read only memory. */
+static varinfo_t var_readonly;
+static tree readonly_tree;
+static unsigned int readonly_id;
+
+/* Variable that represents integers. This is used for when people do things
+ like &0->a.b. */
+static varinfo_t var_integer;
+static tree integer_tree;
+static unsigned int integer_id;
+
+
+/* Return a new variable info structure consisting for a variable
+ named NAME, and using constraint graph node NODE. */
+
+static varinfo_t
+new_var_info (tree t, unsigned int id, const char *name, unsigned int node)
+{
+ varinfo_t ret = pool_alloc (variable_info_pool);
+
+ ret->id = id;
+ ret->name = name;
+ ret->decl = t;
+ ret->node = node;
+ ret->address_taken = false;
+ ret->indirect_target = false;
+ ret->is_artificial_var = false;
+ ret->is_unknown_size_var = false;
+ ret->solution = BITMAP_ALLOC (&ptabitmap_obstack);
+ bitmap_clear (ret->solution);
+ ret->variables = BITMAP_ALLOC (&ptabitmap_obstack);
+ bitmap_clear (ret->variables);
+ ret->complex = NULL;
+ ret->next = NULL;
+ return ret;
+}
+
+typedef enum {SCALAR, DEREF, ADDRESSOF} constraint_expr_type;
+
+/* An expression that appears in a constraint. */
+
+struct constraint_expr
+{
+ /* Constraint type. */
+ constraint_expr_type type;
+
+ /* Variable we are referring to in the constraint. */
+ unsigned int var;
+
+ /* Offset, in bits, of this constraint from the beginning of
+ variables it ends up referring to.
+
+ IOW, in a deref constraint, we would deref, get the result set,
+ then add OFFSET to each member. */
+ unsigned HOST_WIDE_INT offset;
+};
+
+static struct constraint_expr do_deref (struct constraint_expr);
+
+/* Our set constraints are made up of two constraint expressions, one
+ LHS, and one RHS.
+
+ As described in the introduction, our set constraints each represent an
+ operation between set valued variables.
+*/
+struct constraint
+{
+ struct constraint_expr lhs;
+ struct constraint_expr rhs;
+};
+
+/* List of constraints that we use to build the constraint graph from. */
+
+static VEC(constraint_t,gc) *constraints;
+static alloc_pool constraint_pool;
+
+/* An edge in the constraint graph. We technically have no use for
+ the src, since it will always be the same node that we are indexing
+ into the pred/succ arrays with, but it's nice for checking
+ purposes. The edges are weighted, with a bit set in weights for
+ each edge from src to dest with that weight. */
+
+struct constraint_edge
+{
+ unsigned int src;
+ unsigned int dest;
+ bitmap weights;
+};
+
+typedef struct constraint_edge *constraint_edge_t;
+static alloc_pool constraint_edge_pool;
+
+/* Return a new constraint edge from SRC to DEST. */
+
+static constraint_edge_t
+new_constraint_edge (unsigned int src, unsigned int dest)
+{
+ constraint_edge_t ret = pool_alloc (constraint_edge_pool);
+ ret->src = src;
+ ret->dest = dest;
+ ret->weights = NULL;
+ return ret;
+}
+
+DEF_VEC_P(constraint_edge_t);
+DEF_VEC_ALLOC_P(constraint_edge_t,gc);
+
+
+/* The constraint graph is simply a set of adjacency vectors, one per
+ variable. succs[x] is the vector of successors for variable x, and preds[x]
+ is the vector of predecessors for variable x.
+ IOW, all edges are "forward" edges, which is not like our CFG.
+ So remember that
+ preds[x]->src == x, and
+ succs[x]->src == x*/
+
+struct constraint_graph
+{
+ VEC(constraint_edge_t,gc) **succs;
+ VEC(constraint_edge_t,gc) **preds;
+};
+
+typedef struct constraint_graph *constraint_graph_t;
+
+static constraint_graph_t graph;
+
+/* Create a new constraint consisting of LHS and RHS expressions. */
+
+static constraint_t
+new_constraint (const struct constraint_expr lhs,
+ const struct constraint_expr rhs)
+{
+ constraint_t ret = pool_alloc (constraint_pool);
+ ret->lhs = lhs;
+ ret->rhs = rhs;
+ return ret;
+}
+
+/* Print out constraint C to FILE. */
+
+void
+dump_constraint (FILE *file, constraint_t c)
+{
+ if (c->lhs.type == ADDRESSOF)
+ fprintf (file, "&");
+ else if (c->lhs.type == DEREF)
+ fprintf (file, "*");
+ fprintf (file, "%s", get_varinfo (c->lhs.var)->name);
+ if (c->lhs.offset != 0)
+ fprintf (file, " + " HOST_WIDE_INT_PRINT_DEC, c->lhs.offset);
+ fprintf (file, " = ");
+ if (c->rhs.type == ADDRESSOF)
+ fprintf (file, "&");
+ else if (c->rhs.type == DEREF)
+ fprintf (file, "*");
+ fprintf (file, "%s", get_varinfo (c->rhs.var)->name);
+ if (c->rhs.offset != 0)
+ fprintf (file, " + " HOST_WIDE_INT_PRINT_DEC, c->rhs.offset);
+ fprintf (file, "\n");
+}
+
+/* Print out constraint C to stderr. */
+
+void
+debug_constraint (constraint_t c)
+{
+ dump_constraint (stderr, c);
+}
+
+/* Print out all constraints to FILE */
+
+void
+dump_constraints (FILE *file)
+{
+ int i;
+ constraint_t c;
+ for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++)
+ dump_constraint (file, c);
+}
+
+/* Print out all constraints to stderr. */
+
+void
+debug_constraints (void)
+{
+ dump_constraints (stderr);
+}
+
+/* SOLVER FUNCTIONS
+
+ The solver is a simple worklist solver, that works on the following
+ algorithm:
+
+ sbitmap changed_nodes = all ones;
+ changed_count = number of nodes;
+ For each node that was already collapsed:
+ changed_count--;
+
+
+ while (changed_count > 0)
+ {
+ compute topological ordering for constraint graph
+
+ find and collapse cycles in the constraint graph (updating
+ changed if necessary)
+
+ for each node (n) in the graph in topological order:
+ changed_count--;
+
+ Process each complex constraint associated with the node,
+ updating changed if necessary.
+
+ For each outgoing edge from n, propagate the solution from n to
+ the destination of the edge, updating changed as necessary.
+
+ } */
+
+/* Return true if two constraint expressions A and B are equal. */
+
+static bool
+constraint_expr_equal (struct constraint_expr a, struct constraint_expr b)
+{
+ return a.type == b.type
+ && a.var == b.var
+ && a.offset == b.offset;
+}
+
+/* Return true if constraint expression A is less than constraint expression
+ B. This is just arbitrary, but consistent, in order to give them an
+ ordering. */
+
+static bool
+constraint_expr_less (struct constraint_expr a, struct constraint_expr b)
+{
+ if (a.type == b.type)
+ {
+ if (a.var == b.var)
+ return a.offset < b.offset;
+ else
+ return a.var < b.var;
+ }
+ else
+ return a.type < b.type;
+}
+
+/* Return true if constraint A is less than constraint B. This is just
+ arbitrary, but consistent, in order to give them an ordering. */
+
+static bool
+constraint_less (const constraint_t a, const constraint_t b)
+{
+ if (constraint_expr_less (a->lhs, b->lhs))
+ return true;
+ else if (constraint_expr_less (b->lhs, a->lhs))
+ return false;
+ else
+ return constraint_expr_less (a->rhs, b->rhs);
+}
+
+/* Return true if two constraints A and B are equal. */
+
+static bool
+constraint_equal (struct constraint a, struct constraint b)
+{
+ return constraint_expr_equal (a.lhs, b.lhs)
+ && constraint_expr_equal (a.rhs, b.rhs);
+}
+
+
+/* Find a constraint LOOKFOR in the sorted constraint vector VEC */
+
+static constraint_t
+constraint_vec_find (VEC(constraint_t,gc) *vec,
+ struct constraint lookfor)
+{
+ unsigned int place;
+ constraint_t found;
+
+ if (vec == NULL)
+ return NULL;
+
+ place = VEC_lower_bound (constraint_t, vec, &lookfor, constraint_less);
+ if (place >= VEC_length (constraint_t, vec))
+ return NULL;
+ found = VEC_index (constraint_t, vec, place);
+ if (!constraint_equal (*found, lookfor))
+ return NULL;
+ return found;
+}
+
+/* Union two constraint vectors, TO and FROM. Put the result in TO. */
+
+static void
+constraint_set_union (VEC(constraint_t,gc) **to,
+ VEC(constraint_t,gc) **from)
+{
+ int i;
+ constraint_t c;
+
+ for (i = 0; VEC_iterate (constraint_t, *from, i, c); i++)
+ {
+ if (constraint_vec_find (*to, *c) == NULL)
+ {
+ unsigned int place = VEC_lower_bound (constraint_t, *to, c,
+ constraint_less);
+ VEC_safe_insert (constraint_t, gc, *to, place, c);
+ }
+ }
+}
+
+/* Take a solution set SET, add OFFSET to each member of the set, and
+ overwrite SET with the result when done. */
+
+static void
+solution_set_add (bitmap set, unsigned HOST_WIDE_INT offset)
+{
+ bitmap result = BITMAP_ALLOC (&iteration_obstack);
+ unsigned int i;
+ bitmap_iterator bi;
+
+ EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi)
+ {
+ /* If this is a properly sized variable, only add offset if it's
+ less than end. Otherwise, it is globbed to a single
+ variable. */
+
+ if ((get_varinfo (i)->offset + offset) < get_varinfo (i)->fullsize)
+ {
+ unsigned HOST_WIDE_INT fieldoffset = get_varinfo (i)->offset + offset;
+ varinfo_t v = first_vi_for_offset (get_varinfo (i), fieldoffset);
+ bitmap_set_bit (result, v->id);
+ }
+ else if (get_varinfo (i)->is_artificial_var
+ || get_varinfo (i)->is_unknown_size_var)
+ {
+ bitmap_set_bit (result, i);
+ }
+ }
+
+ bitmap_copy (set, result);
+ BITMAP_FREE (result);
+}
+
+/* Union solution sets TO and FROM, and add INC to each member of FROM in the
+ process. */
+
+static bool
+set_union_with_increment (bitmap to, bitmap from, unsigned HOST_WIDE_INT inc)
+{
+ if (inc == 0)
+ return bitmap_ior_into (to, from);
+ else
+ {
+ bitmap tmp;
+ bool res;
+
+ tmp = BITMAP_ALLOC (&iteration_obstack);
+ bitmap_copy (tmp, from);
+ solution_set_add (tmp, inc);
+ res = bitmap_ior_into (to, tmp);
+ BITMAP_FREE (tmp);
+ return res;
+ }
+}
+
+/* Insert constraint C into the list of complex constraints for VAR. */
+
+static void
+insert_into_complex (unsigned int var, constraint_t c)
+{
+ varinfo_t vi = get_varinfo (var);
+ unsigned int place = VEC_lower_bound (constraint_t, vi->complex, c,
+ constraint_less);
+ VEC_safe_insert (constraint_t, gc, vi->complex, place, c);
+}
+
+
+/* Compare two constraint edges A and B, return true if they are equal. */
+
+static bool
+constraint_edge_equal (struct constraint_edge a, struct constraint_edge b)
+{
+ return a.src == b.src && a.dest == b.dest;
+}
+
+/* Compare two constraint edges, return true if A is less than B */
+
+static bool
+constraint_edge_less (const constraint_edge_t a, const constraint_edge_t b)
+{
+ if (a->dest < b->dest)
+ return true;
+ else if (a->dest == b->dest)
+ return a->src < b->src;
+ else
+ return false;
+}
+
+/* Find the constraint edge that matches LOOKFOR, in VEC.
+ Return the edge, if found, NULL otherwise. */
+
+static constraint_edge_t
+constraint_edge_vec_find (VEC(constraint_edge_t,gc) *vec,
+ struct constraint_edge lookfor)
+{
+ unsigned int place;
+ constraint_edge_t edge;
+
+ place = VEC_lower_bound (constraint_edge_t, vec, &lookfor,
+ constraint_edge_less);
+ edge = VEC_index (constraint_edge_t, vec, place);
+ if (!constraint_edge_equal (*edge, lookfor))
+ return NULL;
+ return edge;
+}
+
+/* Condense two variable nodes into a single variable node, by moving
+ all associated info from SRC to TO. */
+
+static void
+condense_varmap_nodes (unsigned int to, unsigned int src)
+{
+ varinfo_t tovi = get_varinfo (to);
+ varinfo_t srcvi = get_varinfo (src);
+ unsigned int i;
+ constraint_t c;
+ bitmap_iterator bi;
+
+ /* the src node, and all its variables, are now the to node. */
+ srcvi->node = to;
+ EXECUTE_IF_SET_IN_BITMAP (srcvi->variables, 0, i, bi)
+ get_varinfo (i)->node = to;
+
+ /* Merge the src node variables and the to node variables. */
+ bitmap_set_bit (tovi->variables, src);
+ bitmap_ior_into (tovi->variables, srcvi->variables);
+ bitmap_clear (srcvi->variables);
+
+ /* Move all complex constraints from src node into to node */
+ for (i = 0; VEC_iterate (constraint_t, srcvi->complex, i, c); i++)
+ {
+ /* In complex constraints for node src, we may have either
+ a = *src, and *src = a. */
+
+ if (c->rhs.type == DEREF)
+ c->rhs.var = to;
+ else
+ c->lhs.var = to;
+ }
+ constraint_set_union (&tovi->complex, &srcvi->complex);
+ srcvi->complex = NULL;
+}
+
+/* Erase EDGE from GRAPH. This routine only handles self-edges
+ (e.g. an edge from a to a). */
+
+static void
+erase_graph_self_edge (constraint_graph_t graph, struct constraint_edge edge)
+{
+ VEC(constraint_edge_t,gc) *predvec = graph->preds[edge.src];
+ VEC(constraint_edge_t,gc) *succvec = graph->succs[edge.dest];
+ unsigned int place;
+ gcc_assert (edge.src == edge.dest);
+
+ /* Remove from the successors. */
+ place = VEC_lower_bound (constraint_edge_t, succvec, &edge,
+ constraint_edge_less);
+
+ /* Make sure we found the edge. */
+#ifdef ENABLE_CHECKING
+ {
+ constraint_edge_t tmp = VEC_index (constraint_edge_t, succvec, place);
+ gcc_assert (constraint_edge_equal (*tmp, edge));
+ }
+#endif
+ VEC_ordered_remove (constraint_edge_t, succvec, place);
+
+ /* Remove from the predecessors. */
+ place = VEC_lower_bound (constraint_edge_t, predvec, &edge,
+ constraint_edge_less);
+
+ /* Make sure we found the edge. */
+#ifdef ENABLE_CHECKING
+ {
+ constraint_edge_t tmp = VEC_index (constraint_edge_t, predvec, place);
+ gcc_assert (constraint_edge_equal (*tmp, edge));
+ }
+#endif
+ VEC_ordered_remove (constraint_edge_t, predvec, place);
+}
+
+/* Remove edges involving NODE from GRAPH. */
+
+static void
+clear_edges_for_node (constraint_graph_t graph, unsigned int node)
+{
+ VEC(constraint_edge_t,gc) *succvec = graph->succs[node];
+ VEC(constraint_edge_t,gc) *predvec = graph->preds[node];
+ constraint_edge_t c;
+ int i;
+
+ /* Walk the successors, erase the associated preds. */
+ for (i = 0; VEC_iterate (constraint_edge_t, succvec, i, c); i++)
+ if (c->dest != node)
+ {
+ unsigned int place;
+ struct constraint_edge lookfor;
+ lookfor.src = c->dest;
+ lookfor.dest = node;
+ place = VEC_lower_bound (constraint_edge_t, graph->preds[c->dest],
+ &lookfor, constraint_edge_less);
+ VEC_ordered_remove (constraint_edge_t, graph->preds[c->dest], place);
+ }
+ /* Walk the preds, erase the associated succs. */
+ for (i =0; VEC_iterate (constraint_edge_t, predvec, i, c); i++)
+ if (c->dest != node)
+ {
+ unsigned int place;
+ struct constraint_edge lookfor;
+ lookfor.src = c->dest;
+ lookfor.dest = node;
+ place = VEC_lower_bound (constraint_edge_t, graph->succs[c->dest],
+ &lookfor, constraint_edge_less);
+ VEC_ordered_remove (constraint_edge_t, graph->succs[c->dest], place);
+ }
+
+ graph->preds[node] = NULL;
+ graph->succs[node] = NULL;
+}
+
+static bool edge_added = false;
+
+/* Add edge NEWE to the graph. */
+
+static bool
+add_graph_edge (constraint_graph_t graph, struct constraint_edge newe)
+{
+ unsigned int place;
+ unsigned int src = newe.src;
+ unsigned int dest = newe.dest;
+ VEC(constraint_edge_t,gc) *vec;
+
+ vec = graph->preds[src];
+ place = VEC_lower_bound (constraint_edge_t, vec, &newe,
+ constraint_edge_less);
+ if (place == VEC_length (constraint_edge_t, vec)
+ || VEC_index (constraint_edge_t, vec, place)->dest != dest)
+ {
+ constraint_edge_t edge = new_constraint_edge (src, dest);
+ bitmap weightbitmap;
+
+ weightbitmap = BITMAP_ALLOC (&ptabitmap_obstack);
+ edge->weights = weightbitmap;
+ VEC_safe_insert (constraint_edge_t, gc, graph->preds[edge->src],
+ place, edge);
+ edge = new_constraint_edge (dest, src);
+ edge->weights = weightbitmap;
+ place = VEC_lower_bound (constraint_edge_t, graph->succs[edge->src],
+ edge, constraint_edge_less);
+ VEC_safe_insert (constraint_edge_t, gc, graph->succs[edge->src],
+ place, edge);
+ edge_added = true;
+ return true;
+ }
+ else
+ return false;
+}
+
+
+/* Return the bitmap representing the weights of edge LOOKFOR */
+
+static bitmap
+get_graph_weights (constraint_graph_t graph, struct constraint_edge lookfor)
+{
+ constraint_edge_t edge;
+ unsigned int src = lookfor.src;
+ VEC(constraint_edge_t,gc) *vec;
+ vec = graph->preds[src];
+ edge = constraint_edge_vec_find (vec, lookfor);
+ gcc_assert (edge != NULL);
+ return edge->weights;
+}
+
+
+/* Merge GRAPH nodes FROM and TO into node TO. */
+
+static void
+merge_graph_nodes (constraint_graph_t graph, unsigned int to,
+ unsigned int from)
+{
+ VEC(constraint_edge_t,gc) *succvec = graph->succs[from];
+ VEC(constraint_edge_t,gc) *predvec = graph->preds[from];
+ int i;
+ constraint_edge_t c;
+
+ /* Merge all the predecessor edges. */
+
+ for (i = 0; VEC_iterate (constraint_edge_t, predvec, i, c); i++)
+ {
+ unsigned int d = c->dest;
+ struct constraint_edge olde;
+ struct constraint_edge newe;
+ bitmap temp;
+ bitmap weights;
+ if (c->dest == from)
+ d = to;
+ newe.src = to;
+ newe.dest = d;
+ add_graph_edge (graph, newe);
+ olde.src = from;
+ olde.dest = c->dest;
+ temp = get_graph_weights (graph, olde);
+ weights = get_graph_weights (graph, newe);
+ bitmap_ior_into (weights, temp);
+ }
+
+ /* Merge all the successor edges. */
+ for (i = 0; VEC_iterate (constraint_edge_t, succvec, i, c); i++)
+ {
+ unsigned int d = c->dest;
+ struct constraint_edge olde;
+ struct constraint_edge newe;
+ bitmap temp;
+ bitmap weights;
+ if (c->dest == from)
+ d = to;
+ newe.src = d;
+ newe.dest = to;
+ add_graph_edge (graph, newe);
+ olde.src = c->dest;
+ olde.dest = from;
+ temp = get_graph_weights (graph, olde);
+ weights = get_graph_weights (graph, newe);
+ bitmap_ior_into (weights, temp);
+ }
+ clear_edges_for_node (graph, from);
+}
+
+/* Add a graph edge to GRAPH, going from TO to FROM, with WEIGHT, if
+ it doesn't exist in the graph already.
+ Return false if the edge already existed, true otherwise. */
+
+static bool
+int_add_graph_edge (constraint_graph_t graph, unsigned int to,
+ unsigned int from, unsigned HOST_WIDE_INT weight)
+{
+ if (to == from && weight == 0)
+ {
+ return false;
+ }
+ else
+ {
+ bool r;
+ struct constraint_edge edge;
+ edge.src = to;
+ edge.dest = from;
+ r = add_graph_edge (graph, edge);
+ r |= !bitmap_bit_p (get_graph_weights (graph, edge), weight);
+ bitmap_set_bit (get_graph_weights (graph, edge), weight);
+ return r;
+ }
+}
+
+
+/* Return true if LOOKFOR is an existing graph edge. */
+
+static bool
+valid_graph_edge (constraint_graph_t graph, struct constraint_edge lookfor)
+{
+ return constraint_edge_vec_find (graph->preds[lookfor.src], lookfor) != NULL;
+}
+
+
+/* Build the constraint graph. */
+
+static void
+build_constraint_graph (void)
+{
+ int i = 0;
+ constraint_t c;
+
+ graph = ggc_alloc (sizeof (struct constraint_graph));
+ graph->succs = ggc_alloc_cleared (VEC_length (varinfo_t, varmap) * sizeof (*graph->succs));
+ graph->preds = ggc_alloc_cleared (VEC_length (varinfo_t, varmap) * sizeof (*graph->preds));
+ for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++)
+ {
+ struct constraint_expr lhs = c->lhs;
+ struct constraint_expr rhs = c->rhs;
+ if (lhs.type == DEREF)
+ {
+ /* *x = y or *x = &y (complex) */
+ if (rhs.type == ADDRESSOF || rhs.var > anything_id)
+ insert_into_complex (lhs.var, c);
+ }
+ else if (rhs.type == DEREF)
+ {
+ /* !ANYTHING = *y */
+ if (lhs.var > anything_id)
+ insert_into_complex (rhs.var, c);
+ }
+ else if (rhs.type == ADDRESSOF)
+ {
+ /* x = &y */
+ bitmap_set_bit (get_varinfo (lhs.var)->solution, rhs.var);
+ }
+ else if (rhs.var > anything_id && lhs.var > anything_id)
+ {
+ /* Ignore 0 weighted self edges, as they can't possibly contribute
+ anything */
+ if (lhs.var != rhs.var || rhs.offset != 0 || lhs.offset != 0)
+ {
+
+ struct constraint_edge edge;
+ edge.src = lhs.var;
+ edge.dest = rhs.var;
+ /* x = y (simple) */
+ add_graph_edge (graph, edge);
+ bitmap_set_bit (get_graph_weights (graph, edge),
+ rhs.offset);
+ }
+
+ }
+ }
+}
+/* Changed variables on the last iteration. */
+static unsigned int changed_count;
+static sbitmap changed;
+
+DEF_VEC_I(uint);
+DEF_VEC_ALLOC_I(uint,heap);
+
+
+/* Strongly Connected Component visitation info. */
+
+struct scc_info
+{
+ sbitmap visited;
+ sbitmap in_component;
+ int current_index;
+ unsigned int *visited_index;
+ VEC(uint,heap) *scc_stack;
+ VEC(uint,heap) *unification_queue;
+};
+
+
+/* Recursive routine to find strongly connected components in GRAPH.
+ SI is the SCC info to store the information in, and N is the id of current
+ graph node we are processing.
+
+ This is Tarjan's strongly connected component finding algorithm, as
+ modified by Nuutila to keep only non-root nodes on the stack.
+ The algorithm can be found in "On finding the strongly connected
+ connected components in a directed graph" by Esko Nuutila and Eljas
+ Soisalon-Soininen, in Information Processing Letters volume 49,
+ number 1, pages 9-14. */
+
+static void
+scc_visit (constraint_graph_t graph, struct scc_info *si, unsigned int n)
+{
+ constraint_edge_t c;
+ int i;
+
+ gcc_assert (get_varinfo (n)->node == n);
+ SET_BIT (si->visited, n);
+ RESET_BIT (si->in_component, n);
+ si->visited_index[n] = si->current_index ++;
+
+ /* Visit all the successors. */
+ for (i = 0; VEC_iterate (constraint_edge_t, graph->succs[n], i, c); i++)
+ {
+ /* We only want to find and collapse the zero weight edges. */
+ if (bitmap_bit_p (c->weights, 0))
+ {
+ unsigned int w = c->dest;
+ if (!TEST_BIT (si->visited, w))
+ scc_visit (graph, si, w);
+ if (!TEST_BIT (si->in_component, w))
+ {
+ unsigned int t = get_varinfo (w)->node;
+ unsigned int nnode = get_varinfo (n)->node;
+ if (si->visited_index[t] < si->visited_index[nnode])
+ get_varinfo (n)->node = t;
+ }
+ }
+ }
+
+ /* See if any components have been identified. */
+ if (get_varinfo (n)->node == n)
+ {
+ unsigned int t = si->visited_index[n];
+ SET_BIT (si->in_component, n);
+ while (VEC_length (uint, si->scc_stack) != 0
+ && t < si->visited_index[VEC_last (uint, si->scc_stack)])
+ {
+ unsigned int w = VEC_pop (uint, si->scc_stack);
+ get_varinfo (w)->node = n;
+ SET_BIT (si->in_component, w);
+ /* Mark this node for collapsing. */
+ VEC_safe_push (uint, heap, si->unification_queue, w);
+ }
+ }
+ else
+ VEC_safe_push (uint, heap, si->scc_stack, n);
+}
+
+
+/* Collapse two variables into one variable. */
+
+static void
+collapse_nodes (constraint_graph_t graph, unsigned int to, unsigned int from)
+{
+ bitmap tosol, fromsol;
+ struct constraint_edge edge;
+
+
+ condense_varmap_nodes (to, from);
+ tosol = get_varinfo (to)->solution;
+ fromsol = get_varinfo (from)->solution;
+ bitmap_ior_into (tosol, fromsol);
+ merge_graph_nodes (graph, to, from);
+ edge.src = to;
+ edge.dest = to;
+ if (valid_graph_edge (graph, edge))
+ {
+ bitmap weights = get_graph_weights (graph, edge);
+ bitmap_clear_bit (weights, 0);
+ if (bitmap_empty_p (weights))
+ erase_graph_self_edge (graph, edge);
+ }
+ bitmap_clear (fromsol);
+ get_varinfo (to)->address_taken |= get_varinfo (from)->address_taken;
+ get_varinfo (to)->indirect_target |= get_varinfo (from)->indirect_target;
+}
+
+
+/* Unify nodes in GRAPH that we have found to be part of a cycle.
+ SI is the Strongly Connected Components information structure that tells us
+ what components to unify.
+ UPDATE_CHANGED should be set to true if the changed sbitmap and changed
+ count should be updated to reflect the unification. */
+
+static void
+process_unification_queue (constraint_graph_t graph, struct scc_info *si,
+ bool update_changed)
+{
+ size_t i = 0;
+ bitmap tmp = BITMAP_ALLOC (update_changed ? &iteration_obstack : NULL);
+ bitmap_clear (tmp);
+
+ /* We proceed as follows:
+
+ For each component in the queue (components are delineated by
+ when current_queue_element->node != next_queue_element->node):
+
+ rep = representative node for component
+
+ For each node (tounify) to be unified in the component,
+ merge the solution for tounify into tmp bitmap
+
+ clear solution for tounify
+
+ merge edges from tounify into rep
+
+ merge complex constraints from tounify into rep
+
+ update changed count to note that tounify will never change
+ again
+
+ Merge tmp into solution for rep, marking rep changed if this
+ changed rep's solution.
+
+ Delete any 0 weighted self-edges we now have for rep. */
+ while (i != VEC_length (uint, si->unification_queue))
+ {
+ unsigned int tounify = VEC_index (uint, si->unification_queue, i);
+ unsigned int n = get_varinfo (tounify)->node;
+
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, "Unifying %s to %s\n",
+ get_varinfo (tounify)->name,
+ get_varinfo (n)->name);
+ if (update_changed)
+ stats.unified_vars_dynamic++;
+ else
+ stats.unified_vars_static++;
+ bitmap_ior_into (tmp, get_varinfo (tounify)->solution);
+ merge_graph_nodes (graph, n, tounify);
+ condense_varmap_nodes (n, tounify);
+
+ if (update_changed && TEST_BIT (changed, tounify))
+ {
+ RESET_BIT (changed, tounify);
+ if (!TEST_BIT (changed, n))
+ SET_BIT (changed, n);
+ else
+ {
+ gcc_assert (changed_count > 0);
+ changed_count--;
+ }
+ }
+
+ bitmap_clear (get_varinfo (tounify)->solution);
+ ++i;
+
+ /* If we've either finished processing the entire queue, or
+ finished processing all nodes for component n, update the solution for
+ n. */
+ if (i == VEC_length (uint, si->unification_queue)
+ || get_varinfo (VEC_index (uint, si->unification_queue, i))->node != n)
+ {
+ struct constraint_edge edge;
+
+ /* If the solution changes because of the merging, we need to mark
+ the variable as changed. */
+ if (bitmap_ior_into (get_varinfo (n)->solution, tmp))
+ {
+ if (update_changed && !TEST_BIT (changed, n))
+ {
+ SET_BIT (changed, n);
+ changed_count++;
+ }
+ }
+ bitmap_clear (tmp);
+ edge.src = n;
+ edge.dest = n;
+ if (valid_graph_edge (graph, edge))
+ {
+ bitmap weights = get_graph_weights (graph, edge);
+ bitmap_clear_bit (weights, 0);
+ if (bitmap_empty_p (weights))
+ erase_graph_self_edge (graph, edge);
+ }
+ }
+ }
+ BITMAP_FREE (tmp);
+}
+
+
+/* Information needed to compute the topological ordering of a graph. */
+
+struct topo_info
+{
+ /* sbitmap of visited nodes. */
+ sbitmap visited;
+ /* Array that stores the topological order of the graph, *in
+ reverse*. */
+ VEC(uint,heap) *topo_order;
+};
+
+
+/* Initialize and return a topological info structure. */
+
+static struct topo_info *
+init_topo_info (void)
+{
+ size_t size = VEC_length (varinfo_t, varmap);
+ struct topo_info *ti = xmalloc (sizeof (struct topo_info));
+ ti->visited = sbitmap_alloc (size);
+ sbitmap_zero (ti->visited);
+ ti->topo_order = VEC_alloc (uint, heap, 1);
+ return ti;
+}
+
+
+/* Free the topological sort info pointed to by TI. */
+
+static void
+free_topo_info (struct topo_info *ti)
+{
+ sbitmap_free (ti->visited);
+ VEC_free (uint, heap, ti->topo_order);
+ free (ti);
+}
+
+/* Visit the graph in topological order, and store the order in the
+ topo_info structure. */
+
+static void
+topo_visit (constraint_graph_t graph, struct topo_info *ti,
+ unsigned int n)
+{
+ VEC(constraint_edge_t,gc) *succs = graph->succs[n];
+ constraint_edge_t c;
+ int i;
+ SET_BIT (ti->visited, n);
+ for (i = 0; VEC_iterate (constraint_edge_t, succs, i, c); i++)
+ {
+ if (!TEST_BIT (ti->visited, c->dest))
+ topo_visit (graph, ti, c->dest);
+ }
+ VEC_safe_push (uint, heap, ti->topo_order, n);
+}
+
+/* Return true if variable N + OFFSET is a legal field of N. */
+
+static bool
+type_safe (unsigned int n, unsigned HOST_WIDE_INT *offset)
+{
+ varinfo_t ninfo = get_varinfo (n);
+
+ /* For things we've globbed to single variables, any offset into the
+ variable acts like the entire variable, so that it becomes offset
+ 0. */
+ if (n == anything_id
+ || ninfo->is_artificial_var
+ || ninfo->is_unknown_size_var)
+ {
+ *offset = 0;
+ return true;
+ }
+ return n > anything_id
+ && (get_varinfo (n)->offset + *offset) < get_varinfo (n)->fullsize;
+}
+
+/* Process a constraint C that represents *x = &y. */
+
+static void
+do_da_constraint (constraint_graph_t graph ATTRIBUTE_UNUSED,
+ constraint_t c, bitmap delta)
+{
+ unsigned int rhs = c->rhs.var;
+ unsigned HOST_WIDE_INT offset = c->lhs.offset;
+ unsigned int j;
+ bitmap_iterator bi;
+
+ /* For each member j of Delta (Sol(x)), add x to Sol(j) */
+ EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi)
+ {
+ if (type_safe (j, &offset))
+ {
+ /* *x != NULL && *x != ANYTHING*/
+ varinfo_t v;
+ unsigned int t;
+ bitmap sol;
+ unsigned HOST_WIDE_INT fieldoffset = get_varinfo (j)->offset + offset;
+ v = first_vi_for_offset (get_varinfo (j), fieldoffset);
+ t = v->node;
+ sol = get_varinfo (t)->solution;
+ if (!bitmap_bit_p (sol, rhs))
+ {
+ bitmap_set_bit (sol, rhs);
+ if (!TEST_BIT (changed, t))
+ {
+ SET_BIT (changed, t);
+ changed_count++;
+ }
+ }
+ }
+ else if (dump_file)
+ fprintf (dump_file, "Untypesafe usage in do_da_constraint.\n");
+
+ }
+}
+
+/* Process a constraint C that represents x = *y, using DELTA as the
+ starting solution. */
+
+static void
+do_sd_constraint (constraint_graph_t graph, constraint_t c,
+ bitmap delta)
+{
+ unsigned int lhs = get_varinfo (c->lhs.var)->node;
+ unsigned HOST_WIDE_INT roffset = c->rhs.offset;
+ bool flag = false;
+ bitmap sol = get_varinfo (lhs)->solution;
+ unsigned int j;
+ bitmap_iterator bi;
+
+ /* For each variable j in delta (Sol(y)), add
+ an edge in the graph from j to x, and union Sol(j) into Sol(x). */
+ EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi)
+ {
+ if (type_safe (j, &roffset))
+ {
+ varinfo_t v;
+ unsigned HOST_WIDE_INT fieldoffset = get_varinfo (j)->offset + roffset;
+ unsigned int t;
+
+ v = first_vi_for_offset (get_varinfo (j), fieldoffset);
+ t = v->node;
+ if (int_add_graph_edge (graph, lhs, t, 0))
+ flag |= bitmap_ior_into (sol, get_varinfo (t)->solution);
+ }
+ else if (dump_file)
+ fprintf (dump_file, "Untypesafe usage in do_sd_constraint\n");
+
+ }
+
+ /* If the LHS solution changed, mark the var as changed. */
+ if (flag)
+ {
+ get_varinfo (lhs)->solution = sol;
+ if (!TEST_BIT (changed, lhs))
+ {
+ SET_BIT (changed, lhs);
+ changed_count++;
+ }
+ }
+}
+
+/* Process a constraint C that represents *x = y. */
+
+static void
+do_ds_constraint (constraint_graph_t graph, constraint_t c, bitmap delta)
+{
+ unsigned int rhs = get_varinfo (c->rhs.var)->node;
+ unsigned HOST_WIDE_INT loff = c->lhs.offset;
+ unsigned HOST_WIDE_INT roff = c->rhs.offset;
+ bitmap sol = get_varinfo (rhs)->solution;
+ unsigned int j;
+ bitmap_iterator bi;
+
+ /* For each member j of delta (Sol(x)), add an edge from y to j and
+ union Sol(y) into Sol(j) */
+ EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi)
+ {
+ if (type_safe (j, &loff))
+ {
+ varinfo_t v;
+ unsigned int t;
+ unsigned HOST_WIDE_INT fieldoffset = get_varinfo (j)->offset + loff;
+
+ v = first_vi_for_offset (get_varinfo (j), fieldoffset);
+ t = v->node;
+ if (int_add_graph_edge (graph, t, rhs, roff))
+ {
+ bitmap tmp = get_varinfo (t)->solution;
+ if (set_union_with_increment (tmp, sol, roff))
+ {
+ get_varinfo (t)->solution = tmp;
+ if (t == rhs)
+ {
+ sol = get_varinfo (rhs)->solution;
+ }
+ if (!TEST_BIT (changed, t))
+ {
+ SET_BIT (changed, t);
+ changed_count++;
+ }
+ }
+ }
+ }
+ else if (dump_file)
+ fprintf (dump_file, "Untypesafe usage in do_ds_constraint\n");
+ }
+}
+
+/* Handle a non-simple (simple meaning requires no iteration), non-copy
+ constraint (IE *x = &y, x = *y, and *x = y). */
+
+static void
+do_complex_constraint (constraint_graph_t graph, constraint_t c, bitmap delta)
+{
+ if (c->lhs.type == DEREF)
+ {
+ if (c->rhs.type == ADDRESSOF)
+ {
+ /* *x = &y */
+ do_da_constraint (graph, c, delta);
+ }
+ else
+ {
+ /* *x = y */
+ do_ds_constraint (graph, c, delta);
+ }
+ }
+ else
+ {
+ /* x = *y */
+ do_sd_constraint (graph, c, delta);
+ }
+}
+
+/* Initialize and return a new SCC info structure. */
+
+static struct scc_info *
+init_scc_info (void)
+{
+ struct scc_info *si = xmalloc (sizeof (struct scc_info));
+ size_t size = VEC_length (varinfo_t, varmap);
+
+ si->current_index = 0;
+ si->visited = sbitmap_alloc (size);
+ sbitmap_zero (si->visited);
+ si->in_component = sbitmap_alloc (size);
+ sbitmap_ones (si->in_component);
+ si->visited_index = xcalloc (sizeof (unsigned int), size + 1);
+ si->scc_stack = VEC_alloc (uint, heap, 1);
+ si->unification_queue = VEC_alloc (uint, heap, 1);
+ return si;
+}
+
+/* Free an SCC info structure pointed to by SI */
+
+static void
+free_scc_info (struct scc_info *si)
+{
+ sbitmap_free (si->visited);
+ sbitmap_free (si->in_component);
+ free (si->visited_index);
+ VEC_free (uint, heap, si->scc_stack);
+ VEC_free (uint, heap, si->unification_queue);
+ free(si);
+}
+
+
+/* Find cycles in GRAPH that occur, using strongly connected components, and
+ collapse the cycles into a single representative node. if UPDATE_CHANGED
+ is true, then update the changed sbitmap to note those nodes whose
+ solutions have changed as a result of collapsing. */
+
+static void
+find_and_collapse_graph_cycles (constraint_graph_t graph, bool update_changed)
+{
+ unsigned int i;
+ unsigned int size = VEC_length (varinfo_t, varmap);
+ struct scc_info *si = init_scc_info ();
+
+ for (i = 0; i != size; ++i)
+ if (!TEST_BIT (si->visited, i) && get_varinfo (i)->node == i)
+ scc_visit (graph, si, i);
+ process_unification_queue (graph, si, update_changed);
+ free_scc_info (si);
+}
+
+/* Compute a topological ordering for GRAPH, and store the result in the
+ topo_info structure TI. */
+
+static void
+compute_topo_order (constraint_graph_t graph,
+ struct topo_info *ti)
+{
+ unsigned int i;
+ unsigned int size = VEC_length (varinfo_t, varmap);
+
+ for (i = 0; i != size; ++i)
+ if (!TEST_BIT (ti->visited, i) && get_varinfo (i)->node == i)
+ topo_visit (graph, ti, i);
+}
+
+/* Return true if bitmap B is empty, or a bitmap other than bit 0 is set. */
+
+static bool
+bitmap_other_than_zero_bit_set (bitmap b)
+{
+ unsigned int i;
+ bitmap_iterator bi;
+
+ if (bitmap_empty_p (b))
+ return false;
+ EXECUTE_IF_SET_IN_BITMAP (b, 1, i, bi)
+ return true;
+ return false;
+}
+
+/* Perform offline variable substitution.
+
+ This is a linear time way of identifying variables that must have
+ equivalent points-to sets, including those caused by static cycles,
+ and single entry subgraphs, in the constraint graph.
+
+ The technique is described in "Off-line variable substitution for
+ scaling points-to analysis" by Atanas Rountev and Satish Chandra,
+ in "ACM SIGPLAN Notices" volume 35, number 5, pages 47-56. */
+
+static void
+perform_var_substitution (constraint_graph_t graph)
+{
+ struct topo_info *ti = init_topo_info ();
+
+ /* Compute the topological ordering of the graph, then visit each
+ node in topological order. */
+ compute_topo_order (graph, ti);
+
+ while (VEC_length (uint, ti->topo_order) != 0)
+ {
+ unsigned int i = VEC_pop (uint, ti->topo_order);
+ unsigned int pred;
+ varinfo_t vi = get_varinfo (i);
+ bool okay_to_elim = false;
+ unsigned int root = VEC_length (varinfo_t, varmap);
+ VEC(constraint_edge_t,gc) *predvec = graph->preds[i];
+ constraint_edge_t ce;
+ bitmap tmp;
+
+ /* We can't eliminate things whose address is taken, or which is
+ the target of a dereference. */
+ if (vi->address_taken || vi->indirect_target)
+ continue;
+
+ /* See if all predecessors of I are ripe for elimination */
+ for (pred = 0; VEC_iterate (constraint_edge_t, predvec, pred, ce); pred++)
+ {
+ bitmap weight;
+ unsigned int w;
+ weight = get_graph_weights (graph, *ce);
+
+ /* We can't eliminate variables that have non-zero weighted
+ edges between them. */
+ if (bitmap_other_than_zero_bit_set (weight))
+ {
+ okay_to_elim = false;
+ break;
+ }
+ w = get_varinfo (ce->dest)->node;
+
+ /* We can't eliminate the node if one of the predecessors is
+ part of a different strongly connected component. */
+ if (!okay_to_elim)
+ {
+ root = w;
+ okay_to_elim = true;
+ }
+ else if (w != root)
+ {
+ okay_to_elim = false;
+ break;
+ }
+
+ /* Theorem 4 in Rountev and Chandra: If i is a direct node,
+ then Solution(i) is a subset of Solution (w), where w is a
+ predecessor in the graph.
+ Corollary: If all predecessors of i have the same
+ points-to set, then i has that same points-to set as
+ those predecessors. */
+ tmp = BITMAP_ALLOC (NULL);
+ bitmap_and_compl (tmp, get_varinfo (i)->solution,
+ get_varinfo (w)->solution);
+ if (!bitmap_empty_p (tmp))
+ {
+ okay_to_elim = false;
+ BITMAP_FREE (tmp);
+ break;
+ }
+ BITMAP_FREE (tmp);
+ }
+
+ /* See if the root is different than the original node.
+ If so, we've found an equivalence. */
+ if (root != get_varinfo (i)->node && okay_to_elim)
+ {
+ /* Found an equivalence */
+ get_varinfo (i)->node = root;
+ collapse_nodes (graph, root, i);
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, "Collapsing %s into %s\n",
+ get_varinfo (i)->name,
+ get_varinfo (root)->name);
+ stats.collapsed_vars++;
+ }
+ }
+
+ free_topo_info (ti);
+}
+
+
+/* Solve the constraint graph GRAPH using our worklist solver.
+ This is based on the PW* family of solvers from the "Efficient Field
+ Sensitive Pointer Analysis for C" paper.
+ It works by iterating over all the graph nodes, processing the complex
+ constraints and propagating the copy constraints, until everything stops
+ changed. This corresponds to steps 6-8 in the solving list given above. */
+
+static void
+solve_graph (constraint_graph_t graph)
+{
+ unsigned int size = VEC_length (varinfo_t, varmap);
+ unsigned int i;
+
+ changed_count = size;
+ changed = sbitmap_alloc (size);
+ sbitmap_ones (changed);
+
+ /* The already collapsed/unreachable nodes will never change, so we
+ need to account for them in changed_count. */
+ for (i = 0; i < size; i++)
+ if (get_varinfo (i)->node != i)
+ changed_count--;
+
+ while (changed_count > 0)
+ {
+ unsigned int i;
+ struct topo_info *ti = init_topo_info ();
+ stats.iterations++;
+
+ bitmap_obstack_initialize (&iteration_obstack);
+
+ if (edge_added)
+ {
+ /* We already did cycle elimination once, when we did
+ variable substitution, so we don't need it again for the
+ first iteration. */
+ if (stats.iterations > 1)
+ find_and_collapse_graph_cycles (graph, true);
+
+ edge_added = false;
+ }
+
+ compute_topo_order (graph, ti);
+
+ while (VEC_length (uint, ti->topo_order) != 0)
+ {
+ i = VEC_pop (uint, ti->topo_order);
+ gcc_assert (get_varinfo (i)->node == i);
+
+ /* If the node has changed, we need to process the
+ complex constraints and outgoing edges again. */
+ if (TEST_BIT (changed, i))
+ {
+ unsigned int j;
+ constraint_t c;
+ constraint_edge_t e;
+ bitmap solution;
+ VEC(constraint_t,gc) *complex = get_varinfo (i)->complex;
+ VEC(constraint_edge_t,gc) *succs;
+
+ RESET_BIT (changed, i);
+ changed_count--;
+
+ /* Process the complex constraints */
+ solution = get_varinfo (i)->solution;
+ for (j = 0; VEC_iterate (constraint_t, complex, j, c); j++)
+ do_complex_constraint (graph, c, solution);
+
+ /* Propagate solution to all successors. */
+ succs = graph->succs[i];
+ for (j = 0; VEC_iterate (constraint_edge_t, succs, j, e); j++)
+ {
+ bitmap tmp = get_varinfo (e->dest)->solution;
+ bool flag = false;
+ unsigned int k;
+ bitmap weights = e->weights;
+ bitmap_iterator bi;
+
+ gcc_assert (!bitmap_empty_p (weights));
+ EXECUTE_IF_SET_IN_BITMAP (weights, 0, k, bi)
+ flag |= set_union_with_increment (tmp, solution, k);
+
+ if (flag)
+ {
+ get_varinfo (e->dest)->solution = tmp;
+ if (!TEST_BIT (changed, e->dest))
+ {
+ SET_BIT (changed, e->dest);
+ changed_count++;
+ }
+ }
+ }
+ }
+ }
+ free_topo_info (ti);
+ bitmap_obstack_release (&iteration_obstack);
+ }
+
+ sbitmap_free (changed);
+}
+
+
+/* CONSTRAINT AND VARIABLE GENERATION FUNCTIONS */
+
+/* Map from trees to variable ids. */
+static htab_t id_for_tree;
+
+typedef struct tree_id
+{
+ tree t;
+ unsigned int id;
+} *tree_id_t;
+
+/* Hash a tree id structure. */
+
+static hashval_t
+tree_id_hash (const void *p)
+{
+ const tree_id_t ta = (tree_id_t) p;
+ return htab_hash_pointer (ta->t);
+}
+
+/* Return true if the tree in P1 and the tree in P2 are the same. */
+
+static int
+tree_id_eq (const void *p1, const void *p2)
+{
+ const tree_id_t ta1 = (tree_id_t) p1;
+ const tree_id_t ta2 = (tree_id_t) p2;
+ return ta1->t == ta2->t;
+}
+
+/* Insert ID as the variable id for tree T in the hashtable. */
+
+static void
+insert_id_for_tree (tree t, int id)
+{
+ void **slot;
+ struct tree_id finder;
+ tree_id_t new_pair;
+
+ finder.t = t;
+ slot = htab_find_slot (id_for_tree, &finder, INSERT);
+ gcc_assert (*slot == NULL);
+ new_pair = xmalloc (sizeof (struct tree_id));
+ new_pair->t = t;
+ new_pair->id = id;
+ *slot = (void *)new_pair;
+}
+
+/* Find the variable id for tree T in ID_FOR_TREE. If T does not
+ exist in the hash table, return false, otherwise, return true and
+ set *ID to the id we found. */
+
+static bool
+lookup_id_for_tree (tree t, unsigned int *id)
+{
+ tree_id_t pair;
+ struct tree_id finder;
+
+ finder.t = t;
+ pair = htab_find (id_for_tree, &finder);
+ if (pair == NULL)
+ return false;
+ *id = pair->id;
+ return true;
+}
+
+/* Return a printable name for DECL */
+
+static const char *
+alias_get_name (tree decl)
+{
+ const char *res = get_name (decl);
+ char *temp;
+ int num_printed = 0;
+
+ if (res != NULL)
+ return res;
+
+ res = "NULL";
+ if (TREE_CODE (decl) == SSA_NAME)
+ {
+ num_printed = asprintf (&temp, "%s_%u",
+ alias_get_name (SSA_NAME_VAR (decl)),
+ SSA_NAME_VERSION (decl));
+ }
+ else if (DECL_P (decl))
+ {
+ num_printed = asprintf (&temp, "D.%u", DECL_UID (decl));
+ }
+ if (num_printed > 0)
+ {
+ res = ggc_strdup (temp);
+ free (temp);
+ }
+ return res;
+}
+
+/* Find the variable id for tree T in the hashtable.
+ If T doesn't exist in the hash table, create an entry for it. */
+
+static unsigned int
+get_id_for_tree (tree t)
+{
+ tree_id_t pair;
+ struct tree_id finder;
+
+ finder.t = t;
+ pair = htab_find (id_for_tree, &finder);
+ if (pair == NULL)
+ return create_variable_info_for (t, alias_get_name (t));
+
+ return pair->id;
+}
+
+/* Get a constraint expression from an SSA_VAR_P node. */
+
+static struct constraint_expr
+get_constraint_exp_from_ssa_var (tree t)
+{
+ struct constraint_expr cexpr;
+
+ gcc_assert (SSA_VAR_P (t) || DECL_P (t));
+
+ /* For parameters, get at the points-to set for the actual parm
+ decl. */
+ if (TREE_CODE (t) == SSA_NAME
+ && TREE_CODE (SSA_NAME_VAR (t)) == PARM_DECL
+ && default_def (SSA_NAME_VAR (t)) == t)
+ return get_constraint_exp_from_ssa_var (SSA_NAME_VAR (t));
+
+ cexpr.type = SCALAR;
+
+ if (TREE_READONLY (t))
+ {
+ cexpr.type = ADDRESSOF;
+ cexpr.var = readonly_id;
+ }
+ else
+ cexpr.var = get_id_for_tree (t);
+
+ cexpr.offset = 0;
+ return cexpr;
+}
+
+/* Process a completed constraint T, and add it to the constraint
+ list. */
+
+static void
+process_constraint (constraint_t t)
+{
+ struct constraint_expr rhs = t->rhs;
+ struct constraint_expr lhs = t->lhs;
+
+ gcc_assert (rhs.var < VEC_length (varinfo_t, varmap));
+ gcc_assert (lhs.var < VEC_length (varinfo_t, varmap));
+
+ /* ANYTHING == ANYTHING is pointless. */
+ if (lhs.var == anything_id && rhs.var == anything_id)
+ return;
+
+ /* If we have &ANYTHING = something, convert to SOMETHING = &ANYTHING) */
+ else if (lhs.var == anything_id && lhs.type == ADDRESSOF)
+ {
+ rhs = t->lhs;
+ t->lhs = t->rhs;
+ t->rhs = rhs;
+ process_constraint (t);
+ }
+ /* This can happen in our IR with things like n->a = *p */
+ else if (rhs.type == DEREF && lhs.type == DEREF && rhs.var != anything_id)
+ {
+ /* Split into tmp = *rhs, *lhs = tmp */
+ tree rhsdecl = get_varinfo (rhs.var)->decl;
+ tree pointertype = TREE_TYPE (rhsdecl);
+ tree pointedtotype = TREE_TYPE (pointertype);
+ tree tmpvar = create_tmp_var_raw (pointedtotype, "doubledereftmp");
+ struct constraint_expr tmplhs = get_constraint_exp_from_ssa_var (tmpvar);
+
+ /* If this is an aggregate of known size, we should have passed
+ this off to do_structure_copy, and it should have broken it
+ up. */
+ gcc_assert (!AGGREGATE_TYPE_P (pointedtotype)
+ || get_varinfo (rhs.var)->is_unknown_size_var);
+
+ process_constraint (new_constraint (tmplhs, rhs));
+ process_constraint (new_constraint (lhs, tmplhs));
+ }
+ else if (rhs.type == ADDRESSOF)
+ {
+ varinfo_t vi;
+ gcc_assert (rhs.offset == 0);
+
+ for (vi = get_varinfo (rhs.var); vi != NULL; vi = vi->next)
+ vi->address_taken = true;
+
+ VEC_safe_push (constraint_t, gc, constraints, t);
+ }
+ else
+ {
+ if (lhs.type != DEREF && rhs.type == DEREF)
+ get_varinfo (lhs.var)->indirect_target = true;
+ VEC_safe_push (constraint_t, gc, constraints, t);
+ }
+}
+
+
+/* Return the position, in bits, of FIELD_DECL from the beginning of its
+ structure. */
+
+static unsigned HOST_WIDE_INT
+bitpos_of_field (const tree fdecl)
+{
+
+ if (TREE_CODE (DECL_FIELD_OFFSET (fdecl)) != INTEGER_CST
+ || TREE_CODE (DECL_FIELD_BIT_OFFSET (fdecl)) != INTEGER_CST)
+ return -1;
+
+ return (tree_low_cst (DECL_FIELD_OFFSET (fdecl), 1) * 8)
+ + tree_low_cst (DECL_FIELD_BIT_OFFSET (fdecl), 1);
+}
+
+
+/* Given a COMPONENT_REF T, return the constraint_expr for it. */
+
+static struct constraint_expr
+get_constraint_for_component_ref (tree t)
+{
+ struct constraint_expr result;
+ HOST_WIDE_INT bitsize;
+ HOST_WIDE_INT bitpos;
+ tree offset;
+ enum machine_mode mode;
+ int unsignedp;
+ int volatilep;
+ tree forzero;
+
+ result.offset = 0;
+ result.type = SCALAR;
+ result.var = 0;
+
+ /* Some people like to do cute things like take the address of
+ &0->a.b */
+ forzero = t;
+ while (!SSA_VAR_P (forzero) && !CONSTANT_CLASS_P (forzero))
+ forzero = TREE_OPERAND (forzero, 0);
+
+ if (CONSTANT_CLASS_P (forzero) && integer_zerop (forzero))
+ {
+ result.offset = 0;
+ result.var = integer_id;
+ result.type = SCALAR;
+ return result;
+ }
+
+ t = get_inner_reference (t, &bitsize, &bitpos, &offset, &mode,
+ &unsignedp, &volatilep, false);
+ result = get_constraint_for (t);
+
+ /* This can also happen due to weird offsetof type macros. */
+ if (TREE_CODE (t) != ADDR_EXPR && result.type == ADDRESSOF)
+ result.type = SCALAR;
+
+ /* If we know where this goes, then yay. Otherwise, booo. */
+
+ if (offset == NULL && bitsize != -1)
+ {
+ result.offset = bitpos;
+ }
+ else
+ {
+ result.var = anything_id;
+ result.offset = 0;
+ }
+
+ if (result.type == SCALAR)
+ {
+ /* In languages like C, you can access one past the end of an
+ array. You aren't allowed to dereference it, so we can
+ ignore this constraint. When we handle pointer subtraction,
+ we may have to do something cute here. */
+
+ if (result.offset < get_varinfo (result.var)->fullsize)
+ result.var = first_vi_for_offset (get_varinfo (result.var),
+ result.offset)->id;
+ else
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, "Access to past the end of variable, ignoring\n");
+
+ result.offset = 0;
+ }
+
+ return result;
+}
+
+
+/* Dereference the constraint expression CONS, and return the result.
+ DEREF (ADDRESSOF) = SCALAR
+ DEREF (SCALAR) = DEREF
+ DEREF (DEREF) = (temp = DEREF1; result = DEREF(temp))
+ This is needed so that we can handle dereferencing DEREF constraints. */
+
+static struct constraint_expr
+do_deref (struct constraint_expr cons)
+{
+ if (cons.type == SCALAR)
+ {
+ cons.type = DEREF;
+ return cons;
+ }
+ else if (cons.type == ADDRESSOF)
+ {
+ cons.type = SCALAR;
+ return cons;
+ }
+ else if (cons.type == DEREF)
+ {
+ tree tmpvar = create_tmp_var_raw (ptr_type_node, "derefmp");
+ struct constraint_expr tmplhs = get_constraint_exp_from_ssa_var (tmpvar);
+ process_constraint (new_constraint (tmplhs, cons));
+ cons.var = tmplhs.var;
+ return cons;
+ }
+ gcc_unreachable ();
+}
+
+
+/* Given a tree T, return the constraint expression for it. */
+
+static struct constraint_expr
+get_constraint_for (tree t)
+{
+ struct constraint_expr temp;
+
+ /* x = integer is all glommed to a single variable, which doesn't
+ point to anything by itself. That is, of course, unless it is an
+ integer constant being treated as a pointer, in which case, we
+ will return that this is really the addressof anything. This
+ happens below, since it will fall into the default case. The only
+ case we know something about an integer treated like a pointer is
+ when it is the NULL pointer, and then we just say it points to
+ NULL. */
+ if (TREE_CODE (t) == INTEGER_CST
+ && !POINTER_TYPE_P (TREE_TYPE (t)))
+ {
+ temp.var = integer_id;
+ temp.type = SCALAR;
+ temp.offset = 0;
+ return temp;
+ }
+ else if (TREE_CODE (t) == INTEGER_CST
+ && integer_zerop (t))
+ {
+ temp.var = nothing_id;
+ temp.type = ADDRESSOF;
+ temp.offset = 0;
+ return temp;
+ }
+
+ switch (TREE_CODE_CLASS (TREE_CODE (t)))
+ {
+ case tcc_expression:
+ {
+ switch (TREE_CODE (t))
+ {
+ case ADDR_EXPR:
+ {
+ temp = get_constraint_for (TREE_OPERAND (t, 0));
+ if (temp.type == DEREF)
+ temp.type = SCALAR;
+ else
+ temp.type = ADDRESSOF;
+ return temp;
+ }
+ break;
+ case CALL_EXPR:
+
+ /* XXX: In interprocedural mode, if we didn't have the
+ body, we would need to do *each pointer argument =
+ &ANYTHING added. */
+ if (call_expr_flags (t) & (ECF_MALLOC | ECF_MAY_BE_ALLOCA))
+ {
+ tree heapvar = create_tmp_var_raw (ptr_type_node, "HEAP");
+ temp.var = create_variable_info_for (heapvar,
+ alias_get_name (heapvar));
+
+ get_varinfo (temp.var)->is_artificial_var = 1;
+ temp.type = ADDRESSOF;
+ temp.offset = 0;
+ return temp;
+ }
+ /* FALLTHRU */
+ default:
+ {
+ temp.type = ADDRESSOF;
+ temp.var = anything_id;
+ temp.offset = 0;
+ return temp;
+ }
+ }
+ }
+ case tcc_reference:
+ {
+ switch (TREE_CODE (t))
+ {
+ case INDIRECT_REF:
+ {
+ temp = get_constraint_for (TREE_OPERAND (t, 0));
+ temp = do_deref (temp);
+ return temp;
+ }
+ case ARRAY_REF:
+ case COMPONENT_REF:
+ temp = get_constraint_for_component_ref (t);
+ return temp;
+ default:
+ {
+ temp.type = ADDRESSOF;
+ temp.var = anything_id;
+ temp.offset = 0;
+ return temp;
+ }
+ }
+ }
+ case tcc_unary:
+ {
+ switch (TREE_CODE (t))
+ {
+ case NOP_EXPR:
+ case CONVERT_EXPR:
+ case NON_LVALUE_EXPR:
+ {
+ tree op = TREE_OPERAND (t, 0);
+
+ /* Cast from non-pointer to pointers are bad news for us.
+ Anything else, we see through */
+ if (!(POINTER_TYPE_P (TREE_TYPE (t)) &&
+ ! POINTER_TYPE_P (TREE_TYPE (op))))
+ return get_constraint_for (op);
+ }
+ default:
+ {
+ temp.type = ADDRESSOF;
+ temp.var = anything_id;
+ temp.offset = 0;
+ return temp;
+ }
+ }
+ }
+ case tcc_exceptional:
+ {
+ switch (TREE_CODE (t))
+ {
+ case PHI_NODE:
+ return get_constraint_for (PHI_RESULT (t));
+ case SSA_NAME:
+ return get_constraint_exp_from_ssa_var (t);
+ default:
+ {
+ temp.type = ADDRESSOF;
+ temp.var = anything_id;
+ temp.offset = 0;
+ return temp;
+ }
+ }
+ }
+ case tcc_declaration:
+ return get_constraint_exp_from_ssa_var (t);
+ default:
+ {
+ temp.type = ADDRESSOF;
+ temp.var = anything_id;
+ temp.offset = 0;
+ return temp;
+ }
+ }
+}
+
+
+/* Handle the structure copy case where we have a simple structure copy
+ between LHS and RHS that is of SIZE (in bits)
+
+ For each field of the lhs variable (lhsfield)
+ For each field of the rhs variable at lhsfield.offset (rhsfield)
+ add the constraint lhsfield = rhsfield
+*/
+
+static void
+do_simple_structure_copy (const struct constraint_expr lhs,
+ const struct constraint_expr rhs,
+ const unsigned HOST_WIDE_INT size)
+{
+ varinfo_t p = get_varinfo (lhs.var);
+ unsigned HOST_WIDE_INT pstart,last;
+
+ pstart = p->offset;
+ last = p->offset + size;
+ for (; p && p->offset < last; p = p->next)
+ {
+ varinfo_t q;
+ struct constraint_expr templhs = lhs;
+ struct constraint_expr temprhs = rhs;
+ unsigned HOST_WIDE_INT fieldoffset;
+
+ templhs.var = p->id;
+ q = get_varinfo (temprhs.var);
+ fieldoffset = p->offset - pstart;
+ q = first_vi_for_offset (q, q->offset + fieldoffset);
+ temprhs.var = q->id;
+ process_constraint (new_constraint (templhs, temprhs));
+ }
+}
+
+
+/* Handle the structure copy case where we have a structure copy between a
+ aggregate on the LHS and a dereference of a pointer on the RHS
+ that is of SIZE (in bits)
+
+ For each field of the lhs variable (lhsfield)
+ rhs.offset = lhsfield->offset
+ add the constraint lhsfield = rhs
+*/
+
+static void
+do_rhs_deref_structure_copy (const struct constraint_expr lhs,
+ const struct constraint_expr rhs,
+ const unsigned HOST_WIDE_INT size)
+{
+ varinfo_t p = get_varinfo (lhs.var);
+ unsigned HOST_WIDE_INT pstart,last;
+ pstart = p->offset;
+ last = p->offset + size;
+
+ for (; p && p->offset < last; p = p->next)
+ {
+ varinfo_t q;
+ struct constraint_expr templhs = lhs;
+ struct constraint_expr temprhs = rhs;
+ unsigned HOST_WIDE_INT fieldoffset;
+
+
+ if (templhs.type == SCALAR)
+ templhs.var = p->id;
+ else
+ templhs.offset = p->offset;
+
+ q = get_varinfo (temprhs.var);
+ fieldoffset = p->offset - pstart;
+ temprhs.offset += fieldoffset;
+ process_constraint (new_constraint (templhs, temprhs));
+ }
+}
+
+/* Handle the structure copy case where we have a structure copy
+ between a aggregate on the RHS and a dereference of a pointer on
+ the LHS that is of SIZE (in bits)
+
+ For each field of the rhs variable (rhsfield)
+ lhs.offset = rhsfield->offset
+ add the constraint lhs = rhsfield
+*/
+
+static void
+do_lhs_deref_structure_copy (const struct constraint_expr lhs,
+ const struct constraint_expr rhs,
+ const unsigned HOST_WIDE_INT size)
+{
+ varinfo_t p = get_varinfo (rhs.var);
+ unsigned HOST_WIDE_INT pstart,last;
+ pstart = p->offset;
+ last = p->offset + size;
+
+ for (; p && p->offset < last; p = p->next)
+ {
+ varinfo_t q;
+ struct constraint_expr templhs = lhs;
+ struct constraint_expr temprhs = rhs;
+ unsigned HOST_WIDE_INT fieldoffset;
+
+
+ if (temprhs.type == SCALAR)
+ temprhs.var = p->id;
+ else
+ temprhs.offset = p->offset;
+
+ q = get_varinfo (templhs.var);
+ fieldoffset = p->offset - pstart;
+ templhs.offset += fieldoffset;
+ process_constraint (new_constraint (templhs, temprhs));
+ }
+}
+
+
+/* Handle aggregate copies by expanding into copies of the respective
+ fields of the structures. */
+
+static void
+do_structure_copy (tree lhsop, tree rhsop)
+{
+ struct constraint_expr lhs, rhs, tmp;
+ varinfo_t p;
+ unsigned HOST_WIDE_INT lhssize;
+ unsigned HOST_WIDE_INT rhssize;
+
+ lhssize = TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (lhsop)));
+ rhssize = TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (rhsop)));
+ lhs = get_constraint_for (lhsop);
+ rhs = get_constraint_for (rhsop);
+
+ /* If we have special var = x, swap it around. */
+ if (lhs.var <= integer_id && rhs.var > integer_id)
+ {
+ tmp = lhs;
+ lhs = rhs;
+ rhs = tmp;
+ }
+
+ /* If the RHS is a special var, set all the LHS fields to that
+ special var. */
+ if (rhs.var <= integer_id)
+ {
+ for (p = get_varinfo (lhs.var); p; p = p->next)
+ {
+ struct constraint_expr templhs = lhs;
+ struct constraint_expr temprhs = rhs;
+ if (templhs.type == SCALAR )
+ templhs.var = p->id;
+ else
+ templhs.offset += p->offset;
+ process_constraint (new_constraint (templhs, temprhs));
+ }
+ }
+ else
+ {
+ if (rhs.type == SCALAR && lhs.type == SCALAR)
+ do_simple_structure_copy (lhs, rhs, MIN (lhssize, rhssize));
+ else if (lhs.type != DEREF && rhs.type == DEREF)
+ do_rhs_deref_structure_copy (lhs, rhs, MIN (lhssize, rhssize));
+ else if (lhs.type == DEREF && rhs.type != DEREF)
+ do_lhs_deref_structure_copy (lhs, rhs, MIN (lhssize, rhssize));
+ else
+ {
+ tree rhsdecl = get_varinfo (rhs.var)->decl;
+ tree pointertype = TREE_TYPE (rhsdecl);
+ tree pointedtotype = TREE_TYPE (pointertype);
+ tree tmpvar;
+ gcc_assert (rhs.type == DEREF && lhs.type == DEREF);
+ tmpvar = create_tmp_var_raw (pointedtotype, "structcopydereftmp");
+ lhs = get_constraint_for (tmpvar);
+ do_rhs_deref_structure_copy (lhs, rhs, MIN (lhssize, rhssize));
+ rhs = lhs;
+ lhs = get_constraint_for (lhsop);
+ do_lhs_deref_structure_copy (lhs, rhs, MIN (lhssize, rhssize));
+ }
+ }
+}
+
+
+/* Return true if REF, a COMPONENT_REF, has an INDIRECT_REF somewhere
+ in it. */
+
+static inline bool
+ref_contains_indirect_ref (tree ref)
+{
+ while (handled_component_p (ref))
+ {
+ if (TREE_CODE (ref) == INDIRECT_REF)
+ return true;
+ ref = TREE_OPERAND (ref, 0);
+ }
+ return false;
+}
+
+
+/* Tree walker that is the heart of the aliasing infrastructure.
+ TP is a pointer to the current tree.
+ WALK_SUBTREES specifies whether to continue traversing subtrees or
+ not.
+ Returns NULL_TREE when we should stop.
+
+ This function is the main part of the constraint builder. It
+ walks the trees, calling the appropriate building functions
+ to process various statements. */
+
+static void
+find_func_aliases (tree t)
+{
+ struct constraint_expr lhs, rhs;
+ switch (TREE_CODE (t))
+ {
+ case PHI_NODE:
+ {
+ int i;
+
+ /* Only care about pointers and structures containing
+ pointers. */
+ if (POINTER_TYPE_P (TREE_TYPE (PHI_RESULT (t)))
+ || AGGREGATE_TYPE_P (TREE_TYPE (PHI_RESULT (t))))
+ {
+ lhs = get_constraint_for (PHI_RESULT (t));
+ for (i = 0; i < PHI_NUM_ARGS (t); i++)
+ {
+ rhs = get_constraint_for (PHI_ARG_DEF (t, i));
+ process_constraint (new_constraint (lhs, rhs));
+ }
+ }
+ }
+ break;
+
+ case MODIFY_EXPR:
+ {
+ tree lhsop = TREE_OPERAND (t, 0);
+ tree rhsop = TREE_OPERAND (t, 1);
+ int i;
+
+ if (AGGREGATE_TYPE_P (TREE_TYPE (lhsop))
+ && AGGREGATE_TYPE_P (TREE_TYPE (rhsop)))
+ {
+ do_structure_copy (lhsop, rhsop);
+ }
+ else
+ {
+ /* Only care about operations with pointers, structures
+ containing pointers, dereferences, and call
+ expressions. */
+ if (POINTER_TYPE_P (TREE_TYPE (lhsop))
+ || AGGREGATE_TYPE_P (TREE_TYPE (lhsop))
+ || ref_contains_indirect_ref (lhsop)
+ || TREE_CODE (rhsop) == CALL_EXPR)
+ {
+ lhs = get_constraint_for (lhsop);
+ switch (TREE_CODE_CLASS (TREE_CODE (rhsop)))
+ {
+ /* RHS that consist of unary operations,
+ exceptional types, or bare decls/constants, get
+ handled directly by get_constraint_for. */
+ case tcc_reference:
+ case tcc_declaration:
+ case tcc_constant:
+ case tcc_exceptional:
+ case tcc_expression:
+ case tcc_unary:
+ {
+ rhs = get_constraint_for (rhsop);
+ process_constraint (new_constraint (lhs, rhs));
+ }
+ break;
+
+ /* Otherwise, walk each operand. */
+ default:
+ for (i = 0; i < TREE_CODE_LENGTH (TREE_CODE (rhsop)); i++)
+ {
+ tree op = TREE_OPERAND (rhsop, i);
+ rhs = get_constraint_for (op);
+ process_constraint (new_constraint (lhs, rhs));
+ }
+ }
+ }
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+
+/* Find the first varinfo in the same variable as START that overlaps with
+ OFFSET.
+ Effectively, walk the chain of fields for the variable START to find the
+ first field that overlaps with OFFSET.
+ Abort if we can't find one. */
+
+static varinfo_t
+first_vi_for_offset (varinfo_t start, unsigned HOST_WIDE_INT offset)
+{
+ varinfo_t curr = start;
+ while (curr)
+ {
+ /* We may not find a variable in the field list with the actual
+ offset when when we have glommed a structure to a variable.
+ In that case, however, offset should still be within the size
+ of the variable. */
+ if (offset >= curr->offset && offset < (curr->offset + curr->size))
+ return curr;
+ curr = curr->next;
+ }
+
+ gcc_unreachable ();
+}
+
+
+/* Insert the varinfo FIELD into the field list for BASE, ordered by
+ offset. */
+
+static void
+insert_into_field_list (varinfo_t base, varinfo_t field)
+{
+ varinfo_t prev = base;
+ varinfo_t curr = base->next;
+
+ if (curr == NULL)
+ {
+ prev->next = field;
+ field->next = NULL;
+ }
+ else
+ {
+ while (curr)
+ {
+ if (field->offset <= curr->offset)
+ break;
+ prev = curr;
+ curr = curr->next;
+ }
+ field->next = prev->next;
+ prev->next = field;
+ }
+}
+
+/* qsort comparison function for two fieldoff's PA and PB */
+
+static int
+fieldoff_compare (const void *pa, const void *pb)
+{
+ const fieldoff_s *foa = (const fieldoff_s *)pa;
+ const fieldoff_s *fob = (const fieldoff_s *)pb;
+ HOST_WIDE_INT foasize, fobsize;
+
+ if (foa->offset != fob->offset)
+ return foa->offset - fob->offset;
+
+ foasize = TREE_INT_CST_LOW (DECL_SIZE (foa->field));
+ fobsize = TREE_INT_CST_LOW (DECL_SIZE (fob->field));
+ return foasize - fobsize;
+}
+
+/* Sort a fieldstack according to the field offset and sizes. */
+void sort_fieldstack (VEC(fieldoff_s,heap) *fieldstack)
+{
+ qsort (VEC_address (fieldoff_s, fieldstack),
+ VEC_length (fieldoff_s, fieldstack),
+ sizeof (fieldoff_s),
+ fieldoff_compare);
+}
+
+/* Given a TYPE, and a vector of field offsets FIELDSTACK, push all the fields
+ of TYPE onto fieldstack, recording their offsets along the way.
+ OFFSET is used to keep track of the offset in this entire structure, rather
+ than just the immediately containing structure. Returns the number
+ of fields pushed.
+ HAS_UNION is set to true if we find a union type as a field of
+ TYPE. */
+
+int
+push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack,
+ HOST_WIDE_INT offset, bool *has_union)
+{
+ tree field;
+ int count = 0;
+
+ for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
+ if (TREE_CODE (field) == FIELD_DECL)
+ {
+ bool push = false;
+
+ if (has_union
+ && (TREE_CODE (TREE_TYPE (field)) == QUAL_UNION_TYPE
+ || TREE_CODE (TREE_TYPE (field)) == UNION_TYPE))
+ *has_union = true;
+
+ if (!var_can_have_subvars (field))
+ push = true;
+ else if (!(push_fields_onto_fieldstack
+ (TREE_TYPE (field), fieldstack,
+ offset + bitpos_of_field (field), has_union))
+ && DECL_SIZE (field)
+ && !integer_zerop (DECL_SIZE (field)))
+ /* Empty structures may have actual size, like in C++. So
+ see if we didn't push any subfields and the size is
+ nonzero, push the field onto the stack */
+ push = true;
+
+ if (push)
+ {
+ fieldoff_s *pair;
+
+ pair = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL);
+ pair->field = field;
+ pair->offset = offset + bitpos_of_field (field);
+ count++;
+ }
+ }
+
+ return count;
+}
+
+static void
+make_constraint_to_anything (varinfo_t vi)
+{
+ struct constraint_expr lhs, rhs;
+
+ lhs.var = vi->id;
+ lhs.offset = 0;
+ lhs.type = SCALAR;
+
+ rhs.var = anything_id;
+ rhs.offset =0 ;
+ rhs.type = ADDRESSOF;
+ process_constraint (new_constraint (lhs, rhs));
+}
+
+/* Create a varinfo structure for NAME and DECL, and add it to VARMAP.
+ This will also create any varinfo structures necessary for fields
+ of DECL. */
+
+static unsigned int
+create_variable_info_for (tree decl, const char *name)
+{
+ unsigned int index = VEC_length (varinfo_t, varmap);
+ varinfo_t vi;
+ tree decltype = TREE_TYPE (decl);
+ bool notokay = false;
+ bool hasunion;
+ subvar_t svars;
+ bool is_global = DECL_P (decl) ? is_global_var (decl) : false;
+ VEC (fieldoff_s,heap) *fieldstack = NULL;
+
+
+ hasunion = TREE_CODE (decltype) == UNION_TYPE || TREE_CODE (decltype) == QUAL_UNION_TYPE;
+ if (var_can_have_subvars (decl) && use_field_sensitive && !hasunion)
+ {
+ push_fields_onto_fieldstack (decltype, &fieldstack, 0, &hasunion);
+ if (hasunion)
+ {
+ VEC_free (fieldoff_s, heap, fieldstack);
+ notokay = true;
+ }
+ }
+
+ /* If this variable already has subvars, just create the variables for the
+ subvars and we are done.
+ NOTE: This assumes things haven't generated uses of previously
+ unused structure fields. */
+ if (use_field_sensitive
+ && !notokay
+ && var_can_have_subvars (decl)
+ && var_ann (decl)
+ && (svars = get_subvars_for_var (decl)))
+ {
+ subvar_t sv;
+ varinfo_t base = NULL;
+ unsigned int firstindex = index;
+
+ for (sv = svars; sv; sv = sv->next)
+ {
+ /* For debugging purposes, this will print the names of the
+ fields as "<var>.<offset>.<size>"
+ This is only for debugging purposes. */
+#define PRINT_LONG_NAMES
+#ifdef PRINT_LONG_NAMES
+ char *tempname;
+ const char *newname;
+
+ asprintf (&tempname,
+ "%s." HOST_WIDE_INT_PRINT_DEC "." HOST_WIDE_INT_PRINT_DEC,
+ alias_get_name (decl), sv->offset, sv->size);
+ newname = ggc_strdup (tempname);
+ free (tempname);
+ vi = new_var_info (sv->var, index, newname, index);
+#else
+ vi = new_var_info (sv->var, index, alias_get_name (sv->var), index);
+#endif
+ vi->decl = sv->var;
+ vi->fullsize = TREE_INT_CST_LOW (TYPE_SIZE (decltype));
+ vi->size = sv->size;
+ vi->offset = sv->offset;
+ if (!base)
+ {
+ base = vi;
+ insert_id_for_tree (decl, index);
+ }
+ else
+ {
+ insert_into_field_list (base, vi);
+ }
+ insert_id_for_tree (sv->var, index);
+ VEC_safe_push (varinfo_t, gc, varmap, vi);
+ if (is_global)
+ make_constraint_to_anything (vi);
+ index++;
+
+ }
+ return firstindex;
+ }
+
+
+ /* If the variable doesn't have subvars, we may end up needing to
+ sort the field list and create fake variables for all the
+ fields. */
+ vi = new_var_info (decl, index, name, index);
+ vi->decl = decl;
+ vi->offset = 0;
+ vi->has_union = hasunion;
+ if (!TYPE_SIZE (decltype)
+ || TREE_CODE (TYPE_SIZE (decltype)) != INTEGER_CST
+ || TREE_CODE (decltype) == ARRAY_TYPE
+ || TREE_CODE (decltype) == UNION_TYPE
+ || TREE_CODE (decltype) == QUAL_UNION_TYPE)
+ {
+ vi->is_unknown_size_var = true;
+ vi->fullsize = ~0;
+ vi->size = ~0;
+ }
+ else
+ {
+ vi->fullsize = TREE_INT_CST_LOW (TYPE_SIZE (decltype));
+ vi->size = vi->fullsize;
+ }
+
+ insert_id_for_tree (vi->decl, index);
+ VEC_safe_push (varinfo_t, gc, varmap, vi);
+ if (is_global)
+ make_constraint_to_anything (vi);
+
+ stats.total_vars++;
+ if (use_field_sensitive
+ && !notokay
+ && !vi->is_unknown_size_var
+ && var_can_have_subvars (decl))
+ {
+ unsigned int newindex = VEC_length (varinfo_t, varmap);
+ fieldoff_s *fo = NULL;
+ unsigned int i;
+ tree field;
+
+ for (i = 0; !notokay && VEC_iterate (fieldoff_s, fieldstack, i, fo); i++)
+ {
+ if (!DECL_SIZE (fo->field)
+ || TREE_CODE (DECL_SIZE (fo->field)) != INTEGER_CST
+ || TREE_CODE (TREE_TYPE (fo->field)) == ARRAY_TYPE
+ || fo->offset < 0)
+ {
+ notokay = true;
+ break;
+ }
+ }
+
+ /* We can't sort them if we have a field with a variable sized type,
+ which will make notokay = true. In that case, we are going to return
+ without creating varinfos for the fields anyway, so sorting them is a
+ waste to boot. */
+ if (!notokay)
+ sort_fieldstack (fieldstack);
+
+ if (VEC_length (fieldoff_s, fieldstack) != 0)
+ fo = VEC_index (fieldoff_s, fieldstack, 0);
+
+ if (fo == NULL || notokay)
+ {
+ vi->is_unknown_size_var = 1;
+ vi->fullsize = ~0;
+ vi->size = ~0;
+ VEC_free (fieldoff_s, heap, fieldstack);
+ return index;
+ }
+
+ field = fo->field;
+ gcc_assert (bitpos_of_field (field) == 0);
+ vi->size = TREE_INT_CST_LOW (DECL_SIZE (field));
+ for (i = 1; VEC_iterate (fieldoff_s, fieldstack, i, fo); i++)
+ {
+ varinfo_t newvi;
+ const char *newname;
+ char *tempname;
+
+ field = fo->field;
+ newindex = VEC_length (varinfo_t, varmap);
+ asprintf (&tempname, "%s.%s", vi->name, alias_get_name (field));
+ newname = ggc_strdup (tempname);
+ free (tempname);
+ newvi = new_var_info (decl, newindex, newname, newindex);
+ newvi->offset = fo->offset;
+ newvi->size = TREE_INT_CST_LOW (DECL_SIZE (field));
+ newvi->fullsize = vi->fullsize;
+ insert_into_field_list (vi, newvi);
+ VEC_safe_push (varinfo_t, gc, varmap, newvi);
+ if (is_global)
+ make_constraint_to_anything (newvi);
+
+ stats.total_vars++;
+ }
+ VEC_free (fieldoff_s, heap, fieldstack);
+ }
+ return index;
+}
+
+/* Print out the points-to solution for VAR to FILE. */
+
+void
+dump_solution_for_var (FILE *file, unsigned int var)
+{
+ varinfo_t vi = get_varinfo (var);
+ unsigned int i;
+ bitmap_iterator bi;
+
+ fprintf (file, "%s = { ", vi->name);
+ EXECUTE_IF_SET_IN_BITMAP (get_varinfo (vi->node)->solution, 0, i, bi)
+ {
+ fprintf (file, "%s ", get_varinfo (i)->name);
+ }
+ fprintf (file, "}\n");
+}
+
+/* Print the points-to solution for VAR to stdout. */
+
+void
+debug_solution_for_var (unsigned int var)
+{
+ dump_solution_for_var (stdout, var);
+}
+
+
+/* Create varinfo structures for all of the variables in the
+ function for intraprocedural mode. */
+
+static void
+intra_create_variable_infos (void)
+{
+ tree t;
+
+ /* For each incoming argument arg, ARG = &ANYTHING */
+ for (t = DECL_ARGUMENTS (current_function_decl); t; t = TREE_CHAIN (t))
+ {
+ struct constraint_expr lhs;
+ struct constraint_expr rhs;
+ varinfo_t p;
+
+ lhs.offset = 0;
+ lhs.type = SCALAR;
+ lhs.var = create_variable_info_for (t, alias_get_name (t));
+
+ get_varinfo (lhs.var)->is_artificial_var = true;
+ rhs.var = anything_id;
+ rhs.type = ADDRESSOF;
+ rhs.offset = 0;
+
+ for (p = get_varinfo (lhs.var); p; p = p->next)
+ {
+ struct constraint_expr temp = lhs;
+ temp.var = p->id;
+ process_constraint (new_constraint (temp, rhs));
+ }
+ }
+
+}
+
+/* Set bits in INTO corresponding to the variable uids in solution set
+ FROM */
+
+static void
+set_uids_in_ptset (bitmap into, bitmap from)
+{
+ unsigned int i;
+ bitmap_iterator bi;
+
+ EXECUTE_IF_SET_IN_BITMAP (from, 0, i, bi)
+ {
+ varinfo_t vi = get_varinfo (i);
+
+ /* Variables containing unions may need to be converted to their
+ SFT's, because SFT's can have unions and we cannot. */
+ if (vi->has_union && get_subvars_for_var (vi->decl) != NULL)
+ {
+ subvar_t svars = get_subvars_for_var (vi->decl);
+ subvar_t sv;
+ for (sv = svars; sv; sv = sv->next)
+ bitmap_set_bit (into, var_ann (sv->var)->uid);
+ }
+ /* We may end up with labels in the points-to set because people
+ take their address, and they are _DECL's. */
+ else if (TREE_CODE (vi->decl) == VAR_DECL
+ || TREE_CODE (vi->decl) == PARM_DECL)
+ bitmap_set_bit (into, var_ann (vi->decl)->uid);
+
+
+ }
+}
+static int have_alias_info = false;
+
+/* Given a pointer variable P, fill in its points-to set, or return
+ false if we can't. */
+
+bool
+find_what_p_points_to (tree p)
+{
+ unsigned int id = 0;
+ if (!have_alias_info)
+ return false;
+ if (lookup_id_for_tree (p, &id))
+ {
+ varinfo_t vi = get_varinfo (id);
+
+ if (vi->is_artificial_var)
+ return false;
+
+ /* See if this is a field or a structure */
+ if (vi->size != vi->fullsize)
+ {
+ if (!var_can_have_subvars (vi->decl)
+ || get_subvars_for_var (vi->decl) == NULL)
+ return false;
+ /* Nothing currently asks about structure fields directly, but when
+ they do, we need code here to hand back the points-to set. */
+ }
+ else
+ {
+ struct ptr_info_def *pi = get_ptr_info (p);
+ unsigned int i;
+ bitmap_iterator bi;
+
+ /* This variable may have been collapsed, let's get the real
+ variable. */
+ vi = get_varinfo (vi->node);
+
+ /* Make sure there aren't any artificial vars in the points to set.
+ XXX: Note that we need to translate our heap variables to
+ something. */
+ EXECUTE_IF_SET_IN_BITMAP (vi->solution, 0, i, bi)
+ {
+ if (get_varinfo (i)->is_artificial_var)
+ return false;
+ }
+ pi->pt_anything = false;
+ if (!pi->pt_vars)
+ pi->pt_vars = BITMAP_GGC_ALLOC ();
+ set_uids_in_ptset (pi->pt_vars, vi->solution);
+ return true;
+ }
+ }
+ return false;
+}
+
+
+/* Initialize things necessary to perform PTA */
+
+static void
+init_alias_vars (void)
+{
+ bitmap_obstack_initialize (&ptabitmap_obstack);
+}
+
+
+/* Dump points-to information to OUTFILE. */
+
+void
+dump_sa_points_to_info (FILE *outfile)
+{
+ unsigned int i;
+
+ fprintf (outfile, "\nPoints-to information\n\n");
+
+ if (dump_flags & TDF_STATS)
+ {
+ fprintf (outfile, "Stats:\n");
+ fprintf (outfile, "Total vars: %d\n", stats.total_vars);
+ fprintf (outfile, "Statically unified vars: %d\n",
+ stats.unified_vars_static);
+ fprintf (outfile, "Collapsed vars: %d\n", stats.collapsed_vars);
+ fprintf (outfile, "Dynamically unified vars: %d\n",
+ stats.unified_vars_dynamic);
+ fprintf (outfile, "Iterations: %d\n", stats.iterations);
+ }
+
+ for (i = 0; i < VEC_length (varinfo_t, varmap); i++)
+ dump_solution_for_var (outfile, i);
+}
+
+
+/* Debug points-to information to stderr. */
+
+void
+debug_sa_points_to_info (void)
+{
+ dump_sa_points_to_info (stderr);
+}
+
+
+/* Initialize the always-existing constraint variables for NULL
+ ANYTHING, READONLY, and INTEGER */
+
+static void
+init_base_vars (void)
+{
+ struct constraint_expr lhs, rhs;
+
+ /* Create the NULL variable, used to represent that a variable points
+ to NULL. */
+ nothing_tree = create_tmp_var_raw (void_type_node, "NULL");
+ var_nothing = new_var_info (nothing_tree, 0, "NULL", 0);
+ insert_id_for_tree (nothing_tree, 0);
+ var_nothing->is_artificial_var = 1;
+ var_nothing->offset = 0;
+ var_nothing->size = ~0;
+ var_nothing->fullsize = ~0;
+ nothing_id = 0;
+ VEC_safe_push (varinfo_t, gc, varmap, var_nothing);
+
+ /* Create the ANYTHING variable, used to represent that a variable
+ points to some unknown piece of memory. */
+ anything_tree = create_tmp_var_raw (void_type_node, "ANYTHING");
+ var_anything = new_var_info (anything_tree, 1, "ANYTHING", 1);
+ insert_id_for_tree (anything_tree, 1);
+ var_anything->is_artificial_var = 1;
+ var_anything->size = ~0;
+ var_anything->offset = 0;
+ var_anything->next = NULL;
+ var_anything->fullsize = ~0;
+ anything_id = 1;
+
+ /* Anything points to anything. This makes deref constraints just
+ work in the presence of linked list and other p = *p type loops,
+ by saying that *ANYTHING = ANYTHING. */
+ VEC_safe_push (varinfo_t, gc, varmap, var_anything);
+ lhs.type = SCALAR;
+ lhs.var = anything_id;
+ lhs.offset = 0;
+ rhs.type = ADDRESSOF;
+ rhs.var = anything_id;
+ rhs.offset = 0;
+ var_anything->address_taken = true;
+ process_constraint (new_constraint (lhs, rhs));
+
+
+ /* Create the READONLY variable, used to represent that a variable
+ points to readonly memory. */
+ readonly_tree = create_tmp_var_raw (void_type_node, "READONLY");
+ var_readonly = new_var_info (readonly_tree, 2, "READONLY", 2);
+ var_readonly->is_artificial_var = 1;
+ var_readonly->offset = 0;
+ var_readonly->size = ~0;
+ var_readonly->fullsize = ~0;
+ var_readonly->next = NULL;
+ insert_id_for_tree (readonly_tree, 2);
+ readonly_id = 2;
+ VEC_safe_push (varinfo_t, gc, varmap, var_readonly);
+
+ /* readonly memory points to anything, in order to make deref
+ easier. In reality, it points to anything the particular
+ readonly variable can point to, but we don't track this
+ separately. */
+ lhs.type = SCALAR;
+ lhs.var = readonly_id;
+ lhs.offset = 0;
+ rhs.type = ADDRESSOF;
+ rhs.var = anything_id;
+ rhs.offset = 0;
+ var_readonly->address_taken = true;
+
+ process_constraint (new_constraint (lhs, rhs));
+
+ /* Create the INTEGER variable, used to represent that a variable points
+ to an INTEGER. */
+ integer_tree = create_tmp_var_raw (void_type_node, "INTEGER");
+ var_integer = new_var_info (integer_tree, 3, "INTEGER", 3);
+ insert_id_for_tree (integer_tree, 3);
+ var_integer->is_artificial_var = 1;
+ var_integer->size = ~0;
+ var_integer->fullsize = ~0;
+ var_integer->offset = 0;
+ var_integer->next = NULL;
+ integer_id = 3;
+ VEC_safe_push (varinfo_t, gc, varmap, var_integer);
+}
+
+
+/* Create points-to sets for the current function. See the comments
+ at the start of the file for an algorithmic overview. */
+
+static void
+create_alias_vars (void)
+{
+ basic_block bb;
+
+
+ init_alias_vars ();
+
+ constraint_pool = create_alloc_pool ("Constraint pool",
+ sizeof (struct constraint), 30);
+ variable_info_pool = create_alloc_pool ("Variable info pool",
+ sizeof (struct variable_info), 30);
+ constraint_edge_pool = create_alloc_pool ("Constraint edges",
+ sizeof (struct constraint_edge), 30);
+
+ constraints = VEC_alloc (constraint_t, gc, 8);
+ varmap = VEC_alloc (varinfo_t, gc, 8);
+ id_for_tree = htab_create (10, tree_id_hash, tree_id_eq, free);
+ memset (&stats, 0, sizeof (stats));
+
+ init_base_vars ();
+
+ intra_create_variable_infos ();
+
+ /* Now walk all statements and derive aliases. */
+ FOR_EACH_BB (bb)
+ {
+ block_stmt_iterator bsi;
+ tree phi;
+
+ for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
+ if (is_gimple_reg (PHI_RESULT (phi)))
+ find_func_aliases (phi);
+
+ for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
+ find_func_aliases (bsi_stmt (bsi));
+ }
+
+ build_constraint_graph ();
+
+ if (dump_file)
+ {
+ fprintf (dump_file, "Constraints:\n");
+ dump_constraints (dump_file);
+ }
+
+ if (dump_file)
+ fprintf (dump_file, "Collapsing static cycles and doing variable substitution:\n");
+
+ find_and_collapse_graph_cycles (graph, false);
+ perform_var_substitution (graph);
+
+ if (dump_file)
+ fprintf (dump_file, "Solving graph:\n");
+
+ solve_graph (graph);
+
+ if (dump_file)
+ dump_sa_points_to_info (dump_file);
+
+ have_alias_info = true;
+}
+
+struct tree_opt_pass pass_build_pta =
+{
+ "pta", /* name */
+ NULL, /* gate */
+ create_alias_vars, /* execute */
+ NULL, /* sub */
+ NULL, /* next */
+ 0, /* static_pass_number */
+ TV_TREE_PTA, /* tv_id */
+ PROP_cfg, /* properties_required */
+ PROP_pta, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ 0, /* todo_flags_finish */
+ 0 /* letter */
+};
+
+
+/* Delete created points-to sets. */
+
+static void
+delete_alias_vars (void)
+{
+ htab_delete (id_for_tree);
+ free_alloc_pool (variable_info_pool);
+ free_alloc_pool (constraint_pool);
+ free_alloc_pool (constraint_edge_pool);
+ bitmap_obstack_release (&ptabitmap_obstack);
+ have_alias_info = false;
+}
+
+struct tree_opt_pass pass_del_pta =
+{
+ NULL, /* name */
+ NULL, /* gate */
+ delete_alias_vars, /* execute */
+ NULL, /* sub */
+ NULL, /* next */
+ 0, /* static_pass_number */
+ TV_TREE_PTA, /* tv_id */
+ PROP_pta, /* properties_required */
+ 0, /* properties_provided */
+ PROP_pta, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ 0, /* todo_flags_finish */
+ 0 /* letter */
+};
diff --git a/gcc/tree-ssa-structalias.h b/gcc/tree-ssa-structalias.h
new file mode 100644
index 00000000000..89224c6bb0e
--- /dev/null
+++ b/gcc/tree-ssa-structalias.h
@@ -0,0 +1,37 @@
+/* Tree based points-to analysis
+ Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+ Contributed by Daniel Berlin <dberlin@dberlin.org>
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+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.
+
+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; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef TREE_SSA_STRUCTALIAS_H
+#define TREE_SSA_STRUCTALIAS_H
+
+struct constraint;
+typedef struct constraint *constraint_t;
+
+extern void dump_constraint (FILE *, constraint_t);
+extern void dump_constraints (FILE *);
+extern void debug_constraint (constraint_t);
+extern void debug_constraints (void);
+extern void dump_solution_for_var (FILE *, unsigned int);
+extern void debug_solution_for_var (unsigned int);
+extern void dump_sa_points_to_info (FILE *);
+extern void debug_sa_points_to_info (void);
+
+#endif /* TREE_SSA_STRUCTALIAS_H */
diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c
index e72598d830e..ea4413710a1 100644
--- a/gcc/tree-ssa-threadupdate.c
+++ b/gcc/tree-ssa-threadupdate.c
@@ -29,7 +29,6 @@ Boston, MA 02111-1307, USA. */
#include "ggc.h"
#include "basic-block.h"
#include "output.h"
-#include "errors.h"
#include "expr.h"
#include "function.h"
#include "diagnostic.h"
@@ -148,6 +147,16 @@ struct local_info
bool jumps_threaded;
};
+/* Jump threading statistics. */
+
+struct thread_stats_d
+{
+ unsigned long num_threaded_edges;
+};
+
+struct thread_stats_d thread_stats;
+
+
/* Remove the last statement in block BB if it is a control statement
Also remove all outgoing edges except the edge which reaches DEST_BB.
If DEST_BB is NULL, then remove all outgoing edges. */
@@ -299,6 +308,9 @@ create_edge_and_update_destination_phis (struct redirection_data *rd)
edge e = make_edge (rd->dup_block, rd->outgoing_edge->dest, EDGE_FALLTHRU);
tree phi;
+ e->probability = REG_BR_PROB_BASE;
+ e->count = rd->dup_block->count;
+
/* If there are any PHI nodes at the destination of the outgoing edge
from the duplicate block, then we will need to add a new argument
to them. The argument should have the same value as the argument
@@ -587,6 +599,8 @@ redirect_edges (void **slot, void *data)
to clear it will cause all kinds of unpleasant problems later. */
e->aux = NULL;
+ thread_stats.num_threaded_edges++;
+
if (rd->dup_block)
{
edge e2;
@@ -802,23 +816,26 @@ thread_block (basic_block bb)
Returns true if one or more edges were threaded, false otherwise. */
bool
-thread_through_all_blocks (void)
+thread_through_all_blocks (bitmap threaded_blocks)
{
- basic_block bb;
bool retval = false;
+ unsigned int i;
+ bitmap_iterator bi;
rediscover_loops_after_threading = false;
+ memset (&thread_stats, 0, sizeof (thread_stats));
- FOR_EACH_BB (bb)
+ EXECUTE_IF_SET_IN_BITMAP (threaded_blocks, 0, i, bi)
{
- if (bb_ann (bb)->incoming_edge_threaded
- && EDGE_COUNT (bb->preds) > 0)
- {
- retval |= thread_block (bb);
- bb_ann (bb)->incoming_edge_threaded = false;
-
- }
+ basic_block bb = BASIC_BLOCK (i);
+
+ if (EDGE_COUNT (bb->preds) > 0)
+ retval |= thread_block (bb);
}
+ if (dump_file && (dump_flags & TDF_STATS))
+ fprintf (dump_file, "\nJumps threaded: %lu\n",
+ thread_stats.num_threaded_edges);
+
return retval;
}
diff --git a/gcc/tree-ssa-uncprop.c b/gcc/tree-ssa-uncprop.c
index a35131b12c2..38130604b85 100644
--- a/gcc/tree-ssa-uncprop.c
+++ b/gcc/tree-ssa-uncprop.c
@@ -29,7 +29,6 @@ Boston, MA 02111-1307, USA. */
#include "ggc.h"
#include "basic-block.h"
#include "output.h"
-#include "errors.h"
#include "expr.h"
#include "function.h"
#include "diagnostic.h"
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index e4a5ba1d8a3..50c6e7266f5 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -31,7 +31,6 @@ Boston, MA 02111-1307, USA. */
#include "hard-reg-set.h"
#include "basic-block.h"
#include "output.h"
-#include "errors.h"
#include "expr.h"
#include "function.h"
#include "diagnostic.h"
@@ -45,6 +44,7 @@ Boston, MA 02111-1307, USA. */
#include "hashtab.h"
#include "tree-dump.h"
#include "tree-pass.h"
+#include "toplev.h"
/* Remove the corresponding arguments from the PHI nodes in E's
destination block and redirect it to DEST. Return redirected edge.
@@ -849,8 +849,8 @@ delete_tree_ssa (void)
}
-/* Return true if EXPR is a useless type conversion, otherwise return
- false. */
+/* Return true if the conversion from INNER_TYPE to OUTER_TYPE is a
+ useless type conversion, otherwise return false. */
bool
tree_ssa_useless_type_conversion_1 (tree outer_type, tree inner_type)
@@ -881,8 +881,9 @@ tree_ssa_useless_type_conversion_1 (tree outer_type, tree inner_type)
&& TREE_CODE (TREE_TYPE (outer_type)) == VOID_TYPE)
return true;
- /* Pointers and references are equivalent once we get to GENERIC,
- so strip conversions that just switch between them. */
+ /* Pointers/references are equivalent if their pointed to types
+ are effectively the same. This allows to strip conversions between
+ pointer types with different type qualifiers. */
else if (POINTER_TYPE_P (inner_type)
&& POINTER_TYPE_P (outer_type)
&& TYPE_REF_CAN_ALIAS_ALL (inner_type)
@@ -901,7 +902,9 @@ tree_ssa_useless_type_conversion_1 (tree outer_type, tree inner_type)
else if (INTEGRAL_TYPE_P (inner_type)
&& INTEGRAL_TYPE_P (outer_type)
&& TYPE_UNSIGNED (inner_type) == TYPE_UNSIGNED (outer_type)
- && TYPE_PRECISION (inner_type) == TYPE_PRECISION (outer_type))
+ && TYPE_PRECISION (inner_type) == TYPE_PRECISION (outer_type)
+ && simple_cst_equal (TYPE_MAX_VALUE (inner_type), TYPE_MAX_VALUE (outer_type))
+ && simple_cst_equal (TYPE_MIN_VALUE (inner_type), TYPE_MIN_VALUE (outer_type)))
{
bool first_boolean = (TREE_CODE (inner_type) == BOOLEAN_TYPE);
bool second_boolean = (TREE_CODE (outer_type) == BOOLEAN_TYPE);
@@ -1079,7 +1082,7 @@ walk_use_def_chains (tree var, walk_use_def_chains_fn fn, void *data,
warning text is in MSGID and LOCUS may contain a location or be null. */
static void
-warn_uninit (tree t, const char *msgid, void *data)
+warn_uninit (tree t, const char *gmsgid, void *data)
{
tree var = SSA_NAME_VAR (t);
tree def = SSA_NAME_DEF_STMT (t);
@@ -1107,7 +1110,7 @@ warn_uninit (tree t, const char *msgid, void *data)
locus = (context != NULL && EXPR_HAS_LOCATION (context)
? EXPR_LOCUS (context)
: &DECL_SOURCE_LOCATION (var));
- warning (0, msgid, locus, var);
+ warning (0, gmsgid, locus, var);
TREE_NO_WARNING (var) = 1;
}
diff --git a/gcc/tree-stdarg.c b/gcc/tree-stdarg.c
index 5c3b81b724a..c0d16b1b31e 100644
--- a/gcc/tree-stdarg.c
+++ b/gcc/tree-stdarg.c
@@ -660,16 +660,30 @@ execute_optimize_stdarg (void)
si.va_start_count++;
ap = TREE_VALUE (TREE_OPERAND (call, 1));
- if (TREE_CODE (ap) != ADDR_EXPR
- || TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (ap, 0)))
- != TYPE_MAIN_VARIANT (va_list_type_node)
- || TREE_CODE (TREE_OPERAND (ap, 0)) != VAR_DECL)
+
+ if (TREE_CODE (ap) != ADDR_EXPR)
{
va_list_escapes = true;
break;
}
-
ap = TREE_OPERAND (ap, 0);
+ if (TREE_CODE (ap) == ARRAY_REF)
+ {
+ if (! integer_zerop (TREE_OPERAND (ap, 1)))
+ {
+ va_list_escapes = true;
+ break;
+ }
+ ap = TREE_OPERAND (ap, 0);
+ }
+ if (TYPE_MAIN_VARIANT (TREE_TYPE (ap))
+ != TYPE_MAIN_VARIANT (va_list_type_node)
+ || TREE_CODE (ap) != VAR_DECL)
+ {
+ va_list_escapes = true;
+ break;
+ }
+
if (is_global_var (ap))
{
va_list_escapes = true;
diff --git a/gcc/tree-vect-analyze.c b/gcc/tree-vect-analyze.c
index 7529effb076..da033c82874 100644
--- a/gcc/tree-vect-analyze.c
+++ b/gcc/tree-vect-analyze.c
@@ -23,7 +23,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
#include "tree.h"
#include "basic-block.h"
@@ -43,7 +42,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
static loop_vec_info vect_analyze_loop_form (struct loop *);
static bool vect_analyze_data_refs (loop_vec_info);
static bool vect_mark_stmts_to_be_vectorized (loop_vec_info);
-static bool vect_analyze_scalar_cycles (loop_vec_info);
+static void vect_analyze_scalar_cycles (loop_vec_info);
static bool vect_analyze_data_ref_accesses (loop_vec_info);
static bool vect_analyze_data_ref_dependences (loop_vec_info);
static bool vect_analyze_data_refs_alignment (loop_vec_info);
@@ -54,8 +53,8 @@ static bool vect_determine_vectorization_factor (loop_vec_info);
/* Utility functions for the analyses. */
static bool exist_non_indexing_operands_for_use_p (tree, tree);
-static void vect_mark_relevant (VEC(tree,heap) **, tree);
-static bool vect_stmt_relevant_p (tree, loop_vec_info);
+static void vect_mark_relevant (VEC(tree,heap) **, tree, bool, bool);
+static bool vect_stmt_relevant_p (tree, loop_vec_info, bool *, bool *);
static tree vect_get_loop_niters (struct loop *, tree *);
static bool vect_analyze_data_ref_dependence
(struct data_reference *, struct data_reference *, loop_vec_info);
@@ -345,8 +344,13 @@ vect_determine_vectorization_factor (loop_vec_info loop_vinfo)
gcc_assert (stmt_info);
/* skip stmts which do not need to be vectorized. */
- if (!STMT_VINFO_RELEVANT_P (stmt_info))
- continue;
+ if (!STMT_VINFO_RELEVANT_P (stmt_info)
+ && !STMT_VINFO_LIVE_P (stmt_info))
+ {
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ fprintf (vect_dump, "skip.");
+ continue;
+ }
if (VECTOR_MODE_P (TYPE_MODE (TREE_TYPE (stmt))))
{
@@ -445,6 +449,9 @@ vect_analyze_operations (loop_vec_info loop_vinfo)
unsigned int vectorization_factor = 0;
int i;
bool ok;
+ tree phi;
+ stmt_vec_info stmt_info;
+ bool need_to_vectorize = false;
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
fprintf (vect_dump, "=== vect_analyze_operations ===");
@@ -456,6 +463,29 @@ vect_analyze_operations (loop_vec_info loop_vinfo)
{
basic_block bb = bbs[i];
+ for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
+ {
+ stmt_info = vinfo_for_stmt (phi);
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ {
+ fprintf (vect_dump, "examining phi: ");
+ print_generic_expr (vect_dump, phi, TDF_SLIM);
+ }
+
+ gcc_assert (stmt_info);
+
+ if (STMT_VINFO_LIVE_P (stmt_info))
+ {
+ /* FORNOW: not yet supported. */
+ if (vect_print_dump_info (REPORT_UNVECTORIZED_LOOPS,
+ LOOP_LOC (loop_vinfo)))
+ fprintf (vect_dump, "not vectorized: value used after loop.");
+ return false;
+ }
+
+ gcc_assert (!STMT_VINFO_RELEVANT_P (stmt_info));
+ }
+
for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
{
tree stmt = bsi_stmt (si);
@@ -476,42 +506,77 @@ vect_analyze_operations (loop_vec_info loop_vinfo)
- computations that are used only for array indexing or loop
control */
- if (!STMT_VINFO_RELEVANT_P (stmt_info))
+ if (!STMT_VINFO_RELEVANT_P (stmt_info)
+ && !STMT_VINFO_LIVE_P (stmt_info))
{
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
fprintf (vect_dump, "irrelevant.");
continue;
}
-#ifdef ENABLE_CHECKING
if (STMT_VINFO_RELEVANT_P (stmt_info))
{
gcc_assert (!VECTOR_MODE_P (TYPE_MODE (TREE_TYPE (stmt))));
gcc_assert (STMT_VINFO_VECTYPE (stmt_info));
- }
-#endif
- ok = (vectorizable_operation (stmt, NULL, NULL)
- || vectorizable_assignment (stmt, NULL, NULL)
- || vectorizable_load (stmt, NULL, NULL)
- || vectorizable_store (stmt, NULL, NULL)
- || vectorizable_condition (stmt, NULL, NULL));
+ ok = (vectorizable_operation (stmt, NULL, NULL)
+ || vectorizable_assignment (stmt, NULL, NULL)
+ || vectorizable_load (stmt, NULL, NULL)
+ || vectorizable_store (stmt, NULL, NULL)
+ || vectorizable_condition (stmt, NULL, NULL));
+
+ if (!ok)
+ {
+ if (vect_print_dump_info (REPORT_UNVECTORIZED_LOOPS,
+ LOOP_LOC (loop_vinfo)))
+ {
+ fprintf (vect_dump,
+ "not vectorized: relevant stmt not supported: ");
+ print_generic_expr (vect_dump, stmt, TDF_SLIM);
+ }
+ return false;
+ }
+ need_to_vectorize = true;
+ }
- if (!ok)
+ if (STMT_VINFO_LIVE_P (stmt_info))
{
- if (vect_print_dump_info (REPORT_UNVECTORIZED_LOOPS,
- LOOP_LOC (loop_vinfo)))
+ ok = vectorizable_live_operation (stmt, NULL, NULL);
+
+ if (!ok)
{
- fprintf (vect_dump, "not vectorized: stmt not supported: ");
- print_generic_expr (vect_dump, stmt, TDF_SLIM);
+ if (vect_print_dump_info (REPORT_UNVECTORIZED_LOOPS,
+ LOOP_LOC (loop_vinfo)))
+ {
+ fprintf (vect_dump,
+ "not vectorized: live stmt not supported: ");
+ print_generic_expr (vect_dump, stmt, TDF_SLIM);
+ }
+ return false;
}
- return false;
}
- }
- }
+ } /* stmts in bb */
+ } /* bbs */
/* TODO: Analyze cost. Decide if worth while to vectorize. */
+ /* All operations in the loop are either irrelevant (deal with loop
+ control, or dead), or only used outside the loop and can be moved
+ out of the loop (e.g. invariants, inductions). The loop can be
+ optimized away by scalar optimizations. We're better off not
+ touching this loop. */
+ if (!need_to_vectorize)
+ {
+ if (vect_print_dump_info (REPORT_DETAILS, LOOP_LOC (loop_vinfo)))
+ fprintf (vect_dump,
+ "All the computation can be taken out of the loop.");
+ if (vect_print_dump_info (REPORT_UNVECTORIZED_LOOPS,
+ LOOP_LOC (loop_vinfo)))
+ fprintf (vect_dump,
+ "not vectorized: redundant loop. no profit to vectorize.");
+ return false;
+ }
+
if (LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo)
&& vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
fprintf (vect_dump,
@@ -602,40 +667,43 @@ exist_non_indexing_operands_for_use_p (tree use, tree stmt)
/* Function vect_analyze_scalar_cycles.
Examine the cross iteration def-use cycles of scalar variables, by
- analyzing the loop (scalar) PHIs; verify that the cross iteration def-use
- cycles that they represent do not impede vectorization.
+ analyzing the loop (scalar) PHIs; Classify each cycle as one of the
+ following: invariant, induction, reduction, unknown.
+
+ Some forms of scalar cycles are not yet supported.
+
+ Example1: reduction: (unsupported yet)
- FORNOW: Reduction as in the following loop, is not supported yet:
loop1:
for (i=0; i<N; i++)
sum += a[i];
- The cross-iteration cycle corresponding to variable 'sum' will be
- considered too complicated and will impede vectorization.
- FORNOW: Induction as in the following loop, is not supported yet:
+ Example2: induction: (unsupported yet)
+
loop2:
for (i=0; i<N; i++)
a[i] = i;
- However, the following loop *is* vectorizable:
+ Note: the following loop *is* vectorizable:
+
loop3:
for (i=0; i<N; i++)
a[i] = b[i];
- In both loops there exists a def-use cycle for the variable i:
+ even though it has a def-use cycle caused by the induction variable i:
+
loop: i_2 = PHI (i_0, i_1)
a[i_2] = ...;
i_1 = i_2 + 1;
GOTO loop;
- The evolution of the above cycle is considered simple enough,
- however, we also check that the cycle does not need to be
- vectorized, i.e - we check that the variable that this cycle
- defines is only used for array indexing or in stmts that do not
- need to be vectorized. This is not the case in loop2, but it
- *is* the case in loop3. */
+ because the def-use cycle in loop3 is considered "not relevant" - i.e.,
+ it does not need to be vectorized because it is only used for array
+ indexing (see 'mark_stmts_to_be_vectorized'). The def-use cycle in
+ loop2 on the other hand is relevant (it is being written to memory).
+*/
-static bool
+static void
vect_analyze_scalar_cycles (loop_vec_info loop_vinfo)
{
tree phi;
@@ -649,6 +717,9 @@ vect_analyze_scalar_cycles (loop_vec_info loop_vinfo)
for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
{
tree access_fn = NULL;
+ tree def = PHI_RESULT (phi);
+ stmt_vec_info stmt_vinfo = vinfo_for_stmt (phi);
+ tree reduc_stmt;
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
{
@@ -659,35 +730,21 @@ vect_analyze_scalar_cycles (loop_vec_info loop_vinfo)
/* Skip virtual phi's. The data dependences that are associated with
virtual defs/uses (i.e., memory accesses) are analyzed elsewhere. */
- if (!is_gimple_reg (SSA_NAME_VAR (PHI_RESULT (phi))))
+ if (!is_gimple_reg (SSA_NAME_VAR (def)))
{
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
fprintf (vect_dump, "virtual phi. skip.");
continue;
}
- /* Analyze the evolution function. */
-
- /* FORNOW: The only scalar cross-iteration cycles that we allow are
- those of loop induction variables; This property is verified here.
+ STMT_VINFO_DEF_TYPE (stmt_vinfo) = vect_unknown_def_type;
- Furthermore, if that induction variable is used in an operation
- that needs to be vectorized (i.e, is not solely used to index
- arrays and check the exit condition) - we do not support its
- vectorization yet. This property is verified in vect_is_simple_use,
- during vect_analyze_operations. */
+ /* Analyze the evolution function. */
- access_fn = /* instantiate_parameters
- (loop,*/
- analyze_scalar_evolution (loop, PHI_RESULT (phi));
+ access_fn = analyze_scalar_evolution (loop, def);
if (!access_fn)
- {
- if (vect_print_dump_info (REPORT_UNVECTORIZED_LOOPS,
- LOOP_LOC (loop_vinfo)))
- fprintf (vect_dump, "not vectorized: unsupported scalar cycle.");
- return false;
- }
+ continue;
if (vect_print_dump_info (REPORT_DETAILS,
LOOP_LOC (loop_vinfo)))
@@ -696,16 +753,32 @@ vect_analyze_scalar_cycles (loop_vec_info loop_vinfo)
print_generic_expr (vect_dump, access_fn, TDF_SLIM);
}
- if (!vect_is_simple_iv_evolution (loop->num, access_fn, &dummy, &dummy))
+ if (vect_is_simple_iv_evolution (loop->num, access_fn, &dummy, &dummy))
{
- if (vect_print_dump_info (REPORT_UNVECTORIZED_LOOPS,
- LOOP_LOC (loop_vinfo)))
- fprintf (vect_dump, "not vectorized: unsupported scalar cycle.");
- return false;
+ if (vect_print_dump_info (REPORT_DETAILS,LOOP_LOC (loop_vinfo)))
+ fprintf (vect_dump, "Detected induction.");
+ STMT_VINFO_DEF_TYPE (stmt_vinfo) = vect_induction_def;
+ continue;
}
+
+ /* TODO: handle invariant phis */
+
+ reduc_stmt = vect_is_simple_reduction (loop, phi);
+ if (reduc_stmt)
+ {
+ if (vect_print_dump_info (REPORT_DETAILS, LOOP_LOC (loop_vinfo)))
+ fprintf (vect_dump, "Detected reduction.");
+ STMT_VINFO_DEF_TYPE (stmt_vinfo) = vect_reduction_def;
+ STMT_VINFO_DEF_TYPE (vinfo_for_stmt (reduc_stmt)) =
+ vect_reduction_def;
+ }
+ else
+ if (vect_print_dump_info (REPORT_DETAILS, LOOP_LOC (loop_vinfo)))
+ fprintf (vect_dump, "Unknown def-use cycle pattern.");
+
}
- return true;
+ return;
}
@@ -780,7 +853,8 @@ vect_analyze_data_ref_dependence (struct data_reference *dra,
int dist = 0;
unsigned int loop_depth = 0;
struct loop *loop_nest = loop;
-
+ stmt_vec_info stmtinfo_a = vinfo_for_stmt (DR_STMT (dra));
+ stmt_vec_info stmtinfo_b = vinfo_for_stmt (DR_STMT (drb));
if (!vect_base_addr_differ_p (dra, drb, &differ_p))
{
@@ -851,10 +925,13 @@ vect_analyze_data_ref_dependence (struct data_reference *dra,
dist = DDR_DIST_VECT (ddr)[loop_depth];
/* Same loop iteration. */
- if (dist == 0)
+ if (dist % vectorization_factor == 0)
{
- if (vect_print_dump_info (REPORT_DETAILS, LOOP_LOC (loop_vinfo)))
- fprintf (vect_dump, "dependence distance 0.");
+ /* Two references with distance zero have the same alignment. */
+ VEC_safe_push (dr_p, heap, STMT_VINFO_SAME_ALIGN_REFS (stmtinfo_a), drb);
+ VEC_safe_push (dr_p, heap, STMT_VINFO_SAME_ALIGN_REFS (stmtinfo_b), dra);
+ if (vect_print_dump_info (REPORT_ALIGNMENT, LOOP_LOC (loop_vinfo)))
+ fprintf (vect_dump, "accesses have the same alignment.");
return false;
}
@@ -1073,7 +1150,9 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
varray_type loop_read_datarefs = LOOP_VINFO_DATAREF_READS (loop_vinfo);
varray_type loop_write_datarefs = LOOP_VINFO_DATAREF_WRITES (loop_vinfo);
varray_type datarefs;
+ VEC(dr_p,heap) *same_align_drs;
struct data_reference *dr0 = NULL;
+ struct data_reference *dr;
unsigned int i, j;
/*
@@ -1227,7 +1306,8 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
else if (known_alignment_for_access_p (dr)
&& known_alignment_for_access_p (dr0))
{
- int drsize = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (DR_REF (dr))));
+ int drsize =
+ GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (DR_REF (dr))));
DR_MISALIGNMENT (dr) += npeel * drsize;
DR_MISALIGNMENT (dr) %= UNITS_PER_SIMD_WORD;
@@ -1238,6 +1318,13 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
datarefs = loop_read_datarefs;
}
+ same_align_drs =
+ STMT_VINFO_SAME_ALIGN_REFS (vinfo_for_stmt (DR_STMT (dr0)));
+ for (i = 0; VEC_iterate (dr_p, same_align_drs, i, dr); i++)
+ {
+ DR_MISALIGNMENT (dr) = 0;
+ }
+
DR_MISALIGNMENT (dr0) = 0;
}
}
@@ -1246,7 +1333,7 @@ vect_enhance_data_refs_alignment (loop_vec_info loop_vinfo)
/* Function vect_analyze_data_refs_alignment
Analyze the alignment of the data-references in the loop.
- FOR NOW: Until support for misliagned accesses is in place, only if all
+ FOR NOW: Until support for misaligned accesses is in place, only if all
accesses are aligned can the loop be vectorized. This restriction will be
relaxed. */
@@ -1908,7 +1995,7 @@ vect_object_analysis (tree memref, tree stmt, bool is_read,
foreach ref
base_address = vect_object_analysis(ref)
1.1- vect_object_analysis(ref):
- Analyze ref, and build a DR (data_referece struct) for it;
+ Analyze ref, and build a DR (data_reference struct) for it;
compute base, initial_offset, step and alignment.
Call get_inner_reference for refs handled in this function.
Call vect_addr_analysis(addr) to analyze pointer type expressions.
@@ -2050,39 +2137,32 @@ vect_analyze_data_refs (loop_vec_info loop_vinfo)
Mark STMT as "relevant for vectorization" and add it to WORKLIST. */
static void
-vect_mark_relevant (VEC(tree,heap) **worklist, tree stmt)
+vect_mark_relevant (VEC(tree,heap) **worklist, tree stmt,
+ bool relevant_p, bool live_p)
{
- stmt_vec_info stmt_info;
+ stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
+ bool save_relevant_p = STMT_VINFO_RELEVANT_P (stmt_info);
+ bool save_live_p = STMT_VINFO_LIVE_P (stmt_info);
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
- fprintf (vect_dump, "mark relevant.");
+ fprintf (vect_dump, "mark relevant %d, live %d.",relevant_p, live_p);
- if (TREE_CODE (stmt) == PHI_NODE)
- {
- VEC_safe_push (tree, heap, *worklist, stmt);
- return;
- }
+ STMT_VINFO_LIVE_P (stmt_info) |= live_p;
- stmt_info = vinfo_for_stmt (stmt);
+ if (TREE_CODE (stmt) == PHI_NODE)
+ /* Don't mark as relevant because it's not going to vectorized. */
+ return;
- if (!stmt_info)
- {
- if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
- {
- fprintf (vect_dump, "mark relevant: no stmt info!!.");
- print_generic_expr (vect_dump, stmt, TDF_SLIM);
- }
- return;
- }
+ STMT_VINFO_RELEVANT_P (stmt_info) |= relevant_p;
- if (STMT_VINFO_RELEVANT_P (stmt_info))
+ if (STMT_VINFO_RELEVANT_P (stmt_info) == save_relevant_p
+ && STMT_VINFO_LIVE_P (stmt_info) == save_live_p)
{
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
- fprintf (vect_dump, "already marked relevant.");
+ fprintf (vect_dump, "already marked relevant/live.");
return;
}
- STMT_VINFO_RELEVANT_P (stmt_info) = 1;
VEC_safe_push (tree, heap, *worklist, stmt);
}
@@ -2100,7 +2180,8 @@ vect_mark_relevant (VEC(tree,heap) **worklist, tree stmt)
CHECKME: what other side effects would the vectorizer allow? */
static bool
-vect_stmt_relevant_p (tree stmt, loop_vec_info loop_vinfo)
+vect_stmt_relevant_p (tree stmt, loop_vec_info loop_vinfo,
+ bool *relevant_p, bool *live_p)
{
struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
ssa_op_iter op_iter;
@@ -2108,9 +2189,12 @@ vect_stmt_relevant_p (tree stmt, loop_vec_info loop_vinfo)
use_operand_p use_p;
def_operand_p def_p;
+ *relevant_p = false;
+ *live_p = false;
+
/* cond stmt other than loop exit cond. */
if (is_ctrl_stmt (stmt) && (stmt != LOOP_VINFO_EXIT_COND (loop_vinfo)))
- return true;
+ *relevant_p = true;
/* changing memory. */
if (TREE_CODE (stmt) != PHI_NODE)
@@ -2118,7 +2202,7 @@ vect_stmt_relevant_p (tree stmt, loop_vec_info loop_vinfo)
{
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
fprintf (vect_dump, "vec_stmt_relevant_p: stmt has vdefs.");
- return true;
+ *relevant_p = true;
}
/* uses outside the loop. */
@@ -2131,12 +2215,18 @@ vect_stmt_relevant_p (tree stmt, loop_vec_info loop_vinfo)
{
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
fprintf (vect_dump, "vec_stmt_relevant_p: used out of loop.");
- return true;
+
+ /* We expect all such uses to be in the loop exit phis
+ (because of loop closed form) */
+ gcc_assert (TREE_CODE (USE_STMT (use_p)) == PHI_NODE);
+ gcc_assert (bb == loop->single_exit->dest);
+
+ *live_p = true;
}
}
}
- return false;
+ return (*live_p || *relevant_p);
}
@@ -2165,16 +2255,23 @@ vect_mark_stmts_to_be_vectorized (loop_vec_info loop_vinfo)
unsigned int nbbs = loop->num_nodes;
block_stmt_iterator si;
tree stmt, use;
+ stmt_ann_t ann;
ssa_op_iter iter;
unsigned int i;
- int j;
- stmt_vec_info stmt_info;
+ stmt_vec_info stmt_vinfo;
basic_block bb;
tree phi;
+ bool relevant_p, live_p;
+ tree def, def_stmt;
+ enum vect_def_type dt;
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
fprintf (vect_dump, "=== vect_mark_stmts_to_be_vectorized ===");
+ worklist = VEC_alloc (tree, heap, 64);
+
+ /* 1. Init worklist. */
+
bb = loop->header;
for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
{
@@ -2184,19 +2281,10 @@ vect_mark_stmts_to_be_vectorized (loop_vec_info loop_vinfo)
print_generic_expr (vect_dump, phi, TDF_SLIM);
}
- if (vect_stmt_relevant_p (phi, loop_vinfo))
- {
- if (vect_print_dump_info (REPORT_UNVECTORIZED_LOOPS,
- LOOP_LOC (loop_vinfo)))
- fprintf (vect_dump, "unsupported reduction/induction.");
- return false;
- }
+ if (vect_stmt_relevant_p (phi, loop_vinfo, &relevant_p, &live_p))
+ vect_mark_relevant (&worklist, phi, relevant_p, live_p);
}
- worklist = VEC_alloc (tree, heap, 64);
-
- /* 1. Init worklist. */
-
for (i = 0; i < nbbs; i++)
{
bb = bbs[i];
@@ -2210,11 +2298,8 @@ vect_mark_stmts_to_be_vectorized (loop_vec_info loop_vinfo)
print_generic_expr (vect_dump, stmt, TDF_SLIM);
}
- stmt_info = vinfo_for_stmt (stmt);
- STMT_VINFO_RELEVANT_P (stmt_info) = 0;
-
- if (vect_stmt_relevant_p (stmt, loop_vinfo))
- vect_mark_relevant (&worklist, stmt);
+ if (vect_stmt_relevant_p (stmt, loop_vinfo, &relevant_p, &live_p))
+ vect_mark_relevant (&worklist, stmt, relevant_p, live_p);
}
}
@@ -2231,61 +2316,65 @@ vect_mark_stmts_to_be_vectorized (loop_vec_info loop_vinfo)
print_generic_expr (vect_dump, stmt, TDF_SLIM);
}
- /* Examine the USES in this statement. Mark all the statements which
- feed this statement's uses as "relevant", unless the USE is used as
- an array index. */
+ /* Examine the USEs of STMT. For each ssa-name USE thta is defined
+ in the loop, mark the stmt that defines it (DEF_STMT) as
+ relevant/irrelevant and live/dead according to the liveness and
+ relevance properties of STMT.
+ */
- if (TREE_CODE (stmt) == PHI_NODE)
- {
- /* follow the def-use chain inside the loop. */
- for (j = 0; j < PHI_NUM_ARGS (stmt); j++)
- {
- tree arg = PHI_ARG_DEF (stmt, j);
- tree def_stmt = NULL_TREE;
- basic_block bb;
- if (!vect_is_simple_use (arg, loop_vinfo, &def_stmt))
- {
- if (vect_print_dump_info (REPORT_UNVECTORIZED_LOOPS,
- LOOP_LOC (loop_vinfo)))
- fprintf (vect_dump, "not vectorized: unsupported use in stmt.");
- VEC_free (tree, heap, worklist);
- return false;
- }
- if (!def_stmt)
- continue;
+ gcc_assert (TREE_CODE (stmt) != PHI_NODE);
- if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
- {
- fprintf (vect_dump, "worklist: def_stmt: ");
- print_generic_expr (vect_dump, def_stmt, TDF_SLIM);
- }
+ ann = stmt_ann (stmt);
+ stmt_vinfo = vinfo_for_stmt (stmt);
- bb = bb_for_stmt (def_stmt);
- if (flow_bb_inside_loop_p (loop, bb))
- vect_mark_relevant (&worklist, def_stmt);
- }
- }
+ relevant_p = STMT_VINFO_RELEVANT_P (stmt_vinfo);
+ live_p = STMT_VINFO_LIVE_P (stmt_vinfo);
+
+ /* Generally, the liveness and relevance properties of STMT are
+ propagated to the DEF_STMTs of its USEs:
+ STMT_VINFO_LIVE_P (DEF_STMT_info) <-- live_p
+ STMT_VINFO_RELEVANT_P (DEF_STMT_info) <-- relevant_p
+
+ Exceptions:
+
+ - if USE is used only for address computations (e.g. array indexing),
+ which does not need to be directly vectorized, then the
+ liveness/relevance of the respective DEF_STMT is left unchanged.
+
+ - if STMT has been identified as defining a reduction variable, then:
+ STMT_VINFO_LIVE_P (DEF_STMT_info) <-- false
+ STMT_VINFO_RELEVANT_P (DEF_STMT_info) <-- true
+ because even though STMT is classified as live (since it defines a
+ value that is used across loop iterations) and irrelevant (since it
+ is not used inside the loop), it will be vectorized, and therefore
+ the corresponding DEF_STMTs need to marked as relevant.
+ */
+
+ if (STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_reduction_def)
+ {
+ gcc_assert (!relevant_p && live_p);
+ relevant_p = true;
+ live_p = false;
+ }
FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
{
-
/* We are only interested in uses that need to be vectorized. Uses
that are used for address computation are not considered relevant.
*/
if (exist_non_indexing_operands_for_use_p (use, stmt))
{
- tree def_stmt = NULL_TREE;
- basic_block bb;
- if (!vect_is_simple_use (use, loop_vinfo, &def_stmt))
+ if (!vect_is_simple_use (use, loop_vinfo, &def_stmt, &def, &dt))
{
if (vect_print_dump_info (REPORT_UNVECTORIZED_LOOPS,
LOOP_LOC (loop_vinfo)))
- fprintf (vect_dump, "not vectorized: unsupported use in stmt.");
+ fprintf (vect_dump,
+ "not vectorized: unsupported use in stmt.");
VEC_free (tree, heap, worklist);
return false;
}
- if (!def_stmt)
+ if (!def_stmt || IS_EMPTY_STMT (def_stmt))
continue;
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
@@ -2295,8 +2384,16 @@ vect_mark_stmts_to_be_vectorized (loop_vec_info loop_vinfo)
}
bb = bb_for_stmt (def_stmt);
- if (flow_bb_inside_loop_p (loop, bb))
- vect_mark_relevant (&worklist, def_stmt);
+ if (!flow_bb_inside_loop_p (loop, bb))
+ continue;
+
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ {
+ fprintf (vect_dump, "def_stmt: ");
+ print_generic_expr (vect_dump, def_stmt, TDF_SLIM);
+ }
+
+ vect_mark_relevant (&worklist, def_stmt, relevant_p, live_p);
}
}
} /* while worklist */
@@ -2324,6 +2421,9 @@ vect_can_advance_ivs_p (loop_vec_info loop_vinfo)
/* Analyze phi functions of the loop header. */
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ fprintf (vect_dump, "=== vect_can_advance_ivs_p ===");
+
for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
{
tree access_fn = NULL;
@@ -2366,7 +2466,11 @@ vect_can_advance_ivs_p (loop_vec_info loop_vinfo)
evolution_part = evolution_part_in_loop_num (access_fn, loop->num);
if (evolution_part == NULL_TREE)
- return false;
+ {
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ fprintf (vect_dump, "No evolution.");
+ return false;
+ }
/* FORNOW: We do not transform initial conditions of IVs
which evolution functions are a polynomial of degree >= 2. */
@@ -2466,7 +2570,7 @@ vect_analyze_loop_form (struct loop *loop)
if (!empty_block_p (loop->latch))
{
if (vect_print_dump_info (REPORT_BAD_FORM_LOOPS, loop_loc))
- fprintf (vect_dump, "not vectorized: unexpectd loop form.");
+ fprintf (vect_dump, "not vectorized: unexpected loop form.");
return NULL;
}
@@ -2583,6 +2687,11 @@ vect_analyze_loop (struct loop *loop)
return NULL;
}
+ /* Classify all cross-iteration scalar data-flow cycles.
+ Cross-iteration cycles caused by virtual phis are analyzed separately. */
+
+ vect_analyze_scalar_cycles (loop_vinfo);
+
/* Data-flow analysis to detect stmts that do not need to be vectorized. */
ok = vect_mark_stmts_to_be_vectorized (loop_vinfo);
@@ -2594,18 +2703,6 @@ vect_analyze_loop (struct loop *loop)
return NULL;
}
- /* Check that all cross-iteration scalar data-flow cycles are OK.
- Cross-iteration cycles caused by virtual phis are analyzed separately. */
-
- ok = vect_analyze_scalar_cycles (loop_vinfo);
- if (!ok)
- {
- if (vect_print_dump_info (REPORT_DETAILS, LOOP_LOC (loop_vinfo)))
- fprintf (vect_dump, "bad scalar cycle.");
- destroy_loop_vec_info (loop_vinfo);
- return NULL;
- }
-
ok = vect_determine_vectorization_factor (loop_vinfo);
if (!ok)
{
diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c
new file mode 100644
index 00000000000..2da1ed2e936
--- /dev/null
+++ b/gcc/tree-vect-generic.c
@@ -0,0 +1,531 @@
+/* Lower vector operations to scalar operations.
+ Copyright (C) 2004, 2005 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. */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "tree.h"
+#include "tm.h"
+#include "rtl.h"
+#include "expr.h"
+#include "insn-codes.h"
+#include "diagnostic.h"
+#include "optabs.h"
+#include "machmode.h"
+#include "langhooks.h"
+#include "tree-flow.h"
+#include "tree-gimple.h"
+#include "tree-iterator.h"
+#include "tree-pass.h"
+#include "flags.h"
+#include "ggc.h"
+
+
+/* Build a constant of type TYPE, made of VALUE's bits replicated
+ every TYPE_SIZE (INNER_TYPE) bits to fit TYPE's precision. */
+static tree
+build_replicated_const (tree type, tree inner_type, HOST_WIDE_INT value)
+{
+ int width = tree_low_cst (TYPE_SIZE (inner_type), 1);
+ int n = HOST_BITS_PER_WIDE_INT / width;
+ unsigned HOST_WIDE_INT low, high, mask;
+ tree ret;
+
+ gcc_assert (n);
+
+ if (width == HOST_BITS_PER_WIDE_INT)
+ low = value;
+ else
+ {
+ mask = ((HOST_WIDE_INT)1 << width) - 1;
+ low = (unsigned HOST_WIDE_INT) ~0 / mask * (value & mask);
+ }
+
+ if (TYPE_PRECISION (type) < HOST_BITS_PER_WIDE_INT)
+ low &= ((HOST_WIDE_INT)1 << TYPE_PRECISION (type)) - 1, high = 0;
+ else if (TYPE_PRECISION (type) == HOST_BITS_PER_WIDE_INT)
+ high = 0;
+ else if (TYPE_PRECISION (type) == 2 * HOST_BITS_PER_WIDE_INT)
+ high = low;
+ else
+ gcc_unreachable ();
+
+ ret = build_int_cst_wide (type, low, high);
+ return ret;
+}
+
+static GTY(()) tree vector_inner_type;
+static GTY(()) tree vector_last_type;
+static GTY(()) int vector_last_nunits;
+
+/* Return a suitable vector types made of SUBPARTS units each of mode
+ "word_mode" (the global variable). */
+static tree
+build_word_mode_vector_type (int nunits)
+{
+ if (!vector_inner_type)
+ vector_inner_type = lang_hooks.types.type_for_mode (word_mode, 1);
+ else if (vector_last_nunits == nunits)
+ {
+ gcc_assert (TREE_CODE (vector_last_type) == VECTOR_TYPE);
+ return vector_last_type;
+ }
+
+ /* We build a new type, but we canonicalize it nevertheless,
+ because it still saves some memory. */
+ vector_last_nunits = nunits;
+ vector_last_type = type_hash_canon (nunits,
+ build_vector_type (vector_inner_type,
+ nunits));
+ return vector_last_type;
+}
+
+typedef tree (*elem_op_func) (block_stmt_iterator *,
+ tree, tree, tree, tree, tree, enum tree_code);
+
+static inline tree
+tree_vec_extract (block_stmt_iterator *bsi, tree type,
+ tree t, tree bitsize, tree bitpos)
+{
+ if (bitpos)
+ return gimplify_build3 (bsi, BIT_FIELD_REF, type, t, bitsize, bitpos);
+
+ /* Build a conversion; VIEW_CONVERT_EXPR is very expensive unless T will
+ anyway be stored in memory, so prefer NOP_EXPR. */
+ else if (TYPE_MODE (type) == BLKmode)
+ return gimplify_build1 (bsi, VIEW_CONVERT_EXPR, type, t);
+ else
+ return gimplify_build1 (bsi, NOP_EXPR, type, t);
+}
+
+static tree
+do_unop (block_stmt_iterator *bsi, tree inner_type, tree a,
+ tree b ATTRIBUTE_UNUSED, tree bitpos, tree bitsize,
+ enum tree_code code)
+{
+ a = tree_vec_extract (bsi, inner_type, a, bitsize, bitpos);
+ return gimplify_build1 (bsi, code, inner_type, a);
+}
+
+static tree
+do_binop (block_stmt_iterator *bsi, tree inner_type, tree a, tree b,
+ tree bitpos, tree bitsize, enum tree_code code)
+{
+ a = tree_vec_extract (bsi, inner_type, a, bitsize, bitpos);
+ b = tree_vec_extract (bsi, inner_type, b, bitsize, bitpos);
+ return gimplify_build2 (bsi, code, inner_type, a, b);
+}
+
+/* Expand vector addition to scalars. This does bit twiddling
+ in order to increase parallelism:
+
+ a + b = (((int) a & 0x7f7f7f7f) + ((int) b & 0x7f7f7f7f)) ^
+ (a ^ b) & 0x80808080
+
+ a - b = (((int) a | 0x80808080) - ((int) b & 0x7f7f7f7f)) ^
+ (a ^ ~b) & 0x80808080
+
+ -b = (0x80808080 - ((int) b & 0x7f7f7f7f)) ^ (~b & 0x80808080)
+
+ This optimization should be done only if 4 vector items or more
+ fit into a word. */
+static tree
+do_plus_minus (block_stmt_iterator *bsi, tree word_type, tree a, tree b,
+ tree bitpos ATTRIBUTE_UNUSED, tree bitsize ATTRIBUTE_UNUSED,
+ enum tree_code code)
+{
+ tree inner_type = TREE_TYPE (TREE_TYPE (a));
+ unsigned HOST_WIDE_INT max;
+ tree low_bits, high_bits, a_low, b_low, result_low, signs;
+
+ max = GET_MODE_MASK (TYPE_MODE (inner_type));
+ low_bits = build_replicated_const (word_type, inner_type, max >> 1);
+ high_bits = build_replicated_const (word_type, inner_type, max & ~(max >> 1));
+
+ a = tree_vec_extract (bsi, word_type, a, bitsize, bitpos);
+ b = tree_vec_extract (bsi, word_type, b, bitsize, bitpos);
+
+ signs = gimplify_build2 (bsi, BIT_XOR_EXPR, word_type, a, b);
+ b_low = gimplify_build2 (bsi, BIT_AND_EXPR, word_type, b, low_bits);
+ if (code == PLUS_EXPR)
+ a_low = gimplify_build2 (bsi, BIT_AND_EXPR, word_type, a, low_bits);
+ else
+ {
+ a_low = gimplify_build2 (bsi, BIT_IOR_EXPR, word_type, a, high_bits);
+ signs = gimplify_build1 (bsi, BIT_NOT_EXPR, word_type, signs);
+ }
+
+ signs = gimplify_build2 (bsi, BIT_AND_EXPR, word_type, signs, high_bits);
+ result_low = gimplify_build2 (bsi, code, word_type, a_low, b_low);
+ return gimplify_build2 (bsi, BIT_XOR_EXPR, word_type, result_low, signs);
+}
+
+static tree
+do_negate (block_stmt_iterator *bsi, tree word_type, tree b,
+ tree unused ATTRIBUTE_UNUSED, tree bitpos ATTRIBUTE_UNUSED,
+ tree bitsize ATTRIBUTE_UNUSED,
+ enum tree_code code ATTRIBUTE_UNUSED)
+{
+ tree inner_type = TREE_TYPE (TREE_TYPE (b));
+ HOST_WIDE_INT max;
+ tree low_bits, high_bits, b_low, result_low, signs;
+
+ max = GET_MODE_MASK (TYPE_MODE (inner_type));
+ low_bits = build_replicated_const (word_type, inner_type, max >> 1);
+ high_bits = build_replicated_const (word_type, inner_type, max & ~(max >> 1));
+
+ b = tree_vec_extract (bsi, word_type, b, bitsize, bitpos);
+
+ b_low = gimplify_build2 (bsi, BIT_AND_EXPR, word_type, b, low_bits);
+ signs = gimplify_build1 (bsi, BIT_NOT_EXPR, word_type, b);
+ signs = gimplify_build2 (bsi, BIT_AND_EXPR, word_type, signs, high_bits);
+ result_low = gimplify_build2 (bsi, MINUS_EXPR, word_type, high_bits, b_low);
+ return gimplify_build2 (bsi, BIT_XOR_EXPR, word_type, result_low, signs);
+}
+
+/* Expand a vector operation to scalars, by using many operations
+ whose type is the vector type's inner type. */
+static tree
+expand_vector_piecewise (block_stmt_iterator *bsi, elem_op_func f,
+ tree type, tree inner_type,
+ tree a, tree b, enum tree_code code)
+{
+ tree head, *chain = &head;
+ tree part_width = TYPE_SIZE (inner_type);
+ tree index = bitsize_int (0);
+ int nunits = TYPE_VECTOR_SUBPARTS (type);
+ int delta = tree_low_cst (part_width, 1)
+ / tree_low_cst (TYPE_SIZE (TREE_TYPE (type)), 1);
+ int i;
+
+ for (i = 0; i < nunits;
+ i += delta, index = int_const_binop (PLUS_EXPR, index, part_width, 0))
+ {
+ tree result = f (bsi, inner_type, a, b, index, part_width, code);
+ *chain = tree_cons (NULL_TREE, result, NULL_TREE);
+ chain = &TREE_CHAIN (*chain);
+ }
+
+ return build1 (CONSTRUCTOR, type, head);
+}
+
+/* Expand a vector operation to scalars with the freedom to use
+ a scalar integer type, or to use a different size for the items
+ in the vector type. */
+static tree
+expand_vector_parallel (block_stmt_iterator *bsi, elem_op_func f, tree type,
+ tree a, tree b,
+ enum tree_code code)
+{
+ tree result, compute_type;
+ enum machine_mode mode;
+ int n_words = tree_low_cst (TYPE_SIZE_UNIT (type), 1) / UNITS_PER_WORD;
+
+ /* We have three strategies. If the type is already correct, just do
+ the operation an element at a time. Else, if the vector is wider than
+ one word, do it a word at a time; finally, if the vector is smaller
+ than one word, do it as a scalar. */
+ if (TYPE_MODE (TREE_TYPE (type)) == word_mode)
+ return expand_vector_piecewise (bsi, f,
+ type, TREE_TYPE (type),
+ a, b, code);
+ else if (n_words > 1)
+ {
+ tree word_type = build_word_mode_vector_type (n_words);
+ result = expand_vector_piecewise (bsi, f,
+ word_type, TREE_TYPE (word_type),
+ a, b, code);
+ result = gimplify_val (bsi, word_type, result);
+ }
+ else
+ {
+ /* Use a single scalar operation with a mode no wider than word_mode. */
+ mode = mode_for_size (tree_low_cst (TYPE_SIZE (type), 1), MODE_INT, 0);
+ compute_type = lang_hooks.types.type_for_mode (mode, 1);
+ result = f (bsi, compute_type, a, b, NULL_TREE, NULL_TREE, code);
+ }
+
+ return result;
+}
+
+/* Expand a vector operation to scalars; for integer types we can use
+ special bit twiddling tricks to do the sums a word at a time, using
+ function F_PARALLEL instead of F. These tricks are done only if
+ they can process at least four items, that is, only if the vector
+ holds at least four items and if a word can hold four items. */
+static tree
+expand_vector_addition (block_stmt_iterator *bsi,
+ elem_op_func f, elem_op_func f_parallel,
+ tree type, tree a, tree b, enum tree_code code)
+{
+ int parts_per_word = UNITS_PER_WORD
+ / tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (type)), 1);
+
+ if (INTEGRAL_TYPE_P (TREE_TYPE (type))
+ && parts_per_word >= 4
+ && TYPE_VECTOR_SUBPARTS (type) >= 4)
+ return expand_vector_parallel (bsi, f_parallel,
+ type, a, b, code);
+ else
+ return expand_vector_piecewise (bsi, f,
+ type, TREE_TYPE (type),
+ a, b, code);
+}
+
+static tree
+expand_vector_operation (block_stmt_iterator *bsi, tree type, tree compute_type,
+ tree rhs, enum tree_code code)
+{
+ enum machine_mode compute_mode = TYPE_MODE (compute_type);
+
+ /* If the compute mode is not a vector mode (hence we are not decomposing
+ a BLKmode vector to smaller, hardware-supported vectors), we may want
+ to expand the operations in parallel. */
+ if (GET_MODE_CLASS (compute_mode) != MODE_VECTOR_INT
+ && GET_MODE_CLASS (compute_mode) != MODE_VECTOR_FLOAT)
+ switch (code)
+ {
+ case PLUS_EXPR:
+ case MINUS_EXPR:
+ if (!TYPE_TRAP_SIGNED (type))
+ return expand_vector_addition (bsi, do_binop, do_plus_minus, type,
+ TREE_OPERAND (rhs, 0),
+ TREE_OPERAND (rhs, 1), code);
+ break;
+
+ case NEGATE_EXPR:
+ if (!TYPE_TRAP_SIGNED (type))
+ return expand_vector_addition (bsi, do_unop, do_negate, type,
+ TREE_OPERAND (rhs, 0),
+ NULL_TREE, code);
+ break;
+
+ case BIT_AND_EXPR:
+ case BIT_IOR_EXPR:
+ case BIT_XOR_EXPR:
+ return expand_vector_parallel (bsi, do_binop, type,
+ TREE_OPERAND (rhs, 0),
+ TREE_OPERAND (rhs, 1), code);
+
+ case BIT_NOT_EXPR:
+ return expand_vector_parallel (bsi, do_unop, type,
+ TREE_OPERAND (rhs, 0),
+ NULL_TREE, code);
+
+ default:
+ break;
+ }
+
+ if (TREE_CODE_CLASS (code) == tcc_unary)
+ return expand_vector_piecewise (bsi, do_unop, type, compute_type,
+ TREE_OPERAND (rhs, 0),
+ NULL_TREE, code);
+ else
+ return expand_vector_piecewise (bsi, do_binop, type, compute_type,
+ TREE_OPERAND (rhs, 0),
+ TREE_OPERAND (rhs, 1), code);
+}
+
+/* Return a type for the widest vector mode whose components are of mode
+ INNER_MODE, or NULL_TREE if none is found. */
+static tree
+type_for_widest_vector_mode (enum machine_mode inner_mode, optab op)
+{
+ enum machine_mode best_mode = VOIDmode, mode;
+ int best_nunits = 0;
+
+ if (GET_MODE_CLASS (inner_mode) == MODE_FLOAT)
+ mode = MIN_MODE_VECTOR_FLOAT;
+ else
+ mode = MIN_MODE_VECTOR_INT;
+
+ for (; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
+ if (GET_MODE_INNER (mode) == inner_mode
+ && GET_MODE_NUNITS (mode) > best_nunits
+ && op->handlers[mode].insn_code != CODE_FOR_nothing)
+ best_mode = mode, best_nunits = GET_MODE_NUNITS (mode);
+
+ if (best_mode == VOIDmode)
+ return NULL_TREE;
+ else
+ return lang_hooks.types.type_for_mode (best_mode, 1);
+}
+
+/* Process one statement. If we identify a vector operation, expand it. */
+
+static void
+expand_vector_operations_1 (block_stmt_iterator *bsi)
+{
+ tree stmt = bsi_stmt (*bsi);
+ tree *p_lhs, *p_rhs, lhs, rhs, type, compute_type;
+ enum tree_code code;
+ enum machine_mode compute_mode;
+ optab op;
+
+ switch (TREE_CODE (stmt))
+ {
+ case RETURN_EXPR:
+ stmt = TREE_OPERAND (stmt, 0);
+ if (!stmt || TREE_CODE (stmt) != MODIFY_EXPR)
+ return;
+
+ /* FALLTHRU */
+
+ case MODIFY_EXPR:
+ p_lhs = &TREE_OPERAND (stmt, 0);
+ p_rhs = &TREE_OPERAND (stmt, 1);
+ lhs = *p_lhs;
+ rhs = *p_rhs;
+ break;
+
+ default:
+ return;
+ }
+
+ type = TREE_TYPE (rhs);
+ if (TREE_CODE (type) != VECTOR_TYPE)
+ return;
+
+ code = TREE_CODE (rhs);
+ if (TREE_CODE_CLASS (code) != tcc_unary
+ && TREE_CODE_CLASS (code) != tcc_binary)
+ return;
+
+ if (code == NOP_EXPR || code == VIEW_CONVERT_EXPR)
+ return;
+
+ gcc_assert (code != CONVERT_EXPR);
+ op = optab_for_tree_code (code, type);
+
+ /* Optabs will try converting a negation into a subtraction, so
+ look for it as well. TODO: negation of floating-point vectors
+ might be turned into an exclusive OR toggling the sign bit. */
+ if (op == NULL
+ && code == NEGATE_EXPR
+ && INTEGRAL_TYPE_P (TREE_TYPE (type)))
+ op = optab_for_tree_code (MINUS_EXPR, type);
+
+ /* For very wide vectors, try using a smaller vector mode. */
+ compute_type = type;
+ if (TYPE_MODE (type) == BLKmode && op)
+ {
+ tree vector_compute_type
+ = type_for_widest_vector_mode (TYPE_MODE (TREE_TYPE (type)), op);
+ if (vector_compute_type != NULL_TREE)
+ compute_type = vector_compute_type;
+ }
+
+ /* If we are breaking a BLKmode vector into smaller pieces,
+ type_for_widest_vector_mode has already looked into the optab,
+ so skip these checks. */
+ if (compute_type == type)
+ {
+ compute_mode = TYPE_MODE (compute_type);
+ if ((GET_MODE_CLASS (compute_mode) == MODE_VECTOR_INT
+ || GET_MODE_CLASS (compute_mode) == MODE_VECTOR_FLOAT)
+ && op != NULL
+ && op->handlers[compute_mode].insn_code != CODE_FOR_nothing)
+ return;
+ else
+ /* There is no operation in hardware, so fall back to scalars. */
+ compute_type = TREE_TYPE (type);
+ }
+
+ rhs = expand_vector_operation (bsi, type, compute_type, rhs, code);
+ if (lang_hooks.types_compatible_p (TREE_TYPE (lhs), TREE_TYPE (rhs)))
+ *p_rhs = rhs;
+ else
+ {
+ /* Build a conversion; VIEW_CONVERT_EXPR is very expensive unless T will
+ be stored in memory anyway, so prefer NOP_EXPR. We should also try
+ performing the VIEW_CONVERT_EXPR on the left side of the
+ assignment. */
+ if (TYPE_MODE (TREE_TYPE (rhs)) == BLKmode)
+ *p_rhs = gimplify_build1 (bsi, VIEW_CONVERT_EXPR, TREE_TYPE (lhs), rhs);
+ else
+ *p_rhs = gimplify_build1 (bsi, NOP_EXPR, TREE_TYPE (lhs), rhs);
+ }
+
+ mark_stmt_modified (bsi_stmt (*bsi));
+}
+
+/* Use this to lower vector operations introduced by the vectorizer,
+ if it may need the bit-twiddling tricks implemented in this file. */
+
+static bool
+gate_expand_vector_operations (void)
+{
+ return flag_tree_vectorize != 0;
+}
+
+static void
+expand_vector_operations (void)
+{
+ block_stmt_iterator bsi;
+ basic_block bb;
+
+ FOR_EACH_BB (bb)
+ {
+ for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
+ {
+ expand_vector_operations_1 (&bsi);
+ update_stmt_if_modified (bsi_stmt (bsi));
+ }
+ }
+}
+
+struct tree_opt_pass pass_lower_vector =
+{
+ "veclower", /* name */
+ 0, /* gate */
+ expand_vector_operations, /* execute */
+ NULL, /* sub */
+ NULL, /* next */
+ 0, /* static_pass_number */
+ 0, /* tv_id */
+ PROP_cfg, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ TODO_dump_func | TODO_ggc_collect
+ | TODO_verify_stmts, /* todo_flags_finish */
+ 0 /* letter */
+};
+
+struct tree_opt_pass pass_lower_vector_ssa =
+{
+ "veclower2", /* name */
+ gate_expand_vector_operations, /* gate */
+ expand_vector_operations, /* execute */
+ NULL, /* sub */
+ NULL, /* next */
+ 0, /* static_pass_number */
+ 0, /* tv_id */
+ PROP_cfg, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ TODO_dump_func | TODO_update_ssa /* todo_flags_finish */
+ | TODO_verify_ssa
+ | TODO_verify_stmts | TODO_verify_flow,
+ 0 /* letter */
+};
+
+#include "gt-tree-vect-generic.h"
diff --git a/gcc/tree-vect-transform.c b/gcc/tree-vect-transform.c
index 17d65897cdb..116f01a5fe4 100644
--- a/gcc/tree-vect-transform.c
+++ b/gcc/tree-vect-transform.c
@@ -23,7 +23,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
#include "tree.h"
#include "target.h"
@@ -146,7 +145,7 @@ vect_create_index_for_vector_ref (loop_vec_info loop_vinfo)
create_iv (init, step, NULL_TREE, loop, &incr_bsi, insert_after,
&indx_before_incr, &indx_after_incr);
incr = bsi_stmt (incr_bsi);
- set_stmt_info (stmt_ann (incr), new_stmt_vec_info (incr, loop_vinfo));
+ set_stmt_info ((tree_ann_t)stmt_ann (incr), new_stmt_vec_info (incr, loop_vinfo));
return indx_before_incr;
}
@@ -231,7 +230,7 @@ vect_create_addr_base_for_vector_ref (tree stmt,
/* Function vect_align_data_ref.
- Handle mislignment of a memory accesses.
+ Handle misalignment of a memory accesses.
FORNOW: Can't handle misaligned accesses.
Make sure that the dataref is aligned. */
@@ -350,16 +349,13 @@ vect_create_data_ref_ptr (tree stmt, block_stmt_iterator *bsi, tree offset,
tag = STMT_VINFO_MEMTAG (stmt_info);
gcc_assert (tag);
- /* If the memory tag of the original reference was not a type tag or
- if the pointed-to type of VECT_PTR has an alias set number
- different than TAG's, then we need to create a new type tag for
- VECT_PTR and add TAG to its alias set. */
- if (var_ann (tag)->mem_tag_kind == NOT_A_TAG
- || get_alias_set (tag) != get_alias_set (TREE_TYPE (vect_ptr_type)))
- add_type_alias (vect_ptr, tag);
+ /* If tag is a variable (and NOT_A_TAG) than a new type alias
+ tag must be created with tag added to its may alias list. */
+ if (var_ann (tag)->mem_tag_kind == NOT_A_TAG)
+ new_type_alias (vect_ptr, tag);
else
var_ann (vect_ptr)->type_mem_tag = tag;
-
+
var_ann (vect_ptr)->subvars = STMT_VINFO_SUBVARS (stmt_info);
/** (3) Calculate the initial address the vector-pointer, and set
@@ -516,12 +512,13 @@ vect_get_vec_def_for_operand (tree op, tree stmt)
tree vectype = STMT_VINFO_VECTYPE (stmt_vinfo);
int nunits = TYPE_VECTOR_SUBPARTS (vectype);
loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_vinfo);
- struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
- basic_block bb;
tree vec_inv;
+ tree vec_cst;
tree t = NULL_TREE;
tree def;
int i;
+ enum vect_def_type dt;
+ bool is_simple_use;
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
{
@@ -529,103 +526,80 @@ vect_get_vec_def_for_operand (tree op, tree stmt)
print_generic_expr (vect_dump, op, TDF_SLIM);
}
- /** ===> Case 1: operand is a constant. **/
-
- if (TREE_CODE (op) == INTEGER_CST || TREE_CODE (op) == REAL_CST)
+ is_simple_use = vect_is_simple_use (op, loop_vinfo, &def_stmt, &def, &dt);
+ gcc_assert (is_simple_use);
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
{
- /* Create 'vect_cst_ = {cst,cst,...,cst}' */
-
- tree vec_cst;
-
- /* Build a tree with vector elements. */
- if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
- fprintf (vect_dump, "Create vector_cst. nunits = %d", nunits);
-
- for (i = nunits - 1; i >= 0; --i)
+ if (def)
{
- t = tree_cons (NULL_TREE, op, t);
+ fprintf (vect_dump, "def = ");
+ print_generic_expr (vect_dump, def, TDF_SLIM);
+ }
+ if (def_stmt)
+ {
+ fprintf (vect_dump, " def_stmt = ");
+ print_generic_expr (vect_dump, def_stmt, TDF_SLIM);
}
- vec_cst = build_vector (vectype, t);
- return vect_init_vector (stmt, vec_cst);
- }
-
- gcc_assert (TREE_CODE (op) == SSA_NAME);
-
- /** ===> Case 2: operand is an SSA_NAME - find the stmt that defines it. **/
-
- def_stmt = SSA_NAME_DEF_STMT (op);
- def_stmt_info = vinfo_for_stmt (def_stmt);
-
- if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
- {
- fprintf (vect_dump, "vect_get_vec_def_for_operand: def_stmt: ");
- print_generic_expr (vect_dump, def_stmt, TDF_SLIM);
- }
-
-
- /** ==> Case 2.1: operand is defined inside the loop. **/
-
- if (def_stmt_info)
- {
- /* Get the def from the vectorized stmt. */
-
- vec_stmt = STMT_VINFO_VEC_STMT (def_stmt_info);
- gcc_assert (vec_stmt);
- vec_oprnd = TREE_OPERAND (vec_stmt, 0);
- return vec_oprnd;
}
+ /* FORNOW */
+ gcc_assert (dt != vect_reduction_def);
- /** ==> Case 2.2: operand is defined by the loop-header phi-node -
- it is a reduction/induction. **/
-
- bb = bb_for_stmt (def_stmt);
- if (TREE_CODE (def_stmt) == PHI_NODE && flow_bb_inside_loop_p (loop, bb))
+ switch (dt)
{
- if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
- fprintf (vect_dump, "reduction/induction - unsupported.");
- internal_error ("no support for reduction/induction"); /* FORNOW */
- }
-
+ /* Case 1: operand is a constant. */
+ case vect_constant_def:
+ {
+ /* Create 'vect_cst_ = {cst,cst,...,cst}' */
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ fprintf (vect_dump, "Create vector_cst. nunits = %d", nunits);
+
+ for (i = nunits - 1; i >= 0; --i)
+ {
+ t = tree_cons (NULL_TREE, op, t);
+ }
+ vec_cst = build_vector (vectype, t);
+ return vect_init_vector (stmt, vec_cst);
+ }
+
+ /* Case 2: operand is defined outside the loop - loop invariant. */
+ case vect_invariant_def:
+ {
+ /* Create 'vec_inv = {inv,inv,..,inv}' */
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ fprintf (vect_dump, "Create vector_inv.");
+
+ for (i = nunits - 1; i >= 0; --i)
+ {
+ t = tree_cons (NULL_TREE, def, t);
+ }
+
+ vec_inv = build_constructor (vectype, t);
+ return vect_init_vector (stmt, vec_inv);
+ }
+
+ /* Case 3: operand is defined inside the loop. */
+ case vect_loop_def:
+ {
+ /* Get the def from the vectorized stmt. */
+ def_stmt_info = vinfo_for_stmt (def_stmt);
+ vec_stmt = STMT_VINFO_VEC_STMT (def_stmt_info);
+ gcc_assert (vec_stmt);
+ vec_oprnd = TREE_OPERAND (vec_stmt, 0);
+ return vec_oprnd;
+ }
+
+ /* Case 4: operand is defined by loop-header phi - induction. */
+ case vect_induction_def:
+ {
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ fprintf (vect_dump, "induction - unsupported.");
+ internal_error ("no support for induction"); /* FORNOW */
+ }
- /** ==> Case 2.3: operand is defined outside the loop -
- it is a loop invariant. */
-
- switch (TREE_CODE (def_stmt))
- {
- case PHI_NODE:
- def = PHI_RESULT (def_stmt);
- break;
- case MODIFY_EXPR:
- def = TREE_OPERAND (def_stmt, 0);
- break;
- case NOP_EXPR:
- def = TREE_OPERAND (def_stmt, 0);
- gcc_assert (IS_EMPTY_STMT (def_stmt));
- def = op;
- break;
default:
- if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
- {
- fprintf (vect_dump, "unsupported defining stmt: ");
- print_generic_expr (vect_dump, def_stmt, TDF_SLIM);
- }
- internal_error ("unsupported defining stmt");
- }
-
- /* Build a tree with vector elements.
- Create 'vec_inv = {inv,inv,..,inv}' */
-
- if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
- fprintf (vect_dump, "Create vector_inv.");
-
- for (i = nunits - 1; i >= 0; --i)
- {
- t = tree_cons (NULL_TREE, def, t);
+ gcc_unreachable ();
}
-
- vec_inv = build_constructor (vectype, t);
- return vect_init_vector (stmt, vec_inv);
}
@@ -675,8 +649,14 @@ vectorizable_assignment (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
tree vectype = STMT_VINFO_VECTYPE (stmt_info);
loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info);
tree new_temp;
+ tree def, def_stmt;
+ enum vect_def_type dt;
/* Is vectorizable assignment? */
+ if (!STMT_VINFO_RELEVANT_P (stmt_info))
+ return false;
+
+ gcc_assert (STMT_VINFO_DEF_TYPE (stmt_info) == vect_loop_def);
if (TREE_CODE (stmt) != MODIFY_EXPR)
return false;
@@ -686,7 +666,7 @@ vectorizable_assignment (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
return false;
op = TREE_OPERAND (stmt, 1);
- if (!vect_is_simple_use (op, loop_vinfo, NULL))
+ if (!vect_is_simple_use (op, loop_vinfo, &def_stmt, &def, &dt))
{
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
fprintf (vect_dump, "use not simple.");
@@ -746,6 +726,7 @@ vect_min_worthwhile_factor (enum tree_code code)
}
}
+
/* Function vectorizable_operation.
Check if STMT performs a binary or unary operation that can be vectorized.
@@ -771,8 +752,23 @@ vectorizable_operation (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
int op_type;
tree op;
optab optab;
+ tree def, def_stmt;
+ enum vect_def_type dt;
/* Is STMT a vectorizable binary/unary operation? */
+ if (!STMT_VINFO_RELEVANT_P (stmt_info))
+ return false;
+
+ gcc_assert (STMT_VINFO_DEF_TYPE (stmt_info) == vect_loop_def);
+
+ if (STMT_VINFO_LIVE_P (stmt_info))
+ {
+ /* FORNOW: not yet supported. */
+ if (vect_print_dump_info (REPORT_DETAILS, LOOP_LOC (loop_vinfo)))
+ fprintf (vect_dump, "value used after loop.");
+ return false;
+ }
+
if (TREE_CODE (stmt) != MODIFY_EXPR)
return false;
@@ -795,7 +791,7 @@ vectorizable_operation (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
for (i = 0; i < op_type; i++)
{
op = TREE_OPERAND (operation, i);
- if (!vect_is_simple_use (op, loop_vinfo, NULL))
+ if (!vect_is_simple_use (op, loop_vinfo, &def_stmt, &def, &dt))
{
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
fprintf (vect_dump, "use not simple.");
@@ -815,7 +811,12 @@ vectorizable_operation (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
{
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
fprintf (vect_dump, "op not supported by target.");
- return false;
+ if (GET_MODE_SIZE (vec_mode) != UNITS_PER_WORD
+ || LOOP_VINFO_VECT_FACTOR (loop_vinfo)
+ < vect_min_worthwhile_factor (code))
+ return false;
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ fprintf (vect_dump, "proceeding using word mode.");
}
/* Worthwhile without SIMD support? */
@@ -892,7 +893,8 @@ vectorizable_store (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
tree dummy;
enum dr_alignment_support alignment_support_cheme;
ssa_op_iter iter;
- tree def;
+ tree def, def_stmt;
+ enum vect_def_type dt;
/* Is vectorizable store? */
@@ -905,7 +907,7 @@ vectorizable_store (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
return false;
op = TREE_OPERAND (stmt, 1);
- if (!vect_is_simple_use (op, loop_vinfo, NULL))
+ if (!vect_is_simple_use (op, loop_vinfo, &def_stmt, &def, &dt))
{
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
fprintf (vect_dump, "use not simple.");
@@ -950,16 +952,22 @@ vectorizable_store (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
*vec_stmt = build2 (MODIFY_EXPR, vectype, data_ref, vec_oprnd1);
vect_finish_stmt_generation (stmt, *vec_stmt, bsi);
- /* Mark all non-SSA variables in the statement for rewriting. */
- mark_new_vars_to_rename (*vec_stmt);
-
- /* The new vectorized statement will have better aliasing
- information, so some of the virtual definitions of the old
- statement will likely disappear from the IL. Mark them to have
- their SSA form updated. */
+ /* Copy the V_MAY_DEFS representing the aliasing of the original array
+ element's definition to the vector's definition then update the
+ defining statement. The original is being deleted so the same
+ SSA_NAMEs can be used. */
+ copy_virtual_operands (*vec_stmt, stmt);
+
FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_VMAYDEF)
- mark_sym_for_renaming (SSA_NAME_VAR (def));
-
+ {
+ SSA_NAME_DEF_STMT (def) = *vec_stmt;
+
+ /* If this virtual def has a use outside the loop and a loop peel is
+ performed then the def may be renamed by the peel. Mark it for
+ renaming so the later use will also be renamed. */
+ mark_sym_for_renaming (SSA_NAME_VAR (def));
+ }
+
return true;
}
@@ -994,6 +1002,18 @@ vectorizable_load (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
enum dr_alignment_support alignment_support_cheme;
/* Is vectorizable load? */
+ if (!STMT_VINFO_RELEVANT_P (stmt_info))
+ return false;
+
+ gcc_assert (STMT_VINFO_DEF_TYPE (stmt_info) == vect_loop_def);
+
+ if (STMT_VINFO_LIVE_P (stmt_info))
+ {
+ /* FORNOW: not yet supported. */
+ if (vect_print_dump_info (REPORT_DETAILS, LOOP_LOC (loop_vinfo)))
+ fprintf (vect_dump, "value used after loop.");
+ return false;
+ }
if (TREE_CODE (stmt) != MODIFY_EXPR)
return false;
@@ -1173,6 +1193,64 @@ vectorizable_load (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
return true;
}
+
+/* Function vectorizable_live_operation.
+
+ STMT computes a value that is used outside the loop. Check if
+ it can be supported. */
+
+bool
+vectorizable_live_operation (tree stmt,
+ block_stmt_iterator *bsi ATTRIBUTE_UNUSED,
+ tree *vec_stmt ATTRIBUTE_UNUSED)
+{
+ tree operation;
+ stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
+ loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info);
+ int i;
+ enum tree_code code;
+ int op_type;
+ tree op;
+ tree def, def_stmt;
+ enum vect_def_type dt;
+
+ if (!STMT_VINFO_LIVE_P (stmt_info))
+ return false;
+
+ if (TREE_CODE (stmt) != MODIFY_EXPR)
+ return false;
+
+ if (TREE_CODE (TREE_OPERAND (stmt, 0)) != SSA_NAME)
+ return false;
+
+ operation = TREE_OPERAND (stmt, 1);
+ code = TREE_CODE (operation);
+
+ op_type = TREE_CODE_LENGTH (code);
+
+ /* FORNOW: support only if all uses are invariant. This means
+ that the scalar operations can remain in place, unvectorized.
+ The original last scalar value that they compute will be used. */
+
+ for (i = 0; i < op_type; i++)
+ {
+ op = TREE_OPERAND (operation, i);
+ if (!vect_is_simple_use (op, loop_vinfo, &def_stmt, &def, &dt))
+ {
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ fprintf (vect_dump, "use not simple.");
+ return false;
+ }
+
+ if (dt != vect_invariant_def && dt != vect_constant_def)
+ return false;
+ }
+
+ /* No transformation is required for the cases we currently support. */
+ return true;
+}
+
+
/* Function vect_is_simple_cond.
Input:
@@ -1186,6 +1264,8 @@ static bool
vect_is_simple_cond (tree cond, loop_vec_info loop_vinfo)
{
tree lhs, rhs;
+ tree def;
+ enum vect_def_type dt;
if (!COMPARISON_CLASS_P (cond))
return false;
@@ -1196,7 +1276,7 @@ vect_is_simple_cond (tree cond, loop_vec_info loop_vinfo)
if (TREE_CODE (lhs) == SSA_NAME)
{
tree lhs_def_stmt = SSA_NAME_DEF_STMT (lhs);
- if (!vect_is_simple_use (lhs, loop_vinfo, &lhs_def_stmt))
+ if (!vect_is_simple_use (lhs, loop_vinfo, &lhs_def_stmt, &def, &dt))
return false;
}
else if (TREE_CODE (lhs) != INTEGER_CST && TREE_CODE (lhs) != REAL_CST)
@@ -1205,7 +1285,7 @@ vect_is_simple_cond (tree cond, loop_vec_info loop_vinfo)
if (TREE_CODE (rhs) == SSA_NAME)
{
tree rhs_def_stmt = SSA_NAME_DEF_STMT (rhs);
- if (!vect_is_simple_use (rhs, loop_vinfo, &rhs_def_stmt))
+ if (!vect_is_simple_use (rhs, loop_vinfo, &rhs_def_stmt, &def, &dt))
return false;
}
else if (TREE_CODE (rhs) != INTEGER_CST && TREE_CODE (rhs) != REAL_CST)
@@ -1237,10 +1317,22 @@ vectorizable_condition (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
tree new_temp;
loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info);
enum machine_mode vec_mode;
+ tree def;
+ enum vect_def_type dt;
if (!STMT_VINFO_RELEVANT_P (stmt_info))
return false;
+ gcc_assert (STMT_VINFO_DEF_TYPE (stmt_info) == vect_loop_def);
+
+ if (STMT_VINFO_LIVE_P (stmt_info))
+ {
+ /* FORNOW: not yet supported. */
+ if (vect_print_dump_info (REPORT_DETAILS, LOOP_LOC (loop_vinfo)))
+ fprintf (vect_dump, "value used after loop.");
+ return false;
+ }
+
if (TREE_CODE (stmt) != MODIFY_EXPR)
return false;
@@ -1259,7 +1351,8 @@ vectorizable_condition (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
if (TREE_CODE (then_clause) == SSA_NAME)
{
tree then_def_stmt = SSA_NAME_DEF_STMT (then_clause);
- if (!vect_is_simple_use (then_clause, loop_vinfo, &then_def_stmt))
+ if (!vect_is_simple_use (then_clause, loop_vinfo,
+ &then_def_stmt, &def, &dt))
return false;
}
else if (TREE_CODE (then_clause) != INTEGER_CST
@@ -1269,7 +1362,8 @@ vectorizable_condition (tree stmt, block_stmt_iterator *bsi, tree *vec_stmt)
if (TREE_CODE (else_clause) == SSA_NAME)
{
tree else_def_stmt = SSA_NAME_DEF_STMT (else_clause);
- if (!vect_is_simple_use (else_clause, loop_vinfo, &else_def_stmt))
+ if (!vect_is_simple_use (else_clause, loop_vinfo,
+ &else_def_stmt, &def, &dt))
return false;
}
else if (TREE_CODE (else_clause) != INTEGER_CST
@@ -1325,43 +1419,52 @@ vect_transform_stmt (tree stmt, block_stmt_iterator *bsi)
stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
bool done;
- switch (STMT_VINFO_TYPE (stmt_info))
+ if (STMT_VINFO_RELEVANT_P (stmt_info))
{
- case op_vec_info_type:
- done = vectorizable_operation (stmt, bsi, &vec_stmt);
- gcc_assert (done);
- break;
-
- case assignment_vec_info_type:
- done = vectorizable_assignment (stmt, bsi, &vec_stmt);
- gcc_assert (done);
- break;
-
- case load_vec_info_type:
- done = vectorizable_load (stmt, bsi, &vec_stmt);
- gcc_assert (done);
- break;
-
- case store_vec_info_type:
- done = vectorizable_store (stmt, bsi, &vec_stmt);
- gcc_assert (done);
- is_store = true;
- break;
+ switch (STMT_VINFO_TYPE (stmt_info))
+ {
+ case op_vec_info_type:
+ done = vectorizable_operation (stmt, bsi, &vec_stmt);
+ gcc_assert (done);
+ break;
+
+ case assignment_vec_info_type:
+ done = vectorizable_assignment (stmt, bsi, &vec_stmt);
+ gcc_assert (done);
+ break;
+
+ case load_vec_info_type:
+ done = vectorizable_load (stmt, bsi, &vec_stmt);
+ gcc_assert (done);
+ break;
+
+ case store_vec_info_type:
+ done = vectorizable_store (stmt, bsi, &vec_stmt);
+ gcc_assert (done);
+ is_store = true;
+ break;
+
+ case condition_vec_info_type:
+ done = vectorizable_condition (stmt, bsi, &vec_stmt);
+ gcc_assert (done);
+ break;
+
+ default:
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ fprintf (vect_dump, "stmt not supported.");
+ gcc_unreachable ();
+ }
+
+ STMT_VINFO_VEC_STMT (stmt_info) = vec_stmt;
+ }
- case condition_vec_info_type:
- done = vectorizable_condition (stmt, bsi, &vec_stmt);
+ if (STMT_VINFO_LIVE_P (stmt_info))
+ {
+ done = vectorizable_live_operation (stmt, bsi, &vec_stmt);
gcc_assert (done);
- break;
-
- default:
- if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
- fprintf (vect_dump, "stmt not supported.");
- gcc_unreachable ();
}
- STMT_VINFO_VEC_STMT (stmt_info) = vec_stmt;
-
- return is_store;
+ return is_store;
}
@@ -1600,6 +1703,12 @@ vect_update_ivs_after_vectorizer (loop_vec_info loop_vinfo, tree niters,
tree var, stmt, ni, ni_name;
block_stmt_iterator last_bsi;
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ {
+ fprintf (vect_dump, "vect_update_ivs_after_vectorizer: phi: ");
+ print_generic_expr (vect_dump, phi, TDF_SLIM);
+ }
+
/* Skip virtual phi's. */
if (!is_gimple_reg (SSA_NAME_VAR (PHI_RESULT (phi))))
{
@@ -1667,7 +1776,7 @@ vect_do_peeling_for_loop_bound (loop_vec_info loop_vinfo, tree *ratio,
#endif
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
- fprintf (vect_dump, "=== vect_transtorm_for_unknown_loop_bound ===");
+ fprintf (vect_dump, "=== vect_do_peeling_for_loop_bound ===");
/* Generate the following variables on the preheader of original loop:
@@ -2014,7 +2123,7 @@ vect_transform_loop (loop_vec_info loop_vinfo,
/* Free the attached stmt_vec_info and remove the stmt. */
stmt_ann_t ann = stmt_ann (stmt);
free (stmt_info);
- set_stmt_info (ann, NULL);
+ set_stmt_info ((tree_ann_t)ann, NULL);
bsi_remove (&si);
continue;
}
diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c
index 95ecdd9fa97..1f612c5444c 100644
--- a/gcc/tree-vectorizer.c
+++ b/gcc/tree-vectorizer.c
@@ -124,7 +124,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "ggc.h"
#include "tree.h"
#include "target.h"
@@ -321,8 +320,11 @@ slpeel_update_phis_for_duplicate_loop (struct loop *orig_loop,
new_ssa_name = get_current_def (def);
if (!new_ssa_name)
- /* Something defined outside of the loop. */
- continue;
+ {
+ /* This only happens if there are no definitions
+ inside the loop. use the phi_result in this case. */
+ new_ssa_name = PHI_RESULT (phi_new);
+ }
/* An ordinary ssa name defined in the loop. */
add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop));
@@ -566,7 +568,12 @@ slpeel_update_phi_nodes_for_guard1 (edge guard_edge, struct loop *loop,
else
{
current_new_name = get_current_def (loop_arg);
- gcc_assert (current_new_name);
+ /* current_def is not available only if the variable does not
+ change inside the loop, in which case we also don't care
+ about recording a current_def for it because we won't be
+ trying to create loop-exit-phis for it. */
+ if (!current_new_name)
+ continue;
}
#ifdef ENABLE_CHECKING
gcc_assert (get_current_def (current_new_name) == NULL_TREE);
@@ -987,7 +994,7 @@ slpeel_verify_cfg_after_peeling (struct loop *first_loop,
/* 1. Verify that one of the successors of first_loopt->exit is the preheader
of second_loop. */
- /* The preheader of new_loop is expected to have two predessors:
+ /* The preheader of new_loop is expected to have two predecessors:
first_loop->exit and the block that precedes first_loop. */
gcc_assert (EDGE_COUNT (loop2_entry_bb->preds) == 2
@@ -1331,9 +1338,14 @@ new_stmt_vec_info (tree stmt, loop_vec_info loop_vinfo)
STMT_VINFO_STMT (res) = stmt;
STMT_VINFO_LOOP_VINFO (res) = loop_vinfo;
STMT_VINFO_RELEVANT_P (res) = 0;
+ STMT_VINFO_LIVE_P (res) = 0;
STMT_VINFO_VECTYPE (res) = NULL;
STMT_VINFO_VEC_STMT (res) = NULL;
STMT_VINFO_DATA_REF (res) = NULL;
+ if (TREE_CODE (stmt) == PHI_NODE)
+ STMT_VINFO_DEF_TYPE (res) = vect_unknown_def_type;
+ else
+ STMT_VINFO_DEF_TYPE (res) = vect_loop_def;
STMT_VINFO_MEMTAG (res) = NULL;
STMT_VINFO_PTR_INFO (res) = NULL;
STMT_VINFO_SUBVARS (res) = NULL;
@@ -1368,13 +1380,21 @@ new_loop_vec_info (struct loop *loop)
for (i = 0; i < loop->num_nodes; i++)
{
basic_block bb = bbs[i];
+ tree phi;
+
+ for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
+ {
+ tree_ann_t ann = get_tree_ann (phi);
+ set_stmt_info (ann, new_stmt_vec_info (phi, res));
+ }
+
for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
{
tree stmt = bsi_stmt (si);
stmt_ann_t ann;
ann = stmt_ann (stmt);
- set_stmt_info (ann, new_stmt_vec_info (stmt, res));
+ set_stmt_info ((tree_ann_t)ann, new_stmt_vec_info (stmt, res));
}
}
@@ -1421,13 +1441,30 @@ destroy_loop_vec_info (loop_vec_info loop_vinfo)
for (j = 0; j < nbbs; j++)
{
basic_block bb = bbs[j];
+ tree phi;
+ stmt_vec_info stmt_info;
+
+ for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
+ {
+ tree_ann_t ann = get_tree_ann (phi);
+
+ stmt_info = vinfo_for_stmt (phi);
+ free (stmt_info);
+ set_stmt_info (ann, NULL);
+ }
+
for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
{
tree stmt = bsi_stmt (si);
stmt_ann_t ann = stmt_ann (stmt);
stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
- free (stmt_info);
- set_stmt_info (ann, NULL);
+
+ if (stmt_info)
+ {
+ VEC_free (dr_p, heap, STMT_VINFO_SAME_ALIGN_REFS (stmt_info));
+ free (stmt_info);
+ set_stmt_info ((tree_ann_t)ann, NULL);
+ }
}
}
@@ -1589,64 +1626,148 @@ vect_supportable_dr_alignment (struct data_reference *dr)
in reduction/induction computations). */
bool
-vect_is_simple_use (tree operand, loop_vec_info loop_vinfo, tree *def)
+vect_is_simple_use (tree operand, loop_vec_info loop_vinfo, tree *def_stmt,
+ tree *def, enum vect_def_type *dt)
{
- tree def_stmt;
basic_block bb;
+ stmt_vec_info stmt_vinfo;
struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
- if (def)
- *def = NULL_TREE;
-
+ *def_stmt = NULL_TREE;
+ *def = NULL_TREE;
+
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ {
+ fprintf (vect_dump, "vect_is_simple_use: operand ");
+ print_generic_expr (vect_dump, operand, TDF_SLIM);
+ }
+
if (TREE_CODE (operand) == INTEGER_CST || TREE_CODE (operand) == REAL_CST)
- return true;
-
+ {
+ *dt = vect_constant_def;
+ return true;
+ }
+
if (TREE_CODE (operand) != SSA_NAME)
- return false;
-
- def_stmt = SSA_NAME_DEF_STMT (operand);
- if (def_stmt == NULL_TREE )
+ {
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ fprintf (vect_dump, "not ssa-name.");
+ return false;
+ }
+
+ *def_stmt = SSA_NAME_DEF_STMT (operand);
+ if (*def_stmt == NULL_TREE )
{
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
fprintf (vect_dump, "no def_stmt.");
return false;
}
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ {
+ fprintf (vect_dump, "def_stmt: ");
+ print_generic_expr (vect_dump, *def_stmt, TDF_SLIM);
+ }
+
/* empty stmt is expected only in case of a function argument.
(Otherwise - we expect a phi_node or a modify_expr). */
- if (IS_EMPTY_STMT (def_stmt))
+ if (IS_EMPTY_STMT (*def_stmt))
{
- tree arg = TREE_OPERAND (def_stmt, 0);
+ tree arg = TREE_OPERAND (*def_stmt, 0);
if (TREE_CODE (arg) == INTEGER_CST || TREE_CODE (arg) == REAL_CST)
- return true;
+ {
+ *def = operand;
+ *dt = vect_invariant_def;
+ return true;
+ }
+
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
- {
- fprintf (vect_dump, "Unexpected empty stmt: ");
- print_generic_expr (vect_dump, def_stmt, TDF_SLIM);
- }
- return false;
+ fprintf (vect_dump, "Unexpected empty stmt.");
+ return false;
}
- /* phi_node inside the loop indicates an induction/reduction pattern.
- This is not supported yet. */
- bb = bb_for_stmt (def_stmt);
- if (TREE_CODE (def_stmt) == PHI_NODE && flow_bb_inside_loop_p (loop, bb))
+ bb = bb_for_stmt (*def_stmt);
+ if (!flow_bb_inside_loop_p (loop, bb))
+ *dt = vect_invariant_def;
+ else
+ {
+ stmt_vinfo = vinfo_for_stmt (*def_stmt);
+ *dt = STMT_VINFO_DEF_TYPE (stmt_vinfo);
+ }
+
+ if (*dt == vect_unknown_def_type)
{
if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
- fprintf (vect_dump, "reduction/induction - unsupported.");
- return false; /* FORNOW: not supported yet. */
+ fprintf (vect_dump, "Unsupported pattern.");
+ return false;
}
- /* Expecting a modify_expr or a phi_node. */
- if (TREE_CODE (def_stmt) == MODIFY_EXPR
- || TREE_CODE (def_stmt) == PHI_NODE)
+ /* stmts inside the loop that have been identified as performing
+ a reduction operation cannot have uses in the loop. */
+ if (*dt == vect_reduction_def && TREE_CODE (*def_stmt) != PHI_NODE)
{
- if (def)
- *def = def_stmt;
- return true;
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ fprintf (vect_dump, "reduction used in loop.");
+ return false;
+ }
+
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ fprintf (vect_dump, "type of def: %d.",*dt);
+
+ switch (TREE_CODE (*def_stmt))
+ {
+ case PHI_NODE:
+ *def = PHI_RESULT (*def_stmt);
+ gcc_assert (*dt == vect_induction_def || *dt == vect_reduction_def
+ || *dt == vect_invariant_def);
+ break;
+
+ case MODIFY_EXPR:
+ *def = TREE_OPERAND (*def_stmt, 0);
+ gcc_assert (*dt == vect_loop_def || *dt == vect_invariant_def);
+ break;
+
+ default:
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ fprintf (vect_dump, "unsupported defining stmt: ");
+ return false;
}
- return false;
+ if (*dt == vect_induction_def)
+ {
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ fprintf (vect_dump, "induction not supported.");
+ return false;
+ }
+
+ return true;
+}
+
+
+/* Function vect_is_simple_reduction
+
+ TODO:
+ Detect a cross-iteration def-use cucle that represents a simple
+ reduction computation. We look for the following pattern:
+
+ loop_header:
+ a1 = phi < a0, a2 >
+ a3 = ...
+ a2 = operation (a3, a1)
+
+ such that:
+ 1. operation is...
+ 2. no uses for a2 in the loop (elsewhere) */
+
+tree
+vect_is_simple_reduction (struct loop *loop ATTRIBUTE_UNUSED,
+ tree phi ATTRIBUTE_UNUSED)
+{
+ /* FORNOW */
+ if (vect_print_dump_info (REPORT_DETAILS, UNKNOWN_LOC))
+ fprintf (vect_dump, "reduction: unknown pattern.");
+
+ return NULL_TREE;
}
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index 30a7830b675..332025b03e6 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -56,6 +56,16 @@ enum dr_alignment_support {
dr_aligned
};
+/* Define type of def-use cross-iteration cycle. */
+enum vect_def_type {
+ vect_constant_def,
+ vect_invariant_def,
+ vect_loop_def,
+ vect_induction_def,
+ vect_reduction_def,
+ vect_unknown_def_type
+};
+
/* Define verbosity levels. */
enum verbosity_levels {
REPORT_NONE,
@@ -148,6 +158,10 @@ enum stmt_vec_info_type {
condition_vec_info_type
};
+typedef struct data_reference *dr_p;
+DEF_VEC_P(dr_p);
+DEF_VEC_ALLOC_P(dr_p,heap);
+
typedef struct _stmt_vec_info {
enum stmt_vec_info_type type;
@@ -163,6 +177,10 @@ typedef struct _stmt_vec_info {
indicates whether the stmt needs to be vectorized. */
bool relevant;
+ /* Indicates whether this stmts is part of a computation whose result is
+ used outside the loop. */
+ bool live;
+
/* The vector type to be used. */
tree vectype;
@@ -215,6 +233,14 @@ typedef struct _stmt_vec_info {
/* Alignment information. The offset of the data-reference from its base
in bytes. */
tree misalignment;
+
+ /* List of datarefs that are known to have the same alignment as the dataref
+ of this stmt. */
+ VEC(dr_p,heap) *same_align_refs;
+
+ /* Classify the def of this stmt. */
+ enum vect_def_type def_type;
+
} *stmt_vec_info;
/* Access Functions. */
@@ -222,6 +248,7 @@ typedef struct _stmt_vec_info {
#define STMT_VINFO_STMT(S) (S)->stmt
#define STMT_VINFO_LOOP_VINFO(S) (S)->loop_vinfo
#define STMT_VINFO_RELEVANT_P(S) (S)->relevant
+#define STMT_VINFO_LIVE_P(S) (S)->live
#define STMT_VINFO_VECTYPE(S) (S)->vectype
#define STMT_VINFO_VEC_STMT(S) (S)->vectorized_stmt
#define STMT_VINFO_DATA_REF(S) (S)->data_ref_info
@@ -233,22 +260,24 @@ typedef struct _stmt_vec_info {
#define STMT_VINFO_VECT_STEP(S) (S)->step
#define STMT_VINFO_VECT_BASE_ALIGNED_P(S) (S)->base_aligned_p
#define STMT_VINFO_VECT_MISALIGNMENT(S) (S)->misalignment
+#define STMT_VINFO_SAME_ALIGN_REFS(S) (S)->same_align_refs
+#define STMT_VINFO_DEF_TYPE(S) (S)->def_type
-static inline void set_stmt_info (stmt_ann_t ann, stmt_vec_info stmt_info);
+static inline void set_stmt_info (tree_ann_t ann, stmt_vec_info stmt_info);
static inline stmt_vec_info vinfo_for_stmt (tree stmt);
static inline void
-set_stmt_info (stmt_ann_t ann, stmt_vec_info stmt_info)
+set_stmt_info (tree_ann_t ann, stmt_vec_info stmt_info)
{
if (ann)
- ann->aux = (char *) stmt_info;
+ ann->common.aux = (char *) stmt_info;
}
static inline stmt_vec_info
vinfo_for_stmt (tree stmt)
{
- stmt_ann_t ann = stmt_ann (stmt);
- return ann ? (stmt_vec_info) ann->aux : NULL;
+ tree_ann_t ann = tree_ann (stmt);
+ return ann ? (stmt_vec_info) ann->common.aux : NULL;
}
/*-----------------------------------------------------------------*/
@@ -309,8 +338,10 @@ extern void slpeel_verify_cfg_after_peeling (struct loop *, struct loop *);
/** In tree-vectorizer.c **/
extern tree vect_strip_conversion (tree);
extern tree get_vectype_for_scalar_type (tree);
-extern bool vect_is_simple_use (tree , loop_vec_info, tree *);
+extern bool vect_is_simple_use (tree, loop_vec_info, tree *, tree *,
+ enum vect_def_type *);
extern bool vect_is_simple_iv_evolution (unsigned, tree, tree *, tree *);
+extern tree vect_is_simple_reduction (struct loop *, tree);
extern bool vect_can_force_dr_alignment_p (tree, unsigned int);
extern enum dr_alignment_support vect_supportable_dr_alignment
(struct data_reference *);
@@ -331,6 +362,7 @@ extern bool vectorizable_store (tree, block_stmt_iterator *, tree *);
extern bool vectorizable_operation (tree, block_stmt_iterator *, tree *);
extern bool vectorizable_assignment (tree, block_stmt_iterator *, tree *);
extern bool vectorizable_condition (tree, block_stmt_iterator *, tree *);
+extern bool vectorizable_live_operation (tree, block_stmt_iterator *, tree *);
/* Driver for transformation stage. */
extern void vect_transform_loop (loop_vec_info, struct loops *);
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 16fa58b23b1..c0d0514cf60 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -38,8 +38,8 @@ Boston, MA 02111-1307, USA. */
#include "tree-chrec.h"
/* Set of SSA names found during the dominator traversal of a
- sub-graph in maybe_add_assert_expr. */
-static sbitmap found;
+ sub-graph in find_assert_locations. */
+static sbitmap found_in_subgraph;
/* Loop structure of the program. Used to analyze scalar evolutions
inside adjust_range_with_scev. */
@@ -48,20 +48,51 @@ static struct loops *cfg_loops;
/* Local functions. */
static int compare_values (tree val1, tree val2);
-/* Given a conditional predicate COND that has WHICH as one of its
- operands, return the other operand. No error checking is done.
- This helper assumes that COND is a comparison and WHICH is one of
- its operands. */
-
-static inline tree
-get_opposite_operand (tree cond, tree which)
+/* Location information for ASSERT_EXPRs. Each instance of this
+ structure describes an ASSERT_EXPR for an SSA name. Since a single
+ SSA name may have more than one assertion associated with it, these
+ locations are kept in a linked list attached to the corresponding
+ SSA name. */
+struct assert_locus_d
{
- if (TREE_OPERAND (cond, 0) == which)
- return TREE_OPERAND (cond, 1);
- else
- return TREE_OPERAND (cond, 0);
-}
+ /* Basic block where the assertion would be inserted. */
+ basic_block bb;
+
+ /* Some assertions need to be inserted on an edge (e.g., assertions
+ generated by COND_EXPRs). In those cases, BB will be NULL. */
+ edge e;
+
+ /* Pointer to the statement that generated this assertion. */
+ block_stmt_iterator si;
+
+ /* Predicate code for the ASSERT_EXPR. Must be COMPARISON_CLASS_P. */
+ enum tree_code comp_code;
+
+ /* Value being compared against. */
+ tree val;
+
+ /* Next node in the linked list. */
+ struct assert_locus_d *next;
+};
+
+typedef struct assert_locus_d *assert_locus_t;
+
+/* If bit I is present, it means that SSA name N_i has a list of
+ assertions that should be inserted in the IL. */
+static bitmap need_assert_for;
+/* Array of locations lists where to insert assertions. ASSERTS_FOR[I]
+ holds a list of ASSERT_LOCUS_T nodes that describe where
+ ASSERT_EXPRs for SSA name N_I should be inserted. */
+static assert_locus_t *asserts_for;
+
+/* Set of blocks visited in find_assert_locations. Used to avoid
+ visiting the same block more than once. */
+static sbitmap blocks_visited;
+
+/* Value range array. After propagation, VR_VALUE[I] holds the range
+ of values that SSA name N_I may take. */
+static value_range_t **vr_value;
/* Given a comparison code, return its opposite. Note that this is *not*
the same as inverting its truth value (invert_tree_comparison). Here we
@@ -104,12 +135,88 @@ opposite_comparison (enum tree_code code)
}
-/* Set value range VR to {T, MIN, MAX}. */
+/* Return true if EXPR computes a non-zero value. */
-static inline void
-set_value_range (value_range *vr, enum value_range_type t, tree min, tree max)
+bool
+expr_computes_nonzero (tree expr)
+{
+ /* Type casts won't change anything, so just strip them. */
+ STRIP_NOPS (expr);
+
+ /* Calling alloca, guarantees that the value is non-NULL. */
+ if (alloca_call_p (expr))
+ return true;
+
+ /* The address of a non-weak symbol is never NULL, unless the user
+ has requested not to remove NULL pointer checks. */
+ if (flag_delete_null_pointer_checks
+ && TREE_CODE (expr) == ADDR_EXPR
+ && DECL_P (TREE_OPERAND (expr, 0))
+ && !DECL_WEAK (TREE_OPERAND (expr, 0)))
+ return true;
+
+ /* IOR of any value with a nonzero value will result in a nonzero
+ value. */
+ if (TREE_CODE (expr) == BIT_IOR_EXPR
+ && integer_nonzerop (TREE_OPERAND (expr, 1)))
+ return true;
+
+ return false;
+}
+
+
+/* Return true if ARG is marked with the nonnull attribute in the
+ current function signature. */
+
+static bool
+nonnull_arg_p (tree arg)
+{
+ tree t, attrs, fntype;
+ unsigned HOST_WIDE_INT arg_num;
+
+ gcc_assert (TREE_CODE (arg) == PARM_DECL && POINTER_TYPE_P (TREE_TYPE (arg)));
+
+ fntype = TREE_TYPE (current_function_decl);
+ attrs = lookup_attribute ("nonnull", TYPE_ATTRIBUTES (fntype));
+
+ /* If "nonnull" wasn't specified, we know nothing about the argument. */
+ if (attrs == NULL_TREE)
+ return false;
+
+ /* If "nonnull" applies to all the arguments, then ARG is non-null. */
+ if (TREE_VALUE (attrs) == NULL_TREE)
+ return true;
+
+ /* Get the position number for ARG in the function signature. */
+ for (arg_num = 1, t = DECL_ARGUMENTS (current_function_decl);
+ t;
+ t = TREE_CHAIN (t), arg_num++)
+ {
+ if (t == arg)
+ break;
+ }
+
+ gcc_assert (t == arg);
+
+ /* Now see if ARG_NUM is mentioned in the nonnull list. */
+ for (t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
+ {
+ if (compare_tree_int (TREE_VALUE (t), arg_num) == 0)
+ return true;
+ }
+
+ return false;
+}
+
+
+/* Set value range VR to {T, MIN, MAX, EQUIV}. */
+
+static void
+set_value_range (value_range_t *vr, enum value_range_type t, tree min,
+ tree max, bitmap equiv)
{
#if defined ENABLE_CHECKING
+ /* Check the validity of the range. */
if (t == VR_RANGE || t == VR_ANTI_RANGE)
{
int cmp;
@@ -123,114 +230,181 @@ set_value_range (value_range *vr, enum value_range_type t, tree min, tree max)
cmp = compare_values (min, max);
gcc_assert (cmp == 0 || cmp == -1 || cmp == -2);
}
-#endif
- if (t == VR_RANGE
- && INTEGRAL_TYPE_P (TREE_TYPE (min))
- && min == TYPE_MIN_VALUE (TREE_TYPE (min))
- && max == TYPE_MAX_VALUE (TREE_TYPE (max)))
- {
- /* Ranges that cover all the possible values for the type decay
- to VARYING. */
- vr->type = VR_VARYING;
- vr->min = NULL_TREE;
- vr->max = NULL_TREE;
- return;
- }
+ if (t == VR_UNDEFINED || t == VR_VARYING)
+ gcc_assert (min == NULL_TREE && max == NULL_TREE);
+
+ if (t == VR_UNDEFINED || t == VR_VARYING)
+ gcc_assert (equiv == NULL || bitmap_empty_p (equiv));
+#endif
vr->type = t;
vr->min = min;
vr->max = max;
+
+ /* Since updating the equivalence set involves deep copying the
+ bitmaps, only do it if absolutely necessary. */
+ if (vr->equiv == NULL)
+ vr->equiv = BITMAP_ALLOC (NULL);
+
+ if (equiv != vr->equiv)
+ {
+ if (equiv && !bitmap_empty_p (equiv))
+ bitmap_copy (vr->equiv, equiv);
+ else
+ bitmap_clear (vr->equiv);
+ }
}
-/* Similar to set_value_range but return true if any field of VR
- changed from its previous value. */
+/* Copy value range FROM into value range TO. */
-static inline bool
-update_value_range (value_range *vr, enum value_range_type t, tree min,
- tree max)
+static inline void
+copy_value_range (value_range_t *to, value_range_t *from)
{
- bool is_new = vr->type != t || vr->min != min || vr->max != max;
- if (is_new)
- set_value_range (vr, t, min, max);
+ set_value_range (to, from->type, from->min, from->max, from->equiv);
+}
- return is_new;
+
+/* Set value range VR to a non-NULL range of type TYPE. */
+
+static inline void
+set_value_range_to_nonnull (value_range_t *vr, tree type)
+{
+ tree zero = build_int_cst (type, 0);
+ set_value_range (vr, VR_ANTI_RANGE, zero, zero, vr->equiv);
}
-/* Return value range information for VAR. Create an empty range if
- none existed. */
+/* Set value range VR to a NULL range of type TYPE. */
+
+static inline void
+set_value_range_to_null (value_range_t *vr, tree type)
+{
+ tree zero = build_int_cst (type, 0);
+ set_value_range (vr, VR_RANGE, zero, zero, vr->equiv);
+}
+
+
+/* Set value range VR to VR_VARYING. */
+
+static inline void
+set_value_range_to_varying (value_range_t *vr)
+{
+ vr->type = VR_VARYING;
+ vr->min = vr->max = NULL_TREE;
+ if (vr->equiv)
+ bitmap_clear (vr->equiv);
+}
+
+
+/* Set value range VR to VR_UNDEFINED. */
+
+static inline void
+set_value_range_to_undefined (value_range_t *vr)
+{
+ vr->type = VR_UNDEFINED;
+ vr->min = vr->max = NULL_TREE;
+ if (vr->equiv)
+ bitmap_clear (vr->equiv);
+}
+
+
+/* Return value range information for VAR. Create an empty range
+ if none existed. */
-value_range *
+static value_range_t *
get_value_range (tree var)
{
- value_range *vr;
+ value_range_t *vr;
tree sym;
+ unsigned ver = SSA_NAME_VERSION (var);
- vr = SSA_NAME_VALUE_RANGE (var);
+ vr = vr_value[ver];
if (vr)
return vr;
/* Create a default value range. */
- vr = ggc_alloc (sizeof (*vr));
- memset ((void *) vr, 0, sizeof (*vr));
- SSA_NAME_VALUE_RANGE (var) = vr;
+ vr_value[ver] = vr = xmalloc (sizeof (*vr));
+ memset (vr, 0, sizeof (*vr));
- /* If VAR is a default definition for a PARM_DECL, then we have to
- assume a VARYING range for it. */
+ /* Allocate an equivalence set. */
+ vr->equiv = BITMAP_ALLOC (NULL);
+
+ /* If VAR is a default definition, the variable can take any value
+ in VAR's type. */
sym = SSA_NAME_VAR (var);
- if (TREE_CODE (sym) == PARM_DECL && var == var_ann (sym)->default_def)
- set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
+ if (var == var_ann (sym)->default_def)
+ {
+ /* Try to use the "nonnull" attribute to create ~[0, 0]
+ anti-ranges for pointers. Note that this is only valid with
+ default definitions of PARM_DECLs. */
+ if (TREE_CODE (sym) == PARM_DECL
+ && POINTER_TYPE_P (TREE_TYPE (sym))
+ && nonnull_arg_p (sym))
+ set_value_range_to_nonnull (vr, TREE_TYPE (sym));
+ else
+ set_value_range_to_varying (vr);
+ }
return vr;
}
-/* Return true if value range VR involves at least one symbol. */
+/* Update the value range and equivalence set for variable VAR to
+ NEW_VR. Return true if NEW_VR is different from VAR's previous
+ value.
+
+ NOTE: This function assumes that NEW_VR is a temporary value range
+ object created for the sole purpose of updating VAR's range. The
+ storage used by the equivalence set from NEW_VR will be freed by
+ this function. Do not call update_value_range when NEW_VR
+ is the range object associated with another SSA name. */
static inline bool
-symbolic_range_p (value_range *vr)
+update_value_range (tree var, value_range_t *new_vr)
{
- return (!is_gimple_min_invariant (vr->min)
- || !is_gimple_min_invariant (vr->max));
-}
+ value_range_t *old_vr;
+ bool is_new;
+
+ /* Update the value range, if necessary. */
+ old_vr = get_value_range (var);
+ is_new = old_vr->type != new_vr->type
+ || old_vr->min != new_vr->min
+ || old_vr->max != new_vr->max
+ || (old_vr->equiv == NULL && new_vr->equiv)
+ || (old_vr->equiv && new_vr->equiv == NULL)
+ || (!bitmap_equal_p (old_vr->equiv, new_vr->equiv));
+ if (is_new)
+ set_value_range (old_vr, new_vr->type, new_vr->min, new_vr->max,
+ new_vr->equiv);
-/* Return true if EXPR computes a non-zero value. */
+ BITMAP_FREE (new_vr->equiv);
+ new_vr->equiv = NULL;
-bool
-expr_computes_nonzero (tree expr)
-{
- /* Type casts won't change anything, so just strip it. */
- STRIP_NOPS (expr);
+ return is_new;
+}
- /* Calling alloca, guarantees that the value is non-NULL. */
- if (alloca_call_p (expr))
- return true;
- /* The address of a non-weak symbol is never NULL, unless the user
- has requested not to remove NULL pointer checks. */
- if (flag_delete_null_pointer_checks
- && TREE_CODE (expr) == ADDR_EXPR
- && DECL_P (TREE_OPERAND (expr, 0))
- && !DECL_WEAK (TREE_OPERAND (expr, 0)))
- return true;
+/* Add VAR and VAR's equivalence set to EQUIV. */
- /* IOR of any value with a nonzero value will result in a nonzero
- value. */
- if (TREE_CODE (expr) == BIT_IOR_EXPR
- && integer_nonzerop (TREE_OPERAND (expr, 1)))
- return true;
+static void
+add_equivalence (bitmap equiv, tree var)
+{
+ unsigned ver = SSA_NAME_VERSION (var);
+ value_range_t *vr = vr_value[ver];
- return false;
+ bitmap_set_bit (equiv, ver);
+ if (vr && vr->equiv)
+ bitmap_ior_into (equiv, vr->equiv);
}
/* Return true if VR is ~[0, 0]. */
static inline bool
-range_is_nonnull (value_range *vr)
+range_is_nonnull (value_range_t *vr)
{
return vr->type == VR_ANTI_RANGE
&& integer_zerop (vr->min)
@@ -241,7 +415,7 @@ range_is_nonnull (value_range *vr)
/* Return true if VR is [0, 0]. */
static inline bool
-range_is_null (value_range *vr)
+range_is_null (value_range_t *vr)
{
return vr->type == VR_RANGE
&& integer_zerop (vr->min)
@@ -249,32 +423,42 @@ range_is_null (value_range *vr)
}
-/* Set value range VR to a non-NULL range of type TYPE. */
+/* Return true if value range VR involves at least one symbol. */
-static inline void
-set_value_range_to_nonnull (value_range *vr, tree type)
+static inline bool
+symbolic_range_p (value_range_t *vr)
{
- tree zero = build_int_cst (type, 0);
- set_value_range (vr, VR_ANTI_RANGE, zero, zero);
+ return (!is_gimple_min_invariant (vr->min)
+ || !is_gimple_min_invariant (vr->max));
}
-/* Set value range VR to a NULL range of type TYPE. */
+/* Like expr_computes_nonzero, but this function uses value ranges
+ obtained so far. */
-static inline void
-set_value_range_to_null (value_range *vr, tree type)
+static bool
+vrp_expr_computes_nonzero (tree expr)
{
- tree zero = build_int_cst (type, 0);
- set_value_range (vr, VR_RANGE, zero, zero);
-}
+ if (expr_computes_nonzero (expr))
+ return true;
+ /* If we have an expression of the form &X->a, then the expression
+ is nonnull if X is nonnull. */
+ if (TREE_CODE (expr) == ADDR_EXPR)
+ {
+ tree base = get_base_address (TREE_OPERAND (expr, 0));
-/* Set value range VR to VR_VARYING. */
+ if (base != NULL_TREE
+ && TREE_CODE (base) == INDIRECT_REF
+ && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
+ {
+ value_range_t *vr = get_value_range (TREE_OPERAND (base, 0));
+ if (range_is_nonnull (vr))
+ return true;
+ }
+ }
-static inline void
-set_value_range_to_varying (value_range *vr)
-{
- set_value_range (vr, VR_VARYING, NULL_TREE, NULL_TREE);
+ return false;
}
@@ -414,6 +598,10 @@ compare_values (tree val1, tree val2)
if (!is_gimple_min_invariant (val1) || !is_gimple_min_invariant (val2))
return -2;
+ /* We cannot compare overflowed values. */
+ if (TREE_OVERFLOW (val1) || TREE_OVERFLOW (val2))
+ return -2;
+
if (!POINTER_TYPE_P (TREE_TYPE (val1)))
return tree_int_cst_compare (val1, val2);
else
@@ -449,7 +637,7 @@ compare_values (tree val1, tree val2)
-2 if we cannot tell either way. */
static inline int
-value_inside_range (tree val, value_range *vr)
+value_inside_range (tree val, value_range_t *vr)
{
int cmp1, cmp2;
@@ -469,7 +657,7 @@ value_inside_range (tree val, value_range *vr)
intersection. */
static inline bool
-value_ranges_intersect_p (value_range *vr0, value_range *vr1)
+value_ranges_intersect_p (value_range_t *vr0, value_range_t *vr1)
{
return (value_inside_range (vr1->min, vr0) == 1
|| value_inside_range (vr1->max, vr0) == 1
@@ -478,38 +666,77 @@ value_ranges_intersect_p (value_range *vr0, value_range *vr1)
}
+/* Return true if VR includes the value zero, false otherwise. */
+
+static inline bool
+range_includes_zero_p (value_range_t *vr)
+{
+ tree zero;
+
+ gcc_assert (vr->type != VR_UNDEFINED
+ && vr->type != VR_VARYING
+ && !symbolic_range_p (vr));
+
+ zero = build_int_cst (TREE_TYPE (vr->min), 0);
+ return (value_inside_range (zero, vr) == 1);
+}
+
+
/* Extract value range information from an ASSERT_EXPR EXPR and store
it in *VR_P. */
static void
-extract_range_from_assert (value_range *vr_p, tree expr)
+extract_range_from_assert (value_range_t *vr_p, tree expr)
{
- tree var, cond, limit, type;
- value_range *var_vr;
+ tree var, cond, limit, min, max, type;
+ value_range_t *var_vr, *limit_vr;
enum tree_code cond_code;
var = ASSERT_EXPR_VAR (expr);
cond = ASSERT_EXPR_COND (expr);
- cond_code = TREE_CODE (cond);
gcc_assert (COMPARISON_CLASS_P (cond));
/* Find VAR in the ASSERT_EXPR conditional. */
- limit = get_opposite_operand (cond, var);
- type = TREE_TYPE (limit);
+ if (var == TREE_OPERAND (cond, 0))
+ {
+ /* If the predicate is of the form VAR COMP LIMIT, then we just
+ take LIMIT from the RHS and use the same comparison code. */
+ limit = TREE_OPERAND (cond, 1);
+ cond_code = TREE_CODE (cond);
+ }
+ else
+ {
+ /* If the predicate is of the form LIMIT COMP VAR, then we need
+ to flip around the comparison code to create the proper range
+ for VAR. */
+ limit = TREE_OPERAND (cond, 0);
+ cond_code = opposite_comparison (TREE_CODE (cond));
+ }
+ type = TREE_TYPE (limit);
gcc_assert (limit != var);
- /* For pointer arithmetic, we only keep track of anti-ranges
- (NE_EXPR). Notice that we don't need to handle EQ_EXPR in these
- cases because assertions with equalities are never generated.
- The assert pass generates straight assignments in those cases. */
- if (POINTER_TYPE_P (type) && cond_code != NE_EXPR)
+ /* For pointer arithmetic, we only keep track of pointer equality
+ and inequality. */
+ if (POINTER_TYPE_P (type) && cond_code != NE_EXPR && cond_code != EQ_EXPR)
{
set_value_range_to_varying (vr_p);
return;
}
+ /* If LIMIT is another SSA name and LIMIT has a range of its own,
+ try to use LIMIT's range to avoid creating symbolic ranges
+ unnecessarily. */
+ limit_vr = (TREE_CODE (limit) == SSA_NAME) ? get_value_range (limit) : NULL;
+
+ /* LIMIT's range is only interesting if it has any useful information. */
+ if (limit_vr
+ && (limit_vr->type == VR_UNDEFINED
+ || limit_vr->type == VR_VARYING
+ || symbolic_range_p (limit_vr)))
+ limit_vr = NULL;
+
/* Special handling for integral types with super-types. Some FEs
construct integral types derived from other types and restrict
the range of values these new types may take.
@@ -538,7 +765,9 @@ extract_range_from_assert (value_range *vr_p, tree expr)
So, the only sensible thing we can do for now is set the
resulting range to VR_VARYING. TODO, would having symbolic -INF
and +INF values be worth the trouble? */
- if (TREE_TYPE (type))
+ if (TREE_CODE (limit) != SSA_NAME
+ && INTEGRAL_TYPE_P (type)
+ && TREE_TYPE (type))
{
if (cond_code == LE_EXPR || cond_code == LT_EXPR)
{
@@ -568,29 +797,125 @@ extract_range_from_assert (value_range *vr_p, tree expr)
}
}
- if (TREE_CODE (cond) == NE_EXPR)
- set_value_range (vr_p, VR_ANTI_RANGE, limit, limit);
- else if (TREE_CODE (cond) == LE_EXPR)
- set_value_range (vr_p, VR_RANGE, TYPE_MIN_VALUE (type), limit);
- else if (TREE_CODE (cond) == LT_EXPR)
+ /* The new range has the same set of equivalences of VAR's range. */
+ gcc_assert (vr_p->equiv == NULL);
+ vr_p->equiv = BITMAP_ALLOC (NULL);
+ add_equivalence (vr_p->equiv, var);
+
+ /* Extract a new range based on the asserted comparison for VAR and
+ LIMIT's value range. Notice that if LIMIT has an anti-range, we
+ will only use it for equality comparisons (EQ_EXPR). For any
+ other kind of assertion, we cannot derive a range from LIMIT's
+ anti-range that can be used to describe the new range. For
+ instance, ASSERT_EXPR <x_2, x_2 <= b_4>. If b_4 is ~[2, 10],
+ then b_4 takes on the ranges [-INF, 1] and [11, +INF]. There is
+ no single range for x_2 that could describe LE_EXPR, so we might
+ as well build the range [b_4, +INF] for it. */
+ if (cond_code == EQ_EXPR)
{
- tree one = build_int_cst (type, 1);
- set_value_range (vr_p, VR_RANGE, TYPE_MIN_VALUE (type),
- fold (build (MINUS_EXPR, type, limit, one)));
+ enum value_range_type range_type;
+
+ if (limit_vr)
+ {
+ range_type = limit_vr->type;
+ min = limit_vr->min;
+ max = limit_vr->max;
+ }
+ else
+ {
+ range_type = VR_RANGE;
+ min = limit;
+ max = limit;
+ }
+
+ set_value_range (vr_p, range_type, min, max, vr_p->equiv);
+
+ /* When asserting the equality VAR == LIMIT and LIMIT is another
+ SSA name, the new range will also inherit the equivalence set
+ from LIMIT. */
+ if (TREE_CODE (limit) == SSA_NAME)
+ add_equivalence (vr_p->equiv, limit);
+ }
+ else if (cond_code == NE_EXPR)
+ {
+ /* As described above, when LIMIT's range is an anti-range and
+ this assertion is an inequality (NE_EXPR), then we cannot
+ derive anything from the anti-range. For instance, if
+ LIMIT's range was ~[0, 0], the assertion 'VAR != LIMIT' does
+ not imply that VAR's range is [0, 0]. So, in the case of
+ anti-ranges, we just assert the inequality using LIMIT and
+ not its anti-range. */
+ if (limit_vr == NULL
+ || limit_vr->type == VR_ANTI_RANGE)
+ {
+ min = limit;
+ max = limit;
+ }
+ else
+ {
+ min = limit_vr->min;
+ max = limit_vr->max;
+ }
+
+ /* If MIN and MAX cover the whole range for their type, then
+ just use the original LIMIT. */
+ if (INTEGRAL_TYPE_P (type)
+ && min == TYPE_MIN_VALUE (type)
+ && max == TYPE_MAX_VALUE (type))
+ min = max = limit;
+
+ set_value_range (vr_p, VR_ANTI_RANGE, min, max, vr_p->equiv);
}
- else if (TREE_CODE (cond) == GE_EXPR)
- set_value_range (vr_p, VR_RANGE, limit, TYPE_MAX_VALUE (type));
- else if (TREE_CODE (cond) == GT_EXPR)
+ else if (cond_code == LE_EXPR || cond_code == LT_EXPR)
{
- tree one = build_int_cst (type, 1);
- set_value_range (vr_p, VR_RANGE,
- fold (build (PLUS_EXPR, type, limit, one)),
- TYPE_MAX_VALUE (type));
+ min = TYPE_MIN_VALUE (type);
+
+ if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
+ max = limit;
+ else
+ {
+ /* If LIMIT_VR is of the form [N1, N2], we need to build the
+ range [MIN, N2] for LE_EXPR and [MIN, N2 - 1] for
+ LT_EXPR. */
+ max = limit_vr->max;
+ }
+
+ /* For LT_EXPR, we create the range [MIN, MAX - 1]. */
+ if (cond_code == LT_EXPR)
+ {
+ tree one = build_int_cst (type, 1);
+ max = fold (build (MINUS_EXPR, type, max, one));
+ }
+
+ set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
+ }
+ else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
+ {
+ max = TYPE_MAX_VALUE (type);
+
+ if (limit_vr == NULL || limit_vr->type == VR_ANTI_RANGE)
+ min = limit;
+ else
+ {
+ /* If LIMIT_VR is of the form [N1, N2], we need to build the
+ range [N1, MAX] for GE_EXPR and [N1 + 1, MAX] for
+ GT_EXPR. */
+ min = limit_vr->min;
+ }
+
+ /* For GT_EXPR, we create the range [MIN + 1, MAX]. */
+ if (cond_code == GT_EXPR)
+ {
+ tree one = build_int_cst (type, 1);
+ min = fold (build (PLUS_EXPR, type, min, one));
+ }
+
+ set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
}
else
gcc_unreachable ();
- /* If VAR already has a known range and the two ranges have a
+ /* If VAR already had a known range and the two ranges have a
non-empty intersection, we can refine the resulting range.
Since the assert expression creates an equivalency and at the
same time it asserts a predicate, we can take the intersection of
@@ -600,8 +925,6 @@ extract_range_from_assert (value_range *vr_p, tree expr)
&& vr_p->type == VR_RANGE
&& value_ranges_intersect_p (var_vr, vr_p))
{
- tree min, max;
-
/* Use the larger of the two minimums. */
if (compare_values (vr_p->min, var_vr->min) == -1)
min = var_vr->min;
@@ -614,7 +937,7 @@ extract_range_from_assert (value_range *vr_p, tree expr)
else
max = vr_p->max;
- set_value_range (vr_p, vr_p->type, min, max);
+ set_value_range (vr_p, vr_p->type, min, max, vr_p->equiv);
}
}
@@ -633,14 +956,66 @@ extract_range_from_assert (value_range *vr_p, tree expr)
always false. */
static void
-extract_range_from_ssa_name (value_range *vr, tree var)
+extract_range_from_ssa_name (value_range_t *vr, tree var)
{
- value_range *var_vr = get_value_range (var);
+ value_range_t *var_vr = get_value_range (var);
if (var_vr->type != VR_UNDEFINED && var_vr->type != VR_VARYING)
- *vr = *var_vr;
+ copy_value_range (vr, var_vr);
else
- set_value_range (vr, VR_RANGE, var, var);
+ set_value_range (vr, VR_RANGE, var, var, NULL);
+
+ add_equivalence (vr->equiv, var);
+}
+
+
+/* Wrapper around int_const_binop. If the operation overflows and we
+ are not using wrapping arithmetic, then adjust the result to be
+ -INF or +INF depending on CODE, VAL1 and VAL2. */
+
+static inline tree
+vrp_int_const_binop (enum tree_code code, tree val1, tree val2)
+{
+ tree res;
+
+ if (flag_wrapv)
+ return int_const_binop (code, val1, val2, 0);
+
+ /* If we are not using wrapping arithmetic, operate symbolically
+ on -INF and +INF. */
+ res = int_const_binop (code, val1, val2, 0);
+
+ /* If the operation overflowed but neither VAL1 nor VAL2 are
+ overflown, return -INF or +INF depending on whether VAL1 CODE
+ VAL2 is a growing function or not. */
+ if (TREE_OVERFLOW (res)
+ && !TREE_OVERFLOW (val1)
+ && !TREE_OVERFLOW (val2))
+ {
+ bool grows = false;
+ int sgn1 = tree_int_cst_sgn (val1);
+ int sgn2 = tree_int_cst_sgn (val2);
+
+ /* Determine whether VAL1 CODE VAL2 yields a growing value.
+ Notice that we only need to handle the restricted set of
+ operations handled by extract_range_from_binary_expr:
+
+ VAL1 + VAL2 grows if VAL2 is >= 0.
+ VAL1 * VAL2 grows if both VAL1 and VAL2 have the same sign.
+ VAL1 - VAL2 grows if VAL2 is < 0 (because it becomes an addition).
+ */
+ if ((code == PLUS_EXPR && sgn2 >= 0)
+ || (code == MULT_EXPR && sgn1 == sgn2)
+ || (code == MINUS_EXPR && sgn2 < 0))
+ grows = true;
+
+ if (grows)
+ return TYPE_MAX_VALUE (TREE_TYPE (res));
+ else
+ return TYPE_MIN_VALUE (TREE_TYPE (res));
+ }
+
+ return res;
}
@@ -648,12 +1023,13 @@ extract_range_from_ssa_name (value_range *vr, tree var)
the ranges of each of its operands and the expression code. */
static void
-extract_range_from_binary_expr (value_range *vr, tree expr)
+extract_range_from_binary_expr (value_range_t *vr, tree expr)
{
enum tree_code code = TREE_CODE (expr);
tree op0, op1, min, max;
- value_range vr0, vr1;
int cmp;
+ value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
+ value_range_t vr1 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
/* Not all binary expressions can be applied to ranges in a
meaningful way. Handle only arithmetic operations. */
@@ -666,7 +1042,12 @@ extract_range_from_binary_expr (value_range *vr, tree expr)
&& code != EXACT_DIV_EXPR
&& code != ROUND_DIV_EXPR
&& code != MIN_EXPR
- && code != MAX_EXPR)
+ && code != MAX_EXPR
+ && code != TRUTH_ANDIF_EXPR
+ && code != TRUTH_ORIF_EXPR
+ && code != TRUTH_AND_EXPR
+ && code != TRUTH_OR_EXPR
+ && code != TRUTH_XOR_EXPR)
{
set_value_range_to_varying (vr);
return;
@@ -677,48 +1058,34 @@ extract_range_from_binary_expr (value_range *vr, tree expr)
op0 = TREE_OPERAND (expr, 0);
if (TREE_CODE (op0) == SSA_NAME)
vr0 = *(get_value_range (op0));
+ else if (is_gimple_min_invariant (op0))
+ set_value_range (&vr0, VR_RANGE, op0, op0, NULL);
else
- {
- if (is_gimple_min_invariant (op0))
- set_value_range (&vr0, VR_RANGE, op0, op0);
- else
- set_value_range_to_varying (&vr0);
- }
+ set_value_range_to_varying (&vr0);
op1 = TREE_OPERAND (expr, 1);
if (TREE_CODE (op1) == SSA_NAME)
vr1 = *(get_value_range (op1));
+ else if (is_gimple_min_invariant (op1))
+ set_value_range (&vr1, VR_RANGE, op1, op1, NULL);
else
- {
- if (is_gimple_min_invariant (op1))
- set_value_range (&vr1, VR_RANGE, op1, op1);
- else
- set_value_range_to_varying (&vr1);
- }
+ set_value_range_to_varying (&vr1);
/* If either range is UNDEFINED, so is the result. */
if (vr0.type == VR_UNDEFINED || vr1.type == VR_UNDEFINED)
{
- set_value_range (vr, VR_UNDEFINED, NULL_TREE, NULL_TREE);
- return;
- }
-
- /* If either range is VARYING, so is the result. */
- if (vr0.type == VR_VARYING || vr1.type == VR_VARYING)
- {
- set_value_range_to_varying (vr);
- return;
- }
-
- /* If the ranges are of different types, the result is VARYING. */
- if (vr0.type != vr1.type)
- {
- set_value_range_to_varying (vr);
+ set_value_range_to_undefined (vr);
return;
}
- /* TODO. Refuse to do any symbolic range operations for now. */
- if (symbolic_range_p (&vr0) || symbolic_range_p (&vr1))
+ /* Refuse to operate on VARYING ranges, ranges of different kinds
+ and symbolic ranges. TODO, we may be able to derive anti-ranges
+ in some cases. */
+ if (vr0.type == VR_VARYING
+ || vr1.type == VR_VARYING
+ || vr0.type != vr1.type
+ || symbolic_range_p (&vr0)
+ || symbolic_range_p (&vr1))
{
set_value_range_to_varying (vr);
return;
@@ -730,17 +1097,12 @@ extract_range_from_binary_expr (value_range *vr, tree expr)
|| POINTER_TYPE_P (TREE_TYPE (op1)))
{
/* For pointer types, we are really only interested in asserting
- whether the expression evaluates to non-NULL. FIXME. We
- used to gcc_assert (code == PLUS_EXPR || code == MINUS_EXPR),
- but ivopts is generating expressions with pointer
- multiplication in them. */
+ whether the expression evaluates to non-NULL. FIXME, we used
+ to gcc_assert (code == PLUS_EXPR || code == MINUS_EXPR), but
+ ivopts is generating expressions with pointer multiplication
+ in them. */
if (code == PLUS_EXPR)
- {
- /* Assume that pointers can never wrap around. FIXME, Is
- this always safe? */
- tree zero = build_int_cst (TREE_TYPE (expr), 0);
- set_value_range (vr, VR_ANTI_RANGE, zero, zero);
- }
+ set_value_range_to_nonnull (vr, TREE_TYPE (expr));
else
{
/* Subtracting from a pointer, may yield 0, so just drop the
@@ -753,24 +1115,115 @@ extract_range_from_binary_expr (value_range *vr, tree expr)
/* For integer ranges, apply the operation to each end of the
range and see what we end up with. */
- if (code == PLUS_EXPR
- || code == MULT_EXPR
- || code == MIN_EXPR
- || code == MAX_EXPR)
+ if (code == TRUTH_ANDIF_EXPR
+ || code == TRUTH_ORIF_EXPR
+ || code == TRUTH_AND_EXPR
+ || code == TRUTH_OR_EXPR
+ || code == TRUTH_XOR_EXPR)
+ {
+ /* Boolean expressions cannot be folded with int_const_binop. */
+ min = fold_binary (code, TREE_TYPE (expr), vr0.min, vr1.min);
+ max = fold_binary (code, TREE_TYPE (expr), vr0.max, vr1.max);
+ }
+ else if (code == PLUS_EXPR
+ || code == MIN_EXPR
+ || code == MAX_EXPR)
{
/* For operations that make the resulting range directly
proportional to the original ranges, apply the operation to
the same end of each range. */
- min = int_const_binop (code, vr0.min, vr1.min, 0);
- max = int_const_binop (code, vr0.max, vr1.max, 0);
+ min = vrp_int_const_binop (code, vr0.min, vr1.min);
+ max = vrp_int_const_binop (code, vr0.max, vr1.max);
+ }
+ else if (code == MULT_EXPR
+ || code == TRUNC_DIV_EXPR
+ || code == FLOOR_DIV_EXPR
+ || code == CEIL_DIV_EXPR
+ || code == EXACT_DIV_EXPR
+ || code == ROUND_DIV_EXPR)
+ {
+ tree val[4];
+ size_t i;
+
+ /* Multiplications and divisions are a bit tricky to handle,
+ depending on the mix of signs we have in the two ranges, we
+ need to operate on different values to get the minimum and
+ maximum values for the new range. One approach is to figure
+ out all the variations of range combinations and do the
+ operations.
+
+ However, this involves several calls to compare_values and it
+ is pretty convoluted. It's simpler to do the 4 operations
+ (MIN0 OP MIN1, MIN0 OP MAX1, MAX0 OP MIN1 and MAX0 OP MAX0 OP
+ MAX1) and then figure the smallest and largest values to form
+ the new range. */
+
+ /* Divisions by zero result in a VARYING value. */
+ if (code != MULT_EXPR && range_includes_zero_p (&vr1))
+ {
+ set_value_range_to_varying (vr);
+ return;
+ }
+
+ /* Compute the 4 cross operations. */
+ val[0] = vrp_int_const_binop (code, vr0.min, vr1.min);
+
+ val[1] = (vr1.max != vr1.min)
+ ? vrp_int_const_binop (code, vr0.min, vr1.max)
+ : NULL_TREE;
+
+ val[2] = (vr0.max != vr0.min)
+ ? vrp_int_const_binop (code, vr0.max, vr1.min)
+ : NULL_TREE;
+
+ val[3] = (vr0.min != vr1.min && vr0.max != vr1.max)
+ ? vrp_int_const_binop (code, vr0.max, vr1.max)
+ : NULL_TREE;
+
+ /* Set MIN to the minimum of VAL[i] and MAX to the maximum
+ of VAL[i]. */
+ min = val[0];
+ max = val[0];
+ for (i = 1; i < 4; i++)
+ {
+ if (TREE_OVERFLOW (min) || TREE_OVERFLOW (max))
+ break;
+
+ if (val[i])
+ {
+ if (TREE_OVERFLOW (val[i]))
+ {
+ /* If we found an overflowed value, set MIN and MAX
+ to it so that we set the resulting range to
+ VARYING. */
+ min = max = val[i];
+ break;
+ }
+
+ if (compare_values (val[i], min) == -1)
+ min = val[i];
+
+ if (compare_values (val[i], max) == 1)
+ max = val[i];
+ }
+ }
+ }
+ else if (code == MINUS_EXPR)
+ {
+ /* For MINUS_EXPR, apply the operation to the opposite ends of
+ each range. */
+ min = vrp_int_const_binop (code, vr0.min, vr1.max);
+ max = vrp_int_const_binop (code, vr0.max, vr1.min);
}
else
+ gcc_unreachable ();
+
+ /* If either MIN or MAX overflowed, then set the resulting range to
+ VARYING. */
+ if (TREE_OVERFLOW (min) || TREE_OVERFLOW (max))
{
- /* For operations that make the resulting range inversely
- proportional to the original ranges (-, /), apply the
- operation to the opposite ends of each range. */
- min = int_const_binop (code, vr0.min, vr1.max, 0);
- max = int_const_binop (code, vr0.max, vr1.min, 0);
+ set_value_range_to_varying (vr);
+ return;
}
cmp = compare_values (min, max);
@@ -782,36 +1235,7 @@ extract_range_from_binary_expr (value_range *vr, tree expr)
set_value_range_to_varying (vr);
}
else
- set_value_range (vr, vr0.type, min, max);
-}
-
-
-/* Like expr_computes_nonzero, but this function uses value ranges
- obtained so far. */
-
-static bool
-vrp_expr_computes_nonzero (tree expr)
-{
- if (expr_computes_nonzero (expr))
- return true;
-
- /* If we have an expression of the form &X->a, then the expression
- is nonnull if X is nonnull. */
- if (TREE_CODE (expr) == ADDR_EXPR)
- {
- tree base = get_base_address (TREE_OPERAND (expr, 0));
-
- if (base != NULL_TREE
- && TREE_CODE (base) == INDIRECT_REF
- && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME)
- {
- value_range *vr = get_value_range (TREE_OPERAND (base, 0));
- if (range_is_nonnull (vr))
- return true;
- }
- }
-
- return false;
+ set_value_range (vr, vr0.type, min, max, NULL);
}
@@ -819,51 +1243,53 @@ vrp_expr_computes_nonzero (tree expr)
the range of its operand and the expression code. */
static void
-extract_range_from_unary_expr (value_range *vr, tree expr)
+extract_range_from_unary_expr (value_range_t *vr, tree expr)
{
enum tree_code code = TREE_CODE (expr);
tree min, max, op0;
- value_range vr0;
int cmp;
+ value_range_t vr0 = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
+
+ /* Refuse to operate on certain unary expressions for which we
+ cannot easily determine a resulting range. */
+ if (code == FIX_TRUNC_EXPR
+ || code == FIX_CEIL_EXPR
+ || code == FIX_FLOOR_EXPR
+ || code == FIX_ROUND_EXPR
+ || code == FLOAT_EXPR
+ || code == BIT_NOT_EXPR
+ || code == NON_LVALUE_EXPR
+ || code == CONJ_EXPR)
+ {
+ set_value_range_to_varying (vr);
+ return;
+ }
/* Get value ranges for the operand. For constant operands, create
a new value range with the operand to simplify processing. */
op0 = TREE_OPERAND (expr, 0);
if (TREE_CODE (op0) == SSA_NAME)
vr0 = *(get_value_range (op0));
+ else if (is_gimple_min_invariant (op0))
+ set_value_range (&vr0, VR_RANGE, op0, op0, NULL);
else
- {
- if (is_gimple_min_invariant (op0))
- set_value_range (&vr0, VR_RANGE, op0, op0);
- else
- set_value_range_to_varying (&vr0);
- }
+ set_value_range_to_varying (&vr0);
/* If VR0 is UNDEFINED, so is the result. */
if (vr0.type == VR_UNDEFINED)
{
- set_value_range (vr, VR_UNDEFINED, NULL_TREE, NULL_TREE);
- return;
- }
-
- /* If VR0 is VARYING, so is the result. */
- if (vr0.type == VR_VARYING)
- {
- set_value_range_to_varying (vr);
- return;
- }
-
- /* TODO. Refuse to do any symbolic range operations for now. */
- if (symbolic_range_p (&vr0))
- {
- set_value_range_to_varying (vr);
+ set_value_range_to_undefined (vr);
return;
}
- /* If the operand is neither a pointer nor an integral type, set the
- range to VARYING. TODO, we may set the range to non-zero. */
- if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
- && !POINTER_TYPE_P (TREE_TYPE (op0)))
+ /* Refuse to operate on varying and symbolic ranges. Also, if the
+ operand is neither a pointer nor an integral type, set the
+ resulting range to VARYING. TODO, in some cases we may be able
+ to derive anti-ranges (like non-zero values). */
+ if (vr0.type == VR_VARYING
+ || (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
+ && !POINTER_TYPE_P (TREE_TYPE (op0)))
+ || symbolic_range_p (&vr0))
{
set_value_range_to_varying (vr);
return;
@@ -884,23 +1310,73 @@ extract_range_from_unary_expr (value_range *vr, tree expr)
}
/* Handle unary expressions on integer ranges. */
- if ((code == NOP_EXPR || code == CONVERT_EXPR)
- && (TYPE_SIZE (TREE_TYPE (vr0.min)) != TYPE_SIZE (TREE_TYPE (expr))))
+ if (code == NOP_EXPR || code == CONVERT_EXPR)
{
+ tree inner_type = TREE_TYPE (op0);
+ tree outer_type = TREE_TYPE (expr);
+
/* When converting types of different sizes, set the result to
VARYING. Things like sign extensions and precision loss may
change the range. For instance, if x_3 is of type 'long long
int' and 'y_5 = (unsigned short) x_3', if x_3 is ~[0, 0], it
is impossible to know at compile time whether y_5 will be
~[0, 0]. */
- set_value_range_to_varying (vr);
- return;
+ if (TYPE_SIZE (inner_type) != TYPE_SIZE (outer_type)
+ || TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type))
+ {
+ set_value_range_to_varying (vr);
+ return;
+ }
}
/* Apply the operation to each end of the range and see what we end
up with. */
- min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
- max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
+ if (code == NEGATE_EXPR
+ && !TYPE_UNSIGNED (TREE_TYPE (expr)))
+ {
+ /* Negating an anti-range doesn't really do anything to it. The
+ new range will also not take on the same range of values
+ excluded by the original anti-range. */
+ if (vr0.type == VR_ANTI_RANGE)
+ {
+ copy_value_range (vr, &vr0);
+ return;
+ }
+
+ /* NEGATE_EXPR flips the range around. */
+ min = (vr0.max == TYPE_MAX_VALUE (TREE_TYPE (expr)))
+ ? TYPE_MIN_VALUE (TREE_TYPE (expr))
+ : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
+
+ max = (vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)))
+ ? TYPE_MAX_VALUE (TREE_TYPE (expr))
+ : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
+ }
+ else if (code == ABS_EXPR
+ && !TYPE_UNSIGNED (TREE_TYPE (expr)))
+ {
+ /* ABS_EXPR may flip the range around, if the original range
+ included negative values. */
+ min = (vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)))
+ ? TYPE_MAX_VALUE (TREE_TYPE (expr))
+ : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
+
+ max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
+
+ /* If the range was reversed, swap MIN and MAX. */
+ if (compare_values (min, max) == 1)
+ {
+ tree t = min;
+ min = max;
+ max = t;
+ }
+ }
+ else
+ {
+ /* Otherwise, operate on each end of the range. */
+ min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
+ max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
+ }
cmp = compare_values (min, max);
if (cmp == -2 || cmp == 1)
@@ -911,15 +1387,35 @@ extract_range_from_unary_expr (value_range *vr, tree expr)
set_value_range_to_varying (vr);
}
else
- set_value_range (vr, vr0.type, min, max);
+ set_value_range (vr, vr0.type, min, max, NULL);
+}
+
+
+/* Extract range information from a comparison expression EXPR based
+ on the range of its operand and the expression code. */
+
+static void
+extract_range_from_comparison (value_range_t *vr, tree expr)
+{
+ tree val = vrp_evaluate_conditional (expr, false);
+ if (val)
+ {
+ /* Since this expression was found on the RHS of an assignment,
+ its type may be different from _Bool. Convert VAL to EXPR's
+ type. */
+ val = fold_convert (TREE_TYPE (expr), val);
+ set_value_range (vr, VR_RANGE, val, val, vr->equiv);
+ }
+ else
+ set_value_range_to_varying (vr);
}
/* Try to compute a useful range out of expression EXPR and store it
- in *VR_P. */
+ in *VR. */
static void
-extract_range_from_expr (value_range *vr, tree expr)
+extract_range_from_expr (value_range_t *vr, tree expr)
{
enum tree_code code = TREE_CODE (expr);
@@ -927,25 +1423,32 @@ extract_range_from_expr (value_range *vr, tree expr)
extract_range_from_assert (vr, expr);
else if (code == SSA_NAME)
extract_range_from_ssa_name (vr, expr);
- else if (TREE_CODE_CLASS (code) == tcc_binary)
+ else if (TREE_CODE_CLASS (code) == tcc_binary
+ || code == TRUTH_ANDIF_EXPR
+ || code == TRUTH_ORIF_EXPR
+ || code == TRUTH_AND_EXPR
+ || code == TRUTH_OR_EXPR
+ || code == TRUTH_XOR_EXPR)
extract_range_from_binary_expr (vr, expr);
else if (TREE_CODE_CLASS (code) == tcc_unary)
extract_range_from_unary_expr (vr, expr);
+ else if (TREE_CODE_CLASS (code) == tcc_comparison)
+ extract_range_from_comparison (vr, expr);
else if (vrp_expr_computes_nonzero (expr))
set_value_range_to_nonnull (vr, TREE_TYPE (expr));
- else if (TREE_CODE (expr) == INTEGER_CST)
- set_value_range (vr, VR_RANGE, expr, expr);
+ else if (is_gimple_min_invariant (expr))
+ set_value_range (vr, VR_RANGE, expr, expr, NULL);
else
set_value_range_to_varying (vr);
}
-
-/* Given a range VR, a loop L and a variable VAR, determine whether it
+/* Given a range VR, a LOOP and a variable VAR, determine whether it
would be profitable to adjust VR using scalar evolution information
for VAR. If so, update VR with the new limits. */
static void
-adjust_range_with_scev (value_range *vr, struct loop *l, tree var)
+adjust_range_with_scev (value_range_t *vr, struct loop *loop, tree stmt,
+ tree var)
{
tree init, step, chrec;
bool init_is_max;
@@ -955,7 +1458,7 @@ adjust_range_with_scev (value_range *vr, struct loop *l, tree var)
if (vr->type == VR_ANTI_RANGE)
return;
- chrec = analyze_scalar_evolution (l, var);
+ chrec = analyze_scalar_evolution (loop, var);
if (TREE_CODE (chrec) != POLYNOMIAL_CHREC)
return;
@@ -967,27 +1470,23 @@ adjust_range_with_scev (value_range *vr, struct loop *l, tree var)
if (!is_gimple_min_invariant (step))
return;
- /* FIXME. When dealing with unsigned types,
- analyze_scalar_evolution sets STEP to very large unsigned values
- when the evolution goes backwards. This confuses this analysis
- because we think that INIT is the smallest value that the range
- can take, instead of the largest. Ignore these chrecs for now. */
- if (INTEGRAL_TYPE_P (TREE_TYPE (step)) && TYPE_UNSIGNED (TREE_TYPE (step)))
+ /* Do not adjust ranges when chrec may wrap. */
+ if (scev_probably_wraps_p (chrec_type (chrec), init, step, stmt,
+ cfg_loops->parray[CHREC_VARIABLE (chrec)],
+ &init_is_max))
return;
- /* If STEP is negative, then INIT is the maximum value the range
- will take. Otherwise, INIT is the minimum value. */
- init_is_max = (tree_int_cst_sgn (step) < 0);
-
if (!POINTER_TYPE_P (TREE_TYPE (init))
&& (vr->type == VR_VARYING || vr->type == VR_UNDEFINED))
{
/* For VARYING or UNDEFINED ranges, just about anything we get
from scalar evolutions should be better. */
if (init_is_max)
- set_value_range (vr, VR_RANGE, TYPE_MIN_VALUE (TREE_TYPE (init)), init);
+ set_value_range (vr, VR_RANGE, TYPE_MIN_VALUE (TREE_TYPE (init)),
+ init, vr->equiv);
else
- set_value_range (vr, VR_RANGE, init, TYPE_MAX_VALUE (TREE_TYPE (init)));
+ set_value_range (vr, VR_RANGE, init, TYPE_MAX_VALUE (TREE_TYPE (init)),
+ vr->equiv);
}
else if (vr->type == VR_RANGE)
{
@@ -1024,23 +1523,24 @@ adjust_range_with_scev (value_range *vr, struct loop *l, tree var)
}
}
- set_value_range (vr, VR_RANGE, min, max);
+ set_value_range (vr, VR_RANGE, min, max, vr->equiv);
}
}
/* Given two numeric value ranges VR0, VR1 and a comparison code COMP:
- - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for all the
- values in the ranges.
+ - Return BOOLEAN_TRUE_NODE if VR0 COMP VR1 always returns true for
+ all the values in the ranges.
- Return BOOLEAN_FALSE_NODE if the comparison always returns false.
- - Return NULL_TREE if it is not always possible to determine the value of
- the comparison. */
+ - Return NULL_TREE if it is not always possible to determine the
+ value of the comparison. */
+
static tree
-compare_ranges (enum tree_code comp, value_range *vr0, value_range *vr1)
+compare_ranges (enum tree_code comp, value_range_t *vr0, value_range_t *vr1)
{
/* VARYING or UNDEFINED ranges cannot be compared. */
if (vr0->type == VR_VARYING
@@ -1069,7 +1569,7 @@ compare_ranges (enum tree_code comp, value_range *vr0, value_range *vr1)
if (vr0->type == VR_RANGE)
{
/* To simplify processing, make VR0 the anti-range. */
- value_range *tmp = vr0;
+ value_range_t *tmp = vr0;
vr0 = vr1;
vr1 = tmp;
}
@@ -1087,7 +1587,7 @@ compare_ranges (enum tree_code comp, value_range *vr0, value_range *vr1)
operands around and change the comparison code. */
if (comp == GT_EXPR || comp == GE_EXPR)
{
- value_range *tmp;
+ value_range_t *tmp;
comp = (comp == GT_EXPR) ? LT_EXPR : LE_EXPR;
tmp = vr0;
vr0 = vr1;
@@ -1162,13 +1662,13 @@ compare_ranges (enum tree_code comp, value_range *vr0, value_range *vr1)
/* Given a value range VR, a value VAL and a comparison code COMP, return
- BOOLEAN_TRUE_NODE if VR COMP VR1 always returns true for all the
+ BOOLEAN_TRUE_NODE if VR COMP VAL always returns true for all the
values in VR. Return BOOLEAN_FALSE_NODE if the comparison
always returns false. Return NULL_TREE if it is not always
possible to determine the value of the comparison. */
static tree
-compare_range_with_value (enum tree_code comp, value_range *vr, tree val)
+compare_range_with_value (enum tree_code comp, value_range_t *vr, tree val)
{
if (vr->type == VR_VARYING || vr->type == VR_UNDEFINED)
return NULL_TREE;
@@ -1271,8 +1771,18 @@ compare_range_with_value (enum tree_code comp, value_range *vr, tree val)
/* Debugging dumps. */
+void dump_value_range (FILE *, value_range_t *);
+void debug_value_range (value_range_t *);
+void dump_all_value_ranges (FILE *);
+void debug_all_value_ranges (void);
+void dump_vr_equiv (FILE *, bitmap);
+void debug_vr_equiv (bitmap);
+
+
+/* Dump value range VR to FILE. */
+
void
-dump_value_range (FILE *file, value_range *vr)
+dump_value_range (FILE *file, value_range_t *vr)
{
if (vr == NULL)
fprintf (file, "[]");
@@ -1280,11 +1790,43 @@ dump_value_range (FILE *file, value_range *vr)
fprintf (file, "UNDEFINED");
else if (vr->type == VR_RANGE || vr->type == VR_ANTI_RANGE)
{
+ tree type = TREE_TYPE (vr->min);
+
fprintf (file, "%s[", (vr->type == VR_ANTI_RANGE) ? "~" : "");
- print_generic_expr (file, vr->min, 0);
+
+ if (INTEGRAL_TYPE_P (type)
+ && !TYPE_UNSIGNED (type)
+ && vr->min == TYPE_MIN_VALUE (type))
+ fprintf (file, "-INF");
+ else
+ print_generic_expr (file, vr->min, 0);
+
fprintf (file, ", ");
- print_generic_expr (file, vr->max, 0);
+
+ if (INTEGRAL_TYPE_P (type)
+ && vr->max == TYPE_MAX_VALUE (type))
+ fprintf (file, "+INF");
+ else
+ print_generic_expr (file, vr->max, 0);
+
fprintf (file, "]");
+
+ if (vr->equiv)
+ {
+ bitmap_iterator bi;
+ unsigned i, c = 0;
+
+ fprintf (file, " EQUIVALENCES: { ");
+
+ EXECUTE_IF_SET_IN_BITMAP (vr->equiv, 0, i, bi)
+ {
+ print_generic_expr (file, ssa_name (i), 0);
+ fprintf (file, " ");
+ c++;
+ }
+
+ fprintf (file, "} (%u elements)", c);
+ }
}
else if (vr->type == VR_VARYING)
fprintf (file, "VARYING");
@@ -1296,7 +1838,7 @@ dump_value_range (FILE *file, value_range *vr)
/* Dump value range VR to stderr. */
void
-debug_value_range (value_range *vr)
+debug_value_range (value_range_t *vr)
{
dump_value_range (stderr, vr);
}
@@ -1311,12 +1853,11 @@ dump_all_value_ranges (FILE *file)
for (i = 0; i < num_ssa_names; i++)
{
- tree var = ssa_name (i);
- if (var && SSA_NAME_VALUE_RANGE (var))
+ if (vr_value[i])
{
- print_generic_expr (file, var, 0);
+ print_generic_expr (file, ssa_name (i), 0);
fprintf (file, ": ");
- dump_value_range (file, SSA_NAME_VALUE_RANGE (var));
+ dump_value_range (file, vr_value[i]);
fprintf (file, "\n");
}
}
@@ -1334,10 +1875,6 @@ debug_all_value_ranges (void)
}
-/*---------------------------------------------------------------------------
- Value Range Propagation
----------------------------------------------------------------------------*/
-
/* Given a COND_EXPR COND of the form 'V OP W', and an SSA name V,
create a new SSA name N and return the assertion assignment
'V = ASSERT_EXPR <V, V OP W>'. */
@@ -1352,17 +1889,8 @@ build_assert_expr_for (tree cond, tree v)
if (COMPARISON_CLASS_P (cond))
{
- /* Build N = ASSERT_EXPR <V, COND>. As a special case, if the
- conditional is an EQ_EXPR (V == Z), just build the assignment
- N = Z. */
- if (TREE_CODE (cond) == EQ_EXPR)
- {
- tree other = get_opposite_operand (cond, v);
- assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, other);
- }
- else
- assertion = build (MODIFY_EXPR, TREE_TYPE (v), n,
- build (ASSERT_EXPR, TREE_TYPE (v), v, cond));
+ tree a = build (ASSERT_EXPR, TREE_TYPE (v), v, cond);
+ assertion = build (MODIFY_EXPR, TREE_TYPE (v), n, a);
}
else if (TREE_CODE (cond) == TRUTH_NOT_EXPR)
{
@@ -1403,16 +1931,26 @@ fp_predicate (tree expr)
}
-/* Return an expression predicate that represents the range of values
- that can be taken by operand OP after STMT executes. */
+/* If the range of values taken by OP can be inferred after STMT executes,
+ return the comparison code (COMP_CODE_P) and value (VAL_P) that
+ describes the inferred range. Return true if a range could be
+ inferred. */
-static tree
-infer_value_range (tree stmt, tree op)
+static bool
+infer_value_range (tree stmt, tree op, enum tree_code *comp_code_p, tree *val_p)
{
+ *val_p = NULL_TREE;
+ *comp_code_p = ERROR_MARK;
+
/* Do not attempt to infer anything in names that flow through
abnormal edges. */
if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
- return NULL_TREE;
+ return false;
+
+ /* Similarly, don't infer anything from statements that may throw
+ exceptions. */
+ if (tree_could_throw_p (stmt))
+ return false;
if (POINTER_TYPE_P (TREE_TYPE (op)))
{
@@ -1424,83 +1962,371 @@ infer_value_range (tree stmt, tree op)
{
/* We can only assume that a pointer dereference will yield
non-NULL if -fdelete-null-pointer-checks is enabled. */
- tree null = build_int_cst (TREE_TYPE (op), 0);
- tree t = build (NE_EXPR, boolean_type_node, op, null);
- return t;
+ *val_p = build_int_cst (TREE_TYPE (op), 0);
+ *comp_code_p = NE_EXPR;
+ return true;
}
}
- return NULL_TREE;
+ return false;
+}
+
+
+void dump_asserts_for (FILE *, tree);
+void debug_asserts_for (tree);
+void dump_all_asserts (FILE *);
+void debug_all_asserts (void);
+
+/* Dump all the registered assertions for NAME to FILE. */
+
+void
+dump_asserts_for (FILE *file, tree name)
+{
+ assert_locus_t loc;
+
+ fprintf (file, "Assertions to be inserted for ");
+ print_generic_expr (file, name, 0);
+ fprintf (file, "\n");
+
+ loc = asserts_for[SSA_NAME_VERSION (name)];
+ while (loc)
+ {
+ fprintf (file, "\t");
+ print_generic_expr (file, bsi_stmt (loc->si), 0);
+ fprintf (file, "\n\tBB #%d", loc->bb->index);
+ if (loc->e)
+ {
+ fprintf (file, "\n\tEDGE %d->%d", loc->e->src->index,
+ loc->e->dest->index);
+ dump_edge_info (file, loc->e, 0);
+ }
+ fprintf (file, "\n\tPREDICATE: ");
+ print_generic_expr (file, name, 0);
+ fprintf (file, " %s ", tree_code_name[(int)loc->comp_code]);
+ print_generic_expr (file, loc->val, 0);
+ fprintf (file, "\n\n");
+ loc = loc->next;
+ }
+
+ fprintf (file, "\n");
}
-/* Return true if OP is the result of an ASSERT_EXPR that tests the
- same condition as COND. */
+/* Dump all the registered assertions for NAME to stderr. */
+
+void
+debug_asserts_for (tree name)
+{
+ dump_asserts_for (stderr, name);
+}
+
+
+/* Dump all the registered assertions for all the names to FILE. */
+
+void
+dump_all_asserts (FILE *file)
+{
+ unsigned i;
+ bitmap_iterator bi;
+
+ fprintf (file, "\nASSERT_EXPRs to be inserted\n\n");
+ EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
+ dump_asserts_for (file, ssa_name (i));
+ fprintf (file, "\n");
+}
+
+
+/* Dump all the registered assertions for all the names to stderr. */
+
+void
+debug_all_asserts (void)
+{
+ dump_all_asserts (stderr);
+}
+
+
+/* If NAME doesn't have an ASSERT_EXPR registered for asserting
+ 'NAME COMP_CODE VAL' at a location that dominates block BB or
+ E->DEST, then register this location as a possible insertion point
+ for ASSERT_EXPR <NAME, NAME COMP_CODE VAL>.
+
+ BB, E and SI provide the exact insertion point for the new
+ ASSERT_EXPR. If BB is NULL, then the ASSERT_EXPR is to be inserted
+ on edge E. Otherwise, if E is NULL, the ASSERT_EXPR is inserted on
+ BB. If SI points to a COND_EXPR or a SWITCH_EXPR statement, then E
+ must not be NULL. */
+
+static void
+register_new_assert_for (tree name,
+ enum tree_code comp_code,
+ tree val,
+ basic_block bb,
+ edge e,
+ block_stmt_iterator si)
+{
+ assert_locus_t n, loc, last_loc;
+ bool found;
+ basic_block dest_bb;
+
+#if defined ENABLE_CHECKING
+ gcc_assert (bb == NULL || e == NULL);
+
+ if (e == NULL)
+ gcc_assert (TREE_CODE (bsi_stmt (si)) != COND_EXPR
+ && TREE_CODE (bsi_stmt (si)) != SWITCH_EXPR);
+#endif
+
+ /* The new assertion A will be inserted at BB or E. We need to
+ determine if the new location is dominated by a previously
+ registered location for A. If we are doing an edge insertion,
+ assume that A will be inserted at E->DEST. Note that this is not
+ necessarily true.
+
+ If E is a critical edge, it will be split. But even if E is
+ split, the new block will dominate the same set of blocks that
+ E->DEST dominates.
+
+ The reverse, however, is not true, blocks dominated by E->DEST
+ will not be dominated by the new block created to split E. So,
+ if the insertion location is on a critical edge, we will not use
+ the new location to move another assertion previously registered
+ at a block dominated by E->DEST. */
+ dest_bb = (bb) ? bb : e->dest;
+
+ /* If NAME already has an ASSERT_EXPR registered for COMP_CODE and
+ VAL at a block dominating DEST_BB, then we don't need to insert a new
+ one. Similarly, if the same assertion already exists at a block
+ dominated by DEST_BB and the new location is not on a critical
+ edge, then update the existing location for the assertion (i.e.,
+ move the assertion up in the dominance tree).
+
+ Note, this is implemented as a simple linked list because there
+ should not be more than a handful of assertions registered per
+ name. If this becomes a performance problem, a table hashed by
+ COMP_CODE and VAL could be implemented. */
+ loc = asserts_for[SSA_NAME_VERSION (name)];
+ last_loc = loc;
+ found = false;
+ while (loc)
+ {
+ if (loc->comp_code == comp_code
+ && (loc->val == val
+ || operand_equal_p (loc->val, val, 0)))
+ {
+ /* If the assertion NAME COMP_CODE VAL has already been
+ registered at a basic block that dominates DEST_BB, then
+ we don't need to insert the same assertion again. Note
+ that we don't check strict dominance here to avoid
+ replicating the same assertion inside the same basic
+ block more than once (e.g., when a pointer is
+ dereferenced several times inside a block).
+
+ An exception to this rule are edge insertions. If the
+ new assertion is to be inserted on edge E, then it will
+ dominate all the other insertions that we may want to
+ insert in DEST_BB. So, if we are doing an edge
+ insertion, don't do this dominance check. */
+ if (e == NULL
+ && dominated_by_p (CDI_DOMINATORS, dest_bb, loc->bb))
+ return;
+
+ /* Otherwise, if E is not a critical edge and DEST_BB
+ dominates the existing location for the assertion, move
+ the assertion up in the dominance tree by updating its
+ location information. */
+ if ((e == NULL || !EDGE_CRITICAL_P (e))
+ && dominated_by_p (CDI_DOMINATORS, loc->bb, dest_bb))
+ {
+ loc->bb = dest_bb;
+ loc->e = e;
+ loc->si = si;
+ return;
+ }
+ }
+
+ /* Update the last node of the list and move to the next one. */
+ last_loc = loc;
+ loc = loc->next;
+ }
+
+ /* If we didn't find an assertion already registered for
+ NAME COMP_CODE VAL, add a new one at the end of the list of
+ assertions associated with NAME. */
+ n = xmalloc (sizeof (*n));
+ n->bb = dest_bb;
+ n->e = e;
+ n->si = si;
+ n->comp_code = comp_code;
+ n->val = val;
+ n->next = NULL;
+
+ if (last_loc)
+ last_loc->next = n;
+ else
+ asserts_for[SSA_NAME_VERSION (name)] = n;
+
+ bitmap_set_bit (need_assert_for, SSA_NAME_VERSION (name));
+}
+
+
+/* Try to register an edge assertion for SSA name NAME on edge E for
+ the conditional jump pointed by SI. Return true if an assertion
+ for NAME could be registered. */
static bool
-has_assert_expr (tree op, tree cond)
+register_edge_assert_for (tree name, edge e, block_stmt_iterator si)
{
- tree def_stmt = SSA_NAME_DEF_STMT (op);
- tree assert_expr, other_cond, other_op;
+ tree val, stmt;
+ enum tree_code comp_code;
+
+ stmt = bsi_stmt (si);
- /* If OP was not generated by an ASSERT_EXPR, return false. */
- if (TREE_CODE (def_stmt) != MODIFY_EXPR
- || TREE_CODE (TREE_OPERAND (def_stmt, 1)) != ASSERT_EXPR)
+ /* Do not attempt to infer anything in names that flow through
+ abnormal edges. */
+ if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
return false;
- assert_expr = TREE_OPERAND (def_stmt, 1);
- other_cond = ASSERT_EXPR_COND (assert_expr);
- other_op = ASSERT_EXPR_VAR (assert_expr);
+ /* If NAME was not found in the sub-graph reachable from E, then
+ there's nothing to do. */
+ if (!TEST_BIT (found_in_subgraph, SSA_NAME_VERSION (name)))
+ return false;
- if (TREE_CODE (cond) == TREE_CODE (other_cond))
+ /* We found a use of NAME in the sub-graph rooted at E->DEST.
+ Register an assertion for NAME according to the value that NAME
+ takes on edge E. */
+ if (TREE_CODE (stmt) == COND_EXPR)
{
- tree t1, t2;
-
- /* If COND is not a comparison predicate, something is wrong. */
- gcc_assert (COMPARISON_CLASS_P (cond));
+ /* If BB ends in a COND_EXPR then NAME then we should insert
+ the original predicate on EDGE_TRUE_VALUE and the
+ opposite predicate on EDGE_FALSE_VALUE. */
+ tree cond = COND_EXPR_COND (stmt);
+ bool is_else_edge = (e->flags & EDGE_FALSE_VALUE) != 0;
- /* Note that we only need to compare against one of the operands
- of OTHER_COND.
-
- Suppose that we are about to insert the assertion ASSERT_EXPR
- <x_4, x_4 != 0> and the defining statement for x_4 is x_4 =
- ASSERT_EXPR <x_3, x_3 != 0>.
-
- In this case, we don't really want to insert a new
- ASSERT_EXPR for x_4 because that would be redundant. We
- already know that x_4 is not 0. So, when comparing the
- conditionals 'x_3 != 0' and 'x_4 != 0', we don't want to
- compare x_3 and x_4, we just want to compare the predicate's
- code (!=) and the other operand (0). */
- if (TREE_OPERAND (cond, 0) == op)
- t1 = TREE_OPERAND (cond, 1);
+ /* Predicates may be a single SSA name or NAME OP VAL. */
+ if (cond == name)
+ {
+ /* If the predicate is a name, it must be NAME, in which
+ case we create the predicate NAME == true or
+ NAME == false accordingly. */
+ comp_code = EQ_EXPR;
+ val = (is_else_edge) ? boolean_false_node : boolean_true_node;
+ }
else
- t1 = TREE_OPERAND (cond, 0);
+ {
+ /* Otherwise, we have a comparison of the form NAME COMP VAL
+ or VAL COMP NAME. */
+ if (name == TREE_OPERAND (cond, 1))
+ {
+ /* If the predicate is of the form VAL COMP NAME, flip
+ COMP around because we need to register NAME as the
+ first operand in the predicate. */
+ comp_code = opposite_comparison (TREE_CODE (cond));
+ val = TREE_OPERAND (cond, 0);
+ }
+ else
+ {
+ /* The comparison is of the form NAME COMP VAL, so the
+ comparison code remains unchanged. */
+ comp_code = TREE_CODE (cond);
+ val = TREE_OPERAND (cond, 1);
+ }
- if (TREE_OPERAND (other_cond, 0) == other_op)
- t2 = TREE_OPERAND (other_cond, 1);
- else
- t2 = TREE_OPERAND (other_cond, 0);
+ /* If we are inserting the assertion on the ELSE edge, we
+ need to invert the sign comparison. */
+ if (is_else_edge)
+ comp_code = invert_tree_comparison (comp_code, 0);
+ }
+ }
+ else
+ {
+ /* FIXME. Handle SWITCH_EXPR. */
+ gcc_unreachable ();
+ }
+
+ register_new_assert_for (name, comp_code, val, NULL, e, si);
+ return true;
+}
+
+
+static bool find_assert_locations (basic_block bb);
+
+/* Determine whether the outgoing edges of BB should receive an
+ ASSERT_EXPR for each of the operands of BB's last statement. The
+ last statement of BB must be a COND_EXPR or a SWITCH_EXPR.
- return (t1 == t2 || operand_equal_p (t1, t2, 0));
+ If any of the sub-graphs rooted at BB have an interesting use of
+ the predicate operands, an assert location node is added to the
+ list of assertions for the corresponding operands. */
+
+static bool
+find_conditional_asserts (basic_block bb)
+{
+ bool need_assert;
+ block_stmt_iterator last_si;
+ tree op, last;
+ edge_iterator ei;
+ edge e;
+ ssa_op_iter iter;
+
+ need_assert = false;
+ last_si = bsi_last (bb);
+ last = bsi_stmt (last_si);
+
+ /* Look for uses of the operands in each of the sub-graphs
+ rooted at BB. We need to check each of the outgoing edges
+ separately, so that we know what kind of ASSERT_EXPR to
+ insert. */
+ FOR_EACH_EDGE (e, ei, bb->succs)
+ {
+ if (e->dest == bb)
+ continue;
+
+ /* Remove the COND_EXPR operands from the FOUND_IN_SUBGRAPH bitmap.
+ Otherwise, when we finish traversing each of the sub-graphs, we
+ won't know whether the variables were found in the sub-graphs or
+ if they had been found in a block upstream from BB. */
+ FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
+ RESET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
+
+ /* Traverse the strictly dominated sub-graph rooted at E->DEST
+ to determine if any of the operands in the conditional
+ predicate are used. */
+ if (e->dest != bb)
+ need_assert |= find_assert_locations (e->dest);
+
+ /* Register the necessary assertions for each operand in the
+ conditional predicate. */
+ FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
+ need_assert |= register_edge_assert_for (op, e, last_si);
}
- return false;
+ /* Finally, indicate that we have found the operands in the
+ conditional. */
+ FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
+ SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
+
+ return need_assert;
}
-/* Traverse all the statements in block BB looking for used variables.
- Variables used in BB are added to bitmap FOUND. The algorithm
- works in three main parts:
+/* Traverse all the statements in block BB looking for statements that
+ may generate useful assertions for the SSA names in their operand.
+ If a statement produces a useful assertion A for name N_i, then the
+ list of assertions already generated for N_i is scanned to
+ determine if A is actually needed.
+
+ If N_i already had the assertion A at a location dominating the
+ current location, then nothing needs to be done. Otherwise, the
+ new location for A is recorded instead.
1- For every statement S in BB, all the variables used by S are
- added to bitmap FOUND.
+ added to bitmap FOUND_IN_SUBGRAPH.
2- If statement S uses an operand N in a way that exposes a known
value range for N, then if N was not already generated by an
- ASSERT_EXPR, create a new ASSERT_EXPR for N. For instance, if N
- is a pointer and the statement dereferences it, we can assume
- that N is not NULL.
+ ASSERT_EXPR, create a new assert location for N. For instance,
+ if N is a pointer and the statement dereferences it, we can
+ assume that N is not NULL.
3- COND_EXPRs are a special case of #2. We can derive range
information from the predicate but need to insert different
@@ -1508,112 +2334,116 @@ has_assert_expr (tree op, tree cond)
conditional block. If the last statement of BB is a conditional
expression of the form 'X op Y', then
- a) Remove X and Y from the set FOUND.
+ a) Remove X and Y from the set FOUND_IN_SUBGRAPH.
- b) If the conditional dominates its THEN_CLAUSE sub-graph,
- recurse into it. On return, if X and/or Y are marked in
- FOUND, then an ASSERT_EXPR is added for the corresponding
- variable.
+ b) If the conditional is the only entry point to the sub-graph
+ corresponding to the THEN_CLAUSE, recurse into it. On
+ return, if X and/or Y are marked in FOUND_IN_SUBGRAPH, then
+ an ASSERT_EXPR is added for the corresponding variable.
c) Repeat step (b) on the ELSE_CLAUSE.
- d) Mark X and Y in FOUND.
+ d) Mark X and Y in FOUND_IN_SUBGRAPH.
+
+ For instance,
+
+ if (a == 9)
+ b = a;
+ else
+ b = c + 1;
+
+ In this case, an assertion on the THEN clause is useful to
+ determine that 'a' is always 9 on that edge. However, an assertion
+ on the ELSE clause would be unnecessary.
4- If BB does not end in a conditional expression, then we recurse
into BB's dominator children.
- At the end of the recursive traversal, ASSERT_EXPRs will have been
- added to the edges of COND_EXPR blocks that have sub-graphs using
- one or both predicate operands. For instance,
-
- if (a == 9)
- b = a;
- else
- b = c + 1;
-
- In this case, an assertion on the THEN clause is useful to
- determine that 'a' is always 9 on that edge. However, an assertion
- on the ELSE clause would be unnecessary.
-
- On exit from this function, all the names created by the newly
- inserted ASSERT_EXPRs need to be added to the SSA web by rewriting
- the SSA names that they replace.
-
+ At the end of the recursive traversal, every SSA name will have a
+ list of locations where ASSERT_EXPRs should be added. When a new
+ location for name N is found, it is registered by calling
+ register_new_assert_for. That function keeps track of all the
+ registered assertions to prevent adding unnecessary assertions.
+ For instance, if a pointer P_4 is dereferenced more than once in a
+ dominator tree, only the location dominating all the dereference of
+ P_4 will receive an ASSERT_EXPR.
+
+ If this function returns true, then it means that there are names
+ for which we need to generate ASSERT_EXPRs. Those assertions are
+ inserted by process_assert_insertions.
+
TODO. Handle SWITCH_EXPR. */
static bool
-maybe_add_assert_expr (basic_block bb)
+find_assert_locations (basic_block bb)
{
block_stmt_iterator si;
- tree last;
- bool added;
+ tree last, phi;
+ bool need_assert;
+ basic_block son;
+
+ if (TEST_BIT (blocks_visited, bb->index))
+ return false;
+
+ SET_BIT (blocks_visited, bb->index);
+
+ need_assert = false;
+
+ /* Traverse all PHI nodes in BB marking used operands. */
+ for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
+ {
+ use_operand_p arg_p;
+ ssa_op_iter i;
- /* Step 1. Mark all the SSA names used in BB in bitmap FOUND. */
- added = false;
+ FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE)
+ {
+ tree arg = USE_FROM_PTR (arg_p);
+ if (TREE_CODE (arg) == SSA_NAME)
+ {
+ gcc_assert (is_gimple_reg (PHI_RESULT (phi)));
+ SET_BIT (found_in_subgraph, SSA_NAME_VERSION (arg));
+ }
+ }
+ }
+
+ /* Traverse all the statements in BB marking used names and looking
+ for statements that may infer assertions for their used operands. */
last = NULL_TREE;
for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
{
tree stmt, op;
ssa_op_iter i;
-
+
stmt = bsi_stmt (si);
- /* Mark all the SSA names used by STMT in bitmap FOUND. If STMT
- is inside the sub-graph of a conditional block, when we
- return from this recursive walk, our parent will use the
- FOUND bitset to determine if one of the operands it was
- looking for was present in the sub-graph. */
+ /* See if we can derive an assertion for any of STMT's operands. */
FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
{
- tree cond;
+ tree value;
+ enum tree_code comp_code;
+
+ /* Mark OP in bitmap FOUND_IN_SUBGRAPH. If STMT is inside
+ the sub-graph of a conditional block, when we return from
+ this recursive walk, our parent will use the
+ FOUND_IN_SUBGRAPH bitset to determine if one of the
+ operands it was looking for was present in the sub-graph. */
+ SET_BIT (found_in_subgraph, SSA_NAME_VERSION (op));
/* If OP is used only once, namely in this STMT, don't
- bother inserting an ASSERT_EXPR for it. Such an
+ bother creating an ASSERT_EXPR for it. Such an
ASSERT_EXPR would do nothing but increase compile time.
Experiments show that with this simple check, we can save
more than 20% of ASSERT_EXPRs. */
if (has_single_use (op))
continue;
- SET_BIT (found, SSA_NAME_VERSION (op));
-
- cond = infer_value_range (stmt, op);
- if (!cond)
- continue;
-
- /* Step 2. If OP is used in such a way that we can infer a
- value range for it, create a new ASSERT_EXPR for OP
- (unless OP already has an ASSERT_EXPR). */
- gcc_assert (!is_ctrl_stmt (stmt));
-
- if (has_assert_expr (op, cond))
- continue;
-
- if (!stmt_ends_bb_p (stmt))
- {
- /* If STMT does not end the block, we can insert the new
- assertion right after it. */
- tree t = build_assert_expr_for (cond, op);
- bsi_insert_after (&si, t, BSI_NEW_STMT);
- added = true;
- }
- else
+ /* If OP is used in such a way that we can infer a value
+ range for it, and we don't find a previous assertion for
+ it, create a new assertion location node for OP. */
+ if (infer_value_range (stmt, op, &comp_code, &value))
{
- /* STMT must be the last statement in BB. We can only
- insert new assertions on the non-abnormal edge out of
- BB. Note that since STMT is not control flow, there
- may only be one non-abnormal edge out of BB. */
- edge_iterator ei;
- edge e;
-
- FOR_EACH_EDGE (e, ei, bb->succs)
- if (!(e->flags & EDGE_ABNORMAL))
- {
- tree t = build_assert_expr_for (cond, op);
- bsi_insert_on_edge (e, t);
- added = true;
- break;
- }
+ register_new_assert_for (op, comp_code, value, bb, NULL, si);
+ need_assert = true;
}
}
@@ -1621,103 +2451,112 @@ maybe_add_assert_expr (basic_block bb)
last = stmt;
}
- /* Step 3. If BB's last statement is a conditional expression
+ /* If BB's last statement is a conditional expression
involving integer operands, recurse into each of the sub-graphs
- rooted at BB to determine if we need to add ASSERT_EXPRs.
- Notice that we only care about the first operand of the
- conditional. Adding assertions for both operands may actually
- hinder VRP. FIXME, add example. */
+ rooted at BB to determine if we need to add ASSERT_EXPRs. */
if (last
&& TREE_CODE (last) == COND_EXPR
&& !fp_predicate (COND_EXPR_COND (last))
&& !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
+ need_assert |= find_conditional_asserts (bb);
+
+ /* Recurse into the dominator children of BB. */
+ for (son = first_dom_son (CDI_DOMINATORS, bb);
+ son;
+ son = next_dom_son (CDI_DOMINATORS, son))
+ need_assert |= find_assert_locations (son);
+
+ return need_assert;
+}
+
+
+/* Create an ASSERT_EXPR for NAME and insert it in the location
+ indicated by LOC. Return true if we made any edge insertions. */
+
+static bool
+process_assert_insertions_for (tree name, assert_locus_t loc)
+{
+ /* Build the comparison expression NAME_i COMP_CODE VAL. */
+ tree stmt, cond, assert_expr;
+ edge_iterator ei;
+ edge e;
+
+ cond = build (loc->comp_code, boolean_type_node, name, loc->val);
+ assert_expr = build_assert_expr_for (cond, name);
+
+ if (loc->e)
{
- edge e;
- edge_iterator ei;
- tree op, cond;
- basic_block son;
- ssa_op_iter iter;
-
- cond = COND_EXPR_COND (last);
+ /* We have been asked to insert the assertion on an edge. This
+ is used only by COND_EXPR and SWITCH_EXPR assertions. */
+#if defined ENABLE_CHECKING
+ gcc_assert (TREE_CODE (bsi_stmt (loc->si)) == COND_EXPR
+ || TREE_CODE (bsi_stmt (loc->si)) == SWITCH_EXPR);
+#endif
+
+ bsi_insert_on_edge (loc->e, assert_expr);
+ return true;
+ }
+
+ /* Otherwise, we can insert right after LOC->SI iff the
+ statement must not be the last statement in the block. */
+ stmt = bsi_stmt (loc->si);
+ if (!stmt_ends_bb_p (stmt))
+ {
+ bsi_insert_after (&loc->si, assert_expr, BSI_SAME_STMT);
+ return false;
+ }
+
+ /* If STMT must be the last statement in BB, we can only insert new
+ assertions on the non-abnormal edge out of BB. Note that since
+ STMT is not control flow, there may only be one non-abnormal edge
+ out of BB. */
+ FOR_EACH_EDGE (e, ei, loc->bb->succs)
+ if (!(e->flags & EDGE_ABNORMAL))
+ {
+ bsi_insert_on_edge (e, assert_expr);
+ return true;
+ }
+
+ gcc_unreachable ();
+}
- /* Get just the first use operand. */
- FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
- break;
- gcc_assert (op != NULL);
-
- /* Do not attempt to infer anything in names that flow through
- abnormal edges. */
- if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op))
- return false;
-
- /* Remove the COND_EXPR operand from the FOUND bitmap.
- Otherwise, when we finish traversing each of the sub-graphs,
- we won't know whether the variables were found in the
- sub-graphs or if they had been found in a block upstream from
- BB. */
- RESET_BIT (found, SSA_NAME_VERSION (op));
-
- /* Look for uses of the operands in each of the sub-graphs
- rooted at BB. We need to check each of the outgoing edges
- separately, so that we know what kind of ASSERT_EXPR to
- insert. */
- FOR_EACH_EDGE (e, ei, bb->succs)
- {
- /* If BB strictly dominates the sub-graph at E->DEST,
- recurse into it. */
- if (e->dest != bb
- && dominated_by_p (CDI_DOMINATORS, e->dest, bb))
- added |= maybe_add_assert_expr (e->dest);
-
- /* Once we traversed the sub-graph, check if any block inside
- used either of the predicate's operands. If so, add the
- appropriate ASSERT_EXPR. */
- if (TEST_BIT (found, SSA_NAME_VERSION (op)))
- {
- /* We found a use of OP in the sub-graph rooted at
- E->DEST. Add an ASSERT_EXPR according to whether
- E goes to THEN_CLAUSE or ELSE_CLAUSE. */
- tree c, t;
-
- if (e->flags & EDGE_TRUE_VALUE)
- c = unshare_expr (cond);
- else if (e->flags & EDGE_FALSE_VALUE)
- c = invert_truthvalue (cond);
- else
- gcc_unreachable ();
-
- t = build_assert_expr_for (c, op);
- bsi_insert_on_edge (e, t);
- added = true;
- }
- }
- /* Finally, mark all the COND_EXPR operands as found. */
- SET_BIT (found, SSA_NAME_VERSION (op));
+/* Process all the insertions registered for every name N_i registered
+ in NEED_ASSERT_FOR. The list of assertions to be inserted are
+ found in ASSERTS_FOR[i]. */
- /* Recurse into the dominator children of BB that are not BB's
- immediate successors. Note that we have already visited BB's
- other dominator children above. */
- for (son = first_dom_son (CDI_DOMINATORS, bb);
- son;
- son = next_dom_son (CDI_DOMINATORS, son))
+static void
+process_assert_insertions (void)
+{
+ unsigned i;
+ bitmap_iterator bi;
+ bool update_edges_p = false;
+ int num_asserts = 0;
+
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ dump_all_asserts (dump_file);
+
+ EXECUTE_IF_SET_IN_BITMAP (need_assert_for, 0, i, bi)
+ {
+ assert_locus_t loc = asserts_for[i];
+ gcc_assert (loc);
+
+ while (loc)
{
- if (find_edge (bb, son) == NULL)
- added |= maybe_add_assert_expr (son);
+ assert_locus_t next = loc->next;
+ update_edges_p |= process_assert_insertions_for (ssa_name (i), loc);
+ free (loc);
+ loc = next;
+ num_asserts++;
}
}
- else
- {
- /* Step 4. Recurse into the dominator children of BB. */
- basic_block son;
- for (son = first_dom_son (CDI_DOMINATORS, bb);
- son;
- son = next_dom_son (CDI_DOMINATORS, son))
- added |= maybe_add_assert_expr (son);
- }
+ if (update_edges_p)
+ bsi_commit_edge_inserts ();
- return added;
+ if (dump_file && (dump_flags & TDF_STATS))
+ fprintf (dump_file, "\nNumber of ASSERT_EXPR expressions inserted: %d\n\n",
+ num_asserts);
}
@@ -1760,19 +2599,26 @@ insert_range_assertions (void)
edge_iterator ei;
bool update_ssa_p;
- found = sbitmap_alloc (num_ssa_names);
- sbitmap_zero (found);
+ found_in_subgraph = sbitmap_alloc (num_ssa_names);
+ sbitmap_zero (found_in_subgraph);
+
+ blocks_visited = sbitmap_alloc (last_basic_block);
+ sbitmap_zero (blocks_visited);
+
+ need_assert_for = BITMAP_ALLOC (NULL);
+ asserts_for = xmalloc (num_ssa_names * sizeof (assert_locus_t));
+ memset (asserts_for, 0, num_ssa_names * sizeof (assert_locus_t));
calculate_dominance_info (CDI_DOMINATORS);
update_ssa_p = false;
FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
- if (maybe_add_assert_expr (e->dest))
+ if (find_assert_locations (e->dest))
update_ssa_p = true;
if (update_ssa_p)
{
- bsi_commit_edge_inserts ();
+ process_assert_insertions ();
update_ssa (TODO_update_ssa_no_phi);
}
@@ -1782,11 +2628,27 @@ insert_range_assertions (void)
dump_function_to_file (current_function_decl, dump_file, dump_flags);
}
- sbitmap_free (found);
+ sbitmap_free (found_in_subgraph);
+ free (asserts_for);
+ BITMAP_FREE (need_assert_for);
}
-/* Convert range assertion expressions into copies. FIXME, explain why. */
+/* Convert range assertion expressions into the implied copies.
+
+ FIXME, this will eventually lead to copy propagation removing the
+ names that had useful range information attached to them. For
+ instance, if we had the assertion N_i = ASSERT_EXPR <N_j, N_j > 3>,
+ then N_i will have the range [3, +INF].
+
+ However, by converting the assertion into the implied copy
+ operation N_i = N_j, we will then copy-propagate N_j into the uses
+ of N_i and lose the range information. We may want to hold on to
+ ASSERT_EXPRs a little while longer as the ranges could be used in
+ things like jump threading.
+
+ The problem with keeping ASSERT_EXPRs around is that passes after
+ VRP need to handle them appropriately. */
static void
remove_range_assertions (void)
@@ -1843,15 +2705,13 @@ stmt_interesting_for_vrp (tree stmt)
is worth running (i.e. if we found any statements that could
benefit from range information). */
-static bool
+static void
vrp_initialize (void)
{
basic_block bb;
- bool do_vrp;
- /* If we don't find any ASSERT_EXPRs in the code, there's no point
- running VRP. */
- do_vrp = false;
+ vr_value = xmalloc (num_ssa_names * sizeof (value_range_t *));
+ memset (vr_value, 0, num_ssa_names * sizeof (value_range_t *));
FOR_EACH_BB (bb)
{
@@ -1884,16 +2744,10 @@ vrp_initialize (void)
}
else
{
- if (TREE_CODE (stmt) == MODIFY_EXPR
- && TREE_CODE (TREE_OPERAND (stmt, 1)) == ASSERT_EXPR)
- do_vrp = true;
-
DONT_SIMULATE_AGAIN (stmt) = false;
}
}
}
-
- return do_vrp;
}
@@ -1914,28 +2768,27 @@ vrp_visit_assignment (tree stmt, tree *output_p)
&& (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
|| POINTER_TYPE_P (TREE_TYPE (lhs))))
{
- value_range *vr, new_vr;
struct loop *l;
-
- vr = get_value_range (lhs);
+ value_range_t new_vr = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
+
extract_range_from_expr (&new_vr, rhs);
/* If STMT is inside a loop, we may be able to know something
else about the range of LHS by examining scalar evolution
information. */
if (cfg_loops && (l = loop_containing_stmt (stmt)))
- adjust_range_with_scev (&new_vr, l, lhs);
+ adjust_range_with_scev (&new_vr, l, stmt, lhs);
- if (update_value_range (vr, new_vr.type, new_vr.min, new_vr.max))
+ if (update_value_range (lhs, &new_vr))
{
*output_p = lhs;
if (dump_file && (dump_flags & TDF_DETAILS))
{
- fprintf (dump_file, "Found new range ");
- dump_value_range (dump_file, &new_vr);
- fprintf (dump_file, " for ");
+ fprintf (dump_file, "Found new range for ");
print_generic_expr (dump_file, lhs, 0);
+ fprintf (dump_file, ": ");
+ dump_value_range (dump_file, &new_vr);
fprintf (dump_file, "\n\n");
}
@@ -1948,7 +2801,7 @@ vrp_visit_assignment (tree stmt, tree *output_p)
return SSA_PROP_NOT_INTERESTING;
}
- /* Every other statements produces no useful ranges. */
+ /* Every other statement produces no useful ranges. */
FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
set_value_range_to_varying (get_value_range (def));
@@ -1956,43 +2809,226 @@ vrp_visit_assignment (tree stmt, tree *output_p)
}
-/* Given a conditional predicate COND, try to determine if COND yields
- true or false based on the value ranges of its operands. */
+/* Compare all the value ranges for names equivalent to VAR with VAL
+ using comparison code COMP. Return the same value returned by
+ compare_range_with_value. */
static tree
-vrp_evaluate_conditional (tree cond)
+compare_name_with_value (enum tree_code comp, tree var, tree val)
+{
+ bitmap_iterator bi;
+ unsigned i;
+ bitmap e;
+ tree retval, t;
+
+ t = retval = NULL_TREE;
+
+ /* Get the set of equivalences for VAR. */
+ e = get_value_range (var)->equiv;
+
+ /* Add VAR to its own set of equivalences so that VAR's value range
+ is processed by this loop (otherwise, we would have to replicate
+ the body of the loop just to check VAR's value range). */
+ bitmap_set_bit (e, SSA_NAME_VERSION (var));
+
+ EXECUTE_IF_SET_IN_BITMAP (e, 0, i, bi)
+ {
+ value_range_t equiv_vr = *(vr_value[i]);
+
+ /* If name N_i does not have a valid range, use N_i as its own
+ range. This allows us to compare against names that may
+ have N_i in their ranges. */
+ if (equiv_vr.type == VR_VARYING || equiv_vr.type == VR_UNDEFINED)
+ {
+ equiv_vr.type = VR_RANGE;
+ equiv_vr.min = ssa_name (i);
+ equiv_vr.max = ssa_name (i);
+ }
+
+ t = compare_range_with_value (comp, &equiv_vr, val);
+ if (t)
+ {
+ /* All the ranges should compare the same against VAL. */
+ gcc_assert (retval == NULL || t == retval);
+ retval = t;
+ }
+ }
+
+ /* Remove VAR from its own equivalence set. */
+ bitmap_clear_bit (e, SSA_NAME_VERSION (var));
+
+ if (retval)
+ return retval;
+
+ /* We couldn't find a non-NULL value for the predicate. */
+ return NULL_TREE;
+}
+
+
+/* Given a comparison code COMP and names N1 and N2, compare all the
+ ranges equivalent to N1 against all the ranges equivalent to N2
+ to determine the value of N1 COMP N2. Return the same value
+ returned by compare_ranges. */
+
+static tree
+compare_names (enum tree_code comp, tree n1, tree n2)
+{
+ tree t, retval;
+ bitmap e1, e2;
+ bitmap_iterator bi1, bi2;
+ unsigned i1, i2;
+
+ /* Compare the ranges of every name equivalent to N1 against the
+ ranges of every name equivalent to N2. */
+ e1 = get_value_range (n1)->equiv;
+ e2 = get_value_range (n2)->equiv;
+
+ /* Add N1 and N2 to their own set of equivalences to avoid
+ duplicating the body of the loop just to check N1 and N2
+ ranges. */
+ bitmap_set_bit (e1, SSA_NAME_VERSION (n1));
+ bitmap_set_bit (e2, SSA_NAME_VERSION (n2));
+
+ /* If the equivalence sets have a common intersection, then the two
+ names can be compared without checking their ranges. */
+ if (bitmap_intersect_p (e1, e2))
+ {
+ bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
+ bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
+
+ return (comp == EQ_EXPR || comp == GE_EXPR || comp == LE_EXPR)
+ ? boolean_true_node
+ : boolean_false_node;
+ }
+
+ /* Otherwise, compare all the equivalent ranges. First, add N1 and
+ N2 to their own set of equivalences to avoid duplicating the body
+ of the loop just to check N1 and N2 ranges. */
+ EXECUTE_IF_SET_IN_BITMAP (e1, 0, i1, bi1)
+ {
+ value_range_t vr1 = *(vr_value[i1]);
+
+ /* If the range is VARYING or UNDEFINED, use the name itself. */
+ if (vr1.type == VR_VARYING || vr1.type == VR_UNDEFINED)
+ {
+ vr1.type = VR_RANGE;
+ vr1.min = ssa_name (i1);
+ vr1.max = ssa_name (i1);
+ }
+
+ t = retval = NULL_TREE;
+ EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
+ {
+ value_range_t vr2 = *(vr_value[i2]);
+
+ if (vr2.type == VR_VARYING || vr2.type == VR_UNDEFINED)
+ {
+ vr2.type = VR_RANGE;
+ vr2.min = ssa_name (i2);
+ vr2.max = ssa_name (i2);
+ }
+
+ t = compare_ranges (comp, &vr1, &vr2);
+ if (t)
+ {
+ /* All the ranges in the equivalent sets should compare
+ the same. */
+ gcc_assert (retval == NULL || t == retval);
+ retval = t;
+ }
+ }
+
+ if (retval)
+ {
+ bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
+ bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
+ return retval;
+ }
+ }
+
+ /* None of the equivalent ranges are useful in computing this
+ comparison. */
+ bitmap_clear_bit (e1, SSA_NAME_VERSION (n1));
+ bitmap_clear_bit (e2, SSA_NAME_VERSION (n2));
+ return NULL_TREE;
+}
+
+
+/* Given a conditional predicate COND, try to determine if COND yields
+ true or false based on the value ranges of its operands. Return
+ BOOLEAN_TRUE_NODE if the conditional always evaluates to true,
+ BOOLEAN_FALSE_NODE if the conditional always evaluates to false, and,
+ NULL if the conditional cannot be evaluated at compile time.
+
+ If USE_EQUIV_P is true, the ranges of all the names equivalent with
+ the operands in COND are used when trying to compute its value.
+ This is only used during final substitution. During propagation,
+ we only check the range of each variable and not its equivalents. */
+
+tree
+vrp_evaluate_conditional (tree cond, bool use_equiv_p)
{
gcc_assert (TREE_CODE (cond) == SSA_NAME
|| TREE_CODE_CLASS (TREE_CODE (cond)) == tcc_comparison);
if (TREE_CODE (cond) == SSA_NAME)
{
- /* For SSA names, only return a truth value if the range is
- known and contains exactly one value. */
- value_range *vr = SSA_NAME_VALUE_RANGE (cond);
- if (vr && vr->type == VR_RANGE && vr->min == vr->max)
+ value_range_t *vr;
+ tree retval;
+
+ if (use_equiv_p)
+ retval = compare_name_with_value (NE_EXPR, cond, boolean_false_node);
+ else
+ {
+ value_range_t *vr = get_value_range (cond);
+ retval = compare_range_with_value (NE_EXPR, vr, boolean_false_node);
+ }
+
+ /* If COND has a known boolean range, return it. */
+ if (retval)
+ return retval;
+
+ /* Otherwise, if COND has a symbolic range of exactly one value,
+ return it. */
+ vr = get_value_range (cond);
+ if (vr->type == VR_RANGE && vr->min == vr->max)
return vr->min;
}
else
{
- /* For comparisons, evaluate each operand and compare their
- ranges. */
- tree op0, op1;
- value_range *vr0, *vr1;
-
- op0 = TREE_OPERAND (cond, 0);
- vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
+ tree op0 = TREE_OPERAND (cond, 0);
+ tree op1 = TREE_OPERAND (cond, 1);
- op1 = TREE_OPERAND (cond, 1);
- vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
+ /* We only deal with integral and pointer types. */
+ if (!INTEGRAL_TYPE_P (TREE_TYPE (op0))
+ && !POINTER_TYPE_P (TREE_TYPE (op0)))
+ return NULL_TREE;
- if (vr0 && vr1)
- return compare_ranges (TREE_CODE (cond), vr0, vr1);
- else if (vr0 && vr1 == NULL)
- return compare_range_with_value (TREE_CODE (cond), vr0, op1);
- else if (vr0 == NULL && vr1)
- return compare_range_with_value (opposite_comparison (TREE_CODE (cond)),
- vr1, op0);
+ if (use_equiv_p)
+ {
+ if (TREE_CODE (op0) == SSA_NAME && TREE_CODE (op1) == SSA_NAME)
+ return compare_names (TREE_CODE (cond), op0, op1);
+ else if (TREE_CODE (op0) == SSA_NAME)
+ return compare_name_with_value (TREE_CODE (cond), op0, op1);
+ else if (TREE_CODE (op1) == SSA_NAME)
+ return compare_name_with_value (
+ opposite_comparison (TREE_CODE (cond)), op1, op0);
+ }
+ else
+ {
+ value_range_t *vr0, *vr1;
+
+ vr0 = (TREE_CODE (op0) == SSA_NAME) ? get_value_range (op0) : NULL;
+ vr1 = (TREE_CODE (op1) == SSA_NAME) ? get_value_range (op1) : NULL;
+
+ if (vr0 && vr1)
+ return compare_ranges (TREE_CODE (cond), vr0, vr1);
+ else if (vr0 && vr1 == NULL)
+ return compare_range_with_value (TREE_CODE (cond), vr0, op1);
+ else if (vr0 == NULL && vr1)
+ return compare_range_with_value (
+ opposite_comparison (TREE_CODE (cond)), vr1, op0);
+ }
}
/* Anything else cannot be computed statically. */
@@ -2033,15 +3069,55 @@ vrp_visit_cond_stmt (tree stmt, edge *taken_edge_p)
fprintf (dump_file, "\t");
print_generic_expr (dump_file, use, 0);
fprintf (dump_file, ": ");
- dump_value_range (dump_file, SSA_NAME_VALUE_RANGE (use));
+ dump_value_range (dump_file, vr_value[SSA_NAME_VERSION (use)]);
}
fprintf (dump_file, "\n");
}
/* Compute the value of the predicate COND by checking the known
- ranges of each of its operands. */
- val = vrp_evaluate_conditional (cond);
+ ranges of each of its operands.
+
+ Note that we cannot evaluate all the equivalent ranges here
+ because those ranges may not yet be final and with the current
+ propagation strategy, we cannot determine when the value ranges
+ of the names in the equivalence set have changed.
+
+ For instance, given the following code fragment
+
+ i_5 = PHI <8, i_13>
+ ...
+ i_14 = ASSERT_EXPR <i_5, i_5 != 0>
+ if (i_14 == 1)
+ ...
+
+ Assume that on the first visit to i_14, i_5 has the temporary
+ range [8, 8] because the second argument to the PHI function is
+ not yet executable. We derive the range ~[0, 0] for i_14 and the
+ equivalence set { i_5 }. So, when we visit 'if (i_14 == 1)' for
+ the first time, since i_14 is equivalent to the range [8, 8], we
+ determine that the predicate is always false.
+
+ On the next round of propagation, i_13 is determined to be
+ VARYING, which causes i_5 to drop down to VARYING. So, another
+ visit to i_14 is scheduled. In this second visit, we compute the
+ exact same range and equivalence set for i_14, namely ~[0, 0] and
+ { i_5 }. But we did not have the previous range for i_5
+ registered, so vrp_visit_assignment thinks that the range for
+ i_14 has not changed. Therefore, the predicate 'if (i_14 == 1)'
+ is not visited again, which stops propagation from visiting
+ statements in the THEN clause of that if().
+
+ To properly fix this we would need to keep the previous range
+ value for the names in the equivalence set. This way we would've
+ discovered that from one visit to the other i_5 changed from
+ range [8, 8] to VR_VARYING.
+
+ However, fixing this apparent limitation may not be worth the
+ additional checking. Testing on several code bases (GCC, DLV,
+ MICO, TRAMP3D and SPEC2000) showed that doing this results in
+ 4 more predicates folded in SPEC. */
+ val = vrp_evaluate_conditional (cond, false);
if (val)
*taken_edge_p = find_taken_edge (bb_for_stmt (stmt), val);
@@ -2108,11 +3184,11 @@ vrp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p)
union of VR0 and VR1. */
static void
-vrp_meet (value_range *vr0, value_range *vr1)
+vrp_meet (value_range_t *vr0, value_range_t *vr1)
{
if (vr0->type == VR_UNDEFINED)
{
- *vr0 = *vr1;
+ copy_value_range (vr0, vr1);
return;
}
@@ -2130,13 +3206,6 @@ vrp_meet (value_range *vr0, value_range *vr1)
if (vr1->type == VR_VARYING)
{
- *vr0 = *vr1;
- return;
- }
-
- /* If either is a symbolic range, drop to VARYING. */
- if (symbolic_range_p (vr0) || symbolic_range_p (vr1))
- {
set_value_range_to_varying (vr0);
return;
}
@@ -2147,28 +3216,46 @@ vrp_meet (value_range *vr0, value_range *vr1)
union of both ranges. */
if (value_ranges_intersect_p (vr0, vr1))
{
+ int cmp;
tree min, max;
- min = vr0->min;
- max = vr0->max;
-
/* The lower limit of the new range is the minimum of the
- two ranges. */
- if (compare_values (vr0->min, vr1->min) == 1)
+ two ranges. If they cannot be compared, the result is
+ VARYING. */
+ cmp = compare_values (vr0->min, vr1->min);
+ if (cmp == 0 || cmp == 1)
min = vr1->min;
+ else if (cmp == -1)
+ min = vr0->min;
+ else
+ {
+ set_value_range_to_varying (vr0);
+ return;
+ }
- /* The upper limit of the new range is the maximum of the
- two ranges. */
- if (compare_values (vr0->max, vr1->max) == -1)
+ /* Similarly, the upper limit of the new range is the
+ maximum of the two ranges. If they cannot be compared,
+ the result is VARYING. */
+ cmp = compare_values (vr0->max, vr1->max);
+ if (cmp == 0 || cmp == -1)
max = vr1->max;
+ else if (cmp == 1)
+ max = vr0->max;
+ else
+ {
+ set_value_range_to_varying (vr0);
+ return;
+ }
+
+ /* The resulting set of equivalences is the intersection of
+ the two sets. */
+ if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
+ bitmap_and_into (vr0->equiv, vr1->equiv);
- set_value_range (vr0, vr0->type, min, max);
+ set_value_range (vr0, vr0->type, min, max, vr0->equiv);
}
else
- {
- /* The two ranges don't intersect, set the result to VR_VARYING. */
- set_value_range_to_varying (vr0);
- }
+ goto no_meet;
}
else if (vr0->type == VR_ANTI_RANGE && vr1->type == VR_ANTI_RANGE)
{
@@ -2176,28 +3263,49 @@ vrp_meet (value_range *vr0, value_range *vr1)
if (compare_values (vr0->min, vr1->min) == 0
&& compare_values (vr0->max, vr1->max) == 0
&& compare_values (vr0->min, vr0->max) == 0)
- /* Nothing to do. */ ;
+ {
+ /* The resulting set of equivalences is the intersection of
+ the two sets. */
+ if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
+ bitmap_and_into (vr0->equiv, vr1->equiv);
+ }
else
- set_value_range_to_varying (vr0);
+ goto no_meet;
}
else if (vr0->type == VR_ANTI_RANGE || vr1->type == VR_ANTI_RANGE)
{
- /* A range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4] meet
- only if the ranges have an empty intersection. The result of
- the meet operation is the anti-range. */
- if (!value_ranges_intersect_p (vr0, vr1))
+ /* A numeric range [VAL1, VAL2] and an anti-range ~[VAL3, VAL4]
+ meet only if the ranges have an empty intersection. The
+ result of the meet operation is the anti-range. */
+ if (!symbolic_range_p (vr0)
+ && !symbolic_range_p (vr1)
+ && !value_ranges_intersect_p (vr0, vr1))
{
if (vr1->type == VR_ANTI_RANGE)
- *vr0 = *vr1;
+ copy_value_range (vr0, vr1);
}
else
- set_value_range_to_varying (vr0);
+ goto no_meet;
}
else
gcc_unreachable ();
+
+ return;
+
+no_meet:
+ /* The two range VR0 and VR1 do not meet. Before giving up and
+ setting the result to VARYING, see if we can at least derive a
+ useful anti-range. */
+ if (!symbolic_range_p (vr0)
+ && !range_includes_zero_p (vr0)
+ && !symbolic_range_p (vr1)
+ && !range_includes_zero_p (vr1))
+ set_value_range_to_nonnull (vr0, TREE_TYPE (vr0->min));
+ else
+ set_value_range_to_varying (vr0);
}
-
+
/* Visit all arguments for PHI node PHI that flow through executable
edges. If a valid value range can be derived from all the incoming
value ranges, set a new range for the LHS of PHI. */
@@ -2207,8 +3315,10 @@ vrp_visit_phi_node (tree phi)
{
int i;
tree lhs = PHI_RESULT (phi);
- value_range *lhs_vr = get_value_range (lhs);
- value_range vr_result = *lhs_vr;
+ value_range_t *lhs_vr = get_value_range (lhs);
+ value_range_t vr_result = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
+
+ copy_value_range (&vr_result, lhs_vr);
if (dump_file && (dump_flags & TDF_DETAILS))
{
@@ -2231,7 +3341,7 @@ vrp_visit_phi_node (tree phi)
if (e->flags & EDGE_EXECUTABLE)
{
tree arg = PHI_ARG_DEF (phi, i);
- value_range vr_arg;
+ value_range_t vr_arg;
if (TREE_CODE (arg) == SSA_NAME)
vr_arg = *(get_value_range (arg));
@@ -2240,6 +3350,7 @@ vrp_visit_phi_node (tree phi)
vr_arg.type = VR_RANGE;
vr_arg.min = arg;
vr_arg.max = arg;
+ vr_arg.equiv = NULL;
}
if (dump_file && (dump_flags & TDF_DETAILS))
@@ -2259,10 +3370,7 @@ vrp_visit_phi_node (tree phi)
}
if (vr_result.type == VR_VARYING)
- {
- set_value_range_to_varying (lhs_vr);
- return SSA_PROP_VARYING;
- }
+ goto varying;
/* To prevent infinite iterations in the algorithm, derive ranges
when the new value is slightly bigger or smaller than the
@@ -2291,20 +3399,143 @@ vrp_visit_phi_node (tree phi)
VARYING. */
if (vr_result.min == TYPE_MIN_VALUE (TREE_TYPE (vr_result.min))
&& vr_result.max == TYPE_MAX_VALUE (TREE_TYPE (vr_result.max)))
- {
- set_value_range_to_varying (lhs_vr);
- return SSA_PROP_VARYING;
- }
+ goto varying;
}
}
/* If the new range is different than the previous value, keep
iterating. */
- if (update_value_range (lhs_vr, vr_result.type, vr_result.min, vr_result.max))
+ if (update_value_range (lhs, &vr_result))
return SSA_PROP_INTERESTING;
/* Nothing changed, don't add outgoing edges. */
return SSA_PROP_NOT_INTERESTING;
+
+ /* No match found. Set the LHS to VARYING. */
+varying:
+ set_value_range_to_varying (lhs_vr);
+ return SSA_PROP_VARYING;
+}
+
+/* Walk through the IL simplifying expressions using knowledge
+ gathered by VRP. */
+
+static void
+simplify_using_ranges (void)
+{
+ basic_block bb;
+
+ FOR_EACH_BB (bb)
+ {
+ block_stmt_iterator bsi;
+
+ for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
+ {
+ tree stmt = bsi_stmt (bsi);
+
+ if (TREE_CODE (stmt) == MODIFY_EXPR)
+ {
+ tree rhs = TREE_OPERAND (stmt, 1);
+ enum tree_code rhs_code = TREE_CODE (rhs);
+
+ /* Transform TRUNC_DIV_EXPR and TRUNC_MOD_EXPR into RSHIFT_EXPR
+ and BIT_AND_EXPR respectively if the first operand is greater
+ than zero and the second operand is an exact power of two. */
+ if ((rhs_code == TRUNC_DIV_EXPR || rhs_code == TRUNC_MOD_EXPR)
+ && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0)))
+ && integer_pow2p (TREE_OPERAND (rhs, 1)))
+ {
+ tree val = NULL;
+ tree op = TREE_OPERAND (rhs, 0);
+ value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
+
+ if (TYPE_UNSIGNED (TREE_TYPE (op)))
+ {
+ val = integer_one_node;
+ }
+ else
+ {
+ val = compare_range_with_value (GT_EXPR, vr,
+ integer_zero_node);
+ }
+
+ if (val && integer_onep (val))
+ {
+ tree t;
+ tree op0 = TREE_OPERAND (rhs, 0);
+ tree op1 = TREE_OPERAND (rhs, 1);
+
+ if (rhs_code == TRUNC_DIV_EXPR)
+ {
+ t = build_int_cst (NULL_TREE, tree_log2 (op1));
+ t = build (RSHIFT_EXPR, TREE_TYPE (op0), op0, t);
+ }
+ else
+ {
+ t = build_int_cst (TREE_TYPE (op1), 1);
+ t = int_const_binop (MINUS_EXPR, op1, t, 0);
+ t = fold_convert (TREE_TYPE (op0), t);
+ t = build2 (BIT_AND_EXPR, TREE_TYPE (op0), op0, t);
+ }
+
+ TREE_OPERAND (stmt, 1) = t;
+ update_stmt (stmt);
+ }
+
+ }
+
+ /* Transform ABS (X) into X or -X as appropriate. */
+ if (rhs_code == ABS_EXPR
+ && TREE_CODE (TREE_OPERAND (rhs, 0)) == SSA_NAME
+ && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (rhs, 0))))
+ {
+ tree val = NULL;
+ tree op = TREE_OPERAND (rhs, 0);
+ tree type = TREE_TYPE (op);
+ value_range_t *vr = get_value_range (TREE_OPERAND (rhs, 0));
+
+ if (TYPE_UNSIGNED (type))
+ {
+ val = integer_zero_node;
+ }
+ else if (vr)
+ {
+ val = compare_range_with_value (LE_EXPR, vr,
+ integer_zero_node);
+ if (!val)
+ {
+ val = compare_range_with_value (GE_EXPR, vr,
+ integer_zero_node);
+
+ if (val)
+ {
+ if (integer_zerop (val))
+ val = integer_one_node;
+ else if (integer_onep (val))
+ val = integer_zero_node;
+ }
+ }
+
+ if (val
+ && (integer_onep (val) || integer_zerop (val)))
+ {
+ tree t;
+
+ if (integer_onep (val))
+ t = build1 (NEGATE_EXPR, TREE_TYPE (op), op);
+ else
+ t = op;
+
+ TREE_OPERAND (stmt, 1) = t;
+ update_stmt (stmt);
+ }
+ }
+ }
+ }
+
+ /* TODO. Simplify conditionals. */
+ }
+ }
}
@@ -2313,8 +3544,9 @@ vrp_visit_phi_node (tree phi)
static void
vrp_finalize (void)
{
- basic_block bb;
- int num_pred_folded = 0;
+ size_t i;
+ prop_value_t *single_val_range;
+ bool do_value_subst_p;
if (dump_file)
{
@@ -2323,33 +3555,48 @@ vrp_finalize (void)
fprintf (dump_file, "\n");
}
- FOR_EACH_BB (bb)
- {
- tree last = last_stmt (bb);
- if (last && TREE_CODE (last) == COND_EXPR)
- {
- tree val = vrp_evaluate_conditional (COND_EXPR_COND (last));
- if (val)
- {
- if (dump_file)
- {
- fprintf (dump_file, "Folding predicate ");
- print_generic_expr (dump_file, COND_EXPR_COND (last), 0);
- fprintf (dump_file, " to ");
- print_generic_expr (dump_file, val, 0);
- fprintf (dump_file, "\n");
- }
+ /* We may have ended with ranges that have exactly one value. Those
+ values can be substituted as any other copy/const propagated
+ value using substitute_and_fold. */
+ single_val_range = xmalloc (num_ssa_names * sizeof (*single_val_range));
+ memset (single_val_range, 0, num_ssa_names * sizeof (*single_val_range));
- num_pred_folded++;
- COND_EXPR_COND (last) = val;
- update_stmt (last);
- }
- }
+ do_value_subst_p = false;
+ for (i = 0; i < num_ssa_names; i++)
+ if (vr_value[i]
+ && vr_value[i]->type == VR_RANGE
+ && vr_value[i]->min == vr_value[i]->max)
+ {
+ single_val_range[i].value = vr_value[i]->min;
+ do_value_subst_p = true;
+ }
+
+ if (!do_value_subst_p)
+ {
+ /* We found no single-valued ranges, don't waste time trying to
+ do single value substitution in substitute_and_fold. */
+ free (single_val_range);
+ single_val_range = NULL;
}
- if (dump_file && (dump_flags & TDF_STATS))
- fprintf (dump_file, "\nNumber of predicates folded: %d\n\n",
- num_pred_folded);
+ substitute_and_fold (single_val_range, true);
+
+ /* One could argue all simplifications should be done here
+ rather than using substitute_and_fold since this code
+ is going to have to perform a complete walk through the
+ IL anyway. */
+ simplify_using_ranges ();
+
+ /* Free allocated memory. */
+ for (i = 0; i < num_ssa_names; i++)
+ if (vr_value[i])
+ {
+ BITMAP_FREE (vr_value[i]->equiv);
+ free (vr_value[i]);
+ }
+
+ free (single_val_range);
+ free (vr_value);
}
@@ -2362,6 +3609,34 @@ vrp_finalize (void)
This is essentially an SSA-CCP pass modified to deal with ranges
instead of constants.
+ While propagating ranges, we may find that two or more SSA name
+ have equivalent, though distinct ranges. For instance,
+
+ 1 x_9 = p_3->a;
+ 2 p_4 = ASSERT_EXPR <p_3, p_3 != 0>
+ 3 if (p_4 == q_2)
+ 4 p_5 = ASSERT_EXPR <p_4, p_4 == q_2>;
+ 5 endif
+ 6 if (q_2)
+
+ In the code above, pointer p_5 has range [q_2, q_2], but from the
+ code we can also determine that p_5 cannot be NULL and, if q_2 had
+ a non-varying range, p_5's range should also be compatible with it.
+
+ These equivalences are created by two expressions: ASSERT_EXPR and
+ copy operations. Since p_5 is an assertion on p_4, and p_4 was the
+ result of another assertion, then we can use the fact that p_5 and
+ p_4 are equivalent when evaluating p_5's range.
+
+ Together with value ranges, we also propagate these equivalences
+ between names so that we can take advantage of information from
+ multiple ranges when doing final replacement. Note that this
+ equivalency relation is transitive but not symmetric.
+
+ In the example above, p_5 is equivalent to p_4, q_2 and p_3, but we
+ cannot assert that q_2 is equivalent to p_5 because q_2 may be used
+ in contexts where that assertion does not hold (e.g., in line 6).
+
TODO, the main difference between this pass and Patterson's is that
we do not propagate edge probabilities. We only compute whether
edges can be taken or not. That is, instead of having a spectrum
@@ -2378,11 +3653,9 @@ execute_vrp (void)
if (cfg_loops)
scev_initialize (cfg_loops);
- if (vrp_initialize ())
- {
- ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
- vrp_finalize ();
- }
+ vrp_initialize ();
+ ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
+ vrp_finalize ();
if (cfg_loops)
{
diff --git a/gcc/tree.c b/gcc/tree.c
index de74fe98bdb..2f5f924cdbe 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -131,19 +131,40 @@ static GTY (()) tree int_cst_node;
static GTY ((if_marked ("ggc_marked_p"), param_is (union tree_node)))
htab_t int_cst_hash_table;
+/* General tree->tree mapping structure for use in hash tables. */
+
+struct tree_map GTY(())
+{
+ hashval_t hash;
+ tree from;
+ tree to;
+};
+
+static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
+ htab_t debug_expr_for_decl;
+
+static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
+ htab_t value_expr_for_decl;
+
static void set_type_quals (tree, int);
static int type_hash_eq (const void *, const void *);
static hashval_t type_hash_hash (const void *);
+static int tree_map_eq (const void *, const void *);
+static hashval_t tree_map_hash (const void *);
static hashval_t int_cst_hash_hash (const void *);
static int int_cst_hash_eq (const void *, const void *);
static void print_type_hash_statistics (void);
+static void print_debug_expr_statistics (void);
+static void print_value_expr_statistics (void);
static tree make_vector_type (tree, int, enum machine_mode);
static int type_hash_marked_p (const void *);
+static int tree_map_marked_p (const void *);
static unsigned int type_hash_list (tree, hashval_t);
static unsigned int attribute_hash_list (tree, hashval_t);
tree global_trees[TI_MAX];
tree integer_types[itk_none];
+
/* Init tree.c. */
@@ -153,9 +174,18 @@ init_ttree (void)
/* Initialize the hash table of types. */
type_hash_table = htab_create_ggc (TYPE_HASH_INITIAL_SIZE, type_hash_hash,
type_hash_eq, 0);
+
+ debug_expr_for_decl = htab_create_ggc (512, tree_map_hash,
+ tree_map_eq, 0);
+
+ value_expr_for_decl = htab_create_ggc (512, tree_map_hash,
+ tree_map_eq, 0);
+
int_cst_hash_table = htab_create_ggc (1024, int_cst_hash_hash,
int_cst_hash_eq, NULL);
+
int_cst_node = make_node (INTEGER_CST);
+
}
@@ -442,7 +472,16 @@ copy_node_stat (tree node MEM_STAT_DECL)
t->common.ann = 0;
if (TREE_CODE_CLASS (code) == tcc_declaration)
- DECL_UID (t) = next_decl_uid++;
+ {
+ DECL_UID (t) = next_decl_uid++;
+ if ((TREE_CODE (node) == PARM_DECL || TREE_CODE (node) == VAR_DECL)
+ && DECL_HAS_VALUE_EXPR_P (node))
+ {
+ SET_DECL_VALUE_EXPR (t, DECL_VALUE_EXPR (node));
+ DECL_HAS_VALUE_EXPR_P (t) = 1;
+ }
+
+ }
else if (TREE_CODE_CLASS (code) == tcc_type)
{
TYPE_UID (t) = next_type_uid++;
@@ -2700,12 +2739,41 @@ build4_stat (enum tree_code code, tree tt, tree arg0, tree arg1,
return t;
}
+tree
+build7_stat (enum tree_code code, tree tt, tree arg0, tree arg1,
+ tree arg2, tree arg3, tree arg4, tree arg5,
+ tree arg6 MEM_STAT_DECL)
+{
+ bool constant, read_only, side_effects, invariant;
+ tree t;
+
+ gcc_assert (code == TARGET_MEM_REF);
+
+ t = make_node_stat (code PASS_MEM_STAT);
+ TREE_TYPE (t) = tt;
+
+ side_effects = TREE_SIDE_EFFECTS (t);
+
+ PROCESS_ARG(0);
+ PROCESS_ARG(1);
+ PROCESS_ARG(2);
+ PROCESS_ARG(3);
+ PROCESS_ARG(4);
+ PROCESS_ARG(5);
+ PROCESS_ARG(6);
+
+ TREE_SIDE_EFFECTS (t) = side_effects;
+ TREE_THIS_VOLATILE (t) = 0;
+
+ return t;
+}
+
/* Backup definition for non-gcc build compilers. */
tree
(build) (enum tree_code code, tree tt, ...)
{
- tree t, arg0, arg1, arg2, arg3;
+ tree t, arg0, arg1, arg2, arg3, arg4, arg5, arg6;
int length = TREE_CODE_LENGTH (code);
va_list p;
@@ -2737,6 +2805,16 @@ tree
arg3 = va_arg (p, tree);
t = build4 (code, tt, arg0, arg1, arg2, arg3);
break;
+ case 7:
+ arg0 = va_arg (p, tree);
+ arg1 = va_arg (p, tree);
+ arg2 = va_arg (p, tree);
+ arg3 = va_arg (p, tree);
+ arg4 = va_arg (p, tree);
+ arg5 = va_arg (p, tree);
+ arg6 = va_arg (p, tree);
+ t = build7 (code, tt, arg0, arg1, arg2, arg3, arg4, arg5, arg6);
+ break;
default:
gcc_unreachable ();
}
@@ -3270,7 +3348,8 @@ handle_dll_attribute (tree * pnode, tree name, tree args, int flags,
}
if (TREE_CODE (node) != RECORD_TYPE && TREE_CODE (node) != UNION_TYPE)
{
- warning (0, "%qs attribute ignored", IDENTIFIER_POINTER (name));
+ warning (OPT_Wattributes, "%qs attribute ignored",
+ IDENTIFIER_POINTER (name));
*no_add_attrs = true;
}
@@ -3429,6 +3508,116 @@ build_variant_type_copy (tree type)
return t;
}
+/* Return true if the from tree in both tree maps are equal. */
+
+static int
+tree_map_eq (const void *va, const void *vb)
+{
+ const struct tree_map *a = va, *b = vb;
+ return (a->from == b->from);
+}
+
+/* Hash a from tree in a tree_map. */
+
+static hashval_t
+tree_map_hash (const void *item)
+{
+ return (((const struct tree_map *) item)->hash);
+}
+
+/* Return true if this tree map structure is marked for garbage collection
+ purposes. We simply return true if the from tree is marked, so that this
+ structure goes away when the from tree goes away. */
+
+static int
+tree_map_marked_p (const void *p)
+{
+ tree from = ((struct tree_map *) p)->from;
+
+ return ggc_marked_p (from);
+}
+
+/* Print out the statistics for the DECL_DEBUG_EXPR hash table. */
+
+static void
+print_debug_expr_statistics (void)
+{
+ fprintf (stderr, "DECL_DEBUG_EXPR hash: size %ld, %ld elements, %f collisions\n",
+ (long) htab_size (debug_expr_for_decl),
+ (long) htab_elements (debug_expr_for_decl),
+ htab_collisions (debug_expr_for_decl));
+}
+
+/* Print out the statistics for the DECL_VALUE_EXPR hash table. */
+
+static void
+print_value_expr_statistics (void)
+{
+ fprintf (stderr, "DECL_VALUE_EXPR hash: size %ld, %ld elements, %f collisions\n",
+ (long) htab_size (value_expr_for_decl),
+ (long) htab_elements (value_expr_for_decl),
+ htab_collisions (value_expr_for_decl));
+}
+/* Lookup a debug expression for FROM, and return it if we find one. */
+
+tree
+decl_debug_expr_lookup (tree from)
+{
+ struct tree_map *h, in;
+ in.from = from;
+
+ h = htab_find_with_hash (debug_expr_for_decl, &in, htab_hash_pointer (from));
+ if (h)
+ return h->to;
+ return NULL_TREE;
+}
+
+/* Insert a mapping FROM->TO in the debug expression hashtable. */
+
+void
+decl_debug_expr_insert (tree from, tree to)
+{
+ struct tree_map *h;
+ void **loc;
+
+ h = ggc_alloc (sizeof (struct tree_map));
+ h->hash = htab_hash_pointer (from);
+ h->from = from;
+ h->to = to;
+ loc = htab_find_slot_with_hash (debug_expr_for_decl, h, h->hash, INSERT);
+ *(struct tree_map **) loc = h;
+}
+
+/* Lookup a value expression for FROM, and return it if we find one. */
+
+tree
+decl_value_expr_lookup (tree from)
+{
+ struct tree_map *h, in;
+ in.from = from;
+
+ h = htab_find_with_hash (value_expr_for_decl, &in, htab_hash_pointer (from));
+ if (h)
+ return h->to;
+ return NULL_TREE;
+}
+
+/* Insert a mapping FROM->TO in the value expression hashtable. */
+
+void
+decl_value_expr_insert (tree from, tree to)
+{
+ struct tree_map *h;
+ void **loc;
+
+ h = ggc_alloc (sizeof (struct tree_map));
+ h->hash = htab_hash_pointer (from);
+ h->from = from;
+ h->to = to;
+ loc = htab_find_slot_with_hash (value_expr_for_decl, h, h->hash, INSERT);
+ *(struct tree_map **) loc = h;
+}
+
/* Hashing of types so that we don't make duplicates.
The entry point is `type_hash_canon'. */
@@ -4748,9 +4937,16 @@ get_unwidened (tree op, tree for_type)
while (TREE_CODE (op) == NOP_EXPR
|| TREE_CODE (op) == CONVERT_EXPR)
{
- int bitschange
- = TYPE_PRECISION (TREE_TYPE (op))
- - TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op, 0)));
+ int bitschange;
+
+ /* TYPE_PRECISION on vector types has different meaning
+ (TYPE_VECTOR_SUBPARTS) and casts from vectors are view conversions,
+ so avoid them here. */
+ if (TREE_CODE (TREE_TYPE (TREE_OPERAND (op, 0))) == VECTOR_TYPE)
+ break;
+
+ bitschange = TYPE_PRECISION (TREE_TYPE (op))
+ - TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op, 0)));
/* Truncations are many-one so cannot be removed.
Unless we are later going to truncate down even farther. */
@@ -5260,6 +5456,8 @@ dump_tree_statistics (void)
fprintf (stderr, "(No per-node statistics)\n");
#endif
print_type_hash_statistics ();
+ print_debug_expr_statistics ();
+ print_value_expr_statistics ();
lang_hooks.print_statistics ();
}
@@ -5771,7 +5969,7 @@ build_common_builtin_nodes (void)
tmp = tree_cons (NULL_TREE, size_type_node, void_list_node);
tmp = tree_cons (NULL_TREE, const_ptr_type_node, tmp);
tmp = tree_cons (NULL_TREE, const_ptr_type_node, tmp);
- ftype = build_function_type (ptr_type_node, tmp);
+ ftype = build_function_type (integer_type_node, tmp);
local_define_builtin ("__builtin_memcmp", ftype, BUILT_IN_MEMCMP,
"memcmp", ECF_PURE | ECF_NOTHROW);
}
@@ -6599,7 +6797,7 @@ walk_tree (tree *tp, walk_tree_fn func, void *data, struct pointer_set_t *pset)
case SSA_NAME:
case FIELD_DECL:
case RESULT_DECL:
- /* None of thse have subtrees other than those already walked
+ /* None of these have subtrees other than those already walked
above. */
break;
diff --git a/gcc/tree.def b/gcc/tree.def
index 3806f5b0043..b8d5a36daf7 100644
--- a/gcc/tree.def
+++ b/gcc/tree.def
@@ -935,6 +935,18 @@ DEFTREECODE (WITH_SIZE_EXPR, "with_size_expr", tcc_expression, 2)
generated by the builtin targetm.vectorize.mask_for_load_builtin_decl. */
DEFTREECODE (REALIGN_LOAD_EXPR, "realign_load", tcc_expression, 3)
+/* Low-level memory addressing. Operands are SYMBOL (static or global
+ variable), BASE (register), INDEX (register), STEP (integer constant),
+ OFFSET (integer constant). Corresponding address is
+ SYMBOL + BASE + STEP * INDEX + OFFSET. Only variations and values valid on
+ the target are allowed.
+
+ The sixth argument is the reference to the original memory access, which
+ is preserved for the purposes of the RTL alias analysis. The seventh
+ argument is a tag representing results of the tree level alias analysis. */
+
+DEFTREECODE (TARGET_MEM_REF, "target_mem_ref", tcc_reference, 7)
+
/*
Local variables:
mode:c
diff --git a/gcc/tree.h b/gcc/tree.h
index 8dc989435bb..e2e646fa54f 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -1171,10 +1171,6 @@ struct tree_vec GTY(())
#define TREE_OPERAND(NODE, I) TREE_OPERAND_CHECK (NODE, I)
#define TREE_COMPLEXITY(NODE) (EXPR_CHECK (NODE)->exp.complexity)
-/* In INDIRECT_REF, ALIGN_INDIRECT_REF, MISALIGNED_INDIRECT_REF. */
-#define REF_ORIGINAL(NODE) TREE_CHAIN (TREE_CHECK3 (NODE, \
- INDIRECT_REF, ALIGN_INDIRECT_REF, MISALIGNED_INDIRECT_REF))
-
/* In a LOOP_EXPR node. */
#define LOOP_EXPR_BODY(NODE) TREE_OPERAND_CHECK_CODE (NODE, LOOP_EXPR, 0)
@@ -1240,6 +1236,15 @@ struct tree_vec GTY(())
#define CASE_HIGH(NODE) TREE_OPERAND (CASE_LABEL_EXPR_CHECK (NODE), 1)
#define CASE_LABEL(NODE) TREE_OPERAND (CASE_LABEL_EXPR_CHECK (NODE), 2)
+/* The operands of a TARGET_MEM_REF. */
+#define TMR_SYMBOL(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 0))
+#define TMR_BASE(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 1))
+#define TMR_INDEX(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 2))
+#define TMR_STEP(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 3))
+#define TMR_OFFSET(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 4))
+#define TMR_ORIGINAL(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 5))
+#define TMR_TAG(NODE) (TREE_OPERAND (TARGET_MEM_REF_CHECK (NODE), 6))
+
/* The operands of a BIND_EXPR. */
#define BIND_EXPR_VARS(NODE) (TREE_OPERAND (BIND_EXPR_CHECK (NODE), 0))
#define BIND_EXPR_BODY(NODE) (TREE_OPERAND (BIND_EXPR_CHECK (NODE), 1))
@@ -1338,17 +1343,12 @@ struct tree_exp GTY(())
#define SSA_NAME_VALUE(N) \
SSA_NAME_CHECK (N)->ssa_name.value_handle
-/* Range information for SSA_NAMEs. */
-#define SSA_NAME_VALUE_RANGE(N) \
- SSA_NAME_CHECK (N)->ssa_name.value_range
-
/* Auxiliary pass-specific data. */
#define SSA_NAME_AUX(N) \
SSA_NAME_CHECK (N)->ssa_name.aux
#ifndef _TREE_FLOW_H
struct ptr_info_def;
-struct value_range_def;
#endif
@@ -1386,9 +1386,6 @@ struct tree_ssa_name GTY(())
as well. */
tree value_handle;
- /* Value range information. */
- struct value_range_def *value_range;
-
/* Auxiliary information stored with the ssa name. */
PTR GTY((skip)) aux;
@@ -2053,10 +2050,17 @@ struct tree_binfo GTY (())
writing debugging information about vfield and vbase decls for C++. */
#define DECL_FCONTEXT(NODE) (FIELD_DECL_CHECK (NODE)->decl.vindex)
+extern tree decl_debug_expr_lookup (tree);
+extern void decl_debug_expr_insert (tree, tree);
+
/* For VAR_DECL, this is set to either an expression that it was split
from (if DECL_DEBUG_EXPR_IS_FROM is true), otherwise a tree_list of
subexpressions that it was split into. */
-#define DECL_DEBUG_EXPR(NODE) (DECL_CHECK (NODE)->decl.vindex)
+#define DECL_DEBUG_EXPR(NODE) \
+ (decl_debug_expr_lookup (VAR_DECL_CHECK (NODE)))
+
+#define SET_DECL_DEBUG_EXPR(NODE, VAL) \
+ (decl_debug_expr_insert (VAR_DECL_CHECK (NODE), (VAL)))
#define DECL_DEBUG_EXPR_IS_FROM(NODE) \
(DECL_CHECK (NODE)->decl.debug_expr_is_from)
@@ -2188,12 +2192,19 @@ struct tree_binfo GTY (())
entire function. */
#define DECL_SAVED_TREE(NODE) (FUNCTION_DECL_CHECK (NODE)->decl.saved_tree)
+extern tree decl_value_expr_lookup (tree);
+extern void decl_value_expr_insert (tree, tree);
+
/* In a VAR_DECL or PARM_DECL, the location at which the value may be found,
if transformations have made this more complicated than evaluating the
decl itself. This should only be used for debugging; once this field has
been set, the decl itself may not legitimately appear in the function. */
+#define DECL_HAS_VALUE_EXPR_P(NODE) \
+ (TREE_CHECK2 (NODE, VAR_DECL, PARM_DECL)->decl.has_value_expr)
#define DECL_VALUE_EXPR(NODE) \
- (TREE_CHECK2 (NODE, VAR_DECL, PARM_DECL)->decl.saved_tree)
+ (decl_value_expr_lookup (TREE_CHECK2 (NODE, VAR_DECL, PARM_DECL)))
+#define SET_DECL_VALUE_EXPR(NODE, VAL) \
+ (decl_value_expr_insert (TREE_CHECK2 (NODE, VAR_DECL, PARM_DECL), VAL))
/* Nonzero in a FUNCTION_DECL means this function should be treated
as if it were a malloc, meaning it returns a pointer that is
@@ -2342,6 +2353,14 @@ struct tree_binfo GTY (())
#define DECL_GIMPLE_FORMAL_TEMP_P(DECL) \
DECL_CHECK (DECL)->decl.gimple_formal_temp
+/* For function local variables of COMPLEX type, indicates that the
+ variable is not aliased, and that all modifications to the variable
+ have been adjusted so that they are killing assignments. Thus the
+ variable may now be treated as a GIMPLE register, and use real
+ instead of virtual ops in SSA form. */
+#define DECL_COMPLEX_GIMPLE_REG_P(DECL) \
+ DECL_CHECK (DECL)->decl.gimple_reg_flag
+
/* Enumerate visibility settings. */
#ifndef SYMBOL_VISIBILITY_DEFINED
#define SYMBOL_VISIBILITY_DEFINED
@@ -2413,7 +2432,9 @@ struct tree_decl GTY(())
unsigned returns_twice_flag : 1;
unsigned seen_in_bind_expr : 1;
unsigned novops_flag : 1;
- /* 9 unused bits. */
+ unsigned has_value_expr : 1;
+ unsigned gimple_reg_flag : 1;
+ /* 7 unused bits. */
union tree_decl_u1 {
/* In a FUNCTION_DECL for which DECL_BUILT_IN holds, this is
@@ -2890,6 +2911,10 @@ extern tree build3_stat (enum tree_code, tree, tree, tree, tree MEM_STAT_DECL);
extern tree build4_stat (enum tree_code, tree, tree, tree, tree,
tree MEM_STAT_DECL);
#define build4(c,t1,t2,t3,t4,t5) build4_stat (c,t1,t2,t3,t4,t5 MEM_STAT_INFO)
+extern tree build7_stat (enum tree_code, tree, tree, tree, tree, tree,
+ tree, tree, tree MEM_STAT_DECL);
+#define build7(c,t1,t2,t3,t4,t5,t6,t7,t8) \
+ build7_stat (c,t1,t2,t3,t4,t5,t6,t7,t8 MEM_STAT_INFO)
extern tree build_int_cst (tree, HOST_WIDE_INT);
extern tree build_int_cst_type (tree, HOST_WIDE_INT);
@@ -3532,6 +3557,7 @@ extern tree fold_convert (tree, tree);
extern tree fold_single_bit_test (enum tree_code, tree, tree, tree);
extern tree fold_ignored_result (tree);
extern tree fold_abs_const (tree, tree);
+extern tree fold_indirect_ref_1 (tree, tree);
extern tree force_fit_type (tree, int, bool, bool);
@@ -3593,6 +3619,7 @@ extern bool tree_swap_operands_p (tree, tree, bool);
extern enum tree_code swap_tree_comparison (enum tree_code);
extern bool ptr_difference_const (tree, tree, HOST_WIDE_INT *);
+extern enum tree_code invert_tree_comparison (enum tree_code, bool);
/* In builtins.c */
extern tree fold_builtin (tree, tree, bool);
@@ -3651,7 +3678,7 @@ extern tree build_nonstandard_integer_type (unsigned HOST_WIDE_INT, int);
extern tree build_range_type (tree, tree, tree);
extern HOST_WIDE_INT int_cst_value (tree);
extern tree tree_fold_gcd (tree, tree);
-extern tree build_addr (tree);
+extern tree build_addr (tree, tree);
extern bool fields_compatible_p (tree, tree);
extern tree find_compatible_field (tree, tree);
@@ -3975,13 +4002,14 @@ extern int tree_node_sizes[];
restricted to creating gimple expressions. */
extern bool in_gimple_form;
-/* In tree-ssa-threadupdate.c. */
-extern bool thread_through_all_blocks (void);
-
/* In tree-gimple.c. */
extern tree get_base_address (tree t);
/* In tree-vectorizer.c. */
extern void vect_set_verbosity_level (const char *);
+/* In tree-ssa-address.c. */
+extern tree tree_mem_ref_addr (tree, tree);
+extern void copy_mem_ref_info (tree, tree);
+
#endif /* GCC_TREE_H */
diff --git a/gcc/treelang/ChangeLog b/gcc/treelang/ChangeLog
index b1a80e940e0..a0192f7ce18 100644
--- a/gcc/treelang/ChangeLog
+++ b/gcc/treelang/ChangeLog
@@ -1,3 +1,19 @@
+2005-06-15 James A. Morrison <phython@gcc.gnu.org>
+
+ * parse.y (function_invocation): Reverse parameter list.
+ * treetree.c (tree_code_get_expression): Don't reverse parameter list.
+
+2005-06-12 Rafael ?vila de Esp?ndola <rafael.espindola@gmail.com>
+
+ * treetree.c (tree_code_get_expression): Call build_function_call_expr
+ to build function calls.
+
+2005-05-31 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * treelang/lex.l, treelang/parse.y: Don't include errors.h and
+ include toplev.h.
+ * treelang/Make-lang.in: Updates dependencies.
+
2005-05-02 Andrew Pinski <pinskia@physics.uc.edu>
PR treelang/21345
diff --git a/gcc/treelang/Make-lang.in b/gcc/treelang/Make-lang.in
index 239d3f9bf49..bb170b554ad 100644
--- a/gcc/treelang/Make-lang.in
+++ b/gcc/treelang/Make-lang.in
@@ -116,11 +116,12 @@ treelang/spec.o: treelang/spec.c $(CONFIG_H) $(SYSTEM_H) \
coretypes.h diagnostic.h $(TREE_H) flags.h toplev.h langhooks.h $(TM_H)
treelang/parse.o: treelang/parse.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
- $(TM_H) diagnostic.h treelang/treelang.h input.h treelang/treetree.h
+ $(TM_H) diagnostic.h treelang/treelang.h input.h treelang/treetree.h \
+ toplev.h
treelang/lex.o: treelang/lex.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) diagnostic.h $(TREE_H) treelang/treelang.h input.h \
- treelang/parse.h
+ treelang/parse.h toplev.h
# generated files the files from lex and yacc are put into the source
# directory in case someone wants to build but does not have
diff --git a/gcc/treelang/lex.l b/gcc/treelang/lex.l
index 188c480a550..9e4943046b8 100644
--- a/gcc/treelang/lex.l
+++ b/gcc/treelang/lex.l
@@ -37,13 +37,13 @@
#include "coretypes.h"
#include "tm.h"
#include "input.h"
-#include "errors.h"
#include "tree.h"
/* Token defs. */
#include "treelang.h"
#include "parse.h"
#include "treetree.h"
+#include "toplev.h"
extern int option_lexer_trace;
diff --git a/gcc/treelang/parse.y b/gcc/treelang/parse.y
index a18717cb9f5..5e4fd74d086 100644
--- a/gcc/treelang/parse.y
+++ b/gcc/treelang/parse.y
@@ -39,11 +39,12 @@ the GCC compiler. */
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
#include "timevar.h"
+#include "tree.h"
#include "treelang.h"
#include "treetree.h"
+#include "toplev.h"
#define YYDEBUG 1
#define YYPRINT(file, type, value) print_token (file, type, value)
@@ -675,7 +676,8 @@ NAME LEFT_PARENTHESIS expressions_with_commas_opt RIGHT_PARENTHESIS {
}
type = tree_code_get_type (NUMERIC_TYPE (prod));
prod->tp.pro.code = tree_code_get_expression (EXP_FUNCTION_INVOCATION, type,
- proto->tp.pro.code, parms,
+ proto->tp.pro.code,
+ nreverse (parms),
NULL, tok->tp.tok.location);
$$ = prod;
}
diff --git a/gcc/treelang/treetree.c b/gcc/treelang/treetree.c
index d0f6f77be4d..7ee707ff943 100644
--- a/gcc/treelang/treetree.c
+++ b/gcc/treelang/treetree.c
@@ -698,14 +698,9 @@ tree_code_get_expression (unsigned int exp_type,
case EXP_FUNCTION_INVOCATION:
gcc_assert (op1);
- {
- tree fun_ptr;
- TREE_USED (op1) = 1;
- fun_ptr = fold_build1 (ADDR_EXPR,
- build_pointer_type (TREE_TYPE (op1)), op1);
- ret1 = fold_build3 (CALL_EXPR, type, fun_ptr, nreverse (op2),
- NULL_TREE);
- }
+ gcc_assert(TREE_TYPE (TREE_TYPE (op1)) == type);
+ TREE_USED (op1) = 1;
+ ret1 = build_function_call_expr(op1, op2);
break;
default:
diff --git a/gcc/unwind-compat.c b/gcc/unwind-compat.c
index 3e8c302f03a..4b5a2b3c0ef 100644
--- a/gcc/unwind-compat.c
+++ b/gcc/unwind-compat.c
@@ -1,5 +1,5 @@
/* Backward compatibility unwind routines.
- Copyright (C) 2004
+ Copyright (C) 2004, 2005
Free Software Foundation, Inc.
This file is part of GCC.
diff --git a/gcc/unwind-dw2-fde-compat.c b/gcc/unwind-dw2-fde-compat.c
index b5fd3ce37f6..55adc3660fe 100644
--- a/gcc/unwind-dw2-fde-compat.c
+++ b/gcc/unwind-dw2-fde-compat.c
@@ -1,5 +1,5 @@
/* Backward compatibility unwind routines.
- Copyright (C) 2004
+ Copyright (C) 2004, 2005
Free Software Foundation, Inc.
This file is part of GCC.
diff --git a/gcc/unwind-dw2-fde-darwin.c b/gcc/unwind-dw2-fde-darwin.c
index c0db8e1bd4b..f242654baf9 100644
--- a/gcc/unwind-dw2-fde-darwin.c
+++ b/gcc/unwind-dw2-fde-darwin.c
@@ -220,6 +220,7 @@ examine_objects (void *pc, struct dwarf_eh_bases *bases, int dont_alloc)
if (result)
{
int encoding;
+ _Unwind_Ptr func;
bases->tbase = ob->tbase;
bases->dbase = ob->dbase;
@@ -229,8 +230,8 @@ examine_objects (void *pc, struct dwarf_eh_bases *bases, int dont_alloc)
encoding = get_fde_encoding (result);
read_encoded_value_with_base (encoding,
base_from_object (encoding, ob),
- result->pc_begin,
- (_Unwind_Ptr *)&bases->func);
+ result->pc_begin, &func);
+ bases->func = (void *) func;
break;
}
}
diff --git a/gcc/unwind-dw2-fde-glibc.c b/gcc/unwind-dw2-fde-glibc.c
index 306afdda0ac..ebc2d9c37f2 100644
--- a/gcc/unwind-dw2-fde-glibc.c
+++ b/gcc/unwind-dw2-fde-glibc.c
@@ -386,11 +386,13 @@ _Unwind_IteratePhdrCallback (struct dl_phdr_info *info, size_t size, void *ptr)
data->ret = linear_search_fdes (&ob, (fde *) eh_frame, (void *) data->pc);
if (data->ret != NULL)
{
+ _Unwind_Ptr func;
unsigned int encoding = get_fde_encoding (data->ret);
+
read_encoded_value_with_base (encoding,
base_from_cb_data (encoding, data),
- data->ret->pc_begin,
- (_Unwind_Ptr *)&data->func);
+ data->ret->pc_begin, &func);
+ data->func = (void *) func;
}
return 1;
}
diff --git a/gcc/unwind-dw2-fde.c b/gcc/unwind-dw2-fde.c
index 15cdd57f69b..d6b3a5870bc 100644
--- a/gcc/unwind-dw2-fde.c
+++ b/gcc/unwind-dw2-fde.c
@@ -1,5 +1,5 @@
/* Subroutines needed for unwinding stack frames for exception handling. */
-/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
Free Software Foundation, Inc.
Contributed by Jason Merrill <jason@cygnus.com>.
@@ -1013,6 +1013,7 @@ _Unwind_Find_FDE (void *pc, struct dwarf_eh_bases *bases)
if (f)
{
int encoding;
+ _Unwind_Ptr func;
bases->tbase = ob->tbase;
bases->dbase = ob->dbase;
@@ -1021,7 +1022,8 @@ _Unwind_Find_FDE (void *pc, struct dwarf_eh_bases *bases)
if (ob->s.b.mixed_encoding)
encoding = get_fde_encoding (f);
read_encoded_value_with_base (encoding, base_from_object (encoding, ob),
- f->pc_begin, (_Unwind_Ptr *)&bases->func);
+ f->pc_begin, &func);
+ bases->func = (void *) func;
}
return f;
diff --git a/gcc/unwind-dw2.c b/gcc/unwind-dw2.c
index b50ae010283..55764fee545 100644
--- a/gcc/unwind-dw2.c
+++ b/gcc/unwind-dw2.c
@@ -320,8 +320,10 @@ extract_cie_info (const struct dwarf_cie *cie, struct _Unwind_Context *context,
/* "P" indicates a personality routine in the CIE augmentation. */
else if (aug[0] == 'P')
{
- p = read_encoded_value (context, *p, p + 1,
- (_Unwind_Ptr *) &fs->personality);
+ _Unwind_Ptr personality;
+
+ p = read_encoded_value (context, *p, p + 1, &personality);
+ fs->personality = (_Unwind_Personality_Fn) personality;
aug += 1;
}
@@ -785,8 +787,13 @@ execute_cfa_program (const unsigned char *insn_ptr,
else switch (insn)
{
case DW_CFA_set_loc:
- insn_ptr = read_encoded_value (context, fs->fde_encoding,
- insn_ptr, (_Unwind_Ptr *) &fs->pc);
+ {
+ _Unwind_Ptr pc;
+
+ insn_ptr = read_encoded_value (context, fs->fde_encoding,
+ insn_ptr, &pc);
+ fs->pc = (void *) pc;
+ }
break;
case DW_CFA_advance_loc1:
@@ -1001,8 +1008,12 @@ uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
insn = aug + i;
}
if (fs->lsda_encoding != DW_EH_PE_omit)
- aug = read_encoded_value (context, fs->lsda_encoding, aug,
- (_Unwind_Ptr *) &context->lsda);
+ {
+ _Unwind_Ptr lsda;
+
+ aug = read_encoded_value (context, fs->lsda_encoding, aug, &lsda);
+ context->lsda = (void *) lsda;
+ }
/* Then the insns in the FDE up to our target PC. */
if (insn == NULL)
diff --git a/gcc/unwind-pe.h b/gcc/unwind-pe.h
index ce7d6943c0a..398165749a5 100644
--- a/gcc/unwind-pe.h
+++ b/gcc/unwind-pe.h
@@ -34,6 +34,13 @@
#ifndef GCC_UNWIND_PE_H
#define GCC_UNWIND_PE_H
+/* If using C++, references to abort have to be qualified with std::. */
+#if __cplusplus
+#define __gxx_abort std::abort
+#else
+#define __gxx_abort abort
+#endif
+
/* Pointer encodings, from dwarf2.h. */
#define DW_EH_PE_absptr 0x00
#define DW_EH_PE_omit 0xff
@@ -79,9 +86,8 @@ size_of_encoded_value (unsigned char encoding)
return 4;
case DW_EH_PE_udata8:
return 8;
- default:
- gcc_unreachable ();
}
+ __gxx_abort ();
}
#endif
@@ -112,9 +118,8 @@ base_of_encoded_value (unsigned char encoding, struct _Unwind_Context *context)
return _Unwind_GetDataRelBase (context);
case DW_EH_PE_funcrel:
return _Unwind_GetRegionStart (context);
- default:
- gcc_unreachable ();
}
+ __gxx_abort ();
}
#endif
@@ -251,7 +256,7 @@ read_encoded_value_with_base (unsigned char encoding, _Unwind_Ptr base,
break;
default:
- gcc_unreachable ();
+ __gxx_abort ();
}
if (result != 0)
diff --git a/gcc/unwind.h b/gcc/unwind.h
index 978b9f09c5e..7244fd457c7 100644
--- a/gcc/unwind.h
+++ b/gcc/unwind.h
@@ -214,7 +214,8 @@ _Unwind_GetDataRelBase (struct _Unwind_Context *_C)
static inline _Unwind_Ptr
_Unwind_GetTextRelBase (struct _Unwind_Context *_C __attribute__ ((__unused__)))
{
- gcc_unreachable ();
+ abort ();
+ return 0;
}
/* @@@ Retrieve the Backing Store Pointer of the given context. */
diff --git a/gcc/value-prof.c b/gcc/value-prof.c
index b96cdcafbf6..e6b45a519e5 100644
--- a/gcc/value-prof.c
+++ b/gcc/value-prof.c
@@ -1221,12 +1221,6 @@ tree_divmod_fixed_value_transform (tree stmt)
if (simple_cst_equal (op2, value) != 1 || 2 * count < all)
return false;
- if (dump_file)
- {
- fprintf (dump_file, "Div/mod by constant transformation on insn ");
- print_generic_stmt (dump_file, stmt, TDF_SLIM);
- }
-
/* Compute probability of taking the optimal path. */
prob = (count * REG_BR_PROB_BASE + all / 2) / all;
@@ -1235,6 +1229,16 @@ tree_divmod_fixed_value_transform (tree stmt)
val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1);
result = tree_divmod_fixed_value (stmt, op, op1, op2, tree_val, prob, count, all);
+ if (dump_file)
+ {
+ fprintf (dump_file, "Div/mod by constant ");
+ print_generic_expr (dump_file, value, TDF_SLIM);
+ fprintf (dump_file, "=");
+ print_generic_expr (dump_file, tree_val, TDF_SLIM);
+ fprintf (dump_file, " transformation on insn ");
+ print_generic_stmt (dump_file, stmt, TDF_SLIM);
+ }
+
TREE_OPERAND (modify, 1) = result;
return true;
@@ -1489,11 +1493,11 @@ tree_mod_subtract (tree stmt, tree operation, tree op1, tree op2,
e12->flags &= ~EDGE_FALLTHRU;
e12->flags |= EDGE_FALSE_VALUE;
e12->probability = REG_BR_PROB_BASE - prob1;
- e12->count = count1;
+ e12->count = all - count1;
e14 = make_edge (bb, bb4, EDGE_TRUE_VALUE);
e14->probability = prob1;
- e14->count = all - count1;
+ e14->count = count1;
if (ncounts) /* Assumed to be 0 or 1. */
{
@@ -1653,16 +1657,6 @@ tree_divmod_values_to_profile (tree stmt, histogram_values *values)
if (is_gimple_reg (divisor))
{
- /* Check for a special case where the divisor is power(s) of 2.
- This is more aggressive than the RTL version, under the
- assumption that later phases will reduce / or % by power of 2
- to something clever most of the time. Signed or unsigned. */
- hist = ggc_alloc (sizeof (*hist));
- hist->hvalue.tree.value = divisor;
- hist->hvalue.tree.stmt = stmt;
- hist->type = HIST_TYPE_POW2;
- VEC_quick_push (histogram_value, *values, hist);
-
/* Check for the case where the divisor is the same value most
of the time. */
hist = ggc_alloc (sizeof (*hist));
@@ -1677,6 +1671,13 @@ tree_divmod_values_to_profile (tree stmt, histogram_values *values)
if (TREE_CODE (rhs) == TRUNC_MOD_EXPR
&& TYPE_UNSIGNED (type))
{
+ /* Check for a special case where the divisor is power of 2. */
+ hist = ggc_alloc (sizeof (*hist));
+ hist->hvalue.tree.value = divisor;
+ hist->hvalue.tree.stmt = stmt;
+ hist->type = HIST_TYPE_POW2;
+ VEC_quick_push (histogram_value, *values, hist);
+
hist = ggc_alloc (sizeof (*hist));
hist->hvalue.tree.stmt = stmt;
hist->hvalue.tree.value
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index a6a9c15d79e..6d5c14c6055 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -102,6 +102,8 @@
#include "alloc-pool.h"
#include "fibheap.h"
#include "hashtab.h"
+#include "regs.h"
+#include "expr.h"
/* Type of micro operation. */
enum micro_operation_type
@@ -1441,8 +1443,7 @@ track_expr_p (tree expr)
don't need to track this expression if the ultimate declaration is
ignored. */
realdecl = expr;
- if (DECL_DEBUG_EXPR (realdecl)
- && DECL_DEBUG_EXPR_IS_FROM (realdecl))
+ if (DECL_DEBUG_EXPR_IS_FROM (realdecl) && DECL_DEBUG_EXPR (realdecl))
{
realdecl = DECL_DEBUG_EXPR (realdecl);
/* ??? We don't yet know how to emit DW_OP_piece for variable
@@ -2168,25 +2169,101 @@ emit_note_insn_var_location (void **varp, void *data)
rtx insn = ((emit_note_data *)data)->insn;
enum emit_note_where where = ((emit_note_data *)data)->where;
rtx note;
- int i;
+ int i, j, n_var_parts;
bool complete;
HOST_WIDE_INT last_limit;
tree type_size_unit;
+ HOST_WIDE_INT offsets[MAX_VAR_PARTS];
+ rtx loc[MAX_VAR_PARTS];
gcc_assert (var->decl);
complete = true;
last_limit = 0;
+ n_var_parts = 0;
for (i = 0; i < var->n_var_parts; i++)
{
+ enum machine_mode mode, wider_mode;
+
if (last_limit < var->var_part[i].offset)
{
complete = false;
break;
}
- last_limit
- = (var->var_part[i].offset
- + GET_MODE_SIZE (GET_MODE (var->var_part[i].loc_chain->loc)));
+ else if (last_limit > var->var_part[i].offset)
+ continue;
+ offsets[n_var_parts] = var->var_part[i].offset;
+ loc[n_var_parts] = var->var_part[i].loc_chain->loc;
+ mode = GET_MODE (loc[n_var_parts]);
+ last_limit = offsets[n_var_parts] + GET_MODE_SIZE (mode);
+
+ /* Attempt to merge adjacent registers or memory. */
+ wider_mode = GET_MODE_WIDER_MODE (mode);
+ for (j = i + 1; j < var->n_var_parts; j++)
+ if (last_limit <= var->var_part[j].offset)
+ break;
+ if (j < var->n_var_parts
+ && wider_mode != VOIDmode
+ && GET_CODE (loc[n_var_parts])
+ == GET_CODE (var->var_part[j].loc_chain->loc)
+ && mode == GET_MODE (var->var_part[j].loc_chain->loc)
+ && last_limit == var->var_part[j].offset)
+ {
+ rtx new_loc = NULL;
+ rtx loc2 = var->var_part[j].loc_chain->loc;
+
+ if (REG_P (loc[n_var_parts])
+ && hard_regno_nregs[REGNO (loc[n_var_parts])][mode] * 2
+ == hard_regno_nregs[REGNO (loc[n_var_parts])][wider_mode]
+ && REGNO (loc[n_var_parts])
+ + hard_regno_nregs[REGNO (loc[n_var_parts])][mode]
+ == REGNO (loc2))
+ {
+ if (! WORDS_BIG_ENDIAN && ! BYTES_BIG_ENDIAN)
+ new_loc = simplify_subreg (wider_mode, loc[n_var_parts],
+ mode, 0);
+ else if (WORDS_BIG_ENDIAN && BYTES_BIG_ENDIAN)
+ new_loc = simplify_subreg (wider_mode, loc2, mode, 0);
+ if (new_loc)
+ {
+ if (!REG_P (new_loc)
+ || REGNO (new_loc) != REGNO (loc[n_var_parts]))
+ new_loc = NULL;
+ else
+ REG_ATTRS (new_loc) = REG_ATTRS (loc[n_var_parts]);
+ }
+ }
+ else if (MEM_P (loc[n_var_parts])
+ && GET_CODE (XEXP (loc2, 0)) == PLUS
+ && GET_CODE (XEXP (XEXP (loc2, 0), 0)) == REG
+ && GET_CODE (XEXP (XEXP (loc2, 0), 1)) == CONST_INT)
+ {
+ if ((GET_CODE (XEXP (loc[n_var_parts], 0)) == REG
+ && rtx_equal_p (XEXP (loc[n_var_parts], 0),
+ XEXP (XEXP (loc2, 0), 0))
+ && INTVAL (XEXP (XEXP (loc2, 0), 1))
+ == GET_MODE_SIZE (mode))
+ || (GET_CODE (XEXP (loc[n_var_parts], 0)) == PLUS
+ && GET_CODE (XEXP (XEXP (loc[n_var_parts], 0), 1))
+ == CONST_INT
+ && rtx_equal_p (XEXP (XEXP (loc[n_var_parts], 0), 0),
+ XEXP (XEXP (loc2, 0), 0))
+ && INTVAL (XEXP (XEXP (loc[n_var_parts], 0), 1))
+ + GET_MODE_SIZE (mode)
+ == INTVAL (XEXP (XEXP (loc2, 0), 1))))
+ new_loc = adjust_address_nv (loc[n_var_parts],
+ wider_mode, 0);
+ }
+
+ if (new_loc)
+ {
+ loc[n_var_parts] = new_loc;
+ mode = wider_mode;
+ last_limit = offsets[n_var_parts] + GET_MODE_SIZE (mode);
+ i = j;
+ }
+ }
+ ++n_var_parts;
}
type_size_unit = TYPE_SIZE_UNIT (TREE_TYPE (var->decl));
if ((unsigned HOST_WIDE_INT) last_limit < TREE_INT_CST_LOW (type_size_unit))
@@ -2202,26 +2279,24 @@ emit_note_insn_var_location (void **varp, void *data)
NOTE_VAR_LOCATION (note) = gen_rtx_VAR_LOCATION (VOIDmode, var->decl,
NULL_RTX);
}
- else if (var->n_var_parts == 1)
+ else if (n_var_parts == 1)
{
rtx expr_list
- = gen_rtx_EXPR_LIST (VOIDmode,
- var->var_part[0].loc_chain->loc,
- GEN_INT (var->var_part[0].offset));
+ = gen_rtx_EXPR_LIST (VOIDmode, loc[0], GEN_INT (offsets[0]));
NOTE_VAR_LOCATION (note) = gen_rtx_VAR_LOCATION (VOIDmode, var->decl,
expr_list);
}
- else if (var->n_var_parts)
+ else if (n_var_parts)
{
- rtx argp[MAX_VAR_PARTS];
rtx parallel;
- for (i = 0; i < var->n_var_parts; i++)
- argp[i] = gen_rtx_EXPR_LIST (VOIDmode, var->var_part[i].loc_chain->loc,
- GEN_INT (var->var_part[i].offset));
+ for (i = 0; i < n_var_parts; i++)
+ loc[i]
+ = gen_rtx_EXPR_LIST (VOIDmode, loc[i], GEN_INT (offsets[i]));
+
parallel = gen_rtx_PARALLEL (VOIDmode,
- gen_rtvec_v (var->n_var_parts, argp));
+ gen_rtvec_v (n_var_parts, loc));
NOTE_VAR_LOCATION (note) = gen_rtx_VAR_LOCATION (VOIDmode, var->decl,
parallel);
}
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 4590d9212fb..35943f53688 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -176,21 +176,22 @@ EXTRA_SECTION_FUNCTIONS
static void
initialize_cold_section_name (void)
{
- const char *name;
const char *stripped_name;
- char *buffer;
+ char *name, *buffer;
+ tree dsn;
gcc_assert (cfun && current_function_decl);
if (cfun->unlikely_text_section_name)
return;
- if (flag_function_sections && DECL_SECTION_NAME (current_function_decl))
+ dsn = DECL_SECTION_NAME (current_function_decl);
+ if (flag_function_sections && dsn)
{
- name = alloca (TREE_STRING_LENGTH (DECL_SECTION_NAME
- (current_function_decl)));
- strcpy ((char *) name, TREE_STRING_POINTER (DECL_SECTION_NAME
- (current_function_decl)));
+ name = alloca (TREE_STRING_LENGTH (dsn) + 1);
+ memcpy (name, TREE_STRING_POINTER (dsn), TREE_STRING_LENGTH (dsn) + 1);
+
stripped_name = targetm.strip_name_encoding (name);
+
buffer = ACONCAT ((stripped_name, "_unlikely", NULL));
cfun->unlikely_text_section_name = ggc_strdup (buffer);
}
@@ -1289,26 +1290,11 @@ assemble_start_function (tree decl, const char *fnname)
doing partitioning, if the entire function was decided by
choose_function_section (predict.c) to be cold. */
- int i;
- int len;
- char *s;
-
initialize_cold_section_name ();
- /* The following is necessary, because 'strcmp
- (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)), blah)' always
- fails, presumably because TREE_STRING_POINTER is declared to
- be an array of size 1 of char. */
-
- len = TREE_STRING_LENGTH (DECL_SECTION_NAME (decl));
- s = (char *) xmalloc (len + 1);
-
- for (i = 0; i < len; i ++)
- s[i] = (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)))[i];
- s[len] = '\0';
-
if (cfun->unlikely_text_section_name
- && (strcmp (s, cfun->unlikely_text_section_name) == 0))
+ && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
+ cfun->unlikely_text_section_name) == 0)
first_function_block_is_cold = true;
}
@@ -4689,7 +4675,8 @@ default_assemble_visibility (tree decl, int vis)
assemble_name (asm_out_file, name);
fprintf (asm_out_file, "\n");
#else
- warning (0, "visibility attribute not supported in this configuration; ignored");
+ warning (OPT_Wattributes, "visibility attribute not supported "
+ "in this configuration; ignored");
#endif
}
diff --git a/gcc/varray.c b/gcc/varray.c
index e80827a5ce6..ee3d76d3910 100644
--- a/gcc/varray.c
+++ b/gcc/varray.c
@@ -31,7 +31,11 @@
#include "system.h"
#include "coretypes.h"
#include "tm.h"
-#include "errors.h"
+#ifdef GENERATOR_FILE
+# include "errors.h"
+#else
+# include "toplev.h"
+#endif
#include "varray.h"
#include "ggc.h"
#include "hashtab.h"
diff --git a/gcc/vec.c b/gcc/vec.c
index 67643b5abd2..225cfb1545c 100644
--- a/gcc/vec.c
+++ b/gcc/vec.c
@@ -23,9 +23,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "system.h"
#include "ggc.h"
#include "vec.h"
-#include "errors.h"
#include "coretypes.h"
#include "tree.h"
+#include "toplev.h"
struct vec_prefix
{
diff --git a/gcc/vec.h b/gcc/vec.h
index 13c4ed6b654..f97e214dd24 100644
--- a/gcc/vec.h
+++ b/gcc/vec.h
@@ -29,17 +29,14 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
out-of-line generic functions. The vectors are designed to
interoperate with the GTY machinery.
- Because of the different behavior of objects and of pointers to
- objects, there are two flavors. One to deal with a vector of
- pointers to objects, and one to deal with a vector of objects
- themselves. Both of these pass pointers to objects around -- in
- the former case the pointers are stored into the vector and in the
- latter case the pointers are dereferenced and the objects copied
- into the vector. Therefore, when using a vector of pointers, the
- objects pointed to must be long lived, but when dealing with a
- vector of objects, the source objects need not be. The vector of
- pointers API is also appropriate for small register sized objects
- like integers.
+ Because of the different behavior of structure objects, scalar
+ objects and of pointers, there are three flavors, one for each of
+ these variants. Both the structure object and pointer variants
+ pass pointers to objects around -- in the former case the pointers
+ are stored into the vector and in the latter case the pointers are
+ dereferenced and the objects copied into the vector. The scalar
+ object variant is suitable for int-like objects, and the vector
+ elements are returned by value.
There are both 'index' and 'iterate' accessors. The iterator
returns a boolean iteration condition and updates the iteration
@@ -96,20 +93,24 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
the 'space' predicate will tell you whether there is spare capacity
in the vector. You will not normally need to use these two functions.
- Vector types are defined using a DEF_VEC_{O,P}(TYPEDEF) macro, to
+ Vector types are defined using a DEF_VEC_{O,P,I}(TYPEDEF) macro, to
get the non-memory allocation version, and then a
- DEF_VEC_ALLOC_{O,P}(TYPEDEF,ALLOC) macro to get memory managed
+ DEF_VEC_ALLOC_{O,P,I}(TYPEDEF,ALLOC) macro to get memory managed
vectors. Variables of vector type are declared using a
VEC(TYPEDEF,ALLOC) macro. The ALLOC argument specifies the
allocation strategy, and can be either 'gc' or 'heap' for garbage
collected and heap allocated respectively. It can be 'none' to get
a vector that must be explicitly allocated (for instance as a
- trailing array of another structure). The characters O and P
- indicate whether TYPEDEF is a pointer (P) or object (O) type. Be
- careful to pick the correct one, as you'll get an awkward and
- inefficient API if you get the wrong one. There is a check, which
- results in a compile-time warning, for the P versions, but there is
- no check for the O versions, as that is not possible in plain C.
+ trailing array of another structure). The characters O, P and I
+ indicate whether TYPEDEF is a pointer (P), object (O) or integral
+ (I) type. Be careful to pick the correct one, as you'll get an
+ awkward and inefficient API if you use the wrong one. There is a
+ check, which results in a compile-time warning, for the P and I
+ versions, but there is no check for the O versions, as that is not
+ possible in plain C. Due to the way GTY works, you must annotate
+ any structures you wish to insert or reference from a vector with a
+ GTY(()) tag. You need to do this even if you never declare the GC
+ allocated variants.
An example of their use would be,
@@ -147,6 +148,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#define VEC_length(T,V) (VEC_OP(T,base,length)(VEC_BASE(V)))
/* Get the final element of the vector.
+ T VEC_T_last(VEC(T) *v); // Integer
T VEC_T_last(VEC(T) *v); // Pointer
T *VEC_T_last(VEC(T) *v); // Object
@@ -155,6 +157,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#define VEC_last(T,V) (VEC_OP(T,base,last)(VEC_BASE(V) VEC_CHECK_INFO))
/* Index into vector
+ T VEC_T_index(VEC(T) *v, unsigned ix); // Integer
T VEC_T_index(VEC(T) *v, unsigned ix); // Pointer
T *VEC_T_index(VEC(T) *v, unsigned ix); // Object
@@ -163,6 +166,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#define VEC_index(T,V,I) (VEC_OP(T,base,index)(VEC_BASE(V),I VEC_CHECK_INFO))
/* Iterate over vector
+ int VEC_T_iterate(VEC(T) *v, unsigned ix, T &ptr); // Integer
int VEC_T_iterate(VEC(T) *v, unsigned ix, T &ptr); // Pointer
int VEC_T_iterate(VEC(T) *v, unsigned ix, T *&ptr); // Object
@@ -228,6 +232,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
(VEC_OP(T,A,reserve)(&(V),R VEC_CHECK_INFO MEM_STAT_INFO))
/* Push object with no reallocation
+ T *VEC_T_quick_push (VEC(T) *v, T obj); // Integer
T *VEC_T_quick_push (VEC(T) *v, T obj); // Pointer
T *VEC_T_quick_push (VEC(T) *v, T *obj); // Object
@@ -240,6 +245,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
(VEC_OP(T,base,quick_push)(VEC_BASE(V),O VEC_CHECK_INFO))
/* Push object with reallocation
+ T *VEC_T_A_safe_push (VEC(T,A) *&v, T obj); // Integer
T *VEC_T_A_safe_push (VEC(T,A) *&v, T obj); // Pointer
T *VEC_T_A_safe_push (VEC(T,A) *&v, T *obj); // Object
@@ -251,6 +257,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
(VEC_OP(T,A,safe_push)(&(V),O VEC_CHECK_INFO MEM_STAT_INFO))
/* Pop element off end
+ T VEC_T_pop (VEC(T) *v); // Integer
T VEC_T_pop (VEC(T) *v); // Pointer
void VEC_T_pop (VEC(T) *v); // Object
@@ -276,9 +283,10 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
uninitialized. */
#define VEC_safe_grow(T,A,V,I) \
- (VEC_OP(T,A,safe_grow)(&(V),I VEC_CHECK_INFO))
+ (VEC_OP(T,A,safe_grow)(&(V),I VEC_CHECK_INFO MEM_STAT_INFO))
/* Replace element
+ T VEC_T_replace (VEC(T) *v, unsigned ix, T val); // Integer
T VEC_T_replace (VEC(T) *v, unsigned ix, T val); // Pointer
T *VEC_T_replace (VEC(T) *v, unsigned ix, T *val); // Object
@@ -292,6 +300,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
(VEC_OP(T,base,replace)(VEC_BASE(V),I,O VEC_CHECK_INFO))
/* Insert object with no reallocation
+ T *VEC_T_quick_insert (VEC(T) *v, unsigned ix, T val); // Integer
T *VEC_T_quick_insert (VEC(T) *v, unsigned ix, T val); // Pointer
T *VEC_T_quick_insert (VEC(T) *v, unsigned ix, T *val); // Object
@@ -304,6 +313,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
(VEC_OP(T,base,quick_insert)(VEC_BASE(V),I,O VEC_CHECK_INFO))
/* Insert object with reallocation
+ T *VEC_T_A_safe_insert (VEC(T,A) *&v, unsigned ix, T val); // Integer
T *VEC_T_A_safe_insert (VEC(T,A) *&v, unsigned ix, T val); // Pointer
T *VEC_T_A_safe_insert (VEC(T,A) *&v, unsigned ix, T *val); // Object
@@ -316,6 +326,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
(VEC_OP(T,A,safe_insert)(&(V),I,O VEC_CHECK_INFO MEM_STAT_INFO))
/* Remove element retaining order
+ T VEC_T_ordered_remove (VEC(T) *v, unsigned ix); // Integer
T VEC_T_ordered_remove (VEC(T) *v, unsigned ix); // Pointer
void VEC_T_ordered_remove (VEC(T) *v, unsigned ix); // Object
@@ -327,6 +338,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
(VEC_OP(T,base,ordered_remove)(VEC_BASE(V),I VEC_CHECK_INFO))
/* Remove element destroying order
+ T VEC_T_unordered_remove (VEC(T) *v, unsigned ix); // Integer
T VEC_T_unordered_remove (VEC(T) *v, unsigned ix); // Pointer
void VEC_T_unordered_remove (VEC(T) *v, unsigned ix); // Object
@@ -347,6 +359,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
/* Find the first index in the vector not less than the object.
unsigned VEC_T_lower_bound (VEC(T) *v, const T val,
+ bool (*lessthan) (const T, const T)); // Integer
+ unsigned VEC_T_lower_bound (VEC(T) *v, const T val,
bool (*lessthan) (const T, const T)); // Pointer
unsigned VEC_T_lower_bound (VEC(T) *v, const T *val,
bool (*lessthan) (const T*, const T*)); // Object
@@ -397,6 +411,14 @@ extern void vec_assert_fail (const char *, const char * VEC_CHECK_DECL)
/* Base of vector type, not user visible. */
#define VEC_T(T,B) \
+typedef struct VEC(T,B) \
+{ \
+ unsigned num; \
+ unsigned alloc; \
+ T vec[1]; \
+} VEC(T,B)
+
+#define VEC_T_GTY(T,B) \
typedef struct VEC(T,B) GTY(()) \
{ \
unsigned num; \
@@ -405,7 +427,7 @@ typedef struct VEC(T,B) GTY(()) \
} VEC(T,B)
/* Derived vector type, user visible. */
-#define VEC_TA(T,B,A,GTY) \
+#define VEC_TA_GTY(T,B,A,GTY) \
typedef struct VEC(T,A) GTY \
{ \
VEC(T,B) base; \
@@ -414,20 +436,49 @@ typedef struct VEC(T,A) GTY \
/* Convert to base type. */
#define VEC_BASE(P) ((P) ? &(P)->base : 0)
+/* Vector of integer-like object. */
+#if IN_GENGTYPE
+{"DEF_VEC_I", VEC_STRINGIFY (VEC_T(#0,#1)) ";", "none"},
+{"DEF_VEC_ALLOC_I", VEC_STRINGIFY (VEC_TA (#0,#1,#2,#3)) ";", NULL},
+#else
+#define DEF_VEC_I(T) \
+static inline void VEC_OP (T,must_be,integral_type) (void) \
+{ \
+ (void)~(T)0; \
+} \
+ \
+VEC_T(T,base); \
+VEC_TA_GTY(T,base,none,); \
+DEF_VEC_FUNC_P(T) \
+struct vec_swallow_trailing_semi
+#define DEF_VEC_ALLOC_I(T,A) \
+VEC_TA_GTY(T,base,A,); \
+DEF_VEC_ALLOC_FUNC_P(T,A) \
+struct vec_swallow_trailing_semi
+#endif
+
/* Vector of pointer to object. */
#if IN_GENGTYPE
-{"DEF_VEC_P", VEC_STRINGIFY (VEC_T(#0,#1)) ";", "none"},
-{"DEF_VEC_ALLOC_P", VEC_STRINGIFY (VEC_TA (#0,#1,#2,#3)) ";", NULL},
+{"DEF_VEC_P", VEC_STRINGIFY (VEC_T_GTY(#0,#1)) ";", "none"},
+{"DEF_VEC_ALLOC_P", VEC_STRINGIFY (VEC_TA_GTY (#0,#1,#2,#3)) ";", NULL},
#else
-
#define DEF_VEC_P(T) \
-VEC_T(T,base); \
- \
-static inline void VEC_OP (T,must,be_a_pointer_or_integer) (void) \
+static inline void VEC_OP (T,must_be,pointer_type) (void) \
{ \
- (void)((T)0 == (void *)0); \
+ (void)((T)1 == (void *)1); \
} \
\
+VEC_T_GTY(T,base); \
+VEC_TA_GTY(T,base,none,); \
+DEF_VEC_FUNC_P(T) \
+struct vec_swallow_trailing_semi
+#define DEF_VEC_ALLOC_P(T,A) \
+VEC_TA_GTY(T,base,A,); \
+DEF_VEC_ALLOC_FUNC_P(T,A) \
+struct vec_swallow_trailing_semi
+#endif
+
+#define DEF_VEC_FUNC_P(T) \
static inline unsigned VEC_OP (T,base,length) (const VEC(T,base) *vec_) \
{ \
return vec_ ? vec_->num : 0; \
@@ -598,13 +649,9 @@ static inline unsigned VEC_OP (T,base,lower_bound) \
len_ = half_; \
} \
return first_; \
-} \
- \
-VEC_TA(T,base,none,)
-
-#define DEF_VEC_ALLOC_P(T,A) \
-VEC_TA(T,base,A,); \
- \
+}
+
+#define DEF_VEC_ALLOC_FUNC_P(T,A) \
static inline VEC(T,A) *VEC_OP (T,A,alloc) \
(int alloc_ MEM_STAT_DECL) \
{ \
@@ -659,20 +706,25 @@ static inline T *VEC_OP (T,A,safe_insert) \
\
return VEC_OP (T,base,quick_insert) (VEC_BASE(*vec_), ix_, obj_ \
VEC_CHECK_PASS); \
-} \
- \
-struct vec_swallow_trailing_semi
-#endif
+}
/* Vector of object. */
#if IN_GENGTYPE
-{"DEF_VEC_O", VEC_STRINGIFY (VEC_T(#0,#1)) ";", "none"},
-{"DEF_VEC_ALLOC_O", VEC_STRINGIFY (VEC_TA(#0,#1,#2,#3)) ";", NULL},
+{"DEF_VEC_O", VEC_STRINGIFY (VEC_T_GTY(#0,#1)) ";", "none"},
+{"DEF_VEC_ALLOC_O", VEC_STRINGIFY (VEC_TA_GTY(#0,#1,#2,#3)) ";", NULL},
#else
-
#define DEF_VEC_O(T) \
-VEC_T(T,base); \
- \
+VEC_T_GTY(T,base); \
+VEC_TA_GTY(T,base,none,); \
+DEF_VEC_FUNC_O(T) \
+struct vec_swallow_trailing_semi
+#define DEF_VEC_ALLOC_O(T,A) \
+VEC_TA_GTY(T,base,A,); \
+DEF_VEC_ALLOC_FUNC_O(T,A) \
+struct vec_swallow_trailing_semi
+#endif
+
+#define DEF_VEC_FUNC_O(T) \
static inline unsigned VEC_OP (T,base,length) (const VEC(T,base) *vec_) \
{ \
return vec_ ? vec_->num : 0; \
@@ -830,13 +882,9 @@ static inline unsigned VEC_OP (T,base,lower_bound) \
len_ = half_; \
} \
return first_; \
-} \
- \
-VEC_TA(T,base,none,)
+}
-#define DEF_VEC_ALLOC_O(T,A) \
-VEC_TA(T,base,A,); \
- \
+#define DEF_VEC_ALLOC_FUNC_O(T,A) \
static inline VEC(T,A) *VEC_OP (T,A,alloc) \
(int alloc_ MEM_STAT_DECL) \
{ \
@@ -899,9 +947,5 @@ static inline T *VEC_OP (T,A,safe_insert) \
\
return VEC_OP (T,base,quick_insert) (VEC_BASE(*vec_), ix_, obj_ \
VEC_CHECK_PASS); \
-} \
- \
-struct vec_swallow_trailing_semi
-#endif
-
+}
#endif /* GCC_VEC_H */
diff --git a/include/ChangeLog b/include/ChangeLog
index 0e7fcaf41df..abe0b1b1dd5 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,32 @@
+2005-06-06 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * libiberty.h (XOBFINISH): New.
+
+2005-06-01 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * libiberty.h (vsnprintf): Add format attribute.
+
+2005-05-29 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * ansidecl.h: Add ATTRIBUTE_FPTR_PRINTF.
+
+2005-05-28 Eli Zaretskii <eliz@gnu.org>
+
+ * libiberty.h: (snprintf) [!HAVE_DECL_SNPRINTF]: Declare if
+ needed.
+ (vsnprintf) [!HAVE_DECL_VSNPRINTF]: Declare if needed.
+
+2005-05-25 Richard Henderson <rth@redhat.com>
+
+ * demangle.h (DEMANGLE_COMPONENT_HIDDEN_ALIAS): New.
+
+2005-05-24 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * libiberty.h (ACONCAT): Properly cast value of alloca().
+
+ * ansidecl.h (ATTRIBUTE_UNUSED_LABEL): Don't define if
+ __cplusplus.
+
2005-05-12 Steve Ellcey <sje@cup.hp.com>
libiberty.h: Do not define empty basename prototype.
@@ -56,7 +85,7 @@
2005-03-28 Mark Mitchell <mark@codesourcery.com>
* libiberty.h (ffs): Declare, if necessary.
-
+
2005-03-27 Gabriel Dos Reis <gdr@integrable-solutions.net>
* xregex2.h (_RE_ARGS): Remove definition and uses.
@@ -166,9 +195,9 @@
* hashtab.h (struct htab): Add size_prime_index.
2004-04-13 Jeff Law <law@redhat.com>
-
+
* hashtab.h (htab_remove_elt_with_hash): Prototype new function.
-
+
2004-03-30 Zack Weinberg <zack@codesourcery.com>
* hashtab.h, splay-tree.h: Use new shorter form of GTY markers.
diff --git a/include/ansidecl.h b/include/ansidecl.h
index 02bb41240cb..439431182dc 100644
--- a/include/ansidecl.h
+++ b/include/ansidecl.h
@@ -258,11 +258,11 @@ So instead we use the macro below and test it against specific values. */
/* Attributes on labels were valid as of gcc 2.93. */
#ifndef ATTRIBUTE_UNUSED_LABEL
-# if (GCC_VERSION >= 2093)
+# if (!defined (__cplusplus) && GCC_VERSION >= 2093)
# define ATTRIBUTE_UNUSED_LABEL ATTRIBUTE_UNUSED
# else
# define ATTRIBUTE_UNUSED_LABEL
-# endif /* GNUC >= 2.93 */
+# endif /* !__cplusplus && GNUC >= 2.93 */
#endif /* ATTRIBUTE_UNUSED_LABEL */
#ifndef ATTRIBUTE_UNUSED
@@ -312,6 +312,22 @@ So instead we use the macro below and test it against specific values. */
#define ATTRIBUTE_PRINTF_5 ATTRIBUTE_PRINTF(5, 6)
#endif /* ATTRIBUTE_PRINTF */
+/* Use ATTRIBUTE_FPTR_PRINTF when the format attribute is to be set on
+ a function pointer. Format attributes were allowed on function
+ pointers as of gcc 3.1. */
+#ifndef ATTRIBUTE_FPTR_PRINTF
+# if (GCC_VERSION >= 3001)
+# define ATTRIBUTE_FPTR_PRINTF(m, n) ATTRIBUTE_PRINTF(m, n)
+# else
+# define ATTRIBUTE_FPTR_PRINTF(m, n)
+# endif /* GNUC >= 3.1 */
+# define ATTRIBUTE_FPTR_PRINTF_1 ATTRIBUTE_FPTR_PRINTF(1, 2)
+# define ATTRIBUTE_FPTR_PRINTF_2 ATTRIBUTE_FPTR_PRINTF(2, 3)
+# define ATTRIBUTE_FPTR_PRINTF_3 ATTRIBUTE_FPTR_PRINTF(3, 4)
+# define ATTRIBUTE_FPTR_PRINTF_4 ATTRIBUTE_FPTR_PRINTF(4, 5)
+# define ATTRIBUTE_FPTR_PRINTF_5 ATTRIBUTE_FPTR_PRINTF(5, 6)
+#endif /* ATTRIBUTE_FPTR_PRINTF */
+
/* Use ATTRIBUTE_NULL_PRINTF when the format specifier may be NULL. A
NULL format specifier was allowed as of gcc 3.3. */
#ifndef ATTRIBUTE_NULL_PRINTF
diff --git a/include/demangle.h b/include/demangle.h
index 944a951772d..304a4c4e472 100644
--- a/include/demangle.h
+++ b/include/demangle.h
@@ -239,6 +239,9 @@ enum demangle_component_type
/* A reference temporary. This has one subtree, the name for which
this is a temporary. */
DEMANGLE_COMPONENT_REFTEMP,
+ /* A hidden alias. This has one subtree, the encoding for which it
+ is providing alternative linkage. */
+ DEMANGLE_COMPONENT_HIDDEN_ALIAS,
/* A standard substitution. This holds the name of the
substitution. */
DEMANGLE_COMPONENT_SUB_STD,
diff --git a/include/libiberty.h b/include/libiberty.h
index ae0ab2bde08..4b0d532db78 100644
--- a/include/libiberty.h
+++ b/include/libiberty.h
@@ -156,7 +156,7 @@ extern char *libiberty_concat_ptr;
strings. Allocates memory using alloca. The arguments are
evaluated twice! */
#define ACONCAT(ACONCAT_PARAMS) \
- (libiberty_concat_ptr = alloca (concat_length ACONCAT_PARAMS + 1), \
+ (libiberty_concat_ptr = (char *) alloca (concat_length ACONCAT_PARAMS + 1), \
concat_copy2 ACONCAT_PARAMS)
/* Check whether two file descriptors refer to the same file. */
@@ -326,7 +326,7 @@ extern double physmem_available (void);
/* Type-safe obstack allocator. */
#define XOBNEW(O, T) ((T *) obstack_alloc ((O), sizeof (T)))
-
+#define XOBFINISH(O, T) ((T) obstack_finish ((O)))
/* hex character manipulation routines */
@@ -527,8 +527,17 @@ extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;
/* Like vsprintf but provides a pointer to malloc'd storage, which
must be freed by the caller. */
-extern int vasprintf (char **, const char *, va_list)
- ATTRIBUTE_PRINTF(2,0);
+extern int vasprintf (char **, const char *, va_list) ATTRIBUTE_PRINTF(2,0);
+#endif
+
+#if defined(HAVE_DECL_SNPRINTF) && !HAVE_DECL_SNPRINTF
+/* Like sprintf but prints at most N characters. */
+extern int snprintf (char *, size_t, const char *, ...) ATTRIBUTE_PRINTF_3;
+#endif
+
+#if defined(HAVE_DECL_VSNPRINTF) && !HAVE_DECL_VSNPRINTF
+/* Like vsprintf but prints at most N characters. */
+extern int vsnprintf (char *, size_t, const char *, va_list) ATTRIBUTE_PRINTF(3,0);
#endif
#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index c13a0679b3b..cc045a0c9c4 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,101 @@
+2005-06-13 Zack Weinberg <zack@codesourcery.com>
+
+ * configure.ac: Invoke ZW_CREATE_DEPDIR and
+ ZW_PROG_COMPILER_DEPENDENCIES.
+ * aclocal.m4, configure: Regenerate.
+ * Makefile.in (DEPMODE, DEPDIR, depcomp, COMPILE.base, COMPILE):
+ New variables.
+ (distclean): Clean up $(DEPDIR) and its contents.
+ (.c.o): Use $(COMPILE).
+ Include $(DEPDIR)/*.Po for most object->header dependencies.
+
+2005-05-28 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * configure.ac: Check declarations for asprintf and vasprintf.
+ * config.in: Regenerate.
+ * configure: Likewise.
+
+ * charset.c (conversion_loop): Use XRESIZEVEC.
+ (convert_no_conversion): Likewise.
+ (convert_using_iconv): Likewise.
+ (init_iconv_desc): Cast return value of alloca.
+ (cpp_host_to_exec_charset): Use XNEWVEC.
+ (emit_numeric_escape): Use XRESIZEVEC.
+ (cpp_interpret_string): Use XNEWVEC.
+ (cpp_interpret_string): Use XRESIZEVEC.
+ (_cpp_interpret_identifier): Cast return value of alloca.
+ (_cpp_convert_input): Use XNEWVEC and XRESIZEVEC.
+ * directives.c (glue_header_name): Use XNEWVEC and XRESIZEVEC.
+ (parse_include): Use XNEWVEC.
+ (insert_pragma_entry): Rename local variable "new" to
+ "new_entry".
+ (save_registered_pragmas): Cast return value of xmemdup.
+ (destringize_and_run): Same for alloca.
+ (parse_assertion): Likewise.
+ (do_assert): Cast allocated storage to proper type.
+ (cpp_define): Likewise.
+ (_cpp_define_builtin): Likewise.
+ (cpp_undef): Likewise.
+ (handle_assertion): Likewise.
+ (cpp_push_buffer): Rename local variable "new" to "new_buffer".
+ * expr.c (CPP_UPLUS): Cast value to type cpp_ttype.
+ (CPP_UMINUS): Likewise.
+ (struct cpp_operator): Rename from struct operator.
+ (_cpp_expand_op_stack): Use XRESIZEVEC.
+ * files.c (pch_open_file): Use XNEWVEC.
+ (pch_open_file): Use XRESIZEVEC.
+ (read_file_guts): Use XNEWVEC and XRESIZEVEC.
+ (dir_name_of_file): Use XNEWVEC.
+ (make_cpp_file): Use XCNEW.
+ (make_cpp_dir): Likewise.
+ (allocate_file_hash_entries): USE XNEWVEC.
+ (cpp_included): Cast return value of htab_find_with_hash.
+ (append_file_to_dir): Use XNEWVEC.
+ (read_filename_string): Likewise. Use XRESIZEVEC too.
+ (read_name_map): Cast return value of alloca. Use XRESIZEVEC.
+ (remap_filename): Use XNEWVEC.
+ (struct pchf_entry): Move definition out of struct pchf_data.
+ (_cpp_save_file_entries): Use XCNEWVAR.
+ (_cpp_read_file_entries): Use XNEWVAR.
+ * identifiers.c (alloc_node): Use XOBNEW.
+ * init.c (cpp_create_reader): Use XCNEW.
+ (cpp_init_builtins): Cast of b->value to enum builtin_type.
+ (read_original_directory): Cast return value of alloca.
+ * lex.c (add_line_note): Use XRESIZEVEC.
+ (warn_about_normalization): Use XNEWVEC.
+ (_cpp_lex_direct): Cast node->directive_index to (enum cpp_ttype).
+ (new_buff): Use XNEWVEC.
+ * line-map.c (linemap_add): Use XRESIZEVEC.
+ * macro.c (builtin_macro): Cast return value of alloca.
+ (paste_tokens): Likewise.
+ (expand_arg): Use XNEWVEC and XRESIZEVEC.
+ (_cpp_save_parameter): Use XRESIZEVEC.
+ (create_iso_definition): Cast allocated storage to proper type.
+ (_cpp_create_definition): Likewise.
+ (cpp_macro_definition): Use XRESIZEVEC.
+ * makedepend.c (add_clm): Use XNEW.
+ (add_dir): Likewise.
+ * mkdeps.c (munge): Use XNEWVEC.
+ (deps_init): Use XCNEW.
+ (deps_add_target): Use XRESIZEVEC.
+ (deps_add_default_target): Cast return value of alloca.
+ (deps_add_dep): Use XRESIZEVEC.
+ (deps_add_vpath): Likewise. Use XNEWVEC too.
+ (deps_restore): Likewise.
+ * pch.c (save_idents): Use XNEW and XNEWVEC.
+ (cpp_save_state): Use XNEW.
+ (count_defs): Cast return value of htab_find.
+ (write_defs): Likewise.
+ (cpp_write_pch_deps): Use XNEWVEC.
+ (collect_ht_nodes): Use XRESIZEVEC.
+ (cpp_valid_state): Use XNEWVEC.
+ (save_macros): Use XRESIZEVEC. Cast return value of xmemdup.
+ * symtab.c (ht_create): Use XCNEW.
+ (ht_lookup_with_hash): Cast return value of obstack_copy0.
+ (ht_expand): Use XCNEWVEC.
+ * system.h (HAVE_DESIGNATED_INITIALIZERS): False if __cplusplus.
+ (bool): Do not define if __cplusplus.
+
2005-05-12 Zack Weinberg <zack@codesourcery.com>
* directives.c (#sccs table entry): Mark IN_I, consistent with #ident.
diff --git a/libcpp/Makefile.in b/libcpp/Makefile.in
index 8a7a4898365..d236c1bd999 100644
--- a/libcpp/Makefile.in
+++ b/libcpp/Makefile.in
@@ -51,6 +51,8 @@ RANLIB = @RANLIB@
SHELL = @SHELL@
USED_CATALOGS = @USED_CATALOGS@
XGETTEXT = @XGETTEXT@
+DEPMODE = @CCDEPMODE@
+DEPDIR = @DEPDIR@
datadir = @datadir@
exec_prefix = @prefix@
@@ -60,6 +62,8 @@ prefix = @prefix@
MSGMERGE = msgmerge
mkinstalldirs = $(SHELL) $(srcdir)/../mkinstalldirs
+depcomp = $(SHELL) $(srcdir)/../depcomp
+
INCLUDES = -I$(srcdir) -I. -I$(srcdir)/../include @INCINTL@ \
-I$(srcdir)/include
@@ -165,7 +169,8 @@ clean: mostlyclean
distclean: clean
-rm -f config.h stamp-h1 config.status config.cache config.log \
configure.lineno configure.status.lineno Makefile localedir.h \
- localedir.hs
+ localedir.hs $(DEPDIR)/*.Po
+ -rmdir $(DEPDIR)
maintainer-clean: distclean
@echo "This command is intended for maintainers to use"
@@ -186,10 +191,19 @@ update-po: $(CATALOGS:.gmo=.pox)
maintainer-clean check installcheck dvi html info install-info \
install-man update-po
+# Dependency rule.
+COMPILE.base = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(ALL_CFLAGS) -c
+ifeq ($(DEPMODE),depmode=gcc3)
+COMPILE = $(COMPILE.base) -o $@ -MT $@ -MD -MP -MF $(DEPDIR)/$*.Po
+else
+COMPILE = source='$<' object='$@' libtool=no DEPDIR=$(DEPDIR) $(DEPMODE) \
+ $(depcomp) $(COMPILE.base)
+endif
+
# Implicit rules and I18N
.c.o:
- $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(ALL_CFLAGS) -c $<
+ $(COMPILE) $<
# N.B. We do not attempt to copy these into $(srcdir).
.po.gmo:
@@ -227,35 +241,7 @@ po/$(PACKAGE).pot: $(libcpp_a_SOURCES)
.NOEXPORT:
# Dependencies
+-include $(patsubst %.o, $(DEPDIR)/%.Po, $(libcpp_a_OBJS) $(makedepend_OBJS))
-top_srcdir = $(srcdir)/..
-top_incdir = $(srcdir)/../include
-libcpp_incdir = $(srcdir)/../libcpp/include
-
-COMMON_DEPS = config.h $(srcdir)/system.h $(srcdir)/internal.h \
- $(top_incdir)/libiberty.h $(top_incdir)/ansidecl.h \
- $(top_incdir)/filenames.h $(top_incdir)/safe-ctype.h \
- $(libcpp_incdir)/symtab.h $(top_incdir)/obstack.h \
- $(libcpp_incdir)/line-map.h $(libcpp_incdir)/cpplib.h \
- $(libcpp_incdir)/cpp-id-data.h $(top_incdir)/getopt.h
-
-charset.o: $(srcdir)/charset.c $(COMMON_DEPS) $(srcdir)/ucnid.h
-directives.o: $(srcdir)/directives.c $(COMMON_DEPS) $(libcpp_incdir)/mkdeps.h
-errors.o: $(srcdir)/errors.c $(COMMON_DEPS)
-expr.o: $(srcdir)/expr.c $(COMMON_DEPS)
-
-files.o: $(srcdir)/files.c $(COMMON_DEPS) $(libcpp_incdir)/mkdeps.h \
- $(top_incdir)/hashtab.h $(top_incdir)/md5.h
-identifiers.o: $(srcdir)/identifiers.c $(COMMON_DEPS)
-init.o: $(srcdir)/init.c $(COMMON_DEPS) $(libcpp_incdir)/mkdeps.h localedir.h
-lex.o: $(srcdir)/lex.c $(COMMON_DEPS)
-line-map.o: $(srcdir)/line-map.c $(COMMON_DEPS)
-macro.o: $(srcdir)/macro.c $(COMMON_DEPS)
-makedepend.o: $(srcdir)/makedepend.c $(COMMON_DEPS) $(libcpp_incdir)/mkdeps.h
-mkdeps.o: $(srcdir)/mkdeps.c $(COMMON_DEPS)
-
-pch.o: $(srcdir)/pch.c $(COMMON_DEPS) \
- $(top_incdir)/hashtab.h $(libcpp_incdir)/mkdeps.h
-
-symtab.o: $(srcdir)/symtab.c $(COMMON_DEPS)
-traditional.o: $(srcdir)/traditional.c $(COMMON_DEPS)
+# Dependencies on generated headers have to be explicit.
+init.o: localedir.h
diff --git a/libcpp/aclocal.m4 b/libcpp/aclocal.m4
index 97c314ada6e..ad1d0ce7bac 100644
--- a/libcpp/aclocal.m4
+++ b/libcpp/aclocal.m4
@@ -13,8 +13,10 @@
m4_include([../config/acx.m4])
m4_include([../config/codeset.m4])
+m4_include([../config/depstand.m4])
m4_include([../config/gettext-sister.m4])
m4_include([../config/iconv.m4])
+m4_include([../config/lead-dot.m4])
m4_include([../config/lib-ld.m4])
m4_include([../config/lib-link.m4])
m4_include([../config/lib-prefix.m4])
diff --git a/libcpp/charset.c b/libcpp/charset.c
index ba53f6337cc..f382d7f57fc 100644
--- a/libcpp/charset.c
+++ b/libcpp/charset.c
@@ -486,7 +486,7 @@ conversion_loop (int (*const one_conversion)(iconv_t, const uchar **, size_t *,
outbytesleft += OUTBUF_BLOCK_SIZE;
to->asize += OUTBUF_BLOCK_SIZE;
- to->text = xrealloc (to->text, to->asize);
+ to->text = XRESIZEVEC (uchar, to->text, to->asize);
outbuf = to->text + to->asize - outbytesleft;
}
}
@@ -538,7 +538,7 @@ convert_no_conversion (iconv_t cd ATTRIBUTE_UNUSED,
if (to->len + flen > to->asize)
{
to->asize = to->len + flen;
- to->text = xrealloc (to->text, to->asize);
+ to->text = XRESIZEVEC (uchar, to->text, to->asize);
}
memcpy (to->text + to->len, from, flen);
to->len += flen;
@@ -578,7 +578,7 @@ convert_using_iconv (iconv_t cd, const uchar *from, size_t flen,
outbytesleft += OUTBUF_BLOCK_SIZE;
to->asize += OUTBUF_BLOCK_SIZE;
- to->text = xrealloc (to->text, to->asize);
+ to->text = XRESIZEVEC (uchar, to->text, to->asize);
outbuf = (char *)to->text + to->asize - outbytesleft;
}
}
@@ -628,7 +628,7 @@ init_iconv_desc (cpp_reader *pfile, const char *to, const char *from)
return ret;
}
- pair = alloca(strlen(to) + strlen(from) + 2);
+ pair = (char *) alloca(strlen(to) + strlen(from) + 2);
strcpy(pair, from);
strcat(pair, "/");
@@ -751,7 +751,7 @@ cpp_host_to_exec_charset (cpp_reader *pfile, cppchar_t c)
/* This should never need to reallocate, but just in case... */
tbuf.asize = 1;
- tbuf.text = xmalloc (tbuf.asize);
+ tbuf.text = XNEWVEC (uchar, tbuf.asize);
tbuf.len = 0;
if (!APPLY_CONVERSION (pfile->narrow_cset_desc, sbuf, 1, &tbuf))
@@ -1087,7 +1087,7 @@ emit_numeric_escape (cpp_reader *pfile, cppchar_t n,
if (tbuf->len + nbwc > tbuf->asize)
{
tbuf->asize += OUTBUF_BLOCK_SIZE;
- tbuf->text = xrealloc (tbuf->text, tbuf->asize);
+ tbuf->text = XRESIZEVEC (uchar, tbuf->text, tbuf->asize);
}
for (i = 0; i < nbwc; i++)
@@ -1105,7 +1105,7 @@ emit_numeric_escape (cpp_reader *pfile, cppchar_t n,
if (tbuf->len + 1 > tbuf->asize)
{
tbuf->asize += OUTBUF_BLOCK_SIZE;
- tbuf->text = xrealloc (tbuf->text, tbuf->asize);
+ tbuf->text = XRESIZEVEC (uchar, tbuf->text, tbuf->asize);
}
tbuf->text[tbuf->len++] = n;
}
@@ -1306,7 +1306,7 @@ cpp_interpret_string (cpp_reader *pfile, const cpp_string *from, size_t count,
= wide ? pfile->wide_cset_desc : pfile->narrow_cset_desc;
tbuf.asize = MAX (OUTBUF_BLOCK_SIZE, from->len);
- tbuf.text = xmalloc (tbuf.asize);
+ tbuf.text = XNEWVEC (uchar, tbuf.asize);
tbuf.len = 0;
for (i = 0; i < count; i++)
@@ -1337,7 +1337,7 @@ cpp_interpret_string (cpp_reader *pfile, const cpp_string *from, size_t count,
/* NUL-terminate the 'to' buffer and translate it to a cpp_string
structure. */
emit_numeric_escape (pfile, 0, &tbuf, wide);
- tbuf.text = xrealloc (tbuf.text, tbuf.len);
+ tbuf.text = XRESIZEVEC (uchar, tbuf.text, tbuf.len);
to->text = tbuf.text;
to->len = tbuf.len;
return true;
@@ -1526,7 +1526,7 @@ _cpp_interpret_identifier (cpp_reader *pfile, const uchar *id, size_t len)
{
/* It turns out that a UCN escape always turns into fewer characters
than the escape itself, so we can allocate a temporary in advance. */
- uchar * buf = alloca (len + 1);
+ uchar * buf = (uchar *) alloca (len + 1);
uchar * bufp = buf;
size_t idp;
@@ -1598,7 +1598,7 @@ _cpp_convert_input (cpp_reader *pfile, const char *input_charset,
else
{
to.asize = MAX (65536, len);
- to.text = xmalloc (to.asize);
+ to.text = XNEWVEC (uchar, to.asize);
to.len = 0;
if (!APPLY_CONVERSION (input_cset, input, len, &to))
@@ -1616,7 +1616,7 @@ _cpp_convert_input (cpp_reader *pfile, const char *input_charset,
/* Resize buffer if we allocated substantially too much, or if we
haven't enough space for the \n-terminator. */
if (to.len + 4096 < to.asize || to.len >= to.asize)
- to.text = xrealloc (to.text, to.len + 1);
+ to.text = XRESIZEVEC (uchar, to.text, to.len + 1);
/* If the file is using old-school Mac line endings (\r only),
terminate with another \r, not an \n, so that we do not mistake
diff --git a/libcpp/config.in b/libcpp/config.in
index a302492406b..2b05ba0c401 100644
--- a/libcpp/config.in
+++ b/libcpp/config.in
@@ -29,6 +29,10 @@
*/
#undef HAVE_DECL_ABORT
+/* Define to 1 if you have the declaration of `asprintf', and to 0 if you
+ don't. */
+#undef HAVE_DECL_ASPRINTF
+
/* Define to 1 if you have the declaration of `basename', and to 0 if you
don't. */
#undef HAVE_DECL_BASENAME
@@ -105,6 +109,10 @@
don't. */
#undef HAVE_DECL_PUTC_UNLOCKED
+/* Define to 1 if you have the declaration of `vasprintf', and to 0 if you
+ don't. */
+#undef HAVE_DECL_VASPRINTF
+
/* Define to 1 if you have the <fcntl.h> header file. */
#undef HAVE_FCNTL_H
diff --git a/libcpp/configure b/libcpp/configure
index 63647450dfc..63e2020d3d7 100755
--- a/libcpp/configure
+++ b/libcpp/configure
@@ -311,7 +311,7 @@ ac_includes_default="\
# include <unistd.h>
#endif"
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os SET_MAKE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT RANLIB ac_ct_RANLIB ACLOCAL AUTOCONF AUTOHEADER WARN_CFLAGS WARN_PEDANTIC WERROR CPP EGREP LIBOBJS ALLOCA USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS LIBICONV LTLIBICONV PACKAGE USED_CATALOGS MAINT LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os SET_MAKE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT RANLIB ac_ct_RANLIB ACLOCAL AUTOCONF AUTOHEADER WARN_CFLAGS WARN_PEDANTIC WERROR am__leading_dot DEPDIR CCDEPMODE CPP EGREP LIBOBJS ALLOCA USE_NLS LIBINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS LIBICONV LTLIBICONV PACKAGE USED_CATALOGS MAINT LTLIBOBJS'
ac_subst_files=''
# Initialize some variables set by options.
@@ -2839,6 +2839,120 @@ fi
+# Dependency checking.
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+DEPDIR="${am__leading_dot}deps"
+
+ ac_config_commands="$ac_config_commands depdir"
+
+
+depcc="$CC" am_compiler_list=
+
+am_depcomp=$ac_aux_dir/depcomp
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ if test $depmode = none; then break; fi
+
+ echo "$as_me:$LINENO: trying $depmode" >&5
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "include sub/conftest.Po" > confmf
+
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ depcmd="depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c"
+ echo "| $depcmd" | sed -e 's/ */ /g' >&5
+ if env $depcmd > conftest.err 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po >>conftest.err 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po >>conftest.err 2>&1 &&
+ ${MAKE-make} -s -f confmf >>conftest.err 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ echo "$as_me:$LINENO: success" >&5
+ break
+ fi
+ fi
+ echo "$as_me:$LINENO: failure, diagnostics are:" >&5
+ sed -e 's/^/| /' < conftest.err >&5
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
+if test x${am_cv_CC_dependencies_compiler_type-none} = xnone
+then { { echo "$as_me:$LINENO: error: no usable dependency style found" >&5
+echo "$as_me: error: no usable dependency style found" >&2;}
+ { (exit 1); exit 1; }; }
+else CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+fi
+
+
# Checks for header files.
echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5
echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6
@@ -5077,6 +5191,76 @@ _ACEOF
fi
+echo "$as_me:$LINENO: checking whether asprintf is declared" >&5
+echo $ECHO_N "checking whether asprintf is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_asprintf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef asprintf
+ char *p = (char *) asprintf;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_asprintf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_asprintf=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_asprintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_asprintf" >&6
+if test $ac_cv_have_decl_asprintf = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ASPRINTF 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ASPRINTF 0
+_ACEOF
+
+
+fi
echo "$as_me:$LINENO: checking whether basename is declared" >&5
echo $ECHO_N "checking whether basename is declared... $ECHO_C" >&6
if test "${ac_cv_have_decl_basename+set}" = set; then
@@ -6407,6 +6591,76 @@ _ACEOF
fi
+echo "$as_me:$LINENO: checking whether vasprintf is declared" >&5
+echo $ECHO_N "checking whether vasprintf is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_vasprintf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef vasprintf
+ char *p = (char *) vasprintf;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_vasprintf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_vasprintf=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_vasprintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_vasprintf" >&6
+if test $ac_cv_have_decl_vasprintf = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_VASPRINTF 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_VASPRINTF 0
+_ACEOF
+
+
+fi
@@ -8418,6 +8672,9 @@ $config_files
Configuration headers:
$config_headers
+Configuration commands:
+$config_commands
+
Report bugs to <bug-autoconf@gnu.org>."
_ACEOF
@@ -8517,7 +8774,14 @@ fi
_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+DEPDIR=$DEPDIR
+_ACEOF
@@ -8527,6 +8791,7 @@ do
case "$ac_config_target" in
# Handling of arguments.
"Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "depdir" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depdir" ;;
"config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;;
*) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
@@ -8541,6 +8806,7 @@ done
if $ac_need_defaults; then
test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
fi
# Have a temporary directory for convenience. Make it in the build tree
@@ -8643,6 +8909,9 @@ s,@AUTOHEADER@,$AUTOHEADER,;t t
s,@WARN_CFLAGS@,$WARN_CFLAGS,;t t
s,@WARN_PEDANTIC@,$WARN_PEDANTIC,;t t
s,@WERROR@,$WERROR,;t t
+s,@am__leading_dot@,$am__leading_dot,;t t
+s,@DEPDIR@,$DEPDIR,;t t
+s,@CCDEPMODE@,$CCDEPMODE,;t t
s,@CPP@,$CPP,;t t
s,@EGREP@,$EGREP,;t t
s,@LIBOBJS@,$LIBOBJS,;t t
@@ -9126,6 +9395,124 @@ echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
esac
done
_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_dest" : 'X\(//\)[^/]' \| \
+ X"$ac_dest" : 'X\(//\)$' \| \
+ X"$ac_dest" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+ case $ac_dest in
+ depdir ) mkdir $DEPDIR ;;
+ esac
+done
+_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF
diff --git a/libcpp/configure.ac b/libcpp/configure.ac
index b56a7443619..5c27835e871 100644
--- a/libcpp/configure.ac
+++ b/libcpp/configure.ac
@@ -29,6 +29,10 @@ ACX_PROG_CC_WARNING_ALMOST_PEDANTIC([-Wno-long-long])
# corrected.
ACX_PROG_CC_WARNINGS_ARE_ERRORS([manual])
+# Dependency checking.
+ZW_CREATE_DEPDIR
+ZW_PROG_COMPILER_DEPENDENCIES([CC])
+
# Checks for header files.
AC_HEADER_TIME
ACX_HEADER_STRING
@@ -50,7 +54,8 @@ define(libcpp_UNLOCKED_FUNCS, clearerr_unlocked feof_unlocked dnl
fread_unlocked fwrite_unlocked getchar_unlocked getc_unlocked dnl
putchar_unlocked putc_unlocked)
AC_CHECK_FUNCS(libcpp_UNLOCKED_FUNCS)
-AC_CHECK_DECLS(m4_split(m4_normalize(abort basename errno getopt libcpp_UNLOCKED_FUNCS)))
+AC_CHECK_DECLS(m4_split(m4_normalize(abort asprintf basename errno getopt \
+ libcpp_UNLOCKED_FUNCS vasprintf)))
# Checks for library functions.
AC_FUNC_ALLOCA
diff --git a/libcpp/directives.c b/libcpp/directives.c
index 672415b8d61..a768ea14408 100644
--- a/libcpp/directives.c
+++ b/libcpp/directives.c
@@ -588,7 +588,7 @@ glue_header_name (cpp_reader *pfile)
/* To avoid lexed tokens overwriting our glued name, we can only
allocate from the string pool once we've lexed everything. */
- buffer = xmalloc (capacity);
+ buffer = XNEWVEC (char, capacity);
for (;;)
{
token = get_token_no_padding (pfile);
@@ -605,7 +605,7 @@ glue_header_name (cpp_reader *pfile)
if (total_len + len > capacity)
{
capacity = (capacity + len) * 2;
- buffer = xrealloc (buffer, capacity);
+ buffer = XRESIZEVEC (char, buffer, capacity);
}
if (token->flags & PREV_WHITE)
@@ -633,7 +633,7 @@ parse_include (cpp_reader *pfile, int *pangle_brackets)
header = get_token_no_padding (pfile);
if (header->type == CPP_STRING || header->type == CPP_HEADER_NAME)
{
- fname = xmalloc (header->val.str.len - 1);
+ fname = XNEWVEC (char, header->val.str.len - 1);
memcpy (fname, header->val.str.text + 1, header->val.str.len - 2);
fname[header->val.str.len - 2] = '\0';
*pangle_brackets = header->type == CPP_HEADER_NAME;
@@ -985,27 +985,27 @@ insert_pragma_entry (cpp_reader *pfile, struct pragma_entry **chain,
const cpp_hashnode *pragma, pragma_cb handler,
bool allow_expansion, bool internal)
{
- struct pragma_entry *new;
+ struct pragma_entry *new_entry;
- new = (struct pragma_entry *)
+ new_entry = (struct pragma_entry *)
_cpp_aligned_alloc (pfile, sizeof (struct pragma_entry));
- new->pragma = pragma;
+ new_entry->pragma = pragma;
if (handler)
{
- new->is_nspace = 0;
- new->u.handler = handler;
+ new_entry->is_nspace = 0;
+ new_entry->u.handler = handler;
}
else
{
- new->is_nspace = 1;
- new->u.space = NULL;
+ new_entry->is_nspace = 1;
+ new_entry->u.space = NULL;
}
- new->allow_expansion = allow_expansion;
- new->is_internal = internal;
- new->next = *chain;
- *chain = new;
- return new;
+ new_entry->allow_expansion = allow_expansion;
+ new_entry->is_internal = internal;
+ new_entry->next = *chain;
+ *chain = new_entry;
+ return new_entry;
}
/* Register a pragma NAME in namespace SPACE. If SPACE is null, it
@@ -1110,9 +1110,9 @@ save_registered_pragmas (struct pragma_entry *pe, char **sd)
{
if (pe->is_nspace)
sd = save_registered_pragmas (pe->u.space, sd);
- *sd++ = xmemdup (HT_STR (&pe->pragma->ident),
- HT_LEN (&pe->pragma->ident),
- HT_LEN (&pe->pragma->ident) + 1);
+ *sd++ = (char *) xmemdup (HT_STR (&pe->pragma->ident),
+ HT_LEN (&pe->pragma->ident),
+ HT_LEN (&pe->pragma->ident) + 1);
}
return sd;
}
@@ -1383,7 +1383,7 @@ destringize_and_run (cpp_reader *pfile, const cpp_string *in)
const unsigned char *src, *limit;
char *dest, *result;
- dest = result = alloca (in->len - 1);
+ dest = result = (char *) alloca (in->len - 1);
src = in->text + 1 + (in->text[0] == 'L');
limit = in->text + in->len - 1;
while (src < limit)
@@ -1760,7 +1760,7 @@ parse_assertion (cpp_reader *pfile, struct answer **answerp, int type)
else if (parse_answer (pfile, answerp, type) == 0)
{
unsigned int len = NODE_LEN (predicate->val.node);
- unsigned char *sym = alloca (len + 1);
+ unsigned char *sym = (unsigned char *) alloca (len + 1);
/* Prefix '#' to get it out of macro namespace. */
sym[0] = '#';
@@ -1855,7 +1855,8 @@ do_assert (cpp_reader *pfile)
if (pfile->hash_table->alloc_subobject)
{
struct answer *temp_answer = new_answer;
- new_answer = pfile->hash_table->alloc_subobject (answer_size);
+ new_answer = (struct answer *) pfile->hash_table->alloc_subobject
+ (answer_size);
memcpy (new_answer, temp_answer, answer_size);
}
else
@@ -1917,7 +1918,7 @@ cpp_define (cpp_reader *pfile, const char *str)
tack " 1" on the end. */
count = strlen (str);
- buf = alloca (count + 3);
+ buf = (char *) alloca (count + 3);
memcpy (buf, str, count);
p = strchr (str, '=');
@@ -1938,7 +1939,7 @@ void
_cpp_define_builtin (cpp_reader *pfile, const char *str)
{
size_t len = strlen (str);
- char *buf = alloca (len + 1);
+ char *buf = (char *) alloca (len + 1);
memcpy (buf, str, len);
buf[len] = '\n';
run_directive (pfile, T_DEFINE, buf, len);
@@ -1949,7 +1950,7 @@ void
cpp_undef (cpp_reader *pfile, const char *macro)
{
size_t len = strlen (macro);
- char *buf = alloca (len + 1);
+ char *buf = (char *) alloca (len + 1);
memcpy (buf, macro, len);
buf[len] = '\n';
run_directive (pfile, T_UNDEF, buf, len);
@@ -1978,7 +1979,7 @@ handle_assertion (cpp_reader *pfile, const char *str, int type)
/* Copy the entire option so we can modify it. Change the first
"=" in the string to a '(', and tack a ')' on the end. */
- char *buf = alloca (count + 2);
+ char *buf = (char *) alloca (count + 2);
memcpy (buf, str, count);
if (p)
@@ -2036,20 +2037,20 @@ cpp_buffer *
cpp_push_buffer (cpp_reader *pfile, const uchar *buffer, size_t len,
int from_stage3)
{
- cpp_buffer *new = XOBNEW (&pfile->buffer_ob, cpp_buffer);
+ cpp_buffer *new_buffer = XOBNEW (&pfile->buffer_ob, cpp_buffer);
/* Clears, amongst other things, if_stack and mi_cmacro. */
- memset (new, 0, sizeof (cpp_buffer));
+ memset (new_buffer, 0, sizeof (cpp_buffer));
- new->next_line = new->buf = buffer;
- new->rlimit = buffer + len;
- new->from_stage3 = from_stage3;
- new->prev = pfile->buffer;
- new->need_line = true;
+ new_buffer->next_line = new_buffer->buf = buffer;
+ new_buffer->rlimit = buffer + len;
+ new_buffer->from_stage3 = from_stage3;
+ new_buffer->prev = pfile->buffer;
+ new_buffer->need_line = true;
- pfile->buffer = new;
+ pfile->buffer = new_buffer;
- return new;
+ return new_buffer;
}
/* Pops a single buffer, with a file change call-back if appropriate.
diff --git a/libcpp/expr.c b/libcpp/expr.c
index 47689189b2b..73356a966a0 100644
--- a/libcpp/expr.c
+++ b/libcpp/expr.c
@@ -65,8 +65,8 @@ static unsigned int interpret_int_suffix (const uchar *, size_t);
static void check_promotion (cpp_reader *, const struct op *);
/* Token type abuse to create unary plus and minus operators. */
-#define CPP_UPLUS (CPP_LAST_CPP_OP + 1)
-#define CPP_UMINUS (CPP_LAST_CPP_OP + 2)
+#define CPP_UPLUS ((enum cpp_ttype) (CPP_LAST_CPP_OP + 1))
+#define CPP_UMINUS ((enum cpp_ttype) (CPP_LAST_CPP_OP + 2))
/* With -O2, gcc appears to produce nice code, moving the error
message load and subsequent jump completely out of the main path. */
@@ -627,7 +627,7 @@ extra semantics need to be handled with operator-specific code. */
/* Operator to priority map. Must be in the same order as the first
N entries of enum cpp_ttype. */
-static const struct operator
+static const struct cpp_operator
{
uchar prio;
uchar flags;
@@ -975,7 +975,7 @@ _cpp_expand_op_stack (cpp_reader *pfile)
size_t old_size = (size_t) (pfile->op_limit - pfile->op_stack);
size_t new_size = old_size * 2 + 20;
- pfile->op_stack = xrealloc (pfile->op_stack, new_size * sizeof (struct op));
+ pfile->op_stack = XRESIZEVEC (struct op, pfile->op_stack, new_size);
pfile->op_limit = pfile->op_stack + new_size;
return pfile->op_stack + old_size;
diff --git a/libcpp/files.c b/libcpp/files.c
index c0ce6d45227..6cab34f8b83 100644
--- a/libcpp/files.c
+++ b/libcpp/files.c
@@ -255,7 +255,7 @@ pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
flen = strlen (path);
len = flen + sizeof (extension);
- pchname = xmalloc (len);
+ pchname = XNEWVEC (char, len);
memcpy (pchname, path, flen);
memcpy (pchname + flen, extension, sizeof (extension));
@@ -279,7 +279,7 @@ pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
if (dlen + plen > len)
{
len += dlen + 64;
- pchname = xrealloc (pchname, len);
+ pchname = XRESIZEVEC (char, pchname, len);
}
memcpy (pchname + plen, d->d_name, dlen);
valid = validate_pch (pfile, file, pchname);
@@ -549,7 +549,7 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file)
the majority of C source files. */
size = 8 * 1024;
- buf = xmalloc (size + 1);
+ buf = XNEWVEC (uchar, size + 1);
total = 0;
while ((count = read (file->fd, buf + total, size - total)) > 0)
{
@@ -560,7 +560,7 @@ read_file_guts (cpp_reader *pfile, _cpp_file *file)
if (regular)
break;
size *= 2;
- buf = xrealloc (buf, size + 1);
+ buf = XRESIZEVEC (uchar, buf, size + 1);
}
}
@@ -815,7 +815,7 @@ dir_name_of_file (_cpp_file *file)
if (!file->dir_name)
{
size_t len = lbasename (file->path) - file->path;
- char *dir_name = xmalloc (len + 1);
+ char *dir_name = XNEWVEC (char, len + 1);
memcpy (dir_name, file->path, len);
dir_name[len] = '\0';
@@ -896,7 +896,7 @@ make_cpp_file (cpp_reader *pfile, cpp_dir *dir, const char *fname)
{
_cpp_file *file;
- file = xcalloc (1, sizeof (_cpp_file));
+ file = XCNEW (_cpp_file);
file->main_file = !pfile->buffer;
file->fd = -1;
file->dir = dir;
@@ -938,7 +938,7 @@ make_cpp_dir (cpp_reader *pfile, const char *dir_name, int sysp)
if (entry->start_dir == NULL)
return entry->u.dir;
- dir = xcalloc (1, sizeof (cpp_dir));
+ dir = XCNEW (cpp_dir);
dir->next = pfile->quote_include;
dir->name = (char *) dir_name;
dir->len = strlen (dir_name);
@@ -961,8 +961,8 @@ allocate_file_hash_entries (cpp_reader *pfile)
{
pfile->file_hash_entries_used = 0;
pfile->file_hash_entries_allocated = 127;
- pfile->file_hash_entries = xmalloc
- (pfile->file_hash_entries_allocated * sizeof (struct file_hash_entry));
+ pfile->file_hash_entries = XNEWVEC (struct file_hash_entry,
+ pfile->file_hash_entries_allocated);
}
/* Return a new file hash entry. */
@@ -983,8 +983,8 @@ cpp_included (cpp_reader *pfile, const char *fname)
{
struct file_hash_entry *entry;
- entry = htab_find_with_hash (pfile->file_hash, fname,
- htab_hash_string (fname));
+ entry = (struct file_hash_entry *)
+ htab_find_with_hash (pfile->file_hash, fname, htab_hash_string (fname));
while (entry && (entry->start_dir == NULL || entry->u.file->err_no))
entry = entry->next;
@@ -1204,7 +1204,7 @@ append_file_to_dir (const char *fname, cpp_dir *dir)
dlen = dir->len;
flen = strlen (fname);
- path = xmalloc (dlen + 1 + flen + 1);
+ path = XNEWVEC (char, dlen + 1 + flen + 1);
memcpy (path, dir->name, dlen);
if (dlen && path[dlen - 1] != '/')
path[dlen++] = '/';
@@ -1222,7 +1222,7 @@ read_filename_string (int ch, FILE *f)
int len;
len = 20;
- set = alloc = xmalloc (len + 1);
+ set = alloc = XNEWVEC (char, len + 1);
if (! is_space (ch))
{
*set++ = ch;
@@ -1231,7 +1231,7 @@ read_filename_string (int ch, FILE *f)
if (set - alloc == len)
{
len *= 2;
- alloc = xrealloc (alloc, len + 1);
+ alloc = XRESIZEVEC (char, alloc, len + 1);
set = alloc + len / 2;
}
*set++ = ch;
@@ -1252,14 +1252,14 @@ read_name_map (cpp_dir *dir)
size_t len, count = 0, room = 9;
len = dir->len;
- name = alloca (len + sizeof (FILE_NAME_MAP_FILE) + 1);
+ name = (char *) alloca (len + sizeof (FILE_NAME_MAP_FILE) + 1);
memcpy (name, dir->name, len);
if (len && name[len - 1] != '/')
name[len++] = '/';
strcpy (name + len, FILE_NAME_MAP_FILE);
f = fopen (name, "r");
- dir->name_map = xmalloc (room * sizeof (char *));
+ dir->name_map = XNEWVEC (const char *, room);
/* Silently return NULL if we cannot open. */
if (f)
@@ -1276,7 +1276,7 @@ read_name_map (cpp_dir *dir)
if (count + 2 > room)
{
room += 8;
- dir->name_map = xrealloc (dir->name_map, room * sizeof (char *));
+ dir->name_map = XRESIZEVEC (const char *, dir->name_map, room);
}
dir->name_map[count] = read_filename_string (ch, f);
@@ -1333,7 +1333,7 @@ remap_filename (cpp_reader *pfile, _cpp_file *file)
return NULL;
len = dir->len + (p - fname + 1);
- new_dir = xmalloc (len + 1);
+ new_dir = XNEWVEC (char, len + 1);
memcpy (new_dir, dir->name, dir->len);
memcpy (new_dir + dir->len, fname, p - fname + 1);
new_dir[len] = '\0';
@@ -1426,6 +1426,16 @@ cpp_get_prev (cpp_buffer *b)
that's OK. The code does rely on having entries with the same size
next to each other. */
+struct pchf_entry {
+ /* The size of this file. This is used to save running a MD5 checksum
+ if the sizes don't match. */
+ off_t size;
+ /* The MD5 checksum of this file. */
+ unsigned char sum[16];
+ /* Is this file to be included only once? */
+ bool once_only;
+};
+
struct pchf_data {
/* Number of pchf_entry structures. */
size_t count;
@@ -1435,15 +1445,7 @@ struct pchf_data {
the structure if we're processing a regular #include. */
bool have_once_only;
- struct pchf_entry {
- /* The size of this file. This is used to save running a MD5 checksum
- if the sizes don't match. */
- off_t size;
- /* The MD5 checksum of this file. */
- unsigned char sum[16];
- /* Is this file to be included only once? */
- bool once_only;
- } entries[1];
+ struct pchf_entry entries[1];
};
static struct pchf_data *pchf;
@@ -1471,7 +1473,7 @@ _cpp_save_file_entries (cpp_reader *pfile, FILE *fp)
result_size = (sizeof (struct pchf_data)
+ sizeof (struct pchf_entry) * (count - 1));
- result = xcalloc (result_size, 1);
+ result = XCNEWVAR (struct pchf_data, result_size);
result->count = 0;
result->have_once_only = false;
@@ -1534,7 +1536,7 @@ _cpp_read_file_entries (cpp_reader *pfile ATTRIBUTE_UNUSED, FILE *f)
!= 1)
return false;
- pchf = xmalloc (sizeof (struct pchf_data)
+ pchf = XNEWVAR (struct pchf_data, sizeof (struct pchf_data)
+ sizeof (struct pchf_entry) * (d.count - 1));
memcpy (pchf, &d, sizeof (struct pchf_data) - sizeof (struct pchf_entry));
if (fread (pchf->entries, sizeof (struct pchf_entry), d.count, f)
diff --git a/libcpp/identifiers.c b/libcpp/identifiers.c
index a6b35b4e57c..8ab3ce9c977 100644
--- a/libcpp/identifiers.c
+++ b/libcpp/identifiers.c
@@ -37,7 +37,7 @@ alloc_node (hash_table *table)
{
cpp_hashnode *node;
- node = obstack_alloc (&table->pfile->hash_ob, sizeof (cpp_hashnode));
+ node = XOBNEW (&table->pfile->hash_ob, cpp_hashnode);
memset (node, 0, sizeof (cpp_hashnode));
return node;
}
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index 321de40727e..3ec4c466436 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -569,6 +569,19 @@ enum {
/* The common part of an identifier node shared amongst all 3 C front
ends. Also used to store CPP identifiers, which are a superset of
identifiers in the grammatical sense. */
+
+union _cpp_hashnode_value GTY(())
+{
+ /* If a macro. */
+ cpp_macro * GTY((tag ("NTV_MACRO"))) macro;
+ /* Answers to an assertion. */
+ struct answer * GTY ((tag ("NTV_ANSWER"))) answers;
+ /* Code for a builtin macro. */
+ enum builtin_type GTY ((tag ("NTV_BUILTIN"))) builtin;
+ /* Macro argument index. */
+ unsigned short GTY ((tag ("NTV_ARGUMENT"))) arg_index;
+};
+
struct cpp_hashnode GTY(())
{
struct ht_identifier ident;
@@ -580,17 +593,7 @@ struct cpp_hashnode GTY(())
ENUM_BITFIELD(node_type) type : 8; /* CPP node type. */
unsigned char flags; /* CPP flags. */
- union _cpp_hashnode_value
- {
- /* If a macro. */
- cpp_macro * GTY((tag ("NTV_MACRO"))) macro;
- /* Answers to an assertion. */
- struct answer * GTY ((tag ("NTV_ANSWER"))) answers;
- /* Code for a builtin macro. */
- enum builtin_type GTY ((tag ("NTV_BUILTIN"))) builtin;
- /* Macro argument index. */
- unsigned short GTY ((tag ("NTV_ARGUMENT"))) arg_index;
- } GTY ((desc ("CPP_HASHNODE_VALUE_IDX (%1)"))) value;
+ union _cpp_hashnode_value GTY ((desc ("CPP_HASHNODE_VALUE_IDX (%1)"))) value;
};
/* Call this first to get a handle to pass to other functions.
diff --git a/libcpp/init.c b/libcpp/init.c
index 7ad5a73856a..56acd7ac24c 100644
--- a/libcpp/init.c
+++ b/libcpp/init.c
@@ -137,7 +137,7 @@ cpp_create_reader (enum c_lang lang, hash_table *table,
/* Initialize this instance of the library if it hasn't been already. */
init_library ();
- pfile = xcalloc (1, sizeof (cpp_reader));
+ pfile = XCNEW (cpp_reader);
cpp_set_lang (pfile, lang);
CPP_OPTION (pfile, warn_multichar) = 1;
@@ -357,7 +357,7 @@ cpp_init_builtins (cpp_reader *pfile, int hosted)
cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
hp->type = NT_MACRO;
hp->flags |= NODE_BUILTIN | NODE_WARN;
- hp->value.builtin = b->value;
+ hp->value.builtin = (enum builtin_type) b->value;
}
if (CPP_OPTION (pfile, cplusplus))
@@ -545,7 +545,7 @@ read_original_directory (cpp_reader *pfile)
if (pfile->cb.dir_change)
{
- char *debugdir = alloca (token->val.str.len - 3);
+ char *debugdir = (char *) alloca (token->val.str.len - 3);
memcpy (debugdir, (const char *) token->val.str.text + 1,
token->val.str.len - 4);
diff --git a/libcpp/lex.c b/libcpp/lex.c
index 58e559fd9fd..b38047e0879 100644
--- a/libcpp/lex.c
+++ b/libcpp/lex.c
@@ -85,8 +85,8 @@ add_line_note (cpp_buffer *buffer, const uchar *pos, unsigned int type)
if (buffer->notes_used == buffer->notes_cap)
{
buffer->notes_cap = buffer->notes_cap * 2 + 200;
- buffer->notes = xrealloc (buffer->notes,
- buffer->notes_cap * sizeof (_cpp_line_note));
+ buffer->notes = XRESIZEVEC (_cpp_line_note, buffer->notes,
+ buffer->notes_cap);
}
buffer->notes[buffer->notes_used].pos = pos;
@@ -439,7 +439,7 @@ warn_about_normalization (cpp_reader *pfile,
{
/* Make sure that the token is printed using UCNs, even
if we'd otherwise happily print UTF-8. */
- unsigned char *buf = xmalloc (cpp_token_len (token));
+ unsigned char *buf = XNEWVEC (unsigned char, cpp_token_len (token));
size_t sz;
sz = cpp_spell_token (pfile, token, buf, false) - buf;
@@ -970,7 +970,7 @@ _cpp_lex_direct (cpp_reader *pfile)
if (result->val.node->flags & NODE_OPERATOR)
{
result->flags |= NAMED_OP;
- result->type = result->val.node->directive_index;
+ result->type = (enum cpp_ttype) result->val.node->directive_index;
}
break;
@@ -1541,7 +1541,7 @@ new_buff (size_t len)
len = MIN_BUFF_SIZE;
len = CPP_ALIGN (len);
- base = xmalloc (len + sizeof (_cpp_buff));
+ base = XNEWVEC (unsigned char, len + sizeof (_cpp_buff));
result = (_cpp_buff *) (base + len);
result->base = base;
result->cur = base;
diff --git a/libcpp/line-map.c b/libcpp/line-map.c
index 1ace4c9585d..59a80ac92f8 100644
--- a/libcpp/line-map.c
+++ b/libcpp/line-map.c
@@ -97,7 +97,7 @@ linemap_add (struct line_maps *set, enum lc_reason reason,
if (set->used == set->allocated)
{
set->allocated = 2 * set->allocated + 256;
- set->maps = xrealloc (set->maps, set->allocated * sizeof (struct line_map));
+ set->maps = XRESIZEVEC (struct line_map, set->maps, set->allocated);
}
map = &set->maps[set->used];
diff --git a/libcpp/macro.c b/libcpp/macro.c
index daa2bd34a0e..05a87702aa6 100644
--- a/libcpp/macro.c
+++ b/libcpp/macro.c
@@ -273,7 +273,7 @@ builtin_macro (cpp_reader *pfile, cpp_hashnode *node)
buf = _cpp_builtin_macro_text (pfile, node);
len = ustrlen (buf);
- nbuf = alloca (len + 1);
+ nbuf = (char *) alloca (len + 1);
memcpy (nbuf, buf, len);
nbuf[len]='\n';
@@ -421,7 +421,7 @@ paste_tokens (cpp_reader *pfile, const cpp_token **plhs, const cpp_token *rhs)
lhs = *plhs;
len = cpp_token_len (lhs) + cpp_token_len (rhs) + 1;
- buf = alloca (len);
+ buf = (unsigned char *) alloca (len);
end = cpp_spell_token (pfile, lhs, buf, false);
/* Avoid comment headers, since they are still processed in stage 3.
@@ -1001,7 +1001,7 @@ expand_arg (cpp_reader *pfile, macro_arg *arg)
/* Loop, reading in the arguments. */
capacity = 256;
- arg->expanded = xmalloc (capacity * sizeof (cpp_token *));
+ arg->expanded = XNEWVEC (const cpp_token *, capacity);
push_ptoken_context (pfile, NULL, NULL, arg->first, arg->count + 1);
for (;;)
@@ -1011,8 +1011,8 @@ expand_arg (cpp_reader *pfile, macro_arg *arg)
if (arg->expanded_count + 1 >= capacity)
{
capacity *= 2;
- arg->expanded = xrealloc (arg->expanded,
- capacity * sizeof (cpp_token *));
+ arg->expanded = XRESIZEVEC (const cpp_token *, arg->expanded,
+ capacity);
}
token = cpp_get_token (pfile);
@@ -1272,7 +1272,8 @@ _cpp_save_parameter (cpp_reader *pfile, cpp_macro *macro, cpp_hashnode *node)
len = macro->paramc * sizeof (union _cpp_hashnode_value);
if (len > pfile->macro_buffer_len)
{
- pfile->macro_buffer = xrealloc (pfile->macro_buffer, len);
+ pfile->macro_buffer = XRESIZEVEC (unsigned char, pfile->macro_buffer,
+ len);
pfile->macro_buffer_len = len;
}
((union _cpp_hashnode_value *) pfile->macro_buffer)[macro->paramc - 1]
@@ -1419,8 +1420,9 @@ create_iso_definition (cpp_reader *pfile, cpp_macro *macro)
/* Success. Commit or allocate the parameter array. */
if (pfile->hash_table->alloc_subobject)
{
- cpp_hashnode **params = pfile->hash_table->alloc_subobject
- (sizeof (cpp_hashnode *) * macro->paramc);
+ cpp_hashnode **params =
+ (cpp_hashnode **) pfile->hash_table->alloc_subobject
+ (sizeof (cpp_hashnode *) * macro->paramc);
memcpy (params, macro->params,
sizeof (cpp_hashnode *) * macro->paramc);
macro->params = params;
@@ -1532,8 +1534,9 @@ create_iso_definition (cpp_reader *pfile, cpp_macro *macro)
/* Commit or allocate the memory. */
if (pfile->hash_table->alloc_subobject)
{
- cpp_token *tokns = pfile->hash_table->alloc_subobject (sizeof (cpp_token)
- * macro->count);
+ cpp_token *tokns =
+ (cpp_token *) pfile->hash_table->alloc_subobject (sizeof (cpp_token)
+ * macro->count);
memcpy (tokns, macro->exp.tokens, sizeof (cpp_token) * macro->count);
macro->exp.tokens = tokns;
}
@@ -1552,7 +1555,8 @@ _cpp_create_definition (cpp_reader *pfile, cpp_hashnode *node)
bool ok;
if (pfile->hash_table->alloc_subobject)
- macro = pfile->hash_table->alloc_subobject (sizeof (cpp_macro));
+ macro = (cpp_macro *) pfile->hash_table->alloc_subobject
+ (sizeof (cpp_macro));
else
macro = (cpp_macro *) _cpp_aligned_alloc (pfile, sizeof (cpp_macro));
macro->line = pfile->directive_line;
@@ -1722,7 +1726,8 @@ cpp_macro_definition (cpp_reader *pfile, const cpp_hashnode *node)
if (len > pfile->macro_buffer_len)
{
- pfile->macro_buffer = xrealloc (pfile->macro_buffer, len);
+ pfile->macro_buffer = XRESIZEVEC (unsigned char,
+ pfile->macro_buffer, len);
pfile->macro_buffer_len = len;
}
diff --git a/libcpp/makedepend.c b/libcpp/makedepend.c
index f28f9699828..7581c975515 100644
--- a/libcpp/makedepend.c
+++ b/libcpp/makedepend.c
@@ -47,7 +47,7 @@ static cpp_dir *cmd_line_searchpath;
static void
add_clm (const char *macro, bool is_undef)
{
- struct cmd_line_macro *clm = xmalloc (sizeof (struct cmd_line_macro));
+ struct cmd_line_macro *clm = XNEW (struct cmd_line_macro);
clm->next = cmd_line_macros;
clm->is_undef = is_undef;
clm->macro = macro;
@@ -57,7 +57,7 @@ add_clm (const char *macro, bool is_undef)
static void
add_dir (char *name, bool sysp)
{
- cpp_dir *dir = xmalloc (sizeof (cpp_dir));
+ cpp_dir *dir = XNEW (cpp_dir);
dir->next = cmd_line_searchpath;
dir->name = name;
dir->sysp = sysp;
diff --git a/libcpp/mkdeps.c b/libcpp/mkdeps.c
index 5ab88138001..9042316a1ea 100644
--- a/libcpp/mkdeps.c
+++ b/libcpp/mkdeps.c
@@ -83,7 +83,7 @@ munge (const char *filename)
}
/* Now we know how big to make the buffer. */
- buffer = xmalloc (len + 1);
+ buffer = XNEWVEC (char, len + 1);
for (p = filename, dst = buffer; *p; p++, dst++)
{
@@ -151,7 +151,7 @@ apply_vpath (struct deps *d, const char *t)
struct deps *
deps_init (void)
{
- return xcalloc (sizeof (struct deps), 1);
+ return XCNEW (struct deps);
}
void
@@ -192,8 +192,7 @@ deps_add_target (struct deps *d, const char *t, int quote)
if (d->ntargets == d->targets_size)
{
d->targets_size = d->targets_size * 2 + 4;
- d->targetv = xrealloc (d->targetv,
- d->targets_size * sizeof (const char *));
+ d->targetv = XRESIZEVEC (const char *, d->targetv, d->targets_size);
}
t = apply_vpath (d, t);
@@ -223,7 +222,8 @@ deps_add_default_target (struct deps *d, const char *tgt)
# define TARGET_OBJECT_SUFFIX ".o"
#endif
const char *start = lbasename (tgt);
- char *o = alloca (strlen (start) + strlen (TARGET_OBJECT_SUFFIX) + 1);
+ char *o = (char *) alloca (strlen (start)
+ + strlen (TARGET_OBJECT_SUFFIX) + 1);
char *suffix;
strcpy (o, start);
@@ -245,7 +245,7 @@ deps_add_dep (struct deps *d, const char *t)
if (d->ndeps == d->deps_size)
{
d->deps_size = d->deps_size * 2 + 8;
- d->depv = xrealloc (d->depv, d->deps_size * sizeof (const char *));
+ d->depv = XRESIZEVEC (const char *, d->depv, d->deps_size);
}
d->depv[d->ndeps++] = t;
}
@@ -261,7 +261,7 @@ deps_add_vpath (struct deps *d, const char *vpath)
{
for (p = elem; *p && *p != ':'; p++);
len = p - elem;
- copy = xmalloc (len + 1);
+ copy = XNEWVEC (char, len + 1);
memcpy (copy, elem, len);
copy[len] = '\0';
if (*p == ':')
@@ -270,9 +270,8 @@ deps_add_vpath (struct deps *d, const char *vpath)
if (d->nvpaths == d->vpaths_size)
{
d->vpaths_size = d->vpaths_size * 2 + 8;
- d->vpathv = xrealloc (d->vpathv,
- d->vpaths_size * sizeof (const char *));
- d->vpathlv = xrealloc (d->vpathlv, d->vpaths_size * sizeof (size_t));
+ d->vpathv = XRESIZEVEC (const char *, d->vpathv, d->vpaths_size);
+ d->vpathlv = XRESIZEVEC (size_t, d->vpathlv, d->vpaths_size);
}
d->vpathv[d->nvpaths] = copy;
d->vpathlv[d->nvpaths] = len;
@@ -382,7 +381,7 @@ deps_restore (struct deps *deps, FILE *fd, const char *self)
unsigned int i, count;
size_t num_to_read;
size_t buf_size = 512;
- char *buf = xmalloc (buf_size);
+ char *buf = XNEWVEC (char, buf_size);
/* Number of dependences. */
if (fread (&count, 1, sizeof (count), fd) != sizeof (count))
@@ -397,7 +396,7 @@ deps_restore (struct deps *deps, FILE *fd, const char *self)
if (buf_size < num_to_read + 1)
{
buf_size = num_to_read + 1 + 127;
- buf = xrealloc (buf, buf_size);
+ buf = XRESIZEVEC (char, buf, buf_size);
}
if (fread (buf, 1, num_to_read, fd) != num_to_read)
return -1;
diff --git a/libcpp/pch.c b/libcpp/pch.c
index 79900c30c36..28cafbc9199 100644
--- a/libcpp/pch.c
+++ b/libcpp/pch.c
@@ -137,11 +137,11 @@ save_idents (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *hn, void *ss_p)
struct cpp_string *sp;
unsigned char *text;
- sp = xmalloc (sizeof (struct cpp_string));
+ sp = XNEW (struct cpp_string);
*slot = sp;
sp->len = NODE_LEN (hn);
- sp->text = text = xmalloc (NODE_LEN (hn));
+ sp->text = text = XNEWVEC (unsigned char, NODE_LEN (hn));
memcpy (text, NODE_NAME (hn), NODE_LEN (hn));
}
}
@@ -193,7 +193,7 @@ int
cpp_save_state (cpp_reader *r, FILE *f)
{
/* Save the list of non-void identifiers for the dependency checking. */
- r->savedstate = xmalloc (sizeof (struct cpp_savedstate));
+ r->savedstate = XNEW (struct cpp_savedstate);
r->savedstate->definedhash = htab_create (100, cpp_string_hash,
cpp_string_eq, NULL);
cpp_forall_identifiers (r, save_idents, r->savedstate);
@@ -226,7 +226,7 @@ count_defs (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *hn, void *ss_p)
news.len = NODE_LEN (hn);
news.text = NODE_NAME (hn);
- slot = htab_find (ss->definedhash, &news);
+ slot = (void **) htab_find (ss->definedhash, &news);
if (slot == NULL)
{
ss->hashsize += NODE_LEN (hn) + 1;
@@ -265,7 +265,7 @@ write_defs (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *hn, void *ss_p)
news.len = NODE_LEN (hn);
news.text = NODE_NAME (hn);
- slot = htab_find (ss->definedhash, &news);
+ slot = (void **) htab_find (ss->definedhash, &news);
if (slot == NULL)
{
ss->defs[ss->n_defs] = hn;
@@ -310,13 +310,13 @@ cpp_write_pch_deps (cpp_reader *r, FILE *f)
ss->n_defs = 0;
cpp_forall_identifiers (r, count_defs, ss);
- ss->defs = xmalloc (ss->n_defs * sizeof (cpp_hashnode *));
+ ss->defs = XNEWVEC (cpp_hashnode *, ss->n_defs);
ss->n_defs = 0;
cpp_forall_identifiers (r, write_defs, ss);
/* Sort the list, copy it into a buffer, and write it out. */
qsort (ss->defs, ss->n_defs, sizeof (cpp_hashnode *), &comp_hashnodes);
- definedstrs = ss->definedstrs = xmalloc (ss->hashsize);
+ definedstrs = ss->definedstrs = XNEWVEC (unsigned char, ss->hashsize);
for (i = 0; i < ss->n_defs; ++i)
{
size_t len = NODE_LEN (ss->defs[i]);
@@ -390,7 +390,7 @@ collect_ht_nodes (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *hn,
if (nl->n_defs == nl->asize)
{
nl->asize *= 2;
- nl->defs = xrealloc (nl->defs, nl->asize * sizeof (cpp_hashnode *));
+ nl->defs = XRESIZEVEC (cpp_hashnode *, nl->defs, nl->asize);
}
nl->defs[nl->n_defs] = hn;
@@ -418,7 +418,7 @@ cpp_valid_state (cpp_reader *r, const char *name, int fd)
{
struct macrodef_struct m;
size_t namebufsz = 256;
- unsigned char *namebuf = xmalloc (namebufsz);
+ unsigned char *namebuf = XNEWVEC (unsigned char, namebufsz);
unsigned char *undeftab = NULL;
struct ht_node_list nl = { 0, 0, 0 };
unsigned char *first, *last;
@@ -450,7 +450,7 @@ cpp_valid_state (cpp_reader *r, const char *name, int fd)
{
free (namebuf);
namebufsz = m.definition_length + 256;
- namebuf = xmalloc (namebufsz);
+ namebuf = XNEWVEC (unsigned char, namebufsz);
}
if ((size_t)read (fd, namebuf, m.definition_length)
@@ -488,14 +488,14 @@ cpp_valid_state (cpp_reader *r, const char *name, int fd)
/* Read in the list of identifiers that must not be defined.
Check that they really aren't. */
- undeftab = xmalloc (m.definition_length);
+ undeftab = XNEWVEC (unsigned char, m.definition_length);
if ((size_t) read (fd, undeftab, m.definition_length) != m.definition_length)
goto error;
/* Collect identifiers from the current hash table. */
nl.n_defs = 0;
nl.asize = 10;
- nl.defs = xmalloc (nl.asize * sizeof (cpp_hashnode *));
+ nl.defs = XNEWVEC (cpp_hashnode *, nl.asize);
cpp_forall_identifiers (r, &collect_ht_nodes, &nl);
qsort (nl.defs, nl.n_defs, sizeof (cpp_hashnode *), &comp_hashnodes);
@@ -577,8 +577,7 @@ save_macros (cpp_reader *r, cpp_hashnode *h, void *data_p)
if (data->count == data->array_size)
{
data->array_size *= 2;
- data->defns = xrealloc (data->defns, (data->array_size
- * sizeof (uchar *)));
+ data->defns = XRESIZEVEC (uchar *, data->defns, (data->array_size));
}
switch (h->type)
@@ -592,7 +591,8 @@ save_macros (cpp_reader *r, cpp_hashnode *h, void *data_p)
const uchar * defn = cpp_macro_definition (r, h);
size_t defnlen = ustrlen (defn);
- data->defns[data->count] = xmemdup (defn, defnlen, defnlen + 2);
+ data->defns[data->count] = (uchar *) xmemdup (defn, defnlen,
+ defnlen + 2);
data->defns[data->count][defnlen] = '\n';
}
break;
@@ -611,10 +611,10 @@ save_macros (cpp_reader *r, cpp_hashnode *h, void *data_p)
void
cpp_prepare_state (cpp_reader *r, struct save_macro_data **data)
{
- struct save_macro_data *d = xmalloc (sizeof (struct save_macro_data));
+ struct save_macro_data *d = XNEW (struct save_macro_data);
d->array_size = 512;
- d->defns = xmalloc (d->array_size * sizeof (d->defns[0]));
+ d->defns = XNEWVEC (uchar *, d->array_size);
d->count = 0;
cpp_forall_identifiers (r, save_macros, d);
d->saved_pragmas = _cpp_save_pragma_names (r);
diff --git a/libcpp/po/ChangeLog b/libcpp/po/ChangeLog
index 6070427eaaf..6d0ddb359fe 100644
--- a/libcpp/po/ChangeLog
+++ b/libcpp/po/ChangeLog
@@ -1,3 +1,11 @@
+2005-06-14 Joseph S. Myers <joseph@codesourcery.com>
+
+ * fr.po, sv.po: Update.
+
+2005-06-07 Jakub Jelinek <jakub@redhat.com>
+
+ * cpplib.pot: Regenerate.
+
2005-05-05 Joseph S. Myers <joseph@codesourcery.com>
* nl.po: Update.
diff --git a/libcpp/po/cpplib.pot b/libcpp/po/cpplib.pot
index 4677ec07112..a46dacf531d 100644
--- a/libcpp/po/cpplib.pot
+++ b/libcpp/po/cpplib.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n"
-"POT-Creation-Date: 2005-02-25 23:28+0000\n"
+"POT-Creation-Date: 2005-06-07 23:27+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,337 +16,347 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: charset.c:655
+#: charset.c:654
#, c-format
msgid "conversion from %s to %s not supported by iconv"
msgstr ""
-#: charset.c:658
+#: charset.c:657
msgid "iconv_open"
msgstr ""
-#: charset.c:666
+#: charset.c:665
#, c-format
msgid "no iconv implementation, cannot convert from %s to %s"
msgstr ""
-#: charset.c:743
+#: charset.c:742
#, c-format
msgid "character 0x%lx is not in the basic source character set\n"
msgstr ""
-#: charset.c:760
-#: charset.c:1243
+#: charset.c:759 charset.c:1346
msgid "converting to execution character set"
msgstr ""
-#: charset.c:766
+#: charset.c:765
#, c-format
msgid "character 0x%lx is not unibyte in execution character set"
msgstr ""
-#: charset.c:865
+#: charset.c:889
+#, c-format
+msgid "Character %x might not be NFKC"
+msgstr ""
+
+#: charset.c:949
msgid "universal character names are only valid in C++ and C99"
msgstr ""
-#: charset.c:868
+#: charset.c:952
#, c-format
msgid "the meaning of '\\%c' is different in traditional C"
msgstr ""
-#: charset.c:894
+#: charset.c:961
+msgid "In _cpp_valid_ucn but not a UCN"
+msgstr ""
+
+#: charset.c:986
#, c-format
msgid "incomplete universal character name %.*s"
msgstr ""
-#: charset.c:906
+#: charset.c:998
#, c-format
msgid "%.*s is not a valid universal character"
msgstr ""
-#: charset.c:916
+#: charset.c:1008 lex.c:472
+msgid "'$' in identifier or number"
+msgstr ""
+
+#: charset.c:1018
#, c-format
msgid "universal character %.*s is not valid in an identifier"
msgstr ""
-#: charset.c:920
+#: charset.c:1022
#, c-format
msgid "universal character %.*s is not valid at the start of an identifier"
msgstr ""
-#: charset.c:953
+#: charset.c:1056 charset.c:1565
msgid "converting UCN to source character set"
msgstr ""
-#: charset.c:957
+#: charset.c:1060
msgid "converting UCN to execution character set"
msgstr ""
-#: charset.c:1029
+#: charset.c:1132
msgid "the meaning of '\\x' is different in traditional C"
msgstr ""
-#: charset.c:1046
+#: charset.c:1149
msgid "\\x used with no following hex digits"
msgstr ""
-#: charset.c:1053
+#: charset.c:1156
msgid "hex escape sequence out of range"
msgstr ""
-#: charset.c:1092
+#: charset.c:1195
msgid "octal escape sequence out of range"
msgstr ""
-#: charset.c:1160
+#: charset.c:1263
msgid "the meaning of '\\a' is different in traditional C"
msgstr ""
-#: charset.c:1167
+#: charset.c:1270
#, c-format
msgid "non-ISO-standard escape sequence, '\\%c'"
msgstr ""
-#: charset.c:1175
+#: charset.c:1278
#, c-format
msgid "unknown escape sequence '\\%c'"
msgstr ""
-#: charset.c:1178
+#: charset.c:1281
#, c-format
msgid "unknown escape sequence: '\\%03o'"
msgstr ""
-#: charset.c:1184
+#: charset.c:1287
msgid "converting escape sequence to execution character set"
msgstr ""
-#: charset.c:1306
-#: charset.c:1369
+#: charset.c:1409 charset.c:1472
msgid "character constant too long for its type"
msgstr ""
-#: charset.c:1309
+#: charset.c:1412
msgid "multi-character character constant"
msgstr ""
-#: charset.c:1401
+#: charset.c:1504
msgid "empty character constant"
msgstr ""
-#: charset.c:1450
+#: charset.c:1606
#, c-format
msgid "failure to convert %s to %s"
msgstr ""
-#: directives.c:216
+#: directives.c:219
#, c-format
msgid "extra tokens at end of #%s directive"
msgstr ""
-#: directives.c:303
+#: directives.c:306
#, c-format
msgid "#%s is a GCC extension"
msgstr ""
-#: directives.c:315
+#: directives.c:318
msgid "suggest not using #elif in traditional C"
msgstr ""
-#: directives.c:318
+#: directives.c:321
#, c-format
msgid "traditional C ignores #%s with the # indented"
msgstr ""
-#: directives.c:322
+#: directives.c:325
#, c-format
msgid "suggest hiding #%s from traditional C with an indented #"
msgstr ""
-#: directives.c:348
+#: directives.c:351
msgid "embedding a directive within macro arguments is not portable"
msgstr ""
-#: directives.c:368
+#: directives.c:371
msgid "style of line directive is a GCC extension"
msgstr ""
-#: directives.c:418
+#: directives.c:421
#, c-format
msgid "invalid preprocessing directive #%s"
msgstr ""
-#: directives.c:489
+#: directives.c:492
msgid "\"defined\" cannot be used as a macro name"
msgstr ""
-#: directives.c:495
+#: directives.c:498
#, c-format
msgid "\"%s\" cannot be used as a macro name as it is an operator in C++"
msgstr ""
-#: directives.c:498
+#: directives.c:501
#, c-format
msgid "no macro name given in #%s directive"
msgstr ""
-#: directives.c:501
+#: directives.c:504
msgid "macro names must be identifiers"
msgstr ""
-#: directives.c:542
+#: directives.c:545
#, c-format
msgid "undefining \"%s\""
msgstr ""
-#: directives.c:597
+#: directives.c:600
msgid "missing terminating > character"
msgstr ""
-#: directives.c:650
+#: directives.c:654
#, c-format
msgid "#%s expects \"FILENAME\" or <FILENAME>"
msgstr ""
-#: directives.c:673
+#: directives.c:677
#, c-format
msgid "empty filename in #%s"
msgstr ""
-#: directives.c:681
+#: directives.c:685
msgid "#include nested too deeply"
msgstr ""
-#: directives.c:719
+#: directives.c:723
msgid "#include_next in primary source file"
msgstr ""
-#: directives.c:745
+#: directives.c:749
#, c-format
msgid "invalid flag \"%s\" in line directive"
msgstr ""
-#: directives.c:792
+#: directives.c:801
#, c-format
msgid "\"%s\" after #line is not a positive integer"
msgstr ""
-#: directives.c:798
+#: directives.c:807
msgid "line number out of range"
msgstr ""
-#: directives.c:811
-#: directives.c:888
+#: directives.c:820 directives.c:897
#, c-format
msgid "\"%s\" is not a valid filename"
msgstr ""
-#: directives.c:848
+#: directives.c:857
#, c-format
msgid "\"%s\" after # is not a positive integer"
msgstr ""
-#: directives.c:950
-msgid "invalid #ident directive"
+#: directives.c:959
+#, c-format
+msgid "invalid #%s directive"
msgstr ""
-#: directives.c:1038
+#: directives.c:1048
#, c-format
msgid "registering \"%s\" as both a pragma and a pragma namespace"
msgstr ""
-#: directives.c:1041
+#: directives.c:1051
#, c-format
msgid "#pragma %s %s is already registered"
msgstr ""
-#: directives.c:1044
+#: directives.c:1054
#, c-format
msgid "#pragma %s is already registered"
msgstr ""
-#: directives.c:1244
+#: directives.c:1254
msgid "#pragma once in main file"
msgstr ""
-#: directives.c:1267
+#: directives.c:1277
msgid "invalid #pragma GCC poison directive"
msgstr ""
-#: directives.c:1276
+#: directives.c:1286
#, c-format
msgid "poisoning existing macro \"%s\""
msgstr ""
-#: directives.c:1297
+#: directives.c:1307
msgid "#pragma system_header ignored outside include file"
msgstr ""
-#: directives.c:1321
+#: directives.c:1331
#, c-format
msgid "cannot find source file %s"
msgstr ""
-#: directives.c:1325
+#: directives.c:1335
#, c-format
msgid "current file is older than %s"
msgstr ""
-#: directives.c:1439
+#: directives.c:1449
msgid "_Pragma takes a parenthesized string literal"
msgstr ""
-#: directives.c:1546
+#: directives.c:1550
msgid "#else without #if"
msgstr ""
-#: directives.c:1551
+#: directives.c:1555
msgid "#else after #else"
msgstr ""
-#: directives.c:1553
-#: directives.c:1586
+#: directives.c:1557 directives.c:1590
msgid "the conditional began here"
msgstr ""
-#: directives.c:1579
+#: directives.c:1583
msgid "#elif without #if"
msgstr ""
-#: directives.c:1584
+#: directives.c:1588
msgid "#elif after #else"
msgstr ""
-#: directives.c:1614
+#: directives.c:1618
msgid "#endif without #if"
msgstr ""
-#: directives.c:1691
+#: directives.c:1695
msgid "missing '(' after predicate"
msgstr ""
-#: directives.c:1706
+#: directives.c:1710
msgid "missing ')' to complete answer"
msgstr ""
-#: directives.c:1726
+#: directives.c:1730
msgid "predicate's answer is empty"
msgstr ""
-#: directives.c:1753
+#: directives.c:1757
msgid "assertion without predicate"
msgstr ""
-#: directives.c:1755
+#: directives.c:1759
msgid "predicate must be an identifier"
msgstr ""
-#: directives.c:1841
+#: directives.c:1845
#, c-format
msgid "\"%s\" re-asserted"
msgstr ""
-#: directives.c:2064
+#: directives.c:2069
#, c-format
msgid "unterminated #%s"
msgstr ""
@@ -398,8 +408,7 @@ msgstr ""
msgid "invalid suffix \"%.*s\" on floating constant"
msgstr ""
-#: expr.c:250
-#: expr.c:275
+#: expr.c:250 expr.c:275
#, c-format
msgid "traditional C rejects the \"%.*s\" suffix"
msgstr ""
@@ -455,8 +464,7 @@ msgstr ""
msgid "\"%s\" is not defined"
msgstr ""
-#: expr.c:716
-#: expr.c:745
+#: expr.c:716 expr.c:745
#, c-format
msgid "missing binary operator before token \"%s\""
msgstr ""
@@ -535,160 +543,165 @@ msgstr ""
msgid "division by zero in #if"
msgstr ""
-#: files.c:401
+#: files.c:402
msgid "NULL directory in find_file"
msgstr ""
-#: files.c:454
+#: files.c:455
msgid "one or more PCH files were found, but they were invalid"
msgstr ""
-#: files.c:457
+#: files.c:458
msgid "use -Winvalid-pch for more information"
msgstr ""
-#: files.c:522
+#: files.c:523
#, c-format
msgid "%s is a block device"
msgstr ""
-#: files.c:539
+#: files.c:540
#, c-format
msgid "%s is too large"
msgstr ""
-#: files.c:574
+#: files.c:575
#, c-format
msgid "%s is shorter than expected"
msgstr ""
-#: files.c:803
+#: files.c:804
#, c-format
msgid "no include path in which to search for %s"
msgstr ""
-#: files.c:1096
+#: files.c:1097
msgid "Multiple include guards may be useful for:\n"
msgstr ""
-#: init.c:393
+#: init.c:394
msgid "cppchar_t must be an unsigned type"
msgstr ""
-#: init.c:397
+#: init.c:398
#, c-format
msgid ""
"preprocessor arithmetic has maximum precision of %lu bits; target requires %"
"lu bits"
msgstr ""
-#: init.c:404
+#: init.c:405
msgid "CPP arithmetic must be at least as precise as a target int"
msgstr ""
-#: init.c:407
+#: init.c:408
msgid "target char is less than 8 bits wide"
msgstr ""
-#: init.c:411
+#: init.c:412
msgid "target wchar_t is narrower than target char"
msgstr ""
-#: init.c:415
+#: init.c:416
msgid "target int is narrower than target char"
msgstr ""
-#: init.c:420
+#: init.c:421
msgid "CPP half-integer narrower than CPP character"
msgstr ""
-#: init.c:424
+#: init.c:425
#, c-format
msgid ""
"CPP on this host cannot handle wide character constants over %lu bits, but "
"the target requires %lu bits"
msgstr ""
-#: lex.c:274
+#: lex.c:271
msgid "backslash and newline separated by space"
msgstr ""
-#: lex.c:279
+#: lex.c:276
msgid "backslash-newline at end of file"
msgstr ""
-#: lex.c:294
+#: lex.c:291
#, c-format
msgid "trigraph ??%c converted to %c"
msgstr ""
-#: lex.c:301
+#: lex.c:298
#, c-format
msgid "trigraph ??%c ignored, use -trigraphs to enable"
msgstr ""
-#: lex.c:347
+#: lex.c:344
msgid "\"/*\" within comment"
msgstr ""
-#: lex.c:405
+#: lex.c:402
#, c-format
msgid "%s in preprocessing directive"
msgstr ""
-#: lex.c:414
+#: lex.c:411
msgid "null character(s) ignored"
msgstr ""
-#: lex.c:449
-msgid "'$' in identifier or number"
+#: lex.c:448
+#, c-format
+msgid "`%.*s' is not in NFKC"
msgstr ""
-#: lex.c:510
+#: lex.c:451
+#, c-format
+msgid "`%.*s' is not in NFC"
+msgstr ""
+
+#: lex.c:539
#, c-format
msgid "attempt to use poisoned \"%s\""
msgstr ""
-#: lex.c:518
+#: lex.c:547
msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro"
msgstr ""
-#: lex.c:614
+#: lex.c:647
msgid "null character(s) preserved in literal"
msgstr ""
-#: lex.c:805
+#: lex.c:838
msgid "no newline at end of file"
msgstr ""
-#: lex.c:948
-#: traditional.c:162
+#: lex.c:990 traditional.c:162
msgid "unterminated comment"
msgstr ""
-#: lex.c:959
+#: lex.c:1001
msgid "C++ style comments are not allowed in ISO C90"
msgstr ""
-#: lex.c:961
+#: lex.c:1003
msgid "(this will be reported only once per input file)"
msgstr ""
-#: lex.c:966
+#: lex.c:1008
msgid "multi-line comment"
msgstr ""
-#: lex.c:1230
+#: lex.c:1331
#, c-format
msgid "unspellable token %s"
msgstr ""
-#: line-map.c:309
+#: line-map.c:313
#, c-format
msgid "In file included from %s:%u"
msgstr ""
-#: line-map.c:327
+#: line-map.c:331
#, c-format
msgid ""
",\n"
@@ -700,8 +713,7 @@ msgstr ""
msgid "macro \"%s\" is not used"
msgstr ""
-#: macro.c:124
-#: macro.c:287
+#: macro.c:124 macro.c:287
#, c-format
msgid "invalid built-in macro \"%s\""
msgstr ""
@@ -733,8 +745,7 @@ msgstr ""
msgid "macro \"%s\" passed %u arguments, but takes just %u"
msgstr ""
-#: macro.c:642
-#: traditional.c:675
+#: macro.c:642 traditional.c:675
#, c-format
msgid "unterminated argument list invoking macro \"%s\""
msgstr ""
@@ -749,65 +760,67 @@ msgstr ""
msgid "duplicate macro parameter \"%s\""
msgstr ""
-#: macro.c:1306
+#: macro.c:1307
#, c-format
msgid "\"%s\" may not appear in macro parameter list"
msgstr ""
-#: macro.c:1314
+#: macro.c:1315
msgid "macro parameters must be comma-separated"
msgstr ""
-#: macro.c:1331
+#: macro.c:1332
msgid "parameter name missing"
msgstr ""
-#: macro.c:1348
+#: macro.c:1349
msgid "anonymous variadic macros were introduced in C99"
msgstr ""
-#: macro.c:1353
+#: macro.c:1354
msgid "ISO C does not permit named variadic macros"
msgstr ""
-#: macro.c:1362
+#: macro.c:1363
msgid "missing ')' in macro parameter list"
msgstr ""
-#: macro.c:1434
-msgid "ISO C requires whitespace after the macro name"
+#: macro.c:1441
+msgid "ISO C99 requires whitespace after the macro name"
+msgstr ""
+
+#: macro.c:1465
+msgid "missing whitespace after the macro name"
msgstr ""
-#: macro.c:1462
+#: macro.c:1495
msgid "'#' is not followed by a macro parameter"
msgstr ""
-#: macro.c:1481
+#: macro.c:1514
msgid "'##' cannot appear at either end of a macro expansion"
msgstr ""
-#: macro.c:1577
+#: macro.c:1612
#, c-format
msgid "\"%s\" redefined"
msgstr ""
-#: macro.c:1582
+#: macro.c:1617
msgid "this is the location of the previous definition"
msgstr ""
-#: macro.c:1632
+#: macro.c:1667
#, c-format
msgid "macro argument \"%s\" would be stringified in traditional C"
msgstr ""
-#: macro.c:1655
+#: macro.c:1690
#, c-format
msgid "invalid hash type %d in cpp_macro_definition"
msgstr ""
-#: pch.c:84
-#: pch.c:332
-#: pch.c:354
+#: pch.c:84 pch.c:332 pch.c:354
#: pch.c:360
msgid "while writing precompiled header"
msgstr ""
@@ -827,8 +840,7 @@ msgstr ""
msgid "%s: not used because `%s' is defined"
msgstr ""
-#: pch.c:533
-#: pch.c:696
+#: pch.c:533 pch.c:696
msgid "while reading precompiled header"
msgstr ""
diff --git a/libcpp/po/fr.po b/libcpp/po/fr.po
index dc28fc5bc0d..2682d905a96 100644
--- a/libcpp/po/fr.po
+++ b/libcpp/po/fr.po
@@ -116,10 +116,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: GNU cpplib 4.0-b20041128\n"
+"Project-Id-Version: GNU cpplib 4.0.0\n"
"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n"
"POT-Creation-Date: 2005-04-20 21:43-0700\n"
-"PO-Revision-Date: 2004-12-02 20:00-0500\n"
+"PO-Revision-Date: 2005-06-12 08:00-0500\n"
"Last-Translator: Michel Robitaille <robitail@IRO.UMontreal.CA>\n"
"Language-Team: French <traduc@traduc.org>\n"
"MIME-Version: 1.0\n"
@@ -142,18 +142,18 @@ msgid "no iconv implementation, cannot convert from %s to %s"
msgstr "pas d'implantation iconv, ne peut convertir de %s vers %s"
#: charset.c:743
-#, fuzzy, c-format
+#, c-format
msgid "character 0x%lx is not in the basic source character set\n"
-msgstr "conversion UCN vers le jeu source de caractères"
+msgstr "caractère 0x%lx n'est pas dans le jeu de caractères de base\n"
#: charset.c:760 charset.c:1243
msgid "converting to execution character set"
msgstr "conversion vers un jeu d'exécution de caractères"
#: charset.c:766
-#, fuzzy, c-format
+#, c-format
msgid "character 0x%lx is not unibyte in execution character set"
-msgstr "conversion vers un jeu d'exécution de caractères"
+msgstr "caractère 0x%lx n'est pas unibyte dans le jeu de caractères d'exécution"
#: charset.c:865
msgid "universal character names are only valid in C++ and C99"
@@ -319,9 +319,9 @@ msgid "#%s expects \"FILENAME\" or <FILENAME>"
msgstr "#%s attend \"NOM_DE_FICHIER\" ou <NOM_DE_FICHIER>"
#: directives.c:673
-#, fuzzy, c-format
+#, c-format
msgid "empty filename in #%s"
-msgstr "modes incompatibles dans %s"
+msgstr "nom de fichier vide dans #%s"
#: directives.c:681
msgid "#include nested too deeply"
@@ -885,14 +885,12 @@ msgid "missing ')' in macro parameter list"
msgstr "« ) » manquante dans la liste des paramètres de macros"
#: macro.c:1439
-#, fuzzy
msgid "ISO C99 requires whitespace after the macro name"
-msgstr "ISO C requiert un blanc après le nom de la macro"
+msgstr "ISO C99 requiert un blanc après le nom de la macro"
#: macro.c:1463
-#, fuzzy
msgid "missing whitespace after the macro name"
-msgstr "ISO C requiert un blanc après le nom de la macro"
+msgstr "blanc d'espacement manquant après le nom de la macro"
#: macro.c:1493
msgid "'#' is not followed by a macro parameter"
diff --git a/libcpp/po/sv.po b/libcpp/po/sv.po
index 63ad49084bc..f781822a864 100644
--- a/libcpp/po/sv.po
+++ b/libcpp/po/sv.po
@@ -1,133 +1,110 @@
-# Swedish translation for the GNU CC.
-# Copyright (C) 2000 Free Software Foundation, Inc.
+# Swedish messages for cpplib.
+# Copyright © 2000, 2005 Free Software Foundation, Inc.
# Dennis Björklund <db@zigo.dhs.org>, 2000, 2001, 2002.
-#
-# Kom ihåg att i svenskan så använder vi "" för citat
-# och inte '' som det är i originaluttrycken.
-#
-# Jag har gjort en liten ordlista över uttryck som kan finnas i
-# översättningen
-#
-# http://www.zigo.dhs.org/~dennis/gcc/
-#
-# Denna lista är inte komplett men är det någon som vill hjälpa till
-# att översätta gcc och har åsikter om hur dessa uttryck skall skrivas
-# så ta kontakt så kan vi uppdatera den.
-#
-# Det mesta av övdersättningen som finns nu kommer från tiden
-# innan version 3.0 av gcc. Dessvärre så fungerade aldrig gcc
-# med översättningar korrekt då, så den kom inte till användning.
-# Jag har överfört de gamla strängarna till dagens version (3.2)
-# så det finns en början, men det är mycket kvar. Men vill någon hjälpa
-# till så vore det jättebra. Jag kommer översätta en bit då och då
-# i mån av tid, men det är en stor fil med komplicerade uttryck så
-# det tar en stund att bli klar.
+# Göran Uddeborg <goeran@uddeborg.se>, 2005.
+# $Revision: 1.2 $
#
msgid ""
msgstr ""
-"Project-Id-Version: gcc 3.2\n"
+"Project-Id-Version: cpplib 4.0.0\n"
"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n"
"POT-Creation-Date: 2005-04-20 21:43-0700\n"
-"PO-Revision-Date: 2002-08-26 12:58+0200\n"
-"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"PO-Revision-Date: 2005-06-08 19:51+0200\n"
+"Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
"Language-Team: Swedish <sv@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-1\n"
"Content-Transfer-Encoding: 8-bit\n"
#: charset.c:655
-#, fuzzy, c-format
+#, c-format
msgid "conversion from %s to %s not supported by iconv"
-msgstr "konveretering från NaN till unsigned int"
+msgstr "konveretering från %s till %s stöds inte av iconv"
#: charset.c:658
msgid "iconv_open"
-msgstr ""
+msgstr "iconv_open"
#: charset.c:666
#, c-format
msgid "no iconv implementation, cannot convert from %s to %s"
-msgstr ""
+msgstr "ingen iconv-implementation, kan inte konvertera från %s till %s"
#: charset.c:743
#, c-format
msgid "character 0x%lx is not in the basic source character set\n"
-msgstr ""
+msgstr "tecken 0x%lx finns inte i källkodens grundteckenuppsättning\n"
#: charset.c:760 charset.c:1243
msgid "converting to execution character set"
-msgstr ""
+msgstr "konverterar till teckenuppsättning för körning"
#: charset.c:766
#, c-format
msgid "character 0x%lx is not unibyte in execution character set"
-msgstr ""
+msgstr "tecken 0x%lx är inte en byte i teckenupsättning för körning"
#: charset.c:865
msgid "universal character names are only valid in C++ and C99"
-msgstr ""
+msgstr "universella teckennamn är endast giltiga i C++ och C99"
#: charset.c:868
-#, fuzzy, c-format
+#, c-format
msgid "the meaning of '\\%c' is different in traditional C"
-msgstr "semantiken för \"\\%c\" varierar med -traditional"
+msgstr "betydelsen av \"\\%c\" är annorlunda i traditionell C"
#: charset.c:894
#, c-format
msgid "incomplete universal character name %.*s"
-msgstr ""
+msgstr "ofullständigt unversellt teckennamn %.*s"
#: charset.c:906
-#, fuzzy, c-format
+#, c-format
msgid "%.*s is not a valid universal character"
-msgstr "\"%s\" är inte i början av deklarationen"
+msgstr "%.*s är inte ett giltigt universellt tecken"
#: charset.c:916
#, c-format
msgid "universal character %.*s is not valid in an identifier"
-msgstr ""
+msgstr "universellt tecken %.*s är inte giltigt i en identifierare"
#: charset.c:920
#, c-format
msgid "universal character %.*s is not valid at the start of an identifier"
-msgstr ""
+msgstr "universellt tecken %.*s är inte giltigt vid början av en identifierare"
#: charset.c:953
-#, fuzzy
msgid "converting UCN to source character set"
-msgstr "kan inte konvertera till en pekartyp"
+msgstr "vid konvertering av UCN källteckenuppsättning"
#: charset.c:957
-#, fuzzy
msgid "converting UCN to execution character set"
-msgstr "kan inte konvertera till en pekartyp"
+msgstr "vid konverting av UCN till teckenuppsättning för körning"
#: charset.c:1029
-#, fuzzy
msgid "the meaning of '\\x' is different in traditional C"
-msgstr "semantiken för \"\\x\" varierar med -traditional"
+msgstr "betydelsen av \"\\x\" är annorlunda i traditionell C"
#: charset.c:1046
msgid "\\x used with no following hex digits"
-msgstr ""
+msgstr "\\x använt utan några följande hexadecimala siffror"
#: charset.c:1053
msgid "hex escape sequence out of range"
-msgstr ""
+msgstr "hexadecimal specialsekvens utanför intervallet"
#: charset.c:1092
msgid "octal escape sequence out of range"
-msgstr ""
+msgstr "oktal specialsekvens utanför intervallet"
#: charset.c:1160
-#, fuzzy
msgid "the meaning of '\\a' is different in traditional C"
-msgstr "semantiken för \"\\a\" varierar med -traditional"
+msgstr "betydelsen av \"\\a\" är annorlunda i traditionell C"
#: charset.c:1167
#, c-format
msgid "non-ISO-standard escape sequence, '\\%c'"
-msgstr ""
+msgstr "icke-ISO-standardspecialsekvens, \"\\%c\""
#: charset.c:1175
#, c-format
@@ -135,19 +112,17 @@ msgid "unknown escape sequence '\\%c'"
msgstr "okänd escape-sekvens \"\\%c\""
#: charset.c:1178
-#, fuzzy, c-format
+#, c-format
msgid "unknown escape sequence: '\\%03o'"
-msgstr "okänd escape-sekvens \"\\%c\""
+msgstr "okänd specialsekvens: \"\\%03o\""
#: charset.c:1184
-#, fuzzy
msgid "converting escape sequence to execution character set"
-msgstr "escape-sekvens ryms ej i ett tecken"
+msgstr "vid konvertering av specialsekvens till teckenuppsättning för körning"
#: charset.c:1306 charset.c:1369
-#, fuzzy
msgid "character constant too long for its type"
-msgstr "teckenkonstant för lång"
+msgstr "teckenkonstant för lång för sin typ"
#: charset.c:1309
msgid "multi-character character constant"
@@ -158,14 +133,14 @@ msgid "empty character constant"
msgstr "tom teckenkonstant"
#: charset.c:1450
-#, fuzzy, c-format
+#, c-format
msgid "failure to convert %s to %s"
-msgstr "kunde inte öppna dump-fil \"%s\""
+msgstr "misslyckades att konvertera %s till %s"
#: directives.c:216
#, c-format
msgid "extra tokens at end of #%s directive"
-msgstr ""
+msgstr "extra symboler vid slutet av direktivet #%s"
#: directives.c:303
#, c-format
@@ -174,7 +149,7 @@ msgstr "#%s är en GCC-utvidgning"
#: directives.c:315
msgid "suggest not using #elif in traditional C"
-msgstr ""
+msgstr "föreslår att inte använda #elif i traditionell C"
#: directives.c:318
#, c-format
@@ -184,44 +159,43 @@ msgstr "traditionell C ignorerar #%s dör tecknet # är indenterat"
#: directives.c:322
#, c-format
msgid "suggest hiding #%s from traditional C with an indented #"
-msgstr ""
+msgstr "föreslår att dölja #%s från traditionell C med en indenterad #"
#: directives.c:348
msgid "embedding a directive within macro arguments is not portable"
-msgstr ""
+msgstr "att bädda in ett direktiv i makroargument är inte portabelt"
#: directives.c:368
-#, fuzzy
msgid "style of line directive is a GCC extension"
-msgstr "#%s är en GCC-utvidgning"
+msgstr "stil på raddirektiv är en GCC-utvidgning"
#: directives.c:418
#, c-format
msgid "invalid preprocessing directive #%s"
-msgstr ""
+msgstr "ogiltigt preprocessordirektiv #%s"
#: directives.c:489
msgid "\"defined\" cannot be used as a macro name"
-msgstr ""
+msgstr "\"defined\" kan inte användas som ett makronamn"
#: directives.c:495
#, c-format
msgid "\"%s\" cannot be used as a macro name as it is an operator in C++"
-msgstr ""
+msgstr "\"%s\" kan inte användas som ett makronamn eftersom det är en operator i C++"
#: directives.c:498
#, c-format
msgid "no macro name given in #%s directive"
-msgstr ""
+msgstr "inget makronamn angivet i direktivet #%s"
#: directives.c:501
msgid "macro names must be identifiers"
-msgstr ""
+msgstr "makronamn måste vara identifierare"
#: directives.c:542
#, c-format
msgid "undefining \"%s\""
-msgstr ""
+msgstr "avdefinierar \"%s\""
#: directives.c:597
msgid "missing terminating > character"
@@ -230,10 +204,10 @@ msgstr "saknar avslutande tecken >"
#: directives.c:650
#, c-format
msgid "#%s expects \"FILENAME\" or <FILENAME>"
-msgstr ""
+msgstr "#%s förväntar \"FILNAMN\" eller <FILNAMN>"
#: directives.c:673
-#, fuzzy, c-format
+#, c-format
msgid "empty filename in #%s"
msgstr "tomt filnamn i #%s"
@@ -243,7 +217,7 @@ msgstr "#include nästlad för djupt"
#: directives.c:719
msgid "#include_next in primary source file"
-msgstr ""
+msgstr "#include_next i primär källkodsfil"
#: directives.c:745
#, c-format
@@ -265,29 +239,28 @@ msgid "\"%s\" is not a valid filename"
msgstr "\"%s\" är inte ett giltigt filnamn"
#: directives.c:853
-#, fuzzy, c-format
+#, c-format
msgid "\"%s\" after # is not a positive integer"
-msgstr "\"%s\" efter #line är inte ett positivt heltal"
+msgstr "\"%s\" efter # är inte ett positivt heltal"
#: directives.c:955
-#, fuzzy
msgid "invalid #ident directive"
-msgstr "ogiltig #indent"
+msgstr "ogiltigt #ident-direktiv"
#: directives.c:1043
#, c-format
msgid "registering \"%s\" as both a pragma and a pragma namespace"
-msgstr ""
+msgstr "registrerar \"%s\" både som ett pragma och ett pragma namespace"
#: directives.c:1046
-#, fuzzy, c-format
+#, c-format
msgid "#pragma %s %s is already registered"
-msgstr "Klass \"%s\" finns redan"
+msgstr "#pragma %s %s är redan registrerat"
#: directives.c:1049
#, c-format
msgid "#pragma %s is already registered"
-msgstr ""
+msgstr "#pragma %s är redan registrerat"
#: directives.c:1249
msgid "#pragma once in main file"
@@ -304,10 +277,10 @@ msgstr "förgiftar existerande makro \"%s\""
#: directives.c:1302
msgid "#pragma system_header ignored outside include file"
-msgstr ""
+msgstr "#pragma system_header ignorerat utanför huvudfil"
#: directives.c:1326
-#, fuzzy, c-format
+#, c-format
msgid "cannot find source file %s"
msgstr "kan inte hitta källfil %s"
@@ -318,7 +291,7 @@ msgstr "aktuell fil är äldre än %s"
#: directives.c:1444
msgid "_Pragma takes a parenthesized string literal"
-msgstr ""
+msgstr "_Pragma tar en strängkonstant inom parenteser"
#: directives.c:1551
msgid "#else without #if"
@@ -358,7 +331,7 @@ msgstr "predikatets svar är tomt"
#: directives.c:1758
msgid "assertion without predicate"
-msgstr ""
+msgstr "försäkran utan predikat"
#: directives.c:1760
msgid "predicate must be an identifier"
@@ -367,12 +340,12 @@ msgstr "predikat måste vara en identifierare"
#: directives.c:1846
#, c-format
msgid "\"%s\" re-asserted"
-msgstr ""
+msgstr "\"%s\" omförsäkrat"
#: directives.c:2069
#, c-format
msgid "unterminated #%s"
-msgstr ""
+msgstr "oavslutad #%s"
#: errors.c:118
msgid "warning: "
@@ -383,14 +356,12 @@ msgid "internal error: "
msgstr "internt fel: "
#: errors.c:122
-#, fuzzy
msgid "error: "
-msgstr "internt fel: "
+msgstr "fel: "
#: errors.c:181
-#, fuzzy
msgid "stdout"
-msgstr "struct"
+msgstr "standard ut"
#: errors.c:183
#, c-format
@@ -398,61 +369,56 @@ msgid "%s: %s"
msgstr "%s: %s"
#: expr.c:192
-#, fuzzy
msgid "too many decimal points in number"
-msgstr "för många decimalpunker i flyttalskonstant"
+msgstr "för många decimalpunker i tal"
#: expr.c:212
-#, fuzzy, c-format
+#, c-format
msgid "invalid digit \"%c\" in octal constant"
-msgstr "ogiltigt suffix på heltalskonstant"
+msgstr "ogiltigt siffra \"%c\" i oktal konstant"
#: expr.c:218
-#, fuzzy
msgid "use of C99 hexadecimal floating constant"
-msgstr "för många decimalpunker i flyttalskonstant"
+msgstr "användning av hexadecimal flyttalskonstant enligt C99"
#: expr.c:227
-#, fuzzy
msgid "exponent has no digits"
-msgstr "numerisk kostant utan siffror"
+msgstr "exponenten har inga siffror"
#: expr.c:234
msgid "hexadecimal floating constants require an exponent"
-msgstr ""
+msgstr "hexadecimala flyttalskonstanter måste ha en exponent"
#: expr.c:240
-#, fuzzy, c-format
+#, c-format
msgid "invalid suffix \"%.*s\" on floating constant"
-msgstr "både suffix 'f' och 'l' på flyttalskonstant"
+msgstr "ogiltigt suffix \"%.*s\" på flyttalskonstant"
#: expr.c:250 expr.c:275
-#, fuzzy, c-format
+#, c-format
msgid "traditional C rejects the \"%.*s\" suffix"
-msgstr "traditionell C stödjer inte suffixet 'f'"
+msgstr "traditionell C tillåter inte suffixet \"%.*s\""
#: expr.c:261
-#, fuzzy, c-format
+#, c-format
msgid "invalid suffix \"%.*s\" on integer constant"
-msgstr "ogiltigt suffix på heltalskonstant"
+msgstr "ogiltig ändelse \"%.*s\" på heltalskonstant"
#: expr.c:283
-#, fuzzy
msgid "use of C99 long long integer constant"
-msgstr "ISO C89 förbjuder long long integer konstanter"
+msgstr "användning av long long heltalskonstant enligt C99"
#: expr.c:290
msgid "imaginary constants are a GCC extension"
-msgstr ""
+msgstr "imaginära konstanter är en GCC-utvidgning"
#: expr.c:376
-#, fuzzy
msgid "integer constant is too large for its type"
-msgstr "heltalskonstant är större än maximala värdet för sin typ"
+msgstr "heltalskonstant är för stor för sin typ"
#: expr.c:388
msgid "integer constant is so large that it is unsigned"
-msgstr ""
+msgstr "heltalskonstant är så stor att den är teckenlös"
#: expr.c:470
msgid "missing ')' after \"defined\""
@@ -460,26 +426,24 @@ msgstr "saknar ')' efter \"defined\""
#: expr.c:477
msgid "operator \"defined\" requires an identifier"
-msgstr ""
+msgstr "operatorn \"defined\" måste ha en identiferare"
#: expr.c:485
#, c-format
msgid "(\"%s\" is an alternative token for \"%s\" in C++)"
-msgstr ""
+msgstr "(\"%s\" är en alternativ symbol för \"%s\" i C++)"
#: expr.c:495
msgid "this use of \"defined\" may not be portable"
-msgstr ""
+msgstr "denna användning av \"defined\" är kanske inte portabel"
#: expr.c:534
-#, fuzzy
msgid "floating constant in preprocessor expression"
-msgstr "flyttalsspill i uttryck"
+msgstr "flyttalskonstant i preprocessoruttryck"
#: expr.c:540
-#, fuzzy
msgid "imaginary number in preprocessor expression"
-msgstr "ogiltig användning av void-uttryck"
+msgstr "imaginärt tal i preprocessoruttryck"
#: expr.c:585
#, c-format
@@ -487,77 +451,71 @@ msgid "\"%s\" is not defined"
msgstr "\"%s\" är inte definierad"
#: expr.c:716 expr.c:745
-#, fuzzy, c-format
+#, c-format
msgid "missing binary operator before token \"%s\""
-msgstr "saknar mellanrum efter nummer \"%.*s\""
+msgstr "saknad binär operator före symbolen \"%s\""
#: expr.c:736
-#, fuzzy, c-format
+#, c-format
msgid "token \"%s\" is not valid in preprocessor expressions"
-msgstr "\"%s\" är inte ett giltigt filnamn"
+msgstr "symbolen \"%s\" är inte ett giltigt preprocessoruttryck"
#: expr.c:753
-#, fuzzy
msgid "missing expression between '(' and ')'"
-msgstr "jämföreslse mellan signed och unsigned"
+msgstr "saknat uttryck mellan \"(\" och \")\""
#: expr.c:756
-#, fuzzy
msgid "#if with no expression"
-msgstr "#%s utan argument"
+msgstr "#if utan uttryck"
#: expr.c:759
#, c-format
msgid "operator '%s' has no right operand"
-msgstr ""
+msgstr "operatorn \"%s\" har ingen högra operand"
#: expr.c:764
-#, fuzzy, c-format
+#, c-format
msgid "operator '%s' has no left operand"
-msgstr "parameter \"%s\" har en inkomplett typ"
+msgstr "operatorn \"%s\" har ingen vänstra operand"
#: expr.c:790
-#, fuzzy
msgid " ':' without preceding '?'"
-msgstr "syntaxfel vid token \"%s\""
+msgstr "\":\" utan föregående \"?\""
#: expr.c:817
-#, fuzzy
msgid "unbalanced stack in #if"
-msgstr "obalanserad #endif"
+msgstr "obalanserad stack i #if"
#: expr.c:836
-#, fuzzy, c-format
+#, c-format
msgid "impossible operator '%u'"
-msgstr "saknar mellanrum efter nummer \"%.*s\""
+msgstr "omöjlig operator \"%u\""
#: expr.c:928
-#, fuzzy
msgid "missing ')' in expression"
-msgstr "heltalsspill i uttryck"
+msgstr "saknad \")\" i uttryck"
#: expr.c:949
msgid "'?' without following ':'"
-msgstr ""
+msgstr "\"?\" utan följande \":\""
#: expr.c:959
msgid "integer overflow in preprocessor expression"
-msgstr ""
+msgstr "heltalsspill i preprocessoruttryck"
#: expr.c:964
-#, fuzzy
msgid "missing '(' in expression"
-msgstr "heltalsspill i uttryck"
+msgstr "saknad \"(\" i uttryck"
#: expr.c:996
#, c-format
msgid "the left operand of \"%s\" changes sign when promoted"
-msgstr ""
+msgstr "vänsteroperanden till \"%s\" byter tecken vid befodran"
#: expr.c:1001
#, c-format
msgid "the right operand of \"%s\" changes sign when promoted"
-msgstr ""
+msgstr "högeroperanden till \"%s\" byter tecken vid befodran"
#: expr.c:1260
msgid "traditional C rejects the unary plus operator"
@@ -565,23 +523,23 @@ msgstr "traditionell C hanterar inte operatorn unärt plus"
#: expr.c:1359
msgid "comma operator in operand of #if"
-msgstr ""
+msgstr "kommaoperator i operand till #if"
#: expr.c:1491
msgid "division by zero in #if"
-msgstr ""
+msgstr "division med noll i #if"
#: files.c:401
msgid "NULL directory in find_file"
-msgstr ""
+msgstr "NOLL-katalog i find_file"
#: files.c:454
msgid "one or more PCH files were found, but they were invalid"
-msgstr ""
+msgstr "en eller flera PCH-filer hittades, men de var inte korrekta"
#: files.c:457
msgid "use -Winvalid-pch for more information"
-msgstr ""
+msgstr "använd -Winvalid-pch för mer information"
#: files.c:522
#, c-format
@@ -601,64 +559,63 @@ msgstr "%s är kortare än förväntat"
#: files.c:803
#, c-format
msgid "no include path in which to search for %s"
-msgstr ""
+msgstr "ingen huvudfilssökväg att leta efter %s i"
#: files.c:1096
msgid "Multiple include guards may be useful for:\n"
-msgstr ""
+msgstr "Multipla inkluderingsvakter kan vara användbart för:\n"
#: init.c:393
-#, fuzzy
msgid "cppchar_t must be an unsigned type"
-msgstr "predikat måste vara en identifierare"
+msgstr "cppchar_t måste vare en teckenlös typ"
#: init.c:397
#, c-format
msgid "preprocessor arithmetic has maximum precision of %lu bits; target requires %lu bits"
-msgstr ""
+msgstr "preprocessoraretmetik har en högsta precision på %lu bitar; målet kräver %lu bitar"
#: init.c:404
msgid "CPP arithmetic must be at least as precise as a target int"
-msgstr ""
+msgstr "CPP-aritmetik måste vara åtminstone så precis som målets int"
#: init.c:407
msgid "target char is less than 8 bits wide"
-msgstr ""
+msgstr "målets char är mindre än 8 bitar bred"
#: init.c:411
msgid "target wchar_t is narrower than target char"
-msgstr ""
+msgstr "målets wchar_t är smalare än målets char"
#: init.c:415
msgid "target int is narrower than target char"
-msgstr ""
+msgstr "målets int är smalare än målets char"
#: init.c:420
msgid "CPP half-integer narrower than CPP character"
-msgstr ""
+msgstr "CPP:s halva heltal är smalare än CPP:s tecken"
#: init.c:424
#, c-format
msgid "CPP on this host cannot handle wide character constants over %lu bits, but the target requires %lu bits"
-msgstr ""
+msgstr "CPP på denna värd kan inte hantera breda teckenkonstanter över %lu bitar, men målet kräver %lu bitar"
#: lex.c:274
msgid "backslash and newline separated by space"
-msgstr ""
+msgstr "bakåtstreck och nyrad skiljda av mellanrum"
#: lex.c:279
msgid "backslash-newline at end of file"
-msgstr ""
+msgstr "bakåtstreck-nyrad vid filslut"
#: lex.c:294
#, c-format
msgid "trigraph ??%c converted to %c"
-msgstr ""
+msgstr "trigraph ??%c konverterad till %c"
#: lex.c:301
#, c-format
msgid "trigraph ??%c ignored, use -trigraphs to enable"
-msgstr ""
+msgstr "trigraph ??%c ingorerad, använd -trigraphs för att aktivera"
#: lex.c:347
msgid "\"/*\" within comment"
@@ -671,11 +628,11 @@ msgstr "%s i preprocessordirektiv"
#: lex.c:414
msgid "null character(s) ignored"
-msgstr ""
+msgstr "nolltecken ignorerat"
#: lex.c:449
msgid "'$' in identifier or number"
-msgstr ""
+msgstr "\"$\" i identifierare eller tal"
#: lex.c:510
#, c-format
@@ -684,11 +641,11 @@ msgstr "försök att använda förgiftad \"%s\""
#: lex.c:518
msgid "__VA_ARGS__ can only appear in the expansion of a C99 variadic macro"
-msgstr ""
+msgstr "__VA_ARGS__ kan endast dyka upp i expansionen av ett C99-makro med variabelt argumentantal"
#: lex.c:614
msgid "null character(s) preserved in literal"
-msgstr ""
+msgstr "nolltecken bevarade i konstant"
#: lex.c:805
msgid "no newline at end of file"
@@ -699,22 +656,21 @@ msgid "unterminated comment"
msgstr "ej avslutad kommentar"
#: lex.c:959
-#, fuzzy
msgid "C++ style comments are not allowed in ISO C90"
-msgstr "C++ kommentarer tillåts inte av ISO C89"
+msgstr "C++ kommentarer tillåts inte i ISO C90"
#: lex.c:961
msgid "(this will be reported only once per input file)"
-msgstr ""
+msgstr "(detta rapporteras bara en gång per infil)"
#: lex.c:966
msgid "multi-line comment"
-msgstr ""
+msgstr "flerradskommentar"
#: lex.c:1230
-#, fuzzy, c-format
+#, c-format
msgid "unspellable token %s"
-msgstr "kan inte öppna fil \"%s\""
+msgstr "ostavbar symbol %s"
#: line-map.c:309
#, c-format
@@ -731,66 +687,65 @@ msgstr ""
" från %s:%u"
#: macro.c:85
-#, fuzzy, c-format
+#, c-format
msgid "macro \"%s\" is not used"
-msgstr "\"%s\" är inte definierad"
+msgstr "makrot \"%s\" är inte använt"
#: macro.c:124 macro.c:287
-#, fuzzy, c-format
+#, c-format
msgid "invalid built-in macro \"%s\""
-msgstr "förgiftar existerande makro \"%s\""
+msgstr "ogiltigt inbyggt makro \"%s\""
#: macro.c:221
-#, fuzzy
msgid "could not determine date and time"
-msgstr "Kunde inte öppna datafil %s.\n"
+msgstr "kunde inte bstämma datum och tid"
#: macro.c:400
msgid "invalid string literal, ignoring final '\\'"
-msgstr ""
+msgstr "ogiltig strängkonstant, inorerar avslutande \"\\\""
#: macro.c:483
#, c-format
msgid "pasting \"%s\" and \"%s\" does not give a valid preprocessing token"
-msgstr ""
+msgstr "att sätta ihop \"%s\" och \"%s\" ger inte en giltigt preprocessorsymbol"
#: macro.c:521
msgid "ISO C99 requires rest arguments to be used"
-msgstr ""
+msgstr "ISO C99 kräver att restargument används"
#: macro.c:526
#, c-format
msgid "macro \"%s\" requires %u arguments, but only %u given"
-msgstr ""
+msgstr "makrot \"%s\" kräver %u argument, men endast %u anges"
#: macro.c:531
#, c-format
msgid "macro \"%s\" passed %u arguments, but takes just %u"
-msgstr ""
+msgstr "makro \"%s\" skickade %u argument, men det tar bara %u"
#: macro.c:642 traditional.c:675
#, c-format
msgid "unterminated argument list invoking macro \"%s\""
-msgstr ""
+msgstr "oavslutad argumentlista vid anrop av makrot \"%s\""
#: macro.c:745
#, c-format
msgid "function-like macro \"%s\" must be used with arguments in traditional C"
-msgstr ""
+msgstr "funktionsliknande makrot \"%s\" måste användas med ett argument i traditionell C"
#: macro.c:1261
#, c-format
msgid "duplicate macro parameter \"%s\""
-msgstr ""
+msgstr "dubblerad makroparameter \"%s\""
#: macro.c:1306
#, c-format
msgid "\"%s\" may not appear in macro parameter list"
-msgstr ""
+msgstr "\"%s\" får inte förekomma i en makroparameterlista"
#: macro.c:1314
msgid "macro parameters must be comma-separated"
-msgstr ""
+msgstr "makroparametrar måste avdelas av komman"
#: macro.c:1331
msgid "parameter name missing"
@@ -798,32 +753,31 @@ msgstr "parameternamn saknas"
#: macro.c:1348
msgid "anonymous variadic macros were introduced in C99"
-msgstr ""
+msgstr "anonyma variabla makron introducerades i C99"
#: macro.c:1353
msgid "ISO C does not permit named variadic macros"
-msgstr ""
+msgstr "ISO C tillåter inte namngivna variabla makron"
#: macro.c:1362
msgid "missing ')' in macro parameter list"
-msgstr ""
+msgstr "saknad \")\" i makroparameterlista"
#: macro.c:1439
msgid "ISO C99 requires whitespace after the macro name"
-msgstr ""
+msgstr "ISO C99 kräver mellanrum efter makronamnet"
#: macro.c:1463
-#, fuzzy
msgid "missing whitespace after the macro name"
-msgstr "saknar mellanrum efter nummer \"%.*s\""
+msgstr "mellanrum saknas efter makronamn"
#: macro.c:1493
msgid "'#' is not followed by a macro parameter"
-msgstr ""
+msgstr "\"#\" följs inte av en makroparameter"
#: macro.c:1512
msgid "'##' cannot appear at either end of a macro expansion"
-msgstr ""
+msgstr "\"##\" kan inte förekomma vid någon av ändarna av makroexpansionen"
#: macro.c:1608
#, c-format
@@ -837,6564 +791,41 @@ msgstr "detta är platsen för den tidigare definitionen"
#: macro.c:1663
#, c-format
msgid "macro argument \"%s\" would be stringified in traditional C"
-msgstr ""
+msgstr "makroargumentet \"%s\" skulle bli gjort till sträng i traditionell C"
#: macro.c:1686
#, c-format
msgid "invalid hash type %d in cpp_macro_definition"
-msgstr ""
+msgstr "ogiltig hash-typ %d i cpp_macro_definition"
#: pch.c:84 pch.c:332 pch.c:354 pch.c:360
msgid "while writing precompiled header"
-msgstr ""
+msgstr "vid skrivning av förkompilerat huvud"
#: pch.c:467
-#, fuzzy, c-format
+#, c-format
msgid "%s: not used because `%.*s' not defined"
-msgstr "etikett \"%s\" använd men inte definierad"
+msgstr "%s: inte använd för att \"%.*s\" inte är definierad"
#: pch.c:479
#, c-format
msgid "%s: not used because `%.*s' defined as `%s' not `%.*s'"
-msgstr ""
+msgstr "%s: används inte för att \"%.*s\" definieras som \"%s\" inte \"%.*s\""
#: pch.c:520
-#, fuzzy, c-format
+#, c-format
msgid "%s: not used because `%s' is defined"
-msgstr "\"%s\" är använd men inte definierad"
+msgstr "%s: inte använd för att \"%s\" är definierad"
#: pch.c:533 pch.c:696
msgid "while reading precompiled header"
-msgstr ""
+msgstr "vid läsning av förkompilerat huvud"
#: traditional.c:745
#, c-format
msgid "detected recursion whilst expanding macro \"%s\""
-msgstr ""
+msgstr "upptäckte rekursion vid under expansion av makrot \"%s\""
#: traditional.c:912
-#, fuzzy
msgid "syntax error in macro parameter list"
-msgstr "parameternamn saknas i parameterlista"
-
-#~ msgid "`%s' attribute directive ignored"
-#~ msgstr "attributet \"%s\" ignorerat"
-
-#~ msgid "wrong number of arguments specified for `%s' attribute"
-#~ msgstr "fel antal argument angett för attributet `%s'"
-
-#~ msgid "`%s' attribute does not apply to types"
-#~ msgstr "attributet \"%s\" är inte applicerbart på typer"
-
-#~ msgid "`%s' attribute only applies to function types"
-#~ msgstr "attributet \"%s\" fungerar bara på funktionstyper"
-
-#~ msgid "`%s' attribute ignored"
-#~ msgstr "attributet `%s' ignorerat"
-
-#~ msgid "unknown machine mode `%s'"
-#~ msgstr "okänt maskinläge `%s'"
-
-#~ msgid "no data type for mode `%s'"
-#~ msgstr "ingen datatyp för läge `%s'"
-
-#~ msgid "section attribute cannot be specified for local variables"
-#~ msgstr "attributet \"section\" kan inte anges för lokala variabler"
-
-#~ msgid "section of `%s' conflicts with previous declaration"
-#~ msgstr "sektion \"%s\" står i konflikt med tidigare deklaration"
-
-#~ msgid "section attribute not allowed for `%s'"
-#~ msgstr "attributet \"section\" är inte tillåten för \"%s\""
-
-#~ msgid "section attributes are not supported for this target"
-#~ msgstr "attributet \"section\" stöds inte för denna målarkitektur"
-
-#~ msgid "requested alignment is not a constant"
-#~ msgstr "efterfrågad minnesjustering är inte konstant"
-
-#~ msgid "requested alignment is not a power of 2"
-#~ msgstr "efterrågad minnesjustering är inte en potens av 2"
-
-#~ msgid "requested alignment is too large"
-#~ msgstr "efterfrågad minnesjustering är för stor"
-
-#~ msgid "alignment may not be specified for `%s'"
-#~ msgstr "minnesjustering kan inte anges för \"%s\""
-
-#~ msgid "`%s' defined both normally and as an alias"
-#~ msgstr "\"%s\" är definierad både normalt och som ett alias"
-
-#~ msgid "alias arg not a string"
-#~ msgstr "aliasargumentet är inte en sträng"
-
-#~ msgid "`%s' attribute applies only to functions"
-#~ msgstr "attributet \"%s\" fungerar bara på funktioner"
-
-#~ msgid "can't set `%s' attribute after definition"
-#~ msgstr "kan inte sätta attributet \"%s\" efter definitionen"
-
-#~ msgid "`%s' attribute ignored for `%s'"
-#~ msgstr "attributet `%s' ignorerat för \"%s\""
-
-#~ msgid "invalid vector type for attribute `%s'"
-#~ msgstr "ogiltigt vektortype för attribut \"%s\""
-
-#~ msgid "offset outside bounds of constant string"
-#~ msgstr "index till en konstant sträng pekar utanför dess gränser"
-
-#~ msgid "second arg to `__builtin_prefetch' must be a constant"
-#~ msgstr "andra argumentet till \"__builtin_prefetch\" måste vara en konstant"
-
-#~ msgid "invalid second arg to __builtin_prefetch; using zero"
-#~ msgstr "ogiltigt andra argument till __builtin_prefetch; använder noll"
-
-#~ msgid "third arg to `__builtin_prefetch' must be a constant"
-#~ msgstr "tredje argumentet till \"__builtin_prefetch\" måste vara en konstant"
-
-#~ msgid "invalid third arg to __builtin_prefetch; using zero"
-#~ msgstr "ogiltigt tredje argument till __builtin_prefetch; använder noll"
-
-#~ msgid "__builtin_saveregs not supported by this target"
-#~ msgstr "__builtin_saveregs stöds inte på denna målarkitektur"
-
-#~ msgid "argument of `__builtin_args_info' must be constant"
-#~ msgstr "argumentet till \"__builtin_args_info\" måste vara konstant"
-
-#~ msgid "argument of `__builtin_args_info' out of range"
-#~ msgstr "argument till \"__builtin_args_info\" är utanför sitt intervall"
-
-#~ msgid "missing argument in `__builtin_args_info'"
-#~ msgstr "argument saknas till \"__builtin_args_info\""
-
-#~ msgid "`va_start' used in function with fixed args"
-#~ msgstr "\"va_start\" används i en funktion med fixt antal parametrar"
-
-#~ msgid "second parameter of `va_start' not last named argument"
-#~ msgstr "andra parametern till \"va_start\" var inte det sista namngivna argumentet"
-
-#~ msgid "`__builtin_next_arg' called without an argument"
-#~ msgstr "\"__builtin_next_arg\" anropad utan argument"
-
-#~ msgid "too many arguments to function `va_start'"
-#~ msgstr "För många argument till funktionen \"va_start\""
-
-#~ msgid "first argument to `va_arg' not of type `va_list'"
-#~ msgstr "första argumentet till \"va_arg\" är inte av typen \"va_list\""
-
-#~ msgid "`%s' is promoted to `%s' when passed through `...'"
-#~ msgstr "\"%s\" konverteras till \"%s\" när det skickas via \"...\""
-
-#~ msgid "(so you should pass `%s' not `%s' to `va_arg')"
-#~ msgstr "(alltså skall du skicka \"%s\" och inte \"%s\" till \"va_arg\")"
-
-#~ msgid "invalid arg to `__builtin_frame_address'"
-#~ msgstr "ogiltigt argument till \"__builtin_frame_address\""
-
-#~ msgid "invalid arg to `__builtin_return_address'"
-#~ msgstr "ogiltigt argument till \"__builtin_return_address\""
-
-#~ msgid "unsupported arg to `__builtin_frame_address'"
-#~ msgstr "Icke supportat argument till \"__builtin_frame_address\""
-
-#~ msgid "unsupported arg to `__builtin_return_address'"
-#~ msgstr "Icke supportat argument till \"__builtin_return_address\""
-
-#~ msgid "second arg to `__builtin_expect' must be a constant"
-#~ msgstr "andra argumentet till \"__builtin_expect\" måste vara en konstant"
-
-#~ msgid "__builtin_longjmp second argument must be 1"
-#~ msgstr "andra argumentet till __builtin_longjmp måste vara 1"
-
-#~ msgid "built-in function `%s' not currently supported"
-#~ msgstr "inbyggd funktion \"%s\" stöds inte för närvarande"
-
-#~ msgid "`%s' is not defined outside of function scope"
-#~ msgstr "\"%s\" är inte definierad utanför funktions-scope"
-
-#~ msgid "concatenation of string literals with __FUNCTION__ is deprecated"
-#~ msgstr "sammanslagning av strängliteraler tillsammans med __FUNCTION__ är föråldrat"
-
-#~ msgid "string length `%d' is greater than the length `%d' ISO C%d compilers are required to support"
-#~ msgstr "stränglängden \"%d\" är större än den minsta längden \"%d\" som ISO C%d kompilatorer behöver stödja"
-
-#~ msgid "overflow in constant expression"
-#~ msgstr "spill i konstant uttryck"
-
-#~ msgid "integer overflow in expression"
-#~ msgstr "heltalsspill i uttryck"
-
-#, fuzzy
-#~ msgid "vector overflow in expression"
-#~ msgstr "heltalsspill i uttryck"
-
-#~ msgid "large integer implicitly truncated to unsigned type"
-#~ msgstr "stort heltal implicit trunkerat till unsigned typ"
-
-#~ msgid "negative integer implicitly converted to unsigned type"
-#~ msgstr "negativt heltal implicit konverterat till unsigned typ"
-
-#~ msgid "overflow in implicit constant conversion"
-#~ msgstr "spill i implicit constant konvertering"
-
-#~ msgid "operation on `%s' may be undefined"
-#~ msgstr "operation på \"%s\" kan vara odefinierad"
-
-#~ msgid "expression statement has incomplete type"
-#~ msgstr "uttryckssats har inkomplett typ"
-
-#~ msgid "case label does not reduce to an integer constant"
-#~ msgstr "case-etikett reducerar inte till en heltalskonstant"
-
-#~ msgid "invalid truth-value expression"
-#~ msgstr "ogiltigt sanningsvärdeuttryck"
-
-#~ msgid "invalid operands to binary %s"
-#~ msgstr "ogiltiga operander till binär %s"
-
-#~ msgid "comparison is always false due to limited range of data type"
-#~ msgstr "jämförelsen är alltid falsk på grund av begränsat intervall för datatypen"
-
-#~ msgid "comparison is always true due to limited range of data type"
-#~ msgstr "jämförelsen är alltid sann på grund av begränsat intervall för datatypen"
-
-#~ msgid "comparison of unsigned expression >= 0 is always true"
-#~ msgstr "jämförelse med unsigned-uttryck >= 0 är alltid sant"
-
-#~ msgid "comparison of unsigned expression < 0 is always false"
-#~ msgstr "jämförelse med unsigned-uttryck < 0 är alltid falskt"
-
-#~ msgid "pointer of type `void *' used in arithmetic"
-#~ msgstr "pekare av typen \"void *\" använd med aritmetik"
-
-#~ msgid "pointer to a function used in arithmetic"
-#~ msgstr "pekare till funktion använd med aritmetik"
-
-#~ msgid "pointer to member function used in arithmetic"
-#~ msgstr "pekare till medlemsfunktion använd med aritmetik"
-
-#~ msgid "pointer to a member used in arithmetic"
-#~ msgstr "pekare till en medlemsfunktion använd med aritmetik"
-
-#~ msgid "struct type value used where scalar is required"
-#~ msgstr "struct-värde använt där skalär krävs"
-
-#~ msgid "union type value used where scalar is required"
-#~ msgstr "union-värde använt där skalär krävs"
-
-#~ msgid "array type value used where scalar is required"
-#~ msgstr "fält-värde använd där skalär krävs"
-
-#~ msgid "suggest parentheses around assignment used as truth value"
-#~ msgstr "föreslår parenteser runt tilldelning som används som sanningsvärde"
-
-#~ msgid "invalid use of `restrict'"
-#~ msgstr "ogiltigt användande av \"restrict\""
-
-#, fuzzy
-#~ msgid "cannot disable built-in function `%s'"
-#~ msgstr "döljer inbyggd funktion \"%s\""
-
-#~ msgid "too few arguments to function `%s'"
-#~ msgstr "för få argument till funktionen \"%s\""
-
-#~ msgid "too many arguments to function `%s'"
-#~ msgstr "för många argument till funktionen \"%s\""
-
-#~ msgid "pointers are not permitted as case values"
-#~ msgstr "pekare är inte tillåtna case-värden"
-
-#~ msgid "ISO C++ forbids range expressions in switch statements"
-#~ msgstr "ISO C++ förbjuder intervalluttryck i switch-satser"
-
-#~ msgid "ISO C forbids range expressions in switch statements"
-#~ msgstr "ISO C förbjuder intervalluttryck i switch-satser"
-
-#~ msgid "empty range specified"
-#~ msgstr "tomt intervall angivet"
-
-#~ msgid "duplicate (or overlapping) case value"
-#~ msgstr "dubbla (eller överlappand) case-värden"
-
-#~ msgid "this is the first entry overlapping that value"
-#~ msgstr "detta är det första fallet som överlappar det värdet"
-
-#~ msgid "duplicate case value"
-#~ msgstr "upprepat case-värde"
-
-#~ msgid "previously used here"
-#~ msgstr "tidigare använd här"
-
-#~ msgid "multiple default labels in one switch"
-#~ msgstr "flera default-etiketter i en switch"
-
-#~ msgid "this is the first default label"
-#~ msgstr "detta är den första default-etiketten"
-
-#, fuzzy
-#~ msgid "ISO C++ forbids taking the address of a label"
-#~ msgstr "ISO C++ förbjuder att man tar adressen till funktionen \"::main\""
-
-#, fuzzy
-#~ msgid "ISO C forbids taking the address of a label"
-#~ msgstr "ISO C++ förbjuder att man tar adressen till funktionen \"::main\""
-
-#~ msgid "-Wformat-y2k ignored without -Wformat"
-#~ msgstr "-Wformat-y2k ignorerad utan -Wformat"
-
-#~ msgid "-Wformat-extra-args ignored without -Wformat"
-#~ msgstr "-Wformat-extra-args ignorerad utan -Wformat"
-
-#~ msgid "-Wformat-nonliteral ignored without -Wformat"
-#~ msgstr "-Wformat-nonliteral ignorerad utan -Wformat"
-
-#~ msgid "-Wformat-security ignored without -Wformat"
-#~ msgstr "-Wformat-security ignorerad utan -Wformat"
-
-#~ msgid "-Wmissing-format-attribute ignored without -Wformat"
-#~ msgstr "-Wmissing-format-attribute ignorerad utan -Wformat"
-
-#~ msgid "declaration of `%s' shadows %s"
-#~ msgstr "deklaration av \"%s\" döljer %s"
-
-#~ msgid "void value not ignored as it ought to be"
-#~ msgstr "värdet av typen void ignoreras inte vilket bör göras"
-
-#~ msgid "conversion to non-scalar type requested"
-#~ msgstr "konvertering till icke-skalär typ begärd"
-
-#~ msgid "unknown C standard `%s'"
-#~ msgstr "okänd C-standard \"%s\""
-
-#~ msgid "array `%s' assumed to have one element"
-#~ msgstr "fält \"%s\" antas ha ett element"
-
-#~ msgid "`struct %s' incomplete in scope ending here"
-#~ msgstr "\"struct %s\" är inkomplett i scope-område som slutar här"
-
-#~ msgid "`union %s' incomplete in scope ending here"
-#~ msgstr "\"union %s\" är inkomplett i scope-område som slutar här"
-
-#~ msgid "`enum %s' incomplete in scope ending here"
-#~ msgstr "\"enum %s\" är inkomplett i scope-område som slutar här"
-
-#~ msgid "label `%s' defined but not used"
-#~ msgstr "etikett \"%s\" definierad men inte använd"
-
-#, fuzzy
-#~ msgid "function `%s' redeclared as inline"
-#~ msgstr "biblioteksfunktion \"%s\" deklarerad som icke-funktion"
-
-#, fuzzy
-#~ msgid "previous declaration of function `%s' with attribute noinline"
-#~ msgstr "implicit deklaration av funktion \"%s\""
-
-#, fuzzy
-#~ msgid "function `%s' redeclared with attribute noinline"
-#~ msgstr "funktionen \"%s\" deklarerades tidigare i ett block"
-
-#, fuzzy
-#~ msgid "previous declaration of function `%s' was inline"
-#~ msgstr "tidigare deklaration av \"%s\""
-
-#~ msgid "shadowing built-in function `%s'"
-#~ msgstr "döljer inbyggd funktion \"%s\""
-
-#~ msgid "shadowing library function `%s'"
-#~ msgstr "döljer biblioteksfunktion \"%s\""
-
-#~ msgid "library function `%s' declared as non-function"
-#~ msgstr "biblioteksfunktion \"%s\" deklarerad som icke-funktion"
-
-#~ msgid "built-in function `%s' declared as non-function"
-#~ msgstr "inbyggd funktion \"%s\" deklarerad som icke-funktion"
-
-#~ msgid "`%s' redeclared as different kind of symbol"
-#~ msgstr "\"%s\" omdeklarerad som en annan sorts symbol"
-
-#~ msgid "previous declaration of `%s'"
-#~ msgstr "tidigare deklaration av \"%s\""
-
-#~ msgid "conflicting types for built-in function `%s'"
-#~ msgstr "motstridiga typer på inbyggd funktion \"%s\""
-
-#~ msgid "conflicting types for `%s'"
-#~ msgstr "motstridiga typer på \"%s\""
-
-#, fuzzy
-#~ msgid "a parameter list with an ellipsis can't match an empty parameter name list declaration"
-#~ msgstr "En parameterlista med ellips kan inte matcha en tom namnlistdeklaration."
-
-#, fuzzy
-#~ msgid "an argument type that has a default promotion can't match an empty parameter name list declaration"
-#~ msgstr "En parameterlista med ellips kan inte matcha en tom namnlistdeklaration."
-
-#~ msgid "redefinition of `%s'"
-#~ msgstr "omdefiniering av \"%s\""
-
-#~ msgid "redeclaration of `%s'"
-#~ msgstr "omdeklaration av \"%s\""
-
-#~ msgid "conflicting declarations of `%s'"
-#~ msgstr "motstridande deklarationer av \"%s\""
-
-#~ msgid "prototype for `%s' follows"
-#~ msgstr "prototyp för \"%s\" följer"
-
-#~ msgid "non-prototype definition here"
-#~ msgstr "icke-prototypdefinition here"
-
-#~ msgid "prototype for `%s' follows and number of arguments doesn't match"
-#~ msgstr "prototyp för \"%s\" följer och antalet argument matchar inte"
-
-#~ msgid "prototype for `%s' follows and argument %d doesn't match"
-#~ msgstr "prototyp för `%s' följer och argument %d matchar inte"
-
-#~ msgid "`%s' declared inline after being called"
-#~ msgstr "\"%s\" är deklarerad inline efter att den blivit anropad"
-
-#~ msgid "`%s' declared inline after its definition"
-#~ msgstr "\"%s\" deklarerad inline efter sin definition"
-
-#~ msgid "static declaration for `%s' follows non-static"
-#~ msgstr "statisk deklaration av \"%s\" följer på icke-statisk"
-
-#~ msgid "non-static declaration for `%s' follows static"
-#~ msgstr "icke-statisk deklaration av \"%s\" följer på statisk"
-
-#~ msgid "const declaration for `%s' follows non-const"
-#~ msgstr "const-deklaration för \"%s\" följer på icke-const"
-
-#~ msgid "type qualifiers for `%s' conflict with previous decl"
-#~ msgstr "typkvalificerare för \"%s\" i konflikt med tidigare dekl"
-
-#~ msgid "redundant redeclaration of `%s' in same scope"
-#~ msgstr "redundant omdeklaration av \"%s\" i samma scope"
-
-#~ msgid "declaration of `%s' shadows a parameter"
-#~ msgstr "deklaration av \"%s\" döljer en parameter"
-
-#~ msgid "declaration of `%s' shadows a symbol from the parameter list"
-#~ msgstr "deklaration av \"%s\" döljer symbol från parameterlista"
-
-#, fuzzy
-#~ msgid "a parameter"
-#~ msgstr "oanvänd parameter \"%s\""
-
-#, fuzzy
-#~ msgid "a global declaration"
-#~ msgstr "dubbel deklaration av etikett \"%s\""
-
-#~ msgid "nested extern declaration of `%s'"
-#~ msgstr "nästlad extern deklaration av \"%s\""
-
-#~ msgid "`%s' used prior to declaration"
-#~ msgstr "\"%s\" är använd innan sin deklaration"
-
-#~ msgid "`%s' was declared implicitly `extern' and later `static'"
-#~ msgstr "\"%s\" deklarerades implicit \"extern\" och senare \"static\""
-
-#~ msgid "type mismatch with previous external decl"
-#~ msgstr "typ skiljer sig från tidigare extern deklaration"
-
-#~ msgid "previous external decl of `%s'"
-#~ msgstr "föregående externa dekl. av \"%s\""
-
-#~ msgid "type mismatch with previous implicit declaration"
-#~ msgstr "typ skiljer sig från tidigare implicit deklaration"
-
-#~ msgid "previous implicit declaration of `%s'"
-#~ msgstr "tidigare implicit deklaration av \"%s\""
-
-#~ msgid "type of external `%s' is not global"
-#~ msgstr "typen på extern \"%s\" är inte global"
-
-#~ msgid "`%s' was previously implicitly declared to return `int'"
-#~ msgstr "\"%s\" deklarerades tidigare implicit att returnera \"int\""
-
-#~ msgid "`%s' was declared `extern' and later `static'"
-#~ msgstr "\"%s\" deklarerades \"extern\" och senare \"static\""
-
-#~ msgid "extern declaration of `%s' doesn't match global one"
-#~ msgstr "extern deklaration av \"%s\" matchar inte den globala"
-
-#~ msgid "`%s' locally external but globally static"
-#~ msgstr "\"%s\" är lokalt extern men globalt static"
-
-#~ msgid "function `%s' was previously declared within a block"
-#~ msgstr "funktionen \"%s\" deklarerades tidigare i ett block"
-
-#~ msgid "implicit declaration of function `%s'"
-#~ msgstr "implicit deklaration av funktion \"%s\""
-
-#~ msgid "label %s referenced outside of any function"
-#~ msgstr "etikett %s är refererad till utanför en funktion"
-
-#~ msgid "duplicate label declaration `%s'"
-#~ msgstr "dubbel deklaration av etikett \"%s\""
-
-#~ msgid "this is a previous declaration"
-#~ msgstr "detta är en tidigare deklaration"
-
-#~ msgid "unnamed struct/union that defines no instances"
-#~ msgstr "odöpt struktur/union som inte har någon instans"
-
-#~ msgid "useless keyword or type name in empty declaration"
-#~ msgstr "oanvändbart nyckelord eller typnamn i tom deklaration"
-
-#~ msgid "two types specified in one empty declaration"
-#~ msgstr "två typer angivna i en tom deklaration"
-
-#~ msgid "empty declaration"
-#~ msgstr "tom deklaration"
-
-#, fuzzy
-#~ msgid "ISO C89 does not support `static' or type qualifiers in parameter array declarators"
-#~ msgstr "ISO C89 stöder inte flexibla fältmedlemmar"
-
-#, fuzzy
-#~ msgid "ISO C89 does not support `[*]' array declarators"
-#~ msgstr "ISO C89 stöder inte flexibla fältmedlemmar"
-
-#~ msgid "`%s' is usually a function"
-#~ msgstr "\"%s\" är vanligtvis en funktion"
-
-#~ msgid "typedef `%s' is initialized"
-#~ msgstr "typedef \"%s\" är initierad"
-
-#~ msgid "function `%s' is initialized like a variable"
-#~ msgstr "funktion \"%s\" är initierad som en variabel"
-
-#~ msgid "parameter `%s' is initialized"
-#~ msgstr "parameter \"%s\" är initierad"
-
-#~ msgid "variable-sized object may not be initialized"
-#~ msgstr "objekt med variabel storlek kan inte initieras"
-
-#~ msgid "variable `%s' has initializer but incomplete type"
-#~ msgstr "variabel \"%s\" har initierare men är av inkomplett typ"
-
-#~ msgid "elements of array `%s' have incomplete type"
-#~ msgstr "elementen i fält \"%s\" har en ofullständig typ"
-
-#~ msgid "declaration of `%s' has `extern' and is initialized"
-#~ msgstr "deklaration av \"%s\" är \"extern\" och initierad"
-
-#, fuzzy
-#~ msgid "inline function `%s' given attribute noinline"
-#~ msgstr "inbyggd funktion \"%s\" deklarerad som icke-funktion"
-
-#~ msgid "initializer fails to determine size of `%s'"
-#~ msgstr "initierare misslyckas med att bestämma storlek på \"%s\""
-
-#~ msgid "array size missing in `%s'"
-#~ msgstr "fältstorlek saknas i \"%s\""
-
-#~ msgid "zero or negative size array `%s'"
-#~ msgstr "noll eller negativ storlek på fält \"%s\""
-
-#~ msgid "storage size of `%s' isn't known"
-#~ msgstr "lagringsstorlek på \"%s\" är okänd"
-
-#~ msgid "storage size of `%s' isn't constant"
-#~ msgstr "lagringsstorlek på \"%s\" är inte konstant"
-
-#~ msgid "ignoring asm-specifier for non-static local variable `%s'"
-#~ msgstr "ignorerar asm för ickestatisk lokal variabel \"%s\""
-
-#, fuzzy
-#~ msgid "ISO C forbids parameter `%s' shadowing typedef"
-#~ msgstr "ANSI C förbjuder att parameter \"%s\" döljer typedef"
-
-#~ msgid "`long long long' is too long for GCC"
-#~ msgstr "\"long long long\" är för långt för GCC"
-
-#~ msgid "ISO C89 does not support `long long'"
-#~ msgstr "ISO C89 stödjer inte \"long long\"'"
-
-#~ msgid "duplicate `%s'"
-#~ msgstr "flera \"%s\""
-
-#~ msgid "two or more data types in declaration of `%s'"
-#~ msgstr "två eller fler datatyper i deklaration av \"%s\""
-
-#~ msgid "both long and short specified for `%s'"
-#~ msgstr "både long och short angivet för \"%s\""
-
-#~ msgid "long or short specified with char for `%s'"
-#~ msgstr "long eller short angiven med char för \"%s\""
-
-#~ msgid "long or short specified with floating type for `%s'"
-#~ msgstr "long eller short angiven med flyttalstyp för \"%s\""
-
-#~ msgid "the only valid combination is `long double'"
-#~ msgstr "den enda giltiga kombinationen är \"long double\""
-
-#~ msgid "both signed and unsigned specified for `%s'"
-#~ msgstr "både signed och unsigned specificerat för \"%s\""
-
-#~ msgid "long, short, signed or unsigned invalid for `%s'"
-#~ msgstr "long, short, signed eller unsigned ogiltig för \"%s\""
-
-#~ msgid "long, short, signed or unsigned used invalidly for `%s'"
-#~ msgstr "long, short, signed eller unsigned använd felaktigt på \"%s\""
-
-#~ msgid "complex invalid for `%s'"
-#~ msgstr "complex ogiltig för \"%s\""
-
-#~ msgid "ISO C89 does not support complex types"
-#~ msgstr "ISO C89 stöder inte typen complex"
-
-#~ msgid "ISO C does not support plain `complex' meaning `double complex'"
-#~ msgstr "ISO C stöder inte bara \"complex\" i meningen \"double complex\""
-
-#~ msgid "ISO C does not support complex integer types"
-#~ msgstr "ISO C stöder inte komplexa heltalstyper"
-
-#~ msgid "duplicate `const'"
-#~ msgstr "upprepning av \"const\""
-
-#~ msgid "duplicate `restrict'"
-#~ msgstr "upprepning av \"restrict\""
-
-#~ msgid "duplicate `volatile'"
-#~ msgstr "upprepning av \"volatile\""
-
-#~ msgid "multiple storage classes in declaration of `%s'"
-#~ msgstr "flera lagringsklasser i deklaration av \"%s\""
-
-#~ msgid "function definition declared `auto'"
-#~ msgstr "funktionsdefinition deklarerad som \"auto\""
-
-#~ msgid "function definition declared `register'"
-#~ msgstr "funktionsdefinition deklarerad som \"register\""
-
-#~ msgid "function definition declared `typedef'"
-#~ msgstr "funktionsdefinition deklarerad som \"typedef\""
-
-#~ msgid "storage class specified for structure field `%s'"
-#~ msgstr "lagringsklass angiven för strukturfält \"%s\""
-
-#~ msgid "storage class specified for parameter `%s'"
-#~ msgstr "lagringsklass angiven för parameter \"%s\""
-
-#~ msgid "storage class specified for typename"
-#~ msgstr "lagringsklass angiven för typnamn"
-
-#~ msgid "`%s' initialized and declared `extern'"
-#~ msgstr "`%s' initierad och deklarerad \"extern\""
-
-#~ msgid "`%s' has both `extern' and initializer"
-#~ msgstr "\"%s\" är både \"extern\" och initierare"
-
-#~ msgid "nested function `%s' declared `extern'"
-#~ msgstr "nästlad funktion \"%s\" är deklarerad \"extern\""
-
-#~ msgid "top-level declaration of `%s' specifies `auto'"
-#~ msgstr "toppnivådeklaration av \"%s\" anger \"auto\""
-
-#, fuzzy
-#~ msgid "static or type qualifiers in non-parameter array declarator"
-#~ msgstr "två typer angivna i en tom deklaration"
-
-#~ msgid "declaration of `%s' as array of voids"
-#~ msgstr "deklaration av \"%s\" som ett fält med void"
-
-#~ msgid "declaration of `%s' as array of functions"
-#~ msgstr "deklaration av \"%s\" som ett fält med funktioner"
-
-#~ msgid "size of array `%s' has non-integer type"
-#~ msgstr "storlek på fält \"%s\" är inte av heltalstyp"
-
-#~ msgid "ISO C forbids zero-size array `%s'"
-#~ msgstr "ISO C förbjuder fält \"%s\" med storlek noll"
-
-#~ msgid "size of array `%s' is negative"
-#~ msgstr "storlek på fält \"%s\" är negativt"
-
-#~ msgid "ISO C89 forbids array `%s' whose size can't be evaluated"
-#~ msgstr "ISO C89 förbjuder fält \"%s\" vars storlek inte kan beräknas"
-
-#~ msgid "ISO C89 forbids variable-size array `%s'"
-#~ msgstr "ISO C89 förbjuder fält \"%s\" med variabel storlek"
-
-#~ msgid "size of array `%s' is too large"
-#~ msgstr "fältet \"%s\" är för stort"
-
-#~ msgid "ISO C89 does not support flexible array members"
-#~ msgstr "ISO C89 stöder inte flexibla fältmedlemmar"
-
-#~ msgid "array type has incomplete element type"
-#~ msgstr "fälttyp har inkomplett elementtyp"
-
-#~ msgid "`%s' declared as function returning a function"
-#~ msgstr "\"%s\" är deklarerad som en funktion som returnerar en funktion"
-
-#~ msgid "`%s' declared as function returning an array"
-#~ msgstr "\"%s\" är deklarerad som en funktion som returnerar ett fält"
-
-#~ msgid "variable or field `%s' declared void"
-#~ msgstr "variabel eller fält \"%s\" deklarerad som void"
-
-#~ msgid "field `%s' declared as a function"
-#~ msgstr "fält \"%s\" deklarerad som en funktion"
-
-#~ msgid "field `%s' has incomplete type"
-#~ msgstr "fält \"%s\" har en inkomplett typ"
-
-#~ msgid "invalid storage class for function `%s'"
-#~ msgstr "ogiltig lagringsklass för funktion \"%s\""
-
-#~ msgid "`noreturn' function returns non-void value"
-#~ msgstr "\"noreturn\"-funktion returnerar ett icke-void värde"
-
-#~ msgid "cannot inline function `main'"
-#~ msgstr "kan inte inline:a funktion \"main\""
-
-#~ msgid "variable `%s' declared `inline'"
-#~ msgstr "variabel \"%s\" deklarerad \"inline\""
-
-#~ msgid "function declaration isn't a prototype"
-#~ msgstr "funktionsdeklaration är inte en prototyp"
-
-#~ msgid "parameter `%s' has incomplete type"
-#~ msgstr "parameter \"%s\" har en inkomplett typ"
-
-#~ msgid "parameter has incomplete type"
-#~ msgstr "parameter har en inkomplett typ"
-
-#~ msgid "parameter `%s' points to incomplete type"
-#~ msgstr "parameter \"%s\" pekar på inkomplett typ"
-
-#~ msgid "parameter points to incomplete type"
-#~ msgstr "parameter pekar på inkomplett typ"
-
-#~ msgid "`void' in parameter list must be the entire list"
-#~ msgstr "\"void\" i parameterlistan måste vara hela listan"
-
-#, fuzzy
-#~ msgid "`struct %s' declared inside parameter list"
-#~ msgstr "\"%s %s\" deklarerad inuti parameterlista"
-
-#~ msgid "`union %s' declared inside parameter list"
-#~ msgstr "\"union %s\" deklarerad inuti parameterlista"
-
-#~ msgid "`enum %s' declared inside parameter list"
-#~ msgstr "\"enum %s\" deklarerad inuti parameterlista"
-
-#~ msgid "anonymous struct declared inside parameter list"
-#~ msgstr "anonym struktur deklarerad i parameterlista"
-
-#~ msgid "anonymous union declared inside parameter list"
-#~ msgstr "anonym union deklarerad i parameterlista"
-
-#~ msgid "anonymous enum declared inside parameter list"
-#~ msgstr "anonym uppräkningstyp deklarerad i parameterlista"
-
-#~ msgid "its scope is only this definition or declaration, which is probably not what you want"
-#~ msgstr "dess scope-område är endast denna definition eller deklaration, vilket troligen inte är vad du vill."
-
-#~ msgid "redefinition of `union %s'"
-#~ msgstr "omdefiniering av \"union %s\""
-
-#~ msgid "redefinition of `struct %s'"
-#~ msgstr "omdefiniering av \"struct %s\""
-
-#~ msgid "union"
-#~ msgstr "union"
-
-#~ msgid "structure"
-#~ msgstr "struktur"
-
-#~ msgid "%s has no %s"
-#~ msgstr "%s har ingen %s"
-
-#~ msgid "named members"
-#~ msgstr "namngivna medlemmar"
-
-#~ msgid "members"
-#~ msgstr "medlemmar"
-
-#~ msgid "nested redefinition of `%s'"
-#~ msgstr "nästlad omdefinition av \"%s\""
-
-#~ msgid "bit-field `%s' has invalid type"
-#~ msgstr "bitfält \"%s\" har en icke godkänd typ"
-
-#~ msgid "bit-field `%s' type invalid in ISO C"
-#~ msgstr "bitfält \"%s\" har en icke godkänd typ enligt ISO C"
-
-#~ msgid "negative width in bit-field `%s'"
-#~ msgstr "negativ storlek i bitfält \"%s\""
-
-#~ msgid "width of `%s' exceeds its type"
-#~ msgstr "storleken på \"%s\" är större än sin typ"
-
-#~ msgid "zero width for bit-field `%s'"
-#~ msgstr "Storleken noll på bitfält \"%s\""
-
-#~ msgid "duplicate member `%s'"
-#~ msgstr "upprepning av medlem \"%s\""
-
-#~ msgid "redeclaration of `enum %s'"
-#~ msgstr "omdeklaration av \"enum %s\""
-
-#~ msgid "enumerator value for `%s' not integer constant"
-#~ msgstr "uppräkningsvärde för \"%s\" är inte en heltalskonstant"
-
-#~ msgid "overflow in enumeration values"
-#~ msgstr "överspill i uppräkningsvärden"
-
-#~ msgid "ISO C restricts enumerator values to range of `int'"
-#~ msgstr "ISO C begränsar enumreringsvärden till intervallet av en \"int\""
-
-#~ msgid "return type is an incomplete type"
-#~ msgstr "returtypen är en inkomplett typ"
-
-#~ msgid "return type defaults to `int'"
-#~ msgstr "returtyp sätts till \"int\""
-
-#~ msgid "no previous prototype for `%s'"
-#~ msgstr "ingen tidigare prototyp för `%s'"
-
-#~ msgid "`%s' was used with no prototype before its definition"
-#~ msgstr "\"%s\" användes utan någon prototyp innan sin definition"
-
-#~ msgid "no previous declaration for `%s'"
-#~ msgstr "ingen tidigare deklaration av \"%s\""
-
-#~ msgid "`%s' was used with no declaration before its definition"
-#~ msgstr "\"%s\" användes utan någon deklaration innan sin definition"
-
-#~ msgid "return type of `%s' is not `int'"
-#~ msgstr "returtypen på \"%s\" är inte \"int\""
-
-#~ msgid "first argument of `%s' should be `int'"
-#~ msgstr "första argumentet till \"%s\" skall vara \"int\""
-
-#~ msgid "second argument of `%s' should be `char **'"
-#~ msgstr "andra argumentet till \"%s\" skall vara \"char **\""
-
-#~ msgid "third argument of `%s' should probably be `char **'"
-#~ msgstr "tredje argumentet till \"%s2 skall troligen vara \"char **\""
-
-#~ msgid "`%s' takes only zero or two arguments"
-#~ msgstr "\"%s\" tar bara noll eller två argument"
-
-#~ msgid "`%s' is normally a non-static function"
-#~ msgstr "\"%s\" är normalt en icke-statisk function"
-
-#~ msgid "parameter name omitted"
-#~ msgstr "parameternamn utlämnat"
-
-#~ msgid "parameter `%s' declared void"
-#~ msgstr "parameter \"%s\" deklarerad som void"
-
-#~ msgid "multiple parameters named `%s'"
-#~ msgstr "flera parametrar med namn \"%s\""
-
-#~ msgid "type of `%s' defaults to `int'"
-#~ msgstr "typen på \"%s\" sätts till \"int\""
-
-#~ msgid "declaration for parameter `%s' but no such parameter"
-#~ msgstr "deklaration av parameter \"%s\" med det finns ingen sådan parameter"
-
-#~ msgid "number of arguments doesn't match prototype"
-#~ msgstr "antalet argument matchar inte prototypen"
-
-#~ msgid "argument `%s' doesn't match prototype"
-#~ msgstr "argument \"%s\" matchar inte prototypen"
-
-#~ msgid "no return statement in function returning non-void"
-#~ msgstr "ingen return i funktion som returnerar icke-void"
-
-#~ msgid "this function may return with or without a value"
-#~ msgstr "denna funktion kan returnera med eller utan ett värde"
-
-#~ msgid "size of return value of `%s' is %u bytes"
-#~ msgstr "storleken på returvärdet från \"%s\" är %u bytes"
-
-#~ msgid "size of return value of `%s' is larger than %d bytes"
-#~ msgstr "storleken på returvärdet från \"%s\" är större än %d bytes"
-
-#~ msgid "`struct %s' declared in `for' loop initial declaration"
-#~ msgstr "\"struct %s\" är deklarerad i en for-loops init-deklaration"
-
-#~ msgid "`union %s' declared in `for' loop initial declaration"
-#~ msgstr "\"union %s\" är deklarerad i en for-loops init-deklaration"
-
-#~ msgid "`enum %s' declared in `for' loop initial declaration"
-#~ msgstr "\"enum %s\" är deklarerad i en for-loops init-deklaration"
-
-#~ msgid "format string arg not a string type"
-#~ msgstr "argument för formatsträng är inte av strängtyp"
-
-#~ msgid "args to be formatted is not '...'"
-#~ msgstr "argumenten som skall formateras är inte \"...\""
-
-#~ msgid "format string has invalid operand number"
-#~ msgstr "formatsträng har ett ogiltigt antal operander"
-
-#~ msgid "unrecognized format specifier"
-#~ msgstr "oigenkänd formatangivelse"
-
-#~ msgid "`%s' is an unrecognized format function type"
-#~ msgstr "\"%s\" är ett ej känt funktionsformat"
-
-#~ msgid "format string arg follows the args to be formatted"
-#~ msgstr "formatsträngen kommer efter argumenten som skall formateras"
-
-#~ msgid "function might be possible candidate for `%s' format attribute"
-#~ msgstr "funktionen är en möjlig kandidat för formatattributet \"%s\""
-
-#~ msgid "missing $ operand number in format"
-#~ msgstr "saknar numerisk $-operand i formatsträng"
-
-#~ msgid "too many arguments for format"
-#~ msgstr "för många argument för för formatsträng"
-
-#~ msgid "zero-length format string"
-#~ msgstr "formatsträng med längden noll"
-
-#~ msgid "unterminated format string"
-#~ msgstr "icke terminerad formatsträng"
-
-#~ msgid "null format string"
-#~ msgstr "formatsträngen är null"
-
-#~ msgid "too few arguments for format"
-#~ msgstr "för få argument enligt formatsträngen"
-
-#~ msgid "zero width in %s format"
-#~ msgstr "nollstorlek i %s formatsträng"
-
-# fixme: ordet locale borde standardiseras
-#~ msgid "`%%%c' yields only last 2 digits of year in some locales"
-#~ msgstr "\"%%%c\" ger bara de sista två siffrorna i året i vissa landsinställningar"
-
-#~ msgid "`%%%c' yields only last 2 digits of year"
-#~ msgstr "\"%%%c\" ger bara de sista två siffrorna i året"
-
-#~ msgid "ignoring #pragma %s %s"
-#~ msgstr "ignorerar #pragma %s %s"
-
-#~ msgid "both 'f' and 'l' suffixes on floating constant"
-#~ msgstr "både suffix 'f' och 'l' på flyttalskonstant"
-
-#~ msgid "floating point number exceeds range of '%s'"
-#~ msgstr "flyttal utanför intervallet för \"%s\""
-
-#~ msgid "decimal point in exponent - impossible!"
-#~ msgstr "decimalpunkt i exponent - omöjligt!"
-
-#~ msgid "underscore in number"
-#~ msgstr "understrykningsstreck i nummer"
-
-#~ msgid "numeric constant contains digits beyond the radix"
-#~ msgstr "numerisk konstant har siffror som är utanför giltigt talbas"
-
-#~ msgid "floating constant may not be in radix 16"
-#~ msgstr "flyttalskonstanter kan inte vara i bas 16"
-
-#~ msgid "more than one 'f' suffix on floating constant"
-#~ msgstr "mer än ett \"f\"-suffix på flyttalskonstant"
-
-#~ msgid "more than one 'l' suffix on floating constant"
-#~ msgstr "mer än ett \"l\"-suffix på flyttalskonstant"
-
-#~ msgid "traditional C rejects the 'l' suffix"
-#~ msgstr "traditionell C stödjer inte suffixet 'l'"
-
-#~ msgid "more than one 'i' or 'j' suffix on floating constant"
-#~ msgstr "mer än ett \"i\"- eller \"j\"-suffix på flyttalskonstant"
-
-#~ msgid "ISO C forbids imaginary numeric constants"
-#~ msgstr "ISO C förbjuder imaginära numeriska konstanter"
-
-#~ msgid "floating constant out of range"
-#~ msgstr "flyttalskonstant utanför sitt intervall"
-
-#~ msgid "floating point number exceeds range of 'double'"
-#~ msgstr "flyttalsnummer överskrider intervallet för en \"double\""
-
-#~ msgid "two 'u' suffixes on integer constant"
-#~ msgstr "två \"u\"-suffix på heltalskonstant"
-
-#~ msgid "traditional C rejects the 'u' suffix"
-#~ msgstr "traditionell C stödjer inte suffixet 'u'"
-
-#~ msgid "three 'l' suffixes on integer constant"
-#~ msgstr "tre \"l\"-suffix på heltalskonstant"
-
-#~ msgid "'lul' is not a valid integer suffix"
-#~ msgstr "\"lul\" är inte ett giltigt heltalssuffix"
-
-#~ msgid "'Ll' and 'lL' are not valid integer suffixes"
-#~ msgstr "\"Ll\" och \"lL\" är inte giltiga heltalssuffix"
-
-#~ msgid "more than one 'i' or 'j' suffix on integer constant"
-#~ msgstr "mer än ett \"i\"- eller \"j\"-suffix på heltalskonstant"
-
-#~ msgid "integer constant is too large for this configuration of the compiler - truncated to %d bits"
-#~ msgstr "heltalskonstant för stor för denna konfigurering av kompilatorn - kortar ner till %d bitar"
-
-#~ msgid "width of integer constant changes with -traditional"
-#~ msgstr "storleken på en heltalskonstant ändras beroende på -traditional"
-
-#~ msgid "integer constant is unsigned in ISO C, signed with -traditional"
-#~ msgstr "heltalskonstanter är utan tecken i ISO C, med tecken med -traditional"
-
-#~ msgid "width of integer constant may change on other systems with -traditional"
-#~ msgstr "storleken på en heltalskonstant kan ändras på andra system beroende på -traditional"
-
-#~ msgid "integer constant larger than the maximum value of %s"
-#~ msgstr "heltalskonstant är större än maximala värdet på %s"
-
-#~ msgid "an unsigned long long int"
-#~ msgstr "en unsigned long long int"
-
-#~ msgid "a long long int"
-#~ msgstr "en long long int"
-
-#~ msgid "an unsigned long int"
-#~ msgstr "en unsigned long int"
-
-#~ msgid "decimal constant is so large that it is unsigned"
-#~ msgstr "decimal konstant så stor att den är unsigned"
-
-#~ msgid "ignoring invalid multibyte character"
-#~ msgstr "ignorerar ogiltigt flerbytestecken"
-
-#~ msgid "syntax error"
-#~ msgstr "syntaxfel"
-
-#~ msgid "syntax error: cannot back up"
-#~ msgstr "syntaxfel: kan inte backa tillbaka"
-
-#~ msgid "parser stack overflow"
-#~ msgstr "parsestack överfull"
-
-#~ msgid "ISO C forbids an empty source file"
-#~ msgstr "ISO C förbjuder tomma källkodsfiler"
-
-#~ msgid "argument of `asm' is not a constant string"
-#~ msgstr "argumentet till \"asm\" är inte en konstant sträng"
-
-#~ msgid "ISO C forbids data definition with no type or storage class"
-#~ msgstr "ISO C förbjuder datadefinition utan typ eller lagringsklass"
-
-#~ msgid "data definition has no type or storage class"
-#~ msgstr "datadefinition har ingen typ eller lagringsklass"
-
-#~ msgid "ISO C does not allow extra `;' outside of a function"
-#~ msgstr "ISO C tillåter inte extra \";\" utanför funktioner"
-
-#~ msgid "`sizeof' applied to a bit-field"
-#~ msgstr "\"sizeof\" applicerat på ett bitfält"
-
-#~ msgid "ISO C forbids omitting the middle term of a ?: expression"
-#~ msgstr "ISO C förbjuder uteslutande av den mittersta termen i ett ?: uttryck"
-
-#~ msgid "first argument to __builtin_choose_expr not a constant"
-#~ msgstr "första argumentet till \"__builtin_choose_expr\" är inte en konstant"
-
-#~ msgid "traditional C rejects string concatenation"
-#~ msgstr "traditionell C stödjer inte sträng-sammanslagning"
-
-#~ msgid "ISO C does not permit use of `varargs.h'"
-#~ msgstr "ISO C stödjer inte användning av \"varargs.h\""
-
-#~ msgid "`%s' is not at beginning of declaration"
-#~ msgstr "\"%s\" är inte i början av deklarationen"
-
-#~ msgid "ISO C89 forbids specifying subobject to initialize"
-#~ msgstr "ISO C89 förbjuder specifiering av subobjekt som skall initieras"
-
-#~ msgid "obsolete use of designated initializer without `='"
-#~ msgstr "obsolet angivelse av initierare utan \"=\""
-
-#~ msgid "obsolete use of designated initializer with `:'"
-#~ msgstr "obsolet användning av initierare med \":\""
-
-#~ msgid "ISO C forbids nested functions"
-#~ msgstr "ISO C förbjuder nästlade funktioner"
-
-#~ msgid "comma at end of enumerator list"
-#~ msgstr "komma i slutet av uppräkningslista"
-
-#~ msgid "no semicolon at end of struct or union"
-#~ msgstr "inget semikolon vid slutet av struktur eller union"
-
-#~ msgid "extra semicolon in struct or union specified"
-#~ msgstr "extra semikolon i struktur eller union angivet"
-
-#~ msgid "ISO C doesn't support unnamed structs/unions"
-#~ msgstr "ISO C stödjer inte ej namnsatta strukturer/unioner"
-
-#~ msgid "ISO C forbids member declarations with no members"
-#~ msgstr "ISO C förbjuder medlemsdeklarationer utan medlemmar"
-
-#~ msgid "storage class specifier in array declarator"
-#~ msgstr "lagringsklass angiven i array-deklarerare"
-
-#~ msgid "ISO C89 forbids mixed declarations and code"
-#~ msgstr "ISO C89 förbjuder blandade deklarationer och kod"
-
-#~ msgid "empty body in an else-statement"
-#~ msgstr "tom kropp i else-sats"
-
-#~ msgid "ISO C forbids `goto *expr;'"
-#~ msgstr "ISO C förbjuder \"goto *expr;\""
-
-#~ msgid "ISO C requires a named argument before `...'"
-#~ msgstr "ISO C kräver ett namnsatt argument före \"...\""
-
-#~ msgid "`...' in old-style identifier list"
-#~ msgstr "\"...\" i en gammaldags identifierarlista"
-
-#~ msgid "parse error; also virtual memory exceeded"
-#~ msgstr "parsningsfel; och det virtuella minnet tog slut"
-
-#~ msgid "parse error"
-#~ msgstr "parsningsfel"
-
-#~ msgid "%s at end of input"
-#~ msgstr "%s vid slutet av indatan"
-
-#~ msgid "%s before %s'%c'"
-#~ msgstr "%s före %s'%c'"
-
-#~ msgid "%s before %s'\\x%x'"
-#~ msgstr "%s före %s'\\x%x'"
-
-#~ msgid "%s before string constant"
-#~ msgstr "%s före strängkonstant"
-
-#~ msgid "%s before numeric constant"
-#~ msgstr "%s före numerisk konstant"
-
-#~ msgid "%s before \"%s\""
-#~ msgstr "%s före \"%s\""
-
-#~ msgid "%s before '%s' token"
-#~ msgstr "%s före symbolen '%s'"
-
-#~ msgid "syntax error at '%s' token"
-#~ msgstr "syntaxfel vid token \"%s\""
-
-#, fuzzy
-#~ msgid "YYDEBUG not defined"
-#~ msgstr "YYDEBUG är inte definierad."
-
-#~ msgid "#pragma pack (pop) encountered without matching #pragma pack (push, <n>)"
-#~ msgstr "#pragma pack (pop) påträffat utan matchande #pragma pack (push, <n>)"
-
-#~ msgid "#pragma pack(pop, %s) encountered without matching #pragma pack(push, %s, <n>)"
-#~ msgstr "#pragma pack(pop, %s) påträffat utan matchande #pragma pack(push, %s, <n>)"
-
-#, fuzzy
-#~ msgid "#pragma pack(push[, id], <n>) is not supported on this target"
-#~ msgstr "attributet \"section\" stöds inte för denna målarkitektur"
-
-#, fuzzy
-#~ msgid "#pragma pack(pop[, id], <n>) is not supported on this target"
-#~ msgstr "attributet \"section\" stöds inte för denna målarkitektur"
-
-#, fuzzy
-#~ msgid "missing '(' after '#pragma pack' - ignored"
-#~ msgstr "saknas '(' efter predikat"
-
-#, fuzzy
-#~ msgid "unknown action '%s' for '#pragma pack' - ignored"
-#~ msgstr "skräp vid slutet av \"#pragma pack\""
-
-#~ msgid "junk at end of '#pragma pack'"
-#~ msgstr "skräp vid slutet av \"#pragma pack\""
-
-#~ msgid "junk at end of #pragma weak"
-#~ msgstr "skräp vid slutet av #pragma weak"
-
-#, fuzzy
-#~ msgid "junk at end of #pragma redefine_extname"
-#~ msgstr "skräp vid slutet av #pragma weak"
-
-#, fuzzy
-#~ msgid "junk at end of #pragma extern_prefix"
-#~ msgstr "skräp vid slutet av #pragma weak"
-
-#, fuzzy
-#~ msgid "asm declaration conficts with previous rename"
-#~ msgstr "sektion \"%s\" står i konflikt med tidigare deklaration"
-
-#~ msgid "break statement not within loop or switch"
-#~ msgstr "break-sats som inte är i en loop eller switch"
-
-#~ msgid "continue statement not within a loop"
-#~ msgstr "continue-sats som inte är i en loop"
-
-#~ msgid "destructor needed for `%#D'"
-#~ msgstr "destruerare behövs för \"%#D\""
-
-#~ msgid "`%s' has an incomplete type"
-#~ msgstr "\"%s\" har en inkomplett typ"
-
-#~ msgid "invalid use of void expression"
-#~ msgstr "ogiltig användning av void-uttryck"
-
-#, fuzzy
-#~ msgid "invalid use of flexible array member"
-#~ msgstr "ISO C89 stöder inte flexibla fältmedlemmar"
-
-#~ msgid "function types not truly compatible in ISO C"
-#~ msgstr "funktionstyper inte riktigt kompatibla i ISO C"
-
-#~ msgid "types are not quite compatible"
-#~ msgstr "typerna är inte riktigt kompatibla"
-
-#~ msgid "sizeof applied to a function type"
-#~ msgstr "sizeof applicerad på en funktionstyp"
-
-#~ msgid "sizeof applied to a void type"
-#~ msgstr "sizeof applicerat på typen void"
-
-#~ msgid "sizeof applied to an incomplete type"
-#~ msgstr "sizeof applicerat på en inkomplett typ"
-
-#~ msgid "arithmetic on pointer to an incomplete type"
-#~ msgstr "aritmetik på pekare till inkomplett typ"
-
-#~ msgid "%s has no member named `%s'"
-#~ msgstr "%s har ingen medlem med namn \"%s\""
-
-#~ msgid "request for member `%s' in something not a structure or union"
-#~ msgstr "begäran av medlem \"%s\" i något som inte är en struktur eller union"
-
-#~ msgid "dereferencing pointer to incomplete type"
-#~ msgstr "derefererar pekare till inkomplett typ"
-
-#~ msgid "dereferencing `void *' pointer"
-#~ msgstr "derefererar \"void *\"-pekare"
-
-#~ msgid "invalid type argument of `%s'"
-#~ msgstr "ogiltigt typargument till \"%s\""
-
-#~ msgid "array subscript has type `char'"
-#~ msgstr "fältindex har typen \"char\""
-
-#~ msgid "array subscript is not an integer"
-#~ msgstr "fältindex är inte ett heltal"
-
-#~ msgid "subscript has type `char'"
-#~ msgstr "index har typen \"char\""
-
-#~ msgid "`%s' undeclared here (not in a function)"
-#~ msgstr "\"%s\" odeklarerad här (inte i en funktion)"
-
-#~ msgid "`%s' undeclared (first use in this function)"
-#~ msgstr "\"%s\" odeklarerad (första förekomsten i denna funktionen)"
-
-#~ msgid "(Each undeclared identifier is reported only once"
-#~ msgstr "(Varje odeklarerad identifierare rapporteras bara"
-
-#~ msgid "for each function it appears in.)"
-#~ msgstr "en gång för varje funktion den finns i.)"
-
-#~ msgid "called object is not a function"
-#~ msgstr "anropat objekt är inte en funktion"
-
-#~ msgid "too many arguments to function"
-#~ msgstr "för många argument till funktion"
-
-#~ msgid "%s as complex rather than integer due to prototype"
-#~ msgstr "%s som complex istället för heltal grund av prototyp"
-
-#~ msgid "%s as unsigned due to prototype"
-#~ msgstr "%s som unsigned på grund av prototyp"
-
-#~ msgid "%s as signed due to prototype"
-#~ msgstr "%s som signed på grund av prototyp"
-
-#~ msgid "too few arguments to function"
-#~ msgstr "för få argument till funktion"
-
-#~ msgid "suggest parentheses around + or - inside shift"
-#~ msgstr "föreslår parenteser runt + eller - inuti skift"
-
-#~ msgid "suggest parentheses around && within ||"
-#~ msgstr "föreslår parenteser runt && inuti ||"
-
-#~ msgid "suggest parentheses around arithmetic in operand of |"
-#~ msgstr "föreslår parenteser runt aritmetik inuti operanden till |"
-
-#~ msgid "suggest parentheses around comparison in operand of |"
-#~ msgstr "föreslår parenteser runt jämförelse inuti operanden till |"
-
-#~ msgid "suggest parentheses around arithmetic in operand of ^"
-#~ msgstr "föreslår parenteser runt aritmetik inuti operanden till ^"
-
-#~ msgid "suggest parentheses around comparison in operand of ^"
-#~ msgstr "föreslår parenteser runt jämförelse inuti operanden till ^"
-
-#~ msgid "suggest parentheses around + or - in operand of &"
-#~ msgstr "föreslår parenteser runt + eller - inuti operanden till &"
-
-#~ msgid "suggest parentheses around comparison in operand of &"
-#~ msgstr "föreslår parenteser runt jämförelser inuti operanden till &"
-
-#~ msgid "comparisons like X<=Y<=Z do not have their mathematical meaning"
-#~ msgstr "jämförelser som X<=Y<=Z har inte sin matematiska mening"
-
-#~ msgid "right shift count is negative"
-#~ msgstr "högershiftoperanden är negativ"
-
-#~ msgid "right shift count >= width of type"
-#~ msgstr "högershiftoperanden >= storleken på typen"
-
-#~ msgid "left shift count is negative"
-#~ msgstr "vänstershiftoperanden är negativ"
-
-#~ msgid "left shift count >= width of type"
-#~ msgstr "vänstershiftoperanden >= storleken på typen"
-
-#~ msgid "shift count is negative"
-#~ msgstr "shiftoperanden är negativ"
-
-#~ msgid "shift count >= width of type"
-#~ msgstr "shiftoperanden >= storleken på typen"
-
-#~ msgid "comparing floating point with == or != is unsafe"
-#~ msgstr "jämföra flyttal med == eller != är osäkert"
-
-#~ msgid "ISO C forbids comparison of `void *' with function pointer"
-#~ msgstr "ISO C förbjuder jämförelse mellan \"void *\" och funktionspekare"
-
-#~ msgid "comparison between pointer and integer"
-#~ msgstr "jämförelse mellan pekare och heltal"
-
-#~ msgid "ISO C forbids ordered comparisons of pointers to functions"
-#~ msgstr "ISO C förbjuder ordningsjämförelse på pekare till funktioner"
-
-#~ msgid "comparison of complete and incomplete pointers"
-#~ msgstr "jämförelse av kompletta och inkompletta pekare"
-
-#~ msgid "comparison between signed and unsigned"
-#~ msgstr "jämföreslse mellan signed och unsigned"
-
-#~ msgid "pointer of type `void *' used in subtraction"
-#~ msgstr "pekare av typ \"void *\" använd i subtraktion"
-
-#~ msgid "pointer to a function used in subtraction"
-#~ msgstr "pekare till funktion använd i subtraktion"
-
-#~ msgid "ISO C does not support `~' for complex conjugation"
-#~ msgstr "ISO C stödjer inte ~ för komplex konjugering"
-
-#~ msgid "wrong type argument to abs"
-#~ msgstr "fel typ på argument till abs"
-
-#~ msgid "ISO C does not support `++' and `--' on complex types"
-#~ msgstr "ISO C stöder inte \"++\" och \"--\" på komplexa typer"
-
-#, fuzzy
-#~ msgid "wrong type argument to increment"
-#~ msgstr "fel typ på argument till %s"
-
-#, fuzzy
-#~ msgid "wrong type argument to decrement"
-#~ msgstr "fel typ på argument till %s"
-
-#~ msgid "%s"
-#~ msgstr "%s"
-
-#, fuzzy
-#~ msgid "cannot take address of bit-field `%s'"
-#~ msgstr "kan inte ta adressen till bitfält \"%s\""
-
-#~ msgid "global register variable `%s' used in nested function"
-#~ msgstr "global registervariabel \"%s\" använd i nästlad funktion"
-
-#~ msgid "register variable `%s' used in nested function"
-#~ msgstr "registervariabel \\\"%s\\\" använd i nästlad funktion"
-
-#~ msgid "address of global register variable `%s' requested"
-#~ msgstr "adress på global registervariabel \"%s\" efterfrågad"
-
-#~ msgid "address of register variable `%s' requested"
-#~ msgstr "adress på register variabel \"%s\" efterfrågad"
-
-#~ msgid "signed and unsigned type in conditional expression"
-#~ msgstr "typ signed och unsigned i villkorsuttryck"
-
-#~ msgid "type mismatch in conditional expression"
-#~ msgstr "typfel i villkorsuttryck"
-
-#~ msgid "ISO C forbids casts to union type"
-#~ msgstr "ISO C förbjuder typkonvertering till unionstyper"
-
-#~ msgid "cast to union type from type not present in union"
-#~ msgstr "typkonvertering till unionstyp från typ som ej finns i unionen"
-
-#, fuzzy
-#~ msgid "cast adds new qualifiers to function type"
-#~ msgstr "typkonvertering matchar inte en funktionstyp"
-
-#~ msgid "cast from pointer to integer of different size"
-#~ msgstr "typkonvertering från pekare till heltal av annan storlek"
-
-#~ msgid "cast does not match function type"
-#~ msgstr "typkonvertering matchar inte en funktionstyp"
-
-#~ msgid "cast to pointer from integer of different size"
-#~ msgstr "typkonvertering till pekare från heltal med annan storlek"
-
-#~ msgid "invalid lvalue in assignment"
-#~ msgstr "ogiltigt lvalue i tilldelning"
-
-#~ msgid "assignment"
-#~ msgstr "tilldelning"
-
-#~ msgid "ISO C forbids %s between function pointer and `void *'"
-#~ msgstr "ISO C förbjuder %s mellan funktionspekare och \"void *\""
-
-# fixme: vad är %s
-#~ msgid "%s makes pointer from integer without a cast"
-#~ msgstr "%s skapar pekare från heltal utan typkonvertering"
-
-#~ msgid "incompatible types in %s"
-#~ msgstr "inkompatibla typer i %s"
-
-#~ msgid "initializer for static variable is not constant"
-#~ msgstr "initierare för statisk variabel är inte konstant"
-
-#~ msgid "initialization"
-#~ msgstr "initiering"
-
-#~ msgid "`return' with a value, in function returning void"
-#~ msgstr "\"return\" med värde i funktion som returnerar void"
-
-#~ msgid "return"
-#~ msgstr "return"
-
-#~ msgid "function returns address of local variable"
-#~ msgstr "funktionen returnerar adress till en lokal variabel"
-
-#~ msgid "switch quantity not an integer"
-#~ msgstr "switch-argument är inte ett heltal"
-
-#~ msgid "case label not within a switch statement"
-#~ msgstr "case-etikett är inte i en switch-sats"
-
-#~ msgid "`default' label not within a switch statement"
-#~ msgstr "\"default\"-etikett är inte i en switch-sats"
-
-#~ msgid "inlining failed in call to `%s'"
-#~ msgstr "inlining misslyckades i anrop av \"%s\""
-
-#~ msgid "called from here"
-#~ msgstr "anropad härifrån"
-
-#~ msgid "can't inline call to `%s'"
-#~ msgstr "kan inte inline:a anrop till \"%s\""
-
-#~ msgid "internal error"
-#~ msgstr "internt fel"
-
-#~ msgid "no arguments"
-#~ msgstr "inga argument"
-
-#~ msgid "fopen %s"
-#~ msgstr "fopen %s"
-
-#~ msgid "fclose %s"
-#~ msgstr "fclose %s"
-
-#~ msgid "%d constructor(s) found\n"
-#~ msgstr "%d konstruerare hittad(e)\n"
-
-#~ msgid "%d destructor(s) found\n"
-#~ msgstr "%d destruerare hittad(e)\n"
-
-#~ msgid "%s terminated with signal %d [%s]%s"
-#~ msgstr "%s terminerade med signal %d [%s]%s"
-
-#~ msgid "%s returned %d exit status"
-#~ msgstr "%s returnerade avslutningsstatus %d"
-
-#~ msgid "[cannot find %s]"
-#~ msgstr "[kan inte hitta %s]"
-
-#~ msgid "cannot find `%s'"
-#~ msgstr "kan inte hitta \"%s\""
-
-#~ msgid "redirecting stdout: %s"
-#~ msgstr "omdirigerar stdout: %s"
-
-#~ msgid "[Leaving %s]\n"
-#~ msgstr "[Lämnar %s]\n"
-
-#~ msgid "cannot find `nm'"
-#~ msgstr "kan inte hitta \"nm\""
-
-#~ msgid "pipe"
-#~ msgstr "rör"
-
-#~ msgid "fdopen"
-#~ msgstr "fdopen"
-
-#~ msgid "dup2 %d 1"
-#~ msgstr "dup2 %d 1"
-
-#~ msgid "close %d"
-#~ msgstr "close %d"
-
-#~ msgid "execvp %s"
-#~ msgstr "execvp %s"
-
-#~ msgid "fclose"
-#~ msgstr "fclose"
-
-#~ msgid "unable to open file '%s'"
-#~ msgstr "kan inte öppna fil \"%s\""
-
-#~ msgid "unable to mmap file '%s'"
-#~ msgstr "kan inte göra mmap på fil \"%s\""
-
-#~ msgid "not found\n"
-#~ msgstr "hittades inte\n"
-
-#~ msgid "bad magic number in file '%s'"
-#~ msgstr "felaktigt magiskt nummer i fil \"%s\""
-
-#~ msgid "dynamic dependencies.\n"
-#~ msgstr "dynamiskt beroende.\n"
-
-#~ msgid "cannot find `ldd'"
-#~ msgstr "kan inte hitta \"ldd\""
-
-#~ msgid "execv %s"
-#~ msgstr "execv %s"
-
-#~ msgid "%s: not a COFF file"
-#~ msgstr "%s: är inte en COFF-fil"
-
-#~ msgid "%s: cannot open as COFF file"
-#~ msgstr "%s: kan inte öppna som COFF-fil"
-
-#, fuzzy
-#~ msgid "library lib%s not found"
-#~ msgstr "Hittade inte bibliotek lib%s"
-
-#~ msgid "open %s"
-#~ msgstr "open %s"
-
-#~ msgid ""
-#~ "\n"
-#~ "Processing symbol table #%d, offset = 0x%.8lx, kind = %s\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Processar symboltabell #%d, index = 0x%.8lx, sort = %s\n"
-
-#~ msgid "string section missing"
-#~ msgstr "strängsektionen saknas"
-
-#~ msgid "section pointer missing"
-#~ msgstr "sektionspekare saknas"
-
-#~ msgid "no symbol table found"
-#~ msgstr "hittade ingen symboltabell"
-
-#~ msgid "no cmd_strings found"
-#~ msgstr "hittar ingen cmd_strings"
-
-#~ msgid "load command map, %d cmds, new size %ld.\n"
-#~ msgstr "ladda kommandomappning, %d kommandon, ny storlek %ld.\n"
-
-#~ msgid "unsupported version"
-#~ msgstr "ej stödd version"
-
-#~ msgid "fstat %s"
-#~ msgstr "fstat %s"
-
-#~ msgid "lseek %s 0"
-#~ msgstr "lseek %s 0"
-
-#~ msgid "read %s"
-#~ msgstr "read %s"
-
-#~ msgid "read %ld bytes, expected %ld, from %s"
-#~ msgstr "läste %ld bytes, förväntade %ld, från %s"
-
-#~ msgid "msync %s"
-#~ msgstr "msync %s"
-
-#~ msgid "munmap %s"
-#~ msgstr "munmap %s"
-
-#~ msgid "write %s"
-#~ msgstr "write %s"
-
-#~ msgid "wrote %ld bytes, expected %ld, to %s"
-#~ msgstr "skrev %ld bytes, förväntade %ld, till %s"
-
-#~ msgid "cannot convert to a pointer type"
-#~ msgstr "kan inte konvertera till en pekartyp"
-
-#, fuzzy
-#~ msgid "floating point numbers are not valid in #if"
-#~ msgstr "flyttal utanför intervallet för \"%s\""
-
-#~ msgid "too many 'l' suffixes in integer constant"
-#~ msgstr "för många \"l\"-suffix i heltalskonstant"
-
-#~ msgid "integer constant out of range"
-#~ msgstr "heltalskonstant utanför sitt intervall"
-
-#~ msgid "ISO C++ does not permit \"%s\" in #if"
-#~ msgstr "ISO C++ tillåter inte \"%s\" i #if"
-
-#, fuzzy
-#~ msgid "missing binary operator"
-#~ msgstr "saknas '(' efter predikat"
-
-#~ msgid "absolute file name in remap_filename"
-#~ msgstr "absolut filnamn i remap_filename"
-
-#~ msgid "ignoring nonexistent directory \"%s\"\n"
-#~ msgstr "ignorerar ej existerande katalog \"%s\"\n"
-
-#~ msgid "%s: Not a directory"
-#~ msgstr "%s: Inte en katalog"
-
-#, fuzzy
-#~ msgid "changing search order for system directory \"%s\""
-#~ msgstr "kan inte skapa katalog %s"
-
-#~ msgid "#include \"...\" search starts here:\n"
-#~ msgstr "#include \"...\" sökning startar här:\n"
-
-#~ msgid "#include <...> search starts here:\n"
-#~ msgstr "#include <...> sökning startar här:\n"
-
-#~ msgid "End of search list.\n"
-#~ msgstr "Slut på söklistan.\n"
-
-#, fuzzy
-#~ msgid "<built-in>"
-#~ msgstr "<inbyggd>"
-
-#~ msgid "I/O error on output"
-#~ msgstr "I/O-fel vid utmatning"
-
-#, fuzzy
-#~ msgid "argument missing after %s"
-#~ msgstr "Argument saknas efter %s"
-
-#, fuzzy
-#~ msgid "assertion missing after %s"
-#~ msgstr "Makronamn saknas efter %s"
-
-#, fuzzy
-#~ msgid "directory name missing after %s"
-#~ msgstr "Katalognamn saknas efter %s"
-
-#, fuzzy
-#~ msgid "file name missing after %s"
-#~ msgstr "Filnamn saknas efter %s"
-
-#, fuzzy
-#~ msgid "macro name missing after %s"
-#~ msgstr "Makronamn saknas efter %s"
-
-#, fuzzy
-#~ msgid "path name missing after %s"
-#~ msgstr "Sökväg saknas efter %s"
-
-#, fuzzy
-#~ msgid "number missing after %s"
-#~ msgstr "Nummer saknas efter %s"
-
-#, fuzzy
-#~ msgid "target missing after %s"
-#~ msgstr "Argument saknas efter %s"
-
-#, fuzzy
-#~ msgid "too many filenames. Type %s --help for usage info"
-#~ msgstr "För många filnamn. Skriv %s --help för användningsinformation"
-
-#, fuzzy
-#~ msgid "output filename specified twice"
-#~ msgstr "Utdatafilnamn angivet två gånger"
-
-#~ msgid "-I- specified twice"
-#~ msgstr "-I- angiven två gånger"
-
-#~ msgid "GNU CPP version %s (cpplib)"
-#~ msgstr "GNU CPP version %s (cpplib)"
-
-#~ msgid "you must additionally specify either -M or -MM"
-#~ msgstr "du måste dessutom ange antingen -M eller -MM"
-
-#~ msgid ""
-#~ "Switches:\n"
-#~ " -include <file> Include the contents of <file> before other files\n"
-#~ " -imacros <file> Accept definition of macros in <file>\n"
-#~ " -iprefix <path> Specify <path> as a prefix for next two options\n"
-#~ " -iwithprefix <dir> Add <dir> to the end of the system include path\n"
-#~ " -iwithprefixbefore <dir> Add <dir> to the end of the main include path\n"
-#~ " -isystem <dir> Add <dir> to the start of the system include path\n"
-#~ msgstr ""
-#~ "Flaggor:\n"
-#~ " -include <fil> Inkludera innehållet i <fil> före andra filer\n"
-#~ " -imacros <fil> Använd makrodefinitioner i <fil>\n"
-#~ " -iprefix <sökväg> Sätt <sökväg> som prefix för följande två flaggor\n"
-#~ " -iwithprefix <katalog> Sätt <katalog> i slutet på systemets include-sökväg\n"
-#~ " -iwithprefixbefore <kat> Sätt <kat> i slutet på huvud-include-sökvägen\n"
-#~ " -isystem <katalog> Sätt <katalog> först på systemets include-sökväg\n"
-
-#~ msgid ""
-#~ " -idirafter <dir> Add <dir> to the end of the system include path\n"
-#~ " -I <dir> Add <dir> to the end of the main include path\n"
-#~ " -I- Fine-grained include path control; see info docs\n"
-#~ " -nostdinc Do not search system include directories\n"
-#~ " (dirs specified with -isystem will still be used)\n"
-#~ " -nostdinc++ Do not search system include directories for C++\n"
-#~ " -o <file> Put output into <file>\n"
-#~ msgstr ""
-#~ " -idirafter <katalog> Sätt <katalog> i slutet på systemets include-sökväg\n"
-#~ " -I <katalog> Sätt <katalog> i slutet på huvud-include-sökvägen\n"
-#~ " -I- Detaljerad include-sökväg kontroll; se info-hjälp\n"
-#~ " -nostdinc Använd inte systemets include-sökväg (kataloger\n"
-#~ " satta med -isystem kommer fortfarande användas)\n"
-#~ " -nostdinc++ Använd inte systemets include-sökväg för C++\n"
-#~ " -o <fil> Skriv utdata till <fil>\n"
-
-#~ msgid ""
-#~ " -pedantic Issue all warnings demanded by strict ISO C\n"
-#~ " -pedantic-errors Issue -pedantic warnings as errors instead\n"
-#~ " -trigraphs Support ISO C trigraphs\n"
-#~ " -lang-c Assume that the input sources are in C\n"
-#~ " -lang-c89 Assume that the input sources are in C89\n"
-#~ msgstr ""
-#~ " -pedantic Utfärda alla varningar som strikt ISO C kräver\n"
-#~ " -pedantic-errors Utfärda -pedantic varningar som fel istället\n"
-#~ " -trigraphs Stöd ISO C trigraphs\n"
-#~ " -lang-c Antag att indatakällkoden är C\n"
-#~ " -lang-c89 Antag att indatakällkoden är C89\n"
-
-#~ msgid ""
-#~ " -lang-c++ Assume that the input sources are in C++\n"
-#~ " -lang-objc Assume that the input sources are in ObjectiveC\n"
-#~ " -lang-objc++ Assume that the input sources are in ObjectiveC++\n"
-#~ " -lang-asm Assume that the input sources are in assembler\n"
-#~ msgstr ""
-#~ " -lang-c++ Antag att indatakällkoden är C++\n"
-#~ " -lang-objc Antag att indatakällkoden är ObjectiveC\n"
-#~ " -lang-objc++ Antag att indatakällkoden är ObjectiveC++\n"
-#~ " -lang-asm Antag att indatakällkoden är assembler\n"
-
-#~ msgid ""
-#~ " -std=<std name> Specify the conformance standard; one of:\n"
-#~ " gnu89, gnu99, c89, c99, iso9899:1990,\n"
-#~ " iso9899:199409, iso9899:1999\n"
-#~ " -+ Allow parsing of C++ style features\n"
-#~ " -w Inhibit warning messages\n"
-#~ " -Wtrigraphs Warn if trigraphs are encountered\n"
-#~ " -Wno-trigraphs Do not warn about trigraphs\n"
-#~ " -Wcomment{s} Warn if one comment starts inside another\n"
-#~ msgstr ""
-#~ " -std=<std namn> Ange standard att följa; en av:\n"
-#~ " gnu89, gnu99, c89, c99, iso9899:1990,\n"
-#~ " iso9899:199409, iso9899:1999\n"
-#~ " -+ Tillåt användning av C++ finesser\n"
-#~ " -w Stoppa varningsmeddelande\n"
-#~ " -Wtrigraphs Varna om trigrapher påträffas\n"
-#~ " -Wno-trigraphs Varna inte om trigrapher\n"
-#~ " -Wcomment{s} Varna om en kommentar börjar i en annan kommentar\n"
-
-#~ msgid ""
-#~ " -Wno-comment{s} Do not warn about comments\n"
-#~ " -Wtraditional Warn about features not present in traditional C\n"
-#~ " -Wno-traditional Do not warn about traditional C\n"
-#~ " -Wundef Warn if an undefined macro is used by #if\n"
-#~ " -Wno-undef Do not warn about testing undefined macros\n"
-#~ " -Wimport Warn about the use of the #import directive\n"
-#~ msgstr ""
-#~ " -Wno-comment{s} Varna inte om kommentarer\n"
-#~ " -Wtraditional Varna om finesser som inte finns i traditionell C\n"
-#~ " -Wno-traditional Varna inte om traditionell C\n"
-#~ " -Wundef Varna om ett odefinierat makro används av #if\n"
-#~ " -Wno-undef Varna inte om att testa odefinierade makron\n"
-#~ " -Wimport Varna om användande av direktivet #import\n"
-
-#~ msgid ""
-#~ " -Wno-import Do not warn about the use of #import\n"
-#~ " -Werror Treat all warnings as errors\n"
-#~ " -Wno-error Do not treat warnings as errors\n"
-#~ " -Wsystem-headers Do not suppress warnings from system headers\n"
-#~ " -Wno-system-headers Suppress warnings from system headers\n"
-#~ " -Wall Enable all preprocessor warnings\n"
-#~ msgstr ""
-#~ " -Wno-import Varna inte om användande av #import\n"
-#~ " -Werror Behandla alla varningar som fel\n"
-#~ " -Wno-error Behandla inte varningar som fel\n"
-#~ " -Wsystem-headers Dölj inte varningar från system-include-filer\n"
-#~ " -Wno-system-headers Dölj varningar från system-include-filer\n"
-#~ " -Wall Aktivera alla preprocessor-varningar\n"
-
-#, fuzzy
-#~ msgid ""
-#~ " -M Generate make dependencies\n"
-#~ " -MM As -M, but ignore system header files\n"
-#~ " -MD Generate make dependencies and compile\n"
-#~ " -MMD As -MD, but ignore system header files\n"
-#~ " -MF <file> Write dependency output to the given file\n"
-#~ " -MG Treat missing header file as generated files\n"
-#~ msgstr ""
-#~ " -M Generera make beroenden\n"
-#~ " -MM Som -M, men ignorera system-include-filer\n"
-#~ " -MF <fil> Skriv beroenden till den givna filen\n"
-#~ " -MG Behandla saknade filer som genererade filer\n"
-
-# fixme: vad menas med unquoted
-#~ msgid ""
-#~ " -MP\t\t\t Generate phony targets for all headers\n"
-#~ " -MQ <target> Add a MAKE-quoted target\n"
-#~ " -MT <target> Add an unquoted target\n"
-#~ msgstr ""
-#~ " -MP\t\t\t Generera phony-mål för alla include-filer\n"
-#~ " -MQ <mål> Lägg till MAKE-citerat mål\n"
-#~ " -MT <mål> Lägg till ociterat mål\n"
-
-#, fuzzy
-#~ msgid ""
-#~ " -D<macro> Define a <macro> with string '1' as its value\n"
-#~ " -D<macro>=<val> Define a <macro> with <val> as its value\n"
-#~ " -A<question>=<answer> Assert the <answer> to <question>\n"
-#~ " -A-<question>=<answer> Disable the <answer> to <question>\n"
-#~ " -U<macro> Undefine <macro> \n"
-#~ " -v Display the version number\n"
-#~ msgstr ""
-#~ " -D<makro> Definiera <makro> med strängen \"1\" som sitt värde\n"
-#~ " -D<makro>=<värde> Definiera <makro> with <värde> som sitt värde\n"
-#~ " -A<fråga> (<svar>) Ange svaret <svar> på frågan <fråga>\n"
-#~ " -A-<fråga> (<svar>) Slå av svaret <svar> på frågan <fråga>\n"
-#~ " -U<makro> Gör <makro> till icke definierat\n"
-#~ " -v Visa versionsnummer\n"
-
-#~ msgid ""
-#~ " -H Print the name of header files as they are used\n"
-#~ " -C Do not discard comments\n"
-#~ " -dM Display a list of macro definitions active at end\n"
-#~ " -dD Preserve macro definitions in output\n"
-#~ " -dN As -dD except that only the names are preserved\n"
-#~ " -dI Include #include directives in the output\n"
-#~ msgstr ""
-#~ " -H Skriv namnet på include-filer när de används\n"
-#~ " -C Släng inte bort kommentarer\n"
-#~ " -dM Visa en lista med aktiva makron i slutet\n"
-#~ " -dD Bevara mokrodefinitioner i utdata\n"
-#~ " -dN Som -dD men bara namnet bevaras\n"
-#~ " -dI Ta med #include-direktives i utdata\n"
-
-#, fuzzy
-#~ msgid ""
-#~ " -fpreprocessed Treat the input file as already preprocessed\n"
-#~ " -ftabstop=<number> Distance between tab stops for column reporting\n"
-#~ " -P Do not generate #line directives\n"
-#~ " -$ Do not allow '$' in identifiers\n"
-#~ " -remap Remap file names when including files\n"
-#~ " --version Display version information\n"
-#~ " -h or --help Display this information\n"
-#~ msgstr ""
-#~ " -fpreprocessed Tolka infiler som redan preprocessade\n"
-#~ " -ftabstop=<nummer> Avstånd mellan tabbar för kolumutskrifter\n"
-#~ " -P Genererar inte #line-direktiv\n"
-#~ " -$ Tillåt inte '$' i identifierare\n"
-#~ " -remap Mappa om filnamn vid inkludering av filer\n"
-#~ " --version Visa versionsinformation\n"
-#~ " -h or --help Visa denna information\n"
-
-#~ msgid "'$' character(s) in identifier"
-#~ msgstr "tecknet '$' i en identifierare"
-
-#, fuzzy
-#~ msgid "unknown string token %s\n"
-#~ msgstr "okänt registernamn: %s"
-
-#~ msgid "#import is obsolete, use an #ifndef wrapper in the header file"
-#~ msgstr "#import är obsolet, använd #ifndef-omslutning i includefilen"
-
-#~ msgid "#pragma once is obsolete"
-#~ msgstr "#pragma once är obsolet"
-
-#, fuzzy
-#~ msgid "invalid option %s"
-#~ msgstr "Ogiltig flagga %s"
-
-#~ msgid "too many input files"
-#~ msgstr "för många indatafiler"
-
-#~ msgid "%s:%d: warning: "
-#~ msgstr "%s:%d: varning: "
-
-#~ msgid "%s: warning: "
-#~ msgstr "%s: varning: "
-
-#~ msgid "((anonymous))"
-#~ msgstr "((anonym))"
-
-#~ msgid "%s: %s: "
-#~ msgstr "%s: %s: "
-
-#~ msgid "sorry, not implemented: "
-#~ msgstr "ledsen, inte implementerat: "
-
-#~ msgid "%s "
-#~ msgstr "%s "
-
-#~ msgid " %s"
-#~ msgstr " %s"
-
-#~ msgid "At top level:"
-#~ msgstr "På toppnivå:"
-
-#, fuzzy
-#~ msgid "In member function `%s':"
-#~ msgstr "I funktion `%s':"
-
-#~ msgid "In function `%s':"
-#~ msgstr "I funktion `%s':"
-
-#~ msgid "compilation terminated.\n"
-#~ msgstr "kompilering avslutad.\n"
-
-#~ msgid ""
-#~ "Please submit a full bug report,\n"
-#~ "with preprocessed source if appropriate.\n"
-#~ "See %s for instructions.\n"
-#~ msgstr ""
-#~ "Var vänlig och skicka in en komplett felrapport,\n"
-#~ "om möjligt med preprocessad källfil.\n"
-#~ "Se %s för instruktioner.\n"
-
-#~ msgid "Internal compiler error: Error reporting routines re-entered.\n"
-#~ msgstr "Internt kompilatorfel: Felhanteringsrutiner återanropade.\n"
-
-#~ msgid "Internal compiler error in %s, at %s:%d"
-#~ msgstr "Internt kompilatorfel i %s, vid %s:%d"
-
-#~ msgid "In file included from %s:%d"
-#~ msgstr "I fil includerad från %s:%d"
-
-#~ msgid ""
-#~ ",\n"
-#~ " from %s:%d"
-#~ msgstr ""
-#~ ",\n"
-#~ " från %s:%d"
-
-#~ msgid ":\n"
-#~ msgstr ":\n"
-
-#, fuzzy
-#~ msgid "`%s' is deprecated"
-#~ msgstr "tredje argumentet till \"%s\" är inte länge rekommenderat"
-
-#, fuzzy
-#~ msgid "DW_LOC_OP %s not implemented\n"
-#~ msgstr "DW_LOC_OP %s är inte implementerad\n"
-
-#~ msgid "argument of `__builtin_eh_return_regno' must be constant"
-#~ msgstr "argumentet till \"__builtin_eh_return_regno\" måste vara konstant"
-
-#~ msgid "__builtin_eh_return not supported on this target"
-#~ msgstr "__builtin_eh_return stöds inte på denna målarkitektur"
-
-#~ msgid "prior parameter's size depends on `%s'"
-#~ msgstr "föregående parameterns storlek beror på \"%s\""
-
-#, fuzzy
-#~ msgid "invalid `asm': "
-#~ msgstr "ogiltig \"asm\": %s"
-
-#, fuzzy
-#~ msgid "operand number missing after %%-letter"
-#~ msgstr "Nummer saknas efter %s"
-
-#~ msgid "invalid %%-code"
-#~ msgstr "ogiltig %%-kod"
-
-#~ msgid "function might be possible candidate for attribute `noreturn'"
-#~ msgstr "funktionen är en möjlig kandidat för attributet \"noreturn\""
-
-#~ msgid "`noreturn' function does return"
-#~ msgstr "\"noreturn\"-funktion returnerar ändå"
-
-#~ msgid "control reaches end of non-void function"
-#~ msgstr "Programflödet når slutet på en icke-void-funktion"
-
-#, fuzzy
-#~ msgid "comparison is always %d due to width of bit-field"
-#~ msgstr "jämförelsen är alltid sann på grund av begränsat intervall för datatypen"
-
-#~ msgid "comparison is always %d"
-#~ msgstr "jämförelsen är alltid %d"
-
-#~ msgid "size of variable `%s' is too large"
-#~ msgstr "storleken på variabel \"%s\" är för stor"
-
-#~ msgid "unused parameter `%s'"
-#~ msgstr "oanvänd parameter \"%s\""
-
-#, fuzzy
-#~ msgid "ambiguous abbreviation %s"
-#~ msgstr "Tvetydig förkortning %s"
-
-#, fuzzy
-#~ msgid "incomplete `%s' option"
-#~ msgstr "Inkomplett flagga \"%s\""
-
-#, fuzzy
-#~ msgid "missing argument to `%s' option"
-#~ msgstr "Saknar argument till flaggan \"%s\""
-
-#, fuzzy
-#~ msgid "extraneous argument to `%s' option"
-#~ msgstr "Saknar argument till flaggan \"%s\""
-
-#, fuzzy
-#~ msgid "could not find specs file %s\n"
-#~ msgstr "Kunde inte öppna källkodsfil %s.\n"
-
-#~ msgid "spec file has no spec for linking"
-#~ msgstr "specfilen har ingen spec för länkning"
-
-#~ msgid "-pipe not supported"
-#~ msgstr "-pipe stöds inte"
-
-#~ msgid ""
-#~ "\n"
-#~ "Go ahead? (y or n) "
-#~ msgstr ""
-#~ "\n"
-#~ "Fortsätta? (y eller n) "
-
-#~ msgid ""
-#~ "Internal error: %s (program %s)\n"
-#~ "Please submit a full bug report.\n"
-#~ "See %s for instructions."
-#~ msgstr ""
-#~ "Internt fel: %s (program %s)\n"
-#~ "Var vänlig och skicka in en felrapport.\n"
-#~ "Se %s för instruktioner."
-
-#~ msgid "# %s %.2f %.2f\n"
-#~ msgstr "# %s %.2f %.2f\n"
-
-#~ msgid "Usage: %s [options] file...\n"
-#~ msgstr "Användning: %s [flaggor] fil...\n"
-
-#~ msgid "Options:\n"
-#~ msgstr "Flaggor:\n"
-
-#~ msgid " -pass-exit-codes Exit with highest error code from a phase\n"
-#~ msgstr " -pass-exit-codes Avsluta med högsta felkoden från någon av faserna\n"
-
-#~ msgid " --help Display this information\n"
-#~ msgstr " --help Visa den här informatationen\n"
-
-#~ msgid " --target-help Display target specific command line options\n"
-#~ msgstr " --target-help Visa specifika kommandoradsflaggor för mål\n"
-
-#~ msgid " (Use '-v --help' to display command line options of sub-processes)\n"
-#~ msgstr " (Använd '-v --help' för att visa kommandoradsflaggor för barnprocesser)\n"
-
-#~ msgid " -dumpspecs Display all of the built in spec strings\n"
-#~ msgstr " -dumpspecs Visa de inbyggda spec-strängarna\n"
-
-#~ msgid " -dumpversion Display the version of the compiler\n"
-#~ msgstr " -dumpversion Visa kompilatorns version\n"
-
-#~ msgid " -dumpmachine Display the compiler's target processor\n"
-#~ msgstr " -dumpmachine Visa kompilatorns målprocessor\n"
-
-#~ msgid " -print-search-dirs Display the directories in the compiler's search path\n"
-#~ msgstr " -print-search-dirs Visa katalogerna i kompilatorns sökväg\n"
-
-#~ msgid " -print-libgcc-file-name Display the name of the compiler's companion library\n"
-#~ msgstr " -print-libgcc-file-name Visa namnet på kompilatorns medföljande bibliotek\n"
-
-#~ msgid " -print-file-name=<lib> Display the full path to library <lib>\n"
-#~ msgstr " -print-file-name=<bib> Visa hela sökvägen till länkbibliotek <bib>\n"
-
-#~ msgid " -print-prog-name=<prog> Display the full path to compiler component <prog>\n"
-#~ msgstr " -print-prog-name=<prog> Visa fulla sökvägen till kompilatorkomponenten <prog>\n"
-
-#~ msgid " -print-multi-directory Display the root directory for versions of libgcc\n"
-#~ msgstr " -print-multi-directory Visa rotkatalogen för olika versioner av libgcc\n"
-
-#~ msgid ""
-#~ " -print-multi-lib Display the mapping between command line options and\n"
-#~ " multiple library search directories\n"
-#~ msgstr ""
-#~ " -print-multi-lib Visa mappningen mellan kommandoradsflaggor och\n"
-#~ " multipla biblioteks sökkataloger\n"
-
-#~ msgid " -Wa,<options> Pass comma-separated <options> on to the assembler\n"
-#~ msgstr " -Wa,<flaggor> Skicka kommaseparerade <flaggor> till assembleraren\n"
-
-#~ msgid " -Wp,<options> Pass comma-separated <options> on to the preprocessor\n"
-#~ msgstr " -Wp,<flaggor> Skicka kommaseparerade <flaggor> till preprocessorn\n"
-
-#~ msgid " -Wl,<options> Pass comma-separated <options> on to the linker\n"
-#~ msgstr " -Wl,<flaggor> Skicka kommaseparerade <flaggor> till länkaren\n"
-
-#~ msgid " -Xlinker <arg> Pass <arg> on to the linker\n"
-#~ msgstr " -Xlinker <arg> Skicka <arg> vidare till länkaren\n"
-
-#~ msgid " -save-temps Do not delete intermediate files\n"
-#~ msgstr " -save-temps Radera inte temporära filer\n"
-
-#~ msgid " -pipe Use pipes rather than intermediate files\n"
-#~ msgstr " -pipe Använd rör istället för temporära filer\n"
-
-#~ msgid " -time Time the execution of each subprocess\n"
-#~ msgstr " -time Mät tiden det tar att exekvera varje barnprocess\n"
-
-#, fuzzy
-#~ msgid " -specs=<file> Override built-in specs with the contents of <file>\n"
-#~ msgstr " -specs=<fil> Använd innehållet i <fil> istället för inbyggda spec\n"
-
-#~ msgid " -std=<standard> Assume that the input sources are for <standard>\n"
-#~ msgstr " -std=<standard> Antag att källkodsfilerna är för <standard>\n"
-
-#~ msgid " -B <directory> Add <directory> to the compiler's search paths\n"
-#~ msgstr " -B <katalog> Lägg till <katalog> till kompilatorns sökvägar\n"
-
-#~ msgid " -b <machine> Run gcc for target <machine>, if installed\n"
-#~ msgstr " -b <maskin> Kör gcc för mål <maskin>, om det är installerat\n"
-
-#~ msgid " -V <version> Run gcc version number <version>, if installed\n"
-#~ msgstr " -V <version> Kör gcc version <version>, om den är installerad\n"
-
-#~ msgid " -v Display the programs invoked by the compiler\n"
-#~ msgstr " -v Visa vilka program som körs av kompilatorn\n"
-
-#~ msgid " -E Preprocess only; do not compile, assemble or link\n"
-#~ msgstr ""
-#~ " -E Preprocessa bara; kompilera, assemblera och\n"
-#~ " länka inte\n"
-
-#~ msgid " -S Compile only; do not assemble or link\n"
-#~ msgstr " -S Kompilera bara; assemblera och länka inte\n"
-
-#~ msgid " -c Compile and assemble, but do not link\n"
-#~ msgstr " -c Kompilera och assemblera, men länka inte\n"
-
-#~ msgid " -o <file> Place the output into <file>\n"
-#~ msgstr " -o <fil> Placera utdata i <fil>\n"
-
-#, fuzzy
-#~ msgid ""
-#~ " -x <language> Specify the language of the following input files\n"
-#~ " Permissable languages include: c c++ assembler none\n"
-#~ " 'none' means revert to the default behavior of\n"
-#~ " guessing the language based on the file's extension\n"
-#~ msgstr ""
-#~ " -x <språk> Specificera språk för de följande källkodsfilerna\n"
-#~ " Tillåtna språk är bland annat: c c++ assembler none\n"
-#~ " 'none' innebär att man använder standardmetoden,\n"
-#~ " att man gissar språk beroende på filändelse\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Options starting with -g, -f, -m, -O, -W, or --param are automatically\n"
-#~ " passed on to the various sub-processes invoked by %s. In order to pass\n"
-#~ " other options on to these processes the -W<letter> options must be used.\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Flaggor som börjar med -g, -f, -m, -O, -W eller --param skickas automatiskt\n"
-#~ "vidare till de barnprocesser som startas av %s. För att skicka med andra\n"
-#~ "flaggor till dessa processer måste flaggan -W<bokstav> användas.\n"
-
-#~ msgid "argument to `-Xlinker' is missing"
-#~ msgstr "argument till \"-Xlinker\" saknas"
-
-#, fuzzy
-#~ msgid "argument to `-l' is missing"
-#~ msgstr "argument till \"-x\" saknas"
-
-#~ msgid "argument to `-specs' is missing"
-#~ msgstr "argument till \"-specs\" saknas"
-
-#~ msgid "argument to `-specs=' is missing"
-#~ msgstr "argument till \"-specs=\" saknas"
-
-#~ msgid "argument to `-b' is missing"
-#~ msgstr "argument till \"-b\" saknas"
-
-#~ msgid "argument to `-B' is missing"
-#~ msgstr "argument till \"-B\" saknas"
-
-#~ msgid "argument to `-V' is missing"
-#~ msgstr "argument till \"-V\" saknas"
-
-#~ msgid "invalid version number format"
-#~ msgstr "ogiltigt format på versionsnummer"
-
-#, fuzzy
-#~ msgid "warning: -pipe ignored because -save-temps specified"
-#~ msgstr "Varning: -pipe ignorerad eftersom -save-temps angiven"
-
-#, fuzzy
-#~ msgid "warning: -pipe ignored because -time specified"
-#~ msgstr "Varning: -pipe ignorerad eftersom -time angiven"
-
-#~ msgid "argument to `-x' is missing"
-#~ msgstr "argument till \"-x\" saknas"
-
-#~ msgid "argument to `-%s' is missing"
-#~ msgstr "argument till \"-%s\" saknas"
-
-#~ msgid "%s\n"
-#~ msgstr "%s\n"
-
-#, fuzzy
-#~ msgid "spec failure: unrecognized spec option '%c'"
-#~ msgstr "ej igenkänd flagga `-%s'"
-
-#~ msgid "unrecognized option `-%s'"
-#~ msgstr "ej igenkänd flagga `-%s'"
-
-#~ msgid "programs: %s\n"
-#~ msgstr "program: %s\n"
-
-#~ msgid "libraries: %s\n"
-#~ msgstr "bibliotek: %s\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "For bug reporting instructions, please see:\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Instruktioner för bugrapportering, se:\n"
-
-#~ msgid "gcc version %s\n"
-#~ msgstr "gcc version %s\n"
-
-#, fuzzy
-#~ msgid "no input files"
-#~ msgstr "Inga indatafiler"
-
-#~ msgid "%s: %s compiler not installed on this system"
-#~ msgstr "%s: kompilatorn %s är inte installerad på detta system"
-
-#~ msgid "language %s not recognized"
-#~ msgstr "språk %s känns inte igen"
-
-#, fuzzy
-#~ msgid "internal gcc abort"
-#~ msgstr "Intern gcc-halt (abort)."
-
-#, fuzzy
-#~ msgid ""
-#~ "Print code coverage information.\n"
-#~ "\n"
-#~ msgstr "inte tillräcklig typinformation"
-
-#, fuzzy
-#~ msgid " -h, --help Print this help, then exit\n"
-#~ msgstr " --help Visa den här informatationen\n"
-
-#, fuzzy
-#~ msgid " -v, --version Print version number, then exit\n"
-#~ msgstr " -V <version> Kör gcc version <version>, om den är installerad\n"
-
-#, fuzzy
-#~ msgid " -n, --no-output Do not create an output file\n"
-#~ msgstr " -save-temps Radera inte temporära filer\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "\n"
-#~ "For bug reporting instructions, please see:\n"
-#~ "%s.\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Instruktioner för bugrapportering, se:\n"
-
-#~ msgid "%6.2f%% of %d source lines executed in function %s\n"
-#~ msgstr "%6.2f%% av %d källkodsrader körda i funktion %s\n"
-
-#~ msgid "No executable source lines in function %s\n"
-#~ msgstr "Inga körbara källkodsrader i funktion %s\n"
-
-#~ msgid "%6.2f%% of %d branches executed in function %s\n"
-#~ msgstr "%6.2f%% av %d hopp utförda i funktion %s\n"
-
-#~ msgid "%6.2f%% of %d branches taken at least once in function %s\n"
-#~ msgstr "%6.2f%% av %d hopp tagna minst en gång i funktion %s\n"
-
-#~ msgid "No branches in function %s\n"
-#~ msgstr "Inga hopp i funktionen %s\n"
-
-#~ msgid "%6.2f%% of %d calls executed in function %s\n"
-#~ msgstr "%6.2f%% av %d anrop tagna i funktion %s\n"
-
-#~ msgid "No calls in function %s\n"
-#~ msgstr "Inga anrop i funktion %s\n"
-
-#~ msgid "%6.2f%% of %d source lines executed in file %s\n"
-#~ msgstr "%6.2f%% av %d källkodsrader körda i fil %s\n"
-
-#~ msgid "No branches in file %s\n"
-#~ msgstr "Inga hopp i fil %s\n"
-
-#~ msgid "No calls in file %s\n"
-#~ msgstr "Inga anrop i fil %s\n"
-
-#~ msgid "Could not open source file %s.\n"
-#~ msgstr "Kunde inte öppna källkodsfil %s.\n"
-
-#~ msgid "Could not open output file %s.\n"
-#~ msgstr "Kunde inte öppna utdatafil %s.\n"
-
-#~ msgid "Creating %s.\n"
-#~ msgstr "Skapar %s.\n"
-
-#~ msgid "call %d never executed\n"
-#~ msgstr "anrop %d aldrig utfört\n"
-
-#~ msgid "can't open %s"
-#~ msgstr "kan inte öppna %s"
-
-#~ msgid "fix_sched_param: unknown param: %s"
-#~ msgstr "fix_sched_param: okänd param: %s"
-
-#~ msgid "function cannot be inline"
-#~ msgstr "funktion \"%s\" kan inte deklareras som \"mutable\""
-
-#~ msgid "function uses __builtin_eh_return"
-#~ msgstr "funktion använder __builtin_eh_return"
-
-#~ msgid "%s: internal abort\n"
-#~ msgstr "%s: intern abort\n"
-
-#~ msgid "%s: usage '%s [ -VqfnkN ] [ -i <istring> ] [ filename ... ]'\n"
-#~ msgstr "%s: användning '%s [ -VqfnkN ] [ -i <isträng> ] [ filnamn ... ]'\n"
-
-#~ msgid "%s: usage '%s [ -VqfnkNlgC ] [ -B <dirname> ] [ filename ... ]'\n"
-#~ msgstr "%s: användning '%s [ -VqfnkNlgC ] [ -B <katalognamn> ] [ filnamn ... ]'\n"
-
-#~ msgid "%s: warning: no read access for file `%s'\n"
-#~ msgstr "%s: varning: ingen läsrättighet för fil \"%s\"\n"
-
-#~ msgid "%s: warning: no write access for file `%s'\n"
-#~ msgstr "%s: varning: ingen skrivrättighet för fil \"%s\"\n"
-
-#~ msgid "%s: %s: can't get status: %s\n"
-#~ msgstr "%s: %s: kan inte få status: %s\n"
-
-#~ msgid "%s: compiling `%s'\n"
-#~ msgstr "%s: kompilerar `%s'\n"
-
-#~ msgid "%s: wait: %s\n"
-#~ msgstr "%s: vänta: %s\n"
-
-#~ msgid "%s: subprocess got fatal signal %d\n"
-#~ msgstr "%s: subprocess fick dödlig signal %d\n"
-
-#~ msgid "%s: %s exited with status %d\n"
-#~ msgstr "%s: %s avslutade med status %d\n"
-
-#~ msgid "%s: can't delete file `%s': %s\n"
-#~ msgstr "%s: kan inte radera fil \"%s\": %s\n"
-
-#~ msgid "%s: warning: can't rename file `%s' to `%s': %s\n"
-#~ msgstr "%s: varning: kan inte döpa om fil \"%s\" till \"%s\": %s\n"
-
-#~ msgid "%s: can't open file `%s' for reading: %s\n"
-#~ msgstr "%s: kan inte öppna fil `%s' för läsning: %s\n"
-
-#~ msgid "%s: can't link file `%s' to `%s': %s\n"
-#~ msgstr "%s: kan inte länka fil \"%s\" till \"%s\": %s\n"
-
-#~ msgid "%s: input file names must have .c suffixes: %s\n"
-#~ msgstr "%s: indatafilnamn måste ha ändelsen .c: %s\n"
-
-#~ msgid "conversion from NaN to int"
-#~ msgstr "konvertering från NaN till int"
-
-#~ msgid "floating point overflow"
-#~ msgstr "flyttalsspill"
-
-#~ msgid "%s: total loss of precision"
-#~ msgstr "%s: total förlust av precision"
-
-#~ msgid "%s: partial loss of precision"
-#~ msgstr "%s: partiell förlust av precision"
-
-#~ msgid "unknown register name: %s"
-#~ msgstr "okänt registernamn: %s"
-
-#, fuzzy
-#~ msgid "unable to generate reloads for:"
-#~ msgstr "Välj CPU att generera kod för"
-
-#, fuzzy
-#~ msgid "VOIDmode on an output"
-#~ msgstr "I/O-fel vid utmatning"
-
-#, fuzzy
-#~ msgid "unrecognizable insn:"
-#~ msgstr "ej igenkänd flagga `-%s'"
-
-#, fuzzy
-#~ msgid "duplicate asm operand name '%s'"
-#~ msgstr "upprepning av medlem \"%s\""
-
-#~ msgid "unused variable `%s'"
-#~ msgstr "oanvänd variabel \"%s\""
-
-#~ msgid "size of `%s' is %d bytes"
-#~ msgstr "storleken på \"%s\" är %d bytes"
-
-#~ msgid "size of `%s' is larger than %d bytes"
-#~ msgstr "storleken på \"%s\" är större än %d bytes"
-
-#~ msgid ""
-#~ "\n"
-#~ "Execution times (seconds)\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Exekveringstider (sekunder)\n"
-
-#~ msgid " TOTAL :"
-#~ msgstr " TOTALT :"
-
-#~ msgid "time in %s: %ld.%06ld (%ld%%)\n"
-#~ msgstr "tid %s: %ld.%06ld (%ld%%)\n"
-
-#, fuzzy
-#~ msgid "Generate VMS format debug info"
-#~ msgstr "Generera kod för \"big endian\""
-
-#, fuzzy
-#~ msgid "Perform DWARF2 duplicate elimination"
-#~ msgstr "Utför optimering för svansrekursion"
-
-#, fuzzy
-#~ msgid "Perform a number of minor, expensive optimizations"
-#~ msgstr "Utför optimering för svansrekursion"
-
-#, fuzzy
-#~ msgid "Perform jump threading optimizations"
-#~ msgstr "Utför optimering för svansrekursion"
-
-#, fuzzy
-#~ msgid "Perform strength reduction optimizations"
-#~ msgstr "Utför optimering för svansrekursion"
-
-#~ msgid "Check for syntax errors, then stop"
-#~ msgstr "Leta efter syntaxfel, stoppa sedan"
-
-#~ msgid "Do not generate .size directives"
-#~ msgstr "Generera inte .size-direktiv"
-
-#~ msgid "place each function into its own section"
-#~ msgstr "placera varje funktion i sin egen sektion"
-
-#~ msgid "External symbols have a leading underscore"
-#~ msgstr "Externa symboler startar med en understrykning"
-
-#~ msgid "Process #ident directives"
-#~ msgstr "Hantera #ident-direktiv"
-
-#~ msgid "Set errno after built-in math functions"
-#~ msgstr "Sätt errno efter inbyggda matematikfunktioner"
-
-#, fuzzy
-#~ msgid "Do not recognize any built in functions"
-#~ msgstr "Känn inte igen några inbyggda funktioner"
-
-#~ msgid "Warn about subscripts whose type is 'char'"
-#~ msgstr "Varna om index har typen \"char\""
-
-#~ msgid "Warn if nested comments are detected"
-#~ msgstr "Varna om nästlade kommentarer upptäcks"
-
-#~ msgid "Don't warn about too many arguments to format functions"
-#~ msgstr "Varna inte om för många argument till format-funktioner"
-
-#~ msgid "Warn about suspicious declarations of main"
-#~ msgstr "Varna om tveksamma deklarationer av main"
-
-#, fuzzy
-#~ msgid "Warn about possibly missing braces around initializers"
-#~ msgstr "Varna om eventuellt saknade parenteser"
-
-#~ msgid "Warn about possible missing parentheses"
-#~ msgstr "Varna om eventuellt saknade parenteser"
-
-#~ msgid "Warn about function pointer arithmetic"
-#~ msgstr "Varna om aritmetik med funktionspekare"
-
-#~ msgid "Warn about multiple declarations of the same object"
-#~ msgstr "Varna om multipla deklarationer av samma objekt"
-
-#~ msgid "Warn about signed/unsigned comparisons"
-#~ msgstr "Varna om jämförelser mellan signed/unsigned"
-
-#~ msgid "Mark strings as 'const char *'"
-#~ msgstr "Markera strängar som \"const char *\""
-
-#~ msgid "Warn when a function is unused"
-#~ msgstr "Varna när en funktion är oanvänd"
-
-#~ msgid "Warn when a label is unused"
-#~ msgstr "Varna när en etikett är oanvänd"
-
-#~ msgid "Warn when a function parameter is unused"
-#~ msgstr "Varna när en funktionsparameter är oanvänd"
-
-#~ msgid "Warn when a variable is unused"
-#~ msgstr "Varna när en variabel är oanvänd"
-
-#~ msgid "Warn when an expression value is unused"
-#~ msgstr "Varna när ett uttrycksvärde är oanvänt"
-
-#, fuzzy
-#~ msgid "Warn about uninitialized automatic variables"
-#~ msgstr "Varna om aritmetik med funktionspekare"
-
-#~ msgid "Warn about functions which might be candidates for attribute noreturn"
-#~ msgstr "Varna om funktioner som är möjliga kandidater för attributet noreturn"
-
-#, fuzzy
-#~ msgid "invalid option `%s'"
-#~ msgstr "Ogiltig flagga \"%s\""
-
-#, fuzzy
-#~ msgid "internal error: %s"
-#~ msgstr "Internt fel: %s"
-
-#~ msgid "`%s' declared `static' but never defined"
-#~ msgstr "\"%s\" är deklarerad som \"static\" men definieras aldrig"
-
-#~ msgid "`%s' defined but not used"
-#~ msgstr "\"%s\" är definierad men inte använd"
-
-#~ msgid " -ffixed-<register> Mark <register> as being unavailable to the compiler\n"
-#~ msgstr " -ffixed-<register> Markera <register> som ej tillgängligt för kompilatorn\n"
-
-#~ msgid " -fcall-used-<register> Mark <register> as being corrupted by function calls\n"
-#~ msgstr " -fcall-used-<register> Ange att <register> förstörs av funktionsanrop\n"
-
-#~ msgid " -fcall-saved-<register> Mark <register> as being preserved across functions\n"
-#~ msgstr " -fcall-saved-<register> Ange att <register> bevaras av funktioner\n"
-
-#~ msgid " -finline-limit=<number> Limits the size of inlined functions to <number>\n"
-#~ msgstr " -finline-limit=<nummer> Begränsa storlek på inline-funktioner till <nummer>\n"
-
-#~ msgid " -fmessage-length=<number> Limits diagnostics messages lengths to <number> characters per line. 0 suppresses line-wrapping\n"
-#~ msgstr " -fmessage-length=<nummer> Begränsa felmeddelandens längd till <nummer> tecken per rad. 0 stänger av radbrytning\n"
-
-#~ msgid " -fdiagnostics-show-location=[once | every-line] Indicates how often source location information should be emitted, as prefix, at the beginning of diagnostics when line-wrapping\n"
-#~ msgstr " -fdiagnostics-show-location=[once | every-line] Anger hur ofta källkodspositioner skall skrivas ut, som prefix, i början av utskrift vid radbrytning\n"
-
-#, fuzzy
-#~ msgid " -O[number] Set optimization level to [number]\n"
-#~ msgstr " -O[nummer] Sätt optimeringsnivå till [nummer]\n"
-
-#, fuzzy
-#~ msgid " -Os Optimize for space rather than speed\n"
-#~ msgstr " -Os Optimera för storlek istället för hastighet\n"
-
-#~ msgid " -pedantic Issue warnings needed by strict compliance to ISO C\n"
-#~ msgstr " -pedantic Ge varningar som krävs för att strikt följa ISO C\n"
-
-#~ msgid " -pedantic-errors Like -pedantic except that errors are produced\n"
-#~ msgstr " -pedantic-errors Som -pedantic men ger fel istället\n"
-
-#~ msgid " -w Suppress warnings\n"
-#~ msgstr " -w Stoppa varningar\n"
-
-#~ msgid " -W Enable extra warnings\n"
-#~ msgstr " -W Slå på extra varningar\n"
-
-#~ msgid " -Wunused Enable unused warnings\n"
-#~ msgstr " -Wunused Slå på oanvända varningar\n"
-
-#~ msgid " -Wlarger-than-<number> Warn if an object is larger than <number> bytes\n"
-#~ msgstr " -Wlarger-than-<nummer> Varna om objekt är större än <nummer> bytes\n"
-
-#~ msgid " -p Enable function profiling\n"
-#~ msgstr " -p Slå på funktionsprofilering\n"
-
-#~ msgid " -o <file> Place output into <file> \n"
-#~ msgstr " -o <fil> Skriv utdata i <fil> \n"
-
-#~ msgid ""
-#~ " -G <number> Put global and static data smaller than <number>\n"
-#~ " bytes into a special section (on some targets)\n"
-#~ msgstr ""
-#~ " -G <nummer> Placera global and statisk data mindre än <nummer>\n"
-#~ " bytes i en speciell sektion (vissa arkitekturer)\n"
-
-#~ msgid " -aux-info <file> Emit declaration info into <file>\n"
-#~ msgstr " -aux-info <fil> Generera deklarationsinfo till fil <fil>\n"
-
-#~ msgid " -quiet Do not display functions compiled or elapsed time\n"
-#~ msgstr " -quiet Visa inte kompilerade funktioner eller tiden som förbrukats\n"
-
-#~ msgid " -version Display the compiler's version\n"
-#~ msgstr " -version Visa kompilatorns version\n"
-
-#~ msgid " -d[letters] Enable dumps from specific passes of the compiler\n"
-#~ msgstr " -d[bokstäver] Slå på dumpning från angivna delar av kompilatorn\n"
-
-#~ msgid " --help Display this information\n"
-#~ msgstr " --help Visa den här informatationen\n"
-
-#~ msgid " %-23.23s [undocumented]\n"
-#~ msgstr " %-23.23s [odokumenterad]\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "There are undocumented %s specific options as well.\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Det finns dessutom odokumenterade %s-specifika flaggor.\n"
-
-#~ msgid ""
-#~ "\n"
-#~ " Options for %s:\n"
-#~ msgstr ""
-#~ "\n"
-#~ " Flaggor för %s:\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "Target specific options:\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Speciella flaggor för målarkitektur:\n"
-
-#~ msgid " -m%-23.23s [undocumented]\n"
-#~ msgstr " -m%-23.23s [odokumenterad]\n"
-
-#~ msgid ""
-#~ "\n"
-#~ "There are undocumented target specific options as well.\n"
-#~ msgstr ""
-#~ "\n"
-#~ "Det finns dessutom odokumenterade flaggor speciellt för målarkitekturen.\n"
-
-#~ msgid " They exist, but they are not documented.\n"
-#~ msgstr " De finns, men är inte dokumenterade.\n"
-
-#~ msgid "unrecognized gcc debugging option: %c"
-#~ msgstr "ej igenkänd debuggningsflagga för gcc: %c"
-
-#~ msgid "unrecognized register name `%s'"
-#~ msgstr "Känner inte igen registernamn \"%s\""
-
-#, fuzzy
-#~ msgid "unrecognized option `%s'"
-#~ msgstr "ej igenkänd flagga `-%s'"
-
-#, fuzzy
-#~ msgid "-Wid-clash-LEN is no longer supported"
-#~ msgstr "-f%s stödjs inte längre"
-
-#~ msgid "`%s': unknown or unsupported -g option"
-#~ msgstr "\"%s\": okänd eller icke supportad flagga till -g"
-
-#~ msgid "`%s' ignored, conflicts with `-g%s'"
-#~ msgstr "\"%s\" ignorerad, i konflikt med \"-g%s\""
-
-#~ msgid "invalid --param option: %s"
-#~ msgstr "ogiltig flagga till --param: %s"
-
-#~ msgid "invalid parameter value `%s'"
-#~ msgstr "ogiltigt parametervärde \"%s\""
-
-#~ msgid "can't open %s for writing"
-#~ msgstr "kan inte öppna fil %s för skrivning"
-
-#, fuzzy
-#~ msgid "ignoring command line option '%s'"
-#~ msgstr "Ignorerar kommandoradsflagga \"%s\""
-
-#, fuzzy
-#~ msgid "-ffunction-sections not supported for this target"
-#~ msgstr "attributet \"section\" stöds inte för denna målarkitektur"
-
-#, fuzzy
-#~ msgid "-fdata-sections not supported for this target"
-#~ msgstr "-fdata-sections stöds inte för AIX"
-
-#, fuzzy
-#~ msgid "-fprefetch-loop-arrays not supported for this target"
-#~ msgstr "attributet \"section\" stöds inte för denna målarkitektur"
-
-#, fuzzy
-#~ msgid "-fprefetch-loop-arrays is not supported with -Os"
-#~ msgstr "profilering stöds inte tillsammans med -mg\n"
-
-#~ msgid "error writing to %s"
-#~ msgstr "fel vid skrivning till %s"
-
-#~ msgid "error closing %s"
-#~ msgstr "fel vid stängning av %s"
-
-#, fuzzy
-#~ msgid "invalid character constant in #if"
-#~ msgstr "teckenkonstant för lång"
-
-#, fuzzy
-#~ msgid "invalid token in expression"
-#~ msgstr "ogiltig användning av void-uttryck"
-
-#, fuzzy
-#~ msgid "usage: %s [switches] input output"
-#~ msgstr "Användning: %s [flaggor] infil utfil\n"
-
-#, fuzzy
-#~ msgid "filename missing after -i option"
-#~ msgstr "Filnamn saknas efter flaggan -i"
-
-#, fuzzy
-#~ msgid "filename missing after -o option"
-#~ msgstr "Filnamn saknas efter flaggan -o"
-
-#, fuzzy
-#~ msgid "target missing after %s option"
-#~ msgstr "Mål saknas efter flaggan %s"
-
-#, fuzzy
-#~ msgid "filename missing after %s option"
-#~ msgstr "Filnamn saknas efter flaggan %s"
-
-#, fuzzy
-#~ msgid "macro name missing after -%c option"
-#~ msgstr "Makronamn saknas efter flaggan -%c"
-
-#~ msgid "-pedantic and -traditional are mutually exclusive"
-#~ msgstr "-pedantic och -traditional är ömsesidigt uteslutande"
-
-#~ msgid "-trigraphs and -traditional are mutually exclusive"
-#~ msgstr "-trigraphs och -traditional är ömsesidigt uteslutande"
-
-#, fuzzy
-#~ msgid "directory name missing after -I option"
-#~ msgstr "Katalognamn saknas efter flaggan -I"
-
-#~ msgid "`/*' within comment"
-#~ msgstr "\"/*\" inuti kommentar"
-
-#~ msgid "invalid macro name `%s'"
-#~ msgstr "ogiltigt makronamn \"%s\""
-
-#~ msgid "extra text at end of directive"
-#~ msgstr "extra text vid slutet av direktiv"
-
-#~ msgid "#error%.*s"
-#~ msgstr "#error%.*s"
-
-#~ msgid "#warning%.*s"
-#~ msgstr "#warning%.*s"
-
-#~ msgid "#else or #elif after #else"
-#~ msgstr "#else eller #elif efter #else"
-
-#~ msgid "unbalanced #endif"
-#~ msgstr "obalanserad #endif"
-
-#~ msgid "no args to macro `%s'"
-#~ msgstr "inga argument till makro \"%s\""
-
-#~ msgid "only 1 arg to macro `%s'"
-#~ msgstr "bara 1 argument till makro \"%s\""
-
-#~ msgid "only %d args to macro `%s'"
-#~ msgstr "bara %d argument till makro \"%s\""
-
-#~ msgid "too many (%d) args to macro `%s'"
-#~ msgstr "för många (%d) argument till makro \"%s\""
-
-#, fuzzy
-#~ msgid ""
-#~ "internal error in %s, at tradcpp.c:%d\n"
-#~ "Please submit a full bug report.\n"
-#~ "See %s for instructions."
-#~ msgstr ""
-#~ "Internt fel i %s, vid tradcpp.c:%d\n"
-#~ "Var vänlig och skicka in en felrapport.\n"
-#~ "Se %s för instruktioner."
-
-#~ msgid "could not open dump file `%s'"
-#~ msgstr "kunde inte öppna dump-fil \"%s\""
-
-#, fuzzy
-#~ msgid "ignoring unknown option `%.*s' in `-f%s'"
-#~ msgstr "Ignorerar kommandoradsflagga \"%s\""
-
-#~ msgid "global register variable has initial value"
-#~ msgstr "global registervariabel har startvärde"
-
-#, fuzzy
-#~ msgid "requested alignment for %s is greater than implemented alignment of %d"
-#~ msgstr "efterrågad minnesjustering är inte en potens av 2"
-
-#, fuzzy
-#~ msgid "weak declaration of `%s' not supported"
-#~ msgstr "omdeklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "junk at end of '#pragma options'"
-#~ msgstr "skräp vid slutet av \"#pragma %s\""
-
-#, fuzzy
-#~ msgid "missing '(' after '#pragma unused', ignoring"
-#~ msgstr "saknas '(' efter predikat"
-
-#, fuzzy
-#~ msgid "missing ')' after '#pragma unused', ignoring"
-#~ msgstr "saknas '(' efter predikat"
-
-#, fuzzy
-#~ msgid "junk at end of '#pragma unused'"
-#~ msgstr "skräp vid slutet av \"#pragma %s\""
-
-#~ msgid "optimization turned on"
-#~ msgstr "optimering påslagen"
-
-#~ msgid "optimization turned off"
-#~ msgstr "optimering avslagen"
-
-#~ msgid "invalid %%Q value"
-#~ msgstr "ogiltigt %%Q-värde"
-
-#~ msgid "invalid %%C value"
-#~ msgstr "ogiltigt %%C-värde"
-
-#~ msgid "invalid %%N value"
-#~ msgstr "ogiltigt %%N-värde"
-
-#~ msgid "invalid %%M value"
-#~ msgstr "ogiltigt %%M-värde"
-
-#~ msgid "invalid %%m value"
-#~ msgstr "ogiltigt %%m-värde"
-
-#~ msgid "invalid %%L value"
-#~ msgstr "ogiltigt %%L-värde"
-
-#~ msgid "invalid %%O value"
-#~ msgstr "ogiltigt %%O-värde"
-
-#~ msgid "invalid %%P value"
-#~ msgstr "ogiltigt %%P-värde"
-
-#~ msgid "invalid %%V value"
-#~ msgstr "ogiltigt %%V-värde"
-
-#~ msgid "Use small memory model"
-#~ msgstr "Använd liten minnesmodell"
-
-#~ msgid "Use normal memory model"
-#~ msgstr "Använd normal minnesmodell"
-
-#~ msgid "Use large memory model"
-#~ msgstr "Använd stor minnesmodell"
-
-#~ msgid "Emit stack checking code"
-#~ msgstr "Generera kod för stackkontroll"
-
-#~ msgid "Do not emit stack checking code"
-#~ msgstr "Generera inte kod för stackkontroll"
-
-#~ msgid "Work around storem hardware bug"
-#~ msgstr "Fix för storem hårdvarubugg"
-
-#~ msgid "Do not work around storem hardware bug"
-#~ msgstr "Fixa inte storem hårdvarubugg"
-
-#~ msgid "Use software floating point"
-#~ msgstr "Använd mjukvaruflytttal"
-
-#, fuzzy
-#~ msgid "-f%s ignored for Unicos/Mk (not supported)"
-#~ msgstr "-pipe stöds inte."
-
-#, fuzzy
-#~ msgid "-mieee not supported on Unicos/Mk"
-#~ msgstr "-pipe stöds inte"
-
-#~ msgid "bad value `%s' for -mmemory-latency"
-#~ msgstr "ogiltigt värde \"%s\" till -memory-latency"
-
-#, fuzzy
-#~ msgid "invalid %%J value"
-#~ msgstr "ogiltigt värde %%B"
-
-#~ msgid "invalid %%r value"
-#~ msgstr "ogiltigt %%r-värde"
-
-#~ msgid "invalid %%R value"
-#~ msgstr "ogiltigt %%R-värde"
-
-#~ msgid "invalid %%h value"
-#~ msgstr "ogiltigt %%h-värde"
-
-#~ msgid "invalid %%U value"
-#~ msgstr "ogiltigt %%U-värde"
-
-#~ msgid "invalid %%s value"
-#~ msgstr "ogiltigt %%s-värde"
-
-#~ msgid "invalid %%E value"
-#~ msgstr "ogiltigt %%E-värde"
-
-# fixme: fp = flyttal, men hur skall man skriva det. Förkortat eller FPU?
-#~ msgid "Use hardware fp"
-#~ msgstr "Använd hårdvaru-fp"
-
-#~ msgid "Do not use hardware fp"
-#~ msgstr "Använd inte hårdvaru-fp"
-
-#~ msgid "Do not assume GAS"
-#~ msgstr "Antag inte GAS"
-
-#~ msgid "Assume GAS"
-#~ msgstr "Antag GAS"
-
-#~ msgid "Use VAX fp"
-#~ msgstr "Använd VAX fp"
-
-#~ msgid "Do not use VAX fp"
-#~ msgstr "Använd inte VAX fp"
-
-#~ msgid "Schedule given CPU"
-#~ msgstr "Schemalägg för given CPU"
-
-#~ msgid "bad value (%s) for -mcpu switch"
-#~ msgstr "ogiltigt värde (%s) till flagga -mcpu"
-
-#, fuzzy
-#~ msgid "argument of `%s' attribute is not a string constant"
-#~ msgstr "argumentet till \"asm\" är inte en konstant sträng"
-
-#, fuzzy
-#~ msgid "invalid operand to %%R code"
-#~ msgstr "ogiltig operand för %R"
-
-#, fuzzy
-#~ msgid "invalid operand to %%H/%%L code"
-#~ msgstr "ogiltig operand för %H/%L"
-
-#, fuzzy
-#~ msgid "invalid operand to %%U code"
-#~ msgstr "ogiltig operand för %U"
-
-#, fuzzy
-#~ msgid "invalid operand to %%V code"
-#~ msgstr "ogiltig operand för %V"
-
-#~ msgid "switch -mcpu=%s conflicts with -march= switch"
-#~ msgstr "flagga -mcpu=%s står i konflikt med flagga -march="
-
-#~ msgid "bad value (%s) for %s switch"
-#~ msgstr "ogiltigt värde (%s) till flagga %s"
-
-#~ msgid "target CPU does not support APCS-32"
-#~ msgstr "målprocessorn stödjer inte APCS-32"
-
-#~ msgid "target CPU does not support APCS-26"
-#~ msgstr "målprocessorn stödjer inte APCS-26"
-
-#, fuzzy
-#~ msgid "target CPU does not support THUMB instructions"
-#~ msgstr "målprocessorn stödjer inte THUMB-instruktioner"
-
-#~ msgid "-mapcs-stack-check incompatible with -mno-apcs-frame"
-#~ msgstr "-mapcs-stack-check är inkompatibel med -mno-apcs-frame"
-
-#~ msgid "-fpic and -mapcs-reent are incompatible"
-#~ msgstr "-fpic och -mapcs-reent är inkompatibla"
-
-#, fuzzy
-#~ msgid "structure size boundary can only be set to 8 or 32"
-#~ msgstr "Strukturstorleksgräns kan bara sättas till 8 eller 32"
-
-#~ msgid "-mpic-register= is useless without -fpic"
-#~ msgstr "-mpic-register= är oanvändbar utan -fpic"
-
-#, fuzzy
-#~ msgid "`%s' attribute only applies to functions"
-#~ msgstr "attributet \"%s\" fungerar bara på funktioner"
-
-#~ msgid "initialized variable `%s' is marked dllimport"
-#~ msgstr "initierad variabel \"%s\" är markerad som dllimport"
-
-#~ msgid "static variable `%s' is marked dllimport"
-#~ msgstr "statisk variabel \"%s\" är markerad som dllimport"
-
-#~ msgid "Use the 32-bit version of the APCS"
-#~ msgstr "Använd 32-bit version av APCS"
-
-#~ msgid "Use the 26-bit version of the APCS"
-#~ msgstr "Använd 26-bit version av APCS"
-
-#~ msgid "Pass FP arguments in FP registers"
-#~ msgstr "Skicka FP-argument i FP-register"
-
-#~ msgid "Use library calls to perform FP operations"
-#~ msgstr "Använd biblioteksrutiner för FP-operationer"
-
-#~ msgid "Use hardware floating point instructions"
-#~ msgstr "Använd flyttalsinstruktioner i hårdvara"
-
-#~ msgid "Assume target CPU is configured as big endian"
-#~ msgstr "Antag att mål-CPU:n är konfigurerad som \"big endian\""
-
-#~ msgid "Assume target CPU is configured as little endian"
-#~ msgstr "Antag att mål-CPU:n är konfigurerad som \"little endian\""
-
-#~ msgid "Assume big endian bytes, little endian words"
-#~ msgstr "Antag att bytes är \"big endian\", ord är \"little endian\""
-
-#~ msgid "Specify the name of the target CPU"
-#~ msgstr "Ange namnet på målprocessorn"
-
-#~ msgid "Specify the name of the target architecture"
-#~ msgstr "Ange namnet på målarkitekturen"
-
-#~ msgid "Ignore dllimport attribute for functions"
-#~ msgstr "Ignorera attributet dllimport för funktioner"
-
-#~ msgid "MCU `%s' not supported"
-#~ msgstr "MCU \"%s\" stöds inte"
-
-#, fuzzy
-#~ msgid "internal compiler error. Bad address:"
-#~ msgstr "Internt kompilatorfel i %s, vid %s:%d"
-
-#, fuzzy
-#~ msgid "internal compiler error. Unknown mode:"
-#~ msgstr "Internt kompilatorfel i %s, vid %s:%d"
-
-#, fuzzy
-#~ msgid "invalid insn:"
-#~ msgstr "ogiltig #line"
-
-#, fuzzy
-#~ msgid "unknown move insn:"
-#~ msgstr "okänt registernamn: %s"
-
-#, fuzzy
-#~ msgid "internal compiler error. Incorrect shift:"
-#~ msgstr "Internt kompilatorfel i %s, vid %s:%d"
-
-#, fuzzy
-#~ msgid "only initialized variables can be placed into program memory area"
-#~ msgstr "Initiera bara variabler som kan placeras i 8-bits området."
-
-#, fuzzy
-#~ msgid "trampolines not supported"
-#~ msgstr "-pipe stöds inte"
-
-#, fuzzy
-#~ msgid "missing '(' after '#pragma %s' - ignored"
-#~ msgstr "saknas '(' efter predikat"
-
-#~ msgid "junk at end of '#pragma %s'"
-#~ msgstr "skräp vid slutet av \"#pragma %s\""
-
-#~ msgid "Small memory model"
-#~ msgstr "Liten minnesmodell"
-
-#~ msgid "Big memory model"
-#~ msgstr "Stor minnesmodell"
-
-#~ msgid "Generate code for C30 CPU"
-#~ msgstr "Generera kod för CPU C30"
-
-#~ msgid "Generate code for C31 CPU"
-#~ msgstr "Generera kod för CPU C31"
-
-#~ msgid "Generate code for C32 CPU"
-#~ msgstr "Generera kod för CPU C32"
-
-#~ msgid "Generate code for C33 CPU"
-#~ msgstr "Generera kod för CPU C33"
-
-#~ msgid "Generate code for C40 CPU"
-#~ msgstr "Generera kod för CPU C40"
-
-#~ msgid "Generate code for C44 CPU"
-#~ msgstr "Generera kod för CPU C44"
-
-#~ msgid "Pass arguments on the stack"
-#~ msgstr "Skicka argument på stacken"
-
-#~ msgid "Pass arguments in registers"
-#~ msgstr "Skicka argument i register"
-
-#~ msgid "Select CPU to generate code for"
-#~ msgstr "Välj CPU att generera kod för"
-
-#~ msgid "Generate code for the C400"
-#~ msgstr "Generera kod för C400"
-
-#~ msgid "Generate code for the C300"
-#~ msgstr "Genrera kod för C300"
-
-#~ msgid "Generate code for c1"
-#~ msgstr "Generera kod för c1"
-
-#~ msgid "Generate code for c2"
-#~ msgstr "Generera kod för c2"
-
-#~ msgid "Generate code for c32"
-#~ msgstr "Generera kod för c32"
-
-#~ msgid "Generate code for c34"
-#~ msgstr "Generera kod för c34"
-
-#~ msgid "Use 64-bit longs"
-#~ msgstr "Använd 64-bits long"
-
-#, fuzzy
-#~ msgid "unexpected function type needing stack adjustment for __builtin_eh_return"
-#~ msgstr "funktion använder __builtin_eh_return"
-
-#, fuzzy
-#~ msgid "invalid operand for 'b' modifier"
-#~ msgstr "ogiltig operand för %V"
-
-#, fuzzy
-#~ msgid "invalid operand for 'v' modifier"
-#~ msgstr "ogiltig operand för %V"
-
-#, fuzzy
-#~ msgid "invalid operand for 'P' modifier"
-#~ msgstr "ogiltig operand för %V"
-
-#, fuzzy
-#~ msgid "invalid operand for 'p' modifier"
-#~ msgstr "ogiltig operand för %V"
-
-#, fuzzy
-#~ msgid "invalid operand for 'z' modifier"
-#~ msgstr "ogiltig operand för %V"
-
-#, fuzzy
-#~ msgid "invalid operand for 'H' modifier"
-#~ msgstr "ogiltig operand för %V"
-
-#, fuzzy
-#~ msgid "invalid operand for 'e' modifier"
-#~ msgstr "ogiltig operand för %V"
-
-#, fuzzy
-#~ msgid "invalid operand for 'm' modifier"
-#~ msgstr "ogiltig operand för %V"
-
-#, fuzzy
-#~ msgid "invalid operand for 'A' modifier"
-#~ msgstr "ogiltig operand för %V"
-
-#, fuzzy
-#~ msgid "invalid operand for 'D' modifier"
-#~ msgstr "ogiltig operand för %V"
-
-#, fuzzy
-#~ msgid "invalid operand for 'T' modifier"
-#~ msgstr "ogiltig operand för %V"
-
-#, fuzzy
-#~ msgid "invalid operand modifier letter"
-#~ msgstr "ogiltig operand för %V"
-
-#, fuzzy
-#~ msgid "internal error: bad register: %d"
-#~ msgstr "internt fel: "
-
-#, fuzzy
-#~ msgid "unrecognized address"
-#~ msgstr "Känner inte igen registernamn \"%s\""
-
-#, fuzzy
-#~ msgid "unrecognized supposed constant"
-#~ msgstr "ej igenkänd flagga `-%s'"
-
-#, fuzzy
-#~ msgid "Do not use condition codes from normal instructions"
-#~ msgstr "Använd inte bitfältsinstruktioner"
-
-#, fuzzy
-#~ msgid "Do not tune stack alignment"
-#~ msgstr "Generera inte kod för stackkontroll"
-
-#, fuzzy
-#~ msgid "Generate code for the specified chip or CPU version"
-#~ msgstr "Generera kod för en given CPU"
-
-#, fuzzy
-#~ msgid "Tune alignment for the specified chip or CPU version"
-#~ msgstr "minnesjustering kan inte anges för \"%s\""
-
-#, fuzzy
-#~ msgid "stack size > 32k"
-#~ msgstr "Stackstorlek > 32k"
-
-#, fuzzy
-#~ msgid "invalid addressing mode"
-#~ msgstr "ogiltig kod"
-
-#, fuzzy
-#~ msgid "invalid offset in ybase addressing"
-#~ msgstr "ogiltig användning av void-uttryck"
-
-#, fuzzy
-#~ msgid "invalid register in ybase addressing"
-#~ msgstr "ogiltig användning av void-uttryck"
-
-#, fuzzy
-#~ msgid "invalid mode for gen_tst_reg"
-#~ msgstr "ogiltig typ \"void\" för new"
-
-#, fuzzy
-#~ msgid "Pass parameters in registers (default)"
-#~ msgstr "Skicka argument i register"
-
-#, fuzzy
-#~ msgid "Don't pass parameters in registers"
-#~ msgstr "Skicka argument i register"
-
-#, fuzzy
-#~ msgid "Generate code for near calls"
-#~ msgstr "Generera kod för Intel as"
-
-#, fuzzy
-#~ msgid "Don't generate code for near calls"
-#~ msgstr "Generera kod för Intel as"
-
-#, fuzzy
-#~ msgid "Generate code for near jumps"
-#~ msgstr "Generera kod för Intel as"
-
-#, fuzzy
-#~ msgid "Don't generate code for near jumps"
-#~ msgstr "Generera kod för Intel as"
-
-#, fuzzy
-#~ msgid "Generate code for a bit-manipulation unit"
-#~ msgstr "Generera kod för \"big endian\""
-
-#, fuzzy
-#~ msgid "Don't generate code for a bit-manipulation unit"
-#~ msgstr "Generera kod för \"big endian\""
-
-#, fuzzy
-#~ msgid "Generate code for memory map1"
-#~ msgstr "Generera kod för c1"
-
-#, fuzzy
-#~ msgid "Generate code for memory map2"
-#~ msgstr "Generera kod för c2"
-
-#, fuzzy
-#~ msgid "Generate code for memory map3"
-#~ msgstr "Genrera kod för C300"
-
-#, fuzzy
-#~ msgid "Generate code for memory map4"
-#~ msgstr "Generera kod för C400"
-
-#, fuzzy
-#~ msgid "Don't let reg. allocator use ybase registers"
-#~ msgstr "Använd inte alternativa registernamn."
-
-#, fuzzy
-#~ msgid "Specify alternate name for text section"
-#~ msgstr "Ange namnet på målprocessorn"
-
-#, fuzzy
-#~ msgid "Specify alternate name for data section"
-#~ msgstr "Ange namnet på målprocessorn"
-
-#, fuzzy
-#~ msgid "profiling not implemented yet"
-#~ msgstr "Profilering är inte implementerat ännu."
-
-#, fuzzy
-#~ msgid "trampolines not yet implemented"
-#~ msgstr "Profilering är inte implementerat ännu."
-
-#~ msgid "Generate code the unix assembler can handle"
-#~ msgstr "Genrerar kod som unix assemblatorn kan hantera"
-
-#~ msgid "Generate code an embedded assembler can handle"
-#~ msgstr "Generera kod en inbäddad assemblator kan hantera"
-
-#, fuzzy
-#~ msgid "fr30_print_operand: invalid operand to %%A code"
-#~ msgstr "ogiltig operand för %V"
-
-#, fuzzy
-#~ msgid "-ms2600 is used without -ms"
-#~ msgstr "-ms2600 används utan -ms."
-
-#~ msgid "Generate H8/S code"
-#~ msgstr "Generera H8/S-kod"
-
-#~ msgid "Do not generate H8/S code"
-#~ msgstr "Generera inte H8/S-kod"
-
-#~ msgid "Generate H8/S2600 code"
-#~ msgstr "Generera kod för H8/S2600"
-
-#~ msgid "Do not generate H8/S2600 code"
-#~ msgstr "Generera inte kod för H8/S2600"
-
-#~ msgid "Make integers 32 bits wide"
-#~ msgstr "Gör heltal 32 bitar stora"
-
-#~ msgid "Use registers for argument passing"
-#~ msgstr "Använd register för argumentskickning"
-
-#~ msgid "Do not use registers for argument passing"
-#~ msgstr "Använd inte register för argumentskickning"
-
-#~ msgid "Generate H8/300H code"
-#~ msgstr "Generera H8/300H-kod"
-
-#~ msgid "Do not generate H8/300H code"
-#~ msgstr "Generera inte H8/300H-kod"
-
-#, fuzzy
-#~ msgid "bad value (%s) for -masm= switch"
-#~ msgstr "ogiltigt värde (%s) till flagga %s"
-
-#, fuzzy
-#~ msgid "code model `%s' not supported in the %s bit mode"
-#~ msgstr "\"%s\" stöds inte av %s"
-
-#, fuzzy
-#~ msgid "code model `large' not supported yet"
-#~ msgstr "\"%s\" stöds inte av %s"
-
-#, fuzzy
-#~ msgid "SSE instruction set disabled, using 387 arithmetics"
-#~ msgstr "pekare till funktion använd med aritmetik"
-
-#, fuzzy
-#~ msgid "387 instruction set disabled, using SSE arithmetics"
-#~ msgstr "pekare till funktion använd med aritmetik"
-
-#, fuzzy
-#~ msgid "bad value (%s) for -mfpmath= switch"
-#~ msgstr "ogiltigt värde (%s) till flagga -mcpu"
-
-#, fuzzy
-#~ msgid "`%s' attribute requires an integer constant argument"
-#~ msgstr "tre \"l\"-suffix på heltalskonstant"
-
-#, fuzzy
-#~ msgid "argument to `%s' attribute larger than %d"
-#~ msgstr "kan inte sätta attributet \"%s\" efter definitionen"
-
-#, fuzzy
-#~ msgid "invalid operand code `%c'"
-#~ msgstr "ogiltig operand för %V"
-
-#, fuzzy
-#~ msgid "unknown insn mode"
-#~ msgstr "okänt maskinläge `%s'"
-
-#, fuzzy
-#~ msgid "`%s' attribute only applies to variables"
-#~ msgstr "attributet \"%s\" är inte applicerbart på typer"
-
-#, fuzzy
-#~ msgid "`%s' declared as both exported to and imported from a DLL"
-#~ msgstr "\"%s\" är deklarerad både som exporterad till och importerad från en DLL."
-
-#~ msgid "Use the Cygwin interface"
-#~ msgstr "Använd Cygwin-interfacet"
-
-#~ msgid "Use the Mingw32 interface"
-#~ msgstr "Använd Mingw32-interfacet"
-
-#~ msgid "Create GUI application"
-#~ msgstr "Skapa GUI-applikation"
-
-#~ msgid "Create console application"
-#~ msgstr "Skapa konsollapplikation"
-
-#~ msgid "Generate code for a DLL"
-#~ msgstr "Generera kod för en DLL"
-
-#~ msgid "Ignore dllimport for functions"
-#~ msgstr "Ignorera dllimport för funktioner"
-
-#~ msgid "Warn when a function arg is a structure"
-#~ msgstr "Varna när ett funktionsargument är en struktur"
-
-#~ msgid "Use IEEE math for fp comparisons"
-#~ msgstr "Använd IEEE matematik för flyttaljämförelser"
-
-#~ msgid "Do not use IEEE math for fp comparisons"
-#~ msgstr "Använd inte IEEE matematik för flyttaljämförelser"
-
-#~ msgid "Do not generate sin, cos, sqrt for FPU"
-#~ msgstr "Generera inte sin, cos, sqrt för FPU"
-
-#~ msgid "Generate sin, cos, sqrt for FPU"
-#~ msgstr "Generera sin, cos, sqrt för FPU"
-
-#, fuzzy
-#~ msgid "Support MMX built-in functions"
-#~ msgstr "Stöd inbyggda funktioner med MMX"
-
-#, fuzzy
-#~ msgid "Do not support MMX built-in functions"
-#~ msgstr "Stöd inte inbyggda funktioner med MMX"
-
-#, fuzzy
-#~ msgid "Support 3DNow! built-in functions"
-#~ msgstr "döljer inbyggd funktion \"%s\""
-
-#, fuzzy
-#~ msgid "Do not support 3DNow! built-in functions"
-#~ msgstr "Stöd inte inbyggda funktioner med MMX"
-
-#, fuzzy
-#~ msgid "Support MMX and SSE built-in functions and code generation"
-#~ msgstr "Stöd inbyggda funktioner med MMX och SSE"
-
-#, fuzzy
-#~ msgid "Do not support MMX and SSE built-in functions and code generation"
-#~ msgstr "Stöd inte inbyggda funktioner med MMX och SSE"
-
-#, fuzzy
-#~ msgid "Support MMX, SSE and SSE2 built-in functions and code generation"
-#~ msgstr "Stöd inbyggda funktioner med MMX och SSE"
-
-#, fuzzy
-#~ msgid "Do not support MMX, SSE and SSE2 built-in functions and code generation"
-#~ msgstr "Stöd inte inbyggda funktioner med MMX och SSE"
-
-#, fuzzy
-#~ msgid "sizeof(long double) is 16"
-#~ msgstr "sizeof(long double) är 16."
-
-#, fuzzy
-#~ msgid "sizeof(long double) is 12"
-#~ msgstr "sizeof(long double) är 12."
-
-#, fuzzy
-#~ msgid "Generate 64bit x86-64 code"
-#~ msgstr "Generera H8/S-kod"
-
-#, fuzzy
-#~ msgid "Generate 32bit i386 code"
-#~ msgstr "Generera \"big endian\"-kod."
-
-#, fuzzy
-#~ msgid "Do not use red-zone in the x86-64 code"
-#~ msgstr "Generera inte H8/S-kod"
-
-#~ msgid "Schedule code for given CPU"
-#~ msgstr "Schemalägg kod för en given CPU"
-
-#, fuzzy
-#~ msgid "Generate floating point mathematics using given instruction set"
-#~ msgstr "Använd flyttalsinstruktioner i hårdvara"
-
-#~ msgid "Generate code for given CPU"
-#~ msgstr "Generera kod för en given CPU"
-
-#~ msgid "Number of registers used to pass integer arguments"
-#~ msgstr "Antal register för att skicka heltalsargument"
-
-#~ msgid "Loop code aligned to this power of 2"
-#~ msgstr "Loop-kod justeras till denna 2-potens"
-
-#~ msgid "Jump targets are aligned to this power of 2"
-#~ msgstr "Hoppmål justeras till denna 2-potens"
-
-#~ msgid "Function starts are aligned to this power of 2"
-#~ msgstr "Funktionsbörjan justeras till denna 2-potens"
-
-#~ msgid "Attempt to keep stack aligned to this power of 2"
-#~ msgstr "Försök håll stacken justerad till denna 2-potens"
-
-#~ msgid "Branches are this expensive (1-5, arbitrary units)"
-#~ msgstr "Hopp är dyra (1-5, godtyckliga enheter)"
-
-#, fuzzy
-#~ msgid "Use given assembler dialect"
-#~ msgstr "Använd assemblersyntax för DEC"
-
-#~ msgid "Profiling uses mcount"
-#~ msgstr "Profilering använder mcount"
-
-#~ msgid "Emit half-PIC code"
-#~ msgstr "Skapa half-PIC-kod"
-
-#~ msgid "Emit ELF object code"
-#~ msgstr "Skapa ELF-objektkod"
-
-#~ msgid "Emit ROSE object code"
-#~ msgstr "Skapa ROSE-objektkod"
-
-#~ msgid "Symbols have a leading underscore"
-#~ msgstr "Symboler startar med en understrykning"
-
-#~ msgid "Generate ELF output"
-#~ msgstr "Generera ELF-utdata"
-
-#, fuzzy
-#~ msgid "environment variable DJGPP not defined"
-#~ msgstr "Omgivningsvariabel DJGPP är inte definierad."
-
-#, fuzzy
-#~ msgid "environment variable DJGPP points to missing file '%s'"
-#~ msgstr "Omgivningsvariabel DJGPP pekar på fil \"%s\" som saknas"
-
-#, fuzzy
-#~ msgid "environment variable DJGPP points to corrupt file '%s'"
-#~ msgstr "Omgivningsvariabel DJGPP pekar på fil \"%s\" som är trasig"
-
-#~ msgid "Generate code which uses the FPU"
-#~ msgstr "Generera kod som använder FPU"
-
-#~ msgid "Do not generate code which uses the FPU"
-#~ msgstr "Genrera inte kod som använder FPU"
-
-#~ msgid "sorry, not implemented: #pragma align NAME=SIZE"
-#~ msgstr "ledsen, inte implementerat: #pragma align NAMN=STORLEK"
-
-#~ msgid "sorry, not implemented: #pragma noalign NAME"
-#~ msgstr "ledsen, inte implementerat: #pragma noalign NAMN"
-
-#~ msgid "Generate SA code"
-#~ msgstr "Generera SA-kod"
-
-#~ msgid "Generate SB code"
-#~ msgstr "Generera SB-kod"
-
-#~ msgid "Generate KA code"
-#~ msgstr "Generera KA-kod"
-
-#~ msgid "Generate KB code"
-#~ msgstr "Generera KB-kod"
-
-#~ msgid "Generate JA code"
-#~ msgstr "Generera JA-kod"
-
-#~ msgid "Generate JD code"
-#~ msgstr "Generera JD-kod"
-
-#~ msgid "Generate JF code"
-#~ msgstr "Generera JF-kod"
-
-#~ msgid "generate RP code"
-#~ msgstr "Generera RP-kod"
-
-#~ msgid "Generate MC code"
-#~ msgstr "Generera MC-kod"
-
-#~ msgid "Generate CA code"
-#~ msgstr "Generera CA-kod"
-
-#~ msgid "Generate CF code"
-#~ msgstr "Generera CF-kod"
-
-#~ msgid "Perform tail call optimization"
-#~ msgstr "Utför optimering för svansrekursion"
-
-#~ msgid "Do not perform tail call optimization"
-#~ msgstr "Utför inte optimering för svansrekursion"
-
-#~ msgid "Use 64 bit long doubles"
-#~ msgstr "Använd 64 bits long double"
-
-#~ msgid "iC2.0 and iC3.0 are incompatible - using iC3.0"
-#~ msgstr "iC2.0 och iC3.0 är imkompatible - använder iC3.0"
-
-#~ msgid "%s-%s is an empty range"
-#~ msgstr "%s-%s är ett tomt intervall"
-
-#~ msgid "Generate big endian code"
-#~ msgstr "Generera \"big endian\"-kod."
-
-#~ msgid "Generate little endian code"
-#~ msgstr "Generera \"little endian\"-kod."
-
-#~ msgid "Generate code for GNU as"
-#~ msgstr "Generera kod för GNU as"
-
-#~ msgid "Generate code for Intel as"
-#~ msgstr "Generera kod för Intel as"
-
-#~ msgid "Generate code for GNU ld"
-#~ msgstr "Generera kod för GNU ld"
-
-#~ msgid "Generate code for Intel ld"
-#~ msgstr "Generera kod för Intel ld"
-
-#, fuzzy
-#~ msgid "invalid argument of `%s' attribute"
-#~ msgstr "ogiltigt typargument till \"%s\""
-
-#, fuzzy
-#~ msgid "invalid operand to %%s code"
-#~ msgstr "ogiltig operand för %R"
-
-#, fuzzy
-#~ msgid "invalid operand to %%p code"
-#~ msgstr "ogiltig operand för %R"
-
-#, fuzzy
-#~ msgid "invalid operand to %%T/%%B code"
-#~ msgstr "ogiltig operand för %H/%L"
-
-#, fuzzy
-#~ msgid "invalid operand to %%N code"
-#~ msgstr "ogiltig operand för %R"
-
-#, fuzzy
-#~ msgid "lo_sum not of register"
-#~ msgstr "Skicka argument i register"
-
-#~ msgid "Only issue one instruction per cycle"
-#~ msgstr "Lägg bara ut en instruktion per cykel"
-
-#~ msgid "Prefer branches over conditional execution"
-#~ msgstr "Föredra hopp framför villkorlig körning"
-
-#~ msgid "Code size: small, medium or large"
-#~ msgstr "Kodstorlek: small, medium, eller large"
-
-#~ msgid "Small data area: none, sdata, use"
-#~ msgstr "Litet dataområde: none, sdata, use"
-
-#, fuzzy
-#~ msgid "invalid register in the move instruction"
-#~ msgstr "Använd inte divisionsinstruktionen"
-
-#, fuzzy
-#~ msgid "invalid operand in the instruction"
-#~ msgstr "ogiltig operand för %V"
-
-#, fuzzy
-#~ msgid "invalid register in the instruction"
-#~ msgstr "ogiltigt flagga \"%s\" i line-direktiv"
-
-#, fuzzy
-#~ msgid "invalid rotate insn"
-#~ msgstr "ogiltigt format på #line"
-
-#, fuzzy
-#~ msgid "Generate code for a 68020"
-#~ msgstr "Generera kod för c2"
-
-#, fuzzy
-#~ msgid "Generate code for a 68000"
-#~ msgstr "Generera kod för en DLL"
-
-#, fuzzy
-#~ msgid "Use the bit-field instructions"
-#~ msgstr "Använd bitfältsinstruktioner"
-
-#, fuzzy
-#~ msgid "Do not use the bit-field instructions"
-#~ msgstr "Använd inte bitfältsinstruktioner"
-
-#, fuzzy
-#~ msgid "Generate code for a Sun FPA"
-#~ msgstr "Generera kod för en given CPU"
-
-#, fuzzy
-#~ msgid "Do not generate code for a Sun FPA"
-#~ msgstr "Genrera inte kod som använder FPU"
-
-#, fuzzy
-#~ msgid "Generate code for a Sun Sky board"
-#~ msgstr "Generera kod för en DLL"
-
-#, fuzzy
-#~ msgid "Do not use Sky linkage convention"
-#~ msgstr "Använd inte divisionsinstruktionen"
-
-#, fuzzy
-#~ msgid "Generate code for a 68881"
-#~ msgstr "Generera kod för c1"
-
-#, fuzzy
-#~ msgid "Generate code for a 68040, without any new instructions"
-#~ msgstr "Generera kod för \"little endian\""
-
-#, fuzzy
-#~ msgid "Generate code for a 68060, without any new instructions"
-#~ msgstr "Generera kod för \"little endian\""
-
-#, fuzzy
-#~ msgid "Generate code for a 68030"
-#~ msgstr "Generera kod för en DLL"
-
-#, fuzzy
-#~ msgid "Generate code for a 68040"
-#~ msgstr "Generera kod för 11/40"
-
-#, fuzzy
-#~ msgid "Generate code for a 68060"
-#~ msgstr "Generera kod för en DLL"
-
-#, fuzzy
-#~ msgid "Generate code for a 520X"
-#~ msgstr "Generera kod för c2"
-
-#, fuzzy
-#~ msgid "Generate code for a 68851"
-#~ msgstr "Generera kod för c1"
-
-#, fuzzy
-#~ msgid "Do no generate code for a 68851"
-#~ msgstr "Generera kod för c1"
-
-#, fuzzy
-#~ msgid "Generate code for a 68302"
-#~ msgstr "Generera kod för c32"
-
-#, fuzzy
-#~ msgid "Generate code for a 68332"
-#~ msgstr "Generera kod för c32"
-
-#, fuzzy
-#~ msgid "Generate code for a cpu32"
-#~ msgstr "Generera kod för c32"
-
-#, fuzzy
-#~ msgid "Generate pc-relative code"
-#~ msgstr "Generera SA-kod"
-
-#, fuzzy
-#~ msgid "Use unaligned memory references"
-#~ msgstr "Använd stor minnesmodell"
-
-#, fuzzy
-#~ msgid "internal gcc monitor: short-branch(%x)"
-#~ msgstr "Intern gcc monitor: short-branch(%x)"
-
-#, fuzzy
-#~ msgid "invalid %%x/X value"
-#~ msgstr "ogiltigt värde %%B"
-
-#, fuzzy
-#~ msgid "invalid %%o value"
-#~ msgstr "ogiltigt värde %%B"
-
-#, fuzzy
-#~ msgid "invalid %%s/S value"
-#~ msgstr "ogiltigt %%s-värde"
-
-#, fuzzy
-#~ msgid "invalid %%P operand"
-#~ msgstr "ogiltigt %%P-värde"
-
-#~ msgid "invalid %%B value"
-#~ msgstr "ogiltigt värde %%B"
-
-#, fuzzy
-#~ msgid "invalid %%D value"
-#~ msgstr "ogiltigt värde %%B"
-
-#~ msgid "invalid code"
-#~ msgstr "ogiltig kod"
-
-#, fuzzy
-#~ msgid "invalid option `-mshort-data-%s'"
-#~ msgstr "Ogiltig flagga \"%s\""
-
-#, fuzzy
-#~ msgid "invalid option `-mstack-increment=%s'"
-#~ msgstr "Ogiltig flagga \"-mstack-increment=%s\""
-
-#~ msgid "Do not use the divide instruction"
-#~ msgstr "Använd inte divisionsinstruktionen"
-
-#~ msgid "Generate code for the M*Core M340"
-#~ msgstr "Genrera kod för M*Core M340"
-
-#, fuzzy
-#~ msgid "this target does not support the -mabi switch"
-#~ msgstr "ISO C stöder inte formatstorlek i strftime"
-
-#, fuzzy
-#~ msgid "bad value (%s) for -mtune= switch"
-#~ msgstr "ogiltigt värde (%s) till flagga -mcpu"
-
-#, fuzzy
-#~ msgid "invalid option `entry%s'"
-#~ msgstr "Ogiltig flagga \"%s\""
-
-#~ msgid "invalid use of %%d, %%x, or %%X"
-#~ msgstr "ogiltig användning av %%d, %%x eller %%x"
-
-#~ msgid "PRINT_OPERAND_ADDRESS, null pointer"
-#~ msgstr "PRINT_OPERAND_ADDRESS, null-pekare"
-
-# fixme: spola tillbaka är inte perfekt
-#, fuzzy
-#~ msgid "can't rewind temp file"
-#~ msgstr "kan inte spola tillbaka %s"
-
-#, fuzzy
-#~ msgid "can't write to output file"
-#~ msgstr "kan inte skriva till %s"
-
-#, fuzzy
-#~ msgid "can't read from temp file"
-#~ msgstr "kan inte läsa från %s"
-
-#, fuzzy
-#~ msgid "can't close temp file"
-#~ msgstr "kan inte stänga %s"
-
-#~ msgid "Use MIPS as"
-#~ msgstr "Använd GNU as"
-
-#~ msgid "Use GNU as"
-#~ msgstr "Använd GNU as"
-
-#~ msgid "Use big-endian byte order"
-#~ msgstr "Använd \"big endian\" byteordning"
-
-#~ msgid "Use little-endian byte order"
-#~ msgstr "Använd \"little endian\" byteordning"
-
-#~ msgid "Optimize for 3900"
-#~ msgstr "Optimera för 3900"
-
-#~ msgid "Optimize for 4650"
-#~ msgstr "Optimera för 4650"
-
-#~ msgid "Trap on integer divide by zero"
-#~ msgstr "Fånga heltalsdivision med noll"
-
-#~ msgid "Don't trap on integer divide by zero"
-#~ msgstr "Fånga inte heltalsdivision med noll"
-
-#~ msgid "Trap on integer divide overflow"
-#~ msgstr "Fånga spill vid heltalsdivsion"
-
-#~ msgid "Don't trap on integer divide overflow"
-#~ msgstr "Fånga inte spill vid heltalsdivision"
-
-#, fuzzy
-#~ msgid "Don't call any cache flush functions"
-#~ msgstr "Inga anrop i funktion %s\n"
-
-#, fuzzy
-#~ msgid "-f%s not supported: ignored"
-#~ msgstr "\"%s\" stöds inte av %s"
-
-#, fuzzy
-#~ msgid "MMIX Internal: This is not a constant:"
-#~ msgstr "fältinitierare är ej konstant"
-
-#, fuzzy
-#~ msgid "Set start-address of the program"
-#~ msgstr "tar adress till något temporärt"
-
-#, fuzzy
-#~ msgid "Use register stack for parameters and return value"
-#~ msgstr "Använd register för argumentskickning"
-
-#, fuzzy
-#~ msgid "Use epsilon-respecting floating point compare instructions"
-#~ msgstr "Använd flyttalsinstruktioner i hårdvara"
-
-#~ msgid "Optimize for 32532 cpu"
-#~ msgstr "Optimera för cpu 32532"
-
-#~ msgid "Optimize for 32332 cpu"
-#~ msgstr "Optimera för cpu 32332"
-
-#~ msgid "Optimize for 32032"
-#~ msgstr "Optimera för cpu 32032"
-
-#, fuzzy
-#~ msgid "Do not use bit-field instructions"
-#~ msgstr "Använd inte bitfältsinstruktioner"
-
-#, fuzzy
-#~ msgid "Use bit-field instructions"
-#~ msgstr "Använd bitfältsinstruktioner"
-
-#~ msgid "32381 fpu"
-#~ msgstr "fpu 32381"
-
-#~ msgid "-g is only supported when using GAS on this processor,"
-#~ msgstr "-g stöds bara när man använder GAS på denna processor,"
-
-#, fuzzy
-#~ msgid "-g option disabled"
-#~ msgstr "flaggan -g är avslagen."
-
-#~ msgid "Generate code for an 11/40"
-#~ msgstr "Generera kod för 11/40"
-
-#~ msgid "Generate code for an 11/45"
-#~ msgstr "Generera kod för 11/45"
-
-#~ msgid "Generate code for an 11/10"
-#~ msgstr "Generera kod för 11/10"
-
-#~ msgid "Use 32 bit int"
-#~ msgstr "Använd 32 bits int"
-
-#~ msgid "Use 16 bit int"
-#~ msgstr "Använd 16 bits int"
-
-#~ msgid "Use 32 bit float"
-#~ msgstr "Använd 32 bits float"
-
-#~ msgid "Use 64 bit float"
-#~ msgstr "Använd 64 bits float"
-
-#~ msgid "Use UNIX assembler syntax"
-#~ msgstr "Använd assemblersyntax för UNIX"
-
-#~ msgid "Use DEC assembler syntax"
-#~ msgstr "Använd assemblersyntax för DEC"
-
-#~ msgid "Generate little endian data"
-#~ msgstr "Generera data som \"little endian\""
-
-#~ msgid "Generate big endian data"
-#~ msgstr "Generera data som \"big endian\""
-
-#~ msgid "-mmultiple is not supported on little endian systems"
-#~ msgstr "-mmultiple stöds inte på \"little endian\"-system"
-
-#~ msgid "-mstring is not supported on little endian systems"
-#~ msgstr "-mstring stöds inte på \"little endian\"-system"
-
-#~ msgid "-fdata-sections not supported on AIX"
-#~ msgstr "-fdata-sections stöds inte för AIX"
-
-#, fuzzy
-#~ msgid "unknown -mdebug-%s switch"
-#~ msgstr "Okänd flagga -mdebug-%s"
-
-#, fuzzy
-#~ msgid "unknown ABI specified: '%s'"
-#~ msgstr "okänt maskinläge `%s'"
-
-#, fuzzy
-#~ msgid "argument 1 of __builtin_altivec_predicate must be a constant"
-#~ msgstr "argumentet till \"__builtin_eh_return_regno\" måste vara konstant"
-
-#, fuzzy
-#~ msgid "argument 1 of __builtin_altivec_predicate is out of range"
-#~ msgstr "argument till \"__builtin_args_info\" är utanför sitt intervall"
-
-#, fuzzy
-#~ msgid "argument 3 of `%s' must be a 2-bit literal"
-#~ msgstr "första argumentet till \"%s\" skall vara \"int\""
-
-#, fuzzy
-#~ msgid "-maix64 and POWER architecture are incompatible"
-#~ msgstr "-fpic och -mapcs-reent är inkompatibla"
-
-#, fuzzy
-#~ msgid "Use AltiVec instructions"
-#~ msgstr "Använd bitfältsinstruktioner"
-
-#, fuzzy
-#~ msgid "Don't use AltiVec instructions"
-#~ msgstr "Använd inte bitfältsinstruktioner"
-
-#, fuzzy
-#~ msgid "Specify size of long double (64 or 128 bits)"
-#~ msgstr "sizeof(long double) är 12."
-
-#, fuzzy
-#~ msgid "Produce little endian code"
-#~ msgstr "Skapa \"little endian\"-kod."
-
-#, fuzzy
-#~ msgid "Produce big endian code"
-#~ msgstr "Skapa \"big endian\"-kod."
-
-#~ msgid "no description yet"
-#~ msgstr "ingen beskriving ännu"
-
-#, fuzzy
-#~ msgid "Use EABI"
-#~ msgstr "Använd EABI."
-
-#, fuzzy
-#~ msgid "Don't use EABI"
-#~ msgstr "Använd inte EABI."
-
-#, fuzzy
-#~ msgid "Use alternate register names"
-#~ msgstr "Använd alternativa registernamn."
-
-#, fuzzy
-#~ msgid "Don't use alternate register names"
-#~ msgstr "Använd inte alternativa registernamn."
-
-#, fuzzy
-#~ msgid "Link with libsim.a, libc.a and sim-crt0.o"
-#~ msgstr "Länka med libsim.a, libc.a och sim-crt0.o."
-
-#, fuzzy
-#~ msgid "Link with libads.a, libc.a and crt0.o"
-#~ msgstr "Länka med libads.a, libc.a och crt0.o."
-
-#, fuzzy
-#~ msgid "Link with libyk.a, libc.a and crt0.o"
-#~ msgstr "Länka med libyk.a, libc.a och crt0.o."
-
-#, fuzzy
-#~ msgid "Link with libmvme.a, libc.a and crt0.o"
-#~ msgstr "Länka med libmvme.a, libc.a och crt0.o."
-
-#~ msgid "Set the PPC_EMB bit in the ELF flags header"
-#~ msgstr "Sätt biten PPC_EMB i ELF:s flaggfält"
-
-#, fuzzy
-#~ msgid "bad value for -mcall-%s"
-#~ msgstr "Felaktigt värde för -mcall-%s"
-
-#, fuzzy
-#~ msgid "bad value for -msdata=%s"
-#~ msgstr "Felaktigt värde för -msdata-%s"
-
-#, fuzzy
-#~ msgid "-mrelocatable and -msdata=%s are incompatible"
-#~ msgstr "-fpic och -mapcs-reent är inkompatibla"
-
-#, fuzzy
-#~ msgid "-f%s and -msdata=%s are incompatible"
-#~ msgstr "-fpic och -mapcs-reent är inkompatibla"
-
-#, fuzzy
-#~ msgid "-msdata=%s and -mcall-%s are incompatible"
-#~ msgstr "-mbsd och -mxopen är inkompatibla"
-
-#, fuzzy
-#~ msgid "-mrelocatable and -mno-minimal-toc are incompatible"
-#~ msgstr "-fpic och -mapcs-reent är inkompatibla"
-
-#, fuzzy
-#~ msgid "-mrelocatable and -mcall-%s are incompatible"
-#~ msgstr "-fpic och -mapcs-reent är inkompatibla"
-
-#, fuzzy
-#~ msgid "-fPIC and -mcall-%s are incompatible"
-#~ msgstr "-fpic och -mapcs-reent är inkompatibla"
-
-#~ msgid "-mcall-aixdesc must be big endian"
-#~ msgstr "-mcall-aixdesc måste vara \"big endian\""
-
-#, fuzzy
-#~ msgid "Don't use bras"
-#~ msgstr "Använd inte EABI."
-
-#, fuzzy
-#~ msgid "__builtin_saveregs not supported by this subtarget"
-#~ msgstr "__builtin_saveregs stöds inte på denna målarkitektur"
-
-#, fuzzy
-#~ msgid "`%s' attribute only applies to interrupt functions"
-#~ msgstr "attributet \"%s\" fungerar bara på funktioner"
-
-#, fuzzy
-#~ msgid "`%s' attribute argument not a string constant"
-#~ msgstr "%s före strängkonstant"
-
-#, fuzzy
-#~ msgid "`%s' attribute argument not an integer constant"
-#~ msgstr "case-etikett reducerar inte till en heltalskonstant"
-
-#, fuzzy
-#~ msgid "Profiling is not supported on this target."
-#~ msgstr "__builtin_saveregs stöds inte på denna målarkitektur"
-
-#, fuzzy
-#~ msgid "invalid %%Y operand"
-#~ msgstr "ogiltig %%-kod"
-
-#, fuzzy
-#~ msgid "invalid %%A operand"
-#~ msgstr "ogiltig %%-kod"
-
-#, fuzzy
-#~ msgid "invalid %%B operand"
-#~ msgstr "ogiltigt värde %%B"
-
-#, fuzzy
-#~ msgid "invalid %%c operand"
-#~ msgstr "ogiltig %%-kod"
-
-#, fuzzy
-#~ msgid "invalid %%C operand"
-#~ msgstr "ogiltigt %%C-värde"
-
-#, fuzzy
-#~ msgid "invalid %%d operand"
-#~ msgstr "ogiltig %%-kod"
-
-#, fuzzy
-#~ msgid "invalid %%D operand"
-#~ msgstr "ogiltig %%-kod"
-
-#, fuzzy
-#~ msgid "invalid %%f operand"
-#~ msgstr "ogiltig %%-kod"
-
-#~ msgid "Use 128 bit long doubles"
-#~ msgstr "Använd 128 bit long double"
-
-#~ msgid "Generate code for big endian"
-#~ msgstr "Generera kod för \"big endian\""
-
-#~ msgid "Generate code for little endian"
-#~ msgstr "Generera kod för \"little endian\""
-
-#~ msgid "Use little-endian byte order for data"
-#~ msgstr "Använd \"little endian\" byteordning för data"
-
-#~ msgid "Pointers are 64-bit"
-#~ msgstr "Pekare är 64-bitars"
-
-#~ msgid "Pointers are 32-bit"
-#~ msgstr "Pekare är 32-bitars"
-
-#~ msgid "Use 32-bit ABI"
-#~ msgstr "Använd 32-bitars ABI"
-
-#~ msgid "Use 64-bit ABI"
-#~ msgstr "Använd 64-bitars ABI"
-
-#, fuzzy
-#~ msgid "cannot use va_start in interrupt function"
-#~ msgstr "kan inte deklarera en statisk funktion i en annan funktion"
-
-#, fuzzy
-#~ msgid "`B' operand is not constant"
-#~ msgstr "fältinitierare är ej konstant"
-
-#, fuzzy
-#~ msgid "`o' operand is not constant"
-#~ msgstr "fältinitierare är ej konstant"
-
-#, fuzzy
-#~ msgid "switch statement of size %lu entries too large"
-#~ msgstr "storleken på variabel \"%s\" är för stor"
-
-#, fuzzy
-#~ msgid "cannot set interrupt attribute: no current function"
-#~ msgstr "Ignorera attributet dllimport för funktioner"
-
-#, fuzzy
-#~ msgid "unrecognized section name \"%s\""
-#~ msgstr "Känner inte igen sektionsnamn \"%s\""
-
-#, fuzzy
-#~ msgid "%s=%s is not numeric"
-#~ msgstr "%s=%s är för stor."
-
-#, fuzzy
-#~ msgid "%s=%s is too large"
-#~ msgstr "%s=%s är för stor."
-
-#~ msgid "Compile for the v850 processor"
-#~ msgstr "Kompilera för processorn v850"
-
-#, fuzzy
-#~ msgid "invalid mask"
-#~ msgstr "ogiltigt #pragma %s"
-
-#, fuzzy
-#~ msgid "invalid address"
-#~ msgstr "ogiltig kod"
-
-#, fuzzy
-#~ msgid "no register in address"
-#~ msgstr "okänt registernamn: %s"
-
-#, fuzzy
-#~ msgid "address offset not a constant"
-#~ msgstr "efterfrågad minnesjustering är inte konstant"
-
-#, fuzzy
-#~ msgid "Do not use the Xtensa code density option"
-#~ msgstr "Använd inte divisionsinstruktionen"
-
-#, fuzzy
-#~ msgid "Do not use the Xtensa MAC16 option"
-#~ msgstr "Använd inte divisionsinstruktionen"
-
-#, fuzzy
-#~ msgid "Do not use the Xtensa MUL16 option"
-#~ msgstr "Använd inte divisionsinstruktionen"
-
-#, fuzzy
-#~ msgid "Do not use the Xtensa MUL32 option"
-#~ msgstr "Använd inte divisionsinstruktionen"
-
-#, fuzzy
-#~ msgid "Do not use the Xtensa NSA option"
-#~ msgstr "Använd inte divisionsinstruktionen"
-
-#, fuzzy
-#~ msgid "Do not use the Xtensa MIN/MAX option"
-#~ msgstr "Använd inte divisionsinstruktionen"
-
-#, fuzzy
-#~ msgid "Do not use the Xtensa SEXT option"
-#~ msgstr "Använd inte divisionsinstruktionen"
-
-#, fuzzy
-#~ msgid "Do not use the Xtensa boolean register option"
-#~ msgstr "Använd inte divisionsinstruktionen"
-
-#, fuzzy
-#~ msgid "Use the Xtensa floating-point unit"
-#~ msgstr "Använd mjukvaruflytttal"
-
-#, fuzzy
-#~ msgid "%s %D(%T) <built-in>"
-#~ msgstr "<inbyggd>"
-
-#, fuzzy
-#~ msgid "%s %+#D%s"
-#~ msgstr "%s: %s"
-
-#, fuzzy
-#~ msgid "conversion from `%T' to `%T' is ambiguous"
-#~ msgstr "%s: flaggan \"%s\" är tvetydig\n"
-
-#, fuzzy
-#~ msgid "call of `(%T) (%A)' is ambiguous"
-#~ msgstr "%s: flaggan \"%s\" är tvetydig\n"
-
-#, fuzzy
-#~ msgid "%s for `%T %s' operator"
-#~ msgstr "%s före symbolen \"%s\""
-
-#, fuzzy
-#~ msgid "%s for `%T %s %T' operator"
-#~ msgstr "%s före symbolen \"%s\""
-
-#, fuzzy
-#~ msgid "%s for `%s %T' operator"
-#~ msgstr "%s före symbolen \"%s\""
-
-#~ msgid "ISO C++ forbids omitting the middle term of a ?: expression"
-#~ msgstr "ISO C++ förbjuder uteslutande av mittersta termen i ett ?: uttryck"
-
-#, fuzzy
-#~ msgid "enumeral mismatch in conditional expression: `%T' vs `%T'"
-#~ msgstr "typfel i villkorsuttryck"
-
-#, fuzzy
-#~ msgid "enumeral and non-enumeral type in conditional expression"
-#~ msgstr "typ signed och unsigned i villkorsuttryck"
-
-#, fuzzy
-#~ msgid "`%D' must be declared before use"
-#~ msgstr "\"%s\" är tidigare deklarerad här"
-
-#, fuzzy
-#~ msgid "invalid conversion from `%T' to `%T'"
-#~ msgstr "konvertering från NaN till int"
-
-#, fuzzy
-#~ msgid " initializing argument %P of `%D'"
-#~ msgstr "ogiltigt typargument till \"%s\""
-
-#, fuzzy
-#~ msgid "could not find class$ field in java interface type `%T'"
-#~ msgstr "ingen superklass deklarerad i interface för \"%s\""
-
-#, fuzzy
-#~ msgid " in call to `%D'"
-#~ msgstr "kan inte inline:a anrop till \"%s\""
-
-#, fuzzy
-#~ msgid " for conversion from `%T' to `%T'"
-#~ msgstr "konvertering från NaN till int"
-
-#, fuzzy
-#~ msgid "duplicate enum value `%D'"
-#~ msgstr "upprepat case-värde"
-
-#, fuzzy
-#~ msgid "duplicate nested type `%D'"
-#~ msgstr "upprepning av medlem \"%s\""
-
-#, fuzzy
-#~ msgid "duplicate member `%D'"
-#~ msgstr "upprepning av medlem \"%s\""
-
-#, fuzzy
-#~ msgid "`%D' invalid in `%T'"
-#~ msgstr "Ogiltig flagga \"%s\""
-
-#, fuzzy
-#~ msgid "`%D' invalid in `%#T'"
-#~ msgstr "Ogiltig flagga \"%s\""
-
-#, fuzzy
-#~ msgid "redefinition of `%#T'"
-#~ msgstr "omdefiniering av \"%s\""
-
-#, fuzzy
-#~ msgid "previous definition of `%#T'"
-#~ msgstr "omdefiniering av \"%s\""
-
-#, fuzzy
-#~ msgid "bit-field `%#D' with non-integral type"
-#~ msgstr "bitfält \"%s\" har en icke godkänd typ"
-
-#, fuzzy
-#~ msgid "bit-field `%D' width not an integer constant"
-#~ msgstr "tre \"l\"-suffix på heltalskonstant"
-
-#, fuzzy
-#~ msgid "negative width in bit-field `%D'"
-#~ msgstr "negativ storlek i bitfält \"%s\""
-
-#, fuzzy
-#~ msgid "zero width for bit-field `%D'"
-#~ msgstr "Storleken noll på bitfält \"%s\""
-
-#, fuzzy
-#~ msgid "width of `%D' exceeds its type"
-#~ msgstr "storleken på \"%s\" är större än sin typ"
-
-#, fuzzy
-#~ msgid "field `%D' invalidly declared function type"
-#~ msgstr "fält \"%s\" deklarerad som en funktion"
-
-#, fuzzy
-#~ msgid "field `%D' invalidly declared method type"
-#~ msgstr "bitfält \"%s\" har en icke godkänd typ"
-
-#, fuzzy
-#~ msgid "field `%D' invalidly declared offset type"
-#~ msgstr "bitfält \"%s\" har en icke godkänd typ"
-
-#, fuzzy
-#~ msgid "field `%D' declared static in union"
-#~ msgstr "fält \"%s\" deklarerad som en funktion"
-
-#, fuzzy
-#~ msgid "initializer specified for non-virtual method `%D'"
-#~ msgstr "argumentformat angivet för icke-funktion \"%s\""
-
-#~ msgid "language string `\"%s\"' not recognized"
-#~ msgstr "språksträng `\"%s\"' känns inte igen"
-
-#, fuzzy
-#~ msgid "assuming pointer to member `%D'"
-#~ msgstr "upprepning av medlem \"%s\""
-
-#~ msgid "not enough type information"
-#~ msgstr "inte tillräcklig typinformation"
-
-#, fuzzy
-#~ msgid "argument of type `%T' does not match `%T'"
-#~ msgstr "argument \"%s\" matchar inte prototypen"
-
-#~ msgid "invalid operation on uninstantiated type"
-#~ msgstr "ogiltig operation på oinstansierad typ"
-
-#, fuzzy
-#~ msgid "declaration of `%#D'"
-#~ msgstr "omdeklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "can't convert from incomplete type `%T' to `%T'"
-#~ msgstr "kan inte konvertera till en pekartyp"
-
-#, fuzzy
-#~ msgid "converting from `%T' to `%T'"
-#~ msgstr "konvertering från NaN till int"
-
-#, fuzzy
-#~ msgid "cannot convert `%E' from type `%T' to type `%T'"
-#~ msgstr "kan inte konvertera till en pekartyp"
-
-#, fuzzy
-#~ msgid "cannot convert type `%T' to type `%T'"
-#~ msgstr "kan inte konvertera till en pekartyp"
-
-#, fuzzy
-#~ msgid "conversion from `%#T' to `%#T'"
-#~ msgstr "konvertering från NaN till int"
-
-#, fuzzy
-#~ msgid "conversion from `%T' to non-scalar type `%T' requested"
-#~ msgstr "konvertering till icke-skalär typ begärd"
-
-#, fuzzy
-#~ msgid "%s cannot resolve address of overloaded function"
-#~ msgstr "Programflödet når slutet på en icke-void-funktion"
-
-#, fuzzy
-#~ msgid "conflicts with previous declaration `%#D'"
-#~ msgstr "sektion \"%s\" står i konflikt med tidigare deklaration"
-
-#, fuzzy
-#~ msgid "label `%D' used but not defined"
-#~ msgstr "etikett \"%s\" använd men inte definierad"
-
-#, fuzzy
-#~ msgid "label `%D' defined but not used"
-#~ msgstr "etikett \"%s\" definierad men inte använd"
-
-#, fuzzy
-#~ msgid "previous declaration of `%D'"
-#~ msgstr "tidigare deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "shadowing %s function `%#D'"
-#~ msgstr "döljer biblioteksfunktion \"%s\""
-
-#, fuzzy
-#~ msgid "library function `%#D' redeclared as non-function `%#D'"
-#~ msgstr "biblioteksfunktion \"%s\" deklarerad som icke-funktion"
-
-#, fuzzy
-#~ msgid "conflicts with built-in declaration `%#D'"
-#~ msgstr "motstridande deklarationer av \"%s\""
-
-#, fuzzy
-#~ msgid "new declaration `%#D'"
-#~ msgstr "omdeklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "ambiguates built-in declaration `%#D'"
-#~ msgstr "dubbel deklaration av etikett \"%s\""
-
-#, fuzzy
-#~ msgid "`%#D' redeclared as different kind of symbol"
-#~ msgstr "\"%s\" omdeklarerad som en annan sorts symbol"
-
-#, fuzzy
-#~ msgid "previous declaration of `%#D'"
-#~ msgstr "tidigare deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "declaration of template `%#D'"
-#~ msgstr "omdeklaration av \"enum %s\""
-
-#, fuzzy
-#~ msgid "ambiguates old declaration `%#D'"
-#~ msgstr "dubbel deklaration av etikett \"%s\""
-
-#, fuzzy
-#~ msgid "declaration of C function `%#D' conflicts with"
-#~ msgstr "implicit deklaration av funktion \"%s\""
-
-#, fuzzy
-#~ msgid "previous declaration `%#D' here"
-#~ msgstr "tidigare deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "conflicting types for `%#D'"
-#~ msgstr "motstridiga typer på \"%s\""
-
-#, fuzzy
-#~ msgid "previous declaration as `%#D'"
-#~ msgstr "tidigare deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "`%#D' previously defined here"
-#~ msgstr "\"%s\" definierades tidigare här"
-
-#, fuzzy
-#~ msgid "`%#D' previously declared here"
-#~ msgstr "\"%s\" är tidigare deklarerad här"
-
-#, fuzzy
-#~ msgid "prototype for `%#D'"
-#~ msgstr "prototyp för \"%s\" följer"
-
-#, fuzzy
-#~ msgid "follows non-prototype definition here"
-#~ msgstr "icke-prototypdefinition here"
-
-#, fuzzy
-#~ msgid "previous declaration of `%#D' with %L linkage"
-#~ msgstr "tidigare deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "conflicts with new declaration with %L linkage"
-#~ msgstr "motstridande deklarationer av \"%s\""
-
-#, fuzzy
-#~ msgid "after previous specification in `%#D'"
-#~ msgstr "tidigare deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "`%#D' was used before it was declared inline"
-#~ msgstr "\"%s\" användes utan någon prototyp innan sin definition"
-
-#, fuzzy
-#~ msgid "previous non-inline declaration here"
-#~ msgstr "tidigare implicit deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "redundant redeclaration of `%D' in same scope"
-#~ msgstr "redundant omdeklaration av \"%s\" i samma scope"
-
-#, fuzzy
-#~ msgid "declaration of `%F' throws different exceptions"
-#~ msgstr "deklaration av \"%s\" som ett fält med funktioner"
-
-#, fuzzy
-#~ msgid "than previous declaration `%F'"
-#~ msgstr "ingen tidigare deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "`%#D' used prior to declaration"
-#~ msgstr "\"%s\" är använd innan sin deklaration"
-
-#, fuzzy
-#~ msgid "redeclaration of `wchar_t' as `%T'"
-#~ msgstr "omdeklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "invalid redeclaration of `%D'"
-#~ msgstr "omdeklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "previous external decl of `%#D'"
-#~ msgstr "föregående externa dekl. av \"%s\""
-
-#, fuzzy
-#~ msgid "`%D' was previously implicitly declared to return `int'"
-#~ msgstr "\"%s\" deklarerades tidigare implicit att returnera \"int\""
-
-#, fuzzy
-#~ msgid "extern declaration of `%#D' doesn't match"
-#~ msgstr "extern deklaration av \"%s\" matchar inte den globala"
-
-#, fuzzy
-#~ msgid "global declaration `%#D'"
-#~ msgstr "dubbel deklaration av etikett \"%s\""
-
-#, fuzzy
-#~ msgid "declaration of `%#D' shadows a parameter"
-#~ msgstr "deklaration av \"%s\" döljer en parameter"
-
-#, fuzzy
-#~ msgid "`%#D' hides constructor for `%#T'"
-#~ msgstr "destruerare behövs för \"%#D\""
-
-#, fuzzy
-#~ msgid "`%#D' conflicts with previous using declaration `%#D'"
-#~ msgstr "sektion \"%s\" står i konflikt med tidigare deklaration"
-
-#, fuzzy
-#~ msgid "previous non-function declaration `%#D'"
-#~ msgstr "tidigare deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "conflicts with function declaration `%#D'"
-#~ msgstr "motstridande deklarationer av \"%s\""
-
-#, fuzzy
-#~ msgid "implicit declaration of function `%#D'"
-#~ msgstr "implicit deklaration av funktion \"%s\""
-
-#, fuzzy
-#~ msgid "jump to label `%D'"
-#~ msgstr "hopp till case-etikett"
-
-#~ msgid "jump to case label"
-#~ msgstr "hopp till case-etikett"
-
-#, fuzzy
-#~ msgid " crosses initialization of `%#D'"
-#~ msgstr "omdefiniering av \"%s\""
-
-#~ msgid " enters try block"
-#~ msgstr " går in i try-block"
-
-#~ msgid " enters catch block"
-#~ msgstr " går in i catch-block"
-
-#~ msgid " from here"
-#~ msgstr " från här"
-
-#, fuzzy
-#~ msgid " skips initialization of `%#D'"
-#~ msgstr "%s: Vid instansiering av \"%s\":\n"
-
-#, fuzzy
-#~ msgid "duplicate label `%D'"
-#~ msgstr "upprepning av medlem \"%s\""
-
-#, fuzzy
-#~ msgid "case label `%E' not within a switch statement"
-#~ msgstr "case-etikett är inte i en switch-sats"
-
-#, fuzzy
-#~ msgid "invalid use of `%D'"
-#~ msgstr "ogiltigt användande av \"restrict\""
-
-#, fuzzy
-#~ msgid "`%D::%D' is not a template"
-#~ msgstr "användning ab `%s' i mall"
-
-#, fuzzy
-#~ msgid "an anonymous union cannot have function members"
-#~ msgstr "anonym union deklarerad i parameterlista"
-
-#, fuzzy
-#~ msgid "redeclaration of C++ built-in type `%T'"
-#~ msgstr "omdeklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "missing type-name in typedef-declaration"
-#~ msgstr "oanvändbart nyckelord eller typnamn i tom deklaration"
-
-#, fuzzy
-#~ msgid "`%D' can only be specified for functions"
-#~ msgstr "argumentformat angivet för icke-funktion \"%s\""
-
-#, fuzzy
-#~ msgid "`%D' can only be specified for objects and functions"
-#~ msgstr "argumentformat angivet för icke-funktion \"%s\""
-
-#, fuzzy
-#~ msgid "typedef `%D' is initialized"
-#~ msgstr "typedef \"%s\" är initierad"
-
-#, fuzzy
-#~ msgid "function `%#D' is initialized like a variable"
-#~ msgstr "funktion \"%s\" är initierad som en variabel"
-
-#, fuzzy
-#~ msgid "declaration of `%#D' has `extern' and is initialized"
-#~ msgstr "deklaration av \"%s\" är \"extern\" och initierad"
-
-#, fuzzy
-#~ msgid "ISO C++ does not permit `%T::%D' to be defined as `%T::%D'"
-#~ msgstr "ISO C++ tillåter inte \"%s\" i #if"
-
-#, fuzzy
-#~ msgid "duplicate initialization of %D"
-#~ msgstr "initiering"
-
-#, fuzzy
-#~ msgid "declaration of `%#D' outside of class is not definition"
-#~ msgstr "deklaration av \"%s\" som ett fält med funktioner"
-
-#, fuzzy
-#~ msgid "variable `%#D' has initializer but incomplete type"
-#~ msgstr "variabel \"%s\" har initierare men är av inkomplett typ"
-
-#, fuzzy
-#~ msgid "elements of array `%#D' have incomplete type"
-#~ msgstr "elementen i fält \"%s\" har en ofullständig typ"
-
-#, fuzzy
-#~ msgid "aggregate `%#D' has incomplete type and cannot be defined"
-#~ msgstr "parameter \"%s\" har en inkomplett typ"
-
-#, fuzzy
-#~ msgid "`%D' declared as reference but not initialized"
-#~ msgstr "\"%s\" omdeklarerad som en annan sorts symbol"
-
-#, fuzzy
-#~ msgid "ISO C++ forbids use of initializer list to initialize reference `%D'"
-#~ msgstr "ISO C++ förbjuder initiering av new-uttryck med \"=\""
-
-#, fuzzy
-#~ msgid "cannot initialize `%T' from `%T'"
-#~ msgstr "kan inte initiera friend-funktion \"%s\""
-
-#, fuzzy
-#~ msgid "initializer fails to determine size of `%D'"
-#~ msgstr "initierare misslyckas med att bestämma storlek på \"%s\""
-
-#, fuzzy
-#~ msgid "array size missing in `%D'"
-#~ msgstr "fältstorlek saknas i \"%s\""
-
-#, fuzzy
-#~ msgid "zero-size array `%D'"
-#~ msgstr "ISO C förbjuder fält \"%s\" med storlek noll"
-
-#, fuzzy
-#~ msgid "storage size of `%D' isn't known"
-#~ msgstr "lagringsstorlek på \"%s\" är okänd"
-
-#, fuzzy
-#~ msgid "storage size of `%D' isn't constant"
-#~ msgstr "lagringsstorlek på \"%s\" är inte konstant"
-
-#, fuzzy
-#~ msgid "uninitialized const `%D'"
-#~ msgstr "kan inte initiera friend-funktion \"%s\""
-
-#, fuzzy
-#~ msgid "variable-sized object `%D' may not be initialized"
-#~ msgstr "objekt med variabel storlek kan inte initieras"
-
-#, fuzzy
-#~ msgid "`%D' has incomplete type"
-#~ msgstr "\"%s\" har en inkomplett typ"
-
-#~ msgid "assignment (not initialization) in declaration"
-#~ msgstr "tilldelning (inte initieraing) i deklaration"
-
-#, fuzzy
-#~ msgid "cannot initialize `%D' to namespace `%D'"
-#~ msgstr "kan inte initiera friend-funktion \"%s\""
-
-#, fuzzy
-#~ msgid "shadowing previous type declaration of `%#D'"
-#~ msgstr "tidigare deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "multiple initializations given for `%D'"
-#~ msgstr "multiple deklaration av metod \"%s\""
-
-#, fuzzy
-#~ msgid "destructor for alien class `%T' cannot be a member"
-#~ msgstr "destruerare kan inte vara en statisk medlemsfunktion"
-
-#, fuzzy
-#~ msgid "constructor for alien class `%T' cannot be a member"
-#~ msgstr "konstruerare kan inte vara en statisk medlemsfunktion\""
-
-#, fuzzy
-#~ msgid "`%D' declared as an `inline' %s"
-#~ msgstr "variabel \"%s\" deklarerad \"inline\""
-
-#, fuzzy
-#~ msgid "`%D' declared as a friend"
-#~ msgstr "fält \"%s\" deklarerad som en funktion"
-
-#, fuzzy
-#~ msgid "`%D' declared with an exception specification"
-#~ msgstr "\"%s\" är deklarerad som en funktion som returnerar en funktion"
-
-#~ msgid "cannot declare `::main' to be a template"
-#~ msgstr "kan inte deklarera \"::main\" som en mall"
-
-#~ msgid "cannot declare `::main' to be static"
-#~ msgstr "kan inte deklarera \"::main\" som static"
-
-#~ msgid "`main' must return `int'"
-#~ msgstr "\"main\" måste returnera \"int\""
-
-#, fuzzy
-#~ msgid "defining explicit specialization `%D' in friend declaration"
-#~ msgstr "tilldelning (inte initieraing) i deklaration"
-
-#, fuzzy
-#~ msgid "definition of implicitly-declared `%D'"
-#~ msgstr "funktionsdefinition deklarerad som \"auto\""
-
-#, fuzzy
-#~ msgid "ISO C++ forbids in-class initialization of non-const static member `%D'"
-#~ msgstr "ISO C++ förbjuder initiering av new-uttryck med \"=\""
-
-#, fuzzy
-#~ msgid "ISO C++ forbids initialization of member constant `%D' of non-integral type `%T'"
-#~ msgstr "ISO C++ förbjuder initiering av new-uttryck med \"=\""
-
-#, fuzzy
-#~ msgid "size of array `%D' has non-integer type"
-#~ msgstr "storlek på fält \"%s\" är inte av heltalstyp"
-
-#, fuzzy
-#~ msgid "size of array has non-integer type"
-#~ msgstr "storlek på fält \"%s\" är inte av heltalstyp"
-
-#, fuzzy
-#~ msgid "size of array `%D' is negative"
-#~ msgstr "storlek på fält \"%s\" är negativt"
-
-#, fuzzy
-#~ msgid "size of array is negative"
-#~ msgstr "storlek på fält \"%s\" är negativt"
-
-#, fuzzy
-#~ msgid "ISO C++ forbids zero-size array `%D'"
-#~ msgstr "ISO C förbjuder fält \"%s\" med storlek noll"
-
-#, fuzzy
-#~ msgid "ISO C++ forbids zero-size array"
-#~ msgstr "ISO C förbjuder fält \"%s\" med storlek noll"
-
-#, fuzzy
-#~ msgid "size of array `%D' is not an integral constant-expression"
-#~ msgstr "storlek på fält \"%s\" är inte av heltalstyp"
-
-#, fuzzy
-#~ msgid "size of array is not an integral constant-expression"
-#~ msgstr "storlek på fält \"%s\" är inte av heltalstyp"
-
-#, fuzzy
-#~ msgid "ISO C++ forbids variable-size array `%D'"
-#~ msgstr "ISO C89 förbjuder fält \"%s\" med variabel storlek"
-
-#, fuzzy
-#~ msgid "ISO C++ forbids variable-size array"
-#~ msgstr "ISO C89 förbjuder fält \"%s\" med variabel storlek"
-
-#, fuzzy
-#~ msgid "declaration of `%D' as %s"
-#~ msgstr "omdeklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "creating %s"
-#~ msgstr "Skapar %s.\n"
-
-#, fuzzy
-#~ msgid "return type specification for constructor invalid"
-#~ msgstr "funktionskroppen för konstrueraren saknas"
-
-#, fuzzy
-#~ msgid "operator `%T' declared to return `%T'"
-#~ msgstr "parameter \"%s\" deklarerad som void"
-
-#, fuzzy
-#~ msgid "return type specified for `operator %T'"
-#~ msgstr "lagringsklass angiven för parameter \"%s\""
-
-#~ msgid "destructors must be member functions"
-#~ msgstr "destruerare måste vara medlemsfunktioner"
-
-#, fuzzy
-#~ msgid "invalid declarator"
-#~ msgstr "ogiltig #indent"
-
-#, fuzzy
-#~ msgid "`%D' as declarator"
-#~ msgstr "\"%s\" är använd innan sin deklaration"
-
-#, fuzzy
-#~ msgid "declaration of `%D' as non-function"
-#~ msgstr "deklaration av \"%s\" som ett fält med funktioner"
-
-#~ msgid "`bool' is now a keyword"
-#~ msgstr "\"bool\" är numera ett nyckelord"
-
-#, fuzzy
-#~ msgid "multiple declarations `%T' and `%T'"
-#~ msgstr "multiple deklaration av metod \"%s\""
-
-#~ msgid "ISO C++ does not support `long long'"
-#~ msgstr "ISO C++ stödjer inte \"long long\""
-
-#, fuzzy
-#~ msgid "ISO C++ forbids declaration of `%s' with no type"
-#~ msgstr "ISO C förbjuder medlemsdeklarationer utan medlemmar"
-
-#~ msgid "short, signed or unsigned invalid for `%s'"
-#~ msgstr "short, signed eller unsigned är ogiltigt för \"%s\""
-
-#~ msgid "long and short specified together for `%s'"
-#~ msgstr "både long och short angivet för \"%s\""
-
-#~ msgid "signed and unsigned given together for `%s'"
-#~ msgstr "både signed och unsigned angivet för \"%s\""
-
-#, fuzzy
-#~ msgid "size of member `%D' is not constant"
-#~ msgstr "lagringsstorlek på \"%s\" är inte konstant"
-
-#~ msgid "destructor cannot be static member function"
-#~ msgstr "destruerare kan inte vara en statisk medlemsfunktion"
-
-#, fuzzy
-#~ msgid "destructors may not be `%s'"
-#~ msgstr "destruerare behövs för \"%#D\""
-
-#~ msgid "constructor cannot be static member function"
-#~ msgstr "konstruerare kan inte vara en statisk medlemsfunktion\""
-
-#~ msgid "can't initialize friend function `%s'"
-#~ msgstr "kan inte initiera friend-funktion \"%s\""
-
-#, fuzzy
-#~ msgid "can't define friend function `%s' in a local class definition"
-#~ msgstr "kan inte initiera friend-funktion \"%s\""
-
-#, fuzzy
-#~ msgid "destructors may not have parameters"
-#~ msgstr "destruerare måste vara medlemsfunktioner"
-
-#, fuzzy
-#~ msgid "cannot declare pointer to `%#T' member"
-#~ msgstr "kan inte deklarera pekare till referenser"
-
-#~ msgid "invalid type: `void &'"
-#~ msgstr "ogiltig typ: \"void &\""
-
-#~ msgid "function `%s' cannot be declared `mutable'"
-#~ msgstr "funktion \"%s\" kan inte deklareras som \"mutable\""
-
-#~ msgid "const `%s' cannot be declared `mutable'"
-#~ msgstr "const \"%s\" kan inte deklareras \"mutable\""
-
-#, fuzzy
-#~ msgid "template-id `%D' used as a declarator"
-#~ msgstr "deklaration av \"%s\" döljer global deklaration"
-
-#, fuzzy
-#~ msgid "invalid type qualifier for non-member function type"
-#~ msgstr "namn saknas på medlemsfunktion"
-
-#, fuzzy
-#~ msgid "type qualifiers specified for friend class declaration"
-#~ msgstr "två typer angivna i en tom deklaration"
-
-#, fuzzy
-#~ msgid "template parameters cannot be friends"
-#~ msgstr "typen på parameter \"%s\" är inte deklarerad"
-
-#, fuzzy
-#~ msgid "invalid qualifiers on non-member function type"
-#~ msgstr "ogiltigt format på versionsnummer"
-
-#, fuzzy
-#~ msgid "abstract declarator `%T' used as declaration"
-#~ msgstr "deklaration av \"%s\" döljer global deklaration"
-
-#, fuzzy
-#~ msgid "invalid use of `::'"
-#~ msgstr "ogiltigt användande av \"restrict\""
-
-#, fuzzy
-#~ msgid "function `%D' cannot be declared friend"
-#~ msgstr "funktion \"%s\" kan inte deklareras som \"mutable\""
-
-#, fuzzy
-#~ msgid "function `%D' declared virtual inside a union"
-#~ msgstr "fält \"%s\" deklarerad som en funktion"
-
-#, fuzzy
-#~ msgid "field `%D' has incomplete type"
-#~ msgstr "fält \"%s\" har en inkomplett typ"
-
-#, fuzzy
-#~ msgid "name `%T' has incomplete type"
-#~ msgstr "parameter \"%s\" har en inkomplett typ"
-
-#, fuzzy
-#~ msgid " in instantiation of template `%T'"
-#~ msgstr "%s: Vid instansiering av \"%s\":\n"
-
-#, fuzzy
-#~ msgid "ISO C++ forbids initialization of member `%D'"
-#~ msgstr "ISO C++ förbjuder initiering av new-uttryck med \"=\""
-
-#~ msgid "storage class `register' invalid for function `%s'"
-#~ msgstr "lagringsklass \"register\" ogiltig för funktion \"%s\""
-
-#, fuzzy
-#~ msgid "cannot declare member function `%D' to have static linkage"
-#~ msgstr "kan inte deklarera \"::main\" som static"
-
-#~ msgid "cannot declare static function inside another function"
-#~ msgstr "kan inte deklarera en statisk funktion i en annan funktion"
-
-#, fuzzy
-#~ msgid "static member `%D' declared `register'"
-#~ msgstr "variabel \"%s\" deklarerad \"inline\""
-
-#, fuzzy
-#~ msgid "default argument for `%#D' has type `%T'"
-#~ msgstr "första argumentet till \"%s\" skall vara \"int\""
-
-#, fuzzy
-#~ msgid "invalid string constant `%E'"
-#~ msgstr "ogiltig lagringsklass för funktion \"%s\""
-
-#, fuzzy
-#~ msgid "parameter `%D' invalidly declared method type"
-#~ msgstr "parameter \"%s\" deklarerad som void"
-
-#, fuzzy
-#~ msgid "parameter `%D' invalidly declared offset type"
-#~ msgstr "parameter \"%s\" deklarerad som void"
-
-#, fuzzy
-#~ msgid "`%D' must be a nonstatic member function"
-#~ msgstr "\"%s\" är normalt en icke-statisk function"
-
-#, fuzzy
-#~ msgid "`%D' must take either zero or one argument"
-#~ msgstr "\"%s\" tar bara noll eller två argument"
-
-#, fuzzy
-#~ msgid "`%D' must take either one or two arguments"
-#~ msgstr "\"%s\" tar bara noll eller två argument"
-
-#, fuzzy
-#~ msgid "`%D' must take exactly one argument"
-#~ msgstr "\"%s\" tar bara noll eller två argument"
-
-#, fuzzy
-#~ msgid "`%D' must take exactly two arguments"
-#~ msgstr "\"%s\" tar bara noll eller två argument"
-
-#, fuzzy
-#~ msgid "`%s %T' declares a new type at namespace scope"
-#~ msgstr "\"%s %s\" deklarerad inuti parameterlista"
-
-#, fuzzy
-#~ msgid "using template type parameter `%T' after `%s'"
-#~ msgstr "flera parametrar med namn \"%s\""
-
-#, fuzzy
-#~ msgid "use of enum `%#D' without previous declaration"
-#~ msgstr "sektion \"%s\" står i konflikt med tidigare deklaration"
-
-#, fuzzy
-#~ msgid "base class `%T' has incomplete type"
-#~ msgstr "fält \"%s\" har en inkomplett typ"
-
-#, fuzzy
-#~ msgid "duplicate base type `%T' invalid"
-#~ msgstr "upprepat case-värde"
-
-#, fuzzy
-#~ msgid "multiple definition of `%#T'"
-#~ msgstr "omdefiniering av \"%s\""
-
-#, fuzzy
-#~ msgid "previous definition here"
-#~ msgstr "\"%s\" definierades tidigare här"
-
-#, fuzzy
-#~ msgid "enumerator value for `%D' not integer constant"
-#~ msgstr "uppräkningsvärde för \"%s\" är inte en heltalskonstant"
-
-#, fuzzy
-#~ msgid "overflow in enumeration values at `%D'"
-#~ msgstr "överspill i uppräkningsvärden"
-
-#, fuzzy
-#~ msgid "return type `%#T' is incomplete"
-#~ msgstr "returtypen är en inkomplett typ"
-
-#, fuzzy
-#~ msgid "semicolon missing after declaration of `%#T'"
-#~ msgstr "motstridande deklarationer av \"%s\""
-
-#~ msgid "return type for `main' changed to `int'"
-#~ msgstr "returtypen för \"main\" ändrad till \"int\""
-
-#, fuzzy
-#~ msgid "`%D' implicitly declared before its definition"
-#~ msgstr "\"%s\" deklarerad inline efter sin definition"
-
-#, fuzzy
-#~ msgid "parameter `%D' declared void"
-#~ msgstr "parameter \"%s\" deklarerad som void"
-
-#, fuzzy
-#~ msgid "static member function `%#D' declared with type qualifiers"
-#~ msgstr "nästlad funktion \"%s\" är deklarerad \"extern\""
-
-#~ msgid "-f%s is no longer supported"
-#~ msgstr "-f%s stödjs inte längre"
-
-#~ msgid "-fname-mangling-version is no longer supported"
-#~ msgstr "-fname-mangling-version stöds inte längre"
-
-#~ msgid "-Wno-strict-prototypes is not supported in C++"
-#~ msgstr "-Wno-strict-prototypes stödjs inte för C++"
-
-#, fuzzy
-#~ msgid "duplicate type qualifiers in %s declaration"
-#~ msgstr "dubbel deklaration av etikett \"%s\""
-
-#~ msgid "name missing for member function"
-#~ msgstr "namn saknas på medlemsfunktion"
-
-#~ msgid "ambiguous conversion for array subscript"
-#~ msgstr "tvetydig konveretering av fältindex"
-
-#, fuzzy
-#~ msgid "invalid types `%T[%T]' for array subscript"
-#~ msgstr "tvetydig konveretering av fältindex"
-
-#, fuzzy
-#~ msgid "deleting `%T' is undefined"
-#~ msgstr "operation på \"%s\" kan vara odefinierad"
-
-#, fuzzy
-#~ msgid "invalid use of `virtual' in template declaration of `%#D'"
-#~ msgstr "tidigare implicit deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "template declaration of `%#D'"
-#~ msgstr "omdeklaration av \"%s\""
-
-#, fuzzy
-#~ msgid " %#D"
-#~ msgstr " TOTALT :"
-
-#, fuzzy
-#~ msgid "invalid data member initialization"
-#~ msgstr "Slå på automatisk mallinstansiering"
-
-#~ msgid "field initializer is not constant"
-#~ msgstr "fältinitierare är ej konstant"
-
-#, fuzzy
-#~ msgid "cannot declare `%D' to be a bit-field type"
-#~ msgstr "kan inte deklarera \"::main\" som en mall"
-
-#, fuzzy
-#~ msgid "cannot declare bit-field `%D' with function type"
-#~ msgstr "typkonvertering matchar inte en funktionstyp"
-
-#, fuzzy
-#~ msgid "initializer specified for non-member function `%D'"
-#~ msgstr "argumentformat angivet för icke-funktion \"%s\""
-
-#, fuzzy
-#~ msgid "`operator new' must return type `%T'"
-#~ msgstr "\"operator new\" måste returnera typ \"void *\""
-
-#, fuzzy
-#~ msgid "`operator new' takes type `size_t' (`%T') as first parameter"
-#~ msgstr "\"operator new\" tar parameter av typ \"size_t\""
-
-#, fuzzy
-#~ msgid "`operator delete' must return type `%T'"
-#~ msgstr "\"operator new\" måste returnera typ \"void *\""
-
-#, fuzzy
-#~ msgid "`operator delete' takes type `%T' as first parameter"
-#~ msgstr "\"operator new\" tar parameter av typ \"size_t\""
-
-#~ msgid "use of old-style cast"
-#~ msgstr "användning av gammaldags typkonvertering"
-
-#, fuzzy
-#~ msgid "use of `%D' is ambiguous"
-#~ msgstr "%s: flaggan \"%s\" är tvetydig\n"
-
-#, fuzzy
-#~ msgid " first type here"
-#~ msgstr " från här"
-
-#, fuzzy
-#~ msgid "declaration of `%D' not in a namespace surrounding `%D'"
-#~ msgstr "deklaration av \"%s\" som ett fält med funktioner"
-
-#, fuzzy
-#~ msgid "`%D' is not a function,"
-#~ msgstr "\"%s\" är vanligtvis en funktion"
-
-#, fuzzy
-#~ msgid " conflict with `%D'"
-#~ msgstr "\"%s\" ignorerad, i konflikt med \"-g%s\""
-
-#, fuzzy
-#~ msgid "unknown namespace `%D'"
-#~ msgstr "okänt #pragma namespace %s"
-
-#, fuzzy
-#~ msgid "namespace `%D' not allowed in using-declaration"
-#~ msgstr "\"%s\" är inte i början av deklarationen"
-
-#, fuzzy
-#~ msgid "`%D' not declared"
-#~ msgstr "\"%s\" är tidigare deklarerad här"
-
-#, fuzzy
-#~ msgid "using-declaration for destructor"
-#~ msgstr "multiple deklaration av metod \"%s\""
-
-#, fuzzy
-#~ msgid "namespace `%T' undeclared"
-#~ msgstr "parameter \"%s\" deklarerad som void"
-
-#, fuzzy
-#~ msgid "default argument missing for parameter %P of `%+#D'"
-#~ msgstr "parameternamn saknas i parameterlista"
-
-#, fuzzy
-#~ msgid "`%T' is not a class or union type"
-#~ msgstr "ISO C förbjuder typkonvertering till unionstyper"
-
-#~ msgid "`%s' not supported by %s"
-#~ msgstr "\"%s\" stöds inte av %s"
-
-#~ msgid "<anonymous %s>"
-#~ msgstr "<anonym %s>"
-
-#~ msgid "(static %s for %s)"
-#~ msgstr "(static %s för %s)"
-
-#~ msgid "%s: In instantiation of `%s':\n"
-#~ msgstr "%s: Vid instansiering av \"%s\":\n"
-
-#, fuzzy
-#~ msgid "`%D' is already a friend of class `%T'"
-#~ msgstr "kunde inte hitta klassen \"%s\""
-
-#, fuzzy
-#~ msgid "previous friend declaration of `%D'"
-#~ msgstr "tidigare deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "invalid type `%T' declared `friend'"
-#~ msgstr "variabel \"%s\" deklarerad \"inline\""
-
-#, fuzzy
-#~ msgid "partial specialization `%T' declared `friend'"
-#~ msgstr "variabel \"%s\" deklarerad \"inline\""
-
-#, fuzzy
-#~ msgid "typename type `%#T' declared `friend'"
-#~ msgstr "parameter \"%s\" deklarerad som void"
-
-#, fuzzy
-#~ msgid "template parameter type `%T' declared `friend'"
-#~ msgstr "parameter \"%s\" deklarerad som void"
-
-#, fuzzy
-#~ msgid "`%#T' is not a template"
-#~ msgstr "användning ab `%s' i mall"
-
-#, fuzzy
-#~ msgid "friend declaration `%#D' declares a non-template function"
-#~ msgstr "inbyggd funktion \"%s\" deklarerad som icke-funktion"
-
-#~ msgid "argument to `%s' missing\n"
-#~ msgstr "argument till \"%s\" saknas\n"
-
-#, fuzzy
-#~ msgid "member initializers for `%#D'"
-#~ msgstr "complex ogiltig för \"%s\""
-
-#, fuzzy
-#~ msgid "multiple initializations given for member `%D'"
-#~ msgstr "multiple deklaration av metod \"%s\""
-
-#, fuzzy
-#~ msgid "initializations for multiple members of `%T'"
-#~ msgstr "initierare misslyckas med att bestämma storlek på \"%s\""
-
-#, fuzzy
-#~ msgid "base initializers for `%#T'"
-#~ msgstr "kan inte initiera friend-funktion \"%s\""
-
-#, fuzzy
-#~ msgid "base class `%T' already initialized"
-#~ msgstr "fält \"%s\" är redan initierat"
-
-#, fuzzy
-#~ msgid "bad array initializer"
-#~ msgstr "fält \"%s\" är redan initierat"
-
-#, fuzzy
-#~ msgid "`%T' is not an aggregate type"
-#~ msgstr "\"%s\" har en inkomplett typ"
-
-#, fuzzy
-#~ msgid "invalid use of non-static field `%D'"
-#~ msgstr "ogiltigt användande av \"restrict\""
-
-#, fuzzy
-#~ msgid "invalid use of member `%D'"
-#~ msgstr "ogiltigt användande av \"restrict\""
-
-#, fuzzy
-#~ msgid "no method `%T::%D'"
-#~ msgstr "I metod `%s':"
-
-#, fuzzy
-#~ msgid "`%D' is not a member of type `%T'"
-#~ msgstr "%s har ingen medlem med namn \"%s\""
-
-#, fuzzy
-#~ msgid "illegal pointer to bit-field `%D'"
-#~ msgstr "negativ storlek i bitfält \"%s\""
-
-#, fuzzy
-#~ msgid "object missing in `%E'"
-#~ msgstr "fältstorlek saknas i \"%s\""
-
-#, fuzzy
-#~ msgid "can't find class$"
-#~ msgstr "Kan inte hitta class$"
-
-#~ msgid "invalid type `void' for new"
-#~ msgstr "ogiltig typ \"void\" för new"
-
-#, fuzzy
-#~ msgid "ISO C++ forbids initialization in array new"
-#~ msgstr "ISO C++ förbjuder initiering av new-uttryck med \"=\""
-
-#, fuzzy
-#~ msgid "uninitialized const in `new' of `%#T'"
-#~ msgstr "initierare misslyckas med att bestämma storlek på \"%s\""
-
-#~ msgid "type name expected before `*'"
-#~ msgstr "typnamn förväntat före \"*\""
-
-#~ msgid "cannot declare references to references"
-#~ msgstr "kan inte deklarera referenser till referenser"
-
-#~ msgid "cannot declare pointers to references"
-#~ msgstr "kan inte deklarera pekare till referenser"
-
-#, fuzzy
-#~ msgid "semicolon missing after declaration of `%T'"
-#~ msgstr "motstridande deklarationer av \"%s\""
-
-#~ msgid "invalid #pragma %s"
-#~ msgstr "ogiltigt #pragma %s"
-
-#, fuzzy
-#~ msgid "#pragma vtable no longer supported"
-#~ msgstr "--driver stödjs inte längre"
-
-#, fuzzy
-#~ msgid "`%D' not defined"
-#~ msgstr "\"%s\" är inte definierad"
-
-#, fuzzy
-#~ msgid "`%D' was not declared in this scope"
-#~ msgstr "\"%s\" odeklarerad (första förekomsten i denna funktionen)"
-
-#, fuzzy
-#~ msgid "`%D' undeclared (first use this function)"
-#~ msgstr "\"%s\" odeklarerad (första förekomsten i denna funktionen)"
-
-#, fuzzy
-#~ msgid "`::%D' undeclared (first use here)"
-#~ msgstr "\"%s\" odeklarerad (första förekomsten i denna funktionen)"
-
-#, fuzzy
-#~ msgid "invalid use of member `%D' in static member function"
-#~ msgstr "destruerare kan inte vara en statisk medlemsfunktion"
-
-#, fuzzy
-#~ msgid " `%#D' declared here"
-#~ msgstr "\"%s\" är tidigare deklarerad här"
-
-#, fuzzy
-#~ msgid "keyword `export' not implemented, and will be ignored"
-#~ msgstr "nyckelordet \"export\" är inte implementerat och kommer ignorerads"
-
-#, fuzzy
-#~ msgid "definition of class `%T' in condition"
-#~ msgstr "redefinition av \"%s %s\""
-
-#, fuzzy
-#~ msgid "definition of enum `%T' in condition"
-#~ msgstr "omdefiniering av \"%s\""
-
-#, fuzzy
-#~ msgid "definition of array `%#D' in condition"
-#~ msgstr "metoddefinition för \"%c%s\" kan inte hittas"
-
-#, fuzzy
-#~ msgid "`%T' is not a valid expression"
-#~ msgstr "\"%s\" är inte ett giltigt filnamn"
-
-#~ msgid "ISO C++ forbids initialization of new expression with `='"
-#~ msgstr "ISO C++ förbjuder initiering av new-uttryck med \"=\""
-
-#~ msgid "missing ';' before right brace"
-#~ msgstr "saknar ';' före slutklammer"
-
-#~ msgid "ISO C++ forbids computed gotos"
-#~ msgstr "ISO C++ förbjuder beräknade goto"
-
-#~ msgid "possibly missing ')'"
-#~ msgstr "saknas troligen en ')'"
-
-#, fuzzy
-#~ msgid "no type `%D' in `%T'"
-#~ msgstr "returtypen på \"%s\" är inte \"int\""
-
-#, fuzzy
-#~ msgid "type specifier omitted for parameter `%E'"
-#~ msgstr "lagringsklass angiven för parameter \"%s\""
-
-#, fuzzy
-#~ msgid "invalid member template declaration `%D'"
-#~ msgstr "dubbel deklaration av etikett \"%s\""
-
-#, fuzzy
-#~ msgid " from definition of `%#D'"
-#~ msgstr "omdefiniering av \"%s\""
-
-#, fuzzy
-#~ msgid "specialization of `%T' after instantiation"
-#~ msgstr "deklaration av \"%s\" är \"extern\" och initierad"
-
-#, fuzzy
-#~ msgid "explicit specialization of non-template `%T'"
-#~ msgstr "implicit deklaration av funktion \"%s\""
-
-#, fuzzy
-#~ msgid "%s %+#D"
-#~ msgstr "%s: %s"
-
-#, fuzzy
-#~ msgid "`%D' is not a function template"
-#~ msgstr "typkonvertering matchar inte en funktionstyp"
-
-#, fuzzy
-#~ msgid "too many template parameter lists in declaration of `%D'"
-#~ msgstr "flera lagringsklasser i deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "too few template parameter lists in declaration of `%D'"
-#~ msgstr "två eller fler datatyper i deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "no member function `%D' declared in `%T'"
-#~ msgstr "nästlad funktion \"%s\" är deklarerad \"extern\""
-
-#, fuzzy
-#~ msgid "too many template parameter lists in declaration of `%T'"
-#~ msgstr "flera lagringsklasser i deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "no default argument for `%D'"
-#~ msgstr "ogiltigt typargument till \"%s\""
-
-#, fuzzy
-#~ msgid "template definition of non-template `%#D'"
-#~ msgstr "upprepad definition av klassmetod \"%s\"."
-
-#, fuzzy
-#~ msgid "got %d template parameters for `%#D'"
-#~ msgstr "flera parametrar med namn \"%s\""
-
-#, fuzzy
-#~ msgid "got %d template parameters for `%#T'"
-#~ msgstr "flera parametrar med namn \"%s\""
-
-#, fuzzy
-#~ msgid "`%T' is not a template type"
-#~ msgstr "\"%s\" har en inkomplett typ"
-
-#, fuzzy
-#~ msgid "previous declaration `%D'"
-#~ msgstr "tidigare deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "used %d template parameter%s instead of %d"
-#~ msgstr "flera parametrar med namn \"%s\""
-
-#, fuzzy
-#~ msgid "template parameter `%#D'"
-#~ msgstr "oanvänd parameter \"%s\""
-
-#, fuzzy
-#~ msgid "redefinition of default argument for `%#D'"
-#~ msgstr "omdefiniering av \"%s\""
-
-#, fuzzy
-#~ msgid " original definition appeared here"
-#~ msgstr "funktionsdefinition deklarerad som \"typedef\""
-
-#, fuzzy
-#~ msgid "`%E' is not a valid template argument"
-#~ msgstr "ogiltigt typargument"
-
-#, fuzzy
-#~ msgid "non-constant `%E' cannot be used as template argument"
-#~ msgstr "const \"%s\" kan inte deklareras \"mutable\""
-
-#, fuzzy
-#~ msgid " expected a type, got `%E'"
-#~ msgstr "Oväntad typ på \"id\" (%s)"
-
-#, fuzzy
-#~ msgid " expected a type, got `%T'"
-#~ msgstr "Oväntad typ på \"id\" (%s)"
-
-#, fuzzy
-#~ msgid "provided for `%D'"
-#~ msgstr "destruerare behövs för \"%#D\""
-
-#, fuzzy
-#~ msgid "template argument %d is invalid"
-#~ msgstr "parameter \"%s\" är initierad"
-
-#, fuzzy
-#~ msgid "`%T' is not a template"
-#~ msgstr "användning ab `%s' i mall"
-
-#, fuzzy
-#~ msgid "for template declaration `%D'"
-#~ msgstr "tom deklaration"
-
-#, fuzzy
-#~ msgid "ambiguous class template instantiation for `%#T'"
-#~ msgstr "Slå på automatisk mallinstansiering"
-
-#, fuzzy
-#~ msgid "%s %+#T"
-#~ msgstr "%s: %s"
-
-#, fuzzy
-#~ msgid "instantiation of `%D' as type `%T'"
-#~ msgstr "%s: Vid instansiering av \"%s\":\n"
-
-#, fuzzy
-#~ msgid "invalid parameter type `%T'"
-#~ msgstr "ogiltigt parametervärde \"%s\""
-
-#, fuzzy
-#~ msgid "in declaration `%D'"
-#~ msgstr "omdeklaration av \"%s\""
-
-#~ msgid "creating array with size zero"
-#~ msgstr "skapar ett fält med storlek noll"
-
-#, fuzzy
-#~ msgid "creating array with size zero (`%E')"
-#~ msgstr "skapar ett fält med storlek noll"
-
-#, fuzzy
-#~ msgid "forming reference to void"
-#~ msgstr "returnerar referens till en temporär"
-
-#, fuzzy
-#~ msgid "creating array of `%T'"
-#~ msgstr "skapar ett fält med storlek noll"
-
-#~ msgid "use of `%s' in template"
-#~ msgstr "användning ab `%s' i mall"
-
-#~ msgid "incomplete type unification"
-#~ msgstr "inkomplett typunifiering"
-
-#, fuzzy
-#~ msgid "explicit instantiation of `%#D'"
-#~ msgstr "%s: Vid instansiering av \"%s\":\n"
-
-#, fuzzy
-#~ msgid "duplicate explicit instantiation of `%#D'"
-#~ msgstr "dubbel deklaration av etikett \"%s\""
-
-#, fuzzy
-#~ msgid "storage class `%D' applied to template instantiation"
-#~ msgstr "Slå på automatisk mallinstansiering"
-
-#, fuzzy
-#~ msgid "duplicate explicit instantiation of `%#T'"
-#~ msgstr "dubbel deklaration av etikett \"%s\""
-
-#~ msgid "-frepo must be used with -c"
-#~ msgstr "-frepo måste användas tillsammans med -c"
-
-#~ msgid "cannot use typeid with -fno-rtti"
-#~ msgstr "kan inte använda typeid med -fno-rtti"
-
-#~ msgid "must #include <typeinfo> before using typeid"
-#~ msgstr "måste ha#include <typeinfo> för användande av typeid"
-
-#, fuzzy
-#~ msgid "invalid covariant return type for `%#D'"
-#~ msgstr "ogiltig mottagartyp \"%s\""
-
-#, fuzzy
-#~ msgid "conflicting return type specified for `%#D'"
-#~ msgstr "motstridiga typer på \"%s\""
-
-#, fuzzy
-#~ msgid "looser throw specifier for `%#F'"
-#~ msgstr "long eller short angiven med char för \"%s\""
-
-#, fuzzy
-#~ msgid "`%#D' cannot be declared"
-#~ msgstr "const \"%s\" kan inte deklareras \"mutable\""
-
-#, fuzzy
-#~ msgid "type of asm operand `%E' could not be determined"
-#~ msgstr "typen på parameter \"%s\" är inte deklarerad"
-
-#, fuzzy
-#~ msgid "base initializer for `%T'"
-#~ msgstr "kan inte initiera friend-funktion \"%s\""
-
-#, fuzzy
-#~ msgid "`%E' is not of type `%T'"
-#~ msgstr "\"%s\" svarar inte på \"%s\""
-
-#, fuzzy
-#~ msgid "definition of `%#T' inside template parameter list"
-#~ msgstr "deklaration av \"%s\" döljer symbol från parameterlista"
-
-#, fuzzy
-#~ msgid "invalid definition of qualified type `%T'"
-#~ msgstr "ogiltig operation på oinstansierad typ"
-
-#, fuzzy
-#~ msgid "multiple declarators in template declaration"
-#~ msgstr "flera lagringsklasser i deklaration av \"%s\""
-
-#~ msgid "function body for constructor missing"
-#~ msgstr "funktionskroppen för konstrueraren saknas"
-
-#, fuzzy
-#~ msgid "invalid type `%T' for default argument to `%T'"
-#~ msgstr "ogiltigt typargument till \"%s\""
-
-#~ msgid "%s before `%s'"
-#~ msgstr "%s före \"%s\""
-
-#~ msgid "%s before `%c'"
-#~ msgstr "%s före \"%c\""
-
-#~ msgid "%s before `\\%o'"
-#~ msgstr "%s före \"\\%o\""
-
-#~ msgid "%s before `%s' token"
-#~ msgstr "%s före symbolen \"%s\""
-
-#~ msgid "non-lvalue in %s"
-#~ msgstr "icke-lvalue i %s"
-
-#, fuzzy
-#~ msgid "`%V' qualifiers cannot be applied to `%T'"
-#~ msgstr "\"%s\" svarar inte på \"%s\""
-
-#, fuzzy
-#~ msgid "`%s' attribute can only be applied to Java class definitions"
-#~ msgstr "attributet \"%s\" fungerar bara på funktioner"
-
-#, fuzzy
-#~ msgid "`%s' attribute can only be applied to class definitions"
-#~ msgstr "attributet \"%s\" fungerar bara på funktioner"
-
-#, fuzzy
-#~ msgid "`%s' attribute is not supported on this platform"
-#~ msgstr "attributet \"section\" stöds inte för denna målarkitektur"
-
-#~ msgid "ISO C++ forbids applying `sizeof' to a function type"
-#~ msgstr "ISO C++ förbjuder användning av \"sizeof\" på funktioner"
-
-#~ msgid "ISO C++ forbids applying `sizeof' to a member function"
-#~ msgstr "ISO C++ förbjuder användning av \"sizeof\" på medlemsfunktion"
-
-#~ msgid "ISO C++ forbids applying `sizeof' to type `void' which is an incomplete type"
-#~ msgstr "ISO C++ förbjuder användning av \"sizeof\" på typ void som är en inkomplett typ"
-
-#, fuzzy
-#~ msgid "`sizeof' applied to non-static member"
-#~ msgstr "\"sizeof\" applicerat på ett bitfält"
-
-#, fuzzy
-#~ msgid "`sizeof' applied to incomplete type `%T'"
-#~ msgstr "sizeof applicerat på en inkomplett typ"
-
-#~ msgid "sizeof applied to a bit-field"
-#~ msgstr "sizeof applicerat på ett bit-fält"
-
-#~ msgid "ISO C++ forbids applying `sizeof' to an expression of function type"
-#~ msgstr "ISO C++ förbjuder användning av \"sizeof\" på ett uttryck av funktionstyp"
-
-#, fuzzy
-#~ msgid "invalid use of type decl `%#D' as expression"
-#~ msgstr "ogiltig användning av void-uttryck"
-
-#, fuzzy
-#~ msgid "invalid use of template `%#D' as expression"
-#~ msgstr "ogiltig användning av void-uttryck"
-
-#, fuzzy
-#~ msgid "`%#T' has no member named `%D'"
-#~ msgstr "%s har ingen medlem med namn \"%s\""
-
-#~ msgid "invalid type argument"
-#~ msgstr "ogiltigt typargument"
-
-#, fuzzy
-#~ msgid "object missing in call to method `%D'"
-#~ msgstr "kan inte inline:a anrop till \"%s\""
-
-#~ msgid "ISO C++ forbids calling `::main' from within program"
-#~ msgstr "ISO C++ förbjuder anrop av \"::main\" inifrån programmet"
-
-#, fuzzy
-#~ msgid "`%E' cannot be used as a function"
-#~ msgstr "fält \"%s\" deklarerad som en funktion"
-
-#, fuzzy
-#~ msgid "too many arguments to %s `%+#D'"
-#~ msgstr "för många argument till funktionen \"%s\""
-
-#, fuzzy
-#~ msgid "too few arguments to %s `%+#D'"
-#~ msgstr "för få argument till funktionen \"%s\""
-
-#~ msgid "ISO C++ forbids comparison between pointer and integer"
-#~ msgstr "ISO C++ förbjuder jämförelse mellan pekare och heltal"
-
-#, fuzzy
-#~ msgid "comparison between types `%#T' and `%#T'"
-#~ msgstr "jämförelse mellan pekare och heltal"
-
-#, fuzzy
-#~ msgid "invalid operands of types `%T' and `%T' to binary `%O'"
-#~ msgstr "ogiltiga operander till binär %s"
-
-#, fuzzy
-#~ msgid "NULL used in arithmetic"
-#~ msgstr "pekare till funktion använd med aritmetik"
-
-#, fuzzy
-#~ msgid "attempt to take address of bit-field structure member `%D'"
-#~ msgstr "kan inte ta adressen till bitfält \"%s\""
-
-#~ msgid "taking address of temporary"
-#~ msgstr "tar adress till något temporärt"
-
-#, fuzzy
-#~ msgid "cannot %s a pointer to incomplete type `%T'"
-#~ msgstr "parameter \"%s\" pekar på inkomplett typ"
-
-#, fuzzy
-#~ msgid "ISO C++ forbids %sing a pointer of type `%T'"
-#~ msgstr "ISO C++ förbjuder användning av pekare av typ \"void *\" i pekararitmetik"
-
-#~ msgid "ISO C++ forbids taking address of function `::main'"
-#~ msgstr "ISO C++ förbjuder att man tar adressen till funktionen \"::main\""
-
-#, fuzzy
-#~ msgid "ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say `&%T::%D'"
-#~ msgstr "ISO C++ förbjuder användning av pekare till medlemsfunktion i pekararitmetik"
-
-#~ msgid "unary `&'"
-#~ msgstr "unärt \"&\""
-
-#, fuzzy
-#~ msgid "taking address of destructor"
-#~ msgstr "tar adress till något temporärt"
-
-#, fuzzy
-#~ msgid "cannot create pointer to reference member `%D'"
-#~ msgstr "kan inte deklarera pekare till referenser"
-
-#~ msgid "cannot take the address of `this', which is an rvalue expression"
-#~ msgstr "Kan inte ta adressen till \"this\", som är ett rvalue-uttryck"
-
-#, fuzzy
-#~ msgid "ISO C++ forbids casting to an array type `%T'"
-#~ msgstr "ISO C förbjuder typkonvertering till unionstyper"
-
-#, fuzzy
-#~ msgid "invalid cast to function type `%T'"
-#~ msgstr "ogiltig lagringsklass för funktion \"%s\""
-
-#, fuzzy
-#~ msgid "incompatible types in assignment of `%T' to `%T'"
-#~ msgstr "inkompatibla typer i %s"
-
-#~ msgid "ISO C++ forbids assignment of arrays"
-#~ msgstr "ISO C++ förbjuder tilldelning av fält"
-
-#, fuzzy
-#~ msgid "invalid conversion to type `%T' from type `%T'"
-#~ msgstr "ogiltig mottagartyp \"%s\""
-
-#, fuzzy
-#~ msgid "cannot convert `%T' to `%T' in %s"
-#~ msgstr "kan inte konvertera till en pekartyp"
-
-#, fuzzy
-#~ msgid "in passing argument %P of `%+D'"
-#~ msgstr "Saknar argument till flaggan \"%s\""
-
-#~ msgid "returning reference to temporary"
-#~ msgstr "returnerar referens till en temporär"
-
-#, fuzzy
-#~ msgid "reference to local variable `%D' returned"
-#~ msgstr "adress på global registervariabel \"%s\" efterfrågad"
-
-#, fuzzy
-#~ msgid "address of local variable `%D' returned"
-#~ msgstr "adress på global registervariabel \"%s\" efterfrågad"
-
-#~ msgid "returning a value from a destructor"
-#~ msgstr "returnerar ett värde från en destruktor"
-
-#, fuzzy
-#~ msgid "cannot declare variable `%D' to be of type `%T'"
-#~ msgstr "kan inte deklarera \"::main\" som en mall"
-
-#, fuzzy
-#~ msgid "cannot declare parameter `%D' to be of type `%T'"
-#~ msgstr "kan inte deklarera \"::main\" som en mall"
-
-#, fuzzy
-#~ msgid "cannot declare field `%D' to be of type `%T'"
-#~ msgstr "kan inte deklarera \"::main\" som en mall"
-
-#, fuzzy
-#~ msgid "invalid return type for member function `%#D'"
-#~ msgstr "ogiltig lagringsklass för funktion \"%s\""
-
-#, fuzzy
-#~ msgid "invalid return type for function `%#D'"
-#~ msgstr "ogiltig lagringsklass för funktion \"%s\""
-
-#, fuzzy
-#~ msgid "cannot allocate an object of type `%T'"
-#~ msgstr "statisk access till objekt av typ \"id\""
-
-#, fuzzy
-#~ msgid "invalid use of undefined type `%#T'"
-#~ msgstr "ogiltig mottagartyp \"%s\""
-
-#, fuzzy
-#~ msgid "forward declaration of `%#T'"
-#~ msgstr "omdeklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "declaration of `%#T'"
-#~ msgstr "omdeklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "invalid use of `%T'"
-#~ msgstr "ogiltigt användande av \"restrict\""
-
-#, fuzzy
-#~ msgid "invalid use of template type parameter"
-#~ msgstr "ogiltigt typargument"
-
-#, fuzzy
-#~ msgid "initializer list construction invalid for `%D'"
-#~ msgstr "initierare misslyckas med att bestämma storlek på \"%s\""
-
-#, fuzzy
-#~ msgid "due to non-public access of member `%D'"
-#~ msgstr "upprepning av medlem \"%s\""
-
-#, fuzzy
-#~ msgid "ISO C++ forbids non-constant aggregate initializer expressions"
-#~ msgstr "ISO C89 förbjuder konstruktor-uttryck"
-
-#, fuzzy
-#~ msgid "variable-sized object of type `%T' may not be initialized"
-#~ msgstr "objekt med variabel storlek kan inte initieras"
-
-#, fuzzy
-#~ msgid "missing initializer for member `%D'"
-#~ msgstr "saknar mellanrum efter nummer \"%.*s\""
-
-#, fuzzy
-#~ msgid "uninitialized const member `%D'"
-#~ msgstr "upprepning av medlem \"%s\""
-
-#, fuzzy
-#~ msgid "member `%D' with uninitialized const fields"
-#~ msgstr "parameter \"%s\" är initierad"
-
-#, fuzzy
-#~ msgid "member `%D' is uninitialized reference"
-#~ msgstr "parameter \"%s\" är initierad"
-
-#, fuzzy
-#~ msgid "no field `%D' in union being initialized"
-#~ msgstr "fält \"%s\" är redan initierat"
-
-#, fuzzy
-#~ msgid "base operand of `->' has non-pointer type `%T'"
-#~ msgstr "basoperanden till \"->\" är inte en pekare"
-
-#~ msgid "base operand of `->' is not a pointer"
-#~ msgstr "basoperanden till \"->\" är inte en pekare"
-
-#, fuzzy
-#~ msgid "Recognize and/bitand/bitor/compl/not/or/xor"
-#~ msgstr "Känn igen and/bitand/bitor/compl/not/or/xor"
-
-#~ msgid "Enable automatic template instantiation"
-#~ msgstr "Slå på automatisk mallinstansiering"
-
-#~ msgid "Specify maximum template instantiation depth"
-#~ msgstr "Ange maximalt instansieringsdjup för mallar"
-
-#, fuzzy
-#~ msgid "warning:"
-#~ msgstr "varning: "
-
-#, fuzzy
-#~ msgid "In statement function"
-#~ msgstr "för många argument till funktion"
-
-#, fuzzy
-#~ msgid "directory name must immediately follow -I"
-#~ msgstr "Katalognamn måste komma direkt efter -I"
-
-#~ msgid "--driver no longer supported"
-#~ msgstr "--driver stödjs inte längre"
-
-#~ msgid "argument to `%s' missing"
-#~ msgstr "argument till \"%s\" saknas"
-
-#, fuzzy
-#~ msgid "Implicit declaration of `%A' at %0"
-#~ msgstr "tidigare implicit deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "The meaning of `\\x' (at %0) varies with -traditional"
-#~ msgstr "semantiken för \"\\x\" varierar med -traditional"
-
-#, fuzzy
-#~ msgid "The meaning of `\\a' (at %0) varies with -traditional"
-#~ msgstr "semantiken för \"\\a\" varierar med -traditional"
-
-#, fuzzy
-#~ msgid "Non-ISO-C-standard escape sequence `\\%A' at %0"
-#~ msgstr "okänd escape-sekvens \"\\%c\""
-
-#, fuzzy
-#~ msgid "Unknown escape sequence `\\%A' at %0"
-#~ msgstr "okänd escape-sekvens \"\\%c\""
-
-#, fuzzy
-#~ msgid "Unterminated escape sequence `\\' at %0"
-#~ msgstr "okänd escape-sekvens \"\\%c\""
-
-#, fuzzy
-#~ msgid "Unknown escape sequence `\\' followed by char code 0x%A at %0"
-#~ msgstr "okänd escape-sekvens: '\\' följd av tecken 0x%x"
-
-#, fuzzy
-#~ msgid "Hex escape at %0 out of range"
-#~ msgstr "heltalskonstant utanför sitt intervall"
-
-#, fuzzy
-#~ msgid "Escape sequence at %0 out of range for character"
-#~ msgstr "escape-sekvens ryms ej i ett tecken"
-
-#~ msgid "the meaning of `\\x' varies with -traditional"
-#~ msgstr "semantiken för \"\\x\" varierar med -traditional"
-
-#~ msgid "the meaning of `\\a' varies with -traditional"
-#~ msgstr "semantiken för \"\\a\" varierar med -traditional"
-
-#, fuzzy
-#~ msgid "non-ISO escape sequence `\\%c'"
-#~ msgstr "okänd escape-sekvens \"\\%c\""
-
-#~ msgid "unknown escape sequence `\\%c'"
-#~ msgstr "okänd escape-sekvens \"\\%c\""
-
-#~ msgid "unknown escape sequence: `\\' followed by char code 0x%x"
-#~ msgstr "okänd escape-sekvens: '\\' följd av tecken 0x%x"
-
-#~ msgid "ignoring pragma: %s"
-#~ msgstr "ignorerar #pragma: %s"
-
-#~ msgid "invalid #ident"
-#~ msgstr "ogiltig #indent"
-
-#~ msgid "invalid #line"
-#~ msgstr "ogiltig #line"
-
-#~ msgid "invalid #-line"
-#~ msgstr "ogiltig #-rad"
-
-#~ msgid "%s no longer supported -- try -fvxt"
-#~ msgstr "%s stödjs inte längre -- försök -fvxt"
-
-#~ msgid "%s no longer supported -- try -fno-vxt -ff90"
-#~ msgstr "%s stödjs inte längre -- försök -fno-vxt -ff90"
-
-#, fuzzy
-#~ msgid "Missing first operand for binary operator at %0"
-#~ msgstr "saknar numerisk $-operand i formatsträng"
-
-#, fuzzy
-#~ msgid "Zero-length character constant at %0"
-#~ msgstr "tom teckenkonstant"
-
-#, fuzzy
-#~ msgid "At %0, '!' and '/*' are not valid comment delimiters"
-#~ msgstr "\"Ll\" och \"lL\" är inte giltiga heltalssuffix"
-
-#, fuzzy
-#~ msgid "Character constant at %0 has no closing apostrophe at %1"
-#~ msgstr "teckenkonstant för lång"
-
-#, fuzzy
-#~ msgid "Integer at %0 too large"
-#~ msgstr "heltalskonstant utanför sitt intervall"
-
-#, fuzzy
-#~ msgid "Unrecognized FORMAT specifier at %0"
-#~ msgstr "oigenkänd formatangivelse"
-
-#, fuzzy
-#~ msgid "Duplicate or overlapping case values/ranges at %0 and %1"
-#~ msgstr "dubbla (eller överlappand) case-värden"
-
-#, fuzzy
-#~ msgid "Attempt to raise constant zero to a power at %0"
-#~ msgstr "Försök håll stacken justerad till denna 2-potens"
-
-#, fuzzy
-#~ msgid "Unable to open INCLUDE file `%A' at %0"
-#~ msgstr "kan inte öppna fil \"%s\""
-
-#, fuzzy
-#~ msgid "Truncating characters on right side of character constant at %0"
-#~ msgstr "flerteckens teckenkonstant"
-
-#, fuzzy
-#~ msgid "Typeless constant at %0 too large"
-#~ msgstr "heltalskonstant utanför sitt intervall"
-
-#, fuzzy
-#~ msgid "Array `%A' at %0 is too large to handle"
-#~ msgstr "fältet \"%s\" är för stort"
-
-#, fuzzy
-#~ msgid "Statement function `%A' defined at %0 is not used"
-#~ msgstr "etikett \"%s\" definierad men inte använd"
-
-#, fuzzy
-#~ msgid "Internal compiler error -- cannot perform operation"
-#~ msgstr "Internt kompilatorfel i %s, vid %s:%d"
-
-#, fuzzy
-#~ msgid "In function"
-#~ msgstr "I funktion `%s':"
-
-#, fuzzy
-#~ msgid "In program"
-#~ msgstr "program: %s\n"
-
-#, fuzzy
-#~ msgid "In construct"
-#~ msgstr "struct"
-
-#, fuzzy
-#~ msgid "final field '%s' may not have been initialized"
-#~ msgstr "objekt med variabel storlek kan inte initieras"
-
-#~ msgid "method '%s' not found in class"
-#~ msgstr "metod \"%s\" kan inte hittas i klassen"
-
-#~ msgid "failed to find class '%s'"
-#~ msgstr "kunde inte hitta klassen \"%s\""
-
-# fixme: spola tillbaka är inte perfekt
-#, fuzzy
-#~ msgid "can't expand %s"
-#~ msgstr "kan inte spola tillbaka %s"
-
-#~ msgid "can't close %s"
-#~ msgstr "kan inte stänga %s"
-
-#, fuzzy
-#~ msgid "cannot find file for class %s"
-#~ msgstr "Kan inte hitta filen med klass %s."
-
-#, fuzzy
-#~ msgid "field initializer type mismatch"
-#~ msgstr "fältinitierare är ej konstant"
-
-#~ msgid "can't create directory %s"
-#~ msgstr "kan inte skapa katalog %s"
-
-#, fuzzy
-#~ msgid "can't create %s"
-#~ msgstr "kan inte stänga %s"
-
-#, fuzzy
-#~ msgid "can't open output file `%s'"
-#~ msgstr "Kan inte öppna utdatafil \"%s\""
-
-#, fuzzy
-#~ msgid "file not found `%s'"
-#~ msgstr "Kan inte hitta filen \"%s\""
-
-#, fuzzy
-#~ msgid "`%s' is not a valid class name"
-#~ msgstr "\"%s\" är inte ett giltigt filnamn"
-
-#~ msgid "cannot specify both -C and -o"
-#~ msgstr "kan inte ange både -C och -o"
-
-#, fuzzy
-#~ msgid "can't mangle %s"
-#~ msgstr "kan inte stänga %s"
-
-#~ msgid "internal error - invalid Utf8 name"
-#~ msgstr "internt fel - ogiltigt Utf8-namn"
-
-#~ msgid ""
-#~ "%s.\n"
-#~ "%s"
-#~ msgstr ""
-#~ "%s.\n"
-#~ "%s"
-
-#~ msgid "class `%s' does not implement the `%s' protocol"
-#~ msgstr "klass \"%s\" implementerar inte protokollet \"%s\""
-
-#~ msgid "`%s' cannot be statically allocated"
-#~ msgstr "\"%s\" kan inte vara statiskt allokerad"
-
-#, fuzzy
-#~ msgid "unexpected type for `id' (%s)"
-#~ msgstr "Oväntad typ på \"id\" (%s)"
-
-#, fuzzy
-#~ msgid "cannot find protocol declaration for `%s'"
-#~ msgstr "ingen tidigare deklaration av \"%s\""
-
-#, fuzzy
-#~ msgid "cannot find interface declaration for `%s'"
-#~ msgstr "Cirkulärt arv i interfacedeklaration för \"%s\""
-
-#, fuzzy
-#~ msgid "cannot find reference tag for class `%s'"
-#~ msgstr "Kan inte hitta filen med klass %s."
-
-#, fuzzy
-#~ msgid "cannot find class `%s'"
-#~ msgstr "Kan inte hitta klass \"%s\""
-
-#, fuzzy
-#~ msgid "class `%s' already exists"
-#~ msgstr "Klass \"%s\" finns redan"
-
-#, fuzzy
-#~ msgid "cannot find interface declaration for `%s', superclass of `%s'"
-#~ msgstr "Cirkulärt arv i interfacedeklaration för \"%s\""
-
-#, fuzzy
-#~ msgid "circular inheritance in interface declaration for `%s'"
-#~ msgstr "Cirkulärt arv i interfacedeklaration för \"%s\""
-
-#~ msgid "multiple declarations for method `%s'"
-#~ msgstr "multiple deklaration av metod \"%s\""
-
-#~ msgid "invalid receiver type `%s'"
-#~ msgstr "ogiltig mottagartyp \"%s\""
-
-#~ msgid "`%s' does not respond to `%s'"
-#~ msgstr "\"%s\" svarar inte på \"%s\""
-
-#~ msgid "no super class declared in interface for `%s'"
-#~ msgstr "ingen superklass deklarerad i interface för \"%s\""
-
-#, fuzzy
-#~ msgid "cannot find class (factory) method"
-#~ msgstr "kan inte hitta klass(fabrik)-metod"
-
-#~ msgid "return type for `%s' defaults to id"
-#~ msgstr "returtyp för \"%s\" är som standard id"
-
-#, fuzzy
-#~ msgid "method `%s' not implemented by protocol"
-#~ msgstr "metod \"%s\" implementeras inte av protokoll."
-
-#~ msgid "return type defaults to id"
-#~ msgstr "returtyp är som standard id"
-
-#, fuzzy
-#~ msgid "cannot find method"
-#~ msgstr "kan inte hitta metod."
-
-#, fuzzy
-#~ msgid "duplicate definition of class method `%s'"
-#~ msgstr "upprepad definition av klassmetod \"%s\"."
-
-#, fuzzy
-#~ msgid "duplicate declaration of class method `%s'"
-#~ msgstr "upprepad deklaration av klassmetod \"%s\"."
-
-#, fuzzy
-#~ msgid "duplicate definition of instance method `%s'"
-#~ msgstr "upprepad definition av klassmetod \"%s\"."
-
-#, fuzzy
-#~ msgid "duplicate declaration of instance method `%s'"
-#~ msgstr "upprepad deklaration av klassmetod \"%s\"."
-
-#~ msgid "instance variable `%s' is declared private"
-#~ msgstr "instansvariabel \"%s\" är deklarerad som privat"
-
-#~ msgid "instance variable `%s' is declared %s"
-#~ msgstr "instansvariabel \"%s\" är deklarerad som %s"
-
-#~ msgid "static access to object of type `id'"
-#~ msgstr "statisk access till objekt av typ \"id\""
-
-#~ msgid "incomplete implementation of class `%s'"
-#~ msgstr "inkomplett implementation av klass \"%s\""
-
-#~ msgid "incomplete implementation of category `%s'"
-#~ msgstr "inkomplett implementation av kategori \"%s\""
-
-#~ msgid "method definition for `%c%s' not found"
-#~ msgstr "metoddefinition för \"%c%s\" kan inte hittas"
-
-#~ msgid "reimplementation of class `%s'"
-#~ msgstr "omimplementation av klass \"%s\""
-
-#~ msgid "[super ...] must appear in a method context"
-#~ msgstr "[super ...] måste stå i metodkontext"
-
-#~ msgid "`-p' not supported; use `-pg' and gprof(1)"
-#~ msgstr "\"-p\" stödjs inte; använd \"-pg\" och gprof(1)"
-
-#~ msgid "GNU C does not support -C without using -E"
-#~ msgstr "GNU C stödjer inte -C utan -E"
-
-#~ msgid "profiling not supported with -mg\n"
-#~ msgstr "profilering stöds inte tillsammans med -mg\n"
-
-#, fuzzy
-#~ msgid "may not use both -m32 and -m64"
-#~ msgstr "får inte använda både -mfp64 och -m4650"
-
-#~ msgid "-pg and -fomit-frame-pointer are incompatible"
-#~ msgstr "-pg och -fomit-frame-pointer är inkompatibla"
-
-#~ msgid "-mapcs-26 and -mapcs-32 may not be used together"
-#~ msgstr "-mapcs-26 och -mapcs-32 får inte användas tillsammans"
-
-#~ msgid "-msoft-float and -mhard_float may not be used together"
-#~ msgstr "-msoft-float och -mhard_float får inte användas tillsammans"
-
-#~ msgid "-mbig-endian and -mlittle-endian may not be used together"
-#~ msgstr "-mbig-endian och -mlittle-endian får inte användas tillsammans"
-
-#, fuzzy
-#~ msgid "incompatible interworking options"
-#~ msgstr "inkompatibla typer i %s"
-
-#~ msgid "-mbsd and -pedantic incompatible"
-#~ msgstr "-mbsd och -pedantic är inkompatibla"
-
-#~ msgid "-mbsd and -mxopen incompatible"
-#~ msgstr "-mbsd och -mxopen är inkompatibla"
-
-#~ msgid "-mxopen and -pedantic incompatible"
-#~ msgstr "-mxopen och -pedantic är inkompatible"
-
-#, fuzzy
-#~ msgid "-p profiling is no longer supported. Use -pg instead"
-#~ msgstr "-p profilering stöds inte längre. Använd -pg istället."
-
-#~ msgid "-E required when input is from standard input"
-#~ msgstr "-E krävs när indata tas från standard input"
-
-#, fuzzy
-#~ msgid "compilation of header file requested"
-#~ msgstr "Kompilering av include-fil begärd"
-
-#~ msgid "shared and mdll are not compatible"
-#~ msgstr "shared och mdll är inkompatibla"
-
-#~ msgid "-shared not valid with -mcoff"
-#~ msgstr "-shared är inte giltig tillsammans med -mcoff"
-
-#~ msgid "-symbolic not valid with -mcoff"
-#~ msgstr "-symbolic är inte giltig tillsammans med -mcoff"
-
-#~ msgid "-fpic is not valid with -mcoff"
-#~ msgstr "-fpic är inte giltig tillsammans med -mcoff"
-
-#~ msgid "-fPIC is not valid with -mcoff"
-#~ msgstr "-fPIC är inte giltig tillsammans med -mcoff"
-
-#~ msgid "-fpic not valid with -mcoff"
-#~ msgstr "-fpic är inte giltig tillsammans med -mcoff"
-
-#~ msgid "-fPIC not valid with -mcoff"
-#~ msgstr "-fPIC är inte giltig tillsammans med -mcoff"
-
-#, fuzzy
-#~ msgid "a -ifile option requires a -map option"
-#~ msgstr "Flaggan -ifil kräver även flaggan -map"
-
-#~ msgid "mno-cygwin and mno-win32 are not compatible"
-#~ msgstr "mno-cygwin och mno-win32 är inkompatibla"
-
-#~ msgid "may not use both -EB and -EL"
-#~ msgstr "får inte använda både -EB och -EL"
-
-#~ msgid "-p option not supported: use -pg instead"
-#~ msgstr "flaggan -p stödjs inte: använd -pg istället"
-
-#, fuzzy
-#~ msgid "-pipe is not supported"
-#~ msgstr "-pipe stöds inte."
-
-#~ msgid "may not use both -mfp64 and -msingle-float"
-#~ msgstr "får inte använda både -mfp64 och -msingle-float"
-
-#~ msgid "may not use both -mfp64 and -m4650"
-#~ msgstr "får inte använda både -mfp64 och -m4650"
-
-#, fuzzy
-#~ msgid "may not use both -mgp32 and -mfp64"
-#~ msgstr "får inte använda både -mfp64 och -m4650"
-
-#, fuzzy
-#~ msgid "-mhard-float not supported"
-#~ msgstr "-mhard-float stöds inte."
-
-#, fuzzy
-#~ msgid "-msingle-float and -msoft-float can not both be specified"
-#~ msgstr "-msingle-float och -msoft-float kan inte båda anges."
-
-#, fuzzy
-#~ msgid "options -mabi=mmixware and -mabi=gnu are mutually exclusive"
-#~ msgstr "-pedantic och -traditional är ömsesidigt uteslutande"
-
-#~ msgid "ignoring #pragma %s"
-#~ msgstr "ignorerar #pragma %s"
-
-#~ msgid " -a Enable block profiling \n"
-#~ msgstr " -a Slå på blockprofilering\n"
-
-#~ msgid " -ax Enable jump profiling \n"
-#~ msgstr " -ax Slå på hopprofilering\n"
-
-#, fuzzy
-#~ msgid "explicit instantiation of `%#D' after"
-#~ msgstr "%s: Vid instansiering av \"%s\":\n"
-
-#, fuzzy
-#~ msgid "explicit specialization here"
-#~ msgstr "initiering"
-
-#, fuzzy
-#~ msgid "explicit instantiation of `%#T' after"
-#~ msgstr "%s: Vid instansiering av \"%s\":\n"
-
-#~ msgid "__builtin_trap not supported by this target"
-#~ msgstr "__builtin_trap stöds inte på denna målarkitektur"
-
-#~ msgid "type with more precision than %s"
-#~ msgstr "typ med högre precision än %s"
-
-# local, det kan troligen vara både lokal variabel och lokal funktion??
-#~ msgid "declaration of `%s' shadows previous local"
-#~ msgstr "deklaration av \"%s\" döljer en tidigare lokal"
-
-#~ msgid "ANSI C forbids const or volatile function types"
-#~ msgstr "ANSI C förbjuder funktionertyper med const eller volatile"
-
-#~ msgid "unknown escape sequence: '\\' followed by char 0x%x"
-#~ msgstr "okänd escape-sekvens:: '\\' följd av tecken 0x%x"
-
-#~ msgid "ISO C forbids `&&'"
-#~ msgstr "ISO C förbjuder \"&&\""
-
-#~ msgid "`[*]' in parameter declaration only allowed in ISO C 99"
-#~ msgstr "\"[*]\" i parameterdeklaration är bara tillåten i ISO C 99"
-
-#~ msgid "Register '%c' is unknown"
-#~ msgstr "Register '%c' är okänt"
-
-#~ msgid "Same as -mcpu=i386"
-#~ msgstr "Samma som -mcpu=i386"
-
-#~ msgid "Same as -mcpu=i486"
-#~ msgstr "Samma som -mcpu=i486"
-
-#~ msgid "Same as -mcpu=pentium"
-#~ msgstr "Samma som -mcpu=pentium"
-
-#~ msgid "Same as -mcpu=pentiumpro"
-#~ msgstr "Samma som -mcpu=pentiumpro"
-
-#~ msgid "Emit Intel syntax assembler opcodes"
-#~ msgstr "Skapa assembler-opkoder med Intel-syntax"
-
-#~ msgid "Control allocation order of integer registers"
-#~ msgstr "Kontrollera allokeringsordning för heltalsregister"
-
-#~ msgid "Use FUNCTION_EPILOGUE"
-#~ msgstr "Använd FUNCTION_EPILOGUE"
-
-#~ msgid "Do not use FUNCTION_EPILOGUE"
-#~ msgstr "Använd inte FUNCTION_EPILOGUE"
-
-#~ msgid "methods cannot be converted to function pointers"
-#~ msgstr "metoder kan inte konverteras till funktionspekare"
-
-#~ msgid "ISO C++ forbids `&&'"
-#~ msgstr "ISO C++ förbjuder \"&&\""
-
-#~ msgid "`com_interface' only supported with -fvtable-thunks"
-#~ msgstr "\"com_interface\" stöds bara med -fvtable-thunks"
-
-#~ msgid "ISO C++ forbids using a pointer-to-function in pointer arithmetic"
-#~ msgstr "ISO C++ förbjuder användning av funktionspekarepekare i pekararitmetik"
-
-#~ msgid "ISO C++ forbids using pointer to a member in pointer arithmetic"
-#~ msgstr "ISO C++ förbjuder användning av pekare till medlem i pekararitmetik"
-
-#~ msgid "Internal error #%d."
-#~ msgstr "Internt fel #%d."
-
-#~ msgid "-include and -imacros cannot be used with -fpreprocessed"
-#~ msgstr "-include och -imacros kan inte användas med -fpreprocessed"
-
-#~ msgid "<stdin>"
-#~ msgstr "<stdin>"
-
-#~ msgid "file \"%s\" entered but not left"
-#~ msgstr "filen \"%s\" påbörjad men ej avslutad"
-
-#~ msgid "gcov [-b] [-v] [-n] [-l] [-f] [-o OBJDIR] file\n"
-#~ msgstr "gcov [-b] [-v] [-n] [-l] [-f] [-o OBJKAT] fil\n"
-
-#~ msgid "can't to open %s"
-#~ msgstr "kan inte öppna %s"
-
-#~ msgid "Generate code for Boehm GC"
-#~ msgstr "Generera kod för Boehm GC"
-
-#~ msgid " -Wid-clash-<num> Warn if 2 identifiers have the same first <num> chars\n"
-#~ msgstr " -Wid-clash-<num> Varna om två identifierare har samma första <num> tecken\n"
-
-#~ msgid "Unrecognized option `%s'"
-#~ msgstr "Känner inte igen flagga \"%s\""
-
-#~ msgid "`-a' option (basic block profile) not supported"
-#~ msgstr "flagga \"-a\" (block profilering) stöds inte"
-
-#~ msgid "`-ax' option (jump profiling) not supported"
-#~ msgstr "flagga \"-ax\" (hopprofilering) stöds inte"
-
-#~ msgid "no file specified with -fdump-translation-unit"
-#~ msgstr "ingen fil angiven med -fdump-translation-unit"
-
-#~ msgid "invalid identifier `%s'"
-#~ msgstr "ogiltig identifierare \"%s\""
-
-#~ msgid "syntax error before '#' token"
-#~ msgstr "syntaxfel för symbolen '#'"
-
-#~ msgid "%s is a directory"
-#~ msgstr "%s är en katalog"
-
-#~ msgid "%s:%d: "
-#~ msgstr "%s:%d: "
-
-#~ msgid "additional handler after ..."
-#~ msgstr "ytterligare avbrottshanterare efter ..."
-
-#~ msgid "Counted %d copies of EH region %d in list.\n"
-#~ msgstr "Räknade till %d kopior av EH-region %d i lista.\n"
-
-#~ msgid "Duplicate call to __builtin_eh_return"
-#~ msgstr "Multipelt anrop till __builtin_eh_return"
-
-#~ msgid "Unknown stab %s: : 0x%x\n"
-#~ msgstr "Okänd stab %s: : 0x%x\n"
-
-#~ msgid "ISO C does not support the strftime `%c' flag"
-#~ msgstr "ISO C stöder inte flaggan \"%c\" till strftime"
-
-#~ msgid "ISO C89 does not support the `%%%c' %s format"
-#~ msgstr "ISO C89 stöder inte \\\"%%%c\\\" i %s formatsträng"
-
-#~ msgid "ISO C does not support `%%O%c'"
-#~ msgstr "ISO C stöder inte \"%%O%c#"
-
-#~ msgid "ISO C89 does not support `%%E%c'"
-#~ msgstr "ISO C89 stöder inte \"%%E%c\""
-
-#~ msgid "`a' flag used with `%c' format"
-#~ msgstr "flaggan \"a\" använd med format \"%c\""
-
-#~ msgid "ISO C does not support the `a' flag"
-#~ msgstr "ISO C stödjer inte \"a\"-flaggan"
-
-#~ msgid "flag `%c' used with type `%c'"
-#~ msgstr "flaggan \"%c\" använd med typen \"%c\""
-
-#~ msgid "parse error at '..'"
-#~ msgstr "tolkningsfel vid \"..\""
-
-#~ msgid "Compile for Gmicro/300"
-#~ msgstr "Kompilera för Gmicro/300"
-
-#~ msgid "parse errors have confused me too much"
-#~ msgstr "tolkningsfel har gjort mig helt förvirrad"
-
-#~ msgid "syntax error before '\\' token"
-#~ msgstr "syntaxfel före symbolen '\\'"
-
-#~ msgid ""
-#~ " -MD As -M, but put output in a .d file\n"
-#~ " -MMD As -MD, but ignore system header files\n"
-#~ " -MG Treat missing header file as generated files\n"
-#~ " -g3 Include #define and #undef directives in the output\n"
-#~ " -D<macro> Define a <macro> with string '1' as its value\n"
-#~ " -D<macro>=<val> Define a <macro> with <val> as its value\n"
-#~ msgstr ""
-#~ " -MD Som -M, men skriva utdata till en .d-fil\n"
-#~ " -MMD Som -MD, men ignorera system-include-filer\n"
-#~ " -MG Behandla saknade include-filer som genererade filer\n"
-#~ " -g3 Inkludera direktiven #define och #undef i utdatan\n"
-#~ " -D<makro> Definiera ett <makro> med strängen '1' som värde\n"
-#~ " -D<makro>=<värde> Definiera ett <makro> med <värde> som värde\n"
-
-#~ msgid "ISO C does not allow #%s"
-#~ msgstr "ISO C tillåter inte #%s"
-
-#~ msgid "second token after #line is not a string"
-#~ msgstr "Andra symbolen efter #line är inte en sträng"
-
-#~ msgid "#%s with invalid argument"
-#~ msgstr "#%s med ogiltigt argument"
-
-#~ msgid "ISO C forbids text after #%s"
-#~ msgstr "ISO C förbjuder text efter #%s"
-
-#~ msgid "no memory"
-#~ msgstr "inget minne"
-
-#~ msgid "Objective-C text in C source file"
-#~ msgstr "Objective-C text i C-källkodsfil"
-
-#~ msgid "statically allocated objects not supported"
-#~ msgstr "statiskt allokerade objekt stöds inte"
-
-#~ msgid " -m%-21.21s [undocumented]\n"
-#~ msgstr " -m%-21.21s [odokumenterat]\n"
-
-#~ msgid "Macro name missing after -U option"
-#~ msgstr "Makronamn saknas efter flaggan -U"
+msgstr "syntaxfel i makroparameterlista"
diff --git a/libcpp/symtab.c b/libcpp/symtab.c
index 471765ca697..85450101b80 100644
--- a/libcpp/symtab.c
+++ b/libcpp/symtab.c
@@ -56,7 +56,7 @@ ht_create (unsigned int order)
unsigned int nslots = 1 << order;
hash_table *table;
- table = xcalloc (1, sizeof (hash_table));
+ table = XCNEW (hash_table);
/* Strings need no alignment. */
_obstack_begin (&table->stack, 0, 0,
@@ -65,7 +65,7 @@ ht_create (unsigned int order)
obstack_alignment_mask (&table->stack) = 0;
- table->entries = xcalloc (nslots, sizeof (hashnode));
+ table->entries = XCNEWVEC (hashnode, nslots);
table->entries_owned = true;
table->nslots = nslots;
return table;
@@ -161,7 +161,8 @@ ht_lookup_with_hash (hash_table *table, const unsigned char *str,
HT_LEN (node) = (unsigned int) len;
node->hash_value = hash;
if (insert == HT_ALLOC)
- HT_STR (node) = obstack_copy0 (&table->stack, str, len);
+ HT_STR (node) = (const unsigned char *) obstack_copy0 (&table->stack,
+ str, len);
else
HT_STR (node) = str;
@@ -181,7 +182,7 @@ ht_expand (hash_table *table)
unsigned int size, sizemask;
size = table->nslots * 2;
- nentries = xcalloc (size, sizeof (hashnode));
+ nentries = XCNEWVEC (hashnode, size);
sizemask = size - 1;
p = table->entries;
diff --git a/libcpp/system.h b/libcpp/system.h
index 98ac118e351..b27995b400b 100644
--- a/libcpp/system.h
+++ b/libcpp/system.h
@@ -342,10 +342,14 @@ extern void abort (void);
#include "libiberty.h"
#include "safe-ctype.h"
-/* 1 if we have C99 designated initializers. */
+/* 1 if we have C99 designated initializers.
+
+ ??? C99 designated initializers are not supported by most C++
+ compilers, including G++. -- gdr, 2005-05-18 */
#if !defined(HAVE_DESIGNATED_INITIALIZERS)
#define HAVE_DESIGNATED_INITIALIZERS \
- ((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L))
+ ((!defined(__cplusplus) && (GCC_VERSION >= 2007)) \
+ || (__STDC_VERSION__ >= 199901L))
#endif
/* Be conservative and only use enum bitfields with GCC.
@@ -379,7 +383,9 @@ extern void abort (void);
#undef TRUE
#undef FALSE
+#ifndef __cplusplus
#define bool unsigned char
+#endif
#define true 1
#define false 0
diff --git a/libcpp/traditional.c b/libcpp/traditional.c
index 85be48716a5..a20facb063e 100644
--- a/libcpp/traditional.c
+++ b/libcpp/traditional.c
@@ -107,7 +107,7 @@ check_output_buffer (cpp_reader *pfile, size_t n)
size_t size = pfile->out.cur - pfile->out.base;
size_t new_size = (size + n) * 3 / 2;
- pfile->out.base = xrealloc (pfile->out.base, new_size);
+ pfile->out.base = XRESIZEVEC (unsigned char, pfile->out.base, new_size);
pfile->out.limit = pfile->out.base + new_size;
pfile->out.cur = pfile->out.base + size;
}
@@ -1069,7 +1069,7 @@ bool
_cpp_expansions_different_trad (const cpp_macro *macro1,
const cpp_macro *macro2)
{
- uchar *p1 = xmalloc (macro1->count + macro2->count);
+ uchar *p1 = XNEWVEC (uchar, macro1->count + macro2->count);
uchar *p2 = p1 + macro1->count;
uchar quote1 = 0, quote2 = 0;
bool mismatch;
diff --git a/libffi/ChangeLog b/libffi/ChangeLog
index d1f580e3c7b..3b1afef3ee4 100644
--- a/libffi/ChangeLog
+++ b/libffi/ChangeLog
@@ -1,3 +1,20 @@
+2005-06-15 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
+
+ PR libgcj/21943
+ * src/mips/n32.S: Enforce PIC code.
+ * src/mips/o32.S: Likewise.
+
+2005-06-15 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
+
+ * configure.ac: Treat i*86-*-solaris2.10 and up as X86_64.
+ * configure: Regenerate.
+
+2005-06-01 Alan Modra <amodra@bigpond.net.au>
+
+ * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Don't use JUMPTARGET
+ to call ffi_closure_helper_SYSV. Append @local instead.
+ * src/powerpc/sysv.S (ffi_call_SYSV): Likewise for ffi_prep_args_SYSV.
+
2005-05-17 Kelley Cook <kcook@gcc.gnu.org>
* configure.ac: Use AC_C_BIGENDIAN instead of AC_C_BIGENDIAN_CROSS.
diff --git a/libffi/configure b/libffi/configure
index 7fccb389986..d13d1686e17 100755
--- a/libffi/configure
+++ b/libffi/configure
@@ -5377,6 +5377,7 @@ fi
TARGETDIR="unknown"
case "$host" in
i*86-*-linux*) TARGET=X86; TARGETDIR=x86;;
+i*86-*-solaris2.1[0-9]*) TARGET=X86_64; TARGETDIR=x86;;
i*86-*-solaris*) TARGET=X86; TARGETDIR=x86;;
i*86-*-beos*) TARGET=X86; TARGETDIR=x86;;
i*86-*-freebsd* | i*86-*-kfreebsd*-gnu) TARGET=X86; TARGETDIR=x86;;
diff --git a/libffi/configure.ac b/libffi/configure.ac
index b0bfd4991dc..b353dc828d5 100644
--- a/libffi/configure.ac
+++ b/libffi/configure.ac
@@ -42,6 +42,7 @@ AM_CONDITIONAL(TESTSUBDIR, test -d $srcdir/testsuite)
TARGETDIR="unknown"
case "$host" in
i*86-*-linux*) TARGET=X86; TARGETDIR=x86;;
+i*86-*-solaris2.1[[0-9]]*) TARGET=X86_64; TARGETDIR=x86;;
i*86-*-solaris*) TARGET=X86; TARGETDIR=x86;;
i*86-*-beos*) TARGET=X86; TARGETDIR=x86;;
i*86-*-freebsd* | i*86-*-kfreebsd*-gnu) TARGET=X86; TARGETDIR=x86;;
diff --git a/libffi/src/mips/n32.S b/libffi/src/mips/n32.S
index 767fa52bd5c..358cfd7e409 100644
--- a/libffi/src/mips/n32.S
+++ b/libffi/src/mips/n32.S
@@ -1,5 +1,5 @@
/* -----------------------------------------------------------------------
- n32.S - Copyright (c) 1996, 1998 Red Hat, Inc.
+ n32.S - Copyright (c) 1996, 1998, 2005 Red Hat, Inc.
MIPS Foreign Function Interface
@@ -39,6 +39,7 @@
#define SIZEOF_FRAME ( 8 * FFI_SIZEOF_ARG )
+ .abicalls
.text
.align 2
.globl ffi_call_N32
diff --git a/libffi/src/mips/o32.S b/libffi/src/mips/o32.S
index 75261b9b88f..bd9a33b7b7e 100644
--- a/libffi/src/mips/o32.S
+++ b/libffi/src/mips/o32.S
@@ -1,5 +1,5 @@
/* -----------------------------------------------------------------------
- o32.S - Copyright (c) 1996, 1998 Red Hat, Inc.
+ o32.S - Copyright (c) 1996, 1998, 2005 Red Hat, Inc.
MIPS Foreign Function Interface
@@ -37,6 +37,7 @@
#define SIZEOF_FRAME ( 4 * FFI_SIZEOF_ARG + 2 * FFI_SIZEOF_ARG )
+ .abicalls
.text
.align 2
.globl ffi_call_O32
diff --git a/libffi/src/powerpc/ppc_closure.S b/libffi/src/powerpc/ppc_closure.S
index ba13fa467e4..c71a7ff3b3b 100644
--- a/libffi/src/powerpc/ppc_closure.S
+++ b/libffi/src/powerpc/ppc_closure.S
@@ -57,7 +57,7 @@ ENTRY(ffi_closure_SYSV)
addi %r7,%r1,152
# make the call
- bl JUMPTARGET(ffi_closure_helper_SYSV)
+ bl ffi_closure_helper_SYSV@local
# now r3 contains the return type
# so use it to look up in a table
diff --git a/libffi/src/powerpc/sysv.S b/libffi/src/powerpc/sysv.S
index 1689d292d80..6d8b60155bb 100644
--- a/libffi/src/powerpc/sysv.S
+++ b/libffi/src/powerpc/sysv.S
@@ -60,7 +60,7 @@ ENTRY(ffi_call_SYSV)
/* Call ffi_prep_args_SYSV. */
mr %r4,%r1
- bl JUMPTARGET(ffi_prep_args_SYSV)
+ bl ffi_prep_args_SYSV@local
/* Now do the call. */
/* Set up cr1 with bits 4-7 of the flags. */
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 89a0b787966..64197060bee 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,145 @@
+2005-06-15 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ PR libfortran/21950
+ * intrinsics/c99_functions.c (scalbn): Provide fallback
+ implementation for scalbn.
+ * c99_protos.h: Prototype for scalbn.
+ * configure.ac: Add check for scalbn.
+ * configure: Regenerate.
+ * config.h.in: Regenerate.
+
+2005-06-14 Thomas Koenig <Thomas.Koenig@online.de>
+
+ * intrinsics/eoshift0.c: Removed prototype for eoshift0.
+ * intrinsics/eoshift2.c: Removed prototype for eoshift2.
+
+2005-06-14 Tom Tromey <tromey@redhat.com>
+
+ PR libgcj/19877:
+ * configure, aclocal.m4, Makefile.in: Rebuilt.
+
+2005-06-12 Thomas Koenig <Thomas.Koenig@online.de>
+
+ PR libfortran/21594
+ * intrinsics/eoshift0.c: Add prototype for eoshift0.
+ * intrinsics/eoshift2.c: Add prototype for eoshift2.
+
+2005-06-12 Steven G. Kargl <kargls@comcast.net>
+ Thomas Koenig <Thomas.Koenig@online.de>
+
+ PR libfortran/PR21797
+ * m4/cexp.m4 (csqrt`'q): Add type qualifyer to
+ sqrt and fabs.
+ * generated/exp_c4.c: Regenerated.
+
+2005-06-12 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ PR libfortran/19155
+ * io/read.c (read_f): Take care of spaces after initial sign.
+
+2005-06-11 Thomas Koenig <Thomas.Koenig@onlinde.de>
+
+ PR libfortran/21333
+ * Makefile.am: Add in_pack_c4.c, in_pack_c8.c, in_unpack_c4.c
+ and in_unpack_c8.c.
+ * Makefile.in: Regenerate.
+ * libgfortran.h: Declare internal_pack_c4, internal_pack_c8,
+ internal_unpack_c4 and internal_unpack_c8.
+ * m4/in_pack.m4: Use rtype_ccode insteald of rtype_kind
+ in function name.
+ Use sizeof (rtype_name) as size for memory allocation.
+ * m4/in_unpack.m4: Use rtype_ccode insteald of rtype_kind
+ in function name.
+ Use sizeof (rtype_name) for calculation of sizes for memcpy.
+ * runtime/in_pack_generic.c: For real, integer and logical
+ call internal_pack_4 if size==4 and internal_pack_8 if
+ size==8.
+ For complex, call internal_pack_c4 if size==8 and
+ internal_pack_c8 if size==16.
+ * runtime/in_unpack_generic.c: For real, integer and logical
+ call internal_unpack_4 if size==4 and internal_unpack_8 if
+ size==8.
+ For complex, call internal_unpack_c4 if size==8 and
+ internal_unpack_c8 if size==16.
+ * generated/in_pack_i4.c: Regenerated.
+ * generated/in_pack_i8.c: Regenerated.
+ * generated/in_unpack_i4.c: Regenerated.
+ * generated/in_unpack_i8.c: Regenerated.
+ * generated/in_pack_c4.c: New file.
+ * generated/in_pack_c8.c: New file.
+ * generated/in_unpack_c4.c: New file.
+ * generated/in_unpack_c8.c: New file.
+
+2005-06-09 Thomas Koenig <Thomas.Koenig@online.de>
+
+ PR libfortran/21480
+ * m4/reshape.m4: Use sizeof (rtype_name) for sizes to be passed
+ to reshape_packed.
+ * generated/reshape_c4.c: Regenerated.
+ * generated/reshape_c8.c: Regenerated.
+ * generated/reshape_i4.c: Regenerated.
+ * generated/reshape_i8.c: Regenerated.
+
+2005-06-07 Thomas Koenig <Thomas.Koenig@online.de>
+
+ PR libfortran/21926
+ * m4/matmul.m4: Correct zeroing of result for non-packed
+ arrays with lowest stride is one.
+ * generated/matmul_c4.c: Regenerated.
+ * generated/matmul_c8.c: Regenerated.
+ * generated/matmul_i4.c: Regenerated.
+ * generated/matmul_i8.c: Regenerated.
+ * generated/matmul_r4.c: Regenerated.
+ * generated/matmul_r8.c: Regenerated.
+
+2005-05-30 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ PR libfortran/20179
+ * io/unix.c (fd_close): Add test so that we don't close()
+ stdout and stderr.
+
+2005-05-29 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+
+ PR libfortran/20006
+ * io/format.c (parse_format_list): Set repeat count of $ format
+ node to 1.
+ * io/transfer.c (read_sf): Add g.seen_dollar to the test
+ concerning advancing I/O.
+ (data_transfer_init): Likewise.
+ (finalize_transfer): Likewise.
+
+2005-05-27 Thomas Koenig <Thomas.Koenig@online.de>
+
+ * runtime/in_pack_generic.c: Adjust copyright years.
+ (in_pack_generic): Change dimension of auxiliary arrays from
+ GFC_MAX_DIMENSION - 1 to GFC_MAX_DIMENSION.
+ * runtime/in_unpack_generic.c: Adjust copyright years.
+ (in_unpack_generic): Change dimension of auxiliary arrays from
+ GFC_MAX_DIMENSION - 1 to GFC_MAX_DIMENSION.
+
+2005-05-26 Thomas Koenig <Thomas.Koenig@online.de>
+
+ PR libfortran/17283
+ * intrinsics/unpack_generic.c: Fix name of routine
+ on top. Update copyright years.
+ (unpack1): Remove const from return array descriptor.
+ rs: New variable, for calculating return sizes.
+ Populate return array descriptor if ret->data is NULL.
+
+2005-05-22 Peter Wainwright <prw@ceiriog1.demon.co.uk>
+
+ PR libfortran/21376
+ * io/write.c (output_float): Rework logic to avoid call to log10
+ with argument equal to zero.
+
+2005-05-21 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ * configure.ac: Check for trunc and truncf in libm.
+ * configure: Regenerate.
+ * config.h.in: Likewise.
+ * intrinsics/c99_functions.c (trunc, truncf): New functions.
+ * c99_protos.h (trunc, truncf): Declare them.
+
2005-05-18 Thomas Koenig <Thomas.Koenig@online.de>
PR libfortran/21127
diff --git a/libgfortran/Makefile.am b/libgfortran/Makefile.am
index 0e1893b5cce..43fc9883001 100644
--- a/libgfortran/Makefile.am
+++ b/libgfortran/Makefile.am
@@ -243,11 +243,15 @@ generated/cshift1_8.c
in_pack_c = \
generated/in_pack_i4.c \
-generated/in_pack_i8.c
+generated/in_pack_i8.c \
+generated/in_pack_c4.c \
+generated/in_pack_c8.c
in_unpack_c = \
generated/in_unpack_i4.c \
-generated/in_unpack_i8.c
+generated/in_unpack_i8.c \
+generated/in_unpack_c4.c \
+generated/in_unpack_c8.c
i_exponent_c = \
generated/exponent_r4.c \
diff --git a/libgfortran/Makefile.in b/libgfortran/Makefile.in
index 0240dd127fb..9787c66df60 100644
--- a/libgfortran/Makefile.in
+++ b/libgfortran/Makefile.in
@@ -47,8 +47,10 @@ DIST_COMMON = $(am__configure_deps) $(srcdir)/../config.guess \
$(top_srcdir)/configure ChangeLog
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
- $(top_srcdir)/../libtool.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/../config/lead-dot.m4 \
+ $(top_srcdir)/../config/no-executables.m4 \
+ $(top_srcdir)/acinclude.m4 $(top_srcdir)/../libtool.m4 \
+ $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
@@ -104,8 +106,10 @@ am__objects_21 = eoshift3_4.lo eoshift3_8.lo
am__objects_22 = cshift1_4.lo cshift1_8.lo
am__objects_23 = reshape_i4.lo reshape_i8.lo reshape_c4.lo \
reshape_c8.lo
-am__objects_24 = in_pack_i4.lo in_pack_i8.lo
-am__objects_25 = in_unpack_i4.lo in_unpack_i8.lo
+am__objects_24 = in_pack_i4.lo in_pack_i8.lo in_pack_c4.lo \
+ in_pack_c8.lo
+am__objects_25 = in_unpack_i4.lo in_unpack_i8.lo in_unpack_c4.lo \
+ in_unpack_c8.lo
am__objects_26 = exponent_r4.lo exponent_r8.lo
am__objects_27 = fraction_r4.lo fraction_r8.lo
am__objects_28 = nearest_r4.lo nearest_r8.lo
@@ -533,11 +537,15 @@ generated/cshift1_8.c
in_pack_c = \
generated/in_pack_i4.c \
-generated/in_pack_i8.c
+generated/in_pack_i8.c \
+generated/in_pack_c4.c \
+generated/in_pack_c8.c
in_unpack_c = \
generated/in_unpack_i4.c \
-generated/in_unpack_i8.c
+generated/in_unpack_i8.c \
+generated/in_unpack_c4.c \
+generated/in_unpack_c8.c
i_exponent_c = \
generated/exponent_r4.c \
@@ -1129,12 +1137,24 @@ in_pack_i4.lo: generated/in_pack_i4.c
in_pack_i8.lo: generated/in_pack_i8.c
$(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o in_pack_i8.lo `test -f 'generated/in_pack_i8.c' || echo '$(srcdir)/'`generated/in_pack_i8.c
+in_pack_c4.lo: generated/in_pack_c4.c
+ $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o in_pack_c4.lo `test -f 'generated/in_pack_c4.c' || echo '$(srcdir)/'`generated/in_pack_c4.c
+
+in_pack_c8.lo: generated/in_pack_c8.c
+ $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o in_pack_c8.lo `test -f 'generated/in_pack_c8.c' || echo '$(srcdir)/'`generated/in_pack_c8.c
+
in_unpack_i4.lo: generated/in_unpack_i4.c
$(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o in_unpack_i4.lo `test -f 'generated/in_unpack_i4.c' || echo '$(srcdir)/'`generated/in_unpack_i4.c
in_unpack_i8.lo: generated/in_unpack_i8.c
$(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o in_unpack_i8.lo `test -f 'generated/in_unpack_i8.c' || echo '$(srcdir)/'`generated/in_unpack_i8.c
+in_unpack_c4.lo: generated/in_unpack_c4.c
+ $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o in_unpack_c4.lo `test -f 'generated/in_unpack_c4.c' || echo '$(srcdir)/'`generated/in_unpack_c4.c
+
+in_unpack_c8.lo: generated/in_unpack_c8.c
+ $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o in_unpack_c8.lo `test -f 'generated/in_unpack_c8.c' || echo '$(srcdir)/'`generated/in_unpack_c8.c
+
exponent_r4.lo: generated/exponent_r4.c
$(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o exponent_r4.lo `test -f 'generated/exponent_r4.c' || echo '$(srcdir)/'`generated/exponent_r4.c
@@ -1687,7 +1707,7 @@ distclean-tags:
distdir: $(DISTFILES)
$(am__remove_distdir)
mkdir $(distdir)
- $(mkdir_p) $(distdir)/.. $(distdir)/m4
+ $(mkdir_p) $(distdir)/.. $(distdir)/../config $(distdir)/m4
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
diff --git a/libgfortran/aclocal.m4 b/libgfortran/aclocal.m4
index 0111a59f978..d6fd1920d26 100644
--- a/libgfortran/aclocal.m4
+++ b/libgfortran/aclocal.m4
@@ -300,39 +300,6 @@ AC_DEFUN([AM_PROG_INSTALL_SH],
install_sh=${install_sh-"$am_aux_dir/install-sh"}
AC_SUBST(install_sh)])
-# -*- Autoconf -*-
-# Copyright (C) 2003 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# serial 1
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot. For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
- am__leading_dot=.
-else
- am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
# Add --enable-maintainer-mode option to configure.
# From Jim Meyering
@@ -817,4 +784,6 @@ AC_SUBST([am__tar])
AC_SUBST([am__untar])
]) # _AM_PROG_TAR
+m4_include([../config/lead-dot.m4])
+m4_include([../config/no-executables.m4])
m4_include([acinclude.m4])
diff --git a/libgfortran/c99_protos.h b/libgfortran/c99_protos.h
index 99d61725cbf..4deb25ceed1 100644
--- a/libgfortran/c99_protos.h
+++ b/libgfortran/c99_protos.h
@@ -89,6 +89,10 @@ extern float logf(float);
extern float log10f(float);
#endif
+#ifndef HAVE_SCALBN
+extern double scalbn(double, int);
+#endif
+
#ifndef HAVE_SCALBNF
extern float scalbnf(float, int);
#endif
@@ -113,6 +117,14 @@ extern float tanf(float);
extern float tanhf(float);
#endif
+#ifndef HAVE_TRUNC
+extern double trunc(double x);
+#endif
+
+#ifndef HAVE_TRUNCF
+extern float truncf(float x);
+#endif
+
#ifndef HAVE_NEXTAFTERF
extern float nextafterf(float, float);
#endif
diff --git a/libgfortran/config.h.in b/libgfortran/config.h.in
index 0cdd2aadbf1..aaf663ecd33 100644
--- a/libgfortran/config.h.in
+++ b/libgfortran/config.h.in
@@ -168,6 +168,9 @@
/* libm includes roundf */
#undef HAVE_ROUNDF
+/* libm includes scalbn */
+#undef HAVE_SCALBN
+
/* libm includes scalbnf */
#undef HAVE_SCALBNF
@@ -264,6 +267,12 @@
/* Define to 1 if you have the <time.h> header file. */
#undef HAVE_TIME_H
+/* libm includes trunc */
+#undef HAVE_TRUNC
+
+/* libm includes truncf */
+#undef HAVE_TRUNCF
+
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
diff --git a/libgfortran/configure b/libgfortran/configure
index da18e6881ab..aaaf9f67ea5 100755
--- a/libgfortran/configure
+++ b/libgfortran/configure
@@ -1957,7 +1957,7 @@ fi
# suite is included, we'll have to know.
if test "$build" != "$host"; then
LIBGFOR_IS_NATIVE=false
- GCC_NO_EXECUTABLES
+
else
LIBGFOR_IS_NATIVE=true
fi
@@ -2350,6 +2350,39 @@ main ()
return 0;
}
_ACEOF
+# FIXME: Cleanup?
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ gcc_no_link=no
+else
+ gcc_no_link=yes
+fi
+
+if test x$gcc_no_link = xyes; then
+ # Setting cross_compile will disable run tests; it will
+ # also disable AC_CHECK_FILE but that's generally
+ # correct if we can't link.
+ cross_compiling=yes
+ EXEEXT=
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files a.out a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
@@ -2486,6 +2519,7 @@ echo "${ECHO_T}$ac_cv_exeext" >&6
rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
ac_exeext=$EXEEXT
+fi
echo "$as_me:$LINENO: checking for suffix of object files" >&5
echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
if test "${ac_cv_objext+set}" = set; then
@@ -2937,7 +2971,7 @@ if test "x$GCC" = "xyes"; then
AM_FCFLAGS="-Wall"
## We like to use C99 routines when available. This makes sure that
## __STDC_VERSION__ is set such that libc includes make them available.
- AM_CFLAGS="-std=gnu99 -Wall -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -Wextra -Wwrite-strings"
+ AM_CFLAGS="-std=gnu99 -Wall -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -Wextra -Wwrite-strings"
fi
@@ -4089,7 +4123,7 @@ test x"$pic_mode" = xno && libtool_flags="$libtool_flags --prefer-non-pic"
case $host in
*-*-irix6*)
# Find out which ABI we are using.
- echo '#line 4092 "configure"' > conftest.$ac_ext
+ echo '#line 4126 "configure"' > conftest.$ac_ext
if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
(eval $ac_compile) 2>&5
ac_status=$?
@@ -4207,7 +4241,12 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
- cat >conftest.$ac_ext <<_ACEOF
+ if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
@@ -4475,7 +4514,7 @@ fi
# Provide some information about the compiler.
-echo "$as_me:4478:" \
+echo "$as_me:4517:" \
"checking for Fortran compiler version" >&5
ac_compiler=`set X $ac_compile; echo $2`
{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
@@ -4993,7 +5032,13 @@ fi
rm -f conftest*
fi
-ac_ext=c
+if test x$gcc_no_link = xyes; then
+ if test "x${ac_cv_func_mmap_fixed_mapped+set}" != xset; then
+ ac_cv_func_mmap_fixed_mapped=no
+ fi
+fi
+if test "x${ac_cv_func_mmap_fixed_mapped}" != xno; then
+ ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
@@ -5641,7 +5686,12 @@ echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- cat >conftest.$ac_ext <<_ACEOF
+ if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
@@ -5909,6 +5959,7 @@ _ACEOF
fi
rm -f conftest.mmap
+fi
echo "$as_me:$LINENO: checking for off_t" >&5
echo $ECHO_N "checking for off_t... $ECHO_C" >&6
if test "${ac_cv_type_off_t+set}" = set; then
@@ -7092,6 +7143,11 @@ if test "${ac_cv_lib_m_csin+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -7172,7 +7228,12 @@ echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- cat >conftest.$ac_ext <<_ACEOF
+ if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
@@ -7281,7 +7342,12 @@ echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- cat >conftest.$ac_ext <<_ACEOF
+ if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
@@ -7384,7 +7450,12 @@ echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- cat >conftest.$ac_ext <<_ACEOF
+ if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
@@ -7486,6 +7557,11 @@ if test "${ac_cv_lib_c_getgid+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lc $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -7558,6 +7634,11 @@ if test "${ac_cv_lib_c_getpid+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lc $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -7630,6 +7711,11 @@ if test "${ac_cv_lib_c_getuid+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lc $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -7705,6 +7791,11 @@ if test "${ac_cv_lib_m_acosf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -7777,6 +7868,11 @@ if test "${ac_cv_lib_m_asinf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -7849,6 +7945,11 @@ if test "${ac_cv_lib_m_atan2f+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -7921,6 +8022,11 @@ if test "${ac_cv_lib_m_atanf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -7993,6 +8099,11 @@ if test "${ac_cv_lib_m_ceilf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -8065,6 +8176,11 @@ if test "${ac_cv_lib_m_copysignf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -8137,6 +8253,11 @@ if test "${ac_cv_lib_m_cosf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -8209,6 +8330,11 @@ if test "${ac_cv_lib_m_coshf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -8281,6 +8407,11 @@ if test "${ac_cv_lib_m_expf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -8353,6 +8484,11 @@ if test "${ac_cv_lib_m_fabsf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -8425,6 +8561,11 @@ if test "${ac_cv_lib_m_floorf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -8497,6 +8638,11 @@ if test "${ac_cv_lib_m_frexpf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -8569,6 +8715,11 @@ if test "${ac_cv_lib_m_hypotf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -8641,6 +8792,11 @@ if test "${ac_cv_lib_m_logf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -8713,6 +8869,11 @@ if test "${ac_cv_lib_m_log10f+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -8785,6 +8946,11 @@ if test "${ac_cv_lib_m_nextafter+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -8857,6 +9023,11 @@ if test "${ac_cv_lib_m_nextafterf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -8929,6 +9100,11 @@ if test "${ac_cv_lib_m_powf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -9001,6 +9177,11 @@ if test "${ac_cv_lib_m_round+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -9073,6 +9254,11 @@ if test "${ac_cv_lib_m_roundf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -9145,6 +9331,11 @@ if test "${ac_cv_lib_m_scalbnf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -9210,6 +9401,83 @@ _ACEOF
fi
+echo "$as_me:$LINENO: checking for scalbn in -lm" >&5
+echo $ECHO_N "checking for scalbn in -lm... $ECHO_C" >&6
+if test "${ac_cv_lib_m_scalbn+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char scalbn ();
+int
+main ()
+{
+scalbn ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_m_scalbn=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_m_scalbn=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_m_scalbn" >&5
+echo "${ECHO_T}$ac_cv_lib_m_scalbn" >&6
+if test $ac_cv_lib_m_scalbn = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_SCALBN 1
+_ACEOF
+
+fi
+
echo "$as_me:$LINENO: checking for sinf in -lm" >&5
echo $ECHO_N "checking for sinf in -lm... $ECHO_C" >&6
if test "${ac_cv_lib_m_sinf+set}" = set; then
@@ -9217,6 +9485,11 @@ if test "${ac_cv_lib_m_sinf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -9289,6 +9562,11 @@ if test "${ac_cv_lib_m_sinhf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -9361,6 +9639,11 @@ if test "${ac_cv_lib_m_sqrtf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -9433,6 +9716,11 @@ if test "${ac_cv_lib_m_tanf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -9505,6 +9793,11 @@ if test "${ac_cv_lib_m_tanhf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -9570,6 +9863,160 @@ _ACEOF
fi
+echo "$as_me:$LINENO: checking for trunc in -lm" >&5
+echo $ECHO_N "checking for trunc in -lm... $ECHO_C" >&6
+if test "${ac_cv_lib_m_trunc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char trunc ();
+int
+main ()
+{
+trunc ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_m_trunc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_m_trunc=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_m_trunc" >&5
+echo "${ECHO_T}$ac_cv_lib_m_trunc" >&6
+if test $ac_cv_lib_m_trunc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_TRUNC 1
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for truncf in -lm" >&5
+echo $ECHO_N "checking for truncf in -lm... $ECHO_C" >&6
+if test "${ac_cv_lib_m_truncf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char truncf ();
+int
+main ()
+{
+truncf ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_m_truncf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_m_truncf=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_m_truncf" >&5
+echo "${ECHO_T}$ac_cv_lib_m_truncf" >&6
+if test $ac_cv_lib_m_truncf = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_TRUNCF 1
+_ACEOF
+
+fi
+
echo "$as_me:$LINENO: checking for erf in -lm" >&5
echo $ECHO_N "checking for erf in -lm... $ECHO_C" >&6
if test "${ac_cv_lib_m_erf+set}" = set; then
@@ -9577,6 +10024,11 @@ if test "${ac_cv_lib_m_erf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -9649,6 +10101,11 @@ if test "${ac_cv_lib_m_erfc+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -9721,6 +10178,11 @@ if test "${ac_cv_lib_m_erfcf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -9793,6 +10255,11 @@ if test "${ac_cv_lib_m_erff+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -9865,6 +10332,11 @@ if test "${ac_cv_lib_m_j0+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -9937,6 +10409,11 @@ if test "${ac_cv_lib_m_j0f+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -10009,6 +10486,11 @@ if test "${ac_cv_lib_m_j1+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -10081,6 +10563,11 @@ if test "${ac_cv_lib_m_j1f+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -10153,6 +10640,11 @@ if test "${ac_cv_lib_m_jn+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -10225,6 +10717,11 @@ if test "${ac_cv_lib_m_jnf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -10297,6 +10794,11 @@ if test "${ac_cv_lib_m_y0+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -10369,6 +10871,11 @@ if test "${ac_cv_lib_m_y0f+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -10441,6 +10948,11 @@ if test "${ac_cv_lib_m_y1+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -10513,6 +11025,11 @@ if test "${ac_cv_lib_m_y1f+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -10585,6 +11102,11 @@ if test "${ac_cv_lib_m_yn+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -10657,6 +11179,11 @@ if test "${ac_cv_lib_m_ynf+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -10731,6 +11258,11 @@ if test "${ac_cv_lib_m_finite+set}" = set; then
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
+if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
@@ -10890,7 +11422,12 @@ echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
if eval "test \"\${$as_ac_var+set}\" = set"; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- cat >conftest.$ac_ext <<_ACEOF
+ if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
@@ -11104,7 +11641,12 @@ echo $ECHO_N "checking whether gettimeofday can accept two arguments... $ECHO_C"
if test "${emacs_cv_gettimeofday_two_arguments+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- cat >conftest.$ac_ext <<_ACEOF
+ if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
@@ -11192,7 +11734,12 @@ else
save_CFLAGS="$CFLAGS"
CFLAGS="-O2"
- cat >conftest.$ac_ext <<_ACEOF
+ if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
@@ -11394,7 +11941,12 @@ if test "${have_attribute_alias+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- cat >conftest.$ac_ext <<_ACEOF
+ if test x$gcc_no_link = xyes; then
+ { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
+echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac
index e4b5d917581..c4c70fbc85c 100644
--- a/libgfortran/configure.ac
+++ b/libgfortran/configure.ac
@@ -201,11 +201,14 @@ AC_CHECK_LIB([m],[powf],[AC_DEFINE([HAVE_POWF],[1],[libm includes powf])])
AC_CHECK_LIB([m],[round],[AC_DEFINE([HAVE_ROUND],[1],[libm includes round])])
AC_CHECK_LIB([m],[roundf],[AC_DEFINE([HAVE_ROUNDF],[1],[libm includes roundf])])
AC_CHECK_LIB([m],[scalbnf],[AC_DEFINE([HAVE_SCALBNF],[1],[libm includes scalbnf])])
+AC_CHECK_LIB([m],[scalbn],[AC_DEFINE([HAVE_SCALBN],[1],[libm includes scalbn])])
AC_CHECK_LIB([m],[sinf],[AC_DEFINE([HAVE_SINF],[1],[libm includes sinf])])
AC_CHECK_LIB([m],[sinhf],[AC_DEFINE([HAVE_SINHF],[1],[libm includes sinhf])])
AC_CHECK_LIB([m],[sqrtf],[AC_DEFINE([HAVE_SQRTF],[1],[libm includes sqrtf])])
AC_CHECK_LIB([m],[tanf],[AC_DEFINE([HAVE_TANF],[1],[libm includes tanf])])
AC_CHECK_LIB([m],[tanhf],[AC_DEFINE([HAVE_TANHF],[1],[libm includes tanhf])])
+AC_CHECK_LIB([m],[trunc],[AC_DEFINE([HAVE_TRUNC],[1],[libm includes trunc])])
+AC_CHECK_LIB([m],[truncf],[AC_DEFINE([HAVE_TRUNCF],[1],[libm includes truncf])])
AC_CHECK_LIB([m],[erf],[AC_DEFINE([HAVE_ERF],[1],[libm includes erf])])
AC_CHECK_LIB([m],[erfc],[AC_DEFINE([HAVE_ERFC],[1],[libm includes erfc])])
AC_CHECK_LIB([m],[erfcf],[AC_DEFINE([HAVE_ERFCF],[1],[libm includes erfcf])])
diff --git a/libgfortran/generated/exp_c4.c b/libgfortran/generated/exp_c4.c
index 149d7d0d34e..c4bc41bad20 100644
--- a/libgfortran/generated/exp_c4.c
+++ b/libgfortran/generated/exp_c4.c
@@ -108,7 +108,7 @@ csqrtf (GFC_COMPLEX_4 z)
}
else
{
- COMPLEX_ASSIGN (v, fabsf (sqrt (re)),
+ COMPLEX_ASSIGN (v, fabsf (sqrtf (re)),
copysignf (0.0, im));
}
}
@@ -116,7 +116,7 @@ csqrtf (GFC_COMPLEX_4 z)
{
GFC_REAL_4 r;
- r = sqrtf (0.5 * fabs (im));
+ r = sqrtf (0.5 * fabsf (im));
COMPLEX_ASSIGN (v, copysignf (r, im), r);
}
diff --git a/libgfortran/generated/in_pack_c4.c b/libgfortran/generated/in_pack_c4.c
new file mode 100644
index 00000000000..ed3b8ec6ef6
--- /dev/null
+++ b/libgfortran/generated/in_pack_c4.c
@@ -0,0 +1,123 @@
+/* Helper function for repacking arrays.
+ Copyright 2003 Free Software Foundation, Inc.
+ Contributed by Paul Brook <paul@nowt.org>
+
+This file is part of the GNU Fortran 95 runtime library (libgfortran).
+
+Libgfortran is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+In addition to the permissions in the GNU General Public License, the
+Free Software Foundation gives you unlimited permission to link the
+compiled version of this file into combinations with other programs,
+and to distribute those combinations without any restriction coming
+from the use of this file. (The General Public License restrictions
+do apply in other respects; for example, they cover modification of
+the file, and distribution when not linked into a combine
+executable.)
+
+Libgfortran 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 libgfortran; see the file COPYING. If not,
+write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include "config.h"
+#include <stdlib.h>
+#include <assert.h>
+#include "libgfortran.h"
+
+/* Allocates a block of memory with internal_malloc if the array needs
+ repacking. */
+
+GFC_COMPLEX_4 *
+internal_pack_c4 (gfc_array_c4 * source)
+{
+ index_type count[GFC_MAX_DIMENSIONS];
+ index_type extent[GFC_MAX_DIMENSIONS];
+ index_type stride[GFC_MAX_DIMENSIONS];
+ index_type stride0;
+ index_type dim;
+ index_type ssize;
+ const GFC_COMPLEX_4 *src;
+ GFC_COMPLEX_4 *dest;
+ GFC_COMPLEX_4 *destptr;
+ int n;
+ int packed;
+
+ if (source->dim[0].stride == 0)
+ {
+ source->dim[0].stride = 1;
+ return source->data;
+ }
+
+ dim = GFC_DESCRIPTOR_RANK (source);
+ ssize = 1;
+ packed = 1;
+ for (n = 0; n < dim; n++)
+ {
+ count[n] = 0;
+ stride[n] = source->dim[n].stride;
+ extent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound;
+ if (extent[n] <= 0)
+ {
+ /* Do nothing. */
+ packed = 1;
+ break;
+ }
+
+ if (ssize != stride[n])
+ packed = 0;
+
+ ssize *= extent[n];
+ }
+
+ if (packed)
+ return source->data;
+
+ /* Allocate storage for the destination. */
+ destptr = (GFC_COMPLEX_4 *)internal_malloc_size (ssize * sizeof (GFC_COMPLEX_4));
+ dest = destptr;
+ src = source->data;
+ stride0 = stride[0];
+
+
+ while (src)
+ {
+ /* Copy the data. */
+ *(dest++) = *src;
+ /* Advance to the next element. */
+ src += stride0;
+ count[0]++;
+ /* Advance to the next source element. */
+ n = 0;
+ while (count[n] == extent[n])
+ {
+ /* When we get to the end of a dimension, reset it and increment
+ the next dimension. */
+ count[n] = 0;
+ /* We could precalculate these products, but this is a less
+ frequently used path so proabably not worth it. */
+ src -= stride[n] * extent[n];
+ n++;
+ if (n == dim)
+ {
+ src = NULL;
+ break;
+ }
+ else
+ {
+ count[n]++;
+ src += stride[n];
+ }
+ }
+ }
+ return destptr;
+}
+
diff --git a/libgfortran/generated/in_pack_c8.c b/libgfortran/generated/in_pack_c8.c
new file mode 100644
index 00000000000..e313540f7bf
--- /dev/null
+++ b/libgfortran/generated/in_pack_c8.c
@@ -0,0 +1,123 @@
+/* Helper function for repacking arrays.
+ Copyright 2003 Free Software Foundation, Inc.
+ Contributed by Paul Brook <paul@nowt.org>
+
+This file is part of the GNU Fortran 95 runtime library (libgfortran).
+
+Libgfortran is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+In addition to the permissions in the GNU General Public License, the
+Free Software Foundation gives you unlimited permission to link the
+compiled version of this file into combinations with other programs,
+and to distribute those combinations without any restriction coming
+from the use of this file. (The General Public License restrictions
+do apply in other respects; for example, they cover modification of
+the file, and distribution when not linked into a combine
+executable.)
+
+Libgfortran 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 libgfortran; see the file COPYING. If not,
+write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include "config.h"
+#include <stdlib.h>
+#include <assert.h>
+#include "libgfortran.h"
+
+/* Allocates a block of memory with internal_malloc if the array needs
+ repacking. */
+
+GFC_COMPLEX_8 *
+internal_pack_c8 (gfc_array_c8 * source)
+{
+ index_type count[GFC_MAX_DIMENSIONS];
+ index_type extent[GFC_MAX_DIMENSIONS];
+ index_type stride[GFC_MAX_DIMENSIONS];
+ index_type stride0;
+ index_type dim;
+ index_type ssize;
+ const GFC_COMPLEX_8 *src;
+ GFC_COMPLEX_8 *dest;
+ GFC_COMPLEX_8 *destptr;
+ int n;
+ int packed;
+
+ if (source->dim[0].stride == 0)
+ {
+ source->dim[0].stride = 1;
+ return source->data;
+ }
+
+ dim = GFC_DESCRIPTOR_RANK (source);
+ ssize = 1;
+ packed = 1;
+ for (n = 0; n < dim; n++)
+ {
+ count[n] = 0;
+ stride[n] = source->dim[n].stride;
+ extent[n] = source->dim[n].ubound + 1 - source->dim[n].lbound;
+ if (extent[n] <= 0)
+ {
+ /* Do nothing. */
+ packed = 1;
+ break;
+ }
+
+ if (ssize != stride[n])
+ packed = 0;
+
+ ssize *= extent[n];
+ }
+
+ if (packed)
+ return source->data;
+
+ /* Allocate storage for the destination. */
+ destptr = (GFC_COMPLEX_8 *)internal_malloc_size (ssize * sizeof (GFC_COMPLEX_8));
+ dest = destptr;
+ src = source->data;
+ stride0 = stride[0];
+
+
+ while (src)
+ {
+ /* Copy the data. */
+ *(dest++) = *src;
+ /* Advance to the next element. */
+ src += stride0;
+ count[0]++;
+ /* Advance to the next source element. */
+ n = 0;
+ while (count[n] == extent[n])
+ {
+ /* When we get to the end of a dimension, reset it and increment
+ the next dimension. */
+ count[n] = 0;
+ /* We could precalculate these products, but this is a less
+ frequently used path so proabably not worth it. */
+ src -= stride[n] * extent[n];
+ n++;
+ if (n == dim)
+ {
+ src = NULL;
+ break;
+ }
+ else
+ {
+ count[n]++;
+ src += stride[n];
+ }
+ }
+ }
+ return destptr;
+}
+
diff --git a/libgfortran/generated/in_pack_i4.c b/libgfortran/generated/in_pack_i4.c
index 72a1519b299..75ea83bda9d 100644
--- a/libgfortran/generated/in_pack_i4.c
+++ b/libgfortran/generated/in_pack_i4.c
@@ -82,7 +82,7 @@ internal_pack_4 (gfc_array_i4 * source)
return source->data;
/* Allocate storage for the destination. */
- destptr = (GFC_INTEGER_4 *)internal_malloc_size (ssize * 4);
+ destptr = (GFC_INTEGER_4 *)internal_malloc_size (ssize * sizeof (GFC_INTEGER_4));
dest = destptr;
src = source->data;
stride0 = stride[0];
diff --git a/libgfortran/generated/in_pack_i8.c b/libgfortran/generated/in_pack_i8.c
index 51c6986a288..69cc861d404 100644
--- a/libgfortran/generated/in_pack_i8.c
+++ b/libgfortran/generated/in_pack_i8.c
@@ -82,7 +82,7 @@ internal_pack_8 (gfc_array_i8 * source)
return source->data;
/* Allocate storage for the destination. */
- destptr = (GFC_INTEGER_8 *)internal_malloc_size (ssize * 8);
+ destptr = (GFC_INTEGER_8 *)internal_malloc_size (ssize * sizeof (GFC_INTEGER_8));
dest = destptr;
src = source->data;
stride0 = stride[0];
diff --git a/libgfortran/generated/in_unpack_c4.c b/libgfortran/generated/in_unpack_c4.c
new file mode 100644
index 00000000000..e24939e5e52
--- /dev/null
+++ b/libgfortran/generated/in_unpack_c4.c
@@ -0,0 +1,111 @@
+/* Helper function for repacking arrays.
+ Copyright 2003 Free Software Foundation, Inc.
+ Contributed by Paul Brook <paul@nowt.org>
+
+This file is part of the GNU Fortran 95 runtime library (libgfortran).
+
+Libgfortran is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+In addition to the permissions in the GNU General Public License, the
+Free Software Foundation gives you unlimited permission to link the
+compiled version of this file into combinations with other programs,
+and to distribute those combinations without any restriction coming
+from the use of this file. (The General Public License restrictions
+do apply in other respects; for example, they cover modification of
+the file, and distribution when not linked into a combine
+executable.)
+
+Libgfortran 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 libgfortran; see the file COPYING. If not,
+write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include "config.h"
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include "libgfortran.h"
+
+void
+internal_unpack_c4 (gfc_array_c4 * d, const GFC_COMPLEX_4 * src)
+{
+ index_type count[GFC_MAX_DIMENSIONS];
+ index_type extent[GFC_MAX_DIMENSIONS];
+ index_type stride[GFC_MAX_DIMENSIONS];
+ index_type stride0;
+ index_type dim;
+ index_type dsize;
+ GFC_COMPLEX_4 *dest;
+ int n;
+
+ dest = d->data;
+ if (src == dest || !src)
+ return;
+
+ if (d->dim[0].stride == 0)
+ d->dim[0].stride = 1;
+
+ dim = GFC_DESCRIPTOR_RANK (d);
+ dsize = 1;
+ for (n = 0; n < dim; n++)
+ {
+ count[n] = 0;
+ stride[n] = d->dim[n].stride;
+ extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound;
+ if (extent[n] <= 0)
+ abort ();
+
+ if (dsize == stride[n])
+ dsize *= extent[n];
+ else
+ dsize = 0;
+ }
+
+ if (dsize != 0)
+ {
+ memcpy (dest, src, dsize * sizeof (GFC_COMPLEX_4));
+ return;
+ }
+
+ stride0 = stride[0];
+
+ while (dest)
+ {
+ /* Copy the data. */
+ *dest = *(src++);
+ /* Advance to the next element. */
+ dest += stride0;
+ count[0]++;
+ /* Advance to the next source element. */
+ n = 0;
+ while (count[n] == extent[n])
+ {
+ /* When we get to the end of a dimension, reset it and increment
+ the next dimension. */
+ count[n] = 0;
+ /* We could precalculate these products, but this is a less
+ frequently used path so proabably not worth it. */
+ dest -= stride[n] * extent[n];
+ n++;
+ if (n == dim)
+ {
+ dest = NULL;
+ break;
+ }
+ else
+ {
+ count[n]++;
+ dest += stride[n];
+ }
+ }
+ }
+}
+
diff --git a/libgfortran/generated/in_unpack_c8.c b/libgfortran/generated/in_unpack_c8.c
new file mode 100644
index 00000000000..66865075c02
--- /dev/null
+++ b/libgfortran/generated/in_unpack_c8.c
@@ -0,0 +1,111 @@
+/* Helper function for repacking arrays.
+ Copyright 2003 Free Software Foundation, Inc.
+ Contributed by Paul Brook <paul@nowt.org>
+
+This file is part of the GNU Fortran 95 runtime library (libgfortran).
+
+Libgfortran is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+In addition to the permissions in the GNU General Public License, the
+Free Software Foundation gives you unlimited permission to link the
+compiled version of this file into combinations with other programs,
+and to distribute those combinations without any restriction coming
+from the use of this file. (The General Public License restrictions
+do apply in other respects; for example, they cover modification of
+the file, and distribution when not linked into a combine
+executable.)
+
+Libgfortran 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 libgfortran; see the file COPYING. If not,
+write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#include "config.h"
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include "libgfortran.h"
+
+void
+internal_unpack_c8 (gfc_array_c8 * d, const GFC_COMPLEX_8 * src)
+{
+ index_type count[GFC_MAX_DIMENSIONS];
+ index_type extent[GFC_MAX_DIMENSIONS];
+ index_type stride[GFC_MAX_DIMENSIONS];
+ index_type stride0;
+ index_type dim;
+ index_type dsize;
+ GFC_COMPLEX_8 *dest;
+ int n;
+
+ dest = d->data;
+ if (src == dest || !src)
+ return;
+
+ if (d->dim[0].stride == 0)
+ d->dim[0].stride = 1;
+
+ dim = GFC_DESCRIPTOR_RANK (d);
+ dsize = 1;
+ for (n = 0; n < dim; n++)
+ {
+ count[n] = 0;
+ stride[n] = d->dim[n].stride;
+ extent[n] = d->dim[n].ubound + 1 - d->dim[n].lbound;
+ if (extent[n] <= 0)
+ abort ();
+
+ if (dsize == stride[n])
+ dsize *= extent[n];
+ else
+ dsize = 0;
+ }
+
+ if (dsize != 0)
+ {
+ memcpy (dest, src, dsize * sizeof (GFC_COMPLEX_8));
+ return;
+ }
+
+ stride0 = stride[0];
+
+ while (dest)
+ {
+ /* Copy the data. */
+ *dest = *(src++);
+ /* Advance to the next element. */
+ dest += stride0;
+ count[0]++;
+ /* Advance to the next source element. */
+ n = 0;
+ while (count[n] == extent[n])
+ {
+ /* When we get to the end of a dimension, reset it and increment
+ the next dimension. */
+ count[n] = 0;
+ /* We could precalculate these products, but this is a less
+ frequently used path so proabably not worth it. */
+ dest -= stride[n] * extent[n];
+ n++;
+ if (n == dim)
+ {
+ dest = NULL;
+ break;
+ }
+ else
+ {
+ count[n]++;
+ dest += stride[n];
+ }
+ }
+ }
+}
+
diff --git a/libgfortran/generated/in_unpack_i4.c b/libgfortran/generated/in_unpack_i4.c
index 92561a21d7e..4759568d73a 100644
--- a/libgfortran/generated/in_unpack_i4.c
+++ b/libgfortran/generated/in_unpack_i4.c
@@ -71,7 +71,7 @@ internal_unpack_4 (gfc_array_i4 * d, const GFC_INTEGER_4 * src)
if (dsize != 0)
{
- memcpy (dest, src, dsize * 4);
+ memcpy (dest, src, dsize * sizeof (GFC_INTEGER_4));
return;
}
diff --git a/libgfortran/generated/in_unpack_i8.c b/libgfortran/generated/in_unpack_i8.c
index 1f3e6a23dd3..28c3a90f6af 100644
--- a/libgfortran/generated/in_unpack_i8.c
+++ b/libgfortran/generated/in_unpack_i8.c
@@ -71,7 +71,7 @@ internal_unpack_8 (gfc_array_i8 * d, const GFC_INTEGER_8 * src)
if (dsize != 0)
{
- memcpy (dest, src, dsize * 8);
+ memcpy (dest, src, dsize * sizeof (GFC_INTEGER_8));
return;
}
diff --git a/libgfortran/generated/matmul_c4.c b/libgfortran/generated/matmul_c4.c
index 5eb8b44631b..c63d343ea82 100644
--- a/libgfortran/generated/matmul_c4.c
+++ b/libgfortran/generated/matmul_c4.c
@@ -178,7 +178,14 @@ matmul_c4 (gfc_array_c4 * retarray, gfc_array_c4 * a, gfc_array_c4 * b)
GFC_COMPLEX_4 *abase_n;
GFC_COMPLEX_4 bbase_yn;
- memset (dest, 0, (sizeof (GFC_COMPLEX_4) * size0((array_t *) retarray)));
+ if (rystride == ycount)
+ memset (dest, 0, (sizeof (GFC_COMPLEX_4) * size0((array_t *) retarray)));
+ else
+ {
+ for (y = 0; y < ycount; y++)
+ for (x = 0; x < xcount; x++)
+ dest[x + y*rystride] = (GFC_COMPLEX_4)0;
+ }
for (y = 0; y < ycount; y++)
{
diff --git a/libgfortran/generated/matmul_c8.c b/libgfortran/generated/matmul_c8.c
index 181f4c9cc4d..98326d135d8 100644
--- a/libgfortran/generated/matmul_c8.c
+++ b/libgfortran/generated/matmul_c8.c
@@ -178,7 +178,14 @@ matmul_c8 (gfc_array_c8 * retarray, gfc_array_c8 * a, gfc_array_c8 * b)
GFC_COMPLEX_8 *abase_n;
GFC_COMPLEX_8 bbase_yn;
- memset (dest, 0, (sizeof (GFC_COMPLEX_8) * size0((array_t *) retarray)));
+ if (rystride == ycount)
+ memset (dest, 0, (sizeof (GFC_COMPLEX_8) * size0((array_t *) retarray)));
+ else
+ {
+ for (y = 0; y < ycount; y++)
+ for (x = 0; x < xcount; x++)
+ dest[x + y*rystride] = (GFC_COMPLEX_8)0;
+ }
for (y = 0; y < ycount; y++)
{
diff --git a/libgfortran/generated/matmul_i4.c b/libgfortran/generated/matmul_i4.c
index f214ba5ec0c..9dde570b73a 100644
--- a/libgfortran/generated/matmul_i4.c
+++ b/libgfortran/generated/matmul_i4.c
@@ -178,7 +178,14 @@ matmul_i4 (gfc_array_i4 * retarray, gfc_array_i4 * a, gfc_array_i4 * b)
GFC_INTEGER_4 *abase_n;
GFC_INTEGER_4 bbase_yn;
- memset (dest, 0, (sizeof (GFC_INTEGER_4) * size0((array_t *) retarray)));
+ if (rystride == ycount)
+ memset (dest, 0, (sizeof (GFC_INTEGER_4) * size0((array_t *) retarray)));
+ else
+ {
+ for (y = 0; y < ycount; y++)
+ for (x = 0; x < xcount; x++)
+ dest[x + y*rystride] = (GFC_INTEGER_4)0;
+ }
for (y = 0; y < ycount; y++)
{
diff --git a/libgfortran/generated/matmul_i8.c b/libgfortran/generated/matmul_i8.c
index 5e0e6a792f9..18d877e20f9 100644
--- a/libgfortran/generated/matmul_i8.c
+++ b/libgfortran/generated/matmul_i8.c
@@ -178,7 +178,14 @@ matmul_i8 (gfc_array_i8 * retarray, gfc_array_i8 * a, gfc_array_i8 * b)
GFC_INTEGER_8 *abase_n;
GFC_INTEGER_8 bbase_yn;
- memset (dest, 0, (sizeof (GFC_INTEGER_8) * size0((array_t *) retarray)));
+ if (rystride == ycount)
+ memset (dest, 0, (sizeof (GFC_INTEGER_8) * size0((array_t *) retarray)));
+ else
+ {
+ for (y = 0; y < ycount; y++)
+ for (x = 0; x < xcount; x++)
+ dest[x + y*rystride] = (GFC_INTEGER_8)0;
+ }
for (y = 0; y < ycount; y++)
{
diff --git a/libgfortran/generated/matmul_r4.c b/libgfortran/generated/matmul_r4.c
index b6014d0dbce..642dc943837 100644
--- a/libgfortran/generated/matmul_r4.c
+++ b/libgfortran/generated/matmul_r4.c
@@ -178,7 +178,14 @@ matmul_r4 (gfc_array_r4 * retarray, gfc_array_r4 * a, gfc_array_r4 * b)
GFC_REAL_4 *abase_n;
GFC_REAL_4 bbase_yn;
- memset (dest, 0, (sizeof (GFC_REAL_4) * size0((array_t *) retarray)));
+ if (rystride == ycount)
+ memset (dest, 0, (sizeof (GFC_REAL_4) * size0((array_t *) retarray)));
+ else
+ {
+ for (y = 0; y < ycount; y++)
+ for (x = 0; x < xcount; x++)
+ dest[x + y*rystride] = (GFC_REAL_4)0;
+ }
for (y = 0; y < ycount; y++)
{
diff --git a/libgfortran/generated/matmul_r8.c b/libgfortran/generated/matmul_r8.c
index 5bf21f60404..1eb53cd6c67 100644
--- a/libgfortran/generated/matmul_r8.c
+++ b/libgfortran/generated/matmul_r8.c
@@ -178,7 +178,14 @@ matmul_r8 (gfc_array_r8 * retarray, gfc_array_r8 * a, gfc_array_r8 * b)
GFC_REAL_8 *abase_n;
GFC_REAL_8 bbase_yn;
- memset (dest, 0, (sizeof (GFC_REAL_8) * size0((array_t *) retarray)));
+ if (rystride == ycount)
+ memset (dest, 0, (sizeof (GFC_REAL_8) * size0((array_t *) retarray)));
+ else
+ {
+ for (y = 0; y < ycount; y++)
+ for (x = 0; x < xcount; x++)
+ dest[x + y*rystride] = (GFC_REAL_8)0;
+ }
for (y = 0; y < ycount; y++)
{
diff --git a/libgfortran/generated/reshape_c4.c b/libgfortran/generated/reshape_c4.c
index 02d73d258d1..4a9c14d56f6 100644
--- a/libgfortran/generated/reshape_c4.c
+++ b/libgfortran/generated/reshape_c4.c
@@ -174,9 +174,9 @@ reshape_c4 (gfc_array_c4 * ret, gfc_array_c4 * source, shape_type * shape,
if (rsize != 0 && ssize != 0 && psize != 0)
{
- rsize *= 4;
- ssize *= 4;
- psize *= 4;
+ rsize *= sizeof (GFC_COMPLEX_4);
+ ssize *= sizeof (GFC_COMPLEX_4);
+ psize *= sizeof (GFC_COMPLEX_4);
reshape_packed ((char *)ret->data, rsize, (char *)source->data,
ssize, pad ? (char *)pad->data : NULL, psize);
return;
diff --git a/libgfortran/generated/reshape_c8.c b/libgfortran/generated/reshape_c8.c
index e6ddf1a1bb9..c12735a4e1e 100644
--- a/libgfortran/generated/reshape_c8.c
+++ b/libgfortran/generated/reshape_c8.c
@@ -174,9 +174,9 @@ reshape_c8 (gfc_array_c8 * ret, gfc_array_c8 * source, shape_type * shape,
if (rsize != 0 && ssize != 0 && psize != 0)
{
- rsize *= 8;
- ssize *= 8;
- psize *= 8;
+ rsize *= sizeof (GFC_COMPLEX_8);
+ ssize *= sizeof (GFC_COMPLEX_8);
+ psize *= sizeof (GFC_COMPLEX_8);
reshape_packed ((char *)ret->data, rsize, (char *)source->data,
ssize, pad ? (char *)pad->data : NULL, psize);
return;
diff --git a/libgfortran/generated/reshape_i4.c b/libgfortran/generated/reshape_i4.c
index b90e56caf4e..465ca24381b 100644
--- a/libgfortran/generated/reshape_i4.c
+++ b/libgfortran/generated/reshape_i4.c
@@ -174,9 +174,9 @@ reshape_4 (gfc_array_i4 * ret, gfc_array_i4 * source, shape_type * shape,
if (rsize != 0 && ssize != 0 && psize != 0)
{
- rsize *= 4;
- ssize *= 4;
- psize *= 4;
+ rsize *= sizeof (GFC_INTEGER_4);
+ ssize *= sizeof (GFC_INTEGER_4);
+ psize *= sizeof (GFC_INTEGER_4);
reshape_packed ((char *)ret->data, rsize, (char *)source->data,
ssize, pad ? (char *)pad->data : NULL, psize);
return;
diff --git a/libgfortran/generated/reshape_i8.c b/libgfortran/generated/reshape_i8.c
index 38532c1aac5..41a25ff66ba 100644
--- a/libgfortran/generated/reshape_i8.c
+++ b/libgfortran/generated/reshape_i8.c
@@ -174,9 +174,9 @@ reshape_8 (gfc_array_i8 * ret, gfc_array_i8 * source, shape_type * shape,
if (rsize != 0 && ssize != 0 && psize != 0)
{
- rsize *= 8;
- ssize *= 8;
- psize *= 8;
+ rsize *= sizeof (GFC_INTEGER_8);
+ ssize *= sizeof (GFC_INTEGER_8);
+ psize *= sizeof (GFC_INTEGER_8);
reshape_packed ((char *)ret->data, rsize, (char *)source->data,
ssize, pad ? (char *)pad->data : NULL, psize);
return;
diff --git a/libgfortran/intrinsics/c99_functions.c b/libgfortran/intrinsics/c99_functions.c
index f7dc9777dd8..dfdb71e7427 100644
--- a/libgfortran/intrinsics/c99_functions.c
+++ b/libgfortran/intrinsics/c99_functions.c
@@ -154,6 +154,14 @@ log10f(float x)
}
#endif
+#ifndef HAVE_SCALBN
+double
+scalbn(double x, int y)
+{
+ return x * pow(FLT_RADIX, y);
+}
+#endif
+
#ifndef HAVE_SCALBNF
float
scalbnf(float x, int y)
@@ -202,6 +210,28 @@ tanhf(float x)
}
#endif
+#ifndef HAVE_TRUNC
+double
+trunc(double x)
+{
+ if (!isfinite (x))
+ return x;
+
+ if (x < 0.0)
+ return - floor (-x);
+ else
+ return floor (x);
+}
+#endif
+
+#ifndef HAVE_TRUNCF
+float
+truncf(float x)
+{
+ return (float) trunc (x);
+}
+#endif
+
#ifndef HAVE_NEXTAFTERF
/* This is a portable implementation of nextafterf that is intended to be
independent of the floating point format or its in memory representation.
diff --git a/libgfortran/intrinsics/unpack_generic.c b/libgfortran/intrinsics/unpack_generic.c
index 57eb30c6480..a5c098b0e81 100644
--- a/libgfortran/intrinsics/unpack_generic.c
+++ b/libgfortran/intrinsics/unpack_generic.c
@@ -1,5 +1,5 @@
-/* Generic implementation of the RESHAPE intrinsic
- Copyright 2002 Free Software Foundation, Inc.
+/* Generic implementation of the UNPACK intrinsic
+ Copyright 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by Paul Brook <paul@nowt.org>
This file is part of the GNU Fortran 95 runtime library (libgfortran).
@@ -34,17 +34,18 @@ Boston, MA 02111-1307, USA. */
#include <string.h>
#include "libgfortran.h"
-extern void unpack1 (const gfc_array_char *, const gfc_array_char *,
+extern void unpack1 (gfc_array_char *, const gfc_array_char *,
const gfc_array_l4 *, const gfc_array_char *);
iexport_proto(unpack1);
void
-unpack1 (const gfc_array_char *ret, const gfc_array_char *vector,
+unpack1 (gfc_array_char *ret, const gfc_array_char *vector,
const gfc_array_l4 *mask, const gfc_array_char *field)
{
/* r.* indicates the return array. */
index_type rstride[GFC_MAX_DIMENSIONS];
index_type rstride0;
+ index_type rs;
char *rptr;
/* v.* indicates the vector array. */
index_type vstride0;
@@ -68,17 +69,41 @@ unpack1 (const gfc_array_char *ret, const gfc_array_char *vector,
size = GFC_DESCRIPTOR_SIZE (ret);
/* A field element size of 0 actually means this is a scalar. */
fsize = GFC_DESCRIPTOR_SIZE (field);
- dim = GFC_DESCRIPTOR_RANK (ret);
- for (n = 0; n < dim; n++)
+ if (ret->data == NULL)
{
- count[n] = 0;
- extent[n] = ret->dim[n].ubound + 1 - ret->dim[n].lbound;
- rstride[n] = ret->dim[n].stride * size;
- fstride[n] = field->dim[n].stride * fsize;
- mstride[n] = mask->dim[n].stride;
+ /* The front end has signalled that we need to populate the
+ return array descriptor. */
+ dim = GFC_DESCRIPTOR_RANK (mask);
+ rs = 1;
+ for (n = 0; n < dim; n++)
+ {
+ count[n] = 0;
+ ret->dim[n].stride = rs;
+ ret->dim[n].lbound = 0;
+ ret->dim[n].ubound = mask->dim[n].ubound - mask->dim[n].lbound;
+ extent[n] = ret->dim[n].ubound + 1;
+ rstride[n] = ret->dim[n].stride * size;
+ fstride[n] = field->dim[n].stride * fsize;
+ mstride[n] = mask->dim[n].stride;
+ rs *= extent[n];
+ }
+ ret->base = 0;
+ ret->data = internal_malloc_size (rs * size);
+ }
+ else
+ {
+ dim = GFC_DESCRIPTOR_RANK (ret);
+ for (n = 0; n < dim; n++)
+ {
+ count[n] = 0;
+ extent[n] = ret->dim[n].ubound + 1 - ret->dim[n].lbound;
+ rstride[n] = ret->dim[n].stride * size;
+ fstride[n] = field->dim[n].stride * fsize;
+ mstride[n] = mask->dim[n].stride;
+ }
+ if (rstride[0] == 0)
+ rstride[0] = size;
}
- if (rstride[0] == 0)
- rstride[0] = size;
if (fstride[0] == 0)
fstride[0] = fsize;
if (mstride[0] == 0)
diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c
index 413a664542d..229a937b05b 100644
--- a/libgfortran/io/format.c
+++ b/libgfortran/io/format.c
@@ -579,6 +579,7 @@ parse_format_list (void)
case FMT_DOLLAR:
get_fnode (&head, &tail, FMT_DOLLAR);
+ tail->repeat = 1;
goto between_desc;
case FMT_T:
diff --git a/libgfortran/io/read.c b/libgfortran/io/read.c
index 1c8b3b0daa8..fbd38f13bec 100644
--- a/libgfortran/io/read.c
+++ b/libgfortran/io/read.c
@@ -504,23 +504,7 @@ read_f (fnode * f, char *dest, int length)
p = eat_leading_spaces (&w, p);
if (w == 0)
- {
- switch (length)
- {
- case 4:
- *((float *) dest) = 0.0f;
- break;
-
- case 8:
- *((double *) dest) = 0.0;
- break;
-
- default:
- internal_error ("Unsupported real kind during IO");
- }
-
- return;
- }
+ goto zero;
/* Optional sign */
@@ -529,12 +513,13 @@ read_f (fnode * f, char *dest, int length)
if (*p == '-')
val_sign = -1;
p++;
-
- if (--w == 0)
- goto bad_float;
+ w--;
}
exponent_sign = 1;
+ p = eat_leading_spaces (&w, p);
+ if (w == 0)
+ goto zero;
/* A digit, a '.' or a exponent character ('e', 'E', 'd' or 'D')
is required at this point */
@@ -604,6 +589,23 @@ read_f (fnode * f, char *dest, int length)
generate_error (ERROR_READ_VALUE, "Bad value during floating point read");
return;
+ /* The value read is zero */
+ zero:
+ switch (length)
+ {
+ case 4:
+ *((float *) dest) = 0.0f;
+ break;
+
+ case 8:
+ *((double *) dest) = 0.0;
+ break;
+
+ default:
+ internal_error ("Unsupported real kind during IO");
+ }
+ return;
+
/* At this point the start of an exponent has been found */
exp1:
while (w > 0 && *p == ' ')
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index b51da52204e..46bec834a27 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -191,7 +191,7 @@ read_sf (int *length)
/* If we see an EOR during non-advancing I/O, we need to skip
the rest of the I/O statement. Set the corresponding flag. */
- if (advance_status == ADVANCE_NO)
+ if (advance_status == ADVANCE_NO || g.seen_dollar)
eor_condition = 1;
/* Without padding, terminate the I/O statement without assigning
@@ -1187,7 +1187,7 @@ data_transfer_init (int read_flag)
}
else
{
- if (advance_status == ADVANCE_YES)
+ if (advance_status == ADVANCE_YES && !g.seen_dollar)
current_unit->read_bad = 1;
}
@@ -1459,11 +1459,12 @@ finalize_transfer (void)
{
free_fnodes ();
- if (advance_status == ADVANCE_NO)
+ if (advance_status == ADVANCE_NO || g.seen_dollar)
{
/* Most systems buffer lines, so force the partial record
to be written out. */
flush (current_unit->s);
+ g.seen_dollar = 0;
return;
}
diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c
index 462d48df19a..f82ffa73041 100644
--- a/libgfortran/io/unix.c
+++ b/libgfortran/io/unix.c
@@ -542,8 +542,11 @@ fd_close (unix_stream * s)
if (s->buffer != NULL && s->buffer != s->small_buffer)
free_mem (s->buffer);
- if (close (s->fd) < 0)
- return FAILURE;
+ if (s->fd != STDOUT_FILENO && s->fd != STDERR_FILENO)
+ {
+ if (close (s->fd) < 0)
+ return FAILURE;
+ }
free_mem (s);
diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c
index 36fee925988..793031a9375 100644
--- a/libgfortran/io/write.c
+++ b/libgfortran/io/write.c
@@ -296,6 +296,7 @@ output_float (fnode *f, double value)
int nblanks;
int i;
sign_t sign;
+ double abslog;
ft = f->format;
w = f->u.real.w;
@@ -320,9 +321,11 @@ output_float (fnode *f, double value)
edigits = 2;
else
{
- edigits = 1 + (int) log10 (fabs(log10 (value)));
- if (edigits < 2)
+ abslog = fabs(log10 (value));
+ if (abslog < 100)
edigits = 2;
+ else
+ edigits = 1 + (int) log10 (abslog);
}
if (ft == FMT_F || ft == FMT_EN
diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h
index c525fad7a2e..e5485d1ba8b 100644
--- a/libgfortran/libgfortran.h
+++ b/libgfortran/libgfortran.h
@@ -482,7 +482,7 @@ internal_proto(reshape_packed);
/* Repacking functions. */
-/* ??? These four aren't currently used by the compiler, though we
+/* ??? These eight aren't currently used by the compiler, though we
certainly could do so. */
GFC_INTEGER_4 *internal_pack_4 (gfc_array_i4 *);
internal_proto(internal_pack_4);
@@ -490,12 +490,24 @@ internal_proto(internal_pack_4);
GFC_INTEGER_8 *internal_pack_8 (gfc_array_i8 *);
internal_proto(internal_pack_8);
+GFC_COMPLEX_4 *internal_pack_c4 (gfc_array_c4 *);
+internal_proto(internal_pack_c4);
+
+GFC_COMPLEX_8 *internal_pack_c8 (gfc_array_c8 *);
+internal_proto(internal_pack_c8);
+
extern void internal_unpack_4 (gfc_array_i4 *, const GFC_INTEGER_4 *);
internal_proto(internal_unpack_4);
extern void internal_unpack_8 (gfc_array_i8 *, const GFC_INTEGER_8 *);
internal_proto(internal_unpack_8);
+extern void internal_unpack_c4 (gfc_array_c4 *, const GFC_COMPLEX_4 *);
+internal_proto(internal_unpack_c4);
+
+extern void internal_unpack_c8 (gfc_array_c8 *, const GFC_COMPLEX_8 *);
+internal_proto(internal_unpack_c8);
+
/* string_intrinsics.c */
extern GFC_INTEGER_4 compare_string (GFC_INTEGER_4, const char *,
diff --git a/libgfortran/m4/cexp.m4 b/libgfortran/m4/cexp.m4
index 13e34da841d..7b92b790447 100644
--- a/libgfortran/m4/cexp.m4
+++ b/libgfortran/m4/cexp.m4
@@ -109,7 +109,7 @@ csqrt`'q (complex_type z)
}
else
{
- COMPLEX_ASSIGN (v, fabs`'q (sqrt (re)),
+ COMPLEX_ASSIGN (v, fabs`'q (sqrt`'q (re)),
copysign`'q (0.0, im));
}
}
@@ -117,7 +117,7 @@ csqrt`'q (complex_type z)
{
real_type r;
- r = sqrt`'q (0.5 * fabs (im));
+ r = sqrt`'q (0.5 * fabs`'q (im));
COMPLEX_ASSIGN (v, copysign`'q (r, im), r);
}
diff --git a/libgfortran/m4/in_pack.m4 b/libgfortran/m4/in_pack.m4
index b2eac40581f..819cb3e2c33 100644
--- a/libgfortran/m4/in_pack.m4
+++ b/libgfortran/m4/in_pack.m4
@@ -37,9 +37,10 @@ include(iparm.m4)dnl
/* Allocates a block of memory with internal_malloc if the array needs
repacking. */
-dnl Only the kind (ie size) is used to name the function.
+dnl The kind (ie size) is used to name the function for logicals, integers
+dnl and reals. For complex, it's c4 or c8.
rtype_name *
-`internal_pack_'rtype_kind (rtype * source)
+`internal_pack_'rtype_ccode (rtype * source)
{
index_type count[GFC_MAX_DIMENSIONS];
index_type extent[GFC_MAX_DIMENSIONS];
@@ -84,7 +85,7 @@ rtype_name *
return source->data;
/* Allocate storage for the destination. */
- destptr = (rtype_name *)internal_malloc_size (ssize * rtype_kind);
+ destptr = (rtype_name *)internal_malloc_size (ssize * sizeof (rtype_name));
dest = destptr;
src = source->data;
stride0 = stride[0];
diff --git a/libgfortran/m4/in_unpack.m4 b/libgfortran/m4/in_unpack.m4
index ea9ccc89f76..47ae51d9ac0 100644
--- a/libgfortran/m4/in_unpack.m4
+++ b/libgfortran/m4/in_unpack.m4
@@ -35,9 +35,10 @@ Boston, MA 02111-1307, USA. */
#include "libgfortran.h"'
include(iparm.m4)dnl
-dnl Only the kind (ie size) is used to name the function.
+dnl Only the kind (ie size) is used to name the function for integers,
+dnl reals and logicals. For complex, it's c4 and c8.
void
-`internal_unpack_'rtype_kind (rtype * d, const rtype_name * src)
+`internal_unpack_'rtype_ccode (rtype * d, const rtype_name * src)
{
index_type count[GFC_MAX_DIMENSIONS];
index_type extent[GFC_MAX_DIMENSIONS];
@@ -73,7 +74,7 @@ void
if (dsize != 0)
{
- memcpy (dest, src, dsize * rtype_kind);
+ memcpy (dest, src, dsize * sizeof (rtype_name));
return;
}
diff --git a/libgfortran/m4/matmul.m4 b/libgfortran/m4/matmul.m4
index dd75cf7b073..1801583f026 100644
--- a/libgfortran/m4/matmul.m4
+++ b/libgfortran/m4/matmul.m4
@@ -180,7 +180,14 @@ sinclude(`matmul_asm_'rtype_code`.m4')dnl
rtype_name *abase_n;
rtype_name bbase_yn;
- memset (dest, 0, (sizeof (rtype_name) * size0((array_t *) retarray)));
+ if (rystride == ycount)
+ memset (dest, 0, (sizeof (rtype_name) * size0((array_t *) retarray)));
+ else
+ {
+ for (y = 0; y < ycount; y++)
+ for (x = 0; x < xcount; x++)
+ dest[x + y*rystride] = (rtype_name)0;
+ }
for (y = 0; y < ycount; y++)
{
diff --git a/libgfortran/m4/reshape.m4 b/libgfortran/m4/reshape.m4
index 6b411f001ad..ae26a88aef0 100644
--- a/libgfortran/m4/reshape.m4
+++ b/libgfortran/m4/reshape.m4
@@ -176,9 +176,9 @@ reshape_`'rtype_ccode (rtype * ret, rtype * source, shape_type * shape,
if (rsize != 0 && ssize != 0 && psize != 0)
{
- rsize *= rtype_kind;
- ssize *= rtype_kind;
- psize *= rtype_kind;
+ rsize *= sizeof (rtype_name);
+ ssize *= sizeof (rtype_name);
+ psize *= sizeof (rtype_name);
reshape_packed ((char *)ret->data, rsize, (char *)source->data,
ssize, pad ? (char *)pad->data : NULL, psize);
return;
diff --git a/libgfortran/runtime/in_pack_generic.c b/libgfortran/runtime/in_pack_generic.c
index e3e1c53c201..23810cf8320 100644
--- a/libgfortran/runtime/in_pack_generic.c
+++ b/libgfortran/runtime/in_pack_generic.c
@@ -1,5 +1,5 @@
/* Generic helper function for repacking arrays.
- Copyright 2003 Free Software Foundation, Inc.
+ Copyright 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by Paul Brook <paul@nowt.org>
This file is part of the GNU Fortran 95 runtime library (libgfortran).
@@ -40,9 +40,9 @@ export_proto(internal_pack);
void *
internal_pack (gfc_array_char * source)
{
- index_type count[GFC_MAX_DIMENSIONS - 1];
- index_type extent[GFC_MAX_DIMENSIONS - 1];
- index_type stride[GFC_MAX_DIMENSIONS - 1];
+ index_type count[GFC_MAX_DIMENSIONS];
+ index_type extent[GFC_MAX_DIMENSIONS];
+ index_type stride[GFC_MAX_DIMENSIONS];
index_type stride0;
index_type dim;
index_type ssize;
@@ -52,6 +52,7 @@ internal_pack (gfc_array_char * source)
int n;
int packed;
index_type size;
+ int type;
if (source->dim[0].stride == 0)
{
@@ -59,14 +60,36 @@ internal_pack (gfc_array_char * source)
return source->data;
}
+ type = GFC_DESCRIPTOR_TYPE (source);
size = GFC_DESCRIPTOR_SIZE (source);
- switch (size)
+ switch (type)
{
- case 4:
- return internal_pack_4 ((gfc_array_i4 *)source);
-
- case 8:
- return internal_pack_8 ((gfc_array_i8 *)source);
+ case GFC_DTYPE_INTEGER:
+ case GFC_DTYPE_LOGICAL:
+ case GFC_DTYPE_REAL:
+ switch (size)
+ {
+ case 4:
+ return internal_pack_4 ((gfc_array_i4 *)source);
+
+ case 8:
+ return internal_pack_8 ((gfc_array_i8 *)source);
+ }
+ break;
+
+ case GFC_DTYPE_COMPLEX:
+ switch (size)
+ {
+ case 8:
+ return internal_pack_c4 ((gfc_array_c4 *)source);
+
+ case 16:
+ return internal_pack_c8 ((gfc_array_c8 *)source);
+ }
+ break;
+
+ default:
+ break;
}
dim = GFC_DESCRIPTOR_RANK (source);
diff --git a/libgfortran/runtime/in_unpack_generic.c b/libgfortran/runtime/in_unpack_generic.c
index b0882b4a356..1e8ac6b7a47 100644
--- a/libgfortran/runtime/in_unpack_generic.c
+++ b/libgfortran/runtime/in_unpack_generic.c
@@ -1,5 +1,5 @@
/* Generic helper function for repacking arrays.
- Copyright 2003 Free Software Foundation, Inc.
+ Copyright 2003, 2004, 2005 Free Software Foundation, Inc.
Contributed by Paul Brook <paul@nowt.org>
This file is part of the GNU Fortran 95 runtime library (libgfortran).
@@ -40,9 +40,9 @@ export_proto(internal_unpack);
void
internal_unpack (gfc_array_char * d, const void * s)
{
- index_type count[GFC_MAX_DIMENSIONS - 1];
- index_type extent[GFC_MAX_DIMENSIONS - 1];
- index_type stride[GFC_MAX_DIMENSIONS - 1];
+ index_type count[GFC_MAX_DIMENSIONS];
+ index_type extent[GFC_MAX_DIMENSIONS];
+ index_type stride[GFC_MAX_DIMENSIONS];
index_type stride0;
index_type dim;
index_type dsize;
@@ -50,22 +50,45 @@ internal_unpack (gfc_array_char * d, const void * s)
const char *src;
int n;
int size;
+ int type;
dest = d->data;
/* This check may be redundant, but do it anyway. */
if (s == dest || !s)
return;
+ type = GFC_DESCRIPTOR_TYPE (d);
size = GFC_DESCRIPTOR_SIZE (d);
- switch (size)
+ switch (type)
{
- case 4:
- internal_unpack_4 ((gfc_array_i4 *)d, (const GFC_INTEGER_4 *)s);
- return;
-
- case 8:
- internal_unpack_8 ((gfc_array_i8 *)d, (const GFC_INTEGER_8 *)s);
- return;
+ case GFC_DTYPE_INTEGER:
+ case GFC_DTYPE_LOGICAL:
+ case GFC_DTYPE_REAL:
+ switch (size)
+ {
+ case 4:
+ internal_unpack_4 ((gfc_array_i4 *)d, (const GFC_INTEGER_4 *)s);
+ return;
+
+ case 8:
+ internal_unpack_8 ((gfc_array_i8 *)d, (const GFC_INTEGER_8 *)s);
+ return;
+ }
+ break;
+
+ case GFC_DTYPE_COMPLEX:
+ switch (size)
+ {
+ case 8:
+ internal_unpack_c4 ((gfc_array_c4 *)d, (const GFC_COMPLEX_4 *)s);
+ return;
+
+ case 16:
+ internal_unpack_c8 ((gfc_array_c8 *)d, (const GFC_COMPLEX_8 *)s);
+ return;
+ }
+ default:
+ break;
}
if (d->dim[0].stride == 0)
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 9b5a09475a3..9cf2b1dafe6 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,91 @@
+2005-05-28 Eli Zaretskii <eliz@gnu.org>
+
+ * configure.ac: Add snprintf and vsnprintf to AC_CHEK_DECLS.
+ * config.in, configure: Regenerate.
+
+2005-05-25 Richard Henderson <rth@redhat.com>
+
+ * cp-demangle.c (d_dump): Handle DEMANGLE_COMPONENT_HIDDEN_ALIAS.
+ (d_make_comp, d_print_comp): Likewise.
+ (d_special_name): Generate one.
+ * testsuite/demangle-expected: Add a hidden alias test.
+
+2005-05-24 Gabriel Dos Reis <gdr@integrable-solutions.net>
+
+ * configure.ac: Check declarations for calloc(), getenv(),
+ malloc(), realloc() and sbrk().
+ * config.in: Regenerate.
+ * configure: Likewise.
+
+ * alloca.c (C_alloca): Change "new" to "new_storage". Use XNEWVEC
+ instead of xmalloc.
+ * choose-temp.c (choose_temp_base): Use XNEWVEC instea od xmalloc.
+ * concat.c (liiberty_concat_ptr): Surround definition with an
+ extern "C" block, if __cplusplus.
+ (concat): Use XNEWVEC instead of xmalloc.
+ (reconcat): Likewise.
+ * cp-demangle.c (struct d_print_template): Rename member
+ "template" to "template_decl". Adjust use throughout the file.
+ (d_print_resize): Properly cast return value of realloc().
+ (cplus_demangle_print): Same for malloc().
+ (d_demangle): Likewise.
+ * cp-demint.c (cplus_demangle_fill_builtin_type): Rename parameter
+ "typename" to "type_name".
+ * cplus-dem.c (grow_vect): Use XRESIZEVEC instead of xrealloc().
+ (work_stuff_copy_to_from): Use XNEWVEC insteand of xmalloc().
+ (demangle_template_value_parm): Likewise.
+ (demangle_template): Likewise.
+ (recursively_demangle): Likewise.
+ (do_hpacc_template_literal): Likewise.
+ (do_arg): Likewise.
+ (remember_type): Likewise.
+ (remember_Ktype): Likewise.
+ (register_Btype): Likewise.
+ (string_need): Use XRESIZEVEC instead of xrealloc().
+ * dyn-string.c (dyn_string_init): Use XNEWVEC.
+ (dyn_string_new): Use XNEW.
+ (dyn_string_resize): Use XRESIZEVEC.
+ * fnmatch.c (fnmatch): Rename local variable "not" to "negate".
+ * getopt.c (getenv): Declare only if !__cplusplus and !getenv.
+ Otherwise include <stdlib.h>.
+ (exchange): Cast return value of malloc().
+ * hashtab.c (htab_size): Define as both macro and non-inline
+ function.
+ (htab_elements): Likewise.
+ * getpwd.c (getpwd): Use XNEWVEC.
+ (htab_create_alloc_ex): Use C90 prototype-style.
+ * lrealpath.c (lrealpath): Appropriately cast return value of
+ malloc().
+ * make-relative-prefix.c (save_string): Likewise.
+ * make-temp-file.c (try_dir): Rename from "try". Adjust use in
+ the file.
+ (choose_tmpdir): Use XNEWVEC.
+ * mkstemps.c (mkstemps): Rename parameter "template" to "pattern".
+ * pex-common.c (pex_init_common): Use XNEW.
+ (pex_add_remove): Use XRESIZEVEC.
+ (pex_run): Likewise.
+ (pex_get_status_and_time): Likewise.
+ * pex-djgpp.c (pex_djgpp_exec_child): Likewise.
+ * pex-msdos.c (pex_init): Use XNEW.
+ (pex_msdos_exec_child): Likewise.
+ (pex_msdos_exec_child): Use XRESIZEVEC.
+ * pex-unix.c (pex_wait): Use XNEW.
+ * pex-win32.c (fix_argv): Use XNEWVEC.
+ * pexecute.c (pwait): Likewise.
+ * setenv.c (setenv): Properly cast return value of malloc().
+ * sigsetmask.c (sigsetmask): Rename local variables "old" and
+ "new" to "old_sig" and "new_sig".
+ * sort.c (main): Use XNEWVEC.
+ * spaces.c (spaces): Cast return value of malloc().
+ * strndup.c (strndup): Likewise.
+ * ternary.c (ternary_insert): Use XNEW.
+ * xmalloc.c (malloc, realloc, calloc, sbrk): Surround declaration
+ with an extern "C" block if __cplusplus.
+ * xstrdup.c (xstrdup): Cast return value of memcpy().
+ * xstrerror.c (strerror): Enclose declaration in an extern "C"
+ block if __cplusplus.
+ * xstrndup.c (xstrndup): Use XNEW. Cast return value of memcpy().
+
2005-05-16 Andreas Jaeger <aj@suse.de>
* getpwd.c: Remove unneeded prototype getcwd and move getwd so
diff --git a/libiberty/alloca.c b/libiberty/alloca.c
index 866344429df..9b2e9cb12b6 100644
--- a/libiberty/alloca.c
+++ b/libiberty/alloca.c
@@ -57,9 +57,15 @@ the possibility of a GCC built-in function.
/* These variables are used by the ASTRDUP implementation that relies
on C_alloca. */
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
const char *libiberty_optr;
char *libiberty_nptr;
unsigned long libiberty_len;
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
/* If your stack is a linked list of frames, you have to
provide an "address metric" ADDRESS_FUNCTION macro. */
@@ -191,20 +197,20 @@ C_alloca (size_t size)
/* Allocate combined header + user data storage. */
{
- register PTR new = xmalloc (sizeof (header) + size);
+ register void *new_storage = XNEWVEC (char, sizeof (header) + size);
/* Address of header. */
- if (new == 0)
+ if (new_storage == 0)
abort();
- ((header *) new)->h.next = last_alloca_header;
- ((header *) new)->h.deep = depth;
+ ((header *) new_storage)->h.next = last_alloca_header;
+ ((header *) new_storage)->h.deep = depth;
- last_alloca_header = (header *) new;
+ last_alloca_header = (header *) new_storage;
/* User storage begins just after header. */
- return (PTR) ((char *) new + sizeof (header));
+ return (PTR) ((char *) new_storage + sizeof (header));
}
}
diff --git a/libiberty/choose-temp.c b/libiberty/choose-temp.c
index 1f5e0e50c88..0cba9905d5b 100644
--- a/libiberty/choose-temp.c
+++ b/libiberty/choose-temp.c
@@ -61,7 +61,7 @@ choose_temp_base (void)
int len;
len = strlen (base);
- temp_filename = xmalloc (len + TEMP_FILE_LEN + 1);
+ temp_filename = XNEWVEC (char, len + TEMP_FILE_LEN + 1);
strcpy (temp_filename, base);
strcpy (temp_filename + len, TEMP_FILE);
diff --git a/libiberty/concat.c b/libiberty/concat.c
index d890b81169c..1f329ea0e15 100644
--- a/libiberty/concat.c
+++ b/libiberty/concat.c
@@ -127,7 +127,13 @@ concat_copy (char *dst, const char *first, ...)
return save_dst;
}
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
char *libiberty_concat_ptr;
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
/* @undocumented concat_copy2 */
@@ -150,7 +156,7 @@ concat (const char *first, ...)
/* First compute the size of the result and get sufficient memory. */
VA_OPEN (args, first);
VA_FIXEDARG (args, const char *, first);
- newstr = (char *) xmalloc (vconcat_length (first, args) + 1);
+ newstr = XNEWVEC (char, vconcat_length (first, args) + 1);
VA_CLOSE (args);
/* Now copy the individual pieces to the result string. */
@@ -188,7 +194,7 @@ reconcat (char *optr, const char *first, ...)
VA_OPEN (args, first);
VA_FIXEDARG (args, char *, optr);
VA_FIXEDARG (args, const char *, first);
- newstr = (char *) xmalloc (vconcat_length (first, args) + 1);
+ newstr = XNEWVEC (char, vconcat_length (first, args) + 1);
VA_CLOSE (args);
/* Now copy the individual pieces to the result string. */
diff --git a/libiberty/config.in b/libiberty/config.in
index 82643b7c32d..804945d70b4 100644
--- a/libiberty/config.in
+++ b/libiberty/config.in
@@ -45,13 +45,41 @@
don't. */
#undef HAVE_DECL_BASENAME
+/* Define to 1 if you have the declaration of `calloc', and to 0 if you don't.
+ */
+#undef HAVE_DECL_CALLOC
+
/* Define to 1 if you have the declaration of `ffs', and to 0 if you don't. */
#undef HAVE_DECL_FFS
+/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't.
+ */
+#undef HAVE_DECL_GETENV
+
+/* Define to 1 if you have the declaration of `malloc', and to 0 if you don't.
+ */
+#undef HAVE_DECL_MALLOC
+
+/* Define to 1 if you have the declaration of `realloc', and to 0 if you
+ don't. */
+#undef HAVE_DECL_REALLOC
+
+/* Define to 1 if you have the declaration of `sbrk', and to 0 if you don't.
+ */
+#undef HAVE_DECL_SBRK
+
+/* Define to 1 if you have the declaration of `snprintf', and to 0 if you
+ don't. */
+#undef HAVE_DECL_SNPRINTF
+
/* Define to 1 if you have the declaration of `vasprintf', and to 0 if you
don't. */
#undef HAVE_DECL_VASPRINTF
+/* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you
+ don't. */
+#undef HAVE_DECL_VSNPRINTF
+
/* Define to 1 if you have the <fcntl.h> header file. */
#undef HAVE_FCNTL_H
diff --git a/libiberty/configure b/libiberty/configure
index b7d3e5b5ce8..48407c9a8b2 100755
--- a/libiberty/configure
+++ b/libiberty/configure
@@ -5300,6 +5300,146 @@ _ACEOF
fi
+echo "$as_me:$LINENO: checking whether snprintf is declared" >&5
+echo $ECHO_N "checking whether snprintf is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_snprintf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef snprintf
+ char *p = (char *) snprintf;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_snprintf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_snprintf=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_snprintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_snprintf" >&6
+if test $ac_cv_have_decl_snprintf = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SNPRINTF 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SNPRINTF 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether vsnprintf is declared" >&5
+echo $ECHO_N "checking whether vsnprintf is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_vsnprintf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef vsnprintf
+ char *p = (char *) vsnprintf;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_vsnprintf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_vsnprintf=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_vsnprintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_vsnprintf" >&6
+if test $ac_cv_have_decl_vsnprintf = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_VSNPRINTF 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_VSNPRINTF 0
+_ACEOF
+
+
+fi
@@ -7215,6 +7355,498 @@ _ACEOF
fi
+echo "$as_me:$LINENO: checking whether snprintf is declared" >&5
+echo $ECHO_N "checking whether snprintf is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_snprintf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef snprintf
+ char *p = (char *) snprintf;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_snprintf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_snprintf=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_snprintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_snprintf" >&6
+if test $ac_cv_have_decl_snprintf = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SNPRINTF 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SNPRINTF 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether vsnprintf is declared" >&5
+echo $ECHO_N "checking whether vsnprintf is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_vsnprintf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef vsnprintf
+ char *p = (char *) vsnprintf;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_vsnprintf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_vsnprintf=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_vsnprintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_vsnprintf" >&6
+if test $ac_cv_have_decl_vsnprintf = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_VSNPRINTF 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_VSNPRINTF 0
+_ACEOF
+
+
+fi
+
+
+ echo "$as_me:$LINENO: checking whether calloc is declared" >&5
+echo $ECHO_N "checking whether calloc is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_calloc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef calloc
+ char *p = (char *) calloc;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_calloc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_calloc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_calloc" >&5
+echo "${ECHO_T}$ac_cv_have_decl_calloc" >&6
+if test $ac_cv_have_decl_calloc = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_CALLOC 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_CALLOC 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether getenv is declared" >&5
+echo $ECHO_N "checking whether getenv is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_getenv+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef getenv
+ char *p = (char *) getenv;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_getenv=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_getenv=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_getenv" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getenv" >&6
+if test $ac_cv_have_decl_getenv = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETENV 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETENV 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether malloc is declared" >&5
+echo $ECHO_N "checking whether malloc is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_malloc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef malloc
+ char *p = (char *) malloc;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_malloc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_malloc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_malloc" >&5
+echo "${ECHO_T}$ac_cv_have_decl_malloc" >&6
+if test $ac_cv_have_decl_malloc = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_MALLOC 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_MALLOC 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether realloc is declared" >&5
+echo $ECHO_N "checking whether realloc is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_realloc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef realloc
+ char *p = (char *) realloc;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_realloc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_realloc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_realloc" >&5
+echo "${ECHO_T}$ac_cv_have_decl_realloc" >&6
+if test $ac_cv_have_decl_realloc = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_REALLOC 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_REALLOC 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether sbrk is declared" >&5
+echo $ECHO_N "checking whether sbrk is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_sbrk+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+#ifndef sbrk
+ char *p = (char *) sbrk;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_sbrk=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_sbrk=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_sbrk" >&5
+echo "${ECHO_T}$ac_cv_have_decl_sbrk" >&6
+if test $ac_cv_have_decl_sbrk = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SBRK 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SBRK 0
+_ACEOF
+
+
+fi
echo "$as_me:$LINENO: checking whether canonicalize_file_name must be declared" >&5
diff --git a/libiberty/configure.ac b/libiberty/configure.ac
index b11fafbcae9..97abc327038 100644
--- a/libiberty/configure.ac
+++ b/libiberty/configure.ac
@@ -282,7 +282,7 @@ if test "x" = "y"; then
sysconf times sbrk gettimeofday ffs snprintf vsnprintf \
pstat_getstatic pstat_getdynamic sysmp getsysinfo table sysctl wait3 wait4 \
realpath canonicalize_file_name __fsetlocking)
- AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf])
+ AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf, snprintf, vsnprintf])
AC_DEFINE(HAVE_SYS_ERRLIST, 1, [Define if you have the sys_errlist variable.])
AC_DEFINE(HAVE_SYS_NERR, 1, [Define if you have the sys_nerr variable.])
AC_DEFINE(HAVE_SYS_SIGLIST, 1, [Define if you have the sys_siglist variable.])
@@ -518,7 +518,8 @@ if test -z "${setobjs}"; then
[AC_MSG_RESULT([no])])
AC_CHECK_FUNCS($checkfuncs)
- AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf])
+ AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf, snprintf, vsnprintf])
+ AC_CHECK_DECLS([calloc, getenv, malloc, realloc, sbrk])
libiberty_NEED_DECLARATION(canonicalize_file_name)
fi
diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c
index 653a2b5d2ba..61744390725 100644
--- a/libiberty/cp-demangle.c
+++ b/libiberty/cp-demangle.c
@@ -210,7 +210,7 @@ struct d_print_template
/* Next template on the list. */
struct d_print_template *next;
/* This template. */
- const struct demangle_component *template;
+ const struct demangle_component *template_decl;
};
/* A list of type modifiers. This is used while printing. */
@@ -520,6 +520,9 @@ d_dump (struct demangle_component *dc, int indent)
case DEMANGLE_COMPONENT_REFTEMP:
printf ("reference temporary\n");
break;
+ case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
+ printf ("hidden alias\n");
+ break;
case DEMANGLE_COMPONENT_RESTRICT:
printf ("restrict\n");
break;
@@ -733,6 +736,7 @@ d_make_comp (struct d_info *di, enum demangle_component_type type,
case DEMANGLE_COMPONENT_JAVA_CLASS:
case DEMANGLE_COMPONENT_GUARD:
case DEMANGLE_COMPONENT_REFTEMP:
+ case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
case DEMANGLE_COMPONENT_POINTER:
case DEMANGLE_COMPONENT_REFERENCE:
case DEMANGLE_COMPONENT_COMPLEX:
@@ -1439,6 +1443,7 @@ d_operator_name (struct d_info *di)
::= TF <type>
::= TJ <type>
::= GR <name>
+ ::= GA <encoding>
*/
static struct demangle_component *
@@ -1529,6 +1534,10 @@ d_special_name (struct d_info *di)
return d_make_comp (di, DEMANGLE_COMPONENT_REFTEMP, d_name (di),
NULL);
+ case 'A':
+ return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS,
+ d_encoding (di, 0), NULL);
+
default:
return NULL;
}
@@ -2551,7 +2560,7 @@ d_print_resize (struct d_print_info *dpi, size_t add)
char *newbuf;
newalc = dpi->alc * 2;
- newbuf = realloc (dpi->buf, newalc);
+ newbuf = (char *) realloc (dpi->buf, newalc);
if (newbuf == NULL)
{
free (dpi->buf);
@@ -2629,7 +2638,7 @@ cplus_demangle_print (int options, const struct demangle_component *dc,
dpi.options = options;
dpi.alc = estimate + 1;
- dpi.buf = malloc (dpi.alc);
+ dpi.buf = (char *) malloc (dpi.alc);
if (dpi.buf == NULL)
{
*palc = 1;
@@ -2730,7 +2739,7 @@ d_print_comp (struct d_print_info *dpi,
{
dpt.next = dpi->templates;
dpi->templates = &dpt;
- dpt.template = typed_name;
+ dpt.template_decl = typed_name;
}
/* If typed_name is a DEMANGLE_COMPONENT_LOCAL_NAME, then
@@ -2826,7 +2835,7 @@ d_print_comp (struct d_print_info *dpi,
return;
}
i = dc->u.s_number.number;
- for (a = d_right (dpi->templates->template);
+ for (a = d_right (dpi->templates->template_decl);
a != NULL;
a = d_right (a))
{
@@ -2931,6 +2940,11 @@ d_print_comp (struct d_print_info *dpi,
d_print_comp (dpi, d_left (dc));
return;
+ case DEMANGLE_COMPONENT_HIDDEN_ALIAS:
+ d_append_string_constant (dpi, "hidden alias for ");
+ d_print_comp (dpi, d_left (dc));
+ return;
+
case DEMANGLE_COMPONENT_SUB_STD:
d_append_buffer (dpi, dc->u.s_string.string, dc->u.s_string.len);
return;
@@ -3683,7 +3697,7 @@ d_print_cast (struct d_print_info *dpi,
dpt.next = dpi->templates;
dpi->templates = &dpt;
- dpt.template = d_left (dc);
+ dpt.template_decl = d_left (dc);
d_print_comp (dpi, d_left (d_left (dc)));
@@ -3764,7 +3778,7 @@ d_demangle (const char* mangled, int options, size_t *palc)
{
char *r;
- r = malloc (40 + len - 11);
+ r = (char *) malloc (40 + len - 11);
if (r == NULL)
*palc = 1;
else
diff --git a/libiberty/cp-demint.c b/libiberty/cp-demint.c
index a0f2a7d81a1..2e8f8d2d057 100644
--- a/libiberty/cp-demint.c
+++ b/libiberty/cp-demint.c
@@ -130,18 +130,18 @@ cplus_demangle_fill_component (struct demangle_component *p,
int
cplus_demangle_fill_builtin_type (struct demangle_component *p,
- const char *typename)
+ const char *type_name)
{
int len;
unsigned int i;
- if (p == NULL || typename == NULL)
+ if (p == NULL || type_name == NULL)
return 0;
- len = strlen (typename);
+ len = strlen (type_name);
for (i = 0; i < D_BUILTIN_TYPE_COUNT; ++i)
{
if (len == cplus_demangle_builtin_types[i].len
- && strcmp (typename, cplus_demangle_builtin_types[i].name) == 0)
+ && strcmp (type_name, cplus_demangle_builtin_types[i].name) == 0)
{
p->type = DEMANGLE_COMPONENT_BUILTIN_TYPE;
p->u.s_builtin.type = &cplus_demangle_builtin_types[i];
diff --git a/libiberty/cplus-dem.c b/libiberty/cplus-dem.c
index 0d54f423882..8b60434a888 100644
--- a/libiberty/cplus-dem.c
+++ b/libiberty/cplus-dem.c
@@ -892,7 +892,7 @@ grow_vect (char **old_vect, size_t *size, size_t min_size, int element_size)
*size *= 2;
if (*size < min_size)
*size = min_size;
- *old_vect = (void *) xrealloc (*old_vect, *size * element_size);
+ *old_vect = XRESIZEVAR (char, *old_vect, *size * element_size);
}
}
@@ -1102,56 +1102,52 @@ work_stuff_copy_to_from (struct work_stuff *to, struct work_stuff *from)
/* Deep-copy dynamic storage. */
if (from->typevec_size)
- to->typevec
- = (char **) xmalloc (from->typevec_size * sizeof (to->typevec[0]));
+ to->typevec = XNEWVEC (char *, from->typevec_size);
for (i = 0; i < from->ntypes; i++)
{
int len = strlen (from->typevec[i]) + 1;
- to->typevec[i] = xmalloc (len);
+ to->typevec[i] = XNEWVEC (char, len);
memcpy (to->typevec[i], from->typevec[i], len);
}
if (from->ksize)
- to->ktypevec
- = (char **) xmalloc (from->ksize * sizeof (to->ktypevec[0]));
+ to->ktypevec = XNEWVEC (char *, from->ksize);
for (i = 0; i < from->numk; i++)
{
int len = strlen (from->ktypevec[i]) + 1;
- to->ktypevec[i] = xmalloc (len);
+ to->ktypevec[i] = XNEWVEC (char, len);
memcpy (to->ktypevec[i], from->ktypevec[i], len);
}
if (from->bsize)
- to->btypevec
- = (char **) xmalloc (from->bsize * sizeof (to->btypevec[0]));
+ to->btypevec = XNEWVEC (char *, from->bsize);
for (i = 0; i < from->numb; i++)
{
int len = strlen (from->btypevec[i]) + 1;
- to->btypevec[i] = xmalloc (len);
+ to->btypevec[i] = XNEWVEC (char , len);
memcpy (to->btypevec[i], from->btypevec[i], len);
}
if (from->ntmpl_args)
- to->tmpl_argvec
- = (char **) xmalloc (from->ntmpl_args * sizeof (to->tmpl_argvec[0]));
+ to->tmpl_argvec = XNEWVEC (char *, from->ntmpl_args);
for (i = 0; i < from->ntmpl_args; i++)
{
int len = strlen (from->tmpl_argvec[i]) + 1;
- to->tmpl_argvec[i] = xmalloc (len);
+ to->tmpl_argvec[i] = XNEWVEC (char, len);
memcpy (to->tmpl_argvec[i], from->tmpl_argvec[i], len);
}
if (from->previous_argument)
{
- to->previous_argument = (string*) xmalloc (sizeof (string));
+ to->previous_argument = XNEW (string);
string_init (to->previous_argument);
string_appends (to->previous_argument, from->previous_argument);
}
@@ -1895,7 +1891,7 @@ demangle_template_value_parm (struct work_stuff *work, const char **mangled,
string_appendn (s, "0", 1);
else
{
- char *p = xmalloc (symbol_len + 1), *q;
+ char *p = XNEWVEC (char, symbol_len + 1), *q;
strncpy (p, *mangled, symbol_len);
p [symbol_len] = '\0';
/* We use cplus_demangle here, rather than
@@ -2001,7 +1997,7 @@ demangle_template (struct work_stuff *work, const char **mangled,
if (!is_type)
{
/* Create an array for saving the template argument values. */
- work->tmpl_argvec = (char**) xmalloc (r * sizeof (char *));
+ work->tmpl_argvec = XNEWVEC (char *, r);
work->ntmpl_args = r;
for (i = 0; i < r; i++)
work->tmpl_argvec[i] = 0;
@@ -2026,7 +2022,7 @@ demangle_template (struct work_stuff *work, const char **mangled,
{
/* Save the template argument. */
int len = temp.p - temp.b;
- work->tmpl_argvec[i] = xmalloc (len + 1);
+ work->tmpl_argvec[i] = XNEWVEC (char, len + 1);
memcpy (work->tmpl_argvec[i], temp.b, len);
work->tmpl_argvec[i][len] = '\0';
}
@@ -2054,7 +2050,7 @@ demangle_template (struct work_stuff *work, const char **mangled,
{
/* Save the template argument. */
int len = r2;
- work->tmpl_argvec[i] = xmalloc (len + 1);
+ work->tmpl_argvec[i] = XNEWVEC (char, len + 1);
memcpy (work->tmpl_argvec[i], *mangled, len);
work->tmpl_argvec[i][len] = '\0';
}
@@ -2100,7 +2096,7 @@ demangle_template (struct work_stuff *work, const char **mangled,
if (!is_type)
{
int len = s->p - s->b;
- work->tmpl_argvec[i] = xmalloc (len + 1);
+ work->tmpl_argvec[i] = XNEWVEC (char, len + 1);
memcpy (work->tmpl_argvec[i], s->b, len);
work->tmpl_argvec[i][len] = '\0';
@@ -2998,7 +2994,7 @@ recursively_demangle(struct work_stuff *work, const char **mangled,
char * recurse = (char *)NULL;
char * recurse_dem = (char *)NULL;
- recurse = (char *) xmalloc (namelength + 1);
+ recurse = XNEWVEC (char, namelength + 1);
memcpy (recurse, *mangled, namelength);
recurse[namelength] = '\000';
@@ -3969,7 +3965,7 @@ do_hpacc_template_literal (struct work_stuff *work, const char **mangled,
string_append (result, "&");
/* Now recursively demangle the literal name */
- recurse = (char *) xmalloc (literal_len + 1);
+ recurse = XNEWVEC (char, literal_len + 1);
memcpy (recurse, *mangled, literal_len);
recurse[literal_len] = '\000';
@@ -4071,7 +4067,7 @@ do_arg (struct work_stuff *work, const char **mangled, string *result)
if (work->previous_argument)
string_delete (work->previous_argument);
else
- work->previous_argument = (string*) xmalloc (sizeof (string));
+ work->previous_argument = XNEW (string);
if (!do_type (work, mangled, work->previous_argument))
return 0;
@@ -4095,18 +4091,16 @@ remember_type (struct work_stuff *work, const char *start, int len)
if (work -> typevec_size == 0)
{
work -> typevec_size = 3;
- work -> typevec
- = (char **) xmalloc (sizeof (char *) * work -> typevec_size);
+ work -> typevec = XNEWVEC (char *, work->typevec_size);
}
else
{
work -> typevec_size *= 2;
work -> typevec
- = (char **) xrealloc ((char *)work -> typevec,
- sizeof (char *) * work -> typevec_size);
+ = XRESIZEVEC (char *, work->typevec, work->typevec_size);
}
}
- tem = xmalloc (len + 1);
+ tem = XNEWVEC (char, len + 1);
memcpy (tem, start, len);
tem[len] = '\0';
work -> typevec[work -> ntypes++] = tem;
@@ -4124,18 +4118,16 @@ remember_Ktype (struct work_stuff *work, const char *start, int len)
if (work -> ksize == 0)
{
work -> ksize = 5;
- work -> ktypevec
- = (char **) xmalloc (sizeof (char *) * work -> ksize);
+ work -> ktypevec = XNEWVEC (char *, work->ksize);
}
else
{
work -> ksize *= 2;
work -> ktypevec
- = (char **) xrealloc ((char *)work -> ktypevec,
- sizeof (char *) * work -> ksize);
+ = XRESIZEVEC (char *, work->ktypevec, work->ksize);
}
}
- tem = xmalloc (len + 1);
+ tem = XNEWVEC (char, len + 1);
memcpy (tem, start, len);
tem[len] = '\0';
work -> ktypevec[work -> numk++] = tem;
@@ -4155,15 +4147,13 @@ register_Btype (struct work_stuff *work)
if (work -> bsize == 0)
{
work -> bsize = 5;
- work -> btypevec
- = (char **) xmalloc (sizeof (char *) * work -> bsize);
+ work -> btypevec = XNEWVEC (char *, work->bsize);
}
else
{
work -> bsize *= 2;
work -> btypevec
- = (char **) xrealloc ((char *)work -> btypevec,
- sizeof (char *) * work -> bsize);
+ = XRESIZEVEC (char *, work->btypevec, work->bsize);
}
}
ret = work -> numb++;
@@ -4179,7 +4169,7 @@ remember_Btype (struct work_stuff *work, const char *start,
{
char *tem;
- tem = xmalloc (len + 1);
+ tem = XNEWVEC (char, len + 1);
memcpy (tem, start, len);
tem[len] = '\0';
work -> btypevec[index] = tem;
@@ -4600,7 +4590,7 @@ string_need (string *s, int n)
{
n = 32;
}
- s->p = s->b = xmalloc (n);
+ s->p = s->b = XNEWVEC (char, n);
s->e = s->b + n;
}
else if (s->e - s->p < n)
@@ -4608,7 +4598,7 @@ string_need (string *s, int n)
tem = s->p - s->b;
n += tem;
n *= 2;
- s->b = xrealloc (s->b, n);
+ s->b = XRESIZEVEC (char, s->b, n);
s->p = s->b + tem;
s->e = s->b + n;
}
diff --git a/libiberty/dyn-string.c b/libiberty/dyn-string.c
index 2cfbd4b7d71..9de50eda0e8 100644
--- a/libiberty/dyn-string.c
+++ b/libiberty/dyn-string.c
@@ -67,7 +67,7 @@ dyn_string_init (struct dyn_string *ds_struct_ptr, int space)
if (ds_struct_ptr->s == NULL)
return 0;
#else
- ds_struct_ptr->s = (char *) xmalloc (space);
+ ds_struct_ptr->s = XNEWVEC (char, space);
#endif
ds_struct_ptr->allocated = space;
ds_struct_ptr->length = 0;
@@ -96,7 +96,7 @@ dyn_string_new (int space)
return NULL;
}
#else
- result = (dyn_string_t) xmalloc (sizeof (struct dyn_string));
+ result = XNEW (struct dyn_string);
dyn_string_init (result, space);
#endif
return result;
@@ -159,7 +159,7 @@ dyn_string_resize (dyn_string_t ds, int space)
return NULL;
}
#else
- ds->s = (char *) xrealloc (ds->s, ds->allocated);
+ ds->s = XRESIZEVEC (char, ds->s, ds->allocated);
#endif
}
diff --git a/libiberty/fnmatch.c b/libiberty/fnmatch.c
index 868a8806d70..fc897be2c6f 100644
--- a/libiberty/fnmatch.c
+++ b/libiberty/fnmatch.c
@@ -124,7 +124,7 @@ fnmatch (const char *pattern, const char *string, int flags)
case '[':
{
/* Nonzero if the sense of the character class is inverted. */
- register int not;
+ register int negate;
if (*n == '\0')
return FNM_NOMATCH;
@@ -133,8 +133,8 @@ fnmatch (const char *pattern, const char *string, int flags)
(n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
return FNM_NOMATCH;
- not = (*p == '!' || *p == '^');
- if (not)
+ negate = (*p == '!' || *p == '^');
+ if (negate)
++p;
c = *p++;
@@ -177,7 +177,7 @@ fnmatch (const char *pattern, const char *string, int flags)
if (c == ']')
break;
}
- if (!not)
+ if (!negate)
return FNM_NOMATCH;
break;
@@ -194,7 +194,7 @@ fnmatch (const char *pattern, const char *string, int flags)
/* XXX 1003.2d11 is unclear if this is right. */
++p;
}
- if (not)
+ if (negate)
return FNM_NOMATCH;
}
break;
diff --git a/libiberty/getopt.c b/libiberty/getopt.c
index d09ce5a66b9..0b5c2e8f6aa 100644
--- a/libiberty/getopt.c
+++ b/libiberty/getopt.c
@@ -212,8 +212,16 @@ static char *posixly_correct;
/* Avoid depending on library functions or files
whose names are inconsistent. */
-#ifndef getenv
-extern char *getenv ();
+#if HAVE_STDLIB_H && HAVE_DECL_GETENV
+# include <stdlib.h>
+#elif !defined(getenv)
+# ifdef __cplusplus
+extern "C" {
+# endif /* __cplusplus */
+extern char *getenv (const char *);
+# ifdef __cplusplus
+}
+# endif /* __cplusplus */
#endif
static char *
@@ -325,7 +333,7 @@ exchange (char **argv)
{
/* We must extend the array. The user plays games with us and
presents new arguments. */
- char *new_str = malloc (top + 1);
+ char *new_str = (char *) malloc (top + 1);
if (new_str == NULL)
nonoption_flags_len = nonoption_flags_max_len = 0;
else
diff --git a/libiberty/getpwd.c b/libiberty/getpwd.c
index c7880d70444..fa5c132fd6b 100644
--- a/libiberty/getpwd.c
+++ b/libiberty/getpwd.c
@@ -84,7 +84,7 @@ getpwd (void)
&& dotstat.st_dev == pwdstat.st_dev))
/* The shortcut didn't work. Try the slow, ``sure'' way. */
- for (s = GUESSPATHLEN; ! getcwd (p = xmalloc (s), s); s *= 2)
+ for (s = GUESSPATHLEN; !getcwd (p = XNEWVEC (char, s), s); s *= 2)
{
int e = errno;
free (p);
@@ -117,7 +117,7 @@ getpwd (void)
static char *pwd = 0;
if (!pwd)
- pwd = getcwd (xmalloc (MAXPATHLEN + 1), MAXPATHLEN + 1
+ pwd = getcwd (XNEWVEC (char, MAXPATHLEN + 1), MAXPATHLEN + 1
#ifdef VMS
, 0
#endif
diff --git a/libiberty/hashtab.c b/libiberty/hashtab.c
index f8a1ea738bc..5557e0a9686 100644
--- a/libiberty/hashtab.c
+++ b/libiberty/hashtab.c
@@ -216,20 +216,30 @@ eq_pointer (const PTR p1, const PTR p2)
return p1 == p2;
}
-/* Return the current size of given hash table. */
-inline size_t
-htab_size (htab_t htab)
+/* The parens around the function names in the next two definitions
+ are essential in order to prevent macro expansions of the name.
+ The bodies, however, are expanded as expected, so they are not
+ recursive definitions. */
+
+/* Return the current size of given hash table. */
+
+#define htab_size(htab) ((htab)->size)
+
+size_t
+(htab_size) (htab_t htab)
{
- return htab->size;
+ return htab_size (htab);
}
/* Return the current number of elements in given hash table. */
-inline size_t
-htab_elements (htab_t htab)
+#define htab_elements(htab) ((htab)->n_elements - (htab)->n_deleted)
+
+size_t
+(htab_elements) (htab_t htab)
{
- return htab->n_elements - htab->n_deleted;
+ return htab_elements (htab);
}
/* Return X % Y. */
@@ -317,15 +327,10 @@ htab_create_alloc (size_t size, htab_hash hash_f, htab_eq eq_f,
an extra argument. */
htab_t
-htab_create_alloc_ex (size, hash_f, eq_f, del_f, alloc_arg, alloc_f,
- free_f)
- size_t size;
- htab_hash hash_f;
- htab_eq eq_f;
- htab_del del_f;
- PTR alloc_arg;
- htab_alloc_with_arg alloc_f;
- htab_free_with_arg free_f;
+htab_create_alloc_ex (size_t size, htab_hash hash_f, htab_eq eq_f,
+ htab_del del_f, void *alloc_arg,
+ htab_alloc_with_arg alloc_f,
+ htab_free_with_arg free_f)
{
htab_t result;
unsigned int size_prime_index;
diff --git a/libiberty/lrealpath.c b/libiberty/lrealpath.c
index 9a58c0b83b8..b27c8de990e 100644
--- a/libiberty/lrealpath.c
+++ b/libiberty/lrealpath.c
@@ -117,7 +117,7 @@ lrealpath (const char *filename)
{
/* PATH_MAX is bounded. */
char *buf, *rp, *ret;
- buf = malloc (path_max);
+ buf = (char *) malloc (path_max);
if (buf == NULL)
return NULL;
rp = realpath (filename, buf);
diff --git a/libiberty/make-relative-prefix.c b/libiberty/make-relative-prefix.c
index 883d92b1458..66ddcaa471b 100644
--- a/libiberty/make-relative-prefix.c
+++ b/libiberty/make-relative-prefix.c
@@ -102,7 +102,7 @@ static void free_split_directories (char **);
static char *
save_string (const char *s, int len)
{
- char *result = malloc (len + 1);
+ char *result = (char *) malloc (len + 1);
memcpy (result, s, len);
result[len] = 0;
diff --git a/libiberty/make-temp-file.c b/libiberty/make-temp-file.c
index 5a6d488b48a..5e21414ad8e 100644
--- a/libiberty/make-temp-file.c
+++ b/libiberty/make-temp-file.c
@@ -61,10 +61,10 @@ extern int mkstemps (char *, int);
If success, DIR is returned.
Otherwise NULL is returned. */
-static inline const char *try (const char *, const char *);
+static inline const char *try_dir (const char *, const char *);
static inline const char *
-try (const char *dir, const char *base)
+try_dir (const char *dir, const char *base)
{
if (base != 0)
return base;
@@ -103,18 +103,18 @@ choose_tmpdir (void)
if (memoized_tmpdir)
return memoized_tmpdir;
- base = try (getenv ("TMPDIR"), base);
- base = try (getenv ("TMP"), base);
- base = try (getenv ("TEMP"), base);
+ base = try_dir (getenv ("TMPDIR"), base);
+ base = try_dir (getenv ("TMP"), base);
+ base = try_dir (getenv ("TEMP"), base);
#ifdef P_tmpdir
- base = try (P_tmpdir, base);
+ base = try_dir (P_tmpdir, base);
#endif
/* Try /var/tmp, /usr/tmp, then /tmp. */
- base = try (vartmp, base);
- base = try (usrtmp, base);
- base = try (tmp, base);
+ base = try_dir (vartmp, base);
+ base = try_dir (usrtmp, base);
+ base = try_dir (tmp, base);
/* If all else fails, use the current directory! */
if (base == 0)
@@ -123,7 +123,7 @@ choose_tmpdir (void)
/* Append DIR_SEPARATOR to the directory we've chosen
and return it. */
len = strlen (base);
- tmpdir = xmalloc (len + 2);
+ tmpdir = XNEWVEC (char, len + 2);
strcpy (tmpdir, base);
tmpdir[len] = DIR_SEPARATOR;
tmpdir[len+1] = '\0';
@@ -158,7 +158,7 @@ make_temp_file (const char *suffix)
base_len = strlen (base);
suffix_len = strlen (suffix);
- temp_filename = xmalloc (base_len
+ temp_filename = XNEWVEC (char, base_len
+ TEMP_FILE_LEN
+ suffix_len + 1);
strcpy (temp_filename, base);
diff --git a/libiberty/mkstemps.c b/libiberty/mkstemps.c
index 7aceb390386..89b37d9f480 100644
--- a/libiberty/mkstemps.c
+++ b/libiberty/mkstemps.c
@@ -51,17 +51,17 @@ typedef unsigned long gcc_uint64_t;
/*
-@deftypefn Replacement int mkstemps (char *@var{template}, int @var{suffix_len})
+@deftypefn Replacement int mkstemps (char *@var{pattern}, int @var{suffix_len})
-Generate a unique temporary file name from @var{template}.
-@var{template} has the form:
+Generate a unique temporary file name from @var{pattern}.
+@var{pattern} has the form:
@example
@var{path}/ccXXXXXX@var{suffix}
@end example
@var{suffix_len} tells us how long @var{suffix} is (it can be zero
-length). The last six characters of @var{template} before @var{suffix}
+length). The last six characters of @var{pattern} before @var{suffix}
must be @samp{XXXXXX}; they are replaced with a string that makes the
filename unique. Returns a file descriptor open on the file for
reading and writing.
@@ -71,7 +71,7 @@ reading and writing.
*/
int
-mkstemps (char *template, int suffix_len)
+mkstemps (char *pattern, int suffix_len)
{
static const char letters[]
= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
@@ -83,15 +83,15 @@ mkstemps (char *template, int suffix_len)
size_t len;
int count;
- len = strlen (template);
+ len = strlen (pattern);
if ((int) len < 6 + suffix_len
- || strncmp (&template[len - 6 - suffix_len], "XXXXXX", 6))
+ || strncmp (&pattern[len - 6 - suffix_len], "XXXXXX", 6))
{
return -1;
}
- XXXXXX = &template[len - 6 - suffix_len];
+ XXXXXX = &pattern[len - 6 - suffix_len];
#ifdef HAVE_GETTIMEOFDAY
/* Get some more or less random data. */
@@ -119,7 +119,7 @@ mkstemps (char *template, int suffix_len)
v /= 62;
XXXXXX[5] = letters[v % 62];
- fd = open (template, O_RDWR|O_CREAT|O_EXCL, 0600);
+ fd = open (pattern, O_RDWR|O_CREAT|O_EXCL, 0600);
if (fd >= 0)
/* The file does not exist. */
return fd;
@@ -131,6 +131,6 @@ mkstemps (char *template, int suffix_len)
}
/* We return the null string if we can't find a unique file name. */
- template[0] = '\0';
+ pattern[0] = '\0';
return -1;
}
diff --git a/libiberty/pex-common.c b/libiberty/pex-common.c
index 615cfbcd38f..b2ca6e08ce2 100644
--- a/libiberty/pex-common.c
+++ b/libiberty/pex-common.c
@@ -55,7 +55,7 @@ pex_init_common (int flags, const char *pname, const char *tempbase,
{
struct pex_obj *obj;
- obj = xmalloc (sizeof (*obj));
+ obj = XNEW (struct pex_obj);
obj->flags = flags;
obj->pname = pname;
obj->tempbase = tempbase;
@@ -83,7 +83,7 @@ pex_add_remove (struct pex_obj *obj, const char *name, int allocated)
char *add;
++obj->remove_count;
- obj->remove = xrealloc (obj->remove, obj->remove_count * sizeof (char *));
+ obj->remove = XRESIZEVEC (char *, obj->remove, obj->remove_count);
if (allocated)
add = (char *) name;
else
@@ -280,7 +280,7 @@ pex_run (struct pex_obj *obj, int flags, const char *executable,
goto error_exit;
++obj->count;
- obj->children = xrealloc (obj->children, obj->count * sizeof (long));
+ obj->children = XRESIZEVEC (long, obj->children, obj->count);
obj->children[obj->count - 1] = pid;
return NULL;
@@ -352,9 +352,9 @@ pex_get_status_and_time (struct pex_obj *obj, int done, const char **errmsg,
if (obj->number_waited == obj->count)
return 1;
- obj->status = xrealloc (obj->status, obj->count * sizeof (int));
+ obj->status = XRESIZEVEC (int, obj->status, obj->count);
if ((obj->flags & PEX_RECORD_TIMES) != 0)
- obj->time = xrealloc (obj->time, obj->count * sizeof (struct pex_time));
+ obj->time = XRESIZEVEC (struct pex_time, obj->time, obj->count);
ret = 1;
for (i = obj->number_waited; i < obj->count; ++i)
diff --git a/libiberty/pex-djgpp.c b/libiberty/pex-djgpp.c
index b452f466204..6e58e3fd8dc 100644
--- a/libiberty/pex-djgpp.c
+++ b/libiberty/pex-djgpp.c
@@ -257,7 +257,7 @@ pex_djgpp_exec_child (struct pex_obj *obj, int flags, const char *executable,
is the number of children which have executed before this
one. */
statuses = (int *) obj->sysdep;
- statuses = xrealloc (statuses, (obj->count + 1) * sizeof (int));
+ statuses = XRESIZEVEC (int, statuses, obj->count + 1);
statuses[obj->count] = status;
obj->sysdep = (void *) statuses;
diff --git a/libiberty/pex-msdos.c b/libiberty/pex-msdos.c
index a7cc820a82a..2256117d1bb 100644
--- a/libiberty/pex-msdos.c
+++ b/libiberty/pex-msdos.c
@@ -89,7 +89,7 @@ pex_init (int flags, const char *pname, const char *tempbase)
ret = pex_init_common (flags, pname, tempbase, funcs);
- ret->sysdep = xmalloc (sizeof (struct pex_msdos));
+ ret->sysdep = XNEW (struct pex_msdos);
for (i = 0; i < PEX_MSDOS_FILE_COUNT; ++i)
ret->files[i] = NULL;
ret->statuses = NULL;
@@ -210,7 +210,7 @@ pex_msdos_exec_child (struct pex_obj *obj, int flags, const char *executable,
outfile = ms->files[outindex];
}
- scmd = xmalloc (strlen (program)
+ scmd = XNEWVEC (char, strlen (program)
+ ((flags & PEXECUTE_SEARCH) != 0 ? 4 : 0)
+ strlen (rf)
+ strlen (infile)
@@ -269,7 +269,7 @@ pex_msdos_exec_child (struct pex_obj *obj, int flags, const char *executable,
/* Save the exit status for later. When we are called, obj->count
is the number of children which have executed before this
one. */
- ms->statuses = xrealloc (ms->statuses, (obj->count + 1) * sizeof (int));
+ ms->statuses = XRESIZEVEC(int, ms->statuses, obj->count + 1);
ms->statuses[obj->count] = status;
return obj->count;
diff --git a/libiberty/pex-unix.c b/libiberty/pex-unix.c
index 486221786e7..35a545cb17b 100644
--- a/libiberty/pex-unix.c
+++ b/libiberty/pex-unix.c
@@ -252,7 +252,7 @@ pex_wait (struct pex_obj *obj, pid_t pid, int *status, struct pex_time *time)
return cpid;
}
- psl = xmalloc (sizeof (struct status_list));
+ psl = XNEW (struct status_list);
psl->pid = cpid;
psl->status = *status;
if (time != NULL)
diff --git a/libiberty/pex-win32.c b/libiberty/pex-win32.c
index 751e3e0aeb6..10262fbfeed 100644
--- a/libiberty/pex-win32.c
+++ b/libiberty/pex-win32.c
@@ -79,7 +79,7 @@ fix_argv (char * const *argvec)
for (i = 0; argvec[i] != NULL; i++)
;
- argv = xmalloc ((i + 1) * sizeof (char *));
+ argv = XNEWVEC (char *, i + 1);
for (i = 0; argvec[i] != NULL; i++)
argv[i] = xstrdup (argvec[i]);
argv[i] = NULL;
@@ -105,7 +105,7 @@ fix_argv (char * const *argvec)
{
if (temp[j] == '"')
{
- newtemp = xmalloc (len + 2);
+ newtemp = XNEWVEC (char, len + 2);
strncpy (newtemp, temp, j);
newtemp [j] = '\\';
strncpy (&newtemp [j+1], &temp [j], len-j);
@@ -150,7 +150,7 @@ fix_argv (char * const *argvec)
len += 2; /* and for the enclosing quotes. */
- temp = xmalloc (len + 1);
+ temp = XNEWVEC (char, len + 1);
temp[0] = '"';
strcpy (temp + 1, argv[i]);
if (trailing_backslash)
diff --git a/libiberty/pexecute.c b/libiberty/pexecute.c
index f486252bd73..60a280b8e47 100644
--- a/libiberty/pexecute.c
+++ b/libiberty/pexecute.c
@@ -99,7 +99,7 @@ pwait (int pid, int *status, int flags ATTRIBUTE_UNUSED)
{
int *vector;
- vector = xmalloc (idx * sizeof (int));
+ vector = XNEWVEC (int, idx);
if (!pex_get_status (pex, idx, vector))
return -1;
*status = vector[pid];
diff --git a/libiberty/setenv.c b/libiberty/setenv.c
index fa702c3aad5..355af5a9dd6 100644
--- a/libiberty/setenv.c
+++ b/libiberty/setenv.c
@@ -115,7 +115,7 @@ setenv (const char *name, const char *value, int replace)
return -1;
}
- new_environ[size] = malloc (namelen + 1 + vallen);
+ new_environ[size] = (char *) malloc (namelen + 1 + vallen);
if (new_environ[size] == NULL)
{
free ((char *) new_environ);
@@ -142,13 +142,13 @@ setenv (const char *name, const char *value, int replace)
if (len + 1 < namelen + 1 + vallen)
{
/* The existing string is too short; malloc a new one. */
- char *new = malloc (namelen + 1 + vallen);
- if (new == NULL)
+ char *new_string = (char *) malloc (namelen + 1 + vallen);
+ if (new_string == NULL)
{
UNLOCK;
return -1;
}
- *ep = new;
+ *ep = new_string;
}
memcpy (*ep, name, namelen);
(*ep)[namelen] = '=';
diff --git a/libiberty/sigsetmask.c b/libiberty/sigsetmask.c
index 2df96fca947..3b708b16adb 100644
--- a/libiberty/sigsetmask.c
+++ b/libiberty/sigsetmask.c
@@ -27,14 +27,14 @@ extern void abort (void) ATTRIBUTE_NORETURN;
int
sigsetmask (int set)
{
- sigset_t new;
- sigset_t old;
+ sigset_t new_sig;
+ sigset_t old_sig;
- sigemptyset (&new);
+ sigemptyset (&new_sig);
if (set != 0) {
abort(); /* FIXME, we don't know how to translate old mask to new */
}
- sigprocmask(SIG_SETMASK, &new, &old);
+ sigprocmask(SIG_SETMASK, &new_sig, &old_sig);
return 1; /* FIXME, we always return 1 as old value. */
}
#endif
diff --git a/libiberty/sort.c b/libiberty/sort.c
index a4fffefa349..3738dd733e5 100644
--- a/libiberty/sort.c
+++ b/libiberty/sort.c
@@ -155,8 +155,8 @@ int main (int argc, char **argv)
else
k = 10;
- pointers = xmalloc (k * sizeof (void *));
- work = xmalloc (k * sizeof (void *));
+ pointers = XNEWVEC (void*, k);
+ work = XNEWVEC (void*, k);
for (i = 0; i < k; ++i)
{
diff --git a/libiberty/spaces.c b/libiberty/spaces.c
index 9592a03a4cd..67481c9bcd8 100644
--- a/libiberty/spaces.c
+++ b/libiberty/spaces.c
@@ -57,7 +57,7 @@ spaces (int count)
{
free (buf);
}
- buf = malloc (count + 1);
+ buf = (char *) malloc (count + 1);
if (buf == (char *) 0)
return 0;
for (t = buf + count ; t != buf ; )
diff --git a/libiberty/strndup.c b/libiberty/strndup.c
index 9395fc8fe65..9e9b4e2991f 100644
--- a/libiberty/strndup.c
+++ b/libiberty/strndup.c
@@ -46,10 +46,10 @@ strndup (const char *s, size_t n)
if (n < len)
len = n;
- result = malloc (len + 1);
+ result = (char *) malloc (len + 1);
if (!result)
return 0;
result[len] = '\0';
- return memcpy (result, s, len);
+ return (char *) memcpy (result, s, len);
}
diff --git a/libiberty/ternary.c b/libiberty/ternary.c
index e57e94404ab..8fc561a4531 100644
--- a/libiberty/ternary.c
+++ b/libiberty/ternary.c
@@ -74,7 +74,7 @@ ternary_insert (ternary_tree *root, const char *s, PTR data, int replace)
for (;;)
{
/* Allocate the memory for the node, and fill it in */
- *pcurr = (ternary_tree) xmalloc (sizeof (ternary_node));
+ *pcurr = XNEW (ternary_node);
curr = *pcurr;
curr->splitchar = *s;
curr->lokid = curr->hikid = curr->eqkid = 0;
diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected
index d38ce33c830..f8e402d01bd 100644
--- a/libiberty/testsuite/demangle-expected
+++ b/libiberty/testsuite/demangle-expected
@@ -3771,3 +3771,7 @@ _Z1ZZ2Z::__CPR212____ct__Q3_3std141list__tm__128_Q2_3edm41THandle__tm__26_Q2_4em
_test_array__L_1__B23b___clean.6
_test_array__L_1__B23b___clean.6
_test_array__L_1__B23b___clean.6
+#
+--format=java
+_ZGAN4java4lang5Class7forNameEPNS0_6StringE
+hidden alias for java.lang.Class.forName(java.lang.String)
diff --git a/libiberty/xmalloc.c b/libiberty/xmalloc.c
index adba5188df3..3e97aab563f 100644
--- a/libiberty/xmalloc.c
+++ b/libiberty/xmalloc.c
@@ -75,11 +75,23 @@ function will be called to print an error message and terminate execution.
#include <unixlib.h>
#else
/* For systems with larger pointers than ints, these must be declared. */
-PTR malloc (size_t);
-PTR realloc (PTR, size_t);
-PTR calloc (size_t, size_t);
-PTR sbrk (ptrdiff_t);
-#endif
+# if HAVE_STDLIB_H && HAVE_UNISTD_H && HAVE_DECL_MALLOC \
+ && HAVE_DECL_REALLOC && HAVE_DECL_CALLOC && HAVE_DECL_SBRK
+# include <stdlib.h>
+# include <unistd.h>
+# else
+# ifdef __cplusplus
+extern "C" {
+# endif /* __cplusplus */
+void *malloc (size_t);
+void *realloc (void *, size_t);
+void *calloc (size_t, size_t);
+void *sbrk (ptrdiff_t);
+# ifdef __cplusplus
+}
+# endif /* __cplusplus */
+# endif /* HAVE_STDLIB_H ... */
+#endif /* VMS */
/* The program name if set. */
static const char *name = "";
diff --git a/libiberty/xstrdup.c b/libiberty/xstrdup.c
index c04623d98ec..9ac2ea038f3 100644
--- a/libiberty/xstrdup.c
+++ b/libiberty/xstrdup.c
@@ -31,6 +31,6 @@ char *
xstrdup (const char *s)
{
register size_t len = strlen (s) + 1;
- register char *ret = xmalloc (len);
+ register char *ret = XNEWVEC (char, len);
return (char *) memcpy (ret, s, len);
}
diff --git a/libiberty/xstrerror.c b/libiberty/xstrerror.c
index 01f3a7b961a..2ea2200e9fc 100644
--- a/libiberty/xstrerror.c
+++ b/libiberty/xstrerror.c
@@ -19,15 +19,28 @@ will never return a @code{NULL} pointer.
#include "libiberty.h"
#ifdef VMS
-#include <errno.h>
-#if !defined (__STRICT_ANSI__) && !defined (__HIDE_FORBIDDEN_NAMES)
+# include <errno.h>
+# if !defined (__STRICT_ANSI__) && !defined (__HIDE_FORBIDDEN_NAMES)
+# ifdef __cplusplus
+extern "C" {
+# endif /* __cplusplus */
extern char *strerror (int,...);
-#define DONT_DECLARE_STRERROR
-#endif
-#endif /* VMS */
+# define DONT_DECLARE_STRERROR
+# ifdef __cplusplus
+}
+# endif /* __cplusplus */
+# endif
+#endif /* VMS */
+
#ifndef DONT_DECLARE_STRERROR
+# ifdef __cplusplus
+extern "C" {
+# endif /* __cplusplus */
extern char *strerror (int);
+# ifdef __cplusplus
+}
+# endif /* __cplusplus */
#endif
/* If strerror returns NULL, we'll format the number into a static buffer. */
diff --git a/libiberty/xstrndup.c b/libiberty/xstrndup.c
index 68c5f453c7d..0a41f608ec0 100644
--- a/libiberty/xstrndup.c
+++ b/libiberty/xstrndup.c
@@ -53,8 +53,8 @@ xstrndup (const char *s, size_t n)
if (n < len)
len = n;
- result = xmalloc (len + 1);
+ result = XNEWVEC (char, len + 1);
result[len] = '\0';
- return memcpy (result, s, len);
+ return (char *) memcpy (result, s, len);
}
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 738b017e5f0..631637cadea 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,7 +1,270 @@
+2005-06-15 Tom Tromey <tromey@redhat.com>
+
+ PR libgcj/17536:
+ * testsuite/libjava.lang/pr17536.java: New file.
+ * testsuite/libjava.lang/pr17536.out: New file.
+
+2005-06-15 Goffredo Baroncelli <kreijack@inwind.it>
+
+ PR libgcj/21074:
+ * gnu/java/net/protocol/http/HTTPURLConnection.java
+ (getHeaderFieldKey): Check index.
+
+2005-06-15 Tom Tromey <tromey@redhat.com>
+
+ PR libgcj/21906:
+ * defineclass.cc (handleMethodsEnd): Set ncode for abstract
+ methods.
+ * include/jvm.h (_Jv_ThrowAbstractMethodError): Declare.
+ * link.cc (_Jv_ThrowAbstractMethodError): Renamed. No longer
+ static.
+ (append_partial_itable): Use it.
+ (set_vtable_entries): Likewise.
+
+2005-06-15 Tom Tromey <tromey@redhat.com>
+
+ * gnu/gcj/runtime/SystemClassLoader.java (init): Clear
+ last_was_sep in loop.
+
+2005-06-15 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
+
+ * configure.host: Handle Solaris 10/x86.
+
+2005-06-14 Keith Seitz <keiths@redhat.com>
+
+ * gnu/classpath/jdwp/id/JdwpIdFactory.java: New file.
+ * gnu/classpath/jdwp/processor/PacketProcessor.java: New file.
+
+2005-06-14 Keith Seitz <keiths@redhat.com>
+
+ * gnu/classpath/jdwp/id/ArrayId.java: New file.
+ * gnu/classpath/jdwp/id/ArrayReferenceTypeId.java: New file.
+ * gnu/classpath/jdwp/id/ClassLoaderId.java: New file.
+ * gnu/classpath/jdwp/id/ClassObjectId.java: New file.
+ * gnu/classpath/jdwp/id/ClassReferenceTypeId.java: New file.
+ * gnu/classpath/jdwp/id/InterfaceReferenceTypeId.java: New file.
+ * gnu/classpath/jdwp/id/JdwpId.java: New file.
+ * gnu/classpath/jdwp/id/ObjectId.java: New file.
+ * gnu/classpath/jdwp/id/ReferenceTypeId.java: New file.
+ * gnu/classpath/jdwp/id/StringId.java: New file.
+ * gnu/classpath/jdwp/id/ThreadGroupId.java: New file.
+ * gnu/classpath/jdwp/id/ThreadId.java: New file.
+
+2005-06-14 Tom Tromey <tromey@redhat.com>
+
+ PR libgcj/19877:
+ * configure, aclocal.m4, Makefile.in: Rebuilt.
+
+2005-06-14 Tom Tromey <tromey@redhat.com>
+
+ * java/lang/Class.java (getClasses): New method.
+ (internalGetClasses): Likewise.
+ (getClassLoader): Updated documentation.
+ (getDeclaredClasses): New overload; old overload no longer
+ native.
+ (_getConstructors): Removed.
+ (resourcePath): Updated.
+ * java/lang/natClass.cc (getClasses): Removed.
+ * java/lang/Class.h (getDeclaredClasses, getDeclaredConstructors):
+ Updated.
+ (_getConstructors): Removed.
+
+2005-06-13 Jim Huang <jserv@kaffe.org>
+
+ PR libgcj/22036:
+ * jni.cc (_Jv_JNI_NewObjectV): Use chars() method.
+ (_Jv_JNI_NewObject): Likewise.
+
+2005-06-13 Tom Tromey <tromey@redhat.com>
+
+ PR java/21844:
+ * testsuite/libjava.lang/pr21844.java: New file.
+ * testsuite/libjava.lang/pr21844.out: New file.
+
+2005-06-08 Bryce McKinlay <mckinlay@redhat.com>
+
+ PR libgcj/21949
+ * java/rmi/server/RMIClassLoader.java (getClassLoader): Make public.
+ From Gary Benson.
+
+2005-06-08 Ziga Mahkovec <ziga.mahkovec@klika.si>
+
+ * java/text/MessageFormat.java (parse): When parsing strings, check
+ for an empty pattern trailer.
+
+2005-06-06 Keith Seitz <keiths@redhat.com>
+
+ * gnu/classpath/jdwp/util/Signature.java: New file.
+ * gnu/classpath/jdwp/transport/JdwpConnection.java: New file.
+
+2005-06-05 Anthony Green <green@redhat.com>
+
+ * gnu/java/net/natPlainSocketImplPosix.cc (setOption): Fix case
+ fall-through bug.
+
+2005-06-04 Anthony Green <green@redhat.com>
+
+ * java/net/URLClassLoader.java: import gnu.gcj.Core,
+ and gnu.java.net.protocol.core.CoreInputStream.
+ (CureURLLoader): New class.
+ (CoreResource): New class.
+ (addURLImpl): Add special treatment for the "core" protocol.
+ * gnu/gcj/natCore.cc (find): New method.
+ * gnu/gcj/Core.java (find): New method.
+
+2005-06-03 Keith Seitz <keiths@redhat.com>
+
+ * gnu/classpath/jdwp/transport/ITransport.java: New file.
+ * gnu/classpath/jdwp/transport/SocketTransport.java: New file.
+ * gnu/classpath/jdwp/transport/TransportFactory.java: New file.
+
+2005-06-03 Andreas Tobler <a.tobler@schweiz.ch>
+
+ * jawt.c: Remove malloc.h, covered by stdlib.h.
+
+ * testsuite/libjava.jni/jni.exp
+ (gcj_jni_invocation_compile_c_to_binary): Add -bind_at_load to silence
+ the build process.
+
+2005-06-02 Keith Seitz <keiths@redhat.com>
+
+ * gnu/classpath/jdwp/transport/TransportException.java: New file.
+
+2005-06-02 Andreas Tobler <a.tobler@schweiz.ch>
+
+ * mauve-libgcj: Remove implemented classes from the fail section.
+ Add two new not implemented to it.
+
+2005-06-01 Bryce McKinlay <mckinlay@redhat.com>
+
+ * configure.ac (BACKTRACESPEC): Remove definition, but continue to
+ AC_SUBST definition from configure.host.
+ * configure.host: Don't use -fno-omit-frame-pointer. Set BACKTRACESPEC
+ to -fomit-frame-pointer on 32-bit x86 targets.
+
+2005-06-01 Tom Tromey <tromey@redhat.com>
+
+ * java/io/ObjectInputStream.java (currentLoader): Fixed typo.
+
+2005-06-01 Ziga Mahkovec <ziga.mahkovec@klika.si>
+
+ PR libgcj/20435:
+ * gnu/regexp/RESyntax.java (RE_POSSESSIVE_OPS): New field.
+ (static): Add possessive matching to JAVA_1_4 syntax.
+ * gnu/regexp/RETokenRepeated.java (possessive): New field.
+ (makePossessive, isPossessive): New methods.
+ (match): Don't back off during possessive matching.
+ * gnu/regexp/RE.java (initalize): Accept possessive quantifier.
+ * java/util/regex/Pattern.java (constructor): Switch syntax from PERL5
+ to JAVA_1_4.
+
+2005-06-01 Keith Seitz <keiths@redhat.com>
+
+ * gnu/classpath/jdwp/transport/JdwpPacket.java: New file.
+ * gnu/classpath/jdwp/transport/JdwpCommandPacket.java: New file.
+ * gnu/classpath/jdwp/transport/JdwpReplyPacket.java: New file.
+
+2005-06-01 Tom Tromey <tromey@redhat.com>
+
+ PR libgcj/21785:
+ * java/io/natObjectInputStream.cc (currentClassLoader): Removed.
+ (currentLoader): New method.
+ * java/io/ObjectInputStream.java (resolveProxyClass): Use
+ currentLoader.
+ (currentLoader): Now native.
+ (currentClassLoader): Removed.
+ * testsuite/libjava.lang/pr21785.java: New file.
+ * testsuite/libjava.lang/pr21785.out: New file.
+
+2005-06-01 Tom Tromey <tromey@redhat.com>
+
+ PR libgcj/21753:
+ * java/lang/natString.cc (substring): Changed sharing heuristic.
+
+2005-05-30 Bryce McKinlay <mckinlay@redhat.com>
+
+ PR libgcj/21821
+ * gnu/java/nio/channels/natFileChannelPosix.cc (open): Don't use
+ MAXPATHLEN. Format exception message using a StringBuffer instead.
+
+2005-05-29 Michael Koch <konqueror@gmx.de>
+
+ PR libgcj/20273:
+ * java/util/LinkedHashMap.java (access): Set 'root.pred'.
+
+2005-05-27 Ziga Mahkovec <ziga.mahkovec@klika.si>
+
+ * ChangeLog: Fix typo.
+
+2005-05-26 Ranjit Mathew <rmathew@hotmail.com>
+
+ Testsuite adjustments for PR java/19870.
+ * testsuite/libjava.lang/PR19870.java: New testcase.
+ * testsuite/libjava.lang/PR19870.out: Expected output for the
+ testcase.
+ * testsuite/libjava.jacks/jacks.xfail: Add
+ 8.5.2-accessible-static-member-usage-3 and 15.8.4-static-2
+
+
+2005-05-26 Bryce McKinlay <mckinlay@redhat.com>
+
+ * include/jvm.h (FLAG_BINARYCOMPAT_ABI, FLAG_BOOTSTRAP_LOADER): New.
+ (GCJ_BINARYCOMPAT_ADDITION, GCJ_BOOTSTRAP_LOADER_ADDITION): Removed.
+ (OLD_GCJ_40_BC_ABI_VERSION): Renamed. Old-style version ID for BC-ABI
+ classes.
+ (GCJ_CXX_ABI_VERSION): Renamed from GCJ_ABI_VERSION.
+ (GCJ_40_BC_ABI_VERSION): New. Calculate version IDs using new method.
+ (_Jv_CheckABIVersion): Check for both old and new style version IDs.
+ (_Jv_ClassForBootstrapLoader): Use FLAG_BOOTSTRAP_LOADER.
+
+2005-05-25 Richard Henderson <rth@redhat.com>
+
+ PR libgcj/21692
+ * sysdep/descriptor-n.h: New file.
+ * sysdep/descriptor-y.h: New file.
+ * sysdep/powerpc/descriptor.h: New file.
+ * configure.host: Set $descriptor_h appropriate for the host.
+ * configure.ac: Link it.
+ * configure: Regenerate.
+ * stacktrace.cc: Include sysdep/descriptor.h.
+ (_Jv_StackTrace::UpdateNCodeMap): Use UNWRAP_FUNCTION_DESCRIPTOR.
+
+2005-05-25 Chris Burdess <dog@gnu.org>
+
+ * gnu/xml/dom/ls/SAXEventSink.java: Ignore XML entities in start/
+ end entity callbacks.
+
+2005-05-24 Gary Benson <gbenson@redhat.com>
+
+ PR libgcj/21736:
+ * java/text/MessageFormat.java (MessageFormatElement.setLocale):
+ Handle DateFormat.DEFAULT case correctly.
+
+2005-05-21 Tom Tromey <tromey@redhat.com>
+
+ PR libgcj/21703:
+ * java/lang/ref/natReference.cc (find_slot): Handle case where
+ table has no NULL entries.
+ * java/lang/natString.cc (_Jv_StringFindSlot): Handle case where
+ table has no NULL entries.
+
+2005-05-22 Andreas Jaeger <aj@suse.de>
+
+ * java/lang/mprec.c (mult, lshift, b2d, d2b): Add parenthesis to
+ avoid warnings.
+
+2005-05-21 Ranjit Mathew <rmathew@hotmail.com>
+
+ * testsuite/libjava.jacks/jacks.xfail: Remove 3.10.2-round-6.
+
+2005-05-19 Richard Henderson <rth@redhat.com>
+
+ * exception.cc: Revert 05-17 gcc_unreachable change.
+
2005-05-19 Bryce McKinlay <mckinlay@redhat.com>
* java/lang/natClassLoader.cc (_Jv_NewClass): Use
- _Jv_RegisterInitiatingLoader to register array classes, not
+ _Jv_RegisterInitiatingLoader to register array classes, not
_Jv_RegisterClass.
(_Jv_RegisterInitiatingLoader): Give up if called very early during
bootstrapping. Add a FIXME to handle this case better.
@@ -47,9 +310,9 @@
Use AC_CHECK_SIZEOF instead of AC_COMPILE_CHECK_SIZEOF.
* aclocal.m4, configure, config.h.in, include/config.h.in,
Makefile.in, include/Makefile.in, testsuite/Makefile.in,
- external/Makefile.in, external/sax/Makefile.in,
+ external/Makefile.in, external/sax/Makefile.in,
external/w3c_dom/Makefile.in, gcj/Makefile.in: Regenerate.
-
+
2005-05-17 David Daney <ddaney@avtrex.com>
PR libgcj/18220
@@ -126,7 +389,7 @@
2005-05-16 Ziga Mahkovec <ziga.mahkovec@klika.si>
PR libgcj/20504
- gnu/regexp/RE.java: Add support for quoting constructs.
+ * gnu/regexp/RE.java: Add support for quoting constructs.
2005-05-15 Tom Tromey <tromey@redhat.com>
@@ -161,7 +424,7 @@
(gcj::verbose_class_flag): Move definition here.
(_Jv_Linker::wait_for_state): Don't call verify_class
if gcj::verifyClasses is not set.
- * gij.cc (main): Set gcj::verifyClasses when '-noverify' is given.
+ * gij.cc (main): Set gcj::verifyClasses when '-noverify' is given.
2005-05-12 Aaron Luchko <aluchko@redhat.com>
@@ -403,7 +666,7 @@
2005-04-29 Andrew Haley <aph@redhat.com>
* java/lang/Class.h (_Jv_ResolvePoolEntry): Declare as friend.
-
+
2005-04-29 Dalibor Topic <robilad@kaffe.org>
* java/nio/channels/FileChannelImpl.java
@@ -2478,7 +2741,7 @@
(getLinearDay): Should be private.
2005-03-23 Tom Tromey <tromey@redhat.com>
-
+
* include/jvm.h (GCJ_40_BC_ABI_VERSION): New define.
(_Jv_CheckABIVersion): Use it.
@@ -6250,7 +6513,7 @@
(setRowSelectionInterval): Likewise.
(removeColumnSelectionInterval): Likewise.
(removeRowSelectionInterval): Likewise.
- (isColumnSelected): Likewise.
+ (isColumnSelected): Likewise.
(isRowSelected): Likewise.
(isCellSelected): Likewise.
(selectAll): Likewise.
@@ -7536,4 +7799,3 @@
2005-01-01 Bryce McKinlay <mckinlay@redhat.com>
* include/boehm-gc.h: Include gc_ext_config.h, not gc_config.h.
-
diff --git a/libjava/Makefile.in b/libjava/Makefile.in
index ea272b40e01..5edc7c38fc5 100644
--- a/libjava/Makefile.in
+++ b/libjava/Makefile.in
@@ -60,9 +60,11 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/../compile \
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
+ $(top_srcdir)/../config/depstand.m4 \
$(top_srcdir)/../config/gxx-include-dir.m4 \
$(top_srcdir)/../config/iconv.m4 \
$(top_srcdir)/../config/lcmessage.m4 \
+ $(top_srcdir)/../config/lead-dot.m4 \
$(top_srcdir)/../config/lib-ld.m4 \
$(top_srcdir)/../config/lib-link.m4 \
$(top_srcdir)/../config/lib-prefix.m4 $(top_srcdir)/pkg.m4 \
@@ -83,7 +85,7 @@ CONFIG_CLEAN_FILES = libgcj.pc libgcj.spec libgcj-test.spec \
gnu/java/net/natPlainDatagramSocketImpl.cc \
gnu/java/nio/natPipeImpl.cc gnu/java/nio/natSelectorImpl.cc \
gnu/java/nio/channels/natFileChannelImpl.cc sysdep/locks.h \
- sysdep/backtrace.h
+ sysdep/backtrace.h sysdep/descriptor.h
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
diff --git a/libjava/aclocal.m4 b/libjava/aclocal.m4
index af77ba451c4..b0713c7d5c8 100644
--- a/libjava/aclocal.m4
+++ b/libjava/aclocal.m4
@@ -577,39 +577,6 @@ AC_DEFUN([AM_PROG_INSTALL_SH],
install_sh=${install_sh-"$am_aux_dir/install-sh"}
AC_SUBST(install_sh)])
-# -*- Autoconf -*-
-# Copyright (C) 2003 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# serial 1
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot. For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
- am__leading_dot=.
-else
- am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
# Add --enable-maintainer-mode option to configure.
# From Jim Meyering
@@ -1129,9 +1096,11 @@ AC_SUBST([am__untar])
]) # _AM_PROG_TAR
m4_include([../config/acx.m4])
+m4_include([../config/depstand.m4])
m4_include([../config/gxx-include-dir.m4])
m4_include([../config/iconv.m4])
m4_include([../config/lcmessage.m4])
+m4_include([../config/lead-dot.m4])
m4_include([../config/lib-ld.m4])
m4_include([../config/lib-link.m4])
m4_include([../config/lib-prefix.m4])
diff --git a/libjava/configure b/libjava/configure
index 76b062af128..a1b7dd3a01e 100755
--- a/libjava/configure
+++ b/libjava/configure
@@ -310,7 +310,7 @@ ac_includes_default="\
# include <unistd.h>
#endif"
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os build_subdir host_subdir target_subdir libgcj_basedir host host_cpu host_vendor host_os target target_cpu target_vendor target_os target_noncanonical LN_S mkinstalldirs CC ac_ct_CC EXEEXT OBJEXT CXX ac_ct_CXX CFLAGS CXXFLAGS LDFLAGS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE AS ac_ct_AS AR ac_ct_AR RANLIB ac_ct_RANLIB MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBGCJ_CFLAGS LIBGCJ_CXXFLAGS LIBGCJ_JAVAFLAGS LIBGCJ_LD_SYMBOLIC INCLTDL LIBLTDL DIRLTDL LIBTOOL CXXCPP CPPFLAGS GCJ GCJFLAGS GCJDEPMODE am__fastdepGCJ_TRUE am__fastdepGCJ_FALSE subdirs TESTSUBDIR_TRUE TESTSUBDIR_FALSE JAVA_HOME_SET_TRUE JAVA_HOME_SET_FALSE JAVA_HOME LIBGCJDEBUG INTERPRETER LIBFFI LIBFFIINCS PLATFORM_INNER_NAT_HDRS CPP EGREP USING_WIN32_PLATFORM_TRUE USING_WIN32_PLATFORM_FALSE USING_POSIX_PLATFORM_TRUE USING_POSIX_PLATFORM_FALSE USING_ECOS_PLATFORM_TRUE USING_ECOS_PLATFORM_FALSE USING_DARWIN_CRT_TRUE USING_DARWIN_CRT_FALSE SYSTEMSPEC LIBGCJTESTSPEC ZLIBSPEC ZLIBTESTSPEC X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS TOOLKIT XLIB_AWT_TRUE XLIB_AWT_FALSE GTK_AWT_TRUE GTK_AWT_FALSE GTK_CAIRO_TRUE GTK_CAIRO_FALSE PKG_CONFIG CAIRO_CFLAGS CAIRO_LIBS PANGOFT2_CFLAGS PANGOFT2_LIBS GCLIBS GCINCS GCDEPS GCSPEC JC1GCSPEC GCTESTSPEC USING_BOEHMGC_TRUE USING_BOEHMGC_FALSE USING_NOGC_TRUE USING_NOGC_FALSE THREADLIBS THREADINCS THREADDEPS THREADSPEC THREADLDFLAGS THREADCXXFLAGS USING_POSIX_THREADS_TRUE USING_POSIX_THREADS_FALSE USING_WIN32_THREADS_TRUE USING_WIN32_THREADS_FALSE USING_NO_THREADS_TRUE USING_NO_THREADS_FALSE HASH_SYNC_SPEC USING_GCC_TRUE USING_GCC_FALSE LIBICONV LTLIBICONV GTK_CFLAGS GTK_LIBS GLIB_CFLAGS GLIB_LIBS LIBART_CFLAGS LIBART_LIBS SUPPLY_BACKTRACE_TRUE SUPPLY_BACKTRACE_FALSE GCJH ZIP CLASSPATH_SEPARATOR ac_ct_GCJ ZLIBS SYS_ZLIBS ZINCS DIVIDESPEC CHECKREFSPEC EXCEPTIONSPEC IEEESPEC NATIVE_TRUE NATIVE_FALSE NEEDS_DATA_START_TRUE NEEDS_DATA_START_FALSE GCC_UNWIND_INCLUDE toolexecdir toolexecmainlibdir toolexeclibdir GCJVERSION gxx_include_dir libstdcxx_incdir ALLOCA PERL BACKTRACESPEC SYSDEP_SOURCES here LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os build_subdir host_subdir target_subdir libgcj_basedir host host_cpu host_vendor host_os target target_cpu target_vendor target_os target_noncanonical LN_S mkinstalldirs CC ac_ct_CC EXEEXT OBJEXT CXX ac_ct_CXX CFLAGS CXXFLAGS LDFLAGS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE AS ac_ct_AS AR ac_ct_AR RANLIB ac_ct_RANLIB MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBGCJ_CFLAGS LIBGCJ_CXXFLAGS LIBGCJ_JAVAFLAGS LIBGCJ_LD_SYMBOLIC INCLTDL LIBLTDL DIRLTDL LIBTOOL CXXCPP CPPFLAGS GCJ GCJFLAGS GCJDEPMODE am__fastdepGCJ_TRUE am__fastdepGCJ_FALSE subdirs TESTSUBDIR_TRUE TESTSUBDIR_FALSE JAVA_HOME_SET_TRUE JAVA_HOME_SET_FALSE JAVA_HOME LIBGCJDEBUG INTERPRETER LIBFFI LIBFFIINCS PLATFORM_INNER_NAT_HDRS CPP EGREP USING_WIN32_PLATFORM_TRUE USING_WIN32_PLATFORM_FALSE USING_POSIX_PLATFORM_TRUE USING_POSIX_PLATFORM_FALSE USING_ECOS_PLATFORM_TRUE USING_ECOS_PLATFORM_FALSE USING_DARWIN_CRT_TRUE USING_DARWIN_CRT_FALSE SYSTEMSPEC LIBGCJTESTSPEC ZLIBSPEC ZLIBTESTSPEC X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS TOOLKIT XLIB_AWT_TRUE XLIB_AWT_FALSE GTK_AWT_TRUE GTK_AWT_FALSE GTK_CAIRO_TRUE GTK_CAIRO_FALSE PKG_CONFIG CAIRO_CFLAGS CAIRO_LIBS PANGOFT2_CFLAGS PANGOFT2_LIBS GCLIBS GCINCS GCDEPS GCSPEC JC1GCSPEC GCTESTSPEC USING_BOEHMGC_TRUE USING_BOEHMGC_FALSE USING_NOGC_TRUE USING_NOGC_FALSE THREADLIBS THREADINCS THREADDEPS THREADSPEC THREADLDFLAGS THREADCXXFLAGS USING_POSIX_THREADS_TRUE USING_POSIX_THREADS_FALSE USING_WIN32_THREADS_TRUE USING_WIN32_THREADS_FALSE USING_NO_THREADS_TRUE USING_NO_THREADS_FALSE HASH_SYNC_SPEC USING_GCC_TRUE USING_GCC_FALSE LIBICONV LTLIBICONV GTK_CFLAGS GTK_LIBS GLIB_CFLAGS GLIB_LIBS LIBART_CFLAGS LIBART_LIBS SUPPLY_BACKTRACE_TRUE SUPPLY_BACKTRACE_FALSE GCJH ZIP CLASSPATH_SEPARATOR ac_ct_GCJ ZLIBS SYS_ZLIBS ZINCS DIVIDESPEC CHECKREFSPEC EXCEPTIONSPEC BACKTRACESPEC IEEESPEC NATIVE_TRUE NATIVE_FALSE NEEDS_DATA_START_TRUE NEEDS_DATA_START_FALSE GCC_UNWIND_INCLUDE toolexecdir toolexecmainlibdir toolexeclibdir GCJVERSION gxx_include_dir libstdcxx_incdir ALLOCA PERL SYSDEP_SOURCES here LIBOBJS LTLIBOBJS'
ac_subst_files=''
# Initialize some variables set by options.
@@ -8511,6 +8511,8 @@ if test -d sysdep; then true; else mkdir sysdep; fi
ac_config_links="$ac_config_links sysdep/backtrace.h:$fallback_backtrace_h"
+ ac_config_links="$ac_config_links sysdep/descriptor.h:$descriptor_h"
+
HASH_SYNC_SPEC=
# Hash synchronization is only useful with posix threads right now.
@@ -14183,6 +14185,7 @@ fi
+
if test "$NATIVE" = yes; then
NATIVE_TRUE=
NATIVE_FALSE='#'
@@ -15581,7 +15584,7 @@ if test x$gcc_no_link = xyes; then
ac_cv_func_mmap_fixed_mapped=no
fi
fi
-if test "x${ac_cv_func_mmap_fixed_mapped+set}" != xset; then
+if test "x${ac_cv_func_mmap_fixed_mapped}" != xno; then
for ac_header in stdlib.h unistd.h
@@ -16118,15 +16121,6 @@ if test "$enable_sjlj_exceptions" = yes; then
SIGNAL_HANDLER_AUX=
fi
-# Define here any compiler flags that you need in order to make backtrace() work.
-BACKTRACESPEC=
-case "${host}" in
- x86_64*-*-linux*|i?86-*)
- BACKTRACESPEC=-fno-omit-frame-pointer
- ;;
-esac
-
-
if test -z "$SIGNAL_HANDLER_AUX"; then
@@ -16892,6 +16886,7 @@ do
"include/java-threads.h" ) CONFIG_LINKS="$CONFIG_LINKS include/java-threads.h:include/$THREADH" ;;
"sysdep/locks.h" ) CONFIG_LINKS="$CONFIG_LINKS sysdep/locks.h:sysdep/$sysdeps_dir/locks.h" ;;
"sysdep/backtrace.h" ) CONFIG_LINKS="$CONFIG_LINKS sysdep/backtrace.h:$fallback_backtrace_h" ;;
+ "sysdep/descriptor.h" ) CONFIG_LINKS="$CONFIG_LINKS sysdep/descriptor.h:$descriptor_h" ;;
"include/java-signal.h" ) CONFIG_LINKS="$CONFIG_LINKS include/java-signal.h:$SIGNAL_HANDLER" ;;
"include/java-signal-aux.h" ) CONFIG_LINKS="$CONFIG_LINKS include/java-signal-aux.h:$SIGNAL_HANDLER_AUX" ;;
"depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
@@ -17156,6 +17151,7 @@ s,@ZINCS@,$ZINCS,;t t
s,@DIVIDESPEC@,$DIVIDESPEC,;t t
s,@CHECKREFSPEC@,$CHECKREFSPEC,;t t
s,@EXCEPTIONSPEC@,$EXCEPTIONSPEC,;t t
+s,@BACKTRACESPEC@,$BACKTRACESPEC,;t t
s,@IEEESPEC@,$IEEESPEC,;t t
s,@NATIVE_TRUE@,$NATIVE_TRUE,;t t
s,@NATIVE_FALSE@,$NATIVE_FALSE,;t t
@@ -17170,7 +17166,6 @@ s,@gxx_include_dir@,$gxx_include_dir,;t t
s,@libstdcxx_incdir@,$libstdcxx_incdir,;t t
s,@ALLOCA@,$ALLOCA,;t t
s,@PERL@,$PERL,;t t
-s,@BACKTRACESPEC@,$BACKTRACESPEC,;t t
s,@SYSDEP_SOURCES@,$SYSDEP_SOURCES,;t t
s,@here@,$here,;t t
s,@LIBOBJS@,$LIBOBJS,;t t
diff --git a/libjava/configure.ac b/libjava/configure.ac
index 594df415c39..a7d9d20fb31 100644
--- a/libjava/configure.ac
+++ b/libjava/configure.ac
@@ -707,6 +707,7 @@ AM_CONDITIONAL(USING_NO_THREADS, test "$THREADS" = none)
if test -d sysdep; then true; else mkdir sysdep; fi
AC_CONFIG_LINKS(sysdep/locks.h:sysdep/$sysdeps_dir/locks.h)
AC_CONFIG_LINKS(sysdep/backtrace.h:$fallback_backtrace_h)
+AC_CONFIG_LINKS(sysdep/descriptor.h:$descriptor_h)
HASH_SYNC_SPEC=
# Hash synchronization is only useful with posix threads right now.
@@ -1147,6 +1148,7 @@ AC_SUBST(ZINCS)
AC_SUBST(DIVIDESPEC)
AC_SUBST(CHECKREFSPEC)
AC_SUBST(EXCEPTIONSPEC)
+AC_SUBST(BACKTRACESPEC)
AC_SUBST(IEEESPEC)
AM_CONDITIONAL(NATIVE, test "$NATIVE" = yes)
@@ -1344,15 +1346,6 @@ if test "$enable_sjlj_exceptions" = yes; then
SIGNAL_HANDLER_AUX=
fi
-# Define here any compiler flags that you need in order to make backtrace() work.
-BACKTRACESPEC=
-case "${host}" in
- x86_64*-*-linux*|i?86-*)
- BACKTRACESPEC=-fno-omit-frame-pointer
- ;;
-esac
-AC_SUBST(BACKTRACESPEC)
-
AC_SUBST(SYSDEP_SOURCES)
if test -z "$SIGNAL_HANDLER_AUX"; then
diff --git a/libjava/configure.host b/libjava/configure.host
index ff86d72305b..7f57cb0841b 100644
--- a/libjava/configure.host
+++ b/libjava/configure.host
@@ -32,6 +32,7 @@
# (i.e it is broken).
# fallback_backtrace_h Header to use for fallback backtrace implementation
# (only for targets that don't support DWARF2 unwind)
+# descriptor_h Header to use for looking past function descriptors
libgcj_flags=
libgcj_cflags=
@@ -68,6 +69,7 @@ echo "$target"
DIVIDESPEC=-fuse-divide-subroutine
EXCEPTIONSPEC=-fnon-call-exceptions
CHECKREFSPEC=
+BACKTRACESPEC=
# This case statement supports per-CPU defaults.
case "${host}" in
@@ -93,17 +95,18 @@ case "${host}" in
;;
i686-*|i586-*|i486-*|i386-*)
sysdeps_dir=i386
- libgcj_flags="${libgcj_flags} -ffloat-store -fno-omit-frame-pointer"
+ libgcj_flags="${libgcj_flags} -ffloat-store"
libgcj_interpreter=yes
libgcj_cxxflags=
libgcj_cflags=
DIVIDESPEC=-fno-use-divide-subroutine
+ BACKTRACESPEC=-fomit-frame-pointer
enable_hash_synchronization_default=yes
slow_pthread_self=yes
;;
x86_64-*)
sysdeps_dir=x86-64
- libgcj_flags="${libgcj_flags} -ffloat-store -fno-omit-frame-pointer"
+ libgcj_flags="${libgcj_flags} -ffloat-store"
libgcj_cxxflags=
libgcj_cflags=
DIVIDESPEC=-f%{m32:no-}use-divide-subroutine
@@ -228,6 +231,10 @@ EOF
rm -f conftest conftest.c
fi
;;
+ i[34567]86-*-solaris2.1[0-9]* )
+ sysdeps_dir=x86-64
+ DIVIDESPEC=-f%{m32:no-}%{!m32:%{!m64:no-}}%{m64:}use-divide-subroutine
+ ;;
mips*-*-linux* )
sysdeps_dir=mips
can_unwind_signal=yes
@@ -265,9 +272,24 @@ esac
case "${host}" in
*-cygwin* | *-mingw*)
fallback_backtrace_h=sysdep/i386/backtrace.h
+ # We need a frame pointer on Windows, so override BACKTRACESPEC
+ BACKTRACESPEC=
;;
esac
+case "${host}" in
+ ia64-* | hppa*-*)
+ descriptor_h=sysdep/descriptor-y.h
+ ;;
+
+ rs6000-* | powerpc*-*)
+ descriptor_h=sysdep/powerpc/descriptor.h
+ ;;
+
+ *)
+ descriptor_h=sysdep/descriptor-n.h
+ ;;
+esac
libgcj_cflags="${libgcj_cflags} ${libgcj_flags}"
libgcj_cxxflags="${libgcj_cxxflags} ${libgcj_flags}"
diff --git a/libjava/defineclass.cc b/libjava/defineclass.cc
index 111b1fb2ca2..7564957dc43 100644
--- a/libjava/defineclass.cc
+++ b/libjava/defineclass.cc
@@ -1288,7 +1288,7 @@ void _Jv_ClassReader::handleMethod
throw_class_format_error ("erroneous method access flags");
// FIXME: JVM spec S4.6: if ABSTRACT modifier is set, verify other
- // flags are not set. Verify flags for interface methods. Verifiy
+ // flags are not set. Verify flags for interface methods. Verify
// modifiers for initializers.
}
}
@@ -1378,6 +1378,7 @@ void _Jv_ClassReader::handleMethodsEnd ()
{
if (def_interp->interpreted_methods[i] != 0)
throw_class_format_error ("code provided for abstract method");
+ method->ncode = (void *) &_Jv_ThrowAbstractMethodError;
}
else
{
diff --git a/libjava/exception.cc b/libjava/exception.cc
index 4bab412d5ba..367df3618b9 100644
--- a/libjava/exception.cc
+++ b/libjava/exception.cc
@@ -19,9 +19,17 @@ details. */
#include <gcj/cni.h>
#include <jvm.h>
-// Sometimes we compile libjava without libstdc++-v3. Therefore make
-// sure we use stdlib.h's abort().
-#define gcc_unreachable() ::abort ()
+// unwind-pe.h uses std::abort(), but sometimes we compile libjava
+// without libstdc++-v3. The following hack forces it to use
+// stdlib.h's abort().
+namespace std
+{
+ static __attribute__ ((__noreturn__)) void
+ abort ()
+ {
+ ::abort ();
+ }
+}
#include "unwind.h"
struct alignment_test_struct
diff --git a/libjava/external/Makefile.in b/libjava/external/Makefile.in
index 3ec4c0f0015..e413905e211 100644
--- a/libjava/external/Makefile.in
+++ b/libjava/external/Makefile.in
@@ -40,9 +40,11 @@ subdir = external
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
+ $(top_srcdir)/../config/depstand.m4 \
$(top_srcdir)/../config/gxx-include-dir.m4 \
$(top_srcdir)/../config/iconv.m4 \
$(top_srcdir)/../config/lcmessage.m4 \
+ $(top_srcdir)/../config/lead-dot.m4 \
$(top_srcdir)/../config/lib-ld.m4 \
$(top_srcdir)/../config/lib-link.m4 \
$(top_srcdir)/../config/lib-prefix.m4 $(top_srcdir)/pkg.m4 \
diff --git a/libjava/external/sax/Makefile.in b/libjava/external/sax/Makefile.in
index b06eda6596c..f0372e138e0 100644
--- a/libjava/external/sax/Makefile.in
+++ b/libjava/external/sax/Makefile.in
@@ -43,9 +43,11 @@ subdir = external/sax
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
+ $(top_srcdir)/../config/depstand.m4 \
$(top_srcdir)/../config/gxx-include-dir.m4 \
$(top_srcdir)/../config/iconv.m4 \
$(top_srcdir)/../config/lcmessage.m4 \
+ $(top_srcdir)/../config/lead-dot.m4 \
$(top_srcdir)/../config/lib-ld.m4 \
$(top_srcdir)/../config/lib-link.m4 \
$(top_srcdir)/../config/lib-prefix.m4 $(top_srcdir)/pkg.m4 \
diff --git a/libjava/external/w3c_dom/Makefile.in b/libjava/external/w3c_dom/Makefile.in
index d158bd7e7a5..f43ea1de130 100644
--- a/libjava/external/w3c_dom/Makefile.in
+++ b/libjava/external/w3c_dom/Makefile.in
@@ -43,9 +43,11 @@ subdir = external/w3c_dom
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
+ $(top_srcdir)/../config/depstand.m4 \
$(top_srcdir)/../config/gxx-include-dir.m4 \
$(top_srcdir)/../config/iconv.m4 \
$(top_srcdir)/../config/lcmessage.m4 \
+ $(top_srcdir)/../config/lead-dot.m4 \
$(top_srcdir)/../config/lib-ld.m4 \
$(top_srcdir)/../config/lib-link.m4 \
$(top_srcdir)/../config/lib-prefix.m4 $(top_srcdir)/pkg.m4 \
diff --git a/libjava/gcj/Makefile.in b/libjava/gcj/Makefile.in
index d26e13192e8..da7304ec969 100644
--- a/libjava/gcj/Makefile.in
+++ b/libjava/gcj/Makefile.in
@@ -43,9 +43,11 @@ DIST_COMMON = $(gcj_HEADERS) $(srcdir)/Makefile.am \
$(toolgcj_HEADERS)
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
+ $(top_srcdir)/../config/depstand.m4 \
$(top_srcdir)/../config/gxx-include-dir.m4 \
$(top_srcdir)/../config/iconv.m4 \
$(top_srcdir)/../config/lcmessage.m4 \
+ $(top_srcdir)/../config/lead-dot.m4 \
$(top_srcdir)/../config/lib-ld.m4 \
$(top_srcdir)/../config/lib-link.m4 \
$(top_srcdir)/../config/lib-prefix.m4 $(top_srcdir)/pkg.m4 \
diff --git a/libjava/gnu/classpath/jdwp/id/ArrayId.java b/libjava/gnu/classpath/jdwp/id/ArrayId.java
new file mode 100644
index 00000000000..bd95b84e5e5
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/id/ArrayId.java
@@ -0,0 +1,62 @@
+/* ArrayId.java -- array object IDs
+ Copyright (C) 2005 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
+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.classpath.jdwp.id;
+
+import gnu.classpath.jdwp.JdwpConstants;
+
+/**
+ * A class which represents a JDWP array id
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public class ArrayId
+ extends ObjectId
+{
+ // Arrays are handled a little differently than other IDs
+ //public static final Class typeClass = UNDEFINED
+
+ /**
+ * Constructs a new <code>ArrayId</code>
+ */
+ public ArrayId ()
+ {
+ super (JdwpConstants.Tag.ARRAY);
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/id/ArrayReferenceTypeId.java b/libjava/gnu/classpath/jdwp/id/ArrayReferenceTypeId.java
new file mode 100644
index 00000000000..23cf4e80f6f
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/id/ArrayReferenceTypeId.java
@@ -0,0 +1,59 @@
+/* ArrayReferenceTypeId.java -- array reference type ids
+ Copyright (C) 2005 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
+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.classpath.jdwp.id;
+
+import gnu.classpath.jdwp.JdwpConstants;
+
+/**
+ * A reference type ID representing java arrays
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public class ArrayReferenceTypeId
+ extends ReferenceTypeId
+{
+ /**
+ * Constructs a new <code>ArrayReferenceTypeId</code>
+ */
+ public ArrayReferenceTypeId ()
+ {
+ super (JdwpConstants.TypeTag.ARRAY);
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/id/ClassLoaderId.java b/libjava/gnu/classpath/jdwp/id/ClassLoaderId.java
new file mode 100644
index 00000000000..1f2b1e468ed
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/id/ClassLoaderId.java
@@ -0,0 +1,64 @@
+/* ClassLoaderId.java -- class loader IDs
+ Copyright (C) 2005 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
+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.classpath.jdwp.id;
+
+import gnu.classpath.jdwp.JdwpConstants;
+
+/**
+ * A class which represents a JDWP thread id
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public class ClassLoaderId
+ extends ObjectId
+{
+ /**
+ * The object class that this id represents
+ */
+ public static final Class typeClass = ClassLoader.class;
+
+ /**
+ * Constructs a new <code>ClassLoaderId</code>
+ */
+ public ClassLoaderId ()
+ {
+ super (JdwpConstants.Tag.CLASS_LOADER);
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/id/ClassObjectId.java b/libjava/gnu/classpath/jdwp/id/ClassObjectId.java
new file mode 100644
index 00000000000..cb756fdf166
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/id/ClassObjectId.java
@@ -0,0 +1,64 @@
+/* ClassObjectId.java -- class object IDs
+ Copyright (C) 2005 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
+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.classpath.jdwp.id;
+
+import gnu.classpath.jdwp.JdwpConstants;
+
+/**
+ * A class which represents a JDWP class object id
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public class ClassObjectId
+ extends ObjectId
+{
+ /**
+ * The object class that this id represents
+ */
+ public static final Class typeClass = Class.class;
+
+ /**
+ * Constructs a new <code>ClassObjectId</code>
+ */
+ public ClassObjectId ()
+ {
+ super (JdwpConstants.Tag.CLASS_OBJECT);
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/id/ClassReferenceTypeId.java b/libjava/gnu/classpath/jdwp/id/ClassReferenceTypeId.java
new file mode 100644
index 00000000000..4f96802a4b0
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/id/ClassReferenceTypeId.java
@@ -0,0 +1,59 @@
+/* ClassReferenceTypeId.java -- class reference type ids
+ Copyright (C) 2005 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
+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.classpath.jdwp.id;
+
+import gnu.classpath.jdwp.JdwpConstants;
+
+/**
+ * A reference type ID representing java classes
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public class ClassReferenceTypeId
+ extends ReferenceTypeId
+{
+ /**
+ * Constructs a new <code>ClassReferenceTypeId</code>
+ */
+ public ClassReferenceTypeId ()
+ {
+ super (JdwpConstants.TypeTag.CLASS);
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/id/InterfaceReferenceTypeId.java b/libjava/gnu/classpath/jdwp/id/InterfaceReferenceTypeId.java
new file mode 100644
index 00000000000..95d5a489699
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/id/InterfaceReferenceTypeId.java
@@ -0,0 +1,59 @@
+/* InterfaceReferenceTypeId.java -- interface reference type ids
+ Copyright (C) 2005 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
+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.classpath.jdwp.id;
+
+import gnu.classpath.jdwp.JdwpConstants;
+
+/**
+ * A reference type ID representing java interfaces
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public class InterfaceReferenceTypeId
+ extends ReferenceTypeId
+{
+ /**
+ * Constructs a new <code>InterfaceReferenceTypeId</code>
+ */
+ public InterfaceReferenceTypeId ()
+ {
+ super (JdwpConstants.TypeTag.INTERFACE);
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/id/JdwpId.java b/libjava/gnu/classpath/jdwp/id/JdwpId.java
new file mode 100644
index 00000000000..81b6d265985
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/id/JdwpId.java
@@ -0,0 +1,127 @@
+/* JdwpId.java -- base class for all object ID types
+ Copyright (C) 2005 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
+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.classpath.jdwp.id;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+/**
+ * A baseclass for all object types reported to the debugger
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public abstract class JdwpId
+{
+ /**
+ * ID assigned to this object
+ */
+ protected long _id;
+
+ /**
+ * Tag of ID's type (see {@link gnu.classpath.jdwp.JdwpConstants.Tag})
+ * for object-like IDs or the type tag (see {@link
+ * gnu.classpath.JdwpConstants.TypeTag}) for reference type IDs.
+ */
+ private byte _tag;
+
+ /**
+ * Constructs an empty <code>JdwpId</code>
+ */
+ public JdwpId (byte tag)
+ {
+ _tag = tag;
+ }
+
+ /**
+ * Sets the id for this object reference
+ */
+ void setId (long id)
+ {
+ _id = id;
+ }
+
+ /**
+ * Returns the id for this object reference
+ */
+ public long getId ()
+ {
+ return _id;
+ }
+
+ /**
+ * Compares two object ids for equality. Two object ids
+ * are equal if they point to the same type and contain to
+ * the same id number. (NOTE: This is a much stricter check
+ * than is necessary: all <code>JdwpId</code>s have unique
+ * ids.)
+ */
+ public boolean equals (JdwpId id)
+ {
+ return ((id.getClass () == getClass ()) && (id.getId () == getId ()));
+ }
+
+ /**
+ * Returns size of this type (used by IDSizes)
+ */
+ public abstract int size ();
+
+ /**
+ * Writes the contents of this type to the <code>DataOutputStream</code>
+ * @param outStream the <code>DataOutputStream</code> to use
+ * @throws IOException when an error occurs on the <code>OutputStream</code>
+ */
+ public abstract void write (DataOutputStream outStream)
+ throws IOException;
+
+ /**
+ * Writes the contents of this type to the output stream, preceded
+ * by a one-byte tag for tagged object IDs or type tag for
+ * reference type IDs.
+ *
+ * @param outStream the <code>DataOutputStream</code> to use
+ * @throws IOException when an error occurs on the <code>OutputStream</code>
+ */
+ public void writeTagged (DataOutputStream outStream)
+ throws IOException
+ {
+ outStream.writeByte (_tag);
+ write (outStream);
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/id/JdwpIdFactory.java b/libjava/gnu/classpath/jdwp/id/JdwpIdFactory.java
new file mode 100644
index 00000000000..5a26cf888b0
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/id/JdwpIdFactory.java
@@ -0,0 +1,165 @@
+/* JdwpIdFactory.java -- factory for generating type and object IDs
+ Copyright (C) 2005 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
+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.classpath.jdwp.id;
+
+import java.util.HashMap;
+
+/**
+ * This factory generates ids for objects and types that may
+ * be sent to a debugger.
+ *
+ * @author Keith Seitz (keiths@redhat.com)
+ */
+public class JdwpIdFactory
+{
+ // ID of last object / referencetype
+ private static Object _idLock = new Object ();
+ private static Object _ridLock = new Object ();
+ private static long _lastId = 0;
+ private static long _lastRid = 0;
+
+ // A list of all ID types
+ private static HashMap _idList = new HashMap ();
+
+ // Initialize the id list with known types
+ static
+ {
+ // ObjectId and ArrayId are special cases. See newId.
+ _idList.put (ClassLoaderId.typeClass, ClassLoaderId.class);
+ _idList.put (ClassObjectId.typeClass, ClassObjectId.class);
+ //_idList.put (FieldId.typeClass, FieldId.class);
+ //_idList.put (FrameId.typeClass, FrameId.class);
+ //_idList.put (MethodId.typeClass, MethodId.class);
+ _idList.put (StringId.typeClass, StringId.class);
+ _idList.put (ThreadId.typeClass, ThreadId.class);
+ _idList.put (ThreadGroupId.typeClass, ThreadGroupId.class);
+ }
+
+ /**
+ * Returns a new id for the given object
+ *
+ * @param object the object for which an id is desired
+ * @returns a suitable object id
+ */
+ public static JdwpId newId (Object object)
+ {
+ JdwpId id = null;
+
+ // Special case: arrays
+ if (object.getClass ().isArray ())
+ id = new ArrayId ();
+ else
+ {
+ // Loop through all classes until we hit baseclass
+ Class myClass;
+ for (myClass = object.getClass (); myClass != null;
+ myClass = myClass.getSuperclass ())
+ {
+ Class clz = (Class) _idList.get (myClass);
+ if (clz != null)
+ {
+ try
+ {
+ id = (JdwpId) clz.newInstance ();
+ synchronized (_idLock)
+ {
+ id.setId (++_lastId);
+ }
+ return id;
+ }
+ catch (InstantiationException ie)
+ {
+ // This really should not happen
+ throw new RuntimeException ("cannot create new ID", ie);
+ }
+ catch (IllegalAccessException iae)
+ {
+ // This really should not happen
+ throw new RuntimeException ("illegal access of ID", iae);
+ }
+ }
+ }
+
+ /* getSuperclass returned null and no matching ID type found.
+ So it must derive from Object. */
+ id = new ObjectId ();
+ }
+
+ synchronized (_idLock)
+ {
+ id.setId (++_lastId);
+ }
+
+ return id;
+ }
+
+ /**
+ * Returns a new reference type id for the given class
+ *
+ * @param clazz the <code>Class</code> for which an id is desired
+ * @returns a suitable reference type id or <code>null</code>
+ */
+ public static ReferenceTypeId newReferenceTypeId (Class clazz)
+ {
+ ReferenceTypeId id = null;
+ try
+ {
+ if (clazz.isArray ())
+ id = new ArrayReferenceTypeId ();
+ else if (clazz.isInterface ())
+ id = new InterfaceReferenceTypeId ();
+ else
+ id = new ClassReferenceTypeId ();
+ synchronized (_ridLock)
+ {
+ id.setId (++_lastRid);
+ }
+ return id;
+ }
+ catch (InstantiationException ie)
+ {
+ return null;
+ }
+ catch (IllegalAccessException iae)
+ {
+ return null;
+ }
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/id/ObjectId.java b/libjava/gnu/classpath/jdwp/id/ObjectId.java
new file mode 100644
index 00000000000..6bd399fe2e7
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/id/ObjectId.java
@@ -0,0 +1,99 @@
+/* ObjectId.java -- object IDs
+ Copyright (C) 2005 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
+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.classpath.jdwp.id;
+
+import gnu.classpath.jdwp.JdwpConstants;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+/**
+ * A class which represents a JDWP object id for an object
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public class ObjectId
+ extends JdwpId
+{
+ /**
+ * The object class that this id represents
+ */
+ public static final Class typeClass = Object.class;
+
+ /**
+ * Constructs a new <code>ObjectId</code>
+ */
+ public ObjectId ()
+ {
+ super (JdwpConstants.Tag.OBJECT);
+ }
+
+ /**
+ * Constructs a new <code>ObjectId</code> of the
+ * given type.
+ *
+ * @param tag the tag of this type of object ID
+ */
+ public ObjectId (byte tag)
+ {
+ super (tag);
+ }
+
+ /**
+ * Returns the size of this id type
+ */
+ public int size ()
+ {
+ return 8;
+ }
+
+ /**
+ * Writes the id to the stream
+ *
+ * @param outStream the stream to which to write
+ * @throws IOException when an error occurs on the <code>OutputStream</code>
+ */
+ public void write (DataOutputStream outStream)
+ throws IOException
+ {
+ // All we need to do is write out our id as an 8-byte integer
+ outStream.writeLong (_id);
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/id/ReferenceTypeId.java b/libjava/gnu/classpath/jdwp/id/ReferenceTypeId.java
new file mode 100644
index 00000000000..63f38af04f1
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/id/ReferenceTypeId.java
@@ -0,0 +1,81 @@
+/* ReferenceTypeId.java -- a base class for all reference type IDs
+ Copyright (C) 2005 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
+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.classpath.jdwp.id;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+/**
+ * Base class for reference type IDs. This class usurps
+ * <code>JdwpId</code>'s tag member for its own use (type tag).
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public class ReferenceTypeId
+ extends JdwpId
+{
+ /**
+ * Constructor used by {Array,Interface,Class}ReferenceTypeId
+ */
+ public ReferenceTypeId (byte tag)
+ {
+ super (tag);
+ }
+
+ /**
+ * Returns the size of this ID type
+ */
+ public int size ()
+ {
+ return 8;
+ }
+
+ /**
+ * Outputs the reference type ID to the given output stream
+ *
+ * @param outStream the stream to which to write the data
+ * @throws IOException for errors writing to the stream
+ */
+ public void write (DataOutputStream outStream)
+ throws IOException
+ {
+ outStream.writeLong (_id);
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/id/StringId.java b/libjava/gnu/classpath/jdwp/id/StringId.java
new file mode 100644
index 00000000000..9e5b7ce8b64
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/id/StringId.java
@@ -0,0 +1,64 @@
+/* StringId.java -- string IDs
+ Copyright (C) 2005 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
+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.classpath.jdwp.id;
+
+import gnu.classpath.jdwp.JdwpConstants;
+
+/**
+ * A class which represents a JDWP string id
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public class StringId
+ extends ObjectId
+{
+ /**
+ * The object class that this id represents
+ */
+ public static final Class typeClass = String.class;
+
+ /**
+ * Constructs a new <code>StringId</code>
+ */
+ public StringId ()
+ {
+ super (JdwpConstants.Tag.STRING);
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/id/ThreadGroupId.java b/libjava/gnu/classpath/jdwp/id/ThreadGroupId.java
new file mode 100644
index 00000000000..80e8ac5001e
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/id/ThreadGroupId.java
@@ -0,0 +1,64 @@
+/* ThreadGroupId.java -- thread group IDs
+ Copyright (C) 2005 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
+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.classpath.jdwp.id;
+
+import gnu.classpath.jdwp.JdwpConstants;
+
+/**
+ * A class which represents a JDWP thread group id
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public class ThreadGroupId
+ extends ObjectId
+{
+ /**
+ * The object class that this id represents
+ */
+ public static final Class typeClass = ThreadGroup.class;
+
+ /**
+ * Constructs a new <code>ThreadGroupId</code>
+ */
+ public ThreadGroupId ()
+ {
+ super (JdwpConstants.Tag.THREAD_GROUP);
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/id/ThreadId.java b/libjava/gnu/classpath/jdwp/id/ThreadId.java
new file mode 100644
index 00000000000..9a719bec9fc
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/id/ThreadId.java
@@ -0,0 +1,64 @@
+/* ThreadId.java -- thread IDs
+ Copyright (C) 2005 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
+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.classpath.jdwp.id;
+
+import gnu.classpath.jdwp.JdwpConstants;
+
+/**
+ * A class which represents a JDWP thread id
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public class ThreadId
+ extends ObjectId
+{
+ /**
+ * The object class that this id represents
+ */
+ public static final Class typeClass = Thread.class;
+
+ /**
+ * Constructs a new <code>ThreadId</code>
+ */
+ public ThreadId ()
+ {
+ super (JdwpConstants.Tag.THREAD);
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/processor/PacketProcessor.java b/libjava/gnu/classpath/jdwp/processor/PacketProcessor.java
new file mode 100644
index 00000000000..8195cbbdee2
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/processor/PacketProcessor.java
@@ -0,0 +1,138 @@
+/* PacketProcessor.java -- a thread which processes command packets
+ from the debugger
+ Copyright (C) 2005 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
+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.classpath.jdwp.processor;
+
+import gnu.classpath.jdwp.Jdwp;
+import gnu.classpath.jdwp.event.Event;
+import gnu.classpath.jdwp.exception.JdwpException;
+import gnu.classpath.jdwp.transport.JdwpConnection;
+import gnu.classpath.jdwp.transport.JdwpCommandPacket;
+import gnu.classpath.jdwp.transport.JdwpPacket;
+import gnu.classpath.jdwp.transport.JdwpReplyPacket;
+
+import java.io.IOException;
+
+/**
+ * This class is responsible for processing packets from the
+ * debugger. It waits for an available packet from the connection
+ * ({@link gnu.classpath.jdwp.transport.JdwpConnection}) and then
+ * processes the packet and any reply.
+ *
+ * @author Keith Seitz (keiths@redhat.com)
+ */
+public class PacketProcessor
+ extends Thread
+{
+ // The connection to the debugger
+ private JdwpConnection _connection;
+
+ // Shutdown this thread?
+ private boolean _shutdown;
+
+ /**
+ * Constructs a new <code>PacketProcessor</code> object
+ * Connection must be validated before getting here!
+ *
+ * @param con the connection
+ */
+ public PacketProcessor (JdwpConnection con)
+ {
+ _connection = con;
+ _shutdown = false;
+ }
+
+ /**
+ * Main run routine for this thread. Will loop getting packets
+ * from the connection and processing them.
+ */
+ public void run ()
+ {
+ while (!_shutdown)
+ {
+ _processOnePacket ();
+ }
+ }
+
+ /**
+ * Shutdown the packet processor
+ */
+ public void shutdown ()
+ {
+ _shutdown = true;
+ interrupt ();
+ }
+
+ // Helper function which actually does all the work of waiting
+ // for a packet and getting it processed.
+ private void _processOnePacket ()
+ {
+ JdwpPacket pkt = _connection.getPacket ();
+ if (pkt instanceof JdwpReplyPacket)
+ {
+ // We're not supposed to get these from the debugger!
+ // Drop it on the floor
+ return;
+ }
+
+ if (pkt != null)
+ {
+ JdwpReplyPacket reply;
+ try
+ {
+ // !! process packet here !!
+ reply = new JdwpReplyPacket (pkt, (short) 0);
+ }
+ catch (JdwpException ex)
+ {
+ reply = new JdwpReplyPacket (pkt, ex.getErrorCode ());
+ }
+
+ try
+ {
+ _connection.sendPacket (reply);
+ }
+ catch (IOException ioe)
+ {
+ // Not much we can do...
+ }
+ }
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/transport/ITransport.java b/libjava/gnu/classpath/jdwp/transport/ITransport.java
new file mode 100644
index 00000000000..16706076f56
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/transport/ITransport.java
@@ -0,0 +1,84 @@
+/* ITransport.java -- An interface defining JDWP transports
+ Copyright (C) 2005 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
+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.classpath.jdwp.transport;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.IllegalArgumentException;
+import java.util.HashMap;
+
+/**
+ * A class representing a transport layer. This class serves as a generic
+ * interface for all transport types used in the JDWP back-end.
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public interface ITransport
+{
+ /**
+ * Configure the transport with the given properties
+ *
+ * @param properties properties of the transport configuration
+ * @throws TransportException on configury error
+ */
+ public void configure (HashMap properties)
+ throws TransportException;
+
+ /**
+ * Initialize the transport
+ *
+ * @throws TransportException on initialization error
+ */
+ public void initialize ()
+ throws TransportException;
+
+ /**
+ * Get the input stream for the transport
+ */
+ public InputStream getInputStream ()
+ throws IOException;
+
+ /**
+ * Get the output stream for the transport
+ */
+ public OutputStream getOutputStream ()
+ throws IOException;
+}
diff --git a/libjava/gnu/classpath/jdwp/transport/JdwpCommandPacket.java b/libjava/gnu/classpath/jdwp/transport/JdwpCommandPacket.java
new file mode 100644
index 00000000000..cf193a2ed77
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/transport/JdwpCommandPacket.java
@@ -0,0 +1,149 @@
+/* JdwpCommandPacket.java -- JDWP command packet
+ Copyright (C) 2005 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
+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.classpath.jdwp.transport;
+
+/**
+ * A class representing a JDWP command packet.
+ * This class adds command set and command to the packet header
+ * information in {@link gnu.classpath.jdwp.transport.JdwpPacket}
+ * and adds additional command packet-specific processing.
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public class JdwpCommandPacket extends JdwpPacket
+{
+ /**
+ * Command set
+ */
+ protected byte _commandSet;
+
+ /**
+ * Command
+ */
+ protected byte _command;
+
+ // Minimum packet size [excluding super class]
+ // ( commandSet (1) + command (1) )
+ private static final int MINIMUM_LENGTH = 2;
+
+ /**
+ * Constructs a new <code>JdwpCommandPacket</code>
+ */
+ public JdwpCommandPacket ()
+ {
+ // Don't assign an id. This constructor is called by
+ // JdwpPacket.fromBytes, and that will assign a packet id.
+ }
+
+ /**
+ * Constructs a new <code>JdwpCommandPacket</code>
+ * with the given command set and command
+ *
+ * @param set the command set
+ * @param command the command
+ */
+ public JdwpCommandPacket (byte set, byte command)
+ {
+ _id = ++_last_id;
+ _commandSet = set;
+ _command = command;
+ }
+
+ /**
+ * Retuns the length of this packet
+ */
+ public int getLength ()
+ {
+ return MINIMUM_LENGTH + super.getLength ();
+ }
+
+ /**
+ * Returns the command set
+ */
+ public byte getCommandSet ()
+ {
+ return _commandSet;
+ }
+
+ /**
+ * Sets the command set
+ */
+ public void setCommandSet (byte cs)
+ {
+ _commandSet = cs;
+ }
+
+ /**
+ * Returns the command
+ */
+ public byte getCommand ()
+ {
+ return _command;
+ }
+
+ /**
+ * Sets the command
+ */
+ public void setCommand (byte cmd)
+ {
+ _command = cmd;
+ }
+
+ // Reads command packet data from the given buffer, starting
+ // at the given offset
+ protected int myFromBytes (byte[] bytes, int index)
+ {
+ int i = 0;
+ setCommandSet (bytes[index + i++]);
+ setCommand (bytes[index + i++]);
+ return i;
+ }
+
+ // Writes the command packet data into the given buffer
+ protected int myToBytes (byte[] bytes, int index)
+ {
+ // Need to add command set & command
+ int i = 0;
+ bytes[index + i++] = getCommandSet ();
+ bytes[index + i++] = getCommand ();
+
+ return i;
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/transport/JdwpConnection.java b/libjava/gnu/classpath/jdwp/transport/JdwpConnection.java
new file mode 100644
index 00000000000..a22bbb9f208
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/transport/JdwpConnection.java
@@ -0,0 +1,265 @@
+/* JdwpConnection.java -- A JDWP-speaking connection
+ Copyright (C) 2005 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
+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.classpath.jdwp.transport;
+
+import gnu.classpath.jdwp.Jdwp;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+/**
+ * A connection via some transport to some JDWP-speaking entity.
+ * This is also a thread which handles all communications to/from
+ * the debugger. While access to the transport layer may be accessed by
+ * several threads, start-up and initialization should not be allowed
+ * to occur more than once.
+ *
+ * <p>This class is also a thread that is responsible for pulling
+ * packets off the wire and sticking them in a queue for packet
+ * processing threads.
+ *
+ * @author Keith Seitz (keiths@redhat.com)
+ */
+public class JdwpConnection
+ extends Thread
+{
+ // The JDWP handshake
+ private static final byte[] _HANDSHAKE = {'J', 'D', 'W', 'P', '-', 'H', 'a', 'n', 'd', 's', 'h', 'a', 'k', 'e'};
+
+ // Transport method
+ private ITransport _transport;
+
+ // Command queue
+ private ArrayList _commandQueue;
+
+ // Shutdown flag
+ private boolean _shutdown;
+
+ // Input stream from transport
+ private DataInputStream _inStream;
+
+ // Output stream from transprot
+ private DataOutputStream _outStream;
+
+ /**
+ * Creates a new <code>JdwpConnection</code> instance
+ *
+ * @param transport the transport to use for communications
+ */
+ public JdwpConnection (ITransport transport)
+ {
+ _transport = transport;
+ _commandQueue = new ArrayList ();
+ _shutdown = false;
+ }
+
+ /**
+ * Initializes the connection, including connecting
+ * to socket or shared memory endpoint
+ *
+ * @throws TransportException if initialization fails
+ */
+ public void initialize ()
+ throws TransportException
+ {
+ // Initialize transport (connect socket, e.g.)
+ _transport.initialize ();
+
+ // Do handshake
+ try
+ {
+ _inStream = new DataInputStream (_transport.getInputStream ());
+ _outStream = new DataOutputStream (_transport.getOutputStream ());
+ _doHandshake ();
+ }
+ catch (IOException ioe)
+ {
+ throw new TransportException (ioe);
+ }
+ }
+
+ /* Does the JDWP handshake -- this should not need synchronization
+ because this is called by VM startup code, i.e., no packet
+ processing threads have started yet. */
+ private void _doHandshake ()
+ throws IOException
+ {
+ // According to the spec, the handshake is always initiated by
+ // the debugger, regardless of whether the JVM is in client mode or
+ // server mode.
+
+ // Wait for handshake from debugger
+ byte[] hshake = new byte[_HANDSHAKE.length];
+ _inStream.readFully (hshake, 0, _HANDSHAKE.length);
+
+ if (Arrays.equals (hshake, _HANDSHAKE))
+ {
+ // Send reply handshake
+ _outStream.write (_HANDSHAKE, 0, _HANDSHAKE.length);
+ return;
+ }
+ else
+ {
+ throw new IOException ("invalid JDWP handshake (\"" + hshake + "\")");
+ }
+ }
+
+ /**
+ * Main run method for the thread. This thread loops waiting for
+ * packets to be read via the connection. When a packet is complete
+ * and ready for processing, it places the packet in a queue that can
+ * be accessed via <code>getPacket</code>
+ */
+ public void run ()
+ {
+ while (!_shutdown)
+ {
+ try
+ {
+ _readOnePacket ();
+ }
+ catch (IOException ioe)
+ {
+ /* IOException can occur for two reasons:
+ 1. Lost connection with the other side
+ 2. Transport was shutdown
+ In either case, we make sure that all of the
+ back-end gets shutdown. */
+ Jdwp.getInstance().shutdown ();
+ }
+ catch (Throwable t)
+ {
+ System.out.println ("JdwpConnection.run: caught an exception: "
+ + t);
+ // Just keep going
+ }
+ }
+ }
+
+ // Reads a single packet from the connection, adding it to the packet
+ // queue when a complete packet is ready.
+ private void _readOnePacket ()
+ throws IOException
+ {
+ byte[] data = null;
+
+ // Read in the packet
+ int length = _inStream.readInt ();
+ if (length < 11)
+ {
+ throw new IOException ("JDWP packet length < 11 ("
+ + length + ")");
+ }
+
+ data = new byte[length];
+ data[0] = (byte) (length >>> 24);
+ data[1] = (byte) (length >>> 16);
+ data[2] = (byte) (length >>> 8);
+ data[3] = (byte) length;
+ _inStream.readFully (data, 4, length - 4);
+
+ JdwpPacket packet = JdwpPacket.fromBytes (data);
+ if (packet != null)
+ {
+ synchronized (_commandQueue)
+ {
+ _commandQueue.add (packet);
+ _commandQueue.notifyAll ();
+ }
+ }
+ }
+
+ /**
+ * Returns a packet from the queue of ready packets
+ *
+ * @returns a <code>JdwpPacket</code> ready for processing
+ * <code>null</code> when shutting down
+ */
+ public JdwpPacket getPacket ()
+ {
+ synchronized (_commandQueue)
+ {
+ while (_commandQueue.isEmpty ())
+ {
+ try
+ {
+ _commandQueue.wait ();
+ }
+ catch (InterruptedException ie)
+ {
+ /* PacketProcessor is interrupted
+ when shutting down */
+ return null;
+ }
+ }
+
+ return (JdwpPacket) _commandQueue.remove (0);
+ }
+ }
+
+ /**
+ * Send a packet to the debugger
+ *
+ * @param pkt a <code>JdwpPacket</code> to send
+ * @throws TransportException
+ */
+ public void sendPacket (JdwpPacket pkt)
+ throws IOException
+ {
+ byte[] data = pkt.toBytes ();
+ _outStream.write (data, 0, data.length);
+ }
+
+ /**
+ * Shutdown the connection
+ */
+ public void shutdown ()
+ {
+ if (!_shutdown)
+ {
+ _transport.shutdown ();
+ _shutdown = true;
+ interrupt ();
+ }
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/transport/JdwpPacket.java b/libjava/gnu/classpath/jdwp/transport/JdwpPacket.java
new file mode 100644
index 00000000000..1a6a962547e
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/transport/JdwpPacket.java
@@ -0,0 +1,286 @@
+/* JdwpPacket.java -- Base class for JDWP command and reply packets
+ Copyright (C) 2005 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
+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.classpath.jdwp.transport;
+
+/**
+ * All command and reply packets in JDWP share
+ * common header type information:
+ *
+ * length (4 bytes) : size of entire packet, including length
+ * id (4 bytes) : unique packet id
+ * flags (1 byte) : flag byte
+ * [command packet stuff | reply packet stuff]
+ * data (variable) : unique command-/reply-specific data
+ *
+ * This class deal with everything except the command- and reply-specific
+ * data, which get handled in {@link
+ * gnu.classpath.jdwp.transport.JdwpCommandPacket} and {@link
+ * gnu.classpath.jdwp.transprot.JdwpReplyPacket}.
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public abstract class JdwpPacket
+{
+ // Last id of packet constructed
+ protected static int _last_id = 0;
+
+ // JDWP reply packet flag
+ protected static final int JDWP_FLAG_REPLY = 0x80;
+
+ /**
+ * Minimum packet size excluding sub-class data
+ * ( length (4) + id (4) + flags (1) )
+ */
+ protected static final int MINIMUM_SIZE = 9;
+
+ /**
+ * Id of command/reply
+ */
+ protected int _id;
+
+ /**
+ * Packet flags
+ */
+ protected byte _flags;
+
+ /**
+ * Packet-specific data
+ */
+ protected byte[] _data;
+
+ /**
+ * Constructor
+ */
+ public JdwpPacket ()
+ {
+ // By default, DON'T assign an id. This way when a packet
+ // is constructed from fromBytes, _last_id won't increment (i.e.,
+ // it won't leave holes in the outgoing packet ids).
+ }
+
+ /**
+ * Constructs a <code>JdwpPacket</code> with the id
+ * from the given packet.
+ *
+ * @param pkt a packet whose id will be used in this new packet
+ */
+ public JdwpPacket (JdwpPacket pkt)
+ {
+ _id = pkt.getId ();
+ }
+
+ /**
+ * Returns the packet id
+ */
+ public int getId ()
+ {
+ return _id;
+ }
+
+ /**
+ * Sets the packet id
+ */
+ public void setId (int id)
+ {
+ _id = id;
+ }
+
+ /**
+ * Returns the packet flags
+ */
+ public byte getFlags ()
+ {
+ return _flags;
+ }
+
+ /**
+ * Sets the packet flags
+ */
+ public void setFlags (byte flags)
+ {
+ _flags = flags;
+ }
+
+ /**
+ * Gets the command/reply-specific data in this packet
+ */
+ public byte[] getData ()
+ {
+ return _data;
+ }
+
+ /**
+ * Sets the command/reply-specific data in this packet
+ */
+ public void setData (byte[] data)
+ {
+ _data = data;
+ }
+
+ /**
+ * Returns the length of this entire packet
+ */
+ public int getLength ()
+ {
+ return MINIMUM_SIZE + (_data == null ? 0 : _data.length);
+ }
+
+ /**
+ * Allow subclasses to initialize from data
+ *
+ * @param bytes packet data from the wire
+ * @param index index into <code>bytes</code> to start processing
+ * @return number of bytes in <code>bytes</code> processed
+ */
+ protected abstract int myFromBytes (byte[] bytes, int index);
+
+ /**
+ * Convert the given bytes into a <code>JdwpPacket</code>. Uses the
+ * abstract method <code>myFromBytes</code> to allow subclasses to
+ * process data.
+ *
+ * If the given data does not represent a valid JDWP packet, it returns
+ * <code>null</code>.
+ *
+ * @param bytes packet data from the wire
+ * @param index index into <code>bytes</code> to start processing
+ * @return number of bytes in <code>bytes</code> processed
+ */
+ public static JdwpPacket fromBytes (byte[] bytes)
+ {
+ int i = 0;
+ int length = ((bytes[i++] & 0xff) << 24 | (bytes[i++] & 0xff) << 16
+ | (bytes[i++] & 0xff) << 8 | (bytes[i++] & 0xff));
+ int id = 0;
+ byte flags = 0;
+
+ if (bytes.length == length)
+ {
+ id = ((bytes[i++] & 0xff) << 24 | (bytes[i++] & 0xff) << 16
+ | (bytes[i++] & 0xff) << 8 | (bytes[i++] & 0xff));
+ flags = bytes[i++];
+
+ Class clazz = null;
+ if (flags == 0)
+ clazz = JdwpCommandPacket.class;
+ else if ((flags & JDWP_FLAG_REPLY) != 0)
+ clazz = JdwpReplyPacket.class;
+ else
+ {
+ // Malformed packet. Discard it.
+ return null;
+ }
+
+ JdwpPacket pkt = null;
+ try
+ {
+ pkt = (JdwpPacket) clazz.newInstance ();
+ }
+ catch (InstantiationException ie)
+ {
+ // Discard packet
+ return null;
+ }
+ catch (IllegalAccessException iae)
+ {
+ // Discard packet
+ return null;
+ }
+
+ pkt.setId (id);
+ pkt.setFlags (flags);
+
+ i += pkt.myFromBytes (bytes, i);
+ byte[] data = new byte[length - i];
+ System.arraycopy (bytes, i, data, 0, data.length);
+ pkt.setData (data);
+
+ return pkt;
+ }
+
+ return null;
+ }
+
+ // Put subclass information into bytes
+ protected abstract int myToBytes (byte[] bytes, int index);
+
+ // Convert this packet to it byte representation (ready to send on the wire)
+ // NOTE: All integers should be big-endian.
+ public byte[] toBytes ()
+ {
+ // Allocate a new array to hold contents of packet
+ int length = getLength ();
+ byte[] bytes = new byte[length];
+
+ int i = 0;
+
+ //
+ // Packet layout: length, id, flags, packet-specific, data (optional)
+ //
+
+ // length
+ bytes[i++] = (byte) (length >>> 24);
+ bytes[i++] = (byte) (length >>> 16);
+ bytes[i++] = (byte) (length >>> 8);
+ bytes[i++] = (byte) length;
+
+ // id
+ bytes[i++] = (byte) (getId () >>> 24);
+ bytes[i++] = (byte) (getId () >>> 16);
+ bytes[i++] = (byte) (getId () >>> 8);
+ bytes[i++] = (byte) getId ();
+
+ // flag
+ bytes[i++] = getFlags ();
+
+ // packet-specific stuff
+ i += myToBytes (bytes, i);
+
+ // data (if any)
+ byte[] data = getData ();
+ if (data.length > 0 && i < length)
+ {
+ // Would it pay to be over cautious?
+ System.arraycopy (data, 0, bytes, i, data.length);
+ }
+
+ return bytes;
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/transport/JdwpReplyPacket.java b/libjava/gnu/classpath/jdwp/transport/JdwpReplyPacket.java
new file mode 100644
index 00000000000..1aa2dd344cb
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/transport/JdwpReplyPacket.java
@@ -0,0 +1,127 @@
+/* JdwpReplyPacket.java -- JDWP reply packet
+ Copyright (C) 2005 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
+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.classpath.jdwp.transport;
+
+/**
+ * A class represents a JDWP reply packet.
+ * This class adds an error code to the packet header information
+ * in {@link gnu.classpath.transport.JdwpPacket} and adds additional
+ * reply packet-specific processing.
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public class JdwpReplyPacket extends JdwpPacket
+{
+ /**
+ * Error code
+ */
+ protected short _errorCode;
+
+ // Minimum packet size [excluding super class] ( errorCode (2) )
+ private static final int MINIMUM_LENGTH = 2;
+
+ /**
+ * Constructs a <code>JdwpReplyPacket</code>.
+ */
+ public JdwpReplyPacket ()
+ {
+ // Don't assign a packet id. This is called by JdwpPacket.fromBytes
+ // which assigns a packet id. (Not that a VM would do that...)
+ }
+
+ /**
+ * Constructs a <code>JdwpReplyPacket</code> with the
+ * id from the given packet and error code
+ *
+ * @param pkt the packet whose id this packet will use
+ * @param errorCode the error code
+ */
+ public JdwpReplyPacket (JdwpPacket pkt, short errorCode)
+ {
+ super (pkt);
+ _flags = (byte) JDWP_FLAG_REPLY;
+ _errorCode = errorCode;
+ }
+
+ /**
+ * Returns the length of this packet
+ */
+ public int getLength ()
+ {
+ return MINIMUM_LENGTH + super.getLength ();
+ }
+
+ /**
+ * Returns the error code
+ */
+ public short getErrorCode ()
+ {
+ return _errorCode;
+ }
+
+ /**
+ * Sets the error code
+ */
+ public void setErrorCode (short ec)
+ {
+ _errorCode = ec;
+ }
+
+ // Reads command packet data from the given buffer, starting
+ // at the given offset
+ protected int myFromBytes (byte[] bytes, int index)
+ {
+ int i = 0;
+ setErrorCode ((short) ((bytes[index + i++] & 0xff) << 8
+ | (bytes[index + i++] & 0xff)));
+ return i;
+ }
+
+ // Writes the command packet data into the given buffer
+ protected int myToBytes (byte[] bytes, int index)
+ {
+ // Need to add error code
+ int i = 0;
+ bytes[index + i++] = (byte) (getErrorCode () >>> 8);
+ bytes[index + i++] = (byte) getErrorCode ();
+
+ return i;
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/transport/SocketTransport.java b/libjava/gnu/classpath/jdwp/transport/SocketTransport.java
new file mode 100644
index 00000000000..3be193a0528
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/transport/SocketTransport.java
@@ -0,0 +1,171 @@
+/* SocketTransport.java -- a socket transport
+ Copyright (C) 2005 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
+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.classpath.jdwp.transport;
+
+import gnu.classpath.jdwp.transport.ITransport;
+import gnu.classpath.jdwp.transport.TransportException;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.util.HashMap;
+
+import javax.net.ServerSocketFactory;
+import javax.net.SocketFactory;
+
+/**
+ * A socket-based transport. This transport uses
+ * configury string that looks like "name=dt_socket,
+ * address=localhost:1234,server=y".
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+class SocketTransport
+ implements ITransport
+{
+ /**
+ * Name of this transport
+ */
+ public static final String NAME = "dt_socket";
+
+ // Configure properties
+ private static final String _PROPERTY_ADDRESS = "address";
+ private static final String _PROPERTY_SERVER = "server";
+
+ // Port number
+ private int _port;
+
+ // Host name
+ private String _host;
+
+ // Are we acting as a server?
+ private boolean _server = false;
+
+ // Socket
+ private Socket _socket;
+
+ /**
+ * Setup the connection configuration from the given properties
+ *
+ * @param properties the properties of the JDWP session
+ * @throws TransportException for any configury errors
+ */
+ public void configure (HashMap properties)
+ throws TransportException
+ {
+ // Get address [form: "hostname:port"]
+ String p = (String) properties.get (_PROPERTY_ADDRESS);
+ if (p != null)
+ {
+ String[] s = p.split (":");
+ if (s.length == 2)
+ {
+ _host = s[0];
+ _port = Integer.parseInt (s[1]);
+ }
+ }
+
+ // Get server [form: "y" or "n"]
+ p = (String) properties.get (_PROPERTY_SERVER);
+ if (p != null)
+ {
+ if (p.toLowerCase().equals ("y"))
+ _server = true;
+ }
+ }
+
+ /**
+ * Initialize this socket connection. This includes
+ * connecting to the host (or listening for it).
+ *
+ * @throws TransportException if a transport-related error occurs
+ */
+ public void initialize ()
+ throws TransportException
+ {
+ try
+ {
+ if (_server)
+ {
+ // Get a server socket
+ ServerSocketFactory ssf = ServerSocketFactory.getDefault ();
+ ServerSocket ss = ssf.createServerSocket (_port, 1);
+ _socket = ss.accept ();
+ }
+ else
+ {
+ // Get a client socket (the factory will connect it)
+ SocketFactory sf = SocketFactory.getDefault ();
+ _socket = sf.createSocket (_host, _port);
+ }
+ }
+ catch (IOException ioe)
+ {
+ // This will grab UnknownHostException, too.
+ throw new TransportException (ioe);
+ }
+ }
+
+ /**
+ * Returns an <code>InputStream</code> for the transport
+ *
+ * @throws IOException if an I/O error occurs creating the stream
+ * or the socket is not connected
+ */
+ public InputStream getInputStream ()
+ throws IOException
+ {
+ return _socket.getInputStream ();
+ }
+
+ /**
+ * Returns an <code>OutputStream</code> for the transport
+ *
+ * @throws IOException if an I/O error occurs creating the stream
+ * or the socket is not connected
+ */
+ public OutputStream getOutputStream ()
+ throws IOException
+ {
+ return _socket.getOutputStream ();
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/transport/TransportException.java b/libjava/gnu/classpath/jdwp/transport/TransportException.java
new file mode 100644
index 00000000000..7a7afe35aa7
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/transport/TransportException.java
@@ -0,0 +1,75 @@
+/* TransportException.java -- Exception for transport configury errors
+ Copyright (C) 2005 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
+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.classpath.jdwp.transport;
+
+/**
+ * A transport configury or initialization exception thrown by
+ * JDWP transports. This class is a generic exception class
+ * that the different transport layers use to report transport-specific
+ * exceptions that may occur (which could be very different from
+ * one transport to the next.).
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public class TransportException
+ extends Exception
+{
+ /**
+ * Constructs a <code>TransportException</code> with the
+ * given message
+ *
+ * @param message a message describing the exception
+ */
+ public TransportException (String message)
+ {
+ super (message);
+ }
+
+ /**
+ * Constructs a <code>TransportException</code> with the
+ * given <code>Throwable</code> root cause
+ *
+ * @param t the cause of the exception
+ */
+ public TransportException (Throwable t)
+ {
+ super (t);
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/transport/TransportFactory.java b/libjava/gnu/classpath/jdwp/transport/TransportFactory.java
new file mode 100644
index 00000000000..7f617863e90
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/transport/TransportFactory.java
@@ -0,0 +1,115 @@
+/* TransportFactory.java -- Factory for transports
+ Copyright (C) 2005 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
+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.classpath.jdwp.transport;
+
+import java.util.HashMap;
+
+/**
+ * A factory class that constructs transports for use by
+ * the JDWP back-end.
+ *
+ * @author Keith Seitz <keiths@redhat.com>
+ */
+public class TransportFactory
+{
+ // Keyword in configspec that specifies transport method
+ private static final String _TRANSPORT_PROPERTY = "transport";
+
+ // A single transport method mapping
+ private static class TransportMethod
+ {
+ String name;
+ Class clazz;
+ public TransportMethod (String name, Class clazz)
+ {
+ this.name = name;
+ this.clazz = clazz;
+ }
+ }
+
+ // List of all supported transport methods
+ private static TransportMethod[] _transportMethods = new TransportMethod[]
+ {
+ new TransportMethod (SocketTransport.NAME, SocketTransport.class)
+ //new TransportMethod (ShmemTransport.NAME, ShmemTransport.class)
+ };
+
+ /**
+ * Get a transport configured as specified in the properties
+ *
+ * @param properties a <code>HashMap</code> specifying the JDWP
+ * configuration properties
+ * @returns the created and configured transport
+ * @throws TransportException for invalid configurations
+ */
+ public static ITransport newInstance (HashMap properties)
+ throws TransportException
+ {
+ String name = null;
+ if (properties != null)
+ name = (String) properties.get (_TRANSPORT_PROPERTY);
+ if (name == null)
+ throw new TransportException ("no transport specified");
+
+ for (int i = 0; i < _transportMethods.length; ++i)
+ {
+ if (_transportMethods[i].name.equals (name))
+ {
+ try
+ {
+ ITransport t;
+ t = (ITransport) _transportMethods[i].clazz.newInstance ();
+ t.configure (properties);
+ return t;
+ }
+ catch (TransportException te)
+ {
+ throw te;
+ }
+ catch (Exception e)
+ {
+ throw new TransportException (e);
+ }
+ }
+ }
+
+ throw new TransportException ("transport \"" + name + "\" not found");
+ }
+}
diff --git a/libjava/gnu/classpath/jdwp/util/Signature.java b/libjava/gnu/classpath/jdwp/util/Signature.java
new file mode 100644
index 00000000000..648a8404da8
--- /dev/null
+++ b/libjava/gnu/classpath/jdwp/util/Signature.java
@@ -0,0 +1,135 @@
+/* Signature.java -- utility class to compute class and method signatures
+ Copyright (C) 2005 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
+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.classpath.jdwp.util;
+
+import java.lang.reflect.Method;
+
+/**
+ * A class to compute class and method signatures.
+ *
+ * @author Tom Tromey (tromey@redhat.com)
+ * @author Keith Seitz (keiths@redhat.com)
+ */
+public class Signature
+{
+ /**
+ * Computes the class signature, i.e., java.lang.String.class
+ * returns "Ljava/lang/String;".
+ *
+ * @param theClass the class for which to compute the signature
+ * @return the class's type signature
+ */
+ public static String computeClassSignature (Class theClass)
+ {
+ StringBuffer sb = new StringBuffer ();
+ _addToSignature (sb, theClass);
+ return sb.toString ();
+ }
+
+ /**
+ * Computes the method signature, i.e., java.lang.String.split (String, int)
+ * returns "(Ljava/lang/String;I)[Ljava/lang/String;"
+ *
+ * @param method the method for which to compute the signature
+ * @return the method's type signature
+ */
+ public static String computeMethodSignature (Method method)
+ {
+ return _computeSignature (method.getReturnType (),
+ method.getParameterTypes ());
+ }
+
+ private static String _computeSignature (Class returnType,
+ Class[] paramTypes)
+ {
+ StringBuffer sb = new StringBuffer ("(");
+ if (paramTypes != null)
+ {
+ for (int i = 0; i < paramTypes.length; ++i)
+ _addToSignature (sb, paramTypes[i]);
+ }
+ sb.append (")");
+ _addToSignature (sb, returnType);
+ return sb.toString();
+ }
+
+ private static void _addToSignature (StringBuffer sb, Class k)
+ {
+ // For some reason there's no easy way to get the signature of a
+ // class.
+ if (k.isPrimitive ())
+ {
+ if (k == void.class)
+ sb.append('V');
+ else if (k == boolean.class)
+ sb.append('Z');
+ else if (k == byte.class)
+ sb.append('B');
+ else if (k == char.class)
+ sb.append('C');
+ else if (k == short.class)
+ sb.append('S');
+ else if (k == int.class)
+ sb.append('I');
+ else if (k == float.class)
+ sb.append('F');
+ else if (k == double.class)
+ sb.append('D');
+ else if (k == long.class)
+ sb.append('J');
+ return;
+ }
+
+ String name = k.getName ();
+ int len = name.length ();
+ sb.ensureCapacity (len);
+ if (! k.isArray ())
+ sb.append('L');
+ for (int i = 0; i < len; ++i)
+ {
+ char c = name.charAt (i);
+ if (c == '.')
+ c = '/';
+ sb.append (c);
+ }
+ if (! k.isArray ())
+ sb.append(';');
+ }
+}
diff --git a/libjava/gnu/gcj/Core.java b/libjava/gnu/gcj/Core.java
index 80d623c5655..c632399bb21 100644
--- a/libjava/gnu/gcj/Core.java
+++ b/libjava/gnu/gcj/Core.java
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2003 Free Software Foundation
+/* Copyright (C) 2001, 2003, 2005 Free Software Foundation
This file is part of libgcj.
@@ -12,6 +12,9 @@ public class Core
{
public native static Core create (String name) throws java.io.IOException;
+ // Same as create, except returns null if not found.
+ public native static Core find (String name);
+
public RawData ptr;
public int length;
diff --git a/libjava/gnu/gcj/natCore.cc b/libjava/gnu/gcj/natCore.cc
index bb3fd57f6fb..714e539085a 100644
--- a/libjava/gnu/gcj/natCore.cc
+++ b/libjava/gnu/gcj/natCore.cc
@@ -1,6 +1,6 @@
// natCore -- C++ side of Core
-/* Copyright (C) 2001, 2002, 2003 Free Software Foundation
+/* Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation
This file is part of libgcj.
@@ -104,6 +104,13 @@ _Jv_create_core (_Jv_core_chain *node, jstring name)
}
gnu::gcj::Core *
+gnu::gcj::Core::find (jstring name)
+{
+ gnu::gcj::Core *core = _Jv_create_core (root, name);
+ return core;
+}
+
+gnu::gcj::Core *
gnu::gcj::Core::create (jstring name)
{
gnu::gcj::Core *core = _Jv_create_core (root, name);
diff --git a/libjava/gnu/gcj/runtime/SystemClassLoader.java b/libjava/gnu/gcj/runtime/SystemClassLoader.java
index e68770cc558..1bb5ef94212 100644
--- a/libjava/gnu/gcj/runtime/SystemClassLoader.java
+++ b/libjava/gnu/gcj/runtime/SystemClassLoader.java
@@ -52,6 +52,7 @@ public final class SystemClassLoader extends URLClassLoader
continue;
}
+ last_was_sep = false;
File path = new File(e);
// Ignore invalid paths.
if (!path.exists())
diff --git a/libjava/gnu/java/net/natPlainSocketImplPosix.cc b/libjava/gnu/java/net/natPlainSocketImplPosix.cc
index 3f1dde9f5a2..5f6f046aa85 100644
--- a/libjava/gnu/java/net/natPlainSocketImplPosix.cc
+++ b/libjava/gnu/java/net/natPlainSocketImplPosix.cc
@@ -646,6 +646,7 @@ gnu::java::net::PlainSocketImpl::setOption (jint optID, ::java::lang::Object *va
if (::setsockopt (native_fd, SOL_SOCKET, SO_REUSEADDR, (char *) &val,
val_len) != 0)
goto error;
+ return;
#else
throw new ::java::lang::InternalError (
JvNewStringUTF ("SO_REUSEADDR not supported"));
diff --git a/libjava/gnu/java/net/protocol/http/HTTPURLConnection.java b/libjava/gnu/java/net/protocol/http/HTTPURLConnection.java
index 50a6ed12e7a..b82d30f5ae6 100644
--- a/libjava/gnu/java/net/protocol/http/HTTPURLConnection.java
+++ b/libjava/gnu/java/net/protocol/http/HTTPURLConnection.java
@@ -1,5 +1,5 @@
/* HTTPURLConnection.java --
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -572,6 +572,10 @@ public class HTTPURLConnection
int count = 1;
do
{
+ if (!i.hasNext())
+ {
+ return null;
+ }
entry = (Map.Entry) i.next();
count++;
}
diff --git a/libjava/gnu/java/nio/channels/natFileChannelPosix.cc b/libjava/gnu/java/nio/channels/natFileChannelPosix.cc
index 742201bde94..24b6396c66c 100644
--- a/libjava/gnu/java/nio/channels/natFileChannelPosix.cc
+++ b/libjava/gnu/java/nio/channels/natFileChannelPosix.cc
@@ -37,6 +37,7 @@ details. */
#include <java/lang/NullPointerException.h>
#include <java/lang/System.h>
#include <java/lang/String.h>
+#include <java/lang/StringBuffer.h>
#include <java/lang/Thread.h>
#include <java/nio/ByteBuffer.h>
#include <java/nio/MappedByteBufferImpl.h>
@@ -168,13 +169,13 @@ FileChannelImpl::open (jstring path, jint jflags)
}
if (fd == -1)
{
- char msg[MAXPATHLEN + 200];
// We choose the formatting here for JDK compatibility, believe
// it or not.
- sprintf (msg, "%.*s (%.*s)",
- MAXPATHLEN + 150, buf,
- 40, strerror (errno));
- throw new ::java::io::FileNotFoundException (JvNewStringLatin1 (msg));
+ ::java::lang::StringBuffer *msg = new ::java::lang::StringBuffer (path);
+ msg->append (JvNewStringUTF (" ("));
+ msg->append (JvNewStringUTF (strerror (errno)));
+ msg->append (JvNewStringUTF (")"));
+ throw new ::java::io::FileNotFoundException (msg->toString ());
}
_Jv_platform_close_on_exec (fd);
diff --git a/libjava/gnu/regexp/RE.java b/libjava/gnu/regexp/RE.java
index c8c8a3eb9ff..541e8cb950f 100644
--- a/libjava/gnu/regexp/RE.java
+++ b/libjava/gnu/regexp/RE.java
@@ -629,20 +629,29 @@ public class RE extends REToken {
currentToken = setRepeated(currentToken,0,Integer.MAX_VALUE,index);
}
- // ONE-OR-MORE REPEAT OPERATOR
+ // ONE-OR-MORE REPEAT OPERATOR / POSSESSIVE MATCHING OPERATOR
// + | \+ depending on RE_BK_PLUS_QM
// not available if RE_LIMITED_OPS is set
else if ((unit.ch == '+') && !syntax.get(RESyntax.RE_LIMITED_OPS) && (!syntax.get(RESyntax.RE_BK_PLUS_QM) ^ (unit.bk || quot))) {
if (currentToken == null)
throw new REException(getLocalizedMessage("repeat.no.token"),REException.REG_BADRPT,index);
- if (currentToken instanceof RETokenRepeated)
- throw new REException(getLocalizedMessage("repeat.chained"),REException.REG_BADRPT,index);
- if (currentToken instanceof RETokenWordBoundary || currentToken instanceof RETokenWordBoundary)
+
+ // Check for possessive matching on RETokenRepeated
+ if (currentToken instanceof RETokenRepeated) {
+ RETokenRepeated tokenRep = (RETokenRepeated)currentToken;
+ if (syntax.get(RESyntax.RE_POSSESSIVE_OPS) && !tokenRep.isPossessive() && !tokenRep.isStingy())
+ tokenRep.makePossessive();
+ else
+ throw new REException(getLocalizedMessage("repeat.chained"),REException.REG_BADRPT,index);
+
+ }
+ else if (currentToken instanceof RETokenWordBoundary || currentToken instanceof RETokenWordBoundary)
throw new REException(getLocalizedMessage("repeat.assertion"),REException.REG_BADRPT,index);
- if (currentToken.getMinimumLength() == 0)
+ else if (currentToken.getMinimumLength() == 0)
throw new REException(getLocalizedMessage("repeat.empty.token"),REException.REG_BADRPT,index);
- currentToken = setRepeated(currentToken,1,Integer.MAX_VALUE,index);
+ else
+ currentToken = setRepeated(currentToken,1,Integer.MAX_VALUE,index);
}
// ZERO-OR-ONE REPEAT OPERATOR / STINGY MATCHING OPERATOR
@@ -655,13 +664,14 @@ public class RE extends REToken {
// Check for stingy matching on RETokenRepeated
if (currentToken instanceof RETokenRepeated) {
- if (syntax.get(RESyntax.RE_STINGY_OPS) && !((RETokenRepeated)currentToken).isStingy())
- ((RETokenRepeated)currentToken).makeStingy();
- else
- throw new REException(getLocalizedMessage("repeat.chained"),REException.REG_BADRPT,index);
- }
- else if (currentToken instanceof RETokenWordBoundary || currentToken instanceof RETokenWordBoundary)
- throw new REException(getLocalizedMessage("repeat.assertion"),REException.REG_BADRPT,index);
+ RETokenRepeated tokenRep = (RETokenRepeated)currentToken;
+ if (syntax.get(RESyntax.RE_STINGY_OPS) && !tokenRep.isStingy() && !tokenRep.isPossessive())
+ tokenRep.makeStingy();
+ else
+ throw new REException(getLocalizedMessage("repeat.chained"),REException.REG_BADRPT,index);
+ }
+ else if (currentToken instanceof RETokenWordBoundary || currentToken instanceof RETokenWordBoundary)
+ throw new REException(getLocalizedMessage("repeat.assertion"),REException.REG_BADRPT,index);
else
currentToken = setRepeated(currentToken,0,1,index);
}
diff --git a/libjava/gnu/regexp/RESyntax.java b/libjava/gnu/regexp/RESyntax.java
index 649bd0df584..7cb3e1400b8 100644
--- a/libjava/gnu/regexp/RESyntax.java
+++ b/libjava/gnu/regexp/RESyntax.java
@@ -197,7 +197,12 @@ public final class RESyntax implements Serializable {
*/
public static final int RE_CHAR_CLASS_ESC_IN_LISTS = 24;
- private static final int BIT_TOTAL = 25;
+ /**
+ * Syntax bit. Possessive matching is allowed (++, *+, ?+, {x,y}+).
+ */
+ public static final int RE_POSSESSIVE_OPS = 25;
+
+ private static final int BIT_TOTAL = 26;
/**
* Predefined syntax.
@@ -425,6 +430,7 @@ public final class RESyntax implements Serializable {
RE_SYNTAX_JAVA_1_4 = new RESyntax(RE_SYNTAX_PERL5)
// XXX
+ .set(RE_POSSESSIVE_OPS) // *+,?+,++,{}+
.makeFinal();
}
diff --git a/libjava/gnu/regexp/RETokenRepeated.java b/libjava/gnu/regexp/RETokenRepeated.java
index 8c789271220..821e4c55c0f 100644
--- a/libjava/gnu/regexp/RETokenRepeated.java
+++ b/libjava/gnu/regexp/RETokenRepeated.java
@@ -44,6 +44,7 @@ final class RETokenRepeated extends REToken {
private REToken token;
private int min,max;
private boolean stingy;
+ private boolean possessive;
RETokenRepeated(int subIndex, REToken token, int min, int max) {
super(subIndex);
@@ -61,6 +62,16 @@ final class RETokenRepeated extends REToken {
boolean isStingy() {
return stingy;
}
+
+ /** Sets possessive matching mode to true. */
+ void makePossessive() {
+ possessive = true;
+ }
+
+ /** Queries if this token has possessive matching enabled. */
+ boolean isPossessive() {
+ return possessive;
+ }
/**
* The minimum length of a repeated token is the minimum length
@@ -172,6 +183,8 @@ final class RETokenRepeated extends REToken {
}
}
// else did not match rest of the tokens, try again on smaller sample
+ // or break out when performing possessive matching
+ if (possessive) break;
}
if (allResults != null) {
mymatch.assignFrom(allResults); // does this get all?
diff --git a/libjava/gnu/xml/dom/ls/SAXEventSink.java b/libjava/gnu/xml/dom/ls/SAXEventSink.java
index 60b99d49305..2ff41910dd9 100644
--- a/libjava/gnu/xml/dom/ls/SAXEventSink.java
+++ b/libjava/gnu/xml/dom/ls/SAXEventSink.java
@@ -366,6 +366,14 @@ class SAXEventSink
ctx = doctype;
return;
}
+ if ("lt".equals(name) ||
+ "gt".equals(name) ||
+ "amp".equals(name) ||
+ "apos".equals(name) ||
+ "quot".equals(name))
+ {
+ return;
+ }
// Get entity
NamedNodeMap entities = doctype.getEntities();
Entity entity = (Entity) entities.getNamedItem(name);
@@ -385,6 +393,15 @@ class SAXEventSink
// Ignore DTD and parameter entities
return;
}
+ if ("lt".equals(name) ||
+ "gt".equals(name) ||
+ "amp".equals(name) ||
+ "apos".equals(name) ||
+ "quot".equals(name))
+ {
+ return;
+ }
+ // Get entity
Entity entity = popEntity();
// TODO resolve external entities to ensure that entity has content
if (expandEntityReferences)
diff --git a/libjava/include/Makefile.in b/libjava/include/Makefile.in
index f37f17ac27e..0ac161a4d47 100644
--- a/libjava/include/Makefile.in
+++ b/libjava/include/Makefile.in
@@ -42,9 +42,11 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(srcdir)/config.h.in $(tool_include__HEADERS)
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
+ $(top_srcdir)/../config/depstand.m4 \
$(top_srcdir)/../config/gxx-include-dir.m4 \
$(top_srcdir)/../config/iconv.m4 \
$(top_srcdir)/../config/lcmessage.m4 \
+ $(top_srcdir)/../config/lead-dot.m4 \
$(top_srcdir)/../config/lib-ld.m4 \
$(top_srcdir)/../config/lib-link.m4 \
$(top_srcdir)/../config/lib-prefix.m4 $(top_srcdir)/pkg.m4 \
diff --git a/libjava/include/jvm.h b/libjava/include/jvm.h
index bceb291fb58..606a84ddcbf 100644
--- a/libjava/include/jvm.h
+++ b/libjava/include/jvm.h
@@ -482,6 +482,8 @@ extern void _Jv_CallAnyMethodA (jobject obj,
extern jobject _Jv_NewMultiArray (jclass, jint ndims, jint* dims)
__attribute__((__malloc__));
+extern "C" void _Jv_ThrowAbstractMethodError () __attribute__((__noreturn__));
+
/* Checked divide subroutines. */
extern "C"
{
@@ -564,31 +566,50 @@ extern void (*_Jv_JVMPI_Notify_THREAD_END) (JVMPI_Event *event);
extern void _Jv_RegisterBootstrapPackages ();
+#define FLAG_BINARYCOMPAT_ABI (1<<31) /* Class is built with the BC-ABI. */
+
+#define FLAG_BOOTSTRAP_LOADER (1<<30) /* Used when defining a class that
+ should be loaded by the bootstrap
+ loader. */
-// This is used to find ABI versions we recognize.
-#define GCJ_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 10)
-#define GCJ_BINARYCOMPAT_ADDITION 5
-#define GCJ_BOOTSTRAP_LOADER_ADDITION 1
+// These are used to find ABI versions we recognize.
+#define GCJ_CXX_ABI_VERSION (__GNUC__ * 100000 + __GNUC_MINOR__ * 1000)
-// At present we know we are compatible with the BC ABI as used in GCC
-// 4.0.
-#define GCJ_40_BC_ABI_VERSION (4 * 10000 + 0 * 10 + GCJ_BINARYCOMPAT_ADDITION)
+// This is the old-style BC version ID used by GCJ 4.0.0.
+#define OLD_GCJ_40_BC_ABI_VERSION (4 * 10000 + 0 * 10 + 5)
+
+// New style version IDs used by GCJ 4.0.1 and later.
+#define GCJ_40_BC_ABI_VERSION (4 * 100000 + 0 * 1000)
inline bool
_Jv_CheckABIVersion (unsigned long value)
{
- // Recognize our defined C++ ABIs.
- return (value == GCJ_VERSION
- || value == (GCJ_VERSION + GCJ_BOOTSTRAP_LOADER_ADDITION)
- || value == GCJ_40_BC_ABI_VERSION
- || value == (GCJ_40_BC_ABI_VERSION + GCJ_BOOTSTRAP_LOADER_ADDITION));
+ // We are compatible with GCJ 4.0.0 BC-ABI classes. This release used a
+ // different format for the version ID string.
+ if (value == OLD_GCJ_40_BC_ABI_VERSION)
+ return true;
+
+ // The 20 low-end bits are used for the version number.
+ unsigned long version = value & 0xfffff;
+
+ if (value & FLAG_BINARYCOMPAT_ABI)
+ {
+ int abi_rev = version % 100;
+ int abi_ver = version - abi_rev;
+ if (abi_ver == GCJ_40_BC_ABI_VERSION && abi_rev <= 0)
+ return true;
+ }
+ else
+ // C++ ABI
+ return version == GCJ_CXX_ABI_VERSION;
+
+ return false;
}
inline bool
_Jv_ClassForBootstrapLoader (unsigned long value)
{
- return (value == (GCJ_VERSION + GCJ_BOOTSTRAP_LOADER_ADDITION)
- || value == (GCJ_40_BC_ABI_VERSION + GCJ_BOOTSTRAP_LOADER_ADDITION));
+ return (value & FLAG_BOOTSTRAP_LOADER);
}
// It makes the source cleaner if we simply always define this
diff --git a/libjava/java/io/ObjectInputStream.java b/libjava/java/io/ObjectInputStream.java
index 2cfe4c99419..3bcfd05f581 100644
--- a/libjava/java/io/ObjectInputStream.java
+++ b/libjava/java/io/ObjectInputStream.java
@@ -783,21 +783,11 @@ public class ObjectInputStream extends InputStream
}
/**
- * This method invokes the method currentClassLoader for the
- * current security manager (or build an empty one if it is not
- * present).
- *
- * @return The most recent non-system ClassLoader on the execution stack.
- * @see java.lang.SecurityManager#currentClassLoader()
+ * Returns the most recent user defined ClassLoader on the execution stack
+ * or null if none is found.
*/
- private ClassLoader currentLoader()
- {
- SecurityManager sm = System.getSecurityManager();
- if (sm == null)
- sm = new SecurityManager () {};
-
- return currentClassLoader(sm);
- }
+ // GCJ LOCAL: native method.
+ private native ClassLoader currentLoader();
/**
* Lookup a class stored in the local hashtable. If it is not
@@ -883,12 +873,7 @@ 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);
+ ClassLoader cl = currentLoader();
Class[] clss = new Class[intfs.length];
if(cl == null)
@@ -1866,15 +1851,6 @@ public class ObjectInputStream extends InputStream
}
}
- /**
- * This native method is used to get access to the protected method
- * of the same name in SecurityManger.
- *
- * @param sm SecurityManager instance which should be called.
- * @return The current class loader in the calling stack.
- */
- private static native ClassLoader currentClassLoader (SecurityManager sm);
-
private void callReadMethod (Method readObject, Class klass, Object obj)
throws ClassNotFoundException, IOException
{
diff --git a/libjava/java/io/natObjectInputStream.cc b/libjava/java/io/natObjectInputStream.cc
index 0e0d5a719cc..2d1a55665d1 100644
--- a/libjava/java/io/natObjectInputStream.cc
+++ b/libjava/java/io/natObjectInputStream.cc
@@ -1,6 +1,6 @@
// natObjectInputStream.cc - Native part of ObjectInputStream class.
-/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001, 2005 Free Software Foundation
This ObjectInputStream is part of libgcj.
@@ -24,6 +24,7 @@ details. */
#include <java/lang/SecurityManager.h>
#include <java/lang/reflect/Constructor.h>
#include <java/lang/reflect/Method.h>
+#include <java-stack.h>
#ifdef DEBUG
#include <java/lang/System.h>
@@ -69,9 +70,11 @@ java::io::ObjectInputStream::allocateObject (jclass klass, jclass,
return obj;
}
-java::lang::ClassLoader*
-java::io::ObjectInputStream::currentClassLoader (::java::lang::SecurityManager *sm)
+java::lang::ClassLoader *
+java::io::ObjectInputStream::currentLoader ()
{
- return sm->currentClassLoader ();
+ jclass caller = _Jv_StackTrace::GetCallingClass (&ObjectInputStream::class$);
+ if (caller)
+ return caller->getClassLoaderInternal();
+ return NULL;
}
-
diff --git a/libjava/java/lang/Class.h b/libjava/java/lang/Class.h
index 28721d71daa..01a653e5c9f 100644
--- a/libjava/java/lang/Class.h
+++ b/libjava/java/lang/Class.h
@@ -273,7 +273,7 @@ public:
java::lang::reflect::Constructor *getConstructor (JArray<jclass> *);
JArray<java::lang::reflect::Constructor *> *getConstructors (void);
java::lang::reflect::Constructor *getDeclaredConstructor (JArray<jclass> *);
- JArray<java::lang::reflect::Constructor *> *getDeclaredConstructors (void);
+ JArray<java::lang::reflect::Constructor *> *getDeclaredConstructors (jboolean);
java::lang::reflect::Field *getDeclaredField (jstring);
JArray<java::lang::reflect::Field *> *getDeclaredFields ();
JArray<java::lang::reflect::Field *> *getDeclaredFields (jboolean);
@@ -281,12 +281,12 @@ public:
JArray<java::lang::reflect::Method *> *getDeclaredMethods (void);
JArray<jclass> *getDeclaredClasses (void);
+ JArray<jclass> *getDeclaredClasses (jboolean);
jclass getDeclaringClass (void);
java::lang::reflect::Field *getField (jstring);
private:
JArray<java::lang::reflect::Field *> internalGetFields ();
- JArray<java::lang::reflect::Constructor *> *_getConstructors (jboolean);
java::lang::reflect::Field *getField (jstring, jint);
jint _getMethods (JArray<java::lang::reflect::Method *> *result,
jint offset);
diff --git a/libjava/java/lang/Class.java b/libjava/java/lang/Class.java
index bf11861985d..7f2d0f05d27 100644
--- a/libjava/java/lang/Class.java
+++ b/libjava/java/lang/Class.java
@@ -1,5 +1,5 @@
/* Class.java -- Representation of a Java class.
- Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004
+ Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005
Free Software Foundation
This file is part of GNU Classpath.
@@ -46,6 +46,7 @@ import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.net.URL;
import java.security.ProtectionDomain;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
@@ -54,9 +55,11 @@ import java.util.HashSet;
* objects with identical names and ClassLoaders. Primitive types, array
* types, and void also have a Class object.
*
- * <p>Arrays with identical type and number of dimensions share the same
- * class (and null "system" ClassLoader, incidentally). The name of an
- * array class is <code>[&lt;signature format&gt;;</code> ... for example,
+ * <p>Arrays with identical type and number of dimensions share the same class.
+ * The array class ClassLoader is the same as the ClassLoader of the element
+ * type of the array (which can be null to indicate the bootstrap classloader).
+ * The name of an array class is <code>[&lt;signature format&gt;;</code>.
+ * <p> For example,
* String[]'s class is <code>[Ljava.lang.String;</code>. boolean, byte,
* short, char, int, long, float and double have the "type name" of
* Z,B,S,C,I,J,F,D for the purposes of array classes. If it's a
@@ -148,13 +151,31 @@ public final class Class implements Serializable
* @throws SecurityException if the security check fails
* @since 1.1
*/
- public native Class[] getClasses ();
+ public Class[] getClasses()
+ {
+ memberAccessCheck(Member.PUBLIC);
+ return internalGetClasses();
+ }
+
+ /**
+ * Like <code>getClasses()</code> but without the security checks.
+ */
+ private Class[] internalGetClasses()
+ {
+ ArrayList list = new ArrayList();
+ list.addAll(Arrays.asList(getDeclaredClasses(true)));
+ Class superClass = getSuperclass();
+ if (superClass != null)
+ list.addAll(Arrays.asList(superClass.internalGetClasses()));
+ return (Class[])list.toArray(new Class[list.size()]);
+ }
/**
- * Get the ClassLoader that loaded this class. If it was loaded by the
- * system classloader, this method will return null. If there is a security
- * manager, and the caller's class loader does not match the requested
- * one, a security check of <code>RuntimePermission("getClassLoader")</code>
+ * Get the ClassLoader that loaded this class. If the class was loaded
+ * by the bootstrap classloader, this method will return null.
+ * If there is a security manager, and the caller's class loader is not
+ * an ancestor of the requested one, a security check of
+ * <code>RuntimePermission("getClassLoader")</code>
* must first succeed. Primitive types and void return null.
*
* @return the ClassLoader that loaded this class
@@ -193,10 +214,6 @@ public final class Class implements Serializable
public native Constructor getConstructor(Class[] args)
throws NoSuchMethodException;
- // This is used to implement getConstructors and
- // getDeclaredConstructors.
- private native Constructor[] _getConstructors (boolean declared);
-
/**
* Get all the public constructors of this class. This returns an array of
* length 0 if there are no constructors, including for primitive types,
@@ -211,7 +228,8 @@ public final class Class implements Serializable
*/
public Constructor[] getConstructors()
{
- return _getConstructors(false);
+ memberAccessCheck(Member.PUBLIC);
+ return getDeclaredConstructors(true);
}
/**
@@ -243,7 +261,13 @@ public final class Class implements Serializable
* @throws SecurityException if the security check fails
* @since 1.1
*/
- public native Class[] getDeclaredClasses();
+ public Class[] getDeclaredClasses()
+ {
+ memberAccessCheck(Member.DECLARED);
+ return getDeclaredClasses(false);
+ }
+
+ native Class[] getDeclaredClasses (boolean publicOnly);
/**
* Get all the declared constructors of this class. This returns an array of
@@ -259,9 +283,12 @@ public final class Class implements Serializable
*/
public Constructor[] getDeclaredConstructors()
{
- return _getConstructors(true);
+ memberAccessCheck(Member.DECLARED);
+ return getDeclaredConstructors(false);
}
+ native Constructor[] getDeclaredConstructors (boolean publicOnly);
+
/**
* Get a field declared in this class, where name is its simple name. The
* implicit length field of arrays is not available. A security check may
@@ -303,8 +330,8 @@ public final class Class implements Serializable
/**
* Get a method declared in this class, where name is its simple name. The
* implicit methods of Object are not available from arrays or interfaces.
- * Constructors (named "<init>" in the class file) and class initializers
- * (name "<clinit>") are not available. The Virtual Machine allows
+ * Constructors (named "&lt;init&gt;" in the class file) and class initializers
+ * (name "&lt;clinit&gt;") are not available. The Virtual Machine allows
* multiple methods with the same signature but differing return types; in
* such a case the most specific return types are favored, then the final
* choice is arbitrary. If the method takes no argument, an array of zero
@@ -438,14 +465,7 @@ public final class Class implements Serializable
{
ClassLoader cl = getClassLoader();
if (cl != null)
- {
- String name = getName();
- String pkg = "";
- int idx = name.lastIndexOf('.');
- if (idx >= 0)
- pkg = name.substring(0, idx);
- return cl.getPackage(pkg);
- }
+ return cl.getPackage(getPackagePortion(getName()));
return null;
}
@@ -468,8 +488,8 @@ public final class Class implements Serializable
/**
* Get a public method declared or inherited in this class, where name is
* its simple name. The implicit methods of Object are not available from
- * interfaces. Constructors (named "<init>" in the class file) and class
- * initializers (name "<clinit>") are not available. The Virtual
+ * interfaces. Constructors (named "&lt;init&gt;" in the class file) and class
+ * initializers (name "&lt;clinit&gt;") are not available. The Virtual
* Machine allows multiple methods with the same signature but differing
* return types, and the class can inherit multiple methods of the same
* return type; in such a case the most specific return types are favored,
@@ -537,8 +557,16 @@ public final class Class implements Serializable
/**
* Get the name of this class, separated by dots for package separators.
- * Primitive types and arrays are encoded as:
+ * If the class represents a primitive type, or void, then the
+ * name of the type as it appears in the Java programming language
+ * is returned. For instance, <code>Byte.TYPE.getName()</code>
+ * returns "byte".
+ *
+ * Arrays are specially encoded as shown on this table.
* <pre>
+ * array type [<em>element type</em>
+ * (note that the element type is encoded per
+ * this table)
* boolean Z
* byte B
* char C
@@ -548,9 +576,9 @@ public final class Class implements Serializable
* float F
* double D
* void V
- * array type [<em>element type</em>
* class or interface, alone: &lt;dotted name&gt;
* class or interface, as element type: L&lt;dotted name&gt;;
+ * </pre>
*
* @return the name of this class
*/
@@ -562,9 +590,9 @@ public final class Class implements Serializable
* the system classloader, ClassLoader.getSystemResource() is used instead.
*
* <p>If the name you supply is absolute (it starts with a <code>/</code>),
- * then it is passed on to getResource() as is. If it is relative, the
- * package name is prepended, and <code>.</code>'s are replaced with
- * <code>/</code>.
+ * then the leading <code>/</code> is removed and it is passed on to
+ * getResource(). If it is relative, the package name is prepended, and
+ * <code>.</code>'s are replaced with <code>/</code>.
*
* <p>The URL returned is system- and classloader-dependent, and could
* change across implementations.
@@ -590,9 +618,9 @@ public final class Class implements Serializable
* instead.
*
* <p>If the name you supply is absolute (it starts with a <code>/</code>),
- * then it is passed on to getResource() as is. If it is relative, the
- * package name is prepended, and <code>.</code>'s are replaced with
- * <code>/</code>.
+ * then the leading <code>/</code> is removed and it is passed on to
+ * getResource(). If it is relative, the package name is prepended, and
+ * <code>.</code>'s are replaced with <code>/</code>.
*
* <p>The URL returned is system- and classloader-dependent, and could
* change across implementations.
@@ -613,17 +641,19 @@ public final class Class implements Serializable
private String resourcePath(String resourceName)
{
- if (resourceName.startsWith("/"))
- return resourceName.substring(1);
-
- Class c = this;
- while (c.isArray())
- c = c.getComponentType();
-
- String packageName = c.getName().replace('.', '/');
- int end = packageName.lastIndexOf('/');
- if (end != -1)
- return packageName.substring(0, end + 1) + resourceName;
+ if (resourceName.length() > 0)
+ {
+ if (resourceName.charAt(0) != '/')
+ {
+ String pkg = getPackagePortion(getName());
+ if (pkg.length() > 0)
+ resourceName = pkg.replace('.','/') + '/' + resourceName;
+ }
+ else
+ {
+ resourceName = resourceName.substring(1);
+ }
+ }
return resourceName;
}
@@ -739,18 +769,6 @@ public final class Class implements Serializable
// can't add fields to java.lang.Class that are accessible from Java.
private native ProtectionDomain getProtectionDomain0();
- /**
- * Returns the protection domain of this class. If the classloader did not
- * record the protection domain when creating this class the unknown
- * protection domain is returned which has a <code>null</code> code source
- * and all permissions.
- *
- * @return the protection domain
- * @throws SecurityException if the security manager exists and the caller
- * does not have <code>RuntimePermission("getProtectionDomain")</code>.
- * @see RuntimePermission
- * @since 1.2
- */
public ProtectionDomain getProtectionDomain()
{
SecurityManager sm = System.getSecurityManager();
diff --git a/libjava/java/lang/mprec.c b/libjava/java/lang/mprec.c
index b7ec99f35de..00679ed3918 100644
--- a/libjava/java/lang/mprec.c
+++ b/libjava/java/lang/mprec.c
@@ -385,7 +385,7 @@ _DEFUN (mult, (ptr, a, b), struct _Jv_reent * ptr _AND _Jv_Bigint * a _AND _Jv_B
#else
for (; xb < xbe; xc0++)
{
- if (y = *xb++)
+ if ((y = *xb++))
{
x = xa;
xc = xc0;
@@ -488,11 +488,11 @@ _DEFUN (lshift, (ptr, b, k), struct _Jv_reent * ptr _AND _Jv_Bigint * b _AND int
z = 0;
do
{
- *x1++ = *x << k & 0xffff | z;
+ *x1++ = (*x << k & 0xffff) | z;
z = *x++ >> k1;
}
while (x < xe);
- if (*x1 = z)
+ if ((*x1 = z))
++n1;
}
#endif
@@ -718,18 +718,18 @@ _DEFUN (b2d, (a, e),
if (k < Ebits + 16)
{
z = xa > xa0 ? *--xa : 0;
- d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;
+ d0 = Exp_1 | y << (k - Ebits) | z >> (Ebits + 16 - k);
w = xa > xa0 ? *--xa : 0;
y = xa > xa0 ? *--xa : 0;
- d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;
+ d1 = z << (k + 16 - Ebits) | w << (k - Ebits) | y >> (16 + Ebits - k);
goto ret_d;
}
z = xa > xa0 ? *--xa : 0;
w = xa > xa0 ? *--xa : 0;
k -= Ebits + 16;
- d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;
+ d0 = Exp_1 | y << (k + 16) | z << k | w >> (16 - k);
y = xa > xa0 ? *--xa : 0;
- d1 = w << k + 16 | y << k;
+ d1 = w << (k + 16) | y << k;
#endif
ret_d:
#ifdef VAX
@@ -812,22 +812,22 @@ _DEFUN (d2b,
#endif
}
#else
- if (y = d1)
+ if ((y = d1))
{
- if (k = lo0bits (&y))
+ if ((k = lo0bits (&y)))
if (k >= 16)
{
- x[0] = y | z << 32 - k & 0xffff;
- x[1] = z >> k - 16 & 0xffff;
+ x[0] = y | (z << (32 - k) & 0xffff);
+ x[1] = z >> (k - 16) & 0xffff;
x[2] = z >> k;
i = 2;
}
else
{
x[0] = y & 0xffff;
- x[1] = y >> 16 | z << 16 - k & 0xffff;
+ x[1] = (y >> 16 | z << (16 - k)) & 0xffff;
x[2] = z >> k & 0xffff;
- x[3] = z >> k + 16;
+ x[3] = z >> (k + 16);
i = 3;
}
else
diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc
index e29ed6809ef..19a9d7d3580 100644
--- a/libjava/java/lang/natClass.cc
+++ b/libjava/java/lang/natClass.cc
@@ -126,15 +126,6 @@ java::lang::Class::getClassLoader (void)
s->checkPermission (new RuntimePermission (JvNewStringLatin1 ("getClassLoader")));
}
- // This particular 'return' has been changed a couple of times over
- // libgcj's history. This particular approach is a little weird,
- // because it means that all classes linked into the application
- // will see NULL for their class loader. This may confuse some
- // applications that aren't expecting this; the solution is to use a
- // different linking model for these applications. In the past we
- // returned the system class loader in this case, but that is
- // incorrect. Also, back then we didn't have other linkage models
- // to fall back on.
return loader;
}
@@ -167,10 +158,8 @@ java::lang::Class::getConstructor (JArray<jclass> *param_types)
}
JArray<java::lang::reflect::Constructor *> *
-java::lang::Class::_getConstructors (jboolean declared)
+java::lang::Class::getDeclaredConstructors (jboolean publicOnly)
{
- memberAccessCheck(java::lang::reflect::Member::PUBLIC);
-
int numConstructors = 0;
int max = isPrimitive () ? 0 : method_count;
int i;
@@ -180,7 +169,7 @@ java::lang::Class::_getConstructors (jboolean declared)
if (method->name == NULL
|| ! _Jv_equalUtf8Consts (method->name, init_name))
continue;
- if (! declared
+ if (publicOnly
&& ! java::lang::reflect::Modifier::isPublic(method->accflags))
continue;
numConstructors++;
@@ -197,7 +186,7 @@ java::lang::Class::_getConstructors (jboolean declared)
if (method->name == NULL
|| ! _Jv_equalUtf8Consts (method->name, init_name))
continue;
- if (! declared
+ if (publicOnly
&& ! java::lang::reflect::Modifier::isPublic(method->accflags))
continue;
java::lang::reflect::Constructor *cons
@@ -427,22 +416,8 @@ java::lang::Class::getName (void)
}
JArray<jclass> *
-java::lang::Class::getClasses (void)
-{
- // FIXME: security checking.
-
- // Until we have inner classes, it always makes sense to return an
- // empty array.
- JArray<jclass> *result
- = (JArray<jclass> *) JvNewObjectArray (0, &java::lang::Class::class$,
- NULL);
- return result;
-}
-
-JArray<jclass> *
-java::lang::Class::getDeclaredClasses (void)
+java::lang::Class::getDeclaredClasses (jboolean /*publicOnly*/)
{
- memberAccessCheck (java::lang::reflect::Member::DECLARED);
// Until we have inner classes, it always makes sense to return an
// empty array.
JArray<jclass> *result
diff --git a/libjava/java/lang/natString.cc b/libjava/java/lang/natString.cc
index 6e8febcbcf6..c8f3129a212 100644
--- a/libjava/java/lang/natString.cc
+++ b/libjava/java/lang/natString.cc
@@ -1,6 +1,6 @@
// natString.cc - Implementation of java.lang.String native methods.
-/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation
This file is part of libgcj.
@@ -64,7 +64,7 @@ _Jv_StringFindSlot (jchar* data, jint len, jint hash)
int index = start_index;
/* step must be non-zero, and relatively prime with strhash_size. */
jint step = (hash ^ (hash >> 16)) | 1;
- for (;;)
+ do
{
jstring* ptr = &strhash[index];
jstring value = (jstring) UNMASK_PTR (*ptr);
@@ -81,8 +81,12 @@ _Jv_StringFindSlot (jchar* data, jint len, jint hash)
&& memcmp(JvGetStringChars(value), data, 2*len) == 0)
return (ptr);
index = (index + step) & (strhash_size - 1);
- JvAssert (index != start_index);
}
+ while (index != start_index);
+ // Note that we can have INDEX == START_INDEX if the table has no
+ // NULL entries but does have DELETED_STRING entries.
+ JvAssert (deleted_index >= 0);
+ return &strhash[deleted_index];
}
/* Calculate a hash code for the string starting at PTR at given LENGTH.
@@ -829,7 +833,10 @@ java::lang::String::substring (jint beginIndex, jint endIndex)
if (beginIndex == 0 && endIndex == count)
return this;
jint newCount = endIndex - beginIndex;
- if (newCount <= 8) // Optimization, mainly for GC.
+ // For very small strings, just allocate a new one. For other
+ // substrings, allocate a new one unless the substring is over half
+ // of the original string.
+ if (newCount <= 8 || newCount < (count >> 1))
return JvNewString(JvGetStringChars(this) + beginIndex, newCount);
jstring s = new String();
s->data = data;
diff --git a/libjava/java/lang/ref/natReference.cc b/libjava/java/lang/ref/natReference.cc
index e322ae37cc8..5ad5b107405 100644
--- a/libjava/java/lang/ref/natReference.cc
+++ b/libjava/java/lang/ref/natReference.cc
@@ -1,6 +1,6 @@
// natReference.cc - Native code for References
-/* Copyright (C) 2001, 2002, 2003 Free Software Foundation
+/* Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation
This file is part of libgcj.
@@ -78,7 +78,7 @@ find_slot (jobject key)
int start_index = hcode & (hash_size - 1);
int index = start_index;
int deleted_index = -1;
- for (;;)
+ do
{
object_list *ptr = &hash[index];
if (ptr->reference == key)
@@ -96,8 +96,12 @@ find_slot (jobject key)
JvAssert (ptr->reference == DELETED_REFERENCE);
}
index = (index + step) & (hash_size - 1);
- JvAssert (index != start_index);
}
+ while (index != start_index);
+ // Note that we can have INDEX == START_INDEX if the table has no
+ // NULL entries but does have DELETED entries.
+ JvAssert (deleted_index >= 0);
+ return &hash[deleted_index];
}
static void
diff --git a/libjava/java/net/URLClassLoader.java b/libjava/java/net/URLClassLoader.java
index 4b9599816a9..e0a9389b716 100644
--- a/libjava/java/net/URLClassLoader.java
+++ b/libjava/java/net/URLClassLoader.java
@@ -63,7 +63,8 @@ import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
import gnu.gcj.runtime.SharedLibHelper;
-
+import gnu.gcj.Core;
+import gnu.java.net.protocol.core.CoreInputStream;
/**
* A secure class loader that can load classes and resources from
@@ -677,6 +678,66 @@ public class URLClassLoader extends SecureClassLoader
}
}
+ /**
+ * A <code>CoreURLLoader</code> is a type of <code>URLLoader</code>
+ * only loading from core url.
+ */
+ static final class CoreURLLoader extends URLLoader
+ {
+ private String dir;
+
+ CoreURLLoader(URLClassLoader classloader, URL url)
+ {
+ super(classloader, url);
+ dir = baseURL.getFile();
+ }
+
+ /** get resource with the name "name" in the core url */
+ Resource getResource(String name)
+ {
+ Core core = Core.find (dir + name);
+ if (core != null)
+ return new CoreResource(this, name, core);
+ return null;
+ }
+ }
+
+ static final class CoreResource extends Resource
+ {
+ final Core core;
+
+ CoreResource(CoreURLLoader loader, String name, Core core)
+ {
+ super(loader, name);
+ this.core = core;
+ }
+
+ InputStream getInputStream() throws IOException
+ {
+ return new CoreInputStream(core);
+ }
+
+ public int getLength()
+ {
+ return core.length;
+ }
+
+ public URL getURL()
+ {
+ try
+ {
+ return new URL(loader.baseURL, name,
+ loader.classloader.getURLStreamHandler("core"));
+ }
+ catch (MalformedURLException e)
+ {
+ InternalError ie = new InternalError();
+ ie.initCause(e);
+ throw ie;
+ }
+ }
+ }
+
// Constructors
/**
@@ -842,6 +903,8 @@ public class URLClassLoader extends SecureClassLoader
loader = new JarURLLoader(this, newUrl);
else if ("file".equals(protocol))
loader = new FileURLLoader(this, newUrl);
+ else if ("core".equals(protocol))
+ loader = new CoreURLLoader(this, newUrl);
else
loader = new RemoteURLLoader(this, newUrl);
diff --git a/libjava/java/rmi/server/RMIClassLoader.java b/libjava/java/rmi/server/RMIClassLoader.java
index 6add274ef3e..9cc272b11c8 100644
--- a/libjava/java/rmi/server/RMIClassLoader.java
+++ b/libjava/java/rmi/server/RMIClassLoader.java
@@ -250,7 +250,7 @@ public class RMIClassLoader
*
* @throws MalformedURLException if the codebase contains a malformed URL
*/
- private static ClassLoader getClassLoader (String codebases)
+ public static ClassLoader getClassLoader (String codebases)
throws MalformedURLException
{
ClassLoader loader;
diff --git a/libjava/java/text/MessageFormat.java b/libjava/java/text/MessageFormat.java
index 6c1b0508bda..8d53ec21ec1 100644
--- a/libjava/java/text/MessageFormat.java
+++ b/libjava/java/text/MessageFormat.java
@@ -113,6 +113,7 @@ public class MessageFormat extends Format
formatClass = java.util.Date.class;
int val = DateFormat.DEFAULT;
+ boolean styleIsPattern = false;
if (style == null)
;
else if (style.equals("short"))
@@ -123,13 +124,15 @@ public class MessageFormat extends Format
val = DateFormat.LONG;
else if (style.equals("full"))
val = DateFormat.FULL;
+ else
+ styleIsPattern = true;
if (type.equals("time"))
format = DateFormat.getTimeInstance(val, loc);
else
format = DateFormat.getDateInstance(val, loc);
- if (style != null && val == DateFormat.DEFAULT)
+ if (styleIsPattern)
{
SimpleDateFormat sdf = (SimpleDateFormat) format;
sdf.applyPattern(style);
@@ -655,7 +658,11 @@ public class MessageFormat extends Format
{
// We have a String format. This can lose in a number
// of ways, but we give it a shot.
- int next_index = sourceStr.indexOf(elements[i].trailer, index);
+ int next_index;
+ if (elements[i].trailer.length() > 0)
+ next_index = sourceStr.indexOf(elements[i].trailer, index);
+ else
+ next_index = sourceStr.length();
if (next_index == -1)
{
pos.setErrorIndex(index);
diff --git a/libjava/java/util/LinkedHashMap.java b/libjava/java/util/LinkedHashMap.java
index f58cf3fe70e..d18d6f8e4a4 100644
--- a/libjava/java/util/LinkedHashMap.java
+++ b/libjava/java/util/LinkedHashMap.java
@@ -1,6 +1,6 @@
/* LinkedHashMap.java -- a class providing hashtable data structure,
mapping Object --> Object, with linked list traversal
- Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -186,6 +186,7 @@ public class LinkedHashMap extends HashMap
succ = null;
pred = root.pred;
pred.succ = this;
+ root.pred = this;
}
}
}
diff --git a/libjava/java/util/regex/Pattern.java b/libjava/java/util/regex/Pattern.java
index 06418a22a34..455171c5bbb 100644
--- a/libjava/java/util/regex/Pattern.java
+++ b/libjava/java/util/regex/Pattern.java
@@ -84,8 +84,7 @@ public final class Pattern implements Serializable
// if ((flags & UNICODE_CASE) != 0) gnuFlags =
// if ((flags & CANON_EQ) != 0) gnuFlags =
- // Eventually there will be such a thing as JDK 1_4 syntax
- RESyntax syntax = RESyntax.RE_SYNTAX_PERL5;
+ RESyntax syntax = RESyntax.RE_SYNTAX_JAVA_1_4;
if ((flags & UNIX_LINES) != 0)
{
// Use a syntax set with \n for linefeeds?
diff --git a/libjava/jawt.c b/libjava/jawt.c
index bb03c638e55..ad5284d4b13 100644
--- a/libjava/jawt.c
+++ b/libjava/jawt.c
@@ -40,7 +40,6 @@
#include <jawt.h>
#include <jawt_md.h>
#include "classpath_jawt.h"
-#include <malloc.h>
static jint (JNICALL _Jv_Lock) (JAWT_DrawingSurface* surface);
static void (JNICALL _Jv_Unlock) (JAWT_DrawingSurface* surface);
diff --git a/libjava/jni.cc b/libjava/jni.cc
index a54aea949ff..59b380c1a60 100644
--- a/libjava/jni.cc
+++ b/libjava/jni.cc
@@ -1112,10 +1112,10 @@ _Jv_JNI_NewObjectV (JNIEnv *env, jclass klass,
jmethodID id, va_list args)
{
JvAssert (klass && ! klass->isArray ());
- JvAssert (! strcmp (id->name->data, "<init>")
- && id->signature->length > 2
- && id->signature->data[0] == '('
- && ! strcmp (&id->signature->data[id->signature->length - 2],
+ JvAssert (! strcmp (id->name->chars(), "<init>")
+ && id->signature->len() > 2
+ && id->signature->chars()[0] == '('
+ && ! strcmp (&id->signature->chars()[id->signature->len() - 2],
")V"));
return _Jv_JNI_CallAnyMethodV<jobject, constructor> (env, NULL, klass,
@@ -1126,10 +1126,10 @@ static jobject JNICALL
_Jv_JNI_NewObject (JNIEnv *env, jclass klass, jmethodID id, ...)
{
JvAssert (klass && ! klass->isArray ());
- JvAssert (! strcmp (id->name->data, "<init>")
- && id->signature->length > 2
- && id->signature->data[0] == '('
- && ! strcmp (&id->signature->data[id->signature->length - 2],
+ JvAssert (! strcmp (id->name->chars(), "<init>")
+ && id->signature->len() > 2
+ && id->signature->chars()[0] == '('
+ && ! strcmp (&id->signature->chars()[id->signature->len() - 2],
")V"));
va_list args;
@@ -1148,10 +1148,10 @@ _Jv_JNI_NewObjectA (JNIEnv *env, jclass klass, jmethodID id,
jvalue *args)
{
JvAssert (klass && ! klass->isArray ());
- JvAssert (! strcmp (id->name->data, "<init>")
- && id->signature->length > 2
- && id->signature->data[0] == '('
- && ! strcmp (&id->signature->data[id->signature->length - 2],
+ JvAssert (! strcmp (id->name->chars(), "<init>")
+ && id->signature->len() > 2
+ && id->signature->chars()[0] == '('
+ && ! strcmp (&id->signature->chars()[id->signature->len() - 2],
")V"));
return _Jv_JNI_CallAnyMethodA<jobject, constructor> (env, NULL, klass,
diff --git a/libjava/link.cc b/libjava/link.cc
index 3fe073463f9..e97b31bb78e 100644
--- a/libjava/link.cc
+++ b/libjava/link.cc
@@ -714,8 +714,8 @@ _Jv_ThrowNoSuchMethodError ()
}
// This is put in empty vtable slots.
-static void
-_Jv_abstractMethodError (void)
+void
+_Jv_ThrowAbstractMethodError ()
{
throw new java::lang::AbstractMethodError();
}
@@ -767,7 +767,7 @@ _Jv_Linker::append_partial_itable (jclass klass, jclass iface,
(_Jv_GetMethodString (klass, meth));
if ((meth->accflags & Modifier::ABSTRACT) != 0)
- itable[pos] = (void *) &_Jv_abstractMethodError;
+ itable[pos] = (void *) &_Jv_ThrowAbstractMethodError;
else
itable[pos] = meth->ncode;
}
@@ -1228,7 +1228,8 @@ _Jv_Linker::set_vtable_entries (jclass klass, _Jv_VTable *vtable)
if ((meth->accflags & Modifier::ABSTRACT))
// FIXME: it might be nice to have a libffi trampoline here,
// so we could pass in the method name and other information.
- vtable->set_method(meth->index, (void *) &_Jv_abstractMethodError);
+ vtable->set_method(meth->index,
+ (void *) &_Jv_ThrowAbstractMethodError);
else
vtable->set_method(meth->index, meth->ncode);
}
diff --git a/libjava/mauve-libgcj b/libjava/mauve-libgcj
index 04ef521ff89..ff3b1f5a867 100644
--- a/libjava/mauve-libgcj
+++ b/libjava/mauve-libgcj
@@ -20,9 +20,5 @@ JDBC2.0
!java.lang.ref.
# Tests for not yet implemented classes and/or methods.
-!javax.swing.plaf
-!javax.swing.text
-!javax.swing.table
-!javax.swing.SpinnerListModel
-!javax.swing.SwingUtilities
-!java.beans.XMLDecoder
+!java.awt.event.MouseEvent.modifiersEx
+!org.omg.
diff --git a/libjava/stacktrace.cc b/libjava/stacktrace.cc
index a849f6f9e71..e0276788835 100644
--- a/libjava/stacktrace.cc
+++ b/libjava/stacktrace.cc
@@ -29,6 +29,7 @@ details. */
#include <gnu/gcj/runtime/NameFinder.h>
#include <sysdep/backtrace.h>
+#include <sysdep/descriptor.h>
using namespace java::lang;
using namespace java::lang::reflect;
@@ -62,12 +63,12 @@ _Jv_StackTrace::UpdateNCodeMap ()
for (int i=0; i < klass->method_count; i++)
{
_Jv_Method *method = &klass->methods[i];
+ void *ncode = method->ncode;
// Add non-abstract methods to ncodeMap.
- if (method->ncode)
+ if (ncode)
{
- //printf("map->put 0x%x / %s.%s\n", method->ncode, klass->name->data,
- // method->name->data);
- ncodeMap->put ((java::lang::Object *) method->ncode, klass);
+ ncode = UNWRAP_FUNCTION_DESCRIPTOR (ncode);
+ ncodeMap->put ((java::lang::Object *)ncode, klass);
}
}
}
diff --git a/libjava/sysdep/descriptor-n.h b/libjava/sysdep/descriptor-n.h
new file mode 100644
index 00000000000..d640405e25b
--- /dev/null
+++ b/libjava/sysdep/descriptor-n.h
@@ -0,0 +1,3 @@
+// Given a function pointer, return the code address.
+
+#define UNWRAP_FUNCTION_DESCRIPTOR(X) (X)
diff --git a/libjava/sysdep/descriptor-y.h b/libjava/sysdep/descriptor-y.h
new file mode 100644
index 00000000000..ca615505d83
--- /dev/null
+++ b/libjava/sysdep/descriptor-y.h
@@ -0,0 +1,5 @@
+// Given a function pointer, return the code address.
+
+// The function descriptor is actually multiple words,
+// but we don't care about anything except the first.
+#define UNWRAP_FUNCTION_DESCRIPTOR(X) (*(void **)(X))
diff --git a/libjava/sysdep/powerpc/descriptor.h b/libjava/sysdep/powerpc/descriptor.h
new file mode 100644
index 00000000000..51296c22262
--- /dev/null
+++ b/libjava/sysdep/powerpc/descriptor.h
@@ -0,0 +1,9 @@
+// Given a function pointer, return the code address.
+
+#ifdef _CALL_AIX
+// The function descriptor is actually multiple words,
+// but we don't care about anything except the first.
+# define UNWRAP_FUNCTION_DESCRIPTOR(X) (*(void **)(X))
+#else
+# define UNWRAP_FUNCTION_DESCRIPTOR(X) (X)
+#endif
diff --git a/libjava/testsuite/Makefile.in b/libjava/testsuite/Makefile.in
index cc2e4968019..69e401cc961 100644
--- a/libjava/testsuite/Makefile.in
+++ b/libjava/testsuite/Makefile.in
@@ -40,9 +40,11 @@ subdir = testsuite
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/../config/acx.m4 \
+ $(top_srcdir)/../config/depstand.m4 \
$(top_srcdir)/../config/gxx-include-dir.m4 \
$(top_srcdir)/../config/iconv.m4 \
$(top_srcdir)/../config/lcmessage.m4 \
+ $(top_srcdir)/../config/lead-dot.m4 \
$(top_srcdir)/../config/lib-ld.m4 \
$(top_srcdir)/../config/lib-link.m4 \
$(top_srcdir)/../config/lib-prefix.m4 $(top_srcdir)/pkg.m4 \
diff --git a/libjava/testsuite/libjava.jacks/jacks.xfail b/libjava/testsuite/libjava.jacks/jacks.xfail
index 4cc878464fd..4524e957a33 100644
--- a/libjava/testsuite/libjava.jacks/jacks.xfail
+++ b/libjava/testsuite/libjava.jacks/jacks.xfail
@@ -306,6 +306,7 @@
15.8.2-type-12
15.8.2-type-13
15.8.2-type-14
+15.8.4-static-2
15.8.5-field-expression-6
15.8.5-method-expression-8
15.8.5-variable-5
@@ -432,7 +433,6 @@
3.10.2-round-10
3.10.2-round-11
3.10.2-round-12
-3.10.2-round-6
3.10.2-round-7
3.10.2-round-9
3.2-valid-1
@@ -634,6 +634,7 @@
8.5-inheritance-2
8.5-inheritance-3
8.5-inheritance-6
+8.5.2-accessible-static-member-usage-3
8.5.2-non-static-member-usage-2
8.5.2-non-static-member-usage-4
8.5.2-non-static-member-usage-5
diff --git a/libjava/testsuite/libjava.jni/jni.exp b/libjava/testsuite/libjava.jni/jni.exp
index 201daaca713..84614260b0b 100644
--- a/libjava/testsuite/libjava.jni/jni.exp
+++ b/libjava/testsuite/libjava.jni/jni.exp
@@ -196,7 +196,7 @@ proc gcj_jni_invocation_compile_c_to_binary {file {options {}}} {
# Set some darwin specific options
if { [istarget "*-*-darwin*"] } {
- lappend options "additional_flags=-multiply_defined suppress"
+ lappend options "additional_flags= -bind_at_load -multiply_defined suppress"
}
# Find the generated header.
lappend options "additional_flags=-I. -I.."
diff --git a/libjava/testsuite/libjava.lang/PR19870.java b/libjava/testsuite/libjava.lang/PR19870.java
new file mode 100644
index 00000000000..f9e6bc31895
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/PR19870.java
@@ -0,0 +1,44 @@
+// PR19870: Test static field access across nested class boundaries.
+//
+public class PR19870
+{
+ private static int x = 123;
+
+ static class Foo
+ {
+ private static int junk = 1000;
+
+ static void snafu( )
+ {
+ System.out.println( x);
+ x = 456;
+ System.out.println( PR19870.x);
+ PR19870.x = 789;
+ System.out.println( PR19870.x);
+
+ System.out.println( Bar.junk);
+ }
+ }
+
+ static class Bar
+ {
+ private static int junk = 1984;
+
+ static void snafu( )
+ {
+ System.out.println( Foo.junk);
+ Foo.junk = 2000;
+ System.out.println( Foo.junk);
+ }
+ }
+
+ public static void main( String[] args)
+ {
+ Foo.snafu( );
+ Bar.snafu( );
+
+ System.out.println( Foo.junk);
+ Foo.junk = 3000;
+ System.out.println( Foo.junk);
+ }
+}
diff --git a/libjava/testsuite/libjava.lang/PR19870.out b/libjava/testsuite/libjava.lang/PR19870.out
new file mode 100644
index 00000000000..ab58915f55f
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/PR19870.out
@@ -0,0 +1,8 @@
+123
+456
+789
+1984
+1000
+2000
+2000
+3000
diff --git a/libjava/testsuite/libjava.lang/pr17536.java b/libjava/testsuite/libjava.lang/pr17536.java
new file mode 100644
index 00000000000..7d94fd9b109
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/pr17536.java
@@ -0,0 +1,5 @@
+public class pr17536 {
+ public static void main(String[] args) {
+ System.out.println(int[].class.getClassLoader());
+ }
+}
diff --git a/libjava/testsuite/libjava.lang/pr17536.out b/libjava/testsuite/libjava.lang/pr17536.out
new file mode 100644
index 00000000000..19765bd501b
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/pr17536.out
@@ -0,0 +1 @@
+null
diff --git a/libjava/testsuite/libjava.lang/pr21785.java b/libjava/testsuite/libjava.lang/pr21785.java
new file mode 100644
index 00000000000..7869754977a
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/pr21785.java
@@ -0,0 +1,21 @@
+import java.io.*;
+
+public class pr21785 implements Serializable
+{
+ public static void main(String[] args)
+ {
+ try {
+ ByteArrayOutputStream outb = new ByteArrayOutputStream();
+ ObjectOutputStream outs = new ObjectOutputStream(outb);
+ outs.writeObject(new pr21785());
+ byte[] store = outb.toByteArray();
+
+ ByteArrayInputStream inb = new ByteArrayInputStream(store);
+ ObjectInputStream ins = new ObjectInputStream(inb);
+ ins.readObject();
+ }
+ catch (Throwable e) {
+ throw new Error(e);
+ }
+ }
+}
diff --git a/libjava/testsuite/libjava.lang/pr21785.out b/libjava/testsuite/libjava.lang/pr21785.out
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/pr21785.out
diff --git a/libjava/testsuite/libjava.lang/pr21844.java b/libjava/testsuite/libjava.lang/pr21844.java
new file mode 100644
index 00000000000..24ed01fce9f
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/pr21844.java
@@ -0,0 +1,33 @@
+class pr21844base
+{
+ int modCount;
+
+ public pr21844base(int x)
+ {
+ modCount = x;
+ }
+}
+
+public class pr21844 extends pr21844base
+{
+ class inner
+ {
+ public int doit ()
+ {
+ ++modCount;
+ return modCount;
+ }
+ }
+
+ public pr21844(int x)
+ {
+ super(x);
+ }
+
+ public static void main(String[] args)
+ {
+ pr21844 val = new pr21844(7);
+ inner i = val.new inner();
+ System.out.println(i.doit());
+ }
+}
diff --git a/libjava/testsuite/libjava.lang/pr21844.out b/libjava/testsuite/libjava.lang/pr21844.out
new file mode 100644
index 00000000000..45a4fb75db8
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/pr21844.out
@@ -0,0 +1 @@
+8
diff --git a/libmudflap/ChangeLog b/libmudflap/ChangeLog
index 46c997fc987..1a35d91c356 100644
--- a/libmudflap/ChangeLog
+++ b/libmudflap/ChangeLog
@@ -1,3 +1,32 @@
+2005-06-15 Frank Ch. Eigler <fche@redhat.com>
+
+ Fix for uncaching bug reported by Herman ten Brugge.
+ * mf-runtime.c (__mf_uncache_object): Search whole cache.
+ * testsuite/libmudflap.c/fail40-frag.c: New test.
+
+2005-05-23 Alfred M. Szmidt <ams@gnu.org>
+
+ PR libmudflap/21724
+ * Makefile.am (AM_MAKEFLAGS): Pass includedir.
+ * Makefile.in: Amend.
+
+2005-06-14 Frank Ch. Eigler <fche@redhat.com>
+
+ PR mudflap/21023
+ * testsuite/libmudflap.c/externs.exp, externs-{1,2}.c: New test files.
+ * testsuite/libmudflap.c/cfrags.exp: Bypass new sources.
+
+2005-06-14 Frank Ch. Eigler <fche@redhat.com>
+
+ PR libmudflap/21094
+ * testsuite/libmudflap.c++/*.exp: Assert build tree g++.
+
+2005-06-14 Frank Ch. Eigler <fche@redhat.com>
+
+ PR mudflap/22064
+ * mf-impl.h (mudflap_mode, violation_mode): Make these ordinary
+ unsigned vars with #defines instead of enums.
+
2005-05-09 Mike Stump <mrs@apple.com>
* configure: Regenerate.
diff --git a/libmudflap/Makefile.am b/libmudflap/Makefile.am
index 3be442a3139..64ba06aec21 100644
--- a/libmudflap/Makefile.am
+++ b/libmudflap/Makefile.am
@@ -91,6 +91,7 @@ AM_MAKEFLAGS = \
"infodir=$(infodir)" \
"libdir=$(libdir)" \
"prefix=$(prefix)" \
+ "includedir=$(includedir)" \
"AR=$(AR)" \
"AS=$(AS)" \
"CC=$(CC)" \
diff --git a/libmudflap/Makefile.in b/libmudflap/Makefile.in
index a96dac3e503..dfd433afe43 100644
--- a/libmudflap/Makefile.in
+++ b/libmudflap/Makefile.in
@@ -280,6 +280,7 @@ AM_MAKEFLAGS = \
"infodir=$(infodir)" \
"libdir=$(libdir)" \
"prefix=$(prefix)" \
+ "includedir=$(includedir)" \
"AR=$(AR)" \
"AS=$(AS)" \
"CC=$(CC)" \
diff --git a/libmudflap/mf-impl.h b/libmudflap/mf-impl.h
index 82d7d2aba14..47abdf602e7 100644
--- a/libmudflap/mf-impl.h
+++ b/libmudflap/mf-impl.h
@@ -167,24 +167,18 @@ struct __mf_options
#endif
/* Major operation mode */
- enum
- {
- mode_nop, /* mudflaps do nothing */
- mode_populate, /* mudflaps populate tree but do not check for violations */
- mode_check, /* mudflaps populate and check for violations (normal) */
- mode_violate /* mudflaps trigger a violation on every call (diagnostic) */
- }
- mudflap_mode;
+#define mode_nop 0 /* Do nothing. */
+#define mode_populate 1 /* Populate tree but do not check for violations. */
+#define mode_check 2 /* Populate and check for violations (normal). */
+#define mode_violate 3 /* Trigger a violation on every call (diagnostic). */
+ unsigned mudflap_mode;
/* How to handle a violation. */
- enum
- {
- viol_nop, /* Return control to application. */
- viol_segv, /* Signal self with segv. */
- viol_abort, /* Call abort (). */
- viol_gdb /* Fork a debugger on self */
- }
- violation_mode;
+#define viol_nop 0 /* Return control to application. */
+#define viol_segv 1 /* Signal self with segv. */
+#define viol_abort 2 /* Call abort (). */
+#define viol_gdb 3 /* Fork a debugger on self */
+ unsigned violation_mode;
/* Violation heuristics selection. */
unsigned heur_stack_bound; /* allow current stack region */
diff --git a/libmudflap/mf-runtime.c b/libmudflap/mf-runtime.c
index 5732c063408..317aeaef521 100644
--- a/libmudflap/mf-runtime.c
+++ b/libmudflap/mf-runtime.c
@@ -919,7 +919,7 @@ void __mfu_check (void *ptr, size_t sz, int type, const char *location)
judgement = -1;
}
- /* We now know that the access spans one or more only valid objects. */
+ /* We now know that the access spans no invalid objects. */
if (LIKELY (judgement >= 0))
for (i = 0; i < obj_count; i++)
{
@@ -1064,14 +1064,14 @@ __mf_uncache_object (__mf_object_t *old_obj)
/* Can it possibly exist in the cache? */
if (LIKELY (old_obj->read_count + old_obj->write_count))
{
+ /* As reported by Herman ten Brugge, we need to scan the entire
+ cache for entries that may hit this object. */
uintptr_t low = old_obj->low;
uintptr_t high = old_obj->high;
- unsigned idx_low = __MF_CACHE_INDEX (low);
- unsigned idx_high = __MF_CACHE_INDEX (high);
+ struct __mf_cache *entry = & __mf_lookup_cache [0];
unsigned i;
- for (i = idx_low; i <= idx_high; i++)
+ for (i = 0; i <= __mf_lc_mask; i++, entry++)
{
- struct __mf_cache *entry = & __mf_lookup_cache [i];
/* NB: the "||" in the following test permits this code to
tolerate the situation introduced by __mf_check over
contiguous objects, where a cache entry spans several
diff --git a/libmudflap/testsuite/libmudflap.c++/c++frags.exp b/libmudflap/testsuite/libmudflap.c++/c++frags.exp
index 1ac24adbe92..0b2774360b7 100644
--- a/libmudflap/testsuite/libmudflap.c++/c++frags.exp
+++ b/libmudflap/testsuite/libmudflap.c++/c++frags.exp
@@ -1,5 +1,9 @@
libmudflap-init c++
+if {$cxx == "g++"} then {
+ unsupported "g++ not found"
+ return
+}
dg-init
diff --git a/libmudflap/testsuite/libmudflap.c++/ctors.exp b/libmudflap/testsuite/libmudflap.c++/ctors.exp
index 5d4f1efff61..ceb9fb70ffa 100644
--- a/libmudflap/testsuite/libmudflap.c++/ctors.exp
+++ b/libmudflap/testsuite/libmudflap.c++/ctors.exp
@@ -1,5 +1,9 @@
libmudflap-init c++
+if {$cxx == "g++"} then {
+ unsupported "g++ not found"
+ return
+}
dg-init
diff --git a/libmudflap/testsuite/libmudflap.c/cfrags.exp b/libmudflap/testsuite/libmudflap.c/cfrags.exp
index c29975c30fe..577a4cc80c9 100644
--- a/libmudflap/testsuite/libmudflap.c/cfrags.exp
+++ b/libmudflap/testsuite/libmudflap.c/cfrags.exp
@@ -5,7 +5,11 @@ dg-init
global srcdir
foreach flags [list {} {-static} {-O2} {-O3}] {
- foreach srcfile [lsort [glob -nocomplain ${srcdir}/libmudflap.c/*.c]] {
+ foreach srcfile [lsort [glob -nocomplain \
+ ${srcdir}/libmudflap.c/*frag.c \
+ ${srcdir}/libmudflap.c/heap*.c \
+ ${srcdir}/libmudflap.c/hook*.c \
+ ${srcdir}/libmudflap.c/pass*.c]] {
set bsrc [file tail $srcfile]
setenv MUDFLAP_OPTIONS "-viol-segv"
dg-runtest $srcfile $flags "-fmudflap -lmudflap"
diff --git a/libmudflap/testsuite/libmudflap.c/externs-1.c b/libmudflap/testsuite/libmudflap.c/externs-1.c
new file mode 100644
index 00000000000..552801d4b40
--- /dev/null
+++ b/libmudflap/testsuite/libmudflap.c/externs-1.c
@@ -0,0 +1,14 @@
+typedef struct { char *name; } dummy;
+extern dummy d[];
+
+int
+main (void)
+{
+ dummy *pd = d;
+
+ while (pd->name)
+ {
+ printf ("%s\n", pd->name);
+ pd++;
+ }
+}
diff --git a/libmudflap/testsuite/libmudflap.c/externs-2.c b/libmudflap/testsuite/libmudflap.c/externs-2.c
new file mode 100644
index 00000000000..cecf6253a6a
--- /dev/null
+++ b/libmudflap/testsuite/libmudflap.c/externs-2.c
@@ -0,0 +1,2 @@
+typedef struct { char *name; } dummy;
+dummy d[] = { {"a"}, {0} };
diff --git a/libmudflap/testsuite/libmudflap.c/externs.exp b/libmudflap/testsuite/libmudflap.c/externs.exp
new file mode 100644
index 00000000000..e97e0b684e4
--- /dev/null
+++ b/libmudflap/testsuite/libmudflap.c/externs.exp
@@ -0,0 +1,40 @@
+libmudflap-init c
+dg-init
+
+global srcdir subdir
+
+foreach flags [list {} {-static} {-O2} {-O3}] {
+ set l1 [libmudflap_target_compile "$srcdir/$subdir/externs-1.c" "externs-1.o" object {additional_flags=-fmudflap}]
+ set test "externs-1 compilation ${flags}"
+ if [string match "*mudflap cannot track unknown size extern *d*" $l1] { pass $test } { fail $test }
+
+ set l2 [libmudflap_target_compile "$srcdir/$subdir/externs-2.c" "externs-2.o" object {additional_flags=-fmudflap}]
+ set test "externs-2 compilation ${flags}"
+ if [string match "" $l2] { pass $test } { fail $test }
+
+ set l3 [libmudflap_target_compile "externs-1.o externs-2.o" "externs-12.exe" executable {additional_flags=-fmudflap additional_flags=-lmudflap}]
+ set test "externs-12 linkage ${flags}"
+ if [string match "" $l3] { pass $test } { fail $test }
+
+ set l4 [libmudflap_target_compile "externs-2.o externs-1.o" "externs-21.exe" executable {additional_flags=-fmudflap additional_flags=-lmudflap}]
+ set test "externs-21 linkage ${flags}"
+ if [string match "" $l3] { pass $test } { fail $test }
+
+ setenv MUDFLAP_OPTIONS "-viol-segv"
+
+ remote_spawn host "./externs-12.exe"
+ set l5 [remote_wait host 10]
+ set test "externs-12 execution ${flags}"
+ if {[lindex $l5 0] == 0} { pass $test } { fail $test }
+
+ remote_spawn host "./externs-21.exe"
+ set l6 [remote_wait host 10]
+ set test "externs-21 execution ${flags}"
+ if {[lindex $l6 0] == 0} { pass $test } { fail $test }
+
+ foreach f [glob -nocomplain "externs-*"] {
+ remote_file build delete $f
+ }
+}
+
+dg-finish
diff --git a/libmudflap/testsuite/libmudflap.c/fail40-frag.c b/libmudflap/testsuite/libmudflap.c/fail40-frag.c
new file mode 100644
index 00000000000..610be20554d
--- /dev/null
+++ b/libmudflap/testsuite/libmudflap.c/fail40-frag.c
@@ -0,0 +1,56 @@
+/* Test proper lookup-uncaching of large objects */
+#include "../config.h"
+
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_SYS_MMAN_H
+#include <sys/mman.h>
+#endif
+
+int main ()
+{
+#ifndef MAP_ANONYMOUS
+#define MAP_ANONYMOUS MAP_ANON
+#endif
+#ifdef HAVE_MMAP
+ volatile unsigned char *p;
+ unsigned num = getpagesize ();
+ unsigned i;
+ int rc;
+
+ /* Get a bit of usable address space. We really want an 2**N+1-sized object,
+ so the low/high addresses wrap when hashed into the lookup cache. So we
+ will manually unregister the entire mmap, then re-register a slice. */
+ p = mmap (NULL, num, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);
+ if (p == NULL)
+ return 1;
+ /* Now unregister it, as if munmap was called. But don't actually munmap, so
+ we can write into the memory. */
+ __mf_unregister ((void *) p, num, __MF_TYPE_HEAP_I);
+
+ /* Now register it under a slightly inflated, 2**N+1 size. */
+ __mf_register ((void *) p, num+1, __MF_TYPE_HEAP_I, "fake mmap registration");
+
+ /* Traverse array to ensure that entire lookup cache is made to point at it. */
+ for (i=0; i<num; i++)
+ p[i] = 0;
+
+ /* Unregister it. This should clear the entire lookup cache, even though
+ hash(low) == hash (high) (and probably == 0) */
+ __mf_unregister ((void *) p, num+1, __MF_TYPE_HEAP_I);
+
+ /* Now touch the middle portion of the ex-array. If the lookup cache was
+ well and truly cleaned, then this access should trap. */
+ p[num/2] = 1;
+
+ return 0;
+#else
+ return 1;
+#endif
+}
+/* { dg-output "mudflap violation 1.*check/write.*" } */
+/* { dg-output "Nearby object 1.*" } */
+/* { dg-output "mudflap dead object.*fake mmap registration.*" } */
+/* { dg-do run { xfail *-*-* } } */
diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog
index c546e9ad6c2..0fa3b08f16f 100644
--- a/libobjc/ChangeLog
+++ b/libobjc/ChangeLog
@@ -1,3 +1,26 @@
+2005-06-08 David Ayers <d.ayers@inode.at>
+
+ * objc/NXConstStr.h, objc/Object.h, objc/Protocol.h,
+ objc/encoding.h, objc/hash.h, objc/objc-api.h,
+ objc/runtime.h, objc/sarray.h, objc/thr.h,
+ objc/typedstream.h: Do not include Objective-C headers as
+ system headers.
+
+2005-06-07 David Ayers <d.ayers@inode.at>
+
+ * archive.c, init.c, selector.c: Include hash.h.
+ * archive.c, class.c, encoding.c, gc.c, hash.c, hash_compat.c,
+ init.c, misc.c, nil_method.c, objects.c, sarray.c, selector.c,
+ sendmsg.c, thr-dce.c, thr-decosf1.c, thr-irix.c, thr-mach.c,
+ thr-objc.c, thr-os2.c, thr-posix.c, thr-pthreads.c, thr-rtems.c,
+ thr-single.c, thr-solaris.c, thr-vxworks.c, thr-win32.c, thr.c:
+ Include Objective-C headers with quotes and objc/ directory
+ prefix.
+
+2005-05-19 Richard Henderson <rth@redhat.com>
+
+ * exception.c: Revert last change.
+
2005-05-19 David Ayers <d.ayers@inode.at>
* exception.c: Include tsystem.h for unwind.h.
diff --git a/libobjc/archive.c b/libobjc/archive.c
index 5c3616ca329..3bfd975a18a 100644
--- a/libobjc/archive.c
+++ b/libobjc/archive.c
@@ -25,9 +25,9 @@ Boston, MA 02111-1307, USA. */
covered by the GNU General Public License. */
#include "tconfig.h"
-#include "runtime.h"
-#include "typedstream.h"
-#include "encoding.h"
+#include "objc/runtime.h"
+#include "objc/typedstream.h"
+#include "objc/encoding.h"
#include <stdlib.h>
extern int fflush (FILE *);
diff --git a/libobjc/class.c b/libobjc/class.c
index 9638f5d3784..2140652ff1e 100644
--- a/libobjc/class.c
+++ b/libobjc/class.c
@@ -88,12 +88,12 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
classes from the table - and the difficult thing with lock-free data
structures is freeing data when is removed from the structures. */
-#include "runtime.h" /* the kitchen sink */
-#include "sarray.h"
+#include "objc/runtime.h" /* the kitchen sink */
+#include "objc/sarray.h"
-#include <objc/objc.h>
-#include <objc/objc-api.h>
-#include <objc/thr.h>
+#include "objc/objc.h"
+#include "objc/objc-api.h"
+#include "objc/thr.h"
/* We use a table which maps a class name to the corresponding class
* pointer. The first part of this file defines this table, and
diff --git a/libobjc/encoding.c b/libobjc/encoding.c
index 7f71276b556..95cf6527736 100644
--- a/libobjc/encoding.c
+++ b/libobjc/encoding.c
@@ -32,8 +32,8 @@ Boston, MA 02111-1307, USA. */
#include "tconfig.h"
#include "coretypes.h"
#include "tm.h"
-#include "objc-api.h"
-#include "encoding.h"
+#include "objc/objc-api.h"
+#include "objc/encoding.h"
#include <stdlib.h>
#undef MAX
diff --git a/libobjc/exception.c b/libobjc/exception.c
index 20a9541af46..cfce70c51e3 100644
--- a/libobjc/exception.c
+++ b/libobjc/exception.c
@@ -27,7 +27,6 @@ Boston, MA 02111-1307, USA. */
#include <stdlib.h>
#include "config.h"
#include "objc/objc-api.h"
-#include "tsystem.h"
#include "unwind.h"
#include "unwind-pe.h"
diff --git a/libobjc/gc.c b/libobjc/gc.c
index 66aa78a32ee..a4766894ab3 100644
--- a/libobjc/gc.c
+++ b/libobjc/gc.c
@@ -26,8 +26,8 @@ Boston, MA 02111-1307, USA. */
the executable file might be covered by the GNU General Public License. */
#include "tconfig.h"
-#include "objc.h"
-#include "encoding.h"
+#include "objc/objc.h"
+#include "objc/encoding.h"
#include <assert.h>
#include <string.h>
diff --git a/libobjc/hash.c b/libobjc/hash.c
index e2072b605f7..a32279cd7a7 100644
--- a/libobjc/hash.c
+++ b/libobjc/hash.c
@@ -26,9 +26,9 @@ Boston, MA 02111-1307, USA. */
#include "assert.h"
-#include "hash.h"
+#include "objc/hash.h"
-#include "runtime.h" /* for DEBUG_PRINTF */
+#include "objc/runtime.h" /* for DEBUG_PRINTF */
/* These two macros determine when a hash table is full and
by how much it should be expanded respectively.
diff --git a/libobjc/hash_compat.c b/libobjc/hash_compat.c
index 46c273858a6..905b9e43c67 100644
--- a/libobjc/hash_compat.c
+++ b/libobjc/hash_compat.c
@@ -25,7 +25,7 @@ Boston, MA 02111-1307, USA. */
the executable file might be covered by the GNU General Public License. */
#define OBJC_IGNORE_DEPRECATED_API 1
-#include "hash.h"
+#include "objc/hash.h"
cache_ptr
hash_new (unsigned int size,
diff --git a/libobjc/init.c b/libobjc/init.c
index 3eb53866f38..40d9016e239 100644
--- a/libobjc/init.c
+++ b/libobjc/init.c
@@ -24,7 +24,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
however invalidate any other reasons why the executable file might be
covered by the GNU General Public License. */
-#include "runtime.h"
+#include "objc/runtime.h"
/* The version number of this runtime. This must match the number
defined in gcc (objc-act.c). */
diff --git a/libobjc/misc.c b/libobjc/misc.c
index 3ae8a55cfe6..fd9561f4544 100644
--- a/libobjc/misc.c
+++ b/libobjc/misc.c
@@ -28,7 +28,7 @@ Boston, MA 02111-1307, USA. */
#define __USE_FIXED_PROTOTYPES__
#include <stdlib.h>
-#include "runtime.h"
+#include "objc/runtime.h"
/*
** Error handler function
diff --git a/libobjc/nil_method.c b/libobjc/nil_method.c
index d35ccdc92bb..e1802aa107d 100644
--- a/libobjc/nil_method.c
+++ b/libobjc/nil_method.c
@@ -27,7 +27,7 @@ Boston, MA 02111-1307, USA. */
/* This is the nil method, the function that is called when the receiver
of a method is nil */
-#include "runtime.h"
+#include "objc/runtime.h"
/* When the receiver of a method invocation is nil, the runtime
returns nil_method() as the method implementation. This function
diff --git a/libobjc/objc/NXConstStr.h b/libobjc/objc/NXConstStr.h
index b89720ef5eb..b0f6ea504cd 100644
--- a/libobjc/objc/NXConstStr.h
+++ b/libobjc/objc/NXConstStr.h
@@ -28,7 +28,7 @@ Boston, MA 02111-1307, USA. */
#ifndef __nxconstantstring_INCLUDE_GNU
#define __nxconstantstring_INCLUDE_GNU
-#include <objc/Object.h>
+#include "Object.h"
#ifdef __cplusplus
extern "C" {
diff --git a/libobjc/objc/Object.h b/libobjc/objc/Object.h
index b159b59079d..21552cab47f 100644
--- a/libobjc/objc/Object.h
+++ b/libobjc/objc/Object.h
@@ -27,8 +27,8 @@ Boston, MA 02111-1307, USA. */
#ifndef __object_INCLUDE_GNU
#define __object_INCLUDE_GNU
-#include <objc/objc.h>
-#include <objc/typedstream.h>
+#include "objc.h"
+#include "typedstream.h"
#ifdef __cplusplus
extern "C" {
diff --git a/libobjc/objc/Protocol.h b/libobjc/objc/Protocol.h
index 56af9068298..fa65a2e4cf9 100644
--- a/libobjc/objc/Protocol.h
+++ b/libobjc/objc/Protocol.h
@@ -27,7 +27,7 @@ Boston, MA 02111-1307, USA. */
#ifndef __Protocol_INCLUDE_GNU
#define __Protocol_INCLUDE_GNU
-#include <objc/Object.h>
+#include "Object.h"
#ifdef __cplusplus
extern "C" {
diff --git a/libobjc/objc/encoding.h b/libobjc/objc/encoding.h
index 57cf390fe4b..f09b549f12c 100644
--- a/libobjc/objc/encoding.h
+++ b/libobjc/objc/encoding.h
@@ -29,7 +29,7 @@ Boston, MA 02111-1307, USA. */
#ifndef __encoding_INCLUDE_GNU
#define __encoding_INCLUDE_GNU
-#include <objc/objc-api.h>
+#include "objc-api.h"
#include <ctype.h>
#ifdef __cplusplus
diff --git a/libobjc/objc/hash.h b/libobjc/objc/hash.h
index e3002c4539a..d9f3aee86bb 100644
--- a/libobjc/objc/hash.h
+++ b/libobjc/objc/hash.h
@@ -30,7 +30,7 @@ Boston, MA 02111-1307, USA. */
#include <stddef.h>
#include <string.h>
-#include <objc/objc.h>
+#include "objc.h"
#ifdef __cplusplus
extern "C" {
diff --git a/libobjc/objc/objc-api.h b/libobjc/objc/objc-api.h
index 58df4ea0487..9011ab5d2b3 100644
--- a/libobjc/objc/objc-api.h
+++ b/libobjc/objc/objc-api.h
@@ -27,10 +27,10 @@ Boston, MA 02111-1307, USA. */
#ifndef __objc_api_INCLUDE_GNU
#define __objc_api_INCLUDE_GNU
-#include <objc/objc.h>
-#include <objc/hash.h>
-#include <objc/thr.h>
-#include <objc/objc-decls.h>
+#include "objc.h"
+#include "hash.h"
+#include "thr.h"
+#include "objc-decls.h"
#include <stdio.h>
#include <stdarg.h>
diff --git a/libobjc/objc/runtime.h b/libobjc/objc/runtime.h
index f9612818c44..f4f3746c0bb 100644
--- a/libobjc/objc/runtime.h
+++ b/libobjc/objc/runtime.h
@@ -34,13 +34,13 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include <stddef.h> /* so noone else will get system versions */
#include <assert.h>
-#include <objc/objc.h> /* core data types */
-#include <objc/objc-api.h> /* runtime api functions */
+#include "objc.h" /* core data types */
+#include "objc-api.h" /* runtime api functions */
-#include <objc/thr.h> /* thread and mutex support */
+#include "thr.h" /* thread and mutex support */
-#include <objc/hash.h> /* hash structures */
-#include <objc/objc-list.h> /* linear lists */
+#include "hash.h" /* hash structures */
+#include "objc-list.h" /* linear lists */
#ifdef __cplusplus
extern "C" {
diff --git a/libobjc/objc/sarray.h b/libobjc/objc/sarray.h
index 4965839b3a7..f19407baa22 100644
--- a/libobjc/objc/sarray.h
+++ b/libobjc/objc/sarray.h
@@ -28,7 +28,7 @@ Boston, MA 02111-1307, USA. */
#ifndef __sarray_INCLUDE_GNU
#define __sarray_INCLUDE_GNU
-#include <objc/thr.h>
+#include "thr.h"
#define OBJC_SPARSE2 /* 2-level sparse array */
/* #define OBJC_SPARSE3 */ /* 3-level sparse array */
diff --git a/libobjc/objc/thr.h b/libobjc/objc/thr.h
index 0b77527e1ef..d3d791a6d8f 100644
--- a/libobjc/objc/thr.h
+++ b/libobjc/objc/thr.h
@@ -38,7 +38,7 @@ Boston, MA 02111-1307, USA. */
#ifndef __thread_INCLUDE_GNU
#define __thread_INCLUDE_GNU
-#include <objc/objc.h>
+#include "objc.h"
#ifdef __cplusplus
extern "C" {
diff --git a/libobjc/objc/typedstream.h b/libobjc/objc/typedstream.h
index 0846d172d13..a52aa7e3a97 100644
--- a/libobjc/objc/typedstream.h
+++ b/libobjc/objc/typedstream.h
@@ -27,8 +27,8 @@ Boston, MA 02111-1307, USA. */
#ifndef __typedstream_INCLUDE_GNU
#define __typedstream_INCLUDE_GNU
-#include <objc/objc.h>
-#include <objc/hash.h>
+#include "objc.h"
+#include "hash.h"
#include <stdio.h>
diff --git a/libobjc/objects.c b/libobjc/objects.c
index e4920a650a8..c3732e3a444 100644
--- a/libobjc/objects.c
+++ b/libobjc/objects.c
@@ -25,8 +25,8 @@ Boston, MA 02111-1307, USA. */
covered by the GNU General Public License. */
#include "tconfig.h" /* include defs of bzero for target */
-#include "objc.h"
-#include "runtime.h" /* the kitchen sink */
+#include "objc/objc.h"
+#include "objc/runtime.h" /* the kitchen sink */
#if OBJC_WITH_GC
# include <gc.h>
diff --git a/libobjc/sarray.c b/libobjc/sarray.c
index e7e69a9e8ce..f07097ac209 100644
--- a/libobjc/sarray.c
+++ b/libobjc/sarray.c
@@ -24,8 +24,8 @@ Boston, MA 02111-1307, USA. */
This exception does not however invalidate any other reasons why
the executable file might be covered by the GNU General Public License. */
-#include "sarray.h"
-#include "runtime.h"
+#include "objc/sarray.h"
+#include "objc/runtime.h"
#include <stdio.h>
#include "assert.h"
diff --git a/libobjc/selector.c b/libobjc/selector.c
index ce8acf7ac3a..86673339bfb 100644
--- a/libobjc/selector.c
+++ b/libobjc/selector.c
@@ -23,9 +23,9 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
however invalidate any other reasons why the executable file might be
covered by the GNU General Public License. */
-#include "runtime.h"
-#include "sarray.h"
-#include "encoding.h"
+#include "objc/runtime.h"
+#include "objc/sarray.h"
+#include "objc/encoding.h"
/* Initial selector hash table size. Value doesn't matter much */
#define SELECTOR_HASH_SIZE 128
diff --git a/libobjc/sendmsg.c b/libobjc/sendmsg.c
index f0b5bbb35c2..414af70ed6d 100644
--- a/libobjc/sendmsg.c
+++ b/libobjc/sendmsg.c
@@ -32,9 +32,9 @@ Boston, MA 02111-1307, USA. */
#include "tconfig.h"
#include "coretypes.h"
#include "tm.h"
-#include "runtime.h"
-#include "sarray.h"
-#include "encoding.h"
+#include "objc/runtime.h"
+#include "objc/sarray.h"
+#include "objc/encoding.h"
#include "runtime-info.h"
/* This is how we hack STRUCT_VALUE to be 1 or 0. */
diff --git a/libobjc/thr-dce.c b/libobjc/thr-dce.c
index 8350db2e0bb..166d61f6f21 100644
--- a/libobjc/thr-dce.c
+++ b/libobjc/thr-dce.c
@@ -25,8 +25,8 @@ Boston, MA 02111-1307, USA. */
covered by the GNU General Public License. */
#include <pthread.h>
-#include <thr.h>
-#include "runtime.h"
+#include "objc/thr.h"
+#include "objc/runtime.h"
/* Key structure for maintaining thread specific storage */
static pthread_key_t _objc_thread_storage;
diff --git a/libobjc/thr-decosf1.c b/libobjc/thr-decosf1.c
index cfb2cbc487f..166d61f6f21 100644
--- a/libobjc/thr-decosf1.c
+++ b/libobjc/thr-decosf1.c
@@ -25,8 +25,8 @@ Boston, MA 02111-1307, USA. */
covered by the GNU General Public License. */
#include <pthread.h>
-#include <objc/thr.h>
-#include "runtime.h"
+#include "objc/thr.h"
+#include "objc/runtime.h"
/* Key structure for maintaining thread specific storage */
static pthread_key_t _objc_thread_storage;
diff --git a/libobjc/thr-irix.c b/libobjc/thr-irix.c
index 6eb06ec48ec..9ad55bb3be2 100644
--- a/libobjc/thr-irix.c
+++ b/libobjc/thr-irix.c
@@ -29,8 +29,8 @@ Boston, MA 02111-1307, USA. */
#include <sys/sysmp.h>
#include <sys/prctl.h>
#include <ulocks.h>
-#include <objc/thr.h>
-#include "runtime.h"
+#include "objc/thr.h"
+#include "objc/runtime.h"
/* Key structure for maintaining thread specific storage */
static void * __objc_shared_arena_handle = NULL;
diff --git a/libobjc/thr-mach.c b/libobjc/thr-mach.c
index b0f864d7100..7d70625562e 100644
--- a/libobjc/thr-mach.c
+++ b/libobjc/thr-mach.c
@@ -28,8 +28,8 @@ Boston, MA 02111-1307, USA. */
#include <mach/mach.h>
#include <mach/cthreads.h>
-#include <objc/thr.h>
-#include "runtime.h"
+#include "objc/thr.h"
+#include "objc/runtime.h"
/*
Obtain the maximum thread priority that can set for t. Under the
diff --git a/libobjc/thr-objc.c b/libobjc/thr-objc.c
index d954f937154..25f9762b086 100644
--- a/libobjc/thr-objc.c
+++ b/libobjc/thr-objc.c
@@ -29,8 +29,8 @@ Boston, MA 02111-1307, USA. */
#include "coretypes.h"
#include "tm.h"
#include "defaults.h"
-#include <objc/thr.h>
-#include "runtime.h"
+#include "objc/thr.h"
+#include "objc/runtime.h"
#include <gthr.h>
/* Backend initialization functions */
diff --git a/libobjc/thr-os2.c b/libobjc/thr-os2.c
index d43d225650c..e302006ab19 100644
--- a/libobjc/thr-os2.c
+++ b/libobjc/thr-os2.c
@@ -24,8 +24,8 @@ Boston, MA 02111-1307, USA. */
however invalidate any other reasons why the executable file might be
covered by the GNU General Public License. */
-#include <objc/thr.h>
-#include "runtime.h"
+#include "objc/thr.h"
+#include "objc/runtime.h"
#define INCL_DOSSEMAPHORES
#define INCL_DOSPROCESS
diff --git a/libobjc/thr-posix.c b/libobjc/thr-posix.c
index 710bebf30e6..9871b57691f 100644
--- a/libobjc/thr-posix.c
+++ b/libobjc/thr-posix.c
@@ -26,8 +26,8 @@ Boston, MA 02111-1307, USA. */
however invalidate any other reasons why the executable file might be
covered by the GNU General Public License. */
-#include <objc/thr.h>
-#include "runtime.h"
+#include "objc/thr.h"
+#include "objc/runtime.h"
#include <pthread.h>
/* Key structure for maintaining thread specific storage */
diff --git a/libobjc/thr-pthreads.c b/libobjc/thr-pthreads.c
index c00c6016bff..99321c8e93f 100644
--- a/libobjc/thr-pthreads.c
+++ b/libobjc/thr-pthreads.c
@@ -26,8 +26,8 @@ Boston, MA 02111-1307, USA. */
covered by the GNU General Public License. */
#include <pcthread.h>
-#include <objc/thr.h>
-#include "runtime.h"
+#include "objc/thr.h"
+#include "objc/runtime.h"
/* Key structure for maintaining thread specific storage */
static pthread_key_t _objc_thread_storage;
diff --git a/libobjc/thr-rtems.c b/libobjc/thr-rtems.c
index 8683d769d5c..eab88924056 100644
--- a/libobjc/thr-rtems.c
+++ b/libobjc/thr-rtems.c
@@ -26,8 +26,8 @@ Boston, MA 02111-1307, USA. */
however invalidate any other reasons why the executable file might be
covered by the GNU General Public License. */
-#include <objc/thr.h>
-#include "runtime.h"
+#include "objc/thr.h"
+#include "objc/runtime.h"
/* Thread local storage for a single thread */
static void *thread_local_storage = NULL;
diff --git a/libobjc/thr-single.c b/libobjc/thr-single.c
index 24ab5d7b630..132307448e7 100644
--- a/libobjc/thr-single.c
+++ b/libobjc/thr-single.c
@@ -24,8 +24,8 @@ Boston, MA 02111-1307, USA. */
however invalidate any other reasons why the executable file might be
covered by the GNU General Public License. */
-#include <objc/thr.h>
-#include "runtime.h"
+#include "objc/thr.h"
+#include "objc/runtime.h"
/* Thread local storage for a single thread */
static void *thread_local_storage = NULL;
diff --git a/libobjc/thr-solaris.c b/libobjc/thr-solaris.c
index 447d0c45f9e..d37013b132d 100644
--- a/libobjc/thr-solaris.c
+++ b/libobjc/thr-solaris.c
@@ -25,8 +25,8 @@ Boston, MA 02111-1307, USA. */
however invalidate any other reasons why the executable file might be
covered by the GNU General Public License. */
-#include <objc/thr.h>
-#include "runtime.h"
+#include "objc/thr.h"
+#include "objc/runtime.h"
#include <thread.h>
#include <synch.h>
diff --git a/libobjc/thr-vxworks.c b/libobjc/thr-vxworks.c
index 24ab5d7b630..132307448e7 100644
--- a/libobjc/thr-vxworks.c
+++ b/libobjc/thr-vxworks.c
@@ -24,8 +24,8 @@ Boston, MA 02111-1307, USA. */
however invalidate any other reasons why the executable file might be
covered by the GNU General Public License. */
-#include <objc/thr.h>
-#include "runtime.h"
+#include "objc/thr.h"
+#include "objc/runtime.h"
/* Thread local storage for a single thread */
static void *thread_local_storage = NULL;
diff --git a/libobjc/thr-win32.c b/libobjc/thr-win32.c
index 3447a02d65a..065242ce8ff 100644
--- a/libobjc/thr-win32.c
+++ b/libobjc/thr-win32.c
@@ -24,8 +24,8 @@ Boston, MA 02111-1307, USA. */
however invalidate any other reasons why the executable file might be
covered by the GNU General Public License. */
-#include <objc/thr.h>
-#include "runtime.h"
+#include "objc/thr.h"
+#include "objc/runtime.h"
#ifndef __OBJC__
#define __OBJC__
diff --git a/libobjc/thr.c b/libobjc/thr.c
index 7420cfaf2d0..91e15d52252 100644
--- a/libobjc/thr.c
+++ b/libobjc/thr.c
@@ -25,7 +25,7 @@ Boston, MA 02111-1307, USA. */
covered by the GNU General Public License. */
#include <stdlib.h>
-#include "runtime.h"
+#include "objc/runtime.h"
/* Global exit status. */
int __objc_thread_exit_status = 0;
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index ff614e30eed..d1f7e03cadc 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,479 @@
+2005-06-15 Paolo Carlini <pcarlini@suse.de>
+
+ * include/tr1/hashtable: Trivial formatting fixes.
+ * include/tr1/unordered_map: Likewise.
+ * include/tr1/unordered_set: Likewise.
+
+2005-06-14 Tom Tromey <tromey@redhat.com>
+
+ PR libgcj/19877:
+ * configure, aclocal.m4: Rebuilt.
+ * Makefile.in, include/Makefile.in, libmath/Makefile.in,
+ libsupc++/Makefile.in, po/Makefile.in, src/Makefile.in,
+ testsuite/Makefile.in: Likewise.
+
+2005-06-08 Benjamin Kosnik <bkoz@redhat.com>
+
+ PR libstdc++/21955
+ * include/std/std_sstream.h (basic_stringbuf::showmanyc): Add.
+ Remove unnecessary this->_M_mode decoration.
+ * include/bits/fstream.tcc: Adjust line spacing.
+ * testsuite/27_io/basic_streambuf/in_avail/char/1.cc: New, test
+ base class behavior.
+ * testsuite/27_io/basic_streambuf/in_avail/wchar_t/1.cc: Same.
+ * testsuite/27_io/basic_stringbuf/in_avail/char/21955.cc: New.
+ * testsuite/27_io/basic_stringbuf/in_avail/char/1.cc: Match
+ filebuf behavior.
+ * testsuite/27_io/basic_stringbuf/in_avail/wchar_t/1.cc: Same.
+ * testsuite/27_io/basic_stringbuf/str/wchar_t/1.cc: Same.
+ * testsuite/27_io/basic_stringbuf/str/char/1.cc: Same.
+ * testsuite/27_io/basic_streambuf/in_avail/char/9701-3.cc: Move...
+ * testsuite/27_io/basic_filebuf/in_avail/char/9701-3.cc: ...here.
+
+2005-06-07 Benjamin Kosnik <bkoz@redhat.com>
+
+ * acinclude.m4 (GLIBCXX_ENABLE_C99): Use C++ compiler for complex
+ tests.
+ * configure: Regenerated.
+
+2005-06-07 Adrian Straetling <straetling@de.ibm.com>
+
+ * config/cpu/s390/atomicity.h: (__exchange_and_add,
+ __atomic_add): Use the builtins for atomic memory operations.
+
+2005-06-06 Paolo Carlini <pcarlini@suse.de>
+
+ PR libstdc++/21770 (cont: __gnu_debug::string)
+ * include/debug/string: Use _Base typedefs for pointer, const_pointer,
+ reference, const_reference, size_type, difference_type.
+ * testsuite/21_strings/basic_string/2.cc: New.
+
+2005-06-06 Paolo Carlini <pcarlini@suse.de>
+
+ PR libstdc++/21770 (cont: debug-mode)
+ * include/debug/deque: Use _Base typedefs for pointer, const_pointer,
+ reference, const_reference.
+ * include/debug/list: Likewise.
+ * include/debug/map.h: Likewise.
+ * include/debug/multimap.h: Likewise.
+ * include/debug/multiset.h: Likewise.
+ * include/debug/set.h: Likewise.
+ * include/debug/vector: Likewise.
+
+2005-06-06 Paolo Carlini <pcarlini@suse.de>
+
+ Port from libstdcxx_so_7-branch:
+ 2004-09-24 Paolo Carlini <pcarlini@suse.de>
+ Jonathan Wakely <redi@gcc.gnu.org>
+
+ * include/bits/stl_list.h (list::list(size_type, value_type,
+ const allocator_type&): Implement according to the letter of the
+ standard, i.e., don't use two overloads, not equivalent in case
+ of non default constructible T.
+ (list::resize(size_type, const value_type&)): Fix the signature:
+ according to the standard the second argument is by value; also,
+ don't use two overloads.
+ * include/bits/list.tcc (list::resize(size_type, const value_type&)):
+ Adjust consistently the signature.
+ * include/bits/stl_deque.h (deque::deque(size_type, value_type,
+ const allocator_type&)): Likewise.
+ (deque::resize(size_type, const value_type&)): Likewise.
+ * include/bits/stl_vector.h (vector::vector(size_type, value_type,
+ const allocator_type&)): Likewise.
+ (vector::resize(size_type, const value_type&)): Likewise.
+ * testsuite/testsuite_hooks.h: Add NonDefaultConstructible test type.
+ * testsuite/23_containers/deque/explicit_instantiation/2.cc: New.
+ * testsuite/23_containers/list/explicit_instantiation/2.cc: New.
+ * testsuite/23_containers/map/explicit_instantiation/2.cc: New.
+ * testsuite/23_containers/multimap/explicit_instantiation/2.cc: New.
+ * testsuite/23_containers/multiset/explicit_instantiation/2.cc: New.
+ * testsuite/23_containers/set/explicit_instantiation/2.cc: New.
+ * testsuite/23_containers/vector/explicit_instantiation/2.cc: New.
+
+ * include/bits/deque.tcc: Minor formatting fix.
+
+2005-06-06 Peter Doerfler <doerfler@techinfo.rwth-aachen.de>
+
+ * include/bits/stl_function.h: ... and another one.
+
+2005-06-06 Peter Doerfler <doerfler@techinfo.rwth-aachen.de>
+
+ * include/bits/stl_function.h: Fix typo in comment.
+
+2005-06-05 Paolo Carlini <pcarlini@suse.de>
+
+ * acinclude.m4 ([GLIBCXX_ENABLE_C99]): Check clog, clogf, clogl
+ too for ac_c99_complex.
+ * configure: Regenerate.
+
+2005-06-03 Paolo Carlini <pcarlini@suse.de>
+
+ PR libstdc++/21770
+ * include/bits/stl_deque.h: Add concept-check. In class _Deque_base
+ rebind _Alloc to _Tp_alloc_type, change _Deque_impl to inherit from
+ the latter and add _M_get_Tp_allocator() which returns it. Use
+ everywhere _M_get_Tp_allocator() instead of get_allocator().
+ * include/bits/deque.tcc: Likewise, use _M_get_Tp_allocator().
+ * include/bits/stl_list.h: Add concept-check. In class _List_base
+ rebind _Alloc to _Tp_alloc_type and add _M_get_Tp_allocator(), which
+ returns the allocator (of type _Node_alloc_type) converted to
+ _Tp_alloc_type. Use everywhere _M_get_Tp_allocator() instead of
+ get_allocator().
+ * include/bits/list.tcc: Likewise, use _M_get_Tp_allocator().
+ * include/bits/stl_vector.h: Add concept-check. In class _Vector_base
+ rebind _Alloc to _Tp_alloc_type, change _Vector_impl to inherit from
+ the latter and add _M_get_Tp_allocator() which returns it. Use
+ everywhere _M_get_Tp_allocator() instead of get_allocator().
+ * include/bits/vector.tcc: Likewise, use _M_get_Tp_allocator().
+ * include/bits/stl_map.h: Add concept-check. Rebind _Alloc to
+ _Pair_alloc_type and use it for _Rb_tree.
+ * include/bits/stl_multimap.h: Likewise.
+ * include/bits/stl_multiset.h: Add concept-check. Rebind _Alloc to
+ _Key_alloc_type and use it for _Rb_tree.
+ * include/bits/stl_set.h: Likewise.
+ * include/bits/basic_string.h: Rebind _Alloc to _CharT_alloc_type and
+ use it for the allocator typedefs.
+ * testsuite/21_strings/basic_string/1.cc: New.
+ * testsuite/23_containers/deque/explicit_instantiation.cc: Move to...
+ * testsuite/23_containers/deque/explicit_instantiation/1.cc: ... here.
+ * testsuite/23_containers/deque/explicit_instantiation/3.cc: New.
+ * testsuite/23_containers/list/explicit_instantiation.cc: Move to...
+ * testsuite/23_containers/list/explicit_instantiation/1.cc: ... here.
+ * testsuite/23_containers/list/explicit_instantiation/3.cc: New.
+ * testsuite/23_containers/map/explicit_instantiation.cc: Move to...
+ * testsuite/23_containers/map/explicit_instantiation/1.cc: ... here.
+ * testsuite/23_containers/map/explicit_instantiation/3.cc: New.
+ * testsuite/23_containers/multimap/explicit_instantiation.cc: Move to...
+ * testsuite/23_containers/multimap/explicit_instantiation/1.cc: .. here.
+ * testsuite/23_containers/multimap/explicit_instantiation/3.cc: New.
+ * testsuite/23_containers/multiset/explicit_instantiation.cc: Move to...
+ * testsuite/23_containers/multiset/explicit_instantiation/1.cc: .. here.
+ * testsuite/23_containers/multiset/explicit_instantiation/3.cc: New.
+ * testsuite/23_containers/set/explicit_instantiation.cc: Move to...
+ * testsuite/23_containers/set/explicit_instantiation/1.cc: .. here.
+ * testsuite/23_containers/set/explicit_instantiation/3.cc: New.
+ * testsuite/23_containers/vector/explicit_instantiation.cc: Move to...
+ * testsuite/23_containers/vector/explicit_instantiation/1.cc: ... here.
+ * testsuite/23_containers/vector/explicit_instantiation/3.cc: New.
+
+2005-06-02 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/21280
+ * testsuite/27_io/ios_base/cons/assign_neg.cc: Adjust expected errors.
+ * testsuite/27_io/ios_base/cons/copy_neg.cc: Likewise.
+
+2005-05-31 Paolo Carlini <pcarlini@suse.de>
+
+ PR libstdc++/20534 (contd)
+ * include/debug/macros.h: Add _GLIBCXX_DEBUG_ABORT, using
+ __gnu_debug::__fancy_abort.
+ * src/debug.cc: Define the latter.
+ * include/debug/debug.h: Use _GLIBCXX_DEBUG_ABORT instead of
+ assert.
+ * config/linker-map.gnu (__gnu_debug::__fancy_abort): Add.
+
+2005-05-30 Paolo Carlini <pcarlini@suse.de>
+
+ * include/std/std_complex.h (log(const complex<_Tp>&)): When
+ _GLIBCXX_USE_C99_COMPLEX, forward to __builtin_clog/clogf/clogl.
+
+2005-05-28 Paolo Carlini <pcarlini@suse.de>
+
+ Revert:
+ 2005-05-18 Paolo Carlini <pcarlini@suse.de>
+ Nathan Myers <ncm@cantrip.org>
+
+ PR libstdc++/19495
+ * include/bits/basic_string.h (_Raw_bytes_alloc): Rebind to
+ size_type instead of char and rename to _Raw_alloc.
+ * include/bits/basic_string.tcc (_Rep::_M_destroy, _Rep::_S_create):
+ Use the above.
+ * src/bitmap_allocator.cc: Add instantiation for size_type.
+ * src/mt_allocator.cc: Likewise.
+ * src/pool_allocator.cc: Likewise.
+ * include/ext/array_allocator.h: Tweak slightly, avoid assuming
+ the existence of an _Array::begin() and size() members.
+ * testsuite/ext/array_allocator/2.cc: Tweak to use an allocator
+ of size_type, instead of char, thus avoiding problems with
+ rebinds, not treated correctly by array_allocator.
+
+2005-05-27 Paolo Carlini <pcarlini@suse.de>
+
+ * docs/html/abi.html: Mention 3.4.0 as the current baseline; add
+ a notice about the configure options.
+
+2005-05-27 Mark Mitchell <mark@codesourcery.com>
+
+ * docs/html/test.html: Mention PCH_CXXFLAGS.
+ * testsuite/lib/libstdc++.exp: Set PCH_CXXFLAGS by probing for an
+ available stcd++.h PCH.
+ * testsuite/libstdc++-dg/normal.exp: Use PCH_CXXFLAGS.
+
+2005-05-27 Theodore Papadopoulo <Theodore.Papadopoulo@sophia.inria.fr>
+
+ * src/misc-inst.cc: Remove unnecessary included files.
+
+2005-05-27 Benjamin Kosnik <bkoz@redhat.com>
+
+ PR libstdc++/21674
+ * include/bits/c++config: Remove extern template use when in debug
+ mode, disable for non-weak systems.
+
+2005-05-27 Benjamin Kosnik <bkoz@redhat.com>
+
+ PR libstdc++/20534
+ * include/debug/debug.h: Forwarding header, that pulls in details
+ only if in debug mode.
+ * include/debug/macros.h: ...transfer all the internal macros here.
+ * include/debug/functions.h: ...transfer all the functions here.
+ * include/debug/safe_iterator.h: Add functions.h, macros.h includes.
+ * include/debug/safe_sequence.h: Same.
+ * include/debug/vector: Tweak.
+ * include/Makefile.am (debug_headers): Add new includes.
+ * include/Makefile.in: Regenerate.
+ * testsuite/17_intro/no_assert_neg.cc: Add.
+
+ * include/ext/hash_set: Add debug mode include.
+ * include/ext/hash_map: Same.
+ * include/debug/hash_map: Fix included files to match actual files.
+ * include/debug/hash_set: Same.
+
+2005-05-26 Paolo Carlini <pcarlini@suse.de>
+
+ PR libstdc++/13943
+ * include/c_std/std_cstdlib.h: Do not open code llabs and lldiv,
+ available when _GLIBCXX_USE_C99 is defined.
+ * testsuite/26_numerics/cstdlib/13943.cc: New.
+
+ * acinclude.m4 ([GLIBCXX_ENABLE_C99]): For completeness, check
+ also strtoll and strtoull for ac_c99_stdlib.
+ * configure: Regenerate.
+
+2005-05-25 Benjamin Kosnik <bkoz@redhat.com>
+
+ * config/linker-map.gnu: Add linkage support for no extern templates.
+ (std::ios_base::_M_call_callbacks): Add.
+ (std::ios_base::_M_dispose_callbacks): Add.
+ (std::locale::facet::_S_get_c_name): Add.
+ (std::__copy_streambufs): Add.
+ * configure.ac (libtool_VERSION): To 6:5:0.
+ * configure: Regenerate.
+ * testsuite/testsuite_abi.cc (check_version): Add GLIBCXX_3.4.5.
+
+2005-05-25 Paolo Carlini <pcarlini@suse.de>
+
+ * include/bits/basic_string.h (_Rep::_M_set_length_and_sharable):
+ Use, consistently, traits_type::assign.
+
+2005-05-25 Paolo Carlini <pcarlini@suse.de>
+
+ * config/cpu/alpha/atomicity.h: Use the builtins for
+ atomic memory operations.
+ * config/cpu/powerpc/atomicity.h: Likewise.
+ * config/cpu/ia64/atomicity.h: Do not include ia64intrin.h.
+
+2005-05-24 Paolo Carlini <pcarlini@suse.de>
+
+ * testsuite/25_algorithms/equal.cc: Move to...
+ * testsuite/25_algorithms/equal: ... here.
+ * testsuite/25_algorithms/lower_bound.cc: Move to...
+ * testsuite/25_algorithms/lower_bound: ... here.
+
+2005-05-24 Paolo Carlini <pcarlini@suse.de>
+
+ Port from libstdcxx_so_7-branch:
+ 2005-20-05 Chris Jefferson <chris@bubblescope.net>
+
+ * testsuite/25_algorithms/heap.cc: Move to...
+ * testsuite/25_algorithms/heap/heap.cc: ...here.
+ * testsuite/25_algorithms/partition.cc: Move to...
+ * testsuite/25_algorithms/partition/partition.cc: ...here.
+
+ 2005-03-29 Christopher Jefferson <chris@bubblescope.net>
+
+ * testsuite/25_algorithms/includes/1.cc: Add tests.
+ * testsuite/25_algorithms/search/1.cc: Likewise.
+ * testsuite/25_algorithms/unique_copy/1.cc: Likewise.
+ * testsuite/25_algorithms/swap_ranges/1.cc: New.
+ * testsuite/25_algorithms/swap_ranges/check_type.cc: New.
+ * testsuite/25_algorithms/rotate.cc: Move to...
+ * testsuite/25_algorithms/rotate/rotate.cc: ... here.
+ * testsuite/25_algorithms/rotate/1.cc: New.
+ * testsuite/25_algorithms/rotate/check_type.cc: New.
+ * testsuite/25_algorithms/search_n/iterator.cc: Fix typo.
+
+ 2005-03-14 Christopher Jefferson <chris@bubblescope.net>
+
+ * include/bits/stl_algo.h (replace_copy, replace_copy_if):
+ Don't assume that __new_value and *__first are convertible to
+ each other.
+
+ * testsuite/25_algorithms/find/1.cc: New.
+ * testsuite/25_algorithms/find/check_type.cc: New.
+ * testsuite/25_algorithms/find_if/1.cc: New.
+ * testsuite/25_algorithms/find_if/check_type.cc: New.
+ * testsuite/25_algorithms/replace/1.cc: New.
+ * testsuite/25_algorithms/replace/check_type.cc: New.
+ * testsuite/25_algorithms/replace_if/1.cc: New.
+ * testsuite/25_algorithms/replace_if/check_type.cc: New.
+ * testsuite/25_algorithms/replace_copy/1.cc: New.
+ * testsuite/25_algorithms/replace_copy/check_type.cc: New.
+ * testsuite/25_algorithms/replace_copy_if/1.cc: New.
+ * testsuite/25_algorithms/replace_copy_if/check_type.cc: New.
+ * testsuite/25_algorithms/remove/1.cc: New.
+ * testsuite/25_algorithms/remove/check_type.cc: New.
+ * testsuite/25_algorithms/remove_if/1.cc: New.
+ * testsuite/25_algorithms/remove_if/check_type.cc: New.
+ * testsuite/25_algorithms/count/1.cc: New.
+ * testsuite/25_algorithms/count/check_type.cc: New.
+ * testsuite/25_algorithms/count_if/1.cc: New.
+ * testsuite/25_algorithms/count_if/check_type.cc: New.
+
+ 2005-02-27 Christopher Jefferson <chris@bubblescope.net>
+ Paolo Carlini <pcarlini@suse.de>
+
+ * testsuite/ext/is_heap/check_type.cc: New.
+
+ 2005-02-27 Paolo Carlini <pcarlini@suse.de>
+
+ * testsuite/ext/is_heap/1.cc: New.
+
+ 2005-02-01 Christopher Jefferson <chris@bubblescope.net>
+
+ * testsuite/ext/median.cc: New.
+ * testsuite/25_algorithms/adjacent_find/1.cc: New.
+ * testsuite/25_algorithms/adjacent_find/check_type.cc: New.
+ * testsuite/25_algorithms/search/1.cc: New.
+ * testsuite/25_algorithms/search/check_type.cc: New.
+ * testsuite/25_algorithms/unique_copy/1.cc: New.
+ * testsuite/25_algorithms/unique_copy/check_type.cc: New.
+ * testsuite/25_algorithms/partial_sort/1.cc: New.
+ * testsuite/25_algorithms/partial_sort/check_type.cc: New.
+ * testsuite/25_algorithms/partial_sort_copy/1.cc: New.
+ * testsuite/25_algorithms/partial_sort_copy/check_type.cc: New.
+ * testsuite/25_algorithms/lower_bound/1.cc: New.
+ * testsuite/25_algorithms/lower_bound/check_type.cc: New.
+ * testsuite/25_algorithms/upper_bound/1.cc: New.
+ * testsuite/25_algorithms/upper_bound/check_type.cc: New.
+ * testsuite/25_algorithms/merge/1.cc: New.
+ * testsuite/25_algorithms/merge/check_type.cc: New.
+ * testsuite/25_algorithms/inplace_merge/1.cc: New.
+ * testsuite/25_algorithms/inplace_merge/check_type.cc: New.
+ * testsuite/25_algorithms/stable_sort/1.cc: New.
+ * testsuite/25_algorithms/stable_sort/check_type.cc: New.
+ * testsuite/25_algorithms/nth_element/1.cc: New.
+ * testsuite/25_algorithms/nth_element/check_type.cc: New.
+ * testsuite/25_algorithms/equal_range/1.cc: New.
+ * testsuite/25_algorithms/equal_range/check_type.cc: New.
+ * testsuite/25_algorithms/binary_search/1.cc: New.
+ * testsuite/25_algorithms/binary_search/check_type.cc: New.
+ * testsuite/25_algorithms/includes/1.cc: New.
+ * testsuite/25_algorithms/includes/check_type.cc: New.
+ * testsuite/25_algorithms/set_union/1.cc: New.
+ * testsuite/25_algorithms/set_union/check_type.cc: New.
+ * testsuite/25_algorithms/set_intersection/1.cc: New.
+ * testsuite/25_algorithms/set_intersection/check_type.cc: New.
+ * testsuite/25_algorithms/set_difference/1.cc: New.
+ * testsuite/25_algorithms/set_difference/check_type.cc: New.
+ * testsuite/25_algorithms/set_symmetric_difference/1.cc: New.
+ * testsuite/25_algorithms/set_symmetric_difference/check_type.cc: New.
+ * testsuite/25_algorithms/min_element/1.cc: New.
+ * testsuite/25_algorithms/min_element/check_type.cc: New.
+ * testsuite/25_algorithms/max_element/1.cc: New.
+ * testsuite/25_algorithms/max_element/check_type.cc: New.
+ * testsuite/25_algorithms/prev_permutation/1.cc: New.
+ * testsuite/25_algorithms/prev_permutation/check_type.cc: New.
+ * testsuite/25_algorithms/next_permutation/1.cc: New.
+ * testsuite/25_algorithms/next_permutation/check_type.cc: New.
+ * testsuite/25_algorithms/find_first_of/1.cc: New.
+ * testsuite/25_algorithms/find_first_of/check_type.cc: New.
+ * testsuite/25_algorithms/find_end/1.cc: New.
+ * testsuite/25_algorithms/find_end/check_type.cc: New.
+ * testsuite/25_algorithms/equal/check_type.cc: Insert iterator type.
+ * testsuite/25_algorithms/lexicographical_compare/check_type.cc:
+ Likewise.
+
+ 2005-01-10 Christopher Jefferson <chris@bubblescope.net>
+
+ * testsuite/25_algorithms/lexicographical_compare/check_type.cc: New.
+ * testsuite/25_algorithms/lexicographical_compare/1.cc: Likewise.
+ * testsuite/25_algorithms/mismatch/check_type.cc: Likewise.
+ * testsuite/25_algorithms/mismatch/1.cc: Likewise.
+ * testsuite/25_algorithms/equal/check_type.cc: New.
+ * testsuite/25_algorithms/equal/1.cc: New.
+
+2005-05-24 Benjamin Kosnik <bkoz@redhat.com>
+
+ * include/bits/allocator.h: Change ___glibcxx_base_allocator to
+ __glibcxx_base_allocator.
+ * config/allocator/bitmap_allocator_base.h: Same.
+ * config/allocator/malloc_allocator_base.h: Same.
+ * config/allocator/mt_allocator_base.h: Same.
+ * config/allocator/new_allocator_base.h: Same.
+ * config/allocator/pool_allocator_base.h: Same.
+
+2005-05-24 Jonathan Wakely <redi@gcc.gnu.org>
+
+ * include/debug/string (class basic_string): Add missing
+ default template arguments; provide typedefs for char
+ and wchar_t.
+ (operator[]): Allow s[s.size()] in debug mode, but not
+ pedantic mode.
+
+2005-05-24 Paolo Carlini <pcarlini@suse.de>
+
+ Port from libstdcxx_so_7-branch:
+ 2005-04-25 Christopher Jefferson <chris@bubblescope.net>
+
+ * include/bits/stl_algo.h (count): Correct concept checks.
+ (search_n) : Likewise.
+ * testsuite/25_algorithms/search_n/check_type.cc: New.
+
+ * testsuite/testsuite_iterators.h
+ (random_access_iterator_wrapper::operator+): Move out of
+ class to external function, and add symmetric version.
+
+ 2005-03-14 Christopher Jefferson <chris@bubblescope.net>
+
+ * testsuite/testsuite_iterators.h (WritableObject::WritableObject):
+ Add const.
+
+ 2005-02-01 Christopher Jefferson <chris@bubblescope.net>
+
+ * testsuite/testsuite_iterators.h (random_access_iterator_wrapper::
+ operator--): Fix typo.
+ (OutputContainer::OutputContainer): Correct zeroing array.
+ (WritableObject::operator==): Fix typo.
+ (WritableObject::operator=): make operator= templated
+ to allow differing types to be assigned.
+ (WritableObject::operator++): Fix checking if iterator is
+ written to multiple times.
+ (random_access_iterator_wrapper::operator+): Add const.
+ (random_access_iterator_wrapper::operator-): Likewise.
+ (random_access_iterator_wrapper::operator[]): Add dereference.
+
+2005-05-23 Jonathan Wakely <redi@gcc.gnu.org>
+
+ * docs/html/debug.html: Explain that _GLIBXX_DEBUG_PEDANTIC
+ had to be defined for pedantic mode in 3.4 and 4.0.0.
+
+2005-05-20 Jan Beulich <jbeulich@novell.com>
+
+ * libmath/stubs.c: Also implement fabsf/fabsl if not present in the
+ system libraries.
+
+2005-05-20 Paolo Carlini <pcarlini@suse.de>
+
+ * include/bits/stl_algo.h (__rotate<_RandomAccessIterator>):
+ Don't qualify __tmp as const, _ValueType is not necessarily
+ Assignable.
+ * include/bits/stl_algobase.h (swap, __iter_swap<false>):
+ Likewise, as an harmless extension.
+
+2005-05-19 Richard Henderson <rth@redhat.com>
+
+ * libsupc++/unwind-cxx.h: Revert gcc_unreachable change.
+
2005-05-19 Jonathan Wakely <redi@gcc.gnu.org>
* include/bits/basic_string.h (operator[]): Allow s[s.size()] in
diff --git a/libstdc++-v3/ChangeLog-1998 b/libstdc++-v3/ChangeLog-1998
new file mode 100644
index 00000000000..2549db48483
--- /dev/null
+++ b/libstdc++-v3/ChangeLog-1998
@@ -0,0 +1,942 @@
+1998-12-31 Benjamin Kosnik <bkoz@lunatic.cygnus.com>
+
+ * bits/fstream.tcc: Add fstream ctor for cin/cout/etc.
+ * bits/std_fstream.h: Ditto.
+ * src/stdstreams.cc: Ditto.
+
+ * math/cpowl.c: Fix header typo with last change.
+
+1998-12-31 Benjamin Kosnik <bkoz@loony.cygnus.com>
+
+ * COPYING: New file (GPL v 2).
+ * LICENSE.STD: Remove.
+ * ./*: Change license.
+
+1998-12-30 Benjamin Kosnik <bkoz@haight.constant.com>
+
+ * bits/std_streambuf.h (std): Remove static on _M_init.
+ * bits/streambuf.tcc (std): Ditto.
+
+ * bits/std_fstream.h: Add changes as discussed with Nathan, including
+ state_type and codecvt_type members, the allocation of an internal
+ buffer, the streamlined codecvt calls, etc.
+
+1998-12-21 Benjamin Kosnik <bkoz@haight.constant.com>
+
+ * bits/std_sstream.h: Tweak.
+ * bits/fstream.tcc: Remove unused stubs.
+ * bits/std_fstream.h: Tweak.
+
+1998-12-17 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * bits/std_streambuf.h: Move _IO_file_flags into basic_filebuf.
+ Remove unused _IO_* members, possibly put into filebuf, which may
+ need them.
+ * bits/std_fstream.h: Add _M_flag.
+ * bits/sbuf_iter.h: Tweak.
+
+ * bits/std_cstdio.h: Add SEEK_SET, SEEK_END, SEEK_CUR.
+ * bits/ios_base.h: Use.
+
+ * src/stdstreams.cc: Modify to reflect standard ctors for
+ filebuf.
+ * src/misc-inst.cc: Ditto.
+
+ * bits/os_raw.h: Wrap in std namespace. Model parameters on
+ underlying C library calls instead of the underlying unix
+ filesystem.
+ * src/os_raw.cc (_S_os_open): Use fopen, and compute a mode
+ string as per p.659.
+ (_S_os_close): Model on fopen.
+ (_S_os_read): Model on fread.
+ (_S_os_write): Model on fwrite.
+ (_S_os_seek): Model on fseek.
+
+ * bits/ios_base.h: Tweak.
+ * bits/std_iosfwd.h: Wrap libio.h include with extern "C".
+ * bits/std_sstream.h: Tweak.
+ * bits/sstream.tcc: Remove old, uncalled code.
+ * bits/std_fstream.h: Major reconstruction.
+ * bits/fstream.tcc: Disable for the time being.
+
+1998-12-11 Benjamin Kosnik <bkoz@haight.constant.com>
+
+ * bits/basic_string.h: Fix insert method.
+ * stl/bits/stl_iterator.h: Remove previous hack.
+ * bits/std_streambuf.h (sbumpc): Correct increment/return oddness.
+ * bits/std_sstream.h: Fix more regressions.
+ * testsuite/27/27stringbuf.C: Add (almost) complete tests.
+
+1998-12-09 Benjamin Kosnik <bkoz@loony.cygnus.com>
+
+ * bits/basic_string.h: Tweak.
+
+ * stl/bits/stl_iterator.h: Specialize iterator_traits for int so
+ that string::append can be instantiated. HACK--checkin
+ basic_string::iterator class.
+
+1998-12-07 Benjamin Kosnik <bkoz@haight.constant.com>
+
+ * bits/std_sstream.h: Tweak.
+ * bits/sstream.tcc: Tweak ctors.
+
+ FIXME invalid friend defs. . WHERE ARE THEY??
+
+ * bits/sbuf_iter.h (istreambuf_iterator::equal): Change to new
+ names for basic_streambuf data members.
+
+ * bits/std_streambuf.h: Add getloc() initialization bits.
+ basic_streambuf(): Initialize with global locale data.
+ imbue(): Set _M_init.
+
+ * bits/std_streambuf.h(seekoff, seekpos): Complete with invalid
+ stream pos == pos_type(off_type(-1)).
+ in_avail(): Complete default implementation.
+ snextc, sbumpc, sputbackc, sungetc, sputc, setg, xsputn,
+ underflow, uflow, xsgetn, showmany, sync: Ditto.
+
+ * bits/std_streambuf.h: _M_snextc_helper(): Remove.
+
+ * bits/streambuf.tcc (sputbackc): Temporarily remove, need to
+ re-populate with in-line member functions that are too big. Add
+ initialization for _M_init.
+
+1998-12-03 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/sstream.tcc: Convert _Allocator to _Alloc. Add typedefs
+ for basic_string and basic_streambuf. Scope _IO_buf_* pointers to
+ streambuf_type.
+
+ * src/stdstreams.cc (std): Disable wchar_t instantiations.
+
+ * bits/c++config.h (_G_DEPRICATED): Add.
+ (_G_USE_WCHAR_T): Add.
+ * bits/std_streambuf.h: Radical reconstruction of basic_streambuf.
+ Take out _Streambuf_base. Put _IO_FILE data member in basic_filebuf.
+ * bits/streambuf.tcc (sputbackc): Remove ctor anti-def, Tweak.
+ * bits/std_fstream.h: Add comment for implementation.
+ * src/streambuf.cc: Remove.
+ * src/Makefile.in: Remove streambuf.lo.
+ * src/misc-inst.cc: Tweak.
+
+1998-12-02 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_sstream.h: Add const_cast to rdbuf returns.
+ * testsuite/27stringstream.C: Modify.
+
+1998-11-25 Benjamin Kosnik <bkoz@haight.constant.com>
+
+ * src/Makefile.in (libstdc___la_OBJECTS): Add streambuf.lo.
+ (libstdc___la_SOURCES): Ditto.
+
+ * bits/streambuf.tcc: Tweak.
+
+ * src/streambuf.cc: New file, add out-of-line definitions for
+ _Streambuf_base.
+
+ * src/misc-inst.cc: Remove _Streambuf_base instantiations.
+ Comment out wchar_t versions of the buffer instantiations, for now.
+
+ * bits/std_streambuf.h: Wrap libio.h include with extern "C".
+ Remove template wrapper around _Streambuf_base.
+ Move IO_* data members into _Streambuf_base.
+ Move _Streambuf_base members into streambuf.tcc.
+
+ * bits/c++config.h (_G_USE_LIBIO): Enable.
+
+1998-11-02 Nathan Myers <ncm@cantrip.org>
+
+ * CHECKLIST: downgrade iterator implementations
+ * DESIGN: fill out notes about unimplemented features
+
+1998-10-31 Nathan Myers <ncm@cantrip.org>
+
+ * CHECKLIST: itemized list of all interfaces, and status of each.
+
+1998-10-30 Nathan Myers <ncm@cantrip.org>
+
+ * RELEASE-NOTES: add notes about optional includes, linking, running
+ * src/Makefile.am: handle header installs properly
+ * src/Makefile.in: regenerate from new src/Makefile.am
+
+1998-10-30 Benjamin Kosnik <bkoz@loony.cygnus.com>
+
+ * bits/basic_string.h: Revert npos pending ciso646.
+ * src/Makefile.am: Revert CXX flags for now.
+ * src/Makefile.in: Ditto.
+
+1998-10-30 Brendan Kehoe <brendan@cygnus.com>
+
+ * bits/std_sstream.h: Re-order ctors to put base before member
+ inits.
+
+1998-10-30 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
+
+ * stl/bits/std_memory.h: Fix typo.
+
+1998-10-30 Nathan Myers <ncm@cantrip.org>
+
+ * src/string[A-Z]+.cc: change back to include "string.cc".
+ * src/Makefile.am: revert filename changes. We need a different
+ way to keep filenames in std/ from confusing Make.
+ * bits/basic_string.h: define _S_max_size right, return it from
+ string::max_size(); churn definition of npos again.
+ * bits/string.tcc: fix _S_frob_size to avoid uint overflow.
+ * bits/ios.cc: remove #ifdef on ios_base locale member initialization
+ * BUGS: clear cruft.
+ * C++STYLE: Touchup for release.
+ * CHECKLIST: Touchup for release.
+ * DESIGN: New file.
+ * LICENSE.STD: Add requirement to retain copyrights and to provide
+ the license with any copies.
+ * README: Update for release.
+ * TODO: Minor touchup for release.
+ * RELEASE-NOTES: prepare for release
+
+1998-10-29 Ulrich Drepper <drepper@cygnus.com>
+
+ * src/string[A-Z]+.cc: Include stdstring.cc, not string.cc.
+
+ * src/Makefile.am (CXXFLAGS): Define _GNU_SOURCE.
+
+ * src/Makefile.am (CXXLINK): New variable. Make sure we don't use
+ CXX to generate the shared object.
+
+ * src/Makefile.am (headers): Remove duplicated char_traits.h.
+
+1998-10-29 Brendan Kehoe <brendan@cygnus.com>
+
+ * bits/basic_string.h (basic_string<>::max_size): Subtract 1, not
+ 2, from npos, solving infinite loop problems.
+
+1998-10-29 18:41 Ulrich Drepper <drepper@cygnus.com>
+
+ * src/Makefile.am: Add rules to install headers.
+
+1998-10-29 Nathan Myers <ncm@cantrip.org>
+
+ * bits/std_ostream.h: Remove #ifdef on operator<< for long double
+ * bits/ostream.tcc: Remove #ifdef on operator<< for long double
+ * shadow/libio.h:
+ * shadow/unistd.h:
+ * shadow/bits/wrap_libio.h:
+ * shadow/bits/wrap_unistd.h: New files.
+
+1998-10-29 Brendan Kehoe <brendan@cygnus.com>
+
+ * bits/ostream.tcc (operator<<): Wrap with #ifdef
+ _G_HAVE_LONG_DOUBLE_IO, to match bits/std_ostream.h.
+
+1998-10-29 Ulrich Drepper <drepper@cygnus.com>
+
+ * src/Makefile.am: Add temporarily rules to make sure misc-inst.cc
+ is not compiled with -fno-implicit-templates in effect.
+
+ * src/Makefile.am (EXTRA_SOURCES): Add string.cc and wstring.cc here.
+ (libstdc___la_SOURCES): Add all the string*.cc and wstring*.cc files.
+ * src/stringADDCS.cc: Wrapper around string.cc to define individual
+ function.
+ * src/stringADDPS.cc: Likewise.
+ * src/stringADDSC.cc: Likewise.
+ * src/stringADDSP.cc: Likewise.
+ * src/stringADDSS.cc: Likewise.
+ * src/stringBIST.cc: Likewise.
+ * src/stringBOST.cc: Likewise.
+ * src/stringCHTR.cc: Likewise.
+ * src/stringEQPS.cc: Likewise.
+ * src/stringEQSP.cc: Likewise.
+ * src/stringEQSS.cc: Likewise.
+ * src/stringEXTRA.cc: Likewise.
+ * src/stringGEPS.cc: Likewise.
+ * src/stringGESP.cc: Likewise.
+ * src/stringGESS.cc: Likewise.
+ * src/stringGETLI.cc: Likewise.
+ * src/stringGTPS.cc: Likewise.
+ * src/stringGTSP.cc: Likewise.
+ * src/stringGTSS.cc: Likewise.
+ * src/stringINSER.cc: Likewise.
+ * src/stringLEPS.cc: Likewise.
+ * src/stringLESP.cc: Likewise.
+ * src/stringLESS.cc: Likewise.
+ * src/stringLTPS.cc: Likewise.
+ * src/stringLTSP.cc: Likewise.
+ * src/stringLTSS.cc: Likewise.
+ * src/stringMAIN.cc: Likewise.
+ * src/stringNEPS.cc: Likewise.
+ * src/stringNESP.cc: Likewise.
+ * src/stringNESS.cc: Likewise.
+ * src/stringSCOPY.cc: Likewise.
+ * src/wstringADDCS.cc: Wrapper around wstring.cc to define individual
+ functions.
+ * src/wstringADDPS.cc: Likewise.
+ * src/wstringADDSC.cc: Likewise.
+ * src/wstringADDSP.cc: Likewise.
+ * src/wstringADDSS.cc: Likewise.
+ * src/wstringBIST.cc: Likewise.
+ * src/wstringBOST.cc: Likewise.
+ * src/wstringCHTR.cc: Likewise.
+ * src/wstringEQPS.cc: Likewise.
+ * src/wstringEQSP.cc: Likewise.
+ * src/wstringEQSS.cc: Likewise.
+ * src/wstringEXTRA.cc: Likewise.
+ * src/wstringGEPS.cc: Likewise.
+ * src/wstringGESP.cc: Likewise.
+ * src/wstringGESS.cc: Likewise.
+ * src/wstringGETLI.cc: Likewise.
+ * src/wstringGTPS.cc: Likewise.
+ * src/wstringGTSP.cc: Likewise.
+ * src/wstringGTSS.cc: Likewise.
+ * src/wstringINSER.cc: Likewise.
+ * src/wstringLEPS.cc: Likewise.
+ * src/wstringLESP.cc: Likewise.
+ * src/wstringLESS.cc: Likewise.
+ * src/wstringLTPS.cc: Likewise.
+ * src/wstringLTSP.cc: Likewise.
+ * src/wstringLTSS.cc: Likewise.
+ * src/wstringMAIN.cc: Likewise.
+ * src/wstringNEPS.cc: Likewise.
+ * src/wstringNESP.cc: Likewise.
+ * src/wstringNESS.cc: Likewise.
+ * src/wstringSCOPY.cc: Likewise.
+ * src/string.cc: Remove now unneeded #defines now.
+
+1998-10-29 Nathan Myers <ncm@cantrip.org>
+
+ * bits/locfacets.tcc: Define num_put::put(... const void*), improve
+ integer formatting.
+ * bits/ostream.tcc: Delete cruft, rewrite various op<< as members,
+ add definitions for double, long double, const void*.
+ * bits/std_ostream.h: Move op<<'s back into class ostream,
+ define some in-line.
+ * bits/string.tcc: fix unnecessary-copying bug in op[], typos in
+ string construction from input iterators that Brendan reported.
+
+
+1998-10-28 Brendan Kehoe <brendan@cygnus.com>
+
+ * stl/bits/stl_pair.h (op!=, op>, p<=, op>=): Add missing definitions.
+
+ * bits/valarray_meta.h (class _Constant): Move declaration to the
+ top, so the rest of the file can grok it.
+ (_ApplyBinaryFunction::operator[]): Add missing parenthesis.
+
+ * bits/std_sstream.h (basic_ostringstream::str): Fix typo of extra
+ semicolon.
+ (basic_stringstream::str, both instances): Likewise.
+
+1998-10-28 Nathan Myers <ncm@cantrip.org>
+
+ * bits/locfacets.h: fix num_put<>::falsename()
+ * bits/locfacets.tcc: fix _Format_cache<>::_M_populate bool name init
+ * testsuite/27/27octfmt.C, testsuite/27/27octfmt.C: new tests
+ * bits/locfacets.tcc: touch up _S_group_digits.
+ * src/misc-inst.cc: adjust _S_group_digits insts to match.
+
+1998-10-27 Nathan Myers <ncm@cantrip.org>
+
+ * stl/bits/stl_config.h: Turn off long long support, for now.
+ * src/locale-inst.cc: Instantiate num_put<> only for
+ ostreambuf_iterator, num_get only for istreambuf_iterator.
+ * src/misc-inst.cc: Delete duplicate locale-related instantiations,
+ add lots of new instantiations for num_put support function templates;
+ remove junk about __match_parallel for ostreambuf_iterator.
+
+1998-10-27 Nathan Myers <ncm@cantrip.org>
+
+ * bits/locfacets.tcc: Make num_put's digit grouping work.
+ * bits/string.tcc: More uglification.
+ * src/ios.cc: initialize format cache right
+
+1998-10-26 Nathan Myers <ncm@cantrip.org>
+
+ * bits/basic_string.h: Uglify more names.
+ * bits/fstream.tcc: Rewrite some filebut output handling.
+ * bits/ios_base.h: Cosmetic.
+ * bits/locfacets.h: Changes to _Format_cache for support of num_put.
+ Also, specialize its default ctor for optimal default case.
+ #ifdef out "long long" prototypes for now.
+ * bits/locfacets.tcc: Do complete, optimized num_put<>::do_put
+ implementation for integer types. (Still needs optimized
+ std::copy() applied to ostreambuf_iterator to be optimal.)
+ * bits/ostream.tcc: Write operator<< for long, bool types.
+ Make other operators<< non-members, per spec. (Many still
+ not implemented.) Identify those that fail to create a sentry.
+ * bits/sbuf_iter: Cosmetic.
+ * bits/std_fstream.h: Add some filebuf members.
+ * bits/std_locale.h: Include <limits> for use in bits/locfacets.h
+ * bits/std_ostream.h: Make member operators<< global, per spec.
+ (Should do the same in std_istream.h.)
+ * bits/std_string.h: Include <limits> for use in bits/locfacets.h
+ * bits/string.tcc: Uglify names
+ * shadow/bits/std_cstdlib.h: Optimize std::div and std::ldiv.
+ * src/ios.cc: Specialize _Format_cache<> for char and wchar_t,
+ for optimal default behavior.
+
+1998-10-26 Benjamin Kosnik <bkoz@loony.cygnus.com>
+
+ * src/Makefile.in (libstdc___la_SOURCES): Add misc-inst.cc again.
+
+1998-10-21 Nathan Myers <ncm@cantrip.org>
+
+ * src/locale.cc: make ctype operations actually work for glibc
+ * CHECKLIST: add a comprehensive (i.e. huge) implementation
+ checklist of stdlib facilities. Not filled in yet.
+
+1998-10-20 Nathan Myers <ncm@cantrip.org>
+
+ * bits/string.tcc: fix patching NULs on string ends.
+
+1998-10-19 Nathan Myers <ncm@cantrip.org>
+
+ * bits/std_iosfwd.h: eliminate "basic_" prefix on streambuf
+ iterator forward declarations
+ * bits/sbuf_iter.h: eliminate default template argument definitions
+ on streambuf iterators (rely on <iosfwd> decls).
+ * TODO: add note about lazy facet construction
+ * bits/basic_ios.h: hit operator void* again. This should be the
+ last time we need to touch it.
+ * bits/basic_ios.h: copyfmt now returns *this.
+ * bits/basic_string.h: fix npos again. npos cannot be defined as zero.
+ * bits/basic_string.h: put back overloaded constructors; adjust
+ behavior for default allocator on copy constructor.
+ * bits/char_traits.h: make not_eof return correct type.
+ * bits/loccore.h: remove call to bits/std_stdexcept.h; subincludes
+ cannot be in non-standard headers or we get include loops (bad)
+ * bits/loccore.h: delete ifdef'd out workarounds for old compiler bugs.
+ * bits/loccore.h: add apparatus to support lazy construction of
+ facets.
+ * bits/locfacets.tcc: Uglify names in __match_parallel decl.
+ * bits/std_ios.h: add include of <typeinfo> to get bad_cast for
+ locale use_facet<> failure.
+ * bits/std_locale.h: same.
+ * bits/std_string.h: same.
+ * bits/std_stdexcept.h: change exception member __msg from a
+ reference to a regular object.
+ * bits/string.tcc: add pasting a NUL on the end of strings after
+ each operation. We had already left room for it, but previously
+ plugged it only on a call to c_str(), but the WG changed the
+ requirement when I wasn't looking. (Can't leave them alone for
+ a second without they break something else.)
+ * bits/valarray_meta.h: add Gaby's changes from 981018.
+ * src/locale.cc: add new type _Bad_use_facet to be thrown on
+ failure of use_facet<>().
+ * src/stdexcept.cc: remove pragma, remove bkoz's #if 0,
+ comment out leftover member definitions
+
+1998-10-16 Ulrich Drepper <drepper@cygnus.com>
+
+ * string/Makefile.am: Revert last change.
+ * math/Makefile.am: Likewise.
+
+1998-10-15 Benjamin Kosnik <bkoz@haight.constant.com>
+
+ * bits/std_sstream.h: Fix typo.
+
+1998-10-15 Benjamin Kosnik <bkoz@haight.constant.com>
+
+ * src/Makefile.am (libstdc___la_SOURCES): Add misc-inst.cc.
+
+ * bits/std_sstream.h: Add typedefs, member definitions. Clean.
+ * bits/std_stdexcept.h: Remove.
+
+1998-10-15 Benjamin Kosnik <bkoz@haight.constant.com>
+
+ * src/misc-inst.cc: Tweak again.
+
+ * bits/std_sstream.h: Move out-of-line definitions to sstream.tcc.
+ * bits/sstream.tcc: New file.
+
+1998-10-15 Ulrich Drepper <drepper@cygnus.com>
+
+ * configure.in: Test for machine/param.h, sys/machine.h and fp.h.
+ Don't run AC_C_BIGENDIAN if machine/param.h or sys/machine.h are
+ available.
+
+ * math/mathconf.h: Include sys/machine.h, machine/param.h and fp.h
+ if available.
+ (INFINITE_P): Use IS_INF macro if available.
+
+1998-10-15 Ulrich Drepper <drepper@cygnus.com>
+
+ * math/Makefile.am (EXTRA_LTLIBRARIES): Renamed from
+ noinst_LTLIBRARIES.
+ * string/Makefile.am: Likewise.
+
+1998-10-15 Ulrich Drepper <drepper@cygnus.com>
+
+ * configure.in (AC_CHECK_FUNCS): Add finite, qfinite, fpclass, and
+ qfpclass.
+ (AC_CHECK_HEADERS): Add machine/endian.h. If no header specifying
+ endianess is available run AC_C_BIGENDIAN.
+
+ * math/clog10l.c: Add ugly hack around bug in Irix 6.2 header until
+ fixincludes is fixed.
+ * math/clogl.c: Likewise.
+ * math/csqrtl.c: Likewise.
+ * math/mycabsl.c: Likewise.
+
+ * math/mathconf.h: Include machine/endian.h if possible. If no
+ header describing endianess is available rely on WORDS_BIGENDIAN
+ macro.
+ (FINITE_P, FINITEF_P, FINITEL_P): Use finite functino if available.
+ (INFINITE_P, INFINITEF_P, INFINITEL_P): Use fpclass function if
+ available.
+
+ * src/complex.cc (polar): Don't use sincos on OSF machines.
+
+1998-10-09 Benjamin Kosnik <bkoz@loony.cygnus.com>
+
+ * src/locale-inst.cc: Don't instantiate time_get for
+ ostreambuf_iterators as time_get::do_get_weekday and
+ time_get::do_get_monthname use __match_parallel, which is illegal
+ for ostreambuf_iterators to use, as they don't have operator== or
+ operator!=.
+ * bits/std_stdexcept.h: Add dtor definitions.
+ Use stl/bits/std_stdexcept.h instead of this file?
+ * bits/sbuf_iter.h : Tweak.
+ * src/misc-inst.cc: Tweak.
+
+1998-10-09 Benjamin Kosnik <bkoz@haight.constant.com>
+
+ * bits/std_stdexcept.h: New file.
+ * src/stdexcept.cc: Define the following:
+ logic_error::what()
+ runtime_error::what()
+
+ * src/misc-inst.cc: New file.
+ * src/Makefile.in (libstdc___la_SOURCES): Add misc-inst.cc.
+ (libstdc___la_OBJECTS): Add misc-inst.lo.
+
+ * bits/basic_string.h: Disable non-standard ctor declarations.
+ * bits/string.tcc: Disable definitions as well.
+ * src/string.cc: Disable <ios> dependencies.
+ * bits/sbuf_iter.h (std): Add default to template parameter for
+ ostreambuf_iterator and istreambuf_iterator.
+ * bits/std_iosfwd.h: Change istreambuf_iterator to
+ basic_istreambuf_iterator. Likewise for ostreambuf.
+ * bits/locfacets.tcc (__match_parallel): Fix typo.
+ * src/ios.cc (imbue): Remove the _G_HAVE_LOCALE guards around
+ ios_base::imbue.
+ * bits/std_streambuf.h: Define _Streambuf_base::getloc().
+ * bits/std_istream.h: Define the following:
+ get (basic_streambuf<char_type,_Traits>& __sb, char_type __delim)
+ get (char_type* __s, streamsize __n, char_type __delim);
+ getline (char_type* __s, streamsize __n, char_type __delim)
+ * bits/loccore.h : FIXME friend template code for use_facet.
+ Add std_stdexcept.h include so that range_error will be defined.
+ Add explicit conversion to string for range_error throws. (HACK?)
+
+1998-10-8 Ulrich Drepper <drepepr@cygnus.com>
+
+ * configure.in: Check for sincos, sincosf, and sincosl.
+ * src/complex.cc (polar): Use sincos if available.
+
+ * bits/c++config.h: Fix hack to get LONG_LONG* definitions on Linux.
+ * stl/bits/std_limits.h: Include bits/c++config.h. HACK!!!
+
+ * math/clog10.c: Fix typo (FP_INIFITE_P -> INFINITE_P).
+
+ * math/cpow.c: Use c_log, not clog.
+ * math/cpowf.c: Likewise.
+ * math/cpowl.c: Likewise.
+
+ * math/cexp.c: Remove unused fpclassify calls. Use FINITE_P instead
+ of isfinite call.
+
+ * math/mathconf.h (FINITE_P, FINITEF_P, FINITEL_P): Define using
+ isfinite macro if it is available.
+ (INFINITE_P, INFINITEF_P, INFINITEL_P): Define using isinf macro.
+
+ * math/ccosf.c: Use appropriate test macros for this type.
+ * math/ccoshf.c: Likewise.
+ * math/ccoshl.c: Likewise.
+ * math/ccosl.c: Likewise.
+ * math/cexpf.c: Likewise.
+ * math/cexpl.c: Likewise.
+ * math/clog10f.c: Likewise.
+ * math/clog10l.c: Likewise.
+ * math/clogf.c: Likewise.
+ * math/clogl.c: Likewise.
+ * math/csinf.c: Likewise.
+ * math/csinhf.c: Likewise.
+ * math/csinhl.c: Likewise.
+ * math/csinl.c: Likewise.
+ * math/csqrtf.c: Likewise.
+ * math/csqrtl.c: Likewise.
+ * math/ctanf.c: Likewise.
+ * math/ctanhf.c: Likewise.
+ * math/ctanhl.c: Likewise.
+ * math/ctanl.c: Likewise.
+
+1998-10-06 Benjamin Kosnik <bkoz@bliss.nabi.net>
+
+ * bits/basic_ios.h: Fix previous change.
+
+1998-10-06 Benjamin Kosnik <bkoz@bliss.nabi.net>
+
+ * bits/basic_ios.h: Add const_cast<basic_ios&>
+ (operator void*): As per 5.2.9 p 2, make sure static_cast is
+ well-formed.
+ * bits/char_traits.h: No _CharT for specialization, change to 0.
+ * bits/basic_string.h: As per 9.4.2 p4, initialize with
+ constant-initializer.
+ * bits/locfacets.tcc: Add template parameter to initialization list.
+
+1998-10-02 Benjamin Kosnik <bkoz@loony.cygnus.com>
+
+ * bits/basic_string.h: Should just be <, not <=.
+
+1998-10-01 Benjamin Kosnik <bkoz@bliss.nabi.net>
+
+ * bits/string.tcc (compare): Fix for strings that are similar, but
+ not the same length.
+
+1998-09-04 Brendan Kehoe <brendan@cygnus.com>
+
+ * bits/c++config.h: For __linux__, define _GNU_SOURCE. This is
+ required for us to get LONG_LONG_{MIN,MAX} out of gcc's limits.h.
+ We can't check for __GLIBC__ here, since this header can be read
+ before any system one (that would lead to features.h) being used.
+
+ * stl/bits/stl_config.h (__STL_LONG_LONG): Re-enabled
+
+ * stl/bits/std_limits.h [__STL_LONG_LONG]: Fix usage to use
+ LONG_LONG_MIN, LONG_LONG_MAX, and ULONG_LONG_MAX.
+
+ * stl/bits/stl_config.h: Don't do __STL_LONG_LONG, it uses
+ LONGLONG_{MIN,MAX} which I can't find the origin of.
+
+1998-09-03 Brendan Kehoe <brendan@cygnus.com>
+
+ * stl/bits/stl_iterator.h: Add extern decl of cin for now; where
+ should this come from, if not iostream.h?
+ (class istream_iterator): Make the new operator!= a friend also.
+
+ * stl/bits/stl_config.h: Define __STL_HAS_WCHAR_T,
+ __STL_MEMBER_TEMPLATE_CLASSES, and __STL_LONG_LONG. Don't include
+ _G_config.h like the egcs one does.
+
+1998-09-01 Brendan Kehoe <brendan@cygnus.com>
+
+ * bits/string.tcc: Call `_M_destroy' instead of `destroy'.
+
+ * bits/valarray_meta.h: Throughout, rename _Expr typedefs to be
+ _Expr1 (or _Expr_def if it's taken), and change definitions.
+ Avoids redecl of the template parm.
+
+ * bits/string.tcc (basic_string copy ctor): Fix typo in declaration.
+ (operator>>): Initialize __ERROR with ios_base::goodbit, not 0.
+
+ * bits/std_streambuf.h (_POSIX_SOURCE): Only define if it's not
+ already done.
+
+ * src/locale-inst.cc: New file, **TOTAL HACK**. There has GOT to
+ be a better way to do this.
+
+ * src/stlinst.cc: New file.
+
+ * BUGS: New file, with various discovered bugs that need to be
+ fixed.
+
+ * Makefile.in, math/Makefile.in, string/Makefile.in,
+ src/Makefile.in: Reran automake.
+
+ Workarounds, these may not all be the final fixes:
+
+ * bits/basic_ios.h (class basic_ios): Make _M_strbuf be protected,
+ not private, for basic_istream::get() in std_istream.h to be able
+ to use it.
+ (basic_ios::operator void*): Don't use static_cast for the false
+ case.
+ (basic_ios::copyfmt): Fix `rhs.except' to be `rhs.exceptions ()'.
+ This appears to have been in sep94, but didn't get corrected
+ afterwards.
+
+ * bits/basic_string.h (npos): Don't init here.
+ * bits/string.tcc: Instead, do initialization here, to -1 instead
+ of the size_type destructor.
+
+ * src/traits.cc, src/wtraits.cc: New files.
+ * bits/char_traits.h: For char_traits<char> and
+ char_traits<wchar_t>, declare static, but define over in the src
+ files.
+
+ * bits/gslice.h: Comment out forward decls of _Array, valarray,
+ gslice_array, and _GsliceExpression.
+
+ * bits/std_cstdio.h [__sparc__ && __svr4__]: #undef all of
+ clearerr, feof, ferror, getc, getchar, putc, putchar, stdin,
+ stdout, and stderr. Note we do get unresolved refs to stdin, but
+ that'll get fixed by the "true" solution.
+
+ * bits/std_ios.h: Include <bits/std_streambuf.h> to get the
+ definition of basic_streambuf.h, which is used in basic_ios.h to
+ call pubimbue.
+
+ * bits/std_streambuf.h: Don't include libio.h for now.
+ (class basic_streambuf): Define missing methods pubimbue and
+ getloc.
+
+ * src/Makefile.am (libstdc___la_SOURCES): Add stdexcept.cc,
+ ios.cc, os_raw.cc, stdstreams.cc, locale.cc, localename.cc,
+ locale-inst.cc, stlinst.cc, traits.cc, wtraits.cc.
+
+ * src/ios.cc: Instantiate basic_ios<char> and basic_ios<wchar_t>.
+
+ * src/locale.cc: Come up with munged versions of _S_toupper,
+ _S_tolower, and _S_table instead of the glibc-specific ones, so
+ they're at least defined, if not necessarily usable. The glibc
+ ones on any other system will yield unresolved refs to
+ __ctype_{b,toupper,tolower}.
+
+ * src/string.cc: Define all of ADDCS, ADDPS, et al. Add
+ basic_ios, basic_istream, basic_ostream. Don't do char_traits
+ anymore cuz of the explicit specialization in char_traits.h.
+ Also add _S_string_copy, but this doesn't fix it -- cf the BUGS
+ file for the details.
+
+ * stl/bits/stl_algobase.h (equal): Fix to do `! (x==y)'.
+ * stl/bits/stl_iterator.h (__distance): Likewise.
+
+ * stl/bits/stl_iterator.h: As with 8/18 set, define missing op!=,
+ op>, op<=, and op>= for reverse_iterator. Also add op!= for
+ istream_iterator.
+
+1998-08-26 Brendan Kehoe <brendan@cygnus.com>
+
+ * bits/string.tcc (basic_string::compare (const char*)): Fix to
+ return 0, not 1.
+
+1998-08-25 Brendan Kehoe <brendan@cygnus.com>
+
+ This should really be fixed with __asm__ directives renaming the
+ symbol, but keeping the function.
+ * math/clogf.c (c_logf): Renamed from `clogf'.
+ * math/clogl.c (c_logl): Renamed from `clogl'.
+ * math/complex-stub.h (c_logf, c_logl): Change decls.
+
+ * bits/locfacets.h (class _Numeric_get): For friend decls, rename
+ _CharT and _InIter parms, since they duplicate the enclosing ones.
+
+1998-08-19 Brendan Kehoe <brendan@cygnus.com>
+
+ Deal with conflict of the iostreams `clog' and our internal
+ complex number `clog'.
+ * src/complex.cc: Call `c_log' instead of `clog'.
+ * math/clog.c (c_log):: Renamed from clog.
+ * math/complex-stub.h (c_log): Renamed from clog decl.
+
+ * bits/locfacets.h (class _Numeric_get): Tweak fwd decls of the
+ get/put classes.
+ (num_put::put): #if 0 long long version, since we don't declare or
+ define the long long version of do_put.
+
+1998-08-18 Nathan Myers <ncm@cantrip.org>
+
+ * bits/basic_string.h: add basic_string<>::push_back(), fix return
+ type of get_allocator (thanks to Ryszard Kabatek).
+ * bits/char_traits.h: make init order of fpos<> members
+ match decl order.
+ * bits/ios_base.h: fix decls of ios_base bitmask & enum types, add
+ flags _S_fd_in etc. for special filebuf ctor.
+ * bits/locfacets.h: make _Numeric_get and _Format_cache public
+ to work around problems in friend declarations.
+ * bits/locfacets.tcc: qualify _S_get_cache in num_get<>::get(..bool&),
+ fix random type errors & typos
+ * bits/std_fstream.h: major refitting to bypass libio (for now),
+ instrument to use bits/fstream.tcc template definitions
+ * bits/std_iosfwd.h: mess with wrappers
+ * bits/std_istream.h: remove meaningless comment
+ * bits/std_ostream.h: instrument to work with ostream.tcc.
+ * bits/std_streambuf.h: instrument to work with streambuf.tcc
+ * bits/fstream.tcc: template defs for <fstream>
+ * bits/ostream.tcc: template defs for <ostream>
+ * bits/streambuf.tcc: template defs for <streambuf>
+ * bits/os_raw.h: thin OS interface wrapper, to bypass libio (for now).
+ * Delete .cc files, replace with bits/*.tcc
+ src/fstream.cc
+ src/istream.cc
+ src/ostream.cc
+ src/streambuf.cc
+ * Add files:
+ src/os_raw.cc: thin interface to OS, to bypass libio (for now).
+ src/stdstreams.cc: cout, cin, etc. definitions
+ (these still need work: must be init'd before user statics.)
+
+
+1998-08-18 Brendan Kehoe <brendan@cygnus.com>
+
+ Sent to SGI before checkin:
+ * stl/bits/stl_vector.h (operator!=, operator>, operator<=,
+ operator>=): Define.
+ * stl/bits/stl_bvector.h (vector<bool>::flip): Define method.
+ * stl/bits/stl_deque.h (operator!=, operator>, operator<=,
+ operator>=): Define.
+ (operator==, operator<): Add inline.
+ * stl/bits/stl_map.h (operator!=, operator<, operator<=,
+ operator>=): Define.
+ * stl/bits/stl_multimap.h (operator!=, operator<, operator<=,
+ operator>=): Define.
+ * stl/bits/stl_list.h (operator!=, operator<, operator<=,
+ operator>=): Define.
+ * stl/bits/stl_set.h (operator!=, operator<, operator<=,
+ operator>=): Define.
+ * stl/bits/stl_multiset.h (operator!=, operator<, operator<=,
+ operator>=): Define.
+
+ * bits/std_valarray.h (_Shift_left, _Shift_right): Inherit from
+ unary_function.
+
+1998-08-15 Nathan Myers <ncm@cantrip.org>
+
+ * bits/ios_base.h: change nominal bitmask and enum types to real enums
+ * bits/locfacets.h: make _Format_cache bool names usable by num_get
+ * bits/locfacets.tcc: make num_get<>::get(... bool&) use _Format_cache
+ * bits/std_fstream.h: minor cleanups: ctors delegate to open()
+ * bits/std_iosfwd.h: more bitmask changes, for ios_base::iostate
+ * bits/std_sstream.h: formatting cleanups
+
+1998-08-14 Nathan Myers <ncm@cantrip.org>
+
+ * bits/locfacets.tcc: implement num_get<>::do_get(..., bool&)
+ * bits/locfacets.tcc: implement time_get<>::do_get_weekday
+ * bits/locfacets.tcc: implement time_get<>::do_get_monthname
+ * bits/locfacets.h: fix missing argument in do_get_monthname
+ (this is a bug in the standard, ref. 36 in my list.)
+ * bits/locfacets.h: make month and day name caches mutable
+ * bits/locfacets.tcc: various typos in get() functions
+ * bits/sbuf_iter.h: fix omission in istreambuf_iterator::op++().
+ * bits/std_streambuf.h: fix typo in sgetn (Brendan)
+
+1998-08-12 Nathan Myers <ncm@cantrip.org>
+ * move streambuf iterators to bits/sbuf_iter.h
+ * optimize streambuf iterators
+ * begin generalizing streambuf
+ * begin implementing num_get<>::get (starting with bool)
+ * patch stl/bits/stl_config.h so that relops operators are
+ contained properly, out of the way.
+
+1998-07-24 Nathan Myers <ncm@cantrip.org>
+ * Fold in SGI 3.11 changes (uglified names, some algorithm
+ improvements, very minor bug fixes.)
+ * Uglify names elsewhere to match (s/_T/_Tp/).
+ * Begin work on optimized streambuf
+ * Put complex.cc in namespace std:: (thanks Martin)
+
+1998-07-17 Nathan Myers <ncm@cantrip.org>
+
+ * bits/char_traits.h: add _Char_traits_match template.
+ * bits/string.tcc: fix bugs in various find_last* members.
+ * bits/basic_string.h: redeclare member _S_find.
+ * stl/bits/stl_iterator.h: change member names in nonstandard
+ templates bidirectional_reverse_iterator and
+ random_access_reverse_iterator to match expected changes
+ in upstream source.
+ * src/string.cc: fix definitions of stream operators.
+
+1998-07-14 16:06 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.am (SUBDIRS): Add string.
+
+ * configure.in: Test for long double functions separately. Test for
+ ISO C 89 float functions. Test for endian.h and sys/isa_defs.h.
+ Generate string/Makefile.
+
+ * bits/c++config.h: Define mbstate_t for Solaris.
+
+ * bits/char_traits.h: Remove unused #if.
+
+ * bits/std_cwchar.h: Declare wide char string functions.
+
+ * m4/stringfcts.m4: New file.
+
+ * math/complex-stub.h: Declare nan.
+ * math/nan.c: New file.
+
+ * math/mathconf.h: Hack around missing endian.h file.
+ Handle missing NAN definition.
+ Handle missing float math functions.
+
+ * src/Makefile.am (libstdc___la_LIBADD): Add libstring.la.
+ (libstdc___la_LDFLAGS): Set version information.
+
+ * src/complexl.cc: Don't compile any code if no long double functions
+ are available.
+
+ * string/Makefile.am: New file.
+ * string/dummy.c: New file.
+ * string/wmemchr.c: New file.
+ * string/wmemcmp.c: New file.
+ * string/wmemcpy.c: New file.
+ * string/wmemmove.c: New file.
+ * string/wmemset.c: New file.
+
+1998-07-14 10:45 Ulrich Drepper <drepper@cygnus.com>
+
+ * configure.in: Make it work.
+ * install-sh: New file.
+ * missing: New file.
+ * mkinstalldirs: New file.
+ * m4/mathfcts.m4: New file.
+ * math/Makefile.am: New file.
+
+ * bits/std_complex.h (conj): Mark specializations as inline.
+
+ * math/carg.c: New file.
+ * math/cargf.c: New file.
+ * math/cargl.c: New file.
+ * math/mycabs.c: New file.
+ * math/mycabsf.c: New file.
+ * math/mycabsl.c: New file.
+ * math/signbit.c: New file.
+ * math/signbitf.c: New file.
+ * math/signbitl.c: New file.
+
+ * math/ccos.c: Avoid ISO C 9x functionality.
+ * math/ccosf.c: Likewise.
+ * math/ccosh.c: Likewise.
+ * math/ccoshf.c: Likewise.
+ * math/ccoshl.c: Likewise.
+ * math/ccosl.c: Likewise.
+ * math/cexp.c: Likewise.
+ * math/cexpf.c: Likewise.
+ * math/cexpl.c: Likewise.
+ * math/clog.c: Likewise.
+ * math/clog10.c: Likewise.
+ * math/clog10f.c: Likewise.
+ * math/clog10l.c: Likewise.
+ * math/clogf.c: Likewise.
+ * math/clogl.c: Likewise.
+ * math/cpow.c: Likewise.
+ * math/cpowf.c: Likewise.
+ * math/cpowl.c: Likewise.
+ * math/csin.c: Likewise.
+ * math/csinf.c: Likewise.
+ * math/csinh.c: Likewise.
+ * math/csinhf.c: Likewise.
+ * math/csinhl.c: Likewise.
+ * math/csinl.c: Likewise.
+ * math/csqrt.c: Likewise.
+ * math/csqrtf.c: Likewise.
+ * math/csqrtl.c: Likewise.
+ * math/ctan.c: Likewise.
+ * math/ctanf.c: Likewise.
+ * math/ctanh.c: Likewise.
+ * math/ctanhf.c: Likewise.
+ * math/ctanhl.c: Likewise.
+ * math/ctanl.c: Likewise.
+
+ * math/complex-stub.h: New file.
+
+ * math/mathconf.h: New file.
+
+ * src/Makefile.am: New file.
+
+ * src/complex.cc: Use mathconf.h instead of complex.h.
+ Don't use cabs, always use __mycabs.
+
+1998-02-13 Brendan Kehoe <brendan@cygnus.com>
+
+ * iterator (class reverse_iterator): Do some tweaks to be in sync
+ w/ the FDIS.
+
diff --git a/libstdc++-v3/ChangeLog-1999 b/libstdc++-v3/ChangeLog-1999
new file mode 100644
index 00000000000..b0334dcd45d
--- /dev/null
+++ b/libstdc++-v3/ChangeLog-1999
@@ -0,0 +1,3545 @@
+1999-12-26 Phil Edwards <pme@sourceware.cygnus.com>
+
+ * docs/gentop/status: Add snapshot version column, update
+ for Solaris 7.
+ * docs/status.html: Regenerated.
+
+1999-12-26 Phil Edwards <pme@sourceware.cygnus.com>
+
+ * docs/faq/index.html: Turn README and RELEASE-NOTES into links
+ from installation FAQ, and specify location of text files.
+ * docs/faq/index.txt: Regenerated.
+
+1999-12-23 Phil Edwards <pme@sourceware.cygnus.com>
+
+ * docs/gentop/download: Add links to prebuilds for Cygwin/Mingw32.
+ * docs/download.html: Regenerated.
+
+1999-12-22 Phil Edwards <pme@sourceware.cygnus.com>
+
+ * docs/faq/index.html: Update 'what works' for .7 snapshot,
+ clean up various links.
+ * docs/faq/index.txt: Regenerated.
+ * docs/gentop/gentop: Smarter regeneration script.
+ * docs/gentop/{head,foot}chunk.html: Updated with new
+ contributors link and mod date.
+ * docs/gentop/index: Snapshot relase date.
+ * docs/gentop/thanks: New contributors page added.
+ * docs/{download,how,index,links,mail,status,thanks}.html:
+ Regenerated from gentop; thanks.html created.
+
+1999-12-21 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
+
+ * bits/c++config.h.in (__GLIBCPP__): 19991221.
+ * docs/index.html: Add correct information.
+
+ * config/irix: New directory.
+ * config/irix/ctype.cc: Add irix-6.5 info. Not tested.
+ * config/irix/bits/ctype_base.h: And here.
+
+ * config/aix: New directory.
+ * config/aix/ctype.cc: Add aix-4.2 info. Not tested.
+ * config/aix/bits/ctype_base.h: And here.
+
+1999-12-21 Philip Martin <pm@corris.dircon.co.uk>
+
+ * bits/basic_string.h: Add special case handling for integral
+ "iterators".
+ * bits/std_string.h: include type_traits.h
+ * testsuite/21_strings/ctor_copy_dtor.cc: Tweak.
+
+1999-12-21 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
+
+ * bits/fstream.tcc (seekoff): Output buffer based on _M_*_in and
+ _M_*_end now.
+ * bits/std_fstream.h (sync): And here.
+ * testsuite/27_io/filebuf.cc: Revisions.
+ * testsuite/27_io/filebuf-2.tst: Correct, remove weird character
+ at the end of the file.
+ * testsuite/27_io/filebuf-3.tst: Correct.
+
+1999-12-21 Phil Edwards <pedwards@jaj.com>
+
+ * docs/gentop/index: Hold off on .7 announcement date.
+ * docs/index.html: Regenerate.
+
+1999-12-21 Benjamin Kosnik <bkoz@kcygnus.com>
+
+ * bits/std_fstream.h (sync): Move _M_file->sync() to
+ _M_really_overflow().
+ * bits/fstream.tcc (seekoff): Call sync, not _M_really_overflow so
+ as to get the _M_file->sync action, which forces the external
+ buffer to update itself.
+ (underflow): Same here.
+
+1999-12-21 Phil Edwards <pedwards@jaj.com>
+
+ * bits/c++config.h.in: Uncomment _GLIBCPP_USE_NAMESPACES and move...
+ * acconfig.h: ...to here.
+ * config.h.in: Regenerate from aclocal.
+ * acinclude.m4: Add GLIBCPP_ENABLE_DEBUG, GLIBCPP_ENABLE_NAMESPACES.
+ * aclocal.m4: Regenerate from acinclude.
+ * configure.in: Use ENABLE macros here.
+ * configure: Regenerate.
+ * src/Makefile.am: Use results from ENABLE macros.
+ * src/Makefile.in: Regenerate.
+
+1999-12-20 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * mkcheck (SRC_DIR): Now have to include config/* dir if "make
+ check" and not "make check-install." Temporarily hack in linux
+ support.
+
+ * bits/std_streambuf.h: Tweaks.
+ * bits/streambuf.tcc (xsgetn): Tweaks.
+ * bits/std_fstream.h (sync): Make _M_really_overflow consistent.
+ * bits/fstream.tcc (filebuf::underflow): Simplify.
+ * bits/std_sstream.h (streambuf::underflow): Minor change to make
+ checks for read position precisely implement the standard.
+ * bits/basic_file.h (filepos_cur): Base this on _offset.
+ * testsuite/21_strings/inserters_extractors.cc (test05): Tweaks.
+ * testsuite/27_io/filebuf.cc: Tweak.
+
+1999-12-20 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * docs/17_intro/RELEASE-NOTES: Fix typos.
+
+ * bits/locale_facets.h (ctype): Modify, use __to_type to abstract
+ out platform-specific bits.
+ * config/default/ctype.cc: And here.
+ * config/defaults/bits/ctype_base.h: And here.
+ * config/linux/ctype.cc: And here.
+ * config/linux/bits/ctype_base.h (ctype_base): And here.
+ * config/solaris/bits/ctype_base.h (ctype_base): Add
+ __to_type. Comment, as it looks like this is for solaris2.6 and
+ above: solaris2.5.1 doesn't seem to have the same definitions.
+ * config/solaris/ctype.cc: And here.
+
+1999-12-19 Benjamin Kosnik <bkoz@cygnus.com>
+ Ulrich Drepper <drepper@cygnus.com>
+
+ * acconfig.h: Remove _GLIBCPP_USE_CTYPE_ISBIT.
+
+ * src/locale.cc: Take out platform-specific hacks.
+ * config/linux/ctype.cc: Put here.
+ * config/solaris/ctype.cc: Put here.
+ * config/default/ctype.cc: Put here.
+
+ * bits/locale_facets.h: Take out platform-specific hacks.
+ * config/linux/bits/ctype_base.h: Put here.
+ * config/solaris/bits/ctype_base.h: Put here.
+ * config/default/bits/ctype_base.h: Put here.
+
+ * configure.in: Bump version.
+ Add tests for top-level config directory.
+ * configure: Regenerated.
+ * src/Makefile.am (INCLUDES): Add platform-specific dir.
+ * src/Makefile: Regenerate.
+
+1999-12-19 Benjamin Kosnik <bkoz@cygnus.com>
+ Ulrich Drepper <drepper@cygnus.com>
+
+ * bits/locale_facets.h: Hack in solaris support.
+ * src/locale.cc: Here too.
+
+1999-12-18 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * docs/17_intro/TODO: Update
+ * docs/17_intro/RELEASE-NOTES (New): Update.
+
+1999-12-17 Benjamin Kosnik <bkoz@milou.cygnus.com>
+
+ * bits/c++config.h.in (__GLIBCPP__): Bump.
+ * docs/17_intro/RELEASE-NOTES: Update, Gaby please add your stuff.
+ * docs/17_intro/TODO: Update.
+
+ * bits/locale_facets.h: Touch this too.
+ * bits/localefwd.h: Add typedefs for loooooong vector names.
+ * bits/locale_facets.tcc (locale::operator()): Need parens.
+ (has_facet): Simplify.
+ * src/locale-inst.cc: Add instantiations.
+ * src/locale.cc: Tweaks.
+
+ * bits/std_streambuf.h: Move indeterminates into. .
+ * bits/std_fstream.h: Here.
+ * bits/fstream.tcc (underflow): Rewind just for ios_base::out
+ streams.
+ * bits/sstream.tcc: Very minor formatting tweaks.
+ * bits/std_streambuf.h (_M_set_determinate): If exclusively an
+ input buffer, set _M_buf to offset.
+ * bits/istream.tcc (std): Tweaks.
+ * testsuite/27_io/istream_unformatted.cc (test05): More tweaks,
+ include fstream.
+ * testsuite/27_io/filebuf.cc: Tweaks.
+
+1999-12-17 Phil Edwards <pedwards@jaj.com>
+
+ * configure.in: Add OPTLEVEL, -O2 for gcc 2.96+, nothing otherwise.
+ * configure: Regenerate.
+ * src/Makefile.am: Use OPTLEVEL in CXXFLAGS.
+ * src/Makefile.in: Regenerate. Also picks up OTHER_CXXFLAGS rename
+ to OPTIMIZE_CXXFLAGS from a previous revision (1.96) to Makefile.am.
+
+1999-12-17 Phil Edwards <pedwards@jaj.com>
+
+ * docs/21_strings/stringtok_std_h.txt: New algorithm
+ suggested by Chris King.
+ * docs/21_strings/howto.html: Link to new version.
+
+1999-12-16 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/valarray_array.h (__valarray_sum): Use operator+=, not
+ operator+.
+ * docs/17_intro/TODO: Update.
+
+1999-12-15 Phil Edwards <pme@sourceware.cygnus.com>
+
+ * docs/gentop/footchunk.html: Updated, fixed CRLFs.
+ * docs/gentop/gentop: Ditto.
+ * docs/gentop/headchunk.html: Ditto.
+ * docs/*.html: Regenerated from gentop.
+ * docs/*/howto.html: Updated as test.
+ * docs/faq/index.html: Updated, fixed CRLFs.
+ * docs/faq/index.txt: Regenerated.
+
+1999-12-15 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * mknumeric_limits (OUT_C): restart only if $OUT_C is present.
+
+ * bits/std_complex.h
+ (complex<float>::complex(const complex<double>&),
+ complex<float>::complex(const complex<long double>&)): Define.
+
+ * docs/17_intro/TODO: Update.
+
+1999-12-13 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/istream.tcc (seekg): Don't set _M_gcount.
+ (tellg): Same.
+ * bits/fstream.tcc (filebuf::underflow): Re-sync
+ external byte sequence's input buffer only. . .
+ * testsuite/27_io/istream_unformatted.cc (test04): New tests for
+ tellg, seekg and filebufs.
+ (test05): Same for stringbufs.
+ * testsuite/27_io/istream_unformatted-2.tst: New file.
+ * testsuite/27_io/istream_unformatted-1.tst: New file.
+ * testsuite/27_io/istream_unformatted-1.txt: New file.
+ * testsuite/21_strings/inserters_extractors.cc (test05): Change
+ output file.
+
+1999-12-13 Phil Edwards <pedwards@jaj.com>
+
+ * docs/gentop/*: New directory, containing bits for the homepages.
+ * docs/*.html: Regenerated from gentop.
+ * docs/*/*.html: Entries added and regenerated.
+
+1999-12-13 Benjamin Kosnik <bkoz@gnu.org>
+
+ Efforts to get -O2 to work with -Winline -Werrors.
+ * bits/valarray_array.h (__valarray_fill(_Tp*, size_t, const
+ _Tp&): Remove inline declaration, as cannot be inlined and
+ -Winline -Werror complains. An interesting question is why this
+ cannot be inlined, as I can see no real reason to disqualify it.
+ (__valarray_product(const _Tp*, const _Tp*)): Same here.
+ * bits/std_valarray.h (valarray::operator[](size_t)): Same here.
+
+ * docs/17_intro/TODO: Update.
+
+1999-12-12 Benjamin Kosnik <bkoz@gnu.org>
+
+ * bits/std_fstream.h (seekpos): Tweaks, fixes. Move definition to
+ fstream.tcc.
+ * bits/basic_file.h (filepos_cur()): Make pointers themselves be
+ the resultant position.
+ * bits/fstream.tcc (seekoff): Explicitly set return value to
+ resultant external byte sequence position, not value returned from
+ _M_file->seekoff. Need to make
+ (seekpos): New definition.
+
+ * bits/istream.tcc (seekg): As per Library Issues List 136, set to
+ just istream. Necessary, or else tellg will give an invalid stream
+ position, but seekg will return a valid stream position, which is
+ not groovy: see testcase addition.
+ * bits/ostream.tcc (seekp): Same.
+
+ * bits/streambuf.tcc (_S_copy_streambufs): Simplify.
+ * bits/sstream.tcc: Tweaks.
+ * bits/locale_facets.tcc: Tweaks.
+ (num_put::do_put(iter_type, ios_base, char_type, const void*)):
+ Re-write in a way that is easier for the inliner to work with.
+ * bits/ios_base.h: Use explicit static_cast<int>(...) notation.
+
+1999-12-10 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/locale_facets.tcc: Tweaks.
+ * bits/locale_facets.h (use_facet): Can't inline, remove inline
+ from declaration.
+ * bits/localefwd.h: And here.
+ * bits/std_ostream.h: Tweaks, sentry ctor can't be inlined.
+ * bits/ostream.tcc: Put here.
+
+ Frank Ch. Eigler <fche@cygnus.com>
+ * src/Makefile.am: Adjust CXXFLAGS, add AM_CXXFLAGS.
+
+1999-12-08 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/sstream.tcc (stringbuf::seekoff): Long overdue revamp. Make
+ in and out buffers update independently.
+
+ * bits/basic_ios.h: Minor formatting.
+ * bits/fstream.tcc (std): Fix indentation.
+
+1999-12-08 Chip Salzenberg <chip@valinux.com>
+
+ * bits/char_traits.h (char_traits<>): Move not_eof() functions
+ after corresponding eof() functions, so they're easier for the
+ compiler to inline.
+ * bits/locale_facets.h (money_base::__default_pattern): Move
+ static variable out of inline functions.
+ (_Moneypunct<>::do_{pos,neg}_format): Use it.
+ * src/locale-inst.cc (money_base::__default_pattern): Define it.
+
+1999-12-08 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_fstream.h (filebuf::open): Tweak.
+ * bits/fstream.tcc (filebuf::seekoff): Simplify, fix.
+ * bits/std_ios.h: Minor tweaks for headers.
+
+1999-12-06 Benjamin Kosnik <bkoz@gnu.org>
+
+ * bits/c++config.h.in (_GLIBCPP_FULLY_COMPLIANT_HEADERS): New macro.
+ * src/string-inst.cc: Add guards . . .
+ * src/misc-inst.cc: And here.
+ * bits/std_sstream.h: And here.
+ * bits/std_fstream.h: And here.
+ * bits/std_streambuf.h: And here.
+ * bits/std_istream.h: And here.
+ * bits/std_ostream.h: And here.
+
+1999-12-06 Scott Snyder <snyder@fnal.gov>
+
+ * bits/istream.tcc (basic_istream::read): Try to handle __n == 0
+ case.
+ (basic_istream::readsome): And here as well.
+ * testsuite/27_io/istream_unformatted.cc: Test a zero-length
+ read().
+
+1999-12-06 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * bits/istream.tcc (basic_istream::ignore): streamsize is not
+ necessarily an `int'.
+
+1999-12-06 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * mknumeric_limits: Don't use $CXXFLAGS when building
+ gen-num-limits. It's definitely wrong to use it since $CXXFLAGS
+ generally instructs the compiler not to emit template
+ instantiations and we end up with undefined symbols. Sigh.
+
+1999-12-05 Benjamin Kosnik <bkoz@gnu.org>
+
+ * bits/locale_facets.tcc: Tweak.
+ (_S_format_long): Adjust showpos formatting for hex and oct.
+ * bits/std_ostream.h (operator<<(short)): Correctly deal with hex
+ and oct by formatting as unsigned.
+ (operator<<(int)): Same here.
+ * bits/ostream.tcc (operator<<(long)): Same.
+ (operator<<(long long)): Same.
+ (_S_pad_char): Actually treat ios_base::internal as something
+ worth doing correctly. Remove const designation on ios argument.
+ * testsuite/27_io/ios_manip_basefield.cc (test02): Add tests.
+ * testsuite/27_io/ostream_inserter_arith.cc (test03): Add tests.
+
+1999-12-04 Benjamin Kosnik <bkoz@gnu.org>
+
+ * bits/std_sstream.h (streambuf::underflow): Check for mode == in.
+
+1999-12-03 Benjamin Kosnik <bkoz@gnu.org>
+
+ * bits/locale_facets.tcc (num_put::do_put(bool): Fix.
+
+ * bits/sstream.tcc (streambuf::seekoff): Add parens.
+ * bits/istream.tcc (istream::get(sb)): Handle exceptional events.
+ (operator>>(istream, _CharT*)): Change streamsize to int_type.
+ (operator>>(istream, _CharT&)): Fix typedef'd type to be _CharT.
+ * bits/ostream.tcc (ostream::operator<<(const char*)): Stub out
+ unused argument.
+ (ostream::operator<<(_CharT)): Fix.
+
+ * bits/std_sstream.h: Temporarily disable including sstream.tcc to
+ see if this will increase compile speed.
+ * bits/std_ostream.h: Likewise. . .
+ * bits/std_istream.h: And here.
+ * bits/std_fstream.h: And here.
+ * src/misc-inst.cc: Add relevant header file includes for
+ instantiation purposes.
+ * src/string-inst.cc: And here.
+ * testsuite/27_io/ostream_inserter_arith.cc: Add test case.
+
+1999-12-02 Benjamin Kosnik <bkoz@gnu.org>
+
+ * testsuite/27_io/istream_unformatted.cc (test03): Add tests.
+ * bits/istream.tcc (get(streambuf)): More fixes.
+ (istream::ignore): Get specific about numeric_limits<int>::max()
+ requirements.
+
+ * bits/fstream.tcc (filebuf::open): Tweaks for _M_last_overflowed.
+ (filebuf::close): Same.
+ * testsuite/27_io/filebuf.cc: Add tests for ios_base::ate.
+
+1999-12-01 Phil Edwards <pedwards@jaj.com>
+
+ * mkcheck: Support for compilation/execution timing.
+ * testsuite/printnow.c: New file.
+
+1999-12-01 Phil Edwards <pedwards@jaj.com>
+
+ * bits/std_cwchar.h: Test for _GLIBCPP_USE_WCHAR_T.
+ * configure.in: Test for presence of wchar.h before testing
+ for any of its features.
+ * configure: Regenerate.
+
+1999-11-30 Benjamin Kosnik <bkoz@gnu.org>
+
+ Preliminary istream validations complete.
+ * bits/istream.tcc (istream::getline): Fixes. Tweaks to make
+ formatting more consistent. Removal of if-statements inside of for
+ loops.
+ (ignore): Fix.
+ (get): Same.
+ (putback): Same.
+ * bits/std_istream.h: Same.
+ * bits/sstream.tcc (stringbuf::pbackfail): Fix.
+ * testsuite/27_io/stringbuf.cc: Tweak.
+ * testsuite/27_io/istream_unformatted.cc (test02): Mo' tests.
+
+ * bits/ostream.tcc (ostream::operator<<(arith)): Set badbit, not
+ failbit on failure, as per 27.6.2.5.2.
+
+ * stl/bits/std_vector.h: Allow bool specializations. Should move
+ ext/std_bvector to bits, not ext, maybe.
+
+1999-11-30 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * configure.in: Fix checks for mbstate_t and WCHAR_MIN/MAX.
+ * configure: Regenerate.
+
+1999-11-29 Benjamin Kosnik <bkoz@gnu.org>
+
+ * bits/istream.tcc (get(streambuf, char)): Fix.
+ * testsuite/27_io/istream_unformatted.cc (test03): Add tests.
+
+1999-11-29 Scott Snyder <snyder@fnal.gov>
+
+ * bits/basic_string.h (append(const _Char*, size_type)): The
+ length of the appended string is given exactly by the second arg,
+ regardless of the data in the character array.
+ * bits/string.tcc (basic_string(const _CharT*, size_type, const
+ _Alloc&)): Likewise.
+ * testsuite/21_strings/append.cc (test01): Remove erroneous test
+ of basic_string::append.
+
+1999-11-29 Chip Salzenberg <chip@valinux.com>
+
+ * Makefile.in: Tweaks for CXXFLAGS.
+ * */Makefile.in: Same.
+
+1999-11-29 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * conficd bgure.in: Check for wide character support.
+ * bits/c++config.h.in (_GLIBC_USE_WCHAR_T): Move from here ...
+ * acconfig.h (_GLIBC_USE_WCHAR_T): to here.
+ * bits/string.tcc (wstring::_S_find): Guard wchar_t specialization.
+
+1999-11-29 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * acinclude.m4: Fix typo.
+ * src/complex.cc: Fix macro line continuation.
+
+1999-11-29 Petter Urkedal <petter@matfys.lth.se>
+
+ * src/Makefile.am (CXXFLAGS): Add -Wno-format to allow non-
+ string literals in format, as used in locale-facets.tcc.
+
+1999-11-28 Benjamin Kosnik <bkoz@gnu.org>
+
+ * testsuite/27_io/istream_unformatted.cc (test03): Add tests.
+ * bits/istream.tcc (istream::get): Extract to argument minus one.
+ Various tweaks and fixes.
+
+1999-11-22 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * bits/locale_facets.tcc: Workaround for compiler crash on
+ ix86-*-mingw32.
+
+1999-11-21 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * acinclude.m4: New file. New _GLIBCPP_CHECK_FLOAT_SUPPORT macro.
+ * configure.in: Use.
+ * acconfig.h: New _GLIBCPP_BUGGY_FLOAT_COMPLEX macro.
+ * src/complexf.cc: New _GLIBCPP_FLOAT_SPECIALIZATION macro.
+ * bits/std_complex.h: Use.
+ * src/complex.cc: Use.
+
+1999-11-19 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * testsuite/18_support/numeric_limits.cc: Add missing std:: prefix.
+ * testsuite/21_strings/inserters_extractors.cc: Likewise.
+ * testsuite/22_locale/ctype.cc: Likewise.
+ * testsuite/23_containers/multiset.cc: Likewise.
+ * testsuite/23_containers/vector_ctor.cc: Likewise.
+ * testsuite/26_numerics/binary_closure.cc: Likewise.
+ * testsuite/27_io/fpos.cc: Likewise.
+ * testsuite/27_io/ios_base_callbacks.cc: Likewise.
+ * testsuite/27_io/istream_extractor_arith.cc: Likewise.
+ * testsuite/27_io/istream_extractor_char.cc: Likewise.
+ * testsuite/27_io/istream_extractor_other.cc: Likewise.
+ * testsuite/27_io/istream_sentry.cc: Likewise.
+ * testsuite/27_io/ostream_inserter_char.cc: Likewise.
+ * testsuite/27_io/ostream_inserter_other.cc: Likewise.
+ * testsuite/27_io/streambuf.cc: Likewise.
+ * testsuite/27_io/stringstream.cc: Likewise.
+
+1999-11-19 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/valarray_meta.h: Don't forget to define tanh
+
+1999-11-18 Philip Martin <pm@corris.dircon.co.uk>
+
+ * src/stl-inst.cc: Use typedef to refer to iterator
+ * stl/bits/stl_algobase.h: Add traits based dispatch for
+ __normal_iterator in the copy()algorithm
+ * stl/bits/type_traits.h: Add _Is_normal_iterator trait support
+
+1999-11-18 Kevin Ediger <kediger@licor.com>
+
+ * src/locale.cc (locale::_Imp::_Imp): Use auto_ptr to make
+ constructors for locale::_Impl exception safe.
+
+1999-11-18 Scott Snyder <snyder@fnal.gov>
+
+ * stl/bits/stl_queue.h: The C++ standard gives the default for the
+ _Sequence template argument of priority_queue<> as vector<>, not
+ deque<>.
+
+1999-11-18 Benjamin Kosnik <bkoz@gnu.org>
+
+ * bits/std_sstream.h (stringbuf::_M_really_sync): Add __iend as a
+ parameter.
+ * bits/sstream.tcc: Adjust here too.
+
+1999-11-17 Benjamin Kosnik <bkoz@gnu.org>
+
+ * bits/sbuf_iter.h (istreambuf_iter::equal): Tweak.
+ * bits/istream.tcc (operator>>): Replace iostate(0) with
+ iostate(ios_base::goodbit), which is the same thing, but hopefully
+ a bit clearer.
+ * bits/locale_facets.tcc (do_get(bool)): Streamline, deal with
+ libraries issue list 17.
+ (do_gets): Don't set goodbit explicitly, instead only set on
+ failures as good bit is the default setting.
+ * bits/ios_base.h (setf): Set correctly.
+ * bits/fstream.tcc: Tweak.
+ * bits/std_sstream.h (_M_really_sync): Fix ibuffer positioning for
+ in|out bufs that are empty. . .
+ * testsuite/27_io/istream_extractor_arith.cc (test03): Add.
+
+1999-11-16 Benjamin Kosnik <bkoz@gnu.org>
+
+ * testsuite/27_io/streambuf.cc (class testbuf): Don't set _M_buf_size.
+ * bits/std_streambuf.h (setp): Set _M_buf_size, _M_mode.
+ Add comments "all about _M_buf."
+ (setg): Set _M_mode.
+
+1999-11-16 Kevin Ediger <kediger@licor.com>
+
+ * bits/locale_facets.tcc (_S_build_float_format): New function.
+ (_S_output_float): New function.
+ (num_put::do_put(double)): Use 'em.
+ (num_put::do_put(long double)): Use 'em.
+ * testsuite/27_io/ostream_inserter_arith.cc: New file.
+
+1999-11-15 Scott Snyder <snyder@fnal.gov>
+
+ * bits/basic_file.h: Type of __off parm should be __c_streampos, to
+ match how libio is calling us.
+ * src/basic_file.cc (sys_seek): Likewise.
+ * bits/std_fstream.h (basic_filebuf::sync): Restore sync call.
+
+1999-11-15 Benjamin Kosnik <bkoz@gnu.org>
+
+ * docs/17_intro/contribute.html: Add link to assignment form.
+ * docs/17_intro/libstdc++-assign.txt: New file.
+
+ * mkcheck (TESTS_FILE): Move a copy of test files as well as
+ output files.
+
+ * bits/std_streambuf.h (_M_buf_bump): New function.
+ * bits/streambuf.tcc: Mods to support _M_buf_bump.
+ (xsputn): Here. Also add checks for output valid.
+ (xsgetn): Add checks for input valid.
+ (sputc): Here.
+ (sgetc): Set _M_in_end to _M_buf + _M_buf_end.
+ * bits/std_sstream.h (_M_really_sync): Set _M_buf.
+ Set _M_out_end to variable-length-end.
+ * bits/sstream.tcc (overflow): Use _M_buf_bump.
+ (seekpos): Same.
+ (seekoff): Same.
+ * bits/fstream.tcc (std): Tweak formatting.
+ (filebuf::overflow): Simplify.
+ (filebuf::showmanyc): Same.
+ (filebuf::underflow): Same.
+ * testsuite/27_io/filebuf.cc: Fix.
+ * testsuite/27_io/ostream_inserter_other.cc: Fix.
+ * testsuite/27_io/ostream_inserter_other-2.tst: New file.
+ * testsuite/27_io/stringbuf.cc: Tweak.
+ * testsuite/27_io/streambuf.cc: Tweak.
+ * testsuite/27_io/istream_extractor_other.cc: Fix.
+
+1999-11-11 Matthias Klose <doko@cs.tu-berlin.de>
+
+ * stl_deque.h: Use static_casts<size_type>(signed_type).
+
+1999-11-11 Benjamin Kosnik <bkoz@gnu.org>
+
+ Cleanups for callbacks, more regression hunting. Remaining
+ failures (1) due to last unresolved stringstream issues, not
+ regressions per se.
+ * bits/std_fstream.h: Revert. Disable call to _M_file->sync as
+ killing 27_io/filebuf.cc tests. . . need another solution.
+
+ * bits/streambuf.tcc (_S_copy_streambufs): Fix.
+ * testsuite/27_io/istream_extractor_other.cc: Tweak comments.
+
+ * bits/basic_ios.h: Add cached facets here. UGH. The standard
+ foils all attempts at a graceful, minimal implementation.
+ * bits/basic_ios.tcc: Tweaks.
+ * bits/istream.tcc: Fix.
+ * bits/ostream.tcc: Fix.
+ * bits/std_istream.h: Fix.
+ * bits/std_ostream.h: Fix.
+ * src/ios.cc (ios_base::imbue): Set _M_locale_ios before calling
+ callbacks.
+ * bits/locale_facets.tcc (std): Minor, minor formatting tweak.
+ (_S_pad_numeric): Make comprehensible.
+
+1999-11-10 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_ostream.h: Add callbacks for _M_fnumput.
+ (_S_ostream_fcache): New function.
+ Move functions out-of-line.
+ * bits/ostream.tcc: Put here.
+
+ * bits/std_istream.h: Add callbacks for _M_fnumget.
+ (_S_istream_fcache): New function.
+ Move functions out-of-line.
+ * bits/istream.tcc: Put here.
+
+ * bits/basic_ios.tcc (basic_ios::imbue): Tweaks, remove call to
+ _M_call_callbacks(), as ios_base::imbue does this already.
+ * src/ios.cc (register_callback): Clean.
+ (_M_call_callbacks): Same.
+ * bits/ios_base.h: Callback work.
+ * testsuite/27_io/ios_base_callbacks.cc (test01): New file.
+
+1999-11-10 Benjamin Kosnik <bkoz@cygnus.com>
+ Matthias Klose <doko@cs.tu-berlin.de>
+
+ * stl/ext/stl_rope.h: Fix initialization order.
+
+1999-11-09 Scott Snyder <snyder@fnal.gov>
+
+ * bits/std_fstream.h (basic_filebuf::sync): Unconditionally call
+ _M_file->sync() so that redirection works correctly.
+
+1999-11-09 Benjamin Kosnik <bkoz@gnu.org>
+
+ * bits/istream.tcc: Re-order.
+ * bits/std_istream.h: Fix getline problems.
+ * testsuite/27_io/istream_unformatted.cc: New tests.
+
+ Clean up regressions.
+ * bits/std_sstream.h: Set initial stringbufs correctly.
+
+1999-11-09 Scott Snyder <snyder@fnal.gov>
+
+ * stl_vector.h (_M_range_insert): Fix mixing pointers and
+ vector::iterator.
+ * testsuite/23_containers/vector_modifiers.cc (test01): New file,
+ tests.
+
+1999-11-09 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * src/Makefile.am (CXXFLAGS): Add -Winline.
+ * src/Makefile.in: Regenerate.
+
+1999-11-05 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/valarray_meta.h (_DEFINE_EXPR_UNARY_FUNCTION): When
+ building meta-expressions don't forget to take the contained
+ closures.
+
+1999-11-02 Benjamin Kosnik <benjamin@cygnus.com>
+
+ * configure: Regenerate.
+
+1999-11-02 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/valarray_meta.h (_Expr<>::sum): Tweak. Use copy-initialization
+ syntax.
+ * bits/valarray_meta.h (min): Likewise.
+ * bits/valarray_meta.h (max): Likewise.
+
+1999-11-01 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_sstream.h (_M_really_sync): Take into account in | out bufs.
+ * bits/std_streambuf.h (_S_copy_streambufs): New function.
+ * bits/streambuf.tcc: Define.
+ * bits/istream.tcc (istream::operator>>(streambuf)): Rewrite.
+ * bits/ostream.tcc (ostream::operator<<(streambuf)): Rewrite.
+ * testsuite/27_io/ostream_inserter_other.cc: Add tests.
+ * testsuite/27_io/ostream_inserter_other-1.tst: New file.
+
+ * bits/basic_string.h: Explicitly cast npos to unsigned type,
+ reported by Richard Atterer.
+ * bits/char_traits.h: For consistency's sake, here too.
+
+ * configure.in: Bump version to 2.90.7.
+
+1999-10-31 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * testsuite/27_io/ostream_inserter_char-1.tst: Check file output.
+ * testsuite/27_io/ostream_inserter_char.cc (test05, test01): Add tests.
+ * bits/streambuf.tcc (xsputn): Treat--size const char for long loops.
+ (xsgetn): Same.
+ * bits/sstream.tcc (seekpos): Tricks, mostly: check _M_mode before
+ writing into buffer.
+ (seekoff): Same.
+
+1999-10-29 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/valarray_array.h (__valarray_sum): New function.
+ * bits/valarray_array.h (__valarray_product): Same.
+
+ * bits/std_valarray.h (valarray<T>::product): Comment out.
+ * bits/std_valarray.h (valarray<T>::sum): Use __valarray_sum
+ instead of accumulate.
+
+ * src/valarray-inst.cc: Remove explicit intantiation of
+ class multiplies<size_t>, accumulate, valarray<size_t>::product.
+ * src/valarray-inst.cc (__valarray_product): Instantiate
+ explicitly.
+ * src/valarray-inst.cc (__valarray_product(const
+ valarray<size_t>&)): New function.
+ * src/valarray-inst.cc (gslice::_Indexer::_Indexer): Don't use
+ valarray<size_t>::product. Use __valarray_product instead.
+
+
+1999-10-25 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_ostream.h (ostream.inserters.char): Correctly pad output.
+ (_S_pad_char): New function. Not done: ios_base::internal.
+ * bits/ostream.tcc: Clean for above.
+ * bits/locale_facets.tcc (_S_fill): Remove ostreambufiterator
+ specialization that was commented out, as ostreams now have to
+ correctly deal with padding.
+ * testsuite/27_io/ostream_inserter_char.cc (main): Add tests.
+
+ * testsuite/21_strings/ctor_copy_dtor.cc(test02): Add test case
+ from mailing list. This is a bug, and should be fixed.
+ * testsuite/21_strings/inserters_extractors.cc (main): Tweak, fix typo.
+
+1999-10-22 Petter Urkedal <petter@matfys.lth.se>
+
+ * stl/bits/stl_numeric.h (__power): Replaced argument name `__opr'
+ to avoid conflict with gcc name mangling.
+ * stl/bits/stl_algo.h (__transform): Same.
+
+1999-10-21 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/ios_base.h: Change argument names.
+ * docs/17_intro/BADNAMES: Add __opr.
+
+1999-10-20 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
+
+ Work on compilation slowdowns from 10-5 to 10-12, which are
+ related to the _Callback_list inlining/merge-ifcation, which is
+ still a pending issue, but this stuff is necessary cleanup anyway.
+
+ * src/ios.cc: Re-arrange.
+ * bits/ios_base.h: Tweak.
+ * bits/basic_ios.tcc: Move out of line definitions here, move
+ small out-of-line definitions inline.
+ * bits/basic_ios.h: From here.
+
+ * bits/streambuf.tcc (pbackfail, overflow): Move back inline.
+ * bits/std_streambuf.h: From here.
+
+1999-10-19 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * testsuite/27_io/istream_extractor_char.cc: Add tests.
+ * bits/std_istream.h: Tweaks--set eofbit on eof condition.
+ * bits/istream.tcc (operator>>(istream&, string&): Remove
+ vestigial issspace hacks and use ctype::is instead.
+ (getline): Remove unnecessary loops, fortify and pasteurize.
+ (ws): Same.
+
+1999-10-18 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/istream.tcc (operator>>): Tweak.
+ * bits/std_istream.h: Fix according to library issues list 68.
+ Add typedefs.
+
+ * bits/locale_facets.h: Fix table_size to be non-zero.
+
+1999-10-18 Vadim Egorov <egorovv@HotPOP.com>
+
+ * src/basic_file.cc: ifdef instead of comment for binary mode
+
+1999-10-18 Russell Davidson <russell@qed.econ.queensu.ca>
+
+ * bits/std_sstream.h: Stringbuf initialization based on actual,
+ not allocated, size.
+ * testsuite/21_strings/inserters_extractors.cc (test06): Add test
+ case.
+
+1999-10-17 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * testsuite/26_numerics/c_math.cc (test03): Tweak.
+ * testsuite/27_io/istream_manip.cc (test01): Corrections due to
+ sentry change.
+ * testsuite/21_strings/inserters_extractors.cc (test01): Same.
+
+1999-10-14 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_istream.h: Tweaks.
+ * bits/istream.tcc (istream::sentry::sentry()): Simplify, correct
+ as per issues list addition--set failbit, eof on empty buffers.
+ * testsuite/27_io/istream_sentry.cc: New file.
+
+1999-10-12 Chris Prince <prince@wcug.wwu.edu>
+
+ * bits/std_cstdio.h: Remove Solaris hacks.
+
+1999-10-12 Phil Edwards <philip.edwards@sn.wpafb.af.mil>
+
+ * docs/index.html: Fix minor typos and tweaks.
+ * docs/17_intro/contribute.html: Ditto.
+ * docs/*/howto.html: Ditto. More "EGCS"->"GCC" conversion, notes on
+ thread safety and binary I/O, links to external sites.
+ * docs/faq/index.html: EGCS/GCC cleanup, new entries for Cygwin
+ and MT.
+
+1999-10-12 Petter Urkedal <petter@matfys.lth.se>
+
+ * bits/std_cmath.h (abs(float)): When ::absf is not present, call
+ ::fabs(double) rather than ::abs(int).
+
+1999-10-11 Benjamin Kosnik <bkoz@milou.cygnus.com>
+
+ * bits/std_streambuf.h: Fix minor blip--should explicitly return
+ *gptr(), not the result of underflow.
+ (pbackfail): Conform to default behavior.
+ (overflow): Same.
+ * bits/streambuf.tcc: Add out-of-line streambuf members.
+ (xsputn): Tweak.
+ (xsgetn): Tweak.
+ * testsuite/27_io/streambuf.cc: New file.
+ * testsuite/27_io/filebuf.cc: Correct test.
+
+1999-10-08 Benjamin Kosnik <bkoz@haight.constant.com>
+
+ * bits/std_cmath.h: Correctly cast int to double.
+ * testsuite/26_numerics/c_math.cc: Add test.
+
+ * mknumeric_limits (OUT_C): Tweaks.
+ * src/gen-num-limits.cc: Checks for WCHAR_MIN, WCHAR_MAX before
+ trying to instantiate type_traits<wchar_t>.
+ * acconfig.h: Add _GLIBCPP_HAS_WCHAR_MIN_MAX.
+ * configure.in (LIBS): Plus checks for WCHAR_MIN, WCHAR_MAX.
+ * configure: Regenerate.
+
+1999-10-06 Benjamin Kosnik <bkoz@milou.cygnus.com>
+
+ * bits/streambuf.tcc (streambuf::xsgetn): Rewrite.
+ (streambuf::xsputn): Put in break.
+ Aiming for parity between these two (mostly) similar functions.
+ Need to re-write tests.
+
+ * bits/ios_base.h (ios_base::_M_copy_base): Remove declaration.
+ Make data members protected, not private.
+ * src/ios.cc (ios_base::_M_copy_base): Move _Callback_list into
+ ios_base.h. As called only once, collapse into . . .
+ * bits/basic_ios.h (basic_ios::copyfmt): Fix.
+ (basic_ios::clear): Throw ios_base::failure on occasion.
+ (basic_ios::exceptions): Fix.
+ * testsuite/27_io/ios_members.cc (test02): Add tests.
+
+ * bits/fpos.h: Default initialize.
+ * testsuite/27_io/fpos.cc (test03): Add test.
+
+1999-10-04 Russell Davidson <russell@qed.econ.queensu.ca>
+
+ * src/basic_file.cc: Fix open modes.
+
+1999-10-04 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/locale_facets.tcc (num_get<>::do_get): Fix typo.
+
+1999-09-23 Benjamin Kosnik <bkoz@milou.cygnus.com>
+
+ * bits/streambuf.tcc: Yea. Fix this for real.
+ * testsuite/27_io/ostream_inserter_other.cc: Add file.
+ * src/Makefile.*: Regenerate.
+
+1999-09-22 Benjamin Kosnik <bkoz@milou.cygnus.com>
+
+ * bits/std_cstdlib.h: Add more linux-specif hacks to the header
+ files so that stdtof and strtold will be declared. Some hacks
+ already exits in bits/std_cctype.h -- these should all be removed
+ at a later date.
+ * bits/locale_facets.tcc: Add cstring.h include.
+ _S_format_long: Use long, not int.
+ Add std_limits.h include, for numeric_limits.
+ * testsuite/27_io/istream.cc: Make instantiations work when using
+ -fhonor-std.
+ * testsuite/27_io/ostream.cc: Same.
+
+1999-09-21 Benjamin Kosnik <bkoz@milou.cygnus.com>
+
+ * bits/fpos.h (fpos::operator streamoff): Make const, don't return
+ a reference. Same for operators == and !=.
+ * testsuite/27_io/fpos.cc: Add tests.
+
+1999-09-21 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/valarray_array.h: Fix typo.
+
+ * mknumeric_limits: Make sure we are regenerating things from
+ scratch. Otherwise things get redefined. Not good.
+
+1999-09-20 Benjamin Kosnik <bkoz@milou.cygnus.com>
+
+ * bits/std_ostream.h: Fix typo.
+ * bits/std_istream.h: Same.
+ * bits/std_iomanip.h: Same.
+
+ * bits/istream.tcc (sentry::sentry()): Remove optional tie with
+ ostream, as happens with underflow anyway.
+ * testsuite/27_io/istream.cc (main): New file.
+ * testsuite/27_io/ostream.cc (main): New file.
+ * testsuite/27_io/istream_unformatted.cc: Add tests.
+
+ * src/Makefile.am (headers): Add new file.
+ * src/Makefile.in (headers): Regenerated.
+
+ * bits/basic_ios.h: Remove local-related files.
+ * bits/basic_ios.tcc: New file, add locale-related items.
+ * src/misc-inst.cc: Add include of basic_ios.tcc, as a hack for now.
+ * testsuite/27_io/ios_members_static.cc: Change to
+ * testsuite/27_io/ios_base_members_static.cc: This.
+ * testsuite/27_io/ios_members.cc: New file.
+ * testsuite/27_io/stdios_basefield_manip: Change to
+ * testsuite/27_io/ios_manip_basefield.cc: This.
+ * testsuite/27_io/stdios_fmtflags_manip: Change to
+ * testsuite/27_io/ios_manip_fmtflags.cc: This.
+
+ * bits/fpos.h: Fix discarding qualifiers on this when
+ using _M_position with a const fpos.
+ * bits/std_iosfwd.h: Tweak.
+ * testsuite/27_io/fpos.cc: New file.
+
+1999-09-17 Benjamin Kosnik <bkoz@milou.cygnus.com>
+
+ * bits/streambuf.tcc (streambuf::xsputn): Tweak.
+ * bits/ostream.tcc: Tweak.
+ * testsuite/21_strings/inserters_extractors.cc (test04, test05):
+ Add new regressions.
+
+1999-09-16 Benjamin Kosnik <bkoz@milou.cygnus.com>
+
+ * bits/basic_ios.h: Inline, tweak.
+ * bits/fstream.tcc (basic_filebuf::_M_really_overflow): Tweak,
+ pass back accurate return value to basic_filebuf::overflow.
+ * bits/streambuf.tcc (streambuf::xsputn): Fix overflow accounting.
+ This fixes sstream problems reported in libstdc++/9, but screws up
+ filebufs. That solution is pending.
+
+1999-09-15 Vadim Egorov <egorovv@1c.ru>
+
+ * bits/streambuf.tcc (basic_streambuf::xsputn): Add check for
+ zero count puts.
+ * testsuite/21_strings/inserters_extractors.cc (test01): Add test.
+
+1999-09-08 Benjamin Kosnik <bkoz@milou.cygnus.com>
+
+ * bits/c++config.h.in: Add emacs hints.
+
+ * stl/bits/stl_range_errors.h: Don't define here, for now define
+ in stdexcept.cc along with string inlines __length_error, etc.
+ * src/stdexcept.cc: Define here.
+ * stl/bits/stl_config.h (__STL_CAN_THROW_RANGE_ERRORS): Enable, so
+ at(size_t) will be declared/defined.
+ (__STL_THREADS): Fix mess surrounding use of this, enable.
+
+1999-08-31 Benjamin Kosnik <bkoz@milou.cygnus.com>
+
+ * testsuite/27_io/istream_extractor_arith.cc: Fix.
+ * src/localename.cc: Tweak formatting, fix assignment to
+ const compiler errors.
+
+1999-08-25 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * acconfig.h: Add absf, cosf.
+ * configure.in (use_builtin_sinf): Same.
+ * configure: Regenerate.
+ * bits/std_cmath.h: Add mess of defines.
+ * testsuite/26_numerics/modf_float.cc: Change to
+ * testsuite/26_numerics/c_math.cc: This.
+
+ * src/locale.cc: Change.
+ * bits/locale_facets.h: Fix.
+ * testsuite/22_locale/ctype.cc: Add temporary tests.
+
+1999-08-24 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/fpos.h: Test.
+
+ * docs/index.html: Add powerpc-linux-gnu results with gcc-2.95.1.
+ Fix database name for "libstdc++".
+
+1999-08-23 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * mknumeric_limits (numeric_limits): Add default definitions to
+ member functions.
+ * testsuite/18_support/numeric_limits.cc: New file.
+
+1999-08-18 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_istream.h: Correct initialization.
+ * bits/std_ostream.h: Likewise.
+ * bits/std_sstream.h: Likewise.
+ * bits/std_fstream.h: Likewise.
+ * testsuite/27_io/stringstream.cc: Add test case.
+
+ * bits/std_sstream.h: Replace ____string_type with __string_type.
+ * bits/basic_ios.h (basic_ios::rdbuf(sb*): Call clear(), as required.
+ * bits/std_ostream.h: Tweak dtor.
+
+1999-08-17 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
+
+ * src/Makefile.am (CXXFLAGS): Add -O2.
+ * src/Makefile.in: Likewise.
+
+ * src/gen-num-limits.cc: Conditionally allow wchar_t. See what
+ this breaks. . .
+ * mknumeric_limits (numeric_limits): Uglify.
+
+ * bits/std_istream.h: Fix warnings.
+ * bits/locale_facets.tcc: Collateral damage from
+ char_traits<char>::int_type change.
+
+ * testsuite/27_io/istream_extractor_char.cc: Terminate strings.
+
+1999-08-17 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
+
+ * docs/index.html: Add mailing list form.
+ * docs/27_io/howto.html: Add link to iostreams_hierarchy.pdf.
+
+1999-08-16 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/streambuf.tcc (streambuf::xsputn): Allow copies to continue
+ if overflow successfully allocates more space.
+ * bits/std_sstream.h: Adjust comments.
+ * bits/sstream.tcc (stringbuf::overflow): Copy buffer into string
+ before overflow forces a resize.
+ * testsuite/27_io/ostream_inserter_char.cc: New file.
+
+ * bits/std_fstream.h: Remove declaration.
+ * bits/fstream.tcc: Move uflow.
+ * bits/std_streambuf.h: To here.
+ * bits/streambuf.tcc: Make consistent.
+
+ * src/Makefile.am (WERROR): Enable.
+ * src/Makefile.in: Regenerate.
+ * bits/sbuf_iter.h: Tweak.
+ * bits/char_traits.h: (char_traits<wchar_t>::eof): Use WEOF.
+ Use unsigned int as char_traits<char>::int_type.
+
+ * bits/ostream.tcc (ostream::putc(char)): Tweak.
+ * testsuite/27_io/iostream_objects.cc: Terminate string.
+ Move cin::operator>>(char*) test to extractor_char.cc.
+ * testsuite/27_io/stringstream.cc: Add stringstream instantiation.
+ * bits/std_istream.h (basic_iostream): Make explicit definition
+ for default ctor.
+ * bits/std_sstream.h: Fix typos.
+ * bits/fstream.tcc (_M_init_filebuf): Set to indeterminate for
+ basic_filebuf ctor with fileno open arguments. Thus, filebufs are
+ initialized in a consistent manner, no matter if the underlying
+ FILE/bit bucket is a tty or a text file or some other imaginary
+ construct. This and setting _M_buf_size to 1 for cin allows
+ istream::get(char) to work in a manner consistent with what others
+ expect.
+
+ * docs/index.html: Link Stroustrup's C++ page.
+
+1999-08-12 Michael Cook <cook@sightpath.com>
+
+ * bits/fstream.tcc: Fix signed/unsigned -Wall warning.
+ * bits/istream.tcc: ditto.
+ * bits/sbuf_iter.h: ditto.
+ * bits/std_istream.h: ditto.
+ * src/Makefile.am: Add -Wall to CXXFLAGS.
+ * src/Makefile.in: ditto.
+
+1999-08-12 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+ Russell Davidson <russell@ehess.cnrs-mrs.fr>
+
+ * bits/locale_facets.tcc (_M_extract): Finish off patch from yesterday.
+ * src/Makefile.am (myinstallheaders): Tweak, remove PHONY.
+
+1999-08-11 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * testsuite/27_io/istream_unformatted.cc: New file.
+
+ * testsuite/27_io/istream_extractor_arith.cc (test02): Add more
+ elaborate tests for int types with noskipws.
+
+ * testsuite/27_io/istream_extractor_other-1.txt: New file.
+ * testsuite/27_io/istream_extractor_other-1.tst: New file.
+ * testsuite/27_io/istream_extractor_other-2.tst: New file.
+ * testsuite/27_io/istream_extractor_other.cc: Add tests.
+ * bits/istream.tcc: Fix operator>>(streambuf*).
+
+ * testsuite/23_containers/vector_ctor.cc (test01): Add.
+
+ * docs/index.html: Remove references to egcs.
+ * docs/17_intro/DESIGN: Same.
+ * docs/17_intro/contribute.html: Same.
+ * docs/17_intro/RELEASE-NOTES: Ditto.
+ * docs/17_intro/howto.html: Same here.
+
+ Russell Davidson <russell@ehess.cnrs-mrs.fr>
+ * stl/bits/stl_vector.h (_M_insert_aux):
+ * bits/locale_facets.tcc (_M_extract): Tweaks for preliminary
+ decimal/floating point support.
+ * bits/locale_facets.h: Change _M_extract prototype.
+ * bits/char_traits.h (char_traits::to_int_type): Cast to unsigned.
+ * bits/std_istream.h (istream::read(char_type, streamsize)): Fix.
+
+1999-08-10 Michael Cook <cook@sightpath.com>
+
+ * bits/fstream.tcc: Fix for unused variable warning (-Wall).
+ * bits/ios_base.h: ditto.
+ * bits/istream.tcc: ditto.
+ * bits/locale_facets.h: ditto.
+ * bits/locale_facets.tcc: ditto.
+ * bits/std_streambuf.h: ditto.
+ * src/basic_file.cc: ditto.
+ * src/locale.cc: ditto.
+ * src/localename.cc: ditto.
+
+1999-08-10 Kirat Singh <singhki@jany.gs.com>
+
+ * bits/std_iomanip.h: Inline.
+
+1999-08-10 Alfred Minarik <a8601248@unet.univie.ac.at>
+
+ * bits/std_streambuf.h: Correct member initialization order.
+ * src/ios.cc: Add definitions for ios_base data members.
+
+1999-08-06 Phil Edwards <pedwards@ball.com>
+
+ * docs/index.html: Seventh snapshot updates. Minor tweaks.
+ * docs/faq/index.html: Ditto. Removed bugs sections that have
+ been fixed for a long time... Lots of "egcs" references still
+ exist.
+ * docs/faq/index.txt: Regenerated.
+
+1999-08-05 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+ Andreas Amann <amann@physik.tu-berlin.de>
+
+ * testsuite/26_numerics/binary_closure.cc (main): new test.
+
+1999-07-29 Andreas Amann <amann@physik.tu-berlin.de>
+
+ * bits/valarray_meta.h: (_BinClos<>::_Binclos): fix typo causing
+ segmentation fault.
+
+1999-08-04 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
+
+ * docs/index.html (host): Put in testing status.
+
+1999-08-03 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * docs/index.html: Update for libstdc++-2.90.6 release.
+ * docs/17_intro/RELEASE-NOTES (New): Update.
+ * docs/17_intro/BUGS: Update.
+ * bits/c++config.h.in (__GLIBCPP__): Bump version number.
+ * README (file): Update.
+
+1999-08-03 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * src/Makefile.am (generated_headers): Remove bits/c++config.h as
+ a target.
+ ($(generated_headers)): Same.
+ * src/gen-c++config.cc: Remove, rename to
+ * bits/c++config.h.in: New file. Bump version number.
+ * configure.in: Generate bits/c++config.h at configure time.
+ * math/mathconf.h: include bits/c++config.h, not config.h.
+
+ * bits/std_cmath.h: Fix remaining link error for solaris shared
+ builds. _GLIBCPP_HAS_BUILTIN_SINF has to be disabled for the time
+ being, as on Solaris this silently calls sinf, which does not
+ exist.
+
+ * src/complex.cc: More tweaks.
+
+1999-08-03 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * src/complex.cc: Same.
+ * math/complex-stub.h: Change.
+ * math/c_log10*.c: Change back to clog10*.c.
+
+ * configure.in (NEED_C_LOG10): Delete.
+ * configure: Regenerate.
+ * math/Makefile.am: Change.
+
+1999-07-30 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * math/Makefile.am: Fix, for real.
+ * configure.in (use_builtin_sinf): Ok, make autoconf solution.
+ * math/clog.c: Move to c_log.c.
+ * math/clog*: Ditto.
+ * math/c_log10l.c (c_log10l): Change function name.
+ * math/c_log10f.c (c_log10f): Change function name.
+ * math/c_log10.c (c_log10): Change function name.
+
+ * math/complex-stub.h: Change to c_log* variants.
+ * src/complex.cc: And here.
+
+1999-07-29 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * testsuite/27_io/istream_extractor_other.cc: Correct last test.
+ * bits/sstream.tcc (stringbuf::overflow): Don't update the input
+ sequence, just the output sequence.
+ * bits/std_sstream.h (stringbuf::str()): Only in stringbufs return
+ the original string, all others use complicated heuristic.
+
+ * src/complex.cc: Assume c_log10.
+ * math/Makefile.am (EXTRA_yes): Fix c_log/c_logf unresolved
+ symbols in shared libraries by making c_log/c_log10 part of the
+ "must cmpile" sources. This may not work on solaris, must check.
+
+1999-07-29 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/istream.tcc (operator>>(streambuf*)): Re-do.
+ * bits/std_istream.h: Fix char extractors.
+ * testsuite/27_io/istream_extractor_char.cc: Change.
+ * testsuite/27_io/istream_extractor_other.cc: Add tests.
+
+1999-07-28 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_cctype.h: Fix for solaris2.6 builds.
+
+ * bits/istream.tcc: Fix, thanks Alfred.
+ * bits/std_istream.h: Formatting changes.
+
+ * libio/Makefile.am (libio_la_SOURCES): Remove cleanup.c, so that
+ _IO_cleanup will not be undefined.
+ * libio/*: Regenerate.
+
+ * bits/basic_string.h: More namespace-safety stuff.
+ * testsuite/27_io/istream_extractor_char.cc: Fix.
+ * testsuite/27_io/istream_extractor_arith.cc: Fix.
+ * testsuite/27_io/iostream_objects.cc: Fix.
+ * testsuite/27_io/ios_ctor.cc: Fix.
+ * testsuite/27_io/istream_manip.cc: Make namespace safe.
+ * testsuite/27_io/istream_extractor_other.cc: New file.
+
+ * mkcheck (TESTS_FILE): Tweaks.
+
+1999-07-27 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * src/gen-c++config.cc: Note here, change version.
+ * acconfig.h( _GLIBCPP_USE_CTYPE_ISBIT): New macro.
+ * src/locale.cc: Used here.
+ * configure.in (use_builtin_sinf): Check for _ISBit using autoconf.
+
+ * aclocal.m4: Regenerate by running `aclocal -I m4.`
+
+ * bits/istream.tcc: Fix.
+ * bits/std_istream.h: More changes to extractors.
+
+ * testsuite/27_io/istream_extractor_char.cc: More.
+ * testsuite/21_strings/inserters_extractors.cc (test01): Fix logic
+ error in testsuite construction.
+
+ * bits/std_istream.h: Partially revert.
+ * bits/std_ostream.h: Same.
+ * bits/std_sstream.h: Revert.
+
+1999-07-26 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_sstream.h: Change initialization.
+ * bits/std_ostream.h: Make default ctor/assign/operator= private.
+ * bits/std_istream.h: Same, also correct sentry args.
+ * bits/istream.tcc: Add correct sentry args.
+
+ * testsuite/27_io/istream_extractor_char.cc: New file.
+ * testsuite/27_io/istream_extractor_arith.cc: New file, old file,
+ name changes making me dizzy.
+
+1999-07-26 Ulrich Drepper <drepper@happy.cygnus.com>
+ Benjamin Kosnik <bkoz@cygnus.com>
+
+ * aclocal.m4, config.guess, config.sub, ltconfig ltmain.sh: Update
+ to libtool 1.3.3.
+
+1999-07-26 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/std_complex.h: Tweak. Make the primary template class
+ complex work with user-defined numerical types. Provide member
+ definitions. Restructure.
+ (class complex<float>): Uglify. Remove __value(). Rename __val
+ to _M_value. Rename __complex_value_type to _ComplexT. Make it
+ private. Remove dependency on __value(). Fix various explicit
+ specialization syntax. Declare a some functions friend. Now the
+ implementation is nearly comforming.
+ (class complex<double>): Likewise.
+ (class complex<long double>): Likewise.
+
+ * src/complex.cc: Tweak. Remove dependency on complex::__value().
+ (sin, sinh, tan, than): Fix call to corresponding C9x function
+ syntax.
+
+1999-07-24 Benjamin Kosnik <bkoz@fidel.cygnus.com>
+
+ * bits/istream.tcc (ws): Fix error with failbit being set.
+
+ Disabled due to egcs/gcc-2_95 internal compiler errors.
+ * src/Makefile.am (CXXFLAGS): Add -fsquangle -fhonor-std
+ -fnew-exceptions. Compiling with namespaces enabled will now be
+ the default.
+ * mkcheck (CXX_FLAG): Same.
+ * src/gen-c++config.cc (_GLIBCPP_USE_NAMESPACES): Yup. New macro.
+ * bits/std_cctype.h: Not enough to just define in namespace std if
+ ctype-isms are macros. Need to also define in namespace std:: if
+ the C functions are just plain functions.
+
+ * src/gen-num-limits.cc: Fix spelling inconsistencies.
+
+1999-07-24 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * docs/18_support/howto.html: Start documentation. Need to keep
+ track of the ongoing discussion in th LWG reflector.
+
+ * src/gen-num-limits.cc: Tweak.
+ (class predicate): New class.
+ (class value): Likewise.
+ Make the whole machinery more flexible. Add comments.
+
+1999-07-23 Benjamin Kosnik <bkoz@fidel.cygnus.com>
+
+ * bits/ios_base.h: Move state/exception functions into basic_ios.
+ * bits/basic_ios.h: Same.
+ * src/ios.cc: And here. Callbacks don't attempt to reset
+ state now.
+
+ * bits/std_streambuf.h: Separate ios and streambuf locale data
+ members and cached facets. Using this convention: _M_locale_buf for
+ the streambuf-related classes, and _M_locale_ios for the ios
+ hierarchy.
+ * bits/fstream.tcc: And here.
+ * bits/basic_ios.h: And here. Also, add cached ctype.
+ * src/ios.cc: Ditto.
+ * bits/ios_base.h: Ditto.
+ * bits/std_istream.h: Use cached ctype facet.
+ * docs/27_io/iostreams_hierarchy.pdf: Update for new data member
+ arraignment.
+
+ * testsuite/27_io/ios_ctor.cc: New file.
+ * src/ios.cc: Move _M_state init to basic_ios::init().
+ * bits/basic_ios.h: To here.
+
+ Attempt for some consistency in naming for testsuite/27_io/*.cc.
+ * testsuite/27_io/boolfmt.cc: Rename to stdios_fmtflags_manip.cc
+ * testsuite/27_io/octfmt.cc: Rename to stdios_basefield_manip.cc
+ * testsuite/27_io/istream_manip.cc: Rename to istringstream_manip.cc.
+ * testsuite/27_io/ostream_manip.cc: Rename to ostringstream_manip.cc.
+
+1999-07-22 Benjamin Kosnik <bkoz@fidel.cygnus.com>
+
+ * src/ios.cc: Tweak initializations of standard iostream
+ objects to closely match the standard. Tie cin/wcin, set flags on
+ cerr/wcerr
+ * bits/char_traits.h: Change from size_t to int_type, as per
+ standard. As per wide streams.
+ * bits/basic_ios.h: Infect with __ctype_type, as a preparation
+ for caching a bunch of ctype info. For instance, ctype_base::space
+ info needs to be stored somewhere, somehow.
+ * bits/std_istream.h: Also here.
+ * bits/std_ostream.h: Ditto.
+ * bits/std_istream.h (operator>>(istream, char): Aggh. Fixup.
+ * testsuite/27_io/iostream_objects.cacc (test01): Oh yeah. Fix
+ stream states.
+
+ * bits/istream.tcc (ws): Fix.
+ * testsuite/27_io/istream_manip.cc: New file, test ws.
+ * testsuite/27_io/ostream_manip.cc: New file, test endl, ends, flush.
+
+ * bits/basic_string.h: Provide a specialized member function for
+ _S_find<char> using strchr.
+ * src/string-inst.cc: Put specializations here.
+ * bits/string.tcc: Small fix for find, remove typo.
+ * testsuite/21_strings/find.cc (test01): Add tests to catch this
+ find bug. . .
+
+1999-07-20 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
+
+ * bits/basic_ios.h: Put into basic_ios namespace.
+ Tweak widen/narrow.
+
+1999-07-19 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
+
+ * bits/std_sstream.h (stringbuf::sync): Change to _M_really_sync,
+ adjust _M_*_cur pointers inside the function, so callee doesn't
+ have to adjust.
+ * bits/sstream.tcc (stringbuf::overflow): Tweak.
+
+ * mkcheck: Tweak. Add execution time field, even though it is not
+ implemented yet. Simplify pass/fail status notation.
+
+1999-07-18 Mumit Khan <khan@xraylith.wisc.edu>
+
+ * configure.in: Check for float.h and underscored version of
+ math functions.
+ * acconfig.h: Add @BOTTOM@ section for handling underscored
+ math functions.
+ * configure: Regenerate.
+ * config.h.in: Regenerate.
+ * math/mathconf.h (float.h): Include conditionally.
+ (M_PI): Define conditionally.
+ (INFINITE_P): Define for Mingw.
+ * bits/locale_facets.tcc: Workaround for compiler crash on
+ ix86-*-mingw32.
+ * bits/std_cwchar.h (bits/std_cstddef.h): Include.
+ * src/locale.cc (bits/std_istream.h): Include.
+ (bits/std_ostream.h): Likewise.
+
+1999-07-18 Phil Edwards <pedwards@ball.com>
+
+ * docs/faq/index.html: Updated __black_count notes, fixed typos.
+ * docs/faq/index.txt: Regenerated.
+
+1999-07-15 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
+
+ * testsuite/27_io/stringbuf.cc: Cccchanges, latent bugs.
+
+ * bits/sstream.tcc (stringbuf::overflow): Modify accounting of
+ newly-allocated buffer.
+ * bits/streambuf.tcc (streambuf::xsgetn): Aaaaaah. Fix final
+ overflow condition bits.
+
+1999-07-14 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_sstream.h (stringbuf::_M_init_stringbuf): Set
+ _M_buf_size to initial _M_string.size(), even though for
+ ostringstreams it is pretty pointless. It's necessary for
+ istringstreams.
+ (stringbuf::str()): Adjust.
+ (stringbuf::str()): Adjust, call _M_init_stringbuf.
+ * bits/streambuf.tcc (streambuf::xsgetn): Adjust return value for
+ overflow's possible success.
+ (streambuf::xsputn): Adjust.
+
+ * testsuite/27_io/filebuf.cc: Adjust for the xsgetn re-write from
+ yesterday.
+ * testsuite/27_io/stringbuf.cc: Tweak.
+ * testsuite/21_strings/inserters_extractors.cc (test01): Remove
+ notes to myself.
+ * testsuite/23_containers/vector_cons.cc: Rename to be consistent
+ with other constructor tests to. . .
+ * testsuite/23_containers/vector_ctor.cc: New file.
+
+1999-07-14 Alfred Minarik <a8601248@unet.univie.ac.at>
+
+ * testsuite/*: Changes to make the testsuit compilable with
+ -fhonor-std. Contains direct qualification of library names with
+ std::.
+
+1999-07-13 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
+
+ * bits/streambuf.tcc: Tweaks.
+ (streambuf::xsputn): Optimize, fix for sstreams.
+ (streambuf::xsgetn): Same.
+ * bits/sstream.tcc (stringbuf::overflow): Adjust _M_buf_size
+ correctly, handle overflow/reallocate conditions correctly.
+ * bits/std_sstream.h: Fix typo.
+ _M_init_stringbuf(): Fix _M_buf_size initialization.
+ (stringbuf::str()): Construct return string if output has occurred.
+
+ * bits/basic_string.h: Fix typo from yesterday's patch.
+
+1999-07-12 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
+
+ * bits/string.tcc: _M_mutate - clear _M_state again.
+ * bits/basic_string.h: In the three functions that return
+ an iterator set _M_state to -1 before return.
+ Also optimized two cases of operator+.
+
+1999-07-12 Phil Edwards <pedwards@ball.com>
+
+ * docs/index.html: Expand egcs-1.1.2 notes/links.
+ * docs/faq/index.html: And here. Add links to LWG issues-list.
+ * docs/faq/index.txt: Regenerate. (lynx rocks)
+ * docs/21_strings/howto.html: Fix notes on case conversion.
+ * docs/21_strings/stringtok_h.txt: Goodly spelling...
+ * docs/23_containers/howto.html: Stub for bitmasks.
+ * docs/27_io/howto.html: Add section on buffering, stub binary.
+
+1999-07-12 Nathan Myers <ncm@cantrip.org>
+
+ * stl/bits/stl_tree.h (__black_count): Optimize.
+
+1999-07-09 Vadim Egorov <egorovv@1c.ru>
+
+ * src/basic_file.cc: Cleanup in __basic_file destructor.
+
+1999-07-08 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_streambuf.h: Changes. . .
+ * bits/streambuf.tcc: Merge xsputn from filebuf into xsputn in
+ basic_streambuf, to be used for both filebufs and streambufs.
+ * bits/std_fstream.h (_M_init_filebuf): New function.
+ Take out specialized xsputn, put into basic_streambuf.
+ * bits/fstream.tcc: Define, call from both ctors.
+ * bits/std_sstream.h (_M_init_stringbuf): New function.
+ * bits/sstream.tcc: Tweak.
+
+ * docs/27_io/iostreams_hierarchy.pdf: New file.
+
+ * docs/17_intro/CHECKLIST (basic_string<char>): Validation and
+ acceptance. Wooo-hoo!
+
+ * bits/char_traits.h: Change int_type for char_traits general
+ template, so that 21_strings/capacity.cc will compile.
+ * testsuite/21_strings/capacity.cc: Add operators.
+
+ * bits/string.tcc (string::compare): Clean up, re-implement.
+ * testsuite/21_strings/compare.cc: Tweak.
+
+ * bits/string.tcc (string:_M_mutate): Keep leaked value in
+ _M_state, which means that whenever begin() or end() has been
+ called, the string is unshareable, period. By doing this, insert
+ and erase member functions that return iterators can remain
+ footloose and fancy free.
+ * testsuite/21_strings/invariants.cc: Update.
+
+ * bits/basic_string.h (string::append): Fix self-referential
+ problems, ie when "this" is also an argument to a member function.
+ * bits/string.tcc: Tweak, same.
+ * testsuite/21_strings/append.cc: New file.
+
+1999-07-07 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/char_traits.h: Tweaks.
+ * bits/basic_string.h: Tweak.
+ * bits/fstream.tcc: Remove warning for _M_buf_size assignment.
+
+1999-07-06 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_streambuf.h: Absorb/acquire data members previously
+ working in basic_filebuf.
+ * bits/streambuf.tcc: Tweaks.
+ * bits/fstream.tcc: Adjust.
+ * bits/std_fstream.h: Move and rename the following functions:
+ _M_set_ideterminate, _M_is_indeterminate, _M_set_determinate are
+ now declared and defined in the base class, basic_streambuf. Oh
+ fuck it, move data members _M_buf, and _M_buf_size into
+ basic_streambuf as well.
+
+ * bits/ostream.tcc: Tweak.
+ * bits/locale_facets.tcc: Fix typo in comments.
+
+ * testsuite/21_strings/inserters_extractors.cc (test01): Change
+ state from good to not good, as eof() is set.
+
+1999-07-05 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/char_traits.h (char_traits::compare). Fix.
+
+ * config.guess, config.sub: Update.
+
+1999-07-02 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
+
+ * bits/string.tcc: Check the __res_arg for a length error.
+
+1999-07-01 Benjamin Kosnik <bkoz@nabi.net>
+
+ * bits/std_streambuf.h: Tweaks. Need to move _M_is_indeterminate
+ and related functions into basic_streambuf, from basic_filebuf to
+ take care of ostringstreams and empty strings. So that's groovy,
+ or will be groovy.
+ * bits/std_istream.h: Tweaks.
+ * bits/istream.tcc: Implement ws, getline, operator>> for string.
+ * bits/std_ostream.h: And here.
+ * bits/ostream.tcc: Same.
+ * src/misc-inst.cc: Add instantiations for ws.
+
+ * src/string-inst.cc: Add instantiations for inserters and
+ extractors (operators << and >>, getline).
+
+ * testsuite/21_strings/inserters_extractors.cc: Amazingly enough,
+ a testcase for getline and operators << and >>. Ostream tests are
+ failing right now, but istream tests should work. . .
+
+ * bits/string.tcc: Change _S_max_size, as GNU malloc won't budge.
+ * bits/std_sstream.h: Revert.
+
+ * testsuite/17_intro: header_[iosfwd, ios, iostream, iomanip,
+ istream, ostream, streambuf, fstream, sstream].cc: New files.
+
+1999-06-30 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
+
+ * bits/std_sstream.h (stringbuf::sync): Don't use string::begin()
+ and string::end().
+
+ * bits/basic_string.h (basic_string<>::_S_copy_chars): Add
+ specializations for _CharT*, iterator and const_iterator.
+ * src/string-inst.cc: Remove explicit instantiation, as
+ now explicitly specialized.
+
+ * bits/basic_string.h: Add a size_type parameter to _M_clone with
+ a default value set to 0.
+ * bits/string.tcc: In _M_clone by the call of _S_create add the
+ value of the new parameter to _M_length. In reserve check
+ _M_state and use _M_clone instead of _M_mutate.
+
+1999-06-30 Benjamin Kosnik <bkoz@happy.cygnus.com>
+
+ * bits/basic_string.h: Fix _S_max_size.
+ * bits/string.tcc: Add def here.
+ * testsuite/21_strings/insert.cc: Fix.
+
+ * bits/sbuf_iter.h: Remove detritus.
+ * testsuite/24_iterators/istreambuf_iterator.cc: Add tests.
+
+ * src/locale-inst.cc: Elaborate iterator/locale instantiations
+ to resolve alpha-osf4 build problems.
+
+1999-06-29 Benjamin Kosnik <bkoz@happy.cygnus.com>
+
+ * bits/string.tcc: Fix signed/unsigned issues in compares.
+ * stl/bits/stl_deque.h: And here.
+ * stl/bits/stl_string_fwd.h: Remove __get_c_string.
+
+1999-06-29 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
+
+ * bits/string.tcc: New implementation and interface of _M_mutate.
+ Adapt the change in all functions that call _M_mutate.
+ * bits/basic_string.h: And here.
+
+1999-06-29 Benjamin Kosnik <bkoz@happy.cygnus.com>
+
+ * testsuite/21_strings/capacity.cc (test01): Fix.
+
+1999-06-29 Phil Edwards <pedwards@ball.com>
+
+ * mknumeric_limits: Exit script if gen-num-limits isn't built.
+
+1999-06-29 Andreas Gruenbacher <agruenba@pent224.infosys.tuwien.ac.at>
+
+ * stl/bits/stl_vector.h: Fix.
+ * testsuite/23_containers/vector_cons.cc: Add.
+
+1999-06-29 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * mknumeric_limits (LDFLAGS): fix.
+
+1999-06-29 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * mknumeric_limits (LDFLAGS): set it according to the system.
+
+ * math/mathconf.h (NAN): Check whether host is running under
+ Cygwin and make the appropriate definition.
+ * math/complex-stub.h (nan): protect declaration.
+
+1999-06-28 Benjamin Kosnik <bkoz@haight.constant.com>
+
+ * bits/sbuf_iter.h: Rename internal data structure to prevent
+ confusion between basic_ios and istreambuf_iterators internal
+ basic_streambuf data member.
+ * testsuite/24_iterators/istreambuf_iterator.cc: New file.
+
+ * bits/basic_string.h: Remove conditionals, add input_iterator
+ version of S_construct again.
+ * bits/string.tcc: Same.
+ * src/string-inst.cc: And add explicit instantiation here.
+
+ * src/gen-c++config.cc (_GNU_SOURCE): Take out both _GNU_SOURCE
+ and __USE_GNU macro defines, as single __USE_GNU use leading to
+ confusion on glibc2.1 systems (ie, RedHat 6.0).
+
+ * src/Makefile.am (headers): Add std_utility to installed headers.
+
+1999-06-25 John Potter <jpotter@eagle.lhup.edu>
+
+ * stl/bits/stl_tree.h (insert_unique): Revert, just fix insert_equal.
+
+1999-06-25 Gilles Zunino <Gilles.Zunino@hei.fr>
+
+ * mknumeric_limits (LDFLAGS): Swap -lc and -lgcc.
+
+1999-06-24 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * src/gen-c++config.cc (_GLIBCPP_*): Change all
+ macros to include _GLIBCPP as a distinct namespace.
+ * bits/*: And here.
+ * src/*: And here.
+
+ * stl/bits/std_stdexcept.h: Forward-declare __Named_exception ctor.
+ * bits/basic_string.h: Remove __get_c_string.
+ * src/stdexcept.cc: Define ctor here.
+ * bits/ios_base.h: And fix ios_base::failure as well.
+ * src/ios.cc: Define here.
+
+ * bits/std_streambuf.h: Add a private copy ctor and assignment
+ operator wrapped in _G_RESOLVE_LIB_DEFECTS.
+ * bits/ios_base.h: And here too.
+
+ * bits/basic_string.h: Tweak.
+ * testsuite/21_strings/nonmember.cc: Add operator+ tests.
+
+ * src/valarray.cc: Rename to. . .
+ * src/valarray-inst.cc: This.
+ * src/Makefile.am (sources): Change here.
+ * src/Makefile.in: Regenerated.
+
+1999-06-24 Vadim Egorov <egorovv@1c.ru>
+
+ * bits/string.tcc(basic_string<>::_Rep::_S_create): Fixed
+ allocated size
+
+1999-06-24 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+ Tom Tromey <tromey@cygnus.com>
+
+ * configure.in (use_glibc2): Eek, correct for non-glibc systems.
+ Use AM_CONDITIONAL to get us out of this jam. .
+ * libio/Makefile.am: Same.
+ * */Makefile: Regenerated.
+
+1999-06-24 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+ John Potter <jpotter@eagle.lhup.edu>
+
+ * stl/bits/stl_tree.h (insert_equal): Fix.
+ * testsuite/23_containers/multiset.cc: New file.
+
+1999-06-23 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * configure.in (test for glibc2): Correct AC_TRY_COMPILE so that
+ this works correctly on glibc-2 systems. This should allow
+ simplified linking on these systems, and successful linking on Red
+ Hat 6.0 systems.
+ * configure, Makefile: Regenerate.
+
+ * bits/std_cwctype.h: Add missing 'w' to _S_iswpunct_helper name.
+
+ * testsuite/ext: New directory.
+ * testsuite/ext/headers.cc: New file.
+
+1999-06-23 Vadim Egorov <egorovv@1c.ru>
+
+ * stl/ext/hash_set: include missing headers
+ * stl/ext/hash_map: Same
+ * stl/ext/slist: Same
+
+1999-06-17 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/std_cmath.h: comment out modf. Kills build on hpux10.20
+
+1999-06-15 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * src/Makefile.am (sources): Regenerate.
+ * mkcheck: Add TESTS_FILE as a way of controlling what testcases
+ are run.
+
+1999-06-14 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * src/string-inst.cc: Change _S_construct signature, to
+ track requested allocation size versus valid input iterator range.
+ * bits/basic_string.h: Here too.
+ * bits/string.tcc: And here.
+
+1999-06-12 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * mkcheck (LOG_FILE): Correctly append errors.
+
+ * stl/bits/stl_iterator.h: Revert previous, delirious, change.
+
+ * bits/basic_string.h: Change _Rep::_M_data to _Rep::_M_refdata,
+ to clarify differences between basic_string::_M_data() calls and
+ _Rep::_M_data() calls.
+ * bits/std_string.h: Fix.
+ Put in check for out_of_range in substr.
+ * bits/string.tcc: Fix for _S_find.
+
+ * testsuite/21_strings/compare.cc: Add tests.
+ * testsuite/21_strings/find.cc: New file.
+ * testsuite/21_strings/substr: New file.
+ * testsuite/21_strings/replace.cc: New file.
+
+1999-06-11 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/valarray_array.h: __restrict__ify pointers.
+
+ * bits/std_valarray.h: Tweak.
+ (valarray<T>::cshift, valarray<T>::shift): use __builtin_alloca.
+
+ * bits/gslice_array.h: Tweak. Reflect changes in bits/gslice.h
+
+ * bits/gslice.h: Tweak.
+ (class gslice::_Indexer): new class.
+ (gslice::gslice(const gslice&)): implement copy-ctor to support
+ ref-counted index.
+ (gslice::operator=(const gslice&)): support ref-counted index.
+ (gslice::_M_convert_to_index): delete.
+
+ * src/valarray.cc: New file.
+ (__gslice_to_index): turn a gslice into a valarray<size_t>
+ (ctor gslice::_Indexer::_Indexer): implement.
+
+ * src/Makefile.am (sources): add valarray.cc
+ * src/Makefile.in: regenerate.
+
+1999-06-08 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * stl/bits/stl_iterator.h (__normal_iterator::const_iterator
+ ctor): Put in a const_cast.
+
+ * testsuite/21_strings/invariants.cc: New file.
+
+ * testsuite/21_strings/insert.cc: Add exception handling bits.
+ * testsuite/21_strings/ctor_copy_dtor.cc: Same.
+
+ * src/wstring-inst.cc: Add c++config.h include.
+
+ * bits/basic_string.h: Fix const operator[] for size == pos.
+ Add _M_leak for rbegin, non-const.
+ Add _M_leak for rend, non-const.
+ Make member function at standards conformant.
+ Add _S_terminal to _Rep for operator[] const, add this into
+ c_str() as well.
+ * bits/string.tcc: Add static member definition here,
+ temporarily.
+
+ * testsuite/21_strings/element_access.cc: Add tests.
+
+1999-06-08 Vadim Egorov <egorovv@1c.ru>
+
+ * bits/fstream.tcc (_M_really_overflow): Fixed size of
+ conversion buffer.
+
+1999-06-08 Phil Edwards <pedwards@ball.com>
+
+ * bits/fstream.tcc (basic_filebuf::xsputn): Fix off-by-one count
+ caused when __testinit is true.
+ * bits/ostream.tcc (basic_ostream::op<<(streambuf*)): Write buffer
+ using rdbuf()->sputn rather than _M_fnumput->put.
+
+1999-06-08 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * testsuite/23_containers/bitset_ctor.cc: New file.
+ * stl/bits/std_bitset.h (__BITSET_WORDS): Fix integration bug.
+
+1999-06-08 Phil Edwards <pedwards@ball.com>
+
+ * bits/fstream.tcc (basic_filebuf::underflow): Fix, rename local vars.
+
+1999-06-07 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * testsuite/21_strings/element_access.cc: Finish off these tests.
+ * testsuite/21_strings/insert.cc (test01): Uncomment.
+ * testsuite/21_strings/ctor_copy_dtor.cc (test01): Finish off ctors.
+ * bits/basic_string.h: Tweak, okay, fix for real this time.
+ * bits/string.tcc: Same.
+ * bits/char_traits.h: Tweak.
+
+1999-06-07 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * bits/std_cmath.h: Example of how to use the generated macro.
+ * acconfig.h: Add macro for sinf here.
+ * configure.in (LIBS): Add test for builtin math function sinf.
+ * configure: Regenerated.
+
+ * bits/basic_string.h: Fix _S_max_size.
+
+1999-06-06 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * bits/basic_string.h: Fixes for out-of-memory segv for large strings.
+ Remove _S_construct signature for forward_iterator_tag and
+ input_iterator_tag.
+ Clean _M_fold.
+ * src/string-inst.cc: Same, tweaks.
+ * bits/string.tcc: Same, tweaks.
+
+ * testsuite/21_strings/ctor_copy_dtor.cc: Add/clarify tests.
+ * mkcheck (LOG_FILE): Fix filebuf-[2,3].tst checks.
+ * mknumeric_limits (LD_FLAGS): Add -nodefaultlibs -lc -lgcc as per
+ Gaby.
+
+ * src/locale.cc: Final separation for char/wchar_t bits.
+
+1999-06-05 Phil Edwards <pedwards@ball.com>
+
+ * docs/index.html: Added link to book upon request'n'agreement.
+ * docs/23_containers/wrappers_h.txt: Added.
+ * docs/{23_containers,27_io}/howto.html: Added sections.
+
+ * bits/std_fstream.h: Tweak.
+
+1999-06-05 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * src/ios.cc: Same here.
+ * bits/std_iosfwd.h: More wchar_t defines.
+
+ * bits/basic_string.h: Tweaks.
+ * bits/string.tcc: Tweak. Fix _S_construct to check for max_size
+ when doing error checking, as per LWG defect #83.
+
+ * src/gen-c++config.cc: Fix comment.
+
+ * testsuite/21_strings/ctor_copy_dtor.cc: New file, checks ctors,
+ assignments, dtors.
+ * testsuite/21_strings/element_access.cc: New file, checks for
+ operator[], at(...).
+ * testsuite/21_strings/insert.cc: New file, tests string::insert.
+ * testsuite/21_strings/char_traits.cc: New file, tests
+ for char_traits<char>.
+
+ * bits/utility.h: Remove, again.
+ * src/Makefile.am (std_headers): Remove utility.h.
+ * src/Makefile.in (std_headers): Regenerate.
+
+ Alfred Minarik <a8601248@unet.univie.ac.at>
+ * bits/basic_string.h: Move __out_of_range and __length_error into
+ namespace std.
+
+1999-06-05 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * testsuite/26_numerics/modf_float.cc: New file.
+
+ * bits/std_cmath.h (modf(float, float*)): Fix signature. Correct
+ typo: use ::modff, not ::modf.
+
+1999-06-03 Vadim Egorov <egorovv@1c.ru>
+
+ * bits/string.tcc (basic_string::_M_mutate): Fixed memory
+ allocation error
+ * testsuite/21_strings/capacity.cc (test01): Test.
+
+1999-06-03 Phil Edwards <pedwards@ball.com>
+
+ * bits/fstream.tcc: Re-order inits to stop warnings. Comment/move
+ unused variables to within #if 0 blocks to do the same.
+ * bits/std_fstream.h: Fix typos (one prevents compilation).
+
+1999-06-03 Benjamin Kosnik <bkoz@pacifica.cygnus.com>
+
+ * src/wstring-inst.cc: Fix.
+
+1999-06-02 Benjamin Kosnik <bkoz@madcow.cygnus.com>
+
+ * bits/char_traits.h: Add _G_USE_WCHAR_T macro guards.
+ * stl/bits/stl_string_fwd.h: Same.
+ * bits/locale_facets.h: Same.
+ * bits/locale_facets.tcc: Same.
+ * src/wstring-inst.cc: And here.
+
+ * src/gen-c++config.cc: Comment _G_USE_WCHAR_T. Leading to
+ problems on HPUX 10.20.
+ * your-build-directory-here/bits/c++config.h: Just kidding, do it
+ here as a temporary hack till the compiler/host problems get
+ worked out.
+
+ * bits/locale_facets.tcc (num_get::do_get): Change from ifdef
+ HAVE_STRTOLD to HAVE_STRTOLD && !(__hpux). Apparently, problems
+ converting "long double" to struct long_double. Probably should be
+ done with one macro (HAVE_STRTOLD) at configure time.
+
+ * bits/std_cmath.h: Comment out pow(double, int) definition as
+ gives re-declaration under hpux10.20. Revert previous change, as
+ kills linux/x86, solaris 2.7, hpux builds. These should be done
+ using autoconf, see std_cctype.h and the solutions started in
+ configure.in (see config.h for the generated file.)
+
+ * mknumeric_limits (LDFLAGS): Remove '-nodefaultlibs -lc', as
+ -nodefaultlibs prevents linking under HPUX 10.20 as __main is not
+ defined.
+
+ * docs/index.html: Add some useful links.
+ * docs/17_intro/contribute.html: Fix broken links.
+
+1999-06-02 Benjamin Kosnik <bkoz@rhino.cygnus.com>
+
+ * mkcheck (LOG_FILE): Add !/bin/bash instead of cygnus-style
+ paths. The rest of the world should be able to run this script
+ now.
+
+ * src/Makefile.am ($(generated_headers)): Remove comment.
+ * Makefile*: Regenerate.
+
+ * bits/std_locale.h: Remove detritus.
+ * bits/localefwd.h: Add <cctype> include to undefine the isspace
+ macro.
+
+1999-06-01 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * src/gen-c++config.cc: New file. Making c++config.h at configure
+ time by catting this file (nee bits/config.h) with the build
+ directories config.h. This is not a complete or perfect solution
+ but is better than what was in place previously.
+ * bits/c++config.h: Rename/move to above.
+ * src/Makefile.am (headers): Remove c++config.h.
+ (myinstallheaders). Add.
+ * Makefile*: Regenerated.
+
+ * bits/std_cwchar.h: Add include of c++config.h for HAVE_*
+ definitions, so that wmemcmp, wcslen, wmemchr, etc are properly
+ declared only if not present in the host's wchar.h.
+
+ * bits/locale_facets.tcc (std): Change _G_USE_STRTO* to HAVE_STRTO*.
+
+ * bits/std_cmath.h: Define out, for the moment. Linux has no
+ __buitin_fsqrtl? Probably need some kind of configure trickery
+ here as well.
+
+ * src/Makefile.*: Regenerate.
+ * bits/c++config.h: Add config.h include.
+
+ * bits/std_cwchar.h: Remove remaining #error guard.
+
+ * acconfig.h: Add bits for HAVE_LC_MESSAGES.
+
+ * configure.in (LIBS): Replace previous effort for mbstate_t and
+ strtold/strtof with this implementation.
+
+1999 06-01 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/std_cmath.h: Tweak. Add more functions. Use __builtin_xxx
+ whenever possible.
+
+1999-05-28 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/locale_facets.tcc (std): Eek: this left in. Autoconf bits
+ for determining mbstate_t differences across various hosts not
+ finished.
+
+1999-05-26 Benjamin Kosnik <bkoz@nabi.net>
+
+ * bits/locale_facets.tcc: Change to ifdef.
+
+ * bits/std_sstream.h (stringbuf::setbuf): Remove dynamic_cast.
+ * bits/std_fstream.h (filebuf::setbuf): Same.
+
+ * bits/std_istream.h: Add ws declaration.
+ * bits/istream.tcc: Stub out definition.
+
+ * docs/index.html: Fix broken link for design.txt.
+
+ * configure.in: Test for mbstate_t. If wchar.h doesn't have it,
+ then set _G_NEED_MBSTATE_T.
+ * configure: Regenerate.
+ * bits/c++config.h: Move mbstate_t define.
+ * bits/std_cwchar.h: To here.
+
+1999-05-25 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
+
+ * bits/std_sstream.h:
+ basic_stringbuf<>::basic_stringbuf: fix.
+ basic_stringbuf<>::setbuf:
+ remove the temporary __string_type object,
+ remove the unnecessary dynymic_cast in the return value,
+ change the type of the returned value from __streambuf_type*
+ to basic_stringbuf<_CharT, _Traits, _Alloc>*.
+
+1999-05-25 Phil Edwards <pedwards@ball.com>
+
+ * bits/std_streambuf.h (streambuf::setbuf): Always return streambuf*.
+
+1999-04-25 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/std_cmath.h: Tweak. Add float versions of the math functions
+ in <math.h>. <cmath> still incomplete and incorrekt.
+
+1999-05-24 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * mknumeric_limits (LDFLAGS): set appropriate link flags.
+
+1999-05-23 Phil Edwards <pedwards@ball.com>
+
+ * docs/17_intro/howto.html: Added links to text docs,
+ e.g., BUGS.
+ * docs/21_strings/howto.html: Updated sections and links.
+ * docs/21_strings/{gotw29a.txt,stringtok_h.txt}: Added.
+ * docs/faq/index.html: Updated what-works for sixth
+ snapshot. Also a number of "internal" links have been
+ fixed, now that the web pages are the docs directory...
+ * docs/faq/index.txt: Regenerated.
+
+1999-05-21 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * bits/basic_string.h: Add Nathan's documentation on the string class.
+
+ * testsuite/27_io/ios_members_static.cc: New file, for testing
+ ios_base::sync_with_stdio.
+
+1999-05-21 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * bits/std_locale.h: Simplify includes.
+ * bits/loccore.h: Delete.
+ * bits/localefwd.h: Renamed, trimmed.
+ * bits/locfacets.h: Delete.
+ * bits/locale_facets.h: Rename, expanded.
+ * bits/loccore.tcc: Deleted.
+ * bits/locfacets.tcc: Deleted.
+ * bits/locale_facets.tcc: Resultant merge.
+ * bits/std_fstream.h: Modify include.
+ * bits/ostream.tcc: Same.
+ * bits/istream.tcc: Same.
+
+ * src/locale-inst.cc: And here.
+ * src/locale.cc: Ditto.
+ * src/Makefile.am: Updated.
+ * src/Makefile.in: Rengenerated.
+
+ * bits/std_istream.h: Move istream::sentry ctor definition.
+ * bits/istream.tcc: Move istream::sentry ctor here.
+ Add more detailed locale include here for ctype member functions.
+ * bits/ostream.tcc (std): And here.
+
+ * bits/sbuf_iter.h: Include std_streambuf.h
+
+ * bits/locfacets.h: Start separating this into a localeimp.h file.
+ * bits/loccore.h: Start separating this into a localefwd.h file.
+ Add std_climits for CHAR_BIT.
+
+ * bits/ios_base.h (ios_base::sync_with_stdio): Stub in.
+
+ * bits/char_traits.h: Tweak.
+
+ * bits/ios_base.h: Remove INT_MAX, use 1<<16.
+
+ * bits/std_ostream.h: Remove c++config.h include.
+ * bits/std_istream.h: Same.
+ * bits/std_streambuf.h: Same.
+ * bits/std_fstream.h: Same.
+ * bits/std_sstream.h: And here.
+
+ * bits/std_iosfwd.h: Add _G_RESOLVE_LIB_DEFECTS here for streampos.
+ * bits/char_traits.h: Add include of std_cwchar.h for mbstate_t.
+ * bits/fpos.h: Tweak, format.
+
+ * std/ciso646: New file.
+ * bits/std_ciso646.h: New file.
+ * src/Makefile.am (std_headers): Add ciso646.
+ (headers): Add bits/std_ciso646.h.
+ * src/Makefile.in: Regenerate.
+ * testsuite/17_intro/header_ciso646.cc: New file, disable
+ equivalance tests.
+
+ * bits/fpos.h: Remove libio.h include.
+ * bits/basic_file.h: And here.
+ * bits/std_ios.h: Put here.
+
+ * src/ios.cc: Simplify includes, tweak.
+ * bits/std_ios.h: Simplify include order.
+ * bits/ios_base.h: Modify ios_base::failure.
+
+ * stl/bits/std_numeric.h: Change include from stl_iterator to
+ std_iterator.
+
+1999-05-19 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * std/iostream: Remove static member __ioint.
+ * bits/std_iostream.h: Put here.
+
+ * stl/bits/std_numeric.h: Remove unneccessary std_iostream.h include.
+ * stl/bits/stl_algobase.h: Same.
+ * testsuite/27_io/iostream_objects.cc: Regression tests.
+ * testsuite/27_io/hello.cc: Remove, subset of above.
+
+1999-05-19 Phil Edwards <pedwards@ball.com>
+
+ * docs/index.html: Tweak, update.
+
+1999-05-18 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * docs/17_intro/RELEASE-NOTES: remove outdated
+ documentation about numeric_limits. Correct CXXINCLUDE setting
+ documentation.
+
+1999-05-18 Phil Edwards <pedwards@ball.com>
+
+ * docs/{17_intro,18_support,19_diagnostics,20_util,21_strings,
+ 22_locale,23_containers,24_iterators,25_algorithms,26_numerics,
+ 27_io}/howto.html: Created, with some initial entries.
+ * docs/faq/index.html: Fixed some links.
+ * docs/faq/index.txt: Regenerated.
+
+1999-05-18 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * bits/c++config.h (__GLIBCPP__): Set version to 19990518.
+
+ * docs/17_intro/RELEASE-NOTES: Update.
+ * docs/index.html: Correct link to mailing list help page, update News.
+ * docs/faq/index.html: Change fifth to sixth for snapshot.
+
+ * src/Makefile.am (myinstallheaders): Bring over Gaby's changes to
+ install $(top_builddir)/bits/std_limits.h into
+ $(myincludepfx)/bits. This was mistakenly omitted from yesterday's
+ Makefile.am changes.
+ * *Makefile*: Regenerate using automake.
+
+ * mkcheck (LOG_FILE): Fix filebuf directory oddness.
+ * testsuite/27_io/filebuf.cc: Same.
+
+1999-05-18 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * docs/17_intro/CHECKLIST: update.
+ * docs/17_intro/TODO: update.
+
+1999-05-17 Phil Edwards <pedwards@ball.com>
+
+ * docs/{17_intro,18_support,19_diagnostics,20_util,21_strings,
+ 22_locale,23_containers,24_iterators,25_algorithms,26_numerics,
+ 27_io}/howto.html: Created, with some initial entries.
+ * docs/faq/index.html: Fixed some links.
+ * docs/faq/index.txt: Regenerated.
+
+1999-05-17 Benjamin Kosnik <bkoz@unhappy.cygnus.com>
+
+ * src/Makefile.am (myinstallheaders): Missed removing missing.h.
+ * Makefile.in*: Regenerate.
+
+1999-05-17 Benjamin Kosnik <bkoz@happy.cygnus.com>
+
+ * bits/std_streambuf.h: Same.
+
+ * bits/loccore.h (_Bad_use_facet): Remove bits warned about.
+ * bits/locfacets.h (std): Same.
+ * bits/sstream.tcc: Same.
+ * testsuite/27_io/stringstream.cc: Tweak.
+
+ * testsuite/27_io/filebuf.cc: Adjust.
+ * testsuite/21_strings/capacity.cc (test01): Add more
+ string::reserve tests.
+
+ * bits/c++config.h: Remove broken CCTYPE.
+ * bits/std_cctype.h: Tweak, remove de-macroization, enable
+ sequestered topper implementation.
+ * bits/std_cwctype.h: Same.
+
+ * bits/missing.h: Remove.
+ * bits/std_locale.h: Remove missing.h include.
+
+ * stl/bits/std_bitset.h (bitset::bitset(string): Tweak to compile.
+
+ * src/Makefile.am (headers): Add bits/std_cwctype.h.
+ INCLUDES: Add top_builddir.
+ * src/Makefile.in: Regenerate.
+
+ * Makefile.am: Add check and check-install as new targets.
+ * testsuite/make_check_libfree++: Move to. . .
+ * mkcheck: Here.
+ * configure.in: Tweak versions.
+ * mknumeric_limits: Set paths correctly.
+
+1999-05-17 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * src/Makefile.in (myinstallheaders): add rule to install
+ std_limits.h.
+
+ * bits/slice.h (class slice): don't const-qualify data members
+ since the copy and assignment operator is implicitly used. The
+ valarray specification is definitively a bad one.
+
+ * Makefile.in (generate-limits-sources): fix typo.
+
+ * docs/text/TODO: update.
+ * docs/text/CHECKLIST: update.
+
+ * bits/gslice.h (gslice): fix bugglet.
+ (gslice::gslice): set _M_index_size to 0 whenever given lengths
+ (lj) of size zero.
+
+ * src/Makefile.am (libstdc___la_SOURCES): add gen-num-limits.
+ * src/Makefile.in (libstdc___la_SOURCES): keep in sync.
+ [Note: **/Makefile.in should be generated from the corresponding
+ Makefile.am. The current situation is a litte chaotic. ]
+
+1999-05-16 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * mknumeric_limits: tweak.
+
+ * Makefile.in (all): add target generate-limits-sources.
+ (generate-limits-sources): make a directory bits/ in top_builddir
+ where the generated std_limits.h is put; generate limitsMEMBERs.cc
+ directly under $(top_builddir)/src. Remains to put the appropriate
+ rule for installing std_limits.h.
+
+ * src/Makefile.in (headers): remove bits/std_limits.h to this list.
+ (INCLUDES): add -I$(top_builddir) for bits/std_limits.h which is
+ now generated at build-time in the build directory
+ (libstdc___la_SOURCES): remove limitsMEMBERS.cc form this list
+ * src/Makefile.am: reflect changes in src/Makefile.in
+
+1999-05-12 Phil Edwards <pedwards@ball.com>
+
+ * docs/faq/index.html: Add more entries (5.4,5.5), finish
+ all but one empty entry. Add links for HOWTOs, but no files yet.
+ (Corrected HOWTO links are for bkoz's new scheme.)
+ * docs/faq/index.txt: Regenerated.
+
+1999-05-12 Benjamin Kosnik <bkoz@happy.cygnus.com>
+
+ * testsuite/17_intro/headers.cc: New file.
+ * stl/bits/std_queue.h: Change stl_bvector.h include path.
+ * bits/std_cwctype.h: New file.
+
+ * testsuite/27_io/filebuf.cc: Need to tweak directory structure.
+
+1999-05-11 Benjamin Kosnik <bkoz@loony.cygnus.com>
+
+ * stl/bits/stl_config.h (__USE_MALLOC): Change underlying allocator.
+ Check __USE_MALLOC before defining specializations containing
+ __default_alloc_template.
+ * src/stl-inst.cc: Here too.
+
+ * bits/basic_string.h: Change.
+
+ * testsuite/make_check_libfree++: More tweaks.
+ * testsuite/21/capacity.cc: New file.
+
+ * src/string.cc: Rename to be consistent with other inst files.
+ Rename to string-inst.cc.
+ * src/string*.cc: Change include.
+ * src/wstring.cc: Rename to wstring-inst.cc.
+ * src/wstring*.cc: Ditto.
+ * src/Makefile.in: Also here.
+ * src/Makefile.am: Ditto.
+
+ * src/traits.cc: Remove.
+ * src/wtraits.cc: Same.
+
+ Try a new way of organizing documentation, one with synchronicity
+ between testsuites and docs subdirectories, and see who yelps.
+ * docs/html: Remove, use chapter and subject specific directories
+ instead of forcing things immediately into format of
+ documentation.
+ * docs/text: Same.
+ * docs/image: Same.
+ * docs/faq/text, docs/faq/html: Remove, put in the docs/faq
+ directory and sort by filename and extension.
+ * docs/17_intro, 18_support, 19_diagnostics, 20_util, 21_strings,
+ 22_locale, 23_containers, 24_iterators, 25_algorithms,
+ 26_numerics, 27_io: Add.
+ * docs/17_intro/*: Populate with all the text files. . .
+ * docs/index.html: Construct.
+
+ * testsuite/*: Update with same names as the docs subdir.
+ * testsuite/results: Where to stash conformance results for the
+ different snapshots, so that progress/size/speed issues can be
+ tracked over time.
+
+1999-05-10 Benjamin Kosnik <bkoz@loony.cygnus.com>
+
+ * src/string.cc: Add _S_copy_chars instantiation, as well as
+ string::binary operators !=, ==, etc.
+
+ * src/Makefile.am (CXXFLAGS): Remove -fvtable-thunks.
+ * src/Makefile.in (CXXFLAGS): Same here.
+ * testsuite/make_check_libfree++ (CXX_FLAG): And here.
+
+1999-05-07 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * src/string.cc: Add missing member functions to instantiation list.
+
+1999-05-07 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * src/misc-inst.cc: Remove unused string instantiations.
+
+ * bits/string.tcc: Tweak, fix.
+ * bits/basic_string.h: Format. Fix reported error with c_str().
+
+ * testsuite/make_check_libfree++: Tweak for shared builds.
+ * testsuite/21/operations.cc: New file for testing c_str() etc.
+
+1999-05-06 Benjamin Kosnik <bkoz@cygnus.com>
+ Ryszard Kabatek <kabatek@chemie.uni-halle.de>
+
+ * stl/bits/stl_vector.h: Fix the code of vector<> for usage with
+ an iterator class. Delineate pointer versus iterator differences
+ in implementation.
+ * 23/vector_capacity.cc: New file, tests for above.
+
+1999-05-06 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * mknumeric_limits: Fix typo. 'unsigned lont' should read
+ 'unsigned long'.
+ * src/Makefile.am (libstdc___la_SOURCES): add limitsMEMBERS.cc,
+ generated by mknumeric_limits to the list. Now std_limits.h is
+ basically working.
+ * src/Makefile.in (generate-numeric-limits): new target to handle
+ automatic generation of bits/std_limits.h and src/limitsMEMBERS.cc.
+ (all): add target generate-numeric-limits.
+ (libstdc___la_OBJECTS): add limitsMEMBERS.lo
+ (libstdc___la_SOURCES): add limitsMEMBERS.cc
+
+1999-05-05 Benjamin Kosnik <bkoz@cygnus.com>
+
+ Irix build issues.
+ * bits/c++config.h (_G_USE_CTYPE_ISBIT): Defines new macro for
+ mask values in ctype_base. Move hacks for _ISBit to locfacets.h.
+ * bits/locfacts.h: Here.
+
+1999-05-05 Benjamin Kosnik <bkoz@cygnus.com>
+ Ulrich Drepper <drepper@cygnus.com>
+
+ Solaris build issues.
+ * bits/c++config.h: Define new macros, _G_USE_STRTOF and
+ _G_USE_STRTOLD.
+
+ * bits/locfacets.tcc (num_get::do_get): Tweak long double and
+ float overloads to use the above macros. Account for the lack of
+ strtold on some systems, and revert back to using sscanf.
+
+1999-05-04 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
+
+ * bits/locfacets.tcc (num_get::do_get): Check the errno variable.
+ Use strtoul/strtoull for unsigned types. Check the ranges for
+ short/unsigned short and if necessary for int/unsigned int.
+
+1999-05-04 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * src/gen-num-limits.cc (round_style): Need to use mknumericlimits
+ to generate bits/std_limits.h now, as the SGI std_limits.h is
+ being depricated. Not done, but should be done immediately: need
+ to make sure this script is run as part of the configuration
+ process, because without it "make" in a configured build directory
+ will fail. Also tweaked: added a space for float_round_style, and
+ used static_cast of zero to default-initialize, which should be ok
+ according to the standard. (see 8.5 p5 and 20.1.3).
+ * mknumeric_limits (OUT_C): Need this for x86 long
+ double extensions.
+
+ * bits/basic_file.h: Include libio.h, not libioP.h.
+ * src/basic_file.cc: And add libioP.h include here, so that
+ _IO_init, et. al are well-declared.
+
+ * testsuite/make_check_libfree++ (LIB_PATH): Test installed
+ headers, not source directory headers.
+
+ * src/Makefile.am (headers): Add stl_range_errors.h, also adjust
+ for ext/*. Also add basic_file.h.
+ * src/Makefile.in (headers): Same.
+
+ * bits/std_string.h: Reduce dependencies for faster
+ pre-processing. Move istream and ostream specific defines into
+ istream.tcc and ostream.tcc respectively.
+ * bits/string.tcc: And here.
+ * bits/basic_string.h: Move getline inline out-of-line, and to
+ istream.tcc.
+ * bits/istream.tcc: Move string::getline and operator>> here.
+ * bits/ostream.tcc: And here too.
+
+ * bits/utility.h: Remove, as clashes with a standard header. Put
+ __OUTOFRANGE and __LENGTHERROR macros into string.tcc for the time
+ being, until this can be combined with SGI's approach.
+ * bits/string.tcc: Add macros, as above.
+ * bits/loccore.h: Add _Count_ones defines.
+ * bits/std_string.h: And here too.
+ * bits/std_locale.h: And here.
+ * bits/std_ios.h: Take out include here.
+ * src/Makefile.am (headers): Remove utility.h
+ * src/Makefile.in (headers): Remove utility.h
+
+ * stl/bits/*: Update to SGI STL 3.20.
+ * stl/ext/pthread_alloc: Delete this file.
+
+1999-05-04 Phil Edwards <pedwards@ball.com>
+
+ * docs/faq/html/index.html: Add more entries
+ * docs/faq/html/index.txt: regenerated.
+
+1999-05-04 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * src/gen-num-limits.cc (DO_DEFINE_MIN_MAX): fix typo.
+
+1999-04-29 Benjamin Kosnik <bkoz@haight.cygnus.com>
+
+ * bits/locfacets.tcc (num_get::do_get): Re-implement, with input
+ from Ulrich and Nathan. Remove extraneous string class usage,
+ tweak, clean, simplify and consolidate with a eye towards removing
+ duplcate code. Use strto[l, ll, f, d, ld] instead of sscanf.
+ Not done: dealing with leading zeros, wchar_t work.
+ * bits/locfacets.h: And here too.
+
+ * doc: Remove.
+
+1999-04-29 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * docs/: add a FAQ.
+ * docs/faq/: New directory.
+ * docs/faq/html/: Likewise.
+ * docs/faq/text/: Likewise.
+ * docs/faq/html/index.html: New file.
+ * docs/faq/html/index.txt: Likewise. Generated from
+ docs/faq/html/index.html by lynx.
+
+1999-04-28 Benjamin Kosnik <bkoz@happy.cygnus.com>
+ Ryszard Kabatek and Branko Cibej
+
+ * bits/locfacets.tcc: Modify.
+
+1999-04-27 Benjamin Kosnik <bkoz@happy.cygnus.com>
+
+ * bits/sbuf_iter.h: Clean, fix istreambuf_iterator, make
+ conformant to 14882, wrap non-standard extensions with
+ _G_RESOLVE_LIB_DEFECTS, remove detritus and cruft, rennovate.
+ * bits/locfacets.tcc (num_get::do_get(bool)): Return correct iterator.
+
+ * testsuite/27/istringstream_formatted.cc: Add tests.
+
+ * bits/locfacets.h: Remove cruft from _Format_cache, continue
+ commenting, simplify.
+ * bits/locfacets.tcc: Same.
+
+ 1999-04-27 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
+ * bits/locfacets.tcc (num_get::do_get):
+ Fix the sscanf format parameter
+ for long long 'll' (as in C9X) instead of 'l'.
+ Fix the order of sscanf format parameters: "%dl" --> "%ld".
+ Change the type of the local variable '__conv' from 'string'
+ to 'const char*' and adapt the change.
+
+1999-04-26 Benjamin Kosnik <bkoz@happy.cygnus.com>
+
+ * bits/locfacets.h: Document _Format_cache, and name data members
+ after the corresponding functions in numpunct. For instance:
+ _M_grsep -> _M_thousands_sep, and _M_decsep -> _M_decimal_point.
+ Break apart _M_boolnames{2] into _M_truename and _M_falsename.
+ * bits/locfacets.tcc: Same.
+
+ * bits/locfacets.h (num_get::_M_extract): Don't allow groupings to
+ stop parsing--store for later analysis.
+ * testsuite/27/istringstream_formatted.cc: Add cases.
+
+1999-04-25 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/valarray_meta.h: tweak.
+ (_UnFunBase, _BinFunBase, _BinFunBase1, _BinFunBase2, _BinBase1,
+ _BinFunBase2): rename typedef-name _Tp to _Vt to keep the compiler
+ happy -- boggus warning.
+ * bits/std_valarray.h: Fix.
+ (valarray<T>::shift): Fix. Update comment.
+ (valarray<T>::cshift): Fix.
+
+1999-04-23 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * testsuite/27filebuf-2.txt: Delete.
+ * testsuite/27/filebuf.cc: Put output files directly into the
+ correct subdirectory (27).
+
+ Alexandre Petit-Bianco <apbianco@cygnus.com>
+ * testsuite/make_check_libfree++: Check generated (*.txt) file
+ against stored results file (*.tst).
+
+1999-04-22 Benjamin Kosnik <bkoz@nabi.net>
+
+ * bits/locfacets.tcc: Fix.
+
+ * bits/fstream.tcc (filebuf::seekoff): Output current out pointer.
+ (filebuf::overflow): Simplify.
+ (filebuf::xsputn): Correctly handle indeterminate state.
+
+ * testsuite/27/istringstream_formatted.cc: Tweak.
+ * testsuite/27/filebuf.cc: Tweak.
+ * testsuite/27/filebuf-3.tst: Correct: this is the canonical
+ results file, please use this in the future to guarantee filebuf
+ positioning accuracy.
+ * testsuite/27/filebuf-2.tst: Same.
+
+1999-04-21 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/fstream.tcc (filebuf::xsputn): Add.
+ * bits/std_fstream.h: Declare.
+
+ * src/basic_file.cc (__basic_file::open): Add O_CREAT to open
+ calls using ios_base::trunc.
+
+ * bits/sstream.tcc (streambuf::overflow): Fix crasher.
+
+ * testsuite/make_check_libfree++ (LOG_FILE): Ugh. Another fix.
+ * testsuite/27/27stringstream.cc: Same.
+ * testsuite/27/27stringbuf.cc: More tweaks.
+ * testsuite/27/27filebuf-2.txt: Remove.
+
+ * testsuite/27/27filebuf-1.tst: Append, to force byte size over
+ BUFSIZE so that overflows/underflow can be tested with default
+ buffer setting.
+ * testsuite/27/27filebuf-1.tst: Add.
+
+ * testsuite/*/*: Remove pre-pended chapter names, as they
+ duplicate the chapter info contained in the enclosing directory
+ anyway.
+
+1999-04-20 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/streambuf.tcc (streambuf::xsputn): Re-implement to conform
+ to sputc conditions.
+
+ * bits/ios_base.h: Define here.
+ * src/ios.cc (ios_base::_M_clear): Remove hack.
+ * bits/basic_ios.h: Fix rdstate().
+
+ * bits/sstream.tcc (streambuf::seekoff): Fix.
+ * bits/fstream.tcc (filebuf::seekoff): Tweak comments.
+
+ * testsuite/make_check_libfree++ (LOG_FILE): More c-c-c-changes.
+ * testsuite/24/24iterator.cc: Add/Fixes for DEBUG_ASSERT.
+ * testsuite/27/27stringstream.cc: Same.
+ * testsuite/27/27stringbuf.cc: Same.
+ * testsuite/27/27istringstream_formatted.cc: Same.
+ * testsuite/27/27filebuf.cc: Same.
+
+ * bits/locfacets.h: Remove specializations for messages<char> and
+ messages<wchar_t> ctors. Same for moneypunct. Not required, not used.
+ * src/locale.cc: Remove definitions for above.
+ * src/misc-inst.cc: Revert, take out iomanip.h include.
+ * bits/std_iomanip.h: Tweak, format.
+
+1999-04-19 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/loccore.h: Format, move inline.
+ * bits/locfacets.tcc: Same.
+ * bits/locfacets.h: Same.
+
+ Ulrich Drepper <drepper@cygnus.com>
+ * aclocal.m4: Re-generate.
+ * configure, configure.in: Same.
+ * m4/lc_messages.m4: New file.
+
+1999-04-18 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_ostream.h: Fix typedef for wchar_t instantiations.
+ * bits/sstream.tcc: Tweak.
+
+ * std/iostream: Put __ioinit inside macro guards.
+
+ * src/stlinst.cc: Delete and move to . . .
+ * src/stl-inst.cc: New file, plus wrapping in namespace std.
+ * src/Makefile.in: Change.
+ * src/Makefile.am: Same.
+ * src/misc-inst.cc: Add istringstream/ostringstream instantiations.
+
+ * testsuite/make_check_libfree++: Efficiently format for minimal
+ space. Enforce stricter execution tests by enabling
+ -DDEBUG_ASSERT.
+
+1999-04-16 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * docs/text/RELEASE-NOTES: Fix include typo.
+
+ * src/Makefile.am (headers): Add istream.tcc.
+ * src/Makefile.in (headers): Add istream.tcc.
+
+ * ltconfig, ltmain.sh, libtool: Update to libtool-1.2g.
+
+1999-04-16 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/locfacets.tcc (num_get::do_get(long)): Finish roughing in.
+ * bits/locfacets.h (num_get::_M_extract): New functin:
+ consolidate logic for do_get(...) members.
+
+ * bits/sbuf_iter.h (istreambuf_iterator::operator++()): Fix.
+ * testsuite/27/27istringstream_formatted.cc: Add.
+
+1999-04-16 Martin v. Loewis <martin@mira.isdn.cs.tu-berlin.de>
+
+ * src/basic_file.cc (__basic_file::open): Fix thinko in
+ _G_HAVE_IO_FILE_OPEN bits.
+ * bits/std_istream.h (sentry::sentry(istream, bool)): Fix isspace bug.
+ * bits/std_cmath.h: Add stdlib.h include for ldiv_t.
+ * src/complex.cc (FCT): Qualify all functions with global namespace.
+ * src/locale.cc: Don't qualify memcpy and setlocale.
+ * src/stdexcept.cc (__out_of_range): Qualify out_of_range with std::.
+ (__length_error): Likewise, for length_error.
+ * src/stlinst.cc: Qualify instantiations with std::.
+
+1999-04-15 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * C++STYLE: Add ChangeLog guidelines for member functions.
+
+ * doc/* : Delete.
+ * BADNAMES, BUGS, C++STYLE, CHECKLIST, COPYING,
+ DESIGN, HEADER_POLICY, PROBLEMS, RELEASE-NOTES, TODO: Moved into
+ docs/text and made less strident.
+
+ * bits/fstream.tcc: Change non-standard ctor to match Sun's sematics.
+ * bits/std_fstream.h: Same.
+ * src/ios.cc: Same.
+
+ * bits/locfacets.h: Touch.
+
+1999-04-15 Ulrich Drepper <drepper@cygnus.com>
+
+ * math/cexp.c (cexp): Use NAN instead of nan("").
+ Reported by joel reed <joelreed@yahoo.com>.
+
+ * libio/libioP.h: Define _IO_seek_fpos_t and _IO_seek_off_t based on
+ _G_IO_IO_FILE_VERSION. Use these types in the prototypes.
+ * libio/fileops.c: Use _IO_seek_fpos_t and _IO_seek_off_t types
+ instead of #if cascades.
+ * libio/genops.c: Likewise.
+ * libio/ioseekoff.c: Likewise.
+ * libio/ioseekpos.c: Likewise.
+ * libio/strops.c: Likewise.
+ Patch by Chip Salzenberg <chip@perlsupport.com>.
+
+1999-04-15 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * docs: New directory.
+ * docs/html: Likewise.
+ * docs/text: Likewise.
+ * docs/image: Likewise.
+
+ * bits/std_cmath.h: Add new functions.
+ (abs): overload for long and double.
+ (div): overload for long.
+
+ * bits/valarray_array.h: Fix.
+ * bits/gslice.h: Adjust friend.
+ * bits/slice_array.h: likewise.
+ * bits/valarray_meta.h: likewise.
+
+1999-04-13 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * bits/locfacets.h: More changes, for num_get for insertion
+ operators for integral types. Comment fields in _Format_cache.
+ * bits/locfacets.tcc: And here too: add preliminary long version.
+ * testsuite/27/27istringstream_formatted.cc: Add cases.
+
+1999-04-13 Mark Elbrecht <snowball3@usa.net>
+
+ * configure.in: Add locale.h to AC_CHECK_HEADERS argument. Call
+ AC_LC_MESSAGES macro.
+ * aclocal.m4 (AC_LC_MESSAGES): New. Determines if a target
+ supports LC_MESSAGES.
+ * config.h.in: Add entry for HAVE_LC_MESSAGES.
+ * src/locale.cc (locale::_S_normalize_category): Use the
+ HAVE_LC_MESSAGES macro to check for LC_MESSAGES support instead of
+ _G_NO_CLOCALE_HAS_MESSAGES.
+ * aclocal.m4 (AM_PROG_LD): For DOS style paths, simplify test to
+ '?:' from '?:\\' so any path beginning with a drive name matches.
+
+1999-04-12 Mark Elbrecht <snowball3@usa.net>
+
+ * src/basic_file.cc(sys_open) [O_BINARY]: Declare __testb.
+
+1999-04-12 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * bits/locfacets.h: Tweak.
+ * bits/locfacets.tcc(do_get): Clean/fix bool method.
+
+ * testsuite/21/21nonmember.cc: Same.
+ * testsuite/21/21compare.cc: Fix license.
+ * testsuite/27/27istringstream_formatted.cc: New file.
+
+1999-04-12 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/valarray_meta.h: _BinFunBase1, _BinFunBase2, _BinBase1,
+ _BinBase2: new template classes; put in there to work around a
+ compiler limitation. The whole valarray architecture is now
+ working.
+
+1999-04-08 Benjamin Kosnik <bkoz@haight.constant.com>
+
+ * bits/locfacets.tcc: Fix, format.
+ * bits/locfacets.h: Fix.
+ * src/locale.cc: Same, plus format.
+
+ * bits/basic_string.h: Re-add definition here.
+ * src/string.cc: Take out.
+
+1999-04-08 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/std_valarray.h: tweak.
+ * bits/valarray_array.h tweak. use _Expr.
+ * bits/slice_array.h: likewise.
+ * bits/gslice_array.h: likewise.
+ * bits/mask_array.h: likewise.
+ * bits/indirect_array.h: likewise.
+ * bits/valarray_meta.h: tweak.
+ _UnFunBase, _UnFunClos, _BinFunBase, _FunBase, _ValFunClos,
+ _RefFunClos, _UnBase, _UnClos, _BinBase, _BinClos, _SClos, _GClos,
+ _IClos: new template classes.
+ _Meta: renamed to _Expr. Made template with args.
+ _Constant: made template with two args.
+
+1999-04-05 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/valarray_array.h: tweak.
+
+1999-04-06 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/basic_string.h: Whoops--fix blip.
+
+1999-04-06 Benjamin Kosnik <bkoz@cygnus.com>
+
+ Update to SGI STL 3.13
+ * bits/basic_string.h: Add __get_c_string definition.
+ * stl/bits/stl_range_errors.h: New file.
+ * stl/bits/std_bvector.h: Same.
+ * stl/bits/*: Update.
+
+1999-04-04 1999 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/slice_array.h: tweak.
+ * bits/gslice_array.h: tweak.
+ * bits/mask_array.h: tweak.
+ * bits/indirect_array.h: tweak.
+ * bits/valarray_array.h: tweak.
+ (__valarray_copy): replace copy with memcpy.
+ * bits/std_valarray.h: use __valarray_copy whenever possible.
+ use __valarray_fill instead of fill.
+
+1999-04-02 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * src/gen-num-limits.cc: new file
+ * mknumeric_limits: Ditto.
+
+1999-03-30 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/locfacets.tcc: Do a stub version of num_get for short, int,
+ and long types.
+ * bits/locfacets.h: Add num_get::get methods overloaded for int
+ and short, to resolve ambiguous overloads in istream insertion
+ operators.
+
+1999-03-30 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_istream.h: Fix.
+ * bits/istream.tcc: Fix.
+
+1999-03-30 Philip Martin <pm@corris.dircon.co.uk>
+
+ * testsuite/24/24iterator.cc: fix ++/-- tests
+
+1999-03-29 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_ostream.h: Looks like this, actually: Fix up eh-isms.
+ * bits/ostream.tcc: Same.
+
+ * bits/std_istream.h: Bring over ostream changes, implement member
+ functions. Baseline.
+ * bits/istream.tcc: New file.
+
+1999-03-26 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/gslice.h (class gslice): fix friends template.
+
+1999-03-23 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_ostream.h: Fix sentry objects, implement seekp, tellp,
+ delete cruft, etc.
+ * bits/ostream.tcc: Same.
+
+ * bits/std_istream.h: Minor tweaks.
+
+1999-03-18 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * src/locale-inst.cc: Remove duplicate instantiations.
+ * bits/locfacets.tcc: Tweak definitions of static member.
+
+1999-03-18 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_fstream.h: Format: prepend "__" in front of
+ non-standard typedefs.
+ * bits/fstream.tcc: Match.
+ * bits/std_streambuf.h: Format: prepend "__" in front of
+ non-standard typedefs.
+
+ * bits/sstream.tcc: Match.
+ * bits/std_istream.h: Format.
+ * src/locale-inst.cc: Add num_get instantiations.
+
+ * bits/std_sstream.h: Fix crash in stringstreams. Remove member
+ _M_sb, a basic_stringbuf object, and use the basic_ios pointer
+ _M_streambuf instead. Make initializations sane. Fix
+ allocation/deallocation of _M_streambuf.
+ * bits/std_ostream.h: Fix initialization code.
+ (ctor): Eliminate redundant this->init(), let base class initialize.
+ (default ctor): New. Assume base classes already initialzed.
+ * bits/std_istream.h: Parallel work to ostream.
+ (ctor): Eliminate redundant this->init(), let base class initialize.
+ (default ctor): New. Assume base classes already initialzed.
+ Fix initialization of basic_iostream.
+
+ * bits/std_fstream.h: While we're at it, make initializations sane
+ here too. Now matches sstream.h.
+
+ * bits/string.tcc: Fix crash in basic_string::compare.
+ * bits/basic_string.h: And here.
+ * bits/c++config.h: Add comment about _G_USE_EXCEPTIONS.
+
+ * testsuite/make_check_libfree++: Check shared as well.
+ * testsuite/27/27stringstream.cc: Add bits.
+ * testsuite/27/27boolfmt.cc: Add bits.
+ * testsuite/27/27octfmt.cc: Add bits.
+
+1999-03-17 Benjamin Kosnik <bkoz@happy.cygnus.com>
+
+ * configure.in (USE_LONG_DOUBLE): signbitl link error.
+
+ * bits/locfacets.h: Fix errors that cause build problems
+ with current egcs (template parameters have class scope).
+ * bits/locfacets.tcc: Same.
+ * src/locale-inst.cc: Same, clean.
+ * src/misc-inst.cc: Same, clean.
+
+1999-03-17 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
+
+ * stl/bits/std_memory.h: Modify auto_ptr::reset to reflect the
+ standard. Re-apply this previous patch.
+
+1999-03-17 Philip Martin <pm@corris.dircon.co.uk>
+
+ * bits/basic_string.h: Use __normal_iterator<> for iterators.
+ * bits/std_sstream.h: Support __normal_iterator<> iterators.
+ * bits/string.tcc: Ditto.
+ * src/misc-inst.cc: Ditto.
+ * src/locale-inst.cc: Ditto.
+ * stl/bits/stl_iterator.h: Add __normal_iterator<>.
+ * stl/bits/stl_vector.h: Use __normal_iterator<> for iterators.
+ * testsuite/24/24iterator.cc: Add test cases for basic_string and
+ vector iterators.
+
+1999-03-16 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/locfacets.tcc: Remove macro hack.
+ * bits/locfacets.h: Tweaks.
+ * src/misc-inst.cc: Weed out locale-related instantiations.
+ * src/locale-inst.cc: Same.
+
+ * RELEASE-NOTES: Make more changes.
+ * bits/c++config.h: Bump version number.
+
+ * testsuite/make_check_libfree++: Collect diagnostics.
+
+ * bits/std_ostream.h: Fix ostream initialization/destruction
+ problem, related to dtor cleanup and new cached facets, agggggggh.
+ * bits/ostream.tcc: Tweak.
+ * bits/locfacets.h: Remove all friends of iostream classes.
+ * bits/ios_base.h: Same.
+ * bits/streambuf.tcc: Tweak.
+ * bits/std_streambuf.h: Tweak.
+ * bits/std_fstream.h: Tweak.
+ * bits/fstream.tcc: Tweak.
+ * src/stdstreams.cc: Tweak.
+ * src/ios.cc: Close streams.
+
+ * math/Makefile.in: Add missing files for shared link errors.
+ * math/Makefile.am: Same.
+
+1999-03-15 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * src/locale-inst.cc: More wchar_t instantiations.
+ * src/misc-inst.cc: Missed a few bits.
+ * testsuite/make_check_libfree++: Add static and shared runs.
+ * src/ios.cc: Add clarity to ios_base::Init::~Init().
+
+1999-03-15 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_ostream.h: Format, expunge, simplify. Add cached
+ facets. Resolve link errors.
+ * bits/ostream.tcc: Same.
+ * src/misc-inst.cc: Add ostream, wostream instantiations.
+ * src/Makefile.am: Add missing bits for stdstreams.cc.
+ * src/Makefile.in: Same.
+ * bits/std_iosfwd.h: Format.
+ * bits/locfacets.h (num_put): Add basic_ostream as a friend to
+ num_put so that cached _M_fnumput pointer can be deleted in
+ basic_ostream's dtor. Now everybody plays nice.
+
+1999-03-12 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
+
+ * bits/gslice.h (class gslice): Make friends valarray,
+ gslice_array and _GliceExpression.
+
+1999-03-11 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * RELEASE-NOTES: Update.
+ * src/ios.cc: Use do proper init.
+ * bits/std_streambuf.h: Tweak.
+ * bits/std_iostream.h: Take out static member.
+ * std/iostream: Put here.
+ * bits/std_ostream.h: Non-default ctor shouldn't smash _M_streambuf.
+ * bits/std_istream.h: Ditto.
+ * bits/basic_ios.h: Format.
+ * bits/ostream.tcc(write): Fix.
+ * bits/fstream.tcc: Fix stdstreams ctor to do a proper
+ initialization of the fstream class.
+ * src/stdstreams.cc: I'm baaaaaaaack.
+
+1999-03-10 Benjamin Kosnik <bkoz@rhino.cygnus.com>
+
+ * bits/ios_base.h: Correct comments. Add ios_base::init()
+ functionality. Format, tweak, expunge, clean, bathe, and hang to dry.
+ * src/misc-inst.cc: Add instantiations here.
+ * src/ios.cc: Clean.
+ * bits/std_iostream.h: Add wrappers, global ios_base::Init object.
+ * src/stdstreams.cc: Delete this file, as now unnecessary.
+ * bits/fstream.tcc: Add missing initialization bits for ctor.
+ * src/Makefile.am (libstdc___la_SOURCES): Delete here as well.
+ * src/Makefile.in (libstdc___la_OBJECTS): And here.
+
+ * bits/streambuf.tcc: Tweak.
+ * bits/sstream.tcc: Here too.
+
+ * bits/fstream.tcc: And change definition as well.
+ * bits/std_fstream.h: Change ctor.
+ * src/basic_file.cc (sys_open): Add call that opens a specific fileno.
+ * bits/basic_file.h: Add declarations.
+
+ * testsuite/27/27hello.cc: New file.
+
+ * bits/std_ostream.h: Move flush() inline.
+ * bits/ostream.tcc: From here.
+
+ * bits/char_traits.h: Add include of fpos.h for streamoff/streampos.
+ * bits/std_ios.h: Change include libio to only when necessary.
+ * bits/fpos.h: Like here.
+ * ios_base.h: And here.
+
+ * bits/locfacets.h: Change _Iostate to _Ios_Iostate.
+ * bits/locfacets.tcc: Same.
+ * bits/std_locale.h: Include std_ios.h not std_iosfwd.h.
+ * bits/std_iosfwd.h: Move _Ios_Iostate to ios_base.h
+
+1999-03-09 Benjamin Kosnik <bkoz@rhino.cygnus.com>
+
+ * bits/basic_ios.h: Change _M_ctype to _M_fctype.
+
+ * bits/std_streambuf.h: Clean, tweak.
+ * bits/std_fstream.h: Same.
+ * bits/std_sstream.h: Same.
+ * bits/streambuf.tcc: Move most member functions out-of-line.
+ * bits/fstream.tcc: Same.
+ * bits/streambuf.tcc: Same.
+
+ * bits/basic_file.h(filepos_cur): Set correctly.
+ (filepos_beg): Same.
+ (seekpos): Change to __c_streampos.
+ * src/basic_file.cc (std): Change to __c_streampos.
+
+ * testsuite/27/27filebuf.cc: Round one is finished.
+ * testsuite/27/27filebuf-2.tst: New file, final output should match.
+ * testsuite/27/27filebuf-3.tst: Same.
+
+1999-03-08 Benjamin Kosnik <bkoz@rhino.cygnus.com>
+
+ * bits/basic_file.h: Fix typo, add comments about what to expect
+ from the various member functions in __basic_file.
+
+ * bits/std_fstream.h: Re-do sync/underflow to work
+ together. Change from sys_read to xsgetn and from sys_write to
+ xsputn. As it should have been from the beginning. . .
+
+1999-03-06 Benjamin Kosnik <bkoz@haight.constant.com>
+
+ * bits/c++config.h (__GLIBCPP__): Add versioning macro.
+
+ * bits/basic_file.h(file_beg): New function.
+ (file_cur): Ditto.
+
+ * testsuite/27/27filebuf.cc: Test in, out, in | out.
+ * bits/std_fstream.h: More _M_mode refinements.
+ (synch): Add bits for out mode only.
+ * bits/std_streambuf.h(xsputn): Correct for filebufs.
+ * bits/std_sstream.h: Ditto.
+
+1999-03-03 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_fstream.h: Fix _M_mode AND with ios_base::openmode.
+ * testsuite/27/27filebuf.cc: Modify.
+ * bits/c++config.h: Fix.
+
+1999-03-02 Benjamin Kosnik <bkoz@tintin.cygnus.com>
+
+ * bits/c++config.h: New macro, _G_RESOLVE_LIB_DEFECTS, used to put
+ code in place that diverges from the final standard, but has been
+ brought up on the library mailing list.
+
+ * bits/std_fstream.h(underflow): Position all three internal
+ buffer pointers at the same initial position. Re-implement with
+ basic_filebuf abstraction.
+ (overflow): Ditto.
+ (seekoff): Ditto.
+ (seekpos): Ditto.
+ * bits/std_sstream.h: Move _M_mode down into base class
+ basic_streambuf.
+ * bits/sstream.tcc: Ditto.
+ * bits/std_streambuf.h: Ditto.
+
+ * testsuite/27/27filebuf.cc: Tweak.
+
+1999-02-27 Benjamin Kosnik <bkoz@slap-happy.cygnus.com>
+
+ * bits/std_sstream.h: Ditto.
+ * bits/std_fstream.h: Fix blip.
+
+1999-02-26 Benjamin Kosnik <bkoz@happy.cygnus.com>
+
+ * C++STYLE: Add cases.
+ * bits/std_fstream.h: Format.
+ * bits/std_streambuf.h: Ditto.
+ * bits/std_sstream.h: Ditto.
+
+ * src/basic_file.cc(sys_seek): Fix stack delirium, by keeping
+ return type for _IO_file_seek and __basic_file::seek the same size.
+ * bits/basic_file.h: Ditto.
+
+1999-02-26 Benjamin Kosnik <bkoz@happy.cygnus.com>
+
+ * bits/fstream.tcc: Add include guards.
+ * src/misc-inst.cc: Add instantiations for shared libes.
+ * src/locale-inst.cc: Add instantiaions for use_facet.
+ * bits/loccore.h: Remove specialization foward decls for
+ use_facet<ctype>: perhaps add the whole lot of them later on.
+ * bits/std_fstream.h: Fix.
+ * bits/locfacets.h: Ditto.
+ * src/stdstreams.cc: Disable wide streams for now.
+
+ * src/Makefile.am (CXXFLAGS): Change up.
+ * src/Makefile.in (CXXFLAGS): Ditto.
+
+1999-02-25 Benjamin Kosnik <bkoz@happy.cygnus.com>
+
+ * src/basic_file.cc: Change to ios_base::seekdir from int.
+ * bits/basic_file.h: Ditto.
+ * bits/locfacets.h : Fix blip with new guard macros.
+
+1999-02-25 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * stl/bits/stl_config.h (__STL_USE_STD_ALLOCATORS): Minor tweaking.
+ * bits/c++config.h: Clean. Remove _G_NO_STREAMBUF_ITERATORS and
+ _G_USE_NAMESPACE.
+ * amm1/locale: Remove unused defines.
+ * generic/locale: Ditto.
+ * src/ios.cc: Ditto.
+ * src/locale.cc: Ditto.
+ * src/locale-inst.cc: Ditto.
+ * src/localename.cc: Ditto.
+ * src/stdstreams.cc: And here.
+
+ * bits/c++config.h (_G_USE_WCHAR_T): Fix.
+ * bits/loccore.h: Simplify, clean, add wchar_t guards.
+ * bits/loccore.tcc: Ditto.
+ * bits/locfacets.h: Ditto.
+ * src/locale-inst.cc: Ditto.
+ * bits/locfacets.tcc: Add do_put long long here.
+
+1999-02-24 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_streambuf.h: Add cached ctype facet, _M_ctype.
+ * bits/basic_ios.h: Clean. Replace _M_strbuf with
+ _M_streambuf. Use cached _M_cvt in basic_streambuf.
+ * bits/std_istream.h: Replace _M_strbuf with _M_streambuf.
+ * bits/std_fstream.h: Tweak.
+
+ * bits/char_traits.h: Remove fpos definitions from here. . .
+ * bits/fpos.h: New file, put them here. Eventually, this may allow
+ the severing of char_traits and fpos dependencies.
+ * src/Makefile.in: Add fpos.h.
+ * src/Makefile.am: Ditto.
+ * bits/std_string.h: Add fpos.h include here.
+ * bits/std_ios.h: And here.
+
+ * bits/std_streambuf.h: Change _M_init to _M_initialized.
+ * bits/ios_base.h: Remove cstdio include.
+ * bits/std_ios.h: ... Place here.
+
+1999-02-23 Benjamin Kosnik <bkoz@loony.cygnus.com>
+
+ * src/Makefile.in (CXXFLAGS): Re-add -fvtable-thunks.
+ * src/Makefile.am (CXXFLAGS): Re-add -fvtable-thunks.
+
+ * bits/basic_file.h: Comment, adjust arguments.
+ * src/basic_file.cc: Ditto.
+
+ * bits/std_fstream.h(seekoff): Error is of fpos type, not integral
+ type: check and convert accordingly. Re-interpet "resultant stream
+ position" to indicate external byte sequence location, not internal
+ buffer info.
+
+1999-02-22 Benjamin Kosnik <bkoz@loony.cygnus.com>
+
+ * mkcshadow: And change copyright here.
+ * src/Makefile.am (CXXFLAGS): Add -g -O2. Add new header
+ dependencies for stl_pthread_alloc.h, pthread_allocimpl.h,
+ stl_thread.h, and stl_iterator_base.h.
+ * src/Makefile.in (CXXFLAGS): Ditto.
+ * stl/backward/pthread_alloc.h: Remove.
+
+1999-02-19 Benjamin Kosnik <bkoz@loony.cygnus.com>
+
+ * bits/std_streambuf.h (sungetc): Use standard defs for putback
+ position.
+ * bits/std_fstream.h (pbackfail): Correct.
+ (sungetc): Test.
+ (seekoff): Implement.
+ (seekpos): Re-do.
+ * testsuite/27/27filebuf.cc: Add test cases.
+
+1999-02-18 Benjamin Kosnik <bkoz@loony.cygnus.com>
+
+ * bits/std_fstream.h: Go with basic_file's interfaces for dealing
+ with the external buffers, and stop mucking around with setting
+ and re-setting the external buf's pointers. Aka, clarity and
+ simplicity rule the day.
+ * src/locale.cc: Use memcpy in codecvt::do_in and codecvt::do_out.
+ Remove partial result and support code.
+
+1999-02-18 Ulrich Drepper <drepper@cygnus.com>
+
+ * configure.in: Add hypot, hypotf, atan2f, expf, and copysignf to
+ list of function which have to be replaced.
+ Remove expf from list of functions to test for.
+ Define USE_LONG_DOUBLE in case the libm has partial support for long
+ doubles.
+ * Makefile.in: Regenerated.
+ * config.h.in: Likewise.
+ * configure: Likewise.
+ * libio/Makefile.am (LIBIO_SRCS): Add missing backslash.
+ * libio/Makefile.in: Regenerated.
+ * src/Makefile.in: Regenerated.
+ * string/Makefile.in: Regenerated.
+ * math/Makefile.am (EXTRA_DIST): Add hypot.c, hypotf.c, hypotl.c,
+ atan2f.c, expf.c, and $(EXTRA_yes).
+ (EXTRA_yes): Add signbitl.c mycabsl.c.
+ (libmath_la_LIBADD): Add $(EXTRA_$(USE_LONG_DOUBLE)).
+ (libmath_la_SOURCES): remove long double versions.
+ * math/Makefile.in: Regnerated.
+ * math/atan2f.c: New file.
+ * math/copysignf.c: New file.
+ * math/expf.c: New file.
+ * math/hypot.c: New file.
+ * math/hypotf.c: New file.
+ * math/hypotl.c: New file.
+ * math/cargf.c: Use correct function and macro names.
+ * math/ccos.c: Likewise.
+ * math/ccosh.c: Likewise.
+ * math/ccoshf.c: Likewise.
+ * math/ccoshl.c: Likewise.
+ * math/cexp.c: Likewise.
+ * math/cexpf.c: Likewise.
+ * math/cexpl.c: Likewise.
+ * math/clog.c: Likewise.
+ * math/clog10.c: Likewise.
+ * math/clog10f.c: Likewise.
+ * math/clog10l.c: Likewise.
+ * math/clogf.c: Likewise.
+ * math/clogl.c: Likewise.
+ * math/copysignf.c: Likewise.
+ * math/csin.c: Likewise.
+ * math/csinf.c: Likewise.
+ * math/csinh.c: Likewise.
+ * math/csinhf.c: Likewise.
+ * math/csinhl.c: Likewise.
+ * math/csinl.c: Likewise.
+ * math/csqrt.c: Likewise.
+ * math/csqrtf.c: Likewise.
+ * math/csqrtl.c: Likewise.
+ * math/ctan.c: Likewise.
+ * math/ctanf.c: Likewise.
+ * math/ctanh.c: Likewise.
+ * math/ctanhf.c: Likewise.
+ * math/ctanhl.c: Likewise.
+ * math/ctanl.c: Likewise.
+
+1999-02-17 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * testsuite/27/27filebuf.cc: Add cases.
+ * testsuite/27/27filebuf-1.txt: Remove inadvertent garbage.
+ * bits/std_streambuf.h: Simplify, always have one return statement.
+ * bits/std_fstream.h: Tweak comments in underflow.
+
+1999-02-17 Ulrich Drepper <drepper@cygnus.com>
+
+ * ltmain.sh: Update from libtool 1.2d and fix Solaris problems.
+ * ltconfig: Likewise.
+
+1999-02-16 Christophe Pierret <cpierret@businessobjects.com>
+
+ * src/locale.cc: Fix assert.
+
+1999-02-16 Benjamin Kosnik <bkoz@cygnus.com>
+
+ FIXME: Still need some kind of solution for undefined math symbols.
+ * src/Makefile.in (locale-inst.lo): Compile with
+ -fimplicit-templates to fix Solaris link problem.
+ * src/Makefile.am: Ditto.
+ * libio/Makefile.in: Add stdfiles.c so that _IO_list_all is defined.
+ * libio/Makefile.am: Ditto.
+ * src/locale.cc: Provide some kind of def for _S_tolower.
+ * bits/locfacets.h: Fix declarations of ctype<wchar_t> to
+ match ctype<char> for _S_tolower, _S_toupper, _S_table.
+
+1999-02-10 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/loccore.tcc: Move member-template ctor inline...
+ * bits/loccore.h: ...here.
+ * src/locale-inst.cc: Add instantiation here.
+
+ * testsuite/27/27stringstream.cc: Tweak.
+
+ * bits/ostream.tcc: Include sbuf_iter.h.
+
+ * bits/ostream.tcc: Convert *this to ostreambuf_iterator before
+ passing to num_put, as num_put's first argument is an interator,
+ not basic_ostream.
+
+ * testsuite/make_check_libfree++: New file, runs through the
+ existing test files in the testsuite directory and makes sure
+ they link.
+
+1999-02-10 Brendan Kehoe <brendan@cygnus.com>
+
+ * testsuite/21/21compare.cc: Fix typo.
+ * src/locale.cc (ctype<wchar_t>::_S_{toupper,tolower,table}):
+ Don't try to provide non-linux versions, since it's impossible to
+ initialize their const references with the integer 0, no matter
+ how we try to cast it.
+
+1999-02-10 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_locale.h: Move std_vector.h dependency.
+ * bits/std_ios.h: ...from here.
+ * bits/std_string.h: ...and here.
+ * src/locale.cc: ..to here.
+ * bits/loccore.h: Ditto, add vector forward declaration,
+ make locale::_Impl data members pointers not containers.
+ * bits/loccore.tcc: Move out-of-line for now.
+ * bits/locfacets.h: Move vector dependency from here...
+ * bits/locfacets.tcc: ...to here.
+ * src/localename.cc: ..and here.
+ * src/locale-inst.cc: Add include of locfacets.tcc here.
+
+ * stl/bits/stl_string_fwd.h: Make __get_c_string non-static.
+ * bits/basic_string.h: Can't use sizeof on an incomplete type.
+ * bits/string.tcc: Tweak.
+ * src/string.cc: And add __get_c_string def here.
+
+ * bits/std_fstream.h: Yeah, comment the fill_n idea out as impractical.
+
+ * src/stlinst.cc: Add include of stl_config.h.
+
+1999-02-09 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * stl/bits/std_bitset.h: Update to SGI STL 3.12.
+ * stl/bits/stl_config.h: Tweak, update.
+ * stl/bits/std_stdexcept.h: Ditto, change stl_exception to
+ std_exception.
+ * stl/bits/std_memory.h: Reconstructed auto_ptr, Ditto.
+ * stl/bits/std_functional.h: Ditto.
+
+ * stl/bits/stl_string.h: New file, SGI's string
+ implementation. For reference only, corresponding to string in
+ 3.12 source.
+ * stl/bits/stl_char_traits.h: As above.
+
+ * stl/bits/pthread_allocimpl.h: New file corresponding to
+ pthread_alloc.
+ * stl/bits/stl_pthread_alloc.h: New file corresponding to
+ pthread_alloc.h
+ * stl/bits/stl_threads.h: New file.
+
+ Note that SGI STL 3.12's file iterator.h is not used.
+ * stl/bits/std_iterator.h: Ditto.
+ * stl/bits/stl_iterator.h: Drop in replace.
+ * stl/bits/stl_iterator_base.h: New file, drop in replace.
+
+ * stl/bits/stl_queue.h, stl_rope.h, stl_set.h, stl_stack.h,
+ stl_string_fwd.h, stl_tempbuf.h, stl_tree.h, stl_vector.h,
+ stl_pair.h, stl_multimap.h, stl_multiset.h, stl_list.h,
+ stl_hashtable.h, stl_hash_set.h, stl_hash_map.h, stl_function.h,
+ stl_deque.h, stl_alloc.h, stl_algo.h, stl_algobase.h, ropeimpl.h:
+ Drop-in replace (ie, stop changing __SGI_STL_* to _CPP_BITS_* for
+ preprocessor guards, but fixup include paths and names according
+ to new directory layout).
+
+1999-02-05 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_fstream.h: Remove _M_open data member.
+ * bits/fstream.tcc: Ditto.
+
+ * src/locale.cc: Tweak.
+
+ * bits/std_sstream.h: Simplify.
+
+ * bits/std_streambuf.h: Simplify.
+ (sputc): Use correct definition of "write area."
+
+ * bits/std_fstream.h: Fix uflow.
+ * src/basic_file.cc: Tweak.
+ * testsuite/27/27filebuf.cc: Add tests.
+ * testsuite/27/27filebuf-3.txt: Rename to *-2.txt.
+
+1999-02-02 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
+
+ * bits/ios_base.h: Make protected.
+
+1999-02-01 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
+
+ * bits/ios_base.h: Changes in the class ios_base:
+ Rename _M_exceptions member to _M_exceptions_data.
+ Make the member functions rdstate(), clear(), exceptions()
+ and exceptions(iostate) protected and add the "_M_" prefix.
+ * src/ios.cc: Ditto.
+ * bits/basic_ios.h: Adapt the changes from ios_base.
+
+1999-01-29 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/std_fstream.h: Remove _M_flags, _M_equilibrate as unnecessary.
+ * bits/fstream.tcc: Ditto.
+
+ * bits/std_fstream.h (underflow): Resize deallocates memory and
+ resets pointers in the internal cache according to new _M_buf. . dooh!
+ * src/locale.cc: Mas changes with codecvt::do_in, do_out.
+
+1999-01-29 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
+
+ * stl/bits/std_memory.h: Modify auto_ptr::reset to reflect the
+ standard.
+
+1999-01-28 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * src/locale.cc (codecvt::do_in): Finer-grained tuning to take
+ into account partial returns.
+ (codecvt::do_out): Likewise.
+
+ * bits/char_traits.h: Change streamsize to be a signed type, as
+ required by 27.4.1 Types p 2. (Changing to _IO_ssize_t.)
+ * bits/std_streambuf.h: Make
+ in_avail() and showmanyc() have streamsize as return types, so
+ that showmanyc()'s return of eof won't underflow in_avail's return
+ value and give a bogus result.
+ * src/misc-inst.cc: And more changes. . .
+
+ * bits/std_streambuf.h (basic_streambuf): Add _M_buf_unified to keep
+ track of joint in/out pointers into the internal buffer.
+ (sbumpc): Add check for _M_buf_unified.
+ (sputbackc): Ditto.
+ (sungetc): Ditto.
+
+ * testsuite/27/27filebuf.cc: Add cases.
+ * testsuite/27/27stringbuf.cc: Add showmanyc case.
+
+ * bits/std_fstream.h (close): Fix logic error.
+ (open): Initialize internal pointers based on _M_buf and _M_buf_size.
+ (showmanyc): Add underflow component, to match the standard.
+
+ * bits/fstream.tcc: Ditto.
+
+1999-01-27 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/basic_file.h: Match vtables w/ _IO_FILE_plus.
+ * src/basic_file.cc: Ditto.
+ * src/Makefile.in: Add -fvtable-thunks to CXXFLAGS: preferred
+ format for dealing with _IO_file in libio.
+
+1999-01-27 Ulrich Drepper <drepper@cygnus.com>
+
+ * src/basic_file.cc: Include fcntl.h.
+
+1999-01-27 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * libio/Makefile.in: Add fileops.lo, genops.lo to objects to debug
+ libio calls.
+ * bits/std_streambuf.h: Redefine read posion.
+
+ * bits/std_fstream.h: Temporary hack to get vtables working again.
+ * bits/basic_file.h: Revert.
+ * src/basic_file.cc: Ditto.
+ * testsuite/27/27filebuf.cc: Tweak.
+
+1999-01-26 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/basic_file.h: Add showmanyc, underflow. .
+ * src/basic_file.cc: Ditto.
+
+ * bits/std_fstream.h (showmanyc): Add bits to ping libio to see if more
+ chars can be read.
+
+ * testsuite/27/27filebuf.cc: Add testcases.
+ * src/basic_file.cc: Add O_CREAT to open calls with
+ ios_base::trunc as part of the open mode.
+
+1999-01-26 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
+
+ * bits/basic_ios.h: fix basic_ios::exceptions(iostate)
+
+1999-01-25 Benjamin Kosnik <bkoz@nabi.net>
+
+ * src/ios.cc (clear): Correct typo.
+ * bits/ios_base.h: Tweak spacing.
+
+1999-01-25 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
+
+ * bits/basic_ios.h: fix basic_ios::fail()
+
+1999-01-25 Benjamin Kosnik <bkoz@loony.cygnus.com>
+
+ * bits/basic_file.h: Include libioP.h from libio instead of here.
+ * bits/iolibio.h: Remove.
+ * bits/libio.h: Remove.
+
+1999-01-22 Benjamin Kosnik <bkoz@lunatic.cygnus.com>
+
+ * bits/std_fstream.h: Tweak cvt-> in call for newer egcs compilers.
+
+1999-01-22 Ulrich Drepper <drepper@cygnus.com>
+
+ * Makefile.am (SUBDIRS): Add libio.
+ * configure.in: Add rule to test for glibc2.
+
+ * src/Makefile.am (INCLUDES): Add -I to libio subdir.
+ (libstdc___la_LIBADD): Add libio.la.
+
+1999-01-21 Benjamin Kosnik <bkoz@cygnus.com>
+
+ * bits/basic_file.h: Make new abstraction for underlying C library
+ FILE, named __basic_file.
+ * src/basic_file.cc: New file.
+ * bits/os_raw.h: Delete.
+ * src/os_raw.cc: Delete.
+ * src/Makefile.in: Tweak.
+ * src/Makefile.am: Tweak.
+ * bits/iolibio.h: Add this here, for the time being.
+ * bits/libioP.h: Ditto.
+
+ * bits/ios_base.h: Delete unused defines.
+ * src/locale.cc (codecvt<char, char, mbstate_t>::do_in): Use
+ strcpy to copy between the two buffers.
+
+ * testsuite/27/27stringbuf.cc: Change license, fix in_avail tests.
+ * testsuite/27/27filebuf.cc: New file.
+ * testsuite/27/27filebuf-1.txt: Data file for above test.
+ * testsuite/27/27filebuf-2.txt: Ditto.
+
+ * bits/std_streambuf.h (uflow): Re-implement default.
+ * bits/std_fstream.h: Set _M_buf_size based on cstdio's BUFSIZ.
+ Re-implement virtual functions.
+ * bits/fstream.tcc: Delete unused mf's.
+
diff --git a/libstdc++-v3/ChangeLog-2000 b/libstdc++-v3/ChangeLog-2000
index d21b530839b..98b74025abd 100644
--- a/libstdc++-v3/ChangeLog-2000
+++ b/libstdc++-v3/ChangeLog-2000
@@ -5642,4489 +5642,3 @@ Thu Nov 2 10:11:45 2000 Mark P Mitchell <mark@codesourcery.com>
docs/status.html, docs/thanks.html, docs/faq/index.txt: Ditto.
* docs/how.html: Ditto. (This file should go away soon.)
-1999-12-26 Phil Edwards <pme@sourceware.cygnus.com>
-
- * docs/gentop/status: Add snapshot version column, update
- for Solaris 7.
- * docs/status.html: Regenerated.
-
-1999-12-26 Phil Edwards <pme@sourceware.cygnus.com>
-
- * docs/faq/index.html: Turn README and RELEASE-NOTES into links
- from installation FAQ, and specify location of text files.
- * docs/faq/index.txt: Regenerated.
-
-1999-12-23 Phil Edwards <pme@sourceware.cygnus.com>
-
- * docs/gentop/download: Add links to prebuilds for Cygwin/Mingw32.
- * docs/download.html: Regenerated.
-
-1999-12-22 Phil Edwards <pme@sourceware.cygnus.com>
-
- * docs/faq/index.html: Update 'what works' for .7 snapshot,
- clean up various links.
- * docs/faq/index.txt: Regenerated.
- * docs/gentop/gentop: Smarter regeneration script.
- * docs/gentop/{head,foot}chunk.html: Updated with new
- contributors link and mod date.
- * docs/gentop/index: Snapshot relase date.
- * docs/gentop/thanks: New contributors page added.
- * docs/{download,how,index,links,mail,status,thanks}.html:
- Regenerated from gentop; thanks.html created.
-
-1999-12-21 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
-
- * bits/c++config.h.in (__GLIBCPP__): 19991221.
- * docs/index.html: Add correct information.
-
- * config/irix: New directory.
- * config/irix/ctype.cc: Add irix-6.5 info. Not tested.
- * config/irix/bits/ctype_base.h: And here.
-
- * config/aix: New directory.
- * config/aix/ctype.cc: Add aix-4.2 info. Not tested.
- * config/aix/bits/ctype_base.h: And here.
-
-1999-12-21 Philip Martin <pm@corris.dircon.co.uk>
-
- * bits/basic_string.h: Add special case handling for integral
- "iterators".
- * bits/std_string.h: include type_traits.h
- * testsuite/21_strings/ctor_copy_dtor.cc: Tweak.
-
-1999-12-21 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
-
- * bits/fstream.tcc (seekoff): Output buffer based on _M_*_in and
- _M_*_end now.
- * bits/std_fstream.h (sync): And here.
- * testsuite/27_io/filebuf.cc: Revisions.
- * testsuite/27_io/filebuf-2.tst: Correct, remove weird character
- at the end of the file.
- * testsuite/27_io/filebuf-3.tst: Correct.
-
-1999-12-21 Phil Edwards <pedwards@jaj.com>
-
- * docs/gentop/index: Hold off on .7 announcement date.
- * docs/index.html: Regenerate.
-
-1999-12-21 Benjamin Kosnik <bkoz@kcygnus.com>
-
- * bits/std_fstream.h (sync): Move _M_file->sync() to
- _M_really_overflow().
- * bits/fstream.tcc (seekoff): Call sync, not _M_really_overflow so
- as to get the _M_file->sync action, which forces the external
- buffer to update itself.
- (underflow): Same here.
-
-1999-12-21 Phil Edwards <pedwards@jaj.com>
-
- * bits/c++config.h.in: Uncomment _GLIBCPP_USE_NAMESPACES and move...
- * acconfig.h: ...to here.
- * config.h.in: Regenerate from aclocal.
- * acinclude.m4: Add GLIBCPP_ENABLE_DEBUG, GLIBCPP_ENABLE_NAMESPACES.
- * aclocal.m4: Regenerate from acinclude.
- * configure.in: Use ENABLE macros here.
- * configure: Regenerate.
- * src/Makefile.am: Use results from ENABLE macros.
- * src/Makefile.in: Regenerate.
-
-1999-12-20 Benjamin Kosnik <bkoz@cygnus.com>
-
- * mkcheck (SRC_DIR): Now have to include config/* dir if "make
- check" and not "make check-install." Temporarily hack in linux
- support.
-
- * bits/std_streambuf.h: Tweaks.
- * bits/streambuf.tcc (xsgetn): Tweaks.
- * bits/std_fstream.h (sync): Make _M_really_overflow consistent.
- * bits/fstream.tcc (filebuf::underflow): Simplify.
- * bits/std_sstream.h (streambuf::underflow): Minor change to make
- checks for read position precisely implement the standard.
- * bits/basic_file.h (filepos_cur): Base this on _offset.
- * testsuite/21_strings/inserters_extractors.cc (test05): Tweaks.
- * testsuite/27_io/filebuf.cc: Tweak.
-
-1999-12-20 Benjamin Kosnik <bkoz@cygnus.com>
-
- * docs/17_intro/RELEASE-NOTES: Fix typos.
-
- * bits/locale_facets.h (ctype): Modify, use __to_type to abstract
- out platform-specific bits.
- * config/default/ctype.cc: And here.
- * config/defaults/bits/ctype_base.h: And here.
- * config/linux/ctype.cc: And here.
- * config/linux/bits/ctype_base.h (ctype_base): And here.
- * config/solaris/bits/ctype_base.h (ctype_base): Add
- __to_type. Comment, as it looks like this is for solaris2.6 and
- above: solaris2.5.1 doesn't seem to have the same definitions.
- * config/solaris/ctype.cc: And here.
-
-1999-12-19 Benjamin Kosnik <bkoz@cygnus.com>
- Ulrich Drepper <drepper@cygnus.com>
-
- * acconfig.h: Remove _GLIBCPP_USE_CTYPE_ISBIT.
-
- * src/locale.cc: Take out platform-specific hacks.
- * config/linux/ctype.cc: Put here.
- * config/solaris/ctype.cc: Put here.
- * config/default/ctype.cc: Put here.
-
- * bits/locale_facets.h: Take out platform-specific hacks.
- * config/linux/bits/ctype_base.h: Put here.
- * config/solaris/bits/ctype_base.h: Put here.
- * config/default/bits/ctype_base.h: Put here.
-
- * configure.in: Bump version.
- Add tests for top-level config directory.
- * configure: Regenerated.
- * src/Makefile.am (INCLUDES): Add platform-specific dir.
- * src/Makefile: Regenerate.
-
-1999-12-19 Benjamin Kosnik <bkoz@cygnus.com>
- Ulrich Drepper <drepper@cygnus.com>
-
- * bits/locale_facets.h: Hack in solaris support.
- * src/locale.cc: Here too.
-
-1999-12-18 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * docs/17_intro/TODO: Update
- * docs/17_intro/RELEASE-NOTES (New): Update.
-
-1999-12-17 Benjamin Kosnik <bkoz@milou.cygnus.com>
-
- * bits/c++config.h.in (__GLIBCPP__): Bump.
- * docs/17_intro/RELEASE-NOTES: Update, Gaby please add your stuff.
- * docs/17_intro/TODO: Update.
-
- * bits/locale_facets.h: Touch this too.
- * bits/localefwd.h: Add typedefs for loooooong vector names.
- * bits/locale_facets.tcc (locale::operator()): Need parens.
- (has_facet): Simplify.
- * src/locale-inst.cc: Add instantiations.
- * src/locale.cc: Tweaks.
-
- * bits/std_streambuf.h: Move indeterminates into. .
- * bits/std_fstream.h: Here.
- * bits/fstream.tcc (underflow): Rewind just for ios_base::out
- streams.
- * bits/sstream.tcc: Very minor formatting tweaks.
- * bits/std_streambuf.h (_M_set_determinate): If exclusively an
- input buffer, set _M_buf to offset.
- * bits/istream.tcc (std): Tweaks.
- * testsuite/27_io/istream_unformatted.cc (test05): More tweaks,
- include fstream.
- * testsuite/27_io/filebuf.cc: Tweaks.
-
-1999-12-17 Phil Edwards <pedwards@jaj.com>
-
- * configure.in: Add OPTLEVEL, -O2 for gcc 2.96+, nothing otherwise.
- * configure: Regenerate.
- * src/Makefile.am: Use OPTLEVEL in CXXFLAGS.
- * src/Makefile.in: Regenerate. Also picks up OTHER_CXXFLAGS rename
- to OPTIMIZE_CXXFLAGS from a previous revision (1.96) to Makefile.am.
-
-1999-12-17 Phil Edwards <pedwards@jaj.com>
-
- * docs/21_strings/stringtok_std_h.txt: New algorithm
- suggested by Chris King.
- * docs/21_strings/howto.html: Link to new version.
-
-1999-12-16 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/valarray_array.h (__valarray_sum): Use operator+=, not
- operator+.
- * docs/17_intro/TODO: Update.
-
-1999-12-15 Phil Edwards <pme@sourceware.cygnus.com>
-
- * docs/gentop/footchunk.html: Updated, fixed CRLFs.
- * docs/gentop/gentop: Ditto.
- * docs/gentop/headchunk.html: Ditto.
- * docs/*.html: Regenerated from gentop.
- * docs/*/howto.html: Updated as test.
- * docs/faq/index.html: Updated, fixed CRLFs.
- * docs/faq/index.txt: Regenerated.
-
-1999-12-15 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * mknumeric_limits (OUT_C): restart only if $OUT_C is present.
-
- * bits/std_complex.h
- (complex<float>::complex(const complex<double>&),
- complex<float>::complex(const complex<long double>&)): Define.
-
- * docs/17_intro/TODO: Update.
-
-1999-12-13 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/istream.tcc (seekg): Don't set _M_gcount.
- (tellg): Same.
- * bits/fstream.tcc (filebuf::underflow): Re-sync
- external byte sequence's input buffer only. . .
- * testsuite/27_io/istream_unformatted.cc (test04): New tests for
- tellg, seekg and filebufs.
- (test05): Same for stringbufs.
- * testsuite/27_io/istream_unformatted-2.tst: New file.
- * testsuite/27_io/istream_unformatted-1.tst: New file.
- * testsuite/27_io/istream_unformatted-1.txt: New file.
- * testsuite/21_strings/inserters_extractors.cc (test05): Change
- output file.
-
-1999-12-13 Phil Edwards <pedwards@jaj.com>
-
- * docs/gentop/*: New directory, containing bits for the homepages.
- * docs/*.html: Regenerated from gentop.
- * docs/*/*.html: Entries added and regenerated.
-
-1999-12-13 Benjamin Kosnik <bkoz@gnu.org>
-
- Efforts to get -O2 to work with -Winline -Werrors.
- * bits/valarray_array.h (__valarray_fill(_Tp*, size_t, const
- _Tp&): Remove inline declaration, as cannot be inlined and
- -Winline -Werror complains. An interesting question is why this
- cannot be inlined, as I can see no real reason to disqualify it.
- (__valarray_product(const _Tp*, const _Tp*)): Same here.
- * bits/std_valarray.h (valarray::operator[](size_t)): Same here.
-
- * docs/17_intro/TODO: Update.
-
-1999-12-12 Benjamin Kosnik <bkoz@gnu.org>
-
- * bits/std_fstream.h (seekpos): Tweaks, fixes. Move definition to
- fstream.tcc.
- * bits/basic_file.h (filepos_cur()): Make pointers themselves be
- the resultant position.
- * bits/fstream.tcc (seekoff): Explicitly set return value to
- resultant external byte sequence position, not value returned from
- _M_file->seekoff. Need to make
- (seekpos): New definition.
-
- * bits/istream.tcc (seekg): As per Library Issues List 136, set to
- just istream. Necessary, or else tellg will give an invalid stream
- position, but seekg will return a valid stream position, which is
- not groovy: see testcase addition.
- * bits/ostream.tcc (seekp): Same.
-
- * bits/streambuf.tcc (_S_copy_streambufs): Simplify.
- * bits/sstream.tcc: Tweaks.
- * bits/locale_facets.tcc: Tweaks.
- (num_put::do_put(iter_type, ios_base, char_type, const void*)):
- Re-write in a way that is easier for the inliner to work with.
- * bits/ios_base.h: Use explicit static_cast<int>(...) notation.
-
-1999-12-10 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/locale_facets.tcc: Tweaks.
- * bits/locale_facets.h (use_facet): Can't inline, remove inline
- from declaration.
- * bits/localefwd.h: And here.
- * bits/std_ostream.h: Tweaks, sentry ctor can't be inlined.
- * bits/ostream.tcc: Put here.
-
- Frank Ch. Eigler <fche@cygnus.com>
- * src/Makefile.am: Adjust CXXFLAGS, add AM_CXXFLAGS.
-
-1999-12-08 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/sstream.tcc (stringbuf::seekoff): Long overdue revamp. Make
- in and out buffers update independently.
-
- * bits/basic_ios.h: Minor formatting.
- * bits/fstream.tcc (std): Fix indentation.
-
-1999-12-08 Chip Salzenberg <chip@valinux.com>
-
- * bits/char_traits.h (char_traits<>): Move not_eof() functions
- after corresponding eof() functions, so they're easier for the
- compiler to inline.
- * bits/locale_facets.h (money_base::__default_pattern): Move
- static variable out of inline functions.
- (_Moneypunct<>::do_{pos,neg}_format): Use it.
- * src/locale-inst.cc (money_base::__default_pattern): Define it.
-
-1999-12-08 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_fstream.h (filebuf::open): Tweak.
- * bits/fstream.tcc (filebuf::seekoff): Simplify, fix.
- * bits/std_ios.h: Minor tweaks for headers.
-
-1999-12-06 Benjamin Kosnik <bkoz@gnu.org>
-
- * bits/c++config.h.in (_GLIBCPP_FULLY_COMPLIANT_HEADERS): New macro.
- * src/string-inst.cc: Add guards . . .
- * src/misc-inst.cc: And here.
- * bits/std_sstream.h: And here.
- * bits/std_fstream.h: And here.
- * bits/std_streambuf.h: And here.
- * bits/std_istream.h: And here.
- * bits/std_ostream.h: And here.
-
-1999-12-06 Scott Snyder <snyder@fnal.gov>
-
- * bits/istream.tcc (basic_istream::read): Try to handle __n == 0
- case.
- (basic_istream::readsome): And here as well.
- * testsuite/27_io/istream_unformatted.cc: Test a zero-length
- read().
-
-1999-12-06 Mumit Khan <khan@xraylith.wisc.edu>
-
- * bits/istream.tcc (basic_istream::ignore): streamsize is not
- necessarily an `int'.
-
-1999-12-06 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * mknumeric_limits: Don't use $CXXFLAGS when building
- gen-num-limits. It's definitely wrong to use it since $CXXFLAGS
- generally instructs the compiler not to emit template
- instantiations and we end up with undefined symbols. Sigh.
-
-1999-12-05 Benjamin Kosnik <bkoz@gnu.org>
-
- * bits/locale_facets.tcc: Tweak.
- (_S_format_long): Adjust showpos formatting for hex and oct.
- * bits/std_ostream.h (operator<<(short)): Correctly deal with hex
- and oct by formatting as unsigned.
- (operator<<(int)): Same here.
- * bits/ostream.tcc (operator<<(long)): Same.
- (operator<<(long long)): Same.
- (_S_pad_char): Actually treat ios_base::internal as something
- worth doing correctly. Remove const designation on ios argument.
- * testsuite/27_io/ios_manip_basefield.cc (test02): Add tests.
- * testsuite/27_io/ostream_inserter_arith.cc (test03): Add tests.
-
-1999-12-04 Benjamin Kosnik <bkoz@gnu.org>
-
- * bits/std_sstream.h (streambuf::underflow): Check for mode == in.
-
-1999-12-03 Benjamin Kosnik <bkoz@gnu.org>
-
- * bits/locale_facets.tcc (num_put::do_put(bool): Fix.
-
- * bits/sstream.tcc (streambuf::seekoff): Add parens.
- * bits/istream.tcc (istream::get(sb)): Handle exceptional events.
- (operator>>(istream, _CharT*)): Change streamsize to int_type.
- (operator>>(istream, _CharT&)): Fix typedef'd type to be _CharT.
- * bits/ostream.tcc (ostream::operator<<(const char*)): Stub out
- unused argument.
- (ostream::operator<<(_CharT)): Fix.
-
- * bits/std_sstream.h: Temporarily disable including sstream.tcc to
- see if this will increase compile speed.
- * bits/std_ostream.h: Likewise. . .
- * bits/std_istream.h: And here.
- * bits/std_fstream.h: And here.
- * src/misc-inst.cc: Add relevant header file includes for
- instantiation purposes.
- * src/string-inst.cc: And here.
- * testsuite/27_io/ostream_inserter_arith.cc: Add test case.
-
-1999-12-02 Benjamin Kosnik <bkoz@gnu.org>
-
- * testsuite/27_io/istream_unformatted.cc (test03): Add tests.
- * bits/istream.tcc (get(streambuf)): More fixes.
- (istream::ignore): Get specific about numeric_limits<int>::max()
- requirements.
-
- * bits/fstream.tcc (filebuf::open): Tweaks for _M_last_overflowed.
- (filebuf::close): Same.
- * testsuite/27_io/filebuf.cc: Add tests for ios_base::ate.
-
-1999-12-01 Phil Edwards <pedwards@jaj.com>
-
- * mkcheck: Support for compilation/execution timing.
- * testsuite/printnow.c: New file.
-
-1999-12-01 Phil Edwards <pedwards@jaj.com>
-
- * bits/std_cwchar.h: Test for _GLIBCPP_USE_WCHAR_T.
- * configure.in: Test for presence of wchar.h before testing
- for any of its features.
- * configure: Regenerate.
-
-1999-11-30 Benjamin Kosnik <bkoz@gnu.org>
-
- Preliminary istream validations complete.
- * bits/istream.tcc (istream::getline): Fixes. Tweaks to make
- formatting more consistent. Removal of if-statements inside of for
- loops.
- (ignore): Fix.
- (get): Same.
- (putback): Same.
- * bits/std_istream.h: Same.
- * bits/sstream.tcc (stringbuf::pbackfail): Fix.
- * testsuite/27_io/stringbuf.cc: Tweak.
- * testsuite/27_io/istream_unformatted.cc (test02): Mo' tests.
-
- * bits/ostream.tcc (ostream::operator<<(arith)): Set badbit, not
- failbit on failure, as per 27.6.2.5.2.
-
- * stl/bits/std_vector.h: Allow bool specializations. Should move
- ext/std_bvector to bits, not ext, maybe.
-
-1999-11-30 Mumit Khan <khan@xraylith.wisc.edu>
-
- * configure.in: Fix checks for mbstate_t and WCHAR_MIN/MAX.
- * configure: Regenerate.
-
-999-11-29 Benjamin Kosnik <bkoz@gnu.org>
-
- * bits/istream.tcc (get(streambuf, char)): Fix.
- * testsuite/27_io/istream_unformatted.cc (test03): Add tests.
-
-1999-11-29 Scott Snyder <snyder@fnal.gov>
-
- * bits/basic_string.h (append(const _Char*, size_type)): The
- length of the appended string is given exactly by the second arg,
- regardless of the data in the character array.
- * bits/string.tcc (basic_string(const _CharT*, size_type, const
- _Alloc&)): Likewise.
- * testsuite/21_strings/append.cc (test01): Remove erroneous test
- of basic_string::append.
-
-1999-11-29 Chip Salzenberg <chip@valinux.com>
-
- * Makefile.in: Tweaks for CXXFLAGS.
- * */Makefile.in: Same.
-
-1999-11-29 Mumit Khan <khan@xraylith.wisc.edu>
-
- * conficd bgure.in: Check for wide character support.
- * bits/c++config.h.in (_GLIBC_USE_WCHAR_T): Move from here ...
- * acconfig.h (_GLIBC_USE_WCHAR_T): to here.
- * bits/string.tcc (wstring::_S_find): Guard wchar_t specialization.
-
-1999-11-29 Mumit Khan <khan@xraylith.wisc.edu>
-
- * acinclude.m4: Fix typo.
- * src/complex.cc: Fix macro line continuation.
-
-1999-11-29 Petter Urkedal <petter@matfys.lth.se>
-
- * src/Makefile.am (CXXFLAGS): Add -Wno-format to allow non-
- string literals in format, as used in locale-facets.tcc.
-
-1999-11-28 Benjamin Kosnik <bkoz@gnu.org>
-
- * testsuite/27_io/istream_unformatted.cc (test03): Add tests.
- * bits/istream.tcc (istream::get): Extract to argument minus one.
- Various tweaks and fixes.
-
-1999-11-22 Mumit Khan <khan@xraylith.wisc.edu>
-
- * bits/locale_facets.tcc: Workaround for compiler crash on
- ix86-*-mingw32.
-
-1999-11-21 Mumit Khan <khan@xraylith.wisc.edu>
-
- * acinclude.m4: New file. New _GLIBCPP_CHECK_FLOAT_SUPPORT macro.
- * configure.in: Use.
- * acconfig.h: New _GLIBCPP_BUGGY_FLOAT_COMPLEX macro.
- * src/complexf.cc: New _GLIBCPP_FLOAT_SPECIALIZATION macro.
- * bits/std_complex.h: Use.
- * src/complex.cc: Use.
-
-1999-11-19 Mumit Khan <khan@xraylith.wisc.edu>
-
- * testsuite/18_support/numeric_limits.cc: Add missing std:: prefix.
- * testsuite/21_strings/inserters_extractors.cc: Likewise.
- * testsuite/22_locale/ctype.cc: Likewise.
- * testsuite/23_containers/multiset.cc: Likewise.
- * testsuite/23_containers/vector_ctor.cc: Likewise.
- * testsuite/26_numerics/binary_closure.cc: Likewise.
- * testsuite/27_io/fpos.cc: Likewise.
- * testsuite/27_io/ios_base_callbacks.cc: Likewise.
- * testsuite/27_io/istream_extractor_arith.cc: Likewise.
- * testsuite/27_io/istream_extractor_char.cc: Likewise.
- * testsuite/27_io/istream_extractor_other.cc: Likewise.
- * testsuite/27_io/istream_sentry.cc: Likewise.
- * testsuite/27_io/ostream_inserter_char.cc: Likewise.
- * testsuite/27_io/ostream_inserter_other.cc: Likewise.
- * testsuite/27_io/streambuf.cc: Likewise.
- * testsuite/27_io/stringstream.cc: Likewise.
-
-1999-11-19 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/valarray_meta.h: Don't forget to define tanh
-
-1999-11-18 Philip Martin <pm@corris.dircon.co.uk>
-
- * src/stl-inst.cc: Use typedef to refer to iterator
- * stl/bits/stl_algobase.h: Add traits based dispatch for
- __normal_iterator in the copy()algorithm
- * stl/bits/type_traits.h: Add _Is_normal_iterator trait support
-
-1999-11-18 Kevin Ediger <kediger@licor.com>
-
- * src/locale.cc (locale::_Imp::_Imp): Use auto_ptr to make
- constructors for locale::_Impl exception safe.
-
-1999-11-18 Scott Snyder <snyder@fnal.gov>
-
- * stl/bits/stl_queue.h: The C++ standard gives the default for the
- _Sequence template argument of priority_queue<> as vector<>, not
- deque<>.
-
-1999-11-18 Benjamin Kosnik <bkoz@gnu.org>
-
- * bits/std_sstream.h (stringbuf::_M_really_sync): Add __iend as a
- parameter.
- * bits/sstream.tcc: Adjust here too.
-
-1999-11-17 Benjamin Kosnik <bkoz@gnu.org>
-
- * bits/sbuf_iter.h (istreambuf_iter::equal): Tweak.
- * bits/istream.tcc (operator>>): Replace iostate(0) with
- iostate(ios_base::goodbit), which is the same thing, but hopefully
- a bit clearer.
- * bits/locale_facets.tcc (do_get(bool)): Streamline, deal with
- libraries issue list 17.
- (do_gets): Don't set goodbit explicitly, instead only set on
- failures as good bit is the default setting.
- * bits/ios_base.h (setf): Set correctly.
- * bits/fstream.tcc: Tweak.
- * bits/std_sstream.h (_M_really_sync): Fix ibuffer positioning for
- in|out bufs that are empty. . .
- * testsuite/27_io/istream_extractor_arith.cc (test03): Add.
-
-1999-11-16 Benjamin Kosnik <bkoz@gnu.org>
-
- * testsuite/27_io/streambuf.cc (class testbuf): Don't set _M_buf_size.
- * bits/std_streambuf.h (setp): Set _M_buf_size, _M_mode.
- Add comments "all about _M_buf."
- (setg): Set _M_mode.
-
-1999-11-16 Kevin Ediger <kediger@licor.com>
-
- * bits/locale_facets.tcc (_S_build_float_format): New function.
- (_S_output_float): New function.
- (num_put::do_put(double)): Use 'em.
- (num_put::do_put(long double)): Use 'em.
- * testsuite/27_io/ostream_inserter_arith.cc: New file.
-
-1999-11-15 Scott Snyder <snyder@fnal.gov>
-
- * bits/basic_file.h: Type of __off parm should be __c_streampos, to
- match how libio is calling us.
- * src/basic_file.cc (sys_seek): Likewise.
- * bits/std_fstream.h (basic_filebuf::sync): Restore sync call.
-
-1999-11-15 Benjamin Kosnik <bkoz@gnu.org>
-
- * docs/17_intro/contribute.html: Add link to assignment form.
- * docs/17_intro/libstdc++-assign.txt: New file.
-
- * mkcheck (TESTS_FILE): Move a copy of test files as well as
- output files.
-
- * bits/std_streambuf.h (_M_buf_bump): New function.
- * bits/streambuf.tcc: Mods to support _M_buf_bump.
- (xsputn): Here. Also add checks for output valid.
- (xsgetn): Add checks for input valid.
- (sputc): Here.
- (sgetc): Set _M_in_end to _M_buf + _M_buf_end.
- * bits/std_sstream.h (_M_really_sync): Set _M_buf.
- Set _M_out_end to variable-length-end.
- * bits/sstream.tcc (overflow): Use _M_buf_bump.
- (seekpos): Same.
- (seekoff): Same.
- * bits/fstream.tcc (std): Tweak formatting.
- (filebuf::overflow): Simplify.
- (filebuf::showmanyc): Same.
- (filebuf::underflow): Same.
- * testsuite/27_io/filebuf.cc: Fix.
- * testsuite/27_io/ostream_inserter_other.cc: Fix.
- * testsuite/27_io/ostream_inserter_other-2.tst: New file.
- * testsuite/27_io/stringbuf.cc: Tweak.
- * testsuite/27_io/streambuf.cc: Tweak.
- * testsuite/27_io/istream_extractor_other.cc: Fix.
-
-1999-11-11 Matthias Klose <doko@cs.tu-berlin.de>
-
- * stl_deque.h: Use static_casts<size_type>(signed_type).
-
-1999-11-11 Benjamin Kosnik <bkoz@gnu.org>
-
- Cleanups for callbacks, more regression hunting. Remaining
- failures (1) due to last unresolved stringstream issues, not
- regressions per se.
- * bits/std_fstream.h: Revert. Disable call to _M_file->sync as
- killing 27_io/filebuf.cc tests. . . need another solution.
-
- * bits/streambuf.tcc (_S_copy_streambufs): Fix.
- * testsuite/27_io/istream_extractor_other.cc: Tweak comments.
-
- * bits/basic_ios.h: Add cached facets here. UGH. The standard
- foils all attempts at a graceful, minimal implementation.
- * bits/basic_ios.tcc: Tweaks.
- * bits/istream.tcc: Fix.
- * bits/ostream.tcc: Fix.
- * bits/std_istream.h: Fix.
- * bits/std_ostream.h: Fix.
- * src/ios.cc (ios_base::imbue): Set _M_locale_ios before calling
- callbacks.
- * bits/locale_facets.tcc (std): Minor, minor formatting tweak.
- (_S_pad_numeric): Make comprehensible.
-
-1999-11-10 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_ostream.h: Add callbacks for _M_fnumput.
- (_S_ostream_fcache): New function.
- Move functions out-of-line.
- * bits/ostream.tcc: Put here.
-
- * bits/std_istream.h: Add callbacks for _M_fnumget.
- (_S_istream_fcache): New function.
- Move functions out-of-line.
- * bits/istream.tcc: Put here.
-
- * bits/basic_ios.tcc (basic_ios::imbue): Tweaks, remove call to
- _M_call_callbacks(), as ios_base::imbue does this already.
- * src/ios.cc (register_callback): Clean.
- (_M_call_callbacks): Same.
- * bits/ios_base.h: Callback work.
- * testsuite/27_io/ios_base_callbacks.cc (test01): New file.
-
-1999-11-10 Benjamin Kosnik <bkoz@cygnus.com>
- Matthias Klose <doko@cs.tu-berlin.de>
-
- * stl/ext/stl_rope.h: Fix initialization order.
-
-1999-11-09 Scott Snyder <snyder@fnal.gov>
-
- * bits/std_fstream.h (basic_filebuf::sync): Unconditionally call
- _M_file->sync() so that redirection works correctly.
-
-1999-11-09 Benjamin Kosnik <bkoz@gnu.org>
-
- * bits/istream.tcc: Re-order.
- * bits/std_istream.h: Fix getline problems.
- * testsuite/27_io/istream_unformatted.cc: New tests.
-
- Clean up regressions.
- * bits/std_sstream.h: Set initial stringbufs correctly.
-
-1999-11-09 Scott Snyder <snyder@fnal.gov>
-
- * stl_vector.h (_M_range_insert): Fix mixing pointers and
- vector::iterator.
- * testsuite/23_containers/vector_modifiers.cc (test01): New file,
- tests.
-
-1999-11-09 Benjamin Kosnik <bkoz@cygnus.com>
-
- * src/Makefile.am (CXXFLAGS): Add -Winline.
- * src/Makefile.in: Regenerate.
-
-1999-11-05 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/valarray_meta.h (_DEFINE_EXPR_UNARY_FUNCTION): When
- building meta-expressions don't forget to take the contained
- closures.
-
-1999-11-02 Benjamin Kosnik <benjamin@cygnus.com>
-
- * configure: Regenerate.
-
-1999-11-02 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/valarray_meta.h (_Expr<>::sum): Tweak. Use copy-initialization
- syntax.
- * bits/valarray_meta.h (min): Likewise.
- * bits/valarray_meta.h (max): Likewise.
-
-1999-11-01 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_sstream.h (_M_really_sync): Take into account in | out bufs.
- * bits/std_streambuf.h (_S_copy_streambufs): New function.
- * bits/streambuf.tcc: Define.
- * bits/istream.tcc (istream::operator>>(streambuf)): Rewrite.
- * bits/ostream.tcc (ostream::operator<<(streambuf)): Rewrite.
- * testsuite/27_io/ostream_inserter_other.cc: Add tests.
- * testsuite/27_io/ostream_inserter_other-1.tst: New file.
-
- * bits/basic_string.h: Explicitly cast npos to unsigned type,
- reported by Richard Atterer.
- * bits/char_traits.h: For consistency's sake, here too.
-
- * configure.in: Bump version to 2.90.7.
-
-1999-10-31 Benjamin Kosnik <bkoz@cygnus.com>
-
- * testsuite/27_io/ostream_inserter_char-1.tst: Check file output.
- * testsuite/27_io/ostream_inserter_char.cc (test05, test01): Add tests.
- * bits/streambuf.tcc (xsputn): Treat--size const char for long loops.
- (xsgetn): Same.
- * bits/sstream.tcc (seekpos): Tricks, mostly: check _M_mode before
- writing into buffer.
- (seekoff): Same.
-
-1999-10-29 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/valarray_array.h (__valarray_sum): New function.
- * bits/valarray_array.h (__valarray_product): Same.
-
- * bits/std_valarray.h (valarray<T>::product): Comment out.
- * bits/std_valarray.h (valarray<T>::sum): Use __valarray_sum
- instead of accumulate.
-
- * src/valarray-inst.cc: Remove explicit intantiation of
- class multiplies<size_t>, accumulate, valarray<size_t>::product.
- * src/valarray-inst.cc (__valarray_product): Instantiate
- explicitly.
- * src/valarray-inst.cc (__valarray_product(const
- valarray<size_t>&)): New function.
- * src/valarray-inst.cc (gslice::_Indexer::_Indexer): Don't use
- valarray<size_t>::product. Use __valarray_product instead.
-
-
-1999-10-25 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_ostream.h (ostream.inserters.char): Correctly pad output.
- (_S_pad_char): New function. Not done: ios_base::internal.
- * bits/ostream.tcc: Clean for above.
- * bits/locale_facets.tcc (_S_fill): Remove ostreambufiterator
- specialization that was commented out, as ostreams now have to
- correctly deal with padding.
- * testsuite/27_io/ostream_inserter_char.cc (main): Add tests.
-
- * testsuite/21_strings/ctor_copy_dtor.cc(test02): Add test case
- from mailing list. This is a bug, and should be fixed.
- * testsuite/21_strings/inserters_extractors.cc (main): Tweak, fix typo.
-
-1999-10-22 Petter Urkedal <petter@matfys.lth.se>
-
- * stl/bits/stl_numeric.h (__power): Replaced argument name `__opr'
- to avoid conflict with gcc name mangling.
- * stl/bits/stl_algo.h (__transform): Same.
-
-1999-10-21 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/ios_base.h: Change argument names.
- * docs/17_intro/BADNAMES: Add __opr.
-
-1999-10-20 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
-
- Work on compilation slowdowns from 10-5 to 10-12, which are
- related to the _Callback_list inlining/merge-ifcation, which is
- still a pending issue, but this stuff is necessary cleanup anyway.
-
- * src/ios.cc: Re-arrange.
- * bits/ios_base.h: Tweak.
- * bits/basic_ios.tcc: Move out of line definitions here, move
- small out-of-line definitions inline.
- * bits/basic_ios.h: From here.
-
- * bits/streambuf.tcc (pbackfail, overflow): Move back inline.
- * bits/std_streambuf.h: From here.
-
-1999-10-19 Benjamin Kosnik <bkoz@cygnus.com>
-
- * testsuite/27_io/istream_extractor_char.cc: Add tests.
- * bits/std_istream.h: Tweaks--set eofbit on eof condition.
- * bits/istream.tcc (operator>>(istream&, string&): Remove
- vestigial issspace hacks and use ctype::is instead.
- (getline): Remove unnecessary loops, fortify and pasteurize.
- (ws): Same.
-
-1999-10-18 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/istream.tcc (operator>>): Tweak.
- * bits/std_istream.h: Fix according to library issues list 68.
- Add typedefs.
-
- * bits/locale_facets.h: Fix table_size to be non-zero.
-
-1999-10-18 Vadim Egorov <egorovv@HotPOP.com>
-
- * src/basic_file.cc: ifdef instead of comment for binary mode
-
-1999-10-18 Russell Davidson <russell@qed.econ.queensu.ca>
-
- * bits/std_sstream.h: Stringbuf initialization based on actual,
- not allocated, size.
- * testsuite/21_strings/inserters_extractors.cc (test06): Add test
- case.
-
-1999-10-17 Benjamin Kosnik <bkoz@cygnus.com>
-
- * testsuite/26_numerics/c_math.cc (test03): Tweak.
- * testsuite/27_io/istream_manip.cc (test01): Corrections due to
- sentry change.
- * testsuite/21_strings/inserters_extractors.cc (test01): Same.
-
-1999-10-14 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_istream.h: Tweaks.
- * bits/istream.tcc (istream::sentry::sentry()): Simplify, correct
- as per issues list addition--set failbit, eof on empty buffers.
- * testsuite/27_io/istream_sentry.cc: New file.
-
-1999-10-12 Chris Prince <prince@wcug.wwu.edu>
-
- * bits/std_cstdio.h: Remove Solaris hacks.
-
-1999-10-12 Phil Edwards <philip.edwards@sn.wpafb.af.mil>
-
- * docs/index.html: Fix minor typos and tweaks.
- * docs/17_intro/contribute.html: Ditto.
- * docs/*/howto.html: Ditto. More "EGCS"->"GCC" conversion, notes on
- thread safety and binary I/O, links to external sites.
- * docs/faq/index.html: EGCS/GCC cleanup, new entries for Cygwin
- and MT.
-
-1999-10-12 Petter Urkedal <petter@matfys.lth.se>
-
- * bits/std_cmath.h (abs(float)): When ::absf is not present, call
- ::fabs(double) rather than ::abs(int).
-
-1999-10-11 Benjamin Kosnik <bkoz@milou.cygnus.com>
-
- * bits/std_streambuf.h: Fix minor blip--should explicitly return
- *gptr(), not the result of underflow.
- (pbackfail): Conform to default behavior.
- (overflow): Same.
- * bits/streambuf.tcc: Add out-of-line streambuf members.
- (xsputn): Tweak.
- (xsgetn): Tweak.
- * testsuite/27_io/streambuf.cc: New file.
- * testsuite/27_io/filebuf.cc: Correct test.
-
-1999-10-08 Benjamin Kosnik <bkoz@haight.constant.com>
-
- * bits/std_cmath.h: Correctly cast int to double.
- * testsuite/26_numerics/c_math.cc: Add test.
-
- * mknumeric_limits (OUT_C): Tweaks.
- * src/gen-num-limits.cc: Checks for WCHAR_MIN, WCHAR_MAX before
- trying to instantiate type_traits<wchar_t>.
- * acconfig.h: Add _GLIBCPP_HAS_WCHAR_MIN_MAX.
- * configure.in (LIBS): Plus checks for WCHAR_MIN, WCHAR_MAX.
- * configure: Regenerate.
-
-1999-10-06 Benjamin Kosnik <bkoz@milou.cygnus.com>
-
- * bits/streambuf.tcc (streambuf::xsgetn): Rewrite.
- (streambuf::xsputn): Put in break.
- Aiming for parity between these two (mostly) similar functions.
- Need to re-write tests.
-
- * bits/ios_base.h (ios_base::_M_copy_base): Remove declaration.
- Make data members protected, not private.
- * src/ios.cc (ios_base::_M_copy_base): Move _Callback_list into
- ios_base.h. As called only once, collapse into . . .
- * bits/basic_ios.h (basic_ios::copyfmt): Fix.
- (basic_ios::clear): Throw ios_base::failure on occasion.
- (basic_ios::exceptions): Fix.
- * testsuite/27_io/ios_members.cc (test02): Add tests.
-
- * bits/fpos.h: Default initialize.
- * testsuite/27_io/fpos.cc (test03): Add test.
-
-1999-10-04 Russell Davidson <russell@qed.econ.queensu.ca>
-
- * src/basic_file.cc: Fix open modes.
-
-1999-10-04 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/locale_facets.tcc (num_get<>::do_get): Fix typo.
-
-1999-09-23 Benjamin Kosnik <bkoz@milou.cygnus.com>
-
- * bits/streambuf.tcc: Yea. Fix this for real.
- * testsuite/27_io/ostream_inserter_other.cc: Add file.
- * src/Makefile.*: Regenerate.
-
-1999-09-22 Benjamin Kosnik <bkoz@milou.cygnus.com>
-
- * bits/std_cstdlib.h: Add more linux-specif hacks to the header
- files so that stdtof and strtold will be declared. Some hacks
- already exits in bits/std_cctype.h -- these should all be removed
- at a later date.
- * bits/locale_facets.tcc: Add cstring.h include.
- _S_format_long: Use long, not int.
- Add std_limits.h include, for numeric_limits.
- * testsuite/27_io/istream.cc: Make instantiations work when using
- -fhonor-std.
- * testsuite/27_io/ostream.cc: Same.
-
-1999-09-21 Benjamin Kosnik <bkoz@milou.cygnus.com>
-
- * bits/fpos.h (fpos::operator streamoff): Make const, don't return
- a reference. Same for operators == and !=.
- * testsuite/27_io/fpos.cc: Add tests.
-
-1999-09-21 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/valarray_array.h: Fix typo.
-
- * mknumeric_limits: Make sure we are regenerating things from
- scratch. Otherwise things get redefined. Not good.
-
-1999-09-20 Benjamin Kosnik <bkoz@milou.cygnus.com>
-
- * bits/std_ostream.h: Fix typo.
- * bits/std_istream.h: Same.
- * bits/std_iomanip.h: Same.
-
- * bits/istream.tcc (sentry::sentry()): Remove optional tie with
- ostream, as happens with underflow anyway.
- * testsuite/27_io/istream.cc (main): New file.
- * testsuite/27_io/ostream.cc (main): New file.
- * testsuite/27_io/istream_unformatted.cc: Add tests.
-
- * src/Makefile.am (headers): Add new file.
- * src/Makefile.in (headers): Regenerated.
-
- * bits/basic_ios.h: Remove local-related files.
- * bits/basic_ios.tcc: New file, add locale-related items.
- * src/misc-inst.cc: Add include of basic_ios.tcc, as a hack for now.
- * testsuite/27_io/ios_members_static.cc: Change to
- * testsuite/27_io/ios_base_members_static.cc: This.
- * testsuite/27_io/ios_members.cc: New file.
- * testsuite/27_io/stdios_basefield_manip: Change to
- * testsuite/27_io/ios_manip_basefield.cc: This.
- * testsuite/27_io/stdios_fmtflags_manip: Change to
- * testsuite/27_io/ios_manip_fmtflags.cc: This.
-
- * bits/fpos.h: Fix discarding qualifiers on this when
- using _M_position with a const fpos.
- * bits/std_iosfwd.h: Tweak.
- * testsuite/27_io/fpos.cc: New file.
-
-1999-09-17 Benjamin Kosnik <bkoz@milou.cygnus.com>
-
- * bits/streambuf.tcc (streambuf::xsputn): Tweak.
- * bits/ostream.tcc: Tweak.
- * testsuite/21_strings/inserters_extractors.cc (test04, test05):
- Add new regressions.
-
-1999-09-16 Benjamin Kosnik <bkoz@milou.cygnus.com>
-
- * bits/basic_ios.h: Inline, tweak.
- * bits/fstream.tcc (basic_filebuf::_M_really_overflow): Tweak,
- pass back accurate return value to basic_filebuf::overflow.
- * bits/streambuf.tcc (streambuf::xsputn): Fix overflow accounting.
- This fixes sstream problems reported in libstdc++/9, but screws up
- filebufs. That solution is pending.
-
-1999-09-15 Vadim Egorov <egorovv@1c.ru>
-
- * bits/streambuf.tcc (basic_streambuf::xsputn): Add check for
- zero count puts.
- * testsuite/21_strings/inserters_extractors.cc (test01): Add test.
-
-1999-09-08 Benjamin Kosnik <bkoz@milou.cygnus.com>
-
- * bits/c++config.h.in: Add emacs hints.
-
- * stl/bits/stl_range_errors.h: Don't define here, for now define
- in stdexcept.cc along with string inlines __length_error, etc.
- * src/stdexcept.cc: Define here.
- * stl/bits/stl_config.h (__STL_CAN_THROW_RANGE_ERRORS): Enable, so
- at(size_t) will be declared/defined.
- (__STL_THREADS): Fix mess surrounding use of this, enable.
-
-1999-08-31 Benjamin Kosnik <bkoz@milou.cygnus.com>
-
- * testsuite/27_io/istream_extractor_arith.cc: Fix.
- * src/localename.cc: Tweak formatting, fix assignment to
- const compiler errors.
-
-1999-08-25 Benjamin Kosnik <bkoz@cygnus.com>
-
- * acconfig.h: Add absf, cosf.
- * configure.in (use_builtin_sinf): Same.
- * configure: Regenerate.
- * bits/std_cmath.h: Add mess of defines.
- * testsuite/26_numerics/modf_float.cc: Change to
- * testsuite/26_numerics/c_math.cc: This.
-
- * src/locale.cc: Change.
- * bits/locale_facets.h: Fix.
- * testsuite/22_locale/ctype.cc: Add temporary tests.
-
-1999-08-24 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/fpos.h: Test.
-
- * docs/index.html: Add powerpc-linux-gnu results with gcc-2.95.1.
- Fix database name for "libstdc++".
-
-1999-08-23 Benjamin Kosnik <bkoz@cygnus.com>
-
- * mknumeric_limits (numeric_limits): Add default definitions to
- member functions.
- * testsuite/18_support/numeric_limits.cc: New file.
-
-1999-08-18 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_istream.h: Correct initialization.
- * bits/std_ostream.h: Likewise.
- * bits/std_sstream.h: Likewise.
- * bits/std_fstream.h: Likewise.
- * testsuite/27_io/stringstream.cc: Add test case.
-
- * bits/std_sstream.h: Replace ____string_type with __string_type.
- * bits/basic_ios.h (basic_ios::rdbuf(sb*): Call clear(), as required.
- * bits/std_ostream.h: Tweak dtor.
-
-1999-08-17 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
-
- * src/Makefile.am (CXXFLAGS): Add -O2.
- * src/Makefile.in: Likewise.
-
- * src/gen-num-limits.cc: Conditionally allow wchar_t. See what
- this breaks. . .
- * mknumeric_limits (numeric_limits): Uglify.
-
- * bits/std_istream.h: Fix warnings.
- * bits/locale_facets.tcc: Collateral damage from
- char_traits<char>::int_type change.
-
- * testsuite/27_io/istream_extractor_char.cc: Terminate strings.
-
-1999-08-17 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
-
- * docs/index.html: Add mailing list form.
- * docs/27_io/howto.html: Add link to iostreams_hierarchy.pdf.
-
-1999-08-16 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/streambuf.tcc (streambuf::xsputn): Allow copies to continue
- if overflow successfully allocates more space.
- * bits/std_sstream.h: Adjust comments.
- * bits/sstream.tcc (stringbuf::overflow): Copy buffer into string
- before overflow forces a resize.
- * testsuite/27_io/ostream_inserter_char.cc: New file.
-
- * bits/std_fstream.h: Remove declaration.
- * bits/fstream.tcc: Move uflow.
- * bits/std_streambuf.h: To here.
- * bits/streambuf.tcc: Make consistent.
-
- * src/Makefile.am (WERROR): Enable.
- * src/Makefile.in: Regenerate.
- * bits/sbuf_iter.h: Tweak.
- * bits/char_traits.h: (char_traits<wchar_t>::eof): Use WEOF.
- Use unsigned int as char_traits<char>::int_type.
-
- * bits/ostream.tcc (ostream::putc(char)): Tweak.
- * testsuite/27_io/iostream_objects.cc: Terminate string.
- Move cin::operator>>(char*) test to extractor_char.cc.
- * testsuite/27_io/stringstream.cc: Add stringstream instantiation.
- * bits/std_istream.h (basic_iostream): Make explicit definition
- for default ctor.
- * bits/std_sstream.h: Fix typos.
- * bits/fstream.tcc (_M_init_filebuf): Set to indeterminate for
- basic_filebuf ctor with fileno open arguments. Thus, filebufs are
- initialized in a consistent manner, no matter if the underlying
- FILE/bit bucket is a tty or a text file or some other imaginary
- construct. This and setting _M_buf_size to 1 for cin allows
- istream::get(char) to work in a manner consistent with what others
- expect.
-
- * docs/index.html: Link Stroustrup's C++ page.
-
-1999-08-12 Michael Cook <cook@sightpath.com>
-
- * bits/fstream.tcc: Fix signed/unsigned -Wall warning.
- * bits/istream.tcc: ditto.
- * bits/sbuf_iter.h: ditto.
- * bits/std_istream.h: ditto.
- * src/Makefile.am: Add -Wall to CXXFLAGS.
- * src/Makefile.in: ditto.
-
-1999-08-12 Benjamin Kosnik <bkoz@tintin.cygnus.com>
- Russell Davidson <russell@ehess.cnrs-mrs.fr>
-
- * bits/locale_facets.tcc (_M_extract): Finish off patch from yesterday.
- * src/Makefile.am (myinstallheaders): Tweak, remove PHONY.
-
-1999-08-11 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * testsuite/27_io/istream_unformatted.cc: New file.
-
- * testsuite/27_io/istream_extractor_arith.cc (test02): Add more
- elaborate tests for int types with noskipws.
-
- * testsuite/27_io/istream_extractor_other-1.txt: New file.
- * testsuite/27_io/istream_extractor_other-1.tst: New file.
- * testsuite/27_io/istream_extractor_other-2.tst: New file.
- * testsuite/27_io/istream_extractor_other.cc: Add tests.
- * bits/istream.tcc: Fix operator>>(streambuf*).
-
- * testsuite/23_containers/vector_ctor.cc (test01): Add.
-
- * docs/index.html: Remove references to egcs.
- * docs/17_intro/DESIGN: Same.
- * docs/17_intro/contribute.html: Same.
- * docs/17_intro/RELEASE-NOTES: Ditto.
- * docs/17_intro/howto.html: Same here.
-
- Russell Davidson <russell@ehess.cnrs-mrs.fr>
- * stl/bits/stl_vector.h (_M_insert_aux):
- * bits/locale_facets.tcc (_M_extract): Tweaks for preliminary
- decimal/floating point support.
- * bits/locale_facets.h: Change _M_extract prototype.
- * bits/char_traits.h (char_traits::to_int_type): Cast to unsigned.
- * bits/std_istream.h (istream::read(char_type, streamsize)): Fix.
-
-1999-08-10 Michael Cook <cook@sightpath.com>
-
- * bits/fstream.tcc: Fix for unused variable warning (-Wall).
- * bits/ios_base.h: ditto.
- * bits/istream.tcc: ditto.
- * bits/locale_facets.h: ditto.
- * bits/locale_facets.tcc: ditto.
- * bits/std_streambuf.h: ditto.
- * src/basic_file.cc: ditto.
- * src/locale.cc: ditto.
- * src/localename.cc: ditto.
-
-1999-08-10 Kirat Singh <singhki@jany.gs.com>
-
- * bits/std_iomanip.h: Inline.
-
-1999-08-10 Alfred Minarik <a8601248@unet.univie.ac.at>
-
- * bits/std_streambuf.h: Correct member initialization order.
- * src/ios.cc: Add definitions for ios_base data members.
-
-1999-08-06 Phil Edwards <pedwards@ball.com>
-
- * docs/index.html: Seventh snapshot updates. Minor tweaks.
- * docs/faq/index.html: Ditto. Removed bugs sections that have
- been fixed for a long time... Lots of "egcs" references still
- exist.
- * docs/faq/index.txt: Regenerated.
-
-1999-08-05 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
- Andreas Amann <amann@physik.tu-berlin.de>
-
- * testsuite/26_numerics/binary_closure.cc (main): new test.
-
-1999-07-29 Andreas Amann <amann@physik.tu-berlin.de>
-
- * bits/valarray_meta.h: (_BinClos<>::_Binclos): fix typo causing
- segmentation fault.
-
-1999-08-04 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
-
- * docs/index.html (host): Put in testing status.
-
-1999-08-03 Benjamin Kosnik <bkoz@cygnus.com>
-
- * docs/index.html: Update for libstdc++-2.90.6 release.
- * docs/17_intro/RELEASE-NOTES (New): Update.
- * docs/17_intro/BUGS: Update.
- * bits/c++config.h.in (__GLIBCPP__): Bump version number.
- * README (file): Update.
-
-1999-08-03 Benjamin Kosnik <bkoz@cygnus.com>
-
- * src/Makefile.am (generated_headers): Remove bits/c++config.h as
- a target.
- ($(generated_headers)): Same.
- * src/gen-c++config.cc: Remove, rename to
- * bits/c++config.h.in: New file. Bump version number.
- * configure.in: Generate bits/c++config.h at configure time.
- * math/mathconf.h: include bits/c++config.h, not config.h.
-
- * bits/std_cmath.h: Fix remaining link error for solaris shared
- builds. _GLIBCPP_HAS_BUILTIN_SINF has to be disabled for the time
- being, as on Solaris this silently calls sinf, which does not
- exist.
-
- * src/complex.cc: More tweaks.
-
-1999-08-03 Benjamin Kosnik <bkoz@cygnus.com>
-
- * src/complex.cc: Same.
- * math/complex-stub.h: Change.
- * math/c_log10*.c: Change back to clog10*.c.
-
- * configure.in (NEED_C_LOG10): Delete.
- * configure: Regenerate.
- * math/Makefile.am: Change.
-
-1999-07-30 Benjamin Kosnik <bkoz@cygnus.com>
-
- * math/Makefile.am: Fix, for real.
- * configure.in (use_builtin_sinf): Ok, make autoconf solution.
- * math/clog.c: Move to c_log.c.
- * math/clog*: Ditto.
- * math/c_log10l.c (c_log10l): Change function name.
- * math/c_log10f.c (c_log10f): Change function name.
- * math/c_log10.c (c_log10): Change function name.
-
- * math/complex-stub.h: Change to c_log* variants.
- * src/complex.cc: And here.
-
-1999-07-29 Benjamin Kosnik <bkoz@cygnus.com>
-
- * testsuite/27_io/istream_extractor_other.cc: Correct last test.
- * bits/sstream.tcc (stringbuf::overflow): Don't update the input
- sequence, just the output sequence.
- * bits/std_sstream.h (stringbuf::str()): Only in stringbufs return
- the original string, all others use complicated heuristic.
-
- * src/complex.cc: Assume c_log10.
- * math/Makefile.am (EXTRA_yes): Fix c_log/c_logf unresolved
- symbols in shared libraries by making c_log/c_log10 part of the
- "must cmpile" sources. This may not work on solaris, must check.
-
-1999-07-29 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/istream.tcc (operator>>(streambuf*)): Re-do.
- * bits/std_istream.h: Fix char extractors.
- * testsuite/27_io/istream_extractor_char.cc: Change.
- * testsuite/27_io/istream_extractor_other.cc: Add tests.
-
-1999-07-28 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_cctype.h: Fix for solaris2.6 builds.
-
- * bits/istream.tcc: Fix, thanks Alfred.
- * bits/std_istream.h: Formatting changes.
-
- * libio/Makefile.am (libio_la_SOURCES): Remove cleanup.c, so that
- _IO_cleanup will not be undefined.
- * libio/*: Regenerate.
-
- * bits/basic_string.h: More namespace-safety stuff.
- * testsuite/27_io/istream_extractor_char.cc: Fix.
- * testsuite/27_io/istream_extractor_arith.cc: Fix.
- * testsuite/27_io/iostream_objects.cc: Fix.
- * testsuite/27_io/ios_ctor.cc: Fix.
- * testsuite/27_io/istream_manip.cc: Make namespace safe.
- * testsuite/27_io/istream_extractor_other.cc: New file.
-
- * mkcheck (TESTS_FILE): Tweaks.
-
-1999-07-27 Benjamin Kosnik <bkoz@cygnus.com>
-
- * src/gen-c++config.cc: Note here, change version.
- * acconfig.h( _GLIBCPP_USE_CTYPE_ISBIT): New macro.
- * src/locale.cc: Used here.
- * configure.in (use_builtin_sinf): Check for _ISBit using autoconf.
-
- * aclocal.m4: Regenerate by running `aclocal -I m4.`
-
- * bits/istream.tcc: Fix.
- * bits/std_istream.h: More changes to extractors.
-
- * testsuite/27_io/istream_extractor_char.cc: More.
- * testsuite/21_strings/inserters_extractors.cc (test01): Fix logic
- error in testsuite construction.
-
- * bits/std_istream.h: Partially revert.
- * bits/std_ostream.h: Same.
- * bits/std_sstream.h: Revert.
-
-1999-07-26 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_sstream.h: Change initialization.
- * bits/std_ostream.h: Make default ctor/assign/operator= private.
- * bits/std_istream.h: Same, also correct sentry args.
- * bits/istream.tcc: Add correct sentry args.
-
- * testsuite/27_io/istream_extractor_char.cc: New file.
- * testsuite/27_io/istream_extractor_arith.cc: New file, old file,
- name changes making me dizzy.
-
-1999-07-26 Ulrich Drepper <drepper@happy.cygnus.com>
- Benjamin Kosnik <bkoz@cygnus.com>
-
- * aclocal.m4, config.guess, config.sub, ltconfig ltmain.sh: Update
- to libtool 1.3.3.
-
-1999-07-26 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/std_complex.h: Tweak. Make the primary template class
- complex work with user-defined numerical types. Provide member
- definitions. Restructure.
- (class complex<float>): Uglify. Remove __value(). Rename __val
- to _M_value. Rename __complex_value_type to _ComplexT. Make it
- private. Remove dependency on __value(). Fix various explicit
- specialization syntax. Declare a some functions friend. Now the
- implementation is nearly comforming.
- (class complex<double>): Likewise.
- (class complex<long double>): Likewise.
-
- * src/complex.cc: Tweak. Remove dependency on complex::__value().
- (sin, sinh, tan, than): Fix call to corresponding C9x function
- syntax.
-
-1999-07-24 Benjamin Kosnik <bkoz@fidel.cygnus.com>
-
- * bits/istream.tcc (ws): Fix error with failbit being set.
-
- Disabled due to egcs/gcc-2_95 internal compiler errors.
- * src/Makefile.am (CXXFLAGS): Add -fsquangle -fhonor-std
- -fnew-exceptions. Compiling with namespaces enabled will now be
- the default.
- * mkcheck (CXX_FLAG): Same.
- * src/gen-c++config.cc (_GLIBCPP_USE_NAMESPACES): Yup. New macro.
- * bits/std_cctype.h: Not enough to just define in namespace std if
- ctype-isms are macros. Need to also define in namespace std:: if
- the C functions are just plain functions.
-
- * src/gen-num-limits.cc: Fix spelling inconsistencies.
-
-1999-07-24 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * docs/18_support/howto.html: Start documentation. Need to keep
- track of the ongoing discussion in th LWG reflector.
-
- * src/gen-num-limits.cc: Tweak.
- (class predicate): New class.
- (class value): Likewise.
- Make the whole machinery more flexible. Add comments.
-
-1999-07-23 Benjamin Kosnik <bkoz@fidel.cygnus.com>
-
- * bits/ios_base.h: Move state/exception functions into basic_ios.
- * bits/basic_ios.h: Same.
- * src/ios.cc: And here. Callbacks don't attempt to reset
- state now.
-
- * bits/std_streambuf.h: Separate ios and streambuf locale data
- members and cached facets. Using this convention: _M_locale_buf for
- the streambuf-related classes, and _M_locale_ios for the ios
- hierarchy.
- * bits/fstream.tcc: And here.
- * bits/basic_ios.h: And here. Also, add cached ctype.
- * src/ios.cc: Ditto.
- * bits/ios_base.h: Ditto.
- * bits/std_istream.h: Use cached ctype facet.
- * docs/27_io/iostreams_hierarchy.pdf: Update for new data member
- arraignment.
-
- * testsuite/27_io/ios_ctor.cc: New file.
- * src/ios.cc: Move _M_state init to basic_ios::init().
- * bits/basic_ios.h: To here.
-
- Attempt for some consistency in naming for testsuite/27_io/*.cc.
- * testsuite/27_io/boolfmt.cc: Rename to stdios_fmtflags_manip.cc
- * testsuite/27_io/octfmt.cc: Rename to stdios_basefield_manip.cc
- * testsuite/27_io/istream_manip.cc: Rename to istringstream_manip.cc.
- * testsuite/27_io/ostream_manip.cc: Rename to ostringstream_manip.cc.
-
-1999-07-22 Benjamin Kosnik <bkoz@fidel.cygnus.com>
-
- * src/ios.cc: Tweak initializations of standard iostream
- objects to closely match the standard. Tie cin/wcin, set flags on
- cerr/wcerr
- * bits/char_traits.h: Change from size_t to int_type, as per
- standard. As per wide streams.
- * bits/basic_ios.h: Infect with __ctype_type, as a preparation
- for caching a bunch of ctype info. For instance, ctype_base::space
- info needs to be stored somewhere, somehow.
- * bits/std_istream.h: Also here.
- * bits/std_ostream.h: Ditto.
- * bits/std_istream.h (operator>>(istream, char): Aggh. Fixup.
- * testsuite/27_io/iostream_objects.cacc (test01): Oh yeah. Fix
- stream states.
-
- * bits/istream.tcc (ws): Fix.
- * testsuite/27_io/istream_manip.cc: New file, test ws.
- * testsuite/27_io/ostream_manip.cc: New file, test endl, ends, flush.
-
- * bits/basic_string.h: Provide a specialized member function for
- _S_find<char> using strchr.
- * src/string-inst.cc: Put specializations here.
- * bits/string.tcc: Small fix for find, remove typo.
- * testsuite/21_strings/find.cc (test01): Add tests to catch this
- find bug. . .
-
-1999-07-20 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
-
- * bits/basic_ios.h: Put into basic_ios namespace.
- Tweak widen/narrow.
-
-1999-07-19 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
-
- * bits/std_sstream.h (stringbuf::sync): Change to _M_really_sync,
- adjust _M_*_cur pointers inside the function, so callee doesn't
- have to adjust.
- * bits/sstream.tcc (stringbuf::overflow): Tweak.
-
- * mkcheck: Tweak. Add execution time field, even though it is not
- implemented yet. Simplify pass/fail status notation.
-
-1999-07-18 Mumit Khan <khan@xraylith.wisc.edu>
-
- * configure.in: Check for float.h and underscored version of
- math functions.
- * acconfig.h: Add @BOTTOM@ section for handling underscored
- math functions.
- * configure: Regenerate.
- * config.h.in: Regenerate.
- * math/mathconf.h (float.h): Include conditionally.
- (M_PI): Define conditionally.
- (INFINITE_P): Define for Mingw.
- * bits/locale_facets.tcc: Workaround for compiler crash on
- ix86-*-mingw32.
- * bits/std_cwchar.h (bits/std_cstddef.h): Include.
- * src/locale.cc (bits/std_istream.h): Include.
- (bits/std_ostream.h): Likewise.
-
-1999-07-18 Phil Edwards <pedwards@ball.com>
-
- * docs/faq/index.html: Updated __black_count notes, fixed typos.
- * docs/faq/index.txt: Regenerated.
-
-1999-07-15 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
-
- * testsuite/27_io/stringbuf.cc: Cccchanges, latent bugs.
-
- * bits/sstream.tcc (stringbuf::overflow): Modify accounting of
- newly-allocated buffer.
- * bits/streambuf.tcc (streambuf::xsgetn): Aaaaaah. Fix final
- overflow condition bits.
-
-1999-07-14 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_sstream.h (stringbuf::_M_init_stringbuf): Set
- _M_buf_size to initial _M_string.size(), even though for
- ostringstreams it is pretty pointless. It's necessary for
- istringstreams.
- (stringbuf::str()): Adjust.
- (stringbuf::str()): Adjust, call _M_init_stringbuf.
- * bits/streambuf.tcc (streambuf::xsgetn): Adjust return value for
- overflow's possible success.
- (streambuf::xsputn): Adjust.
-
- * testsuite/27_io/filebuf.cc: Adjust for the xsgetn re-write from
- yesterday.
- * testsuite/27_io/stringbuf.cc: Tweak.
- * testsuite/21_strings/inserters_extractors.cc (test01): Remove
- notes to myself.
- * testsuite/23_containers/vector_cons.cc: Rename to be consistent
- with other constructor tests to. . .
- * testsuite/23_containers/vector_ctor.cc: New file.
-
-1999-07-14 Alfred Minarik <a8601248@unet.univie.ac.at>
-
- * testsuite/*: Changes to make the testsuit compilable with
- -fhonor-std. Contains direct qualification of library names with
- std::.
-
-1999-07-13 Benjamin Kosnik <bkoz@decepticon.cygnus.com>
-
- * bits/streambuf.tcc: Tweaks.
- (streambuf::xsputn): Optimize, fix for sstreams.
- (streambuf::xsgetn): Same.
- * bits/sstream.tcc (stringbuf::overflow): Adjust _M_buf_size
- correctly, handle overflow/reallocate conditions correctly.
- * bits/std_sstream.h: Fix typo.
- _M_init_stringbuf(): Fix _M_buf_size initialization.
- (stringbuf::str()): Construct return string if output has occurred.
-
- * bits/basic_string.h: Fix typo from yesterday's patch.
-
-1999-07-12 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
-
- * bits/string.tcc: _M_mutate - clear _M_state again.
- * bits/basic_string.h: In the three functions that return
- an iterator set _M_state to -1 before return.
- Also optimized two cases of operator+.
-
-1999-07-12 Phil Edwards <pedwards@ball.com>
-
- * docs/index.html: Expand egcs-1.1.2 notes/links.
- * docs/faq/index.html: And here. Add links to LWG issues-list.
- * docs/faq/index.txt: Regenerate. (lynx rocks)
- * docs/21_strings/howto.html: Fix notes on case conversion.
- * docs/21_strings/stringtok_h.txt: Goodly spelling...
- * docs/23_containers/howto.html: Stub for bitmasks.
- * docs/27_io/howto.html: Add section on buffering, stub binary.
-
-1999-07-12 Nathan Myers <ncm@cantrip.org>
-
- * stl/bits/stl_tree.h (__black_count): Optimize.
-
-1999-07-09 Vadim Egorov <egorovv@1c.ru>
-
- * src/basic_file.cc: Cleanup in __basic_file destructor.
-
-1999-07-08 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_streambuf.h: Changes. . .
- * bits/streambuf.tcc: Merge xsputn from filebuf into xsputn in
- basic_streambuf, to be used for both filebufs and streambufs.
- * bits/std_fstream.h (_M_init_filebuf): New function.
- Take out specialized xsputn, put into basic_streambuf.
- * bits/fstream.tcc: Define, call from both ctors.
- * bits/std_sstream.h (_M_init_stringbuf): New function.
- * bits/sstream.tcc: Tweak.
-
- * docs/27_io/iostreams_hierarchy.pdf: New file.
-
- * docs/17_intro/CHECKLIST (basic_string<char>): Validation and
- acceptance. Wooo-hoo!
-
- * bits/char_traits.h: Change int_type for char_traits general
- template, so that 21_strings/capacity.cc will compile.
- * testsuite/21_strings/capacity.cc: Add operators.
-
- * bits/string.tcc (string::compare): Clean up, re-implement.
- * testsuite/21_strings/compare.cc: Tweak.
-
- * bits/string.tcc (string:_M_mutate): Keep leaked value in
- _M_state, which means that whenever begin() or end() has been
- called, the string is unshareable, period. By doing this, insert
- and erase member functions that return iterators can remain
- footloose and fancy free.
- * testsuite/21_strings/invariants.cc: Update.
-
- * bits/basic_string.h (string::append): Fix self-referential
- problems, ie when "this" is also an argument to a member function.
- * bits/string.tcc: Tweak, same.
- * testsuite/21_strings/append.cc: New file.
-
-1999-07-07 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/char_traits.h: Tweaks.
- * bits/basic_string.h: Tweak.
- * bits/fstream.tcc: Remove warning for _M_buf_size assignment.
-
-1999-07-06 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_streambuf.h: Absorb/acquire data members previously
- working in basic_filebuf.
- * bits/streambuf.tcc: Tweaks.
- * bits/fstream.tcc: Adjust.
- * bits/std_fstream.h: Move and rename the following functions:
- _M_set_ideterminate, _M_is_indeterminate, _M_set_determinate are
- now declared and defined in the base class, basic_streambuf. Oh
- fuck it, move data members _M_buf, and _M_buf_size into
- basic_streambuf as well.
-
- * bits/ostream.tcc: Tweak.
- * bits/locale_facets.tcc: Fix typo in comments.
-
- * testsuite/21_strings/inserters_extractors.cc (test01): Change
- state from good to not good, as eof() is set.
-
-1999-07-05 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/char_traits.h (char_traits::compare). Fix.
-
- * config.guess, config.sub: Update.
-
-1999-07-02 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
-
- * bits/string.tcc: Check the __res_arg for a length error.
-
-1999-07-01 Benjamin Kosnik <bkoz@nabi.net>
-
- * bits/std_streambuf.h: Tweaks. Need to move _M_is_indeterminate
- and related functions into basic_streambuf, from basic_filebuf to
- take care of ostringstreams and empty strings. So that's groovy,
- or will be groovy.
- * bits/std_istream.h: Tweaks.
- * bits/istream.tcc: Implement ws, getline, operator>> for string.
- * bits/std_ostream.h: And here.
- * bits/ostream.tcc: Same.
- * src/misc-inst.cc: Add instantiations for ws.
-
- * src/string-inst.cc: Add instantiations for inserters and
- extractors (operators << and >>, getline).
-
- * testsuite/21_strings/inserters_extractors.cc: Amazingly enough,
- a testcase for getline and operators << and >>. Ostream tests are
- failing right now, but istream tests should work. . .
-
- * bits/string.tcc: Change _S_max_size, as GNU malloc won't budge.
- * bits/std_sstream.h: Revert.
-
- * testsuite/17_intro: header_[iosfwd, ios, iostream, iomanip,
- istream, ostream, streambuf, fstream, sstream].cc: New files.
-
-1999-06-30 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
-
- * bits/std_sstream.h (stringbuf::sync): Don't use string::begin()
- and string::end().
-
- * bits/basic_string.h (basic_string<>::_S_copy_chars): Add
- specializations for _CharT*, iterator and const_iterator.
- * src/string-inst.cc: Remove explicit instantiation, as
- now explicitly specialized.
-
- * bits/basic_string.h: Add a size_type parameter to _M_clone with
- a default value set to 0.
- * bits/string.tcc: In _M_clone by the call of _S_create add the
- value of the new parameter to _M_length. In reserve check
- _M_state and use _M_clone instead of _M_mutate.
-
-1999-06-30 Benjamin Kosnik <bkoz@happy.cygnus.com>
-
- * bits/basic_string.h: Fix _S_max_size.
- * bits/string.tcc: Add def here.
- * testsuite/21_strings/insert.cc: Fix.
-
- * bits/sbuf_iter.h: Remove detritus.
- * testsuite/24_iterators/istreambuf_iterator.cc: Add tests.
-
- * src/locale-inst.cc: Elaborate iterator/locale instantiations
- to resolve alpha-osf4 build problems.
-
-1999-06-29 Benjamin Kosnik <bkoz@happy.cygnus.com>
-
- * bits/string.tcc: Fix signed/unsigned issues in compares.
- * stl/bits/stl_deque.h: And here.
- * stl/bits/stl_string_fwd.h: Remove __get_c_string.
-
-1999-06-29 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
-
- * bits/string.tcc: New implementation and interface of _M_mutate.
- Adapt the change in all functions that call _M_mutate.
- * bits/basic_string.h: And here.
-
-1999-06-29 Benjamin Kosnik <bkoz@happy.cygnus.com>
-
- * testsuite/21_strings/capacity.cc (test01): Fix.
-
-1999-06-29 Phil Edwards <pedwards@ball.com>
-
- * mknumeric_limits: Exit script if gen-num-limits isn't built.
-
-1999-06-29 Andreas Gruenbacher <agruenba@pent224.infosys.tuwien.ac.at>
-
- * stl/bits/stl_vector.h: Fix.
- * testsuite/23_containers/vector_cons.cc: Add.
-
-1999-06-29 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * mknumeric_limits (LDFLAGS): fix.
-
-1999-06-29 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * mknumeric_limits (LDFLAGS): set it according to the system.
-
- * math/mathconf.h (NAN): Check whether host is running under
- Cygwin and make the appropriate definition.
- * math/complex-stub.h (nan): protect declaration.
-
-1999-06-28 Benjamin Kosnik <bkoz@haight.constant.com>
-
- * bits/sbuf_iter.h: Rename internal data structure to prevent
- confusion between basic_ios and istreambuf_iterators internal
- basic_streambuf data member.
- * testsuite/24_iterators/istreambuf_iterator.cc: New file.
-
- * bits/basic_string.h: Remove conditionals, add input_iterator
- version of S_construct again.
- * bits/string.tcc: Same.
- * src/string-inst.cc: And add explicit instantiation here.
-
- * src/gen-c++config.cc (_GNU_SOURCE): Take out both _GNU_SOURCE
- and __USE_GNU macro defines, as single __USE_GNU use leading to
- confusion on glibc2.1 systems (ie, RedHat 6.0).
-
- * src/Makefile.am (headers): Add std_utility to installed headers.
-
-1999-06-25 John Potter <jpotter@eagle.lhup.edu>
-
- * stl/bits/stl_tree.h (insert_unique): Revert, just fix insert_equal.
-
-1999-06-25 Gilles Zunino <Gilles.Zunino@hei.fr>
-
- * mknumeric_limits (LDFLAGS): Swap -lc and -lgcc.
-
-1999-06-24 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * src/gen-c++config.cc (_GLIBCPP_*): Change all
- macros to include _GLIBCPP as a distinct namespace.
- * bits/*: And here.
- * src/*: And here.
-
- * stl/bits/std_stdexcept.h: Forward-declare __Named_exception ctor.
- * bits/basic_string.h: Remove __get_c_string.
- * src/stdexcept.cc: Define ctor here.
- * bits/ios_base.h: And fix ios_base::failure as well.
- * src/ios.cc: Define here.
-
- * bits/std_streambuf.h: Add a private copy ctor and assignment
- operator wrapped in _G_RESOLVE_LIB_DEFECTS.
- * bits/ios_base.h: And here too.
-
- * bits/basic_string.h: Tweak.
- * testsuite/21_strings/nonmember.cc: Add operator+ tests.
-
- * src/valarray.cc: Rename to. . .
- * src/valarray-inst.cc: This.
- * src/Makefile.am (sources): Change here.
- * src/Makefile.in: Regenerated.
-
-1999-06-24 Vadim Egorov <egorovv@1c.ru>
-
- * bits/string.tcc(basic_string<>::_Rep::_S_create): Fixed
- allocated size
-
-1999-06-24 Benjamin Kosnik <bkoz@tintin.cygnus.com>
- Tom Tromey <tromey@cygnus.com>
-
- * configure.in (use_glibc2): Eek, correct for non-glibc systems.
- Use AM_CONDITIONAL to get us out of this jam. .
- * libio/Makefile.am: Same.
- * */Makefile: Regenerated.
-
-1999-06-24 Benjamin Kosnik <bkoz@tintin.cygnus.com>
- John Potter <jpotter@eagle.lhup.edu>
-
- * stl/bits/stl_tree.h (insert_equal): Fix.
- * testsuite/23_containers/multiset.cc: New file.
-
-1999-06-23 Benjamin Kosnik <bkoz@cygnus.com>
-
- * configure.in (test for glibc2): Correct AC_TRY_COMPILE so that
- this works correctly on glibc-2 systems. This should allow
- simplified linking on these systems, and successful linking on Red
- Hat 6.0 systems.
- * configure, Makefile: Regenerate.
-
- * bits/std_cwctype.h: Add missing 'w' to _S_iswpunct_helper name.
-
- * testsuite/ext: New directory.
- * testsuite/ext/headers.cc: New file.
-
-1999-06-23 Vadim Egorov <egorovv@1c.ru>
-
- * stl/ext/hash_set: include missing headers
- * stl/ext/hash_map: Same
- * stl/ext/slist: Same
-
-1999-06-17 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/std_cmath.h: comment out modf. Kills build on hpux10.20
-
-1999-06-15 Benjamin Kosnik <bkoz@cygnus.com>
-
- * src/Makefile.am (sources): Regenerate.
- * mkcheck: Add TESTS_FILE as a way of controlling what testcases
- are run.
-
-1999-06-14 Benjamin Kosnik <bkoz@cygnus.com>
-
- * src/string-inst.cc: Change _S_construct signature, to
- track requested allocation size versus valid input iterator range.
- * bits/basic_string.h: Here too.
- * bits/string.tcc: And here.
-
-1999-06-12 Benjamin Kosnik <bkoz@cygnus.com>
-
- * mkcheck (LOG_FILE): Correctly append errors.
-
- * stl/bits/stl_iterator.h: Revert previous, delirious, change.
-
- * bits/basic_string.h: Change _Rep::_M_data to _Rep::_M_refdata,
- to clarify differences between basic_string::_M_data() calls and
- _Rep::_M_data() calls.
- * bits/std_string.h: Fix.
- Put in check for out_of_range in substr.
- * bits/string.tcc: Fix for _S_find.
-
- * testsuite/21_strings/compare.cc: Add tests.
- * testsuite/21_strings/find.cc: New file.
- * testsuite/21_strings/substr: New file.
- * testsuite/21_strings/replace.cc: New file.
-
-1999-06-11 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/valarray_array.h: __restrict__ify pointers.
-
- * bits/std_valarray.h: Tweak.
- (valarray<T>::cshift, valarray<T>::shift): use __builtin_alloca.
-
- * bits/gslice_array.h: Tweak. Reflect changes in bits/gslice.h
-
- * bits/gslice.h: Tweak.
- (class gslice::_Indexer): new class.
- (gslice::gslice(const gslice&)): implement copy-ctor to support
- ref-counted index.
- (gslice::operator=(const gslice&)): support ref-counted index.
- (gslice::_M_convert_to_index): delete.
-
- * src/valarray.cc: New file.
- (__gslice_to_index): turn a gslice into a valarray<size_t>
- (ctor gslice::_Indexer::_Indexer): implement.
-
- * src/Makefile.am (sources): add valarray.cc
- * src/Makefile.in: regenerate.
-
-1999-06-08 Benjamin Kosnik <bkoz@cygnus.com>
-
- * stl/bits/stl_iterator.h (__normal_iterator::const_iterator
- ctor): Put in a const_cast.
-
- * testsuite/21_strings/invariants.cc: New file.
-
- * testsuite/21_strings/insert.cc: Add exception handling bits.
- * testsuite/21_strings/ctor_copy_dtor.cc: Same.
-
- * src/wstring-inst.cc: Add c++config.h include.
-
- * bits/basic_string.h: Fix const operator[] for size == pos.
- Add _M_leak for rbegin, non-const.
- Add _M_leak for rend, non-const.
- Make member function at standards conformant.
- Add _S_terminal to _Rep for operator[] const, add this into
- c_str() as well.
- * bits/string.tcc: Add static member definition here,
- temporarily.
-
- * testsuite/21_strings/element_access.cc: Add tests.
-
-1999-06-08 Vadim Egorov <egorovv@1c.ru>
-
- * bits/fstream.tcc (_M_really_overflow): Fixed size of
- conversion buffer.
-
-1999-06-08 Phil Edwards <pedwards@ball.com>
-
- * bits/fstream.tcc (basic_filebuf::xsputn): Fix off-by-one count
- caused when __testinit is true.
- * bits/ostream.tcc (basic_ostream::op<<(streambuf*)): Write buffer
- using rdbuf()->sputn rather than _M_fnumput->put.
-
-1999-06-08 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * testsuite/23_containers/bitset_ctor.cc: New file.
- * stl/bits/std_bitset.h (__BITSET_WORDS): Fix integration bug.
-
-1999-06-08 Phil Edwards <pedwards@ball.com>
-
- * bits/fstream.tcc (basic_filebuf::underflow): Fix, rename local vars.
-
-1999-06-07 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * testsuite/21_strings/element_access.cc: Finish off these tests.
- * testsuite/21_strings/insert.cc (test01): Uncomment.
- * testsuite/21_strings/ctor_copy_dtor.cc (test01): Finish off ctors.
- * bits/basic_string.h: Tweak, okay, fix for real this time.
- * bits/string.tcc: Same.
- * bits/char_traits.h: Tweak.
-
-1999-06-07 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * bits/std_cmath.h: Example of how to use the generated macro.
- * acconfig.h: Add macro for sinf here.
- * configure.in (LIBS): Add test for builtin math function sinf.
- * configure: Regenerated.
-
- * bits/basic_string.h: Fix _S_max_size.
-
-1999-06-06 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * bits/basic_string.h: Fixes for out-of-memory segv for large strings.
- Remove _S_construct signature for forward_iterator_tag and
- input_iterator_tag.
- Clean _M_fold.
- * src/string-inst.cc: Same, tweaks.
- * bits/string.tcc: Same, tweaks.
-
- * testsuite/21_strings/ctor_copy_dtor.cc: Add/clarify tests.
- * mkcheck (LOG_FILE): Fix filebuf-[2,3].tst checks.
- * mknumeric_limits (LD_FLAGS): Add -nodefaultlibs -lc -lgcc as per
- Gaby.
-
- * src/locale.cc: Final separation for char/wchar_t bits.
-
-1999-06-05 Phil Edwards <pedwards@ball.com>
-
- * docs/index.html: Added link to book upon request'n'agreement.
- * docs/23_containers/wrappers_h.txt: Added.
- * docs/{23_containers,27_io}/howto.html: Added sections.
-
- * bits/std_fstream.h: Tweak.
-
-1999-06-05 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * src/ios.cc: Same here.
- * bits/std_iosfwd.h: More wchar_t defines.
-
- * bits/basic_string.h: Tweaks.
- * bits/string.tcc: Tweak. Fix _S_construct to check for max_size
- when doing error checking, as per LWG defect #83.
-
- * src/gen-c++config.cc: Fix comment.
-
- * testsuite/21_strings/ctor_copy_dtor.cc: New file, checks ctors,
- assignments, dtors.
- * testsuite/21_strings/element_access.cc: New file, checks for
- operator[], at(...).
- * testsuite/21_strings/insert.cc: New file, tests string::insert.
- * testsuite/21_strings/char_traits.cc: New file, tests
- for char_traits<char>.
-
- * bits/utility.h: Remove, again.
- * src/Makefile.am (std_headers): Remove utility.h.
- * src/Makefile.in (std_headers): Regenerate.
-
- Alfred Minarik <a8601248@unet.univie.ac.at>
- * bits/basic_string.h: Move __out_of_range and __length_error into
- namespace std.
-
-1999-06-05 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * testsuite/26_numerics/modf_float.cc: New file.
-
- * bits/std_cmath.h (modf(float, float*)): Fix signature. Correct
- typo: use ::modff, not ::modf.
-
-1999-06-03 Vadim Egorov <egorovv@1c.ru>
-
- * bits/string.tcc (basic_string::_M_mutate): Fixed memory
- allocation error
- * testsuite/21_strings/capacity.cc (test01): Test.
-
-1999-06-03 Phil Edwards <pedwards@ball.com>
-
- * bits/fstream.tcc: Re-order inits to stop warnings. Comment/move
- unused variables to within #if 0 blocks to do the same.
- * bits/std_fstream.h: Fix typos (one prevents compilation).
-
-1999-06-03 Benjamin Kosnik <bkoz@pacifica.cygnus.com>
-
- * src/wstring-inst.cc: Fix.
-
-1999-06-02 Benjamin Kosnik <bkoz@madcow.cygnus.com>
-
- * bits/char_traits.h: Add _G_USE_WCHAR_T macro guards.
- * stl/bits/stl_string_fwd.h: Same.
- * bits/locale_facets.h: Same.
- * bits/locale_facets.tcc: Same.
- * src/wstring-inst.cc: And here.
-
- * src/gen-c++config.cc: Comment _G_USE_WCHAR_T. Leading to
- problems on HPUX 10.20.
- * your-build-directory-here/bits/c++config.h: Just kidding, do it
- here as a temporary hack till the compiler/host problems get
- worked out.
-
- * bits/locale_facets.tcc (num_get::do_get): Change from ifdef
- HAVE_STRTOLD to HAVE_STRTOLD && !(__hpux). Apparently, problems
- converting "long double" to struct long_double. Probably should be
- done with one macro (HAVE_STRTOLD) at configure time.
-
- * bits/std_cmath.h: Comment out pow(double, int) definition as
- gives re-declaration under hpux10.20. Revert previous change, as
- kills linux/x86, solaris 2.7, hpux builds. These should be done
- using autoconf, see std_cctype.h and the solutions started in
- configure.in (see config.h for the generated file.)
-
- * mknumeric_limits (LDFLAGS): Remove '-nodefaultlibs -lc', as
- -nodefaultlibs prevents linking under HPUX 10.20 as __main is not
- defined.
-
- * docs/index.html: Add some useful links.
- * docs/17_intro/contribute.html: Fix broken links.
-
-1999-06-02 Benjamin Kosnik <bkoz@rhino.cygnus.com>
-
- * mkcheck (LOG_FILE): Add !/bin/bash instead of cygnus-style
- paths. The rest of the world should be able to run this script
- now.
-
- * src/Makefile.am ($(generated_headers)): Remove comment.
- * Makefile*: Regenerate.
-
- * bits/std_locale.h: Remove detritus.
- * bits/localefwd.h: Add <cctype> include to undefine the isspace
- macro.
-
-1999-06-01 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * src/gen-c++config.cc: New file. Making c++config.h at configure
- time by catting this file (nee bits/config.h) with the build
- directories config.h. This is not a complete or perfect solution
- but is better than what was in place previously.
- * bits/c++config.h: Rename/move to above.
- * src/Makefile.am (headers): Remove c++config.h.
- (myinstallheaders). Add.
- * Makefile*: Regenerated.
-
- * bits/std_cwchar.h: Add include of c++config.h for HAVE_*
- definitions, so that wmemcmp, wcslen, wmemchr, etc are properly
- declared only if not present in the host's wchar.h.
-
- * bits/locale_facets.tcc (std): Change _G_USE_STRTO* to HAVE_STRTO*.
-
- * bits/std_cmath.h: Define out, for the moment. Linux has no
- __buitin_fsqrtl? Probably need some kind of configure trickery
- here as well.
-
- * src/Makefile.*: Regenerate.
- * bits/c++config.h: Add config.h include.
-
- * bits/std_cwchar.h: Remove remaining #error guard.
-
- * acconfig.h: Add bits for HAVE_LC_MESSAGES.
-
- * configure.in (LIBS): Replace previous effort for mbstate_t and
- strtold/strtof with this implementation.
-
-1999 06-01 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/std_cmath.h: Tweak. Add more functions. Use __builtin_xxx
- whenever possible.
-
-1999-05-28 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/locale_facets.tcc (std): Eek: this left in. Autoconf bits
- for determining mbstate_t differences across various hosts not
- finished.
-
-1999-05-26 Benjamin Kosnik <bkoz@nabi.net>
-
- * bits/locale_facets.tcc: Change to ifdef.
-
- * bits/std_sstream.h (stringbuf::setbuf): Remove dynamic_cast.
- * bits/std_fstream.h (filebuf::setbuf): Same.
-
- * bits/std_istream.h: Add ws declaration.
- * bits/istream.tcc: Stub out definition.
-
- * docs/index.html: Fix broken link for design.txt.
-
- * configure.in: Test for mbstate_t. If wchar.h doesn't have it,
- then set _G_NEED_MBSTATE_T.
- * configure: Regenerate.
- * bits/c++config.h: Move mbstate_t define.
- * bits/std_cwchar.h: To here.
-
-1999-05-25 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
-
- * bits/std_sstream.h:
- basic_stringbuf<>::basic_stringbuf: fix.
- basic_stringbuf<>::setbuf:
- remove the temporary __string_type object,
- remove the unnecessary dynymic_cast in the return value,
- change the type of the returned value from __streambuf_type*
- to basic_stringbuf<_CharT, _Traits, _Alloc>*.
-
-1999-05-25 Phil Edwards <pedwards@ball.com>
-
- * bits/std_streambuf.h (streambuf::setbuf): Always return streambuf*.
-
-1999-04-25 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/std_cmath.h: Tweak. Add float versions of the math functions
- in <math.h>. <cmath> still incomplete and incorrekt.
-
-1999-05-24 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * mknumeric_limits (LDFLAGS): set appropriate link flags.
-
-1999-05-23 Phil Edwards <pedwards@ball.com>
-
- * docs/17_intro/howto.html: Added links to text docs,
- e.g., BUGS.
- * docs/21_strings/howto.html: Updated sections and links.
- * docs/21_strings/{gotw29a.txt,stringtok_h.txt}: Added.
- * docs/faq/index.html: Updated what-works for sixth
- snapshot. Also a number of "internal" links have been
- fixed, now that the web pages are the docs directory...
- * docs/faq/index.txt: Regenerated.
-
-1999-05-21 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * bits/basic_string.h: Add Nathan's documentation on the string class.
-
- * testsuite/27_io/ios_members_static.cc: New file, for testing
- ios_base::sync_with_stdio.
-
-1999-05-21 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * bits/std_locale.h: Simplify includes.
- * bits/loccore.h: Delete.
- * bits/localefwd.h: Renamed, trimmed.
- * bits/locfacets.h: Delete.
- * bits/locale_facets.h: Rename, expanded.
- * bits/loccore.tcc: Deleted.
- * bits/locfacets.tcc: Deleted.
- * bits/locale_facets.tcc: Resultant merge.
- * bits/std_fstream.h: Modify include.
- * bits/ostream.tcc: Same.
- * bits/istream.tcc: Same.
-
- * src/locale-inst.cc: And here.
- * src/locale.cc: Ditto.
- * src/Makefile.am: Updated.
- * src/Makefile.in: Rengenerated.
-
- * bits/std_istream.h: Move istream::sentry ctor definition.
- * bits/istream.tcc: Move istream::sentry ctor here.
- Add more detailed locale include here for ctype member functions.
- * bits/ostream.tcc (std): And here.
-
- * bits/sbuf_iter.h: Include std_streambuf.h
-
- * bits/locfacets.h: Start separating this into a localeimp.h file.
- * bits/loccore.h: Start separating this into a localefwd.h file.
- Add std_climits for CHAR_BIT.
-
- * bits/ios_base.h (ios_base::sync_with_stdio): Stub in.
-
- * bits/char_traits.h: Tweak.
-
- * bits/ios_base.h: Remove INT_MAX, use 1<<16.
-
- * bits/std_ostream.h: Remove c++config.h include.
- * bits/std_istream.h: Same.
- * bits/std_streambuf.h: Same.
- * bits/std_fstream.h: Same.
- * bits/std_sstream.h: And here.
-
- * bits/std_iosfwd.h: Add _G_RESOLVE_LIB_DEFECTS here for streampos.
- * bits/char_traits.h: Add include of std_cwchar.h for mbstate_t.
- * bits/fpos.h: Tweak, format.
-
- * std/ciso646: New file.
- * bits/std_ciso646.h: New file.
- * src/Makefile.am (std_headers): Add ciso646.
- (headers): Add bits/std_ciso646.h.
- * src/Makefile.in: Regenerate.
- * testsuite/17_intro/header_ciso646.cc: New file, disable
- equivalance tests.
-
- * bits/fpos.h: Remove libio.h include.
- * bits/basic_file.h: And here.
- * bits/std_ios.h: Put here.
-
- * src/ios.cc: Simplify includes, tweak.
- * bits/std_ios.h: Simplify include order.
- * bits/ios_base.h: Modify ios_base::failure.
-
- * stl/bits/std_numeric.h: Change include from stl_iterator to
- std_iterator.
-
-1999-05-19 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * std/iostream: Remove static member __ioint.
- * bits/std_iostream.h: Put here.
-
- * stl/bits/std_numeric.h: Remove unneccessary std_iostream.h include.
- * stl/bits/stl_algobase.h: Same.
- * testsuite/27_io/iostream_objects.cc: Regression tests.
- * testsuite/27_io/hello.cc: Remove, subset of above.
-
-1999-05-19 Phil Edwards <pedwards@ball.com>
-
- * docs/index.html: Tweak, update.
-
-1999-05-18 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * docs/17_intro/RELEASE-NOTES: remove outdated
- documentation about numeric_limits. Correct CXXINCLUDE setting
- documentation.
-
-1999-05-18 Phil Edwards <pedwards@ball.com>
-
- * docs/{17_intro,18_support,19_diagnostics,20_util,21_strings,
- 22_locale,23_containers,24_iterators,25_algorithms,26_numerics,
- 27_io}/howto.html: Created, with some initial entries.
- * docs/faq/index.html: Fixed some links.
- * docs/faq/index.txt: Regenerated.
-
-1999-05-18 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * bits/c++config.h (__GLIBCPP__): Set version to 19990518.
-
- * docs/17_intro/RELEASE-NOTES: Update.
- * docs/index.html: Correct link to mailing list help page, update News.
- * docs/faq/index.html: Change fifth to sixth for snapshot.
-
- * src/Makefile.am (myinstallheaders): Bring over Gaby's changes to
- install $(top_builddir)/bits/std_limits.h into
- $(myincludepfx)/bits. This was mistakenly omitted from yesterday's
- Makefile.am changes.
- * *Makefile*: Regenerate using automake.
-
- * mkcheck (LOG_FILE): Fix filebuf directory oddness.
- * testsuite/27_io/filebuf.cc: Same.
-
-1999-05-18 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * docs/17_intro/CHECKLIST: update.
- * docs/17_intro/TODO: update.
-
-1999-05-17 Phil Edwards <pedwards@ball.com>
-
- * docs/{17_intro,18_support,19_diagnostics,20_util,21_strings,
- 22_locale,23_containers,24_iterators,25_algorithms,26_numerics,
- 27_io}/howto.html: Created, with some initial entries.
- * docs/faq/index.html: Fixed some links.
- * docs/faq/index.txt: Regenerated.
-
-1999-05-17 Benjamin Kosnik <bkoz@unhappy.cygnus.com>
-
- * src/Makefile.am (myinstallheaders): Missed removing missing.h.
- * Makefile.in*: Regenerate.
-
-1999-05-17 Benjamin Kosnik <bkoz@happy.cygnus.com>
-
- * bits/std_streambuf.h: Same.
-
- * bits/loccore.h (_Bad_use_facet): Remove bits warned about.
- * bits/locfacets.h (std): Same.
- * bits/sstream.tcc: Same.
- * testsuite/27_io/stringstream.cc: Tweak.
-
- * testsuite/27_io/filebuf.cc: Adjust.
- * testsuite/21_strings/capacity.cc (test01): Add more
- string::reserve tests.
-
- * bits/c++config.h: Remove broken CCTYPE.
- * bits/std_cctype.h: Tweak, remove de-macroization, enable
- sequestered topper implementation.
- * bits/std_cwctype.h: Same.
-
- * bits/missing.h: Remove.
- * bits/std_locale.h: Remove missing.h include.
-
- * stl/bits/std_bitset.h (bitset::bitset(string): Tweak to compile.
-
- * src/Makefile.am (headers): Add bits/std_cwctype.h.
- INCLUDES: Add top_builddir.
- * src/Makefile.in: Regenerate.
-
- * Makefile.am: Add check and check-install as new targets.
- * testsuite/make_check_libfree++: Move to. . .
- * mkcheck: Here.
- * configure.in: Tweak versions.
- * mknumeric_limits: Set paths correctly.
-
-1999-05-17 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * src/Makefile.in (myinstallheaders): add rule to install
- std_limits.h.
-
- * bits/slice.h (class slice): don't const-qualify data members
- since the copy and assignment operator is implicitly used. The
- valarray specification is definitively a bad one.
-
- * Makefile.in (generate-limits-sources): fix typo.
-
- * docs/text/TODO: update.
- * docs/text/CHECKLIST: update.
-
- * bits/gslice.h (gslice): fix bugglet.
- (gslice::gslice): set _M_index_size to 0 whenever given lengths
- (lj) of size zero.
-
- * src/Makefile.am (libstdc___la_SOURCES): add gen-num-limits.
- * src/Makefile.in (libstdc___la_SOURCES): keep in sync.
- [Note: **/Makefile.in should be generated from the corresponding
- Makefile.am. The current situation is a litte chaotic. ]
-
-1999-05-16 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * mknumeric_limits: tweak.
-
- * Makefile.in (all): add target generate-limits-sources.
- (generate-limits-sources): make a directory bits/ in top_builddir
- where the generated std_limits.h is put; generate limitsMEMBERs.cc
- directly under $(top_builddir)/src. Remains to put the appropriate
- rule for installing std_limits.h.
-
- * src/Makefile.in (headers): remove bits/std_limits.h to this list.
- (INCLUDES): add -I$(top_builddir) for bits/std_limits.h which is
- now generated at build-time in the build directory
- (libstdc___la_SOURCES): remove limitsMEMBERS.cc form this list
- * src/Makefile.am: reflect changes in src/Makefile.in
-
-1999-05-12 Phil Edwards <pedwards@ball.com>
-
- * docs/faq/index.html: Add more entries (5.4,5.5), finish
- all but one empty entry. Add links for HOWTOs, but no files yet.
- (Corrected HOWTO links are for bkoz's new scheme.)
- * docs/faq/index.txt: Regenerated.
-
-1999-05-12 Benjamin Kosnik <bkoz@happy.cygnus.com>
-
- * testsuite/17_intro/headers.cc: New file.
- * stl/bits/std_queue.h: Change stl_bvector.h include path.
- * bits/std_cwctype.h: New file.
-
- * testsuite/27_io/filebuf.cc: Need to tweak directory structure.
-
-1999-05-11 Benjamin Kosnik <bkoz@loony.cygnus.com>
-
- * stl/bits/stl_config.h (__USE_MALLOC): Change underlying allocator.
- Check __USE_MALLOC before defining specializations containing
- __default_alloc_template.
- * src/stl-inst.cc: Here too.
-
- * bits/basic_string.h: Change.
-
- * testsuite/make_check_libfree++: More tweaks.
- * testsuite/21/capacity.cc: New file.
-
- * src/string.cc: Rename to be consistent with other inst files.
- Rename to string-inst.cc.
- * src/string*.cc: Change include.
- * src/wstring.cc: Rename to wstring-inst.cc.
- * src/wstring*.cc: Ditto.
- * src/Makefile.in: Also here.
- * src/Makefile.am: Ditto.
-
- * src/traits.cc: Remove.
- * src/wtraits.cc: Same.
-
- Try a new way of organizing documentation, one with synchronicity
- between testsuites and docs subdirectories, and see who yelps.
- * docs/html: Remove, use chapter and subject specific directories
- instead of forcing things immediately into format of
- documentation.
- * docs/text: Same.
- * docs/image: Same.
- * docs/faq/text, docs/faq/html: Remove, put in the docs/faq
- directory and sort by filename and extension.
- * docs/17_intro, 18_support, 19_diagnostics, 20_util, 21_strings,
- 22_locale, 23_containers, 24_iterators, 25_algorithms,
- 26_numerics, 27_io: Add.
- * docs/17_intro/*: Populate with all the text files. . .
- * docs/index.html: Construct.
-
- * testsuite/*: Update with same names as the docs subdir.
- * testsuite/results: Where to stash conformance results for the
- different snapshots, so that progress/size/speed issues can be
- tracked over time.
-
-1999-05-10 Benjamin Kosnik <bkoz@loony.cygnus.com>
-
- * src/string.cc: Add _S_copy_chars instantiation, as well as
- string::binary operators !=, ==, etc.
-
- * src/Makefile.am (CXXFLAGS): Remove -fvtable-thunks.
- * src/Makefile.in (CXXFLAGS): Same here.
- * testsuite/make_check_libfree++ (CXX_FLAG): And here.
-
-1999-05-07 Benjamin Kosnik <bkoz@cygnus.com>
-
- * src/string.cc: Add missing member functions to instantiation list.
-
-1999-05-07 Benjamin Kosnik <bkoz@cygnus.com>
-
- * src/misc-inst.cc: Remove unused string instantiations.
-
- * bits/string.tcc: Tweak, fix.
- * bits/basic_string.h: Format. Fix reported error with c_str().
-
- * testsuite/make_check_libfree++: Tweak for shared builds.
- * testsuite/21/operations.cc: New file for testing c_str() etc.
-
-1999-05-06 Benjamin Kosnik <bkoz@cygnus.com>
- Ryszard Kabatek <kabatek@chemie.uni-halle.de>
-
- * stl/bits/stl_vector.h: Fix the code of vector<> for usage with
- an iterator class. Delineate pointer versus iterator differences
- in implementation.
- * 23/vector_capacity.cc: New file, tests for above.
-
-1999-05-06 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * mknumeric_limits: Fix typo. 'unsigned lont' should read
- 'unsigned long'.
- * src/Makefile.am (libstdc___la_SOURCES): add limitsMEMBERS.cc,
- generated by mknumeric_limits to the list. Now std_limits.h is
- basically working.
- * src/Makefile.in (generate-numeric-limits): new target to handle
- automatic generation of bits/std_limits.h and src/limitsMEMBERS.cc.
- (all): add target generate-numeric-limits.
- (libstdc___la_OBJECTS): add limitsMEMBERS.lo
- (libstdc___la_SOURCES): add limitsMEMBERS.cc
-
-1999-05-05 Benjamin Kosnik <bkoz@cygnus.com>
-
- Irix build issues.
- * bits/c++config.h (_G_USE_CTYPE_ISBIT): Defines new macro for
- mask values in ctype_base. Move hacks for _ISBit to locfacets.h.
- * bits/locfacts.h: Here.
-
-1999-05-05 Benjamin Kosnik <bkoz@cygnus.com>
- Ulrich Drepper <drepper@cygnus.com>
-
- Solaris build issues.
- * bits/c++config.h: Define new macros, _G_USE_STRTOF and
- _G_USE_STRTOLD.
-
- * bits/locfacets.tcc (num_get::do_get): Tweak long double and
- float overloads to use the above macros. Account for the lack of
- strtold on some systems, and revert back to using sscanf.
-
-1999-05-04 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
-
- * bits/locfacets.tcc (num_get::do_get): Check the errno variable.
- Use strtoul/strtoull for unsigned types. Check the ranges for
- short/unsigned short and if necessary for int/unsigned int.
-
-1999-05-04 Benjamin Kosnik <bkoz@cygnus.com>
-
- * src/gen-num-limits.cc (round_style): Need to use mknumericlimits
- to generate bits/std_limits.h now, as the SGI std_limits.h is
- being depricated. Not done, but should be done immediately: need
- to make sure this script is run as part of the configuration
- process, because without it "make" in a configured build directory
- will fail. Also tweaked: added a space for float_round_style, and
- used static_cast of zero to default-initialize, which should be ok
- according to the standard. (see 8.5 p5 and 20.1.3).
- * mknumeric_limits (OUT_C): Need this for x86 long
- double extensions.
-
- * bits/basic_file.h: Include libio.h, not libioP.h.
- * src/basic_file.cc: And add libioP.h include here, so that
- _IO_init, et. al are well-declared.
-
- * testsuite/make_check_libfree++ (LIB_PATH): Test installed
- headers, not source directory headers.
-
- * src/Makefile.am (headers): Add stl_range_errors.h, also adjust
- for ext/*. Also add basic_file.h.
- * src/Makefile.in (headers): Same.
-
- * bits/std_string.h: Reduce dependencies for faster
- pre-processing. Move istream and ostream specific defines into
- istream.tcc and ostream.tcc respectively.
- * bits/string.tcc: And here.
- * bits/basic_string.h: Move getline inline out-of-line, and to
- istream.tcc.
- * bits/istream.tcc: Move string::getline and operator>> here.
- * bits/ostream.tcc: And here too.
-
- * bits/utility.h: Remove, as clashes with a standard header. Put
- __OUTOFRANGE and __LENGTHERROR macros into string.tcc for the time
- being, until this can be combined with SGI's approach.
- * bits/string.tcc: Add macros, as above.
- * bits/loccore.h: Add _Count_ones defines.
- * bits/std_string.h: And here too.
- * bits/std_locale.h: And here.
- * bits/std_ios.h: Take out include here.
- * src/Makefile.am (headers): Remove utility.h
- * src/Makefile.in (headers): Remove utility.h
-
- * stl/bits/*: Update to SGI STL 3.20.
- * stl/ext/pthread_alloc: Delete this file.
-
-1999-05-04 Phil Edwards <pedwards@ball.com>
-
- * docs/faq/html/index.html: Add more entries
- * docs/faq/html/index.txt: regenerated.
-
-1999-05-04 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * src/gen-num-limits.cc (DO_DEFINE_MIN_MAX): fix typo.
-
-1999-04-29 Benjamin Kosnik <bkoz@haight.cygnus.com>
-
- * bits/locfacets.tcc (num_get::do_get): Re-implement, with input
- from Ulrich and Nathan. Remove extraneous string class usage,
- tweak, clean, simplify and consolidate with a eye towards removing
- duplcate code. Use strto[l, ll, f, d, ld] instead of sscanf.
- Not done: dealing with leading zeros, wchar_t work.
- * bits/locfacets.h: And here too.
-
- * doc: Remove.
-
-1999-04-29 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * docs/: add a FAQ.
- * docs/faq/: New directory.
- * docs/faq/html/: Likewise.
- * docs/faq/text/: Likewise.
- * docs/faq/html/index.html: New file.
- * docs/faq/html/index.txt: Likewise. Generated from
- docs/faq/html/index.html by lynx.
-
-1999-04-28 Benjamin Kosnik <bkoz@happy.cygnus.com>
- Ryszard Kabatek and Branko Cibej
-
- * bits/locfacets.tcc: Modify.
-
-1999-04-27 Benjamin Kosnik <bkoz@happy.cygnus.com>
-
- * bits/sbuf_iter.h: Clean, fix istreambuf_iterator, make
- conformant to 14882, wrap non-standard extensions with
- _G_RESOLVE_LIB_DEFECTS, remove detritus and cruft, rennovate.
- * bits/locfacets.tcc (num_get::do_get(bool)): Return correct iterator.
-
- * testsuite/27/istringstream_formatted.cc: Add tests.
-
- * bits/locfacets.h: Remove cruft from _Format_cache, continue
- commenting, simplify.
- * bits/locfacets.tcc: Same.
-
- 1999-04-27 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
- * bits/locfacets.tcc (num_get::do_get):
- Fix the sscanf format parameter
- for long long 'll' (as in C9X) instead of 'l'.
- Fix the order of sscanf format parameters: "%dl" --> "%ld".
- Change the type of the local variable '__conv' from 'string'
- to 'const char*' and adapt the change.
-
-1999-04-26 Benjamin Kosnik <bkoz@happy.cygnus.com>
-
- * bits/locfacets.h: Document _Format_cache, and name data members
- after the corresponding functions in numpunct. For instance:
- _M_grsep -> _M_thousands_sep, and _M_decsep -> _M_decimal_point.
- Break apart _M_boolnames{2] into _M_truename and _M_falsename.
- * bits/locfacets.tcc: Same.
-
- * bits/locfacets.h (num_get::_M_extract): Don't allow groupings to
- stop parsing--store for later analysis.
- * testsuite/27/istringstream_formatted.cc: Add cases.
-
-1999-04-25 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/valarray_meta.h: tweak.
- (_UnFunBase, _BinFunBase, _BinFunBase1, _BinFunBase2, _BinBase1,
- _BinFunBase2): rename typedef-name _Tp to _Vt to keep the compiler
- happy -- boggus warning.
- * bits/std_valarray.h: Fix.
- (valarray<T>::shift): Fix. Update comment.
- (valarray<T>::cshift): Fix.
-
-1999-04-23 Benjamin Kosnik <bkoz@cygnus.com>
-
- * testsuite/27filebuf-2.txt: Delete.
- * testsuite/27/filebuf.cc: Put output files directly into the
- correct subdirectory (27).
-
- Alexandre Petit-Bianco <apbianco@cygnus.com>
- * testsuite/make_check_libfree++: Check generated (*.txt) file
- against stored results file (*.tst).
-
-1999-04-22 Benjamin Kosnik <bkoz@nabi.net>
-
- * bits/locfacets.tcc: Fix.
-
- * bits/fstream.tcc (filebuf::seekoff): Output current out pointer.
- (filebuf::overflow): Simplify.
- (filebuf::xsputn): Correctly handle indeterminate state.
-
- * testsuite/27/istringstream_formatted.cc: Tweak.
- * testsuite/27/filebuf.cc: Tweak.
- * testsuite/27/filebuf-3.tst: Correct: this is the canonical
- results file, please use this in the future to guarantee filebuf
- positioning accuracy.
- * testsuite/27/filebuf-2.tst: Same.
-
-1999-04-21 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/fstream.tcc (filebuf::xsputn): Add.
- * bits/std_fstream.h: Declare.
-
- * src/basic_file.cc (__basic_file::open): Add O_CREAT to open
- calls using ios_base::trunc.
-
- * bits/sstream.tcc (streambuf::overflow): Fix crasher.
-
- * testsuite/make_check_libfree++ (LOG_FILE): Ugh. Another fix.
- * testsuite/27/27stringstream.cc: Same.
- * testsuite/27/27stringbuf.cc: More tweaks.
- * testsuite/27/27filebuf-2.txt: Remove.
-
- * testsuite/27/27filebuf-1.tst: Append, to force byte size over
- BUFSIZE so that overflows/underflow can be tested with default
- buffer setting.
- * testsuite/27/27filebuf-1.tst: Add.
-
- * testsuite/*/*: Remove pre-pended chapter names, as they
- duplicate the chapter info contained in the enclosing directory
- anyway.
-
-1999-04-20 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/streambuf.tcc (streambuf::xsputn): Re-implement to conform
- to sputc conditions.
-
- * bits/ios_base.h: Define here.
- * src/ios.cc (ios_base::_M_clear): Remove hack.
- * bits/basic_ios.h: Fix rdstate().
-
- * bits/sstream.tcc (streambuf::seekoff): Fix.
- * bits/fstream.tcc (filebuf::seekoff): Tweak comments.
-
- * testsuite/make_check_libfree++ (LOG_FILE): More c-c-c-changes.
- * testsuite/24/24iterator.cc: Add/Fixes for DEBUG_ASSERT.
- * testsuite/27/27stringstream.cc: Same.
- * testsuite/27/27stringbuf.cc: Same.
- * testsuite/27/27istringstream_formatted.cc: Same.
- * testsuite/27/27filebuf.cc: Same.
-
- * bits/locfacets.h: Remove specializations for messages<char> and
- messages<wchar_t> ctors. Same for moneypunct. Not required, not used.
- * src/locale.cc: Remove definitions for above.
- * src/misc-inst.cc: Revert, take out iomanip.h include.
- * bits/std_iomanip.h: Tweak, format.
-
-1999-04-19 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/loccore.h: Format, move inline.
- * bits/locfacets.tcc: Same.
- * bits/locfacets.h: Same.
-
- Ulrich Drepper <drepper@cygnus.com>
- * aclocal.m4: Re-generate.
- * configure, configure.in: Same.
- * m4/lc_messages.m4: New file.
-
-1999-04-18 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_ostream.h: Fix typedef for wchar_t instantiations.
- * bits/sstream.tcc: Tweak.
-
- * std/iostream: Put __ioinit inside macro guards.
-
- * src/stlinst.cc: Delete and move to . . .
- * src/stl-inst.cc: New file, plus wrapping in namespace std.
- * src/Makefile.in: Change.
- * src/Makefile.am: Same.
- * src/misc-inst.cc: Add istringstream/ostringstream instantiations.
-
- * testsuite/make_check_libfree++: Efficiently format for minimal
- space. Enforce stricter execution tests by enabling
- -DDEBUG_ASSERT.
-
-1999-04-16 Benjamin Kosnik <bkoz@cygnus.com>
-
- * docs/text/RELEASE-NOTES: Fix include typo.
-
- * src/Makefile.am (headers): Add istream.tcc.
- * src/Makefile.in (headers): Add istream.tcc.
-
- * ltconfig, ltmain.sh, libtool: Update to libtool-1.2g.
-
-1999-04-16 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/locfacets.tcc (num_get::do_get(long)): Finish roughing in.
- * bits/locfacets.h (num_get::_M_extract): New functin:
- consolidate logic for do_get(...) members.
-
- * bits/sbuf_iter.h (istreambuf_iterator::operator++()): Fix.
- * testsuite/27/27istringstream_formatted.cc: Add.
-
-1999-04-16 Martin v. Loewis <martin@mira.isdn.cs.tu-berlin.de>
-
- * src/basic_file.cc (__basic_file::open): Fix thinko in
- _G_HAVE_IO_FILE_OPEN bits.
- * bits/std_istream.h (sentry::sentry(istream, bool)): Fix isspace bug.
- * bits/std_cmath.h: Add stdlib.h include for ldiv_t.
- * src/complex.cc (FCT): Qualify all functions with global namespace.
- * src/locale.cc: Don't qualify memcpy and setlocale.
- * src/stdexcept.cc (__out_of_range): Qualify out_of_range with std::.
- (__length_error): Likewise, for length_error.
- * src/stlinst.cc: Qualify instantiations with std::.
-
-1999-04-15 Benjamin Kosnik <bkoz@cygnus.com>
-
- * C++STYLE: Add ChangeLog guidelines for member functions.
-
- * doc/* : Delete.
- * BADNAMES, BUGS, C++STYLE, CHECKLIST, COPYING,
- DESIGN, HEADER_POLICY, PROBLEMS, RELEASE-NOTES, TODO: Moved into
- docs/text and made less strident.
-
- * bits/fstream.tcc: Change non-standard ctor to match Sun's sematics.
- * bits/std_fstream.h: Same.
- * src/ios.cc: Same.
-
- * bits/locfacets.h: Touch.
-
-1999-04-15 Ulrich Drepper <drepper@cygnus.com>
-
- * math/cexp.c (cexp): Use NAN instead of nan("").
- Reported by joel reed <joelreed@yahoo.com>.
-
- * libio/libioP.h: Define _IO_seek_fpos_t and _IO_seek_off_t based on
- _G_IO_IO_FILE_VERSION. Use these types in the prototypes.
- * libio/fileops.c: Use _IO_seek_fpos_t and _IO_seek_off_t types
- instead of #if cascades.
- * libio/genops.c: Likewise.
- * libio/ioseekoff.c: Likewise.
- * libio/ioseekpos.c: Likewise.
- * libio/strops.c: Likewise.
- Patch by Chip Salzenberg <chip@perlsupport.com>.
-
-1999-04-15 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * docs: New directory.
- * docs/html: Likewise.
- * docs/text: Likewise.
- * docs/image: Likewise.
-
- * bits/std_cmath.h: Add new functions.
- (abs): overload for long and double.
- (div): overload for long.
-
- * bits/valarray_array.h: Fix.
- * bits/gslice.h: Adjust friend.
- * bits/slice_array.h: likewise.
- * bits/valarray_meta.h: likewise.
-
-1999-04-13 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * bits/locfacets.h: More changes, for num_get for insertion
- operators for integral types. Comment fields in _Format_cache.
- * bits/locfacets.tcc: And here too: add preliminary long version.
- * testsuite/27/27istringstream_formatted.cc: Add cases.
-
-1999-04-13 Mark Elbrecht <snowball3@usa.net>
-
- * configure.in: Add locale.h to AC_CHECK_HEADERS argument. Call
- AC_LC_MESSAGES macro.
- * aclocal.m4 (AC_LC_MESSAGES): New. Determines if a target
- supports LC_MESSAGES.
- * config.h.in: Add entry for HAVE_LC_MESSAGES.
- * src/locale.cc (locale::_S_normalize_category): Use the
- HAVE_LC_MESSAGES macro to check for LC_MESSAGES support instead of
- _G_NO_CLOCALE_HAS_MESSAGES.
- * aclocal.m4 (AM_PROG_LD): For DOS style paths, simplify test to
- '?:' from '?:\\' so any path beginning with a drive name matches.
-
-1999-04-12 Mark Elbrecht <snowball3@usa.net>
-
- * src/basic_file.cc(sys_open) [O_BINARY]: Declare __testb.
-
-1999-04-12 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * bits/locfacets.h: Tweak.
- * bits/locfacets.tcc(do_get): Clean/fix bool method.
-
- * testsuite/21/21nonmember.cc: Same.
- * testsuite/21/21compare.cc: Fix license.
- * testsuite/27/27istringstream_formatted.cc: New file.
-
-1999-04-12 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/valarray_meta.h: _BinFunBase1, _BinFunBase2, _BinBase1,
- _BinBase2: new template classes; put in there to work around a
- compiler limitation. The whole valarray architecture is now
- working.
-
-1999-04-08 Benjamin Kosnik <bkoz@haight.constant.com>
-
- * bits/locfacets.tcc: Fix, format.
- * bits/locfacets.h: Fix.
- * src/locale.cc: Same, plus format.
-
- * bits/basic_string.h: Re-add definition here.
- * src/string.cc: Take out.
-
-1999-04-08 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/std_valarray.h: tweak.
- * bits/valarray_array.h tweak. use _Expr.
- * bits/slice_array.h: likewise.
- * bits/gslice_array.h: likewise.
- * bits/mask_array.h: likewise.
- * bits/indirect_array.h: likewise.
- * bits/valarray_meta.h: tweak.
- _UnFunBase, _UnFunClos, _BinFunBase, _FunBase, _ValFunClos,
- _RefFunClos, _UnBase, _UnClos, _BinBase, _BinClos, _SClos, _GClos,
- _IClos: new template classes.
- _Meta: renamed to _Expr. Made template with args.
- _Constant: made template with two args.
-
-1999-04-05 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/valarray_array.h: tweak.
-
-1999-04-06 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/basic_string.h: Whoops--fix blip.
-
-1999-04-06 Benjamin Kosnik <bkoz@cygnus.com>
-
- Update to SGI STL 3.13
- * bits/basic_string.h: Add __get_c_string definition.
- * stl/bits/stl_range_errors.h: New file.
- * stl/bits/std_bvector.h: Same.
- * stl/bits/*: Update.
-
-1999-04-04 1999 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/slice_array.h: tweak.
- * bits/gslice_array.h: tweak.
- * bits/mask_array.h: tweak.
- * bits/indirect_array.h: tweak.
- * bits/valarray_array.h: tweak.
- (__valarray_copy): replace copy with memcpy.
- * bits/std_valarray.h: use __valarray_copy whenever possible.
- use __valarray_fill instead of fill.
-
-1999-04-02 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * src/gen-num-limits.cc: new file
- * mknumeric_limits: Ditto.
-
-1999-03-30 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/locfacets.tcc: Do a stub version of num_get for short, int,
- and long types.
- * bits/locfacets.h: Add num_get::get methods overloaded for int
- and short, to resolve ambiguous overloads in istream insertion
- operators.
-
-1999-03-30 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_istream.h: Fix.
- * bits/istream.tcc: Fix.
-
-1999-03-30 Philip Martin <pm@corris.dircon.co.uk>
-
- * testsuite/24/24iterator.cc: fix ++/-- tests
-
-1999-03-29 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_ostream.h: Looks like this, actually: Fix up eh-isms.
- * bits/ostream.tcc: Same.
-
- * bits/std_istream.h: Bring over ostream changes, implement member
- functions. Baseline.
- * bits/istream.tcc: New file.
-
-1999-03-26 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/gslice.h (class gslice): fix friends template.
-
-1999-03-23 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_ostream.h: Fix sentry objects, implement seekp, tellp,
- delete cruft, etc.
- * bits/ostream.tcc: Same.
-
- * bits/std_istream.h: Minor tweaks.
-
-1999-03-18 Benjamin Kosnik <bkoz@cygnus.com>
-
- * src/locale-inst.cc: Remove duplicate instantiations.
- * bits/locfacets.tcc: Tweak definitions of static member.
-
-1999-03-18 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_fstream.h: Format: prepend "__" in front of
- non-standard typedefs.
- * bits/fstream.tcc: Match.
- * bits/std_streambuf.h: Format: prepend "__" in front of
- non-standard typedefs.
-
- * bits/sstream.tcc: Match.
- * bits/std_istream.h: Format.
- * src/locale-inst.cc: Add num_get instantiations.
-
- * bits/std_sstream.h: Fix crash in stringstreams. Remove member
- _M_sb, a basic_stringbuf object, and use the basic_ios pointer
- _M_streambuf instead. Make initializations sane. Fix
- allocation/deallocation of _M_streambuf.
- * bits/std_ostream.h: Fix initialization code.
- (ctor): Eliminate redundant this->init(), let base class initialize.
- (default ctor): New. Assume base classes already initialzed.
- * bits/std_istream.h: Parallel work to ostream.
- (ctor): Eliminate redundant this->init(), let base class initialize.
- (default ctor): New. Assume base classes already initialzed.
- Fix initialization of basic_iostream.
-
- * bits/std_fstream.h: While we're at it, make initializations sane
- here too. Now matches sstream.h.
-
- * bits/string.tcc: Fix crash in basic_string::compare.
- * bits/basic_string.h: And here.
- * bits/c++config.h: Add comment about _G_USE_EXCEPTIONS.
-
- * testsuite/make_check_libfree++: Check shared as well.
- * testsuite/27/27stringstream.cc: Add bits.
- * testsuite/27/27boolfmt.cc: Add bits.
- * testsuite/27/27octfmt.cc: Add bits.
-
-1999-03-17 Benjamin Kosnik <bkoz@happy.cygnus.com>
-
- * configure.in (USE_LONG_DOUBLE): signbitl link error.
-
- * bits/locfacets.h: Fix errors that cause build problems
- with current egcs (template parameters have class scope).
- * bits/locfacets.tcc: Same.
- * src/locale-inst.cc: Same, clean.
- * src/misc-inst.cc: Same, clean.
-
-1999-03-17 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
-
- * stl/bits/std_memory.h: Modify auto_ptr::reset to reflect the
- standard. Re-apply this previous patch.
-
-1999-03-17 Philip Martin <pm@corris.dircon.co.uk>
-
- * bits/basic_string.h: Use __normal_iterator<> for iterators.
- * bits/std_sstream.h: Support __normal_iterator<> iterators.
- * bits/string.tcc: Ditto.
- * src/misc-inst.cc: Ditto.
- * src/locale-inst.cc: Ditto.
- * stl/bits/stl_iterator.h: Add __normal_iterator<>.
- * stl/bits/stl_vector.h: Use __normal_iterator<> for iterators.
- * testsuite/24/24iterator.cc: Add test cases for basic_string and
- vector iterators.
-
-1999-03-16 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/locfacets.tcc: Remove macro hack.
- * bits/locfacets.h: Tweaks.
- * src/misc-inst.cc: Weed out locale-related instantiations.
- * src/locale-inst.cc: Same.
-
- * RELEASE-NOTES: Make more changes.
- * bits/c++config.h: Bump version number.
-
- * testsuite/make_check_libfree++: Collect diagnostics.
-
- * bits/std_ostream.h: Fix ostream initialization/destruction
- problem, related to dtor cleanup and new cached facets, agggggggh.
- * bits/ostream.tcc: Tweak.
- * bits/locfacets.h: Remove all friends of iostream classes.
- * bits/ios_base.h: Same.
- * bits/streambuf.tcc: Tweak.
- * bits/std_streambuf.h: Tweak.
- * bits/std_fstream.h: Tweak.
- * bits/fstream.tcc: Tweak.
- * src/stdstreams.cc: Tweak.
- * src/ios.cc: Close streams.
-
- * math/Makefile.in: Add missing files for shared link errors.
- * math/Makefile.am: Same.
-
-1999-03-15 Benjamin Kosnik <bkoz@cygnus.com>
-
- * src/locale-inst.cc: More wchar_t instantiations.
- * src/misc-inst.cc: Missed a few bits.
- * testsuite/make_check_libfree++: Add static and shared runs.
- * src/ios.cc: Add clarity to ios_base::Init::~Init().
-
-1999-03-15 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_ostream.h: Format, expunge, simplify. Add cached
- facets. Resolve link errors.
- * bits/ostream.tcc: Same.
- * src/misc-inst.cc: Add ostream, wostream instantiations.
- * src/Makefile.am: Add missing bits for stdstreams.cc.
- * src/Makefile.in: Same.
- * bits/std_iosfwd.h: Format.
- * bits/locfacets.h (num_put): Add basic_ostream as a friend to
- num_put so that cached _M_fnumput pointer can be deleted in
- basic_ostream's dtor. Now everybody plays nice.
-
-1999-03-12 Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr>
-
- * bits/gslice.h (class gslice): Make friends valarray,
- gslice_array and _GliceExpression.
-
-1999-03-11 Benjamin Kosnik <bkoz@cygnus.com>
-
- * RELEASE-NOTES: Update.
- * src/ios.cc: Use do proper init.
- * bits/std_streambuf.h: Tweak.
- * bits/std_iostream.h: Take out static member.
- * std/iostream: Put here.
- * bits/std_ostream.h: Non-default ctor shouldn't smash _M_streambuf.
- * bits/std_istream.h: Ditto.
- * bits/basic_ios.h: Format.
- * bits/ostream.tcc(write): Fix.
- * bits/fstream.tcc: Fix stdstreams ctor to do a proper
- initialization of the fstream class.
- * src/stdstreams.cc: I'm baaaaaaaack.
-
-1999-03-10 Benjamin Kosnik <bkoz@rhino.cygnus.com>
-
- * bits/ios_base.h: Correct comments. Add ios_base::init()
- functionality. Format, tweak, expunge, clean, bathe, and hang to dry.
- * src/misc-inst.cc: Add instantiations here.
- * src/ios.cc: Clean.
- * bits/std_iostream.h: Add wrappers, global ios_base::Init object.
- * src/stdstreams.cc: Delete this file, as now unnecessary.
- * bits/fstream.tcc: Add missing initialization bits for ctor.
- * src/Makefile.am (libstdc___la_SOURCES): Delete here as well.
- * src/Makefile.in (libstdc___la_OBJECTS): And here.
-
- * bits/streambuf.tcc: Tweak.
- * bits/sstream.tcc: Here too.
-
- * bits/fstream.tcc: And change definition as well.
- * bits/std_fstream.h: Change ctor.
- * src/basic_file.cc (sys_open): Add call that opens a specific fileno.
- * bits/basic_file.h: Add declarations.
-
- * testsuite/27/27hello.cc: New file.
-
- * bits/std_ostream.h: Move flush() inline.
- * bits/ostream.tcc: From here.
-
- * bits/char_traits.h: Add include of fpos.h for streamoff/streampos.
- * bits/std_ios.h: Change include libio to only when necessary.
- * bits/fpos.h: Like here.
- * ios_base.h: And here.
-
- * bits/locfacets.h: Change _Iostate to _Ios_Iostate.
- * bits/locfacets.tcc: Same.
- * bits/std_locale.h: Include std_ios.h not std_iosfwd.h.
- * bits/std_iosfwd.h: Move _Ios_Iostate to ios_base.h
-
-1999-03-09 Benjamin Kosnik <bkoz@rhino.cygnus.com>
-
- * bits/basic_ios.h: Change _M_ctype to _M_fctype.
-
- * bits/std_streambuf.h: Clean, tweak.
- * bits/std_fstream.h: Same.
- * bits/std_sstream.h: Same.
- * bits/streambuf.tcc: Move most member functions out-of-line.
- * bits/fstream.tcc: Same.
- * bits/streambuf.tcc: Same.
-
- * bits/basic_file.h(filepos_cur): Set correctly.
- (filepos_beg): Same.
- (seekpos): Change to __c_streampos.
- * src/basic_file.cc (std): Change to __c_streampos.
-
- * testsuite/27/27filebuf.cc: Round one is finished.
- * testsuite/27/27filebuf-2.tst: New file, final output should match.
- * testsuite/27/27filebuf-3.tst: Same.
-
-1999-03-08 Benjamin Kosnik <bkoz@rhino.cygnus.com>
-
- * bits/basic_file.h: Fix typo, add comments about what to expect
- from the various member functions in __basic_file.
-
- * bits/std_fstream.h: Re-do sync/underflow to work
- together. Change from sys_read to xsgetn and from sys_write to
- xsputn. As it should have been from the beginning. . .
-
-1999-03-06 Benjamin Kosnik <bkoz@haight.constant.com>
-
- * bits/c++config.h (__GLIBCPP__): Add versioning macro.
-
- * bits/basic_file.h(file_beg): New function.
- (file_cur): Ditto.
-
- * testsuite/27/27filebuf.cc: Test in, out, in | out.
- * bits/std_fstream.h: More _M_mode refinements.
- (synch): Add bits for out mode only.
- * bits/std_streambuf.h(xsputn): Correct for filebufs.
- * bits/std_sstream.h: Ditto.
-
-1999-03-03 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_fstream.h: Fix _M_mode AND with ios_base::openmode.
- * testsuite/27/27filebuf.cc: Modify.
- * bits/c++config.h: Fix.
-
-1999-03-02 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * bits/c++config.h: New macro, _G_RESOLVE_LIB_DEFECTS, used to put
- code in place that diverges from the final standard, but has been
- brought up on the library mailing list.
-
- * bits/std_fstream.h(underflow): Position all three internal
- buffer pointers at the same initial position. Re-implement with
- basic_filebuf abstraction.
- (overflow): Ditto.
- (seekoff): Ditto.
- (seekpos): Ditto.
- * bits/std_sstream.h: Move _M_mode down into base class
- basic_streambuf.
- * bits/sstream.tcc: Ditto.
- * bits/std_streambuf.h: Ditto.
-
- * testsuite/27/27filebuf.cc: Tweak.
-
-1999-02-27 Benjamin Kosnik <bkoz@slap-happy.cygnus.com>
-
- * bits/std_sstream.h: Ditto.
- * bits/std_fstream.h: Fix blip.
-
-1999-02-26 Benjamin Kosnik <bkoz@happy.cygnus.com>
-
- * C++STYLE: Add cases.
- * bits/std_fstream.h: Format.
- * bits/std_streambuf.h: Ditto.
- * bits/std_sstream.h: Ditto.
-
- * src/basic_file.cc(sys_seek): Fix stack delirium, by keeping
- return type for _IO_file_seek and __basic_file::seek the same size.
- * bits/basic_file.h: Ditto.
-
-1999-02-26 Benjamin Kosnik <bkoz@happy.cygnus.com>
-
- * bits/fstream.tcc: Add include guards.
- * src/misc-inst.cc: Add instantiations for shared libes.
- * src/locale-inst.cc: Add instantiaions for use_facet.
- * bits/loccore.h: Remove specialization foward decls for
- use_facet<ctype>: perhaps add the whole lot of them later on.
- * bits/std_fstream.h: Fix.
- * bits/locfacets.h: Ditto.
- * src/stdstreams.cc: Disable wide streams for now.
-
- * src/Makefile.am (CXXFLAGS): Change up.
- * src/Makefile.in (CXXFLAGS): Ditto.
-
-1999-02-25 Benjamin Kosnik <bkoz@happy.cygnus.com>
-
- * src/basic_file.cc: Change to ios_base::seekdir from int.
- * bits/basic_file.h: Ditto.
- * bits/locfacets.h : Fix blip with new guard macros.
-
-1999-02-25 Benjamin Kosnik <bkoz@cygnus.com>
-
- * stl/bits/stl_config.h (__STL_USE_STD_ALLOCATORS): Minor tweaking.
- * bits/c++config.h: Clean. Remove _G_NO_STREAMBUF_ITERATORS and
- _G_USE_NAMESPACE.
- * amm1/locale: Remove unused defines.
- * generic/locale: Ditto.
- * src/ios.cc: Ditto.
- * src/locale.cc: Ditto.
- * src/locale-inst.cc: Ditto.
- * src/localename.cc: Ditto.
- * src/stdstreams.cc: And here.
-
- * bits/c++config.h (_G_USE_WCHAR_T): Fix.
- * bits/loccore.h: Simplify, clean, add wchar_t guards.
- * bits/loccore.tcc: Ditto.
- * bits/locfacets.h: Ditto.
- * src/locale-inst.cc: Ditto.
- * bits/locfacets.tcc: Add do_put long long here.
-
-1999-02-24 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_streambuf.h: Add cached ctype facet, _M_ctype.
- * bits/basic_ios.h: Clean. Replace _M_strbuf with
- _M_streambuf. Use cached _M_cvt in basic_streambuf.
- * bits/std_istream.h: Replace _M_strbuf with _M_streambuf.
- * bits/std_fstream.h: Tweak.
-
- * bits/char_traits.h: Remove fpos definitions from here. . .
- * bits/fpos.h: New file, put them here. Eventually, this may allow
- the severing of char_traits and fpos dependencies.
- * src/Makefile.in: Add fpos.h.
- * src/Makefile.am: Ditto.
- * bits/std_string.h: Add fpos.h include here.
- * bits/std_ios.h: And here.
-
- * bits/std_streambuf.h: Change _M_init to _M_initialized.
- * bits/ios_base.h: Remove cstdio include.
- * bits/std_ios.h: ... Place here.
-
-1999-02-23 Benjamin Kosnik <bkoz@loony.cygnus.com>
-
- * src/Makefile.in (CXXFLAGS): Re-add -fvtable-thunks.
- * src/Makefile.am (CXXFLAGS): Re-add -fvtable-thunks.
-
- * bits/basic_file.h: Comment, adjust arguments.
- * src/basic_file.cc: Ditto.
-
- * bits/std_fstream.h(seekoff): Error is of fpos type, not integral
- type: check and convert accordingly. Re-interpet "resultant stream
- position" to indicate external byte sequence location, not internal
- buffer info.
-
-1999-02-22 Benjamin Kosnik <bkoz@loony.cygnus.com>
-
- * mkcshadow: And change copyright here.
- * src/Makefile.am (CXXFLAGS): Add -g -O2. Add new header
- dependencies for stl_pthread_alloc.h, pthread_allocimpl.h,
- stl_thread.h, and stl_iterator_base.h.
- * src/Makefile.in (CXXFLAGS): Ditto.
- * stl/backward/pthread_alloc.h: Remove.
-
-1999-02-19 Benjamin Kosnik <bkoz@loony.cygnus.com>
-
- * bits/std_streambuf.h (sungetc): Use standard defs for putback
- position.
- * bits/std_fstream.h (pbackfail): Correct.
- (sungetc): Test.
- (seekoff): Implement.
- (seekpos): Re-do.
- * testsuite/27/27filebuf.cc: Add test cases.
-
-1999-02-18 Benjamin Kosnik <bkoz@loony.cygnus.com>
-
- * bits/std_fstream.h: Go with basic_file's interfaces for dealing
- with the external buffers, and stop mucking around with setting
- and re-setting the external buf's pointers. Aka, clarity and
- simplicity rule the day.
- * src/locale.cc: Use memcpy in codecvt::do_in and codecvt::do_out.
- Remove partial result and support code.
-
-1999-02-18 Ulrich Drepper <drepper@cygnus.com>
-
- * configure.in: Add hypot, hypotf, atan2f, expf, and copysignf to
- list of function which have to be replaced.
- Remove expf from list of functions to test for.
- Define USE_LONG_DOUBLE in case the libm has partial support for long
- doubles.
- * Makefile.in: Regenerated.
- * config.h.in: Likewise.
- * configure: Likewise.
- * libio/Makefile.am (LIBIO_SRCS): Add missing backslash.
- * libio/Makefile.in: Regenerated.
- * src/Makefile.in: Regenerated.
- * string/Makefile.in: Regenerated.
- * math/Makefile.am (EXTRA_DIST): Add hypot.c, hypotf.c, hypotl.c,
- atan2f.c, expf.c, and $(EXTRA_yes).
- (EXTRA_yes): Add signbitl.c mycabsl.c.
- (libmath_la_LIBADD): Add $(EXTRA_$(USE_LONG_DOUBLE)).
- (libmath_la_SOURCES): remove long double versions.
- * math/Makefile.in: Regnerated.
- * math/atan2f.c: New file.
- * math/copysignf.c: New file.
- * math/expf.c: New file.
- * math/hypot.c: New file.
- * math/hypotf.c: New file.
- * math/hypotl.c: New file.
- * math/cargf.c: Use correct function and macro names.
- * math/ccos.c: Likewise.
- * math/ccosh.c: Likewise.
- * math/ccoshf.c: Likewise.
- * math/ccoshl.c: Likewise.
- * math/cexp.c: Likewise.
- * math/cexpf.c: Likewise.
- * math/cexpl.c: Likewise.
- * math/clog.c: Likewise.
- * math/clog10.c: Likewise.
- * math/clog10f.c: Likewise.
- * math/clog10l.c: Likewise.
- * math/clogf.c: Likewise.
- * math/clogl.c: Likewise.
- * math/copysignf.c: Likewise.
- * math/csin.c: Likewise.
- * math/csinf.c: Likewise.
- * math/csinh.c: Likewise.
- * math/csinhf.c: Likewise.
- * math/csinhl.c: Likewise.
- * math/csinl.c: Likewise.
- * math/csqrt.c: Likewise.
- * math/csqrtf.c: Likewise.
- * math/csqrtl.c: Likewise.
- * math/ctan.c: Likewise.
- * math/ctanf.c: Likewise.
- * math/ctanh.c: Likewise.
- * math/ctanhf.c: Likewise.
- * math/ctanhl.c: Likewise.
- * math/ctanl.c: Likewise.
-
-1999-02-17 Benjamin Kosnik <bkoz@cygnus.com>
-
- * testsuite/27/27filebuf.cc: Add cases.
- * testsuite/27/27filebuf-1.txt: Remove inadvertent garbage.
- * bits/std_streambuf.h: Simplify, always have one return statement.
- * bits/std_fstream.h: Tweak comments in underflow.
-
-1999-02-17 Ulrich Drepper <drepper@cygnus.com>
-
- * ltmain.sh: Update from libtool 1.2d and fix Solaris problems.
- * ltconfig: Likewise.
-
-1999-02-16 Christophe Pierret <cpierret@businessobjects.com>
-
- * src/locale.cc: Fix assert.
-
-1999-02-16 Benjamin Kosnik <bkoz@cygnus.com>
-
- FIXME: Still need some kind of solution for undefined math symbols.
- * src/Makefile.in (locale-inst.lo): Compile with
- -fimplicit-templates to fix Solaris link problem.
- * src/Makefile.am: Ditto.
- * libio/Makefile.in: Add stdfiles.c so that _IO_list_all is defined.
- * libio/Makefile.am: Ditto.
- * src/locale.cc: Provide some kind of def for _S_tolower.
- * bits/locfacets.h: Fix declarations of ctype<wchar_t> to
- match ctype<char> for _S_tolower, _S_toupper, _S_table.
-
-1999-02-10 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/loccore.tcc: Move member-template ctor inline...
- * bits/loccore.h: ...here.
- * src/locale-inst.cc: Add instantiation here.
-
- * testsuite/27/27stringstream.cc: Tweak.
-
- * bits/ostream.tcc: Include sbuf_iter.h.
-
- * bits/ostream.tcc: Convert *this to ostreambuf_iterator before
- passing to num_put, as num_put's first argument is an interator,
- not basic_ostream.
-
- * testsuite/make_check_libfree++: New file, runs through the
- existing test files in the testsuite directory and makes sure
- they link.
-
-1999-02-10 Brendan Kehoe <brendan@cygnus.com>
-
- * testsuite/21/21compare.cc: Fix typo.
- * src/locale.cc (ctype<wchar_t>::_S_{toupper,tolower,table}):
- Don't try to provide non-linux versions, since it's impossible to
- initialize their const references with the integer 0, no matter
- how we try to cast it.
-
-1999-02-10 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_locale.h: Move std_vector.h dependency.
- * bits/std_ios.h: ...from here.
- * bits/std_string.h: ...and here.
- * src/locale.cc: ..to here.
- * bits/loccore.h: Ditto, add vector forward declaration,
- make locale::_Impl data members pointers not containers.
- * bits/loccore.tcc: Move out-of-line for now.
- * bits/locfacets.h: Move vector dependency from here...
- * bits/locfacets.tcc: ...to here.
- * src/localename.cc: ..and here.
- * src/locale-inst.cc: Add include of locfacets.tcc here.
-
- * stl/bits/stl_string_fwd.h: Make __get_c_string non-static.
- * bits/basic_string.h: Can't use sizeof on an incomplete type.
- * bits/string.tcc: Tweak.
- * src/string.cc: And add __get_c_string def here.
-
- * bits/std_fstream.h: Yeah, comment the fill_n idea out as impractical.
-
- * src/stlinst.cc: Add include of stl_config.h.
-
-1999-02-09 Benjamin Kosnik <bkoz@cygnus.com>
-
- * stl/bits/std_bitset.h: Update to SGI STL 3.12.
- * stl/bits/stl_config.h: Tweak, update.
- * stl/bits/std_stdexcept.h: Ditto, change stl_exception to
- std_exception.
- * stl/bits/std_memory.h: Reconstructed auto_ptr, Ditto.
- * stl/bits/std_functional.h: Ditto.
-
- * stl/bits/stl_string.h: New file, SGI's string
- implementation. For reference only, corresponding to string in
- 3.12 source.
- * stl/bits/stl_char_traits.h: As above.
-
- * stl/bits/pthread_allocimpl.h: New file corresponding to
- pthread_alloc.
- * stl/bits/stl_pthread_alloc.h: New file corresponding to
- pthread_alloc.h
- * stl/bits/stl_threads.h: New file.
-
- Note that SGI STL 3.12's file iterator.h is not used.
- * stl/bits/std_iterator.h: Ditto.
- * stl/bits/stl_iterator.h: Drop in replace.
- * stl/bits/stl_iterator_base.h: New file, drop in replace.
-
- * stl/bits/stl_queue.h, stl_rope.h, stl_set.h, stl_stack.h,
- stl_string_fwd.h, stl_tempbuf.h, stl_tree.h, stl_vector.h,
- stl_pair.h, stl_multimap.h, stl_multiset.h, stl_list.h,
- stl_hashtable.h, stl_hash_set.h, stl_hash_map.h, stl_function.h,
- stl_deque.h, stl_alloc.h, stl_algo.h, stl_algobase.h, ropeimpl.h:
- Drop-in replace (ie, stop changing __SGI_STL_* to _CPP_BITS_* for
- preprocessor guards, but fixup include paths and names according
- to new directory layout).
-
-1999-02-05 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_fstream.h: Remove _M_open data member.
- * bits/fstream.tcc: Ditto.
-
- * src/locale.cc: Tweak.
-
- * bits/std_sstream.h: Simplify.
-
- * bits/std_streambuf.h: Simplify.
- (sputc): Use correct definition of "write area."
-
- * bits/std_fstream.h: Fix uflow.
- * src/basic_file.cc: Tweak.
- * testsuite/27/27filebuf.cc: Add tests.
- * testsuite/27/27filebuf-3.txt: Rename to *-2.txt.
-
-1999-02-02 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
-
- * bits/ios_base.h: Make protected.
-
-1999-02-01 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
-
- * bits/ios_base.h: Changes in the class ios_base:
- Rename _M_exceptions member to _M_exceptions_data.
- Make the member functions rdstate(), clear(), exceptions()
- and exceptions(iostate) protected and add the "_M_" prefix.
- * src/ios.cc: Ditto.
- * bits/basic_ios.h: Adapt the changes from ios_base.
-
-1999-01-29 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_fstream.h: Remove _M_flags, _M_equilibrate as unnecessary.
- * bits/fstream.tcc: Ditto.
-
- * bits/std_fstream.h (underflow): Resize deallocates memory and
- resets pointers in the internal cache according to new _M_buf. . dooh!
- * src/locale.cc: Mas changes with codecvt::do_in, do_out.
-
-1999-01-29 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
-
- * stl/bits/std_memory.h: Modify auto_ptr::reset to reflect the
- standard.
-
-1999-01-28 Benjamin Kosnik <bkoz@cygnus.com>
-
- * src/locale.cc (codecvt::do_in): Finer-grained tuning to take
- into account partial returns.
- (codecvt::do_out): Likewise.
-
- * bits/char_traits.h: Change streamsize to be a signed type, as
- required by 27.4.1 Types p 2. (Changing to _IO_ssize_t.)
- * bits/std_streambuf.h: Make
- in_avail() and showmanyc() have streamsize as return types, so
- that showmanyc()'s return of eof won't underflow in_avail's return
- value and give a bogus result.
- * src/misc-inst.cc: And more changes. . .
-
- * bits/std_streambuf.h (basic_streambuf): Add _M_buf_unified to keep
- track of joint in/out pointers into the internal buffer.
- (sbumpc): Add check for _M_buf_unified.
- (sputbackc): Ditto.
- (sungetc): Ditto.
-
- * testsuite/27/27filebuf.cc: Add cases.
- * testsuite/27/27stringbuf.cc: Add showmanyc case.
-
- * bits/std_fstream.h (close): Fix logic error.
- (open): Initialize internal pointers based on _M_buf and _M_buf_size.
- (showmanyc): Add underflow component, to match the standard.
-
- * bits/fstream.tcc: Ditto.
-
-1999-01-27 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/basic_file.h: Match vtables w/ _IO_FILE_plus.
- * src/basic_file.cc: Ditto.
- * src/Makefile.in: Add -fvtable-thunks to CXXFLAGS: preferred
- format for dealing with _IO_file in libio.
-
-1999-01-27 Ulrich Drepper <drepper@cygnus.com>
-
- * src/basic_file.cc: Include fcntl.h.
-
-1999-01-27 Benjamin Kosnik <bkoz@cygnus.com>
-
- * libio/Makefile.in: Add fileops.lo, genops.lo to objects to debug
- libio calls.
- * bits/std_streambuf.h: Redefine read posion.
-
- * bits/std_fstream.h: Temporary hack to get vtables working again.
- * bits/basic_file.h: Revert.
- * src/basic_file.cc: Ditto.
- * testsuite/27/27filebuf.cc: Tweak.
-
-1999-01-26 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/basic_file.h: Add showmanyc, underflow. .
- * src/basic_file.cc: Ditto.
-
- * bits/std_fstream.h (showmanyc): Add bits to ping libio to see if more
- chars can be read.
-
- * testsuite/27/27filebuf.cc: Add testcases.
- * src/basic_file.cc: Add O_CREAT to open calls with
- ios_base::trunc as part of the open mode.
-
-1999-01-26 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
-
- * bits/basic_ios.h: fix basic_ios::exceptions(iostate)
-
-1999-01-25 Benjamin Kosnik <bkoz@nabi.net>
-
- * src/ios.cc (clear): Correct typo.
- * bits/ios_base.h: Tweak spacing.
-
-1999-01-25 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
-
- * bits/basic_ios.h: fix basic_ios::fail()
-
-1999-01-25 Benjamin Kosnik <bkoz@loony.cygnus.com>
-
- * bits/basic_file.h: Include libioP.h from libio instead of here.
- * bits/iolibio.h: Remove.
- * bits/libio.h: Remove.
-
-1999-01-22 Benjamin Kosnik <bkoz@lunatic.cygnus.com>
-
- * bits/std_fstream.h: Tweak cvt-> in call for newer egcs compilers.
-
-1999-01-22 Ulrich Drepper <drepper@cygnus.com>
-
- * Makefile.am (SUBDIRS): Add libio.
- * configure.in: Add rule to test for glibc2.
-
- * src/Makefile.am (INCLUDES): Add -I to libio subdir.
- (libstdc___la_LIBADD): Add libio.la.
-
-1999-01-21 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/basic_file.h: Make new abstraction for underlying C library
- FILE, named __basic_file.
- * src/basic_file.cc: New file.
- * bits/os_raw.h: Delete.
- * src/os_raw.cc: Delete.
- * src/Makefile.in: Tweak.
- * src/Makefile.am: Tweak.
- * bits/iolibio.h: Add this here, for the time being.
- * bits/libioP.h: Ditto.
-
- * bits/ios_base.h: Delete unused defines.
- * src/locale.cc (codecvt<char, char, mbstate_t>::do_in): Use
- strcpy to copy between the two buffers.
-
- * testsuite/27/27stringbuf.cc: Change license, fix in_avail tests.
- * testsuite/27/27filebuf.cc: New file.
- * testsuite/27/27filebuf-1.txt: Data file for above test.
- * testsuite/27/27filebuf-2.txt: Ditto.
-
- * bits/std_streambuf.h (uflow): Re-implement default.
- * bits/std_fstream.h: Set _M_buf_size based on cstdio's BUFSIZ.
- Re-implement virtual functions.
- * bits/fstream.tcc: Delete unused mf's.
-
-1998-12-31 Benjamin Kosnik <bkoz@lunatic.cygnus.com>
-
- * bits/fstream.tcc: Add fstream ctor for cin/cout/etc.
- * bits/std_fstream.h: Ditto.
- * src/stdstreams.cc: Ditto.
-
- * math/cpowl.c: Fix header typo with last change.
-
-1998-12-31 Benjamin Kosnik <bkoz@loony.cygnus.com>
-
- * COPYING: New file (GPL v 2).
- * LICENSE.STD: Remove.
- * ./*: Change license.
-
-1998-12-30 Benjamin Kosnik <bkoz@haight.constant.com>
-
- * bits/std_streambuf.h (std): Remove static on _M_init.
- * bits/streambuf.tcc (std): Ditto.
-
- * bits/std_fstream.h: Add changes as discussed with Nathan, including
- state_type and codecvt_type members, the allocation of an internal
- buffer, the streamlined codecvt calls, etc.
-
-1998-12-21 Benjamin Kosnik <bkoz@haight.constant.com>
-
- * bits/std_sstream.h: Tweak.
- * bits/fstream.tcc: Remove unused stubs.
- * bits/std_fstream.h: Tweak.
-
-1998-12-17 Benjamin Kosnik <bkoz@tintin.cygnus.com>
-
- * bits/std_streambuf.h: Move _IO_file_flags into basic_filebuf.
- Remove unused _IO_* members, possibly put into filebuf, which may
- need them.
- * bits/std_fstream.h: Add _M_flag.
- * bits/sbuf_iter.h: Tweak.
-
- * bits/std_cstdio.h: Add SEEK_SET, SEEK_END, SEEK_CUR.
- * bits/ios_base.h: Use.
-
- * src/stdstreams.cc: Modify to reflect standard ctors for
- filebuf.
- * src/misc-inst.cc: Ditto.
-
- * bits/os_raw.h: Wrap in std namespace. Model parameters on
- underlying C library calls instead of the underlying unix
- filesystem.
- * src/os_raw.cc (_S_os_open): Use fopen, and compute a mode
- string as per p.659.
- (_S_os_close): Model on fopen.
- (_S_os_read): Model on fread.
- (_S_os_write): Model on fwrite.
- (_S_os_seek): Model on fseek.
-
- * bits/ios_base.h: Tweak.
- * bits/std_iosfwd.h: Wrap libio.h include with extern "C".
- * bits/std_sstream.h: Tweak.
- * bits/sstream.tcc: Remove old, uncalled code.
- * bits/std_fstream.h: Major reconstruction.
- * bits/fstream.tcc: Disable for the time being.
-
-1998-12-11 Benjamin Kosnik <bkoz@haight.constant.com>
-
- * bits/basic_string.h: Fix insert method.
- * stl/bits/stl_iterator.h: Remove previous hack.
- * bits/std_streambuf.h (sbumpc): Correct increment/return oddness.
- * bits/std_sstream.h: Fix more regressions.
- * testsuite/27/27stringbuf.C: Add (almost) complete tests.
-
-1998-12-09 Benjamin Kosnik <bkoz@loony.cygnus.com>
-
- * bits/basic_string.h: Tweak.
-
- * stl/bits/stl_iterator.h: Specialize iterator_traits for int so
- that string::append can be instantiated. HACK--checkin
- basic_string::iterator class.
-
-1998-12-07 Benjamin Kosnik <bkoz@haight.constant.com>
-
- * bits/std_sstream.h: Tweak.
- * bits/sstream.tcc: Tweak ctors.
-
- FIXME invalid friend defs. . WHERE ARE THEY??
-
- * bits/sbuf_iter.h (istreambuf_iterator::equal): Change to new
- names for basic_streambuf data members.
-
- * bits/std_streambuf.h: Add getloc() initialization bits.
- basic_streambuf(): Initialize with global locale data.
- imbue(): Set _M_init.
-
- * bits/std_streambuf.h(seekoff, seekpos): Complete with invalid
- stream pos == pos_type(off_type(-1)).
- in_avail(): Complete default implementation.
- snextc, sbumpc, sputbackc, sungetc, sputc, setg, xsputn,
- underflow, uflow, xsgetn, showmany, sync: Ditto.
-
- * bits/std_streambuf.h: _M_snextc_helper(): Remove.
-
- * bits/streambuf.tcc (sputbackc): Temporarily remove, need to
- re-populate with in-line member functions that are too big. Add
- initialization for _M_init.
-
-1998-12-03 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/sstream.tcc: Convert _Allocator to _Alloc. Add typedefs
- for basic_string and basic_streambuf. Scope _IO_buf_* pointers to
- streambuf_type.
-
- * src/stdstreams.cc (std): Disable wchar_t instantiations.
-
- * bits/c++config.h (_G_DEPRICATED): Add.
- (_G_USE_WCHAR_T): Add.
- * bits/std_streambuf.h: Radical reconstruction of basic_streambuf.
- Take out _Streambuf_base. Put _IO_FILE data member in basic_filebuf.
- * bits/streambuf.tcc (sputbackc): Remove ctor anti-def, Tweak.
- * bits/std_fstream.h: Add comment for implementation.
- * src/streambuf.cc: Remove.
- * src/Makefile.in: Remove streambuf.lo.
- * src/misc-inst.cc: Tweak.
-
-1998-12-02 Benjamin Kosnik <bkoz@cygnus.com>
-
- * bits/std_sstream.h: Add const_cast to rdbuf returns.
- * testsuite/27stringstream.C: Modify.
-
-1998-11-25 Benjamin Kosnik <bkoz@haight.constant.com>
-
- * src/Makefile.in (libstdc___la_OBJECTS): Add streambuf.lo.
- (libstdc___la_SOURCES): Ditto.
-
- * bits/streambuf.tcc: Tweak.
-
- * src/streambuf.cc: New file, add out-of-line definitions for
- _Streambuf_base.
-
- * src/misc-inst.cc: Remove _Streambuf_base instantiations.
- Comment out wchar_t versions of the buffer instantiations, for now.
-
- * bits/std_streambuf.h: Wrap libio.h include with extern "C".
- Remove template wrapper around _Streambuf_base.
- Move IO_* data members into _Streambuf_base.
- Move _Streambuf_base members into streambuf.tcc.
-
- * bits/c++config.h (_G_USE_LIBIO): Enable.
-
-1998-11-02 Nathan Myers <ncm@cantrip.org>
-
- * CHECKLIST: downgrade iterator implementations
- * DESIGN: fill out notes about unimplemented features
-
-1998-10-31 Nathan Myers <ncm@cantrip.org>
-
- * CHECKLIST: itemized list of all interfaces, and status of each.
-
-1998-10-30 Nathan Myers <ncm@cantrip.org>
-
- * RELEASE-NOTES: add notes about optional includes, linking, running
- * src/Makefile.am: handle header installs properly
- * src/Makefile.in: regenerate from new src/Makefile.am
-
-1998-10-30 Benjamin Kosnik <bkoz@loony.cygnus.com>
-
- * bits/basic_string.h: Revert npos pending ciso646.
- * src/Makefile.am: Revert CXX flags for now.
- * src/Makefile.in: Ditto.
-
-1998-10-30 Brendan Kehoe <brendan@cygnus.com>
-
- * bits/std_sstream.h: Re-order ctors to put base before member
- inits.
-
-1998-10-30 Ryszard Kabatek <kabatek@chemie.uni-halle.de>
-
- * stl/bits/std_memory.h: Fix typo.
-
-1998-10-30 Nathan Myers <ncm@cantrip.org>
-
- * src/string[A-Z]+.cc: change back to include "string.cc".
- * src/Makefile.am: revert filename changes. We need a different
- way to keep filenames in std/ from confusing Make.
- * bits/basic_string.h: define _S_max_size right, return it from
- string::max_size(); churn definition of npos again.
- * bits/string.tcc: fix _S_frob_size to avoid uint overflow.
- * bits/ios.cc: remove #ifdef on ios_base locale member initialization
- * BUGS: clear cruft.
- * C++STYLE: Touchup for release.
- * CHECKLIST: Touchup for release.
- * DESIGN: New file.
- * LICENSE.STD: Add requirement to retain copyrights and to provide
- the license with any copies.
- * README: Update for release.
- * TODO: Minor touchup for release.
- * RELEASE-NOTES: prepare for release
-
-1998-10-29 Ulrich Drepper <drepper@cygnus.com>
-
- * src/string[A-Z]+.cc: Include stdstring.cc, not string.cc.
-
- * src/Makefile.am (CXXFLAGS): Define _GNU_SOURCE.
-
- * src/Makefile.am (CXXLINK): New variable. Make sure we don't use
- CXX to generate the shared object.
-
- * src/Makefile.am (headers): Remove duplicated char_traits.h.
-
-1998-10-29 Brendan Kehoe <brendan@cygnus.com>
-
- * bits/basic_string.h (basic_string<>::max_size): Subtract 1, not
- 2, from npos, solving infinite loop problems.
-
-1998-10-29 18:41 Ulrich Drepper <drepper@cygnus.com>
-
- * src/Makefile.am: Add rules to install headers.
-
-1998-10-29 Nathan Myers <ncm@cantrip.org>
-
- * bits/std_ostream.h: Remove #ifdef on operator<< for long double
- * bits/ostream.tcc: Remove #ifdef on operator<< for long double
- * shadow/libio.h:
- * shadow/unistd.h:
- * shadow/bits/wrap_libio.h:
- * shadow/bits/wrap_unistd.h: New files.
-
-1998-10-29 Brendan Kehoe <brendan@cygnus.com>
-
- * bits/ostream.tcc (operator<<): Wrap with #ifdef
- _G_HAVE_LONG_DOUBLE_IO, to match bits/std_ostream.h.
-
-1998-10-29 Ulrich Drepper <drepper@cygnus.com>
-
- * src/Makefile.am: Add temporarily rules to make sure misc-inst.cc
- is not compiled with -fno-implicit-templates in effect.
-
- * src/Makefile.am (EXTRA_SOURCES): Add string.cc and wstring.cc here.
- (libstdc___la_SOURCES): Add all the string*.cc and wstring*.cc files.
- * src/stringADDCS.cc: Wrapper around string.cc to define individual
- function.
- * src/stringADDPS.cc: Likewise.
- * src/stringADDSC.cc: Likewise.
- * src/stringADDSP.cc: Likewise.
- * src/stringADDSS.cc: Likewise.
- * src/stringBIST.cc: Likewise.
- * src/stringBOST.cc: Likewise.
- * src/stringCHTR.cc: Likewise.
- * src/stringEQPS.cc: Likewise.
- * src/stringEQSP.cc: Likewise.
- * src/stringEQSS.cc: Likewise.
- * src/stringEXTRA.cc: Likewise.
- * src/stringGEPS.cc: Likewise.
- * src/stringGESP.cc: Likewise.
- * src/stringGESS.cc: Likewise.
- * src/stringGETLI.cc: Likewise.
- * src/stringGTPS.cc: Likewise.
- * src/stringGTSP.cc: Likewise.
- * src/stringGTSS.cc: Likewise.
- * src/stringINSER.cc: Likewise.
- * src/stringLEPS.cc: Likewise.
- * src/stringLESP.cc: Likewise.
- * src/stringLESS.cc: Likewise.
- * src/stringLTPS.cc: Likewise.
- * src/stringLTSP.cc: Likewise.
- * src/stringLTSS.cc: Likewise.
- * src/stringMAIN.cc: Likewise.
- * src/stringNEPS.cc: Likewise.
- * src/stringNESP.cc: Likewise.
- * src/stringNESS.cc: Likewise.
- * src/stringSCOPY.cc: Likewise.
- * src/wstringADDCS.cc: Wrapper around wstring.cc to define individual
- functions.
- * src/wstringADDPS.cc: Likewise.
- * src/wstringADDSC.cc: Likewise.
- * src/wstringADDSP.cc: Likewise.
- * src/wstringADDSS.cc: Likewise.
- * src/wstringBIST.cc: Likewise.
- * src/wstringBOST.cc: Likewise.
- * src/wstringCHTR.cc: Likewise.
- * src/wstringEQPS.cc: Likewise.
- * src/wstringEQSP.cc: Likewise.
- * src/wstringEQSS.cc: Likewise.
- * src/wstringEXTRA.cc: Likewise.
- * src/wstringGEPS.cc: Likewise.
- * src/wstringGESP.cc: Likewise.
- * src/wstringGESS.cc: Likewise.
- * src/wstringGETLI.cc: Likewise.
- * src/wstringGTPS.cc: Likewise.
- * src/wstringGTSP.cc: Likewise.
- * src/wstringGTSS.cc: Likewise.
- * src/wstringINSER.cc: Likewise.
- * src/wstringLEPS.cc: Likewise.
- * src/wstringLESP.cc: Likewise.
- * src/wstringLESS.cc: Likewise.
- * src/wstringLTPS.cc: Likewise.
- * src/wstringLTSP.cc: Likewise.
- * src/wstringLTSS.cc: Likewise.
- * src/wstringMAIN.cc: Likewise.
- * src/wstringNEPS.cc: Likewise.
- * src/wstringNESP.cc: Likewise.
- * src/wstringNESS.cc: Likewise.
- * src/wstringSCOPY.cc: Likewise.
- * src/string.cc: Remove now unneeded #defines now.
-
-1998-10-29 Nathan Myers <ncm@cantrip.org>
-
- * bits/locfacets.tcc: Define num_put::put(... const void*), improve
- integer formatting.
- * bits/ostream.tcc: Delete cruft, rewrite various op<< as members,
- add definitions for double, long double, const void*.
- * bits/std_ostream.h: Move op<<'s back into class ostream,
- define some in-line.
- * bits/string.tcc: fix unnecessary-copying bug in op[], typos in
- string construction from input iterators that Brendan reported.
-
-
-1998-10-28 Brendan Kehoe <brendan@cygnus.com>
-
- * stl/bits/stl_pair.h (op!=, op>, p<=, op>=): Add missing definitions.
-
- * bits/valarray_meta.h (class _Constant): Move declaration to the
- top, so the rest of the file can grok it.
- (_ApplyBinaryFunction::operator[]): Add missing parenthesis.
-
- * bits/std_sstream.h (basic_ostringstream::str): Fix typo of extra
- semicolon.
- (basic_stringstream::str, both instances): Likewise.
-
-1998-10-28 Nathan Myers <ncm@cantrip.org>
-
- * bits/locfacets.h: fix num_put<>::falsename()
- * bits/locfacets.tcc: fix _Format_cache<>::_M_populate bool name init
- * testsuite/27/27octfmt.C, testsuite/27/27octfmt.C: new tests
- * bits/locfacets.tcc: touch up _S_group_digits.
- * src/misc-inst.cc: adjust _S_group_digits insts to match.
-
-1998-10-27 Nathan Myers <ncm@cantrip.org>
-
- * stl/bits/stl_config.h: Turn off long long support, for now.
- * src/locale-inst.cc: Instantiate num_put<> only for
- ostreambuf_iterator, num_get only for istreambuf_iterator.
- * src/misc-inst.cc: Delete duplicate locale-related instantiations,
- add lots of new instantiations for num_put support function templates;
- remove junk about __match_parallel for ostreambuf_iterator.
-
-1998-10-27 Nathan Myers <ncm@cantrip.org>
-
- * bits/locfacets.tcc: Make num_put's digit grouping work.
- * bits/string.tcc: More uglification.
- * src/ios.cc: initialize format cache right
-
-1998-10-26 Nathan Myers <ncm@cantrip.org>
-
- * bits/basic_string.h: Uglify more names.
- * bits/fstream.tcc: Rewrite some filebut output handling.
- * bits/ios_base.h: Cosmetic.
- * bits/locfacets.h: Changes to _Format_cache for support of num_put.
- Also, specialize its default ctor for optimal default case.
- #ifdef out "long long" prototypes for now.
- * bits/locfacets.tcc: Do complete, optimized num_put<>::do_put
- implementation for integer types. (Still needs optimized
- std::copy() applied to ostreambuf_iterator to be optimal.)
- * bits/ostream.tcc: Write operator<< for long, bool types.
- Make other operators<< non-members, per spec. (Many still
- not implemented.) Identify those that fail to create a sentry.
- * bits/sbuf_iter: Cosmetic.
- * bits/std_fstream.h: Add some filebuf members.
- * bits/std_locale.h: Include <limits> for use in bits/locfacets.h
- * bits/std_ostream.h: Make member operators<< global, per spec.
- (Should do the same in std_istream.h.)
- * bits/std_string.h: Include <limits> for use in bits/locfacets.h
- * bits/string.tcc: Uglify names
- * shadow/bits/std_cstdlib.h: Optimize std::div and std::ldiv.
- * src/ios.cc: Specialize _Format_cache<> for char and wchar_t,
- for optimal default behavior.
-
-1998-10-26 Benjamin Kosnik <bkoz@loony.cygnus.com>
-
- * src/Makefile.in (libstdc___la_SOURCES): Add misc-inst.cc again.
-
-1998-10-21 Nathan Myers <ncm@cantrip.org>
-
- * src/locale.cc: make ctype operations actually work for glibc
- * CHECKLIST: add a comprehensive (i.e. huge) implementation
- checklist of stdlib facilities. Not filled in yet.
-
-1998-10-20 Nathan Myers <ncm@cantrip.org>
-
- * bits/string.tcc: fix patching NULs on string ends.
-
-1998-10-19 Nathan Myers <ncm@cantrip.org>
-
- * bits/std_iosfwd.h: eliminate "basic_" prefix on streambuf
- iterator forward declarations
- * bits/sbuf_iter.h: eliminate default template argument definitions
- on streambuf iterators (rely on <iosfwd> decls).
- * TODO: add note about lazy facet construction
- * bits/basic_ios.h: hit operator void* again. This should be the
- last time we need to touch it.
- * bits/basic_ios.h: copyfmt now returns *this.
- * bits/basic_string.h: fix npos again. npos cannot be defined as zero.
- * bits/basic_string.h: put back overloaded constructors; adjust
- behavior for default allocator on copy constructor.
- * bits/char_traits.h: make not_eof return correct type.
- * bits/loccore.h: remove call to bits/std_stdexcept.h; subincludes
- cannot be in non-standard headers or we get include loops (bad)
- * bits/loccore.h: delete ifdef'd out workarounds for old compiler bugs.
- * bits/loccore.h: add apparatus to support lazy construction of
- facets.
- * bits/locfacets.tcc: Uglify names in __match_parallel decl.
- * bits/std_ios.h: add include of <typeinfo> to get bad_cast for
- locale use_facet<> failure.
- * bits/std_locale.h: same.
- * bits/std_string.h: same.
- * bits/std_stdexcept.h: change exception member __msg from a
- reference to a regular object.
- * bits/string.tcc: add pasting a NUL on the end of strings after
- each operation. We had already left room for it, but previously
- plugged it only on a call to c_str(), but the WG changed the
- requirement when I wasn't looking. (Can't leave them alone for
- a second without they break something else.)
- * bits/valarray_meta.h: add Gaby's changes from 981018.
- * src/locale.cc: add new type _Bad_use_facet to be thrown on
- failure of use_facet<>().
- * src/stdexcept.cc: remove pragma, remove bkoz's #if 0,
- comment out leftover member definitions
-
-1998-10-16 Ulrich Drepper <drepper@cygnus.com>
-
- * string/Makefile.am: Revert last change.
- * math/Makefile.am: Likewise.
-
-1998-10-15 Benjamin Kosnik <bkoz@haight.constant.com>
-
- * bits/std_sstream.h: Fix typo.
-
-1998-10-15 Benjamin Kosnik <bkoz@haight.constant.com>
-
- * src/Makefile.am (libstdc___la_SOURCES): Add misc-inst.cc.
-
- * bits/std_sstream.h: Add typedefs, member definitions. Clean.
- * bits/std_stdexcept.h: Remove.
-
-1998-10-15 Benjamin Kosnik <bkoz@haight.constant.com>
-
- * src/misc-inst.cc: Tweak again.
-
- * bits/std_sstream.h: Move out-of-line definitions to sstream.tcc.
- * bits/sstream.tcc: New file.
-
-1998-10-15 Ulrich Drepper <drepper@cygnus.com>
-
- * configure.in: Test for machine/param.h, sys/machine.h and fp.h.
- Don't run AC_C_BIGENDIAN if machine/param.h or sys/machine.h are
- available.
-
- * math/mathconf.h: Include sys/machine.h, machine/param.h and fp.h
- if available.
- (INFINITE_P): Use IS_INF macro if available.
-
-1998-10-15 Ulrich Drepper <drepper@cygnus.com>
-
- * math/Makefile.am (EXTRA_LTLIBRARIES): Renamed from
- noinst_LTLIBRARIES.
- * string/Makefile.am: Likewise.
-
-1998-10-15 Ulrich Drepper <drepper@cygnus.com>
-
- * configure.in (AC_CHECK_FUNCS): Add finite, qfinite, fpclass, and
- qfpclass.
- (AC_CHECK_HEADERS): Add machine/endian.h. If no header specifying
- endianess is available run AC_C_BIGENDIAN.
-
- * math/clog10l.c: Add ugly hack around bug in Irix 6.2 header until
- fixincludes is fixed.
- * math/clogl.c: Likewise.
- * math/csqrtl.c: Likewise.
- * math/mycabsl.c: Likewise.
-
- * math/mathconf.h: Include machine/endian.h if possible. If no
- header describing endianess is available rely on WORDS_BIGENDIAN
- macro.
- (FINITE_P, FINITEF_P, FINITEL_P): Use finite functino if available.
- (INFINITE_P, INFINITEF_P, INFINITEL_P): Use fpclass function if
- available.
-
- * src/complex.cc (polar): Don't use sincos on OSF machines.
-
-1998-10-09 Benjamin Kosnik <bkoz@loony.cygnus.com>
-
- * src/locale-inst.cc: Don't instantiate time_get for
- ostreambuf_iterators as time_get::do_get_weekday and
- time_get::do_get_monthname use __match_parallel, which is illegal
- for ostreambuf_iterators to use, as they don't have operator== or
- operator!=.
- * bits/std_stdexcept.h: Add dtor definitions.
- Use stl/bits/std_stdexcept.h instead of this file?
- * bits/sbuf_iter.h : Tweak.
- * src/misc-inst.cc: Tweak.
-
-1998-10-09 Benjamin Kosnik <bkoz@haight.constant.com>
-
- * bits/std_stdexcept.h: New file.
- * src/stdexcept.cc: Define the following:
- logic_error::what()
- runtime_error::what()
-
- * src/misc-inst.cc: New file.
- * src/Makefile.in (libstdc___la_SOURCES): Add misc-inst.cc.
- (libstdc___la_OBJECTS): Add misc-inst.lo.
-
- * bits/basic_string.h: Disable non-standard ctor declarations.
- * bits/string.tcc: Disable definitions as well.
- * src/string.cc: Disable <ios> dependencies.
- * bits/sbuf_iter.h (std): Add default to template parameter for
- ostreambuf_iterator and istreambuf_iterator.
- * bits/std_iosfwd.h: Change istreambuf_iterator to
- basic_istreambuf_iterator. Likewise for ostreambuf.
- * bits/locfacets.tcc (__match_parallel): Fix typo.
- * src/ios.cc (imbue): Remove the _G_HAVE_LOCALE guards around
- ios_base::imbue.
- * bits/std_streambuf.h: Define _Streambuf_base::getloc().
- * bits/std_istream.h: Define the following:
- get (basic_streambuf<char_type,_Traits>& __sb, char_type __delim)
- get (char_type* __s, streamsize __n, char_type __delim);
- getline (char_type* __s, streamsize __n, char_type __delim)
- * bits/loccore.h : FIXME friend template code for use_facet.
- Add std_stdexcept.h include so that range_error will be defined.
- Add explicit conversion to string for range_error throws. (HACK?)
-
-1998-10-8 Ulrich Drepper <drepepr@cygnus.com>
-
- * configure.in: Check for sincos, sincosf, and sincosl.
- * src/complex.cc (polar): Use sincos if available.
-
- * bits/c++config.h: Fix hack to get LONG_LONG* definitions on Linux.
- * stl/bits/std_limits.h: Include bits/c++config.h. HACK!!!
-
- * math/clog10.c: Fix typo (FP_INIFITE_P -> INFINITE_P).
-
- * math/cpow.c: Use c_log, not clog.
- * math/cpowf.c: Likewise.
- * math/cpowl.c: Likewise.
-
- * math/cexp.c: Remove unused fpclassify calls. Use FINITE_P instead
- of isfinite call.
-
- * math/mathconf.h (FINITE_P, FINITEF_P, FINITEL_P): Define using
- isfinite macro if it is available.
- (INFINITE_P, INFINITEF_P, INFINITEL_P): Define using isinf macro.
-
- * math/ccosf.c: Use appropriate test macros for this type.
- * math/ccoshf.c: Likewise.
- * math/ccoshl.c: Likewise.
- * math/ccosl.c: Likewise.
- * math/cexpf.c: Likewise.
- * math/cexpl.c: Likewise.
- * math/clog10f.c: Likewise.
- * math/clog10l.c: Likewise.
- * math/clogf.c: Likewise.
- * math/clogl.c: Likewise.
- * math/csinf.c: Likewise.
- * math/csinhf.c: Likewise.
- * math/csinhl.c: Likewise.
- * math/csinl.c: Likewise.
- * math/csqrtf.c: Likewise.
- * math/csqrtl.c: Likewise.
- * math/ctanf.c: Likewise.
- * math/ctanhf.c: Likewise.
- * math/ctanhl.c: Likewise.
- * math/ctanl.c: Likewise.
-
-1998-10-06 Benjamin Kosnik <bkoz@bliss.nabi.net>
-
- * bits/basic_ios.h: Fix previous change.
-
-1998-10-06 Benjamin Kosnik <bkoz@bliss.nabi.net>
-
- * bits/basic_ios.h: Add const_cast<basic_ios&>
- (operator void*): As per 5.2.9 p 2, make sure static_cast is
- well-formed.
- * bits/char_traits.h: No _CharT for specialization, change to 0.
- * bits/basic_string.h: As per 9.4.2 p4, initialize with
- constant-initializer.
- * bits/locfacets.tcc: Add template parameter to initialization list.
-
-1998-10-02 Benjamin Kosnik <bkoz@loony.cygnus.com>
-
- * bits/basic_string.h: Should just be <, not <=.
-
-1998-10-01 Benjamin Kosnik <bkoz@bliss.nabi.net>
-
- * bits/string.tcc (compare): Fix for strings that are similar, but
- not the same length.
-
-1998-09-04 Brendan Kehoe <brendan@cygnus.com>
-
- * bits/c++config.h: For __linux__, define _GNU_SOURCE. This is
- required for us to get LONG_LONG_{MIN,MAX} out of gcc's limits.h.
- We can't check for __GLIBC__ here, since this header can be read
- before any system one (that would lead to features.h) being used.
-
- * stl/bits/stl_config.h (__STL_LONG_LONG): Re-enabled
-
- * stl/bits/std_limits.h [__STL_LONG_LONG]: Fix usage to use
- LONG_LONG_MIN, LONG_LONG_MAX, and ULONG_LONG_MAX.
-
- * stl/bits/stl_config.h: Don't do __STL_LONG_LONG, it uses
- LONGLONG_{MIN,MAX} which I can't find the origin of.
-
-1998-09-03 Brendan Kehoe <brendan@cygnus.com>
-
- * stl/bits/stl_iterator.h: Add extern decl of cin for now; where
- should this come from, if not iostream.h?
- (class istream_iterator): Make the new operator!= a friend also.
-
- * stl/bits/stl_config.h: Define __STL_HAS_WCHAR_T,
- __STL_MEMBER_TEMPLATE_CLASSES, and __STL_LONG_LONG. Don't include
- _G_config.h like the egcs one does.
-
-1998-09-01 Brendan Kehoe <brendan@cygnus.com>
-
- * bits/string.tcc: Call `_M_destroy' instead of `destroy'.
-
- * bits/valarray_meta.h: Throughout, rename _Expr typedefs to be
- _Expr1 (or _Expr_def if it's taken), and change definitions.
- Avoids redecl of the template parm.
-
- * bits/string.tcc (basic_string copy ctor): Fix typo in declaration.
- (operator>>): Initialize __ERROR with ios_base::goodbit, not 0.
-
- * bits/std_streambuf.h (_POSIX_SOURCE): Only define if it's not
- already done.
-
- * src/locale-inst.cc: New file, **TOTAL HACK**. There has GOT to
- be a better way to do this.
-
- * src/stlinst.cc: New file.
-
- * BUGS: New file, with various discovered bugs that need to be
- fixed.
-
- * Makefile.in, math/Makefile.in, string/Makefile.in,
- src/Makefile.in: Reran automake.
-
- Workarounds, these may not all be the final fixes:
-
- * bits/basic_ios.h (class basic_ios): Make _M_strbuf be protected,
- not private, for basic_istream::get() in std_istream.h to be able
- to use it.
- (basic_ios::operator void*): Don't use static_cast for the false
- case.
- (basic_ios::copyfmt): Fix `rhs.except' to be `rhs.exceptions ()'.
- This appears to have been in sep94, but didn't get corrected
- afterwards.
-
- * bits/basic_string.h (npos): Don't init here.
- * bits/string.tcc: Instead, do initialization here, to -1 instead
- of the size_type destructor.
-
- * src/traits.cc, src/wtraits.cc: New files.
- * bits/char_traits.h: For char_traits<char> and
- char_traits<wchar_t>, declare static, but define over in the src
- files.
-
- * bits/gslice.h: Comment out forward decls of _Array, valarray,
- gslice_array, and _GsliceExpression.
-
- * bits/std_cstdio.h [__sparc__ && __svr4__]: #undef all of
- clearerr, feof, ferror, getc, getchar, putc, putchar, stdin,
- stdout, and stderr. Note we do get unresolved refs to stdin, but
- that'll get fixed by the "true" solution.
-
- * bits/std_ios.h: Include <bits/std_streambuf.h> to get the
- definition of basic_streambuf.h, which is used in basic_ios.h to
- call pubimbue.
-
- * bits/std_streambuf.h: Don't include libio.h for now.
- (class basic_streambuf): Define missing methods pubimbue and
- getloc.
-
- * src/Makefile.am (libstdc___la_SOURCES): Add stdexcept.cc,
- ios.cc, os_raw.cc, stdstreams.cc, locale.cc, localename.cc,
- locale-inst.cc, stlinst.cc, traits.cc, wtraits.cc.
-
- * src/ios.cc: Instantiate basic_ios<char> and basic_ios<wchar_t>.
-
- * src/locale.cc: Come up with munged versions of _S_toupper,
- _S_tolower, and _S_table instead of the glibc-specific ones, so
- they're at least defined, if not necessarily usable. The glibc
- ones on any other system will yield unresolved refs to
- __ctype_{b,toupper,tolower}.
-
- * src/string.cc: Define all of ADDCS, ADDPS, et al. Add
- basic_ios, basic_istream, basic_ostream. Don't do char_traits
- anymore cuz of the explicit specialization in char_traits.h.
- Also add _S_string_copy, but this doesn't fix it -- cf the BUGS
- file for the details.
-
- * stl/bits/stl_algobase.h (equal): Fix to do `! (x==y)'.
- * stl/bits/stl_iterator.h (__distance): Likewise.
-
- * stl/bits/stl_iterator.h: As with 8/18 set, define missing op!=,
- op>, op<=, and op>= for reverse_iterator. Also add op!= for
- istream_iterator.
-
-1998-08-26 Brendan Kehoe <brendan@cygnus.com>
-
- * bits/string.tcc (basic_string::compare (const char*)): Fix to
- return 0, not 1.
-
-1998-08-25 Brendan Kehoe <brendan@cygnus.com>
-
- This should really be fixed with __asm__ directives renaming the
- symbol, but keeping the function.
- * math/clogf.c (c_logf): Renamed from `clogf'.
- * math/clogl.c (c_logl): Renamed from `clogl'.
- * math/complex-stub.h (c_logf, c_logl): Change decls.
-
- * bits/locfacets.h (class _Numeric_get): For friend decls, rename
- _CharT and _InIter parms, since they duplicate the enclosing ones.
-
-1998-08-19 Brendan Kehoe <brendan@cygnus.com>
-
- Deal with conflict of the iostreams `clog' and our internal
- complex number `clog'.
- * src/complex.cc: Call `c_log' instead of `clog'.
- * math/clog.c (c_log):: Renamed from clog.
- * math/complex-stub.h (c_log): Renamed from clog decl.
-
- * bits/locfacets.h (class _Numeric_get): Tweak fwd decls of the
- get/put classes.
- (num_put::put): #if 0 long long version, since we don't declare or
- define the long long version of do_put.
-
-1998-08-18 Nathan Myers <ncm@cantrip.org>
-
- * bits/basic_string.h: add basic_string<>::push_back(), fix return
- type of get_allocator (thanks to Ryszard Kabatek).
- * bits/char_traits.h: make init order of fpos<> members
- match decl order.
- * bits/ios_base.h: fix decls of ios_base bitmask & enum types, add
- flags _S_fd_in etc. for special filebuf ctor.
- * bits/locfacets.h: make _Numeric_get and _Format_cache public
- to work around problems in friend declarations.
- * bits/locfacets.tcc: qualify _S_get_cache in num_get<>::get(..bool&),
- fix random type errors & typos
- * bits/std_fstream.h: major refitting to bypass libio (for now),
- instrument to use bits/fstream.tcc template definitions
- * bits/std_iosfwd.h: mess with wrappers
- * bits/std_istream.h: remove meaningless comment
- * bits/std_ostream.h: instrument to work with ostream.tcc.
- * bits/std_streambuf.h: instrument to work with streambuf.tcc
- * bits/fstream.tcc: template defs for <fstream>
- * bits/ostream.tcc: template defs for <ostream>
- * bits/streambuf.tcc: template defs for <streambuf>
- * bits/os_raw.h: thin OS interface wrapper, to bypass libio (for now).
- * Delete .cc files, replace with bits/*.tcc
- src/fstream.cc
- src/istream.cc
- src/ostream.cc
- src/streambuf.cc
- * Add files:
- src/os_raw.cc: thin interface to OS, to bypass libio (for now).
- src/stdstreams.cc: cout, cin, etc. definitions
- (these still need work: must be init'd before user statics.)
-
-
-1998-08-18 Brendan Kehoe <brendan@cygnus.com>
-
- Sent to SGI before checkin:
- * stl/bits/stl_vector.h (operator!=, operator>, operator<=,
- operator>=): Define.
- * stl/bits/stl_bvector.h (vector<bool>::flip): Define method.
- * stl/bits/stl_deque.h (operator!=, operator>, operator<=,
- operator>=): Define.
- (operator==, operator<): Add inline.
- * stl/bits/stl_map.h (operator!=, operator<, operator<=,
- operator>=): Define.
- * stl/bits/stl_multimap.h (operator!=, operator<, operator<=,
- operator>=): Define.
- * stl/bits/stl_list.h (operator!=, operator<, operator<=,
- operator>=): Define.
- * stl/bits/stl_set.h (operator!=, operator<, operator<=,
- operator>=): Define.
- * stl/bits/stl_multiset.h (operator!=, operator<, operator<=,
- operator>=): Define.
-
- * bits/std_valarray.h (_Shift_left, _Shift_right): Inherit from
- unary_function.
-
-1998-08-15 Nathan Myers <ncm@cantrip.org>
-
- * bits/ios_base.h: change nominal bitmask and enum types to real enums
- * bits/locfacets.h: make _Format_cache bool names usable by num_get
- * bits/locfacets.tcc: make num_get<>::get(... bool&) use _Format_cache
- * bits/std_fstream.h: minor cleanups: ctors delegate to open()
- * bits/std_iosfwd.h: more bitmask changes, for ios_base::iostate
- * bits/std_sstream.h: formatting cleanups
-
-1998-08-14 Nathan Myers <ncm@cantrip.org>
-
- * bits/locfacets.tcc: implement num_get<>::do_get(..., bool&)
- * bits/locfacets.tcc: implement time_get<>::do_get_weekday
- * bits/locfacets.tcc: implement time_get<>::do_get_monthname
- * bits/locfacets.h: fix missing argument in do_get_monthname
- (this is a bug in the standard, ref. 36 in my list.)
- * bits/locfacets.h: make month and day name caches mutable
- * bits/locfacets.tcc: various typos in get() functions
- * bits/sbuf_iter.h: fix omission in istreambuf_iterator::op++().
- * bits/std_streambuf.h: fix typo in sgetn (Brendan)
-
-1998-08-12 Nathan Myers <ncm@cantrip.org>
- * move streambuf iterators to bits/sbuf_iter.h
- * optimize streambuf iterators
- * begin generalizing streambuf
- * begin implementing num_get<>::get (starting with bool)
- * patch stl/bits/stl_config.h so that relops operators are
- contained properly, out of the way.
-
-1998-07-24 Nathan Myers <ncm@cantrip.org>
- * Fold in SGI 3.11 changes (uglified names, some algorithm
- improvements, very minor bug fixes.)
- * Uglify names elsewhere to match (s/_T/_Tp/).
- * Begin work on optimized streambuf
- * Put complex.cc in namespace std:: (thanks Martin)
-
-1998-07-17 Nathan Myers <ncm@cantrip.org>
-
- * bits/char_traits.h: add _Char_traits_match template.
- * bits/string.tcc: fix bugs in various find_last* members.
- * bits/basic_string.h: redeclare member _S_find.
- * stl/bits/stl_iterator.h: change member names in nonstandard
- templates bidirectional_reverse_iterator and
- random_access_reverse_iterator to match expected changes
- in upstream source.
- * src/string.cc: fix definitions of stream operators.
-
-1998-07-14 16:06 Ulrich Drepper <drepper@cygnus.com>
-
- * Makefile.am (SUBDIRS): Add string.
-
- * configure.in: Test for long double functions separately. Test for
- ISO C 89 float functions. Test for endian.h and sys/isa_defs.h.
- Generate string/Makefile.
-
- * bits/c++config.h: Define mbstate_t for Solaris.
-
- * bits/char_traits.h: Remove unused #if.
-
- * bits/std_cwchar.h: Declare wide char string functions.
-
- * m4/stringfcts.m4: New file.
-
- * math/complex-stub.h: Declare nan.
- * math/nan.c: New file.
-
- * math/mathconf.h: Hack around missing endian.h file.
- Handle missing NAN definition.
- Handle missing float math functions.
-
- * src/Makefile.am (libstdc___la_LIBADD): Add libstring.la.
- (libstdc___la_LDFLAGS): Set version information.
-
- * src/complexl.cc: Don't compile any code if no long double functions
- are available.
-
- * string/Makefile.am: New file.
- * string/dummy.c: New file.
- * string/wmemchr.c: New file.
- * string/wmemcmp.c: New file.
- * string/wmemcpy.c: New file.
- * string/wmemmove.c: New file.
- * string/wmemset.c: New file.
-
-1998-07-14 10:45 Ulrich Drepper <drepper@cygnus.com>
-
- * configure.in: Make it work.
- * install-sh: New file.
- * missing: New file.
- * mkinstalldirs: New file.
- * m4/mathfcts.m4: New file.
- * math/Makefile.am: New file.
-
- * bits/std_complex.h (conj): Mark specializations as inline.
-
- * math/carg.c: New file.
- * math/cargf.c: New file.
- * math/cargl.c: New file.
- * math/mycabs.c: New file.
- * math/mycabsf.c: New file.
- * math/mycabsl.c: New file.
- * math/signbit.c: New file.
- * math/signbitf.c: New file.
- * math/signbitl.c: New file.
-
- * math/ccos.c: Avoid ISO C 9x functionality.
- * math/ccosf.c: Likewise.
- * math/ccosh.c: Likewise.
- * math/ccoshf.c: Likewise.
- * math/ccoshl.c: Likewise.
- * math/ccosl.c: Likewise.
- * math/cexp.c: Likewise.
- * math/cexpf.c: Likewise.
- * math/cexpl.c: Likewise.
- * math/clog.c: Likewise.
- * math/clog10.c: Likewise.
- * math/clog10f.c: Likewise.
- * math/clog10l.c: Likewise.
- * math/clogf.c: Likewise.
- * math/clogl.c: Likewise.
- * math/cpow.c: Likewise.
- * math/cpowf.c: Likewise.
- * math/cpowl.c: Likewise.
- * math/csin.c: Likewise.
- * math/csinf.c: Likewise.
- * math/csinh.c: Likewise.
- * math/csinhf.c: Likewise.
- * math/csinhl.c: Likewise.
- * math/csinl.c: Likewise.
- * math/csqrt.c: Likewise.
- * math/csqrtf.c: Likewise.
- * math/csqrtl.c: Likewise.
- * math/ctan.c: Likewise.
- * math/ctanf.c: Likewise.
- * math/ctanh.c: Likewise.
- * math/ctanhf.c: Likewise.
- * math/ctanhl.c: Likewise.
- * math/ctanl.c: Likewise.
-
- * math/complex-stub.h: New file.
-
- * math/mathconf.h: New file.
-
- * src/Makefile.am: New file.
-
- * src/complex.cc: Use mathconf.h instead of complex.h.
- Don't use cabs, always use __mycabs.
-
-1998-02-13 Brendan Kehoe <brendan@cygnus.com>
-
- * iterator (class reverse_iterator): Do some tweaks to be in sync
- w/ the FDIS.
diff --git a/libstdc++-v3/Makefile.in b/libstdc++-v3/Makefile.in
index 7f4e5691a3d..43d80236a21 100644
--- a/libstdc++-v3/Makefile.in
+++ b/libstdc++-v3/Makefile.in
@@ -45,7 +45,8 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/../config.guess \
$(top_srcdir)/scripts/testsuite_flags.in ChangeLog
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/../config/no-executables.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/../config/lead-dot.m4 \
+ $(top_srcdir)/../config/no-executables.m4 \
$(top_srcdir)/../libtool.m4 $(top_srcdir)/crossconfig.m4 \
$(top_srcdir)/linkage.m4 $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/configure.ac
diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 757a0e8aed1..1cf013e38c0 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -797,14 +797,10 @@ AC_DEFUN([GLIBCXX_ENABLE_C99], [
in <cmath> in namespace std.])
fi
- # Check for the existence of <complex.h> complex functions.
+ # Check for the existence of <complex.h> complex math functions.
# This is necessary even though libstdc++ uses the builtin versions
# of these functions, because if the builtin cannot be used, a reference
# to the library function is emitted.
- # In addition, need to explicitly specify "C" compilation for this
- # one, or else the backwards C++ <complex.h> include will be selected.
- save_CXXFLAGS="$CXXFLAGS"
- CXXFLAGS="$CXXFLAGS -x c"
AC_CHECK_HEADERS(complex.h, ac_has_complex_h=yes, ac_has_complex_h=no)
ac_c99_complex=no;
if test x"$ac_has_complex_h" = x"yes"; then
@@ -816,6 +812,7 @@ AC_DEFUN([GLIBCXX_ENABLE_C99], [
ccosf(tmpf);
ccoshf(tmpf);
cexpf(tmpf);
+ clogf(tmpf);
csinf(tmpf);
csinhf(tmpf);
csqrtf(tmpf);
@@ -828,6 +825,7 @@ AC_DEFUN([GLIBCXX_ENABLE_C99], [
ccos(tmpd);
ccosh(tmpd);
cexp(tmpd);
+ clog(tmpd);
csin(tmpd);
csinh(tmpd);
csqrt(tmpd);
@@ -840,6 +838,7 @@ AC_DEFUN([GLIBCXX_ENABLE_C99], [
ccosl(tmpld);
ccoshl(tmpld);
cexpl(tmpld);
+ clogl(tmpld);
csinl(tmpld);
csinhl(tmpld);
csqrtl(tmpld);
@@ -848,7 +847,6 @@ AC_DEFUN([GLIBCXX_ENABLE_C99], [
cpowl(tmpld, tmpld);
],[ac_c99_complex=yes], [ac_c99_complex=no])
fi
- CXXFLAGS="$save_CXXFLAGS"
AC_MSG_RESULT($ac_c99_complex)
if test x"$ac_c99_complex" = x"yes"; then
AC_DEFINE(_GLIBCXX_USE_C99_COMPLEX, 1,
@@ -879,12 +877,14 @@ AC_DEFUN([GLIBCXX_ENABLE_C99], [
AC_MSG_CHECKING([for ISO C99 support in <stdlib.h>])
AC_CACHE_VAL(ac_c99_stdlib, [
AC_TRY_COMPILE([#include <stdlib.h>],
- [char* tmp;
- strtof("gnu", &tmp);
+ [char* tmp;
+ strtof("gnu", &tmp);
strtold("gnu", &tmp);
- llabs(10);
- lldiv(10,1);
- atoll("10");
+ strtoll("gnu", &tmp, 10);
+ strtoull("gnu", &tmp, 10);
+ llabs(10);
+ lldiv(10,1);
+ atoll("10");
_Exit(0);
lldiv_t mydivt;],[ac_c99_stdlib=yes], [ac_c99_stdlib=no])
])
diff --git a/libstdc++-v3/aclocal.m4 b/libstdc++-v3/aclocal.m4
index 7dda07cdfd0..9c72982dce1 100644
--- a/libstdc++-v3/aclocal.m4
+++ b/libstdc++-v3/aclocal.m4
@@ -300,39 +300,6 @@ AC_DEFUN([AM_PROG_INSTALL_SH],
install_sh=${install_sh-"$am_aux_dir/install-sh"}
AC_SUBST(install_sh)])
-# -*- Autoconf -*-
-# Copyright (C) 2003 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# serial 1
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot. For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
- am__leading_dot=.
-else
- am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
# Add --enable-maintainer-mode option to configure.
# From Jim Meyering
@@ -817,6 +784,7 @@ AC_SUBST([am__tar])
AC_SUBST([am__untar])
]) # _AM_PROG_TAR
+m4_include([../config/lead-dot.m4])
m4_include([../config/no-executables.m4])
m4_include([../libtool.m4])
m4_include([crossconfig.m4])
diff --git a/libstdc++-v3/config/abi/powerpc64-linux-gnu/32/baseline_symbols.txt b/libstdc++-v3/config/abi/powerpc64-linux-gnu/32/baseline_symbols.txt
new file mode 100644
index 00000000000..f93151155c6
--- /dev/null
+++ b/libstdc++-v3/config/abi/powerpc64-linux-gnu/32/baseline_symbols.txt
@@ -0,0 +1,3083 @@
+FUNC:_ZN10__cxxabiv116__enum_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv116__enum_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv116__enum_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__array_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__array_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__array_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__class_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__class_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__class_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__pbase_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__pbase_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__pbase_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv119__pointer_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv119__pointer_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv119__pointer_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__function_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__function_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__function_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__si_class_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__si_class_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__si_class_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv121__vmi_class_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv121__vmi_class_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv121__vmi_class_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv123__fundamental_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv123__fundamental_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv123__fundamental_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv129__pointer_to_member_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv129__pointer_to_member_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv129__pointer_to_member_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__gnu_norm15_List_node_base4hookEPS0_@@GLIBCXX_3.4
+FUNC:_ZN10__gnu_norm15_List_node_base4swapERS0_S1_@@GLIBCXX_3.4
+FUNC:_ZN10__gnu_norm15_List_node_base6unhookEv@@GLIBCXX_3.4
+FUNC:_ZN10__gnu_norm15_List_node_base7reverseEv@@GLIBCXX_3.4
+FUNC:_ZN10__gnu_norm15_List_node_base8transferEPS0_S1_@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_iterator_base9_M_attachEPNS_19_Safe_sequence_baseEb@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_iterator_base9_M_detachEv@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_sequence_base13_M_detach_allEv@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_sequence_base18_M_detach_singularEv@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_sequence_base22_M_revalidate_singularEv@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_sequence_base7_M_swapERS0_@@GLIBCXX_3.4
+FUNC:_ZN9__gnu_cxx12__atomic_addEPVii@@GLIBCXX_3.4
+FUNC:_ZN9__gnu_cxx18__exchange_and_addEPVii@@GLIBCXX_3.4
+FUNC:_ZN9__gnu_cxx27__verbose_terminate_handlerEv@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__class_type_info10__do_catchEPKSt9type_infoPPvj@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PKvRNS0_15__upcast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PPv@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__class_type_info12__do_dyncastEiNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__class_type_info20__do_find_public_srcEiPKvPKS0_S2_@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__pbase_type_info10__do_catchEPKSt9type_infoPPvj@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__pbase_type_info15__pointer_catchEPKS0_PPvj@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv119__pointer_type_info14__is_pointer_pEv@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv119__pointer_type_info15__pointer_catchEPKNS_17__pbase_type_infoEPPvj@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv120__function_type_info15__is_function_pEv@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv120__si_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv120__si_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv121__vmi_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv121__vmi_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv121__vmi_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv129__pointer_to_member_type_info15__pointer_catchEPKNS_17__pbase_type_infoEPPvj@@CXXABI_1.3
+FUNC:_ZNK11__gnu_debug16_Error_formatter10_M_messageENS_13_Debug_msg_idE@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug16_Error_formatter10_Parameter14_M_print_fieldEPKS0_PKc@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug16_Error_formatter10_Parameter20_M_print_descriptionEPKS0_@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug16_Error_formatter13_M_print_wordEPKc@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug16_Error_formatter15_M_print_stringEPKc@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug16_Error_formatter8_M_errorEv@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug19_Safe_iterator_base11_M_singularEv@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug19_Safe_iterator_base14_M_can_compareERKS0_@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofERKS2_j@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofERKS2_j@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13get_allocatorEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofERKS2_j@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofERKS2_j@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE2atEj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE3endEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_leakedEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_sharedEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4copyEPwjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4dataEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findERKS2_j@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4rendEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4sizeEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5beginEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5c_strEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5emptyEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindERKS2_j@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6_M_repEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6lengthEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6rbeginEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6substrEjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7_M_dataEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7_M_iendEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEPKw@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareERKS2_@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjPKw@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjRKS2_@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjRKS2_jj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8_M_checkEjPKc@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8_M_limitEjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8capacityEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8max_sizeEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE9_M_ibeginEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEEixEj@@GLIBCXX_3.4
+FUNC:_ZNKSi6gcountEv@@GLIBCXX_3.4
+FUNC:_ZNKSi6sentrycvbEv@@GLIBCXX_3.4
+FUNC:_ZNKSo6sentrycvbEv@@GLIBCXX_3.4
+FUNC:_ZNKSs12find_last_ofEPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSs12find_last_ofEPKcjj@@GLIBCXX_3.4
+FUNC:_ZNKSs12find_last_ofERKSsj@@GLIBCXX_3.4
+FUNC:_ZNKSs12find_last_ofEcj@@GLIBCXX_3.4
+FUNC:_ZNKSs13find_first_ofEPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSs13find_first_ofEPKcjj@@GLIBCXX_3.4
+FUNC:_ZNKSs13find_first_ofERKSsj@@GLIBCXX_3.4
+FUNC:_ZNKSs13find_first_ofEcj@@GLIBCXX_3.4
+FUNC:_ZNKSs13get_allocatorEv@@GLIBCXX_3.4
+FUNC:_ZNKSs16find_last_not_ofEPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSs16find_last_not_ofEPKcjj@@GLIBCXX_3.4
+FUNC:_ZNKSs16find_last_not_ofERKSsj@@GLIBCXX_3.4
+FUNC:_ZNKSs16find_last_not_ofEcj@@GLIBCXX_3.4
+FUNC:_ZNKSs17find_first_not_ofEPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSs17find_first_not_ofEPKcjj@@GLIBCXX_3.4
+FUNC:_ZNKSs17find_first_not_ofERKSsj@@GLIBCXX_3.4
+FUNC:_ZNKSs17find_first_not_ofEcj@@GLIBCXX_3.4
+FUNC:_ZNKSs2atEj@@GLIBCXX_3.4
+FUNC:_ZNKSs3endEv@@GLIBCXX_3.4
+FUNC:_ZNKSs4_Rep12_M_is_leakedEv@@GLIBCXX_3.4
+FUNC:_ZNKSs4_Rep12_M_is_sharedEv@@GLIBCXX_3.4
+FUNC:_ZNKSs4copyEPcjj@@GLIBCXX_3.4
+FUNC:_ZNKSs4dataEv@@GLIBCXX_3.4
+FUNC:_ZNKSs4findEPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSs4findEPKcjj@@GLIBCXX_3.4
+FUNC:_ZNKSs4findERKSsj@@GLIBCXX_3.4
+FUNC:_ZNKSs4findEcj@@GLIBCXX_3.4
+FUNC:_ZNKSs4rendEv@@GLIBCXX_3.4
+FUNC:_ZNKSs4sizeEv@@GLIBCXX_3.4
+FUNC:_ZNKSs5beginEv@@GLIBCXX_3.4
+FUNC:_ZNKSs5c_strEv@@GLIBCXX_3.4
+FUNC:_ZNKSs5emptyEv@@GLIBCXX_3.4
+FUNC:_ZNKSs5rfindEPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSs5rfindEPKcjj@@GLIBCXX_3.4
+FUNC:_ZNKSs5rfindERKSsj@@GLIBCXX_3.4
+FUNC:_ZNKSs5rfindEcj@@GLIBCXX_3.4
+FUNC:_ZNKSs6_M_repEv@@GLIBCXX_3.4
+FUNC:_ZNKSs6lengthEv@@GLIBCXX_3.4
+FUNC:_ZNKSs6rbeginEv@@GLIBCXX_3.4
+FUNC:_ZNKSs6substrEjj@@GLIBCXX_3.4
+FUNC:_ZNKSs7_M_dataEv@@GLIBCXX_3.4
+FUNC:_ZNKSs7_M_iendEv@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareEPKc@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareERKSs@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareEjjPKc@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareEjjPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareEjjRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareEjjRKSsjj@@GLIBCXX_3.4
+FUNC:_ZNKSs8_M_checkEjPKc@@GLIBCXX_3.4
+FUNC:_ZNKSs8_M_limitEjj@@GLIBCXX_3.4
+FUNC:_ZNKSs8capacityEv@@GLIBCXX_3.4
+FUNC:_ZNKSs8max_sizeEv@@GLIBCXX_3.4
+FUNC:_ZNKSs9_M_ibeginEv@@GLIBCXX_3.4
+FUNC:_ZNKSsixEj@@GLIBCXX_3.4
+FUNC:_ZNKSt10istrstream5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE10neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE10pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE11curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE11frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13do_neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13do_pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE14do_curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE14do_frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE10neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE10pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE11curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE11frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13do_neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13do_pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE14do_curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE14do_frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE10neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE10pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE11curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE11frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13do_neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13do_pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE14do_curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE14do_frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE10neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE10pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE11curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE11frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13do_neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13do_pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE14do_curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE14do_frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10ostrstream5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10ostrstream6pcountEv@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE15_M_am_pm_formatEPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE15_M_date_formatsEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE15_M_time_formatsEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE19_M_days_abbreviatedEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE20_M_date_time_formatsEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE21_M_months_abbreviatedEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE6_M_putEPcjPKcPK2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE7_M_daysEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE8_M_am_pmEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE9_M_monthsEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE15_M_am_pm_formatEPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE15_M_date_formatsEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE15_M_time_formatsEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE19_M_days_abbreviatedEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE20_M_date_time_formatsEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE21_M_months_abbreviatedEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE6_M_putEPwjPKwPK2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE7_M_daysEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE8_M_am_pmEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE9_M_monthsEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11logic_error4whatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt12__basic_fileIcE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNKSt12strstreambuf6pcountEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_filebufIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_filebufIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_fstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_fstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_istreamIwSt11char_traitsIwEE6gcountEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_istreamIwSt11char_traitsIwEE6sentrycvbEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_ostreamIwSt11char_traitsIwEE6sentrycvbEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13runtime_error4whatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt14basic_ifstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt14basic_ifstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt14basic_ofstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt14basic_ofstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE4gptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE4pptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5ebackEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5egptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5epptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5pbaseEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE6getlocEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE4gptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE4pptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5ebackEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5egptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5epptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5pbaseEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE6getlocEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_istringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE10do_tolowerEPcPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE10do_tolowerEc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE10do_toupperEPcPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE10do_toupperEc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE8do_widenEPKcS2_Pc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE8do_widenEc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE9do_narrowEPKcS2_cPc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE9do_narrowEcc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE10do_scan_isEtPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE10do_tolowerEPwPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE10do_tolowerEw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE10do_toupperEPwPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE10do_toupperEw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE11do_scan_notEtPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE19_M_convert_to_wmaskEt@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE5do_isEPKwS2_Pt@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE5do_isEtw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE8do_widenEPKcS2_Pw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE8do_widenEc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE9do_narrowEPKwS2_cPc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE9do_narrowEwc@@GLIBCXX_3.4
+FUNC:_ZNKSt6locale2id5_M_idEv@@GLIBCXX_3.4
+FUNC:_ZNKSt6locale4nameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt6localeeqERKS_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE11do_encodingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE13do_max_lengthEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE16do_always_noconvEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE5do_inERS0_PKcS4_RS4_PcS6_RS6_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE6do_outERS0_PKcS4_RS4_PcS6_RS6_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE9do_lengthERS0_PKcS4_j@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE11do_encodingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE13do_max_lengthEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE16do_always_noconvEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE5do_inERS0_PKcS4_RS4_PwS6_RS6_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE6do_outERS0_PKwS4_RS4_PcS6_RS6_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE9do_lengthERS0_PKcS4_j@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE10_M_compareEPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE12_M_transformEPcPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE12do_transformEPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE4hashEPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE7compareEPKcS2_S2_S2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE7do_hashEPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE9transformEPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE10_M_compareEPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE10do_compareEPKwS2_S2_S2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE12_M_transformEPwPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE12do_transformEPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE4hashEPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE7compareEPKwS2_S2_S2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE7do_hashEPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE9transformEPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIjEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIlEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intImEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intItEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIxEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIyEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIjEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIlEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intImEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intItEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIxEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIyEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_group_intEPKcjcRSt8ios_basePcS9_Ri@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIlEES3_S3_RSt8ios_basecT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intImEES3_S3_RSt8ios_basecT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIxEES3_S3_RSt8ios_basecT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIyEES3_S3_RSt8ios_basecT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_group_floatEPKcjcS6_PcS7_Ri@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIdEES3_S3_RSt8ios_baseccT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIeEES3_S3_RSt8ios_baseccT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPKv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basece@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6_M_padEciRSt8ios_basePcPKcRi@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPKv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basece@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE12_M_group_intEPKcjwRSt8ios_basePwS9_Ri@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIlEES3_S3_RSt8ios_basewT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intImEES3_S3_RSt8ios_basewT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIxEES3_S3_RSt8ios_basewT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIyEES3_S3_RSt8ios_basewT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_group_floatEPKcjwPKwPwS9_Ri@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIdEES3_S3_RSt8ios_basewcT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIeEES3_S3_RSt8ios_basewcT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPKv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6_M_padEwiRSt8ios_basePwPKwRi@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPKv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewy@@GLIBCXX_3.4
+FUNC:_ZNKSt8ios_base7failure4whatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE18_M_convert_to_charERKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE20_M_convert_from_charEPc@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE3getEiiiRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE4openERKSsRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE4openERKSsRKSt6localePKc@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE5closeEi@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE6do_getEiiiRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE7do_openERKSsRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE8do_closeEi@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE18_M_convert_to_charERKSbIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE20_M_convert_from_charEPc@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE3getEiiiRKSbIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE4openERKSsRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE4openERKSsRKSt6localePKc@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE5closeEi@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE6do_getEiiiRKSbIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE7do_openERKSsRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE8do_closeEi@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE11do_truenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE12do_falsenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE8truenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE9falsenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE11do_truenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE12do_falsenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE8truenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE9falsenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10date_orderEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13do_date_orderEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_numES3_S3_RiiijRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14do_get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE15_M_extract_nameES3_S3_RiPPKcjRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE21_M_extract_via_formatES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10date_orderEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13do_date_orderEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_numES3_S3_RiiijRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14do_get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE15_M_extract_nameES3_S3_RiPPKwjRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE21_M_extract_via_formatES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmcc@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPK2tmcc@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmPKwSB_@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmcc@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPK2tmcc@@GLIBCXX_3.4
+FUNC:_ZNKSt8valarrayIjE4sizeEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE10exceptionsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3badEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3eofEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3tieEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4failEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4fillEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4goodEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE5widenEc@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE6narrowEcc@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE7rdstateEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEcvPvEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEntEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE10exceptionsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3badEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3eofEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3tieEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4failEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4fillEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4goodEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE5widenEc@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE6narrowEwc@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE7rdstateEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEEcvPvEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEEntEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9exception4whatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb0EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb1EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb0EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb1EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basecRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basece@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basece@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb0EEES3_S3_RSt8ios_basecRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb1EEES3_S3_RSt8ios_basecRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb0EEES3_S3_RSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb1EEES3_S3_RSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9strstream5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9strstream6pcountEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9type_info10__do_catchEPKS_PPvj@@GLIBCXX_3.4
+FUNC:_ZNKSt9type_info11__do_upcastEPKN10__cxxabiv117__class_type_infoEPPv@@GLIBCXX_3.4
+FUNC:_ZNKSt9type_info14__is_pointer_pEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9type_info15__is_function_pEv@@GLIBCXX_3.4
+FUNC:_ZNSaIcEC1ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSaIcEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIcEC2ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSaIcEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIwEC1ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSaIwEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIwEC2ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSaIwEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hiderC1EPwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hiderC2EPwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_M_leak_hardEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_S_constructEjwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_S_empty_repEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIPKwS2_EES8_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIS3_S2_EES6_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwPKwS5_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwS3_S3_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE14_M_replace_auxEjjjw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeEjjPKwj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE2atEj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE3endEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_destroyERKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_disposeERKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refcopyEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refdataEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep12_S_empty_repEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep13_M_set_leakedEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep15_M_set_sharableEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep7_M_grabERKS1_S5_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep8_M_cloneERKS1_j@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEjjRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4rendEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4swapERS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5beginEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5clearEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EE@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEjj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_jj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEjw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_jj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEjw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEjw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEjPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEjPKwj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEjRKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEjRKS2_jj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEjjw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6rbeginEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6resizeEj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6resizeEjw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7_M_dataEPw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7_M_leakEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_NS4_IPKwS2_EES9_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwS8_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_RKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S5_S5_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S6_S6_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_jw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjPKwj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjRKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjRKS2_jj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjjw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7reserveEj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEjjj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE9push_backEw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EPKwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EPKwjRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_jj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_jjRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EjwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IN9__gnu_cxx17__normal_iteratorIPwS2_EEEET_S8_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IPKwEET_S6_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IPwEET_S5_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EPKwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EPKwjRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_jj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_jjRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EjwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IN9__gnu_cxx17__normal_iteratorIPwS2_EEEET_S8_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IPKwEET_S6_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IPwEET_S5_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSEPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSEw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEixEj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLEPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLEw@@GLIBCXX_3.4
+FUNC:_ZNSdC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSdC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSdC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSdC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSdD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSdD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSdD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSi3getEPci@@GLIBCXX_3.4
+FUNC:_ZNSi3getEPcic@@GLIBCXX_3.4
+FUNC:_ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEEc@@GLIBCXX_3.4
+FUNC:_ZNSi3getERc@@GLIBCXX_3.4
+FUNC:_ZNSi3getEv@@GLIBCXX_3.4
+FUNC:_ZNSi4peekEv@@GLIBCXX_3.4
+FUNC:_ZNSi4readEPci@@GLIBCXX_3.4
+FUNC:_ZNSi4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSi5seekgESt4fposI11__mbstate_tE@@GLIBCXX_3.4
+FUNC:_ZNSi5seekgExSt12_Ios_Seekdir@@GLIBCXX_3.4
+FUNC:_ZNSi5tellgEv@@GLIBCXX_3.4
+FUNC:_ZNSi5ungetEv@@GLIBCXX_3.4
+FUNC:_ZNSi6ignoreEii@@GLIBCXX_3.4
+FUNC:_ZNSi6sentryC1ERSib@@GLIBCXX_3.4
+FUNC:_ZNSi6sentryC2ERSib@@GLIBCXX_3.4
+FUNC:_ZNSi7getlineEPci@@GLIBCXX_3.4
+FUNC:_ZNSi7getlineEPcic@@GLIBCXX_3.4
+FUNC:_ZNSi7putbackEc@@GLIBCXX_3.4
+FUNC:_ZNSi8readsomeEPci@@GLIBCXX_3.4
+FUNC:_ZNSiC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSiC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSiC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSiC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSiD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSiD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSiD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSirsEPFRSiS_E@@GLIBCXX_3.4
+FUNC:_ZNSirsEPFRSt8ios_baseS0_E@@GLIBCXX_3.4
+FUNC:_ZNSirsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCXX_3.4
+FUNC:_ZNSirsEPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSirsERPv@@GLIBCXX_3.4
+FUNC:_ZNSirsERb@@GLIBCXX_3.4
+FUNC:_ZNSirsERd@@GLIBCXX_3.4
+FUNC:_ZNSirsERe@@GLIBCXX_3.4
+FUNC:_ZNSirsERf@@GLIBCXX_3.4
+FUNC:_ZNSirsERi@@GLIBCXX_3.4
+FUNC:_ZNSirsERj@@GLIBCXX_3.4
+FUNC:_ZNSirsERl@@GLIBCXX_3.4
+FUNC:_ZNSirsERm@@GLIBCXX_3.4
+FUNC:_ZNSirsERs@@GLIBCXX_3.4
+FUNC:_ZNSirsERt@@GLIBCXX_3.4
+FUNC:_ZNSirsERx@@GLIBCXX_3.4
+FUNC:_ZNSirsERy@@GLIBCXX_3.4
+FUNC:_ZNSo3putEc@@GLIBCXX_3.4
+FUNC:_ZNSo5flushEv@@GLIBCXX_3.4
+FUNC:_ZNSo5seekpESt4fposI11__mbstate_tE@@GLIBCXX_3.4
+FUNC:_ZNSo5seekpExSt12_Ios_Seekdir@@GLIBCXX_3.4
+FUNC:_ZNSo5tellpEv@@GLIBCXX_3.4
+FUNC:_ZNSo5writeEPKci@@GLIBCXX_3.4
+FUNC:_ZNSo6sentryC1ERSo@@GLIBCXX_3.4
+FUNC:_ZNSo6sentryC2ERSo@@GLIBCXX_3.4
+FUNC:_ZNSo6sentryD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSo6sentryD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSo8_M_writeEPKci@@GLIBCXX_3.4
+FUNC:_ZNSoC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSoC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSoC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSoC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSoD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSoD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSoD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSolsEPFRSoS_E@@GLIBCXX_3.4
+FUNC:_ZNSolsEPFRSt8ios_baseS0_E@@GLIBCXX_3.4
+FUNC:_ZNSolsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCXX_3.4
+FUNC:_ZNSolsEPKv@@GLIBCXX_3.4
+FUNC:_ZNSolsEPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSolsEb@@GLIBCXX_3.4
+FUNC:_ZNSolsEd@@GLIBCXX_3.4
+FUNC:_ZNSolsEe@@GLIBCXX_3.4
+FUNC:_ZNSolsEf@@GLIBCXX_3.4
+FUNC:_ZNSolsEi@@GLIBCXX_3.4
+FUNC:_ZNSolsEj@@GLIBCXX_3.4
+FUNC:_ZNSolsEl@@GLIBCXX_3.4
+FUNC:_ZNSolsEm@@GLIBCXX_3.4
+FUNC:_ZNSolsEs@@GLIBCXX_3.4
+FUNC:_ZNSolsEt@@GLIBCXX_3.4
+FUNC:_ZNSolsEx@@GLIBCXX_3.4
+FUNC:_ZNSolsEy@@GLIBCXX_3.4
+FUNC:_ZNSs12_Alloc_hiderC1EPcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs12_Alloc_hiderC2EPcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs12_M_leak_hardEv@@GLIBCXX_3.4
+FUNC:_ZNSs12_S_constructEjcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs12_S_empty_repEv@@GLIBCXX_3.4
+FUNC:_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcSsEES4_@@GLIBCXX_3.4
+FUNC:_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS_SsEES2_@@GLIBCXX_3.4
+FUNC:_ZNSs13_S_copy_charsEPcPKcS1_@@GLIBCXX_3.4
+FUNC:_ZNSs13_S_copy_charsEPcS_S_@@GLIBCXX_3.4
+FUNC:_ZNSs14_M_replace_auxEjjjc@@GLIBCXX_3.4
+FUNC:_ZNSs15_M_replace_safeEjjPKcj@@GLIBCXX_3.4
+FUNC:_ZNSs2atEj@@GLIBCXX_3.4
+FUNC:_ZNSs3endEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep10_M_destroyERKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep10_M_disposeERKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep10_M_refcopyEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep10_M_refdataEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep12_S_empty_repEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep13_M_set_leakedEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep15_M_set_sharableEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep7_M_grabERKSaIcES2_@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep8_M_cloneERKSaIcEj@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep9_S_createEjjRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs4rendEv@@GLIBCXX_3.4
+FUNC:_ZNSs4swapERSs@@GLIBCXX_3.4
+FUNC:_ZNSs5beginEv@@GLIBCXX_3.4
+FUNC:_ZNSs5clearEv@@GLIBCXX_3.4
+FUNC:_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEE@@GLIBCXX_3.4
+FUNC:_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEES2_@@GLIBCXX_3.4
+FUNC:_ZNSs5eraseEjj@@GLIBCXX_3.4
+FUNC:_ZNSs6appendEPKc@@GLIBCXX_3.4
+FUNC:_ZNSs6appendEPKcj@@GLIBCXX_3.4
+FUNC:_ZNSs6appendERKSs@@GLIBCXX_3.4
+FUNC:_ZNSs6appendERKSsjj@@GLIBCXX_3.4
+FUNC:_ZNSs6appendEjc@@GLIBCXX_3.4
+FUNC:_ZNSs6assignEPKc@@GLIBCXX_3.4
+FUNC:_ZNSs6assignEPKcj@@GLIBCXX_3.4
+FUNC:_ZNSs6assignERKSs@@GLIBCXX_3.4
+FUNC:_ZNSs6assignERKSsjj@@GLIBCXX_3.4
+FUNC:_ZNSs6assignEjc@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEc@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEjc@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEjPKc@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEjPKcj@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEjRKSs@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEjRKSsjj@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEjjc@@GLIBCXX_3.4
+FUNC:_ZNSs6rbeginEv@@GLIBCXX_3.4
+FUNC:_ZNSs6resizeEj@@GLIBCXX_3.4
+FUNC:_ZNSs6resizeEjc@@GLIBCXX_3.4
+FUNC:_ZNSs7_M_dataEPc@@GLIBCXX_3.4
+FUNC:_ZNSs7_M_leakEv@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_NS0_IPKcSsEES5_@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKc@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcS4_@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcj@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_RKSs@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S1_S1_@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S2_S2_@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_jc@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEjjPKc@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEjjPKcj@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEjjRKSs@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEjjRKSsjj@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEjjjc@@GLIBCXX_3.4
+FUNC:_ZNSs7reserveEj@@GLIBCXX_3.4
+FUNC:_ZNSs9_M_mutateEjjj@@GLIBCXX_3.4
+FUNC:_ZNSs9push_backEc@@GLIBCXX_3.4
+FUNC:_ZNSsC1EPKcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1EPKcjRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1ERKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSsC1ERKSsjj@@GLIBCXX_3.4
+FUNC:_ZNSsC1ERKSsjjRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1EjcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSsC1IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1IPKcEET_S2_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1IPcEET_S1_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2EPKcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2EPKcjRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2ERKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSsC2ERKSsjj@@GLIBCXX_3.4
+FUNC:_ZNSsC2ERKSsjjRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2EjcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSsC2IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2IPKcEET_S2_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2IPcEET_S1_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSsD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSsaSEPKc@@GLIBCXX_3.4
+FUNC:_ZNSsaSERKSs@@GLIBCXX_3.4
+FUNC:_ZNSsaSEc@@GLIBCXX_3.4
+FUNC:_ZNSsixEj@@GLIBCXX_3.4
+FUNC:_ZNSspLEPKc@@GLIBCXX_3.4
+FUNC:_ZNSspLERKSs@@GLIBCXX_3.4
+FUNC:_ZNSspLEc@@GLIBCXX_3.4
+FUNC:_ZNSt10__num_base15_S_format_floatERKSt8ios_basePcc@@GLIBCXX_3.4
+FUNC:_ZNSt10bad_typeidD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10bad_typeidD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10bad_typeidD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstream3strEv@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC1EPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC1EPKci@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC1EPc@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC1EPci@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC2EPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC2EPKci@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC2EPc@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC2EPci@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10money_base20_S_construct_patternEccc@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC1EPSt18__moneypunct_cacheIcLb0EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC2EPSt18__moneypunct_cacheIcLb0EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC1EPSt18__moneypunct_cacheIcLb1EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC2EPSt18__moneypunct_cacheIcLb1EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC1EPSt18__moneypunct_cacheIwLb0EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC2EPSt18__moneypunct_cacheIwLb0EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC1EPSt18__moneypunct_cacheIwLb1EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC2EPSt18__moneypunct_cacheIwLb1EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstream3strEv@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstream6freezeEb@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamC1EPciSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamC2EPciSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcE23_M_initialize_timepunctEP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC1EPSt17__timepunct_cacheIcEj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC2EPSt17__timepunct_cacheIcEj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwE23_M_initialize_timepunctEP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC1EPSt17__timepunct_cacheIwEj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC2EPSt17__timepunct_cacheIwEj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11logic_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt11logic_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt11logic_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11logic_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11logic_errorD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11range_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt11range_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt11range_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11range_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE2fdEv@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE4openEPKcSt13_Ios_Openmodei@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE6xsgetnEPci@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE6xsputnEPKci@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE7seekoffExSt12_Ios_Seekdir@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE8sys_openEP8_IO_FILESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE8sys_openEiSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE8xsputn_2EPKciS2_i@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE9showmanycEv@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcEC1EP15pthread_mutex_t@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcEC2EP15pthread_mutex_t@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIcEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIcEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIwEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIwEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12domain_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12domain_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12domain_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12domain_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12length_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12length_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12length_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12length_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12out_of_rangeC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12out_of_rangeC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12out_of_rangeD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12out_of_rangeD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf3strEv@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf6freezeEb@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf6setbufEPci@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf7_M_freeEPc@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf8_M_allocEj@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf8_M_setupEPcS0_i@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf8overflowEi@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf9pbackfailEi@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPFPvjEPFvS0_E@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPKai@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPKci@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPKhi@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPaiS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPciS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPhiS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1Ei@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPFPvjEPFvS0_E@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPKai@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPKci@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPKhi@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPaiS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPciS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPhiS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2Ei@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13bad_exceptionD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13bad_exceptionD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13bad_exceptionD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE13_M_set_bufferEi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE15_M_create_pbackEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE16_M_destroy_pbackEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE19_M_terminate_outputEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE22_M_convert_to_externalEPci@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE26_M_destroy_internal_bufferEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE27_M_allocate_internal_bufferEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPci@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6xsgetnEPci@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6xsputnEPKci@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7_M_seekExSt12_Ios_Seekdir11__mbstate_t@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9showmanycEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE13_M_set_bufferEi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE15_M_create_pbackEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE16_M_destroy_pbackEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE19_M_terminate_outputEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE22_M_convert_to_externalEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE26_M_destroy_internal_bufferEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE27_M_allocate_internal_bufferEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6xsgetnEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6xsputnEPKwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE7_M_seekExSt12_Ios_Seekdir11__mbstate_t@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE8overflowEj@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9pbackfailEj@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9showmanycEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwiw@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERSt15basic_streambufIwS1_Ew@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERw@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4peekEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4readEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgESt4fposI11__mbstate_tE@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgExSt12_Ios_Seekdir@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5tellgEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5ungetEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEij@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentryC1ERS2_b@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentryC2ERS2_b@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwiw@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7putbackEw@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE8readsomeEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRS2_S3_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt8ios_baseS4_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt9basic_iosIwS1_ES5_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERPv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERb@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERd@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERe@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERf@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERj@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERm@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERs@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERt@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERx@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERy@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE3putEw@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5flushEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpESt4fposI11__mbstate_tE@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpExSt12_Ios_Seekdir@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5tellpEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC1ERS2_@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC2ERS2_@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE8_M_writeEPKwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRS2_S3_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt8ios_baseS4_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt9basic_iosIwS1_ES5_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPKv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEb@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEd@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEe@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEf@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEj@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEm@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEs@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEt@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEx@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEy@@GLIBCXX_3.4
+FUNC:_ZNSt13runtime_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt13runtime_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt13runtime_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13runtime_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13runtime_errorD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIcEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIcEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIwEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIwEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14overflow_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt14overflow_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt14overflow_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14overflow_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15_List_node_base4hookEPS_@@GLIBCXX_3.4
+FUNC:_ZNSt15_List_node_base4swapERS_S0_@@GLIBCXX_3.4
+FUNC:_ZNSt15_List_node_base6unhookEv@@GLIBCXX_3.4
+FUNC:_ZNSt15_List_node_base7reverseEv@@GLIBCXX_3.4
+FUNC:_ZNSt15_List_node_base8transferEPS_S0_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setgEPcS3_S3_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setpEPcS3_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5gbumpEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5pbumpEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetnEPci@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputcEc@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputnEPKci@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5uflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6sbumpcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPci@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6snextcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7pubsyncEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7sungetcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8in_availEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8overflowEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8pubimbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9pubsetbufEPci@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9sputbackcEc@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC1ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC2ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEaSERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4setgEPwS3_S3_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4setpEPwS3_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5gbumpEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5pbumpEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetnEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sputcEw@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sputnEPKwi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5uflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6sbumpcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6setbufEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6snextcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7pubsyncEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7sungetcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8in_availEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8overflowEj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8pubimbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9pbackfailEj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9pubsetbufEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9showmanycEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9sputbackcEw@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC1ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC2ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEaSERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE15_M_update_egptrEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPci@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7_M_syncEPcjj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8overflowEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9pbackfailEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE15_M_update_egptrEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE6setbufEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7_M_syncEPwjj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE8overflowEj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9pbackfailEj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIcEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIcEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIwEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIwEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIcEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIcEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIwEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIwEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15underflow_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt15underflow_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt15underflow_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15underflow_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16invalid_argumentC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt16invalid_argumentC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt16invalid_argumentD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16invalid_argumentD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIcEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIcEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIwEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIwEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb0EEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb0EEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb1EEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb1EEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb0EEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb0EEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb1EEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb1EEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcE13classic_tableEv@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcEC1EP15__locale_structPKtbj@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcEC1EPKtbj@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcEC2EP15__locale_structPKtbj@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcEC2EPKtbj@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwE19_M_initialize_ctypeEv@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwEC1EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwEC2EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6gslice8_IndexerC1EjRKSt8valarrayIjES4_@@GLIBCXX_3.4
+FUNC:_ZNSt6gslice8_IndexerC2EjRKSt8valarrayIjES4_@@GLIBCXX_3.4
+FUNC:_ZNSt6locale11_M_coalesceERKS_S1_i@@GLIBCXX_3.4
+FUNC:_ZNSt6locale21_S_normalize_categoryEi@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_Impl16_M_install_facetEPKNS_2idEPKNS_5facetE@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_Impl16_M_replace_facetEPKS0_PKNS_2idE@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_Impl19_M_replace_categoryEPKS0_PKPKNS_2idE@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_Impl21_M_replace_categoriesEPKS0_i@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC1ERKS0_j@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC2ERKS0_j@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facet15_S_get_c_localeEv@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facet17_S_clone_c_localeERP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facet18_S_create_c_localeERP15__locale_structPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facet19_S_destroy_c_localeERP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facetD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facetD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facetD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6locale6globalERKS_@@GLIBCXX_3.4
+FUNC:_ZNSt6locale7classicEv@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1EPKc@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1EPNS_5_ImplE@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1ERKS_PKci@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1ERKS_S1_i@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2EPKc@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2EPNS_5_ImplE@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2ERKS_PKci@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2ERKS_S1_i@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6localeD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6localeD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6localeaSERKS_@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC1EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC2EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC1EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC2EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcEC1EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcEC2EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwEC1EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwEC2EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8bad_castD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8bad_castD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8bad_castD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base13_M_grow_wordsEib@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base15sync_with_stdioEb@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base17register_callbackEPFvNS_5eventERS_iEi@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base4InitC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base4InitD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base6xallocEv@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7_M_initEv@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7failureC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7failureC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7failureD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7failureD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7failureD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_baseC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_baseC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_baseD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_baseD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_baseD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcE22_M_initialize_numpunctEP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC1EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC1EPSt16__numpunct_cacheIcEj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC2EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC2EPSt16__numpunct_cacheIcEj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwE22_M_initialize_numpunctEP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC1EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC1EPSt16__numpunct_cacheIwEj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC2EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC2EPSt16__numpunct_cacheIwEj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayIjEC1ERKS0_@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayIjEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayIjEC2ERKS0_@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayIjEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayIjED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayIjED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayIjEixEj@@GLIBCXX_3.4
+FUNC:_ZNSt9bad_allocD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9bad_allocD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9bad_allocD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE10exceptionsESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE11_M_setstateESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE15_M_cache_localeERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE3tieEPSo@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4fillEc@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5rdbufEPSt15basic_streambufIcS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE7copyfmtERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE8setstateESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1EPSt15basic_streambufIcS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC2EPSt15basic_streambufIcS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE10exceptionsESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE11_M_setstateESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE15_M_cache_localeERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE3tieEPSt13basic_ostreamIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4fillEw@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5clearESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5rdbufEPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE7copyfmtERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE8setstateESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9exceptionD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9exceptionD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9exceptionD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9strstream3strEv@@GLIBCXX_3.4
+FUNC:_ZNSt9strstream6freezeEb@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamC1EPciSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamC2EPciSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9type_infoD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9type_infoD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9type_infoD2Ev@@GLIBCXX_3.4
+FUNC:_ZSt10unexpectedv@@GLIBCXX_3.4
+FUNC:_ZSt13set_terminatePFvvE@@GLIBCXX_3.4
+FUNC:_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZSt14__convert_to_vIfEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZSt14set_unexpectedPFvvE@@GLIBCXX_3.4
+FUNC:_ZSt15set_new_handlerPFvvE@@GLIBCXX_3.4
+FUNC:_ZSt16__throw_bad_castv@@GLIBCXX_3.4
+FUNC:_ZSt17__throw_bad_allocv@@GLIBCXX_3.4
+FUNC:_ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base@@GLIBCXX_3.4
+FUNC:_ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base@@GLIBCXX_3.4
+FUNC:_ZSt18_Rb_tree_incrementPKSt18_Rb_tree_node_base@@GLIBCXX_3.4
+FUNC:_ZSt18_Rb_tree_incrementPSt18_Rb_tree_node_base@@GLIBCXX_3.4
+FUNC:_ZSt18__throw_bad_typeidv@@GLIBCXX_3.4
+FUNC:_ZSt18uncaught_exceptionv@@GLIBCXX_3.4
+FUNC:_ZSt19__throw_ios_failurePKc@@GLIBCXX_3.4
+FUNC:_ZSt19__throw_logic_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt19__throw_range_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt20_Rb_tree_black_countPKSt18_Rb_tree_node_baseS1_@@GLIBCXX_3.4
+FUNC:_ZSt20_Rb_tree_rotate_leftPSt18_Rb_tree_node_baseRS0_@@GLIBCXX_3.4
+FUNC:_ZSt20__throw_domain_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt20__throw_length_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt20__throw_out_of_rangePKc@@GLIBCXX_3.4
+FUNC:_ZSt21_Rb_tree_rotate_rightPSt18_Rb_tree_node_baseRS0_@@GLIBCXX_3.4
+FUNC:_ZSt21__throw_bad_exceptionv@@GLIBCXX_3.4
+FUNC:_ZSt21__throw_runtime_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt22__throw_overflow_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt23__throw_underflow_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt24__throw_invalid_argumentPKc@@GLIBCXX_3.4
+FUNC:_ZSt28_Rb_tree_rebalance_for_erasePSt18_Rb_tree_node_baseRS_@@GLIBCXX_3.4
+FUNC:_ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS_@@GLIBCXX_3.4
+FUNC:_ZSt2wsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt2wsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt4endlIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt4endsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt4endsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt5flushIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt5flushIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCXX_3.4
+FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt10moneypunctIcLb0EEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt10moneypunctIwLb0EEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt11__timepunctIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt11__timepunctIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt5ctypeIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt5ctypeIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7codecvtIcc11__mbstate_tEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7codecvtIwc11__mbstate_tEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7collateIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7collateIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8messagesIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8messagesIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8numpunctIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8numpunctIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9terminatev@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt10moneypunctIcLb0EEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt10moneypunctIcLb1EEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt10moneypunctIwLb0EEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt10moneypunctIwLb1EEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt11__timepunctIcEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt11__timepunctIwEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt5ctypeIcEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt5ctypeIwEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7codecvtIcc11__mbstate_tEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7codecvtIwc11__mbstate_tEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7collateIcEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7collateIwEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8messagesIcEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8messagesIwEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8numpunctIcEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8numpunctIwEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKa@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKh@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_a@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_h@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St12_Setiosflags@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St13_Setprecision@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St5_Setw@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZStlsIdcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIdwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIecSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIewSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIfcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIfwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKS3_@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKc@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_S3_@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St12_Setiosflags@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St13_Setprecision@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St5_Setw@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_c@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwESaIwEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_@@GLIBCXX_3.4
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_@@GLIBCXX_3.4
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ES3_RKS6_@@GLIBCXX_3.4
+FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_EPKS3_RKS6_@@GLIBCXX_3.4
+FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_ERKS6_S8_@@GLIBCXX_3.4
+FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_ES3_RKS6_@@GLIBCXX_3.4
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Pa@@GLIBCXX_3.4
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ph@@GLIBCXX_3.4
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ra@@GLIBCXX_3.4
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Rh@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_PS3_@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_RS3_@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St12_Setiosflags@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St13_Setprecision@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St5_Setw@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZStrsIdcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIdwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIecSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIewSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIfcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIfwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_PS3_@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_RS3_@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St12_Setiosflags@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St13_Setprecision@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St5_Setw@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZThn8_NSdD0Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSdD1Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt9strstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt9strstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSdD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSdD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSiD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSiD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSoD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSoD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt10istrstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt10istrstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt10ostrstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt10ostrstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt9strstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt9strstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZdaPv@@GLIBCXX_3.4
+FUNC:_ZdaPvRKSt9nothrow_t@@GLIBCXX_3.4
+FUNC:_ZdlPv@@GLIBCXX_3.4
+FUNC:_ZdlPvRKSt9nothrow_t@@GLIBCXX_3.4
+FUNC:_Znaj@@GLIBCXX_3.4
+FUNC:_ZnajRKSt9nothrow_t@@GLIBCXX_3.4
+FUNC:_Znwj@@GLIBCXX_3.4
+FUNC:_ZnwjRKSt9nothrow_t@@GLIBCXX_3.4
+FUNC:__cxa_allocate_exception@@CXXABI_1.3
+FUNC:__cxa_bad_cast@@CXXABI_1.3
+FUNC:__cxa_bad_typeid@@CXXABI_1.3
+FUNC:__cxa_begin_catch@@CXXABI_1.3
+FUNC:__cxa_call_unexpected@@CXXABI_1.3
+FUNC:__cxa_current_exception_type@@CXXABI_1.3
+FUNC:__cxa_demangle@@CXXABI_1.3
+FUNC:__cxa_end_catch@@CXXABI_1.3
+FUNC:__cxa_free_exception@@CXXABI_1.3
+FUNC:__cxa_get_globals@@CXXABI_1.3
+FUNC:__cxa_get_globals_fast@@CXXABI_1.3
+FUNC:__cxa_guard_abort@@CXXABI_1.3
+FUNC:__cxa_guard_acquire@@CXXABI_1.3
+FUNC:__cxa_guard_release@@CXXABI_1.3
+FUNC:__cxa_pure_virtual@@CXXABI_1.3
+FUNC:__cxa_rethrow@@CXXABI_1.3
+FUNC:__cxa_throw@@CXXABI_1.3
+FUNC:__cxa_vec_cctor@@CXXABI_1.3
+FUNC:__cxa_vec_cleanup@@CXXABI_1.3
+FUNC:__cxa_vec_ctor@@CXXABI_1.3
+FUNC:__cxa_vec_delete2@@CXXABI_1.3
+FUNC:__cxa_vec_delete3@@CXXABI_1.3
+FUNC:__cxa_vec_delete@@CXXABI_1.3
+FUNC:__cxa_vec_dtor@@CXXABI_1.3
+FUNC:__cxa_vec_new2@@CXXABI_1.3
+FUNC:__cxa_vec_new3@@CXXABI_1.3
+FUNC:__cxa_vec_new@@CXXABI_1.3
+FUNC:__dynamic_cast@@CXXABI_1.3
+FUNC:__gxx_personality_v0@@CXXABI_1.3
+FUNC:atan2l@@GLIBCXX_3.4
+FUNC:coshl@@GLIBCXX_3.4
+FUNC:cosl@@GLIBCXX_3.4
+FUNC:expl@@GLIBCXX_3.4
+FUNC:hypotl@@GLIBCXX_3.4
+FUNC:log10l@@GLIBCXX_3.4
+FUNC:logl@@GLIBCXX_3.4
+FUNC:powl@@GLIBCXX_3.4
+FUNC:sinhl@@GLIBCXX_3.4
+FUNC:sinl@@GLIBCXX_3.4
+FUNC:sqrtl@@GLIBCXX_3.4
+FUNC:tanhl@@GLIBCXX_3.4
+FUNC:tanl@@GLIBCXX_3.4
+OBJECT:0:CXXABI_1.3
+OBJECT:0:GLIBCXX_3.4
+OBJECT:12:_ZTIN10__cxxabiv116__enum_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv117__array_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv117__pbase_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv119__pointer_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv120__function_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv120__si_class_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv121__vmi_class_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv123__fundamental_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv129__pointer_to_member_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTIN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTIN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTIN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTINSt8ios_base7failureE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt10bad_typeid@@GLIBCXX_3.4
+OBJECT:12:_ZTISt10istrstream@@GLIBCXX_3.4
+OBJECT:12:_ZTISt10ostrstream@@GLIBCXX_3.4
+OBJECT:12:_ZTISt11__timepunctIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt11__timepunctIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt11logic_error@@GLIBCXX_3.4
+OBJECT:12:_ZTISt11range_error@@GLIBCXX_3.4
+OBJECT:12:_ZTISt12ctype_bynameIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt12ctype_bynameIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt12domain_error@@GLIBCXX_3.4
+OBJECT:12:_ZTISt12length_error@@GLIBCXX_3.4
+OBJECT:12:_ZTISt12out_of_range@@GLIBCXX_3.4
+OBJECT:12:_ZTISt12strstreambuf@@GLIBCXX_3.4
+OBJECT:12:_ZTISt13bad_exception@@GLIBCXX_3.4
+OBJECT:12:_ZTISt13basic_filebufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt13basic_filebufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt13runtime_error@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14codecvt_bynameIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14codecvt_bynameIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14collate_bynameIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14collate_bynameIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14overflow_error@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15messages_bynameIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15messages_bynameIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15numpunct_bynameIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15numpunct_bynameIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15underflow_error@@GLIBCXX_3.4
+OBJECT:12:_ZTISt16invalid_argument@@GLIBCXX_3.4
+OBJECT:12:_ZTISt17moneypunct_bynameIcLb0EE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt17moneypunct_bynameIcLb1EE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt17moneypunct_bynameIwLb0EE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt17moneypunct_bynameIwLb1EE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt5ctypeIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7codecvtIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7codecvtIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7collateIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7collateIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt8bad_cast@@GLIBCXX_3.4
+OBJECT:12:_ZTISt8numpunctIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt8numpunctIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9bad_alloc@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9basic_iosIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9basic_iosIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9strstream@@GLIBCXX_3.4
+OBJECT:12:_ZTSSt5ctypeIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTSSt5ctypeIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTSSt8bad_cast@@GLIBCXX_3.4
+OBJECT:12:_ZTSSt8ios_base@@GLIBCXX_3.4
+OBJECT:13:_ZTSSt9bad_alloc@@GLIBCXX_3.4
+OBJECT:13:_ZTSSt9exception@@GLIBCXX_3.4
+OBJECT:13:_ZTSSt9strstream@@GLIBCXX_3.4
+OBJECT:13:_ZTSSt9time_base@@GLIBCXX_3.4
+OBJECT:13:_ZTSSt9type_info@@GLIBCXX_3.4
+OBJECT:140:_ZSt4cerr@@GLIBCXX_3.4
+OBJECT:140:_ZSt4clog@@GLIBCXX_3.4
+OBJECT:140:_ZSt4cout@@GLIBCXX_3.4
+OBJECT:144:_ZSt3cin@@GLIBCXX_3.4
+OBJECT:144:_ZSt5wcerr@@GLIBCXX_3.4
+OBJECT:144:_ZSt5wclog@@GLIBCXX_3.4
+OBJECT:144:_ZSt5wcout@@GLIBCXX_3.4
+OBJECT:148:_ZSt4wcin@@GLIBCXX_3.4
+OBJECT:14:_ZTSSt7collateIcE@@GLIBCXX_3.4
+OBJECT:14:_ZTSSt7collateIwE@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt10bad_typeid@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt10ctype_base@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt10istrstream@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt10money_base@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt10ostrstream@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt8messagesIcE@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt8messagesIwE@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt8numpunctIcE@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt8numpunctIwE@@GLIBCXX_3.4
+OBJECT:16:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4
+OBJECT:16:_ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4
+OBJECT:16:_ZTIPKa@@CXXABI_1.3
+OBJECT:16:_ZTIPKb@@CXXABI_1.3
+OBJECT:16:_ZTIPKc@@CXXABI_1.3
+OBJECT:16:_ZTIPKd@@CXXABI_1.3
+OBJECT:16:_ZTIPKe@@CXXABI_1.3
+OBJECT:16:_ZTIPKf@@CXXABI_1.3
+OBJECT:16:_ZTIPKh@@CXXABI_1.3
+OBJECT:16:_ZTIPKi@@CXXABI_1.3
+OBJECT:16:_ZTIPKj@@CXXABI_1.3
+OBJECT:16:_ZTIPKl@@CXXABI_1.3
+OBJECT:16:_ZTIPKm@@CXXABI_1.3
+OBJECT:16:_ZTIPKs@@CXXABI_1.3
+OBJECT:16:_ZTIPKt@@CXXABI_1.3
+OBJECT:16:_ZTIPKv@@CXXABI_1.3
+OBJECT:16:_ZTIPKw@@CXXABI_1.3
+OBJECT:16:_ZTIPKx@@CXXABI_1.3
+OBJECT:16:_ZTIPKy@@CXXABI_1.3
+OBJECT:16:_ZTIPa@@CXXABI_1.3
+OBJECT:16:_ZTIPb@@CXXABI_1.3
+OBJECT:16:_ZTIPc@@CXXABI_1.3
+OBJECT:16:_ZTIPd@@CXXABI_1.3
+OBJECT:16:_ZTIPe@@CXXABI_1.3
+OBJECT:16:_ZTIPf@@CXXABI_1.3
+OBJECT:16:_ZTIPh@@CXXABI_1.3
+OBJECT:16:_ZTIPi@@CXXABI_1.3
+OBJECT:16:_ZTIPj@@CXXABI_1.3
+OBJECT:16:_ZTIPl@@CXXABI_1.3
+OBJECT:16:_ZTIPm@@CXXABI_1.3
+OBJECT:16:_ZTIPs@@CXXABI_1.3
+OBJECT:16:_ZTIPt@@CXXABI_1.3
+OBJECT:16:_ZTIPv@@CXXABI_1.3
+OBJECT:16:_ZTIPw@@CXXABI_1.3
+OBJECT:16:_ZTIPx@@CXXABI_1.3
+OBJECT:16:_ZTIPy@@CXXABI_1.3
+OBJECT:16:_ZTSSt11logic_error@@GLIBCXX_3.4
+OBJECT:16:_ZTSSt11range_error@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt10istrstream@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt10ostrstream@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:16:_ZTVNSt6locale5facetE@@GLIBCXX_3.4
+OBJECT:16:_ZTVSt11__timepunctIcE@@GLIBCXX_3.4
+OBJECT:16:_ZTVSt11__timepunctIwE@@GLIBCXX_3.4
+OBJECT:16:_ZTVSt8ios_base@@GLIBCXX_3.4
+OBJECT:16:_ZTVSt9basic_iosIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:16:_ZTVSt9basic_iosIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:17:_ZTSSt12codecvt_base@@GLIBCXX_3.4
+OBJECT:17:_ZTSSt12domain_error@@GLIBCXX_3.4
+OBJECT:17:_ZTSSt12length_error@@GLIBCXX_3.4
+OBJECT:17:_ZTSSt12out_of_range@@GLIBCXX_3.4
+OBJECT:17:_ZTSSt12strstreambuf@@GLIBCXX_3.4
+OBJECT:18:_ZTSNSt6locale5facetE@@GLIBCXX_3.4
+OBJECT:18:_ZTSSt13bad_exception@@GLIBCXX_3.4
+OBJECT:18:_ZTSSt13messages_base@@GLIBCXX_3.4
+OBJECT:18:_ZTSSt13runtime_error@@GLIBCXX_3.4
+OBJECT:19:_ZTSSt11__timepunctIcE@@GLIBCXX_3.4
+OBJECT:19:_ZTSSt11__timepunctIwE@@GLIBCXX_3.4
+OBJECT:19:_ZTSSt14overflow_error@@GLIBCXX_3.4
+OBJECT:1:_ZNSs4_Rep11_S_terminalE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt10moneypunctIcLb0EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt10moneypunctIcLb1EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt10moneypunctIwLb0EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt10moneypunctIwLb1EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt17moneypunct_bynameIcLb0EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt17moneypunct_bynameIcLb1EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt17moneypunct_bynameIwLb0EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt17moneypunct_bynameIwLb1EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZSt7nothrow@@GLIBCXX_3.4
+OBJECT:20:_ZTSSt12ctype_bynameIcE@@GLIBCXX_3.4
+OBJECT:20:_ZTSSt12ctype_bynameIwE@@GLIBCXX_3.4
+OBJECT:20:_ZTSSt15underflow_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVNSt8ios_base7failureE@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt10bad_typeid@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt11logic_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt11range_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt12domain_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt12length_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt12out_of_range@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt13bad_exception@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt13runtime_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt14overflow_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt15underflow_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt16invalid_argument@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt8bad_cast@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt9bad_alloc@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt9exception@@GLIBCXX_3.4
+OBJECT:21:_ZTSSt16invalid_argument@@GLIBCXX_3.4
+OBJECT:22:_ZTSNSt8ios_base7failureE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt10moneypunctIcLb0EE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt10moneypunctIcLb1EE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt10moneypunctIwLb0EE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt10moneypunctIwLb1EE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt14collate_bynameIcE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt14collate_bynameIwE@@GLIBCXX_3.4
+OBJECT:23:_ZTSSt15messages_bynameIcE@@GLIBCXX_3.4
+OBJECT:23:_ZTSSt15messages_bynameIwE@@GLIBCXX_3.4
+OBJECT:23:_ZTSSt15numpunct_bynameIcE@@GLIBCXX_3.4
+OBJECT:23:_ZTSSt15numpunct_bynameIwE@@GLIBCXX_3.4
+OBJECT:24:_ZTISi@@GLIBCXX_3.4
+OBJECT:24:_ZTISo@@GLIBCXX_3.4
+OBJECT:24:_ZTISt13basic_istreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:24:_ZTVSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTVSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTVSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTVSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:28:_ZTSSt7codecvtIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:28:_ZTSSt7codecvtIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:28:_ZTTSd@@GLIBCXX_3.4
+OBJECT:28:_ZTTSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt14collate_bynameIcE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt14collate_bynameIwE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt15messages_bynameIcE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt15messages_bynameIwE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt7collateIcE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt7collateIwE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt8messagesIcE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt8messagesIwE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt17moneypunct_bynameIcLb0EE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt17moneypunct_bynameIcLb1EE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt17moneypunct_bynameIwLb0EE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt17moneypunct_bynameIwLb1EE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt21__ctype_abstract_baseIcE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt21__ctype_abstract_baseIwE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5alnumE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5alphaE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5cntrlE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5digitE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5graphE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5lowerE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5printE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5punctE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5spaceE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5upperE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base6xdigitE@@GLIBCXX_3.4
+OBJECT:2:_ZTSa@@CXXABI_1.3
+OBJECT:2:_ZTSb@@CXXABI_1.3
+OBJECT:2:_ZTSc@@CXXABI_1.3
+OBJECT:2:_ZTSd@@CXXABI_1.3
+OBJECT:2:_ZTSe@@CXXABI_1.3
+OBJECT:2:_ZTSf@@CXXABI_1.3
+OBJECT:2:_ZTSh@@CXXABI_1.3
+OBJECT:2:_ZTSi@@CXXABI_1.3
+OBJECT:2:_ZTSj@@CXXABI_1.3
+OBJECT:2:_ZTSl@@CXXABI_1.3
+OBJECT:2:_ZTSm@@CXXABI_1.3
+OBJECT:2:_ZTSs@@CXXABI_1.3
+OBJECT:2:_ZTSt@@CXXABI_1.3
+OBJECT:2:_ZTSv@@CXXABI_1.3
+OBJECT:2:_ZTSw@@CXXABI_1.3
+OBJECT:2:_ZTSx@@CXXABI_1.3
+OBJECT:2:_ZTSy@@CXXABI_1.3
+OBJECT:32:_ZTISd@@GLIBCXX_3.4
+OBJECT:32:_ZTISt10moneypunctIcLb0EE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt10moneypunctIcLb1EE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt10moneypunctIwLb0EE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt10moneypunctIwLb1EE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt21__ctype_abstract_baseIcE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt21__ctype_abstract_baseIwE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt5ctypeIcE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt8messagesIcE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt8messagesIwE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:32:_ZTVN10__cxxabiv116__enum_type_infoE@@CXXABI_1.3
+OBJECT:32:_ZTVN10__cxxabiv117__array_type_infoE@@CXXABI_1.3
+OBJECT:32:_ZTVN10__cxxabiv120__function_type_infoE@@CXXABI_1.3
+OBJECT:32:_ZTVN10__cxxabiv123__fundamental_type_infoE@@CXXABI_1.3
+OBJECT:32:_ZTVSt9type_info@@GLIBCXX_3.4
+OBJECT:33:_ZTSN10__cxxabiv116__enum_type_infoE@@CXXABI_1.3
+OBJECT:34:_ZTSN10__cxxabiv117__array_type_infoE@@CXXABI_1.3
+OBJECT:34:_ZTSN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
+OBJECT:34:_ZTSN10__cxxabiv117__pbase_type_infoE@@CXXABI_1.3
+OBJECT:34:_ZTSSt9basic_iosIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:34:_ZTSSt9basic_iosIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:36:_ZTSN10__cxxabiv119__pointer_type_infoE@@CXXABI_1.3
+OBJECT:36:_ZTSSt14codecvt_bynameIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:36:_ZTSSt14codecvt_bynameIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:36:_ZTVN10__cxxabiv117__pbase_type_infoE@@CXXABI_1.3
+OBJECT:36:_ZTVN10__cxxabiv119__pointer_type_infoE@@CXXABI_1.3
+OBJECT:36:_ZTVN10__cxxabiv129__pointer_to_member_type_infoE@@CXXABI_1.3
+OBJECT:36:_ZTVSt15numpunct_bynameIcE@@GLIBCXX_3.4
+OBJECT:36:_ZTVSt15numpunct_bynameIwE@@GLIBCXX_3.4
+OBJECT:36:_ZTVSt8numpunctIcE@@GLIBCXX_3.4
+OBJECT:36:_ZTVSt8numpunctIwE@@GLIBCXX_3.4
+OBJECT:37:_ZTSN10__cxxabiv120__function_type_infoE@@CXXABI_1.3
+OBJECT:37:_ZTSN10__cxxabiv120__si_class_type_infoE@@CXXABI_1.3
+OBJECT:38:_ZTSN10__cxxabiv121__vmi_class_type_infoE@@CXXABI_1.3
+OBJECT:39:_ZTSSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:39:_ZTSSt13basic_filebufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:39:_ZTSSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:39:_ZTSSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:39:_ZTSSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:39:_ZTSSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:3:_ZTSPa@@CXXABI_1.3
+OBJECT:3:_ZTSPb@@CXXABI_1.3
+OBJECT:3:_ZTSPc@@CXXABI_1.3
+OBJECT:3:_ZTSPd@@CXXABI_1.3
+OBJECT:3:_ZTSPe@@CXXABI_1.3
+OBJECT:3:_ZTSPf@@CXXABI_1.3
+OBJECT:3:_ZTSPh@@CXXABI_1.3
+OBJECT:3:_ZTSPi@@CXXABI_1.3
+OBJECT:3:_ZTSPj@@CXXABI_1.3
+OBJECT:3:_ZTSPl@@CXXABI_1.3
+OBJECT:3:_ZTSPm@@CXXABI_1.3
+OBJECT:3:_ZTSPs@@CXXABI_1.3
+OBJECT:3:_ZTSPt@@CXXABI_1.3
+OBJECT:3:_ZTSPv@@CXXABI_1.3
+OBJECT:3:_ZTSPw@@CXXABI_1.3
+OBJECT:3:_ZTSPx@@CXXABI_1.3
+OBJECT:3:_ZTSPy@@CXXABI_1.3
+OBJECT:3:_ZTSSd@@GLIBCXX_3.4
+OBJECT:3:_ZTSSi@@GLIBCXX_3.4
+OBJECT:3:_ZTSSo@@GLIBCXX_3.4
+OBJECT:40:_ZTSN10__cxxabiv123__fundamental_type_infoE@@CXXABI_1.3
+OBJECT:40:_ZTSSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTSSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTSSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTSSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTSSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTTSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTTSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTTSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTTSt9strstream@@GLIBCXX_3.4
+OBJECT:40:_ZTVSi@@GLIBCXX_3.4
+OBJECT:40:_ZTVSo@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt10istrstream@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt10ostrstream@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:41:_ZTSSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:41:_ZTSSt15basic_streambufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:44:_ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
+OBJECT:44:_ZTVN10__cxxabiv120__si_class_type_infoE@@CXXABI_1.3
+OBJECT:44:_ZTVN10__cxxabiv121__vmi_class_type_infoE@@CXXABI_1.3
+OBJECT:44:_ZTVSt14codecvt_bynameIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:44:_ZTVSt14codecvt_bynameIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:44:_ZTVSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:44:_ZTVSt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:44:_ZTVSt7codecvtIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:44:_ZTVSt7codecvtIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:45:_ZTSSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:45:_ZTSSt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:46:_ZTSN10__cxxabiv129__pointer_to_member_type_infoE@@CXXABI_1.3
+OBJECT:46:_ZTSSt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:46:_ZTSSt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:48:_ZTVSt12ctype_bynameIcE@@GLIBCXX_3.4
+OBJECT:48:_ZTVSt5ctypeIcE@@GLIBCXX_3.4
+OBJECT:48:_ZTVSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:48:_ZTVSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:49:_ZTSN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:49:_ZTSN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:49:_ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:49:_ZTSSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:4:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_max_sizeE@@GLIBCXX_3.4
+OBJECT:4:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_terminalE@@GLIBCXX_3.4
+OBJECT:4:_ZNSbIwSt11char_traitsIwESaIwEE4nposE@@GLIBCXX_3.4
+OBJECT:4:_ZNSs4_Rep11_S_max_sizeE@@GLIBCXX_3.4
+OBJECT:4:_ZNSs4nposE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10__num_base11_S_atoms_inE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10__num_base12_S_atoms_outE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10money_base18_S_default_patternE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10money_base8_S_atomsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10moneypunctIcLb0EE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10moneypunctIcLb1EE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10moneypunctIwLb0EE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10moneypunctIwLb1EE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt11__timepunctIcE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt11__timepunctIwE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt5ctypeIcE10table_sizeE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt5ctypeIcE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt5ctypeIwE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale3allE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale4noneE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale4timeE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale5ctypeE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale7collateE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale7numericE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale8messagesE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale8monetaryE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7codecvtIcc11__mbstate_tE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7codecvtIwc11__mbstate_tE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7collateIcE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7collateIwE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base10floatfieldE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base10scientificE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base11adjustfieldE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base2inE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3appE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3ateE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3begE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3curE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3decE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3endE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3hexE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3octE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3outE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base4leftE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base5fixedE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base5rightE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base5truncE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base6badbitE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base6binaryE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base6eofbitE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base6skipwsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base7failbitE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base7goodbitE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base7showposE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base7unitbufE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base8internalE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base8showbaseE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base9basefieldE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base9boolalphaE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base9showpointE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base9uppercaseE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8messagesIcE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8messagesIwE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8numpunctIcE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8numpunctIwE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZTSPKa@@CXXABI_1.3
+OBJECT:4:_ZTSPKb@@CXXABI_1.3
+OBJECT:4:_ZTSPKc@@CXXABI_1.3
+OBJECT:4:_ZTSPKd@@CXXABI_1.3
+OBJECT:4:_ZTSPKe@@CXXABI_1.3
+OBJECT:4:_ZTSPKf@@CXXABI_1.3
+OBJECT:4:_ZTSPKh@@CXXABI_1.3
+OBJECT:4:_ZTSPKi@@CXXABI_1.3
+OBJECT:4:_ZTSPKj@@CXXABI_1.3
+OBJECT:4:_ZTSPKl@@CXXABI_1.3
+OBJECT:4:_ZTSPKm@@CXXABI_1.3
+OBJECT:4:_ZTSPKs@@CXXABI_1.3
+OBJECT:4:_ZTSPKt@@CXXABI_1.3
+OBJECT:4:_ZTSPKv@@CXXABI_1.3
+OBJECT:4:_ZTSPKw@@CXXABI_1.3
+OBJECT:4:_ZTSPKx@@CXXABI_1.3
+OBJECT:4:_ZTSPKy@@CXXABI_1.3
+OBJECT:50:_ZTSSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:50:_ZTSSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:50:_ZTSSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:50:_ZTSSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt10moneypunctIcLb0EE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt10moneypunctIcLb1EE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt10moneypunctIwLb0EE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt10moneypunctIwLb1EE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt17moneypunct_bynameIcLb0EE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt17moneypunct_bynameIcLb1EE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt17moneypunct_bynameIwLb0EE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt17moneypunct_bynameIwLb1EE@@GLIBCXX_3.4
+OBJECT:54:_ZTSN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:54:_ZTSN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:56:_ZNSt17__timepunct_cacheIcE12_S_timezonesE@@GLIBCXX_3.4
+OBJECT:56:_ZNSt17__timepunct_cacheIwE12_S_timezonesE@@GLIBCXX_3.4
+OBJECT:58:_ZTSSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:58:_ZTSSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:58:_ZTSSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:58:_ZTSSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:59:_ZTSSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:59:_ZTSSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:59:_ZTSSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:59:_ZTSSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTSSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTSSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTSSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTSSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSd@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt9strstream@@GLIBCXX_3.4
+OBJECT:64:_ZTVN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt12ctype_bynameIwE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt12strstreambuf@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt13basic_filebufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt15basic_streambufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt21__ctype_abstract_baseIcE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt21__ctype_abstract_baseIwE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt5ctypeIwE@@GLIBCXX_3.4
+OBJECT:67:_ZTSSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:67:_ZTSSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:67:_ZTSSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:67:_ZTSSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt10moneypunctIcLb0EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt10moneypunctIcLb1EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt10moneypunctIwLb0EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt10moneypunctIwLb1EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt11__timepunctIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt11__timepunctIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7collateIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7collateIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8messagesIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8messagesIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8numpunctIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8numpunctIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZTINSt6locale5facetE@@GLIBCXX_3.4
+OBJECT:8:_ZTISt10ctype_base@@GLIBCXX_3.4
+OBJECT:8:_ZTISt10money_base@@GLIBCXX_3.4
+OBJECT:8:_ZTISt12codecvt_base@@GLIBCXX_3.4
+OBJECT:8:_ZTISt13messages_base@@GLIBCXX_3.4
+OBJECT:8:_ZTISt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:8:_ZTISt15basic_streambufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:8:_ZTISt8ios_base@@GLIBCXX_3.4
+OBJECT:8:_ZTISt9exception@@GLIBCXX_3.4
+OBJECT:8:_ZTISt9time_base@@GLIBCXX_3.4
+OBJECT:8:_ZTISt9type_info@@GLIBCXX_3.4
+OBJECT:8:_ZTIa@@CXXABI_1.3
+OBJECT:8:_ZTIb@@CXXABI_1.3
+OBJECT:8:_ZTIc@@CXXABI_1.3
+OBJECT:8:_ZTId@@CXXABI_1.3
+OBJECT:8:_ZTIe@@CXXABI_1.3
+OBJECT:8:_ZTIf@@CXXABI_1.3
+OBJECT:8:_ZTIh@@CXXABI_1.3
+OBJECT:8:_ZTIi@@CXXABI_1.3
+OBJECT:8:_ZTIj@@CXXABI_1.3
+OBJECT:8:_ZTIl@@CXXABI_1.3
+OBJECT:8:_ZTIm@@CXXABI_1.3
+OBJECT:8:_ZTIs@@CXXABI_1.3
+OBJECT:8:_ZTIt@@CXXABI_1.3
+OBJECT:8:_ZTIv@@CXXABI_1.3
+OBJECT:8:_ZTIw@@CXXABI_1.3
+OBJECT:8:_ZTIx@@CXXABI_1.3
+OBJECT:8:_ZTIy@@CXXABI_1.3
+OBJECT:8:_ZTTSi@@GLIBCXX_3.4
+OBJECT:8:_ZTTSo@@GLIBCXX_3.4
+OBJECT:8:_ZTTSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:8:_ZTTSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
diff --git a/libstdc++-v3/config/abi/powerpc64-linux-gnu/32/nof/baseline_symbols.txt b/libstdc++-v3/config/abi/powerpc64-linux-gnu/32/nof/baseline_symbols.txt
new file mode 100644
index 00000000000..f93151155c6
--- /dev/null
+++ b/libstdc++-v3/config/abi/powerpc64-linux-gnu/32/nof/baseline_symbols.txt
@@ -0,0 +1,3083 @@
+FUNC:_ZN10__cxxabiv116__enum_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv116__enum_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv116__enum_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__array_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__array_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__array_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__class_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__class_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__class_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__pbase_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__pbase_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__pbase_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv119__pointer_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv119__pointer_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv119__pointer_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__function_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__function_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__function_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__si_class_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__si_class_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__si_class_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv121__vmi_class_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv121__vmi_class_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv121__vmi_class_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv123__fundamental_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv123__fundamental_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv123__fundamental_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv129__pointer_to_member_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv129__pointer_to_member_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv129__pointer_to_member_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__gnu_norm15_List_node_base4hookEPS0_@@GLIBCXX_3.4
+FUNC:_ZN10__gnu_norm15_List_node_base4swapERS0_S1_@@GLIBCXX_3.4
+FUNC:_ZN10__gnu_norm15_List_node_base6unhookEv@@GLIBCXX_3.4
+FUNC:_ZN10__gnu_norm15_List_node_base7reverseEv@@GLIBCXX_3.4
+FUNC:_ZN10__gnu_norm15_List_node_base8transferEPS0_S1_@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_iterator_base9_M_attachEPNS_19_Safe_sequence_baseEb@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_iterator_base9_M_detachEv@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_sequence_base13_M_detach_allEv@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_sequence_base18_M_detach_singularEv@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_sequence_base22_M_revalidate_singularEv@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_sequence_base7_M_swapERS0_@@GLIBCXX_3.4
+FUNC:_ZN9__gnu_cxx12__atomic_addEPVii@@GLIBCXX_3.4
+FUNC:_ZN9__gnu_cxx18__exchange_and_addEPVii@@GLIBCXX_3.4
+FUNC:_ZN9__gnu_cxx27__verbose_terminate_handlerEv@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__class_type_info10__do_catchEPKSt9type_infoPPvj@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PKvRNS0_15__upcast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PPv@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__class_type_info12__do_dyncastEiNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__class_type_info20__do_find_public_srcEiPKvPKS0_S2_@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__pbase_type_info10__do_catchEPKSt9type_infoPPvj@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__pbase_type_info15__pointer_catchEPKS0_PPvj@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv119__pointer_type_info14__is_pointer_pEv@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv119__pointer_type_info15__pointer_catchEPKNS_17__pbase_type_infoEPPvj@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv120__function_type_info15__is_function_pEv@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv120__si_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv120__si_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv121__vmi_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv121__vmi_class_type_info12__do_dyncastEiNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv121__vmi_class_type_info20__do_find_public_srcEiPKvPKNS_17__class_type_infoES2_@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv129__pointer_to_member_type_info15__pointer_catchEPKNS_17__pbase_type_infoEPPvj@@CXXABI_1.3
+FUNC:_ZNK11__gnu_debug16_Error_formatter10_M_messageENS_13_Debug_msg_idE@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug16_Error_formatter10_Parameter14_M_print_fieldEPKS0_PKc@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug16_Error_formatter10_Parameter20_M_print_descriptionEPKS0_@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug16_Error_formatter13_M_print_wordEPKc@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug16_Error_formatter15_M_print_stringEPKc@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug16_Error_formatter8_M_errorEv@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug19_Safe_iterator_base11_M_singularEv@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug19_Safe_iterator_base14_M_can_compareERKS0_@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofERKS2_j@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofERKS2_j@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13get_allocatorEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofERKS2_j@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofERKS2_j@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE2atEj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE3endEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_leakedEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_sharedEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4copyEPwjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4dataEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findERKS2_j@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4rendEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4sizeEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5beginEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5c_strEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5emptyEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindERKS2_j@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6_M_repEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6lengthEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6rbeginEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6substrEjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7_M_dataEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7_M_iendEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEPKw@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareERKS2_@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjPKw@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjRKS2_@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEjjRKS2_jj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8_M_checkEjPKc@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8_M_limitEjj@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8capacityEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8max_sizeEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE9_M_ibeginEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEEixEj@@GLIBCXX_3.4
+FUNC:_ZNKSi6gcountEv@@GLIBCXX_3.4
+FUNC:_ZNKSi6sentrycvbEv@@GLIBCXX_3.4
+FUNC:_ZNKSo6sentrycvbEv@@GLIBCXX_3.4
+FUNC:_ZNKSs12find_last_ofEPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSs12find_last_ofEPKcjj@@GLIBCXX_3.4
+FUNC:_ZNKSs12find_last_ofERKSsj@@GLIBCXX_3.4
+FUNC:_ZNKSs12find_last_ofEcj@@GLIBCXX_3.4
+FUNC:_ZNKSs13find_first_ofEPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSs13find_first_ofEPKcjj@@GLIBCXX_3.4
+FUNC:_ZNKSs13find_first_ofERKSsj@@GLIBCXX_3.4
+FUNC:_ZNKSs13find_first_ofEcj@@GLIBCXX_3.4
+FUNC:_ZNKSs13get_allocatorEv@@GLIBCXX_3.4
+FUNC:_ZNKSs16find_last_not_ofEPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSs16find_last_not_ofEPKcjj@@GLIBCXX_3.4
+FUNC:_ZNKSs16find_last_not_ofERKSsj@@GLIBCXX_3.4
+FUNC:_ZNKSs16find_last_not_ofEcj@@GLIBCXX_3.4
+FUNC:_ZNKSs17find_first_not_ofEPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSs17find_first_not_ofEPKcjj@@GLIBCXX_3.4
+FUNC:_ZNKSs17find_first_not_ofERKSsj@@GLIBCXX_3.4
+FUNC:_ZNKSs17find_first_not_ofEcj@@GLIBCXX_3.4
+FUNC:_ZNKSs2atEj@@GLIBCXX_3.4
+FUNC:_ZNKSs3endEv@@GLIBCXX_3.4
+FUNC:_ZNKSs4_Rep12_M_is_leakedEv@@GLIBCXX_3.4
+FUNC:_ZNKSs4_Rep12_M_is_sharedEv@@GLIBCXX_3.4
+FUNC:_ZNKSs4copyEPcjj@@GLIBCXX_3.4
+FUNC:_ZNKSs4dataEv@@GLIBCXX_3.4
+FUNC:_ZNKSs4findEPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSs4findEPKcjj@@GLIBCXX_3.4
+FUNC:_ZNKSs4findERKSsj@@GLIBCXX_3.4
+FUNC:_ZNKSs4findEcj@@GLIBCXX_3.4
+FUNC:_ZNKSs4rendEv@@GLIBCXX_3.4
+FUNC:_ZNKSs4sizeEv@@GLIBCXX_3.4
+FUNC:_ZNKSs5beginEv@@GLIBCXX_3.4
+FUNC:_ZNKSs5c_strEv@@GLIBCXX_3.4
+FUNC:_ZNKSs5emptyEv@@GLIBCXX_3.4
+FUNC:_ZNKSs5rfindEPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSs5rfindEPKcjj@@GLIBCXX_3.4
+FUNC:_ZNKSs5rfindERKSsj@@GLIBCXX_3.4
+FUNC:_ZNKSs5rfindEcj@@GLIBCXX_3.4
+FUNC:_ZNKSs6_M_repEv@@GLIBCXX_3.4
+FUNC:_ZNKSs6lengthEv@@GLIBCXX_3.4
+FUNC:_ZNKSs6rbeginEv@@GLIBCXX_3.4
+FUNC:_ZNKSs6substrEjj@@GLIBCXX_3.4
+FUNC:_ZNKSs7_M_dataEv@@GLIBCXX_3.4
+FUNC:_ZNKSs7_M_iendEv@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareEPKc@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareERKSs@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareEjjPKc@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareEjjPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareEjjRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareEjjRKSsjj@@GLIBCXX_3.4
+FUNC:_ZNKSs8_M_checkEjPKc@@GLIBCXX_3.4
+FUNC:_ZNKSs8_M_limitEjj@@GLIBCXX_3.4
+FUNC:_ZNKSs8capacityEv@@GLIBCXX_3.4
+FUNC:_ZNKSs8max_sizeEv@@GLIBCXX_3.4
+FUNC:_ZNKSs9_M_ibeginEv@@GLIBCXX_3.4
+FUNC:_ZNKSsixEj@@GLIBCXX_3.4
+FUNC:_ZNKSt10istrstream5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE10neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE10pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE11curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE11frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13do_neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13do_pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE14do_curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE14do_frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE10neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE10pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE11curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE11frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13do_neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13do_pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE14do_curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE14do_frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE10neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE10pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE11curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE11frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13do_neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13do_pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE14do_curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE14do_frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE10neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE10pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE11curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE11frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13do_neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13do_pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE14do_curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE14do_frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10ostrstream5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10ostrstream6pcountEv@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE15_M_am_pm_formatEPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE15_M_date_formatsEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE15_M_time_formatsEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE19_M_days_abbreviatedEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE20_M_date_time_formatsEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE21_M_months_abbreviatedEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE6_M_putEPcjPKcPK2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE7_M_daysEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE8_M_am_pmEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE9_M_monthsEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE15_M_am_pm_formatEPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE15_M_date_formatsEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE15_M_time_formatsEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE19_M_days_abbreviatedEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE20_M_date_time_formatsEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE21_M_months_abbreviatedEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE6_M_putEPwjPKwPK2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE7_M_daysEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE8_M_am_pmEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE9_M_monthsEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11logic_error4whatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt12__basic_fileIcE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNKSt12strstreambuf6pcountEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_filebufIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_filebufIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_fstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_fstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_istreamIwSt11char_traitsIwEE6gcountEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_istreamIwSt11char_traitsIwEE6sentrycvbEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_ostreamIwSt11char_traitsIwEE6sentrycvbEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13runtime_error4whatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt14basic_ifstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt14basic_ifstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt14basic_ofstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt14basic_ofstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE4gptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE4pptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5ebackEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5egptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5epptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5pbaseEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE6getlocEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE4gptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE4pptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5ebackEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5egptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5epptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5pbaseEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE6getlocEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_istringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE10do_tolowerEPcPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE10do_tolowerEc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE10do_toupperEPcPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE10do_toupperEc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE8do_widenEPKcS2_Pc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE8do_widenEc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE9do_narrowEPKcS2_cPc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE9do_narrowEcc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE10do_scan_isEtPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE10do_tolowerEPwPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE10do_tolowerEw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE10do_toupperEPwPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE10do_toupperEw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE11do_scan_notEtPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE19_M_convert_to_wmaskEt@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE5do_isEPKwS2_Pt@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE5do_isEtw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE8do_widenEPKcS2_Pw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE8do_widenEc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE9do_narrowEPKwS2_cPc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE9do_narrowEwc@@GLIBCXX_3.4
+FUNC:_ZNKSt6locale2id5_M_idEv@@GLIBCXX_3.4
+FUNC:_ZNKSt6locale4nameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt6localeeqERKS_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE11do_encodingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE13do_max_lengthEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE16do_always_noconvEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE5do_inERS0_PKcS4_RS4_PcS6_RS6_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE6do_outERS0_PKcS4_RS4_PcS6_RS6_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE9do_lengthERS0_PKcS4_j@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE11do_encodingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE13do_max_lengthEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE16do_always_noconvEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE5do_inERS0_PKcS4_RS4_PwS6_RS6_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE6do_outERS0_PKwS4_RS4_PcS6_RS6_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE9do_lengthERS0_PKcS4_j@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE10_M_compareEPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE12_M_transformEPcPKcj@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE12do_transformEPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE4hashEPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE7compareEPKcS2_S2_S2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE7do_hashEPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE9transformEPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE10_M_compareEPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE10do_compareEPKwS2_S2_S2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE12_M_transformEPwPKwj@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE12do_transformEPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE4hashEPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE7compareEPKwS2_S2_S2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE7do_hashEPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE9transformEPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIjEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIlEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intImEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intItEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIxEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIyEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIjEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIlEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intImEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intItEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIxEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIyEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_group_intEPKcjcRSt8ios_basePcS9_Ri@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIlEES3_S3_RSt8ios_basecT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intImEES3_S3_RSt8ios_basecT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIxEES3_S3_RSt8ios_basecT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIyEES3_S3_RSt8ios_basecT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_group_floatEPKcjcS6_PcS7_Ri@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIdEES3_S3_RSt8ios_baseccT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIeEES3_S3_RSt8ios_baseccT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPKv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basece@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6_M_padEciRSt8ios_basePcPKcRi@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPKv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basece@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE12_M_group_intEPKcjwRSt8ios_basePwS9_Ri@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIlEES3_S3_RSt8ios_basewT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intImEES3_S3_RSt8ios_basewT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIxEES3_S3_RSt8ios_basewT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIyEES3_S3_RSt8ios_basewT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_group_floatEPKcjwPKwPwS9_Ri@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIdEES3_S3_RSt8ios_basewcT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIeEES3_S3_RSt8ios_basewcT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPKv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6_M_padEwiRSt8ios_basePwPKwRi@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPKv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewy@@GLIBCXX_3.4
+FUNC:_ZNKSt8ios_base7failure4whatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE18_M_convert_to_charERKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE20_M_convert_from_charEPc@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE3getEiiiRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE4openERKSsRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE4openERKSsRKSt6localePKc@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE5closeEi@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE6do_getEiiiRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE7do_openERKSsRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE8do_closeEi@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE18_M_convert_to_charERKSbIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE20_M_convert_from_charEPc@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE3getEiiiRKSbIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE4openERKSsRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE4openERKSsRKSt6localePKc@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE5closeEi@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE6do_getEiiiRKSbIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE7do_openERKSsRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE8do_closeEi@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE11do_truenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE12do_falsenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE8truenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE9falsenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE11do_truenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE12do_falsenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE8truenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE9falsenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10date_orderEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13do_date_orderEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_numES3_S3_RiiijRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14do_get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE15_M_extract_nameES3_S3_RiPPKcjRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE21_M_extract_via_formatES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10date_orderEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13do_date_orderEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_numES3_S3_RiiijRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14do_get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE15_M_extract_nameES3_S3_RiPPKwjRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE21_M_extract_via_formatES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmcc@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPK2tmcc@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmPKwSB_@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmcc@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPK2tmcc@@GLIBCXX_3.4
+FUNC:_ZNKSt8valarrayIjE4sizeEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE10exceptionsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3badEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3eofEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3tieEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4failEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4fillEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4goodEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE5widenEc@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE6narrowEcc@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE7rdstateEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEcvPvEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEntEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE10exceptionsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3badEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3eofEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3tieEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4failEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4fillEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4goodEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE5widenEc@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE6narrowEwc@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE7rdstateEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEEcvPvEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEEntEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9exception4whatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb0EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb1EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb0EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb1EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basecRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basece@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basece@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb0EEES3_S3_RSt8ios_basecRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb1EEES3_S3_RSt8ios_basecRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb0EEES3_S3_RSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb1EEES3_S3_RSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9strstream5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9strstream6pcountEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9type_info10__do_catchEPKS_PPvj@@GLIBCXX_3.4
+FUNC:_ZNKSt9type_info11__do_upcastEPKN10__cxxabiv117__class_type_infoEPPv@@GLIBCXX_3.4
+FUNC:_ZNKSt9type_info14__is_pointer_pEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9type_info15__is_function_pEv@@GLIBCXX_3.4
+FUNC:_ZNSaIcEC1ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSaIcEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIcEC2ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSaIcEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIwEC1ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSaIwEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIwEC2ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSaIwEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hiderC1EPwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hiderC2EPwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_M_leak_hardEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_S_constructEjwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_S_empty_repEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIPKwS2_EES8_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIS3_S2_EES6_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwPKwS5_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwS3_S3_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE14_M_replace_auxEjjjw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeEjjPKwj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE2atEj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE3endEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_destroyERKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_disposeERKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refcopyEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refdataEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep12_S_empty_repEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep13_M_set_leakedEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep15_M_set_sharableEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep7_M_grabERKS1_S5_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep8_M_cloneERKS1_j@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEjjRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4rendEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4swapERS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5beginEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5clearEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EE@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEjj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_jj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEjw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_jj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEjw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEjw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEjPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEjPKwj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEjRKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEjRKS2_jj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEjjw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6rbeginEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6resizeEj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6resizeEjw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7_M_dataEPw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7_M_leakEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_NS4_IPKwS2_EES9_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwS8_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_RKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S5_S5_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S6_S6_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_jw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjPKwj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjRKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjRKS2_jj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEjjjw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7reserveEj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEjjj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE9push_backEw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EPKwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EPKwjRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_jj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_jjRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EjwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IN9__gnu_cxx17__normal_iteratorIPwS2_EEEET_S8_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IPKwEET_S6_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IPwEET_S5_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EPKwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EPKwjRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_jj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_jjRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EjwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IN9__gnu_cxx17__normal_iteratorIPwS2_EEEET_S8_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IPKwEET_S6_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IPwEET_S5_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSEPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSEw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEixEj@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLEPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLEw@@GLIBCXX_3.4
+FUNC:_ZNSdC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSdC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSdC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSdC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSdD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSdD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSdD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSi3getEPci@@GLIBCXX_3.4
+FUNC:_ZNSi3getEPcic@@GLIBCXX_3.4
+FUNC:_ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEEc@@GLIBCXX_3.4
+FUNC:_ZNSi3getERc@@GLIBCXX_3.4
+FUNC:_ZNSi3getEv@@GLIBCXX_3.4
+FUNC:_ZNSi4peekEv@@GLIBCXX_3.4
+FUNC:_ZNSi4readEPci@@GLIBCXX_3.4
+FUNC:_ZNSi4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSi5seekgESt4fposI11__mbstate_tE@@GLIBCXX_3.4
+FUNC:_ZNSi5seekgExSt12_Ios_Seekdir@@GLIBCXX_3.4
+FUNC:_ZNSi5tellgEv@@GLIBCXX_3.4
+FUNC:_ZNSi5ungetEv@@GLIBCXX_3.4
+FUNC:_ZNSi6ignoreEii@@GLIBCXX_3.4
+FUNC:_ZNSi6sentryC1ERSib@@GLIBCXX_3.4
+FUNC:_ZNSi6sentryC2ERSib@@GLIBCXX_3.4
+FUNC:_ZNSi7getlineEPci@@GLIBCXX_3.4
+FUNC:_ZNSi7getlineEPcic@@GLIBCXX_3.4
+FUNC:_ZNSi7putbackEc@@GLIBCXX_3.4
+FUNC:_ZNSi8readsomeEPci@@GLIBCXX_3.4
+FUNC:_ZNSiC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSiC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSiC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSiC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSiD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSiD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSiD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSirsEPFRSiS_E@@GLIBCXX_3.4
+FUNC:_ZNSirsEPFRSt8ios_baseS0_E@@GLIBCXX_3.4
+FUNC:_ZNSirsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCXX_3.4
+FUNC:_ZNSirsEPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSirsERPv@@GLIBCXX_3.4
+FUNC:_ZNSirsERb@@GLIBCXX_3.4
+FUNC:_ZNSirsERd@@GLIBCXX_3.4
+FUNC:_ZNSirsERe@@GLIBCXX_3.4
+FUNC:_ZNSirsERf@@GLIBCXX_3.4
+FUNC:_ZNSirsERi@@GLIBCXX_3.4
+FUNC:_ZNSirsERj@@GLIBCXX_3.4
+FUNC:_ZNSirsERl@@GLIBCXX_3.4
+FUNC:_ZNSirsERm@@GLIBCXX_3.4
+FUNC:_ZNSirsERs@@GLIBCXX_3.4
+FUNC:_ZNSirsERt@@GLIBCXX_3.4
+FUNC:_ZNSirsERx@@GLIBCXX_3.4
+FUNC:_ZNSirsERy@@GLIBCXX_3.4
+FUNC:_ZNSo3putEc@@GLIBCXX_3.4
+FUNC:_ZNSo5flushEv@@GLIBCXX_3.4
+FUNC:_ZNSo5seekpESt4fposI11__mbstate_tE@@GLIBCXX_3.4
+FUNC:_ZNSo5seekpExSt12_Ios_Seekdir@@GLIBCXX_3.4
+FUNC:_ZNSo5tellpEv@@GLIBCXX_3.4
+FUNC:_ZNSo5writeEPKci@@GLIBCXX_3.4
+FUNC:_ZNSo6sentryC1ERSo@@GLIBCXX_3.4
+FUNC:_ZNSo6sentryC2ERSo@@GLIBCXX_3.4
+FUNC:_ZNSo6sentryD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSo6sentryD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSo8_M_writeEPKci@@GLIBCXX_3.4
+FUNC:_ZNSoC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSoC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSoC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSoC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSoD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSoD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSoD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSolsEPFRSoS_E@@GLIBCXX_3.4
+FUNC:_ZNSolsEPFRSt8ios_baseS0_E@@GLIBCXX_3.4
+FUNC:_ZNSolsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCXX_3.4
+FUNC:_ZNSolsEPKv@@GLIBCXX_3.4
+FUNC:_ZNSolsEPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSolsEb@@GLIBCXX_3.4
+FUNC:_ZNSolsEd@@GLIBCXX_3.4
+FUNC:_ZNSolsEe@@GLIBCXX_3.4
+FUNC:_ZNSolsEf@@GLIBCXX_3.4
+FUNC:_ZNSolsEi@@GLIBCXX_3.4
+FUNC:_ZNSolsEj@@GLIBCXX_3.4
+FUNC:_ZNSolsEl@@GLIBCXX_3.4
+FUNC:_ZNSolsEm@@GLIBCXX_3.4
+FUNC:_ZNSolsEs@@GLIBCXX_3.4
+FUNC:_ZNSolsEt@@GLIBCXX_3.4
+FUNC:_ZNSolsEx@@GLIBCXX_3.4
+FUNC:_ZNSolsEy@@GLIBCXX_3.4
+FUNC:_ZNSs12_Alloc_hiderC1EPcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs12_Alloc_hiderC2EPcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs12_M_leak_hardEv@@GLIBCXX_3.4
+FUNC:_ZNSs12_S_constructEjcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs12_S_empty_repEv@@GLIBCXX_3.4
+FUNC:_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcSsEES4_@@GLIBCXX_3.4
+FUNC:_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS_SsEES2_@@GLIBCXX_3.4
+FUNC:_ZNSs13_S_copy_charsEPcPKcS1_@@GLIBCXX_3.4
+FUNC:_ZNSs13_S_copy_charsEPcS_S_@@GLIBCXX_3.4
+FUNC:_ZNSs14_M_replace_auxEjjjc@@GLIBCXX_3.4
+FUNC:_ZNSs15_M_replace_safeEjjPKcj@@GLIBCXX_3.4
+FUNC:_ZNSs2atEj@@GLIBCXX_3.4
+FUNC:_ZNSs3endEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep10_M_destroyERKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep10_M_disposeERKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep10_M_refcopyEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep10_M_refdataEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep12_S_empty_repEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep13_M_set_leakedEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep15_M_set_sharableEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep7_M_grabERKSaIcES2_@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep8_M_cloneERKSaIcEj@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep9_S_createEjjRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs4rendEv@@GLIBCXX_3.4
+FUNC:_ZNSs4swapERSs@@GLIBCXX_3.4
+FUNC:_ZNSs5beginEv@@GLIBCXX_3.4
+FUNC:_ZNSs5clearEv@@GLIBCXX_3.4
+FUNC:_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEE@@GLIBCXX_3.4
+FUNC:_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEES2_@@GLIBCXX_3.4
+FUNC:_ZNSs5eraseEjj@@GLIBCXX_3.4
+FUNC:_ZNSs6appendEPKc@@GLIBCXX_3.4
+FUNC:_ZNSs6appendEPKcj@@GLIBCXX_3.4
+FUNC:_ZNSs6appendERKSs@@GLIBCXX_3.4
+FUNC:_ZNSs6appendERKSsjj@@GLIBCXX_3.4
+FUNC:_ZNSs6appendEjc@@GLIBCXX_3.4
+FUNC:_ZNSs6assignEPKc@@GLIBCXX_3.4
+FUNC:_ZNSs6assignEPKcj@@GLIBCXX_3.4
+FUNC:_ZNSs6assignERKSs@@GLIBCXX_3.4
+FUNC:_ZNSs6assignERKSsjj@@GLIBCXX_3.4
+FUNC:_ZNSs6assignEjc@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEc@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEjc@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEjPKc@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEjPKcj@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEjRKSs@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEjRKSsjj@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEjjc@@GLIBCXX_3.4
+FUNC:_ZNSs6rbeginEv@@GLIBCXX_3.4
+FUNC:_ZNSs6resizeEj@@GLIBCXX_3.4
+FUNC:_ZNSs6resizeEjc@@GLIBCXX_3.4
+FUNC:_ZNSs7_M_dataEPc@@GLIBCXX_3.4
+FUNC:_ZNSs7_M_leakEv@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_NS0_IPKcSsEES5_@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKc@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcS4_@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcj@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_RKSs@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S1_S1_@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S2_S2_@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_jc@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEjjPKc@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEjjPKcj@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEjjRKSs@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEjjRKSsjj@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEjjjc@@GLIBCXX_3.4
+FUNC:_ZNSs7reserveEj@@GLIBCXX_3.4
+FUNC:_ZNSs9_M_mutateEjjj@@GLIBCXX_3.4
+FUNC:_ZNSs9push_backEc@@GLIBCXX_3.4
+FUNC:_ZNSsC1EPKcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1EPKcjRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1ERKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSsC1ERKSsjj@@GLIBCXX_3.4
+FUNC:_ZNSsC1ERKSsjjRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1EjcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSsC1IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1IPKcEET_S2_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1IPcEET_S1_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2EPKcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2EPKcjRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2ERKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSsC2ERKSsjj@@GLIBCXX_3.4
+FUNC:_ZNSsC2ERKSsjjRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2EjcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSsC2IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2IPKcEET_S2_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2IPcEET_S1_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSsD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSsaSEPKc@@GLIBCXX_3.4
+FUNC:_ZNSsaSERKSs@@GLIBCXX_3.4
+FUNC:_ZNSsaSEc@@GLIBCXX_3.4
+FUNC:_ZNSsixEj@@GLIBCXX_3.4
+FUNC:_ZNSspLEPKc@@GLIBCXX_3.4
+FUNC:_ZNSspLERKSs@@GLIBCXX_3.4
+FUNC:_ZNSspLEc@@GLIBCXX_3.4
+FUNC:_ZNSt10__num_base15_S_format_floatERKSt8ios_basePcc@@GLIBCXX_3.4
+FUNC:_ZNSt10bad_typeidD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10bad_typeidD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10bad_typeidD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstream3strEv@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC1EPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC1EPKci@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC1EPc@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC1EPci@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC2EPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC2EPKci@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC2EPc@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC2EPci@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10money_base20_S_construct_patternEccc@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC1EPSt18__moneypunct_cacheIcLb0EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC2EPSt18__moneypunct_cacheIcLb0EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC1EPSt18__moneypunct_cacheIcLb1EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC2EPSt18__moneypunct_cacheIcLb1EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC1EPSt18__moneypunct_cacheIwLb0EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC2EPSt18__moneypunct_cacheIwLb0EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC1EPSt18__moneypunct_cacheIwLb1EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC2EPSt18__moneypunct_cacheIwLb1EEj@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstream3strEv@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstream6freezeEb@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamC1EPciSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamC2EPciSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcE23_M_initialize_timepunctEP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC1EPSt17__timepunct_cacheIcEj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC2EPSt17__timepunct_cacheIcEj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwE23_M_initialize_timepunctEP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC1EPSt17__timepunct_cacheIwEj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC2EPSt17__timepunct_cacheIwEj@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11logic_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt11logic_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt11logic_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11logic_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11logic_errorD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11range_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt11range_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt11range_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11range_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE2fdEv@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE4openEPKcSt13_Ios_Openmodei@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE6xsgetnEPci@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE6xsputnEPKci@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE7seekoffExSt12_Ios_Seekdir@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE8sys_openEP8_IO_FILESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE8sys_openEiSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE8xsputn_2EPKciS2_i@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE9showmanycEv@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcEC1EP15pthread_mutex_t@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcEC2EP15pthread_mutex_t@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIcEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIcEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIwEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIwEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12domain_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12domain_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12domain_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12domain_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12length_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12length_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12length_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12length_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12out_of_rangeC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12out_of_rangeC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12out_of_rangeD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12out_of_rangeD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf3strEv@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf6freezeEb@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf6setbufEPci@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf7_M_freeEPc@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf8_M_allocEj@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf8_M_setupEPcS0_i@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf8overflowEi@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf9pbackfailEi@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPFPvjEPFvS0_E@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPKai@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPKci@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPKhi@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPaiS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPciS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPhiS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1Ei@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPFPvjEPFvS0_E@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPKai@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPKci@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPKhi@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPaiS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPciS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPhiS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2Ei@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13bad_exceptionD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13bad_exceptionD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13bad_exceptionD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE13_M_set_bufferEi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE15_M_create_pbackEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE16_M_destroy_pbackEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE19_M_terminate_outputEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE22_M_convert_to_externalEPci@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE26_M_destroy_internal_bufferEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE27_M_allocate_internal_bufferEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPci@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6xsgetnEPci@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6xsputnEPKci@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7_M_seekExSt12_Ios_Seekdir11__mbstate_t@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9showmanycEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE13_M_set_bufferEi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE15_M_create_pbackEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE16_M_destroy_pbackEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE19_M_terminate_outputEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE22_M_convert_to_externalEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE26_M_destroy_internal_bufferEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE27_M_allocate_internal_bufferEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6xsgetnEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6xsputnEPKwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE7_M_seekExSt12_Ios_Seekdir11__mbstate_t@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE8overflowEj@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9pbackfailEj@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9showmanycEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwiw@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERSt15basic_streambufIwS1_Ew@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERw@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4peekEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4readEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgESt4fposI11__mbstate_tE@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgExSt12_Ios_Seekdir@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5tellgEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5ungetEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreEij@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentryC1ERS2_b@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentryC2ERS2_b@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwiw@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7putbackEw@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE8readsomeEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRS2_S3_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt8ios_baseS4_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt9basic_iosIwS1_ES5_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERPv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERb@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERd@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERe@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERf@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERj@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERm@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERs@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERt@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERx@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERy@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE3putEw@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5flushEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpESt4fposI11__mbstate_tE@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpExSt12_Ios_Seekdir@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5tellpEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC1ERS2_@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC2ERS2_@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE8_M_writeEPKwi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRS2_S3_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt8ios_baseS4_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt9basic_iosIwS1_ES5_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPKv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEb@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEd@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEe@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEf@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEj@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEm@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEs@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEt@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEx@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEy@@GLIBCXX_3.4
+FUNC:_ZNSt13runtime_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt13runtime_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt13runtime_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13runtime_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13runtime_errorD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIcEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIcEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIwEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIwEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14overflow_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt14overflow_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt14overflow_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14overflow_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15_List_node_base4hookEPS_@@GLIBCXX_3.4
+FUNC:_ZNSt15_List_node_base4swapERS_S0_@@GLIBCXX_3.4
+FUNC:_ZNSt15_List_node_base6unhookEv@@GLIBCXX_3.4
+FUNC:_ZNSt15_List_node_base7reverseEv@@GLIBCXX_3.4
+FUNC:_ZNSt15_List_node_base8transferEPS_S0_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setgEPcS3_S3_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setpEPcS3_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5gbumpEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5pbumpEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetnEPci@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputcEc@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputnEPKci@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5uflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6sbumpcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPci@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6snextcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPci@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKci@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7pubsyncEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7sungetcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8in_availEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8overflowEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8pubimbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9pubsetbufEPci@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9sputbackcEc@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC1ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC2ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEaSERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4setgEPwS3_S3_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4setpEPwS3_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5gbumpEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5pbumpEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetnEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sputcEw@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sputnEPKwi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5uflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6sbumpcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6setbufEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6snextcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7pubsyncEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7sungetcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8in_availEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8overflowEj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8pubimbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9pbackfailEj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9pubsetbufEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9showmanycEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9sputbackcEw@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC1ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC2ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEaSERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE15_M_update_egptrEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPci@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7_M_syncEPcjj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8overflowEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9pbackfailEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE15_M_update_egptrEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE6setbufEPwi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7_M_syncEPwjj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE8overflowEj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9pbackfailEj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIcEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIcEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIwEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIwEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIcEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIcEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIwEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIwEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15underflow_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt15underflow_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt15underflow_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15underflow_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16invalid_argumentC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt16invalid_argumentC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt16invalid_argumentD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16invalid_argumentD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIcEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIcEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIwEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIwEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb0EEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb0EEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb1EEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb1EEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb0EEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb0EEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb1EEC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb1EEC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcE13classic_tableEv@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcEC1EP15__locale_structPKtbj@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcEC1EPKtbj@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcEC2EP15__locale_structPKtbj@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcEC2EPKtbj@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwE19_M_initialize_ctypeEv@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwEC1EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwEC2EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6gslice8_IndexerC1EjRKSt8valarrayIjES4_@@GLIBCXX_3.4
+FUNC:_ZNSt6gslice8_IndexerC2EjRKSt8valarrayIjES4_@@GLIBCXX_3.4
+FUNC:_ZNSt6locale11_M_coalesceERKS_S1_i@@GLIBCXX_3.4
+FUNC:_ZNSt6locale21_S_normalize_categoryEi@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_Impl16_M_install_facetEPKNS_2idEPKNS_5facetE@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_Impl16_M_replace_facetEPKS0_PKNS_2idE@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_Impl19_M_replace_categoryEPKS0_PKPKNS_2idE@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_Impl21_M_replace_categoriesEPKS0_i@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC1EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC1ERKS0_j@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC2EPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC2ERKS0_j@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facet15_S_get_c_localeEv@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facet17_S_clone_c_localeERP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facet18_S_create_c_localeERP15__locale_structPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facet19_S_destroy_c_localeERP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facetD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facetD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facetD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6locale6globalERKS_@@GLIBCXX_3.4
+FUNC:_ZNSt6locale7classicEv@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1EPKc@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1EPNS_5_ImplE@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1ERKS_PKci@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1ERKS_S1_i@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2EPKc@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2EPNS_5_ImplE@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2ERKS_PKci@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2ERKS_S1_i@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6localeD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6localeD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6localeaSERKS_@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC1EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC2EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC1EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC2EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcEC1EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcEC2EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwEC1EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwEC2EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8bad_castD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8bad_castD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8bad_castD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base13_M_grow_wordsEib@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base15sync_with_stdioEb@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base17register_callbackEPFvNS_5eventERS_iEi@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base4InitC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base4InitD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base6xallocEv@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7_M_initEv@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7failureC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7failureC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7failureD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7failureD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7failureD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_baseC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_baseC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_baseD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_baseD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_baseD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwEC1EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwEC2EP15__locale_structPKcj@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcE22_M_initialize_numpunctEP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC1EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC1EPSt16__numpunct_cacheIcEj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC2EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC2EPSt16__numpunct_cacheIcEj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwE22_M_initialize_numpunctEP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC1EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC1EPSt16__numpunct_cacheIwEj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC2EP15__locale_structj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC2EPSt16__numpunct_cacheIwEj@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayIjEC1ERKS0_@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayIjEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayIjEC2ERKS0_@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayIjEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayIjED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayIjED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayIjEixEj@@GLIBCXX_3.4
+FUNC:_ZNSt9bad_allocD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9bad_allocD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9bad_allocD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE10exceptionsESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE11_M_setstateESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE15_M_cache_localeERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE3tieEPSo@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4fillEc@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5rdbufEPSt15basic_streambufIcS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE7copyfmtERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE8setstateESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1EPSt15basic_streambufIcS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC2EPSt15basic_streambufIcS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE10exceptionsESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE11_M_setstateESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE15_M_cache_localeERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE3tieEPSt13basic_ostreamIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4fillEw@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5clearESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5rdbufEPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE7copyfmtERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE8setstateESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9exceptionD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9exceptionD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9exceptionD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Ej@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9strstream3strEv@@GLIBCXX_3.4
+FUNC:_ZNSt9strstream6freezeEb@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamC1EPciSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamC2EPciSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9type_infoD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9type_infoD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9type_infoD2Ev@@GLIBCXX_3.4
+FUNC:_ZSt10unexpectedv@@GLIBCXX_3.4
+FUNC:_ZSt13set_terminatePFvvE@@GLIBCXX_3.4
+FUNC:_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZSt14__convert_to_vIfEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZSt14set_unexpectedPFvvE@@GLIBCXX_3.4
+FUNC:_ZSt15set_new_handlerPFvvE@@GLIBCXX_3.4
+FUNC:_ZSt16__throw_bad_castv@@GLIBCXX_3.4
+FUNC:_ZSt17__throw_bad_allocv@@GLIBCXX_3.4
+FUNC:_ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base@@GLIBCXX_3.4
+FUNC:_ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base@@GLIBCXX_3.4
+FUNC:_ZSt18_Rb_tree_incrementPKSt18_Rb_tree_node_base@@GLIBCXX_3.4
+FUNC:_ZSt18_Rb_tree_incrementPSt18_Rb_tree_node_base@@GLIBCXX_3.4
+FUNC:_ZSt18__throw_bad_typeidv@@GLIBCXX_3.4
+FUNC:_ZSt18uncaught_exceptionv@@GLIBCXX_3.4
+FUNC:_ZSt19__throw_ios_failurePKc@@GLIBCXX_3.4
+FUNC:_ZSt19__throw_logic_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt19__throw_range_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt20_Rb_tree_black_countPKSt18_Rb_tree_node_baseS1_@@GLIBCXX_3.4
+FUNC:_ZSt20_Rb_tree_rotate_leftPSt18_Rb_tree_node_baseRS0_@@GLIBCXX_3.4
+FUNC:_ZSt20__throw_domain_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt20__throw_length_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt20__throw_out_of_rangePKc@@GLIBCXX_3.4
+FUNC:_ZSt21_Rb_tree_rotate_rightPSt18_Rb_tree_node_baseRS0_@@GLIBCXX_3.4
+FUNC:_ZSt21__throw_bad_exceptionv@@GLIBCXX_3.4
+FUNC:_ZSt21__throw_runtime_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt22__throw_overflow_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt23__throw_underflow_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt24__throw_invalid_argumentPKc@@GLIBCXX_3.4
+FUNC:_ZSt28_Rb_tree_rebalance_for_erasePSt18_Rb_tree_node_baseRS_@@GLIBCXX_3.4
+FUNC:_ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS_@@GLIBCXX_3.4
+FUNC:_ZSt2wsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt2wsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt4endlIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt4endsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt4endsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt5flushIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt5flushIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCXX_3.4
+FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt10moneypunctIcLb0EEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt10moneypunctIwLb0EEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt11__timepunctIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt11__timepunctIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt5ctypeIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt5ctypeIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7codecvtIcc11__mbstate_tEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7codecvtIwc11__mbstate_tEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7collateIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7collateIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8messagesIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8messagesIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8numpunctIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8numpunctIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9terminatev@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt10moneypunctIcLb0EEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt10moneypunctIcLb1EEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt10moneypunctIwLb0EEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt10moneypunctIwLb1EEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt11__timepunctIcEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt11__timepunctIwEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt5ctypeIcEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt5ctypeIwEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7codecvtIcc11__mbstate_tEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7codecvtIwc11__mbstate_tEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7collateIcEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7collateIwEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8messagesIcEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8messagesIwEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8numpunctIcEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8numpunctIwEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKa@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKh@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_a@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_h@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St12_Setiosflags@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St13_Setprecision@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St5_Setw@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZStlsIdcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIdwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIecSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIewSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIfcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIfwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKS3_@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKc@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_S3_@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St12_Setiosflags@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St13_Setprecision@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St5_Setw@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_c@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwESaIwEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_@@GLIBCXX_3.4
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_@@GLIBCXX_3.4
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ES3_RKS6_@@GLIBCXX_3.4
+FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_EPKS3_RKS6_@@GLIBCXX_3.4
+FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_ERKS6_S8_@@GLIBCXX_3.4
+FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_ES3_RKS6_@@GLIBCXX_3.4
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Pa@@GLIBCXX_3.4
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ph@@GLIBCXX_3.4
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ra@@GLIBCXX_3.4
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Rh@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_PS3_@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_RS3_@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St12_Setiosflags@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St13_Setprecision@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St5_Setw@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZStrsIdcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIdwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIecSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIewSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIfcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIfwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_PS3_@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_RS3_@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St12_Setiosflags@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St13_Setprecision@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St5_Setw@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZThn8_NSdD0Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSdD1Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt9strstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZThn8_NSt9strstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSdD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSdD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSiD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSiD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSoD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSoD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt10istrstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt10istrstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt10ostrstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt10ostrstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_istreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt9strstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n12_NSt9strstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZdaPv@@GLIBCXX_3.4
+FUNC:_ZdaPvRKSt9nothrow_t@@GLIBCXX_3.4
+FUNC:_ZdlPv@@GLIBCXX_3.4
+FUNC:_ZdlPvRKSt9nothrow_t@@GLIBCXX_3.4
+FUNC:_Znaj@@GLIBCXX_3.4
+FUNC:_ZnajRKSt9nothrow_t@@GLIBCXX_3.4
+FUNC:_Znwj@@GLIBCXX_3.4
+FUNC:_ZnwjRKSt9nothrow_t@@GLIBCXX_3.4
+FUNC:__cxa_allocate_exception@@CXXABI_1.3
+FUNC:__cxa_bad_cast@@CXXABI_1.3
+FUNC:__cxa_bad_typeid@@CXXABI_1.3
+FUNC:__cxa_begin_catch@@CXXABI_1.3
+FUNC:__cxa_call_unexpected@@CXXABI_1.3
+FUNC:__cxa_current_exception_type@@CXXABI_1.3
+FUNC:__cxa_demangle@@CXXABI_1.3
+FUNC:__cxa_end_catch@@CXXABI_1.3
+FUNC:__cxa_free_exception@@CXXABI_1.3
+FUNC:__cxa_get_globals@@CXXABI_1.3
+FUNC:__cxa_get_globals_fast@@CXXABI_1.3
+FUNC:__cxa_guard_abort@@CXXABI_1.3
+FUNC:__cxa_guard_acquire@@CXXABI_1.3
+FUNC:__cxa_guard_release@@CXXABI_1.3
+FUNC:__cxa_pure_virtual@@CXXABI_1.3
+FUNC:__cxa_rethrow@@CXXABI_1.3
+FUNC:__cxa_throw@@CXXABI_1.3
+FUNC:__cxa_vec_cctor@@CXXABI_1.3
+FUNC:__cxa_vec_cleanup@@CXXABI_1.3
+FUNC:__cxa_vec_ctor@@CXXABI_1.3
+FUNC:__cxa_vec_delete2@@CXXABI_1.3
+FUNC:__cxa_vec_delete3@@CXXABI_1.3
+FUNC:__cxa_vec_delete@@CXXABI_1.3
+FUNC:__cxa_vec_dtor@@CXXABI_1.3
+FUNC:__cxa_vec_new2@@CXXABI_1.3
+FUNC:__cxa_vec_new3@@CXXABI_1.3
+FUNC:__cxa_vec_new@@CXXABI_1.3
+FUNC:__dynamic_cast@@CXXABI_1.3
+FUNC:__gxx_personality_v0@@CXXABI_1.3
+FUNC:atan2l@@GLIBCXX_3.4
+FUNC:coshl@@GLIBCXX_3.4
+FUNC:cosl@@GLIBCXX_3.4
+FUNC:expl@@GLIBCXX_3.4
+FUNC:hypotl@@GLIBCXX_3.4
+FUNC:log10l@@GLIBCXX_3.4
+FUNC:logl@@GLIBCXX_3.4
+FUNC:powl@@GLIBCXX_3.4
+FUNC:sinhl@@GLIBCXX_3.4
+FUNC:sinl@@GLIBCXX_3.4
+FUNC:sqrtl@@GLIBCXX_3.4
+FUNC:tanhl@@GLIBCXX_3.4
+FUNC:tanl@@GLIBCXX_3.4
+OBJECT:0:CXXABI_1.3
+OBJECT:0:GLIBCXX_3.4
+OBJECT:12:_ZTIN10__cxxabiv116__enum_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv117__array_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv117__pbase_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv119__pointer_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv120__function_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv120__si_class_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv121__vmi_class_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv123__fundamental_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN10__cxxabiv129__pointer_to_member_type_infoE@@CXXABI_1.3
+OBJECT:12:_ZTIN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTIN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTIN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTIN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTINSt8ios_base7failureE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt10bad_typeid@@GLIBCXX_3.4
+OBJECT:12:_ZTISt10istrstream@@GLIBCXX_3.4
+OBJECT:12:_ZTISt10ostrstream@@GLIBCXX_3.4
+OBJECT:12:_ZTISt11__timepunctIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt11__timepunctIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt11logic_error@@GLIBCXX_3.4
+OBJECT:12:_ZTISt11range_error@@GLIBCXX_3.4
+OBJECT:12:_ZTISt12ctype_bynameIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt12ctype_bynameIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt12domain_error@@GLIBCXX_3.4
+OBJECT:12:_ZTISt12length_error@@GLIBCXX_3.4
+OBJECT:12:_ZTISt12out_of_range@@GLIBCXX_3.4
+OBJECT:12:_ZTISt12strstreambuf@@GLIBCXX_3.4
+OBJECT:12:_ZTISt13bad_exception@@GLIBCXX_3.4
+OBJECT:12:_ZTISt13basic_filebufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt13basic_filebufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt13runtime_error@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14codecvt_bynameIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14codecvt_bynameIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14collate_bynameIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14collate_bynameIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt14overflow_error@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15messages_bynameIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15messages_bynameIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15numpunct_bynameIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15numpunct_bynameIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt15underflow_error@@GLIBCXX_3.4
+OBJECT:12:_ZTISt16invalid_argument@@GLIBCXX_3.4
+OBJECT:12:_ZTISt17moneypunct_bynameIcLb0EE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt17moneypunct_bynameIcLb1EE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt17moneypunct_bynameIwLb0EE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt17moneypunct_bynameIwLb1EE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt5ctypeIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7codecvtIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7codecvtIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7collateIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7collateIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt8bad_cast@@GLIBCXX_3.4
+OBJECT:12:_ZTISt8numpunctIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt8numpunctIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9bad_alloc@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9basic_iosIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9basic_iosIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:12:_ZTISt9strstream@@GLIBCXX_3.4
+OBJECT:12:_ZTSSt5ctypeIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTSSt5ctypeIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTSSt8bad_cast@@GLIBCXX_3.4
+OBJECT:12:_ZTSSt8ios_base@@GLIBCXX_3.4
+OBJECT:13:_ZTSSt9bad_alloc@@GLIBCXX_3.4
+OBJECT:13:_ZTSSt9exception@@GLIBCXX_3.4
+OBJECT:13:_ZTSSt9strstream@@GLIBCXX_3.4
+OBJECT:13:_ZTSSt9time_base@@GLIBCXX_3.4
+OBJECT:13:_ZTSSt9type_info@@GLIBCXX_3.4
+OBJECT:140:_ZSt4cerr@@GLIBCXX_3.4
+OBJECT:140:_ZSt4clog@@GLIBCXX_3.4
+OBJECT:140:_ZSt4cout@@GLIBCXX_3.4
+OBJECT:144:_ZSt3cin@@GLIBCXX_3.4
+OBJECT:144:_ZSt5wcerr@@GLIBCXX_3.4
+OBJECT:144:_ZSt5wclog@@GLIBCXX_3.4
+OBJECT:144:_ZSt5wcout@@GLIBCXX_3.4
+OBJECT:148:_ZSt4wcin@@GLIBCXX_3.4
+OBJECT:14:_ZTSSt7collateIcE@@GLIBCXX_3.4
+OBJECT:14:_ZTSSt7collateIwE@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt10bad_typeid@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt10ctype_base@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt10istrstream@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt10money_base@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt10ostrstream@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt8messagesIcE@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt8messagesIwE@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt8numpunctIcE@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt8numpunctIwE@@GLIBCXX_3.4
+OBJECT:16:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4
+OBJECT:16:_ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4
+OBJECT:16:_ZTIPKa@@CXXABI_1.3
+OBJECT:16:_ZTIPKb@@CXXABI_1.3
+OBJECT:16:_ZTIPKc@@CXXABI_1.3
+OBJECT:16:_ZTIPKd@@CXXABI_1.3
+OBJECT:16:_ZTIPKe@@CXXABI_1.3
+OBJECT:16:_ZTIPKf@@CXXABI_1.3
+OBJECT:16:_ZTIPKh@@CXXABI_1.3
+OBJECT:16:_ZTIPKi@@CXXABI_1.3
+OBJECT:16:_ZTIPKj@@CXXABI_1.3
+OBJECT:16:_ZTIPKl@@CXXABI_1.3
+OBJECT:16:_ZTIPKm@@CXXABI_1.3
+OBJECT:16:_ZTIPKs@@CXXABI_1.3
+OBJECT:16:_ZTIPKt@@CXXABI_1.3
+OBJECT:16:_ZTIPKv@@CXXABI_1.3
+OBJECT:16:_ZTIPKw@@CXXABI_1.3
+OBJECT:16:_ZTIPKx@@CXXABI_1.3
+OBJECT:16:_ZTIPKy@@CXXABI_1.3
+OBJECT:16:_ZTIPa@@CXXABI_1.3
+OBJECT:16:_ZTIPb@@CXXABI_1.3
+OBJECT:16:_ZTIPc@@CXXABI_1.3
+OBJECT:16:_ZTIPd@@CXXABI_1.3
+OBJECT:16:_ZTIPe@@CXXABI_1.3
+OBJECT:16:_ZTIPf@@CXXABI_1.3
+OBJECT:16:_ZTIPh@@CXXABI_1.3
+OBJECT:16:_ZTIPi@@CXXABI_1.3
+OBJECT:16:_ZTIPj@@CXXABI_1.3
+OBJECT:16:_ZTIPl@@CXXABI_1.3
+OBJECT:16:_ZTIPm@@CXXABI_1.3
+OBJECT:16:_ZTIPs@@CXXABI_1.3
+OBJECT:16:_ZTIPt@@CXXABI_1.3
+OBJECT:16:_ZTIPv@@CXXABI_1.3
+OBJECT:16:_ZTIPw@@CXXABI_1.3
+OBJECT:16:_ZTIPx@@CXXABI_1.3
+OBJECT:16:_ZTIPy@@CXXABI_1.3
+OBJECT:16:_ZTSSt11logic_error@@GLIBCXX_3.4
+OBJECT:16:_ZTSSt11range_error@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt10istrstream@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt10ostrstream@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:16:_ZTVNSt6locale5facetE@@GLIBCXX_3.4
+OBJECT:16:_ZTVSt11__timepunctIcE@@GLIBCXX_3.4
+OBJECT:16:_ZTVSt11__timepunctIwE@@GLIBCXX_3.4
+OBJECT:16:_ZTVSt8ios_base@@GLIBCXX_3.4
+OBJECT:16:_ZTVSt9basic_iosIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:16:_ZTVSt9basic_iosIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:17:_ZTSSt12codecvt_base@@GLIBCXX_3.4
+OBJECT:17:_ZTSSt12domain_error@@GLIBCXX_3.4
+OBJECT:17:_ZTSSt12length_error@@GLIBCXX_3.4
+OBJECT:17:_ZTSSt12out_of_range@@GLIBCXX_3.4
+OBJECT:17:_ZTSSt12strstreambuf@@GLIBCXX_3.4
+OBJECT:18:_ZTSNSt6locale5facetE@@GLIBCXX_3.4
+OBJECT:18:_ZTSSt13bad_exception@@GLIBCXX_3.4
+OBJECT:18:_ZTSSt13messages_base@@GLIBCXX_3.4
+OBJECT:18:_ZTSSt13runtime_error@@GLIBCXX_3.4
+OBJECT:19:_ZTSSt11__timepunctIcE@@GLIBCXX_3.4
+OBJECT:19:_ZTSSt11__timepunctIwE@@GLIBCXX_3.4
+OBJECT:19:_ZTSSt14overflow_error@@GLIBCXX_3.4
+OBJECT:1:_ZNSs4_Rep11_S_terminalE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt10moneypunctIcLb0EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt10moneypunctIcLb1EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt10moneypunctIwLb0EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt10moneypunctIwLb1EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt17moneypunct_bynameIcLb0EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt17moneypunct_bynameIcLb1EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt17moneypunct_bynameIwLb0EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt17moneypunct_bynameIwLb1EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZSt7nothrow@@GLIBCXX_3.4
+OBJECT:20:_ZTSSt12ctype_bynameIcE@@GLIBCXX_3.4
+OBJECT:20:_ZTSSt12ctype_bynameIwE@@GLIBCXX_3.4
+OBJECT:20:_ZTSSt15underflow_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVNSt8ios_base7failureE@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt10bad_typeid@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt11logic_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt11range_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt12domain_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt12length_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt12out_of_range@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt13bad_exception@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt13runtime_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt14overflow_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt15underflow_error@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt16invalid_argument@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt8bad_cast@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt9bad_alloc@@GLIBCXX_3.4
+OBJECT:20:_ZTVSt9exception@@GLIBCXX_3.4
+OBJECT:21:_ZTSSt16invalid_argument@@GLIBCXX_3.4
+OBJECT:22:_ZTSNSt8ios_base7failureE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt10moneypunctIcLb0EE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt10moneypunctIcLb1EE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt10moneypunctIwLb0EE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt10moneypunctIwLb1EE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt14collate_bynameIcE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt14collate_bynameIwE@@GLIBCXX_3.4
+OBJECT:23:_ZTSSt15messages_bynameIcE@@GLIBCXX_3.4
+OBJECT:23:_ZTSSt15messages_bynameIwE@@GLIBCXX_3.4
+OBJECT:23:_ZTSSt15numpunct_bynameIcE@@GLIBCXX_3.4
+OBJECT:23:_ZTSSt15numpunct_bynameIwE@@GLIBCXX_3.4
+OBJECT:24:_ZTISi@@GLIBCXX_3.4
+OBJECT:24:_ZTISo@@GLIBCXX_3.4
+OBJECT:24:_ZTISt13basic_istreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:24:_ZTVSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTVSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTVSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTVSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:28:_ZTSSt7codecvtIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:28:_ZTSSt7codecvtIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:28:_ZTTSd@@GLIBCXX_3.4
+OBJECT:28:_ZTTSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt14collate_bynameIcE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt14collate_bynameIwE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt15messages_bynameIcE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt15messages_bynameIwE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt7collateIcE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt7collateIwE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt8messagesIcE@@GLIBCXX_3.4
+OBJECT:28:_ZTVSt8messagesIwE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt17moneypunct_bynameIcLb0EE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt17moneypunct_bynameIcLb1EE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt17moneypunct_bynameIwLb0EE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt17moneypunct_bynameIwLb1EE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt21__ctype_abstract_baseIcE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt21__ctype_abstract_baseIwE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5alnumE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5alphaE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5cntrlE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5digitE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5graphE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5lowerE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5printE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5punctE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5spaceE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5upperE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base6xdigitE@@GLIBCXX_3.4
+OBJECT:2:_ZTSa@@CXXABI_1.3
+OBJECT:2:_ZTSb@@CXXABI_1.3
+OBJECT:2:_ZTSc@@CXXABI_1.3
+OBJECT:2:_ZTSd@@CXXABI_1.3
+OBJECT:2:_ZTSe@@CXXABI_1.3
+OBJECT:2:_ZTSf@@CXXABI_1.3
+OBJECT:2:_ZTSh@@CXXABI_1.3
+OBJECT:2:_ZTSi@@CXXABI_1.3
+OBJECT:2:_ZTSj@@CXXABI_1.3
+OBJECT:2:_ZTSl@@CXXABI_1.3
+OBJECT:2:_ZTSm@@CXXABI_1.3
+OBJECT:2:_ZTSs@@CXXABI_1.3
+OBJECT:2:_ZTSt@@CXXABI_1.3
+OBJECT:2:_ZTSv@@CXXABI_1.3
+OBJECT:2:_ZTSw@@CXXABI_1.3
+OBJECT:2:_ZTSx@@CXXABI_1.3
+OBJECT:2:_ZTSy@@CXXABI_1.3
+OBJECT:32:_ZTISd@@GLIBCXX_3.4
+OBJECT:32:_ZTISt10moneypunctIcLb0EE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt10moneypunctIcLb1EE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt10moneypunctIwLb0EE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt10moneypunctIwLb1EE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt21__ctype_abstract_baseIcE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt21__ctype_abstract_baseIwE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt5ctypeIcE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt8messagesIcE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt8messagesIwE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:32:_ZTISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:32:_ZTVN10__cxxabiv116__enum_type_infoE@@CXXABI_1.3
+OBJECT:32:_ZTVN10__cxxabiv117__array_type_infoE@@CXXABI_1.3
+OBJECT:32:_ZTVN10__cxxabiv120__function_type_infoE@@CXXABI_1.3
+OBJECT:32:_ZTVN10__cxxabiv123__fundamental_type_infoE@@CXXABI_1.3
+OBJECT:32:_ZTVSt9type_info@@GLIBCXX_3.4
+OBJECT:33:_ZTSN10__cxxabiv116__enum_type_infoE@@CXXABI_1.3
+OBJECT:34:_ZTSN10__cxxabiv117__array_type_infoE@@CXXABI_1.3
+OBJECT:34:_ZTSN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
+OBJECT:34:_ZTSN10__cxxabiv117__pbase_type_infoE@@CXXABI_1.3
+OBJECT:34:_ZTSSt9basic_iosIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:34:_ZTSSt9basic_iosIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:36:_ZTSN10__cxxabiv119__pointer_type_infoE@@CXXABI_1.3
+OBJECT:36:_ZTSSt14codecvt_bynameIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:36:_ZTSSt14codecvt_bynameIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:36:_ZTVN10__cxxabiv117__pbase_type_infoE@@CXXABI_1.3
+OBJECT:36:_ZTVN10__cxxabiv119__pointer_type_infoE@@CXXABI_1.3
+OBJECT:36:_ZTVN10__cxxabiv129__pointer_to_member_type_infoE@@CXXABI_1.3
+OBJECT:36:_ZTVSt15numpunct_bynameIcE@@GLIBCXX_3.4
+OBJECT:36:_ZTVSt15numpunct_bynameIwE@@GLIBCXX_3.4
+OBJECT:36:_ZTVSt8numpunctIcE@@GLIBCXX_3.4
+OBJECT:36:_ZTVSt8numpunctIwE@@GLIBCXX_3.4
+OBJECT:37:_ZTSN10__cxxabiv120__function_type_infoE@@CXXABI_1.3
+OBJECT:37:_ZTSN10__cxxabiv120__si_class_type_infoE@@CXXABI_1.3
+OBJECT:38:_ZTSN10__cxxabiv121__vmi_class_type_infoE@@CXXABI_1.3
+OBJECT:39:_ZTSSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:39:_ZTSSt13basic_filebufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:39:_ZTSSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:39:_ZTSSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:39:_ZTSSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:39:_ZTSSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:3:_ZTSPa@@CXXABI_1.3
+OBJECT:3:_ZTSPb@@CXXABI_1.3
+OBJECT:3:_ZTSPc@@CXXABI_1.3
+OBJECT:3:_ZTSPd@@CXXABI_1.3
+OBJECT:3:_ZTSPe@@CXXABI_1.3
+OBJECT:3:_ZTSPf@@CXXABI_1.3
+OBJECT:3:_ZTSPh@@CXXABI_1.3
+OBJECT:3:_ZTSPi@@CXXABI_1.3
+OBJECT:3:_ZTSPj@@CXXABI_1.3
+OBJECT:3:_ZTSPl@@CXXABI_1.3
+OBJECT:3:_ZTSPm@@CXXABI_1.3
+OBJECT:3:_ZTSPs@@CXXABI_1.3
+OBJECT:3:_ZTSPt@@CXXABI_1.3
+OBJECT:3:_ZTSPv@@CXXABI_1.3
+OBJECT:3:_ZTSPw@@CXXABI_1.3
+OBJECT:3:_ZTSPx@@CXXABI_1.3
+OBJECT:3:_ZTSPy@@CXXABI_1.3
+OBJECT:3:_ZTSSd@@GLIBCXX_3.4
+OBJECT:3:_ZTSSi@@GLIBCXX_3.4
+OBJECT:3:_ZTSSo@@GLIBCXX_3.4
+OBJECT:40:_ZTSN10__cxxabiv123__fundamental_type_infoE@@CXXABI_1.3
+OBJECT:40:_ZTSSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTSSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTSSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTSSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTSSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTTSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTTSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTTSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTTSt9strstream@@GLIBCXX_3.4
+OBJECT:40:_ZTVSi@@GLIBCXX_3.4
+OBJECT:40:_ZTVSo@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt10istrstream@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt10ostrstream@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:41:_ZTSSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:41:_ZTSSt15basic_streambufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:44:_ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
+OBJECT:44:_ZTVN10__cxxabiv120__si_class_type_infoE@@CXXABI_1.3
+OBJECT:44:_ZTVN10__cxxabiv121__vmi_class_type_infoE@@CXXABI_1.3
+OBJECT:44:_ZTVSt14codecvt_bynameIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:44:_ZTVSt14codecvt_bynameIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:44:_ZTVSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:44:_ZTVSt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:44:_ZTVSt7codecvtIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:44:_ZTVSt7codecvtIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:45:_ZTSSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:45:_ZTSSt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:46:_ZTSN10__cxxabiv129__pointer_to_member_type_infoE@@CXXABI_1.3
+OBJECT:46:_ZTSSt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:46:_ZTSSt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:48:_ZTVSt12ctype_bynameIcE@@GLIBCXX_3.4
+OBJECT:48:_ZTVSt5ctypeIcE@@GLIBCXX_3.4
+OBJECT:48:_ZTVSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:48:_ZTVSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:49:_ZTSN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:49:_ZTSN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:49:_ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:49:_ZTSSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:4:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_max_sizeE@@GLIBCXX_3.4
+OBJECT:4:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_terminalE@@GLIBCXX_3.4
+OBJECT:4:_ZNSbIwSt11char_traitsIwESaIwEE4nposE@@GLIBCXX_3.4
+OBJECT:4:_ZNSs4_Rep11_S_max_sizeE@@GLIBCXX_3.4
+OBJECT:4:_ZNSs4nposE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10__num_base11_S_atoms_inE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10__num_base12_S_atoms_outE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10money_base18_S_default_patternE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10money_base8_S_atomsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10moneypunctIcLb0EE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10moneypunctIcLb1EE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10moneypunctIwLb0EE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10moneypunctIwLb1EE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt11__timepunctIcE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt11__timepunctIwE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt5ctypeIcE10table_sizeE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt5ctypeIcE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt5ctypeIwE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale3allE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale4noneE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale4timeE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale5ctypeE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale7collateE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale7numericE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale8messagesE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale8monetaryE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7codecvtIcc11__mbstate_tE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7codecvtIwc11__mbstate_tE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7collateIcE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7collateIwE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base10floatfieldE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base10scientificE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base11adjustfieldE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base2inE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3appE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3ateE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3begE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3curE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3decE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3endE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3hexE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3octE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3outE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base4leftE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base5fixedE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base5rightE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base5truncE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base6badbitE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base6binaryE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base6eofbitE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base6skipwsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base7failbitE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base7goodbitE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base7showposE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base7unitbufE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base8internalE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base8showbaseE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base9basefieldE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base9boolalphaE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base9showpointE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base9uppercaseE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8messagesIcE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8messagesIwE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8numpunctIcE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8numpunctIwE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:4:_ZTSPKa@@CXXABI_1.3
+OBJECT:4:_ZTSPKb@@CXXABI_1.3
+OBJECT:4:_ZTSPKc@@CXXABI_1.3
+OBJECT:4:_ZTSPKd@@CXXABI_1.3
+OBJECT:4:_ZTSPKe@@CXXABI_1.3
+OBJECT:4:_ZTSPKf@@CXXABI_1.3
+OBJECT:4:_ZTSPKh@@CXXABI_1.3
+OBJECT:4:_ZTSPKi@@CXXABI_1.3
+OBJECT:4:_ZTSPKj@@CXXABI_1.3
+OBJECT:4:_ZTSPKl@@CXXABI_1.3
+OBJECT:4:_ZTSPKm@@CXXABI_1.3
+OBJECT:4:_ZTSPKs@@CXXABI_1.3
+OBJECT:4:_ZTSPKt@@CXXABI_1.3
+OBJECT:4:_ZTSPKv@@CXXABI_1.3
+OBJECT:4:_ZTSPKw@@CXXABI_1.3
+OBJECT:4:_ZTSPKx@@CXXABI_1.3
+OBJECT:4:_ZTSPKy@@CXXABI_1.3
+OBJECT:50:_ZTSSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:50:_ZTSSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:50:_ZTSSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:50:_ZTSSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt10moneypunctIcLb0EE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt10moneypunctIcLb1EE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt10moneypunctIwLb0EE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt10moneypunctIwLb1EE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt17moneypunct_bynameIcLb0EE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt17moneypunct_bynameIcLb1EE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt17moneypunct_bynameIwLb0EE@@GLIBCXX_3.4
+OBJECT:52:_ZTVSt17moneypunct_bynameIwLb1EE@@GLIBCXX_3.4
+OBJECT:54:_ZTSN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:54:_ZTSN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:56:_ZNSt17__timepunct_cacheIcE12_S_timezonesE@@GLIBCXX_3.4
+OBJECT:56:_ZNSt17__timepunct_cacheIwE12_S_timezonesE@@GLIBCXX_3.4
+OBJECT:58:_ZTSSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:58:_ZTSSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:58:_ZTSSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:58:_ZTSSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:59:_ZTSSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:59:_ZTSSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:59:_ZTSSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:59:_ZTSSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTSSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTSSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTSSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTSSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSd@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTVSt9strstream@@GLIBCXX_3.4
+OBJECT:64:_ZTVN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt12ctype_bynameIwE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt12strstreambuf@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt13basic_filebufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt15basic_streambufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt21__ctype_abstract_baseIcE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt21__ctype_abstract_baseIwE@@GLIBCXX_3.4
+OBJECT:64:_ZTVSt5ctypeIwE@@GLIBCXX_3.4
+OBJECT:67:_ZTSSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:67:_ZTSSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:67:_ZTSSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:67:_ZTSSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt10moneypunctIcLb0EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt10moneypunctIcLb1EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt10moneypunctIwLb0EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt10moneypunctIwLb1EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt11__timepunctIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt11__timepunctIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7collateIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7collateIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8messagesIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8messagesIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8numpunctIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8numpunctIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZTINSt6locale5facetE@@GLIBCXX_3.4
+OBJECT:8:_ZTISt10ctype_base@@GLIBCXX_3.4
+OBJECT:8:_ZTISt10money_base@@GLIBCXX_3.4
+OBJECT:8:_ZTISt12codecvt_base@@GLIBCXX_3.4
+OBJECT:8:_ZTISt13messages_base@@GLIBCXX_3.4
+OBJECT:8:_ZTISt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:8:_ZTISt15basic_streambufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:8:_ZTISt8ios_base@@GLIBCXX_3.4
+OBJECT:8:_ZTISt9exception@@GLIBCXX_3.4
+OBJECT:8:_ZTISt9time_base@@GLIBCXX_3.4
+OBJECT:8:_ZTISt9type_info@@GLIBCXX_3.4
+OBJECT:8:_ZTIa@@CXXABI_1.3
+OBJECT:8:_ZTIb@@CXXABI_1.3
+OBJECT:8:_ZTIc@@CXXABI_1.3
+OBJECT:8:_ZTId@@CXXABI_1.3
+OBJECT:8:_ZTIe@@CXXABI_1.3
+OBJECT:8:_ZTIf@@CXXABI_1.3
+OBJECT:8:_ZTIh@@CXXABI_1.3
+OBJECT:8:_ZTIi@@CXXABI_1.3
+OBJECT:8:_ZTIj@@CXXABI_1.3
+OBJECT:8:_ZTIl@@CXXABI_1.3
+OBJECT:8:_ZTIm@@CXXABI_1.3
+OBJECT:8:_ZTIs@@CXXABI_1.3
+OBJECT:8:_ZTIt@@CXXABI_1.3
+OBJECT:8:_ZTIv@@CXXABI_1.3
+OBJECT:8:_ZTIw@@CXXABI_1.3
+OBJECT:8:_ZTIx@@CXXABI_1.3
+OBJECT:8:_ZTIy@@CXXABI_1.3
+OBJECT:8:_ZTTSi@@GLIBCXX_3.4
+OBJECT:8:_ZTTSo@@GLIBCXX_3.4
+OBJECT:8:_ZTTSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:8:_ZTTSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
diff --git a/libstdc++-v3/config/abi/powerpc64-linux-gnu/baseline_symbols.txt b/libstdc++-v3/config/abi/powerpc64-linux-gnu/baseline_symbols.txt
new file mode 100644
index 00000000000..2b1bb6746e9
--- /dev/null
+++ b/libstdc++-v3/config/abi/powerpc64-linux-gnu/baseline_symbols.txt
@@ -0,0 +1,3239 @@
+FUNC:._ZN10__cxxabiv116__enum_type_infoD0Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv116__enum_type_infoD1Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv116__enum_type_infoD2Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv117__array_type_infoD0Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv117__array_type_infoD1Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv117__array_type_infoD2Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv117__class_type_infoD0Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv117__class_type_infoD1Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv117__class_type_infoD2Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv117__pbase_type_infoD0Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv117__pbase_type_infoD1Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv117__pbase_type_infoD2Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv119__pointer_type_infoD0Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv119__pointer_type_infoD1Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv119__pointer_type_infoD2Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv120__function_type_infoD0Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv120__function_type_infoD1Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv120__function_type_infoD2Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv120__si_class_type_infoD0Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv120__si_class_type_infoD1Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv120__si_class_type_infoD2Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv121__vmi_class_type_infoD0Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv121__vmi_class_type_infoD1Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv121__vmi_class_type_infoD2Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv123__fundamental_type_infoD0Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv123__fundamental_type_infoD1Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv123__fundamental_type_infoD2Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv129__pointer_to_member_type_infoD0Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv129__pointer_to_member_type_infoD1Ev@@CXXABI_1.3
+FUNC:._ZN10__cxxabiv129__pointer_to_member_type_infoD2Ev@@CXXABI_1.3
+FUNC:._ZN9__gnu_cxx12__atomic_addEPVii@@GLIBCXX_3.4
+FUNC:._ZN9__gnu_cxx18__exchange_and_addEPVii@@GLIBCXX_3.4
+FUNC:._ZNK10__cxxabiv117__class_type_info10__do_catchEPKSt9type_infoPPvj@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PKvRNS0_15__upcast_resultE@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PPv@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv117__class_type_info12__do_dyncastElNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv117__class_type_info20__do_find_public_srcElPKvPKS0_S2_@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv117__pbase_type_info10__do_catchEPKSt9type_infoPPvj@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv117__pbase_type_info15__pointer_catchEPKS0_PPvj@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv119__pointer_type_info14__is_pointer_pEv@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv119__pointer_type_info15__pointer_catchEPKNS_17__pbase_type_infoEPPvj@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv120__function_type_info15__is_function_pEv@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv120__si_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv120__si_class_type_info12__do_dyncastElNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcElPKvPKNS_17__class_type_infoES2_@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv121__vmi_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv121__vmi_class_type_info12__do_dyncastElNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv121__vmi_class_type_info20__do_find_public_srcElPKvPKNS_17__class_type_infoES2_@@CXXABI_1.3
+FUNC:._ZNK10__cxxabiv129__pointer_to_member_type_info15__pointer_catchEPKNS_17__pbase_type_infoEPPvj@@CXXABI_1.3
+FUNC:._ZNSt6locale5_ImplC1EPKcm@@GLIBCXX_3.4
+FUNC:._ZNSt6locale5_ImplC1ERKS0_m@@GLIBCXX_3.4
+FUNC:._ZNSt6locale5_ImplC1Em@@GLIBCXX_3.4
+FUNC:._ZNSt6locale5_ImplC2EPKcm@@GLIBCXX_3.4
+FUNC:._ZNSt6locale5_ImplC2ERKS0_m@@GLIBCXX_3.4
+FUNC:._ZNSt6locale5_ImplC2Em@@GLIBCXX_3.4
+FUNC:._ZNSt6locale5_ImplD1Ev@@GLIBCXX_3.4
+FUNC:._ZNSt6locale5_ImplD2Ev@@GLIBCXX_3.4
+FUNC:._ZNSt6locale5facetD0Ev@@GLIBCXX_3.4
+FUNC:._ZNSt6locale5facetD1Ev@@GLIBCXX_3.4
+FUNC:._ZNSt6locale5facetD2Ev@@GLIBCXX_3.4
+FUNC:._ZNSt6localeD1Ev@@GLIBCXX_3.4
+FUNC:._ZNSt6localeD2Ev@@GLIBCXX_3.4
+FUNC:._ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
+FUNC:._ZNSt8ios_base4InitD2Ev@@GLIBCXX_3.4
+FUNC:._ZNSt8ios_baseD0Ev@@GLIBCXX_3.4
+FUNC:._ZNSt8ios_baseD1Ev@@GLIBCXX_3.4
+FUNC:._ZNSt8ios_baseD2Ev@@GLIBCXX_3.4
+FUNC:._ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@@GLIBCXX_3.4
+FUNC:._ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@@GLIBCXX_3.4
+FUNC:._ZSt14__convert_to_vIfEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt10moneypunctIcLb0EEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt10moneypunctIwLb0EEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt11__timepunctIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt11__timepunctIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt5ctypeIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt5ctypeIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt7codecvtIcc11__mbstate_tEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt7codecvtIwc11__mbstate_tEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt7collateIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt7collateIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt8messagesIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt8messagesIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt8numpunctIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt8numpunctIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZSt9has_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:._ZThn16_NSdD0Ev@@GLIBCXX_3.4
+FUNC:._ZThn16_NSdD1Ev@@GLIBCXX_3.4
+FUNC:._ZThn16_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:._ZThn16_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:._ZThn16_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:._ZThn16_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:._ZThn16_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:._ZThn16_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:._ZThn16_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:._ZThn16_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:._ZThn16_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:._ZThn16_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:._ZThn16_NSt9strstreamD0Ev@@GLIBCXX_3.4
+FUNC:._ZThn16_NSt9strstreamD1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSdD0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSdD1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSiD0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSiD1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSoD0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSoD1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt10istrstreamD0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt10istrstreamD1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt10ostrstreamD0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt10ostrstreamD1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt9strstreamD0Ev@@GLIBCXX_3.4
+FUNC:._ZTv0_n24_NSt9strstreamD1Ev@@GLIBCXX_3.4
+FUNC:._Znam@@GLIBCXX_3.4
+FUNC:._ZnamRKSt9nothrow_t@@GLIBCXX_3.4
+FUNC:._Znwm@@GLIBCXX_3.4
+FUNC:._ZnwmRKSt9nothrow_t@@GLIBCXX_3.4
+FUNC:_ZN10__cxxabiv116__enum_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv116__enum_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv116__enum_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__array_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__array_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__array_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__class_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__class_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__class_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__pbase_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__pbase_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv117__pbase_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv119__pointer_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv119__pointer_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv119__pointer_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__function_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__function_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__function_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__si_class_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__si_class_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv120__si_class_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv121__vmi_class_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv121__vmi_class_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv121__vmi_class_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv123__fundamental_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv123__fundamental_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv123__fundamental_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv129__pointer_to_member_type_infoD0Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv129__pointer_to_member_type_infoD1Ev@@CXXABI_1.3
+FUNC:_ZN10__cxxabiv129__pointer_to_member_type_infoD2Ev@@CXXABI_1.3
+FUNC:_ZN10__gnu_norm15_List_node_base4hookEPS0_@@GLIBCXX_3.4
+FUNC:_ZN10__gnu_norm15_List_node_base4swapERS0_S1_@@GLIBCXX_3.4
+FUNC:_ZN10__gnu_norm15_List_node_base6unhookEv@@GLIBCXX_3.4
+FUNC:_ZN10__gnu_norm15_List_node_base7reverseEv@@GLIBCXX_3.4
+FUNC:_ZN10__gnu_norm15_List_node_base8transferEPS0_S1_@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_iterator_base9_M_attachEPNS_19_Safe_sequence_baseEb@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_iterator_base9_M_detachEv@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_sequence_base13_M_detach_allEv@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_sequence_base18_M_detach_singularEv@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_sequence_base22_M_revalidate_singularEv@@GLIBCXX_3.4
+FUNC:_ZN11__gnu_debug19_Safe_sequence_base7_M_swapERS0_@@GLIBCXX_3.4
+FUNC:_ZN9__gnu_cxx12__atomic_addEPVii@@GLIBCXX_3.4
+FUNC:_ZN9__gnu_cxx18__exchange_and_addEPVii@@GLIBCXX_3.4
+FUNC:_ZN9__gnu_cxx27__verbose_terminate_handlerEv@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__class_type_info10__do_catchEPKSt9type_infoPPvj@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PKvRNS0_15__upcast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__class_type_info11__do_upcastEPKS0_PPv@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__class_type_info12__do_dyncastElNS0_10__sub_kindEPKS0_PKvS3_S5_RNS0_16__dyncast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__class_type_info20__do_find_public_srcElPKvPKS0_S2_@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__pbase_type_info10__do_catchEPKSt9type_infoPPvj@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv117__pbase_type_info15__pointer_catchEPKS0_PPvj@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv119__pointer_type_info14__is_pointer_pEv@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv119__pointer_type_info15__pointer_catchEPKNS_17__pbase_type_infoEPPvj@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv120__function_type_info15__is_function_pEv@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv120__si_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv120__si_class_type_info12__do_dyncastElNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv120__si_class_type_info20__do_find_public_srcElPKvPKNS_17__class_type_infoES2_@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv121__vmi_class_type_info11__do_upcastEPKNS_17__class_type_infoEPKvRNS1_15__upcast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv121__vmi_class_type_info12__do_dyncastElNS_17__class_type_info10__sub_kindEPKS1_PKvS4_S6_RNS1_16__dyncast_resultE@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv121__vmi_class_type_info20__do_find_public_srcElPKvPKNS_17__class_type_infoES2_@@CXXABI_1.3
+FUNC:_ZNK10__cxxabiv129__pointer_to_member_type_info15__pointer_catchEPKNS_17__pbase_type_infoEPPvj@@CXXABI_1.3
+FUNC:_ZNK11__gnu_debug16_Error_formatter10_M_messageENS_13_Debug_msg_idE@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug16_Error_formatter10_Parameter14_M_print_fieldEPKS0_PKc@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug16_Error_formatter10_Parameter20_M_print_descriptionEPKS0_@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug16_Error_formatter13_M_print_wordEPKc@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug16_Error_formatter15_M_print_stringEPKc@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug16_Error_formatter8_M_errorEv@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug19_Safe_iterator_base11_M_singularEv@@GLIBCXX_3.4
+FUNC:_ZNK11__gnu_debug19_Safe_iterator_base14_M_can_compareERKS0_@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEPKwmm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofERKS2_m@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE12find_last_ofEwm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEPKwmm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofERKS2_m@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13find_first_ofEwm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE13get_allocatorEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEPKwmm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofERKS2_m@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE16find_last_not_ofEwm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEPKwmm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofERKS2_m@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE17find_first_not_ofEwm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE2atEm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE3endEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_leakedEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4_Rep12_M_is_sharedEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4copyEPwmm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4dataEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEPKwmm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findERKS2_m@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4findEwm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4rendEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE4sizeEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5beginEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5c_strEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5emptyEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEPKwmm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindERKS2_m@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE5rfindEwm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6_M_repEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6lengthEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6rbeginEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE6substrEmm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7_M_dataEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7_M_iendEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEPKw@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareERKS2_@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmPKw@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmPKwm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmRKS2_@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE7compareEmmRKS2_mm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8_M_checkEmPKc@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8_M_limitEmm@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8capacityEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE8max_sizeEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEE9_M_ibeginEv@@GLIBCXX_3.4
+FUNC:_ZNKSbIwSt11char_traitsIwESaIwEEixEm@@GLIBCXX_3.4
+FUNC:_ZNKSi6gcountEv@@GLIBCXX_3.4
+FUNC:_ZNKSi6sentrycvbEv@@GLIBCXX_3.4
+FUNC:_ZNKSo6sentrycvbEv@@GLIBCXX_3.4
+FUNC:_ZNKSs12find_last_ofEPKcm@@GLIBCXX_3.4
+FUNC:_ZNKSs12find_last_ofEPKcmm@@GLIBCXX_3.4
+FUNC:_ZNKSs12find_last_ofERKSsm@@GLIBCXX_3.4
+FUNC:_ZNKSs12find_last_ofEcm@@GLIBCXX_3.4
+FUNC:_ZNKSs13find_first_ofEPKcm@@GLIBCXX_3.4
+FUNC:_ZNKSs13find_first_ofEPKcmm@@GLIBCXX_3.4
+FUNC:_ZNKSs13find_first_ofERKSsm@@GLIBCXX_3.4
+FUNC:_ZNKSs13find_first_ofEcm@@GLIBCXX_3.4
+FUNC:_ZNKSs13get_allocatorEv@@GLIBCXX_3.4
+FUNC:_ZNKSs16find_last_not_ofEPKcm@@GLIBCXX_3.4
+FUNC:_ZNKSs16find_last_not_ofEPKcmm@@GLIBCXX_3.4
+FUNC:_ZNKSs16find_last_not_ofERKSsm@@GLIBCXX_3.4
+FUNC:_ZNKSs16find_last_not_ofEcm@@GLIBCXX_3.4
+FUNC:_ZNKSs17find_first_not_ofEPKcm@@GLIBCXX_3.4
+FUNC:_ZNKSs17find_first_not_ofEPKcmm@@GLIBCXX_3.4
+FUNC:_ZNKSs17find_first_not_ofERKSsm@@GLIBCXX_3.4
+FUNC:_ZNKSs17find_first_not_ofEcm@@GLIBCXX_3.4
+FUNC:_ZNKSs2atEm@@GLIBCXX_3.4
+FUNC:_ZNKSs3endEv@@GLIBCXX_3.4
+FUNC:_ZNKSs4_Rep12_M_is_leakedEv@@GLIBCXX_3.4
+FUNC:_ZNKSs4_Rep12_M_is_sharedEv@@GLIBCXX_3.4
+FUNC:_ZNKSs4copyEPcmm@@GLIBCXX_3.4
+FUNC:_ZNKSs4dataEv@@GLIBCXX_3.4
+FUNC:_ZNKSs4findEPKcm@@GLIBCXX_3.4
+FUNC:_ZNKSs4findEPKcmm@@GLIBCXX_3.4
+FUNC:_ZNKSs4findERKSsm@@GLIBCXX_3.4
+FUNC:_ZNKSs4findEcm@@GLIBCXX_3.4
+FUNC:_ZNKSs4rendEv@@GLIBCXX_3.4
+FUNC:_ZNKSs4sizeEv@@GLIBCXX_3.4
+FUNC:_ZNKSs5beginEv@@GLIBCXX_3.4
+FUNC:_ZNKSs5c_strEv@@GLIBCXX_3.4
+FUNC:_ZNKSs5emptyEv@@GLIBCXX_3.4
+FUNC:_ZNKSs5rfindEPKcm@@GLIBCXX_3.4
+FUNC:_ZNKSs5rfindEPKcmm@@GLIBCXX_3.4
+FUNC:_ZNKSs5rfindERKSsm@@GLIBCXX_3.4
+FUNC:_ZNKSs5rfindEcm@@GLIBCXX_3.4
+FUNC:_ZNKSs6_M_repEv@@GLIBCXX_3.4
+FUNC:_ZNKSs6lengthEv@@GLIBCXX_3.4
+FUNC:_ZNKSs6rbeginEv@@GLIBCXX_3.4
+FUNC:_ZNKSs6substrEmm@@GLIBCXX_3.4
+FUNC:_ZNKSs7_M_dataEv@@GLIBCXX_3.4
+FUNC:_ZNKSs7_M_iendEv@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareEPKc@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareERKSs@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareEmmPKc@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareEmmPKcm@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareEmmRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSs7compareEmmRKSsmm@@GLIBCXX_3.4
+FUNC:_ZNKSs8_M_checkEmPKc@@GLIBCXX_3.4
+FUNC:_ZNKSs8_M_limitEmm@@GLIBCXX_3.4
+FUNC:_ZNKSs8capacityEv@@GLIBCXX_3.4
+FUNC:_ZNKSs8max_sizeEv@@GLIBCXX_3.4
+FUNC:_ZNKSs9_M_ibeginEv@@GLIBCXX_3.4
+FUNC:_ZNKSsixEm@@GLIBCXX_3.4
+FUNC:_ZNKSt10istrstream5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE10neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE10pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE11curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE11frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13do_neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13do_pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE14do_curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE14do_frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb0EE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE10neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE10pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE11curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE11frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13do_neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13do_pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE14do_curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE14do_frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIcLb1EE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE10neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE10pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE11curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE11frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13do_neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13do_pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE14do_curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE14do_frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb0EE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE10neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE10pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE11curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE11frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13do_neg_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13do_pos_formatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE14do_curr_symbolEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE14do_frac_digitsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_negative_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_positive_signEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10moneypunctIwLb1EE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10ostrstream5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt10ostrstream6pcountEv@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE15_M_am_pm_formatEPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE15_M_date_formatsEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE15_M_time_formatsEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE19_M_days_abbreviatedEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE20_M_date_time_formatsEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE21_M_months_abbreviatedEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE6_M_putEPcmPKcPK2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE7_M_daysEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE8_M_am_pmEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIcE9_M_monthsEPPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE15_M_am_pm_formatEPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE15_M_date_formatsEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE15_M_time_formatsEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE19_M_days_abbreviatedEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE20_M_date_time_formatsEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE21_M_months_abbreviatedEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE6_M_putEPwmPKwPK2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE7_M_daysEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE8_M_am_pmEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11__timepunctIwE9_M_monthsEPPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt11logic_error4whatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt12__basic_fileIcE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNKSt12strstreambuf6pcountEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_filebufIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_filebufIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_fstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_fstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_istreamIwSt11char_traitsIwEE6gcountEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_istreamIwSt11char_traitsIwEE6sentrycvbEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13basic_ostreamIwSt11char_traitsIwEE6sentrycvbEv@@GLIBCXX_3.4
+FUNC:_ZNKSt13runtime_error4whatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt14basic_ifstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt14basic_ifstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt14basic_ofstreamIcSt11char_traitsIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt14basic_ofstreamIwSt11char_traitsIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE4gptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE4pptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5ebackEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5egptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5epptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE5pbaseEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIcSt11char_traitsIcEE6getlocEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE4gptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE4pptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5ebackEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5egptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5epptrEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE5pbaseEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_streambufIwSt11char_traitsIwEE6getlocEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt18basic_stringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt18basic_stringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_istringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_istringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strEv@@GLIBCXX_3.4
+FUNC:_ZNKSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE10do_tolowerEPcPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE10do_tolowerEc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE10do_toupperEPcPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE10do_toupperEc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE8do_widenEPKcS2_Pc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE8do_widenEc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE9do_narrowEPKcS2_cPc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIcE9do_narrowEcc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE10do_scan_isEtPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE10do_tolowerEPwPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE10do_tolowerEw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE10do_toupperEPwPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE10do_toupperEw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE11do_scan_notEtPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE19_M_convert_to_wmaskEt@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE5do_isEPKwS2_Pt@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE5do_isEtw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE8do_widenEPKcS2_Pw@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE8do_widenEc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE9do_narrowEPKwS2_cPc@@GLIBCXX_3.4
+FUNC:_ZNKSt5ctypeIwE9do_narrowEwc@@GLIBCXX_3.4
+FUNC:_ZNKSt6locale2id5_M_idEv@@GLIBCXX_3.4
+FUNC:_ZNKSt6locale4nameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt6localeeqERKS_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE11do_encodingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE13do_max_lengthEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE16do_always_noconvEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE5do_inERS0_PKcS4_RS4_PcS6_RS6_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE6do_outERS0_PKcS4_RS4_PcS6_RS6_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIcc11__mbstate_tE9do_lengthERS0_PKcS4_m@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE10do_unshiftERS0_PcS3_RS3_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE11do_encodingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE13do_max_lengthEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE16do_always_noconvEv@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE5do_inERS0_PKcS4_RS4_PwS6_RS6_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE6do_outERS0_PKwS4_RS4_PcS6_RS6_@@GLIBCXX_3.4
+FUNC:_ZNKSt7codecvtIwc11__mbstate_tE9do_lengthERS0_PKcS4_m@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE10_M_compareEPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE10do_compareEPKcS2_S2_S2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE12_M_transformEPcPKcm@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE12do_transformEPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE4hashEPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE7compareEPKcS2_S2_S2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE7do_hashEPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIcE9transformEPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE10_M_compareEPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE10do_compareEPKwS2_S2_S2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE12_M_transformEPwPKwm@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE12do_transformEPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE4hashEPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE7compareEPKwS2_S2_S2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE7do_hashEPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7collateIwE9transformEPKwS2_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIjEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIlEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intImEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intItEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIxEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIyEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIjEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIlEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intImEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intItEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIxEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intIyEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16_M_extract_floatES3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRPv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRf@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRj@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRt@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE12_M_group_intEPKcmcRSt8ios_basePcS9_Ri@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIlEES3_S3_RSt8ios_basecT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intImEES3_S3_RSt8ios_basecT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIxEES3_S3_RSt8ios_basecT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIyEES3_S3_RSt8ios_basecT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE14_M_group_floatEPKcmcS6_PcS7_Ri@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIdEES3_S3_RSt8ios_baseccT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIeEES3_S3_RSt8ios_baseccT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPKv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basece@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6_M_padEclRSt8ios_basePcPKcRi@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPKv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basece@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE12_M_group_intEPKcmwRSt8ios_basePwS9_Ri@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIlEES3_S3_RSt8ios_basewT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intImEES3_S3_RSt8ios_basewT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIxEES3_S3_RSt8ios_basewT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE13_M_insert_intIyEES3_S3_RSt8ios_basewT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE14_M_group_floatEPKcmwPKwPwS9_Ri@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIdEES3_S3_RSt8ios_basewcT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE15_M_insert_floatIeEES3_S3_RSt8ios_basewcT_@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPKv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewy@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6_M_padEwlRSt8ios_basePwPKwRi@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPKv@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewb@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewd@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewe@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewl@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewm@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewx@@GLIBCXX_3.4
+FUNC:_ZNKSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewy@@GLIBCXX_3.4
+FUNC:_ZNKSt8ios_base7failure4whatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE18_M_convert_to_charERKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE20_M_convert_from_charEPc@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE3getEiiiRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE4openERKSsRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE4openERKSsRKSt6localePKc@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE5closeEi@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE6do_getEiiiRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE7do_openERKSsRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIcE8do_closeEi@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE18_M_convert_to_charERKSbIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE20_M_convert_from_charEPc@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE3getEiiiRKSbIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE4openERKSsRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE4openERKSsRKSt6localePKc@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE5closeEi@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE6do_getEiiiRKSbIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE7do_openERKSsRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNKSt8messagesIwE8do_closeEi@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE11do_truenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE12do_falsenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE8truenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIcE9falsenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE11do_groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE11do_truenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE12do_falsenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE13decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE13thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE16do_decimal_pointEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE16do_thousands_sepEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE8groupingEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE8truenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8numpunctIwE9falsenameEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10date_orderEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11do_get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE11get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13do_date_orderEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE13get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_numES3_S3_RiiimRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14do_get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE15_M_extract_nameES3_S3_RiPPKcmRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE21_M_extract_via_formatES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKc@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10date_orderEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11do_get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE11get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13do_date_orderEv@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE13get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_numES3_S3_RiiimRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14do_get_weekdayES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE15_M_extract_nameES3_S3_RiPPKwmRSt8ios_baseRSt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE16do_get_monthnameES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE21_M_extract_via_formatES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tmPKw@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_dateES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_timeES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE8get_yearES3_S3_RSt8ios_baseRSt12_Ios_IostateP2tm@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmcc@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_RSt8ios_basecPK2tmcc@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmPKwSB_@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_RSt8ios_basewPK2tmcc@@GLIBCXX_3.4
+FUNC:_ZNKSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_RSt8ios_basewPK2tmcc@@GLIBCXX_3.4
+FUNC:_ZNKSt8valarrayImE4sizeEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE10exceptionsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3badEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3eofEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE3tieEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4failEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4fillEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE4goodEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE5widenEc@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE6narrowEcc@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEE7rdstateEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEcvPvEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIcSt11char_traitsIcEEntEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE10exceptionsEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3badEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3eofEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE3tieEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4failEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4fillEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE4goodEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE5widenEc@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE6narrowEwc@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEE7rdstateEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEEcvPvEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9basic_iosIwSt11char_traitsIwEEntEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9exception4whatEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb0EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb1EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb0EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE10_M_extractILb1EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basecRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_bRSt8ios_basece@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basecRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE6do_putES3_bRSt8ios_basece@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb0EEES3_S3_RSt8ios_basecRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb1EEES3_S3_RSt8ios_basecRKSs@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE3putES3_bRSt8ios_basewe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE6do_putES3_bRSt8ios_basewe@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb0EEES3_S3_RSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE9_M_insertILb1EEES3_S3_RSt8ios_basewRKSbIwS2_SaIwEE@@GLIBCXX_3.4
+FUNC:_ZNKSt9strstream5rdbufEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9strstream6pcountEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9type_info10__do_catchEPKS_PPvj@@GLIBCXX_3.4
+FUNC:_ZNKSt9type_info11__do_upcastEPKN10__cxxabiv117__class_type_infoEPPv@@GLIBCXX_3.4
+FUNC:_ZNKSt9type_info14__is_pointer_pEv@@GLIBCXX_3.4
+FUNC:_ZNKSt9type_info15__is_function_pEv@@GLIBCXX_3.4
+FUNC:_ZNSaIcEC1ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSaIcEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIcEC2ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSaIcEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIwEC1ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSaIwEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIwEC2ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSaIwEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSaIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hiderC1EPwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_Alloc_hiderC2EPwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_M_leak_hardEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_S_constructEmwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE12_S_empty_repEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIPKwS2_EES8_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwN9__gnu_cxx17__normal_iteratorIS3_S2_EES6_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwPKwS5_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE13_S_copy_charsEPwS3_S3_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE14_M_replace_auxEmmmw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE15_M_replace_safeEmmPKwm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE2atEm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE3endEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_destroyERKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_disposeERKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refcopyEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep10_M_refdataEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep12_S_empty_repEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep13_M_set_leakedEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep15_M_set_sharableEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep7_M_grabERKS1_S5_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep8_M_cloneERKS1_m@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep9_S_createEmmRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4rendEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE4swapERS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5beginEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5clearEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EE@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE5eraseEmm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEPKwm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendERKS2_mm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6appendEmw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEPKwm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignERKS2_mm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6assignEmw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEmw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEN9__gnu_cxx17__normal_iteratorIPwS2_EEw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmPKwm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmRKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmRKS2_mm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6insertEmmw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6rbeginEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6resizeEm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE6resizeEmw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7_M_dataEPw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7_M_leakEv@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_NS4_IPKwS2_EES9_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwS8_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_PKwm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_RKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S5_S5_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_S6_S6_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEN9__gnu_cxx17__normal_iteratorIPwS2_EES6_mw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmPKwm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmRKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmRKS2_mm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7replaceEmmmw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE7reserveEm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE9_M_mutateEmmm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEE9push_backEw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EPKwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EPKwmRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_mm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1ERKS2_mmRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1EmwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IN9__gnu_cxx17__normal_iteratorIPwS2_EEEET_S8_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IPKwEET_S6_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC1IPwEET_S5_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EPKwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EPKwmRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_mm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2ERKS2_mmRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2EmwRKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IN9__gnu_cxx17__normal_iteratorIPwS2_EEEET_S8_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IPKwEET_S6_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEC2IPwEET_S5_RKS1_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSEPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEaSEw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEixEm@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLEPKw@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSbIwSt11char_traitsIwESaIwEEpLEw@@GLIBCXX_3.4
+FUNC:_ZNSdC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSdC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSdC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSdC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSdD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSdD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSdD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSi3getEPcl@@GLIBCXX_3.4
+FUNC:_ZNSi3getEPclc@@GLIBCXX_3.4
+FUNC:_ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSi3getERSt15basic_streambufIcSt11char_traitsIcEEc@@GLIBCXX_3.4
+FUNC:_ZNSi3getERc@@GLIBCXX_3.4
+FUNC:_ZNSi3getEv@@GLIBCXX_3.4
+FUNC:_ZNSi4peekEv@@GLIBCXX_3.4
+FUNC:_ZNSi4readEPcl@@GLIBCXX_3.4
+FUNC:_ZNSi4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSi5seekgESt4fposI11__mbstate_tE@@GLIBCXX_3.4
+FUNC:_ZNSi5seekgElSt12_Ios_Seekdir@@GLIBCXX_3.4
+FUNC:_ZNSi5tellgEv@@GLIBCXX_3.4
+FUNC:_ZNSi5ungetEv@@GLIBCXX_3.4
+FUNC:_ZNSi6ignoreEli@@GLIBCXX_3.4
+FUNC:_ZNSi6sentryC1ERSib@@GLIBCXX_3.4
+FUNC:_ZNSi6sentryC2ERSib@@GLIBCXX_3.4
+FUNC:_ZNSi7getlineEPcl@@GLIBCXX_3.4
+FUNC:_ZNSi7getlineEPclc@@GLIBCXX_3.4
+FUNC:_ZNSi7putbackEc@@GLIBCXX_3.4
+FUNC:_ZNSi8readsomeEPcl@@GLIBCXX_3.4
+FUNC:_ZNSiC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSiC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSiC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSiC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSiD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSiD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSiD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSirsEPFRSiS_E@@GLIBCXX_3.4
+FUNC:_ZNSirsEPFRSt8ios_baseS0_E@@GLIBCXX_3.4
+FUNC:_ZNSirsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCXX_3.4
+FUNC:_ZNSirsEPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSirsERPv@@GLIBCXX_3.4
+FUNC:_ZNSirsERb@@GLIBCXX_3.4
+FUNC:_ZNSirsERd@@GLIBCXX_3.4
+FUNC:_ZNSirsERe@@GLIBCXX_3.4
+FUNC:_ZNSirsERf@@GLIBCXX_3.4
+FUNC:_ZNSirsERi@@GLIBCXX_3.4
+FUNC:_ZNSirsERj@@GLIBCXX_3.4
+FUNC:_ZNSirsERl@@GLIBCXX_3.4
+FUNC:_ZNSirsERm@@GLIBCXX_3.4
+FUNC:_ZNSirsERs@@GLIBCXX_3.4
+FUNC:_ZNSirsERt@@GLIBCXX_3.4
+FUNC:_ZNSirsERx@@GLIBCXX_3.4
+FUNC:_ZNSirsERy@@GLIBCXX_3.4
+FUNC:_ZNSo3putEc@@GLIBCXX_3.4
+FUNC:_ZNSo5flushEv@@GLIBCXX_3.4
+FUNC:_ZNSo5seekpESt4fposI11__mbstate_tE@@GLIBCXX_3.4
+FUNC:_ZNSo5seekpElSt12_Ios_Seekdir@@GLIBCXX_3.4
+FUNC:_ZNSo5tellpEv@@GLIBCXX_3.4
+FUNC:_ZNSo5writeEPKcl@@GLIBCXX_3.4
+FUNC:_ZNSo6sentryC1ERSo@@GLIBCXX_3.4
+FUNC:_ZNSo6sentryC2ERSo@@GLIBCXX_3.4
+FUNC:_ZNSo6sentryD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSo6sentryD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSo8_M_writeEPKcl@@GLIBCXX_3.4
+FUNC:_ZNSoC1EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSoC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSoC2EPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSoC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSoD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSoD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSoD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSolsEPFRSoS_E@@GLIBCXX_3.4
+FUNC:_ZNSolsEPFRSt8ios_baseS0_E@@GLIBCXX_3.4
+FUNC:_ZNSolsEPFRSt9basic_iosIcSt11char_traitsIcEES3_E@@GLIBCXX_3.4
+FUNC:_ZNSolsEPKv@@GLIBCXX_3.4
+FUNC:_ZNSolsEPSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+FUNC:_ZNSolsEb@@GLIBCXX_3.4
+FUNC:_ZNSolsEd@@GLIBCXX_3.4
+FUNC:_ZNSolsEe@@GLIBCXX_3.4
+FUNC:_ZNSolsEf@@GLIBCXX_3.4
+FUNC:_ZNSolsEi@@GLIBCXX_3.4
+FUNC:_ZNSolsEj@@GLIBCXX_3.4
+FUNC:_ZNSolsEl@@GLIBCXX_3.4
+FUNC:_ZNSolsEm@@GLIBCXX_3.4
+FUNC:_ZNSolsEs@@GLIBCXX_3.4
+FUNC:_ZNSolsEt@@GLIBCXX_3.4
+FUNC:_ZNSolsEx@@GLIBCXX_3.4
+FUNC:_ZNSolsEy@@GLIBCXX_3.4
+FUNC:_ZNSs12_Alloc_hiderC1EPcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs12_Alloc_hiderC2EPcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs12_M_leak_hardEv@@GLIBCXX_3.4
+FUNC:_ZNSs12_S_constructEmcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs12_S_empty_repEv@@GLIBCXX_3.4
+FUNC:_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcSsEES4_@@GLIBCXX_3.4
+FUNC:_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS_SsEES2_@@GLIBCXX_3.4
+FUNC:_ZNSs13_S_copy_charsEPcPKcS1_@@GLIBCXX_3.4
+FUNC:_ZNSs13_S_copy_charsEPcS_S_@@GLIBCXX_3.4
+FUNC:_ZNSs14_M_replace_auxEmmmc@@GLIBCXX_3.4
+FUNC:_ZNSs15_M_replace_safeEmmPKcm@@GLIBCXX_3.4
+FUNC:_ZNSs2atEm@@GLIBCXX_3.4
+FUNC:_ZNSs3endEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep10_M_destroyERKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep10_M_disposeERKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep10_M_refcopyEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep10_M_refdataEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep12_S_empty_repEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep13_M_set_leakedEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep15_M_set_sharableEv@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep7_M_grabERKSaIcES2_@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep8_M_cloneERKSaIcEm@@GLIBCXX_3.4
+FUNC:_ZNSs4_Rep9_S_createEmmRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSs4rendEv@@GLIBCXX_3.4
+FUNC:_ZNSs4swapERSs@@GLIBCXX_3.4
+FUNC:_ZNSs5beginEv@@GLIBCXX_3.4
+FUNC:_ZNSs5clearEv@@GLIBCXX_3.4
+FUNC:_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEE@@GLIBCXX_3.4
+FUNC:_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEES2_@@GLIBCXX_3.4
+FUNC:_ZNSs5eraseEmm@@GLIBCXX_3.4
+FUNC:_ZNSs6appendEPKc@@GLIBCXX_3.4
+FUNC:_ZNSs6appendEPKcm@@GLIBCXX_3.4
+FUNC:_ZNSs6appendERKSs@@GLIBCXX_3.4
+FUNC:_ZNSs6appendERKSsmm@@GLIBCXX_3.4
+FUNC:_ZNSs6appendEmc@@GLIBCXX_3.4
+FUNC:_ZNSs6assignEPKc@@GLIBCXX_3.4
+FUNC:_ZNSs6assignEPKcm@@GLIBCXX_3.4
+FUNC:_ZNSs6assignERKSs@@GLIBCXX_3.4
+FUNC:_ZNSs6assignERKSsmm@@GLIBCXX_3.4
+FUNC:_ZNSs6assignEmc@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEc@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEmc@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEmPKc@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEmPKcm@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEmRKSs@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEmRKSsmm@@GLIBCXX_3.4
+FUNC:_ZNSs6insertEmmc@@GLIBCXX_3.4
+FUNC:_ZNSs6rbeginEv@@GLIBCXX_3.4
+FUNC:_ZNSs6resizeEm@@GLIBCXX_3.4
+FUNC:_ZNSs6resizeEmc@@GLIBCXX_3.4
+FUNC:_ZNSs7_M_dataEPc@@GLIBCXX_3.4
+FUNC:_ZNSs7_M_leakEv@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_NS0_IPKcSsEES5_@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKc@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcS4_@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcm@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_RKSs@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S1_S1_@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S2_S2_@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_mc@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEmmPKc@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEmmPKcm@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEmmRKSs@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEmmRKSsmm@@GLIBCXX_3.4
+FUNC:_ZNSs7replaceEmmmc@@GLIBCXX_3.4
+FUNC:_ZNSs7reserveEm@@GLIBCXX_3.4
+FUNC:_ZNSs9_M_mutateEmmm@@GLIBCXX_3.4
+FUNC:_ZNSs9push_backEc@@GLIBCXX_3.4
+FUNC:_ZNSsC1EPKcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1EPKcmRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1ERKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSsC1ERKSsmm@@GLIBCXX_3.4
+FUNC:_ZNSsC1ERKSsmmRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1EmcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSsC1IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1IPKcEET_S2_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC1IPcEET_S1_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2EPKcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2EPKcmRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2ERKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSsC2ERKSsmm@@GLIBCXX_3.4
+FUNC:_ZNSsC2ERKSsmmRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2EmcRKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSsC2IN9__gnu_cxx17__normal_iteratorIPcSsEEEET_S4_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2IPKcEET_S2_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsC2IPcEET_S1_RKSaIcE@@GLIBCXX_3.4
+FUNC:_ZNSsD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSsD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSsaSEPKc@@GLIBCXX_3.4
+FUNC:_ZNSsaSERKSs@@GLIBCXX_3.4
+FUNC:_ZNSsaSEc@@GLIBCXX_3.4
+FUNC:_ZNSsixEm@@GLIBCXX_3.4
+FUNC:_ZNSspLEPKc@@GLIBCXX_3.4
+FUNC:_ZNSspLERKSs@@GLIBCXX_3.4
+FUNC:_ZNSspLEc@@GLIBCXX_3.4
+FUNC:_ZNSt10__num_base15_S_format_floatERKSt8ios_basePcc@@GLIBCXX_3.4
+FUNC:_ZNSt10bad_typeidD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10bad_typeidD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10bad_typeidD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstream3strEv@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC1EPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC1EPKcl@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC1EPc@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC1EPcl@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC2EPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC2EPKcl@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC2EPc@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamC2EPcl@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10istrstreamD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10money_base20_S_construct_patternEccc@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC1EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC1EPSt18__moneypunct_cacheIcLb0EEm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC2EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC2EPSt18__moneypunct_cacheIcLb0EEm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC1EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC1EPSt18__moneypunct_cacheIcLb1EEm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC2EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC2EPSt18__moneypunct_cacheIcLb1EEm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIcLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC1EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC1EPSt18__moneypunct_cacheIwLb0EEm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC2EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC2EPSt18__moneypunct_cacheIwLb0EEm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EE24_M_initialize_moneypunctEP15__locale_structPKc@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC1EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC1EPSt18__moneypunct_cacheIwLb1EEm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC2EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC2EPSt18__moneypunct_cacheIwLb1EEm@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10moneypunctIwLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstream3strEv@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstream6freezeEb@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamC1EPciSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamC2EPciSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt10ostrstreamD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcE23_M_initialize_timepunctEP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC1EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC1EPSt17__timepunct_cacheIcEm@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC2EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC2EPSt17__timepunct_cacheIcEm@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwE23_M_initialize_timepunctEP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC1EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC1EPSt17__timepunct_cacheIwEm@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC2EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC2EPSt17__timepunct_cacheIwEm@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11__timepunctIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11logic_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt11logic_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt11logic_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11logic_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11logic_errorD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11range_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt11range_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt11range_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt11range_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE2fdEv@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE4openEPKcSt13_Ios_Openmodei@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE6xsgetnEPcl@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE6xsputnEPKcl@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE7seekoffElSt12_Ios_Seekdir@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE8sys_openEP8_IO_FILESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE8sys_openEiSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE8xsputn_2EPKclS2_l@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcE9showmanycEv@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcEC1EP15pthread_mutex_t@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcEC2EP15pthread_mutex_t@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12__basic_fileIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIcEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIcEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIwEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIwEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12ctype_bynameIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12domain_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12domain_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12domain_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12domain_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12length_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12length_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12length_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12length_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12out_of_rangeC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12out_of_rangeC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt12out_of_rangeD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12out_of_rangeD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf3strEv@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf6freezeEb@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf6setbufEPcl@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf7_M_freeEPc@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf8_M_allocEm@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf8_M_setupEPcS0_l@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf8overflowEi@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf9pbackfailEi@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambuf9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPFPvmEPFvS0_E@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPKal@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPKcl@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPKhl@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPalS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPclS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1EPhlS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC1El@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPFPvmEPFvS0_E@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPKal@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPKcl@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPKhl@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPalS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPclS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2EPhlS0_@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufC2El@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt12strstreambufD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13bad_exceptionD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13bad_exceptionD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13bad_exceptionD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE13_M_set_bufferEl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE15_M_create_pbackEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE16_M_destroy_pbackEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE19_M_terminate_outputEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE22_M_convert_to_externalEPcl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE26_M_destroy_internal_bufferEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE27_M_allocate_internal_bufferEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6setbufEPcl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6xsgetnEPcl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE6xsputnEPKcl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7_M_seekElSt12_Ios_Seekdir11__mbstate_t@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE8overflowEi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9showmanycEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE13_M_set_bufferEl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE15_M_create_pbackEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE16_M_destroy_pbackEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE19_M_terminate_outputEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE22_M_convert_to_externalEPwl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE26_M_destroy_internal_bufferEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE27_M_allocate_internal_bufferEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6setbufEPwl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6xsgetnEPwl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE6xsputnEPKwl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE7_M_seekElSt12_Ios_Seekdir11__mbstate_t@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE8overflowEj@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9pbackfailEj@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9showmanycEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_filebufIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_fstreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEPwlw@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERSt15basic_streambufIwS1_Ew@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getERw@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE3getEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4peekEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4readEPwl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgESt4fposI11__mbstate_tE@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5seekgElSt12_Ios_Seekdir@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5tellgEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE5ungetEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreElj@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentryC1ERS2_b@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE6sentryC2ERS2_b@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7getlineEPwlw@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE7putbackEw@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEE8readsomeEPwl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRS2_S3_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt8ios_baseS4_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPFRSt9basic_iosIwS1_ES5_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsEPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERPv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERb@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERd@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERe@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERf@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERj@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERm@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERs@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERt@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERx@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_istreamIwSt11char_traitsIwEErsERy@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE3putEw@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5flushEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpESt4fposI11__mbstate_tE@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5seekpElSt12_Ios_Seekdir@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5tellpEv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKwl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC1ERS2_@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryC2ERS2_@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentryD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEE8_M_writeEPKwl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRS2_S3_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt8ios_baseS4_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPFRSt9basic_iosIwS1_ES5_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPKv@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEb@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEd@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEe@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEf@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEi@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEj@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEl@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEm@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEs@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEt@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEx@@GLIBCXX_3.4
+FUNC:_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEy@@GLIBCXX_3.4
+FUNC:_ZNSt13runtime_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt13runtime_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt13runtime_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13runtime_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt13runtime_errorD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ifstreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_iostreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE4openEPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE5closeEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEE7is_openEv@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2EPKcSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14basic_ofstreamIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIcc11__mbstate_tED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14codecvt_bynameIwc11__mbstate_tED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIcEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIcEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIwEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIwEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14collate_bynameIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14overflow_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt14overflow_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt14overflow_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt14overflow_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15_List_node_base4hookEPS_@@GLIBCXX_3.4
+FUNC:_ZNSt15_List_node_base4swapERS_S0_@@GLIBCXX_3.4
+FUNC:_ZNSt15_List_node_base6unhookEv@@GLIBCXX_3.4
+FUNC:_ZNSt15_List_node_base7reverseEv@@GLIBCXX_3.4
+FUNC:_ZNSt15_List_node_base8transferEPS_S0_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE10pubseekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setgEPcS3_S3_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4setpEPcS3_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5gbumpEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5pbumpEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sgetnEPcl@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputcEc@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5sputnEPKcl@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE5uflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6sbumpcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6setbufEPcl@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6snextcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsgetnEPcl@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE6xsputnEPKcl@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7pubsyncEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE7sungetcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8in_availEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8overflowEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE8pubimbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9pbackfailEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9pubsetbufEPcl@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9showmanycEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9sputbackcEc@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC1ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC2ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIcSt11char_traitsIcEEaSERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE10pubseekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4setgEPwS3_S3_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4setpEPwS3_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE4syncEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5gbumpEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5pbumpEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sgetnEPwl@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sputcEw@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5sputnEPKwl@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE5uflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6sbumpcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6setbufEPwl@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6snextcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsgetnEPwl@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE6xsputnEPKwl@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7pubsyncEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE7sungetcEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8in_availEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8overflowEj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE8pubimbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9pbackfailEj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9pubsetbufEPwl@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9showmanycEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9sputbackcEw@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC1ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC2ERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_streambufIwSt11char_traitsIwEEaSERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE15_M_update_egptrEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPcl@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7_M_syncEPcmm@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE8overflowEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9pbackfailEi@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE15_M_update_egptrEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE17_M_stringbuf_initESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE6setbufEPwl@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7_M_syncEPwmm@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE7seekposESt4fposI11__mbstate_tESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE8overflowEj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9pbackfailEj@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEE9underflowEv@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15basic_stringbufIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIcEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIcEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIwEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIwEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15messages_bynameIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIcEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIcEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIwEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIwEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15numpunct_bynameIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15underflow_errorC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt15underflow_errorC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt15underflow_errorD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt15underflow_errorD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16__numpunct_cacheIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16invalid_argumentC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt16invalid_argumentC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt16invalid_argumentD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt16invalid_argumentD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIcEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIcEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIwEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIwEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17__timepunct_cacheIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb0EEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb0EEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb1EEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb1EEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIcLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb0EEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb0EEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb1EEC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb1EEC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt17moneypunct_bynameIwLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIcLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb0EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EE8_M_cacheERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18__moneypunct_cacheIwLb1EED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt18basic_stringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_istringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE3strERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ERKSsSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE3strERKSbIwS1_S2_E@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC1ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ERKSbIwS1_S2_ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEEC2ESt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcE13classic_tableEv@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcEC1EP15__locale_structPKtbm@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcEC1EPKtbm@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcEC2EP15__locale_structPKtbm@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcEC2EPKtbm@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwE19_M_initialize_ctypeEv@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwEC1EP15__locale_structm@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwEC2EP15__locale_structm@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt5ctypeIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6gslice8_IndexerC1EmRKSt8valarrayImES4_@@GLIBCXX_3.4
+FUNC:_ZNSt6gslice8_IndexerC2EmRKSt8valarrayImES4_@@GLIBCXX_3.4
+FUNC:_ZNSt6locale11_M_coalesceERKS_S1_i@@GLIBCXX_3.4
+FUNC:_ZNSt6locale21_S_normalize_categoryEi@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_Impl16_M_install_facetEPKNS_2idEPKNS_5facetE@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_Impl16_M_replace_facetEPKS0_PKNS_2idE@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_Impl19_M_replace_categoryEPKS0_PKPKNS_2idE@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_Impl21_M_replace_categoriesEPKS0_i@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC1EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC1ERKS0_m@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC2EPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC2ERKS0_m@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5_ImplD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facet15_S_get_c_localeEv@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facet17_S_clone_c_localeERP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facet18_S_create_c_localeERP15__locale_structPKcS2_@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facet19_S_destroy_c_localeERP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facetD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facetD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6locale5facetD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6locale6globalERKS_@@GLIBCXX_3.4
+FUNC:_ZNSt6locale7classicEv@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1EPKc@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1EPNS_5_ImplE@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1ERKS_PKci@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1ERKS_S1_i@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2EPKc@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2EPNS_5_ImplE@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2ERKS_@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2ERKS_PKci@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2ERKS_S1_i@@GLIBCXX_3.4
+FUNC:_ZNSt6localeC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6localeD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6localeD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt6localeaSERKS_@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC1EP15__locale_structm@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC2EP15__locale_structm@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIcc11__mbstate_tED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC1EP15__locale_structm@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC2EP15__locale_structm@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7codecvtIwc11__mbstate_tED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcEC1EP15__locale_structm@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcEC2EP15__locale_structm@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwEC1EP15__locale_structm@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwEC2EP15__locale_structm@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7collateIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8bad_castD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8bad_castD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8bad_castD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base13_M_grow_wordsEib@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base15sync_with_stdioEb@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base17register_callbackEPFvNS_5eventERS_iEi@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base4InitC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base4InitD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base6xallocEv@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7_M_initEv@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7failureC1ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7failureC2ERKSs@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7failureD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7failureD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_base7failureD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_baseC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_baseC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_baseD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_baseD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8ios_baseD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcEC1EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcEC2EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwEC1EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwEC2EP15__locale_structPKcm@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8messagesIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcE22_M_initialize_numpunctEP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC1EP15__locale_structm@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC1EPSt16__numpunct_cacheIcEm@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC2EP15__locale_structm@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC2EPSt16__numpunct_cacheIcEm@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIcED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwE22_M_initialize_numpunctEP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC1EP15__locale_structm@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC1EPSt16__numpunct_cacheIwEm@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC2EP15__locale_structm@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC2EPSt16__numpunct_cacheIwEm@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8numpunctIwED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayImEC1ERKS0_@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayImEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayImEC2ERKS0_@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayImEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayImED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayImED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt8valarrayImEixEm@@GLIBCXX_3.4
+FUNC:_ZNSt9bad_allocD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9bad_allocD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9bad_allocD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE10exceptionsESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE11_M_setstateESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE15_M_cache_localeERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE3tieEPSo@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4fillEc@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5clearESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE5rdbufEPSt15basic_streambufIcS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE7copyfmtERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEE8setstateESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1EPSt15basic_streambufIcS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC2EPSt15basic_streambufIcS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIcSt11char_traitsIcEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE10exceptionsESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE11_M_setstateESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE15_M_cache_localeERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE3tieEPSt13basic_ostreamIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4fillEw@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE4initEPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5clearESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5imbueERKSt6locale@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE5rdbufEPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE7copyfmtERKS2_@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEE8setstateESt12_Ios_Iostate@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEEC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9basic_iosIwSt11char_traitsIwEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9exceptionD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9exceptionD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9exceptionD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1Em@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2Em@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEED2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9strstream3strEv@@GLIBCXX_3.4
+FUNC:_ZNSt9strstream6freezeEb@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamC1EPciSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamC1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamC2EPciSt13_Ios_Openmode@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamC2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9strstreamD2Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9type_infoD0Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9type_infoD1Ev@@GLIBCXX_3.4
+FUNC:_ZNSt9type_infoD2Ev@@GLIBCXX_3.4
+FUNC:_ZSt10unexpectedv@@GLIBCXX_3.4
+FUNC:_ZSt13set_terminatePFvvE@@GLIBCXX_3.4
+FUNC:_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZSt14__convert_to_vIfEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct@@GLIBCXX_3.4
+FUNC:_ZSt14set_unexpectedPFvvE@@GLIBCXX_3.4
+FUNC:_ZSt15set_new_handlerPFvvE@@GLIBCXX_3.4
+FUNC:_ZSt16__throw_bad_castv@@GLIBCXX_3.4
+FUNC:_ZSt17__throw_bad_allocv@@GLIBCXX_3.4
+FUNC:_ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base@@GLIBCXX_3.4
+FUNC:_ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base@@GLIBCXX_3.4
+FUNC:_ZSt18_Rb_tree_incrementPKSt18_Rb_tree_node_base@@GLIBCXX_3.4
+FUNC:_ZSt18_Rb_tree_incrementPSt18_Rb_tree_node_base@@GLIBCXX_3.4
+FUNC:_ZSt18__throw_bad_typeidv@@GLIBCXX_3.4
+FUNC:_ZSt18uncaught_exceptionv@@GLIBCXX_3.4
+FUNC:_ZSt19__throw_ios_failurePKc@@GLIBCXX_3.4
+FUNC:_ZSt19__throw_logic_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt19__throw_range_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt20_Rb_tree_black_countPKSt18_Rb_tree_node_baseS1_@@GLIBCXX_3.4
+FUNC:_ZSt20_Rb_tree_rotate_leftPSt18_Rb_tree_node_baseRS0_@@GLIBCXX_3.4
+FUNC:_ZSt20__throw_domain_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt20__throw_length_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt20__throw_out_of_rangePKc@@GLIBCXX_3.4
+FUNC:_ZSt21_Rb_tree_rotate_rightPSt18_Rb_tree_node_baseRS0_@@GLIBCXX_3.4
+FUNC:_ZSt21__throw_bad_exceptionv@@GLIBCXX_3.4
+FUNC:_ZSt21__throw_runtime_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt22__throw_overflow_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt23__throw_underflow_errorPKc@@GLIBCXX_3.4
+FUNC:_ZSt24__throw_invalid_argumentPKc@@GLIBCXX_3.4
+FUNC:_ZSt28_Rb_tree_rebalance_for_erasePSt18_Rb_tree_node_baseRS_@@GLIBCXX_3.4
+FUNC:_ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS_@@GLIBCXX_3.4
+FUNC:_ZSt2wsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt2wsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt4endlIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt4endsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt4endsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt5flushIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt5flushIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
+FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZSt7getlineIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCXX_3.4
+FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZSt7getlineIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_ES4_@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt10moneypunctIcLb0EEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt10moneypunctIwLb0EEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt11__timepunctIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt11__timepunctIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt5ctypeIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt5ctypeIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7codecvtIcc11__mbstate_tEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7codecvtIwc11__mbstate_tEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7collateIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7collateIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8messagesIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8messagesIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8numpunctIcEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8numpunctIwEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9has_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEEbRKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9terminatev@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt10moneypunctIcLb0EEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt10moneypunctIcLb1EEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt10moneypunctIwLb0EEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt10moneypunctIwLb1EEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt11__timepunctIcEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt11__timepunctIwEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt5ctypeIcEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt5ctypeIwEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7codecvtIcc11__mbstate_tEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7codecvtIwc11__mbstate_tEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7collateIcEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7collateIwEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8messagesIcEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8messagesIwEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8numpunctIcEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8numpunctIwEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZSt9use_facetISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEERKT_RKSt6locale@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKa@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKh@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_a@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c@@GLIBCXX_3.4
+FUNC:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_h@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St12_Setiosflags@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St13_Setprecision@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St5_Setw@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4
+FUNC:_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZStlsIdcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIdwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIecSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIewSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIfcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIfwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKS3_@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_PKc@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_S3_@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St12_Setiosflags@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St13_Setprecision@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St14_Resetiosflags@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St5_Setw@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwEERSt13basic_ostreamIT_T0_ES6_c@@GLIBCXX_3.4
+FUNC:_ZStlsIwSt11char_traitsIwESaIwEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_@@GLIBCXX_3.4
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ERKS6_S8_@@GLIBCXX_3.4
+FUNC:_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_ES3_RKS6_@@GLIBCXX_3.4
+FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_EPKS3_RKS6_@@GLIBCXX_3.4
+FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_ERKS6_S8_@@GLIBCXX_3.4
+FUNC:_ZStplIwSt11char_traitsIwESaIwEESbIT_T0_T1_ES3_RKS6_@@GLIBCXX_3.4
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Pa@@GLIBCXX_3.4
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ph@@GLIBCXX_3.4
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Ra@@GLIBCXX_3.4
+FUNC:_ZStrsISt11char_traitsIcEERSt13basic_istreamIcT_ES5_Rh@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_PS3_@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_RS3_@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St12_Setiosflags@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St13_Setprecision@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St5_Setw@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4
+FUNC:_ZStrsIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZStrsIdcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIdwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIecSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIewSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIfcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIfwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_PS3_@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_RS3_@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St12_Setiosflags@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St13_Setprecision@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St14_Resetiosflags@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St5_Setw@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_Setbase@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwEERSt13basic_istreamIT_T0_ES6_St8_SetfillIS3_E@@GLIBCXX_3.4
+FUNC:_ZStrsIwSt11char_traitsIwESaIwEERSt13basic_istreamIT_T0_ES7_RSbIS4_S5_T1_E@@GLIBCXX_3.4
+FUNC:_ZThn16_NSdD0Ev@@GLIBCXX_3.4
+FUNC:_ZThn16_NSdD1Ev@@GLIBCXX_3.4
+FUNC:_ZThn16_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZThn16_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZThn16_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZThn16_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZThn16_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZThn16_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZThn16_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZThn16_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZThn16_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZThn16_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZThn16_NSt9strstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZThn16_NSt9strstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSdD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSdD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSiD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSiD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSoD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSoD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt10istrstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt10istrstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt10ostrstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt10ostrstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt13basic_fstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt13basic_fstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt13basic_fstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt13basic_fstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt13basic_istreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt13basic_ostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt14basic_ifstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt14basic_iostreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt14basic_iostreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIcSt11char_traitsIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIcSt11char_traitsIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIwSt11char_traitsIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt14basic_ofstreamIwSt11char_traitsIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt18basic_stringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt19basic_istringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt19basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt9strstreamD0Ev@@GLIBCXX_3.4
+FUNC:_ZTv0_n24_NSt9strstreamD1Ev@@GLIBCXX_3.4
+FUNC:_ZdaPv@@GLIBCXX_3.4
+FUNC:_ZdaPvRKSt9nothrow_t@@GLIBCXX_3.4
+FUNC:_ZdlPv@@GLIBCXX_3.4
+FUNC:_ZdlPvRKSt9nothrow_t@@GLIBCXX_3.4
+FUNC:_Znam@@GLIBCXX_3.4
+FUNC:_ZnamRKSt9nothrow_t@@GLIBCXX_3.4
+FUNC:_Znwm@@GLIBCXX_3.4
+FUNC:_ZnwmRKSt9nothrow_t@@GLIBCXX_3.4
+FUNC:__cxa_allocate_exception@@CXXABI_1.3
+FUNC:__cxa_bad_cast@@CXXABI_1.3
+FUNC:__cxa_bad_typeid@@CXXABI_1.3
+FUNC:__cxa_begin_catch@@CXXABI_1.3
+FUNC:__cxa_call_unexpected@@CXXABI_1.3
+FUNC:__cxa_current_exception_type@@CXXABI_1.3
+FUNC:__cxa_demangle@@CXXABI_1.3
+FUNC:__cxa_end_catch@@CXXABI_1.3
+FUNC:__cxa_free_exception@@CXXABI_1.3
+FUNC:__cxa_get_globals@@CXXABI_1.3
+FUNC:__cxa_get_globals_fast@@CXXABI_1.3
+FUNC:__cxa_guard_abort@@CXXABI_1.3
+FUNC:__cxa_guard_acquire@@CXXABI_1.3
+FUNC:__cxa_guard_release@@CXXABI_1.3
+FUNC:__cxa_pure_virtual@@CXXABI_1.3
+FUNC:__cxa_rethrow@@CXXABI_1.3
+FUNC:__cxa_throw@@CXXABI_1.3
+FUNC:__cxa_vec_cctor@@CXXABI_1.3
+FUNC:__cxa_vec_cleanup@@CXXABI_1.3
+FUNC:__cxa_vec_ctor@@CXXABI_1.3
+FUNC:__cxa_vec_delete2@@CXXABI_1.3
+FUNC:__cxa_vec_delete3@@CXXABI_1.3
+FUNC:__cxa_vec_delete@@CXXABI_1.3
+FUNC:__cxa_vec_dtor@@CXXABI_1.3
+FUNC:__cxa_vec_new2@@CXXABI_1.3
+FUNC:__cxa_vec_new3@@CXXABI_1.3
+FUNC:__cxa_vec_new@@CXXABI_1.3
+FUNC:__dynamic_cast@@CXXABI_1.3
+FUNC:__gxx_personality_v0@@CXXABI_1.3
+FUNC:atan2l@@GLIBCXX_3.4
+FUNC:coshl@@GLIBCXX_3.4
+FUNC:cosl@@GLIBCXX_3.4
+FUNC:expl@@GLIBCXX_3.4
+FUNC:hypotl@@GLIBCXX_3.4
+FUNC:log10l@@GLIBCXX_3.4
+FUNC:logl@@GLIBCXX_3.4
+FUNC:powl@@GLIBCXX_3.4
+FUNC:sinhl@@GLIBCXX_3.4
+FUNC:sinl@@GLIBCXX_3.4
+FUNC:sqrtl@@GLIBCXX_3.4
+FUNC:tanhl@@GLIBCXX_3.4
+FUNC:tanl@@GLIBCXX_3.4
+OBJECT:0:CXXABI_1.3
+OBJECT:0:GLIBCXX_3.4
+OBJECT:104:_ZTVSt10moneypunctIcLb0EE@@GLIBCXX_3.4
+OBJECT:104:_ZTVSt10moneypunctIcLb1EE@@GLIBCXX_3.4
+OBJECT:104:_ZTVSt10moneypunctIwLb0EE@@GLIBCXX_3.4
+OBJECT:104:_ZTVSt10moneypunctIwLb1EE@@GLIBCXX_3.4
+OBJECT:104:_ZTVSt17moneypunct_bynameIcLb0EE@@GLIBCXX_3.4
+OBJECT:104:_ZTVSt17moneypunct_bynameIcLb1EE@@GLIBCXX_3.4
+OBJECT:104:_ZTVSt17moneypunct_bynameIwLb0EE@@GLIBCXX_3.4
+OBJECT:104:_ZTVSt17moneypunct_bynameIwLb1EE@@GLIBCXX_3.4
+OBJECT:112:_ZNSt17__timepunct_cacheIcE12_S_timezonesE@@GLIBCXX_3.4
+OBJECT:112:_ZNSt17__timepunct_cacheIwE12_S_timezonesE@@GLIBCXX_3.4
+OBJECT:120:_ZTVSd@@GLIBCXX_3.4
+OBJECT:120:_ZTVSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:120:_ZTVSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:120:_ZTVSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:120:_ZTVSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:120:_ZTVSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:120:_ZTVSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:120:_ZTVSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:120:_ZTVSt9strstream@@GLIBCXX_3.4
+OBJECT:128:_ZTVN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:128:_ZTVN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:128:_ZTVSt12ctype_bynameIwE@@GLIBCXX_3.4
+OBJECT:128:_ZTVSt12strstreambuf@@GLIBCXX_3.4
+OBJECT:128:_ZTVSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:128:_ZTVSt13basic_filebufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:128:_ZTVSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:128:_ZTVSt15basic_streambufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:128:_ZTVSt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:128:_ZTVSt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:128:_ZTVSt21__ctype_abstract_baseIcE@@GLIBCXX_3.4
+OBJECT:128:_ZTVSt21__ctype_abstract_baseIwE@@GLIBCXX_3.4
+OBJECT:128:_ZTVSt5ctypeIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTSSt5ctypeIcE@@GLIBCXX_3.4
+OBJECT:12:_ZTSSt5ctypeIwE@@GLIBCXX_3.4
+OBJECT:12:_ZTSSt8bad_cast@@GLIBCXX_3.4
+OBJECT:12:_ZTSSt8ios_base@@GLIBCXX_3.4
+OBJECT:13:_ZTSSt9bad_alloc@@GLIBCXX_3.4
+OBJECT:13:_ZTSSt9exception@@GLIBCXX_3.4
+OBJECT:13:_ZTSSt9strstream@@GLIBCXX_3.4
+OBJECT:13:_ZTSSt9time_base@@GLIBCXX_3.4
+OBJECT:13:_ZTSSt9type_info@@GLIBCXX_3.4
+OBJECT:14:_ZTSSt7collateIcE@@GLIBCXX_3.4
+OBJECT:14:_ZTSSt7collateIwE@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt10bad_typeid@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt10ctype_base@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt10istrstream@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt10money_base@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt10ostrstream@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt8messagesIcE@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt8messagesIwE@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt8numpunctIcE@@GLIBCXX_3.4
+OBJECT:15:_ZTSSt8numpunctIwE@@GLIBCXX_3.4
+OBJECT:16:_ZTINSt6locale5facetE@@GLIBCXX_3.4
+OBJECT:16:_ZTISt10ctype_base@@GLIBCXX_3.4
+OBJECT:16:_ZTISt10money_base@@GLIBCXX_3.4
+OBJECT:16:_ZTISt12codecvt_base@@GLIBCXX_3.4
+OBJECT:16:_ZTISt13messages_base@@GLIBCXX_3.4
+OBJECT:16:_ZTISt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:16:_ZTISt15basic_streambufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:16:_ZTISt8ios_base@@GLIBCXX_3.4
+OBJECT:16:_ZTISt9exception@@GLIBCXX_3.4
+OBJECT:16:_ZTISt9time_base@@GLIBCXX_3.4
+OBJECT:16:_ZTISt9type_info@@GLIBCXX_3.4
+OBJECT:16:_ZTIa@@CXXABI_1.3
+OBJECT:16:_ZTIb@@CXXABI_1.3
+OBJECT:16:_ZTIc@@CXXABI_1.3
+OBJECT:16:_ZTId@@CXXABI_1.3
+OBJECT:16:_ZTIe@@CXXABI_1.3
+OBJECT:16:_ZTIf@@CXXABI_1.3
+OBJECT:16:_ZTIh@@CXXABI_1.3
+OBJECT:16:_ZTIi@@CXXABI_1.3
+OBJECT:16:_ZTIj@@CXXABI_1.3
+OBJECT:16:_ZTIl@@CXXABI_1.3
+OBJECT:16:_ZTIm@@CXXABI_1.3
+OBJECT:16:_ZTIs@@CXXABI_1.3
+OBJECT:16:_ZTIt@@CXXABI_1.3
+OBJECT:16:_ZTIv@@CXXABI_1.3
+OBJECT:16:_ZTIw@@CXXABI_1.3
+OBJECT:16:_ZTIx@@CXXABI_1.3
+OBJECT:16:_ZTIy@@CXXABI_1.3
+OBJECT:16:_ZTSSt11logic_error@@GLIBCXX_3.4
+OBJECT:16:_ZTSSt11range_error@@GLIBCXX_3.4
+OBJECT:16:_ZTTSi@@GLIBCXX_3.4
+OBJECT:16:_ZTTSo@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:16:_ZTTSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:17:_ZTSSt12codecvt_base@@GLIBCXX_3.4
+OBJECT:17:_ZTSSt12domain_error@@GLIBCXX_3.4
+OBJECT:17:_ZTSSt12length_error@@GLIBCXX_3.4
+OBJECT:17:_ZTSSt12out_of_range@@GLIBCXX_3.4
+OBJECT:17:_ZTSSt12strstreambuf@@GLIBCXX_3.4
+OBJECT:18:_ZTSNSt6locale5facetE@@GLIBCXX_3.4
+OBJECT:18:_ZTSSt13bad_exception@@GLIBCXX_3.4
+OBJECT:18:_ZTSSt13messages_base@@GLIBCXX_3.4
+OBJECT:18:_ZTSSt13runtime_error@@GLIBCXX_3.4
+OBJECT:19:_ZTSSt11__timepunctIcE@@GLIBCXX_3.4
+OBJECT:19:_ZTSSt11__timepunctIwE@@GLIBCXX_3.4
+OBJECT:19:_ZTSSt14overflow_error@@GLIBCXX_3.4
+OBJECT:1:_ZNSs4_Rep11_S_terminalE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt10moneypunctIcLb0EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt10moneypunctIcLb1EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt10moneypunctIwLb0EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt10moneypunctIwLb1EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIaE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIbE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIcE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIdE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIeE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIfE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIhE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIiE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIjE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIlE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsImE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIsE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsItE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIwE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIxE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt14numeric_limitsIyE9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt17moneypunct_bynameIcLb0EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt17moneypunct_bynameIcLb1EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt17moneypunct_bynameIwLb0EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt17moneypunct_bynameIwLb1EE4intlE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base10is_boundedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base10is_integerE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base12has_infinityE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base13has_quiet_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base14is_specializedE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base15has_denorm_lossE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base15tinyness_beforeE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base17has_signaling_NaNE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base5trapsE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base8is_exactE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base9is_iec559E@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base9is_moduloE@@GLIBCXX_3.4
+OBJECT:1:_ZNSt21__numeric_limits_base9is_signedE@@GLIBCXX_3.4
+OBJECT:1:_ZSt7nothrow@@GLIBCXX_3.4
+OBJECT:20:_ZTSSt12ctype_bynameIcE@@GLIBCXX_3.4
+OBJECT:20:_ZTSSt12ctype_bynameIwE@@GLIBCXX_3.4
+OBJECT:20:_ZTSSt15underflow_error@@GLIBCXX_3.4
+OBJECT:21:_ZTSSt16invalid_argument@@GLIBCXX_3.4
+OBJECT:22:_ZTSNSt8ios_base7failureE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt10moneypunctIcLb0EE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt10moneypunctIcLb1EE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt10moneypunctIwLb0EE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt10moneypunctIwLb1EE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt14collate_bynameIcE@@GLIBCXX_3.4
+OBJECT:22:_ZTSSt14collate_bynameIwE@@GLIBCXX_3.4
+OBJECT:23:_ZTSSt15messages_bynameIcE@@GLIBCXX_3.4
+OBJECT:23:_ZTSSt15messages_bynameIwE@@GLIBCXX_3.4
+OBJECT:23:_ZTSSt15numpunct_bynameIcE@@GLIBCXX_3.4
+OBJECT:23:_ZTSSt15numpunct_bynameIwE@@GLIBCXX_3.4
+OBJECT:24:_ZTIN10__cxxabiv116__enum_type_infoE@@CXXABI_1.3
+OBJECT:24:_ZTIN10__cxxabiv117__array_type_infoE@@CXXABI_1.3
+OBJECT:24:_ZTIN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
+OBJECT:24:_ZTIN10__cxxabiv117__pbase_type_infoE@@CXXABI_1.3
+OBJECT:24:_ZTIN10__cxxabiv119__pointer_type_infoE@@CXXABI_1.3
+OBJECT:24:_ZTIN10__cxxabiv120__function_type_infoE@@CXXABI_1.3
+OBJECT:24:_ZTIN10__cxxabiv120__si_class_type_infoE@@CXXABI_1.3
+OBJECT:24:_ZTIN10__cxxabiv121__vmi_class_type_infoE@@CXXABI_1.3
+OBJECT:24:_ZTIN10__cxxabiv123__fundamental_type_infoE@@CXXABI_1.3
+OBJECT:24:_ZTIN10__cxxabiv129__pointer_to_member_type_infoE@@CXXABI_1.3
+OBJECT:24:_ZTIN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTIN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTIN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTIN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTINSt8ios_base7failureE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt10bad_typeid@@GLIBCXX_3.4
+OBJECT:24:_ZTISt10istrstream@@GLIBCXX_3.4
+OBJECT:24:_ZTISt10ostrstream@@GLIBCXX_3.4
+OBJECT:24:_ZTISt11__timepunctIcE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt11__timepunctIwE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt11logic_error@@GLIBCXX_3.4
+OBJECT:24:_ZTISt11range_error@@GLIBCXX_3.4
+OBJECT:24:_ZTISt12ctype_bynameIcE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt12ctype_bynameIwE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt12domain_error@@GLIBCXX_3.4
+OBJECT:24:_ZTISt12length_error@@GLIBCXX_3.4
+OBJECT:24:_ZTISt12out_of_range@@GLIBCXX_3.4
+OBJECT:24:_ZTISt12strstreambuf@@GLIBCXX_3.4
+OBJECT:24:_ZTISt13bad_exception@@GLIBCXX_3.4
+OBJECT:24:_ZTISt13basic_filebufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt13basic_filebufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt13runtime_error@@GLIBCXX_3.4
+OBJECT:24:_ZTISt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt14codecvt_bynameIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt14codecvt_bynameIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt14collate_bynameIcE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt14collate_bynameIwE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt14overflow_error@@GLIBCXX_3.4
+OBJECT:24:_ZTISt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt15messages_bynameIcE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt15messages_bynameIwE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt15numpunct_bynameIcE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt15numpunct_bynameIwE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt15underflow_error@@GLIBCXX_3.4
+OBJECT:24:_ZTISt16invalid_argument@@GLIBCXX_3.4
+OBJECT:24:_ZTISt17moneypunct_bynameIcLb0EE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt17moneypunct_bynameIcLb1EE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt17moneypunct_bynameIwLb0EE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt17moneypunct_bynameIwLb1EE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt5ctypeIwE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt7codecvtIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt7codecvtIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt7collateIcE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt7collateIwE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt8bad_cast@@GLIBCXX_3.4
+OBJECT:24:_ZTISt8numpunctIcE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt8numpunctIwE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt9bad_alloc@@GLIBCXX_3.4
+OBJECT:24:_ZTISt9basic_iosIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt9basic_iosIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:24:_ZTISt9strstream@@GLIBCXX_3.4
+OBJECT:272:_ZSt4cerr@@GLIBCXX_3.4
+OBJECT:272:_ZSt4clog@@GLIBCXX_3.4
+OBJECT:272:_ZSt4cout@@GLIBCXX_3.4
+OBJECT:272:_ZSt5wcerr@@GLIBCXX_3.4
+OBJECT:272:_ZSt5wclog@@GLIBCXX_3.4
+OBJECT:272:_ZSt5wcout@@GLIBCXX_3.4
+OBJECT:280:_ZSt3cin@@GLIBCXX_3.4
+OBJECT:280:_ZSt4wcin@@GLIBCXX_3.4
+OBJECT:28:_ZTSSt7codecvtIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:28:_ZTSSt7codecvtIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt17moneypunct_bynameIcLb0EE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt17moneypunct_bynameIcLb1EE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt17moneypunct_bynameIwLb0EE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt17moneypunct_bynameIwLb1EE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt21__ctype_abstract_baseIcE@@GLIBCXX_3.4
+OBJECT:29:_ZTSSt21__ctype_abstract_baseIwE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5alnumE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5alphaE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5cntrlE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5digitE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5graphE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5lowerE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5printE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5punctE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5spaceE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base5upperE@@GLIBCXX_3.4
+OBJECT:2:_ZNSt10ctype_base6xdigitE@@GLIBCXX_3.4
+OBJECT:2:_ZTSa@@CXXABI_1.3
+OBJECT:2:_ZTSb@@CXXABI_1.3
+OBJECT:2:_ZTSc@@CXXABI_1.3
+OBJECT:2:_ZTSd@@CXXABI_1.3
+OBJECT:2:_ZTSe@@CXXABI_1.3
+OBJECT:2:_ZTSf@@CXXABI_1.3
+OBJECT:2:_ZTSh@@CXXABI_1.3
+OBJECT:2:_ZTSi@@CXXABI_1.3
+OBJECT:2:_ZTSj@@CXXABI_1.3
+OBJECT:2:_ZTSl@@CXXABI_1.3
+OBJECT:2:_ZTSm@@CXXABI_1.3
+OBJECT:2:_ZTSs@@CXXABI_1.3
+OBJECT:2:_ZTSt@@CXXABI_1.3
+OBJECT:2:_ZTSv@@CXXABI_1.3
+OBJECT:2:_ZTSw@@CXXABI_1.3
+OBJECT:2:_ZTSx@@CXXABI_1.3
+OBJECT:2:_ZTSy@@CXXABI_1.3
+OBJECT:32:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4
+OBJECT:32:_ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4
+OBJECT:32:_ZTIPKa@@CXXABI_1.3
+OBJECT:32:_ZTIPKb@@CXXABI_1.3
+OBJECT:32:_ZTIPKc@@CXXABI_1.3
+OBJECT:32:_ZTIPKd@@CXXABI_1.3
+OBJECT:32:_ZTIPKe@@CXXABI_1.3
+OBJECT:32:_ZTIPKf@@CXXABI_1.3
+OBJECT:32:_ZTIPKh@@CXXABI_1.3
+OBJECT:32:_ZTIPKi@@CXXABI_1.3
+OBJECT:32:_ZTIPKj@@CXXABI_1.3
+OBJECT:32:_ZTIPKl@@CXXABI_1.3
+OBJECT:32:_ZTIPKm@@CXXABI_1.3
+OBJECT:32:_ZTIPKs@@CXXABI_1.3
+OBJECT:32:_ZTIPKt@@CXXABI_1.3
+OBJECT:32:_ZTIPKv@@CXXABI_1.3
+OBJECT:32:_ZTIPKw@@CXXABI_1.3
+OBJECT:32:_ZTIPKx@@CXXABI_1.3
+OBJECT:32:_ZTIPKy@@CXXABI_1.3
+OBJECT:32:_ZTIPa@@CXXABI_1.3
+OBJECT:32:_ZTIPb@@CXXABI_1.3
+OBJECT:32:_ZTIPc@@CXXABI_1.3
+OBJECT:32:_ZTIPd@@CXXABI_1.3
+OBJECT:32:_ZTIPe@@CXXABI_1.3
+OBJECT:32:_ZTIPf@@CXXABI_1.3
+OBJECT:32:_ZTIPh@@CXXABI_1.3
+OBJECT:32:_ZTIPi@@CXXABI_1.3
+OBJECT:32:_ZTIPj@@CXXABI_1.3
+OBJECT:32:_ZTIPl@@CXXABI_1.3
+OBJECT:32:_ZTIPm@@CXXABI_1.3
+OBJECT:32:_ZTIPs@@CXXABI_1.3
+OBJECT:32:_ZTIPt@@CXXABI_1.3
+OBJECT:32:_ZTIPv@@CXXABI_1.3
+OBJECT:32:_ZTIPw@@CXXABI_1.3
+OBJECT:32:_ZTIPx@@CXXABI_1.3
+OBJECT:32:_ZTIPy@@CXXABI_1.3
+OBJECT:32:_ZTTSt10istrstream@@GLIBCXX_3.4
+OBJECT:32:_ZTTSt10ostrstream@@GLIBCXX_3.4
+OBJECT:32:_ZTTSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:32:_ZTTSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:32:_ZTTSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:32:_ZTTSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:32:_ZTTSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:32:_ZTTSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:32:_ZTTSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:32:_ZTTSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:32:_ZTVNSt6locale5facetE@@GLIBCXX_3.4
+OBJECT:32:_ZTVSt11__timepunctIcE@@GLIBCXX_3.4
+OBJECT:32:_ZTVSt11__timepunctIwE@@GLIBCXX_3.4
+OBJECT:32:_ZTVSt8ios_base@@GLIBCXX_3.4
+OBJECT:32:_ZTVSt9basic_iosIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:32:_ZTVSt9basic_iosIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:33:_ZTSN10__cxxabiv116__enum_type_infoE@@CXXABI_1.3
+OBJECT:34:_ZTSN10__cxxabiv117__array_type_infoE@@CXXABI_1.3
+OBJECT:34:_ZTSN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
+OBJECT:34:_ZTSN10__cxxabiv117__pbase_type_infoE@@CXXABI_1.3
+OBJECT:34:_ZTSSt9basic_iosIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:34:_ZTSSt9basic_iosIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:36:_ZTSN10__cxxabiv119__pointer_type_infoE@@CXXABI_1.3
+OBJECT:36:_ZTSSt14codecvt_bynameIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:36:_ZTSSt14codecvt_bynameIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:37:_ZTSN10__cxxabiv120__function_type_infoE@@CXXABI_1.3
+OBJECT:37:_ZTSN10__cxxabiv120__si_class_type_infoE@@CXXABI_1.3
+OBJECT:38:_ZTSN10__cxxabiv121__vmi_class_type_infoE@@CXXABI_1.3
+OBJECT:39:_ZTSSt13basic_filebufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:39:_ZTSSt13basic_filebufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:39:_ZTSSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:39:_ZTSSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:39:_ZTSSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:39:_ZTSSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:3:_ZTSPa@@CXXABI_1.3
+OBJECT:3:_ZTSPb@@CXXABI_1.3
+OBJECT:3:_ZTSPc@@CXXABI_1.3
+OBJECT:3:_ZTSPd@@CXXABI_1.3
+OBJECT:3:_ZTSPe@@CXXABI_1.3
+OBJECT:3:_ZTSPf@@CXXABI_1.3
+OBJECT:3:_ZTSPh@@CXXABI_1.3
+OBJECT:3:_ZTSPi@@CXXABI_1.3
+OBJECT:3:_ZTSPj@@CXXABI_1.3
+OBJECT:3:_ZTSPl@@CXXABI_1.3
+OBJECT:3:_ZTSPm@@CXXABI_1.3
+OBJECT:3:_ZTSPs@@CXXABI_1.3
+OBJECT:3:_ZTSPt@@CXXABI_1.3
+OBJECT:3:_ZTSPv@@CXXABI_1.3
+OBJECT:3:_ZTSPw@@CXXABI_1.3
+OBJECT:3:_ZTSPx@@CXXABI_1.3
+OBJECT:3:_ZTSPy@@CXXABI_1.3
+OBJECT:3:_ZTSSd@@GLIBCXX_3.4
+OBJECT:3:_ZTSSi@@GLIBCXX_3.4
+OBJECT:3:_ZTSSo@@GLIBCXX_3.4
+OBJECT:40:_ZTISi@@GLIBCXX_3.4
+OBJECT:40:_ZTISo@@GLIBCXX_3.4
+OBJECT:40:_ZTISt13basic_istreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTISt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTSN10__cxxabiv123__fundamental_type_infoE@@CXXABI_1.3
+OBJECT:40:_ZTSSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTSSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTSSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTSSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:40:_ZTSSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVNSt8ios_base7failureE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt10bad_typeid@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt11logic_error@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt11range_error@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt12domain_error@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt12length_error@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt12out_of_range@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt13bad_exception@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt13runtime_error@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt14overflow_error@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt15underflow_error@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt16invalid_argument@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt8bad_cast@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt9bad_alloc@@GLIBCXX_3.4
+OBJECT:40:_ZTVSt9exception@@GLIBCXX_3.4
+OBJECT:41:_ZTSSt15basic_streambufIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:41:_ZTSSt15basic_streambufIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:45:_ZTSSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:45:_ZTSSt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:46:_ZTSN10__cxxabiv129__pointer_to_member_type_infoE@@CXXABI_1.3
+OBJECT:46:_ZTSSt15basic_stringbufIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:46:_ZTSSt15basic_stringbufIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:48:_ZTVSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:48:_ZTVSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:48:_ZTVSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:48:_ZTVSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:49:_ZTSN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:49:_ZTSN9__gnu_cxx13stdio_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:49:_ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:49:_ZTSSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:4:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_terminalE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt10money_base18_S_default_patternE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIaE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIbE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIcE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIdE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIeE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIfE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIhE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIiE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIjE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIlE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsImE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIsE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsItE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIwE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIxE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt14numeric_limitsIyE8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base10has_denormE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base11round_styleE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base12max_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base12min_exponentE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base14max_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base14min_exponent10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base5radixE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base6digitsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt21__numeric_limits_base8digits10E@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale3allE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale4noneE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale4timeE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale5ctypeE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale7collateE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale7numericE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale8messagesE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt6locale8monetaryE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base10floatfieldE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base10scientificE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base11adjustfieldE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base2inE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3appE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3ateE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3begE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3curE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3decE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3endE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3hexE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3octE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base3outE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base4leftE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base5fixedE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base5rightE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base5truncE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base6badbitE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base6binaryE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base6eofbitE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base6skipwsE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base7failbitE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base7goodbitE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base7showposE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base7unitbufE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base8internalE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base8showbaseE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base9basefieldE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base9boolalphaE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base9showpointE@@GLIBCXX_3.4
+OBJECT:4:_ZNSt8ios_base9uppercaseE@@GLIBCXX_3.4
+OBJECT:4:_ZTSPKa@@CXXABI_1.3
+OBJECT:4:_ZTSPKb@@CXXABI_1.3
+OBJECT:4:_ZTSPKc@@CXXABI_1.3
+OBJECT:4:_ZTSPKd@@CXXABI_1.3
+OBJECT:4:_ZTSPKe@@CXXABI_1.3
+OBJECT:4:_ZTSPKf@@CXXABI_1.3
+OBJECT:4:_ZTSPKh@@CXXABI_1.3
+OBJECT:4:_ZTSPKi@@CXXABI_1.3
+OBJECT:4:_ZTSPKj@@CXXABI_1.3
+OBJECT:4:_ZTSPKl@@CXXABI_1.3
+OBJECT:4:_ZTSPKm@@CXXABI_1.3
+OBJECT:4:_ZTSPKs@@CXXABI_1.3
+OBJECT:4:_ZTSPKt@@CXXABI_1.3
+OBJECT:4:_ZTSPKv@@CXXABI_1.3
+OBJECT:4:_ZTSPKw@@CXXABI_1.3
+OBJECT:4:_ZTSPKx@@CXXABI_1.3
+OBJECT:4:_ZTSPKy@@CXXABI_1.3
+OBJECT:50:_ZTSSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:50:_ZTSSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:50:_ZTSSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:50:_ZTSSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:54:_ZTSN9__gnu_cxx18stdio_sync_filebufIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:54:_ZTSN9__gnu_cxx18stdio_sync_filebufIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:56:_ZTISd@@GLIBCXX_3.4
+OBJECT:56:_ZTISt10moneypunctIcLb0EE@@GLIBCXX_3.4
+OBJECT:56:_ZTISt10moneypunctIcLb1EE@@GLIBCXX_3.4
+OBJECT:56:_ZTISt10moneypunctIwLb0EE@@GLIBCXX_3.4
+OBJECT:56:_ZTISt10moneypunctIwLb1EE@@GLIBCXX_3.4
+OBJECT:56:_ZTISt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:56:_ZTISt21__ctype_abstract_baseIcE@@GLIBCXX_3.4
+OBJECT:56:_ZTISt21__ctype_abstract_baseIwE@@GLIBCXX_3.4
+OBJECT:56:_ZTISt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:56:_ZTISt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:56:_ZTISt5ctypeIcE@@GLIBCXX_3.4
+OBJECT:56:_ZTISt8messagesIcE@@GLIBCXX_3.4
+OBJECT:56:_ZTISt8messagesIwE@@GLIBCXX_3.4
+OBJECT:56:_ZTISt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:56:_ZTISt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:56:_ZTTSd@@GLIBCXX_3.4
+OBJECT:56:_ZTTSt14basic_iostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:56:_ZTVSt14collate_bynameIcE@@GLIBCXX_3.4
+OBJECT:56:_ZTVSt14collate_bynameIwE@@GLIBCXX_3.4
+OBJECT:56:_ZTVSt15messages_bynameIcE@@GLIBCXX_3.4
+OBJECT:56:_ZTVSt15messages_bynameIwE@@GLIBCXX_3.4
+OBJECT:56:_ZTVSt7collateIcE@@GLIBCXX_3.4
+OBJECT:56:_ZTVSt7collateIwE@@GLIBCXX_3.4
+OBJECT:56:_ZTVSt8messagesIcE@@GLIBCXX_3.4
+OBJECT:56:_ZTVSt8messagesIwE@@GLIBCXX_3.4
+OBJECT:58:_ZTSSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:58:_ZTSSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:58:_ZTSSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:58:_ZTSSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:59:_ZTSSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:59:_ZTSSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:59:_ZTSSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:59:_ZTSSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTSSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTSSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTSSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:60:_ZTSSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:64:_ZTVN10__cxxabiv116__enum_type_infoE@@CXXABI_1.3
+OBJECT:64:_ZTVN10__cxxabiv117__array_type_infoE@@CXXABI_1.3
+OBJECT:64:_ZTVN10__cxxabiv120__function_type_infoE@@CXXABI_1.3
+OBJECT:64:_ZTVN10__cxxabiv123__fundamental_type_infoE@@CXXABI_1.3
+OBJECT:64:_ZTVSt9type_info@@GLIBCXX_3.4
+OBJECT:67:_ZTSSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:67:_ZTSSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:67:_ZTSSt15time_put_bynameIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:67:_ZTSSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:72:_ZTVN10__cxxabiv117__pbase_type_infoE@@CXXABI_1.3
+OBJECT:72:_ZTVN10__cxxabiv119__pointer_type_infoE@@CXXABI_1.3
+OBJECT:72:_ZTVN10__cxxabiv129__pointer_to_member_type_infoE@@CXXABI_1.3
+OBJECT:72:_ZTVSt15numpunct_bynameIcE@@GLIBCXX_3.4
+OBJECT:72:_ZTVSt15numpunct_bynameIwE@@GLIBCXX_3.4
+OBJECT:72:_ZTVSt8numpunctIcE@@GLIBCXX_3.4
+OBJECT:72:_ZTVSt8numpunctIwE@@GLIBCXX_3.4
+OBJECT:80:_ZTTSt13basic_fstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:80:_ZTTSt13basic_fstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:80:_ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:80:_ZTTSt18basic_stringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:80:_ZTTSt9strstream@@GLIBCXX_3.4
+OBJECT:80:_ZTVSi@@GLIBCXX_3.4
+OBJECT:80:_ZTVSo@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt10istrstream@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt10ostrstream@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt13basic_istreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt13basic_ostreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt14basic_ifstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt14basic_ifstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt14basic_ofstreamIcSt11char_traitsIcEE@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt14basic_ofstreamIwSt11char_traitsIwEE@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt15time_get_bynameIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt15time_get_bynameIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt19basic_istringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt19basic_istringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt19basic_ostringstreamIcSt11char_traitsIcESaIcEE@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt19basic_ostringstreamIwSt11char_traitsIwESaIwEE@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:80:_ZTVSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
+OBJECT:88:_ZTVN10__cxxabiv117__class_type_infoE@@CXXABI_1.3
+OBJECT:88:_ZTVN10__cxxabiv120__si_class_type_infoE@@CXXABI_1.3
+OBJECT:88:_ZTVN10__cxxabiv121__vmi_class_type_infoE@@CXXABI_1.3
+OBJECT:88:_ZTVSt14codecvt_bynameIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:88:_ZTVSt14codecvt_bynameIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:88:_ZTVSt23__codecvt_abstract_baseIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:88:_ZTVSt23__codecvt_abstract_baseIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:88:_ZTVSt7codecvtIcc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:88:_ZTVSt7codecvtIwc11__mbstate_tE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt10moneypunctIcLb0EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt10moneypunctIcLb1EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt10moneypunctIwLb0EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt10moneypunctIwLb1EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt11__timepunctIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt11__timepunctIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7collateIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7collateIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8messagesIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8messagesIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8numpunctIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8numpunctIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZGVNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSbIwSt11char_traitsIwESaIwEE4_Rep11_S_max_sizeE@@GLIBCXX_3.4
+OBJECT:8:_ZNSbIwSt11char_traitsIwESaIwEE4nposE@@GLIBCXX_3.4
+OBJECT:8:_ZNSs4_Rep11_S_max_sizeE@@GLIBCXX_3.4
+OBJECT:8:_ZNSs4nposE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt10__num_base11_S_atoms_inE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt10__num_base12_S_atoms_outE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt10money_base8_S_atomsE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt10moneypunctIcLb0EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt10moneypunctIcLb1EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt10moneypunctIwLb0EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt10moneypunctIwLb1EE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt11__timepunctIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt11__timepunctIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt5ctypeIcE10table_sizeE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt5ctypeIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt5ctypeIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt7codecvtIcc11__mbstate_tE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt7codecvtIwc11__mbstate_tE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt7collateIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt7collateIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt7num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt8messagesIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt8messagesIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt8numpunctIcE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt8numpunctIwE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt8time_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt8time_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt9money_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE@@GLIBCXX_3.4
+OBJECT:8:_ZNSt9money_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE@@GLIBCXX_3.4
+OBJECT:96:_ZTVSt12ctype_bynameIcE@@GLIBCXX_3.4
+OBJECT:96:_ZTVSt5ctypeIcE@@GLIBCXX_3.4
+OBJECT:96:_ZTVSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE@@GLIBCXX_3.4
+OBJECT:96:_ZTVSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE@@GLIBCXX_3.4
diff --git a/libstdc++-v3/config/allocator/bitmap_allocator_base.h b/libstdc++-v3/config/allocator/bitmap_allocator_base.h
index bf84ae06d7f..2a674cff04c 100644
--- a/libstdc++-v3/config/allocator/bitmap_allocator_base.h
+++ b/libstdc++-v3/config/allocator/bitmap_allocator_base.h
@@ -1,6 +1,6 @@
// Base to std::allocator -*- C++ -*-
-// Copyright (C) 2004 Free Software Foundation, Inc.
+// Copyright (C) 2004, 2005 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -32,6 +32,6 @@
// Define bitmap_allocator as the base class to std::allocator.
#include <ext/bitmap_allocator.h>
-#define ___glibcxx_base_allocator __gnu_cxx::bitmap_allocator
+#define __glibcxx_base_allocator __gnu_cxx::bitmap_allocator
#endif
diff --git a/libstdc++-v3/config/allocator/malloc_allocator_base.h b/libstdc++-v3/config/allocator/malloc_allocator_base.h
index 4a82ec362c5..bc5e6b79042 100644
--- a/libstdc++-v3/config/allocator/malloc_allocator_base.h
+++ b/libstdc++-v3/config/allocator/malloc_allocator_base.h
@@ -1,6 +1,6 @@
// Base to std::allocator -*- C++ -*-
-// Copyright (C) 2004 Free Software Foundation, Inc.
+// Copyright (C) 2004, 2005 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -32,6 +32,6 @@
// Define new_allocator as the base class to std::allocator.
#include <ext/malloc_allocator.h>
-#define ___glibcxx_base_allocator __gnu_cxx::malloc_allocator
+#define __glibcxx_base_allocator __gnu_cxx::malloc_allocator
#endif
diff --git a/libstdc++-v3/config/allocator/mt_allocator_base.h b/libstdc++-v3/config/allocator/mt_allocator_base.h
index 52b4421a439..df39e2a2584 100644
--- a/libstdc++-v3/config/allocator/mt_allocator_base.h
+++ b/libstdc++-v3/config/allocator/mt_allocator_base.h
@@ -1,6 +1,6 @@
// Base to std::allocator -*- C++ -*-
-// Copyright (C) 2004 Free Software Foundation, Inc.
+// Copyright (C) 2004, 2005 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -32,6 +32,6 @@
// Define mt_allocator as the base class to std::allocator.
#include <ext/mt_allocator.h>
-#define ___glibcxx_base_allocator __gnu_cxx::__mt_alloc
+#define __glibcxx_base_allocator __gnu_cxx::__mt_alloc
#endif
diff --git a/libstdc++-v3/config/allocator/new_allocator_base.h b/libstdc++-v3/config/allocator/new_allocator_base.h
index 442f89cc535..c9b3bb20673 100644
--- a/libstdc++-v3/config/allocator/new_allocator_base.h
+++ b/libstdc++-v3/config/allocator/new_allocator_base.h
@@ -1,6 +1,6 @@
// Base to std::allocator -*- C++ -*-
-// Copyright (C) 2004 Free Software Foundation, Inc.
+// Copyright (C) 2004, 2005 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -32,6 +32,6 @@
// Define new_allocator as the base class to std::allocator.
#include <ext/new_allocator.h>
-#define ___glibcxx_base_allocator __gnu_cxx::new_allocator
+#define __glibcxx_base_allocator __gnu_cxx::new_allocator
#endif
diff --git a/libstdc++-v3/config/allocator/pool_allocator_base.h b/libstdc++-v3/config/allocator/pool_allocator_base.h
index 77c74b2d512..27432e86e32 100644
--- a/libstdc++-v3/config/allocator/pool_allocator_base.h
+++ b/libstdc++-v3/config/allocator/pool_allocator_base.h
@@ -1,6 +1,6 @@
// Base to std::allocator -*- C++ -*-
-// Copyright (C) 2004 Free Software Foundation, Inc.
+// Copyright (C) 2004, 2005 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -32,6 +32,6 @@
// Define new_allocator as the base class to std::allocator.
#include <ext/pool_allocator.h>
-#define ___glibcxx_base_allocator __gnu_cxx::__pool_alloc
+#define __glibcxx_base_allocator __gnu_cxx::__pool_alloc
#endif
diff --git a/libstdc++-v3/config/cpu/alpha/atomicity.h b/libstdc++-v3/config/cpu/alpha/atomicity.h
index 4eb311b509a..24a4feb1b64 100644
--- a/libstdc++-v3/config/cpu/alpha/atomicity.h
+++ b/libstdc++-v3/config/cpu/alpha/atomicity.h
@@ -1,6 +1,7 @@
// Low-level functions for atomic operations: Alpha version -*- C++ -*-
-// Copyright (C) 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+// Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005
+// 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
@@ -29,47 +30,16 @@
#include <bits/atomicity.h>
-/* @@@ With gas we can play nice .subsection games to get the
- non-predicted branch pointing forward. But Digital assemblers
- don't understand those directives. This isn't a terribly
- important issue, so just ignore it. */
-
namespace __gnu_cxx
{
_Atomic_word
__attribute__ ((__unused__))
__exchange_and_add(volatile _Atomic_word* __mem, int __val)
- {
- register int __result, __tmp;
-
- __asm__ __volatile__ (
- "\n$Lxadd_%=:\n\t"
- "ldl_l %0,%3\n\t"
- "addl %0,%4,%1\n\t"
- "stl_c %1,%2\n\t"
- "beq %1,$Lxadd_%=\n\t"
- "mb"
- : "=&r"(__result), "=&r"(__tmp), "=m"(*__mem)
- : "m" (*__mem), "r"(__val));
-
- return __result;
- }
+ { return __sync_fetch_and_add(__mem, __val); }
void
__attribute__ ((__unused__))
__atomic_add(volatile _Atomic_word* __mem, int __val)
- {
- register _Atomic_word __result;
-
- __asm__ __volatile__ (
- "\n$Ladd_%=:\n\t"
- "ldl_l %0,%2\n\t"
- "addl %0,%3,%0\n\t"
- "stl_c %0,%1\n\t"
- "beq %0,$Ladd_%=\n\t"
- "mb"
- : "=&r"(__result), "=m"(*__mem)
- : "m" (*__mem), "r"(__val));
- }
+ { __sync_fetch_and_add(__mem, __val); }
} // namespace __gnu_cxx
diff --git a/libstdc++-v3/config/cpu/ia64/atomicity.h b/libstdc++-v3/config/cpu/ia64/atomicity.h
index 0c3ab3343e9..c651b846e99 100644
--- a/libstdc++-v3/config/cpu/ia64/atomicity.h
+++ b/libstdc++-v3/config/cpu/ia64/atomicity.h
@@ -1,6 +1,7 @@
// Low-level functions for atomic operations: IA64 version -*- C++ -*-
-// Copyright (C) 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+// Copyright (C) 2000, 2001, 2003, 2004, 2005
+// 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
@@ -28,7 +29,6 @@
// the GNU General Public License.
#include <bits/atomicity.h>
-#include <ia64intrin.h>
namespace __gnu_cxx
{
diff --git a/libstdc++-v3/config/cpu/powerpc/atomicity.h b/libstdc++-v3/config/cpu/powerpc/atomicity.h
index 73149441dd8..d3e1e7464e4 100644
--- a/libstdc++-v3/config/cpu/powerpc/atomicity.h
+++ b/libstdc++-v3/config/cpu/powerpc/atomicity.h
@@ -1,6 +1,7 @@
// Low-level functions for atomic operations: PowerPC version -*- C++ -*-
-// Copyright (C) 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
+// Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005
+// 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
@@ -29,48 +30,15 @@
#include <bits/atomicity.h>
-#ifdef __PPC405__
-#define _STWCX "sync \n\tstwcx. "
-#else
-#define _STWCX "stwcx. "
-#endif
-
namespace __gnu_cxx
{
_Atomic_word
__attribute__ ((__unused__))
__exchange_and_add(volatile _Atomic_word* __mem, int __val)
- {
- _Atomic_word __tmp, __res;
- __asm__ __volatile__ (
- "/* Inline exchange & add */\n"
- "0:\t"
- "lwarx %0,0,%3 \n\t"
- "add%I4 %1,%0,%4 \n\t"
- _STWCX " %1,0,%3 \n\t"
- "bne- 0b \n\t"
- "/* End exchange & add */"
- : "=&b"(__res), "=&r"(__tmp), "=m" (*__mem)
- : "r" (__mem), "Ir"(__val), "m" (*__mem)
- : "cr0");
- return __res;
- }
+ { return __sync_fetch_and_add(__mem, __val); }
void
__attribute__ ((__unused__))
__atomic_add(volatile _Atomic_word* __mem, int __val)
- {
- _Atomic_word __tmp;
- __asm__ __volatile__ (
- "/* Inline atomic add */\n"
- "0:\t"
- "lwarx %0,0,%2 \n\t"
- "add%I3 %0,%0,%3 \n\t"
- _STWCX " %0,0,%2 \n\t"
- "bne- 0b \n\t"
- "/* End atomic add */"
- : "=&b"(__tmp), "=m" (*__mem)
- : "r" (__mem), "Ir"(__val), "m" (*__mem)
- : "cr0");
- }
+ { __sync_fetch_and_add(__mem, __val); }
} // namespace __gnu_cxx
diff --git a/libstdc++-v3/config/cpu/s390/atomicity.h b/libstdc++-v3/config/cpu/s390/atomicity.h
index cf903b321f4..5a235940c8c 100644
--- a/libstdc++-v3/config/cpu/s390/atomicity.h
+++ b/libstdc++-v3/config/cpu/s390/atomicity.h
@@ -34,22 +34,10 @@ namespace __gnu_cxx
_Atomic_word
__attribute__ ((__unused__))
__exchange_and_add(volatile _Atomic_word* __mem, int __val)
- {
- register _Atomic_word __old_val, __new_val;
-
- __asm__ __volatile__ (" l %0,0(%3)\n"
- "0: lr %1,%0\n"
- " ar %1,%4\n"
- " cs %0,%1,0(%3)\n"
- " jl 0b"
- : "=&d" (__old_val), "=&d" (__new_val), "=m" (*__mem)
- : "a" (__mem), "d" (__val), "m" (*__mem)
- : "cc", "memory");
- return __old_val;
- }
+ { return __sync_fetch_and_add(__mem, __val); }
void
__attribute__ ((__unused__))
__atomic_add(volatile _Atomic_word* __mem, int __val)
- { __exchange_and_add(__mem, __val); }
+ { __sync_fetch_and_add(__mem, __val); }
} // namespace __gnu_cxx
diff --git a/libstdc++-v3/config/linker-map.gnu b/libstdc++-v3/config/linker-map.gnu
index a6f631a8d97..a9d20abe21e 100644
--- a/libstdc++-v3/config/linker-map.gnu
+++ b/libstdc++-v3/config/linker-map.gnu
@@ -1,6 +1,6 @@
## Linker script for GNU ld 2.13.91+ only.
##
-## Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+## Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
##
## This file is part of the libstdc++ version 3 distribution.
##
@@ -40,7 +40,7 @@ GLIBCXX_3.4 {
std::logic_error*;
std::locale::[A-Za-e]*;
std::locale::facet::[A-Za-z]*;
- std::locale::facet::_S_get_c_locale*;
+ std::locale::facet::_S_get_c_locale*;
std::locale::facet::_S_clone_c_locale*;
std::locale::facet::_S_create_c_locale*;
std::locale::facet::_S_destroy_c_locale*;
@@ -304,6 +304,16 @@ GLIBCXX_3.4.4 {
} GLIBCXX_3.4.3;
+GLIBCXX_3.4.5 {
+
+ _ZSt17__copy_streambufsI[cw]St11char_traitsI[cw]EEiPSt15basic_streambuf*;
+ _ZNSt8ios_base17_M_call_callbacksENS_5eventE;
+ _ZNSt8ios_base20_M_dispose_callbacksEv;
+ _ZNSt6locale5facet13_S_get_c_nameEv;
+ _ZN11__gnu_debug13__fancy_abortEPKciS1_S1_;
+
+} GLIBCXX_3.4.4;
+
# Symbols in the support library (libsupc++) have their own tag.
CXXABI_1.3 {
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index 053980648f8..aa584fd1657 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -1376,7 +1376,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
### am handles this now? ORIGINAL_LD_FOR_MULTILIBS=$LD
# For libtool versioning info, format is CURRENT:REVISION:AGE
-libtool_VERSION=6:4:0
+libtool_VERSION=6:5:0
# Find the rest of the source tree framework.
@@ -6715,14 +6715,10 @@ _ACEOF
fi
- # Check for the existence of <complex.h> complex functions.
+ # Check for the existence of <complex.h> complex math functions.
# This is necessary even though libstdc++ uses the builtin versions
# of these functions, because if the builtin cannot be used, a reference
# to the library function is emitted.
- # In addition, need to explicitly specify "C" compilation for this
- # one, or else the backwards C++ <complex.h> include will be selected.
- save_CXXFLAGS="$CXXFLAGS"
- CXXFLAGS="$CXXFLAGS -x c"
for ac_header in complex.h
do
@@ -6895,6 +6891,7 @@ typedef __complex__ float float_type; float_type tmpf;
ccosf(tmpf);
ccoshf(tmpf);
cexpf(tmpf);
+ clogf(tmpf);
csinf(tmpf);
csinhf(tmpf);
csqrtf(tmpf);
@@ -6907,6 +6904,7 @@ typedef __complex__ float float_type; float_type tmpf;
ccos(tmpd);
ccosh(tmpd);
cexp(tmpd);
+ clog(tmpd);
csin(tmpd);
csinh(tmpd);
csqrt(tmpd);
@@ -6919,6 +6917,7 @@ typedef __complex__ float float_type; float_type tmpf;
ccosl(tmpld);
ccoshl(tmpld);
cexpl(tmpld);
+ clogl(tmpld);
csinl(tmpld);
csinhl(tmpld);
csqrtl(tmpld);
@@ -6961,7 +6960,6 @@ ac_c99_complex=no
fi
rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
fi
- CXXFLAGS="$save_CXXFLAGS"
echo "$as_me:$LINENO: result: $ac_c99_complex" >&5
echo "${ECHO_T}$ac_c99_complex" >&6
if test x"$ac_c99_complex" = x"yes"; then
@@ -7059,7 +7057,9 @@ main ()
char* tmp;
strtof("gnu", &tmp);
strtold("gnu", &tmp);
- llabs(10);
+ strtoll("gnu", &tmp, 10);
+ strtoull("gnu", &tmp, 10);
+ llabs(10);
lldiv(10,1);
atoll("10");
_Exit(0);
@@ -30156,7 +30156,7 @@ rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_func_mmap_fixed_mapped=no
fi
fi
-if test "x${ac_cv_func_mmap_fixed_mapped+set}" != xset; then
+if test "x${ac_cv_func_mmap_fixed_mapped}" != xno; then
for ac_header in stdlib.h unistd.h
diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac
index f5a5c4c3d80..b0e72fc644e 100644
--- a/libstdc++-v3/configure.ac
+++ b/libstdc++-v3/configure.ac
@@ -12,7 +12,7 @@ AC_CONFIG_HEADER(config.h)
### am handles this now? ORIGINAL_LD_FOR_MULTILIBS=$LD
# For libtool versioning info, format is CURRENT:REVISION:AGE
-libtool_VERSION=6:4:0
+libtool_VERSION=6:5:0
AC_SUBST(libtool_VERSION)
# Find the rest of the source tree framework.
diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host
index b3582a41d79..d12e964bddb 100644
--- a/libstdc++-v3/configure.host
+++ b/libstdc++-v3/configure.host
@@ -270,6 +270,9 @@ case "${host}" in
abi_baseline_pair="mips-linux-gnu"
cpu_include_dir="cpu/mips"
;;
+ powerpc64-*-linux*)
+ abi_baseline_pair="powerpc64-linux-gnu"
+ ;;
s390-*-linux*)
abi_baseline_pair="s390-linux-gnu"
;;
diff --git a/libstdc++-v3/docs/html/abi.html b/libstdc++-v3/docs/html/abi.html
index e48bb4b8bf7..1971b3aa63d 100644
--- a/libstdc++-v3/docs/html/abi.html
+++ b/libstdc++-v3/docs/html/abi.html
@@ -734,11 +734,18 @@ Use the 'make check-abi' rule in the libstdc++-v3 Makefile.
<p>
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
+good baseline. Currently, this baseline is keyed off of 3.4.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.
+
+Notice that each baseline is relative to a <strong>default</strong>
+configured library and compiler: in particular, if options such as
+--enable-clocale, or --with-cpu, in case of multilibs, are used at
+configure time, the check may fail, either because of substantive
+differences or because of limitations of the current checking
+machinery.
</p>
<p>
diff --git a/libstdc++-v3/docs/html/debug.html b/libstdc++-v3/docs/html/debug.html
index af1177bd2d2..0242d4363e3 100644
--- a/libstdc++-v3/docs/html/debug.html
+++ b/libstdc++-v3/docs/html/debug.html
@@ -286,7 +286,10 @@
under pedantic debug mode libstdc++ would signal an error. To enable
the pedantic debug mode, compile your program with
both <code>-D_GLIBCXX_DEBUG</code>
- and <code>-D_GLIBCXX_DEBUG_PEDANTIC</code> .</p>
+ and <code>-D_GLIBCXX_DEBUG_PEDANTIC</code> .
+ (N.B. In GCC 3.4.x and 4.0.0, due to a bug,
+ <code>-D_GLIBXX_DEBUG_PEDANTIC</code> was also needed. The problem has
+ been fixed in GCC 4.0.1 and later versions.) </p>
<p>The following library components provide extra debugging
capabilities in debug mode:</p>
diff --git a/libstdc++-v3/docs/html/test.html b/libstdc++-v3/docs/html/test.html
index d15dc427180..41e0529e6c6 100644
--- a/libstdc++-v3/docs/html/test.html
+++ b/libstdc++-v3/docs/html/test.html
@@ -427,8 +427,8 @@ Example 4: Testing for compilation errors on line 41
Example 5: Testing with special command line settings, or without the
use of pre-compiled headers, in particular the stdc++.h.gch file. Any
-options here will override the DEFAULT_CXXFLAGS set up in the
-normal.exp file.
+options here will override the DEFAULT_CXXFLAGS and PCH_CXXFLAGS set
+up in the normal.exp file.
// { dg-options "-O0" { target *-*-* } }
</pre>
diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
index abd9abf4e70..797afb619c8 100644
--- a/libstdc++-v3/include/Makefile.am
+++ b/libstdc++-v3/include/Makefile.am
@@ -321,6 +321,7 @@ debug_headers = \
${debug_srcdir}/debug.h \
${debug_srcdir}/deque \
${debug_srcdir}/formatter.h \
+ ${debug_srcdir}/functions.h \
${debug_srcdir}/hash_map \
${debug_srcdir}/hash_map.h \
${debug_srcdir}/hash_multimap.h \
@@ -329,6 +330,7 @@ debug_headers = \
${debug_srcdir}/hash_set.h \
${debug_srcdir}/list \
${debug_srcdir}/map \
+ ${debug_srcdir}/macros.h \
${debug_srcdir}/map.h \
${debug_srcdir}/multimap.h \
${debug_srcdir}/multiset.h \
diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in
index 60bf72bf3c4..ef6f242f0d5 100644
--- a/libstdc++-v3/include/Makefile.in
+++ b/libstdc++-v3/include/Makefile.in
@@ -40,7 +40,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(top_srcdir)/fragment.am
subdir = include
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/../config/no-executables.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/../config/lead-dot.m4 \
+ $(top_srcdir)/../config/no-executables.m4 \
$(top_srcdir)/../libtool.m4 $(top_srcdir)/crossconfig.m4 \
$(top_srcdir)/linkage.m4 $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/configure.ac
@@ -538,6 +539,7 @@ debug_headers = \
${debug_srcdir}/debug.h \
${debug_srcdir}/deque \
${debug_srcdir}/formatter.h \
+ ${debug_srcdir}/functions.h \
${debug_srcdir}/hash_map \
${debug_srcdir}/hash_map.h \
${debug_srcdir}/hash_multimap.h \
@@ -546,6 +548,7 @@ debug_headers = \
${debug_srcdir}/hash_set.h \
${debug_srcdir}/list \
${debug_srcdir}/map \
+ ${debug_srcdir}/macros.h \
${debug_srcdir}/map.h \
${debug_srcdir}/multimap.h \
${debug_srcdir}/multiset.h \
diff --git a/libstdc++-v3/include/bits/allocator.h b/libstdc++-v3/include/bits/allocator.h
index c28442fc6fa..598048d0df3 100644
--- a/libstdc++-v3/include/bits/allocator.h
+++ b/libstdc++-v3/include/bits/allocator.h
@@ -1,6 +1,6 @@
// Allocators -*- C++ -*-
-// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002, 2003, 2004, 2005 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
@@ -79,7 +79,7 @@ namespace std
* http://gcc.gnu.org/onlinedocs/libstdc++/20_util/allocator.html
*/
template<typename _Tp>
- class allocator: public ___glibcxx_base_allocator<_Tp>
+ class allocator: public __glibcxx_base_allocator<_Tp>
{
public:
typedef size_t size_type;
@@ -97,7 +97,7 @@ namespace std
allocator() throw() { }
allocator(const allocator& __a) throw()
- : ___glibcxx_base_allocator<_Tp>(__a) { }
+ : __glibcxx_base_allocator<_Tp>(__a) { }
template<typename _Tp1>
allocator(const allocator<_Tp1>&) throw() { }
@@ -126,7 +126,7 @@ namespace std
#endif
// Undefine.
-#undef ___glibcxx_base_allocator
+#undef __glibcxx_base_allocator
} // namespace std
#endif
diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h
index 35dd364d969..07b66d6d615 100644
--- a/libstdc++-v3/include/bits/basic_string.h
+++ b/libstdc++-v3/include/bits/basic_string.h
@@ -109,17 +109,19 @@ namespace std
template<typename _CharT, typename _Traits, typename _Alloc>
class basic_string
{
+ typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type;
+
// Types:
public:
typedef _Traits traits_type;
typedef typename _Traits::char_type value_type;
typedef _Alloc allocator_type;
- typedef typename _Alloc::size_type size_type;
- typedef typename _Alloc::difference_type difference_type;
- typedef typename _Alloc::reference reference;
- typedef typename _Alloc::const_reference const_reference;
- typedef typename _Alloc::pointer pointer;
- typedef typename _Alloc::const_pointer const_pointer;
+ typedef typename _CharT_alloc_type::size_type size_type;
+ typedef typename _CharT_alloc_type::difference_type difference_type;
+ typedef typename _CharT_alloc_type::reference reference;
+ typedef typename _CharT_alloc_type::const_reference const_reference;
+ typedef typename _CharT_alloc_type::pointer pointer;
+ typedef typename _CharT_alloc_type::const_pointer const_pointer;
typedef __gnu_cxx::__normal_iterator<pointer, basic_string> iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, basic_string>
const_iterator;
@@ -151,7 +153,7 @@ namespace std
struct _Rep : _Rep_base
{
// Types:
- typedef typename _Alloc::template rebind<size_type>::other _Raw_alloc;
+ typedef typename _Alloc::template rebind<char>::other _Raw_bytes_alloc;
// (Public) Data members:
@@ -198,7 +200,8 @@ namespace std
{
this->_M_set_sharable(); // One reference.
this->_M_length = __n;
- this->_M_refdata()[__n] = _S_terminal; // grrr. (per 21.3.4)
+ traits_type::assign(this->_M_refdata()[__n], _S_terminal);
+ // grrr. (per 21.3.4)
// You cannot leave those LWG people alone for a second.
}
diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc
index 672457f9be9..41db0dff438 100644
--- a/libstdc++-v3/include/bits/basic_string.tcc
+++ b/libstdc++-v3/include/bits/basic_string.tcc
@@ -425,10 +425,9 @@ namespace std
basic_string<_CharT, _Traits, _Alloc>::_Rep::
_M_destroy(const _Alloc& __a) throw ()
{
- const size_type __size = ((this->_M_capacity + 1) * sizeof(_CharT)
- + sizeof(_Rep_base) + sizeof(size_type) - 1);
- _Raw_alloc(__a).deallocate(reinterpret_cast<size_type*>(this), __size
- / sizeof(size_type));
+ const size_type __size = sizeof(_Rep_base) +
+ (this->_M_capacity + 1) * sizeof(_CharT);
+ _Raw_bytes_alloc(__a).deallocate(reinterpret_cast<char*>(this), __size);
}
template<typename _CharT, typename _Traits, typename _Alloc>
@@ -569,12 +568,9 @@ namespace std
__capacity = 2 * __old_capacity;
// NB: Need an array of char_type[__capacity], plus a terminating
- // null char_type() element, plus enough for the _Rep data structure,
- // plus sizeof(size_type) - 1 to upper round to a size multiple
- // of sizeof(size_type).
+ // null char_type() element, plus enough for the _Rep data structure.
// Whew. Seemingly so needy, yet so elemental.
- size_type __size = ((__capacity + 1) * sizeof(_CharT) + sizeof(_Rep)
- + sizeof(size_type) - 1);
+ size_type __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
const size_type __adj_size = __size + __malloc_header_size;
if (__adj_size > __pagesize && __capacity > __old_capacity)
@@ -584,14 +580,12 @@ namespace std
// Never allocate a string bigger than _S_max_size.
if (__capacity > _S_max_size)
__capacity = _S_max_size;
- __size = ((__capacity + 1) * sizeof(_CharT) + sizeof(_Rep)
- + sizeof(size_type) - 1);
+ __size = (__capacity + 1) * sizeof(_CharT) + sizeof(_Rep);
}
// NB: Might throw, but no worries about a leak, mate: _Rep()
// does not throw.
- void* __place = _Raw_alloc(__alloc).allocate(__size
- / sizeof(size_type));
+ void* __place = _Raw_bytes_alloc(__alloc).allocate(__size);
_Rep *__p = new (__place) _Rep;
__p->_M_capacity = __capacity;
return __p;
diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config
index 526ab8c7355..16c3194ba67 100644
--- a/libstdc++-v3/include/bits/c++config
+++ b/libstdc++-v3/include/bits/c++config
@@ -1,6 +1,6 @@
// Predefined symbols and macros -*- C++ -*-
-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -34,27 +34,6 @@
// Pick up any OS-specific definitions.
#include <bits/os_defines.h>
-// Allow use of "export template." This is currently not a feature
-// that g++ supports.
-// #define _GLIBCXX_EXPORT_TEMPLATE 1
-
-// Allow use of the GNU syntax extension, "extern template." This
-// extension is fully documented in the g++ manual, but in a nutshell,
-// it inhibits all implicit instantiations and is used throughout the
-// library to avoid multiple weak definitions for required types that
-// are already explicitly instantiated in the library binary. This
-// substantially reduces the binary size of resulting executables.
-#ifndef _GLIBCXX_EXTERN_TEMPLATE
-# define _GLIBCXX_EXTERN_TEMPLATE 1
-#endif
-
-// Certain function definitions that are meant to be overridable from
-// user code are decorated with this macro. For some targets, this
-// macro causes these definitions to be weak.
-#ifndef _GLIBCXX_WEAK_DEFINITION
-# define _GLIBCXX_WEAK_DEFINITION
-#endif
-
// Debug mode support. Debug mode basic_string is not allowed to be
// associated with std, because of locale and exception link
// dependence.
@@ -66,7 +45,10 @@ namespace __gnu_debug
}
#ifdef _GLIBCXX_DEBUG
-# define _GLIBCXX_STD __gnu_norm
+# if __GXX_WEAK__
+# define _GLIBCXX_STD __gnu_norm
+# define _GLIBCXX_EXTERN_TEMPLATE 0
+
namespace __gnu_norm
{
using namespace std;
@@ -75,10 +57,33 @@ namespace std
{
using namespace __gnu_debug_def __attribute__ ((strong));
}
+# else
+# warning debug mode disabled due to lack of weak symbol support
+# endif
#else
# define _GLIBCXX_STD std
#endif
+// Allow use of "export template." This is currently not a feature
+// that g++ supports.
+// #define _GLIBCXX_EXPORT_TEMPLATE 1
+
+// Allow use of the GNU syntax extension, "extern template." This
+// extension is fully documented in the g++ manual, but in a nutshell,
+// it inhibits all implicit instantiations and is used throughout the
+// library to avoid multiple weak definitions for required types that
+// are already explicitly instantiated in the library binary. This
+// substantially reduces the binary size of resulting executables.
+#ifndef _GLIBCXX_EXTERN_TEMPLATE
+# define _GLIBCXX_EXTERN_TEMPLATE 1
+#endif
+
+// Certain function definitions that are meant to be overridable from
+// user code are decorated with this macro. For some targets, this
+// macro causes these definitions to be weak.
+#ifndef _GLIBCXX_WEAK_DEFINITION
+# define _GLIBCXX_WEAK_DEFINITION
+#endif
// The remainder of the prewritten config is automatic; all the
// user hooks are listed above.
diff --git a/libstdc++-v3/include/bits/deque.tcc b/libstdc++-v3/include/bits/deque.tcc
index c5440b22419..e69c79a4f34 100644
--- a/libstdc++-v3/include/bits/deque.tcc
+++ b/libstdc++-v3/include/bits/deque.tcc
@@ -147,7 +147,7 @@ namespace _GLIBCXX_STD
std::copy_backward(this->_M_impl._M_start, __first, __last);
iterator __new_start = this->_M_impl._M_start + __n;
std::_Destroy(this->_M_impl._M_start, __new_start,
- this->get_allocator());
+ _M_get_Tp_allocator());
_M_destroy_nodes(this->_M_impl._M_start._M_node,
__new_start._M_node);
this->_M_impl._M_start = __new_start;
@@ -157,7 +157,7 @@ namespace _GLIBCXX_STD
std::copy(__last, this->_M_impl._M_finish, __first);
iterator __new_finish = this->_M_impl._M_finish - __n;
std::_Destroy(__new_finish, this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
_M_destroy_nodes(__new_finish._M_node + 1,
this->_M_impl._M_finish._M_node + 1);
this->_M_impl._M_finish = __new_finish;
@@ -176,7 +176,7 @@ namespace _GLIBCXX_STD
++__node)
{
std::_Destroy(*__node, *__node + _S_buffer_size(),
- this->get_allocator());
+ _M_get_Tp_allocator());
_M_deallocate_node(*__node);
}
@@ -184,16 +184,16 @@ namespace _GLIBCXX_STD
{
std::_Destroy(this->_M_impl._M_start._M_cur,
this->_M_impl._M_start._M_last,
- this->get_allocator());
+ _M_get_Tp_allocator());
std::_Destroy(this->_M_impl._M_finish._M_first,
this->_M_impl._M_finish._M_cur,
- this->get_allocator());
+ _M_get_Tp_allocator());
_M_deallocate_node(this->_M_impl._M_finish._M_first);
}
else
std::_Destroy(this->_M_impl._M_start._M_cur,
this->_M_impl._M_finish._M_cur,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish = this->_M_impl._M_start;
}
@@ -201,9 +201,9 @@ namespace _GLIBCXX_STD
template <typename _Tp, class _Alloc>
template <typename _InputIterator>
void
- deque<_Tp, _Alloc>
- ::_M_assign_aux(_InputIterator __first, _InputIterator __last,
- std::input_iterator_tag)
+ deque<_Tp, _Alloc>::
+ _M_assign_aux(_InputIterator __first, _InputIterator __last,
+ std::input_iterator_tag)
{
iterator __cur = begin();
for (; __first != __last && __cur != end(); ++__cur, ++__first)
@@ -226,7 +226,7 @@ namespace _GLIBCXX_STD
{
std::__uninitialized_fill_a(__new_start, this->_M_impl._M_start,
__x,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_start = __new_start;
}
catch(...)
@@ -243,7 +243,7 @@ namespace _GLIBCXX_STD
{
std::__uninitialized_fill_a(this->_M_impl._M_finish,
__new_finish, __x,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish = __new_finish;
}
catch(...)
@@ -269,15 +269,15 @@ namespace _GLIBCXX_STD
__cur < this->_M_impl._M_finish._M_node;
++__cur)
std::__uninitialized_fill_a(*__cur, *__cur + _S_buffer_size(),
- __value, this->get_allocator());
+ __value, _M_get_Tp_allocator());
std::__uninitialized_fill_a(this->_M_impl._M_finish._M_first,
this->_M_impl._M_finish._M_cur,
- __value, this->get_allocator());
+ __value, _M_get_Tp_allocator());
}
catch(...)
{
std::_Destroy(this->_M_impl._M_start, iterator(*__cur, __cur),
- this->get_allocator());
+ _M_get_Tp_allocator());
__throw_exception_again;
}
}
@@ -322,18 +322,18 @@ namespace _GLIBCXX_STD
_ForwardIterator __mid = __first;
std::advance(__mid, _S_buffer_size());
std::__uninitialized_copy_a(__first, __mid, *__cur_node,
- this->get_allocator());
+ _M_get_Tp_allocator());
__first = __mid;
}
std::__uninitialized_copy_a(__first, __last,
this->_M_impl._M_finish._M_first,
- this->get_allocator());
+ _M_get_Tp_allocator());
}
catch(...)
{
std::_Destroy(this->_M_impl._M_start,
iterator(*__cur_node, __cur_node),
- this->get_allocator());
+ _M_get_Tp_allocator());
__throw_exception_again;
}
}
@@ -435,7 +435,7 @@ namespace _GLIBCXX_STD
try
{
std::__uninitialized_copy_a(__first, __last, __new_start,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_start = __new_start;
}
catch(...)
@@ -452,7 +452,7 @@ namespace _GLIBCXX_STD
{
std::__uninitialized_copy_a(__first, __last,
this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish = __new_finish;
}
catch(...)
@@ -520,7 +520,7 @@ namespace _GLIBCXX_STD
+ difference_type(__n));
std::__uninitialized_copy_a(this->_M_impl._M_start,
__start_n, __new_start,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_start = __new_start;
std::copy(__start_n, __pos, __old_start);
fill(__pos - difference_type(__n), __pos, __x_copy);
@@ -531,7 +531,7 @@ namespace _GLIBCXX_STD
__pos, __new_start,
this->_M_impl._M_start,
__x_copy,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_start = __new_start;
std::fill(__old_start, __pos, __x_copy);
}
@@ -559,7 +559,7 @@ namespace _GLIBCXX_STD
std::__uninitialized_copy_a(__finish_n,
this->_M_impl._M_finish,
this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish = __new_finish;
std::copy_backward(__pos, __finish_n, __old_finish);
std::fill(__pos, __pos + difference_type(__n), __x_copy);
@@ -570,7 +570,7 @@ namespace _GLIBCXX_STD
__pos + difference_type(__n),
__x_copy, __pos,
this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish = __new_finish;
std::fill(__pos, __old_finish, __x_copy);
}
@@ -607,7 +607,7 @@ namespace _GLIBCXX_STD
+ difference_type(__n));
std::__uninitialized_copy_a(this->_M_impl._M_start,
__start_n, __new_start,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_start = __new_start;
std::copy(__start_n, __pos, __old_start);
std::copy(__first, __last, __pos - difference_type(__n));
@@ -619,7 +619,7 @@ namespace _GLIBCXX_STD
std::__uninitialized_copy_copy(this->_M_impl._M_start,
__pos, __first, __mid,
__new_start,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_start = __new_start;
std::copy(__mid, __last, __old_start);
}
@@ -647,7 +647,7 @@ namespace _GLIBCXX_STD
std::__uninitialized_copy_a(__finish_n,
this->_M_impl._M_finish,
this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish = __new_finish;
std::copy_backward(__pos, __finish_n, __old_finish);
std::copy(__first, __last, __pos);
@@ -659,7 +659,7 @@ namespace _GLIBCXX_STD
std::__uninitialized_copy_copy(__mid, __last, __pos,
this->_M_impl._M_finish,
this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish = __new_finish;
std::copy(__first, __mid, __pos);
}
diff --git a/libstdc++-v3/include/bits/fstream.tcc b/libstdc++-v3/include/bits/fstream.tcc
index 40bf428e2c1..0228322f2ea 100644
--- a/libstdc++-v3/include/bits/fstream.tcc
+++ b/libstdc++-v3/include/bits/fstream.tcc
@@ -203,8 +203,7 @@ namespace std
return traits_type::to_int_type(*this->gptr());
// Get and convert input sequence.
- const size_t __buflen = _M_buf_size > 1
- ? _M_buf_size - 1 : 1;
+ const size_t __buflen = _M_buf_size > 1 ? _M_buf_size - 1 : 1;
// Will be set to true if ::read() returns 0 indicating EOF.
bool __got_eof = false;
diff --git a/libstdc++-v3/include/bits/list.tcc b/libstdc++-v3/include/bits/list.tcc
index 59f9d1ad703..d65f73c0bee 100644
--- a/libstdc++-v3/include/bits/list.tcc
+++ b/libstdc++-v3/include/bits/list.tcc
@@ -1,6 +1,6 @@
// List implementation (out of line) -*- C++ -*-
-// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002, 2003, 2004, 2005 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
@@ -74,7 +74,7 @@ namespace _GLIBCXX_STD
{
_Node* __tmp = __cur;
__cur = static_cast<_Node*>(__cur->_M_next);
- this->get_allocator().destroy(&__tmp->_M_data);
+ _M_get_Tp_allocator().destroy(&__tmp->_M_data);
_M_put_node(__tmp);
}
}
@@ -102,7 +102,7 @@ namespace _GLIBCXX_STD
template<typename _Tp, typename _Alloc>
void
list<_Tp, _Alloc>::
- resize(size_type __new_size, const value_type& __x)
+ resize(size_type __new_size, value_type __x)
{
iterator __i = begin();
size_type __len = 0;
diff --git a/libstdc++-v3/include/bits/stl_algo.h b/libstdc++-v3/include/bits/stl_algo.h
index c0eaf5cd516..ee73321f6e2 100644
--- a/libstdc++-v3/include/bits/stl_algo.h
+++ b/libstdc++-v3/include/bits/stl_algo.h
@@ -1,6 +1,6 @@
// Algorithm implementation -*- C++ -*-
-// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002, 2003, 2004, 2005 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
@@ -413,9 +413,8 @@ namespace std
{
// concept requirements
__glibcxx_function_requires(_InputIteratorConcept<_InputIterator>)
- __glibcxx_function_requires(_EqualityComparableConcept<
- typename iterator_traits<_InputIterator>::value_type >)
- __glibcxx_function_requires(_EqualityComparableConcept<_Tp>)
+ __glibcxx_function_requires(_EqualOpConcept<
+ typename iterator_traits<_InputIterator>::value_type, _Tp>)
__glibcxx_requires_valid_range(__first, __last);
typename iterator_traits<_InputIterator>::difference_type __n = 0;
for ( ; __first != __last; ++__first)
@@ -627,9 +626,8 @@ namespace std
{
// concept requirements
__glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>)
- __glibcxx_function_requires(_EqualityComparableConcept<
- typename iterator_traits<_ForwardIterator>::value_type>)
- __glibcxx_function_requires(_EqualityComparableConcept<_Tp>)
+ __glibcxx_function_requires(_EqualOpConcept<
+ typename iterator_traits<_ForwardIterator>::value_type, _Tp>)
__glibcxx_requires_valid_range(__first, __last);
if (__count <= 0)
@@ -918,7 +916,10 @@ namespace std
__glibcxx_requires_valid_range(__first, __last);
for ( ; __first != __last; ++__first, ++__result)
- *__result = *__first == __old_value ? __new_value : *__first;
+ if (*__first == __old_value)
+ *__result = __new_value;
+ else
+ *__result = *__first;
return __result;
}
@@ -952,7 +953,10 @@ namespace std
__glibcxx_requires_valid_range(__first, __last);
for ( ; __first != __last; ++__first, ++__result)
- *__result = __pred(*__first) ? __new_value : *__first;
+ if (__pred(*__first))
+ *__result = __new_value;
+ else
+ *__result = *__first;
return __result;
}
@@ -1637,7 +1641,7 @@ namespace std
for (_Distance __i = 0; __i < __d; __i++)
{
- const _ValueType __tmp = *__first;
+ _ValueType __tmp = *__first;
_RandomAccessIterator __p = __first;
if (__k < __l)
diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h
index 426fcba0298..a0f7c5041c3 100644
--- a/libstdc++-v3/include/bits/stl_algobase.h
+++ b/libstdc++-v3/include/bits/stl_algobase.h
@@ -94,7 +94,7 @@ namespace std
// concept requirements
__glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
- const _Tp __tmp = __a;
+ _Tp __tmp = __a;
__a = __b;
__b = __tmp;
}
@@ -111,7 +111,7 @@ namespace std
{
typedef typename iterator_traits<_ForwardIterator1>::value_type
_ValueType1;
- const _ValueType1 __tmp = *__a;
+ _ValueType1 __tmp = *__a;
*__a = *__b;
*__b = __tmp;
}
diff --git a/libstdc++-v3/include/bits/stl_deque.h b/libstdc++-v3/include/bits/stl_deque.h
index fdee3d5aedf..5a20b657a5f 100644
--- a/libstdc++-v3/include/bits/stl_deque.h
+++ b/libstdc++-v3/include/bits/stl_deque.h
@@ -358,7 +358,7 @@ namespace _GLIBCXX_STD
allocator_type
get_allocator() const
- { return *static_cast<const _Alloc*>(&this->_M_impl); }
+ { return _M_get_Tp_allocator(); }
typedef _Deque_iterator<_Tp, _Tp&, _Tp*> iterator;
typedef _Deque_iterator<_Tp, const _Tp&, const _Tp*> const_iterator;
@@ -377,30 +377,43 @@ namespace _GLIBCXX_STD
//This struct encapsulates the implementation of the std::deque
//standard container and at the same time makes use of the EBO
//for empty allocators.
+ typedef typename _Alloc::template rebind<_Tp*>::other _Map_alloc_type;
+
+ typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
+
struct _Deque_impl
- : public _Alloc
+ : public _Tp_alloc_type
{
_Tp** _M_map;
size_t _M_map_size;
iterator _M_start;
iterator _M_finish;
- _Deque_impl(const _Alloc& __a)
- : _Alloc(__a), _M_map(0), _M_map_size(0), _M_start(), _M_finish()
+ _Deque_impl(const _Tp_alloc_type& __a)
+ : _Tp_alloc_type(__a), _M_map(0), _M_map_size(0),
+ _M_start(), _M_finish()
{ }
};
- typedef typename _Alloc::template rebind<_Tp*>::other _Map_alloc_type;
- _Map_alloc_type _M_get_map_allocator() const
- { return _Map_alloc_type(this->get_allocator()); }
+ _Tp_alloc_type
+ _M_get_Tp_allocator() const
+ { return *static_cast<const _Tp_alloc_type*>(&this->_M_impl); }
+
+ _Map_alloc_type
+ _M_get_map_allocator() const
+ { return _M_get_Tp_allocator(); }
_Tp*
_M_allocate_node()
- { return _M_impl._Alloc::allocate(__deque_buf_size(sizeof(_Tp))); }
+ {
+ return _M_impl._Tp_alloc_type::allocate(__deque_buf_size(sizeof(_Tp)));
+ }
void
_M_deallocate_node(_Tp* __p)
- { _M_impl._Alloc::deallocate(__p, __deque_buf_size(sizeof(_Tp))); }
+ {
+ _M_impl._Tp_alloc_type::deallocate(__p, __deque_buf_size(sizeof(_Tp)));
+ }
_Tp**
_M_allocate_map(size_t __n)
@@ -595,23 +608,26 @@ namespace _GLIBCXX_STD
class deque : protected _Deque_base<_Tp, _Alloc>
{
// concept requirements
+ typedef typename _Alloc::value_type _Alloc_value_type;
__glibcxx_class_requires(_Tp, _SGIAssignableConcept)
+ __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
typedef _Deque_base<_Tp, _Alloc> _Base;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
public:
- typedef _Tp value_type;
- typedef typename _Alloc::pointer pointer;
- typedef typename _Alloc::const_pointer const_pointer;
- typedef typename _Alloc::reference reference;
- typedef typename _Alloc::const_reference const_reference;
- typedef typename _Base::iterator iterator;
- typedef typename _Base::const_iterator const_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
+ typedef _Tp value_type;
+ typedef typename _Tp_alloc_type::pointer pointer;
+ typedef typename _Tp_alloc_type::const_pointer const_pointer;
+ typedef typename _Tp_alloc_type::reference reference;
+ typedef typename _Tp_alloc_type::const_reference const_reference;
+ typedef typename _Base::iterator iterator;
+ typedef typename _Base::const_iterator const_iterator;
+ typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+ typedef std::reverse_iterator<iterator> reverse_iterator;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
- typedef typename _Base::allocator_type allocator_type;
+ typedef _Alloc allocator_type;
protected:
typedef pointer* _Map_pointer;
@@ -627,6 +643,7 @@ namespace _GLIBCXX_STD
using _Base::_M_deallocate_node;
using _Base::_M_allocate_map;
using _Base::_M_deallocate_map;
+ using _Base::_M_get_Tp_allocator;
/** @if maint
* A total of four data members accumulated down the heirarchy.
@@ -652,24 +669,13 @@ namespace _GLIBCXX_STD
*
* This constructor fills the %deque with @a n copies of @a value.
*/
- deque(size_type __n, const value_type& __value,
+ explicit
+ deque(size_type __n, const value_type& __value = value_type(),
const allocator_type& __a = allocator_type())
: _Base(__a, __n)
{ _M_fill_initialize(__value); }
/**
- * @brief Create a %deque with default elements.
- * @param n The number of elements to initially create.
- *
- * This constructor fills the %deque with @a n copies of a
- * default-constructed element.
- */
- explicit
- deque(size_type __n)
- : _Base(allocator_type(), __n)
- { _M_fill_initialize(value_type()); }
-
- /**
* @brief %Deque copy constructor.
* @param x A %deque of identical element and allocator types.
*
@@ -680,7 +686,7 @@ namespace _GLIBCXX_STD
: _Base(__x.get_allocator(), __x.size())
{ std::__uninitialized_copy_a(__x.begin(), __x.end(),
this->_M_impl._M_start,
- this->get_allocator()); }
+ _M_get_Tp_allocator()); }
/**
* @brief Builds a %deque from a range.
@@ -713,7 +719,7 @@ namespace _GLIBCXX_STD
*/
~deque()
{ std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
- this->get_allocator()); }
+ _M_get_Tp_allocator()); }
/**
* @brief %Deque assignment operator.
@@ -857,7 +863,7 @@ namespace _GLIBCXX_STD
* data.
*/
void
- resize(size_type __new_size, const value_type& __x)
+ resize(size_type __new_size, value_type __x = value_type())
{
const size_type __len = size();
if (__new_size < __len)
@@ -867,19 +873,6 @@ namespace _GLIBCXX_STD
}
/**
- * @brief Resizes the %deque to the specified number of elements.
- * @param new_size Number of elements the %deque should contain.
- *
- * This function will resize the %deque to the specified number
- * of elements. If the number is smaller than the %deque's
- * current size the %deque is truncated, otherwise the %deque
- * is extended and new elements are default-constructed.
- */
- void
- resize(size_type new_size)
- { resize(new_size, value_type()); }
-
- /**
* Returns true if the %deque is empty. (Thus begin() would
* equal end().)
*/
diff --git a/libstdc++-v3/include/bits/stl_function.h b/libstdc++-v3/include/bits/stl_function.h
index 74ddcce9d8b..fbd22c3c8b5 100644
--- a/libstdc++-v3/include/bits/stl_function.h
+++ b/libstdc++-v3/include/bits/stl_function.h
@@ -1,6 +1,6 @@
// Functor implementations -*- C++ -*-
-// Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002, 2004, 2005 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
@@ -88,7 +88,7 @@ namespace std
* \endcode
* The addition and negation functions will be inlined directly.
*
- * The standard functiors are derived from structs named @c unary_function
+ * The standard functors are derived from structs named @c unary_function
* and @c binary_function. These two classes contain nothing but typedefs,
* to aid in generic (template) programming. If you write your own
* functors, you might consider doing the same.
@@ -360,7 +360,7 @@ namespace std
/** @defgroup s20_3_6_binder Binder Classes
* Binders turn functions/functors with two arguments into functors with
* a single argument, storing an argument to be applied later. For
- * example, an variable @c B of type @c binder1st is constructed from a
+ * example, a variable @c B of type @c binder1st is constructed from a
* functor @c f and an argument @c x. Later, B's @c operator() is called
* with a single argument @c y. The return value is the value of @c f(x,y).
* @c B can be "called" with various arguments (y1, y2, ...) and will in
diff --git a/libstdc++-v3/include/bits/stl_list.h b/libstdc++-v3/include/bits/stl_list.h
index ce167ef80e4..e17ec2b4606 100644
--- a/libstdc++-v3/include/bits/stl_list.h
+++ b/libstdc++-v3/include/bits/stl_list.h
@@ -290,18 +290,19 @@ namespace _GLIBCXX_STD
//
// We put this to the test in the constructors and in
// get_allocator, where we use conversions between
- // allocator_type and _Node_Alloc_type. The conversion is
+ // allocator_type and _Node_alloc_type. The conversion is
// required by table 32 in [20.1.5].
typedef typename _Alloc::template rebind<_List_node<_Tp> >::other
+ _Node_alloc_type;
- _Node_Alloc_type;
+ typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
struct _List_impl
- : public _Node_Alloc_type
+ : public _Node_alloc_type
{
_List_node_base _M_node;
- _List_impl (const _Node_Alloc_type& __a)
- : _Node_Alloc_type(__a)
+ _List_impl(const _Node_alloc_type& __a)
+ : _Node_alloc_type(__a)
{ }
};
@@ -309,19 +310,22 @@ namespace _GLIBCXX_STD
_List_node<_Tp>*
_M_get_node()
- { return _M_impl._Node_Alloc_type::allocate(1); }
+ { return _M_impl._Node_alloc_type::allocate(1); }
void
_M_put_node(_List_node<_Tp>* __p)
- { _M_impl._Node_Alloc_type::deallocate(__p, 1); }
+ { _M_impl._Node_alloc_type::deallocate(__p, 1); }
public:
typedef _Alloc allocator_type;
+ _Tp_alloc_type
+ _M_get_Tp_allocator() const
+ { return *static_cast<const _Node_alloc_type*>(&this->_M_impl); }
+
allocator_type
get_allocator() const
- { return allocator_type(*static_cast<
- const _Node_Alloc_type*>(&this->_M_impl)); }
+ { return _M_get_Tp_allocator(); }
_List_base(const allocator_type& __a)
: _M_impl(__a)
@@ -391,28 +395,31 @@ namespace _GLIBCXX_STD
class list : protected _List_base<_Tp, _Alloc>
{
// concept requirements
+ typedef typename _Alloc::value_type _Alloc_value_type;
__glibcxx_class_requires(_Tp, _SGIAssignableConcept)
+ __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
- typedef _List_base<_Tp, _Alloc> _Base;
+ typedef _List_base<_Tp, _Alloc> _Base;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
public:
typedef _Tp value_type;
- typedef typename _Alloc::pointer pointer;
- typedef typename _Alloc::const_pointer const_pointer;
- typedef typename _Alloc::reference reference;
- typedef typename _Alloc::const_reference const_reference;
+ typedef typename _Tp_alloc_type::pointer pointer;
+ typedef typename _Tp_alloc_type::const_pointer const_pointer;
+ typedef typename _Tp_alloc_type::reference reference;
+ typedef typename _Tp_alloc_type::const_reference const_reference;
typedef _List_iterator<_Tp> iterator;
typedef _List_const_iterator<_Tp> const_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
- typedef typename _Base::allocator_type allocator_type;
+ typedef _Alloc allocator_type;
protected:
// Note that pointers-to-_Node's can be ctor-converted to
// iterator types.
- typedef _List_node<_Tp> _Node;
+ typedef _List_node<_Tp> _Node;
/** @if maint
* One data member plus two memory-handling functions. If the
@@ -423,6 +430,7 @@ namespace _GLIBCXX_STD
using _Base::_M_impl;
using _Base::_M_put_node;
using _Base::_M_get_node;
+ using _Base::_M_get_Tp_allocator;
/**
* @if maint
@@ -437,7 +445,7 @@ namespace _GLIBCXX_STD
_Node* __p = this->_M_get_node();
try
{
- this->get_allocator().construct(&__p->_M_data, __x);
+ _M_get_Tp_allocator().construct(&__p->_M_data, __x);
}
catch(...)
{
@@ -464,24 +472,13 @@ namespace _GLIBCXX_STD
*
* This constructor fills the %list with @a n copies of @a value.
*/
- list(size_type __n, const value_type& __value,
+ explicit
+ list(size_type __n, const value_type& __value = value_type(),
const allocator_type& __a = allocator_type())
: _Base(__a)
{ this->insert(begin(), __n, __value); }
/**
- * @brief Create a %list with default elements.
- * @param n The number of elements to initially create.
- *
- * This constructor fills the %list with @a n copies of a
- * default-constructed element.
- */
- explicit
- list(size_type __n)
- : _Base(allocator_type())
- { this->insert(begin(), __n, value_type()); }
-
- /**
* @brief %List copy constructor.
* @param x A %list of identical element and allocator types.
*
@@ -671,20 +668,7 @@ namespace _GLIBCXX_STD
* extended and new elements are populated with given data.
*/
void
- resize(size_type __new_size, const value_type& __x);
-
- /**
- * @brief Resizes the %list to the specified number of elements.
- * @param new_size Number of elements the %list should contain.
- *
- * This function will resize the %list to the specified number of
- * elements. If the number is smaller than the %list's current
- * size the %list is truncated, otherwise the %list is extended
- * and new elements are default-constructed.
- */
- void
- resize(size_type __new_size)
- { this->resize(__new_size, value_type()); }
+ resize(size_type __new_size, value_type __x = value_type());
// element access
/**
@@ -1158,7 +1142,7 @@ namespace _GLIBCXX_STD
{
__position._M_node->unhook();
_Node* __n = static_cast<_Node*>(__position._M_node);
- this->get_allocator().destroy(&__n->_M_data);
+ _M_get_Tp_allocator().destroy(&__n->_M_data);
_M_put_node(__n);
}
};
diff --git a/libstdc++-v3/include/bits/stl_map.h b/libstdc++-v3/include/bits/stl_map.h
index a0834a763bc..5f4be568a69 100644
--- a/libstdc++-v3/include/bits/stl_map.h
+++ b/libstdc++-v3/include/bits/stl_map.h
@@ -90,21 +90,26 @@ namespace _GLIBCXX_STD
typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
class map
{
- // concept requirements
- __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
- __glibcxx_class_requires4(_Compare, bool, _Key, _Key,
- _BinaryFunctionConcept)
-
public:
typedef _Key key_type;
typedef _Tp mapped_type;
typedef std::pair<const _Key, _Tp> value_type;
typedef _Compare key_compare;
+ typedef _Alloc allocator_type;
+
+ private:
+ // concept requirements
+ typedef typename _Alloc::value_type _Alloc_value_type;
+ __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
+ __glibcxx_class_requires4(_Compare, bool, _Key, _Key,
+ _BinaryFunctionConcept)
+ __glibcxx_class_requires2(value_type, _Alloc_value_type, _SameTypeConcept)
+ public:
class value_compare
: public std::binary_function<value_type, value_type, bool>
{
- friend class map<_Key,_Tp,_Compare,_Alloc>;
+ friend class map<_Key, _Tp, _Compare, _Alloc>;
protected:
_Compare comp;
@@ -118,19 +123,22 @@ namespace _GLIBCXX_STD
private:
/// @if maint This turns a red-black tree into a [multi]map. @endif
- typedef _Rb_tree<key_type, value_type,
- _Select1st<value_type>, key_compare, _Alloc> _Rep_type;
+ typedef typename _Alloc::template rebind<value_type>::other
+ _Pair_alloc_type;
+
+ typedef _Rb_tree<key_type, value_type, _Select1st<value_type>,
+ key_compare, _Pair_alloc_type> _Rep_type;
+
/// @if maint The actual tree structure. @endif
_Rep_type _M_t;
public:
// many of these are specified differently in ISO, but the following are
// "functionally equivalent"
- typedef typename _Alloc::pointer pointer;
- typedef typename _Alloc::const_pointer const_pointer;
- typedef typename _Alloc::reference reference;
- typedef typename _Alloc::const_reference const_reference;
- typedef typename _Rep_type::allocator_type allocator_type;
+ typedef typename _Pair_alloc_type::pointer pointer;
+ typedef typename _Pair_alloc_type::const_pointer const_pointer;
+ typedef typename _Pair_alloc_type::reference reference;
+ typedef typename _Pair_alloc_type::const_reference const_reference;
typedef typename _Rep_type::iterator iterator;
typedef typename _Rep_type::const_iterator const_iterator;
typedef typename _Rep_type::size_type size_type;
@@ -589,7 +597,7 @@ namespace _GLIBCXX_STD
*
* This function probably only makes sense for multimaps.
*/
- std::pair<iterator,iterator>
+ std::pair<iterator, iterator>
equal_range(const key_type& __x)
{ return _M_t.equal_range(__x); }
@@ -608,19 +616,19 @@ namespace _GLIBCXX_STD
*
* This function probably only makes sense for multimaps.
*/
- std::pair<const_iterator,const_iterator>
+ std::pair<const_iterator, const_iterator>
equal_range(const key_type& __x) const
{ return _M_t.equal_range(__x); }
template <typename _K1, typename _T1, typename _C1, typename _A1>
friend bool
- operator== (const map<_K1,_T1,_C1,_A1>&,
- const map<_K1,_T1,_C1,_A1>&);
+ operator== (const map<_K1, _T1, _C1, _A1>&,
+ const map<_K1, _T1, _C1, _A1>&);
template <typename _K1, typename _T1, typename _C1, typename _A1>
friend bool
- operator< (const map<_K1,_T1,_C1,_A1>&,
- const map<_K1,_T1,_C1,_A1>&);
+ operator< (const map<_K1, _T1, _C1, _A1>&,
+ const map<_K1, _T1, _C1, _A1>&);
};
/**
@@ -635,8 +643,8 @@ namespace _GLIBCXX_STD
*/
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline bool
- operator==(const map<_Key,_Tp,_Compare,_Alloc>& __x,
- const map<_Key,_Tp,_Compare,_Alloc>& __y)
+ operator==(const map<_Key, _Tp, _Compare, _Alloc>& __x,
+ const map<_Key, _Tp, _Compare, _Alloc>& __y)
{ return __x._M_t == __y._M_t; }
/**
@@ -652,42 +660,43 @@ namespace _GLIBCXX_STD
*/
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline bool
- operator<(const map<_Key,_Tp,_Compare,_Alloc>& __x,
- const map<_Key,_Tp,_Compare,_Alloc>& __y)
+ operator<(const map<_Key, _Tp, _Compare, _Alloc>& __x,
+ const map<_Key, _Tp, _Compare, _Alloc>& __y)
{ return __x._M_t < __y._M_t; }
/// Based on operator==
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline bool
- operator!=(const map<_Key,_Tp,_Compare,_Alloc>& __x,
- const map<_Key,_Tp,_Compare,_Alloc>& __y)
+ operator!=(const map<_Key, _Tp, _Compare, _Alloc>& __x,
+ const map<_Key, _Tp, _Compare, _Alloc>& __y)
{ return !(__x == __y); }
/// Based on operator<
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline bool
- operator>(const map<_Key,_Tp,_Compare,_Alloc>& __x,
- const map<_Key,_Tp,_Compare,_Alloc>& __y)
+ operator>(const map<_Key, _Tp, _Compare, _Alloc>& __x,
+ const map<_Key, _Tp, _Compare, _Alloc>& __y)
{ return __y < __x; }
/// Based on operator<
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline bool
- operator<=(const map<_Key,_Tp,_Compare,_Alloc>& __x,
- const map<_Key,_Tp,_Compare,_Alloc>& __y)
+ operator<=(const map<_Key, _Tp, _Compare, _Alloc>& __x,
+ const map<_Key, _Tp, _Compare, _Alloc>& __y)
{ return !(__y < __x); }
/// Based on operator<
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline bool
- operator>=(const map<_Key,_Tp,_Compare,_Alloc>& __x,
- const map<_Key,_Tp,_Compare,_Alloc>& __y)
+ operator>=(const map<_Key, _Tp, _Compare, _Alloc>& __x,
+ const map<_Key, _Tp, _Compare, _Alloc>& __y)
{ return !(__x < __y); }
/// See std::map::swap().
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline void
- swap(map<_Key,_Tp,_Compare,_Alloc>& __x, map<_Key,_Tp,_Compare,_Alloc>& __y)
+ swap(map<_Key, _Tp, _Compare, _Alloc>& __x,
+ map<_Key, _Tp, _Compare, _Alloc>& __y)
{ __x.swap(__y); }
} // namespace std
diff --git a/libstdc++-v3/include/bits/stl_multimap.h b/libstdc++-v3/include/bits/stl_multimap.h
index 524b2366813..dca95563343 100644
--- a/libstdc++-v3/include/bits/stl_multimap.h
+++ b/libstdc++-v3/include/bits/stl_multimap.h
@@ -74,13 +74,13 @@ namespace _GLIBCXX_STD
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline bool
- operator==(const multimap<_Key,_Tp,_Compare,_Alloc>& __x,
- const multimap<_Key,_Tp,_Compare,_Alloc>& __y);
+ operator==(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
+ const multimap<_Key, _Tp, _Compare, _Alloc>& __y);
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline bool
- operator<(const multimap<_Key,_Tp,_Compare,_Alloc>& __x,
- const multimap<_Key,_Tp,_Compare,_Alloc>& __y);
+ operator<(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
+ const multimap<_Key, _Tp, _Compare, _Alloc>& __y);
/**
* @brief A standard container made up of (key,value) pairs, which can be
@@ -106,21 +106,26 @@ namespace _GLIBCXX_STD
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
class multimap
{
- // concept requirements
- __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
- __glibcxx_class_requires4(_Compare, bool, _Key, _Key,
- _BinaryFunctionConcept)
-
public:
typedef _Key key_type;
typedef _Tp mapped_type;
typedef std::pair<const _Key, _Tp> value_type;
typedef _Compare key_compare;
+ typedef _Alloc allocator_type;
+ private:
+ // concept requirements
+ typedef typename _Alloc::value_type _Alloc_value_type;
+ __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
+ __glibcxx_class_requires4(_Compare, bool, _Key, _Key,
+ _BinaryFunctionConcept)
+ __glibcxx_class_requires2(value_type, _Alloc_value_type, _SameTypeConcept)
+
+ public:
class value_compare
: public std::binary_function<value_type, value_type, bool>
{
- friend class multimap<_Key,_Tp,_Compare,_Alloc>;
+ friend class multimap<_Key, _Tp, _Compare, _Alloc>;
protected:
_Compare comp;
@@ -134,19 +139,21 @@ namespace _GLIBCXX_STD
private:
/// @if maint This turns a red-black tree into a [multi]map. @endif
- typedef _Rb_tree<key_type, value_type,
- _Select1st<value_type>, key_compare, _Alloc> _Rep_type;
+ typedef typename _Alloc::template rebind<value_type>::other
+ _Pair_alloc_type;
+
+ typedef _Rb_tree<key_type, value_type, _Select1st<value_type>,
+ key_compare, _Pair_alloc_type> _Rep_type;
/// @if maint The actual tree structure. @endif
_Rep_type _M_t;
public:
// many of these are specified differently in ISO, but the following are
// "functionally equivalent"
- typedef typename _Alloc::pointer pointer;
- typedef typename _Alloc::const_pointer const_pointer;
- typedef typename _Alloc::reference reference;
- typedef typename _Alloc::const_reference const_reference;
- typedef typename _Rep_type::allocator_type allocator_type;
+ typedef typename _Pair_alloc_type::pointer pointer;
+ typedef typename _Pair_alloc_type::const_pointer const_pointer;
+ typedef typename _Pair_alloc_type::reference reference;
+ typedef typename _Pair_alloc_type::const_reference const_reference;
typedef typename _Rep_type::iterator iterator;
typedef typename _Rep_type::const_iterator const_iterator;
typedef typename _Rep_type::size_type size_type;
@@ -573,7 +580,7 @@ namespace _GLIBCXX_STD
* @endcode
* (but is faster than making the calls separately).
*/
- std::pair<iterator,iterator>
+ std::pair<iterator, iterator>
equal_range(const key_type& __x)
{ return _M_t.equal_range(__x); }
@@ -590,19 +597,19 @@ namespace _GLIBCXX_STD
* @endcode
* (but is faster than making the calls separately).
*/
- std::pair<const_iterator,const_iterator>
+ std::pair<const_iterator, const_iterator>
equal_range(const key_type& __x) const
{ return _M_t.equal_range(__x); }
template <typename _K1, typename _T1, typename _C1, typename _A1>
friend bool
- operator== (const multimap<_K1,_T1,_C1,_A1>&,
- const multimap<_K1,_T1,_C1,_A1>&);
+ operator== (const multimap<_K1, _T1, _C1, _A1>&,
+ const multimap<_K1, _T1, _C1, _A1>&);
template <typename _K1, typename _T1, typename _C1, typename _A1>
friend bool
- operator< (const multimap<_K1,_T1,_C1,_A1>&,
- const multimap<_K1,_T1,_C1,_A1>&);
+ operator< (const multimap<_K1, _T1, _C1, _A1>&,
+ const multimap<_K1, _T1, _C1, _A1>&);
};
/**
@@ -617,8 +624,8 @@ namespace _GLIBCXX_STD
*/
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline bool
- operator==(const multimap<_Key,_Tp,_Compare,_Alloc>& __x,
- const multimap<_Key,_Tp,_Compare,_Alloc>& __y)
+ operator==(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
+ const multimap<_Key, _Tp, _Compare, _Alloc>& __y)
{ return __x._M_t == __y._M_t; }
/**
@@ -634,43 +641,43 @@ namespace _GLIBCXX_STD
*/
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline bool
- operator<(const multimap<_Key,_Tp,_Compare,_Alloc>& __x,
- const multimap<_Key,_Tp,_Compare,_Alloc>& __y)
+ operator<(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
+ const multimap<_Key, _Tp, _Compare, _Alloc>& __y)
{ return __x._M_t < __y._M_t; }
/// Based on operator==
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline bool
- operator!=(const multimap<_Key,_Tp,_Compare,_Alloc>& __x,
- const multimap<_Key,_Tp,_Compare,_Alloc>& __y)
+ operator!=(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
+ const multimap<_Key, _Tp, _Compare, _Alloc>& __y)
{ return !(__x == __y); }
/// Based on operator<
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline bool
- operator>(const multimap<_Key,_Tp,_Compare,_Alloc>& __x,
- const multimap<_Key,_Tp,_Compare,_Alloc>& __y)
+ operator>(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
+ const multimap<_Key, _Tp, _Compare, _Alloc>& __y)
{ return __y < __x; }
/// Based on operator<
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline bool
- operator<=(const multimap<_Key,_Tp,_Compare,_Alloc>& __x,
- const multimap<_Key,_Tp,_Compare,_Alloc>& __y)
+ operator<=(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
+ const multimap<_Key, _Tp, _Compare, _Alloc>& __y)
{ return !(__y < __x); }
/// Based on operator<
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline bool
- operator>=(const multimap<_Key,_Tp,_Compare,_Alloc>& __x,
- const multimap<_Key,_Tp,_Compare,_Alloc>& __y)
+ operator>=(const multimap<_Key, _Tp, _Compare, _Alloc>& __x,
+ const multimap<_Key, _Tp, _Compare, _Alloc>& __y)
{ return !(__x < __y); }
/// See std::multimap::swap().
template <typename _Key, typename _Tp, typename _Compare, typename _Alloc>
inline void
- swap(multimap<_Key,_Tp,_Compare,_Alloc>& __x,
- multimap<_Key,_Tp,_Compare,_Alloc>& __y)
+ swap(multimap<_Key, _Tp, _Compare, _Alloc>& __x,
+ multimap<_Key, _Tp, _Compare, _Alloc>& __y)
{ __x.swap(__y); }
} // namespace std
diff --git a/libstdc++-v3/include/bits/stl_multiset.h b/libstdc++-v3/include/bits/stl_multiset.h
index 3f42ef4c38d..f401db76fd5 100644
--- a/libstdc++-v3/include/bits/stl_multiset.h
+++ b/libstdc++-v3/include/bits/stl_multiset.h
@@ -73,13 +73,13 @@ namespace _GLIBCXX_STD
template <class _Key, class _Compare, class _Alloc>
inline bool
- operator==(const multiset<_Key,_Compare,_Alloc>& __x,
- const multiset<_Key,_Compare,_Alloc>& __y);
+ operator==(const multiset<_Key, _Compare, _Alloc>& __x,
+ const multiset<_Key, _Compare, _Alloc>& __y);
template <class _Key, class _Compare, class _Alloc>
inline bool
- operator<(const multiset<_Key,_Compare,_Alloc>& __x,
- const multiset<_Key,_Compare,_Alloc>& __y);
+ operator<(const multiset<_Key, _Compare, _Alloc>& __x,
+ const multiset<_Key, _Compare, _Alloc>& __y);
/**
* @brief A standard container made up of elements, which can be retrieved
@@ -105,9 +105,11 @@ namespace _GLIBCXX_STD
class multiset
{
// concept requirements
+ typedef typename _Alloc::value_type _Alloc_value_type;
__glibcxx_class_requires(_Key, _SGIAssignableConcept)
__glibcxx_class_requires4(_Compare, bool, _Key, _Key,
_BinaryFunctionConcept)
+ __glibcxx_class_requires2(_Key, _Alloc_value_type, _SameTypeConcept)
public:
// typedefs:
@@ -115,35 +117,37 @@ namespace _GLIBCXX_STD
typedef _Key value_type;
typedef _Compare key_compare;
typedef _Compare value_compare;
+ typedef _Alloc allocator_type;
private:
/// @if maint This turns a red-black tree into a [multi]set. @endif
- typedef _Rb_tree<key_type, value_type,
- _Identity<value_type>, key_compare, _Alloc> _Rep_type;
+ typedef typename _Alloc::template rebind<_Key>::other _Key_alloc_type;
+
+ typedef _Rb_tree<key_type, value_type, _Identity<value_type>,
+ key_compare, _Key_alloc_type> _Rep_type;
/// @if maint The actual tree structure. @endif
_Rep_type _M_t;
public:
- typedef typename _Alloc::pointer pointer;
- typedef typename _Alloc::const_pointer const_pointer;
- typedef typename _Alloc::reference reference;
- typedef typename _Alloc::const_reference const_reference;
+ typedef typename _Key_alloc_type::pointer pointer;
+ typedef typename _Key_alloc_type::const_pointer const_pointer;
+ typedef typename _Key_alloc_type::reference reference;
+ typedef typename _Key_alloc_type::const_reference const_reference;
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// DR 103. set::iterator is required to be modifiable,
// but this allows modification of keys.
- typedef typename _Rep_type::const_iterator iterator;
- typedef typename _Rep_type::const_iterator const_iterator;
- typedef typename _Rep_type::const_reverse_iterator reverse_iterator;
- typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
- typedef typename _Rep_type::size_type size_type;
- typedef typename _Rep_type::difference_type difference_type;
- typedef typename _Rep_type::allocator_type allocator_type;
-
- // allocation/deallocation
-
- /**
- * @brief Default constructor creates no elements.
- */
+ typedef typename _Rep_type::const_iterator iterator;
+ typedef typename _Rep_type::const_iterator const_iterator;
+ typedef typename _Rep_type::const_reverse_iterator reverse_iterator;
+ typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
+ typedef typename _Rep_type::size_type size_type;
+ typedef typename _Rep_type::difference_type difference_type;
+
+ // allocation/deallocation
+
+ /**
+ * @brief Default constructor creates no elements.
+ */
multiset()
: _M_t(_Compare(), allocator_type()) { }
@@ -286,7 +290,7 @@ namespace _GLIBCXX_STD
* std::swap(s1,s2) will feed to this function.
*/
void
- swap(multiset<_Key,_Compare,_Alloc>& __x)
+ swap(multiset<_Key, _Compare, _Alloc>& __x)
{ _M_t.swap(__x._M_t); }
// insert/erase
@@ -492,23 +496,23 @@ namespace _GLIBCXX_STD
*
* This function probably only makes sense for multisets.
*/
- std::pair<iterator,iterator>
+ std::pair<iterator, iterator>
equal_range(const key_type& __x)
{ return _M_t.equal_range(__x); }
- std::pair<const_iterator,const_iterator>
+ std::pair<const_iterator, const_iterator>
equal_range(const key_type& __x) const
{ return _M_t.equal_range(__x); }
template <class _K1, class _C1, class _A1>
friend bool
- operator== (const multiset<_K1,_C1,_A1>&,
- const multiset<_K1,_C1,_A1>&);
+ operator== (const multiset<_K1, _C1, _A1>&,
+ const multiset<_K1, _C1, _A1>&);
template <class _K1, class _C1, class _A1>
friend bool
- operator< (const multiset<_K1,_C1,_A1>&,
- const multiset<_K1,_C1,_A1>&);
+ operator< (const multiset<_K1, _C1, _A1>&,
+ const multiset<_K1, _C1, _A1>&);
};
/**
@@ -524,8 +528,8 @@ namespace _GLIBCXX_STD
*/
template <class _Key, class _Compare, class _Alloc>
inline bool
- operator==(const multiset<_Key,_Compare,_Alloc>& __x,
- const multiset<_Key,_Compare,_Alloc>& __y)
+ operator==(const multiset<_Key, _Compare, _Alloc>& __x,
+ const multiset<_Key, _Compare, _Alloc>& __y)
{ return __x._M_t == __y._M_t; }
/**
@@ -541,15 +545,15 @@ namespace _GLIBCXX_STD
*/
template <class _Key, class _Compare, class _Alloc>
inline bool
- operator<(const multiset<_Key,_Compare,_Alloc>& __x,
- const multiset<_Key,_Compare,_Alloc>& __y)
+ operator<(const multiset<_Key, _Compare, _Alloc>& __x,
+ const multiset<_Key, _Compare, _Alloc>& __y)
{ return __x._M_t < __y._M_t; }
/// Returns !(x == y).
template <class _Key, class _Compare, class _Alloc>
inline bool
- operator!=(const multiset<_Key,_Compare,_Alloc>& __x,
- const multiset<_Key,_Compare,_Alloc>& __y)
+ operator!=(const multiset<_Key, _Compare, _Alloc>& __x,
+ const multiset<_Key, _Compare, _Alloc>& __y)
{ return !(__x == __y); }
/// Returns y < x.
@@ -562,22 +566,22 @@ namespace _GLIBCXX_STD
/// Returns !(y < x)
template <class _Key, class _Compare, class _Alloc>
inline bool
- operator<=(const multiset<_Key,_Compare,_Alloc>& __x,
- const multiset<_Key,_Compare,_Alloc>& __y)
+ operator<=(const multiset<_Key, _Compare, _Alloc>& __x,
+ const multiset<_Key, _Compare, _Alloc>& __y)
{ return !(__y < __x); }
/// Returns !(x < y)
template <class _Key, class _Compare, class _Alloc>
inline bool
- operator>=(const multiset<_Key,_Compare,_Alloc>& __x,
- const multiset<_Key,_Compare,_Alloc>& __y)
+ operator>=(const multiset<_Key, _Compare, _Alloc>& __x,
+ const multiset<_Key, _Compare, _Alloc>& __y)
{ return !(__x < __y); }
/// See std::multiset::swap().
template <class _Key, class _Compare, class _Alloc>
inline void
- swap(multiset<_Key,_Compare,_Alloc>& __x,
- multiset<_Key,_Compare,_Alloc>& __y)
+ swap(multiset<_Key, _Compare, _Alloc>& __x,
+ multiset<_Key, _Compare, _Alloc>& __y)
{ __x.swap(__y); }
} // namespace std
diff --git a/libstdc++-v3/include/bits/stl_set.h b/libstdc++-v3/include/bits/stl_set.h
index 1a15d1172c8..c76e55475c6 100644
--- a/libstdc++-v3/include/bits/stl_set.h
+++ b/libstdc++-v3/include/bits/stl_set.h
@@ -72,13 +72,13 @@ namespace _GLIBCXX_STD
template<class _Key, class _Compare, class _Alloc>
inline bool
- operator==(const set<_Key,_Compare,_Alloc>& __x,
- const set<_Key,_Compare,_Alloc>& __y);
+ operator==(const set<_Key, _Compare, _Alloc>& __x,
+ const set<_Key, _Compare, _Alloc>& __y);
template<class _Key, class _Compare, class _Alloc>
inline bool
- operator<(const set<_Key,_Compare,_Alloc>& __x,
- const set<_Key,_Compare,_Alloc>& __y);
+ operator<(const set<_Key, _Compare, _Alloc>& __x,
+ const set<_Key, _Compare, _Alloc>& __y);
/**
* @brief A standard container made up of unique keys, which can be
@@ -107,9 +107,11 @@ namespace _GLIBCXX_STD
class set
{
// concept requirements
+ typedef typename _Alloc::value_type _Alloc_value_type;
__glibcxx_class_requires(_Key, _SGIAssignableConcept)
__glibcxx_class_requires4(_Compare, bool, _Key, _Key,
_BinaryFunctionConcept)
+ __glibcxx_class_requires2(_Key, _Alloc_value_type, _SameTypeConcept)
public:
// typedefs:
@@ -119,29 +121,32 @@ namespace _GLIBCXX_STD
typedef _Key value_type;
typedef _Compare key_compare;
typedef _Compare value_compare;
+ typedef _Alloc allocator_type;
//@}
private:
- typedef _Rb_tree<key_type, value_type,
- _Identity<value_type>, key_compare, _Alloc> _Rep_type;
+ typedef typename _Alloc::template rebind<_Key>::other _Key_alloc_type;
+
+ typedef _Rb_tree<key_type, value_type, _Identity<value_type>,
+ key_compare, _Key_alloc_type> _Rep_type;
_Rep_type _M_t; // red-black tree representing set
+
public:
//@{
/// Iterator-related typedefs.
- typedef typename _Alloc::pointer pointer;
- typedef typename _Alloc::const_pointer const_pointer;
- typedef typename _Alloc::reference reference;
- typedef typename _Alloc::const_reference const_reference;
+ typedef typename _Key_alloc_type::pointer pointer;
+ typedef typename _Key_alloc_type::const_pointer const_pointer;
+ typedef typename _Key_alloc_type::reference reference;
+ typedef typename _Key_alloc_type::const_reference const_reference;
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// DR 103. set::iterator is required to be modifiable,
// but this allows modification of keys.
- typedef typename _Rep_type::const_iterator iterator;
- typedef typename _Rep_type::const_iterator const_iterator;
- typedef typename _Rep_type::const_reverse_iterator reverse_iterator;
- typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
- typedef typename _Rep_type::size_type size_type;
- typedef typename _Rep_type::difference_type difference_type;
- typedef typename _Rep_type::allocator_type allocator_type;
+ typedef typename _Rep_type::const_iterator iterator;
+ typedef typename _Rep_type::const_iterator const_iterator;
+ typedef typename _Rep_type::const_reverse_iterator reverse_iterator;
+ typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
+ typedef typename _Rep_type::size_type size_type;
+ typedef typename _Rep_type::difference_type difference_type;
//@}
// allocation/deallocation
@@ -155,8 +160,9 @@ namespace _GLIBCXX_STD
* @param comp Comparator to use.
* @param a Allocator to use.
*/
- explicit set(const _Compare& __comp,
- const allocator_type& __a = allocator_type())
+ explicit
+ set(const _Compare& __comp,
+ const allocator_type& __a = allocator_type())
: _M_t(__comp, __a) {}
/**
@@ -503,22 +509,22 @@ namespace _GLIBCXX_STD
*
* This function probably only makes sense for multisets.
*/
- std::pair<iterator,iterator>
+ std::pair<iterator, iterator>
equal_range(const key_type& __x)
{ return _M_t.equal_range(__x); }
- std::pair<const_iterator,const_iterator>
+ std::pair<const_iterator, const_iterator>
equal_range(const key_type& __x) const
{ return _M_t.equal_range(__x); }
//@}
template<class _K1, class _C1, class _A1>
friend bool
- operator== (const set<_K1,_C1,_A1>&, const set<_K1,_C1,_A1>&);
+ operator== (const set<_K1, _C1, _A1>&, const set<_K1, _C1, _A1>&);
template<class _K1, class _C1, class _A1>
friend bool
- operator< (const set<_K1,_C1,_A1>&, const set<_K1,_C1,_A1>&);
+ operator< (const set<_K1, _C1, _A1>&, const set<_K1, _C1, _A1>&);
};
@@ -534,8 +540,8 @@ namespace _GLIBCXX_STD
*/
template<class _Key, class _Compare, class _Alloc>
inline bool
- operator==(const set<_Key,_Compare,_Alloc>& __x,
- const set<_Key,_Compare,_Alloc>& __y)
+ operator==(const set<_Key, _Compare, _Alloc>& __x,
+ const set<_Key, _Compare, _Alloc>& __y)
{ return __x._M_t == __y._M_t; }
/**
@@ -551,42 +557,42 @@ namespace _GLIBCXX_STD
*/
template<class _Key, class _Compare, class _Alloc>
inline bool
- operator<(const set<_Key,_Compare,_Alloc>& __x,
- const set<_Key,_Compare,_Alloc>& __y)
+ operator<(const set<_Key, _Compare, _Alloc>& __x,
+ const set<_Key, _Compare, _Alloc>& __y)
{ return __x._M_t < __y._M_t; }
/// Returns !(x == y).
template<class _Key, class _Compare, class _Alloc>
inline bool
- operator!=(const set<_Key,_Compare,_Alloc>& __x,
- const set<_Key,_Compare,_Alloc>& __y)
+ operator!=(const set<_Key, _Compare, _Alloc>& __x,
+ const set<_Key, _Compare, _Alloc>& __y)
{ return !(__x == __y); }
/// Returns y < x.
template<class _Key, class _Compare, class _Alloc>
inline bool
- operator>(const set<_Key,_Compare,_Alloc>& __x,
- const set<_Key,_Compare,_Alloc>& __y)
+ operator>(const set<_Key, _Compare, _Alloc>& __x,
+ const set<_Key, _Compare, _Alloc>& __y)
{ return __y < __x; }
/// Returns !(y < x)
template<class _Key, class _Compare, class _Alloc>
inline bool
- operator<=(const set<_Key,_Compare,_Alloc>& __x,
- const set<_Key,_Compare,_Alloc>& __y)
+ operator<=(const set<_Key, _Compare, _Alloc>& __x,
+ const set<_Key, _Compare, _Alloc>& __y)
{ return !(__y < __x); }
/// Returns !(x < y)
template<class _Key, class _Compare, class _Alloc>
inline bool
- operator>=(const set<_Key,_Compare,_Alloc>& __x,
- const set<_Key,_Compare,_Alloc>& __y)
+ operator>=(const set<_Key, _Compare, _Alloc>& __x,
+ const set<_Key, _Compare, _Alloc>& __y)
{ return !(__x < __y); }
/// See std::set::swap().
template<class _Key, class _Compare, class _Alloc>
inline void
- swap(set<_Key,_Compare,_Alloc>& __x, set<_Key,_Compare,_Alloc>& __y)
+ swap(set<_Key, _Compare, _Alloc>& __x, set<_Key, _Compare, _Alloc>& __y)
{ __x.swap(__y); }
} // namespace std
diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h
index d532c2dc910..06b94017c01 100644
--- a/libstdc++-v3/include/bits/stl_vector.h
+++ b/libstdc++-v3/include/bits/stl_vector.h
@@ -75,23 +75,29 @@ namespace _GLIBCXX_STD
template<typename _Tp, typename _Alloc>
struct _Vector_base
{
+ typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
+
struct _Vector_impl
- : public _Alloc
+ : public _Tp_alloc_type
{
_Tp* _M_start;
_Tp* _M_finish;
_Tp* _M_end_of_storage;
- _Vector_impl(_Alloc const& __a)
- : _Alloc(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0)
+ _Vector_impl(_Tp_alloc_type const& __a)
+ : _Tp_alloc_type(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0)
{ }
};
public:
typedef _Alloc allocator_type;
+ _Tp_alloc_type
+ _M_get_Tp_allocator() const
+ { return *static_cast<const _Tp_alloc_type*>(&this->_M_impl); }
+
allocator_type
get_allocator() const
- { return *static_cast<const _Alloc*>(&this->_M_impl); }
+ { return _M_get_Tp_allocator(); }
_Vector_base(const allocator_type& __a)
: _M_impl(__a)
@@ -148,17 +154,20 @@ namespace _GLIBCXX_STD
class vector : protected _Vector_base<_Tp, _Alloc>
{
// Concept requirements.
+ typedef typename _Alloc::value_type _Alloc_value_type;
__glibcxx_class_requires(_Tp, _SGIAssignableConcept)
-
- typedef _Vector_base<_Tp, _Alloc> _Base;
- typedef vector<_Tp, _Alloc> vector_type;
+ __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
+
+ typedef _Vector_base<_Tp, _Alloc> _Base;
+ typedef vector<_Tp, _Alloc> vector_type;
+ typedef typename _Base::_Tp_alloc_type _Tp_alloc_type;
public:
typedef _Tp value_type;
- typedef typename _Alloc::pointer pointer;
- typedef typename _Alloc::const_pointer const_pointer;
- typedef typename _Alloc::reference reference;
- typedef typename _Alloc::const_reference const_reference;
+ typedef typename _Tp_alloc_type::pointer pointer;
+ typedef typename _Tp_alloc_type::const_pointer const_pointer;
+ typedef typename _Tp_alloc_type::reference reference;
+ typedef typename _Tp_alloc_type::const_reference const_reference;
typedef __gnu_cxx::__normal_iterator<pointer, vector_type> iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, vector_type>
const_iterator;
@@ -166,7 +175,7 @@ namespace _GLIBCXX_STD
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
- typedef typename _Base::allocator_type allocator_type;
+ typedef _Alloc allocator_type;
protected:
/** @if maint
@@ -177,6 +186,7 @@ namespace _GLIBCXX_STD
using _Base::_M_allocate;
using _Base::_M_deallocate;
using _Base::_M_impl;
+ using _Base::_M_get_Tp_allocator;
public:
// [23.2.4.1] construct/copy/destroy
@@ -196,32 +206,17 @@ namespace _GLIBCXX_STD
*
* This constructor fills the %vector with @a n copies of @a value.
*/
- vector(size_type __n, const value_type& __value,
+ explicit
+ vector(size_type __n, const value_type& __value = value_type(),
const allocator_type& __a = allocator_type())
: _Base(__n, __a)
{
std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish = this->_M_impl._M_start + __n;
}
/**
- * @brief Create a %vector with default elements.
- * @param n The number of elements to initially create.
- *
- * This constructor fills the %vector with @a n copies of a
- * default-constructed element.
- */
- explicit
- vector(size_type __n)
- : _Base(__n, allocator_type())
- {
- std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, value_type(),
- this->get_allocator());
- this->_M_impl._M_finish = this->_M_impl._M_start + __n;
- }
-
- /**
* @brief %Vector copy constructor.
* @param x A %vector of identical element and allocator types.
*
@@ -235,7 +230,7 @@ namespace _GLIBCXX_STD
{ this->_M_impl._M_finish =
std::__uninitialized_copy_a(__x.begin(), __x.end(),
this->_M_impl._M_start,
- this->get_allocator());
+ _M_get_Tp_allocator());
}
/**
@@ -271,7 +266,7 @@ namespace _GLIBCXX_STD
*/
~vector()
{ std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
}
/**
@@ -419,7 +414,7 @@ namespace _GLIBCXX_STD
* given data.
*/
void
- resize(size_type __new_size, const value_type& __x)
+ resize(size_type __new_size, value_type __x = value_type())
{
if (__new_size < size())
erase(begin() + __new_size, end());
@@ -428,20 +423,6 @@ namespace _GLIBCXX_STD
}
/**
- * @brief Resizes the %vector to the specified number of elements.
- * @param new_size Number of elements the %vector should contain.
- *
- * This function will resize the %vector to the specified
- * number of elements. If the number is smaller than the
- * %vector's current size the %vector is truncated, otherwise
- * the %vector is extended and new elements are
- * default-constructed.
- */
- void
- resize(size_type __new_size)
- { resize(__new_size, value_type()); }
-
- /**
* Returns the total number of elements that the %vector can
* hold before needing to allocate more memory.
*/
@@ -764,7 +745,7 @@ namespace _GLIBCXX_STD
try
{
std::__uninitialized_copy_a(__first, __last, __result,
- this->get_allocator());
+ _M_get_Tp_allocator());
return __result;
}
catch(...)
@@ -785,7 +766,7 @@ namespace _GLIBCXX_STD
this->_M_impl._M_start = _M_allocate(__n);
this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish = this->_M_impl._M_end_of_storage;
}
@@ -822,7 +803,7 @@ namespace _GLIBCXX_STD
this->_M_impl._M_finish =
std::__uninitialized_copy_a(__first, __last,
this->_M_impl._M_start,
- this->get_allocator());
+ _M_get_Tp_allocator());
}
diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc
index f9f5e5ac8a7..aa1634bbc5e 100644
--- a/libstdc++-v3/include/bits/vector.tcc
+++ b/libstdc++-v3/include/bits/vector.tcc
@@ -77,7 +77,7 @@ namespace _GLIBCXX_STD
this->_M_impl._M_start,
this->_M_impl._M_finish);
std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
_M_deallocate(this->_M_impl._M_start,
this->_M_impl._M_end_of_storage
- this->_M_impl._M_start);
@@ -122,7 +122,7 @@ namespace _GLIBCXX_STD
erase(iterator __first, iterator __last)
{
iterator __i(std::copy(__last, end(), __first));
- std::_Destroy(__i, end(), this->get_allocator());
+ std::_Destroy(__i, end(), _M_get_Tp_allocator());
this->_M_impl._M_finish = this->_M_impl._M_finish - (__last - __first);
return __first;
}
@@ -140,7 +140,7 @@ namespace _GLIBCXX_STD
pointer __tmp = _M_allocate_and_copy(__xlen, __x.begin(),
__x.end());
std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
_M_deallocate(this->_M_impl._M_start,
this->_M_impl._M_end_of_storage
- this->_M_impl._M_start);
@@ -150,7 +150,7 @@ namespace _GLIBCXX_STD
else if (size() >= __xlen)
{
iterator __i(std::copy(__x.begin(), __x.end(), begin()));
- std::_Destroy(__i, end(), this->get_allocator());
+ std::_Destroy(__i, end(), _M_get_Tp_allocator());
}
else
{
@@ -158,7 +158,7 @@ namespace _GLIBCXX_STD
this->_M_impl._M_start);
std::__uninitialized_copy_a(__x.begin() + size(),
__x.end(), this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
}
this->_M_impl._M_finish = this->_M_impl._M_start + __xlen;
}
@@ -172,7 +172,7 @@ namespace _GLIBCXX_STD
{
if (__n > capacity())
{
- vector __tmp(__n, __val, get_allocator());
+ vector __tmp(__n, __val, _M_get_Tp_allocator());
__tmp.swap(*this);
}
else if (__n > size())
@@ -180,7 +180,7 @@ namespace _GLIBCXX_STD
std::fill(begin(), end(), __val);
std::__uninitialized_fill_n_a(this->_M_impl._M_finish,
__n - size(), __val,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish += __n - size();
}
else
@@ -216,7 +216,7 @@ namespace _GLIBCXX_STD
{
pointer __tmp(_M_allocate_and_copy(__len, __first, __last));
std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
_M_deallocate(this->_M_impl._M_start,
this->_M_impl._M_end_of_storage
- this->_M_impl._M_start);
@@ -228,7 +228,7 @@ namespace _GLIBCXX_STD
{
iterator __new_finish(std::copy(__first, __last,
this->_M_impl._M_start));
- std::_Destroy(__new_finish, end(), this->get_allocator());
+ std::_Destroy(__new_finish, end(), _M_get_Tp_allocator());
this->_M_impl._M_finish = __new_finish.base();
}
else
@@ -239,7 +239,7 @@ namespace _GLIBCXX_STD
this->_M_impl._M_finish =
std::__uninitialized_copy_a(__mid, __last,
this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
}
}
@@ -280,22 +280,22 @@ namespace _GLIBCXX_STD
std::__uninitialized_copy_a(iterator(this->_M_impl._M_start),
__position,
__new_start,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl.construct(__new_finish.base(), __x);
++__new_finish;
__new_finish =
std::__uninitialized_copy_a(__position,
iterator(this->_M_impl._M_finish),
__new_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
}
catch(...)
{
- std::_Destroy(__new_start, __new_finish, this->get_allocator());
+ std::_Destroy(__new_start, __new_finish, _M_get_Tp_allocator());
_M_deallocate(__new_start.base(),__len);
__throw_exception_again;
}
- std::_Destroy(begin(), end(), this->get_allocator());
+ std::_Destroy(begin(), end(), _M_get_Tp_allocator());
_M_deallocate(this->_M_impl._M_start,
this->_M_impl._M_end_of_storage
- this->_M_impl._M_start);
@@ -323,7 +323,7 @@ namespace _GLIBCXX_STD
std::__uninitialized_copy_a(this->_M_impl._M_finish - __n,
this->_M_impl._M_finish,
this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish += __n;
std::copy_backward(__position, __old_finish - __n,
__old_finish);
@@ -334,11 +334,11 @@ namespace _GLIBCXX_STD
std::__uninitialized_fill_n_a(this->_M_impl._M_finish,
__n - __elems_after,
__x_copy,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish += __n - __elems_after;
std::__uninitialized_copy_a(__position, __old_finish,
this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish += __elems_after;
std::fill(__position, __old_finish, __x_copy);
}
@@ -361,23 +361,23 @@ namespace _GLIBCXX_STD
__new_finish =
std::__uninitialized_copy_a(begin(), __position,
__new_start,
- this->get_allocator());
+ _M_get_Tp_allocator());
std::__uninitialized_fill_n_a(__new_finish, __n, __x,
- this->get_allocator());
+ _M_get_Tp_allocator());
__new_finish += __n;
__new_finish =
std::__uninitialized_copy_a(__position, end(), __new_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
}
catch(...)
{
std::_Destroy(__new_start, __new_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
_M_deallocate(__new_start.base(), __len);
__throw_exception_again;
}
std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
_M_deallocate(this->_M_impl._M_start,
this->_M_impl._M_end_of_storage
- this->_M_impl._M_start);
@@ -421,7 +421,7 @@ namespace _GLIBCXX_STD
std::__uninitialized_copy_a(this->_M_impl._M_finish - __n,
this->_M_impl._M_finish,
this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish += __n;
std::copy_backward(__position, __old_finish - __n,
__old_finish);
@@ -433,11 +433,11 @@ namespace _GLIBCXX_STD
std::advance(__mid, __elems_after);
std::__uninitialized_copy_a(__mid, __last,
this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish += __n - __elems_after;
std::__uninitialized_copy_a(__position, __old_finish,
this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
this->_M_impl._M_finish += __elems_after;
std::copy(__first, __mid, __position);
}
@@ -461,25 +461,25 @@ namespace _GLIBCXX_STD
std::__uninitialized_copy_a(iterator(this->_M_impl._M_start),
__position,
__new_start,
- this->get_allocator());
+ _M_get_Tp_allocator());
__new_finish =
std::__uninitialized_copy_a(__first, __last, __new_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
__new_finish =
std::__uninitialized_copy_a(__position,
iterator(this->_M_impl._M_finish),
__new_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
}
catch(...)
{
std::_Destroy(__new_start,__new_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
_M_deallocate(__new_start.base(), __len);
__throw_exception_again;
}
std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
- this->get_allocator());
+ _M_get_Tp_allocator());
_M_deallocate(this->_M_impl._M_start,
this->_M_impl._M_end_of_storage
- this->_M_impl._M_start);
diff --git a/libstdc++-v3/include/c_std/std_cstdlib.h b/libstdc++-v3/include/c_std/std_cstdlib.h
index 3fde655621a..cf91f27b2d3 100644
--- a/libstdc++-v3/include/c_std/std_cstdlib.h
+++ b/libstdc++-v3/include/c_std/std_cstdlib.h
@@ -1,6 +1,6 @@
// -*- C++ -*- forwarding header.
-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -168,17 +168,14 @@ namespace __gnu_cxx
inline long long
abs(long long __x) { return __x >= 0 ? __x : -__x; }
- inline long long
- llabs(long long __x) { return __x >= 0 ? __x : -__x; }
-
#if !_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC
+ using ::llabs;
+
inline lldiv_t
div(long long __n, long long __d)
{ lldiv_t __q; __q.quot = __n / __d; __q.rem = __n % __d; return __q; }
- inline lldiv_t
- lldiv(long long __n, long long __d)
- { lldiv_t __q; __q.quot = __n / __d; __q.rem = __n % __d; return __q; }
+ using ::lldiv;
#endif
#if _GLIBCXX_USE_C99_LONG_LONG_CHECK || _GLIBCXX_USE_C99_LONG_LONG_DYNAMIC
@@ -204,8 +201,8 @@ namespace std
#endif
using __gnu_cxx::_Exit;
using __gnu_cxx::abs;
- using __gnu_cxx::llabs;
#if !_GLIBCXX_USE_C99_LONG_LONG_DYNAMIC
+ using __gnu_cxx::llabs;
using __gnu_cxx::div;
using __gnu_cxx::lldiv;
#endif
diff --git a/libstdc++-v3/include/debug/debug.h b/libstdc++-v3/include/debug/debug.h
index f371a6a47ca..7cd08cdeca0 100644
--- a/libstdc++-v3/include/debug/debug.h
+++ b/libstdc++-v3/include/debug/debug.h
@@ -31,191 +31,6 @@
#ifndef _GLIBCXX_DEBUG_DEBUG_H
#define _GLIBCXX_DEBUG_DEBUG_H 1
-/**
- * Macros used by the implementation to verify certain
- * properties. These macros may only be used directly by the debug
- * wrappers. Note that these are macros (instead of the more obviously
- * "correct" choice of making them functions) because we need line and
- * file information at the call site, to minimize the distance between
- * the user error and where the error is reported.
- *
- */
-#define _GLIBCXX_DEBUG_VERIFY(_Condition,_ErrorMessage) \
- do { \
- if (! (_Condition)) \
- ::__gnu_debug::_Error_formatter::_M_at(__FILE__, __LINE__) \
- ._ErrorMessage._M_error(); \
- } while (false)
-
-// Verify that [_First, _Last) forms a valid iterator range.
-#define __glibcxx_check_valid_range(_First,_Last) \
-_GLIBCXX_DEBUG_VERIFY(::__gnu_debug::__valid_range(_First, _Last), \
- _M_message(::__gnu_debug::__msg_valid_range) \
- ._M_iterator(_First, #_First) \
- ._M_iterator(_Last, #_Last))
-
-/** Verify that we can insert into *this with the iterator _Position.
- * Insertion into a container at a specific position requires that
- * the iterator be nonsingular (i.e., either dereferenceable or
- * past-the-end) and that it reference the sequence we are inserting
- * into. Note that this macro is only valid when the container is a
- * _Safe_sequence and the iterator is a _Safe_iterator.
-*/
-#define __glibcxx_check_insert(_Position) \
-_GLIBCXX_DEBUG_VERIFY(!_Position._M_singular(), \
- _M_message(::__gnu_debug::__msg_insert_singular) \
- ._M_sequence(*this, "this") \
- ._M_iterator(_Position, #_Position)); \
-_GLIBCXX_DEBUG_VERIFY(_Position._M_attached_to(this), \
- _M_message(::__gnu_debug::__msg_insert_different) \
- ._M_sequence(*this, "this") \
- ._M_iterator(_Position, #_Position))
-
-/** Verify that we can insert the values in the iterator range
- * [_First, _Last) into *this with the iterator _Position. Insertion
- * into a container at a specific position requires that the iterator
- * be nonsingular (i.e., either dereferenceable or past-the-end),
- * that it reference the sequence we are inserting into, and that the
- * iterator range [_First, Last) is a valid (possibly empty)
- * range. Note that this macro is only valid when the container is a
- * _Safe_sequence and the iterator is a _Safe_iterator.
- *
- * @tbd We would like to be able to check for noninterference of
- * _Position and the range [_First, _Last), but that can't (in
- * general) be done.
-*/
-#define __glibcxx_check_insert_range(_Position,_First,_Last) \
-__glibcxx_check_valid_range(_First,_Last); \
-_GLIBCXX_DEBUG_VERIFY(!_Position._M_singular(), \
- _M_message(::__gnu_debug::__msg_insert_singular) \
- ._M_sequence(*this, "this") \
- ._M_iterator(_Position, #_Position)); \
-_GLIBCXX_DEBUG_VERIFY(_Position._M_attached_to(this), \
- _M_message(::__gnu_debug::__msg_insert_different) \
- ._M_sequence(*this, "this") \
- ._M_iterator(_Position, #_Position))
-
-/** Verify that we can erase the element referenced by the iterator
- * _Position. We can erase the element if the _Position iterator is
- * dereferenceable and references this sequence.
-*/
-#define __glibcxx_check_erase(_Position) \
-_GLIBCXX_DEBUG_VERIFY(_Position._M_dereferenceable(), \
- _M_message(::__gnu_debug::__msg_erase_bad) \
- ._M_sequence(*this, "this") \
- ._M_iterator(_Position, #_Position)); \
-_GLIBCXX_DEBUG_VERIFY(_Position._M_attached_to(this), \
- _M_message(::__gnu_debug::__msg_erase_different) \
- ._M_sequence(*this, "this") \
- ._M_iterator(_Position, #_Position))
-
-/** Verify that we can erase the elements in the iterator range
- * [_First, _Last). We can erase the elements if [_First, _Last) is a
- * valid iterator range within this sequence.
-*/
-#define __glibcxx_check_erase_range(_First,_Last) \
-__glibcxx_check_valid_range(_First,_Last); \
-_GLIBCXX_DEBUG_VERIFY(_First._M_attached_to(this), \
- _M_message(::__gnu_debug::__msg_erase_different) \
- ._M_sequence(*this, "this") \
- ._M_iterator(_First, #_First) \
- ._M_iterator(_Last, #_Last))
-
-// Verify that the subscript _N is less than the container's size.
-#define __glibcxx_check_subscript(_N) \
-_GLIBCXX_DEBUG_VERIFY(_N < this->size(), \
- _M_message(::__gnu_debug::__msg_subscript_oob) \
- ._M_sequence(*this, "this") \
- ._M_integer(_N, #_N) \
- ._M_integer(this->size(), "size"))
-
-// Verify that the container is nonempty
-#define __glibcxx_check_nonempty() \
-_GLIBCXX_DEBUG_VERIFY(! this->empty(), \
- _M_message(::__gnu_debug::__msg_empty) \
- ._M_sequence(*this, "this"))
-
-// Verify that the < operator for elements in the sequence is a
-// StrictWeakOrdering by checking that it is irreflexive.
-#define __glibcxx_check_strict_weak_ordering(_First,_Last) \
-_GLIBCXX_DEBUG_ASSERT(_First == _Last || !(*_First < *_First))
-
-// Verify that the predicate is StrictWeakOrdering by checking that it
-// is irreflexive.
-#define __glibcxx_check_strict_weak_ordering_pred(_First,_Last,_Pred) \
-_GLIBCXX_DEBUG_ASSERT(_First == _Last || !_Pred(*_First, *_First))
-
-
-// Verify that the iterator range [_First, _Last) is sorted
-#define __glibcxx_check_sorted(_First,_Last) \
-__glibcxx_check_valid_range(_First,_Last); \
-__glibcxx_check_strict_weak_ordering(_First,_Last); \
-_GLIBCXX_DEBUG_VERIFY(::__gnu_debug::__check_sorted(_First, _Last), \
- _M_message(::__gnu_debug::__msg_unsorted) \
- ._M_iterator(_First, #_First) \
- ._M_iterator(_Last, #_Last))
-
-/** Verify that the iterator range [_First, _Last) is sorted by the
- predicate _Pred. */
-#define __glibcxx_check_sorted_pred(_First,_Last,_Pred) \
-__glibcxx_check_valid_range(_First,_Last); \
-__glibcxx_check_strict_weak_ordering_pred(_First,_Last,_Pred); \
-_GLIBCXX_DEBUG_VERIFY(::__gnu_debug::__check_sorted(_First, _Last, _Pred), \
- _M_message(::__gnu_debug::__msg_unsorted_pred) \
- ._M_iterator(_First, #_First) \
- ._M_iterator(_Last, #_Last) \
- ._M_string(#_Pred))
-
-/** Verify that the iterator range [_First, _Last) is partitioned
- w.r.t. the value _Value. */
-#define __glibcxx_check_partitioned(_First,_Last,_Value) \
-__glibcxx_check_valid_range(_First,_Last); \
-_GLIBCXX_DEBUG_VERIFY(::__gnu_debug::__check_partitioned(_First, _Last, \
- _Value), \
- _M_message(::__gnu_debug::__msg_unpartitioned) \
- ._M_iterator(_First, #_First) \
- ._M_iterator(_Last, #_Last) \
- ._M_string(#_Value))
-
-/** Verify that the iterator range [_First, _Last) is partitioned
- w.r.t. the value _Value and predicate _Pred. */
-#define __glibcxx_check_partitioned_pred(_First,_Last,_Value,_Pred) \
-__glibcxx_check_valid_range(_First,_Last); \
-_GLIBCXX_DEBUG_VERIFY(::__gnu_debug::__check_partitioned(_First, _Last, \
- _Value, _Pred), \
- _M_message(::__gnu_debug::__msg_unpartitioned_pred) \
- ._M_iterator(_First, #_First) \
- ._M_iterator(_Last, #_Last) \
- ._M_string(#_Pred) \
- ._M_string(#_Value))
-
-// Verify that the iterator range [_First, _Last) is a heap
-#define __glibcxx_check_heap(_First,_Last) \
-__glibcxx_check_valid_range(_First,_Last); \
-_GLIBCXX_DEBUG_VERIFY(::std::__is_heap(_First, _Last), \
- _M_message(::__gnu_debug::__msg_not_heap) \
- ._M_iterator(_First, #_First) \
- ._M_iterator(_Last, #_Last))
-
-/** Verify that the iterator range [_First, _Last) is a heap
- w.r.t. the predicate _Pred. */
-#define __glibcxx_check_heap_pred(_First,_Last,_Pred) \
-__glibcxx_check_valid_range(_First,_Last); \
-_GLIBCXX_DEBUG_VERIFY(::std::__is_heap(_First, _Last, _Pred), \
- _M_message(::__gnu_debug::__msg_not_heap_pred) \
- ._M_iterator(_First, #_First) \
- ._M_iterator(_Last, #_Last) \
- ._M_string(#_Pred))
-
-#ifdef _GLIBCXX_DEBUG_PEDANTIC
-# define __glibcxx_check_string(_String) _GLIBCXX_DEBUG_ASSERT(_String != 0)
-# define __glibcxx_check_string_len(_String,_Len) \
- _GLIBCXX_DEBUG_ASSERT(_String != 0 || _Len == 0)
-#else
-# define __glibcxx_check_string(_String)
-# define __glibcxx_check_string_len(_String,_Len)
-#endif
-
/** Macros used by the implementation outside of debug wrappers to
* verify certain properties. The __glibcxx_requires_xxx macros are
* merely wrappers around the __glibcxx_check_xxx wrappers when we
@@ -223,11 +38,13 @@ _GLIBCXX_DEBUG_VERIFY(::std::__is_heap(_First, _Last, _Pred), \
* release mode so that there is no checking performed in, e.g., the
* standard library algorithms.
*/
+
#ifdef _GLIBCXX_DEBUG
-# define _GLIBCXX_DEBUG_ASSERT(_Condition) assert(_Condition)
+# include <debug/macros.h>
+# define _GLIBCXX_DEBUG_ASSERT(_Condition) _GLIBCXX_DEBUG_ABORT(_Condition)
# ifdef _GLIBCXX_DEBUG_PEDANTIC
-# define _GLIBCXX_DEBUG_PEDASSERT(_Condition) assert(_Condition)
+# define _GLIBCXX_DEBUG_PEDASSERT(_Condition) _GLIBCXX_DEBUG_ABORT(_Condition)
# else
# define _GLIBCXX_DEBUG_PEDASSERT(_Condition)
# endif
@@ -252,6 +69,9 @@ _GLIBCXX_DEBUG_VERIFY(::std::__is_heap(_First, _Last, _Pred), \
# define __glibcxx_requires_string_len(_String,_Len) \
__glibcxx_check_string_len(_String,_Len)
# define __glibcxx_requires_subscript(_N) __glibcxx_check_subscript(_N)
+
+# include <debug/functions.h>
+# include <debug/formatter.h>
#else
# define _GLIBCXX_DEBUG_ASSERT(_Condition)
# define _GLIBCXX_DEBUG_PEDASSERT(_Condition)
@@ -269,263 +89,4 @@ _GLIBCXX_DEBUG_VERIFY(::std::__is_heap(_First, _Last, _Pred), \
# define __glibcxx_requires_subscript(_N)
#endif
-#include <cassert> // TBD: temporary
-
-#include <stddef.h> // for ptrdiff_t
-#include <bits/stl_iterator_base_types.h> // for iterator_traits, categories
-#include <bits/cpp_type_traits.h> // for __is_integer
-
-namespace __gnu_debug
-{
- template<typename _Iterator, typename _Sequence>
- class _Safe_iterator;
-
- // An arbitrary iterator pointer is not singular.
- inline bool
- __check_singular_aux(const void*) { return false; }
-
- // We may have an iterator that derives from _Safe_iterator_base but isn't
- // a _Safe_iterator.
- template<typename _Iterator>
- inline bool
- __check_singular(_Iterator& __x)
- { return __gnu_debug::__check_singular_aux(&__x); }
-
- /** Non-NULL pointers are nonsingular. */
- template<typename _Tp>
- inline bool
- __check_singular(const _Tp* __ptr)
- { return __ptr == 0; }
-
- /** Safe iterators know if they are singular. */
- template<typename _Iterator, typename _Sequence>
- inline bool
- __check_singular(const _Safe_iterator<_Iterator, _Sequence>& __x)
- { return __x._M_singular(); }
-
- /** Assume that some arbitrary iterator is dereferenceable, because we
- can't prove that it isn't. */
- template<typename _Iterator>
- inline bool
- __check_dereferenceable(_Iterator&)
- { return true; }
-
- /** Non-NULL pointers are dereferenceable. */
- template<typename _Tp>
- inline bool
- __check_dereferenceable(const _Tp* __ptr)
- { return __ptr; }
-
- /** Safe iterators know if they are singular. */
- template<typename _Iterator, typename _Sequence>
- inline bool
- __check_dereferenceable(const _Safe_iterator<_Iterator, _Sequence>& __x)
- { return __x._M_dereferenceable(); }
-
- /** If the distance between two random access iterators is
- * nonnegative, assume the range is valid.
- */
- template<typename _RandomAccessIterator>
- inline bool
- __valid_range_aux2(const _RandomAccessIterator& __first,
- const _RandomAccessIterator& __last,
- std::random_access_iterator_tag)
- { return __last - __first >= 0; }
-
- /** Can't test for a valid range with input iterators, because
- * iteration may be destructive. So we just assume that the range
- * is valid.
- */
- template<typename _InputIterator>
- inline bool
- __valid_range_aux2(const _InputIterator&, const _InputIterator&,
- std::input_iterator_tag)
- { return true; }
-
- /** We say that integral types for a valid range, and defer to other
- * routines to realize what to do with integral types instead of
- * iterators.
- */
- template<typename _Integral>
- inline bool
- __valid_range_aux(const _Integral&, const _Integral&, __true_type)
- { return true; }
-
- /** We have iterators, so figure out what kind of iterators that are
- * to see if we can check the range ahead of time.
- */
- template<typename _InputIterator>
- inline bool
- __valid_range_aux(const _InputIterator& __first,
- const _InputIterator& __last, __false_type)
- {
- typedef typename std::iterator_traits<_InputIterator>::iterator_category
- _Category;
- return __gnu_debug::__valid_range_aux2(__first, __last, _Category());
- }
-
- /** Don't know what these iterators are, or if they are even
- * iterators (we may get an integral type for InputIterator), so
- * see if they are integral and pass them on to the next phase
- * otherwise.
- */
- template<typename _InputIterator>
- inline bool
- __valid_range(const _InputIterator& __first, const _InputIterator& __last)
- {
- typedef typename std::__is_integer<_InputIterator>::__type _Integral;
- return __gnu_debug::__valid_range_aux(__first, __last, _Integral());
- }
-
- /** Safe iterators know how to check if they form a valid range. */
- template<typename _Iterator, typename _Sequence>
- inline bool
- __valid_range(const _Safe_iterator<_Iterator, _Sequence>& __first,
- const _Safe_iterator<_Iterator, _Sequence>& __last)
- { return __first._M_valid_range(__last); }
-
- /* Checks that [first, last) is a valid range, and then returns
- * __first. This routine is useful when we can't use a separate
- * assertion statement because, e.g., we are in a constructor.
- */
- template<typename _InputIterator>
- inline _InputIterator
- __check_valid_range(const _InputIterator& __first,
- const _InputIterator& __last)
- {
- _GLIBCXX_DEBUG_ASSERT(__gnu_debug::__valid_range(__first, __last));
- return __first;
- }
-
- /** Checks that __s is non-NULL or __n == 0, and then returns __s. */
- template<typename _CharT, typename _Integer>
- inline const _CharT*
- __check_string(const _CharT* __s, const _Integer& __n)
- {
-#ifdef _GLIBCXX_DEBUG_PEDANTIC
- _GLIBCXX_DEBUG_ASSERT(__s != 0 || __n == 0);
-#endif
- return __s;
- }
-
- /** Checks that __s is non-NULL and then returns __s. */
- template<typename _CharT>
- inline const _CharT*
- __check_string(const _CharT* __s)
- {
-#ifdef _GLIBCXX_DEBUG_PEDANTIC
- _GLIBCXX_DEBUG_ASSERT(__s != 0);
-#endif
- return __s;
- }
-
- // Can't check if an input iterator sequence is sorted, because we
- // can't step through the sequence.
- template<typename _InputIterator>
- inline bool
- __check_sorted_aux(const _InputIterator&, const _InputIterator&,
- std::input_iterator_tag)
- { return true; }
-
- // Can verify if a forward iterator sequence is in fact sorted using
- // std::__is_sorted
- template<typename _ForwardIterator>
- inline bool
- __check_sorted_aux(_ForwardIterator __first, _ForwardIterator __last,
- std::forward_iterator_tag)
- {
- if (__first == __last)
- return true;
-
- _ForwardIterator __next = __first;
- for (++__next; __next != __last; __first = __next, ++__next) {
- if (*__next < *__first)
- return false;
- }
-
- return true;
- }
-
- // Can't check if an input iterator sequence is sorted, because we can't step
- // through the sequence.
- template<typename _InputIterator, typename _Predicate>
- inline bool
- __check_sorted_aux(const _InputIterator&, const _InputIterator&,
- _Predicate, std::input_iterator_tag)
- { return true; }
-
- // Can verify if a forward iterator sequence is in fact sorted using
- // std::__is_sorted
- template<typename _ForwardIterator, typename _Predicate>
- inline bool
- __check_sorted_aux(_ForwardIterator __first, _ForwardIterator __last,
- _Predicate __pred, std::forward_iterator_tag)
- {
- if (__first == __last)
- return true;
-
- _ForwardIterator __next = __first;
- for (++__next; __next != __last; __first = __next, ++__next) {
- if (__pred(*__next, *__first))
- return false;
- }
-
- return true;
- }
-
- // Determine if a sequence is sorted.
- template<typename _InputIterator>
- inline bool
- __check_sorted(const _InputIterator& __first, const _InputIterator& __last)
- {
- typedef typename std::iterator_traits<_InputIterator>::iterator_category
- _Category;
- return __gnu_debug::__check_sorted_aux(__first, __last, _Category());
- }
-
- template<typename _InputIterator, typename _Predicate>
- inline bool
- __check_sorted(const _InputIterator& __first, const _InputIterator& __last,
- _Predicate __pred)
- {
- typedef typename std::iterator_traits<_InputIterator>::iterator_category
- _Category;
- return __gnu_debug::__check_sorted_aux(__first, __last, __pred,
- _Category());
- }
-
- // _GLIBCXX_RESOLVE_LIB_DEFECTS
- // 270. Binary search requirements overly strict
- // Determine if a sequence is partitioned w.r.t. this element.
- template<typename _ForwardIterator, typename _Tp>
- inline bool
- __check_partitioned(_ForwardIterator __first, _ForwardIterator __last,
- const _Tp& __value)
- {
- while (__first != __last && *__first < __value)
- ++__first;
- while (__first != __last && !(*__first < __value))
- ++__first;
- return __first == __last;
- }
-
- // Determine if a sequence is partitioned w.r.t. this element.
- template<typename _ForwardIterator, typename _Tp, typename _Pred>
- inline bool
- __check_partitioned(_ForwardIterator __first, _ForwardIterator __last,
- const _Tp& __value, _Pred __pred)
- {
- while (__first != __last && __pred(*__first, __value))
- ++__first;
- while (__first != __last && !__pred(*__first, __value))
- ++__first;
- return __first == __last;
- }
-} // namespace __gnu_debug
-
-#ifdef _GLIBCXX_DEBUG
-// We need the error formatter
-# include <debug/formatter.h>
-#endif
-
#endif
diff --git a/libstdc++-v3/include/debug/deque b/libstdc++-v3/include/debug/deque
index c39a49c0461..5d87cdaeb34 100644
--- a/libstdc++-v3/include/debug/deque
+++ b/libstdc++-v3/include/debug/deque
@@ -1,6 +1,6 @@
// Debugging deque implementation -*- C++ -*-
-// Copyright (C) 2003, 2004
+// Copyright (C) 2003, 2004, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -46,8 +46,8 @@ namespace __gnu_debug_def
typedef __gnu_debug::_Safe_sequence<deque> _Safe_base;
public:
- typedef typename _Allocator::reference reference;
- typedef typename _Allocator::const_reference const_reference;
+ typedef typename _Base::reference reference;
+ typedef typename _Base::const_reference const_reference;
typedef __gnu_debug::_Safe_iterator<typename _Base::iterator,deque>
iterator;
@@ -59,8 +59,8 @@ namespace __gnu_debug_def
typedef _Tp value_type;
typedef _Allocator allocator_type;
- typedef typename _Allocator::pointer pointer;
- typedef typename _Allocator::const_pointer const_pointer;
+ typedef typename _Base::pointer pointer;
+ typedef typename _Base::const_pointer const_pointer;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
diff --git a/libstdc++-v3/include/debug/functions.h b/libstdc++-v3/include/debug/functions.h
new file mode 100644
index 00000000000..28834d4786e
--- /dev/null
+++ b/libstdc++-v3/include/debug/functions.h
@@ -0,0 +1,286 @@
+// Debugging support implementation -*- C++ -*-
+
+// Copyright (C) 2003, 2005
+// 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 _GLIBCXX_DEBUG_FUNCTIONS_H
+#define _GLIBCXX_DEBUG_FUNCTIONS_H 1
+
+#include <stddef.h> // for ptrdiff_t
+#include <bits/stl_iterator_base_types.h> // for iterator_traits, categories
+#include <bits/cpp_type_traits.h> // for __is_integer
+
+namespace __gnu_debug
+{
+ template<typename _Iterator, typename _Sequence>
+ class _Safe_iterator;
+
+ // An arbitrary iterator pointer is not singular.
+ inline bool
+ __check_singular_aux(const void*) { return false; }
+
+ // We may have an iterator that derives from _Safe_iterator_base but isn't
+ // a _Safe_iterator.
+ template<typename _Iterator>
+ inline bool
+ __check_singular(_Iterator& __x)
+ { return __gnu_debug::__check_singular_aux(&__x); }
+
+ /** Non-NULL pointers are nonsingular. */
+ template<typename _Tp>
+ inline bool
+ __check_singular(const _Tp* __ptr)
+ { return __ptr == 0; }
+
+ /** Safe iterators know if they are singular. */
+ template<typename _Iterator, typename _Sequence>
+ inline bool
+ __check_singular(const _Safe_iterator<_Iterator, _Sequence>& __x)
+ { return __x._M_singular(); }
+
+ /** Assume that some arbitrary iterator is dereferenceable, because we
+ can't prove that it isn't. */
+ template<typename _Iterator>
+ inline bool
+ __check_dereferenceable(_Iterator&)
+ { return true; }
+
+ /** Non-NULL pointers are dereferenceable. */
+ template<typename _Tp>
+ inline bool
+ __check_dereferenceable(const _Tp* __ptr)
+ { return __ptr; }
+
+ /** Safe iterators know if they are singular. */
+ template<typename _Iterator, typename _Sequence>
+ inline bool
+ __check_dereferenceable(const _Safe_iterator<_Iterator, _Sequence>& __x)
+ { return __x._M_dereferenceable(); }
+
+ /** If the distance between two random access iterators is
+ * nonnegative, assume the range is valid.
+ */
+ template<typename _RandomAccessIterator>
+ inline bool
+ __valid_range_aux2(const _RandomAccessIterator& __first,
+ const _RandomAccessIterator& __last,
+ std::random_access_iterator_tag)
+ { return __last - __first >= 0; }
+
+ /** Can't test for a valid range with input iterators, because
+ * iteration may be destructive. So we just assume that the range
+ * is valid.
+ */
+ template<typename _InputIterator>
+ inline bool
+ __valid_range_aux2(const _InputIterator&, const _InputIterator&,
+ std::input_iterator_tag)
+ { return true; }
+
+ /** We say that integral types for a valid range, and defer to other
+ * routines to realize what to do with integral types instead of
+ * iterators.
+ */
+ template<typename _Integral>
+ inline bool
+ __valid_range_aux(const _Integral&, const _Integral&, __true_type)
+ { return true; }
+
+ /** We have iterators, so figure out what kind of iterators that are
+ * to see if we can check the range ahead of time.
+ */
+ template<typename _InputIterator>
+ inline bool
+ __valid_range_aux(const _InputIterator& __first,
+ const _InputIterator& __last, __false_type)
+ {
+ typedef typename std::iterator_traits<_InputIterator>::iterator_category
+ _Category;
+ return __gnu_debug::__valid_range_aux2(__first, __last, _Category());
+ }
+
+ /** Don't know what these iterators are, or if they are even
+ * iterators (we may get an integral type for InputIterator), so
+ * see if they are integral and pass them on to the next phase
+ * otherwise.
+ */
+ template<typename _InputIterator>
+ inline bool
+ __valid_range(const _InputIterator& __first, const _InputIterator& __last)
+ {
+ typedef typename std::__is_integer<_InputIterator>::__type _Integral;
+ return __gnu_debug::__valid_range_aux(__first, __last, _Integral());
+ }
+
+ /** Safe iterators know how to check if they form a valid range. */
+ template<typename _Iterator, typename _Sequence>
+ inline bool
+ __valid_range(const _Safe_iterator<_Iterator, _Sequence>& __first,
+ const _Safe_iterator<_Iterator, _Sequence>& __last)
+ { return __first._M_valid_range(__last); }
+
+ /* Checks that [first, last) is a valid range, and then returns
+ * __first. This routine is useful when we can't use a separate
+ * assertion statement because, e.g., we are in a constructor.
+ */
+ template<typename _InputIterator>
+ inline _InputIterator
+ __check_valid_range(const _InputIterator& __first,
+ const _InputIterator& __last)
+ {
+ _GLIBCXX_DEBUG_ASSERT(__gnu_debug::__valid_range(__first, __last));
+ return __first;
+ }
+
+ /** Checks that __s is non-NULL or __n == 0, and then returns __s. */
+ template<typename _CharT, typename _Integer>
+ inline const _CharT*
+ __check_string(const _CharT* __s, const _Integer& __n)
+ {
+#ifdef _GLIBCXX_DEBUG_PEDANTIC
+ _GLIBCXX_DEBUG_ASSERT(__s != 0 || __n == 0);
+#endif
+ return __s;
+ }
+
+ /** Checks that __s is non-NULL and then returns __s. */
+ template<typename _CharT>
+ inline const _CharT*
+ __check_string(const _CharT* __s)
+ {
+#ifdef _GLIBCXX_DEBUG_PEDANTIC
+ _GLIBCXX_DEBUG_ASSERT(__s != 0);
+#endif
+ return __s;
+ }
+
+ // Can't check if an input iterator sequence is sorted, because we
+ // can't step through the sequence.
+ template<typename _InputIterator>
+ inline bool
+ __check_sorted_aux(const _InputIterator&, const _InputIterator&,
+ std::input_iterator_tag)
+ { return true; }
+
+ // Can verify if a forward iterator sequence is in fact sorted using
+ // std::__is_sorted
+ template<typename _ForwardIterator>
+ inline bool
+ __check_sorted_aux(_ForwardIterator __first, _ForwardIterator __last,
+ std::forward_iterator_tag)
+ {
+ if (__first == __last)
+ return true;
+
+ _ForwardIterator __next = __first;
+ for (++__next; __next != __last; __first = __next, ++__next) {
+ if (*__next < *__first)
+ return false;
+ }
+
+ return true;
+ }
+
+ // Can't check if an input iterator sequence is sorted, because we can't step
+ // through the sequence.
+ template<typename _InputIterator, typename _Predicate>
+ inline bool
+ __check_sorted_aux(const _InputIterator&, const _InputIterator&,
+ _Predicate, std::input_iterator_tag)
+ { return true; }
+
+ // Can verify if a forward iterator sequence is in fact sorted using
+ // std::__is_sorted
+ template<typename _ForwardIterator, typename _Predicate>
+ inline bool
+ __check_sorted_aux(_ForwardIterator __first, _ForwardIterator __last,
+ _Predicate __pred, std::forward_iterator_tag)
+ {
+ if (__first == __last)
+ return true;
+
+ _ForwardIterator __next = __first;
+ for (++__next; __next != __last; __first = __next, ++__next) {
+ if (__pred(*__next, *__first))
+ return false;
+ }
+
+ return true;
+ }
+
+ // Determine if a sequence is sorted.
+ template<typename _InputIterator>
+ inline bool
+ __check_sorted(const _InputIterator& __first, const _InputIterator& __last)
+ {
+ typedef typename std::iterator_traits<_InputIterator>::iterator_category
+ _Category;
+ return __gnu_debug::__check_sorted_aux(__first, __last, _Category());
+ }
+
+ template<typename _InputIterator, typename _Predicate>
+ inline bool
+ __check_sorted(const _InputIterator& __first, const _InputIterator& __last,
+ _Predicate __pred)
+ {
+ typedef typename std::iterator_traits<_InputIterator>::iterator_category
+ _Category;
+ return __gnu_debug::__check_sorted_aux(__first, __last, __pred,
+ _Category());
+ }
+
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 270. Binary search requirements overly strict
+ // Determine if a sequence is partitioned w.r.t. this element.
+ template<typename _ForwardIterator, typename _Tp>
+ inline bool
+ __check_partitioned(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __value)
+ {
+ while (__first != __last && *__first < __value)
+ ++__first;
+ while (__first != __last && !(*__first < __value))
+ ++__first;
+ return __first == __last;
+ }
+
+ // Determine if a sequence is partitioned w.r.t. this element.
+ template<typename _ForwardIterator, typename _Tp, typename _Pred>
+ inline bool
+ __check_partitioned(_ForwardIterator __first, _ForwardIterator __last,
+ const _Tp& __value, _Pred __pred)
+ {
+ while (__first != __last && __pred(*__first, __value))
+ ++__first;
+ while (__first != __last && !__pred(*__first, __value))
+ ++__first;
+ return __first == __last;
+ }
+} // namespace __gnu_debug
+
+#endif
diff --git a/libstdc++-v3/include/debug/hash_map b/libstdc++-v3/include/debug/hash_map
index 570a9af6b69..d4d149756cd 100644
--- a/libstdc++-v3/include/debug/hash_map
+++ b/libstdc++-v3/include/debug/hash_map
@@ -1,6 +1,6 @@
// Debugging hash_map/hash_multimap implementation -*- C++ -*-
-// Copyright (C) 2003
+// Copyright (C) 2003, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -31,8 +31,8 @@
#ifndef _GLIBCXX_DEBUG_HASH_MAP
#define _GLIBCXX_DEBUG_HASH_MAP 1
-#include <hash_map>
-#include <debug/dbg_hash_map.h>
-#include <debug/dbg_hash_multimap.h>
+#include <ext/hash_map>
+#include <debug/hash_map.h>
+#include <debug/hash_multimap.h>
#endif
diff --git a/libstdc++-v3/include/debug/hash_set b/libstdc++-v3/include/debug/hash_set
index 282cba27613..c600f07c160 100644
--- a/libstdc++-v3/include/debug/hash_set
+++ b/libstdc++-v3/include/debug/hash_set
@@ -1,6 +1,6 @@
// Debugging hash_set/hash_multiset implementation -*- C++ -*-
-// Copyright (C) 2003
+// Copyright (C) 2003, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -31,8 +31,8 @@
#ifndef _GLIBCXX_DEBUG_HASH_SET
#define _GLIBCXX_DEBUG_HASH_SET 1
-#include <hash_set>
-#include <debug/dbg_hash_set.h>
-#include <debug/dbg_hash_multiset.h>
+#include <ext/hash_set>
+#include <debug/hash_set.h>
+#include <debug/hash_multiset.h>
#endif
diff --git a/libstdc++-v3/include/debug/list b/libstdc++-v3/include/debug/list
index 556c9d9acff..745f14ea7b7 100644
--- a/libstdc++-v3/include/debug/list
+++ b/libstdc++-v3/include/debug/list
@@ -1,6 +1,6 @@
// Debugging list implementation -*- C++ -*-
-// Copyright (C) 2003, 2004
+// Copyright (C) 2003, 2004, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -47,8 +47,8 @@ namespace __gnu_debug_def
typedef __gnu_debug::_Safe_sequence<list> _Safe_base;
public:
- typedef typename _Allocator::reference reference;
- typedef typename _Allocator::const_reference const_reference;
+ typedef typename _Base::reference reference;
+ typedef typename _Base::const_reference const_reference;
typedef __gnu_debug::_Safe_iterator<typename _Base::iterator, list>
iterator;
@@ -60,8 +60,8 @@ namespace __gnu_debug_def
typedef _Tp value_type;
typedef _Allocator allocator_type;
- typedef typename _Allocator::pointer pointer;
- typedef typename _Allocator::const_pointer const_pointer;
+ typedef typename _Base::pointer pointer;
+ typedef typename _Base::const_pointer const_pointer;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
diff --git a/libstdc++-v3/include/debug/macros.h b/libstdc++-v3/include/debug/macros.h
new file mode 100644
index 00000000000..3fe60c9df9a
--- /dev/null
+++ b/libstdc++-v3/include/debug/macros.h
@@ -0,0 +1,229 @@
+// Debugging support implementation -*- C++ -*-
+
+// Copyright (C) 2003, 2005
+// 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 _GLIBCXX_DEBUG_MACROS_H
+#define _GLIBCXX_DEBUG_MACROS_H 1
+
+/**
+ * Macros used by the implementation to verify certain
+ * properties. These macros may only be used directly by the debug
+ * wrappers. Note that these are macros (instead of the more obviously
+ * "correct" choice of making them functions) because we need line and
+ * file information at the call site, to minimize the distance between
+ * the user error and where the error is reported.
+ *
+ */
+namespace __gnu_debug
+{ void __fancy_abort(const char*, int, const char*, const char*); }
+#define _GLIBCXX_DEBUG_ABORT(_Condition) \
+ do { \
+ if (! (_Condition)) \
+ ::__gnu_debug::__fancy_abort(__FILE__, __LINE__, \
+ __PRETTY_FUNCTION__, \
+ #_Condition); \
+ } while (false)
+
+#define _GLIBCXX_DEBUG_VERIFY(_Condition,_ErrorMessage) \
+ do { \
+ if (! (_Condition)) \
+ ::__gnu_debug::_Error_formatter::_M_at(__FILE__, __LINE__) \
+ ._ErrorMessage._M_error(); \
+ } while (false)
+
+// Verify that [_First, _Last) forms a valid iterator range.
+#define __glibcxx_check_valid_range(_First,_Last) \
+_GLIBCXX_DEBUG_VERIFY(::__gnu_debug::__valid_range(_First, _Last), \
+ _M_message(::__gnu_debug::__msg_valid_range) \
+ ._M_iterator(_First, #_First) \
+ ._M_iterator(_Last, #_Last))
+
+/** Verify that we can insert into *this with the iterator _Position.
+ * Insertion into a container at a specific position requires that
+ * the iterator be nonsingular (i.e., either dereferenceable or
+ * past-the-end) and that it reference the sequence we are inserting
+ * into. Note that this macro is only valid when the container is a
+ * _Safe_sequence and the iterator is a _Safe_iterator.
+*/
+#define __glibcxx_check_insert(_Position) \
+_GLIBCXX_DEBUG_VERIFY(!_Position._M_singular(), \
+ _M_message(::__gnu_debug::__msg_insert_singular) \
+ ._M_sequence(*this, "this") \
+ ._M_iterator(_Position, #_Position)); \
+_GLIBCXX_DEBUG_VERIFY(_Position._M_attached_to(this), \
+ _M_message(::__gnu_debug::__msg_insert_different) \
+ ._M_sequence(*this, "this") \
+ ._M_iterator(_Position, #_Position))
+
+/** Verify that we can insert the values in the iterator range
+ * [_First, _Last) into *this with the iterator _Position. Insertion
+ * into a container at a specific position requires that the iterator
+ * be nonsingular (i.e., either dereferenceable or past-the-end),
+ * that it reference the sequence we are inserting into, and that the
+ * iterator range [_First, Last) is a valid (possibly empty)
+ * range. Note that this macro is only valid when the container is a
+ * _Safe_sequence and the iterator is a _Safe_iterator.
+ *
+ * @tbd We would like to be able to check for noninterference of
+ * _Position and the range [_First, _Last), but that can't (in
+ * general) be done.
+*/
+#define __glibcxx_check_insert_range(_Position,_First,_Last) \
+__glibcxx_check_valid_range(_First,_Last); \
+_GLIBCXX_DEBUG_VERIFY(!_Position._M_singular(), \
+ _M_message(::__gnu_debug::__msg_insert_singular) \
+ ._M_sequence(*this, "this") \
+ ._M_iterator(_Position, #_Position)); \
+_GLIBCXX_DEBUG_VERIFY(_Position._M_attached_to(this), \
+ _M_message(::__gnu_debug::__msg_insert_different) \
+ ._M_sequence(*this, "this") \
+ ._M_iterator(_Position, #_Position))
+
+/** Verify that we can erase the element referenced by the iterator
+ * _Position. We can erase the element if the _Position iterator is
+ * dereferenceable and references this sequence.
+*/
+#define __glibcxx_check_erase(_Position) \
+_GLIBCXX_DEBUG_VERIFY(_Position._M_dereferenceable(), \
+ _M_message(::__gnu_debug::__msg_erase_bad) \
+ ._M_sequence(*this, "this") \
+ ._M_iterator(_Position, #_Position)); \
+_GLIBCXX_DEBUG_VERIFY(_Position._M_attached_to(this), \
+ _M_message(::__gnu_debug::__msg_erase_different) \
+ ._M_sequence(*this, "this") \
+ ._M_iterator(_Position, #_Position))
+
+/** Verify that we can erase the elements in the iterator range
+ * [_First, _Last). We can erase the elements if [_First, _Last) is a
+ * valid iterator range within this sequence.
+*/
+#define __glibcxx_check_erase_range(_First,_Last) \
+__glibcxx_check_valid_range(_First,_Last); \
+_GLIBCXX_DEBUG_VERIFY(_First._M_attached_to(this), \
+ _M_message(::__gnu_debug::__msg_erase_different) \
+ ._M_sequence(*this, "this") \
+ ._M_iterator(_First, #_First) \
+ ._M_iterator(_Last, #_Last))
+
+// Verify that the subscript _N is less than the container's size.
+#define __glibcxx_check_subscript(_N) \
+_GLIBCXX_DEBUG_VERIFY(_N < this->size(), \
+ _M_message(::__gnu_debug::__msg_subscript_oob) \
+ ._M_sequence(*this, "this") \
+ ._M_integer(_N, #_N) \
+ ._M_integer(this->size(), "size"))
+
+// Verify that the container is nonempty
+#define __glibcxx_check_nonempty() \
+_GLIBCXX_DEBUG_VERIFY(! this->empty(), \
+ _M_message(::__gnu_debug::__msg_empty) \
+ ._M_sequence(*this, "this"))
+
+// Verify that the < operator for elements in the sequence is a
+// StrictWeakOrdering by checking that it is irreflexive.
+#define __glibcxx_check_strict_weak_ordering(_First,_Last) \
+_GLIBCXX_DEBUG_ASSERT(_First == _Last || !(*_First < *_First))
+
+// Verify that the predicate is StrictWeakOrdering by checking that it
+// is irreflexive.
+#define __glibcxx_check_strict_weak_ordering_pred(_First,_Last,_Pred) \
+_GLIBCXX_DEBUG_ASSERT(_First == _Last || !_Pred(*_First, *_First))
+
+
+// Verify that the iterator range [_First, _Last) is sorted
+#define __glibcxx_check_sorted(_First,_Last) \
+__glibcxx_check_valid_range(_First,_Last); \
+__glibcxx_check_strict_weak_ordering(_First,_Last); \
+_GLIBCXX_DEBUG_VERIFY(::__gnu_debug::__check_sorted(_First, _Last), \
+ _M_message(::__gnu_debug::__msg_unsorted) \
+ ._M_iterator(_First, #_First) \
+ ._M_iterator(_Last, #_Last))
+
+/** Verify that the iterator range [_First, _Last) is sorted by the
+ predicate _Pred. */
+#define __glibcxx_check_sorted_pred(_First,_Last,_Pred) \
+__glibcxx_check_valid_range(_First,_Last); \
+__glibcxx_check_strict_weak_ordering_pred(_First,_Last,_Pred); \
+_GLIBCXX_DEBUG_VERIFY(::__gnu_debug::__check_sorted(_First, _Last, _Pred), \
+ _M_message(::__gnu_debug::__msg_unsorted_pred) \
+ ._M_iterator(_First, #_First) \
+ ._M_iterator(_Last, #_Last) \
+ ._M_string(#_Pred))
+
+/** Verify that the iterator range [_First, _Last) is partitioned
+ w.r.t. the value _Value. */
+#define __glibcxx_check_partitioned(_First,_Last,_Value) \
+__glibcxx_check_valid_range(_First,_Last); \
+_GLIBCXX_DEBUG_VERIFY(::__gnu_debug::__check_partitioned(_First, _Last, \
+ _Value), \
+ _M_message(::__gnu_debug::__msg_unpartitioned) \
+ ._M_iterator(_First, #_First) \
+ ._M_iterator(_Last, #_Last) \
+ ._M_string(#_Value))
+
+/** Verify that the iterator range [_First, _Last) is partitioned
+ w.r.t. the value _Value and predicate _Pred. */
+#define __glibcxx_check_partitioned_pred(_First,_Last,_Value,_Pred) \
+__glibcxx_check_valid_range(_First,_Last); \
+_GLIBCXX_DEBUG_VERIFY(::__gnu_debug::__check_partitioned(_First, _Last, \
+ _Value, _Pred), \
+ _M_message(::__gnu_debug::__msg_unpartitioned_pred) \
+ ._M_iterator(_First, #_First) \
+ ._M_iterator(_Last, #_Last) \
+ ._M_string(#_Pred) \
+ ._M_string(#_Value))
+
+// Verify that the iterator range [_First, _Last) is a heap
+#define __glibcxx_check_heap(_First,_Last) \
+__glibcxx_check_valid_range(_First,_Last); \
+_GLIBCXX_DEBUG_VERIFY(::std::__is_heap(_First, _Last), \
+ _M_message(::__gnu_debug::__msg_not_heap) \
+ ._M_iterator(_First, #_First) \
+ ._M_iterator(_Last, #_Last))
+
+/** Verify that the iterator range [_First, _Last) is a heap
+ w.r.t. the predicate _Pred. */
+#define __glibcxx_check_heap_pred(_First,_Last,_Pred) \
+__glibcxx_check_valid_range(_First,_Last); \
+_GLIBCXX_DEBUG_VERIFY(::std::__is_heap(_First, _Last, _Pred), \
+ _M_message(::__gnu_debug::__msg_not_heap_pred) \
+ ._M_iterator(_First, #_First) \
+ ._M_iterator(_Last, #_Last) \
+ ._M_string(#_Pred))
+
+#ifdef _GLIBCXX_DEBUG_PEDANTIC
+# define __glibcxx_check_string(_String) _GLIBCXX_DEBUG_ASSERT(_String != 0)
+# define __glibcxx_check_string_len(_String,_Len) \
+ _GLIBCXX_DEBUG_ASSERT(_String != 0 || _Len == 0)
+#else
+# define __glibcxx_check_string(_String)
+# define __glibcxx_check_string_len(_String,_Len)
+#endif
+
+#endif
diff --git a/libstdc++-v3/include/debug/map.h b/libstdc++-v3/include/debug/map.h
index 017158479d1..75ae2f4bcf3 100644
--- a/libstdc++-v3/include/debug/map.h
+++ b/libstdc++-v3/include/debug/map.h
@@ -1,6 +1,6 @@
// Debugging map implementation -*- C++ -*-
-// Copyright (C) 2003, 2004
+// Copyright (C) 2003, 2004, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -53,8 +53,8 @@ namespace __gnu_debug_def
typedef std::pair<const _Key, _Tp> value_type;
typedef _Compare key_compare;
typedef _Allocator allocator_type;
- typedef typename _Allocator::reference reference;
- typedef typename _Allocator::const_reference const_reference;
+ typedef typename _Base::reference reference;
+ typedef typename _Base::const_reference const_reference;
typedef __gnu_debug::_Safe_iterator<typename _Base::iterator, map>
iterator;
@@ -63,8 +63,8 @@ namespace __gnu_debug_def
typedef typename _Base::size_type size_type;
typedef typename _Base::difference_type difference_type;
- typedef typename _Allocator::pointer pointer;
- typedef typename _Allocator::const_pointer const_pointer;
+ typedef typename _Base::pointer pointer;
+ typedef typename _Base::const_pointer const_pointer;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
diff --git a/libstdc++-v3/include/debug/multimap.h b/libstdc++-v3/include/debug/multimap.h
index 4de1e3b58f4..d5dbe5c2f71 100644
--- a/libstdc++-v3/include/debug/multimap.h
+++ b/libstdc++-v3/include/debug/multimap.h
@@ -1,6 +1,6 @@
// Debugging multimap implementation -*- C++ -*-
-// Copyright (C) 2003, 2004
+// Copyright (C) 2003, 2004, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -53,8 +53,8 @@ namespace __gnu_debug_def
typedef std::pair<const _Key, _Tp> value_type;
typedef _Compare key_compare;
typedef _Allocator allocator_type;
- typedef typename _Allocator::reference reference;
- typedef typename _Allocator::const_reference const_reference;
+ typedef typename _Base::reference reference;
+ typedef typename _Base::const_reference const_reference;
typedef __gnu_debug::_Safe_iterator<typename _Base::iterator, multimap>
iterator;
@@ -63,8 +63,8 @@ namespace __gnu_debug_def
typedef typename _Base::size_type size_type;
typedef typename _Base::difference_type difference_type;
- typedef typename _Allocator::pointer pointer;
- typedef typename _Allocator::const_pointer const_pointer;
+ typedef typename _Base::pointer pointer;
+ typedef typename _Base::const_pointer const_pointer;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
diff --git a/libstdc++-v3/include/debug/multiset.h b/libstdc++-v3/include/debug/multiset.h
index 92042fef68c..879e2feb59a 100644
--- a/libstdc++-v3/include/debug/multiset.h
+++ b/libstdc++-v3/include/debug/multiset.h
@@ -1,6 +1,6 @@
// Debugging multiset implementation -*- C++ -*-
-// Copyright (C) 2003, 2004
+// Copyright (C) 2003, 2004, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -53,8 +53,8 @@ namespace __gnu_debug_def
typedef _Compare key_compare;
typedef _Compare value_compare;
typedef _Allocator allocator_type;
- typedef typename _Allocator::reference reference;
- typedef typename _Allocator::const_reference const_reference;
+ typedef typename _Base::reference reference;
+ typedef typename _Base::const_reference const_reference;
typedef __gnu_debug::_Safe_iterator<typename _Base::iterator, multiset>
iterator;
@@ -63,8 +63,8 @@ namespace __gnu_debug_def
typedef typename _Base::size_type size_type;
typedef typename _Base::difference_type difference_type;
- typedef typename _Allocator::pointer pointer;
- typedef typename _Allocator::const_pointer const_pointer;
+ typedef typename _Base::pointer pointer;
+ typedef typename _Base::const_pointer const_pointer;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
diff --git a/libstdc++-v3/include/debug/safe_iterator.h b/libstdc++-v3/include/debug/safe_iterator.h
index 1f5b0f65e45..8d96f397c85 100644
--- a/libstdc++-v3/include/debug/safe_iterator.h
+++ b/libstdc++-v3/include/debug/safe_iterator.h
@@ -31,10 +31,12 @@
#ifndef _GLIBCXX_DEBUG_SAFE_ITERATOR_H
#define _GLIBCXX_DEBUG_SAFE_ITERATOR_H 1
-#include <bits/stl_pair.h>
#include <debug/debug.h>
+#include <debug/macros.h>
+#include <debug/functions.h>
#include <debug/formatter.h>
#include <debug/safe_base.h>
+#include <bits/stl_pair.h>
#include <bits/cpp_type_traits.h>
namespace __gnu_debug
@@ -46,7 +48,8 @@ namespace __gnu_debug
* _Safe_iterators can be determined singular or non-singular via
* _Safe_iterator_base.
*/
- inline bool __check_singular_aux(const _Safe_iterator_base* __x)
+ inline bool
+ __check_singular_aux(const _Safe_iterator_base* __x)
{ return __x->_M_singular(); }
/** \brief Safe iterator wrapper.
diff --git a/libstdc++-v3/include/debug/safe_sequence.h b/libstdc++-v3/include/debug/safe_sequence.h
index f050530a997..a1577b4b4ee 100644
--- a/libstdc++-v3/include/debug/safe_sequence.h
+++ b/libstdc++-v3/include/debug/safe_sequence.h
@@ -1,6 +1,6 @@
// Safe sequence implementation -*- C++ -*-
-// Copyright (C) 2003, 2004
+// Copyright (C) 2003, 2004, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -32,6 +32,8 @@
#define _GLIBCXX_DEBUG_SAFE_SEQUENCE_H 1
#include <debug/debug.h>
+#include <debug/macros.h>
+#include <debug/functions.h>
#include <debug/safe_base.h>
namespace __gnu_debug
diff --git a/libstdc++-v3/include/debug/set.h b/libstdc++-v3/include/debug/set.h
index 8656cb0aff6..f6fd451e1b9 100644
--- a/libstdc++-v3/include/debug/set.h
+++ b/libstdc++-v3/include/debug/set.h
@@ -1,6 +1,6 @@
// Debugging set implementation -*- C++ -*-
-// Copyright (C) 2003, 2004
+// Copyright (C) 2003, 2004, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -53,8 +53,8 @@ namespace __gnu_debug_def
typedef _Compare key_compare;
typedef _Compare value_compare;
typedef _Allocator allocator_type;
- typedef typename _Allocator::reference reference;
- typedef typename _Allocator::const_reference const_reference;
+ typedef typename _Base::reference reference;
+ typedef typename _Base::const_reference const_reference;
typedef __gnu_debug::_Safe_iterator<typename _Base::iterator, set>
iterator;
@@ -63,8 +63,8 @@ namespace __gnu_debug_def
typedef typename _Base::size_type size_type;
typedef typename _Base::difference_type difference_type;
- typedef typename _Allocator::pointer pointer;
- typedef typename _Allocator::const_pointer const_pointer;
+ typedef typename _Base::pointer pointer;
+ typedef typename _Base::const_pointer const_pointer;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
diff --git a/libstdc++-v3/include/debug/string b/libstdc++-v3/include/debug/string
index a91c004e937..26a1582d3d8 100644
--- a/libstdc++-v3/include/debug/string
+++ b/libstdc++-v3/include/debug/string
@@ -1,6 +1,6 @@
// Debugging string implementation -*- C++ -*-
-// Copyright (C) 2003
+// Copyright (C) 2003, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -37,7 +37,8 @@
namespace __gnu_debug
{
- template<typename _CharT, typename _Traits, typename _Allocator>
+template<typename _CharT, typename _Traits = std::char_traits<_CharT>,
+ typename _Allocator = std::allocator<_CharT> >
class basic_string
: public std::basic_string<_CharT, _Traits, _Allocator>,
public __gnu_debug::_Safe_sequence<basic_string<_CharT, _Traits,
@@ -51,12 +52,12 @@ namespace __gnu_debug
typedef _Traits traits_type;
typedef typename _Traits::char_type value_type;
typedef _Allocator allocator_type;
- typedef typename _Allocator::size_type size_type;
- typedef typename _Allocator::difference_type difference_type;
- typedef typename _Allocator::reference reference;
- typedef typename _Allocator::const_reference const_reference;
- typedef typename _Allocator::pointer pointer;
- typedef typename _Allocator::const_pointer const_pointer;
+ typedef typename _Base::size_type size_type;
+ typedef typename _Base::difference_type difference_type;
+ typedef typename _Base::reference reference;
+ typedef typename _Base::const_reference const_reference;
+ typedef typename _Base::pointer pointer;
+ typedef typename _Base::const_pointer const_pointer;
typedef __gnu_debug::_Safe_iterator<typename _Base::iterator, basic_string>
iterator;
@@ -213,7 +214,16 @@ namespace __gnu_debug
reference
operator[](size_type __pos)
{
+#ifdef _GLIBCXX_DEBUG_PEDANTIC
__glibcxx_check_subscript(__pos);
+#else
+ // as an extension v3 allows s[s.size()] when s is non-const.
+ _GLIBCXX_DEBUG_VERIFY(__pos <= this->size(),
+ _M_message(::__gnu_debug::__msg_subscript_oob)
+ ._M_sequence(*this, "this")
+ ._M_integer(__pos, "__pos")
+ ._M_integer(this->size(), "size"));
+#endif
return _M_base()[__pos];
}
@@ -996,6 +1006,13 @@ namespace __gnu_debug
__str._M_invalidate_all();
return __res;
}
+
+ typedef basic_string<char> string;
+
+#ifdef _GLIBCXX_USE_WCHAR_T
+ typedef basic_string<wchar_t> wstring;
+#endif
+
} // namespace __gnu_debug
#endif
diff --git a/libstdc++-v3/include/debug/vector b/libstdc++-v3/include/debug/vector
index 0cc2997b975..05c15ec18d3 100644
--- a/libstdc++-v3/include/debug/vector
+++ b/libstdc++-v3/include/debug/vector
@@ -1,6 +1,6 @@
// Debugging vector implementation -*- C++ -*-
-// Copyright (C) 2003, 2004
+// Copyright (C) 2003, 2004, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -32,9 +32,9 @@
#define _GLIBCXX_DEBUG_VECTOR 1
#include <vector>
+#include <utility>
#include <debug/safe_sequence.h>
#include <debug/safe_iterator.h>
-#include <utility>
namespace __gnu_debug_def
{
@@ -64,8 +64,8 @@ namespace __gnu_debug_def
typedef _Tp value_type;
typedef _Allocator allocator_type;
- typedef typename _Allocator::pointer pointer;
- typedef typename _Allocator::const_pointer const_pointer;
+ typedef typename _Base::pointer pointer;
+ typedef typename _Base::const_pointer const_pointer;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
diff --git a/libstdc++-v3/include/ext/array_allocator.h b/libstdc++-v3/include/ext/array_allocator.h
index 27169193306..8689d9da26a 100644
--- a/libstdc++-v3/include/ext/array_allocator.h
+++ b/libstdc++-v3/include/ext/array_allocator.h
@@ -121,10 +121,9 @@ namespace __gnu_cxx
allocate(size_type __n, const void* = 0)
{
static size_type __array_used;
- if (_M_array == 0
- || __array_used + __n > sizeof(*_M_array) / sizeof(_Tp))
+ if (_M_array == 0 || __array_used + __n > _M_array->size())
std::__throw_bad_alloc();
- pointer __ret = reinterpret_cast<_Tp*>(_M_array) + __array_used;
+ pointer __ret = _M_array->begin() + __array_used;
__array_used += __n;
return __ret;
}
diff --git a/libstdc++-v3/include/ext/hash_map b/libstdc++-v3/include/ext/hash_map
index eff10e0272b..20eebeb29a2 100644
--- a/libstdc++-v3/include/ext/hash_map
+++ b/libstdc++-v3/include/ext/hash_map
@@ -1,6 +1,6 @@
// Hashing map implementation -*- C++ -*-
-// Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002, 2004, 2005 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
@@ -617,4 +617,9 @@ namespace std
{ return *this; }
};
} // namespace std
+
+#ifdef _GLIBCXX_DEBUG
+# include <debug/hash_map>
+#endif
+
#endif
diff --git a/libstdc++-v3/include/ext/hash_set b/libstdc++-v3/include/ext/hash_set
index f6e791a500f..120bfc5ae4b 100644
--- a/libstdc++-v3/include/ext/hash_set
+++ b/libstdc++-v3/include/ext/hash_set
@@ -1,6 +1,6 @@
// Hashing set implementation -*- C++ -*-
-// Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002, 2004, 2005 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
@@ -583,4 +583,9 @@ namespace std
operator++(int) { return *this; }
};
} // namespace std
+
+#ifdef _GLIBCXX_DEBUG
+# include <debug/hash_set>
+#endif
+
#endif
diff --git a/libstdc++-v3/include/std/std_complex.h b/libstdc++-v3/include/std/std_complex.h
index 6c1e0033730..80020756789 100644
--- a/libstdc++-v3/include/std/std_complex.h
+++ b/libstdc++-v3/include/std/std_complex.h
@@ -749,7 +749,7 @@ namespace std
__complex_log(const complex<_Tp>& __z)
{ return complex<_Tp>(log(std::abs(__z)), std::arg(__z)); }
- /*
+#if _GLIBCXX_USE_C99_COMPLEX
inline __complex__ float
__complex_log(__complex__ float __z) { return __builtin_clogf(__z); }
@@ -758,14 +758,16 @@ namespace std
inline __complex__ long double
__complex_log(const __complex__ long double& __z)
- { return __builtin_clogl(__z); } */
+ { return __builtin_clogl(__z); }
- // FIXME: Currently we don't use built-ins for log() because of some
- // obscure user name-space issues. So, we use the generic version
- // which is why we don't use __z.__rep() in the call below.
+ template<typename _Tp>
+ inline complex<_Tp>
+ log(const complex<_Tp>& __z) { return __complex_log(__z.__rep()); }
+#else
template<typename _Tp>
inline complex<_Tp>
log(const complex<_Tp>& __z) { return __complex_log(__z); }
+#endif
template<typename _Tp>
inline complex<_Tp>
diff --git a/libstdc++-v3/include/std/std_sstream.h b/libstdc++-v3/include/std/std_sstream.h
index 66215b2f730..52c416f85b9 100644
--- a/libstdc++-v3/include/std/std_sstream.h
+++ b/libstdc++-v3/include/std/std_sstream.h
@@ -1,6 +1,6 @@
// String based streams -*- C++ -*-
-// Copyright (C) 1997, 1998, 1999, 2002, 2003, 2004
+// Copyright (C) 1997, 1998, 1999, 2002, 2003, 2004, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -127,16 +127,18 @@ namespace std
__string_type
str() const
{
+ __string_type __ret;
if (this->pptr())
{
// The current egptr() may not be the actual string end.
if (this->pptr() > this->egptr())
- return __string_type(this->pbase(), this->pptr());
+ __ret = __string_type(this->pbase(), this->pptr());
else
- return __string_type(this->pbase(), this->egptr());
+ __ret = __string_type(this->pbase(), this->egptr());
}
else
- return _M_string;
+ __ret = _M_string;
+ return __ret;
}
/**
@@ -151,7 +153,7 @@ namespace std
{
// Cannot use _M_string = __s, since v3 strings are COW.
_M_string.assign(__s.data(), __s.size());
- _M_stringbuf_init(this->_M_mode);
+ _M_stringbuf_init(_M_mode);
}
protected:
@@ -159,14 +161,25 @@ namespace std
void
_M_stringbuf_init(ios_base::openmode __mode)
{
- this->_M_mode = __mode;
-
+ _M_mode = __mode;
__size_type __len = 0;
- if (this->_M_mode & (ios_base::ate | ios_base::app))
+ if (_M_mode & (ios_base::ate | ios_base::app))
__len = _M_string.size();
_M_sync(const_cast<char_type*>(_M_string.data()), 0, __len);
}
+ virtual streamsize
+ showmanyc()
+ {
+ streamsize __ret = -1;
+ if (_M_mode & ios_base::in)
+ {
+ _M_update_egptr();
+ __ret = this->egptr() - this->gptr();
+ }
+ return __ret;
+ }
+
virtual int_type
underflow();
@@ -223,8 +236,8 @@ namespace std
void
_M_sync(char_type* __base, __size_type __i, __size_type __o)
{
- const bool __testin = this->_M_mode & ios_base::in;
- const bool __testout = this->_M_mode & ios_base::out;
+ const bool __testin = _M_mode & ios_base::in;
+ const bool __testout = _M_mode & ios_base::out;
char_type* __end = __base + _M_string.size();
if (__testin)
@@ -252,8 +265,7 @@ namespace std
void
_M_update_egptr()
{
- const bool __testin = this->_M_mode & ios_base::in;
-
+ const bool __testin = _M_mode & ios_base::in;
if (this->pptr() && this->pptr() > this->egptr())
if (__testin)
this->setg(this->eback(), this->gptr(), this->pptr());
diff --git a/libstdc++-v3/include/tr1/hashtable b/libstdc++-v3/include/tr1/hashtable
index c015e9edf69..add5f5bde15 100644
--- a/libstdc++-v3/include/tr1/hashtable
+++ b/libstdc++-v3/include/tr1/hashtable
@@ -64,40 +64,39 @@
//----------------------------------------------------------------------
// General utilities
-namespace Internal {
-template <bool Flag, typename IfTrue, typename IfFalse> struct IF;
-
-template <typename IfTrue, typename IfFalse>
-struct IF <true, IfTrue, IfFalse> { typedef IfTrue type; };
-
-template <typename IfTrue, typename IfFalse>
-struct IF <false, IfTrue, IfFalse> { typedef IfFalse type; };
-
-// Helper function: return distance(first, last) for forward
-// iterators, or 0 for input iterators.
-
-template <class Iterator>
-inline typename std::iterator_traits<Iterator>::difference_type
-distance_fw (Iterator first, Iterator last, std::input_iterator_tag)
-{
- return 0;
-}
-
-template <class Iterator>
-inline typename std::iterator_traits<Iterator>::difference_type
-distance_fw (Iterator first, Iterator last, std::forward_iterator_tag)
-{
- return std::distance(first, last);
-}
-
-template <class Iterator>
-inline typename std::iterator_traits<Iterator>::difference_type
-distance_fw (Iterator first, Iterator last)
+namespace Internal
{
- typedef typename std::iterator_traits<Iterator>::iterator_category tag;
- return distance_fw(first, last, tag());
-}
+ template<bool Flag, typename IfTrue, typename IfFalse>
+ struct IF;
+ template<typename IfTrue, typename IfFalse>
+ struct IF<true, IfTrue, IfFalse>
+ { typedef IfTrue type; };
+
+ template <typename IfTrue, typename IfFalse>
+ struct IF<false, IfTrue, IfFalse>
+ { typedef IfFalse type; };
+
+ // Helper function: return distance(first, last) for forward
+ // iterators, or 0 for input iterators.
+ template<class Iterator>
+ inline typename std::iterator_traits<Iterator>::difference_type
+ distance_fw(Iterator first, Iterator last, std::input_iterator_tag)
+ { return 0; }
+
+ template<class Iterator>
+ inline typename std::iterator_traits<Iterator>::difference_type
+ distance_fw(Iterator first, Iterator last, std::forward_iterator_tag)
+ { return std::distance(first, last); }
+
+ template<class Iterator>
+ inline typename std::iterator_traits<Iterator>::difference_type
+ distance_fw(Iterator first, Iterator last)
+ {
+ typedef typename std::iterator_traits<Iterator>::iterator_category tag;
+ return distance_fw(first, last, tag());
+ }
+
} // namespace Internal
//----------------------------------------------------------------------
@@ -109,140 +108,187 @@ distance_fw (Iterator first, Iterator last)
// nodes also store a hash code. In some cases (e.g. strings) this may
// be a performance win.
-namespace Internal {
-
-template <typename Value, bool cache_hash_code> struct hash_node;
-
-template <typename Value>
-struct hash_node<Value, true> {
- Value m_v;
- std::size_t hash_code;
- hash_node* m_next;
-};
-
-template <typename Value>
-struct hash_node<Value, false> {
- Value m_v;
- hash_node* m_next;
-};
-
-// Local iterators, used to iterate within a bucket but not between
-// buckets.
-
-template <typename Value, bool cache>
-struct node_iterator_base {
- node_iterator_base(hash_node<Value, cache>* p) : m_cur(p) { }
- void incr() { m_cur = m_cur->m_next; }
-
- hash_node<Value, cache>* m_cur;
-};
-
-template <typename Value, bool cache>
-inline bool operator== (const node_iterator_base<Value, cache>& x,
- const node_iterator_base<Value, cache>& y)
+namespace Internal
{
- return x.m_cur == y.m_cur;
-}
-
-template <typename Value, bool cache>
-inline bool operator!= (const node_iterator_base<Value, cache>& x,
- const node_iterator_base<Value, cache>& y)
-{
- return x.m_cur != y.m_cur;
-}
-
-template <typename Value, bool is_const, bool cache>
-struct node_iterator : public node_iterator_base<Value, cache> {
- typedef Value value_type;
- typedef typename IF<is_const, const Value*, Value*>::type pointer;
- typedef typename IF<is_const, const Value&, Value&>::type reference;
- typedef std::ptrdiff_t difference_type;
- typedef std::forward_iterator_tag iterator_category;
-
- explicit node_iterator (hash_node<Value, cache>* p = 0)
- : node_iterator_base<Value, cache>(p) { }
- node_iterator (const node_iterator<Value, true, cache>& x)
- : node_iterator_base<Value, cache>(x.m_cur) { }
-
- reference operator*() const { return this->m_cur->m_v; }
- pointer operator->() const { return &this->m_cur->m_v; }
-
- node_iterator& operator++() { this->incr(); return *this; }
- node_iterator operator++(int)
- { node_iterator tmp(*this); this->incr(); return tmp; }
-};
-
-template <typename Value, bool cache>
-struct hashtable_iterator_base {
- hashtable_iterator_base(hash_node<Value, cache>* node,
- hash_node<Value, cache>** bucket)
- : m_cur_node (node), m_cur_bucket (bucket)
- { }
+ template<typename Value, bool cache_hash_code>
+ struct hash_node;
+
+ template<typename Value>
+ struct hash_node<Value, true>
+ {
+ Value m_v;
+ std::size_t hash_code;
+ hash_node* m_next;
+ };
+
+ template<typename Value>
+ struct hash_node<Value, false>
+ {
+ Value m_v;
+ hash_node* m_next;
+ };
+
+ // Local iterators, used to iterate within a bucket but not between
+ // buckets.
+
+ template<typename Value, bool cache>
+ struct node_iterator_base
+ {
+ node_iterator_base(hash_node<Value, cache>* p)
+ : m_cur(p) { }
+
+ void
+ incr()
+ { m_cur = m_cur->m_next; }
+
+ hash_node<Value, cache>* m_cur;
+ };
+
+ template<typename Value, bool cache>
+ inline bool
+ operator==(const node_iterator_base<Value, cache>& x,
+ const node_iterator_base<Value, cache>& y)
+ { return x.m_cur == y.m_cur; }
+
+ template<typename Value, bool cache>
+ inline bool
+ operator!=(const node_iterator_base<Value, cache>& x,
+ const node_iterator_base<Value, cache>& y)
+ { return x.m_cur != y.m_cur; }
+
+ template<typename Value, bool is_const, bool cache>
+ struct node_iterator
+ : public node_iterator_base<Value, cache>
+ {
+ typedef Value value_type;
+ typedef typename IF<is_const, const Value*, Value*>::type pointer;
+ typedef typename IF<is_const, const Value&, Value&>::type reference;
+ typedef std::ptrdiff_t difference_type;
+ typedef std::forward_iterator_tag iterator_category;
+
+ explicit
+ node_iterator(hash_node<Value, cache>* p = 0)
+ : node_iterator_base<Value, cache>(p) { }
+
+ node_iterator(const node_iterator<Value, true, cache>& x)
+ : node_iterator_base<Value, cache>(x.m_cur) { }
+
+ reference
+ operator*() const
+ { return this->m_cur->m_v; }
+
+ pointer
+ operator->() const
+ { return &this->m_cur->m_v; }
+
+ node_iterator&
+ operator++()
+ {
+ this->incr();
+ return *this;
+ }
+
+ node_iterator
+ operator++(int)
+ {
+ node_iterator tmp(*this);
+ this->incr();
+ return tmp;
+ }
+ };
+
+ template<typename Value, bool cache>
+ struct hashtable_iterator_base
+ {
+ hashtable_iterator_base(hash_node<Value, cache>* node,
+ hash_node<Value, cache>** bucket)
+ : m_cur_node(node), m_cur_bucket(bucket)
+ { }
+
+ void
+ incr()
+ {
+ m_cur_node = m_cur_node->m_next;
+ if (!m_cur_node)
+ m_incr_bucket();
+ }
- void incr() {
- m_cur_node = m_cur_node->m_next;
- if (!m_cur_node)
+ void
m_incr_bucket();
- }
-
- void m_incr_bucket();
-
- hash_node<Value, cache>* m_cur_node;
- hash_node<Value, cache>** m_cur_bucket;
-};
-
-// Global iterators, used for arbitrary iteration within a hash
-// table. Larger and more expensive than local iterators.
-
-template <typename Value, bool cache>
-void hashtable_iterator_base<Value, cache>::m_incr_bucket()
-{
- ++m_cur_bucket;
-
- // This loop requires the bucket array to have a non-null sentinel
- while (!*m_cur_bucket)
- ++m_cur_bucket;
- m_cur_node = *m_cur_bucket;
-}
-
-template <typename Value, bool cache>
-inline bool operator== (const hashtable_iterator_base<Value, cache>& x,
- const hashtable_iterator_base<Value, cache>& y)
-{
- return x.m_cur_node == y.m_cur_node;
-}
+ hash_node<Value, cache>* m_cur_node;
+ hash_node<Value, cache>** m_cur_bucket;
+ };
+
+ // Global iterators, used for arbitrary iteration within a hash
+ // table. Larger and more expensive than local iterators.
+ template<typename Value, bool cache>
+ void
+ hashtable_iterator_base<Value, cache>::
+ m_incr_bucket()
+ {
+ ++m_cur_bucket;
+
+ // This loop requires the bucket array to have a non-null sentinel.
+ while (!*m_cur_bucket)
+ ++m_cur_bucket;
+ m_cur_node = *m_cur_bucket;
+ }
-template <typename Value, bool cache>
-inline bool operator!= (const hashtable_iterator_base<Value, cache>& x,
- const hashtable_iterator_base<Value, cache>& y)
-{
- return x.m_cur_node != y.m_cur_node;
-}
+ template<typename Value, bool cache>
+ inline bool
+ operator==(const hashtable_iterator_base<Value, cache>& x,
+ const hashtable_iterator_base<Value, cache>& y)
+ { return x.m_cur_node == y.m_cur_node; }
+
+ template<typename Value, bool cache>
+ inline bool
+ operator!=(const hashtable_iterator_base<Value, cache>& x,
+ const hashtable_iterator_base<Value, cache>& y)
+ { return x.m_cur_node != y.m_cur_node; }
+
+ template<typename Value, bool is_const, bool cache>
+ struct hashtable_iterator
+ : public hashtable_iterator_base<Value, cache>
+ {
+ typedef Value value_type;
+ typedef typename IF<is_const, const Value*, Value*>::type pointer;
+ typedef typename IF<is_const, const Value&, Value&>::type reference;
+ typedef std::ptrdiff_t difference_type;
+ typedef std::forward_iterator_tag iterator_category;
+
+ hashtable_iterator(hash_node<Value, cache>* p,
+ hash_node<Value, cache>** b)
+ : hashtable_iterator_base<Value, cache>(p, b) { }
+
+ hashtable_iterator(hash_node<Value, cache>** b)
+ : hashtable_iterator_base<Value, cache>(*b, b) { }
+
+ hashtable_iterator(const hashtable_iterator<Value, true, cache>& x)
+ : hashtable_iterator_base<Value, cache>(x.m_cur_node, x.m_cur_bucket) { }
-template <typename Value, bool is_const, bool cache>
-struct hashtable_iterator : public hashtable_iterator_base<Value, cache>
-{
- typedef Value value_type;
- typedef typename IF<is_const, const Value*, Value*>::type pointer;
- typedef typename IF<is_const, const Value&, Value&>::type reference;
- typedef std::ptrdiff_t difference_type;
- typedef std::forward_iterator_tag iterator_category;
-
- hashtable_iterator (hash_node<Value, cache>* p, hash_node<Value, cache>** b)
- : hashtable_iterator_base<Value, cache>(p, b) { }
- hashtable_iterator (hash_node<Value, cache>** b)
- : hashtable_iterator_base<Value, cache>(*b, b) { }
- hashtable_iterator (const hashtable_iterator<Value, true, cache>& x)
- : hashtable_iterator_base<Value, cache>(x.m_cur_node, x.m_cur_bucket) { }
-
- reference operator*() const { return this->m_cur_node->m_v; }
- pointer operator->() const { return &this->m_cur_node->m_v; }
-
- hashtable_iterator& operator++() { this->incr(); return *this; }
- hashtable_iterator operator++(int)
- { hashtable_iterator tmp(*this); this->incr(); return tmp; }
-};
+ reference
+ operator*() const
+ { return this->m_cur_node->m_v; }
+
+ pointer
+ operator->() const
+ { return &this->m_cur_node->m_v; }
+
+ hashtable_iterator&
+ operator++()
+ {
+ this->incr();
+ return *this;
+ }
+
+ hashtable_iterator
+ operator++(int)
+ {
+ hashtable_iterator tmp(*this);
+ this->incr();
+ return tmp; }
+ };
} // namespace Internal
@@ -250,193 +296,218 @@ struct hashtable_iterator : public hashtable_iterator_base<Value, cache>
// Many of class template hashtable's template parameters are policy
// classes. These are defaults for the policies.
-namespace Internal {
-
-// The two key extraction policies used by the *set and *map variants.
-template <typename T>
-struct identity {
- T operator()(const T& t) const { return t; }
-};
-
-template <typename Pair>
-struct extract1st {
- typename Pair::first_type operator()(const Pair& p) const { return p.first; }
-};
-
-// Default range hashing function: use division to fold a large number
-// into the range [0, N).
-struct mod_range_hashing
+namespace Internal
{
- typedef std::size_t first_argument_type;
- typedef std::size_t second_argument_type;
- typedef std::size_t result_type;
+ // The two key extraction policies used by the *set and *map variants.
+ template<typename T>
+ struct identity
+ {
+ T
+ operator()(const T& t) const
+ { return t; }
+ };
+
+ template<typename Pair>
+ struct extract1st
+ {
+ typename Pair::first_type
+ operator()(const Pair& p) const
+ { return p.first; }
+ };
+
+ // Default range hashing function: use division to fold a large number
+ // into the range [0, N).
+ struct mod_range_hashing
+ {
+ typedef std::size_t first_argument_type;
+ typedef std::size_t second_argument_type;
+ typedef std::size_t result_type;
- result_type operator() (first_argument_type r, second_argument_type N) const
+ result_type
+ operator() (first_argument_type r, second_argument_type N) const
{ return r % N; }
-};
-
-// Default ranged hash function H. In principle it should be a
-// function object composed from objects of type H1 and H2 such that
-// h(k, N) = h2(h1(k), N), but that would mean making extra copies of
-// h1 and h2. So instead we'll just use a tag to tell class template
-// hashtable to do that composition.
-struct default_ranged_hash { };
+ };
-// Default value for rehash policy. Bucket size is (usually) the
-// smallest prime that keeps the load factor small enough.
+ // Default ranged hash function H. In principle it should be a
+ // function object composed from objects of type H1 and H2 such that
+ // h(k, N) = h2(h1(k), N), but that would mean making extra copies of
+ // h1 and h2. So instead we'll just use a tag to tell class template
+ // hashtable to do that composition.
+ struct default_ranged_hash { };
-struct prime_rehash_policy
-{
- prime_rehash_policy (float z = 1.0);
-
- float max_load_factor() const;
-
- // Return a bucket size no smaller than n.
- std::size_t next_bkt (std::size_t n) const;
-
- // Return a bucket count appropriate for n elements
- std::size_t bkt_for_elements (std::size_t n) const;
-
- // n_bkt is current bucket count, n_elt is current element count,
- // and n_ins is number of elements to be inserted. Do we need to
- // increase bucket count? If so, return make_pair(true, n), where n
- // is the new bucket count. If not, return make_pair(false, 0).
- std::pair<bool, std::size_t>
- need_rehash (std::size_t n_bkt, std::size_t n_elt, std::size_t n_ins) const;
-
- float m_max_load_factor;
- float m_growth_factor;
- mutable std::size_t m_next_resize;
-};
-
-// XXX This is a hack. prime_rehash_policy's member functions, and
-// certainly the list of primes, should be defined in a .cc file.
-// We're temporarily putting them in a header because we don't have a
-// place to put TR1 .cc files yet. There's no good reason for any of
-// prime_rehash_policy's member functions to be inline, and there's
-// certainly no good reason for X<> to exist at all.
-
-struct lt {
- template <typename X, typename Y> bool operator()(X x, Y y) { return x < y; }
-};
-
-template <int dummy>
-struct X {
- static const int n_primes = 256;
- static const unsigned long primes[n_primes + 1];
-};
-
-template <int dummy>
-const int X<dummy>::n_primes;
-
-template <int dummy>
-const unsigned long X<dummy>::primes[n_primes + 1] =
+ // Default value for rehash policy. Bucket size is (usually) the
+ // smallest prime that keeps the load factor small enough.
+ struct prime_rehash_policy
{
- 2ul, 3ul, 5ul, 7ul, 11ul, 13ul, 17ul, 19ul, 23ul, 29ul, 31ul,
- 37ul, 41ul, 43ul, 47ul, 53ul, 59ul, 61ul, 67ul, 71ul, 73ul, 79ul,
- 83ul, 89ul, 97ul, 103ul, 109ul, 113ul, 127ul, 137ul, 139ul, 149ul,
- 157ul, 167ul, 179ul, 193ul, 199ul, 211ul, 227ul, 241ul, 257ul,
- 277ul, 293ul, 313ul, 337ul, 359ul, 383ul, 409ul, 439ul, 467ul,
- 503ul, 541ul, 577ul, 619ul, 661ul, 709ul, 761ul, 823ul, 887ul,
- 953ul, 1031ul, 1109ul, 1193ul, 1289ul, 1381ul, 1493ul, 1613ul,
- 1741ul, 1879ul, 2029ul, 2179ul, 2357ul, 2549ul, 2753ul, 2971ul,
- 3209ul, 3469ul, 3739ul, 4027ul, 4349ul, 4703ul, 5087ul, 5503ul,
- 5953ul, 6427ul, 6949ul, 7517ul, 8123ul, 8783ul, 9497ul, 10273ul,
- 11113ul, 12011ul, 12983ul, 14033ul, 15173ul, 16411ul, 17749ul,
- 19183ul, 20753ul, 22447ul, 24281ul, 26267ul, 28411ul, 30727ul,
- 33223ul, 35933ul, 38873ul, 42043ul, 45481ul, 49201ul, 53201ul,
- 57557ul, 62233ul, 67307ul, 72817ul, 78779ul, 85229ul, 92203ul,
- 99733ul, 107897ul, 116731ul, 126271ul, 136607ul, 147793ul,
- 159871ul, 172933ul, 187091ul, 202409ul, 218971ul, 236897ul,
- 256279ul, 277261ul, 299951ul, 324503ul, 351061ul, 379787ul,
- 410857ul, 444487ul, 480881ul, 520241ul, 562841ul, 608903ul,
- 658753ul, 712697ul, 771049ul, 834181ul, 902483ul, 976369ul,
- 1056323ul, 1142821ul, 1236397ul, 1337629ul, 1447153ul, 1565659ul,
- 1693859ul, 1832561ul, 1982627ul, 2144977ul, 2320627ul, 2510653ul,
- 2716249ul, 2938679ul, 3179303ul, 3439651ul, 3721303ul, 4026031ul,
- 4355707ul, 4712381ul, 5098259ul, 5515729ul, 5967347ul, 6456007ul,
- 6984629ul, 7556579ul, 8175383ul, 8844859ul, 9569143ul, 10352717ul,
- 11200489ul, 12117689ul, 13109983ul, 14183539ul, 15345007ul,
- 16601593ul, 17961079ul, 19431899ul, 21023161ul, 22744717ul,
- 24607243ul, 26622317ul, 28802401ul, 31160981ul, 33712729ul,
- 36473443ul, 39460231ul, 42691603ul, 46187573ul, 49969847ul,
- 54061849ul, 58488943ul, 63278561ul, 68460391ul, 74066549ul,
- 80131819ul, 86693767ul, 93793069ul, 101473717ul, 109783337ul,
- 118773397ul, 128499677ul, 139022417ul, 150406843ul, 162723577ul,
- 176048909ul, 190465427ul, 206062531ul, 222936881ul, 241193053ul,
- 260944219ul, 282312799ul, 305431229ul, 330442829ul, 357502601ul,
- 386778277ul, 418451333ul, 452718089ul, 489790921ul, 529899637ul,
- 573292817ul, 620239453ul, 671030513ul, 725980837ul, 785430967ul,
- 849749479ul, 919334987ul, 994618837ul, 1076067617ul, 1164186217ul,
- 1259520799ul, 1362662261ul, 1474249943ul, 1594975441ul,
- 1725587117ul, 1866894511ul, 2019773507ul, 2185171673ul,
- 2364114217ul, 2557710269ul, 2767159799ul, 2993761039ul,
- 3238918481ul, 3504151727ul, 3791104843ul, 4101556399ul,
- 4294967291ul,
- 4294967291ul // sentinel so we don't have to test result of lower_bound
+ prime_rehash_policy(float z = 1.0);
+
+ float
+ max_load_factor() const;
+
+ // Return a bucket size no smaller than n.
+ std::size_t
+ next_bkt(std::size_t n) const;
+
+ // Return a bucket count appropriate for n elements
+ std::size_t
+ bkt_for_elements(std::size_t n) const;
+
+ // n_bkt is current bucket count, n_elt is current element count,
+ // and n_ins is number of elements to be inserted. Do we need to
+ // increase bucket count? If so, return make_pair(true, n), where n
+ // is the new bucket count. If not, return make_pair(false, 0).
+ std::pair<bool, std::size_t>
+ need_rehash(std::size_t n_bkt, std::size_t n_elt, std::size_t n_ins) const;
+
+ float m_max_load_factor;
+ float m_growth_factor;
+ mutable std::size_t m_next_resize;
};
-inline prime_rehash_policy::prime_rehash_policy (float z)
- : m_max_load_factor(z),
- m_growth_factor (2.f),
- m_next_resize (0)
-{ }
-
-inline float prime_rehash_policy::max_load_factor() const
-{
- return m_max_load_factor;
-}
+ // XXX This is a hack. prime_rehash_policy's member functions, and
+ // certainly the list of primes, should be defined in a .cc file.
+ // We're temporarily putting them in a header because we don't have a
+ // place to put TR1 .cc files yet. There's no good reason for any of
+ // prime_rehash_policy's member functions to be inline, and there's
+ // certainly no good reason for X<> to exist at all.
+
+ struct lt
+ {
+ template<typename X, typename Y>
+ bool
+ operator()(X x, Y y)
+ { return x < y; }
+ };
-// Return a prime no smaller than n.
-inline std::size_t prime_rehash_policy::next_bkt (std::size_t n) const
-{
- const unsigned long* const last = X<0>::primes + X<0>::n_primes;
- const unsigned long* p = std::lower_bound (X<0>::primes, last, n);
- m_next_resize = static_cast<std::size_t>(std::ceil(*p * m_max_load_factor));
- return *p;
-}
+ template<int dummy>
+ struct X
+ {
+ static const int n_primes = 256;
+ static const unsigned long primes[n_primes + 1];
+ };
+
+ template<int dummy>
+ const int X<dummy>::n_primes;
+
+ template<int dummy>
+ const unsigned long X<dummy>::primes[n_primes + 1] =
+ {
+ 2ul, 3ul, 5ul, 7ul, 11ul, 13ul, 17ul, 19ul, 23ul, 29ul, 31ul,
+ 37ul, 41ul, 43ul, 47ul, 53ul, 59ul, 61ul, 67ul, 71ul, 73ul, 79ul,
+ 83ul, 89ul, 97ul, 103ul, 109ul, 113ul, 127ul, 137ul, 139ul, 149ul,
+ 157ul, 167ul, 179ul, 193ul, 199ul, 211ul, 227ul, 241ul, 257ul,
+ 277ul, 293ul, 313ul, 337ul, 359ul, 383ul, 409ul, 439ul, 467ul,
+ 503ul, 541ul, 577ul, 619ul, 661ul, 709ul, 761ul, 823ul, 887ul,
+ 953ul, 1031ul, 1109ul, 1193ul, 1289ul, 1381ul, 1493ul, 1613ul,
+ 1741ul, 1879ul, 2029ul, 2179ul, 2357ul, 2549ul, 2753ul, 2971ul,
+ 3209ul, 3469ul, 3739ul, 4027ul, 4349ul, 4703ul, 5087ul, 5503ul,
+ 5953ul, 6427ul, 6949ul, 7517ul, 8123ul, 8783ul, 9497ul, 10273ul,
+ 11113ul, 12011ul, 12983ul, 14033ul, 15173ul, 16411ul, 17749ul,
+ 19183ul, 20753ul, 22447ul, 24281ul, 26267ul, 28411ul, 30727ul,
+ 33223ul, 35933ul, 38873ul, 42043ul, 45481ul, 49201ul, 53201ul,
+ 57557ul, 62233ul, 67307ul, 72817ul, 78779ul, 85229ul, 92203ul,
+ 99733ul, 107897ul, 116731ul, 126271ul, 136607ul, 147793ul,
+ 159871ul, 172933ul, 187091ul, 202409ul, 218971ul, 236897ul,
+ 256279ul, 277261ul, 299951ul, 324503ul, 351061ul, 379787ul,
+ 410857ul, 444487ul, 480881ul, 520241ul, 562841ul, 608903ul,
+ 658753ul, 712697ul, 771049ul, 834181ul, 902483ul, 976369ul,
+ 1056323ul, 1142821ul, 1236397ul, 1337629ul, 1447153ul, 1565659ul,
+ 1693859ul, 1832561ul, 1982627ul, 2144977ul, 2320627ul, 2510653ul,
+ 2716249ul, 2938679ul, 3179303ul, 3439651ul, 3721303ul, 4026031ul,
+ 4355707ul, 4712381ul, 5098259ul, 5515729ul, 5967347ul, 6456007ul,
+ 6984629ul, 7556579ul, 8175383ul, 8844859ul, 9569143ul, 10352717ul,
+ 11200489ul, 12117689ul, 13109983ul, 14183539ul, 15345007ul,
+ 16601593ul, 17961079ul, 19431899ul, 21023161ul, 22744717ul,
+ 24607243ul, 26622317ul, 28802401ul, 31160981ul, 33712729ul,
+ 36473443ul, 39460231ul, 42691603ul, 46187573ul, 49969847ul,
+ 54061849ul, 58488943ul, 63278561ul, 68460391ul, 74066549ul,
+ 80131819ul, 86693767ul, 93793069ul, 101473717ul, 109783337ul,
+ 118773397ul, 128499677ul, 139022417ul, 150406843ul, 162723577ul,
+ 176048909ul, 190465427ul, 206062531ul, 222936881ul, 241193053ul,
+ 260944219ul, 282312799ul, 305431229ul, 330442829ul, 357502601ul,
+ 386778277ul, 418451333ul, 452718089ul, 489790921ul, 529899637ul,
+ 573292817ul, 620239453ul, 671030513ul, 725980837ul, 785430967ul,
+ 849749479ul, 919334987ul, 994618837ul, 1076067617ul, 1164186217ul,
+ 1259520799ul, 1362662261ul, 1474249943ul, 1594975441ul,
+ 1725587117ul, 1866894511ul, 2019773507ul, 2185171673ul,
+ 2364114217ul, 2557710269ul, 2767159799ul, 2993761039ul,
+ 3238918481ul, 3504151727ul, 3791104843ul, 4101556399ul,
+ 4294967291ul,
+ 4294967291ul // sentinel so we don't have to test result of lower_bound
+ };
+
+ inline
+ prime_rehash_policy::
+ prime_rehash_policy(float z)
+ : m_max_load_factor(z), m_growth_factor(2.f), m_next_resize(0)
+ { }
-// Return the smallest prime p such that alpha p >= n, where alpha
-// is the load factor.
-inline std::size_t prime_rehash_policy::bkt_for_elements (std::size_t n) const
-{
- const unsigned long* const last = X<0>::primes + X<0>::n_primes;
- const float min_bkts = n / m_max_load_factor;
- const unsigned long* p = std::lower_bound (X<0>::primes, last, min_bkts, lt());
- m_next_resize = static_cast<std::size_t>(std::ceil(*p * m_max_load_factor));
- return *p;
-}
+ inline float
+ prime_rehash_policy::
+ max_load_factor() const
+ { return m_max_load_factor; }
-// Finds the smallest prime p such that alpha p > n_elt + n_ins.
-// If p > n_bkt, return make_pair(true, p); otherwise return
-// make_pair(false, 0). In principle this isn't very different from
-// bkt_for_elements.
+ // Return a prime no smaller than n.
+ inline std::size_t
+ prime_rehash_policy::
+ next_bkt(std::size_t n) const
+ {
+ const unsigned long* const last = X<0>::primes + X<0>::n_primes;
+ const unsigned long* p = std::lower_bound (X<0>::primes, last, n);
+ m_next_resize = static_cast<std::size_t>(std::ceil(*p * m_max_load_factor));
+ return *p;
+ }
-// The only tricky part is that we're caching the element count at
-// which we need to rehash, so we don't have to do a floating-point
-// multiply for every insertion.
+ // Return the smallest prime p such that alpha p >= n, where alpha
+ // is the load factor.
+ inline std::size_t
+ prime_rehash_policy::
+ bkt_for_elements(std::size_t n) const
+ {
+ const unsigned long* const last = X<0>::primes + X<0>::n_primes;
+ const float min_bkts = n / m_max_load_factor;
+ const unsigned long* p = std::lower_bound (X<0>::primes, last,
+ min_bkts, lt());
+ m_next_resize = static_cast<std::size_t>(std::ceil(*p * m_max_load_factor));
+ return *p;
+ }
-inline std::pair<bool, std::size_t>
-prime_rehash_policy
-::need_rehash (std::size_t n_bkt, std::size_t n_elt, std::size_t n_ins) const
-{
- if (n_elt + n_ins > m_next_resize) {
- float min_bkts = (float(n_ins) + float(n_elt)) / m_max_load_factor;
- if (min_bkts > n_bkt) {
- min_bkts = std::max (min_bkts, m_growth_factor * n_bkt);
- const unsigned long* const last = X<0>::primes + X<0>::n_primes;
- const unsigned long* p = std::lower_bound (X<0>::primes, last, min_bkts, lt());
- m_next_resize = static_cast<std::size_t>(std::ceil(*p * m_max_load_factor));
- return std::make_pair(true, *p);
- }
- else {
- m_next_resize = static_cast<std::size_t>(std::ceil(n_bkt * m_max_load_factor));
+ // Finds the smallest prime p such that alpha p > n_elt + n_ins.
+ // If p > n_bkt, return make_pair(true, p); otherwise return
+ // make_pair(false, 0). In principle this isn't very different from
+ // bkt_for_elements.
+
+ // The only tricky part is that we're caching the element count at
+ // which we need to rehash, so we don't have to do a floating-point
+ // multiply for every insertion.
+
+ inline std::pair<bool, std::size_t>
+ prime_rehash_policy::
+ need_rehash(std::size_t n_bkt, std::size_t n_elt, std::size_t n_ins) const
+ {
+ if (n_elt + n_ins > m_next_resize)
+ {
+ float min_bkts = (float(n_ins) + float(n_elt)) / m_max_load_factor;
+ if (min_bkts > n_bkt)
+ {
+ min_bkts = std::max (min_bkts, m_growth_factor * n_bkt);
+ const unsigned long* const last = X<0>::primes + X<0>::n_primes;
+ const unsigned long* p = std::lower_bound (X<0>::primes, last,
+ min_bkts, lt());
+ m_next_resize =
+ static_cast<std::size_t>(std::ceil(*p * m_max_load_factor));
+ return std::make_pair(true, *p);
+ }
+ else
+ {
+ m_next_resize =
+ static_cast<std::size_t>(std::ceil(n_bkt * m_max_load_factor));
+ return std::make_pair(false, 0);
+ }
+ }
+ else
return std::make_pair(false, 0);
- }
}
- else
- return std::make_pair(false, 0);
-}
} // namespace Internal
@@ -449,983 +520,1182 @@ prime_rehash_policy
// need to access other members of class template hashtable, so we use
// the "curiously recurring template pattern" for them.
-namespace Internal {
-
-// class template map_base. If the hashtable has a value type of the
-// form pair<T1, T2> and a key extraction policy that returns the
-// first part of the pair, the hashtable gets a mapped_type typedef.
-// If it satisfies those criteria and also has unique keys, then it
-// also gets an operator[].
-
-template <typename K, typename V, typename Ex, bool unique, typename Hashtable>
-struct map_base { };
-
-template <typename K, typename Pair, typename Hashtable>
-struct map_base<K, Pair, extract1st<Pair>, false, Hashtable>
-{
- typedef typename Pair::second_type mapped_type;
-};
-
-template <typename K, typename Pair, typename Hashtable>
-struct map_base<K, Pair, extract1st<Pair>, true, Hashtable>
-{
- typedef typename Pair::second_type mapped_type;
- mapped_type& operator[](const K& k) {
- Hashtable* h = static_cast<Hashtable*>(this);
- typename Hashtable::iterator it = h->insert(std::make_pair(k, mapped_type())).first;
- return it->second;
- }
-};
-
-// class template rehash_base. Give hashtable the max_load_factor
-// functions iff the rehash policy is prime_rehash_policy.
-template <typename RehashPolicy, typename Hashtable>
-struct rehash_base { };
-
-template <typename Hashtable>
-struct rehash_base<prime_rehash_policy, Hashtable>
+namespace Internal
{
- float max_load_factor() const {
- const Hashtable* This = static_cast<const Hashtable*>(this);
- return This->rehash_policy()->max_load_factor();
- }
-
- void max_load_factor(float z) {
- Hashtable* This = static_cast<Hashtable*>(this);
- This->rehash_policy(prime_rehash_policy(z));
- }
-};
-
-// Class template hash_code_base. Encapsulates two policy issues that
-// aren't quite orthogonal.
-// (1) the difference between using a ranged hash function and using
-// the combination of a hash function and a range-hashing function.
-// In the former case we don't have such things as hash codes, so
-// we have a dummy type as placeholder.
-// (2) Whether or not we cache hash codes. Caching hash codes is
-// meaningless if we have a ranged hash function.
-// We also put the key extraction and equality comparison function
-// objects here, for convenience.
-
-// Primary template: unused except as a hook for specializations.
-
-template <typename Key, typename Value,
- typename ExtractKey, typename Equal,
- typename H1, typename H2, typename H,
- bool cache_hash_code>
-struct hash_code_base;
-
-// Specialization: ranged hash function, no caching hash codes. H1
-// and H2 are provided but ignored. We define a dummy hash code type.
-template <typename Key, typename Value,
- typename ExtractKey, typename Equal,
- typename H1, typename H2, typename H>
-struct hash_code_base <Key, Value, ExtractKey, Equal, H1, H2, H, false>
-{
-protected:
- hash_code_base (const ExtractKey& ex, const Equal& eq,
- const H1&, const H2&, const H& h)
- : m_extract(ex), m_eq(eq), m_ranged_hash(h) { }
-
- typedef void* hash_code_t;
- hash_code_t m_hash_code (const Key& k) const { return 0; }
- std::size_t bucket_index (const Key& k, hash_code_t, std::size_t N) const
- { return m_ranged_hash (k, N); }
- std::size_t bucket_index (const hash_node<Value, false>* p, std::size_t N) const {
- return m_ranged_hash (m_extract (p->m_v), N);
- }
+ // class template map_base. If the hashtable has a value type of the
+ // form pair<T1, T2> and a key extraction policy that returns the
+ // first part of the pair, the hashtable gets a mapped_type typedef.
+ // If it satisfies those criteria and also has unique keys, then it
+ // also gets an operator[].
- bool compare (const Key& k, hash_code_t, hash_node<Value, false>* n) const
- { return m_eq (k, m_extract(n->m_v)); }
-
- void copy_code (hash_node<Value, false>*, const hash_node<Value, false>*) const { }
-
- void m_swap(hash_code_base& x) {
- m_extract.m_swap(x);
- m_eq.m_swap(x);
- m_ranged_hash.m_swap(x);
- }
-
-protected:
- ExtractKey m_extract;
- Equal m_eq;
- H m_ranged_hash;
-};
-
-
-// No specialization for ranged hash function while caching hash codes.
-// That combination is meaningless, and trying to do it is an error.
+ template<typename K, typename V, typename Ex, bool unique, typename Hashtable>
+ struct map_base { };
+
+ template<typename K, typename Pair, typename Hashtable>
+ struct map_base<K, Pair, extract1st<Pair>, false, Hashtable>
+ {
+ typedef typename Pair::second_type mapped_type;
+ };
+
+ template<typename K, typename Pair, typename Hashtable>
+ struct map_base<K, Pair, extract1st<Pair>, true, Hashtable>
+ {
+ typedef typename Pair::second_type mapped_type;
+
+ mapped_type&
+ operator[](const K& k)
+ {
+ Hashtable* h = static_cast<Hashtable*>(this);
+ typename Hashtable::iterator it =
+ h->insert(std::make_pair(k, mapped_type())).first;
+ return it->second;
+ }
+ };
+
+ // class template rehash_base. Give hashtable the max_load_factor
+ // functions iff the rehash policy is prime_rehash_policy.
+ template<typename RehashPolicy, typename Hashtable>
+ struct rehash_base { };
+
+ template<typename Hashtable>
+ struct rehash_base<prime_rehash_policy, Hashtable>
+ {
+ float
+ max_load_factor() const
+ {
+ const Hashtable* This = static_cast<const Hashtable*>(this);
+ return This->rehash_policy()->max_load_factor();
+ }
+ void
+ max_load_factor(float z)
+ {
+ Hashtable* This = static_cast<Hashtable*>(this);
+ This->rehash_policy(prime_rehash_policy(z));
+ }
+ };
+
+ // Class template hash_code_base. Encapsulates two policy issues that
+ // aren't quite orthogonal.
+ // (1) the difference between using a ranged hash function and using
+ // the combination of a hash function and a range-hashing function.
+ // In the former case we don't have such things as hash codes, so
+ // we have a dummy type as placeholder.
+ // (2) Whether or not we cache hash codes. Caching hash codes is
+ // meaningless if we have a ranged hash function.
+ // We also put the key extraction and equality comparison function
+ // objects here, for convenience.
+
+ // Primary template: unused except as a hook for specializations.
+
+ template<typename Key, typename Value,
+ typename ExtractKey, typename Equal,
+ typename H1, typename H2, typename H,
+ bool cache_hash_code>
+ struct hash_code_base;
+
+ // Specialization: ranged hash function, no caching hash codes. H1
+ // and H2 are provided but ignored. We define a dummy hash code type.
+ template<typename Key, typename Value,
+ typename ExtractKey, typename Equal,
+ typename H1, typename H2, typename H>
+ struct hash_code_base<Key, Value, ExtractKey, Equal, H1, H2, H, false>
+ {
+ protected:
+ hash_code_base(const ExtractKey& ex, const Equal& eq,
+ const H1&, const H2&, const H& h)
+ : m_extract(ex), m_eq(eq), m_ranged_hash(h) { }
+
+ typedef void* hash_code_t;
+
+ hash_code_t
+ m_hash_code(const Key& k) const
+ { return 0; }
+
+ std::size_t
+ bucket_index(const Key& k, hash_code_t, std::size_t N) const
+ { return m_ranged_hash (k, N); }
-// Specialization: ranged hash function, cache hash codes. This
-// combination is meaningless, so we provide only a declaration
-// and no definition.
+ std::size_t
+ bucket_index(const hash_node<Value, false>* p, std::size_t N) const
+ { return m_ranged_hash (m_extract (p->m_v), N); }
+
+ bool
+ compare(const Key& k, hash_code_t, hash_node<Value, false>* n) const
+ { return m_eq (k, m_extract(n->m_v)); }
+
+ void
+ copy_code(hash_node<Value, false>*, const hash_node<Value, false>*) const
+ { }
+
+ void
+ m_swap(hash_code_base& x)
+ {
+ m_extract.m_swap(x);
+ m_eq.m_swap(x);
+ m_ranged_hash.m_swap(x);
+ }
-template <typename Key, typename Value,
- typename ExtractKey, typename Equal,
- typename H1, typename H2, typename H>
-struct hash_code_base <Key, Value, ExtractKey, Equal, H1, H2, H, true>;
+ protected:
+ ExtractKey m_extract;
+ Equal m_eq;
+ H m_ranged_hash;
+ };
-// Specialization: hash function and range-hashing function, no
-// caching of hash codes. H is provided but ignored. Provides
-// typedef and accessor required by TR1.
+ // No specialization for ranged hash function while caching hash codes.
+ // That combination is meaningless, and trying to do it is an error.
+
+
+ // Specialization: ranged hash function, cache hash codes. This
+ // combination is meaningless, so we provide only a declaration
+ // and no definition.
+
+ template<typename Key, typename Value,
+ typename ExtractKey, typename Equal,
+ typename H1, typename H2, typename H>
+ struct hash_code_base<Key, Value, ExtractKey, Equal, H1, H2, H, true>;
-template <typename Key, typename Value,
- typename ExtractKey, typename Equal,
- typename H1, typename H2>
-struct hash_code_base <Key, Value, ExtractKey, Equal, H1, H2, default_ranged_hash, false>
-{
- typedef H1 hasher;
- hasher hash_function() const { return m_h1; }
-
-protected:
- hash_code_base (const ExtractKey& ex, const Equal& eq,
- const H1& h1, const H2& h2, const default_ranged_hash&)
- : m_extract(ex), m_eq(eq), m_h1(h1), m_h2(h2) { }
-
- typedef std::size_t hash_code_t;
- hash_code_t m_hash_code (const Key& k) const { return m_h1(k); }
- std::size_t bucket_index (const Key&, hash_code_t c, std::size_t N) const
- { return m_h2 (c, N); }
- std::size_t bucket_index (const hash_node<Value, false>* p, std::size_t N) const {
- return m_h2 (m_h1 (m_extract (p->m_v)), N);
- }
- bool compare (const Key& k, hash_code_t, hash_node<Value, false>* n) const
- { return m_eq (k, m_extract(n->m_v)); }
+ // Specialization: hash function and range-hashing function, no
+ // caching of hash codes. H is provided but ignored. Provides
+ // typedef and accessor required by TR1.
+
+ template<typename Key, typename Value,
+ typename ExtractKey, typename Equal,
+ typename H1, typename H2>
+ struct hash_code_base<Key, Value, ExtractKey, Equal, H1, H2,
+ default_ranged_hash, false>
+ {
+ typedef H1 hasher;
+
+ hasher
+ hash_function() const
+ { return m_h1; }
+
+ protected:
+ hash_code_base(const ExtractKey& ex, const Equal& eq,
+ const H1& h1, const H2& h2, const default_ranged_hash&)
+ : m_extract(ex), m_eq(eq), m_h1(h1), m_h2(h2) { }
+
+ typedef std::size_t hash_code_t;
+
+ hash_code_t
+ m_hash_code(const Key& k) const
+ { return m_h1(k); }
+
+ std::size_t
+ bucket_index(const Key&, hash_code_t c, std::size_t N) const
+ { return m_h2 (c, N); }
+
+ std::size_t
+ bucket_index(const hash_node<Value, false>* p, std::size_t N) const
+ { return m_h2 (m_h1 (m_extract (p->m_v)), N); }
+
+ bool
+ compare(const Key& k, hash_code_t, hash_node<Value, false>* n) const
+ { return m_eq (k, m_extract(n->m_v)); }
+
+ void
+ copy_code(hash_node<Value, false>*, const hash_node<Value, false>*) const
+ { }
+
+ void
+ m_swap(hash_code_base& x)
+ {
+ m_extract.m_swap(x);
+ m_eq.m_swap(x);
+ m_h1.m_swap(x);
+ m_h2.m_swap(x);
+ }
- void copy_code (hash_node<Value, false>*, const hash_node<Value, false>*) const { }
+ protected:
+ ExtractKey m_extract;
+ Equal m_eq;
+ H1 m_h1;
+ H2 m_h2;
+ };
+
+ // Specialization: hash function and range-hashing function,
+ // caching hash codes. H is provided but ignored. Provides
+ // typedef and accessor required by TR1.
+ template<typename Key, typename Value,
+ typename ExtractKey, typename Equal,
+ typename H1, typename H2>
+ struct hash_code_base<Key, Value, ExtractKey, Equal, H1, H2,
+ default_ranged_hash, true>
+ {
+ typedef H1 hasher;
+
+ hasher
+ hash_function() const
+ { return m_h1; }
+
+ protected:
+ hash_code_base(const ExtractKey& ex, const Equal& eq,
+ const H1& h1, const H2& h2, const default_ranged_hash&)
+ : m_extract(ex), m_eq(eq), m_h1(h1), m_h2(h2) { }
+
+ typedef std::size_t hash_code_t;
+
+ hash_code_t
+ m_hash_code (const Key& k) const
+ { return m_h1(k); }
+
+ std::size_t
+ bucket_index(const Key&, hash_code_t c, std::size_t N) const
+ { return m_h2 (c, N); }
+
+ std::size_t
+ bucket_index(const hash_node<Value, true>* p, std::size_t N) const
+ { return m_h2 (p->hash_code, N); }
+
+ bool
+ compare(const Key& k, hash_code_t c, hash_node<Value, true>* n) const
+ { return c == n->hash_code && m_eq(k, m_extract(n->m_v)); }
+
+ void
+ copy_code(hash_node<Value, true>* to,
+ const hash_node<Value, true>* from) const
+ { to->hash_code = from->hash_code; }
+
+ void
+ m_swap(hash_code_base& x)
+ {
+ m_extract.m_swap(x);
+ m_eq.m_swap(x);
+ m_h1.m_swap(x);
+ m_h2.m_swap(x);
+ }
+
+ protected:
+ ExtractKey m_extract;
+ Equal m_eq;
+ H1 m_h1;
+ H2 m_h2;
+ };
- void m_swap(hash_code_base& x) {
- m_extract.m_swap(x);
- m_eq.m_swap(x);
- m_h1.m_swap(x);
- m_h2.m_swap(x);
- }
+} // namespace internal
-protected:
- ExtractKey m_extract;
- Equal m_eq;
- H1 m_h1;
- H2 m_h2;
-};
-
-// Specialization: hash function and range-hashing function,
-// caching hash codes. H is provided but ignored. Provides
-// typedef and accessor required by TR1.
-template <typename Key, typename Value,
- typename ExtractKey, typename Equal,
- typename H1, typename H2>
-struct hash_code_base <Key, Value, ExtractKey, Equal, H1, H2, default_ranged_hash, true>
+namespace std
+{
+namespace tr1
{
- typedef H1 hasher;
- hasher hash_function() const { return m_h1; }
-
-protected:
- hash_code_base (const ExtractKey& ex, const Equal& eq,
- const H1& h1, const H2& h2, const default_ranged_hash&)
- : m_extract(ex), m_eq(eq), m_h1(h1), m_h2(h2) { }
-
- typedef std::size_t hash_code_t;
- hash_code_t m_hash_code (const Key& k) const { return m_h1(k); }
- std::size_t bucket_index (const Key&, hash_code_t c, std::size_t N) const
- { return m_h2 (c, N); }
-
- std::size_t bucket_index (const hash_node<Value, true>* p, std::size_t N) const {
- return m_h2 (p->hash_code, N);
- }
-
- bool compare (const Key& k, hash_code_t c, hash_node<Value, true>* n) const
- { return c == n->hash_code && m_eq (k, m_extract(n->m_v)); }
+ //----------------------------------------------------------------------
+ // Class template hashtable, class definition.
+
+ // Meaning of class template hashtable's template parameters
+
+ // Key and Value: arbitrary CopyConstructible types.
+
+ // Allocator: an allocator type ([lib.allocator.requirements]) whose
+ // value type is Value.
+
+ // ExtractKey: function object that takes a object of type Value
+ // and returns a value of type Key.
+
+ // Equal: function object that takes two objects of type k and returns
+ // a bool-like value that is true if the two objects are considered equal.
+
+ // H1: the hash function. A unary function object with argument type
+ // Key and result type size_t. Return values should be distributed
+ // over the entire range [0, numeric_limits<size_t>:::max()].
+
+ // H2: the range-hashing function (in the terminology of Tavori and
+ // Dreizin). A binary function object whose argument types and result
+ // type are all size_t. Given arguments r and N, the return value is
+ // in the range [0, N).
+
+ // H: the ranged hash function (Tavori and Dreizin). A binary function
+ // whose argument types are Key and size_t and whose result type is
+ // size_t. Given arguments k and N, the return value is in the range
+ // [0, N). Default: h(k, N) = h2(h1(k), N). If H is anything other
+ // than the default, H1 and H2 are ignored.
+
+ // RehashPolicy: Policy class with three members, all of which govern
+ // the bucket count. n_bkt(n) returns a bucket count no smaller
+ // than n. bkt_for_elements(n) returns a bucket count appropriate
+ // for an element count of n. need_rehash(n_bkt, n_elt, n_ins)
+ // determines whether, if the current bucket count is n_bkt and the
+ // current element count is n_elt, we need to increase the bucket
+ // count. If so, returns make_pair(true, n), where n is the new
+ // bucket count. If not, returns make_pair(false, <anything>).
+
+ // ??? Right now it is hard-wired that the number of buckets never
+ // shrinks. Should we allow RehashPolicy to change that?
+
+ // cache_hash_code: bool. true if we store the value of the hash
+ // function along with the value. This is a time-space tradeoff.
+ // Storing it may improve lookup speed by reducing the number of times
+ // we need to call the Equal function.
+
+ // mutable_iterators: bool. true if hashtable::iterator is a mutable
+ // iterator, false if iterator and const_iterator are both const
+ // iterators. This is true for unordered_map and unordered_multimap,
+ // false for unordered_set and unordered_multiset.
+
+ // unique_keys: bool. true if the return value of hashtable::count(k)
+ // is always at most one, false if it may be an arbitrary number. This
+ // true for unordered_set and unordered_map, false for unordered_multiset
+ // and unordered_multimap.
+
+ template<typename Key, typename Value,
+ typename Allocator,
+ typename ExtractKey, typename Equal,
+ typename H1, typename H2,
+ typename H, typename RehashPolicy,
+ bool cache_hash_code,
+ bool mutable_iterators,
+ bool unique_keys>
+ class hashtable
+ : public Internal::rehash_base<RehashPolicy,
+ hashtable<Key, Value, Allocator, ExtractKey,
+ Equal, H1, H2, H, RehashPolicy,
+ cache_hash_code, mutable_iterators,
+ unique_keys> >,
+ public Internal::hash_code_base<Key, Value, ExtractKey, Equal, H1, H2, H,
+ cache_hash_code>,
+ public Internal::map_base<Key, Value, ExtractKey, unique_keys,
+ hashtable<Key, Value, Allocator, ExtractKey,
+ Equal, H1, H2, H, RehashPolicy,
+ cache_hash_code, mutable_iterators,
+ unique_keys> >
+ {
+ public:
+ typedef Allocator allocator_type;
+ typedef Value value_type;
+ typedef Key key_type;
+ typedef Equal key_equal;
+ // mapped_type, if present, comes from map_base.
+ // hasher, if present, comes from hash_code_base.
+ typedef typename Allocator::difference_type difference_type;
+ typedef typename Allocator::size_type size_type;
+ typedef typename Allocator::reference reference;
+ typedef typename Allocator::const_reference const_reference;
+
+ typedef Internal::node_iterator<value_type, !mutable_iterators,
+ cache_hash_code>
+ local_iterator;
+ typedef Internal::node_iterator<value_type, false, cache_hash_code>
+ const_local_iterator;
+
+ typedef Internal::hashtable_iterator<value_type, !mutable_iterators,
+ cache_hash_code>
+ iterator;
+ typedef Internal::hashtable_iterator<value_type, false, cache_hash_code>
+ const_iterator;
+
+ private:
+ typedef Internal::hash_node<Value, cache_hash_code> node;
+ typedef typename Allocator::template rebind<node>::other
+ node_allocator_t;
+ typedef typename Allocator::template rebind<node*>::other
+ bucket_allocator_t;
+
+ private:
+ node_allocator_t m_node_allocator;
+ node** m_buckets;
+ size_type m_bucket_count;
+ size_type m_element_count;
+ RehashPolicy m_rehash_policy;
+
+ node*
+ m_allocate_node(const value_type& v);
+
+ void
+ m_deallocate_node(node* n);
+
+ void
+ m_deallocate_nodes(node**, size_type);
- void copy_code (hash_node<Value, true>* to, const hash_node<Value, true>* from) const
- { to->hash_code = from->hash_code; }
+ node**
+ m_allocate_buckets(size_type n);
+
+ void
+ m_deallocate_buckets(node**, size_type n);
+
+ public: // Constructor, destructor, assignment, swap
+ hashtable(size_type bucket_hint,
+ const H1&, const H2&, const H&,
+ const Equal&, const ExtractKey&,
+ const allocator_type&);
+
+ template<typename InIter>
+ hashtable(InIter first, InIter last,
+ size_type bucket_hint,
+ const H1&, const H2&, const H&,
+ const Equal&, const ExtractKey&,
+ const allocator_type&);
+
+ hashtable(const hashtable&);
+
+ hashtable&
+ operator=(const hashtable&);
+
+ ~hashtable();
+
+ void swap(hashtable&);
+
+ public: // Basic container operations
+ iterator
+ begin()
+ {
+ iterator i(m_buckets);
+ if (!i.m_cur_node)
+ i.m_incr_bucket();
+ return i;
+ }
- void m_swap(hash_code_base& x) {
- m_extract.m_swap(x);
- m_eq.m_swap(x);
- m_h1.m_swap(x);
- m_h2.m_swap(x);
- }
+ const_iterator
+ begin() const
+ {
+ const_iterator i(m_buckets);
+ if (!i.m_cur_node)
+ i.m_incr_bucket();
+ return i;
+ }
-protected:
- ExtractKey m_extract;
- Equal m_eq;
- H1 m_h1;
- H2 m_h2;
-};
+ iterator
+ end()
+ { return iterator(m_buckets + m_bucket_count); }
-} // namespace internal
+ const_iterator
+ end() const
+ { return const_iterator(m_buckets + m_bucket_count); }
-namespace std { namespace tr1 {
+ size_type
+ size() const
+ { return m_element_count; }
+
+ bool
+ empty() const
+ { return size() == 0; }
-//----------------------------------------------------------------------
-// Class template hashtable, class definition.
-
-// Meaning of class template hashtable's template parameters
-
-// Key and Value: arbitrary CopyConstructible types.
-
-// Allocator: an allocator type ([lib.allocator.requirements]) whose
-// value type is Value.
-
-// ExtractKey: function object that takes a object of type Value
-// and returns a value of type Key.
-
-// Equal: function object that takes two objects of type k and returns
-// a bool-like value that is true if the two objects are considered equal.
-
-// H1: the hash function. A unary function object with argument type
-// Key and result type size_t. Return values should be distributed
-// over the entire range [0, numeric_limits<size_t>:::max()].
-
-// H2: the range-hashing function (in the terminology of Tavori and
-// Dreizin). A binary function object whose argument types and result
-// type are all size_t. Given arguments r and N, the return value is
-// in the range [0, N).
-
-// H: the ranged hash function (Tavori and Dreizin). A binary function
-// whose argument types are Key and size_t and whose result type is
-// size_t. Given arguments k and N, the return value is in the range
-// [0, N). Default: h(k, N) = h2(h1(k), N). If H is anything other
-// than the default, H1 and H2 are ignored.
-
-// RehashPolicy: Policy class with three members, all of which govern
-// the bucket count. n_bkt(n) returns a bucket count no smaller
-// than n. bkt_for_elements(n) returns a bucket count appropriate
-// for an element count of n. need_rehash(n_bkt, n_elt, n_ins)
-// determines whether, if the current bucket count is n_bkt and the
-// current element count is n_elt, we need to increase the bucket
-// count. If so, returns make_pair(true, n), where n is the new
-// bucket count. If not, returns make_pair(false, <anything>).
-
-// ??? Right now it is hard-wired that the number of buckets never
-// shrinks. Should we allow RehashPolicy to change that?
-
-// cache_hash_code: bool. true if we store the value of the hash
-// function along with the value. This is a time-space tradeoff.
-// Storing it may improve lookup speed by reducing the number of times
-// we need to call the Equal function.
-
-// mutable_iterators: bool. true if hashtable::iterator is a mutable
-// iterator, false if iterator and const_iterator are both const
-// iterators. This is true for unordered_map and unordered_multimap,
-// false for unordered_set and unordered_multiset.
-
-// unique_keys: bool. true if the return value of hashtable::count(k)
-// is always at most one, false if it may be an arbitrary number. This
-// true for unordered_set and unordered_map, false for unordered_multiset
-// and unordered_multimap.
-
-template <typename Key, typename Value,
- typename Allocator,
- typename ExtractKey, typename Equal,
- typename H1, typename H2,
- typename H, typename RehashPolicy,
- bool cache_hash_code,
- bool mutable_iterators,
- bool unique_keys>
-class hashtable
- : public Internal::rehash_base<RehashPolicy, hashtable<Key, Value, Allocator, ExtractKey, Equal, H1, H2, H, RehashPolicy, cache_hash_code, mutable_iterators, unique_keys> >,
- public Internal::hash_code_base<Key, Value, ExtractKey, Equal, H1, H2, H, cache_hash_code>,
- public Internal::map_base<Key, Value, ExtractKey, unique_keys, hashtable<Key, Value, Allocator, ExtractKey, Equal, H1, H2, H, RehashPolicy, cache_hash_code, mutable_iterators, unique_keys> >
-{
-public:
- typedef Allocator allocator_type;
- typedef Value value_type;
- typedef Key key_type;
- typedef Equal key_equal;
- // mapped_type, if present, comes from map_base.
- // hasher, if present, comes from hash_code_base.
- typedef typename Allocator::difference_type difference_type;
- typedef typename Allocator::size_type size_type;
- typedef typename Allocator::reference reference;
- typedef typename Allocator::const_reference const_reference;
-
- typedef Internal::node_iterator<value_type, !mutable_iterators, cache_hash_code>
- local_iterator;
- typedef Internal::node_iterator<value_type, false, cache_hash_code>
- const_local_iterator;
-
- typedef Internal::hashtable_iterator<value_type, !mutable_iterators, cache_hash_code>
- iterator;
- typedef Internal::hashtable_iterator<value_type, false, cache_hash_code>
- const_iterator;
-
-private:
- typedef Internal::hash_node<Value, cache_hash_code> node;
- typedef typename Allocator::template rebind<node>::other node_allocator_t;
- typedef typename Allocator::template rebind<node*>::other bucket_allocator_t;
-
-private:
- node_allocator_t m_node_allocator;
- node** m_buckets;
- size_type m_bucket_count;
- size_type m_element_count;
- RehashPolicy m_rehash_policy;
-
- node* m_allocate_node (const value_type& v);
- void m_deallocate_node (node* n);
- void m_deallocate_nodes (node**, size_type);
-
- node** m_allocate_buckets (size_type n);
- void m_deallocate_buckets (node**, size_type n);
-
-public: // Constructor, destructor, assignment, swap
- hashtable(size_type bucket_hint,
- const H1&, const H2&, const H&,
- const Equal&, const ExtractKey&,
- const allocator_type&);
+ allocator_type
+ get_allocator() const
+ { return m_node_allocator; }
- template <typename InIter>
- hashtable(InIter first, InIter last,
- size_type bucket_hint,
- const H1&, const H2&, const H&,
- const Equal&, const ExtractKey&,
- const allocator_type&);
+ size_type
+ max_size() const
+ { return m_node_allocator.max_size(); }
+
+ public: // Bucket operations
+ size_type
+ bucket_count() const
+ { return m_bucket_count; }
- hashtable(const hashtable&);
- hashtable& operator=(const hashtable&);
- ~hashtable();
-
- void swap(hashtable&);
-
-public: // Basic container operations
- iterator begin() {
- iterator i(m_buckets);
- if (!i.m_cur_node)
- i.m_incr_bucket();
- return i;
- }
-
- const_iterator begin() const {
- const_iterator i(m_buckets);
- if (!i.m_cur_node)
- i.m_incr_bucket();
- return i;
- }
+ size_type
+ max_bucket_count() const
+ { return max_size(); }
+
+ size_type
+ bucket_size(size_type n) const
+ { return std::distance(begin(n), end(n)); }
+
+ size_type bucket(const key_type& k) const
+ {
+ return this->bucket_index(k, this->m_hash_code, this->m_bucket_count);
+ }
- iterator end()
- { return iterator(m_buckets + m_bucket_count); }
- const_iterator end() const
- { return const_iterator(m_buckets + m_bucket_count); }
-
- size_type size() const { return m_element_count; }
- bool empty() const { return size() == 0; }
-
- allocator_type get_allocator() const { return m_node_allocator; }
- size_type max_size() const { return m_node_allocator.max_size(); }
-
-public: // Bucket operations
- size_type bucket_count() const
- { return m_bucket_count; }
- size_type max_bucket_count() const
- { return max_size(); }
- size_type bucket_size (size_type n) const
- { return std::distance(begin(n), end(n)); }
- size_type bucket (const key_type& k) const
- { return this->bucket_index (k, this->m_hash_code, this->m_bucket_count); }
-
- local_iterator begin(size_type n)
- { return local_iterator(m_buckets[n]); }
- local_iterator end(size_type n)
- { return local_iterator(0); }
- const_local_iterator begin(size_type n) const
- { return const_local_iterator(m_buckets[n]); }
- const_local_iterator end(size_type n) const
- { return const_local_iterator(0); }
-
- float load_factor() const
- { return static_cast<float>(size()) / static_cast<float>(bucket_count()); }
- // max_load_factor, if present, comes from rehash_base.
-
- // Generalization of max_load_factor. Extension, not found in TR1. Only
- // useful if RehashPolicy is something other than the default.
- const RehashPolicy& rehash_policy() const { return m_rehash_policy; }
- void rehash_policy (const RehashPolicy&);
-
-public: // lookup
- iterator find(const key_type&);
- const_iterator find(const key_type& k) const;
- size_type count(const key_type& k) const;
- std::pair<iterator, iterator> equal_range(const key_type& k);
- std::pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
-
-private: // Insert and erase helper functions
- // ??? This dispatching is a workaround for the fact that we don't
- // have partial specialization of member templates; it would be
- // better to just specialize insert on unique_keys. There may be a
- // cleaner workaround.
- typedef typename Internal::IF<unique_keys, std::pair<iterator, bool>, iterator>::type
- Insert_Return_Type;
-
- node* find_node (node* p, const key_type& k, typename hashtable::hash_code_t c);
-
- std::pair<iterator, bool> insert (const value_type&, std::tr1::true_type);
- iterator insert (const value_type&, std::tr1::false_type);
-
-public: // Insert and erase
- Insert_Return_Type insert (const value_type& v)
- { return this->insert (v, std::tr1::integral_constant<bool, unique_keys>()); }
- Insert_Return_Type insert (const_iterator, const value_type& v)
- { return this->insert(v); }
-
- template <typename InIter> void insert(InIter first, InIter last);
-
- void erase(const_iterator);
- size_type erase(const key_type&);
- void erase(const_iterator, const_iterator);
- void clear();
-
-public:
- // Set number of buckets to be apropriate for container of n element.
- void rehash (size_type n);
-
-private:
- // Unconditionally change size of bucket array to n.
- void m_rehash (size_type n);
-};
+ local_iterator
+ begin(size_type n)
+ { return local_iterator(m_buckets[n]); }
+
+ local_iterator
+ end(size_type n)
+ { return local_iterator(0); }
+
+ const_local_iterator
+ begin(size_type n) const
+ { return const_local_iterator(m_buckets[n]); }
+
+ const_local_iterator
+ end(size_type n) const
+ { return const_local_iterator(0); }
+
+ float
+ load_factor() const
+ {
+ return static_cast<float>(size()) / static_cast<float>(bucket_count());
+ }
+ // max_load_factor, if present, comes from rehash_base.
+
+ // Generalization of max_load_factor. Extension, not found in TR1. Only
+ // useful if RehashPolicy is something other than the default.
+ const RehashPolicy&
+ rehash_policy() const
+ { return m_rehash_policy; }
+
+ void
+ rehash_policy(const RehashPolicy&);
+
+ public: // lookup
+ iterator
+ find(const key_type&);
+
+ const_iterator
+ find(const key_type& k) const;
+
+ size_type
+ count(const key_type& k) const;
+
+ std::pair<iterator, iterator>
+ equal_range(const key_type& k);
+
+ std::pair<const_iterator, const_iterator>
+ equal_range(const key_type& k) const;
+
+ private: // Insert and erase helper functions
+ // ??? This dispatching is a workaround for the fact that we don't
+ // have partial specialization of member templates; it would be
+ // better to just specialize insert on unique_keys. There may be a
+ // cleaner workaround.
+ typedef typename Internal::IF<unique_keys,
+ std::pair<iterator, bool>, iterator>::type
+ Insert_Return_Type;
+
+ node*
+ find_node(node* p, const key_type& k, typename hashtable::hash_code_t c);
+
+ std::pair<iterator, bool>
+ insert(const value_type&, std::tr1::true_type);
+
+ iterator
+ insert
+ (const value_type&, std::tr1::false_type);
+
+ public: // Insert and erase
+ Insert_Return_Type
+ insert(const value_type& v)
+ {
+ return this->insert(v, std::tr1::integral_constant<bool,
+ unique_keys>());
+ }
+
+ Insert_Return_Type
+ insert(const_iterator, const value_type& v)
+ { return this->insert(v); }
-//----------------------------------------------------------------------
-// Definitions of class template hashtable's out-of-line member functions.
-
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-typename hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::node*
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::m_allocate_node (const value_type& v)
-{
- node* n = m_node_allocator.allocate(1);
- try {
- get_allocator().construct(&n->m_v, v);
- n->m_next = 0;
- return n;
- }
- catch(...) {
- m_node_allocator.deallocate(n, 1);
- throw;
- }
-}
+ template<typename InIter>
+ void
+ insert(InIter first, InIter last);
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-void
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::m_deallocate_node (node* n)
-{
- get_allocator().destroy(&n->m_v);
- m_node_allocator.deallocate(n, 1);
-}
+ void
+ erase(const_iterator);
+
+ size_type
+ erase(const key_type&);
+
+ void
+ erase(const_iterator, const_iterator);
+
+ void
+ clear();
+
+ public:
+ // Set number of buckets to be apropriate for container of n element.
+ void rehash (size_type n);
+
+ private:
+ // Unconditionally change size of bucket array to n.
+ void m_rehash (size_type n);
+ };
+
+ //----------------------------------------------------------------------
+ // Definitions of class template hashtable's out-of-line member functions.
+
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ typename hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::node*
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ m_allocate_node(const value_type& v)
+ {
+ node* n = m_node_allocator.allocate(1);
+ try
+ {
+ get_allocator().construct(&n->m_v, v);
+ n->m_next = 0;
+ return n;
+ }
+ catch(...)
+ {
+ m_node_allocator.deallocate(n, 1);
+ throw;
+ }
+ }
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-void
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>
-::m_deallocate_nodes (node** array, size_type n)
-{
- for (size_type i = 0; i < n; ++i) {
- node* p = array[i];
- while (p) {
- node* tmp = p;
- p = p->m_next;
- m_deallocate_node (tmp);
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ void
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ m_deallocate_node(node* n)
+ {
+ get_allocator().destroy(&n->m_v);
+ m_node_allocator.deallocate(n, 1);
}
- array[i] = 0;
- }
-}
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-typename hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::node**
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::m_allocate_buckets (size_type n)
-{
- bucket_allocator_t alloc(m_node_allocator);
-
- // We allocate one extra bucket to hold a sentinel, an arbitrary
- // non-null pointer. Iterator increment relies on this.
- node** p = alloc.allocate(n+1);
- std::fill(p, p+n, (node*) 0);
- p[n] = reinterpret_cast<node*>(0x1000);
- return p;
-}
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ void
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ m_deallocate_nodes(node** array, size_type n)
+ {
+ for (size_type i = 0; i < n; ++i)
+ {
+ node* p = array[i];
+ while (p)
+ {
+ node* tmp = p;
+ p = p->m_next;
+ m_deallocate_node (tmp);
+ }
+ array[i] = 0;
+ }
+ }
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-void
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>
-::m_deallocate_buckets (node** p, size_type n)
-{
- bucket_allocator_t alloc(m_node_allocator);
- alloc.deallocate(p, n+1);
-}
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ typename hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::node**
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ m_allocate_buckets(size_type n)
+ {
+ bucket_allocator_t alloc(m_node_allocator);
+
+ // We allocate one extra bucket to hold a sentinel, an arbitrary
+ // non-null pointer. Iterator increment relies on this.
+ node** p = alloc.allocate(n+1);
+ std::fill(p, p+n, (node*) 0);
+ p[n] = reinterpret_cast<node*>(0x1000);
+ return p;
+ }
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>
-::hashtable(size_type bucket_hint,
- const H1& h1, const H2& h2, const H& h,
- const Eq& eq, const Ex& exk,
- const allocator_type& a)
- : Internal::rehash_base<RP,hashtable> (),
- Internal::hash_code_base<K,V,Ex,Eq,H1,H2,H,c> (exk, eq, h1, h2, h),
- Internal::map_base<K,V,Ex,u,hashtable> (),
- m_node_allocator(a),
- m_bucket_count (0),
- m_element_count (0),
- m_rehash_policy ()
-{
- m_bucket_count = m_rehash_policy.next_bkt(bucket_hint);
- m_buckets = m_allocate_buckets (m_bucket_count);
-}
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ void
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ m_deallocate_buckets(node** p, size_type n)
+ {
+ bucket_allocator_t alloc(m_node_allocator);
+ alloc.deallocate(p, n+1);
+ }
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-template <typename InIter>
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>
-::hashtable(InIter f, InIter l,
- size_type bucket_hint,
- const H1& h1, const H2& h2, const H& h,
- const Eq& eq, const Ex& exk,
- const allocator_type& a)
- : Internal::rehash_base<RP,hashtable> (),
- Internal::hash_code_base<K,V,Ex,Eq,H1,H2,H,c> (exk, eq, h1, h2, h),
- Internal::map_base<K,V,Ex,u,hashtable> (),
- m_node_allocator(a),
- m_bucket_count (0),
- m_element_count (0),
- m_rehash_policy ()
-{
- m_bucket_count = std::max(m_rehash_policy.next_bkt(bucket_hint),
- m_rehash_policy.bkt_for_elements(Internal::distance_fw(f, l)));
- m_buckets = m_allocate_buckets (m_bucket_count);
- try {
- for (; f != l; ++f)
- this->insert (*f);
- }
- catch(...) {
- clear();
- m_deallocate_buckets (m_buckets, m_bucket_count);
- throw;
- }
-}
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ hashtable(size_type bucket_hint,
+ const H1& h1, const H2& h2, const H& h,
+ const Eq& eq, const Ex& exk,
+ const allocator_type& a)
+ : Internal::rehash_base<RP,hashtable>(),
+ Internal::hash_code_base<K, V, Ex, Eq, H1, H2, H, c>(exk, eq, h1, h2, h),
+ Internal::map_base<K, V, Ex, u, hashtable>(),
+ m_node_allocator(a),
+ m_bucket_count(0),
+ m_element_count(0),
+ m_rehash_policy()
+ {
+ m_bucket_count = m_rehash_policy.next_bkt(bucket_hint);
+ m_buckets = m_allocate_buckets(m_bucket_count);
+ }
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>
-::hashtable(const hashtable& ht)
- : Internal::rehash_base<RP,hashtable> (ht),
- Internal::hash_code_base<K,V,Ex,Eq,H1,H2,H,c> (ht),
- Internal::map_base<K,V,Ex,u,hashtable> (ht),
- m_node_allocator(ht.get_allocator()),
- m_bucket_count (ht.m_bucket_count),
- m_element_count (ht.m_element_count),
- m_rehash_policy (ht.m_rehash_policy)
-{
- m_buckets = m_allocate_buckets (m_bucket_count);
- try {
- for (size_t i = 0; i < ht.m_bucket_count; ++i) {
- node* n = ht.m_buckets[i];
- node** tail = m_buckets + i;
- while (n) {
- *tail = m_allocate_node (n);
- (*tail).copy_code_from (n);
- tail = &((*tail)->m_next);
- n = n->m_next;
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ template<typename InIter>
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ hashtable(InIter f, InIter l,
+ size_type bucket_hint,
+ const H1& h1, const H2& h2, const H& h,
+ const Eq& eq, const Ex& exk,
+ const allocator_type& a)
+ : Internal::rehash_base<RP,hashtable>(),
+ Internal::hash_code_base<K, V, Ex, Eq, H1, H2, H, c> (exk, eq,
+ h1, h2, h),
+ Internal::map_base<K,V,Ex,u,hashtable>(),
+ m_node_allocator(a),
+ m_bucket_count (0),
+ m_element_count(0),
+ m_rehash_policy()
+ {
+ m_bucket_count = std::max(m_rehash_policy.next_bkt(bucket_hint),
+ m_rehash_policy.
+ bkt_for_elements(Internal::
+ distance_fw(f, l)));
+ m_buckets = m_allocate_buckets(m_bucket_count);
+ try
+ {
+ for (; f != l; ++f)
+ this->insert(*f);
+ }
+ catch(...)
+ {
+ clear();
+ m_deallocate_buckets(m_buckets, m_bucket_count);
+ throw;
+ }
}
+
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ hashtable(const hashtable& ht)
+ : Internal::rehash_base<RP, hashtable>(ht),
+ Internal::hash_code_base<K, V, Ex, Eq, H1, H2, H, c>(ht),
+ Internal::map_base<K, V, Ex, u, hashtable>(ht),
+ m_node_allocator(ht.get_allocator()),
+ m_bucket_count(ht.m_bucket_count),
+ m_element_count(ht.m_element_count),
+ m_rehash_policy(ht.m_rehash_policy)
+ {
+ m_buckets = m_allocate_buckets (m_bucket_count);
+ try
+ {
+ for (size_t i = 0; i < ht.m_bucket_count; ++i)
+ {
+ node* n = ht.m_buckets[i];
+ node** tail = m_buckets + i;
+ while (n)
+ {
+ *tail = m_allocate_node(n);
+ (*tail).copy_code_from(n);
+ tail = &((*tail)->m_next);
+ n = n->m_next;
+ }
+ }
+ }
+ catch (...)
+ {
+ clear();
+ m_deallocate_buckets (m_buckets, m_bucket_count);
+ throw;
+ }
}
- }
- catch (...) {
- clear();
- m_deallocate_buckets (m_buckets, m_bucket_count);
- throw;
- }
-}
-
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>&
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::operator= (const hashtable& ht)
-{
- hashtable tmp(ht);
- this->swap(tmp);
- return *this;
-}
-
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::~hashtable()
-{
- clear();
- m_deallocate_buckets(m_buckets, m_bucket_count);
-}
-
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-void hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::swap (hashtable& x)
-{
- // The only base class with member variables is hash_code_base. We
- // define hash_code_base::m_swap because different specializations
- // have different members.
- Internal::hash_code_base<K, V, Ex, Eq, H1, H2, H, c>::m_swap(x);
-
- // open LWG issue 431
- // std::swap(m_node_allocator, x.m_node_allocator);
- std::swap (m_rehash_policy, x.m_rehash_policy);
- std::swap (m_buckets, x.m_buckets);
- std::swap (m_bucket_count, x.m_bucket_count);
- std::swap (m_element_count, x.m_element_count);
-}
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-void
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::rehash_policy (const RP& pol)
-{
- m_rehash_policy = pol;
- size_type n_bkt = pol.bkt_for_elements(m_element_count);
- if (n_bkt > m_bucket_count)
- m_rehash (n_bkt);
-}
-
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-typename hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::iterator
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::find (const key_type& k)
-{
- typename hashtable::hash_code_t code = this->m_hash_code (k);
- std::size_t n = this->bucket_index (k, code, this->bucket_count());
- node* p = find_node (m_buckets[n], k, code);
- return p ? iterator(p, m_buckets + n) : this->end();
-}
-
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-typename hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::const_iterator
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::find (const key_type& k) const
-{
- typename hashtable::hash_code_t code = this->m_hash_code (k);
- std::size_t n = this->bucket_index (k, code, this->bucket_count());
- node* p = find_node (m_buckets[n], k, code);
- return p ? const_iterator(p, m_buckets + n) : this->end();
-}
-
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-typename hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::size_type
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::count (const key_type& k) const
-{
- typename hashtable::hash_code_t code = this->m_hash_code (k);
- std::size_t n = this->bucket_index (k, code, this->bucket_count());
- size_t result = 0;
- for (node* p = m_buckets[n]; p ; p = p->m_next)
- if (this->compare (k, code, p))
- ++result;
- return result;
-}
-
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-std::pair<typename hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::iterator,
- typename hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::iterator>
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::equal_range (const key_type& k)
-{
- typename hashtable::hash_code_t code = this->m_hash_code (k);
- std::size_t n = this->bucket_index (k, code, this->bucket_count());
- node** head = m_buckets + n;
- node* p = find_node (*head, k, code);
-
- if (p) {
- node* p1 = p->m_next;
- for (; p1 ; p1 = p1->m_next)
- if (!this->compare (k, code, p1))
- break;
- iterator first(p, head);
- iterator last(p1, head);
- if (!p1)
- last.m_incr_bucket();
- return std::make_pair(first, last);
- }
- else
- return std::make_pair (this->end(), this->end());
-}
-
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-std::pair<typename hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::const_iterator,
- typename hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::const_iterator>
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::equal_range (const key_type& k) const
-{
- typename hashtable::hash_code_t code = this->m_hash_code (k);
- std::size_t n = this->bucket_index (k, code, this->bucket_count());
- node** head = m_buckets + n;
- node* p = find_node (*head, k, code);
-
- if (p) {
- node* p1 = p->m_next;
- for (; p1 ; p1 = p1->m_next)
- if (!this->compare (k, code, p1))
- break;
- const_iterator first(p, head);
- const_iterator last(p1, head);
- if (!p1)
- last.m_incr_bucket();
- return std::make_pair(first, last);
- }
- else
- return std::make_pair (this->end(), this->end());
-}
-
-// Find the node whose key compares equal to k, beginning the search
-// at p (usually the head of a bucket). Return nil if no node is found.
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-typename hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::node*
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>
-::find_node (node* p, const key_type& k, typename hashtable::hash_code_t code)
-{
- for ( ; p ; p = p->m_next)
- if (this->compare (k, code, p))
- return p;
- return false;
-}
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>&
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ operator=(const hashtable& ht)
+ {
+ hashtable tmp(ht);
+ this->swap(tmp);
+ return *this;
+ }
-// Insert v if no element with its key is already present.
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-std::pair<typename hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::iterator, bool>
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>
-::insert (const value_type& v, std::tr1::true_type)
-{
- const key_type& k = this->m_extract(v);
- typename hashtable::hash_code_t code = this->m_hash_code (k);
- size_type n = this->bucket_index (k, code, m_bucket_count);
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ ~hashtable()
+ {
+ clear();
+ m_deallocate_buckets(m_buckets, m_bucket_count);
+ }
- if (node* p = find_node (m_buckets[n], k, code))
- return std::make_pair(iterator(p, m_buckets + n), false);
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ void
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ swap(hashtable& x)
+ {
+ // The only base class with member variables is hash_code_base. We
+ // define hash_code_base::m_swap because different specializations
+ // have different members.
+ Internal::hash_code_base<K, V, Ex, Eq, H1, H2, H, c>::m_swap(x);
+
+ // open LWG issue 431
+ // std::swap(m_node_allocator, x.m_node_allocator);
+ std::swap(m_rehash_policy, x.m_rehash_policy);
+ std::swap(m_buckets, x.m_buckets);
+ std::swap(m_bucket_count, x.m_bucket_count);
+ std::swap(m_element_count, x.m_element_count);
+ }
- std::pair<bool, size_t> do_rehash
- = m_rehash_policy.need_rehash(m_bucket_count, m_element_count, 1);
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ void
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ rehash_policy(const RP& pol)
+ {
+ m_rehash_policy = pol;
+ size_type n_bkt = pol.bkt_for_elements(m_element_count);
+ if (n_bkt > m_bucket_count)
+ m_rehash (n_bkt);
+ }
- // Allocate the new node before doing the rehash so that we don't
- // do a rehash if the allocation throws.
- node* new_node = m_allocate_node (v);
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ typename hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::iterator
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ find(const key_type& k)
+ {
+ typename hashtable::hash_code_t code = this->m_hash_code (k);
+ std::size_t n = this->bucket_index(k, code, this->bucket_count());
+ node* p = find_node (m_buckets[n], k, code);
+ return p ? iterator(p, m_buckets + n) : this->end();
+ }
+
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ typename hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::const_iterator
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ find(const key_type& k) const
+ {
+ typename hashtable::hash_code_t code = this->m_hash_code (k);
+ std::size_t n = this->bucket_index(k, code, this->bucket_count());
+ node* p = find_node (m_buckets[n], k, code);
+ return p ? const_iterator(p, m_buckets + n) : this->end();
+ }
+
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ typename hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::size_type
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ count(const key_type& k) const
+ {
+ typename hashtable::hash_code_t code = this->m_hash_code (k);
+ std::size_t n = this->bucket_index (k, code, this->bucket_count());
+ size_t result = 0;
+ for (node* p = m_buckets[n]; p ; p = p->m_next)
+ if (this->compare (k, code, p))
+ ++result;
+ return result;
+ }
- try {
- if (do_rehash.first) {
- n = this->bucket_index (k, code, do_rehash.second);
- m_rehash(do_rehash.second);
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ std::pair<typename hashtable<K, V, A, Ex, Eq, H1,
+ H2, H, RP, c, m, u>::iterator,
+ typename hashtable<K, V, A, Ex, Eq, H1,
+ H2, H, RP, c, m, u>::iterator>
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ equal_range(const key_type& k)
+ {
+ typename hashtable::hash_code_t code = this->m_hash_code (k);
+ std::size_t n = this->bucket_index(k, code, this->bucket_count());
+ node** head = m_buckets + n;
+ node* p = find_node (*head, k, code);
+
+ if (p)
+ {
+ node* p1 = p->m_next;
+ for (; p1 ; p1 = p1->m_next)
+ if (!this->compare (k, code, p1))
+ break;
+
+ iterator first(p, head);
+ iterator last(p1, head);
+ if (!p1)
+ last.m_incr_bucket();
+ return std::make_pair(first, last);
+ }
+ else
+ return std::make_pair(this->end(), this->end());
}
- new_node->m_next = m_buckets[n];
- m_buckets[n] = new_node;
- ++m_element_count;
- return std::make_pair(iterator (new_node, m_buckets + n), true);
- }
- catch (...) {
- m_deallocate_node (new_node);
- throw;
- }
-}
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ std::pair<typename hashtable<K, V, A, Ex, Eq, H1,
+ H2, H, RP, c, m, u>::const_iterator,
+ typename hashtable<K, V, A, Ex, Eq, H1,
+ H2, H, RP, c, m, u>::const_iterator>
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ equal_range(const key_type& k) const
+ {
+ typename hashtable::hash_code_t code = this->m_hash_code (k);
+ std::size_t n = this->bucket_index(k, code, this->bucket_count());
+ node** head = m_buckets + n;
+ node* p = find_node (*head, k, code);
+
+ if (p)
+ {
+ node* p1 = p->m_next;
+ for (; p1 ; p1 = p1->m_next)
+ if (!this->compare (k, code, p1))
+ break;
+
+ const_iterator first(p, head);
+ const_iterator last(p1, head);
+ if (!p1)
+ last.m_incr_bucket();
+ return std::make_pair(first, last);
+ }
+ else
+ return std::make_pair(this->end(), this->end());
+ }
-// Insert v unconditionally.
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-typename hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::iterator
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>
-::insert (const value_type& v, std::tr1::false_type)
-{
- std::pair<bool, std::size_t> do_rehash
- = m_rehash_policy.need_rehash(m_bucket_count, m_element_count, 1);
- if (do_rehash.first)
- m_rehash(do_rehash.second);
-
- const key_type& k = this->m_extract(v);
- typename hashtable::hash_code_t code = this->m_hash_code (k);
- size_type n = this->bucket_index (k, code, m_bucket_count);
-
- node* new_node = m_allocate_node (v);
- node* prev = find_node (m_buckets[n], k, code);
- if (prev) {
- new_node->m_next = prev->m_next;
- prev->m_next = new_node;
- }
- else {
- new_node->m_next = m_buckets[n];
- m_buckets[n] = new_node;
- }
+ // Find the node whose key compares equal to k, beginning the search
+ // at p (usually the head of a bucket). Return nil if no node is found.
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ typename hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::node*
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ find_node(node* p, const key_type& k, typename hashtable::hash_code_t code)
+ {
+ for ( ; p ; p = p->m_next)
+ if (this->compare (k, code, p))
+ return p;
+ return false;
+ }
- ++m_element_count;
- return iterator (new_node, m_buckets + n);
-}
+ // Insert v if no element with its key is already present.
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ std::pair<typename hashtable<K, V, A, Ex, Eq, H1,
+ H2, H, RP, c, m, u>::iterator, bool>
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ insert(const value_type& v, std::tr1::true_type)
+ {
+ const key_type& k = this->m_extract(v);
+ typename hashtable::hash_code_t code = this->m_hash_code (k);
+ size_type n = this->bucket_index(k, code, m_bucket_count);
+
+ if (node* p = find_node(m_buckets[n], k, code))
+ return std::make_pair(iterator(p, m_buckets + n), false);
+
+ std::pair<bool, size_t> do_rehash
+ = m_rehash_policy.need_rehash(m_bucket_count, m_element_count, 1);
+
+ // Allocate the new node before doing the rehash so that we don't
+ // do a rehash if the allocation throws.
+ node* new_node = m_allocate_node (v);
+
+ try
+ {
+ if (do_rehash.first)
+ {
+ n = this->bucket_index(k, code, do_rehash.second);
+ m_rehash(do_rehash.second);
+ }
+
+ new_node->m_next = m_buckets[n];
+ m_buckets[n] = new_node;
+ ++m_element_count;
+ return std::make_pair(iterator(new_node, m_buckets + n), true);
+ }
+ catch (...)
+ {
+ m_deallocate_node (new_node);
+ throw;
+ }
+ }
+
+ // Insert v unconditionally.
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ typename hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::iterator
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ insert(const value_type& v, std::tr1::false_type)
+ {
+ std::pair<bool, std::size_t> do_rehash
+ = m_rehash_policy.need_rehash(m_bucket_count, m_element_count, 1);
+ if (do_rehash.first)
+ m_rehash(do_rehash.second);
+
+ const key_type& k = this->m_extract(v);
+ typename hashtable::hash_code_t code = this->m_hash_code (k);
+ size_type n = this->bucket_index(k, code, m_bucket_count);
+
+ node* new_node = m_allocate_node (v);
+ node* prev = find_node(m_buckets[n], k, code);
+ if (prev)
+ {
+ new_node->m_next = prev->m_next;
+ prev->m_next = new_node;
+ }
+ else
+ {
+ new_node->m_next = m_buckets[n];
+ m_buckets[n] = new_node;
+ }
+
+ ++m_element_count;
+ return iterator(new_node, m_buckets + n);
+ }
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-template <typename InIter>
-void
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::insert(InIter first, InIter last)
-{
- size_type n_elt = Internal::distance_fw (first, last);
- std::pair<bool, std::size_t> do_rehash
- = m_rehash_policy.need_rehash(m_bucket_count, m_element_count, n_elt);
- if (do_rehash.first)
- m_rehash(do_rehash.second);
-
- for (; first != last; ++first)
- this->insert (*first);
-}
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ template<typename InIter>
+ void
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ insert(InIter first, InIter last)
+ {
+ size_type n_elt = Internal::distance_fw (first, last);
+ std::pair<bool, std::size_t> do_rehash
+ = m_rehash_policy.need_rehash(m_bucket_count, m_element_count, n_elt);
+ if (do_rehash.first)
+ m_rehash(do_rehash.second);
+
+ for (; first != last; ++first)
+ this->insert (*first);
+ }
-// XXX We're following the TR in giving this a return type of void,
-// but that ought to change. The return type should be const_iterator,
-// and it should return the iterator following the one we've erased.
-// That would simplify range erase.
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-void hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::erase (const_iterator i)
-{
- node* p = i.m_cur_node;
- node* cur = *i.m_cur_bucket;
- if (cur == p)
- *i.m_cur_bucket = cur->m_next;
- else {
- node* next = cur->m_next;
- while (next != p) {
- cur = next;
- next = cur->m_next;
+ // XXX We're following the TR in giving this a return type of void,
+ // but that ought to change. The return type should be const_iterator,
+ // and it should return the iterator following the one we've erased.
+ // That would simplify range erase.
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ void
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ erase(const_iterator i)
+ {
+ node* p = i.m_cur_node;
+ node* cur = *i.m_cur_bucket;
+ if (cur == p)
+ *i.m_cur_bucket = cur->m_next;
+ else
+ {
+ node* next = cur->m_next;
+ while (next != p)
+ {
+ cur = next;
+ next = cur->m_next;
+ }
+ cur->m_next = next->m_next;
+ }
+
+ m_deallocate_node (p);
+ --m_element_count;
}
- cur->m_next = next->m_next;
- }
-
- m_deallocate_node (p);
- --m_element_count;
-}
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-typename hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::size_type
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::erase(const key_type& k)
-{
- typename hashtable::hash_code_t code = this->m_hash_code (k);
- size_type n = this->bucket_index (k, code, m_bucket_count);
-
- node** slot = m_buckets + n;
- while (*slot && ! this->compare (k, code, *slot))
- slot = &((*slot)->m_next);
-
- while (*slot && this->compare (k, code, *slot)) {
- node* n = *slot;
- *slot = n->m_next;
- m_deallocate_node (n);
- --m_element_count;
- }
-}
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ typename hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::size_type
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ erase(const key_type& k)
+ {
+ typename hashtable::hash_code_t code = this->m_hash_code (k);
+ size_type n = this->bucket_index(k, code, m_bucket_count);
+
+ node** slot = m_buckets + n;
+ while (*slot && ! this->compare (k, code, *slot))
+ slot = &((*slot)->m_next);
+
+ while (*slot && this->compare (k, code, *slot))
+ {
+ node* n = *slot;
+ *slot = n->m_next;
+ m_deallocate_node (n);
+ --m_element_count;
+ }
+ }
-// ??? This could be optimized by taking advantage of the bucket
-// structure, but it's not clear that it's worth doing. It probably
-// wouldn't even be an optimization unless the load factor is large.
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-void hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>
-::erase(const_iterator first, const_iterator last)
-{
- while (first != last) {
- const_iterator next = first;
- ++next;
- this->erase(first);
- first = next;
- }
-}
+ // ??? This could be optimized by taking advantage of the bucket
+ // structure, but it's not clear that it's worth doing. It probably
+ // wouldn't even be an optimization unless the load factor is large.
+ template <typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ void
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ erase(const_iterator first, const_iterator last)
+ {
+ while (first != last)
+ {
+ const_iterator next = first;
+ ++next;
+ this->erase(first);
+ first = next;
+ }
+ }
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-void hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::clear()
-{
- m_deallocate_nodes (m_buckets, m_bucket_count);
- m_element_count = 0;
-}
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ void
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ clear()
+ {
+ m_deallocate_nodes(m_buckets, m_bucket_count);
+ m_element_count = 0;
+ }
-template <typename K, typename V,
- typename A, typename Ex, typename Eq,
- typename H1, typename H2, typename H, typename RP,
- bool c, bool m, bool u>
-void
-hashtable<K,V,A,Ex,Eq,H1,H2,H,RP,c,m,u>::m_rehash (size_type N)
-{
- node** new_array = m_allocate_buckets (N);
- try {
- for (size_type i = 0; i < m_bucket_count; ++i)
- while (node* p = m_buckets[i]) {
- size_type new_index = this->bucket_index (p, N);
- m_buckets[i] = p->m_next;
- p->m_next = new_array[new_index];
- new_array[new_index] = p;
- }
- m_deallocate_buckets (m_buckets, m_bucket_count);
- m_bucket_count = N;
- m_buckets = new_array;
- }
- catch (...) {
- // A failure here means that a hash function threw an exception.
- // We can't restore the previous state without calling the hash
- // function again, so the only sensible recovery is to delete
- // everything.
- m_deallocate_nodes (new_array, N);
- m_deallocate_buckets (new_array, N);
- m_deallocate_nodes (m_buckets, m_bucket_count);
- m_element_count = 0;
- throw;
- }
+ template<typename K, typename V,
+ typename A, typename Ex, typename Eq,
+ typename H1, typename H2, typename H, typename RP,
+ bool c, bool m, bool u>
+ void
+ hashtable<K, V, A, Ex, Eq, H1, H2, H, RP, c, m, u>::
+ m_rehash(size_type N)
+ {
+ node** new_array = m_allocate_buckets (N);
+ try
+ {
+ for (size_type i = 0; i < m_bucket_count; ++i)
+ while (node* p = m_buckets[i])
+ {
+ size_type new_index = this->bucket_index (p, N);
+ m_buckets[i] = p->m_next;
+ p->m_next = new_array[new_index];
+ new_array[new_index] = p;
+ }
+ m_deallocate_buckets(m_buckets, m_bucket_count);
+ m_bucket_count = N;
+ m_buckets = new_array;
+ }
+ catch (...)
+ {
+ // A failure here means that a hash function threw an exception.
+ // We can't restore the previous state without calling the hash
+ // function again, so the only sensible recovery is to delete
+ // everything.
+ m_deallocate_nodes(new_array, N);
+ m_deallocate_buckets(new_array, N);
+ m_deallocate_nodes(m_buckets, m_bucket_count);
+ m_element_count = 0;
+ throw;
+ }
+ }
+
}
-
-} } // Namespace std::tr1
+} // Namespace std::tr1
#endif /* GNU_LIBSTDCXX_TR1_HASHTABLE_ */
diff --git a/libstdc++-v3/include/tr1/unordered_map b/libstdc++-v3/include/tr1/unordered_map
index e35683d36aa..4750c2aaf90 100644
--- a/libstdc++-v3/include/tr1/unordered_map
+++ b/libstdc++-v3/include/tr1/unordered_map
@@ -40,127 +40,131 @@
#include <utility>
#include <memory>
-namespace std { namespace tr1 {
-
-// XXX When we get typedef templates these class definitions will be unnecessary.
-
-template <class Key, class T,
- class Hash = hash<Key>,
- class Pred = std::equal_to<Key>,
- class Alloc = std::allocator<std::pair<const Key, T> >,
- bool cache_hash_code = false>
-class unordered_map
- : public hashtable <Key, std::pair<const Key, T>,
- Alloc,
- Internal::extract1st<std::pair<const Key, T> >, Pred,
- Hash, Internal::mod_range_hashing, Internal::default_ranged_hash,
- Internal::prime_rehash_policy,
- cache_hash_code, true, true>
+namespace std
{
- typedef hashtable <Key, std::pair<const Key, T>,
- Alloc,
- Internal::extract1st<std::pair<const Key, T> >, Pred,
- Hash, Internal::mod_range_hashing, Internal::default_ranged_hash,
- Internal::prime_rehash_policy,
- cache_hash_code, true, true>
- Base;
-
-public:
- typedef typename Base::size_type size_type;
- typedef typename Base::hasher hasher;
- typedef typename Base::key_equal key_equal;
- typedef typename Base::allocator_type allocator_type;
-
- explicit unordered_map(size_type n = 10,
+namespace tr1
+{
+ // XXX When we get typedef templates these class definitions
+ // will be unnecessary.
+
+ template<class Key, class T,
+ class Hash = hash<Key>,
+ class Pred = std::equal_to<Key>,
+ class Alloc = std::allocator<std::pair<const Key, T> >,
+ bool cache_hash_code = false>
+ class unordered_map
+ : public hashtable <Key, std::pair<const Key, T>,
+ Alloc,
+ Internal::extract1st<std::pair<const Key, T> >, Pred,
+ Hash, Internal::mod_range_hashing,
+ Internal::default_ranged_hash,
+ Internal::prime_rehash_policy,
+ cache_hash_code, true, true>
+ {
+ typedef hashtable <Key, std::pair<const Key, T>,
+ Alloc,
+ Internal::extract1st<std::pair<const Key, T> >, Pred,
+ Hash, Internal::mod_range_hashing,
+ Internal::default_ranged_hash,
+ Internal::prime_rehash_policy,
+ cache_hash_code, true, true>
+ Base;
+
+ public:
+ typedef typename Base::size_type size_type;
+ typedef typename Base::hasher hasher;
+ typedef typename Base::key_equal key_equal;
+ typedef typename Base::allocator_type allocator_type;
+
+ explicit
+ unordered_map(size_type n = 10,
+ const hasher& hf = hasher(),
+ const key_equal& eql = key_equal(),
+ const allocator_type& a = allocator_type())
+ : Base(n, hf, Internal::mod_range_hashing(),
+ Internal::default_ranged_hash(),
+ eql, Internal::extract1st<std::pair<const Key, T> >(), a)
+ { }
+
+ template<typename InputIterator>
+ unordered_map(InputIterator f, InputIterator l,
+ size_type n = 10,
+ const hasher& hf = hasher(),
+ const key_equal& eql = key_equal(),
+ const allocator_type& a = allocator_type())
+ : Base (f, l, n, hf, Internal::mod_range_hashing(),
+ Internal::default_ranged_hash(),
+ eql, Internal::extract1st<std::pair<const Key, T> >(), a)
+ { }
+ };
+
+ template<class Key, class T,
+ class Hash = hash<Key>,
+ class Pred = std::equal_to<Key>,
+ class Alloc = std::allocator<std::pair<const Key, T> >,
+ bool cache_hash_code = false>
+ class unordered_multimap
+ : public hashtable <Key, std::pair<const Key, T>,
+ Alloc,
+ Internal::extract1st<std::pair<const Key, T> >, Pred,
+ Hash, Internal::mod_range_hashing,
+ Internal::default_ranged_hash,
+ Internal::prime_rehash_policy,
+ cache_hash_code, true, false>
+ {
+ typedef hashtable <Key, std::pair<const Key, T>,
+ Alloc,
+ Internal::extract1st<std::pair<const Key, T> >, Pred,
+ Hash, Internal::mod_range_hashing,
+ Internal::default_ranged_hash,
+ Internal::prime_rehash_policy,
+ cache_hash_code, true, false>
+ Base;
+
+ public:
+ typedef typename Base::size_type size_type;
+ typedef typename Base::hasher hasher;
+ typedef typename Base::key_equal key_equal;
+ typedef typename Base::allocator_type allocator_type;
+
+ explicit
+ unordered_multimap(size_type n = 10,
const hasher& hf = hasher(),
const key_equal& eql = key_equal(),
const allocator_type& a = allocator_type())
- : Base (n,
- hf, Internal::mod_range_hashing(), Internal::default_ranged_hash(),
- eql, Internal::extract1st<std::pair<const Key, T> >(),
- a)
- { }
-
- template <typename InputIterator>
- unordered_map(InputIterator f, InputIterator l,
- size_type n = 10,
- const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type())
- : Base (f, l,
- n,
- hf, Internal::mod_range_hashing(), Internal::default_ranged_hash(),
- eql, Internal::extract1st<std::pair<const Key, T> >(),
- a)
- { }
-};
-
-template <class Key, class T,
- class Hash = hash<Key>,
- class Pred = std::equal_to<Key>,
- class Alloc = std::allocator<std::pair<const Key, T> >,
- bool cache_hash_code = false>
-class unordered_multimap
- : public hashtable <Key, std::pair<const Key, T>,
- Alloc,
- Internal::extract1st<std::pair<const Key, T> >, Pred,
- Hash, Internal::mod_range_hashing, Internal::default_ranged_hash,
- Internal::prime_rehash_policy,
- cache_hash_code, true, false>
-{
- typedef hashtable <Key, std::pair<const Key, T>,
- Alloc,
- Internal::extract1st<std::pair<const Key, T> >, Pred,
- Hash, Internal::mod_range_hashing, Internal::default_ranged_hash,
- Internal::prime_rehash_policy,
- cache_hash_code, true, false>
- Base;
-
-public:
- typedef typename Base::size_type size_type;
- typedef typename Base::hasher hasher;
- typedef typename Base::key_equal key_equal;
- typedef typename Base::allocator_type allocator_type;
-
- explicit unordered_multimap(size_type n = 10,
- const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type())
- : Base (n,
- hf, Internal::mod_range_hashing(), Internal::default_ranged_hash(),
- eql, Internal::extract1st<std::pair<const Key, T> >(),
- a)
- { }
-
-
- template <typename InputIterator>
- unordered_multimap(InputIterator f, InputIterator l,
- typename Base::size_type n = 0,
- const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type())
- : Base (f, l,
- n,
- hf, Internal::mod_range_hashing(), Internal::default_ranged_hash(),
- eql, Internal::extract1st<std::pair<const Key, T> >(),
- a)
- { }
-};
-
-template <class Key, class T, class Hash, class Pred, class Alloc, bool cache_hash_code>
-inline void swap (unordered_map<Key, T, Hash, Pred, Alloc, cache_hash_code>& x,
- unordered_map<Key, T, Hash, Pred, Alloc, cache_hash_code>& y)
-{
- x.swap(y);
-}
+ : Base (n, hf, Internal::mod_range_hashing(),
+ Internal::default_ranged_hash(),
+ eql, Internal::extract1st<std::pair<const Key, T> >(), a)
+ { }
+
+
+ template<typename InputIterator>
+ unordered_multimap(InputIterator f, InputIterator l,
+ typename Base::size_type n = 0,
+ const hasher& hf = hasher(),
+ const key_equal& eql = key_equal(),
+ const allocator_type& a = allocator_type())
+ : Base (f, l, n, hf, Internal::mod_range_hashing(),
+ Internal::default_ranged_hash(),
+ eql, Internal::extract1st<std::pair<const Key, T> >(), a)
+ { }
+ };
+
+ template<class Key, class T, class Hash, class Pred, class Alloc,
+ bool cache_hash_code>
+ inline void
+ swap(unordered_map<Key, T, Hash, Pred, Alloc, cache_hash_code>& x,
+ unordered_map<Key, T, Hash, Pred, Alloc, cache_hash_code>& y)
+ { x.swap(y); }
+
+ template<class Key, class T, class Hash, class Pred, class Alloc,
+ bool cache_hash_code>
+ inline void
+ swap(unordered_multimap<Key, T, Hash, Pred, Alloc, cache_hash_code>& x,
+ unordered_multimap<Key, T, Hash, Pred, Alloc, cache_hash_code>& y)
+ { x.swap(y); }
-template <class Key, class T, class Hash, class Pred, class Alloc, bool cache_hash_code>
-inline void swap (unordered_multimap<Key, T, Hash, Pred, Alloc, cache_hash_code>& x,
- unordered_multimap<Key, T, Hash, Pred, Alloc, cache_hash_code>& y)
-{
- x.swap(y);
}
-
-} }
+}
#endif /* GNU_LIBSTDCXX_TR1_UNORDERED_MAP_ */
diff --git a/libstdc++-v3/include/tr1/unordered_set b/libstdc++-v3/include/tr1/unordered_set
index e0f75f05c13..ecf8e7a968a 100644
--- a/libstdc++-v3/include/tr1/unordered_set
+++ b/libstdc++-v3/include/tr1/unordered_set
@@ -38,123 +38,128 @@
#include <tr1/functional>
#include <memory>
-namespace std { namespace tr1 {
-
-// XXX When we get typedef templates these class definitions will be unnecessary.
-
-template <class Value,
- class Hash = hash<Value>,
- class Pred = std::equal_to<Value>,
- class Alloc = std::allocator<Value>,
- bool cache_hash_code = false>
-class unordered_set
- : public hashtable <Value, Value, Alloc,
- Internal::identity<Value>, Pred,
- Hash, Internal::mod_range_hashing, Internal::default_ranged_hash,
- Internal::prime_rehash_policy,
- cache_hash_code, false, true>
+namespace std
+{
+namespace tr1
{
- typedef hashtable <Value, Value, Alloc,
- Internal::identity<Value>, Pred,
- Hash, Internal::mod_range_hashing, Internal::default_ranged_hash,
- Internal::prime_rehash_policy,
- cache_hash_code, false, true>
- Base;
-
-public:
- typedef typename Base::size_type size_type;
- typedef typename Base::hasher hasher;
- typedef typename Base::key_equal key_equal;
- typedef typename Base::allocator_type allocator_type;
-
- explicit unordered_set(size_type n = 10,
+
+ // XXX When we get typedef templates these class definitions
+ // will be unnecessary.
+
+ template<class Value,
+ class Hash = hash<Value>,
+ class Pred = std::equal_to<Value>,
+ class Alloc = std::allocator<Value>,
+ bool cache_hash_code = false>
+ class unordered_set
+ : public hashtable<Value, Value, Alloc,
+ Internal::identity<Value>, Pred,
+ Hash, Internal::mod_range_hashing,
+ Internal::default_ranged_hash,
+ Internal::prime_rehash_policy,
+ cache_hash_code, false, true>
+ {
+ typedef hashtable<Value, Value, Alloc,
+ Internal::identity<Value>, Pred,
+ Hash, Internal::mod_range_hashing,
+ Internal::default_ranged_hash,
+ Internal::prime_rehash_policy,
+ cache_hash_code, false, true>
+ Base;
+
+ public:
+ typedef typename Base::size_type size_type;
+ typedef typename Base::hasher hasher;
+ typedef typename Base::key_equal key_equal;
+ typedef typename Base::allocator_type allocator_type;
+
+ explicit
+ unordered_set(size_type n = 10,
+ const hasher& hf = hasher(),
+ const key_equal& eql = key_equal(),
+ const allocator_type& a = allocator_type())
+ : Base (n, hf, Internal::mod_range_hashing(),
+ Internal::default_ranged_hash(),
+ eql, Internal::identity<Value>(), a)
+ { }
+
+ template<typename InputIterator>
+ unordered_set(InputIterator f, InputIterator l,
+ size_type n = 10,
+ const hasher& hf = hasher(),
+ const key_equal& eql = key_equal(),
+ const allocator_type& a = allocator_type())
+ : Base (f, l, n, hf, Internal::mod_range_hashing(),
+ Internal::default_ranged_hash(),
+ eql, Internal::identity<Value>(), a)
+ { }
+ };
+
+ template<class Value,
+ class Hash = hash<Value>,
+ class Pred = std::equal_to<Value>,
+ class Alloc = std::allocator<Value>,
+ bool cache_hash_code = false>
+ class unordered_multiset
+ : public hashtable <Value, Value, Alloc,
+ Internal::identity<Value>, Pred,
+ Hash, Internal::mod_range_hashing,
+ Internal::default_ranged_hash,
+ Internal::prime_rehash_policy,
+ cache_hash_code, false, false>
+ {
+ typedef hashtable<Value, Value, Alloc,
+ Internal::identity<Value>, Pred,
+ Hash, Internal::mod_range_hashing,
+ Internal::default_ranged_hash,
+ Internal::prime_rehash_policy,
+ cache_hash_code, false, false>
+ Base;
+
+ public:
+ typedef typename Base::size_type size_type;
+ typedef typename Base::hasher hasher;
+ typedef typename Base::key_equal key_equal;
+ typedef typename Base::allocator_type allocator_type;
+
+ explicit
+ unordered_multiset(size_type n = 10,
const hasher& hf = hasher(),
const key_equal& eql = key_equal(),
const allocator_type& a = allocator_type())
- : Base (n,
- hf, Internal::mod_range_hashing(), Internal::default_ranged_hash(),
- eql, Internal::identity<Value>(),
- a)
- { }
-
- template <typename InputIterator>
- unordered_set(InputIterator f, InputIterator l,
- size_type n = 10,
- const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type())
- : Base (f, l,
- n,
- hf, Internal::mod_range_hashing(), Internal::default_ranged_hash(),
- eql, Internal::identity<Value>(),
- a)
- { }
-};
-
-template <class Value,
- class Hash = hash<Value>,
- class Pred = std::equal_to<Value>,
- class Alloc = std::allocator<Value>,
- bool cache_hash_code = false>
-class unordered_multiset
- : public hashtable <Value, Value, Alloc,
- Internal::identity<Value>, Pred,
- Hash, Internal::mod_range_hashing, Internal::default_ranged_hash,
- Internal::prime_rehash_policy,
- cache_hash_code, false, false>
-{
- typedef hashtable <Value, Value, Alloc,
- Internal::identity<Value>, Pred,
- Hash, Internal::mod_range_hashing, Internal::default_ranged_hash,
- Internal::prime_rehash_policy,
- cache_hash_code, false, false>
- Base;
-
-public:
- typedef typename Base::size_type size_type;
- typedef typename Base::hasher hasher;
- typedef typename Base::key_equal key_equal;
- typedef typename Base::allocator_type allocator_type;
-
- explicit unordered_multiset(size_type n = 10,
- const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type())
- : Base (n,
- hf, Internal::mod_range_hashing(), Internal::default_ranged_hash(),
- eql, Internal::identity<Value>(),
- a)
- { }
-
-
- template <typename InputIterator>
- unordered_multiset(InputIterator f, InputIterator l,
- typename Base::size_type n = 0,
- const hasher& hf = hasher(),
- const key_equal& eql = key_equal(),
- const allocator_type& a = allocator_type())
- : Base (f, l,
- n,
- hf, Internal::mod_range_hashing(), Internal::default_ranged_hash(),
- eql, Internal::identity<Value>(),
- a)
- { }
-};
-
-template <class Value, class Hash, class Pred, class Alloc, bool cache_hash_code>
-inline void swap (unordered_set<Value, Hash, Pred, Alloc, cache_hash_code>& x,
- unordered_set<Value, Hash, Pred, Alloc, cache_hash_code>& y)
-{
- x.swap(y);
-}
+ : Base (n, hf, Internal::mod_range_hashing(),
+ Internal::default_ranged_hash(),
+ eql, Internal::identity<Value>(), a)
+ { }
+
+
+ template<typename InputIterator>
+ unordered_multiset(InputIterator f, InputIterator l,
+ typename Base::size_type n = 0,
+ const hasher& hf = hasher(),
+ const key_equal& eql = key_equal(),
+ const allocator_type& a = allocator_type())
+ : Base (f, l, n, hf, Internal::mod_range_hashing(),
+ Internal::default_ranged_hash(), eql,
+ Internal::identity<Value>(), a)
+ { }
+ };
+
+ template<class Value, class Hash, class Pred, class Alloc,
+ bool cache_hash_code>
+ inline void
+ swap (unordered_set<Value, Hash, Pred, Alloc, cache_hash_code>& x,
+ unordered_set<Value, Hash, Pred, Alloc, cache_hash_code>& y)
+ { x.swap(y); }
+
+ template<class Value, class Hash, class Pred, class Alloc,
+ bool cache_hash_code>
+ inline void
+ swap(unordered_multiset<Value, Hash, Pred, Alloc, cache_hash_code>& x,
+ unordered_multiset<Value, Hash, Pred, Alloc, cache_hash_code>& y)
+ { x.swap(y); }
-template <class Value, class Hash, class Pred, class Alloc, bool cache_hash_code>
-inline void swap (unordered_multiset<Value, Hash, Pred, Alloc, cache_hash_code>& x,
- unordered_multiset<Value, Hash, Pred, Alloc, cache_hash_code>& y)
-{
- x.swap(y);
}
-
-} }
+}
#endif /* GNU_LIBSTDCXX_TR1_UNORDERED_SET_ */
diff --git a/libstdc++-v3/libmath/Makefile.in b/libstdc++-v3/libmath/Makefile.in
index 910f9e942aa..c47944f419f 100644
--- a/libstdc++-v3/libmath/Makefile.in
+++ b/libstdc++-v3/libmath/Makefile.in
@@ -42,7 +42,8 @@ target_triplet = @target@
subdir = libmath
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/../config/no-executables.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/../config/lead-dot.m4 \
+ $(top_srcdir)/../config/no-executables.m4 \
$(top_srcdir)/../libtool.m4 $(top_srcdir)/crossconfig.m4 \
$(top_srcdir)/linkage.m4 $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/configure.ac
diff --git a/libstdc++-v3/libmath/stubs.c b/libstdc++-v3/libmath/stubs.c
index 797b2017fb0..bbbe0fe3d16 100644
--- a/libstdc++-v3/libmath/stubs.c
+++ b/libstdc++-v3/libmath/stubs.c
@@ -34,6 +34,23 @@
we use the crude approximation. We'll do better later. */
+#ifndef HAVE_FABSF
+float
+fabsf(float x)
+{
+ return (float) fabs(x);
+}
+#endif
+
+#ifndef HAVE_FABSL
+long double
+fabsl(long double x)
+{
+ return fabs((double) x);
+}
+#endif
+
+
#ifndef HAVE_ACOSF
float
acosf(float x)
diff --git a/libstdc++-v3/libsupc++/Makefile.in b/libstdc++-v3/libsupc++/Makefile.in
index 7429511150c..9dfedc3fbc3 100644
--- a/libstdc++-v3/libsupc++/Makefile.in
+++ b/libstdc++-v3/libsupc++/Makefile.in
@@ -44,7 +44,8 @@ DIST_COMMON = $(glibcxxinstall_HEADERS) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(top_srcdir)/fragment.am
subdir = libsupc++
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/../config/no-executables.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/../config/lead-dot.m4 \
+ $(top_srcdir)/../config/no-executables.m4 \
$(top_srcdir)/../libtool.m4 $(top_srcdir)/crossconfig.m4 \
$(top_srcdir)/linkage.m4 $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/configure.ac
diff --git a/libstdc++-v3/libsupc++/unwind-cxx.h b/libstdc++-v3/libsupc++/unwind-cxx.h
index 4fa4b4139f7..e79dd83628e 100644
--- a/libstdc++-v3/libsupc++/unwind-cxx.h
+++ b/libstdc++-v3/libsupc++/unwind-cxx.h
@@ -38,8 +38,6 @@
#include <typeinfo>
#include <exception>
#include <cstddef>
-#include <cstdlib>
-#define gcc_unreachable() std::abort()
#include "unwind.h"
#pragma GCC visibility push(default)
diff --git a/libstdc++-v3/po/Makefile.in b/libstdc++-v3/po/Makefile.in
index 2ce98488f9f..7ae0c36fd51 100644
--- a/libstdc++-v3/po/Makefile.in
+++ b/libstdc++-v3/po/Makefile.in
@@ -40,7 +40,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(top_srcdir)/fragment.am
subdir = po
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/../config/no-executables.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/../config/lead-dot.m4 \
+ $(top_srcdir)/../config/no-executables.m4 \
$(top_srcdir)/../libtool.m4 $(top_srcdir)/crossconfig.m4 \
$(top_srcdir)/linkage.m4 $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/configure.ac
diff --git a/libstdc++-v3/src/Makefile.in b/libstdc++-v3/src/Makefile.in
index b1bc7abc629..43abc92b458 100644
--- a/libstdc++-v3/src/Makefile.in
+++ b/libstdc++-v3/src/Makefile.in
@@ -42,7 +42,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(top_srcdir)/fragment.am
subdir = src
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/../config/no-executables.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/../config/lead-dot.m4 \
+ $(top_srcdir)/../config/no-executables.m4 \
$(top_srcdir)/../libtool.m4 $(top_srcdir)/crossconfig.m4 \
$(top_srcdir)/linkage.m4 $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/configure.ac
diff --git a/libstdc++-v3/src/bitmap_allocator.cc b/libstdc++-v3/src/bitmap_allocator.cc
index 4e42cced450..c8d94af2157 100644
--- a/libstdc++-v3/src/bitmap_allocator.cc
+++ b/libstdc++-v3/src/bitmap_allocator.cc
@@ -41,10 +41,6 @@ namespace __gnu_cxx
<bitmap_allocator<wchar_t>::_Alloc_block*,
bitmap_allocator<wchar_t>::_Alloc_block*> >;
- template class __mini_vector<std::pair
- <bitmap_allocator<size_t>::_Alloc_block*,
- bitmap_allocator<size_t>::_Alloc_block*> >;
-
template class __mini_vector<size_t*>;
template size_t** __lower_bound
diff --git a/libstdc++-v3/src/debug.cc b/libstdc++-v3/src/debug.cc
index 3375adf1f47..621a1c96727 100644
--- a/libstdc++-v3/src/debug.cc
+++ b/libstdc++-v3/src/debug.cc
@@ -48,6 +48,15 @@ namespace __gnu_internal
namespace __gnu_debug
{
+ void
+ __fancy_abort(const char* __file, int __line, const char* __function,
+ const char* __condition)
+ {
+ printf("%s:%d: %s: Assertion '%s' failed.\n", __file, __line,
+ __function, __condition);
+ abort();
+ }
+
const char* _S_debug_messages[] =
{
"function requires a valid iterator range [%1.name;, %2.name;)",
diff --git a/libstdc++-v3/src/misc-inst.cc b/libstdc++-v3/src/misc-inst.cc
index b9bc29882f0..382de97952f 100644
--- a/libstdc++-v3/src/misc-inst.cc
+++ b/libstdc++-v3/src/misc-inst.cc
@@ -1,6 +1,6 @@
// Explicit instantiation file.
-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -35,9 +35,6 @@
#include <string>
#include <istream>
#include <ostream>
-#include <algorithm>
-#include <vector>
-#include <bits/atomicity.h>
#include <ext/stdio_sync_filebuf.h>
namespace std
diff --git a/libstdc++-v3/src/mt_allocator.cc b/libstdc++-v3/src/mt_allocator.cc
index 9c94bc86044..bb6ab899caf 100644
--- a/libstdc++-v3/src/mt_allocator.cc
+++ b/libstdc++-v3/src/mt_allocator.cc
@@ -1,8 +1,8 @@
// Allocator details.
-// Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+// Copyright (C) 2004 Free Software Foundation, Inc.
//
-// This file is part of the GNU ISO C++ Library. This library is free
+// This file is part of the GNU ISO C++ Librarbooly. 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)
@@ -552,5 +552,4 @@ namespace __gnu_cxx
// Instantiations.
template class __mt_alloc<char>;
template class __mt_alloc<wchar_t>;
- template class __mt_alloc<size_t>;
} // namespace __gnu_cxx
diff --git a/libstdc++-v3/src/pool_allocator.cc b/libstdc++-v3/src/pool_allocator.cc
index 1ad4e9c9a45..731cfffa0ea 100644
--- a/libstdc++-v3/src/pool_allocator.cc
+++ b/libstdc++-v3/src/pool_allocator.cc
@@ -170,5 +170,4 @@ namespace __gnu_cxx
// Instantiations.
template class __pool_alloc<char>;
template class __pool_alloc<wchar_t>;
- template class __pool_alloc<size_t>;
} // namespace __gnu_cxx
diff --git a/libstdc++-v3/testsuite/17_intro/no_assert_neg.cc b/libstdc++-v3/testsuite/17_intro/no_assert_neg.cc
new file mode 100644
index 00000000000..f3ffa4a48e0
--- /dev/null
+++ b/libstdc++-v3/testsuite/17_intro/no_assert_neg.cc
@@ -0,0 +1,89 @@
+// { dg-do compile }
+// { dg-options "-D__GLIBCXX__=99999999" }
+// NB: This is done to force any generated and possibly included PCH
+// to be invalid.
+
+// 2005-05-24 bkoz
+
+// Copyright (C) 2005 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.
+
+// 17.4.1.2 Headers
+
+// This file tests that assert is not included in any of the standard
+// includes by accident.
+
+// C++ headers
+#include <algorithm>
+#include <bitset>
+#include <complex>
+#include <deque>
+#include <exception>
+#include <fstream>
+#include <functional>
+#include <iomanip>
+#include <ios>
+#include <iosfwd>
+#include <iostream>
+#include <istream>
+#include <iterator>
+#include <limits>
+#include <list>
+#include <locale>
+#include <map>
+#include <memory>
+#include <new>
+#include <numeric>
+#include <ostream>
+#include <queue>
+#include <set>
+#include <sstream>
+#include <stack>
+#include <stdexcept>
+#include <streambuf>
+#include <string>
+#include <typeinfo>
+#include <utility>
+#include <valarray>
+#include <vector>
+
+// C headers
+#include <cctype>
+#include <cerrno>
+#include <cfloat>
+#include <ciso646>
+#include <climits>
+#include <clocale>
+#include <cmath>
+#include <csetjmp>
+#include <csignal>
+#include <cstdarg>
+#include <cstddef>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <ctime>
+
+void foo()
+{
+ assert(true);
+}
+
+// { dg-error "not declared" "" { target *-*-* } 84 }
+
+
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/1.cc b/libstdc++-v3/testsuite/21_strings/basic_string/1.cc
new file mode 100644
index 00000000000..e65fdd8b86a
--- /dev/null
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/1.cc
@@ -0,0 +1,36 @@
+// Copyright (C) 2005 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 tests explicit instantiation of basic_string
+
+#include <string>
+
+// { dg-do compile }
+
+// libstdc++/21770
+template class std::basic_string<int, std::char_traits<int>,
+ std::allocator<char> >;
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/2.cc b/libstdc++-v3/testsuite/21_strings/basic_string/2.cc
new file mode 100644
index 00000000000..36322929ac7
--- /dev/null
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/2.cc
@@ -0,0 +1,36 @@
+// Copyright (C) 2005 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 tests explicit instantiation of basic_string
+
+#include <debug/string>
+
+// { dg-do compile }
+
+// libstdc++/21770
+template class __gnu_debug::basic_string<int, std::char_traits<int>,
+ std::allocator<char> >;
diff --git a/libstdc++-v3/testsuite/23_containers/deque/explicit_instantiation.cc b/libstdc++-v3/testsuite/23_containers/deque/explicit_instantiation/1.cc
index e6e758d0c74..e6e758d0c74 100644
--- a/libstdc++-v3/testsuite/23_containers/deque/explicit_instantiation.cc
+++ b/libstdc++-v3/testsuite/23_containers/deque/explicit_instantiation/1.cc
diff --git a/libstdc++-v3/testsuite/23_containers/deque/explicit_instantiation/2.cc b/libstdc++-v3/testsuite/23_containers/deque/explicit_instantiation/2.cc
new file mode 100644
index 00000000000..7084ff746a0
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/deque/explicit_instantiation/2.cc
@@ -0,0 +1,35 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// 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 tests explicit instantiation of library containers
+
+#include <deque>
+#include <testsuite_hooks.h>
+
+// { dg-do compile }
+
+template class std::deque<__gnu_test::NonDefaultConstructible>;
diff --git a/libstdc++-v3/testsuite/23_containers/deque/explicit_instantiation/3.cc b/libstdc++-v3/testsuite/23_containers/deque/explicit_instantiation/3.cc
new file mode 100644
index 00000000000..51b4551c4da
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/deque/explicit_instantiation/3.cc
@@ -0,0 +1,35 @@
+// Copyright (C) 2005 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 tests explicit instantiation of library containers
+
+#include <deque>
+
+// { dg-do compile }
+
+// libstdc++/21770
+template class std::deque<int, std::allocator<char> >;
diff --git a/libstdc++-v3/testsuite/23_containers/list/explicit_instantiation.cc b/libstdc++-v3/testsuite/23_containers/list/explicit_instantiation/1.cc
index 2c9db8d3f86..2c9db8d3f86 100644
--- a/libstdc++-v3/testsuite/23_containers/list/explicit_instantiation.cc
+++ b/libstdc++-v3/testsuite/23_containers/list/explicit_instantiation/1.cc
diff --git a/libstdc++-v3/testsuite/23_containers/list/explicit_instantiation/2.cc b/libstdc++-v3/testsuite/23_containers/list/explicit_instantiation/2.cc
new file mode 100644
index 00000000000..66d3934f427
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/list/explicit_instantiation/2.cc
@@ -0,0 +1,35 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// 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 tests explicit instantiation of library containers
+
+#include <list>
+#include <testsuite_hooks.h>
+
+// { dg-do compile }
+
+template class std::list<__gnu_test::NonDefaultConstructible>;
diff --git a/libstdc++-v3/testsuite/23_containers/list/explicit_instantiation/3.cc b/libstdc++-v3/testsuite/23_containers/list/explicit_instantiation/3.cc
new file mode 100644
index 00000000000..19f719dfff4
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/list/explicit_instantiation/3.cc
@@ -0,0 +1,35 @@
+// Copyright (C) 2005 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 tests explicit instantiation of library containers
+
+#include <list>
+
+// { dg-do compile }
+
+// libstdc++/21770
+template class std::list<int, std::allocator<char> >;
diff --git a/libstdc++-v3/testsuite/23_containers/map/explicit_instantiation.cc b/libstdc++-v3/testsuite/23_containers/map/explicit_instantiation/1.cc
index 4ceb2501569..4ceb2501569 100644
--- a/libstdc++-v3/testsuite/23_containers/map/explicit_instantiation.cc
+++ b/libstdc++-v3/testsuite/23_containers/map/explicit_instantiation/1.cc
diff --git a/libstdc++-v3/testsuite/23_containers/map/explicit_instantiation/2.cc b/libstdc++-v3/testsuite/23_containers/map/explicit_instantiation/2.cc
new file mode 100644
index 00000000000..8c3c744f080
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/map/explicit_instantiation/2.cc
@@ -0,0 +1,37 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// 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 tests explicit instantiation of library containers
+
+#include <map>
+#include <testsuite_hooks.h>
+
+// { dg-do compile }
+
+// N.B. We cannot instantiate with T == NonDefaultConstructible
+// because of 23.3.1.2.
+template class std::map<__gnu_test::NonDefaultConstructible, double>;
diff --git a/libstdc++-v3/testsuite/23_containers/map/explicit_instantiation/3.cc b/libstdc++-v3/testsuite/23_containers/map/explicit_instantiation/3.cc
new file mode 100644
index 00000000000..8ce3b6feda3
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/map/explicit_instantiation/3.cc
@@ -0,0 +1,35 @@
+// Copyright (C) 2005 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 tests explicit instantiation of library containers
+
+#include <map>
+
+// { dg-do compile }
+
+// libstdc++/21770
+template class std::map<int, double, std::less<int>, std::allocator<char> >;
diff --git a/libstdc++-v3/testsuite/23_containers/multimap/explicit_instantiation.cc b/libstdc++-v3/testsuite/23_containers/multimap/explicit_instantiation/1.cc
index 4a740b250f6..4a740b250f6 100644
--- a/libstdc++-v3/testsuite/23_containers/multimap/explicit_instantiation.cc
+++ b/libstdc++-v3/testsuite/23_containers/multimap/explicit_instantiation/1.cc
diff --git a/libstdc++-v3/testsuite/23_containers/multimap/explicit_instantiation/2.cc b/libstdc++-v3/testsuite/23_containers/multimap/explicit_instantiation/2.cc
new file mode 100644
index 00000000000..46181ef3e25
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/multimap/explicit_instantiation/2.cc
@@ -0,0 +1,36 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// 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 tests explicit instantiation of library containers
+
+#include <map>
+#include <testsuite_hooks.h>
+
+// { dg-do compile }
+
+template class std::multimap<__gnu_test::NonDefaultConstructible,
+ __gnu_test::NonDefaultConstructible>;
diff --git a/libstdc++-v3/testsuite/23_containers/multimap/explicit_instantiation/3.cc b/libstdc++-v3/testsuite/23_containers/multimap/explicit_instantiation/3.cc
new file mode 100644
index 00000000000..1c434b8501f
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/multimap/explicit_instantiation/3.cc
@@ -0,0 +1,35 @@
+// Copyright (C) 2005 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 tests explicit instantiation of library containers
+
+#include <map>
+
+// { dg-do compile }
+
+// libstdc++/21770
+template class std::multimap<int, double, std::less<int>, std::allocator<char> >;
diff --git a/libstdc++-v3/testsuite/23_containers/multiset/explicit_instantiation.cc b/libstdc++-v3/testsuite/23_containers/multiset/explicit_instantiation/1.cc
index fb6b5f1db19..fb6b5f1db19 100644
--- a/libstdc++-v3/testsuite/23_containers/multiset/explicit_instantiation.cc
+++ b/libstdc++-v3/testsuite/23_containers/multiset/explicit_instantiation/1.cc
diff --git a/libstdc++-v3/testsuite/23_containers/multiset/explicit_instantiation/2.cc b/libstdc++-v3/testsuite/23_containers/multiset/explicit_instantiation/2.cc
new file mode 100644
index 00000000000..0f5f3080aa4
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/multiset/explicit_instantiation/2.cc
@@ -0,0 +1,35 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// 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 tests explicit instantiation of library containers
+
+#include <set>
+#include <testsuite_hooks.h>
+
+// { dg-do compile }
+
+template class std::multiset<__gnu_test::NonDefaultConstructible>;
diff --git a/libstdc++-v3/testsuite/23_containers/multiset/explicit_instantiation/3.cc b/libstdc++-v3/testsuite/23_containers/multiset/explicit_instantiation/3.cc
new file mode 100644
index 00000000000..2b36bb92646
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/multiset/explicit_instantiation/3.cc
@@ -0,0 +1,35 @@
+// Copyright (C) 2005 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 tests explicit instantiation of library containers
+
+#include <set>
+
+// { dg-do compile }
+
+// libstdc++/21770
+template class std::multiset<int, std::less<int>, std::allocator<char> >;
diff --git a/libstdc++-v3/testsuite/23_containers/set/explicit_instantiation.cc b/libstdc++-v3/testsuite/23_containers/set/explicit_instantiation/1.cc
index 02e33be0456..02e33be0456 100644
--- a/libstdc++-v3/testsuite/23_containers/set/explicit_instantiation.cc
+++ b/libstdc++-v3/testsuite/23_containers/set/explicit_instantiation/1.cc
diff --git a/libstdc++-v3/testsuite/23_containers/set/explicit_instantiation/2.cc b/libstdc++-v3/testsuite/23_containers/set/explicit_instantiation/2.cc
new file mode 100644
index 00000000000..418c80e5543
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/set/explicit_instantiation/2.cc
@@ -0,0 +1,35 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// 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 tests explicit instantiation of library containers
+
+#include <set>
+#include <testsuite_hooks.h>
+
+// { dg-do compile }
+
+template class std::set<__gnu_test::NonDefaultConstructible>;
diff --git a/libstdc++-v3/testsuite/23_containers/set/explicit_instantiation/3.cc b/libstdc++-v3/testsuite/23_containers/set/explicit_instantiation/3.cc
new file mode 100644
index 00000000000..c2323226916
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/set/explicit_instantiation/3.cc
@@ -0,0 +1,35 @@
+// Copyright (C) 2005 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 tests explicit instantiation of library containers
+
+#include <set>
+
+// { dg-do compile }
+
+// libstdc++/21770
+template class std::set<int, std::less<int>, std::allocator<char> >;
diff --git a/libstdc++-v3/testsuite/23_containers/vector/explicit_instantiation.cc b/libstdc++-v3/testsuite/23_containers/vector/explicit_instantiation/1.cc
index 0668bbd12ab..0668bbd12ab 100644
--- a/libstdc++-v3/testsuite/23_containers/vector/explicit_instantiation.cc
+++ b/libstdc++-v3/testsuite/23_containers/vector/explicit_instantiation/1.cc
diff --git a/libstdc++-v3/testsuite/23_containers/vector/explicit_instantiation/2.cc b/libstdc++-v3/testsuite/23_containers/vector/explicit_instantiation/2.cc
new file mode 100644
index 00000000000..7020d42ebb0
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/explicit_instantiation/2.cc
@@ -0,0 +1,35 @@
+// Copyright (C) 2004 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// 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 tests explicit instantiation of library containers
+
+#include <vector>
+#include <testsuite_hooks.h>
+
+// { dg-do compile }
+
+template class std::vector<__gnu_test::NonDefaultConstructible>;
diff --git a/libstdc++-v3/testsuite/23_containers/vector/explicit_instantiation/3.cc b/libstdc++-v3/testsuite/23_containers/vector/explicit_instantiation/3.cc
new file mode 100644
index 00000000000..2cd0b23fcb6
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/explicit_instantiation/3.cc
@@ -0,0 +1,35 @@
+// Copyright (C) 2005 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 tests explicit instantiation of library containers
+
+#include <vector>
+
+// { dg-do compile }
+
+// libstdc++/21770
+template class std::vector<int, std::allocator<char> >;
diff --git a/libstdc++-v3/testsuite/25_algorithms/adjacent_find/1.cc b/libstdc++-v3/testsuite/25_algorithms/adjacent_find/1.cc
new file mode 100644
index 00000000000..fcce4b56596
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/adjacent_find/1.cc
@@ -0,0 +1,67 @@
+// Copyright (C) 2005 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.
+
+// 25.1.5 [lib.alg.adjacent_find]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+using std::adjacent_find;
+
+typedef test_container<int, forward_iterator_wrapper> Container;
+int array[] = {0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1};
+
+void
+test01()
+{
+ Container con(array, array);
+ VERIFY(adjacent_find(con.begin(), con.end()).ptr == array);
+}
+
+void
+test02()
+{
+ Container con(array, array + 1);
+ VERIFY(adjacent_find(con.begin(), con.end()).ptr == array + 1);
+}
+
+void
+test03()
+{
+ Container con(array, array + 2);
+ VERIFY(adjacent_find(con.begin(), con.end()).ptr == array);
+}
+
+void
+test04()
+{
+ Container con(array + 1, array + 10);
+ VERIFY(adjacent_find(con.begin(), con.end()).ptr == array + 10);
+}
+
+int
+main()
+{
+ test01();
+ test02();
+ test03();
+ test04();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/adjacent_find/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/adjacent_find/check_type.cc
new file mode 100644
index 00000000000..65f725df179
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/adjacent_find/check_type.cc
@@ -0,0 +1,42 @@
+// Copyright (C) 2005 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.
+
+// 25.1.5 [lib.alg.adjacent_find]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct S { };
+
+bool operator==(const S&, const S&) {return true;}
+
+struct X { };
+
+bool predicate(const X&, const X&) {return true;}
+
+forward_iterator_wrapper<S>
+test1(forward_iterator_wrapper<S>& s)
+{ return std::adjacent_find(s, s); }
+
+forward_iterator_wrapper<X>
+test2(forward_iterator_wrapper<X>& x)
+{ return std::adjacent_find(x, x, predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/binary_search/1.cc b/libstdc++-v3/testsuite/25_algorithms/binary_search/1.cc
new file mode 100644
index 00000000000..5ee44419b8b
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/binary_search/1.cc
@@ -0,0 +1,54 @@
+// Copyright (C) 2005 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.
+
+// 25.3.3.4 [lib.binary.search]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+using std::binary_search;
+
+typedef test_container<int, forward_iterator_wrapper> Container;
+
+void
+test1()
+{
+ int array[] = {0};
+ Container con(array, array);
+ VERIFY(!binary_search(con.begin(), con.end(), 1));
+}
+
+void
+test2()
+{
+ int array[] = {0, 2, 4, 6, 8};
+ Container con(array, array + 5);
+ for(int i = 0; i < 10; i += 2)
+ VERIFY(binary_search(con.begin(), con.end(), i));
+ for(int i = -1; i < 11; i += 2)
+ VERIFY(!binary_search(con.begin(), con.end(), i));
+}
+
+int main()
+{
+ test1();
+ test2();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/binary_search/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/binary_search/check_type.cc
new file mode 100644
index 00000000000..853a6d2ee39
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/binary_search/check_type.cc
@@ -0,0 +1,42 @@
+// Copyright (C) 2005 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.
+
+// 25.3.3.4 [lib.binary.search]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct S { };
+
+bool operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool predicate(const X&, const X&) {return true;}
+
+bool
+test1(forward_iterator_wrapper<S>& s)
+{ return std::binary_search(s, s, *s); }
+
+bool
+test2(forward_iterator_wrapper<X>& x)
+{ return std::binary_search(x, x, *x, predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/count/1.cc b/libstdc++-v3/testsuite/25_algorithms/count/1.cc
new file mode 100644
index 00000000000..dec293cfc3c
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/count/1.cc
@@ -0,0 +1,58 @@
+// Copyright (C) 2005 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.
+
+// 25.1.6 count
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+
+typedef test_container<int, input_iterator_wrapper> Container;
+int array[] = {0, 0, 0, 1, 0, 1};
+
+void
+test1()
+{
+ Container con(array, array);
+ VERIFY(std::count(con.begin(), con.end(), 1) == 0);
+}
+
+void
+test2()
+{
+ Container con(array, array + 1);
+ VERIFY(std::count(con.begin(), con.end(), 1) == 0);
+}
+
+void
+test3()
+{
+ Container con(array, array + 6);
+ VERIFY(std::count(con.begin(), con.end(), 1) == 2);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/count/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/count/check_type.cc
new file mode 100644
index 00000000000..389c8a08459
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/count/check_type.cc
@@ -0,0 +1,42 @@
+// Copyright (C) 2005 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.
+
+// 25.1.2 find_if
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+struct X { };
+
+struct Y { };
+
+using __gnu_test::input_iterator_wrapper;
+
+bool
+operator==(const X&, const Y&)
+{ return true; }
+
+typedef std::iterator_traits<input_iterator_wrapper<X> >::difference_type
+ diff_type;
+
+diff_type
+test1(input_iterator_wrapper<X>& begin,
+ input_iterator_wrapper<X>& end)
+{ return std::count(begin, end, Y()); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/count_if/1.cc b/libstdc++-v3/testsuite/25_algorithms/count_if/1.cc
new file mode 100644
index 00000000000..d5e626f4754
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/count_if/1.cc
@@ -0,0 +1,65 @@
+// Copyright (C) 2005 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.
+
+// 25.1.6 count_if
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+
+typedef test_container<int, input_iterator_wrapper> Container;
+int array[] = {0, 0, 0, 1, 0, 1};
+
+bool
+predicate(const int& i)
+{ return i == 1; }
+
+void
+test1()
+{
+ Container con(array, array);
+ VERIFY(std::count_if(con.begin(), con.end(),
+ predicate) == 0);
+}
+
+void
+test2()
+{
+ Container con(array, array + 1);
+ VERIFY(std::count_if(con.begin(), con.end(),
+ predicate) == 0);
+}
+
+void
+test3()
+{
+ Container con(array, array + 6);
+ VERIFY(std::count_if(con.begin(), con.end(),
+ predicate) == 2);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/count_if/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/count_if/check_type.cc
new file mode 100644
index 00000000000..8530985b935
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/count_if/check_type.cc
@@ -0,0 +1,52 @@
+// Copyright (C) 2005 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.
+
+// 25.1.2 find_if
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+struct X { };
+
+using __gnu_test::input_iterator_wrapper;
+
+bool
+pred_function(const X&)
+{ return true; }
+
+struct pred_obj
+{
+ bool
+ operator()(const X&)
+ { return true; }
+};
+
+typedef std::iterator_traits<input_iterator_wrapper<X> >::difference_type
+ diff_type;
+
+diff_type
+test1(input_iterator_wrapper<X>& begin,
+ input_iterator_wrapper<X>& end)
+{ return std::count_if(begin, end, pred_function); }
+
+diff_type
+test2(input_iterator_wrapper<X>& begin,
+ input_iterator_wrapper<X>& end)
+{ return std::count_if(begin, end, pred_obj()); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/equal/1.cc b/libstdc++-v3/testsuite/25_algorithms/equal/1.cc
new file mode 100644
index 00000000000..9a17c0276ae
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/equal/1.cc
@@ -0,0 +1,73 @@
+// Copyright (C) 2005 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.
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+
+typedef test_container<int, input_iterator_wrapper> Container;
+int array1[] = {0, 1};
+int array2[] = {1, 0};
+int array3[] = {1, 0};
+
+void test1()
+{
+ Container con1(array1, array1);
+ Container con2(array2, array2);
+ VERIFY( std::equal(con1.begin(), con1.end(), con2.begin()) );
+}
+
+void test2()
+{
+ Container con1(array1, array1 + 2);
+ Container con2(array2, array2 + 2);
+ VERIFY( !std::equal(con2.begin(), con2.end(), con1.begin()) );
+}
+
+void test3()
+{
+ Container con1(array1, array1 + 2);
+ Container con2(array2, array2 + 2);
+ VERIFY( !std::equal(con2.begin(), con2.end(), con1.begin()) );
+}
+
+void test4()
+{
+ Container con1(array1, array1 + 2);
+ Container con2(array2, array2 + 2);
+ VERIFY( !std::equal(con1.begin(), con1.end(), con2.begin()) );
+}
+
+void test5()
+{
+ Container con3(array3, array3 + 2);
+ Container con2(array2, array2 + 2);
+ VERIFY( std::equal(con3.begin(), con3.end(), con2.begin()) );
+}
+
+int main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+ test5();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/equal/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/equal/check_type.cc
new file mode 100644
index 00000000000..434d722e9a6
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/equal/check_type.cc
@@ -0,0 +1,48 @@
+// Copyright (C) 2005 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.
+
+// 25.1.8 [lib.alg.equal]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+using __gnu_test::input_iterator_wrapper;
+
+struct Lhs1 { };
+
+struct Rhs1 { };
+
+bool operator==(const Lhs1&, const Rhs1&) {return true;}
+
+struct Lhs2 { };
+
+struct Rhs2 { };
+
+bool
+predicate(const Lhs2&, const Rhs2&) {return true;}
+
+bool
+test1(input_iterator_wrapper<Lhs1>& lhs1,
+ input_iterator_wrapper<Rhs1>& rhs1)
+{ return std::equal(lhs1, lhs1, rhs1); }
+
+bool
+test2(input_iterator_wrapper<Lhs2>& lhs2,
+ input_iterator_wrapper<Rhs2>& rhs2)
+{ return std::equal(lhs2, lhs2, rhs2, predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/equal.cc b/libstdc++-v3/testsuite/25_algorithms/equal/equal.cc
index abb0446be21..abb0446be21 100644
--- a/libstdc++-v3/testsuite/25_algorithms/equal.cc
+++ b/libstdc++-v3/testsuite/25_algorithms/equal/equal.cc
diff --git a/libstdc++-v3/testsuite/25_algorithms/equal_range/1.cc b/libstdc++-v3/testsuite/25_algorithms/equal_range/1.cc
new file mode 100644
index 00000000000..9a843e7e421
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/equal_range/1.cc
@@ -0,0 +1,63 @@
+// Copyright (C) 2005 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.
+
+// 25.3.3.3 [lib.equal.range]
+
+#include <algorithm>
+#include <utility>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+using std::equal_range;
+
+typedef test_container<int, forward_iterator_wrapper> Container;
+int array[] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2};
+
+void
+test1()
+{
+ for(int i = 0; i < 6; ++i)
+ for(int j = 6; j < 12; ++j)
+ {
+ Container con(array + i, array + j);
+ VERIFY(equal_range(con.begin(), con.end(), 1).first.ptr ==
+ array + std::max(i, 4));
+ VERIFY(equal_range(con.begin(), con.end(), 1).second.ptr ==
+ array + std::min(j, 8));
+ }
+}
+
+void
+test2()
+{
+ int array[]={0, 0, 2, 2, 2};
+ Container con(array, array + 5);
+ VERIFY(equal_range(con.begin(), con.end(), 1).first.ptr ==
+ array + 2);
+ VERIFY(equal_range(con.begin(), con.end(), 1).second.ptr ==
+ array + 2);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/equal_range/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/equal_range/check_type.cc
new file mode 100644
index 00000000000..6a299c7081b
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/equal_range/check_type.cc
@@ -0,0 +1,43 @@
+// Copyright (C) 2005 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.
+
+// 25.3.3.3 [lib.equal.range]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <utility>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct S { };
+
+bool operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool predicate(const X&, const X&) {return true;}
+
+std::pair<forward_iterator_wrapper<S>, forward_iterator_wrapper<S> >
+test1(forward_iterator_wrapper<S>& s)
+{ return std::equal_range(s, s, *s); }
+
+std::pair<forward_iterator_wrapper<X>, forward_iterator_wrapper<X> >
+test2(forward_iterator_wrapper<X>& x)
+{ return std::equal_range(x, x, *x, predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/find/1.cc b/libstdc++-v3/testsuite/25_algorithms/find/1.cc
new file mode 100644
index 00000000000..19eb177c770
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/find/1.cc
@@ -0,0 +1,58 @@
+// Copyright (C) 2005 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.
+
+// 25.1.2 find
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+
+typedef test_container<int, input_iterator_wrapper> Container;
+int array[] = {0, 0, 0, 1, 0, 1};
+
+void
+test1()
+{
+ Container con(array, array);
+ VERIFY(std::find(con.begin(), con.end(), 1).ptr == array);
+}
+
+void
+test2()
+{
+ Container con(array, array + 1);
+ VERIFY(std::find(con.begin(), con.end(), 1).ptr == array + 1);
+}
+
+void
+test3()
+{
+ Container con(array, array + 6);
+ VERIFY(std::find(con.begin(), con.end(), 1).ptr == array + 3);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/find/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/find/check_type.cc
new file mode 100644
index 00000000000..40bfee8ddca
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/find/check_type.cc
@@ -0,0 +1,38 @@
+// Copyright (C) 2005 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.
+
+// 25.1.2 find
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::input_iterator_wrapper;
+
+struct Lhs { };
+struct Rhs { };
+
+bool
+operator==(const Lhs&, const Rhs&)
+{ return true; }
+
+input_iterator_wrapper<Lhs>
+test1(input_iterator_wrapper<Lhs>& begin,
+ input_iterator_wrapper<Lhs>& end, Rhs& val)
+{ return std::find(begin, end, val); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/find_end/1.cc b/libstdc++-v3/testsuite/25_algorithms/find_end/1.cc
new file mode 100644
index 00000000000..9120e188f77
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/find_end/1.cc
@@ -0,0 +1,57 @@
+// Copyright (C) 2005 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.
+
+// 25.1.3 [lib.alg.find.end]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+
+typedef test_container<int, forward_iterator_wrapper> Container;
+
+using std::find_end;
+
+void
+test1()
+{
+ int array[] = {0};
+ Container con1(array, array);
+ Container con2(array, array + 1);
+ VERIFY(find_end(con1.begin(), con1.end(), con1.begin(), con1.end()).ptr == array);
+ VERIFY(find_end(con1.begin(), con1.end(), con2.begin(), con2.end()).ptr == array);
+ VERIFY(find_end(con2.begin(), con2.end(), con1.begin(), con1.end()).ptr == array + 1);
+}
+
+void
+test2()
+{
+ int array1[] = {2, 2, 1, 2, 2, 1};
+ int array2[] = {2, 2};
+ Container con1(array1, array1 + 6);
+ Container con2(array2, array2 + 2);
+ VERIFY(find_end(con1.begin(), con1.end(), con2.begin(), con2.end()).ptr == array1 + 3);
+}
+
+int main()
+{
+ test1();
+ test2();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/find_end/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/find_end/check_type.cc
new file mode 100644
index 00000000000..1d998a7fa3a
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/find_end/check_type.cc
@@ -0,0 +1,53 @@
+// Copyright (C) 2005 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.
+
+// 25.1.3 [lib.alg.find.end]
+
+// { dg-do compile }
+
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct Lhs1 { };
+
+struct Rhs1 { };
+
+bool operator==(const Lhs1&, const Rhs1&) {return true;}
+
+struct X1 { };
+
+struct X2 { };
+
+bool predicate(const X1&, const X2&) {return true;}
+
+forward_iterator_wrapper<Lhs1>
+test1(forward_iterator_wrapper<Lhs1>& lhs1,
+ forward_iterator_wrapper<Rhs1>& rhs1)
+{
+ return std::find_end(lhs1, lhs1, rhs1, rhs1);
+}
+
+forward_iterator_wrapper<X1>
+test2(forward_iterator_wrapper<X1>& x1,
+ forward_iterator_wrapper<X2>& x2)
+{
+ return std::find_end(x1, x1, x2, x2, predicate);
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/find_first_of/1.cc b/libstdc++-v3/testsuite/25_algorithms/find_first_of/1.cc
new file mode 100644
index 00000000000..db441bd1a30
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/find_first_of/1.cc
@@ -0,0 +1,58 @@
+// Copyright (C) 2005 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.
+
+// 25.1.4 [lib.alg.find.first.of]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+
+typedef test_container<int, forward_iterator_wrapper> Container;
+
+using std::find_first_of;
+
+void
+test1()
+{
+ int array[] = {0};
+ Container con1(array, array);
+ Container con2(array, array + 1);
+ VERIFY(find_first_of(con1.begin(), con1.end(), con1.begin(), con1.end()).ptr == array);
+ VERIFY(find_first_of(con1.begin(), con1.end(), con2.begin(), con2.end()).ptr == array);
+ VERIFY(find_first_of(con2.begin(), con2.end(), con1.begin(), con1.end()).ptr == array + 1);
+}
+
+void
+test2()
+{
+ int array1[] = {1 ,2, 3, 4, 5, 6};
+ int array2[] = {3, 4, 9};
+ Container con1(array1, array1 + 6);
+ Container con2(array2, array2 + 3);
+ VERIFY(find_first_of(con1.begin(), con1.end(), con2.begin(), con2.end()).ptr == array1 + 2);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/find_first_of/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/find_first_of/check_type.cc
new file mode 100644
index 00000000000..9a075c91120
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/find_first_of/check_type.cc
@@ -0,0 +1,49 @@
+// Copyright (C) 2005 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.
+
+// 25.1.4 [lib.alg.find.first.of]
+
+// { dg-do compile }
+
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct Lhs1 { };
+
+struct Rhs1 { };
+
+bool operator==(const Lhs1&, const Rhs1&) {return true;}
+
+struct X1 { };
+
+struct X2 { };
+
+bool predicate(const X1&, const X2&) {return true;}
+
+forward_iterator_wrapper<Lhs1>
+test1(forward_iterator_wrapper<Lhs1>& lhs1,
+ forward_iterator_wrapper<Rhs1>& rhs1)
+{ return std::find_first_of(lhs1, lhs1, rhs1, rhs1); }
+
+forward_iterator_wrapper<X1>
+test2(forward_iterator_wrapper<X1>& x1,
+ forward_iterator_wrapper<X2>& x2)
+{ return std::find_first_of(x1, x1, x2, x2, predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/find_if/1.cc b/libstdc++-v3/testsuite/25_algorithms/find_if/1.cc
new file mode 100644
index 00000000000..c1d9255ea42
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/find_if/1.cc
@@ -0,0 +1,65 @@
+// Copyright (C) 2005 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.
+
+// 25.1.2 find_if
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+
+typedef test_container<int, input_iterator_wrapper> Container;
+int array[] = {0, 0, 0, 1, 0, 1};
+
+bool
+predicate(const int& i)
+{ return i == 1; }
+
+void
+test1()
+{
+ Container con(array, array);
+ VERIFY(std::find_if(con.begin(), con.end(),
+ predicate).ptr == array);
+}
+
+void
+test2()
+{
+ Container con(array, array + 1);
+ VERIFY(std::find_if(con.begin(), con.end(),
+ predicate).ptr == array + 1);
+}
+
+void
+test3()
+{
+ Container con(array, array + 6);
+ VERIFY(std::find_if(con.begin(), con.end(),
+ predicate).ptr == array + 3);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/find_if/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/find_if/check_type.cc
new file mode 100644
index 00000000000..8d56be96a9b
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/find_if/check_type.cc
@@ -0,0 +1,49 @@
+// Copyright (C) 2005 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.
+
+// 25.1.2 find_if
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+struct X { };
+
+using __gnu_test::input_iterator_wrapper;
+
+bool
+pred_function(const X&)
+{ return true; }
+
+struct pred_obj
+{
+ bool
+ operator()(const X&)
+ { return true; }
+};
+
+input_iterator_wrapper<X>
+test1(input_iterator_wrapper<X>& begin,
+ input_iterator_wrapper<X>& end)
+{ return std::find_if(begin, end, pred_function); }
+
+input_iterator_wrapper<X>
+test2(input_iterator_wrapper<X>& begin,
+ input_iterator_wrapper<X>& end)
+{ return std::find_if(begin, end, pred_obj()); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/heap.cc b/libstdc++-v3/testsuite/25_algorithms/heap/heap.cc
index 6d564f2f9ee..6d564f2f9ee 100644
--- a/libstdc++-v3/testsuite/25_algorithms/heap.cc
+++ b/libstdc++-v3/testsuite/25_algorithms/heap/heap.cc
diff --git a/libstdc++-v3/testsuite/25_algorithms/includes/1.cc b/libstdc++-v3/testsuite/25_algorithms/includes/1.cc
new file mode 100644
index 00000000000..88d1d2b9cf4
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/includes/1.cc
@@ -0,0 +1,90 @@
+// Copyright (C) 2005 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.
+
+// 25.3.5.1 [lib.includes]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+using std::includes;
+
+typedef test_container<int, input_iterator_wrapper> Container;
+
+void
+test1()
+{
+ bool test __attribute__((unused)) = true;
+ int array[] = {0};
+ Container con1(array, array);
+ Container con2(array, array);
+ VERIFY(includes(con1.begin(), con1.end(), con2.begin(), con2.end()));
+}
+
+void
+test2()
+{
+ bool test __attribute__((unused)) = true;
+ int array[] = {0, 1};
+ Container con1(array, array);
+ Container con2(array, array + 2);
+ VERIFY(!includes(con1.begin(), con1.end(), con2.begin(), con2.end()));
+}
+
+void
+test3()
+{
+ bool test __attribute__((unused)) = true;
+ int array[] = {0, 1};
+ Container con1(array, array + 2);
+ Container con2(array, array);
+ VERIFY(includes(con1.begin(), con1.end(), con2.begin(), con2.end()));
+}
+
+void
+test4()
+{
+ bool test __attribute__((unused)) = true;
+ int array1[] = {1, 2, 3, 4, 6, 8, 9};
+ int array2[] = {2, 4, 6, 8};
+ Container con1(array1, array1 + 7);
+ Container con2(array2, array2 + 4);
+ VERIFY(includes(con1.begin(), con1.end(), con2.begin(), con2.end()));
+}
+
+void
+test5()
+{
+ bool test __attribute__((unused)) = true;
+ int array1[] = {1, 2, 3, 5};
+ int array2[] = {2, 4, 6, 8};
+ Container con1(array1, array1 + 4);
+ Container con2(array2, array2 + 4);
+ VERIFY(!includes(con1.begin(), con1.end(), con2.begin(), con2.end()));
+}
+
+int main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+ test5();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/includes/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/includes/check_type.cc
new file mode 100644
index 00000000000..4b1198e787f
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/includes/check_type.cc
@@ -0,0 +1,46 @@
+// Copyright (C) 2005 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.
+
+// 25.3.5.1 [lib.includes]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::input_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&)
+{ return true; }
+
+struct X { };
+
+bool
+predicate(const X&, const X&)
+{ return true; }
+
+bool
+test1(input_iterator_wrapper<S>& s)
+{ return std::includes(s, s, s, s); }
+
+bool
+test2(input_iterator_wrapper<X>& x)
+{ return std::includes(x, x, x, x, predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/inplace_merge/1.cc b/libstdc++-v3/testsuite/25_algorithms/inplace_merge/1.cc
new file mode 100644
index 00000000000..f53c47e3e74
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/inplace_merge/1.cc
@@ -0,0 +1,84 @@
+// Copyright (C) 2005 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.
+
+// 25.3.4 [lib.alg.merge]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::bidirectional_iterator_wrapper;
+using std::inplace_merge;
+
+typedef test_container<int, bidirectional_iterator_wrapper> container;
+
+
+void
+test1()
+{
+ int array[]={1};
+ container con1(array, array);
+ inplace_merge(con1.begin(), con1.end(), con1.end());
+ container con2(array, array + 1);
+ inplace_merge(con2.begin(), con2.end(), con2.end());
+ inplace_merge(con2.begin(), con2.begin(), con2.end());
+}
+
+void
+test2()
+{
+ int array[]={0,2,4,1,3,5};
+ container con(array, array + 6);
+ inplace_merge(con.begin(), con.it(3), con.end());
+ VERIFY(array[0] == 0 && array[1] == 1 && array[2] == 2 &&
+ array[3] == 3 && array[4] == 4 && array[5] == 5);
+}
+
+struct S
+{
+ int a;
+ int b;
+ S(int _a, int _b) : a(_a), b(_b) { }
+ S() { }
+ bool
+ operator<(const S& _s) const
+ { return _s.a < a; }
+};
+
+void
+test3()
+{
+ S s[4];
+ s[0].a = 0;
+ s[1].a = 1;
+ s[2].a = 0;
+ s[3].a = 1;
+ s[0].b = 0;
+ s[1].b = 0;
+ s[2].b = 1;
+ s[3].b = 1;
+ inplace_merge(s, s + 2, s + 4);
+ VERIFY(s[0].b == 0 && s[1].b == 1 && s[2].b == 0 && s[3].b == 1);
+}
+
+int
+main()
+{
+ test1();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/inplace_merge/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/inplace_merge/check_type.cc
new file mode 100644
index 00000000000..f8cacfa7696
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/inplace_merge/check_type.cc
@@ -0,0 +1,48 @@
+// Copyright (C) 2005 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.
+
+// 25.3.4 [lib.alg.merge]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::bidirectional_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+void
+test1(bidirectional_iterator_wrapper<S>& s)
+{
+ std::inplace_merge(s, s, s);
+}
+
+void
+test2(bidirectional_iterator_wrapper<X>& x)
+{
+ std::inplace_merge(x, x, x, predicate);
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/1.cc b/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/1.cc
new file mode 100644
index 00000000000..8d38dadb8e6
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/1.cc
@@ -0,0 +1,86 @@
+// Copyright (C) 2005 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.
+
+// 25.3.8 [lib.alg.lex.comparison]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+
+typedef test_container<int, input_iterator_wrapper> Container;
+int array1[] = {0, 1};
+int array2[] = {1, 0};
+int array3[] = {1, 0, 1};
+
+void
+test1()
+{
+ Container con1(array1, array1);
+ Container con2(array2, array2);
+ VERIFY( !std::lexicographical_compare(con1.begin(), con1.end(),
+ con2.begin(), con2.end()) );
+}
+
+void
+test2()
+{
+ Container con1(array1, array1 + 2);
+ Container con2(array2, array2 + 2);
+ VERIFY( std::lexicographical_compare(con1.begin(), con1.end(),
+ con2.begin(), con2.end()) );
+}
+
+void
+test3()
+{
+ Container con1(array1, array1 + 2);
+ Container con2(array2, array2 + 2);
+ VERIFY( !std::lexicographical_compare(con2.begin(), con2.end(),
+ con1.begin(), con1.end()) );
+}
+
+void
+test4()
+{
+ Container con3(array3, array3 + 3);
+ Container con2(array2, array2 + 2);
+ VERIFY( std::lexicographical_compare(con2.begin(), con2.end(),
+ con3.begin(), con3.end()) );
+}
+
+void
+test5()
+{
+ Container con3(array3, array3 + 3);
+ Container con2(array2, array2 + 2);
+ VERIFY( !std::lexicographical_compare(con3.begin(), con3.end(),
+ con2.begin(), con2.end()) );
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+ test5();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/check_type.cc
new file mode 100644
index 00000000000..20b594cc06a
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/lexicographical_compare/check_type.cc
@@ -0,0 +1,51 @@
+// Copyright (C) 2005 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.
+
+// 25.3.8 [lib.alg.lex.comparison]
+
+// { dg-do compile }
+
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::input_iterator_wrapper;
+
+struct Lhs1 { };
+
+struct Rhs1 { };
+
+bool
+operator<(const Lhs1&, const Rhs1&) {return true;}
+
+bool
+operator<(const Rhs1&, const Lhs1&) {return false;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+bool
+test1(input_iterator_wrapper<Lhs1>& lhs1,
+ input_iterator_wrapper<Rhs1>& rhs1)
+{ return std::lexicographical_compare(lhs1, lhs1, rhs1, rhs1); }
+
+bool
+test2(input_iterator_wrapper<X>& x)
+{ return std::lexicographical_compare(x, x, x, x, predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/lower_bound/1.cc b/libstdc++-v3/testsuite/25_algorithms/lower_bound/1.cc
new file mode 100644
index 00000000000..baa00c1cd6c
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/lower_bound/1.cc
@@ -0,0 +1,47 @@
+// Copyright (C) 2005 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.
+
+// 25.3.3.1 [lib.lower.bound]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+using std::lower_bound;
+
+typedef test_container<int, forward_iterator_wrapper> Container;
+int array[] = {0, 0, 0, 0, 1, 1, 1, 1};
+
+void
+test1()
+{
+ for(int i = 0; i < 5; ++i)
+ for(int j = 4; j < 7; ++j)
+ {
+ Container con(array + i, array + j);
+ VERIFY(lower_bound(con.begin(), con.end(), 1).ptr == array + 4);
+ }
+}
+
+int
+main()
+{
+ test1();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/lower_bound/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/lower_bound/check_type.cc
new file mode 100644
index 00000000000..1ba48d33f81
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/lower_bound/check_type.cc
@@ -0,0 +1,44 @@
+// Copyright (C) 2005 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.
+
+// 25.3.3.1 [lib.lower.bound]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+forward_iterator_wrapper<S>
+test1(forward_iterator_wrapper<S>& s)
+{ return std::lower_bound(s, s, *s); }
+
+forward_iterator_wrapper<X>
+test2(forward_iterator_wrapper<X>& x)
+{ return std::lower_bound(x, x, *x, predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/lower_bound.cc b/libstdc++-v3/testsuite/25_algorithms/lower_bound/lower_bound.cc
index 6afb28fffbc..6afb28fffbc 100644
--- a/libstdc++-v3/testsuite/25_algorithms/lower_bound.cc
+++ b/libstdc++-v3/testsuite/25_algorithms/lower_bound/lower_bound.cc
diff --git a/libstdc++-v3/testsuite/25_algorithms/max_element/1.cc b/libstdc++-v3/testsuite/25_algorithms/max_element/1.cc
new file mode 100644
index 00000000000..02d870baadb
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/max_element/1.cc
@@ -0,0 +1,71 @@
+// Copyright (C) 2005 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.
+
+// 25.3.7 [lib.alg.min.max]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+using std::max_element;
+
+typedef test_container<int, forward_iterator_wrapper> Container;
+
+void
+test1()
+{
+ // Note: The standard is unclear on what should happen in this case.
+ // This seems the only really sensible behaviour, and what is done.
+ int array[] = {0};
+ Container con(array, array);
+ VERIFY(max_element(con.begin(), con.end()).ptr == array);
+}
+
+void
+test2()
+{
+ int array[] = {0};
+ Container con(array, array + 1);
+ VERIFY(max_element(con.begin(), con.end()).ptr == array);
+}
+
+void
+test3()
+{
+ int array[] = {3, 0};
+ Container con(array, array + 2);
+ VERIFY(max_element(con.begin(), con.end()).ptr == array);
+}
+
+void
+test4()
+{
+ int array[] = {0, 3, 6, 2, 6, 4, 0};
+ Container con(array, array + 7);
+ VERIFY(max_element(con.begin(), con.end()).ptr == array + 2);
+}
+
+int main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/max_element/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/max_element/check_type.cc
new file mode 100644
index 00000000000..f6bae763cc4
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/max_element/check_type.cc
@@ -0,0 +1,44 @@
+// Copyright (C) 2005 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.
+
+// 25.3.7 [lib.alg.min.max]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+forward_iterator_wrapper<S>
+test1(forward_iterator_wrapper<S>& s)
+{ return std::max_element(s, s); }
+
+forward_iterator_wrapper<X>
+test2(forward_iterator_wrapper<X>& x)
+{ return std::max_element(x, x, predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/merge/1.cc b/libstdc++-v3/testsuite/25_algorithms/merge/1.cc
new file mode 100644
index 00000000000..c0ccd78a97b
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/merge/1.cc
@@ -0,0 +1,101 @@
+// Copyright (C) 2005 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.
+
+// 25.3.4 [lib.alg.merge]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+using std::merge;
+
+typedef test_container<int, input_iterator_wrapper> Icontainer;
+typedef test_container<int, output_iterator_wrapper> Ocontainer;
+
+void
+test1()
+{
+ int array1[1], array2[1];
+ Icontainer con1(array1, array1);
+ Icontainer con2(array1, array1);
+ Ocontainer con3(array2, array2);
+ VERIFY(merge(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array2);
+}
+
+void
+test2()
+{
+ int array1[]={0,1,4};
+ int array2[]={2,3};
+ int array3[5];
+ Icontainer con1(array1, array1 + 3);
+ Icontainer con2(array2, array2 + 2);
+ Ocontainer con3(array3, array3 + 5);
+ VERIFY(merge(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array3 + 5);
+ VERIFY(array3[0] == 0 && array3[1] == 1 && array3[2] == 2 &&
+ array3[3] == 3 && array3[4] == 4);
+
+}
+
+struct S
+{
+ int i;
+ int j;
+ S() {}
+ S(int in)
+ {
+ if(in > 0)
+ {
+ i = in;
+ j = 1;
+ }
+ else
+ {
+ i = -in;
+ j = 0;
+ }
+ }
+};
+
+bool
+operator<(const S& s1, const S& s2)
+{ return s1.i < s2.i; }
+
+void
+test3()
+{
+ S array1[] = { -1 , -3};
+ S array2[] = { 1, 2, 3};
+ S array3[5];
+ merge(array1, array1 + 2, array2, array2 + 3, array3);
+ VERIFY(array3[0].j == 0 && array3[1].j == 1 && array3[2].j == 1 &&
+ array3[3].j == 0 && array3[4].j == 1);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/merge/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/merge/check_type.cc
new file mode 100644
index 00000000000..27681d82dc9
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/merge/check_type.cc
@@ -0,0 +1,46 @@
+// Copyright (C) 2005 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.
+
+// 25.3.4 [lib.alg.merge]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+output_iterator_wrapper<S>
+test1(input_iterator_wrapper<S>& in,
+ output_iterator_wrapper<S>& out)
+{ return std::merge(in, in, in, in, out); }
+
+output_iterator_wrapper<X>
+test2(input_iterator_wrapper<X>& in,
+ output_iterator_wrapper<X>& out)
+{ return std::merge(in, in, in, in, out, predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/min_element/1.cc b/libstdc++-v3/testsuite/25_algorithms/min_element/1.cc
new file mode 100644
index 00000000000..ba9a4a26e77
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/min_element/1.cc
@@ -0,0 +1,71 @@
+// Copyright (C) 2005 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.
+
+// 25.3.7 [lib.alg.min.max]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+using std::min_element;
+
+typedef test_container<int, forward_iterator_wrapper> Container;
+
+void
+test1()
+{
+ // Note: The standard is unclear on what should happen in this case.
+ // This seems the only really sensible behaviour, and what is done.
+ int array[] = {0};
+ Container con(array, array);
+ VERIFY(min_element(con.begin(), con.end()).ptr == array);
+}
+
+void
+test2()
+{
+ int array[] = {0};
+ Container con(array, array + 1);
+ VERIFY(min_element(con.begin(), con.end()).ptr == array);
+}
+
+void
+test3()
+{
+ int array[] = {0, 3};
+ Container con(array, array + 2);
+ VERIFY(min_element(con.begin(), con.end()).ptr == array);
+}
+
+void
+test4()
+{
+ int array[] = {6, 3, 0, 2, 6, 4, 0};
+ Container con(array, array + 7);
+ VERIFY(min_element(con.begin(), con.end()).ptr == array + 2);
+}
+
+int main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/min_element/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/min_element/check_type.cc
new file mode 100644
index 00000000000..e4ff8d341b5
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/min_element/check_type.cc
@@ -0,0 +1,44 @@
+// Copyright (C) 2005 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.
+
+// 25.3.7 [lib.alg.min.max]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+forward_iterator_wrapper<S>
+test1(forward_iterator_wrapper<S>& s)
+{ return std::min_element(s,s); }
+
+forward_iterator_wrapper<X>
+test2(forward_iterator_wrapper<X>& x)
+{ return std::min_element(x,x,predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/mismatch/1.cc b/libstdc++-v3/testsuite/25_algorithms/mismatch/1.cc
new file mode 100644
index 00000000000..a75405999a3
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/mismatch/1.cc
@@ -0,0 +1,89 @@
+// Copyright (C) 2005 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.
+
+// 25.1.7 [lib.mismatch]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+
+typedef test_container<int, input_iterator_wrapper> Container;
+int array1[] = {0, 1};
+int array2[] = {1, 0};
+int array3[] = {1, 0, 1};
+
+void test1a()
+{
+ Container con1(array1, array1);
+ Container con2(array2, array2);
+ VERIFY( std::mismatch(con1.begin(), con1.end(), con2.begin()).first.ptr
+ == array1 );
+}
+
+void test1b()
+{
+ Container con1(array1, array1);
+ Container con2(array2, array2);
+ VERIFY( std::mismatch(con1.begin(), con1.end(), con2.begin()).second.ptr
+ == array2 );
+}
+
+void test2a()
+{
+ Container con1(array1, array1 + 2);
+ Container con2(array2, array2 + 2);
+ VERIFY( std::mismatch(con1.begin(), con1.end(), con2.begin()).first.ptr
+ == array1 );
+}
+
+void test2b()
+{
+ Container con1(array1, array1 + 2);
+ Container con2(array2, array2 + 2);
+ VERIFY( std::mismatch(con1.begin(), con1.end(), con2.begin()).second.ptr
+ == array2 );
+}
+
+void test3a()
+{
+ Container con3(array3, array3 + 2);
+ Container con2(array2, array2 + 2);
+ VERIFY( std::mismatch(con3.begin(), con3.end(), con2.begin()).first.ptr
+ == array3 + 2 );
+}
+
+void test3b()
+{
+ Container con3(array3, array3 + 2);
+ Container con2(array2, array2 + 2);
+ VERIFY( std::mismatch(con3.begin(), con3.end(), con2.begin()).second.ptr
+ == array2 + 2 );
+}
+
+int main()
+{
+ test1a();
+ test1b();
+ test2a();
+ test2b();
+ test3a();
+ test3b();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/mismatch/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/mismatch/check_type.cc
new file mode 100644
index 00000000000..45f46296768
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/mismatch/check_type.cc
@@ -0,0 +1,51 @@
+// Copyright (C) 2005 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.
+
+// 25.1.7 [lib.mismatch]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <utility>
+#include <testsuite_iterators.h>
+
+using __gnu_test::input_iterator_wrapper;
+
+struct Lhs1 { };
+
+struct Rhs1 { };
+
+bool operator==(const Lhs1&, const Rhs1&) {return true;}
+
+struct Lhs2 { };
+
+struct Rhs2 { };
+
+bool predicate(const Lhs2&, const Rhs2&) {return true;}
+
+std::pair<input_iterator_wrapper<Lhs1>, input_iterator_wrapper<Rhs1> >
+test1(input_iterator_wrapper<Lhs1>& lhs1, input_iterator_wrapper<Rhs1>& rhs1)
+{
+ return std::mismatch(lhs1, lhs1, rhs1);
+}
+
+std::pair<input_iterator_wrapper<Lhs2>, input_iterator_wrapper<Rhs2> >
+test2(input_iterator_wrapper<Lhs2>& lhs2, input_iterator_wrapper<Rhs2>& rhs2)
+{
+ return std::mismatch(lhs2, lhs2, rhs2, predicate);
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/next_permutation/1.cc b/libstdc++-v3/testsuite/25_algorithms/next_permutation/1.cc
new file mode 100644
index 00000000000..4c0496c9d36
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/next_permutation/1.cc
@@ -0,0 +1,84 @@
+// Copyright (C) 2005 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.
+
+// 25.3.9 [lib.alg.permutation.generators]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::bidirectional_iterator_wrapper;
+using std::next_permutation;
+
+typedef test_container<int, bidirectional_iterator_wrapper> Container;
+
+void
+test1()
+{
+ // Note: The standard is unclear on what should happen in this case.
+ // This seems the only really sensible behaviour, and what is done.
+ int array[] = {0};
+ Container con(array, array);
+ VERIFY(!next_permutation(con.begin(), con.end()));
+}
+
+void
+test2()
+{
+ int array[] = {0};
+ Container con(array, array + 1);
+ VERIFY(!next_permutation(con.begin(), con.end()));
+}
+
+void
+test3()
+{
+ int array[] = {0, 3};
+ Container con(array, array + 2);
+ VERIFY(next_permutation(con.begin(), con.end()));
+ VERIFY(array[0] == 3 && array[1] == 0);
+ VERIFY(!next_permutation(con.begin(), con.end()));
+ VERIFY(array[0] == 0 && array[1] == 3);
+}
+
+void
+test4()
+{
+ int array[6] = {0, 1, 2, 3, 4, 5};
+ Container con(array, array + 6);
+ for(int i = 0 ; i < 719; ++i)
+ {
+ int temp_array[6];
+ std::copy(array, array + 6, temp_array);
+ VERIFY(next_permutation(array, array + 6));
+ VERIFY(std::lexicographical_compare(temp_array, temp_array + 6,
+ array, array + 6));
+ }
+ VERIFY(!next_permutation(array,array + 6));
+ for(int i = 0; i < 6; ++i)
+ VERIFY(array[i] == i);
+}
+
+int main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/next_permutation/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/next_permutation/check_type.cc
new file mode 100644
index 00000000000..15aff15e08b
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/next_permutation/check_type.cc
@@ -0,0 +1,44 @@
+// Copyright (C) 2005 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.
+
+// 25.3.9 [lib.alg.permutation.generators]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::bidirectional_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+bool
+test1(bidirectional_iterator_wrapper<S>& s)
+{ return std::next_permutation(s,s); }
+
+bool
+test2(bidirectional_iterator_wrapper<X>& x)
+{ return std::next_permutation(x,x,predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/nth_element/1.cc b/libstdc++-v3/testsuite/25_algorithms/nth_element/1.cc
new file mode 100644
index 00000000000..469e64bedf5
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/nth_element/1.cc
@@ -0,0 +1,79 @@
+// Copyright (C) 2005 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.
+
+// 25.3.2 [lib.alg.nth.element]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::random_access_iterator_wrapper;
+using std::nth_element;
+
+typedef test_container<int, random_access_iterator_wrapper> Container;
+
+void
+test1()
+{
+ int array[]={0};
+ Container con(array, array);
+ partial_sort(con.begin(), con.begin(), con.end());
+}
+
+void
+test2()
+{
+ int array[]={2,1,0};
+ Container con(array, array + 2);
+ partial_sort(con.begin(), con.begin(), con.end());
+ partial_sort(con.begin(), con.end(), con.end());
+}
+
+void
+test3()
+{
+ int array[] = {6, 5, 4, 3, 2, 1, 0};
+ Container con(array, array + 7);
+ nth_element(con.begin(), con.it(3), con.end());
+ for(int i = 0; i < 3; ++i)
+ VERIFY(array[i] < array[3]);
+ for(int i = 4; i < 7; ++i)
+ VERIFY(array[3] < array[i]);
+}
+
+void
+test4()
+{
+ int array[] = {0, 6, 1, 5, 2, 4, 3};
+ Container con(array,array + 7);
+ nth_element(con.begin(), con.it(3), con.end());
+ for(int i = 0; i < 3; ++i)
+ VERIFY(array[i] < array[3]);
+ for(int i = 4; i < 7; ++i)
+ VERIFY(array[3] < array[i]);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/nth_element/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/nth_element/check_type.cc
new file mode 100644
index 00000000000..3fd1ebadb2a
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/nth_element/check_type.cc
@@ -0,0 +1,45 @@
+// Copyright (C) 2005 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.
+
+// 25.3.2 [lib.alg.nth.element]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::random_access_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+void
+test1(random_access_iterator_wrapper<S>& s)
+{ std::nth_element(s, s, s); }
+
+void
+test2(random_access_iterator_wrapper<X>& x)
+{ std::nth_element(x, x, x, predicate); }
+
diff --git a/libstdc++-v3/testsuite/25_algorithms/partial_sort/1.cc b/libstdc++-v3/testsuite/25_algorithms/partial_sort/1.cc
new file mode 100644
index 00000000000..35c64ca0665
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/partial_sort/1.cc
@@ -0,0 +1,66 @@
+// Copyright (C) 2005 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.
+
+// 25.3.1.3 [lib.partial.sort]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::random_access_iterator_wrapper;
+using std::partial_sort;
+
+typedef test_container<int, random_access_iterator_wrapper> Container;
+
+void
+test1()
+{
+ int array[]={2,1,0};
+ Container con1(array, array + 2);
+ Container con2(array, array);
+ partial_sort(con2.begin(), con2.begin(), con2.end());
+ partial_sort(con1.begin(), con1.begin(), con1.end());
+ partial_sort(con1.begin(), con1.end(), con1.end());
+}
+
+void
+test2()
+{
+ int array[] = {6, 5, 4, 3, 2, 1, 0};
+ Container con(array, array + 7);
+ partial_sort(con.begin(), con.it(3), con.end());
+ VERIFY(array[0] == 0 && array[1] == 1 && array[2] == 2);
+}
+
+void
+test3()
+{
+ int array[] = {0, 6, 1, 5, 2, 4, 3};
+ Container con(array,array + 7);
+ partial_sort(con.begin(), con.it(3), con.end());
+ VERIFY(array[0] == 0 && array[1] == 1 && array[2] == 2);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/partial_sort/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/partial_sort/check_type.cc
new file mode 100644
index 00000000000..1a6a2e0fec8
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/partial_sort/check_type.cc
@@ -0,0 +1,49 @@
+// Copyright (C) 2005 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.
+
+// 25.3.1.3 [lib.partial.sort]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::random_access_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+void
+test1(random_access_iterator_wrapper<S>& s)
+{
+ std::partial_sort(s, s, s);
+}
+
+void
+test2(random_access_iterator_wrapper<X>& x)
+{
+ std::partial_sort(x, x, x, predicate);
+}
+
diff --git a/libstdc++-v3/testsuite/25_algorithms/partial_sort_copy/1.cc b/libstdc++-v3/testsuite/25_algorithms/partial_sort_copy/1.cc
new file mode 100644
index 00000000000..0b7263d3e30
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/partial_sort_copy/1.cc
@@ -0,0 +1,89 @@
+// Copyright (C) 2005 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.
+
+// 25.3.1.4 [lib.partial.sort.copy]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::random_access_iterator_wrapper;
+using __gnu_test::input_iterator_wrapper;
+using std::partial_sort_copy;
+
+typedef test_container<int, random_access_iterator_wrapper> Rcontainer;
+typedef test_container<int, input_iterator_wrapper> Icontainer;
+
+void
+test1()
+{
+ int array[]={2,1,0};
+ Rcontainer rcon1(array, array);
+ Rcontainer rcon2(array, array + 2);
+ Icontainer icon1(array, array);
+ Icontainer icon2(array, array + 2);
+ partial_sort_copy(icon1.begin(), icon1.end(), rcon1.begin(), rcon1.end());
+ partial_sort_copy(icon1.begin(), icon1.end(), rcon2.begin(), rcon2.end());
+ partial_sort_copy(icon2.begin(), icon2.end(), rcon1.begin(), rcon1.end());
+ partial_sort_copy(icon2.begin(), icon2.end(), rcon2.begin(), rcon2.end());
+}
+
+void
+test2()
+{
+ int array1[] = {4, 3, 2, 1, 0};
+ int array2[5];
+ Icontainer icon(array1, array1 + 5);
+ Rcontainer rcon(array2, array2 + 5);
+ partial_sort_copy(icon.begin(), icon.end(), rcon.begin(), rcon.end());
+ VERIFY(array2[0] == 0 && array2[1] == 1 && array2[2] == 2 &&
+ array2[3] == 3 && array2[4] == 4);
+}
+
+void
+test3()
+{
+ int array1[] = {4, 0, 1, 3, 2};
+ int array2[5];
+ Icontainer icon(array1, array1 + 5);
+ Rcontainer rcon(array2, array2 + 2);
+ partial_sort_copy(icon.begin(), icon.end(), rcon.begin(), rcon.end());
+ VERIFY(array2[0] == 0 && array2[1] == 1);
+}
+
+void
+test4()
+{
+ int array1[] = {4, 1, 3, 2, 0};
+ int array2[20];
+ Icontainer icon(array1, array1 + 5);
+ Rcontainer rcon(array2, array2 + 20);
+ partial_sort_copy(icon.begin(), icon.end(), rcon.begin(), rcon.end());
+ VERIFY(array2[0] == 0 && array2[1] == 1 && array2[2] == 2 &&
+ array2[3] == 3 && array2[4] == 4);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/partial_sort_copy/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/partial_sort_copy/check_type.cc
new file mode 100644
index 00000000000..140f15bcc4d
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/partial_sort_copy/check_type.cc
@@ -0,0 +1,68 @@
+// Copyright (C) 2005 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.
+
+// 25.3.1.4 [lib.partial.sort.copy]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::random_access_iterator_wrapper;
+
+struct S1 { };
+struct S2
+{
+ S2(const S1&) {}
+ S2() {}
+};
+
+bool
+operator<(const S1&, const S1&)
+{return true;}
+
+bool
+operator<(const S2&, const S2&)
+{return true;}
+
+struct X1 { };
+struct X2
+{
+ X2(const X1&) {}
+ X2() {}
+};
+
+struct predicate
+{
+ bool
+ operator()(const X1&, const X1&)
+ {return true;}
+
+ bool
+ operator()(const X2&, const X2&)
+ {return true;}
+};
+
+random_access_iterator_wrapper<S2>
+test1(input_iterator_wrapper<S1>& s1, random_access_iterator_wrapper<S2>& s2)
+{ return std::partial_sort_copy(s1, s1, s2, s2); }
+
+random_access_iterator_wrapper<X2>
+test2(input_iterator_wrapper<X1>& x1, random_access_iterator_wrapper<X2>& x2)
+{ return std::partial_sort_copy(x1, x1, x2, x2, predicate()); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/partition.cc b/libstdc++-v3/testsuite/25_algorithms/partition/partition.cc
index b05c203bd32..b05c203bd32 100644
--- a/libstdc++-v3/testsuite/25_algorithms/partition.cc
+++ b/libstdc++-v3/testsuite/25_algorithms/partition/partition.cc
diff --git a/libstdc++-v3/testsuite/25_algorithms/prev_permutation/1.cc b/libstdc++-v3/testsuite/25_algorithms/prev_permutation/1.cc
new file mode 100644
index 00000000000..530e032d7fc
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/prev_permutation/1.cc
@@ -0,0 +1,84 @@
+// Copyright (C) 2005 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.
+
+// 25.3.9 [lib.alg.permutation.generators]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::bidirectional_iterator_wrapper;
+using std::prev_permutation;
+
+typedef test_container<int, bidirectional_iterator_wrapper> Container;
+
+void
+test1()
+{
+ // Note: The standard is unclear on what should happen in this case.
+ // This seems the only really sensible behaviour, and what is done.
+ int array[] = {0};
+ Container con(array, array);
+ VERIFY(!prev_permutation(con.begin(), con.end()));
+}
+
+void
+test2()
+{
+ int array[] = {0};
+ Container con(array, array + 1);
+ VERIFY(!prev_permutation(con.begin(), con.end()));
+}
+
+void
+test3()
+{
+ int array[] = {3, 0};
+ Container con(array, array + 2);
+ VERIFY(prev_permutation(con.begin(), con.end()));
+ VERIFY(array[0] == 0 && array[1] == 3);
+ VERIFY(!prev_permutation(con.begin(), con.end()));
+ VERIFY(array[0] == 3 && array[1] == 0);
+}
+
+void
+test4()
+{
+ int array[6] = {5, 4, 3, 2, 1, 0};
+ Container con(array, array + 6);
+ for(int i = 0 ; i < 719; ++i)
+ {
+ int temp_array[6];
+ std::copy(array, array + 6, temp_array);
+ VERIFY(prev_permutation(array, array + 6));
+ VERIFY(std::lexicographical_compare(array, array + 6,
+ temp_array, temp_array + 6));
+ }
+ VERIFY(!prev_permutation(array,array + 6));
+ for(int i = 0; i < 6; ++i)
+ VERIFY(array[i] == 5 - i);
+}
+
+int main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/prev_permutation/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/prev_permutation/check_type.cc
new file mode 100644
index 00000000000..f0fafc60cff
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/prev_permutation/check_type.cc
@@ -0,0 +1,44 @@
+// Copyright (C) 2005 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.
+
+// 25.3.9 [lib.alg.permutation.generators]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::bidirectional_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+bool
+test1(bidirectional_iterator_wrapper<S>& s)
+{ return std::prev_permutation(s,s); }
+
+bool
+test2(bidirectional_iterator_wrapper<X>& x)
+{ return std::prev_permutation(x,x,predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/remove/1.cc b/libstdc++-v3/testsuite/25_algorithms/remove/1.cc
new file mode 100644
index 00000000000..95ac53c1ba5
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/remove/1.cc
@@ -0,0 +1,63 @@
+// Copyright (C) 2005 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.
+
+// 25.2.4 remove
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+
+typedef test_container<int, forward_iterator_wrapper> Container;
+
+void
+test1()
+{
+ int array[1];
+ Container con(array, array);
+ VERIFY(std::remove(con.begin(), con.end(), 1).ptr == array);
+}
+
+void
+test2()
+{
+ int array[] = {1};
+ Container con(array, array + 1);
+ VERIFY(std::remove(con.begin(), con.end(), 0).ptr == array + 1);
+ VERIFY(std::remove(con.begin(), con.end(), 1).ptr == array);
+}
+
+void
+test3()
+{
+ int array[] = {0, 1, 0, 1, 0, 0, 1, 1};
+ Container con(array, array + 8);
+ VERIFY(std::remove(con.begin(), con.end(), 1).ptr == array + 4);
+ VERIFY(array[0] == 0 && array[1] == 0 && array[2] == 0 &&
+ array[3] == 0);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/remove/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/remove/check_type.cc
new file mode 100644
index 00000000000..46a44de1cb9
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/remove/check_type.cc
@@ -0,0 +1,39 @@
+// Copyright (C) 2005 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.
+
+// 25.2.7 Remove
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct X { };
+
+struct Y { };
+
+bool
+operator==(const X&, const Y&)
+{ return true; }
+
+forward_iterator_wrapper<X>
+test1(forward_iterator_wrapper<X>& begin,
+ forward_iterator_wrapper<X>& end, const Y& val)
+{ return std::remove(begin, end, val); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/remove_if/1.cc b/libstdc++-v3/testsuite/25_algorithms/remove_if/1.cc
new file mode 100644
index 00000000000..b72e02491aa
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/remove_if/1.cc
@@ -0,0 +1,66 @@
+// Copyright (C) 2005 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.
+
+// 25.2.4 remove
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+
+typedef test_container<int, forward_iterator_wrapper> Container;
+
+bool equal1(int val) { return val == 1; }
+bool equal0(int val) { return val == 0; }
+
+void
+test1()
+{
+ int array[1];
+ Container con(array, array);
+ VERIFY(std::remove_if(con.begin(), con.end(), equal1).ptr == array);
+}
+
+void
+test2()
+{
+ int array[] = {1};
+ Container con(array, array + 1);
+ VERIFY(std::remove_if(con.begin(), con.end(), equal0).ptr == array + 1);
+ VERIFY(std::remove_if(con.begin(), con.end(), equal1).ptr == array);
+}
+
+void
+test3()
+{
+ int array[] = {0, 1, 0, 1, 0, 0, 1, 1};
+ Container con(array, array + 8);
+ VERIFY(std::remove_if(con.begin(), con.end(), equal1).ptr == array + 4);
+ VERIFY(array[0] == 0 && array[1] == 0 && array[2] == 0 &&
+ array[3] == 0);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/remove_if/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/remove_if/check_type.cc
new file mode 100644
index 00000000000..dbcde808bfb
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/remove_if/check_type.cc
@@ -0,0 +1,50 @@
+// Copyright (C) 2005 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.
+
+// 25.2.7 Remove_if
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct X { };
+
+bool
+pred_fn(const X&)
+{ return true; }
+
+struct pred_obj
+{
+ bool
+ operator()(const X&) const
+ { return true; }
+};
+
+forward_iterator_wrapper<X>
+test1(forward_iterator_wrapper<X>& begin,
+ forward_iterator_wrapper<X>& end)
+{ return std::remove_if(begin, end, pred_fn); }
+
+forward_iterator_wrapper<X>
+test2(forward_iterator_wrapper<X>& begin,
+ forward_iterator_wrapper<X>& end)
+{ return std::remove_if(begin, end, pred_obj()); }
+
diff --git a/libstdc++-v3/testsuite/25_algorithms/replace/1.cc b/libstdc++-v3/testsuite/25_algorithms/replace/1.cc
new file mode 100644
index 00000000000..4878855dccd
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/replace/1.cc
@@ -0,0 +1,61 @@
+// Copyright (C) 2005 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.
+
+// 25.2.4 replace
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+
+typedef test_container<int, forward_iterator_wrapper> Container;
+int array[] = {0, 0, 0, 1, 0, 1};
+
+void
+test1()
+{
+ Container con(array, array);
+ std::replace(con.begin(), con.end(), 1, 1);
+}
+
+void
+test2()
+{
+ Container con(array, array + 1);
+ std::replace(con.begin(), con.end(), 0, 1);
+ VERIFY(array[0] == 1);
+}
+
+void
+test3()
+{
+ Container con(array, array + 6);
+ std::replace(con.begin(), con.end(), 1, 2);
+ VERIFY(array[0] == 2 && array[1] == 0 && array[2] == 0 &&
+ array[3] == 2 && array[4] == 0 && array[5] == 2);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/replace/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/replace/check_type.cc
new file mode 100644
index 00000000000..083342192ab
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/replace/check_type.cc
@@ -0,0 +1,38 @@
+// Copyright (C) 2005 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.
+
+// 25.2.4 Replace
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct X { };
+
+bool
+operator==(const X&, const X&)
+{ return true; }
+
+void
+test1(forward_iterator_wrapper<X>& begin,
+ forward_iterator_wrapper<X>& end, const X& old_val,
+ const X& new_val)
+{ return std::replace(begin, end, old_val, new_val); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/replace_copy/1.cc b/libstdc++-v3/testsuite/25_algorithms/replace_copy/1.cc
new file mode 100644
index 00000000000..ebaea0cb666
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/replace_copy/1.cc
@@ -0,0 +1,72 @@
+// Copyright (C) 2005 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.
+
+// 25.2.4 replace_copy
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+
+typedef test_container<int, input_iterator_wrapper> Icontainer;
+typedef test_container<int, output_iterator_wrapper> Ocontainer;
+int array[] = {0, 0, 0, 1, 0, 1};
+
+void
+test1()
+{
+ int out[1];
+ Icontainer in_con(array, array);
+ Ocontainer out_con(out, out);
+ VERIFY(std::replace_copy(in_con.begin(), in_con.end(),
+ out_con.begin(), 1, 1).ptr == out);
+}
+
+void
+test2()
+{
+ int out[1];
+ Icontainer in_con(array, array + 1);
+ Ocontainer out_con(out, out + 1);
+ VERIFY(std::replace_copy(in_con.begin(), in_con.end(),
+ out_con.begin(), 0, 1).ptr == out + 1);
+ VERIFY(out[0] == 1);
+}
+
+void
+test3()
+{
+ int out[6];
+ Icontainer in_con(array, array + 6);
+ Ocontainer out_con(out, out + 6);
+ VERIFY(std::replace_copy(in_con.begin(), in_con.end(),
+ out_con.begin(), 1, 2).ptr == out + 6);
+ VERIFY(out[0] == 0 && out[1] == 0 && out[2] == 0 &&
+ out[3] == 2 && out[4] == 0 && out[5] == 2);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/replace_copy/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/replace_copy/check_type.cc
new file mode 100644
index 00000000000..1a19a16e4ac
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/replace_copy/check_type.cc
@@ -0,0 +1,56 @@
+// Copyright (C) 2005 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.
+
+// 25.2.4 replace_copy
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+
+struct X { };
+
+struct Y { };
+
+struct Z
+{
+ Z&
+ operator=(const X&)
+ { }
+
+ Z&
+ operator=(const Y&)
+ { }
+};
+
+bool
+operator==(const X&, const Y&)
+{ return true; }
+
+output_iterator_wrapper<Z>
+test1(input_iterator_wrapper<X>& begin,
+ input_iterator_wrapper<X>& end,
+ output_iterator_wrapper<Z>& output,
+ const Y& old_val, const Y& new_val)
+{
+ return std::replace_copy(begin, end, output, old_val,
+ new_val);
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/replace_copy_if/1.cc b/libstdc++-v3/testsuite/25_algorithms/replace_copy_if/1.cc
new file mode 100644
index 00000000000..2c9c32d67dd
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/replace_copy_if/1.cc
@@ -0,0 +1,76 @@
+// Copyright (C) 2005 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.
+
+// 25.2.4 replace_copy_if
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+
+typedef test_container<int, input_iterator_wrapper> Icontainer;
+typedef test_container<int, output_iterator_wrapper> Ocontainer;
+int array[] = {0, 0, 0, 1, 0, 1};
+
+bool
+pred(int i)
+{ return i == 1; }
+
+void
+test1()
+{
+ int out[1];
+ Icontainer in_con(array, array);
+ Ocontainer out_con(out, out);
+ VERIFY(std::replace_copy_if(in_con.begin(), in_con.end(),
+ out_con.begin(), pred, 1).ptr == out);
+}
+
+void
+test2()
+{
+ int out[1];
+ Icontainer in_con(array, array + 1);
+ Ocontainer out_con(out, out + 1);
+ VERIFY(std::replace_copy_if(in_con.begin(), in_con.end(),
+ out_con.begin(), pred, 2).ptr == out + 1);
+ VERIFY(out[0] == 0);
+}
+
+void
+test3()
+{
+ int out[6];
+ Icontainer in_con(array, array + 6);
+ Ocontainer out_con(out, out + 6);
+ VERIFY(std::replace_copy_if(in_con.begin(), in_con.end(),
+ out_con.begin(), pred, 2).ptr == out + 6);
+ VERIFY(out[0] == 0 && out[1] == 0 && out[2] == 0 &&
+ out[3] == 2 && out[4] == 0 && out[5] == 2);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/replace_copy_if/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/replace_copy_if/check_type.cc
new file mode 100644
index 00000000000..55b90402242
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/replace_copy_if/check_type.cc
@@ -0,0 +1,56 @@
+// Copyright (C) 2005 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.
+
+// 25.2.4 replace_copy_if
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+
+struct X { };
+
+struct Y { };
+
+struct Z
+{
+ Z&
+ operator=(const X&)
+ { }
+
+ Z&
+ operator=(const Y&)
+ { }
+};
+
+bool
+predicate(const X&)
+{ return true; }
+
+output_iterator_wrapper<Z>
+test1(input_iterator_wrapper<X>& begin,
+ input_iterator_wrapper<X>& end,
+ output_iterator_wrapper<Z>& output,
+ const Y& new_val)
+{
+ return std::replace_copy_if(begin, end, output, predicate,
+ new_val);
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/replace_if/1.cc b/libstdc++-v3/testsuite/25_algorithms/replace_if/1.cc
new file mode 100644
index 00000000000..98cf1f3dde1
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/replace_if/1.cc
@@ -0,0 +1,65 @@
+// Copyright (C) 2005 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.
+
+// 25.2.4 replace_if
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+
+typedef test_container<int, forward_iterator_wrapper> Container;
+int array[] = {1, 0, 0, 1, 0, 1};
+
+bool
+predicate(const int& i)
+{ return i == 1; }
+
+void
+test1()
+{
+ Container con(array, array);
+ std::replace_if(con.begin(), con.end(), predicate, 1);
+}
+
+void
+test2()
+{
+ Container con(array, array + 1);
+ std::replace_if(con.begin(), con.end(), predicate, 2);
+ VERIFY(array[0] == 2);
+}
+
+void
+test3()
+{
+ Container con(array, array + 6);
+ std::replace_if(con.begin(), con.end(), predicate, 3);
+ VERIFY(array[0] == 2 && array[1] == 0 && array[2] == 0 &&
+ array[3] == 3 && array[4] == 0 && array[5] == 3);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/replace_if/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/replace_if/check_type.cc
new file mode 100644
index 00000000000..b8adaec9fcc
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/replace_if/check_type.cc
@@ -0,0 +1,52 @@
+// Copyright (C) 2005 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.
+
+// 25.2.4 replace_if
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct X { };
+
+bool
+pred_fn(const X&)
+{ return true; }
+
+struct pred_obj
+{
+ bool
+ operator()(const X&)
+ { return true; }
+};
+
+
+void
+test1(forward_iterator_wrapper<X>& begin,
+ forward_iterator_wrapper<X>& end, const X& new_val)
+{ return std::replace_if(begin, end, pred_fn, new_val); }
+
+void
+test2(forward_iterator_wrapper<X>& begin,
+ forward_iterator_wrapper<X>& end, const X& new_val)
+{ return std::replace_if(begin, end, pred_obj(), new_val); }
+
+
diff --git a/libstdc++-v3/testsuite/25_algorithms/rotate/1.cc b/libstdc++-v3/testsuite/25_algorithms/rotate/1.cc
new file mode 100644
index 00000000000..be41d57bc99
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/rotate/1.cc
@@ -0,0 +1,126 @@
+// Copyright (C) 2005 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.
+
+// 25.2.10 rotate
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+using __gnu_test::bidirectional_iterator_wrapper;
+using __gnu_test::random_access_iterator_wrapper;
+
+typedef test_container<int, forward_iterator_wrapper> Fcontainer;
+typedef test_container<int, bidirectional_iterator_wrapper> Bcontainer;
+typedef test_container<int, random_access_iterator_wrapper> Rcontainer;
+
+
+
+void
+test1()
+{
+ bool test __attribute__((unused)) = true;
+ int array[]={1};
+ Fcontainer fcon(array, array);
+ Bcontainer bcon(array, array);
+ Rcontainer rcon(array, array);
+ std::rotate(fcon.begin(), fcon.begin(), fcon.end());
+ std::rotate(bcon.begin(), bcon.begin(), bcon.end());
+ std::rotate(rcon.begin(), rcon.begin(), rcon.end());
+}
+
+void
+test2()
+{
+ bool test __attribute__((unused)) = true;
+ int array[] = {1};
+ Fcontainer fcon(array, array + 1);
+ Bcontainer bcon(array, array + 1);
+ Rcontainer rcon(array, array + 1);
+ std::rotate(fcon.begin(), fcon.begin(), fcon.end());
+ std::rotate(bcon.begin(), bcon.begin(), bcon.end());
+ std::rotate(rcon.begin(), rcon.begin(), rcon.end());
+ std::rotate(fcon.begin(), fcon.end(), fcon.end());
+ std::rotate(bcon.begin(), bcon.end(), bcon.end());
+ std::rotate(rcon.begin(), rcon.end(), rcon.end());
+}
+
+void
+test3()
+{
+ bool test __attribute__((unused)) = true;
+ int array[] = {1, 2, 3, 4, 5};
+ Fcontainer fcon(array, array + 5);
+ Bcontainer bcon(array, array + 5);
+ Rcontainer rcon(array, array + 5);
+ std::rotate(fcon.begin(), fcon.it(2), fcon.end());
+ VERIFY(array[0] == 3 && array[1] == 4 && array[2] == 5 &&
+ array[3] == 1 && array[4] == 2);
+ std::rotate(bcon.begin(), bcon.it(2), bcon.end());
+ VERIFY(array[0] == 5 && array[1] == 1 && array[2] == 2 &&
+ array[3] == 3 && array[4] == 4);
+ std::rotate(rcon.begin(), rcon.it(2), rcon.end());
+ VERIFY(array[0] == 2 && array[1] == 3 && array[2] == 4 &&
+ array[3] == 5 && array[4] == 1);
+}
+
+void
+test4()
+{
+ bool test __attribute__((unused)) = true;
+ int array[] = {1, 2, 3, 4};
+ Fcontainer fcon(array, array + 4);
+ Bcontainer bcon(array, array + 4);
+ Rcontainer rcon(array, array + 4);
+
+ std::rotate(fcon.begin(), fcon.it(3), fcon.end());
+ VERIFY(array[0] == 4 && array[1] == 1 && array[2] == 2 &&
+ array[3] == 3);
+
+ std::rotate(bcon.begin(), bcon.it(3), bcon.end());
+ VERIFY(array[0] == 3 && array[1] == 4 && array[2] == 1 &&
+ array[3] == 2);
+
+ std::rotate(rcon.begin(), rcon.it(3), rcon.end());
+ VERIFY(array[0] == 2 && array[1] == 3 && array[2] == 4 &&
+ array[3] == 1);
+
+}
+
+void
+test5()
+{
+ bool test __attribute__((unused)) = true;
+ int array[] = {1, 2, 3, 4};
+ Rcontainer con(array, array + 4);
+ std::rotate(con.begin(), con.it(2), con.end());
+ VERIFY(array[0] == 3 && array[1] == 4 && array[2] == 1 &&
+ array[3] == 2);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+ test5();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/rotate/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/rotate/check_type.cc
new file mode 100644
index 00000000000..31b7123954c
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/rotate/check_type.cc
@@ -0,0 +1,48 @@
+// Copyright (C) 2005 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.
+
+// 25.2.10 Rotate
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+struct X { };
+
+bool operator<(X,X) { return true;}
+
+void
+test1(__gnu_test::forward_iterator_wrapper<X>& begin,
+ __gnu_test::forward_iterator_wrapper<X>& middle,
+ __gnu_test::forward_iterator_wrapper<X>& end)
+{ return std::rotate(begin,middle,end); }
+
+void
+test1(__gnu_test::bidirectional_iterator_wrapper<X>& begin,
+ __gnu_test::bidirectional_iterator_wrapper<X>& middle,
+ __gnu_test::bidirectional_iterator_wrapper<X>& end)
+{ return std::rotate(begin,middle,end); }
+
+void
+test1(__gnu_test::random_access_iterator_wrapper<X>& begin,
+ __gnu_test::random_access_iterator_wrapper<X>& middle,
+ __gnu_test::random_access_iterator_wrapper<X>& end)
+{ return std::rotate(begin,middle,end); }
+
+
diff --git a/libstdc++-v3/testsuite/25_algorithms/rotate.cc b/libstdc++-v3/testsuite/25_algorithms/rotate/rotate.cc
index 00768a230c8..00768a230c8 100644
--- a/libstdc++-v3/testsuite/25_algorithms/rotate.cc
+++ b/libstdc++-v3/testsuite/25_algorithms/rotate/rotate.cc
diff --git a/libstdc++-v3/testsuite/25_algorithms/search/1.cc b/libstdc++-v3/testsuite/25_algorithms/search/1.cc
new file mode 100644
index 00000000000..5a0ed51cb68
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/search/1.cc
@@ -0,0 +1,113 @@
+// Copyright (C) 2005 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.
+
+// 25.1.5 [lib.alg.search]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+using std::search;
+
+typedef test_container<int, forward_iterator_wrapper> Container;
+int array1[] = {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1};
+int array2[] = {0, 0, 0};
+
+void
+test1()
+{
+ bool test __attribute__((unused)) = true;
+ Container con1(array1, array1);
+ Container con2(array1, array1 + 1);
+ VERIFY(search(con1.begin(), con1.end(), con2.begin(), con2.end()).ptr == array1);
+ VERIFY(search(con2.begin(), con2.end(), con1.begin(), con1.end()).ptr == array1);
+}
+
+void
+test2()
+{
+ bool test __attribute__((unused)) = true;
+ Container con1(array1, array1 + 3);
+ Container con2(array2, array2 + 3);
+ VERIFY(search(con1.begin(), con1.end(), con2.begin(), con2.end()).ptr
+ == array1);
+}
+
+void
+test3()
+{
+ bool test __attribute__((unused)) = true;
+ Container con1(array1 + 3, array1 + 10);
+ Container con2(array2, array2 + 3);
+ VERIFY(search(con1.begin(), con1.end(), con2.begin(), con2.end()).ptr
+ == array1 + 10);
+}
+
+void
+test4()
+{
+ bool test __attribute__((unused)) = true;
+ Container con1(array1, array1 + 10);
+ Container con2(array2, array2 + 1);
+ VERIFY(search(con1.begin(), con1.end(), con2.begin(), con2.end()).ptr
+ == array1);
+}
+
+void
+test5()
+{
+ bool test __attribute__((unused)) = true;
+ Container con1(array1 + 6, array1 + 10);
+ Container con2(array2, array2 + 1);
+ VERIFY(search(con1.begin(), con1.end(), con2.begin(), con2.end()).ptr
+ == array1 + 10);
+}
+
+void
+test6()
+{
+ bool test __attribute__((unused)) = true;
+ int array3[]={2, 2, 1, 2, 3, 5};
+ int array4[]={1, 2, 3, 4};
+ Container con1(array3, array3 + 3);
+ Container con2(array3, array3 + 4);
+ Container con3(array3, array3 + 5);
+ Container con4(array3, array3 + 6);
+ Container endcon(array4, array4 + 4);
+ VERIFY(search(con1.begin(), con1.end(), endcon.begin(), endcon.end()).ptr
+ == array3 + 3);
+ VERIFY(search(con2.begin(), con2.end(), endcon.begin(), endcon.end()).ptr
+ == array3 + 4);
+ VERIFY(search(con3.begin(), con3.end(), endcon.begin(), endcon.end()).ptr
+ == array3 + 5);
+ VERIFY(search(con4.begin(), con4.end(), endcon.begin(), endcon.end()).ptr
+ == array3 + 6);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+ test5();
+ test6();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/search/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/search/check_type.cc
new file mode 100644
index 00000000000..9e3a587f2b7
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/search/check_type.cc
@@ -0,0 +1,46 @@
+// Copyright (C) 2005 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.
+
+// 25.1.9 [lib.alg.search]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct S1 { };
+struct S2 { };
+
+bool
+operator==(const S1&, const S2&) {return true;}
+
+struct X1 { };
+struct X2 { };
+
+bool
+predicate(const X1&, const X2&) {return true;}
+
+forward_iterator_wrapper<S1>
+test1(forward_iterator_wrapper<S1>& s1, forward_iterator_wrapper<S2>& s2)
+{ return std::search(s1, s1, s2, s2); }
+
+forward_iterator_wrapper<X1>
+test2(forward_iterator_wrapper<X1>& x1, forward_iterator_wrapper<X2>& x2)
+{ return std::search(x1, x1, x2, x2, predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/search_n/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/search_n/check_type.cc
new file mode 100644
index 00000000000..dd4073ff308
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/search_n/check_type.cc
@@ -0,0 +1,39 @@
+// Copyright (C) 2005 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.
+
+// 25.1.9 search_n
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct X { };
+
+struct Y { };
+
+bool
+operator==(const X&, const Y&)
+{ return true; }
+
+forward_iterator_wrapper<X>
+test1(forward_iterator_wrapper<X>& begin,
+ forward_iterator_wrapper<X>& end, int i, Y& value)
+{ return std::search_n(begin, end, i , value); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/search_n/iterator.cc b/libstdc++-v3/testsuite/25_algorithms/search_n/iterator.cc
index f822745be22..fea009d2775 100644
--- a/libstdc++-v3/testsuite/25_algorithms/search_n/iterator.cc
+++ b/libstdc++-v3/testsuite/25_algorithms/search_n/iterator.cc
@@ -76,7 +76,7 @@ int main() {
{
test_container<int, forward_iterator_wrapper>
forwardcon(array2, array2 + i);
- test_container<int, bidirectional_iterator_wrapper>
+ test_container<int, random_access_iterator_wrapper>
randomcon(array2, array2 + i);
test_container<int, bidirectional_iterator_wrapper>
bidircon(array2, array2 + i);
diff --git a/libstdc++-v3/testsuite/25_algorithms/set_difference/1.cc b/libstdc++-v3/testsuite/25_algorithms/set_difference/1.cc
new file mode 100644
index 00000000000..9d0fbe62639
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/set_difference/1.cc
@@ -0,0 +1,132 @@
+// Copyright (C) 2005 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.
+
+// 25.3.5.3 [lib.set.difference]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+using std::set_difference;
+
+typedef test_container<int, input_iterator_wrapper> Icontainer;
+typedef test_container<int, output_iterator_wrapper> Ocontainer;
+
+void
+test1()
+{
+ int array1[1], array2[1];
+ Icontainer con1(array1, array1);
+ Icontainer con2(array1, array1);
+ Ocontainer con3(array2, array2);
+ VERIFY(set_difference(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array2);
+}
+
+void
+test2()
+{
+ int array1[] = {1};
+ int array2[] = {0};
+ Icontainer con1(array1, array1);
+ Icontainer con2(array1, array1 + 1);
+ Ocontainer con3(array2, array2);
+ VERIFY(set_difference(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array2);
+}
+
+void
+test3()
+{
+ int array1[] = {1};
+ int array2[] = {0};
+ Icontainer con1(array1, array1 + 1);
+ Icontainer con2(array1, array1);
+ Ocontainer con3(array2, array2 + 1);
+ VERIFY(set_difference(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array2 + 1);
+}
+
+void
+test4()
+{
+ int array1[]={0,1,1,2,4};
+ int array2[]={1,2,3};
+ int array3[6];
+ Icontainer con1(array1, array1 + 5);
+ Icontainer con2(array2, array2 + 3);
+ Ocontainer con3(array3, array3 + 3);
+ VERIFY(set_difference(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array3 + 3);
+ VERIFY(array3[0] == 0 && array3[1] == 1 && array3[2] == 4);
+}
+
+struct S
+{
+ int i;
+ int j;
+ S() {}
+ S(int in)
+ {
+ if(in > 0)
+ {
+ i = in;
+ j = 1;
+ }
+ else
+ {
+ i = -in;
+ j = 0;
+ }
+ }
+};
+
+bool
+operator<(const S& s1, const S& s2)
+{ return s1.i < s2.i; }
+
+typedef test_container<S, input_iterator_wrapper> SIcontainer;
+typedef test_container<S, output_iterator_wrapper> SOcontainer;
+
+void
+test5()
+{
+ S array1[] = { -1, -1, -1, -2, -2, -3, -4};
+ S array2[] = { 1, 1, 1, 1, 2, 4, 4};
+ S array3[9];
+ SIcontainer con1(array1, array1 + 7);
+ SIcontainer con2(array2, array2 + 7);
+ SOcontainer con3(array3, array3 + 2);
+ VERIFY(set_difference(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array3 + 2);
+ for(int i = 0; i < 2; ++i)
+ VERIFY(array3[i].j == 0);
+}
+
+int main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+ test5();
+}
+
diff --git a/libstdc++-v3/testsuite/25_algorithms/set_difference/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/set_difference/check_type.cc
new file mode 100644
index 00000000000..43d54ad5ae3
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/set_difference/check_type.cc
@@ -0,0 +1,44 @@
+// Copyright (C) 2005 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.
+
+// 25.3.5.4 [lib.set.difference]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+output_iterator_wrapper<S>
+test1(input_iterator_wrapper<S>& in, output_iterator_wrapper<S>& out)
+{ return std::set_difference(in, in, in, in, out); }
+
+output_iterator_wrapper<X>
+test2(input_iterator_wrapper<X>& in, output_iterator_wrapper<X>& out)
+{ return std::set_difference(in, in, in, in, out, predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/set_intersection/1.cc b/libstdc++-v3/testsuite/25_algorithms/set_intersection/1.cc
new file mode 100644
index 00000000000..d0a648e9a53
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/set_intersection/1.cc
@@ -0,0 +1,132 @@
+// Copyright (C) 2005 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.
+
+// 25.3.5.3 [lib.set.intersection]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+using std::set_intersection;
+
+typedef test_container<int, input_iterator_wrapper> Icontainer;
+typedef test_container<int, output_iterator_wrapper> Ocontainer;
+
+void
+test1()
+{
+ int array1[1], array2[1];
+ Icontainer con1(array1, array1);
+ Icontainer con2(array1, array1);
+ Ocontainer con3(array2, array2);
+ VERIFY(set_intersection(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array2);
+}
+
+void
+test2()
+{
+ int array1[] = {1};
+ int array2[] = {0};
+ Icontainer con1(array1, array1);
+ Icontainer con2(array1, array1 + 1);
+ Ocontainer con3(array2, array2);
+ VERIFY(set_intersection(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array2);
+}
+
+void
+test3()
+{
+ int array1[] = {1};
+ int array2[] = {0};
+ Icontainer con1(array1, array1 + 1);
+ Icontainer con2(array1, array1);
+ Ocontainer con3(array2, array2);
+ VERIFY(set_intersection(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array2);
+}
+
+void
+test4()
+{
+ int array1[]={0,1,1,2,4};
+ int array2[]={1,2,3};
+ int array3[6];
+ Icontainer con1(array1, array1 + 5);
+ Icontainer con2(array2, array2 + 3);
+ Ocontainer con3(array3, array3 + 2);
+ VERIFY(set_intersection(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array3 + 2);
+ VERIFY(array3[0] == 1 && array3[1] == 2);
+}
+
+struct S
+{
+ int i;
+ int j;
+ S() {}
+ S(int in)
+ {
+ if(in > 0)
+ {
+ i = in;
+ j = 1;
+ }
+ else
+ {
+ i = -in;
+ j = 0;
+ }
+ }
+};
+
+bool
+operator<(const S& s1, const S& s2)
+{ return s1.i < s2.i; }
+
+typedef test_container<S, input_iterator_wrapper> SIcontainer;
+typedef test_container<S, output_iterator_wrapper> SOcontainer;
+
+void
+test5()
+{
+ S array1[] = { -1, -1, -1, -2, -2, -4};
+ S array2[] = { 1, 1, 1, 1, 2, 3, 4, 4};
+ S array3[5];
+ SIcontainer con1(array1, array1 + 6);
+ SIcontainer con2(array2, array2 + 8);
+ SOcontainer con3(array3, array3 + 5);
+ VERIFY(set_intersection(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array3 + 5);
+ for(int i = 0; i < 5; ++i)
+ VERIFY(array3[i].j == 0);
+}
+
+int main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+ test5();
+}
+
diff --git a/libstdc++-v3/testsuite/25_algorithms/set_intersection/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/set_intersection/check_type.cc
new file mode 100644
index 00000000000..a1ef6f9486e
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/set_intersection/check_type.cc
@@ -0,0 +1,44 @@
+// Copyright (C) 2005 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.
+
+// 25.3.5.3 [lib.set.intersection]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+output_iterator_wrapper<S>
+test1(input_iterator_wrapper<S>& in, output_iterator_wrapper<S>& out)
+{ return std::set_intersection(in, in, in, in, out); }
+
+output_iterator_wrapper<X>
+test2(input_iterator_wrapper<X>& in, output_iterator_wrapper<X>& out)
+{ return std::set_intersection(in, in, in, in, out, predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/set_symmetric_difference/1.cc b/libstdc++-v3/testsuite/25_algorithms/set_symmetric_difference/1.cc
new file mode 100644
index 00000000000..932eb4f41cf
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/set_symmetric_difference/1.cc
@@ -0,0 +1,134 @@
+// Copyright (C) 2005 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.
+
+// 25.3.5.5 [lib.set.symmetric.difference]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+using std::set_symmetric_difference;
+
+typedef test_container<int, input_iterator_wrapper> Icontainer;
+typedef test_container<int, output_iterator_wrapper> Ocontainer;
+
+void
+test1()
+{
+ int array1[1], array2[1];
+ Icontainer con1(array1, array1);
+ Icontainer con2(array1, array1);
+ Ocontainer con3(array2, array2);
+ VERIFY(set_symmetric_difference(con1.begin(), con1.end(), con2.begin(),
+ con2.end(), con3.begin()).ptr == array2);
+}
+
+void
+test2()
+{
+ int array1[] = {1};
+ int array2[] = {0};
+ Icontainer con1(array1, array1);
+ Icontainer con2(array1, array1 + 1);
+ Ocontainer con3(array2, array2 + 1);
+ VERIFY(set_symmetric_difference(con1.begin(), con1.end(), con2.begin(),
+ con2.end(), con3.begin()).ptr == array2 + 1);
+}
+
+void
+test3()
+{
+ int array1[] = {1};
+ int array2[] = {0};
+ Icontainer con1(array1, array1 + 1);
+ Icontainer con2(array1, array1);
+ Ocontainer con3(array2, array2 + 1);
+ VERIFY(set_symmetric_difference(con1.begin(), con1.end(), con2.begin(),
+ con2.end(), con3.begin()).ptr == array2 + 1);
+}
+
+void
+test4()
+{
+ int array1[]={0,1,1,2,4};
+ int array2[]={1,2,2,3};
+ int array3[5];
+ Icontainer con1(array1, array1 + 5);
+ Icontainer con2(array2, array2 + 4);
+ Ocontainer con3(array3, array3 + 5);
+ VERIFY(set_symmetric_difference(con1.begin(), con1.end(), con2.begin(),
+ con2.end(), con3.begin()).ptr == array3 + 5);
+ VERIFY(array3[0] == 0 && array3[1] == 1 && array3[2] == 2 &&
+ array3[3] == 3 && array3[4] == 4);
+}
+
+struct S
+{
+ int i;
+ int j;
+ S() {}
+ S(int in)
+ {
+ if(in > 0)
+ {
+ i = in;
+ j = 1;
+ }
+ else
+ {
+ i = -in;
+ j = 0;
+ }
+ }
+};
+
+bool
+operator<(const S& s1, const S& s2)
+{ return s1.i < s2.i; }
+
+typedef test_container<S, input_iterator_wrapper> SIcontainer;
+typedef test_container<S, output_iterator_wrapper> SOcontainer;
+
+void
+test5()
+{
+ S array1[] = { -1, -1, -2, -2, -4, -5};
+ S array2[] = { 1, 1, 1, 2, 3, 4};
+ S array3[4];
+ SIcontainer con1(array1, array1 + 6);
+ SIcontainer con2(array2, array2 + 6);
+ SOcontainer con3(array3, array3 + 4);
+ VERIFY(set_symmetric_difference(con1.begin(), con1.end(), con2.begin(),
+ con2.end(), con3.begin()).ptr == array3 + 4);
+ VERIFY(array3[0].j == 1 && array3[1].j == 0 && array3[2].j == 1 &&
+ array3[3].j == 0);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+ test5();
+}
+
diff --git a/libstdc++-v3/testsuite/25_algorithms/set_symmetric_difference/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/set_symmetric_difference/check_type.cc
new file mode 100644
index 00000000000..c9c63a7f2d0
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/set_symmetric_difference/check_type.cc
@@ -0,0 +1,45 @@
+// Copyright (C) 2005 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.
+
+// 25.3.5.5 [lib.set.symmetric.difference]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+output_iterator_wrapper<S>
+test1(input_iterator_wrapper<S>& in, output_iterator_wrapper<S>& out)
+{ return std::set_symmetric_difference(in, in, in, in, out); }
+
+output_iterator_wrapper<X>
+test2(input_iterator_wrapper<X>& in, output_iterator_wrapper<X>& out)
+{ return std::set_symmetric_difference(in, in, in, in, out, predicate);
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/set_union/1.cc b/libstdc++-v3/testsuite/25_algorithms/set_union/1.cc
new file mode 100644
index 00000000000..03bfcaca8b2
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/set_union/1.cc
@@ -0,0 +1,137 @@
+// Copyright (C) 2005 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.
+
+// 25.3.5.2 [lib.set.union]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+using std::set_union;
+
+typedef test_container<int, input_iterator_wrapper> Icontainer;
+typedef test_container<int, output_iterator_wrapper> Ocontainer;
+
+void
+test1()
+{
+ int array1[1], array2[1];
+ Icontainer con1(array1, array1);
+ Icontainer con2(array1, array1);
+ Ocontainer con3(array2, array2);
+ VERIFY(set_union(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array2);
+}
+
+void
+test2()
+{
+ int array1[] = {1};
+ int array2[] = {0};
+ Icontainer con1(array1, array1);
+ Icontainer con2(array1, array1 + 1);
+ Ocontainer con3(array2, array2 + 1);
+ VERIFY(set_union(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array2 + 1);
+ VERIFY(array2[0] == 1);
+}
+
+void
+test3()
+{
+ int array1[] = {1};
+ int array2[] = {0};
+ Icontainer con1(array1, array1 + 1);
+ Icontainer con2(array1, array1);
+ Ocontainer con3(array2, array2 + 1);
+ VERIFY(set_union(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array2 + 1);
+ VERIFY(array2[0] == 1);
+}
+
+void
+test4()
+{
+ int array1[]={0,1,1,2,4};
+ int array2[]={1,2,3};
+ int array3[6];
+ Icontainer con1(array1, array1 + 5);
+ Icontainer con2(array2, array2 + 3);
+ Ocontainer con3(array3, array3 + 6);
+ VERIFY(set_union(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array3 + 6);
+ VERIFY(array3[0] == 0 && array3[1] == 1 && array3[2] == 1 &&
+ array3[3] == 2 && array3[4] == 3 && array3[5] == 4);
+}
+
+struct S
+{
+ int i;
+ int j;
+ S() {}
+ S(int in)
+ {
+ if(in > 0)
+ {
+ i = in;
+ j = 1;
+ }
+ else
+ {
+ i = -in;
+ j = 0;
+ }
+ }
+};
+
+bool
+operator<(const S& s1, const S& s2)
+{ return s1.i < s2.i; }
+
+typedef test_container<S, input_iterator_wrapper> SIcontainer;
+typedef test_container<S, output_iterator_wrapper> SOcontainer;
+
+void
+test5()
+{
+ S array1[] = { -1, -1, -1, -2, -2, -4};
+ S array2[] = { 1, 1, 1, 1, 2, 3, 4, 4};
+ S array3[9];
+ SIcontainer con1(array1, array1 + 6);
+ SIcontainer con2(array2, array2 + 8);
+ SOcontainer con3(array3, array3 + 9);
+ VERIFY(set_union(con1.begin(), con1.end(), con2.begin(), con2.end(),
+ con3.begin()).ptr == array3 + 9);
+ VERIFY(array3[0].j == 0 && array3[1].j == 0 && array3[2].j == 0 &&
+ array3[3].j == 1 && array3[4].j == 0 && array3[5].j == 0 &&
+ array3[6].j == 1 && array3[7].j == 0 && array3[8].j == 1);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+ test5();
+}
+
diff --git a/libstdc++-v3/testsuite/25_algorithms/set_union/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/set_union/check_type.cc
new file mode 100644
index 00000000000..286de97fec4
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/set_union/check_type.cc
@@ -0,0 +1,44 @@
+// Copyright (C) 2005 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.
+
+// 25.3.5.2 [lib.set.union]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+output_iterator_wrapper<S>
+test1(input_iterator_wrapper<S>& in, output_iterator_wrapper<S>& out)
+{ return std::set_union(in, in, in, in, out); }
+
+output_iterator_wrapper<X>
+test2(input_iterator_wrapper<X>& in, output_iterator_wrapper<X>& out)
+{ return std::set_union(in, in, in, in, out, predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/stable_sort/1.cc b/libstdc++-v3/testsuite/25_algorithms/stable_sort/1.cc
new file mode 100644
index 00000000000..659c2782a39
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/stable_sort/1.cc
@@ -0,0 +1,90 @@
+// Copyright (C) 2005 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.
+
+// 25.3.1.2 [lib.stable.sort]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::random_access_iterator_wrapper;
+using std::stable_sort;
+
+typedef test_container<int, random_access_iterator_wrapper> Container;
+
+void
+test1()
+{
+ int array[]={0};
+ Container con(array, array);
+ stable_sort(con.begin(), con.end());
+}
+
+void
+test2()
+{
+ int array[] = {6, 5, 4, 3, 2, 1, 0};
+ Container con(array, array + 7);
+ stable_sort(con.begin(), con.end());
+ VERIFY(array[0] == 0 && array[1] == 1 && array[2] == 2 &&
+ array[3] == 3 && array[4] == 4 && array[5] == 5 &&
+ array[6] == 6);
+}
+struct S
+{
+ int i;
+ int j;
+ S() {}
+ S(int in)
+ {
+ if(in > 0)
+ {
+ i = in;
+ j = 1;
+ }
+ else
+ {
+ i = -in;
+ j = 0;
+ }
+ }
+};
+
+bool
+operator<(const S& s1, const S& s2)
+{ return s1.i < s2.i; }
+
+void
+test3()
+{
+
+ S array[] = {-1, -2, 1, 2, -3 ,-5 ,3 , -4, 5, 4};
+ test_container<S, random_access_iterator_wrapper> con(array,array + 10);
+ stable_sort(con.begin(), con.end());
+ for(int i = 0; i < 10; ++i)
+ VERIFY(array[i].j == i % 2);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/stable_sort/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/stable_sort/check_type.cc
new file mode 100644
index 00000000000..8e7c51d18d7
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/stable_sort/check_type.cc
@@ -0,0 +1,49 @@
+// Copyright (C) 2005 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.
+
+// 25.3.1.1 [lib.stable.sort]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::random_access_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+void
+test1(random_access_iterator_wrapper<S>& s)
+{
+ std::stable_sort(s, s);
+}
+
+void
+test2(random_access_iterator_wrapper<X>& x)
+{
+ std::stable_sort(x, x, predicate);
+}
+
diff --git a/libstdc++-v3/testsuite/25_algorithms/swap_ranges/1.cc b/libstdc++-v3/testsuite/25_algorithms/swap_ranges/1.cc
new file mode 100644
index 00000000000..e4a23e28afd
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/swap_ranges/1.cc
@@ -0,0 +1,60 @@
+// Copyright (C) 2005 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.
+
+// 25.2.2 swap_ranges
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+
+typedef test_container<int, forward_iterator_wrapper> Container;
+
+
+void
+test1()
+{
+ bool test __attribute__((unused)) = true;
+ int array1[]={1, 2};
+ int array2[]={3, 4};
+ Container con1(array1, array1 + 2);
+ Container con2(array2, array2 + 2);
+ VERIFY(std::swap_ranges(con1.begin(), con1.end(), con2.begin()).ptr ==
+ array2 + 2);
+ VERIFY(array1[0] == 3 && array1[1] == 4 && array2[0] == 1 && array2[1] == 2);
+}
+
+void
+test2()
+{
+ bool test __attribute__((unused)) = true;
+ int array1[] = {1};
+ int array2[] = {1};
+ Container con1(array1, array1);
+ Container con2(array2, array2);
+ VERIFY(swap_ranges(con1.begin(), con1.end(), con2.begin()).ptr == array2);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/swap_ranges/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/swap_ranges/check_type.cc
new file mode 100644
index 00000000000..a19d92c6518
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/swap_ranges/check_type.cc
@@ -0,0 +1,35 @@
+// Copyright (C) 2005 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.
+
+// 25.2.4 Swap Ranges
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct X {
+};
+
+void
+test1(forward_iterator_wrapper<X>& begin,
+ forward_iterator_wrapper<X>& end,
+ forward_iterator_wrapper<X>& begin2)
+{ std::swap_ranges(begin, end, begin2); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/unique_copy/1.cc b/libstdc++-v3/testsuite/25_algorithms/unique_copy/1.cc
new file mode 100644
index 00000000000..4f96c3a64c0
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/unique_copy/1.cc
@@ -0,0 +1,85 @@
+// Copyright (C) 2005 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.
+
+// 25.5.8 [lib.alg.unique]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::forward_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+using std::unique;
+
+typedef test_container<int, input_iterator_wrapper> Icontainer;
+typedef test_container<int, forward_iterator_wrapper> Fcontainer;
+typedef test_container<int, output_iterator_wrapper> Ocontainer;
+
+int array1[] = {0, 0, 0, 1, 1, 1};
+int array2[2];
+
+void
+test1()
+{
+ bool test __attribute__((unused)) = true;
+ Icontainer con1(array1, array1);
+ Ocontainer con2(array2, array2);
+ VERIFY(unique_copy(con1.begin(), con1.end(), con2.begin()).ptr == array2);
+}
+
+void
+test2()
+{
+ bool test __attribute__((unused)) = true;
+ Icontainer con1(array1, array1 + 6);
+ Ocontainer con2(array2, array2 + 2);
+ VERIFY(unique_copy(con1.begin(), con1.end(), con2.begin()).ptr
+ == array2 + 2);
+ VERIFY(array2[0] == 0 && array2[1] == 1);
+}
+
+void
+test3()
+{
+ bool test __attribute__((unused)) = true;
+ Icontainer con1(array1, array1);
+ Fcontainer con2(array2, array2);
+ VERIFY(unique_copy(con1.begin(), con1.end(), con2.begin()).ptr == array2);
+}
+
+void
+test4()
+{
+ bool test __attribute__((unused)) = true;
+ Icontainer con1(array1, array1 + 6);
+ Fcontainer con2(array2, array2 + 2);
+ VERIFY(unique_copy(con1.begin(), con1.end(), con2.begin()).ptr
+ == array2 + 2);
+ VERIFY(array2[0] == 0 && array2[1] == 1);
+}
+
+int
+main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/unique_copy/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/unique_copy/check_type.cc
new file mode 100644
index 00000000000..1c6731e9df9
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/unique_copy/check_type.cc
@@ -0,0 +1,55 @@
+// Copyright (C) 2005 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.
+
+// 25.5.8 [lib.alg.unique_copy]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::input_iterator_wrapper;
+using __gnu_test::output_iterator_wrapper;
+
+struct S1 { };
+
+struct S2
+{
+ S2(const S1& s1) {}
+};
+
+bool
+operator==(const S1&, const S1&) {return true;}
+
+struct X1 { };
+
+struct X2
+{
+ X2(const X1& x1) {}
+};
+
+bool
+predicate(const X1&, const X1&) {return true;}
+
+output_iterator_wrapper<S2>
+test1(input_iterator_wrapper<S1>& s1, output_iterator_wrapper<S2>& s2)
+{ return std::unique_copy(s1, s1, s2); }
+
+output_iterator_wrapper<X2>
+test2(input_iterator_wrapper<X1>& x1, output_iterator_wrapper<X2>& x2)
+{ return std::unique_copy(x1, x1, x2, predicate); }
diff --git a/libstdc++-v3/testsuite/25_algorithms/upper_bound/1.cc b/libstdc++-v3/testsuite/25_algorithms/upper_bound/1.cc
new file mode 100644
index 00000000000..8b518ef0098
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/upper_bound/1.cc
@@ -0,0 +1,47 @@
+// Copyright (C) 2005 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.
+
+// 25.3.3.2 [lib.upper.bound]
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::forward_iterator_wrapper;
+using std::upper_bound;
+
+typedef test_container<int, forward_iterator_wrapper> Container;
+int array[] = {0, 0, 0, 0, 1, 1, 1, 1};
+
+void
+test1()
+{
+ for(int i = 0; i < 5; ++i)
+ for(int j = 4; j < 7; ++j)
+ {
+ Container con(array + i, array + j);
+ VERIFY(upper_bound(con.begin(), con.end(), 0).ptr == array + 4);
+ }
+}
+
+int
+main()
+{
+ test1();
+}
diff --git a/libstdc++-v3/testsuite/25_algorithms/upper_bound/check_type.cc b/libstdc++-v3/testsuite/25_algorithms/upper_bound/check_type.cc
new file mode 100644
index 00000000000..f0c0774add0
--- /dev/null
+++ b/libstdc++-v3/testsuite/25_algorithms/upper_bound/check_type.cc
@@ -0,0 +1,44 @@
+// Copyright (C) 2005 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.
+
+// 25.3.3.2 [lib.upper.bound]
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::forward_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+forward_iterator_wrapper<S>
+test1(forward_iterator_wrapper<S>& s)
+{ return std::upper_bound(s, s, *s); }
+
+forward_iterator_wrapper<X>
+test2(forward_iterator_wrapper<X>& x)
+{ return std::upper_bound(x, x, *x, predicate); }
diff --git a/libstdc++-v3/testsuite/26_numerics/cstdlib/13943.cc b/libstdc++-v3/testsuite/26_numerics/cstdlib/13943.cc
new file mode 100644
index 00000000000..920ddcc43b3
--- /dev/null
+++ b/libstdc++-v3/testsuite/26_numerics/cstdlib/13943.cc
@@ -0,0 +1,52 @@
+// Copyright (C) 2005 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 <cstdlib>
+#include <testsuite_hooks.h>
+
+#if _GLIBCXX_USE_C99
+// libstdc++/13943
+void test01()
+{
+ using namespace std;
+ bool test __attribute__((unused)) = true;
+
+ VERIFY( llabs(-3) == 3 );
+
+ lldiv_t q = lldiv(6, 4);
+ VERIFY( q.quot == 1 );
+ VERIFY( q.rem == 2 );
+}
+#endif
+
+int main()
+{
+#if _GLIBCXX_USE_C99
+ test01();
+#endif
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/char/9701-3.cc b/libstdc++-v3/testsuite/27_io/basic_filebuf/in_avail/char/9701-3.cc
index 5dc68c62b9a..5dc68c62b9a 100644
--- a/libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/char/9701-3.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_filebuf/in_avail/char/9701-3.cc
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/wchar_t/9701-3.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/char/1.cc
index 239f790fe47..ee9a81c816d 100644
--- a/libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/wchar_t/9701-3.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/char/1.cc
@@ -1,4 +1,6 @@
-// Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+// 2005-06-07 Benjamin Kosnik <bkoz@redhat.com>
+
+// Copyright (C) 2005 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
@@ -16,44 +18,37 @@
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.
-// 27.5.2.2.3 Get area
+// 27.8.1.4 Overridden virtual functions
#include <fstream>
#include <testsuite_hooks.h>
-class Derived_fbuf : public std::wfilebuf
-{
-public:
- const char_type* pub_egptr() const
- { return egptr(); }
+typedef std::basic_streambuf<char> streambuf_type;
- const char_type* pub_gptr() const
- { return gptr(); }
+struct testbuf : streambuf_type
+{
+ testbuf() { }
};
-// libstdc++/9701 (in_avail)
-void test01()
+void test05()
{
- using namespace std;
- bool test __attribute__((unused)) = true;
- const char* name = "tmp_file1_w";
+ typedef streambuf_type::int_type int_type;
+ typedef streambuf_type::traits_type traits_type;
+ typedef streambuf_type::pos_type pos_type;
+ typedef streambuf_type::off_type off_type;
+ typedef size_t size_type;
- Derived_fbuf df2;
- df2.open(name, ios_base::in | ios_base::out | ios_base::trunc);
-
- df2.sputn(L"Comomoc", 7);
-
- df2.pubseekoff(0, ios_base::beg);
- df2.sbumpc();
- df2.sputbackc(L't');
+ bool test __attribute__((unused)) = true;
+ std::streamoff strmof_1, strmof_2;
+ testbuf sb01;
- VERIFY( df2.pub_gptr() < df2.pub_egptr() );
- VERIFY( df2.in_avail() == df2.pub_egptr() - df2.pub_gptr() );
+ // int in_avail()
+ strmof_1 = sb01.in_avail();
+ VERIFY( strmof_1 == 0 );
}
-int
-main()
+int main()
{
- test01();
+ test05();
return 0;
}
diff --git a/libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/wchar_t/1.cc
new file mode 100644
index 00000000000..fd10c0b0d9d
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_streambuf/in_avail/wchar_t/1.cc
@@ -0,0 +1,54 @@
+// 2005-06-07 Benjamin Kosnik <bkoz@redhat.com>
+
+// Copyright (C) 2005 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.
+
+// 27.8.1.4 Overridden virtual functions
+
+#include <fstream>
+#include <testsuite_hooks.h>
+
+typedef std::basic_streambuf<wchar_t> streambuf_type;
+
+struct testbuf : streambuf_type
+{
+ testbuf() { }
+};
+
+void test05()
+{
+ typedef streambuf_type::int_type int_type;
+ typedef streambuf_type::traits_type traits_type;
+ typedef streambuf_type::pos_type pos_type;
+ typedef streambuf_type::off_type off_type;
+ typedef size_t size_type;
+
+ bool test __attribute__((unused)) = true;
+ std::streamoff strmof_1, strmof_2;
+ testbuf sb01;
+
+ // int in_avail()
+ strmof_1 = sb01.in_avail();
+ VERIFY( strmof_1 == 0 );
+}
+
+int main()
+{
+ test05();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/1.cc
index 99942f76610..5833c9652c9 100644
--- a/libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/1.cc
@@ -1,6 +1,6 @@
// 981208 bkoz test functionality of basic_stringbuf for char_type == char
-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -43,8 +43,8 @@ void test04()
VERIFY( strmof_1 == static_cast<std::streamoff>(str_01.length()) );
VERIFY( strmof_2 == static_cast<std::streamoff>(str_02.length()) );
strmof_1 = strb_03.in_avail();
- // zero cuz write-only, or eof()? zero, from showmany
- VERIFY( strmof_1 == 0 );
+ // zero cuz write-only, or eof() to match basic_filebuf
+ VERIFY( strmof_1 == -1 );
}
int main()
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/21955.cc b/libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/21955.cc
new file mode 100644
index 00000000000..023418cfd64
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/char/21955.cc
@@ -0,0 +1,54 @@
+// 2005-06-07 Benjamin Kosnik
+
+// Copyright (C) 2005
+// 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.
+
+#include <sstream>
+#include <testsuite_hooks.h>
+#include <stdexcept>
+
+double
+test_stringstream()
+{
+ double result;
+ char* source = "1918";
+ std::stringstream s;
+ s << source;
+
+ std::string tmp = s.str();
+ std::streambuf* sb = s.rdbuf();
+ int i = sb->in_avail();
+
+ if (i)
+ {
+ s >> result;
+ }
+ else
+ {
+ throw std::runtime_error("conversion failed");
+ }
+ return result;
+}
+
+
+int main ()
+{
+ test_stringstream();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/wchar_t/1.cc
index ed6f2484dbc..346a4db1baf 100644
--- a/libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/wchar_t/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_stringbuf/in_avail/wchar_t/1.cc
@@ -1,6 +1,6 @@
// 981208 bkoz test functionality of basic_stringbuf for char_type == wchar_t
-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -43,8 +43,8 @@ void test04()
VERIFY( strmof_1 == static_cast<std::streamoff>(str_01.length()) );
VERIFY( strmof_2 == static_cast<std::streamoff>(str_02.length()) );
strmof_1 = strb_03.in_avail();
- // zero cuz write-only, or eof()? zero, from showmany
- VERIFY( strmof_1 == 0 );
+ // zero cuz write-only, or eof() to match basic_filebuf
+ VERIFY( strmof_1 == -1 );
}
int main()
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringbuf/str/char/1.cc b/libstdc++-v3/testsuite/27_io/basic_stringbuf/str/char/1.cc
index 2f9a5cf176f..d788f1274c2 100644
--- a/libstdc++-v3/testsuite/27_io/basic_stringbuf/str/char/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_stringbuf/str/char/1.cc
@@ -1,6 +1,6 @@
// 981208 bkoz test functionality of basic_stringbuf for char_type == char
-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -45,7 +45,7 @@ void test03()
std::streamsize d1 = strb_01.in_avail();
std::streamsize d2 = strb_03.in_avail();
VERIFY( d1 ); // non-zero
- VERIFY( !d2 ); // zero, cuz ios_base::out
+ VERIFY( d2 == -1 ); // -1, cuz ios_base::out
VERIFY( d1 != d2 ); //these should be the same
VERIFY( static_cast<std::streamsize>(str_01.length()) == d1 );
VERIFY( strb_01.str() == strb_03.str() ); //ditto
diff --git a/libstdc++-v3/testsuite/27_io/basic_stringbuf/str/wchar_t/1.cc b/libstdc++-v3/testsuite/27_io/basic_stringbuf/str/wchar_t/1.cc
index 4c89bc932c7..cc0e0ab2dcd 100644
--- a/libstdc++-v3/testsuite/27_io/basic_stringbuf/str/wchar_t/1.cc
+++ b/libstdc++-v3/testsuite/27_io/basic_stringbuf/str/wchar_t/1.cc
@@ -1,6 +1,6 @@
// 981208 bkoz test functionality of basic_stringbuf for char_type == wchar_t
-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
// Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
@@ -45,7 +45,7 @@ void test03()
std::streamsize d1 = strb_01.in_avail();
std::streamsize d2 = strb_03.in_avail();
VERIFY( d1 ); // non-zero
- VERIFY( !d2 ); // zero, cuz ios_base::out
+ VERIFY( d2 == -1 ); // -1, cuz ios_base::out
VERIFY( d1 != d2 ); //these should be the same
VERIFY( static_cast<std::streamsize>(str_01.length()) == d1 );
VERIFY( strb_01.str() == strb_03.str() ); //ditto
diff --git a/libstdc++-v3/testsuite/27_io/ios_base/cons/assign_neg.cc b/libstdc++-v3/testsuite/27_io/ios_base/cons/assign_neg.cc
index 50c8eb8b05f..ea6eb423cec 100644
--- a/libstdc++-v3/testsuite/27_io/ios_base/cons/assign_neg.cc
+++ b/libstdc++-v3/testsuite/27_io/ios_base/cons/assign_neg.cc
@@ -40,6 +40,7 @@ void test01()
test_base io2;
io1 = io2;
}
-// { dg-error "within this context" "" { target *-*-* } 41 }
+// { dg-error "synthesized" "" { target *-*-* } 41 }
+// { dg-error "within this context" "" { target *-*-* } 34 }
// { dg-error "is private" "" { target *-*-* } 782 }
// { dg-error "operator=" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/27_io/ios_base/cons/copy_neg.cc b/libstdc++-v3/testsuite/27_io/ios_base/cons/copy_neg.cc
index 925087d5b27..2c047a5c3b5 100644
--- a/libstdc++-v3/testsuite/27_io/ios_base/cons/copy_neg.cc
+++ b/libstdc++-v3/testsuite/27_io/ios_base/cons/copy_neg.cc
@@ -40,6 +40,7 @@ void test02()
test_base io1;
test_base io2 = io1;
}
-// { dg-error "within this context" "" { target *-*-* } 41 }
+// { dg-error "within this context" "" { target *-*-* } 35 }
+// { dg-error "synthesized" "" { target *-*-* } 41 }
// { dg-error "is private" "" { target *-*-* } 779 }
// { dg-error "copy constructor" "" { target *-*-* } 0 }
diff --git a/libstdc++-v3/testsuite/Makefile.in b/libstdc++-v3/testsuite/Makefile.in
index 64f38c1dfb6..df262facdae 100644
--- a/libstdc++-v3/testsuite/Makefile.in
+++ b/libstdc++-v3/testsuite/Makefile.in
@@ -40,7 +40,8 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(top_srcdir)/fragment.am
subdir = testsuite
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/../config/no-executables.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/../config/lead-dot.m4 \
+ $(top_srcdir)/../config/no-executables.m4 \
$(top_srcdir)/../libtool.m4 $(top_srcdir)/crossconfig.m4 \
$(top_srcdir)/linkage.m4 $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/configure.ac
diff --git a/libstdc++-v3/testsuite/ext/array_allocator/2.cc b/libstdc++-v3/testsuite/ext/array_allocator/2.cc
index 1e837258923..f580ea250b7 100644
--- a/libstdc++-v3/testsuite/ext/array_allocator/2.cc
+++ b/libstdc++-v3/testsuite/ext/array_allocator/2.cc
@@ -1,4 +1,7 @@
-// Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+// Expected execution error for PR19495.
+// { dg-do run { xfail powerpc*-*-linux* } }
+
+// Copyright (C) 2004 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the
@@ -32,10 +35,7 @@
typedef char char_type;
typedef std::char_traits<char_type> traits_type;
-// NB: Array_allocator doesn't properly support rebinding, used by
-// basic_string. See libstdc++/21609 for details.
-typedef std::tr1::array<size_t, 16> array_type;
-typedef __gnu_cxx::array_allocator<size_t, array_type> allocator_type;
+typedef std::tr1::array<char_type, 32> array_type;
array_type extern_array;
@@ -44,8 +44,10 @@ void test01()
bool test __attribute__((unused)) = true;
using std::basic_string;
+ typedef __gnu_cxx::array_allocator<char_type, array_type> allocator_type;
typedef basic_string<char_type, traits_type, allocator_type> string_type;
+ size_t index = array_type::_S_index;
allocator_type a(&extern_array);
string_type s(a);
diff --git a/libstdc++-v3/testsuite/ext/is_heap/1.cc b/libstdc++-v3/testsuite/ext/is_heap/1.cc
new file mode 100644
index 00000000000..3974f03c464
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/is_heap/1.cc
@@ -0,0 +1,46 @@
+// Copyright (C) 2005 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.
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+using __gnu_test::test_container;
+using __gnu_test::random_access_iterator_wrapper;
+
+typedef test_container<int, random_access_iterator_wrapper> container;
+
+void
+test1()
+{
+ int array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
+ for(int i = 0; i < 10; ++i)
+ {
+ container con(array, array + i);
+ std::make_heap(con.begin(), con.end());
+ VERIFY(std::__is_heap(con.begin(), con.end()));
+ VERIFY(std::__is_heap(con.begin(), i));
+ }
+}
+
+int
+main()
+{
+ test1();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/ext/is_heap/check_type.cc b/libstdc++-v3/testsuite/ext/is_heap/check_type.cc
new file mode 100644
index 00000000000..6c791bd80ac
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/is_heap/check_type.cc
@@ -0,0 +1,47 @@
+// Copyright (C) 2005 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.
+
+// { dg-do compile }
+
+#include <algorithm>
+#include <testsuite_iterators.h>
+
+using __gnu_test::random_access_iterator_wrapper;
+
+struct S { };
+
+bool
+operator<(const S&, const S&) {return true;}
+
+struct X { };
+
+bool
+predicate(const X&, const X&) {return true;}
+
+bool
+test1(random_access_iterator_wrapper<S>& start,
+ random_access_iterator_wrapper<S>& end)
+{ return std::__is_heap(start, end) && std::__is_heap(start, 1); }
+
+bool
+test2(random_access_iterator_wrapper<X>& start,
+ random_access_iterator_wrapper<X>& end)
+{
+ return std::__is_heap(start, end, predicate) &&
+ std::__is_heap(start, predicate, 1);
+}
diff --git a/libstdc++-v3/testsuite/ext/median.cc b/libstdc++-v3/testsuite/ext/median.cc
new file mode 100644
index 00000000000..97e44ea5bb9
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/median.cc
@@ -0,0 +1,42 @@
+// Copyright (C) 2005 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.
+
+// median - SGI extension
+
+#include <algorithm>
+#include <testsuite_hooks.h>
+
+bool pred(const int& l, const int& r)
+{
+ return l<r;
+}
+
+using std::__median;
+
+int main(void)
+{
+ const int i=1;
+ const int j=2;
+ const int k=3;
+ VERIFY(__median(i, j, k) == j && __median(i, j, k, pred) == j);
+ VERIFY(__median(i, k, j) == j && __median(i, k, j, pred) == j);
+ VERIFY(__median(j, i, k) == j && __median(j, i, k, pred) == j);
+ VERIFY(__median(j, k, i) == j && __median(j, k, i, pred) == j);
+ VERIFY(__median(k, i, j) == j && __median(k, i, j, pred) == j);
+ VERIFY(__median(k, j, i) == j && __median(k, j, i, pred) == j);
+}
diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp
index 2dbf8217938..bcae3777e75 100644
--- a/libstdc++-v3/testsuite/lib/libstdc++.exp
+++ b/libstdc++-v3/testsuite/lib/libstdc++.exp
@@ -103,14 +103,7 @@ proc libstdc++_init { testfile } {
# headers, or without assertions.
global DEFAULT_CXXFLAGS
if ![info exists DEFAULT_CXXFLAGS] then {
- # Set up includes for stdc++.h.gch, the precompiled header file.
- if { [file exists $flags_file] } {
- set cxxpchflags [exec sh $flags_file --cxxpchflags]
- } else {
- set cxxpchflags ""
- }
- set DEFAULT_CXXFLAGS " ${cxxpchflags}"
-
+ set DEFAULT_CXXFLAGS ""
# Host specific goo here.
if { [string match "powerpc-*-darwin*" $target_triplet] } {
append DEFAULT_CXXFLAGS " -multiply_defined suppress"
@@ -195,6 +188,28 @@ proc libstdc++_init { testfile } {
}
}
+ # If a PCH file is available, use it. We must delay performing
+ # this check until $cxx and such have been initialized because we
+ # perform a test compilation. (Ideally, gcc --print-file-name would
+ # list PCH files, but it does not.)
+ global PCH_CXXFLAGS
+ if ![info exists PCH_CXXFLAGS] then {
+ set src "config[pid].cc"
+ set f [open $src "w"]
+ puts $f "int main () {}"
+ close $f
+
+ set lines [v3_target_compile $src "config[pid].o" object \
+ "additional_flags=-include additional_flags=bits/stdc++.h"]
+ if {$lines == "" } {
+ set PCH_CXXFLAGS "-include bits/stdc++.h"
+ } else {
+ set PCH_CXXFLAGS ""
+ }
+ file delete $src
+ v3track PCH_CXXFLAGS 2
+ }
+
libstdc++_maybe_build_wrapper "${objdir}/testglue.o"
}
diff --git a/libstdc++-v3/testsuite/libstdc++-dg/normal.exp b/libstdc++-v3/testsuite/libstdc++-dg/normal.exp
index 746c7a8ec3f..9d2f1a63a9a 100644
--- a/libstdc++-v3/testsuite/libstdc++-dg/normal.exp
+++ b/libstdc++-v3/testsuite/libstdc++-dg/normal.exp
@@ -87,7 +87,8 @@ set tests [lsort $tests]
# Main loop.
global DEFAULT_CXXFLAGS
-dg-runtest $tests "" $DEFAULT_CXXFLAGS
+global PCH_CXXFLAGS
+dg-runtest $tests "" "$DEFAULT_CXXFLAGS $PCH_CXXFLAGS"
# All done.
dg-finish
diff --git a/libstdc++-v3/testsuite/testsuite_abi.cc b/libstdc++-v3/testsuite/testsuite_abi.cc
index 5f6e23ed83b..0aa594256fa 100644
--- a/libstdc++-v3/testsuite/testsuite_abi.cc
+++ b/libstdc++-v3/testsuite/testsuite_abi.cc
@@ -166,6 +166,7 @@ check_version(const symbol& test, bool added)
known_versions.push_back("GLIBCXX_3.4.2");
known_versions.push_back("GLIBCXX_3.4.3");
known_versions.push_back("GLIBCXX_3.4.4");
+ known_versions.push_back("GLIBCXX_3.4.5");
known_versions.push_back("CXXABI_1.2");
known_versions.push_back("CXXABI_1.2.1");
known_versions.push_back("CXXABI_1.3");
diff --git a/libstdc++-v3/testsuite/testsuite_hooks.h b/libstdc++-v3/testsuite/testsuite_hooks.h
index 90104d36523..fc05186d400 100644
--- a/libstdc++-v3/testsuite/testsuite_hooks.h
+++ b/libstdc++-v3/testsuite/testsuite_hooks.h
@@ -160,6 +160,24 @@ namespace __gnu_test
void
run_tests_wrapped_env(const char*, const char*, const func_callback&);
+
+ // For containers (23.1/3).
+ struct NonDefaultConstructible
+ {
+ NonDefaultConstructible(int) { }
+ };
+
+ inline bool
+ operator==(const NonDefaultConstructible& lhs,
+ const NonDefaultConstructible& rhs)
+ { return false; }
+
+ inline bool
+ operator<(const NonDefaultConstructible& lhs,
+ const NonDefaultConstructible& rhs)
+ { return false; }
+
+
// Counting.
struct counter
{
diff --git a/libstdc++-v3/testsuite/testsuite_iterators.h b/libstdc++-v3/testsuite/testsuite_iterators.h
index 435bb1d26b5..1a6a295ee97 100644
--- a/libstdc++-v3/testsuite/testsuite_iterators.h
+++ b/libstdc++-v3/testsuite/testsuite_iterators.h
@@ -1,7 +1,7 @@
// -*- C++ -*-
// Iterator Wrappers for the C++ library testsuite.
//
-// Copyright (C) 2004 Free Software Foundation, Inc.
+// Copyright (C) 2004, 2005 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
@@ -77,7 +77,7 @@ namespace __gnu_test
{
writtento = new bool[this->last - this->first];
for(int i = 0; i < this->last - this->first; i++)
- writtento = false;
+ writtento[i] = false;
}
~OutputContainer()
@@ -96,12 +96,13 @@ namespace __gnu_test
ptr(ptr_in), SharedInfo(SharedInfo_in)
{ }
+ template<class U>
void
- operator=(T& new_val)
+ operator=(const U& new_val)
{
ITERATOR_VERIFY(SharedInfo->writtento[ptr - SharedInfo->first] == 0);
SharedInfo->writtento[ptr - SharedInfo->first] = 1;
- ptr = new_val;
+ *ptr = new_val;
}
};
@@ -149,9 +150,9 @@ namespace __gnu_test
operator++()
{
ITERATOR_VERIFY(SharedInfo && ptr < SharedInfo->last);
- ITERATOR_VERIFY(ptr>=SharedInfo->first);
+ ITERATOR_VERIFY(ptr>=SharedInfo->incrementedto);
ptr++;
- SharedInfo->first=ptr;
+ SharedInfo->incrementedto=ptr;
return *this;
}
@@ -423,7 +424,7 @@ namespace __gnu_test
operator--(int)
{
random_access_iterator_wrapper<T> tmp = *this;
- ++*this;
+ --*this;
return tmp;
}
@@ -443,34 +444,27 @@ namespace __gnu_test
return *this;
}
- random_access_iterator_wrapper
- operator+(ptrdiff_t n)
- {
- random_access_iterator_wrapper<T> tmp = *this;
- return tmp += n;
- }
-
random_access_iterator_wrapper&
operator-=(ptrdiff_t n)
{ return *this += -n; }
random_access_iterator_wrapper
- operator-(ptrdiff_t n)
+ operator-(ptrdiff_t n) const
{
random_access_iterator_wrapper<T> tmp = *this;
return tmp -= n;
}
ptrdiff_t
- operator-(const random_access_iterator_wrapper<T>& in)
+ operator-(const random_access_iterator_wrapper<T>& in) const
{
ITERATOR_VERIFY(this->SharedInfo == in.SharedInfo);
return this->ptr - in.ptr;
}
T&
- operator[](ptrdiff_t n)
- { return *(this + n); }
+ operator[](ptrdiff_t n) const
+ { return *(*this + n); }
bool
operator<(const random_access_iterator_wrapper<T>& in) const
@@ -498,6 +492,16 @@ namespace __gnu_test
}
};
+ template<typename T>
+ random_access_iterator_wrapper<T>
+ operator+(random_access_iterator_wrapper<T> it, ptrdiff_t n)
+ { return it += n; }
+
+ template<typename T>
+ random_access_iterator_wrapper<T>
+ operator+(ptrdiff_t n, random_access_iterator_wrapper<T> it)
+ { return it += n; }
+
/**
* @brief A container-type class for holding iterator wrappers
diff --git a/maintainer-scripts/ChangeLog b/maintainer-scripts/ChangeLog
index bd8ab7211bb..6bb7dcb19ee 100644
--- a/maintainer-scripts/ChangeLog
+++ b/maintainer-scripts/ChangeLog
@@ -1,3 +1,8 @@
+2005-05-21 Gerald Pfeifer <gerald@pfeifer.com>
+
+ * crontab: Spread snapshot building more evenly throughout the
+ week.
+
2005-05-19 Joseph S. Myers <joseph@codesourcery.com>
* crontab: Don't build 3.3 branch snapshots.
diff --git a/maintainer-scripts/crontab b/maintainer-scripts/crontab
index 695c448f7c2..09ea8306740 100644
--- a/maintainer-scripts/crontab
+++ b/maintainer-scripts/crontab
@@ -1,6 +1,6 @@
16 0 * * * sh /home/gccadmin/scripts/update_version
50 0 * * * sh /home/gccadmin/scripts/update_web_docs
55 0 * * * sh /home/gccadmin/scripts/update_web_docs_libstdcxx
-32 22 * * 5 sh /home/gccadmin/scripts/gcc_release -s 3.4:gcc-3_4-branch -l -d /sourceware/snapshot-tmp/gcc all
-32 22 * * 6 sh /home/gccadmin/scripts/gcc_release -s 4.0:gcc-4_0-branch -l -d /sourceware/snapshot-tmp/gcc all
-43 17 * * 7 sh /home/gccadmin/scripts/gcc_release -s 4.1:HEAD -l -d /sourceware/snapshot-tmp/gcc all
+32 22 * * 2 sh /home/gccadmin/scripts/gcc_release -s 3.4:gcc-3_4-branch -l -d /sourceware/snapshot-tmp/gcc all
+32 22 * * 4 sh /home/gccadmin/scripts/gcc_release -s 4.0:gcc-4_0-branch -l -d /sourceware/snapshot-tmp/gcc all
+43 17 * * 6 sh /home/gccadmin/scripts/gcc_release -s 4.1:HEAD -l -d /sourceware/snapshot-tmp/gcc all
diff --git a/zlib/ChangeLog.gcj b/zlib/ChangeLog.gcj
index 828f9c229d5..5e77b0e1636 100644
--- a/zlib/ChangeLog.gcj
+++ b/zlib/ChangeLog.gcj
@@ -1,3 +1,12 @@
+2005-06-14 Tom Tromey <tromey@redhat.com>
+
+ PR libgcj/19877:
+ * configure, aclocal.m4, Makefile.in: Rebuilt.
+
+2005-06-06 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>
+
+ * zconf.h (NO_vsnprintf): Define on Tru64 UNIX V4.0.
+
2005-05-09 Mike Stump <mrs@apple.com>
* configure: Regenerate.
diff --git a/zlib/Makefile.in b/zlib/Makefile.in
index ffdcd59a752..33dabf52c00 100644
--- a/zlib/Makefile.in
+++ b/zlib/Makefile.in
@@ -52,7 +52,8 @@ DIST_COMMON = $(srcdir)/../config.guess $(srcdir)/../config.sub README \
$(srcdir)/../config.sub
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+am__aclocal_m4_deps = $(top_srcdir)/../config/depstand.m4 \
+ $(top_srcdir)/../config/lead-dot.m4 $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/../config/no-executables.m4 \
$(top_srcdir)/../libtool.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
diff --git a/zlib/aclocal.m4 b/zlib/aclocal.m4
index e567b3e91e4..be982c27433 100644
--- a/zlib/aclocal.m4
+++ b/zlib/aclocal.m4
@@ -547,39 +547,6 @@ AC_DEFUN([AM_PROG_INSTALL_SH],
install_sh=${install_sh-"$am_aux_dir/install-sh"}
AC_SUBST(install_sh)])
-# -*- Autoconf -*-
-# Copyright (C) 2003 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# serial 1
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot. For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
- am__leading_dot=.
-else
- am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
# Add --enable-maintainer-mode option to configure.
# From Jim Meyering
@@ -1127,4 +1094,6 @@ AC_SUBST([am__tar])
AC_SUBST([am__untar])
]) # _AM_PROG_TAR
+m4_include([../config/depstand.m4])
+m4_include([../config/lead-dot.m4])
m4_include([acinclude.m4])
diff --git a/zlib/configure b/zlib/configure
index d2046e1c560..20f35a878d3 100755
--- a/zlib/configure
+++ b/zlib/configure
@@ -4432,7 +4432,7 @@ else
ac_cv_func_mmap_fixed_mapped=no
fi
fi
-if test "x${ac_cv_func_mmap_fixed_mapped+set}" != xset; then
+if test "x${ac_cv_func_mmap_fixed_mapped}" != xno; then
echo "$as_me:$LINENO: checking for egrep" >&5
echo $ECHO_N "checking for egrep... $ECHO_C" >&6
diff --git a/zlib/zconf.h b/zlib/zconf.h
index 96dbc205c91..e63803b2d76 100644
--- a/zlib/zconf.h
+++ b/zlib/zconf.h
@@ -328,4 +328,12 @@ typedef uLong FAR uLongf;
#endif
#endif
+/* Tru64 UNIX V4.0 neither */
+#if defined(__alpha) && defined(__osf__)
+#include <unistd.h>
+#if _XOPEN_VERSION < 500
+#define NO_vsnprintf
+#endif
+#endif
+
#endif /* ZCONF_H */