summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4>2012-09-17 05:30:37 +0000
committerbstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4>2012-09-17 05:30:37 +0000
commit51d619308377f16a8ff13df95becfe2282198844 (patch)
tree21b147aea83b41c5c37fba84ea32c18f1c7de253
parent9b39d7e80300d4a7fc3399d0896881027479b72a (diff)
downloadgcc-51d619308377f16a8ff13df95becfe2282198844.tar.gz
2012-09-17 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk rev 191371 using svnmerge. [gcc/] 2012-09-17 Basile Starynkevitch <basile@starynkevitch.net> {{when merging trunk svn rev 191371}} * melt-runtime.c (melt_load_module_index): Push an empty slot, not a null pointer, into melt_modinfvec. (meltgc_run_c_extension): Push an empty slot, not a null pointer, into melt_extinfvec. (melt_really_initialize): Better indentation, and increase maximal minore size to 32768Kwords. Push an empty slot, not a null pointer, into melt_modinfvec. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/melt-branch@191373 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--ChangeLog12
-rw-r--r--ChangeLog.MELT4
-rw-r--r--boehm-gc/ChangeLog6
-rwxr-xr-xboehm-gc/configure6
-rwxr-xr-xconfigure10
-rw-r--r--configure.ac10
-rw-r--r--contrib/ChangeLog4
-rw-r--r--contrib/testsuite-management/x86_64-unknown-linux-gnu.xfail102
-rw-r--r--gcc/ChangeLog645
-rw-r--r--gcc/ChangeLog.MELT11
-rw-r--r--gcc/DATESTAMP2
-rw-r--r--gcc/Makefile.in7
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/gcc-interface/decl.c13
-rw-r--r--gcc/ada/gcc-interface/utils.c11
-rw-r--r--gcc/alias.c4
-rw-r--r--gcc/builtin-types.def1
-rw-r--r--gcc/builtins.def5
-rw-r--r--gcc/c-family/ChangeLog6
-rw-r--r--gcc/c-family/c-common.c2
-rw-r--r--gcc/c-family/c-pragma.c15
-rw-r--r--gcc/c-family/c.opt2
-rw-r--r--gcc/c/ChangeLog29
-rw-r--r--gcc/c/c-decl.c8
-rw-r--r--gcc/c/c-tree.h4
-rw-r--r--gcc/c/c-typeck.c58
-rw-r--r--gcc/calls.c18
-rw-r--r--gcc/cfghooks.c18
-rw-r--r--gcc/cfghooks.h9
-rw-r--r--gcc/cfgrtl.c53
-rw-r--r--gcc/common.opt8
-rw-r--r--gcc/config.gcc16
-rw-r--r--gcc/config.in6
-rw-r--r--gcc/config/alpha/predicates.md40
-rw-r--r--gcc/config/arm/arm.md57
-rw-r--r--gcc/config/arm/neon.md27
-rw-r--r--gcc/config/avr/avr-dimode.md111
-rw-r--r--gcc/config/avr/avr-fixed.md112
-rw-r--r--gcc/config/avr/avr-protos.h6
-rw-r--r--gcc/config/avr/avr.c557
-rw-r--r--gcc/config/avr/avr.md86
-rw-r--r--gcc/config/darwin.c4
-rw-r--r--gcc/config/i386/driver-i386.c2
-rw-r--r--gcc/config/i386/fmaintrin.h10
-rw-r--r--gcc/config/i386/i386.c31
-rw-r--r--gcc/config/i386/i386.h3
-rw-r--r--gcc/config/i386/i386.md24
-rw-r--r--gcc/config/i386/predicates.md3
-rw-r--r--gcc/config/i386/sse.md54
-rw-r--r--gcc/config/m68k/m68k.c3
-rw-r--r--gcc/config/mips/gnu-user64.h10
-rw-r--r--gcc/config/mips/mips.c4
-rw-r--r--gcc/config/mips/mips.h6
-rw-r--r--gcc/config/mips/mti-linux.h43
-rw-r--r--gcc/config/mips/t-mti-linux24
-rw-r--r--gcc/config/mmix/constraints.md112
-rw-r--r--gcc/config/mmix/mmix-protos.h4
-rw-r--r--gcc/config/mmix/mmix.c93
-rw-r--r--gcc/config/mmix/mmix.h21
-rw-r--r--gcc/config/mmix/mmix.md4
-rw-r--r--gcc/config/mmix/predicates.md12
-rw-r--r--gcc/config/moxie/moxie.h19
-rw-r--r--gcc/config/moxie/moxie.opt27
-rw-r--r--gcc/config/moxie/t-moxie3
-rw-r--r--gcc/config/pa/pa.c6
-rw-r--r--gcc/config/rs6000/rs6000-c.c7
-rw-r--r--gcc/config/rs6000/rs6000.c7
-rw-r--r--gcc/config/rs6000/rs6000.md28
-rw-r--r--gcc/config/sh/iterators.md3
-rw-r--r--gcc/config/sh/newlib.h4
-rw-r--r--gcc/config/sh/predicates.md8
-rw-r--r--gcc/config/sh/sh-protos.h2
-rw-r--r--gcc/config/sh/sh.c204
-rw-r--r--gcc/config/sh/sh.h34
-rw-r--r--gcc/config/sh/sh.md78
-rw-r--r--gcc/config/sparc/predicates.md9
-rw-r--r--gcc/config/sparc/sparc-protos.h5
-rw-r--r--gcc/config/sparc/sparc.c16
-rw-r--r--gcc/config/sparc/sparc.md160
-rwxr-xr-xgcc/configure50
-rw-r--r--gcc/configure.ac20
-rw-r--r--gcc/cp/ChangeLog99
-rw-r--r--gcc/cp/call.c15
-rw-r--r--gcc/cp/class.c16
-rw-r--r--gcc/cp/cp-gimplify.c3
-rw-r--r--gcc/cp/cp-lang.c10
-rw-r--r--gcc/cp/cp-tree.h7
-rw-r--r--gcc/cp/decl.c49
-rw-r--r--gcc/cp/decl2.c6
-rw-r--r--gcc/cp/error.c2
-rw-r--r--gcc/cp/except.c13
-rw-r--r--gcc/cp/init.c32
-rw-r--r--gcc/cp/lex.c10
-rw-r--r--gcc/cp/mangle.c6
-rw-r--r--gcc/cp/method.c5
-rw-r--r--gcc/cp/name-lookup.c20
-rw-r--r--gcc/cp/optimize.c3
-rw-r--r--gcc/cp/parser.c31
-rw-r--r--gcc/cp/pt.c41
-rw-r--r--gcc/cp/rtti.c6
-rw-r--r--gcc/cp/search.c4
-rw-r--r--gcc/cp/semantics.c54
-rw-r--r--gcc/cp/tree.c19
-rw-r--r--gcc/cp/typeck.c93
-rw-r--r--gcc/doc/extend.texi15
-rw-r--r--gcc/doc/invoke.texi45
-rw-r--r--gcc/doc/sourcebuild.texi8
-rw-r--r--gcc/doc/tm.texi30
-rw-r--r--gcc/doc/tm.texi.in30
-rw-r--r--gcc/dse.c12
-rw-r--r--gcc/dwarf2cfi.c58
-rw-r--r--gcc/dwarf2out.c50
-rw-r--r--gcc/emit-rtl.c50
-rw-r--r--gcc/except.c16
-rw-r--r--gcc/expmed.c56
-rw-r--r--gcc/expr.c57
-rw-r--r--gcc/expr.h27
-rw-r--r--gcc/fold-const.c3
-rw-r--r--gcc/fortran/ChangeLog77
-rw-r--r--gcc/fortran/arith.c10
-rw-r--r--gcc/fortran/array.c20
-rw-r--r--gcc/fortran/check.c2
-rw-r--r--gcc/fortran/class.c5
-rw-r--r--gcc/fortran/dump-parse-tree.c88
-rw-r--r--gcc/fortran/expr.c9
-rw-r--r--gcc/fortran/interface.c12
-rw-r--r--gcc/fortran/match.c20
-rw-r--r--gcc/fortran/resolve.c15
-rw-r--r--gcc/fortran/simplify.c11
-rw-r--r--gcc/fortran/symbol.c8
-rw-r--r--gcc/fortran/target-memory.c21
-rw-r--r--gcc/fortran/target-memory.h3
-rw-r--r--gcc/fortran/trans-decl.c2
-rw-r--r--gcc/fortran/trans-io.c10
-rw-r--r--gcc/fortran/trans-openmp.c5
-rw-r--r--gcc/fortran/trans-stmt.c2
-rw-r--r--gcc/fortran/trans.c1
-rw-r--r--gcc/function.c14
-rw-r--r--gcc/function.h1
-rw-r--r--gcc/fwprop.c2
-rw-r--r--gcc/gcc.c2
-rw-r--r--gcc/gcse.c8
-rw-r--r--gcc/genautomata.c5
-rw-r--r--gcc/genextract.c2
-rw-r--r--gcc/genopinit.c2
-rw-r--r--gcc/gimple-fold.c35
-rw-r--r--gcc/gimple-low.c2
-rw-r--r--gcc/gimple-ssa-strength-reduction.c7
-rw-r--r--gcc/gimple.c1195
-rw-r--r--gcc/gimple.h3
-rw-r--r--gcc/gimplify.c63
-rw-r--r--gcc/go/gofrontend/expressions.cc47
-rw-r--r--gcc/go/gofrontend/gogo-tree.cc35
-rw-r--r--gcc/graphite-scop-detection.c10
-rw-r--r--gcc/graphite-sese-to-poly.c2
-rw-r--r--gcc/ipa-inline-analysis.c316
-rw-r--r--gcc/ipa-inline.c9
-rw-r--r--gcc/ipa-inline.h8
-rw-r--r--gcc/ipa-prop.c53
-rw-r--r--gcc/ipa-pure-const.c20
-rw-r--r--gcc/ipa-reference.c540
-rw-r--r--gcc/ipa-split.c4
-rw-r--r--gcc/ipa-utils.c24
-rw-r--r--gcc/ipa-utils.h1
-rw-r--r--gcc/ira.c2
-rw-r--r--gcc/java/class.c7
-rw-r--r--gcc/java/expr.c5
-rw-r--r--gcc/lto-cgraph.c2
-rw-r--r--gcc/lto-streamer.c7
-rw-r--r--gcc/lto-streamer.h2
-rw-r--r--gcc/lto/ChangeLog61
-rw-r--r--gcc/lto/lto-partition.c464
-rw-r--r--gcc/lto/lto-partition.h2
-rw-r--r--gcc/lto/lto.c1202
-rw-r--r--gcc/melt-runtime.c22
-rw-r--r--gcc/objc/objc-next-runtime-abi-02.c14
-rw-r--r--gcc/opts-common.c8
-rw-r--r--gcc/params.def13
-rw-r--r--gcc/passes.c25
-rw-r--r--gcc/po/ChangeLog4
-rw-r--r--gcc/po/vi.po3136
-rw-r--r--gcc/print-rtl.c16
-rw-r--r--gcc/read-rtl.c15
-rw-r--r--gcc/ree.c7
-rw-r--r--gcc/reload.c10
-rw-r--r--gcc/reload1.c9
-rw-r--r--gcc/rtl.h6
-rw-r--r--gcc/sel-sched-ir.c2
-rw-r--r--gcc/stmt.c181
-rw-r--r--gcc/system.h5
-rw-r--r--gcc/testsuite/ChangeLog275
-rw-r--r--gcc/testsuite/c-c++-common/pr51712.c1
-rw-r--r--gcc/testsuite/c-c++-common/torture/vector-compare-1.c (renamed from gcc/testsuite/gcc.c-torture/execute/vector-compare-1.c)17
-rw-r--r--gcc/testsuite/c-c++-common/torture/vector-compare-2.c (renamed from gcc/testsuite/gcc.c-torture/execute/vector-compare-2.c)2
-rw-r--r--gcc/testsuite/c-c++-common/torture/vector-shift.c (renamed from gcc/testsuite/gcc.c-torture/execute/vector-shift.c)3
-rw-r--r--gcc/testsuite/c-c++-common/torture/vector-shift2.c (renamed from gcc/testsuite/gcc.c-torture/execute/vector-shift2.c)1
-rw-r--r--gcc/testsuite/c-c++-common/torture/vector-subscript-1.c (renamed from gcc/testsuite/gcc.c-torture/execute/vector-subscript-1.c)2
-rw-r--r--gcc/testsuite/c-c++-common/torture/vector-subscript-2.c (renamed from gcc/testsuite/gcc.c-torture/execute/vector-subscript-2.c)1
-rw-r--r--gcc/testsuite/c-c++-common/torture/vector-subscript-3.c (renamed from gcc/testsuite/gcc.c-torture/execute/vector-subscript-3.c)2
-rw-r--r--gcc/testsuite/c-c++-common/vector-compare-1.c (renamed from gcc/testsuite/gcc.dg/vector-compare-1.c)3
-rw-r--r--gcc/testsuite/c-c++-common/vector-compare-2.c (renamed from gcc/testsuite/gcc.dg/vector-compare-2.c)0
-rw-r--r--gcc/testsuite/c-c++-common/vector-compare-3.c25
-rw-r--r--gcc/testsuite/c-c++-common/vector-shift.c (renamed from gcc/testsuite/gcc.dg/vector-shift.c)1
-rw-r--r--gcc/testsuite/c-c++-common/vector-shift1.c (renamed from gcc/testsuite/gcc.dg/vector-shift1.c)3
-rw-r--r--gcc/testsuite/c-c++-common/vector-shift3.c (renamed from gcc/testsuite/gcc.dg/vector-shift3.c)4
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/constexpr-temp1.C9
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/implicit14.C26
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C13
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/sfinae40.C21
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/sfinae41.C17
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/deallocator.C33
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/nested-3.C2
-rw-r--r--gcc/testsuite/g++.dg/other/vector-compare.C36
-rw-r--r--gcc/testsuite/g++.dg/template/anonunion2.C6
-rw-r--r--gcc/testsuite/g++.dg/template/init10.C15
-rw-r--r--gcc/testsuite/g++.dg/torture/builtin-location.C31
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr54515.C19
-rw-r--r--gcc/testsuite/g++.dg/warn/Winit-self.C8
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr54103-1.c5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr54103-2.c5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr54103-3.c5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr54103-4.c5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr54103-5.c5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr54103-6.c5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr54552-1.c8
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr54559.c9
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/vector-compare-2.x2
-rw-r--r--gcc/testsuite/gcc.dg/c90-const-expr-8.c2
-rw-r--r--gcc/testsuite/gcc.dg/ipa/inlinehint-2.c13
-rw-r--r--gcc/testsuite/gcc.dg/pr44194-1.c11
-rw-r--r--gcc/testsuite/gcc.dg/pr52558-2.c23
-rw-r--r--gcc/testsuite/gcc.dg/simulate-thread/speculative-store-3.c71
-rw-r--r--gcc/testsuite/gcc.dg/simulate-thread/speculative-store-4.c54
-rw-r--r--gcc/testsuite/gcc.dg/tm/memopt-16.c43
-rw-r--r--gcc/testsuite/gcc.dg/tm/reg-promotion.c2
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr54520.c15
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/forwprop-20.c70
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/forwprop-21.c13
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/forwprop-22.c18
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/forwprop-6.c5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-17.c2
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-37.c15
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp81.c (renamed from gcc/testsuite/gcc.dg/tree-ssa/vrp80-2.c)0
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp82.c57
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp83.c60
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp84.c21
-rw-r--r--gcc/testsuite/gcc.target/arm/builtin-bswap-1.c81
-rw-r--r--gcc/testsuite/gcc.target/arm/combine-movs.c3
-rw-r--r--gcc/testsuite/gcc.target/arm/neon-vfma-1.c12
-rw-r--r--gcc/testsuite/gcc.target/arm/neon-vfms-1.c12
-rw-r--r--gcc/testsuite/gcc.target/arm/neon-vmla-1.c4
-rw-r--r--gcc/testsuite/gcc.target/arm/neon-vmls-1.c4
-rw-r--r--gcc/testsuite/gcc.target/arm/neon-vset_lanes8.c7
-rw-r--r--gcc/testsuite/gcc.target/arm/pr48252.c19
-rw-r--r--gcc/testsuite/gcc.target/arm/pr51835.c3
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/fix-types.h134
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/sat-hr-plus-minus.c98
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/sat-k-plus-minus.c108
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/sat-llk-plus-minus.c108
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/sat-r-plus-minus.c107
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/sat-uhr-plus-minus.c73
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/sat-uk-plus-minus.c82
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/sat-ullk-plus-minus.c82
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/sat-ur-plus-minus.c82
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/vals-hr.def12
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/vals-k.def32
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/vals-llk.def32
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/vals-r.def30
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/vals-uhr.def13
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/vals-uk.def23
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/vals-ullk.def20
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/vals-ur.def17
-rw-r--r--gcc/testsuite/gcc.target/i386/pr54445-1.c24
-rw-r--r--gcc/testsuite/gcc.target/i386/pr54445-2.c11
-rw-r--r--gcc/testsuite/gcc.target/sh/pr54089-3.c40
-rw-r--r--gcc/testsuite/gfortran.dg/array_section_3.f9017
-rw-r--r--gcc/testsuite/gfortran.dg/bind_c_array_params_2.f903
-rw-r--r--gcc/testsuite/gfortran.dg/coarray_10.f906
-rw-r--r--gcc/testsuite/gfortran.dg/coarray_28.f9010
-rw-r--r--gcc/testsuite/gfortran.dg/implicit_pure_3.f90109
-rw-r--r--gcc/testsuite/gfortran.dg/namelist_75.f9010
-rw-r--r--gcc/testsuite/gfortran.dg/proc_ptr_38.f9016
-rw-r--r--gcc/testsuite/gfortran.dg/typebound_generic_14.f0327
-rw-r--r--gcc/testsuite/gnat.dg/lto15.adb1
-rw-r--r--gcc/testsuite/lib/target-supports.exp78
-rw-r--r--gcc/timevar.def1
-rw-r--r--gcc/trans-mem.c18
-rw-r--r--gcc/tree-call-cdce.c4
-rw-r--r--gcc/tree-cfg.c42
-rw-r--r--gcc/tree-data-ref.c20
-rw-r--r--gcc/tree-dfa.c2
-rw-r--r--gcc/tree-diagnostic.c2
-rw-r--r--gcc/tree-eh.c38
-rw-r--r--gcc/tree-emutls.c28
-rw-r--r--gcc/tree-sra.c39
-rw-r--r--gcc/tree-ssa-ccp.c1
-rw-r--r--gcc/tree-ssa-dom.c6
-rw-r--r--gcc/tree-ssa-forwprop.c246
-rw-r--r--gcc/tree-ssa-loop-im.c11
-rw-r--r--gcc/tree-ssa-phiopt.c18
-rw-r--r--gcc/tree-ssa-pre.c1076
-rw-r--r--gcc/tree-ssa-reassoc.c4
-rw-r--r--gcc/tree-ssa-sccvn.c112
-rw-r--r--gcc/tree-ssa-sccvn.h3
-rw-r--r--gcc/tree-ssa-structalias.c82
-rw-r--r--gcc/tree-ssa-threadupdate.c14
-rw-r--r--gcc/tree-ssa.c2
-rw-r--r--gcc/tree-switch-conversion.c19
-rw-r--r--gcc/tree-vect-generic.c5
-rw-r--r--gcc/tree-vect-loop-manip.c2
-rw-r--r--gcc/tree-vect-slp.c4
-rw-r--r--gcc/tree-vectorizer.h2
-rw-r--r--gcc/tree-vrp.c116
-rw-r--r--gcc/tree.c6
-rw-r--r--gcc/tree.h6
-rw-r--r--gcc/var-tracking.c32
-rw-r--r--gcc/varasm.c21
-rw-r--r--gcc/vec.h167
-rw-r--r--gcc/vecir.h5
-rw-r--r--libatomic/ChangeLog4
-rwxr-xr-xlibatomic/configure1
-rw-r--r--libffi/ChangeLog4
-rwxr-xr-xlibffi/configure5
-rw-r--r--libgcc/ChangeLog29
-rw-r--r--libgcc/config/avr/lib1funcs-fixed.S224
-rw-r--r--libgcc/config/avr/lib1funcs.S41
-rw-r--r--libgcc/config/avr/t-avr24
-rw-r--r--libgcc/config/sh/lib1funcs.S451
-rw-r--r--libgcc/config/t-slibgcc-libgcc2
-rw-r--r--libgfortran/ChangeLog4
-rwxr-xr-xlibgfortran/configure6
-rw-r--r--libgomp/ChangeLog4
-rw-r--r--libitm/ChangeLog4
-rw-r--r--libjava/ChangeLog9
-rw-r--r--libjava/classpath/ChangeLog4
-rwxr-xr-xlibjava/classpath/configure14
-rwxr-xr-xlibjava/configure9
-rw-r--r--libjava/testsuite/libjava.lang/sourcelocation.jarbin0 -> 946 bytes
-rw-r--r--libjava/testsuite/libjava.lang/sourcelocation.java18
-rw-r--r--libjava/testsuite/libjava.lang/sourcelocation.out3
-rw-r--r--libmudflap/ChangeLog4
-rw-r--r--libobjc/ChangeLog4
-rwxr-xr-xlibobjc/configure7
-rw-r--r--libquadmath/ChangeLog6
-rw-r--r--libssp/ChangeLog4
-rw-r--r--libstdc++-v3/ChangeLog73
-rw-r--r--libstdc++-v3/Makefile.in3
-rw-r--r--libstdc++-v3/acinclude.m426
-rwxr-xr-xlibstdc++-v3/configure60
-rw-r--r--libstdc++-v3/configure.ac3
-rw-r--r--libstdc++-v3/doc/Makefile.in3
-rw-r--r--libstdc++-v3/fragment.am2
-rw-r--r--libstdc++-v3/include/Makefile.in23
-rw-r--r--libstdc++-v3/include/ext/random279
-rw-r--r--libstdc++-v3/include/ext/random.tcc69
-rw-r--r--libstdc++-v3/libsupc++/Makefile.in3
-rw-r--r--libstdc++-v3/libsupc++/guard.cc2
-rw-r--r--libstdc++-v3/po/Makefile.in3
-rw-r--r--libstdc++-v3/python/Makefile.in3
-rw-r--r--libstdc++-v3/src/Makefile.in3
-rw-r--r--libstdc++-v3/src/c++11/Makefile.in21
-rw-r--r--libstdc++-v3/src/c++11/random.cc4
-rw-r--r--libstdc++-v3/src/c++98/Makefile.in3
-rw-r--r--libstdc++-v3/testsuite/Makefile.in3
-rw-r--r--libstdc++-v3/testsuite/ext/random/beta_distribution/cons/default.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/beta_distribution/cons/default.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/beta_distribution/cons/parms.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/beta_distribution/cons/parms.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/beta_distribution/operators/equal.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/beta_distribution/operators/equal.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/beta_distribution/operators/inequal.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/beta_distribution/operators/inequal.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/beta_distribution/operators/serialize.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/beta_distribution/operators/serialize.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/beta_distribution/requirements/explicit_instantiation/1.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/beta_distribution/requirements/explicit_instantiation/1.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/beta_distribution/requirements/typedefs.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/beta_distribution/requirements/typedefs.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/normal_mv_distribution/cons/default.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/cons/default.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/normal_mv_distribution/cons/parms.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/cons/parms.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/normal_mv_distribution/operators/equal.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/operators/equal.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/normal_mv_distribution/operators/inequal.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/operators/inequal.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/normal_mv_distribution/operators/serialize.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/operators/serialize.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/normal_mv_distribution/requirements/explicit_instantiation/1.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/requirements/explicit_instantiation/1.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/normal_mv_distribution/requirements/typedefs.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/requirements/typedefs.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/rice_distribution/cons/default.cc47
-rw-r--r--libstdc++-v3/testsuite/ext/random/rice_distribution/cons/parms.cc47
-rw-r--r--libstdc++-v3/testsuite/ext/random/rice_distribution/operators/equal.cc44
-rw-r--r--libstdc++-v3/testsuite/ext/random/rice_distribution/operators/inequal.cc44
-rw-r--r--libstdc++-v3/testsuite/ext/random/rice_distribution/operators/serialize.cc51
-rw-r--r--libstdc++-v3/testsuite/ext/random/rice_distribution/requirements/explicit_instantiation/1.cc26
-rw-r--r--libstdc++-v3/testsuite/ext/random/rice_distribution/requirements/typedefs.cc36
-rw-r--r--libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/copy.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/cons/copy.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/default.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/cons/default.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/seed1.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/cons/seed1.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/seed2.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/cons/seed2.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/seed_seq.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/cons/seed_seq.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/operators/equal.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/operators/equal.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/operators/inequal.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/operators/inequal.cc)0
-rw-r--r--libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/operators/serialize.cc (renamed from libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/operators/serialize.cc)0
-rw-r--r--libtool.m42
-rw-r--r--lto-plugin/ChangeLog4
-rwxr-xr-xlto-plugin/configure5
-rw-r--r--zlib/ChangeLog.gcj4
-rw-r--r--zlib/Makefile.in2
-rw-r--r--zlib/aclocal.m46
-rwxr-xr-xzlib/configure5
400 files changed, 12303 insertions, 6538 deletions
diff --git a/ChangeLog b/ChangeLog
index ceb5d48e38f..ac75547844c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,14 @@
-2012-09-06 Diego Novillo <dnovillo@google.com>
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ PR target/38607
+ Merge upstream change.
+ * libtool.m4 (_LT_COMPILER_PIC): Add -fPIC to GCC and GXX for AIX.
+
+ * configure.ac: Add target-libquadmath to noconfigdirs for AIX.
+ Add libgomp*.o to compare_exclusions for AIX.
+ * configure: Regenerate.
+
+2012-09-06 Diego Novillo <dnovillo@google.com>
* configure.ac: Bump minimum GMP version to 4.2.3.
* configure: Re-generate.
diff --git a/ChangeLog.MELT b/ChangeLog.MELT
index f3847dda95f..153a0f8b8ee 100644
--- a/ChangeLog.MELT
+++ b/ChangeLog.MELT
@@ -1,4 +1,8 @@
+2012-09-17 Basile Starynkevitch <basile@starynkevitch.net>
+
+ MELT branch merged with trunk rev 191371 using svnmerge.
+
2012-09-10 Basile Starynkevitch <basile@starynkevitch.net>
MELT branch merged with trunk rev 191132 using svnmerge.
diff --git a/boehm-gc/ChangeLog b/boehm-gc/ChangeLog
index f25fbbcd893..57359f0beaf 100644
--- a/boehm-gc/ChangeLog
+++ b/boehm-gc/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
2012-05-16 H.J. Lu <hongjiu.lu@intel.com>
* configure: Regenerated.
@@ -30,7 +34,7 @@
* include/gc_config_macros.h (GC_DLL): Define it for mingw-targets
only, if we are actual in boehm-gc's build and DLL_EXPORT
is defined.
-
+
2011-11-21 Andreas Tobler <andreast@fgznet.ch>
* configure: Regenerate.
diff --git a/boehm-gc/configure b/boehm-gc/configure
index aa610539399..1d751fd684f 100755
--- a/boehm-gc/configure
+++ b/boehm-gc/configure
@@ -8338,6 +8338,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
fi
+ lt_prog_compiler_pic='-fPIC'
;;
amigaos*)
@@ -11311,7 +11312,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11314 "configure"
+#line 11315 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -11417,7 +11418,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11420 "configure"
+#line 11421 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -13220,6 +13221,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static_CXX='-Bstatic'
fi
+ lt_prog_compiler_pic_CXX='-fPIC'
;;
amigaos*)
diff --git a/configure b/configure
index a5df0c8672f..f31d16bae3f 100755
--- a/configure
+++ b/configure
@@ -3135,6 +3135,15 @@ $as_echo "yes" >&6; }
fi
fi
+# Disable libquadmath for some systems.
+case "${target}" in
+ # libquadmath is unused on AIX and libquadmath build process use of
+ # LD_LIBRARY_PATH can break AIX bootstrap.
+ powerpc-*-aix* | rs6000-*-aix*)
+ noconfigdirs="$noconfigdirs target-libquadmath"
+ ;;
+esac
+
# Disable libssp for some systems.
case "${target}" in
avr-*-*)
@@ -14247,6 +14256,7 @@ compare_exclusions="gcc/cc*-checksum\$(objext) | gcc/ada/*tools/*"
case "$target" in
hppa*64*-*-hpux*) ;;
hppa*-*-hpux*) compare_exclusions="gcc/cc*-checksum\$(objext) | */libgcc/lib2funcs* | gcc/ada/*tools/*" ;;
+ powerpc*-ibm-aix*) compare_exclusions="gcc/cc*-checksum\$(objext) | gcc/ada/*tools/* | *libgomp*\$(objext)" ;;
esac
diff --git a/configure.ac b/configure.ac
index a6f58280439..0eac6a4f13e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -527,6 +527,15 @@ if test -d ${srcdir}/libitm; then
fi
fi
+# Disable libquadmath for some systems.
+case "${target}" in
+ # libquadmath is unused on AIX and libquadmath build process use of
+ # LD_LIBRARY_PATH can break AIX bootstrap.
+ powerpc-*-aix* | rs6000-*-aix*)
+ noconfigdirs="$noconfigdirs target-libquadmath"
+ ;;
+esac
+
# Disable libssp for some systems.
case "${target}" in
avr-*-*)
@@ -3187,6 +3196,7 @@ compare_exclusions="gcc/cc*-checksum\$(objext) | gcc/ada/*tools/*"
case "$target" in
hppa*64*-*-hpux*) ;;
hppa*-*-hpux*) compare_exclusions="gcc/cc*-checksum\$(objext) | */libgcc/lib2funcs* | gcc/ada/*tools/*" ;;
+ powerpc*-ibm-aix*) compare_exclusions="gcc/cc*-checksum\$(objext) | gcc/ada/*tools/* | *libgomp*\$(objext)" ;;
esac
AC_SUBST(compare_exclusions)
diff --git a/contrib/ChangeLog b/contrib/ChangeLog
index 9173c6c7228..fbffc5e126a 100644
--- a/contrib/ChangeLog
+++ b/contrib/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-10 Diego Novillo <dnovillo@google.com>
+
+ * testsuite-management/x86_64-unknown-linux-gnu.xfail: Update.
+
2012-09-04 Eric Botcazou <ebotcazou@adacore.com>
* make_sunver.pl: Add missing newline at the end of extern "C++" block.
diff --git a/contrib/testsuite-management/x86_64-unknown-linux-gnu.xfail b/contrib/testsuite-management/x86_64-unknown-linux-gnu.xfail
index 2315738a46b..b4e59872235 100644
--- a/contrib/testsuite-management/x86_64-unknown-linux-gnu.xfail
+++ b/contrib/testsuite-management/x86_64-unknown-linux-gnu.xfail
@@ -1,126 +1,74 @@
XPASS: gcc.dg/Wstrict-overflow-18.c (test for bogus messages, line 20)
-FAIL: gcc.dg/attr-weakref-1.c (test for excess errors)
UNRESOLVED: gcc.dg/attr-weakref-1.c compilation failed to produce executable
+FAIL: gcc.dg/attr-weakref-1.c (test for excess errors)
XPASS: gcc.dg/guality/example.c -O2 -flto -fno-use-linker-plugin -flto-partition=none execution test
XPASS: gcc.dg/guality/example.c -O2 execution test
XPASS: gcc.dg/guality/example.c -O0 execution test
XPASS: gcc.dg/guality/guality.c -O2 execution test
-XPASS: gcc.dg/guality/guality.c -O3 -fomit-frame-pointer execution test
-XPASS: gcc.dg/guality/guality.c -O1 execution test
-XPASS: gcc.dg/guality/guality.c -O0 execution test
-XPASS: gcc.dg/guality/guality.c -Os execution test
XPASS: gcc.dg/guality/guality.c -O3 -g execution test
XPASS: gcc.dg/guality/guality.c -O2 -flto -fno-use-linker-plugin -flto-partition=none execution test
+XPASS: gcc.dg/guality/guality.c -O1 execution test
+XPASS: gcc.dg/guality/guality.c -O3 -fomit-frame-pointer execution test
XPASS: gcc.dg/guality/guality.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects execution test
+XPASS: gcc.dg/guality/guality.c -O0 execution test
+XPASS: gcc.dg/guality/guality.c -Os execution test
XPASS: gcc.dg/guality/inline-params.c -O2 execution test
XPASS: gcc.dg/guality/inline-params.c -O3 -g execution test
XPASS: gcc.dg/guality/inline-params.c -O2 -flto -fno-use-linker-plugin -flto-partition=none execution test
-XPASS: gcc.dg/guality/inline-params.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects execution test
XPASS: gcc.dg/guality/inline-params.c -O3 -fomit-frame-pointer execution test
+XPASS: gcc.dg/guality/inline-params.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects execution test
XPASS: gcc.dg/guality/inline-params.c -Os execution test
-XPASS: gcc.dg/guality/pr41447-1.c -O1 execution test
-XPASS: gcc.dg/guality/pr41447-1.c -O3 -fomit-frame-pointer execution test
-XPASS: gcc.dg/guality/pr41447-1.c -Os execution test
XPASS: gcc.dg/guality/pr41447-1.c -O2 execution test
-XPASS: gcc.dg/guality/pr41447-1.c -O3 -g execution test
XPASS: gcc.dg/guality/pr41447-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none execution test
XPASS: gcc.dg/guality/pr41447-1.c -O0 execution test
+XPASS: gcc.dg/guality/pr41447-1.c -O1 execution test
+XPASS: gcc.dg/guality/pr41447-1.c -O3 -fomit-frame-pointer execution test
XPASS: gcc.dg/guality/pr41447-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects execution test
+XPASS: gcc.dg/guality/pr41447-1.c -O3 -g execution test
+XPASS: gcc.dg/guality/pr41447-1.c -Os execution test
XPASS: gcc.dg/guality/pr41616-1.c -O1 execution test
XPASS: gcc.dg/guality/pr41616-1.c -O3 -fomit-frame-pointer execution test
-XPASS: gcc.dg/guality/pr41616-1.c -O0 execution test
-XPASS: gcc.dg/guality/pr41616-1.c -Os execution test
XPASS: gcc.dg/guality/pr41616-1.c -O2 execution test
XPASS: gcc.dg/guality/pr41616-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none execution test
+XPASS: gcc.dg/guality/pr41616-1.c -O0 execution test
+XPASS: gcc.dg/guality/pr41616-1.c -Os execution test
XPASS: gcc.dg/guality/pr41616-1.c -O3 -g execution test
XPASS: gcc.dg/inline_3.c (test for excess errors)
XPASS: gcc.dg/inline_4.c (test for excess errors)
-FAIL: gcc.dg/pr52558-1.c scan-tree-dump-times lim1 "MEM count_lsm.. count_lsm_flag" 1
FAIL: gcc.dg/pr52558-2.c scan-tree-dump-times lim1 "MEM.*g_2_lsm_flag" 1
FAIL: gcc.dg/tm/reg-promotion.c scan-tree-dump-times lim1 "MEM count_lsm.. count_lsm_flag" 1
-FAIL: gcc.dg/torture/pr51106-2.c -O3 -g (internal compiler error)
-FAIL: gcc.dg/torture/pr51106-2.c -O1 (test for excess errors)
-FAIL: gcc.dg/torture/pr51106-2.c -Os (internal compiler error)
-FAIL: gcc.dg/torture/pr51106-2.c -O3 -fomit-frame-pointer (internal compiler error)
-FAIL: gcc.dg/torture/pr51106-2.c -O2 -flto -fno-use-linker-plugin -flto-partition=none (internal compiler error)
-FAIL: gcc.dg/torture/pr51106-2.c -Os (test for excess errors)
FAIL: gcc.dg/torture/pr51106-2.c -O2 -flto -fno-use-linker-plugin -flto-partition=none (test for excess errors)
FAIL: gcc.dg/torture/pr51106-2.c -O3 -g (test for excess errors)
FAIL: gcc.dg/torture/pr51106-2.c -O0 (internal compiler error)
+FAIL: gcc.dg/torture/pr51106-2.c -O2 (internal compiler error)
FAIL: gcc.dg/torture/pr51106-2.c -O1 (internal compiler error)
FAIL: gcc.dg/torture/pr51106-2.c -O0 (test for excess errors)
FAIL: gcc.dg/torture/pr51106-2.c -O2 (test for excess errors)
-FAIL: gcc.dg/torture/pr51106-2.c -O2 (internal compiler error)
+FAIL: gcc.dg/torture/pr51106-2.c -O3 -g (internal compiler error)
+FAIL: gcc.dg/torture/pr51106-2.c -O1 (test for excess errors)
+FAIL: gcc.dg/torture/pr51106-2.c -Os (internal compiler error)
+FAIL: gcc.dg/torture/pr51106-2.c -O3 -fomit-frame-pointer (internal compiler error)
+FAIL: gcc.dg/torture/pr51106-2.c -O2 -flto -fno-use-linker-plugin -flto-partition=none (internal compiler error)
+FAIL: gcc.dg/torture/pr51106-2.c -Os (test for excess errors)
FAIL: gcc.dg/torture/pr51106-2.c -O3 -fomit-frame-pointer (test for excess errors)
XPASS: gcc.dg/unroll_2.c (test for excess errors)
XPASS: gcc.dg/unroll_3.c (test for excess errors)
XPASS: gcc.dg/unroll_4.c (test for excess errors)
FAIL: gcc.target/i386/pad-10.c scan-assembler-not nop
-FAIL: gfortran.dg/lto/pr45586 f_lto_pr45586_0.o-f_lto_pr45586_0.o link, -O0 -flto -flto-partition=none -fuse-linker-plugin (internal compiler error)
-FAIL: gfortran.dg/lto/pr45586 f_lto_pr45586_0.o-f_lto_pr45586_0.o link, -O0 -flto -fuse-linker-plugin -fno-fat-lto-objects (internal compiler error)
FAIL: gfortran.dg/lto/pr45586 f_lto_pr45586_0.o-f_lto_pr45586_0.o link, -O0 -flto -flto-partition=1to1 -fno-use-linker-plugin (internal compiler error)
-UNRESOLVED: gfortran.dg/lto/pr45586 f_lto_pr45586_0.o-f_lto_pr45586_0.o execute -O0 -flto -flto-partition=1to1 -fno-use-linker-plugin
UNRESOLVED: gfortran.dg/lto/pr45586 f_lto_pr45586_0.o-f_lto_pr45586_0.o execute -O0 -flto -fuse-linker-plugin -fno-fat-lto-objects
+FAIL: gfortran.dg/lto/pr45586 f_lto_pr45586_0.o-f_lto_pr45586_0.o link, -O0 -flto -fuse-linker-plugin -fno-fat-lto-objects (internal compiler error)
+UNRESOLVED: gfortran.dg/lto/pr45586 f_lto_pr45586_0.o-f_lto_pr45586_0.o execute -O0 -flto -flto-partition=1to1 -fno-use-linker-plugin
+FAIL: gfortran.dg/lto/pr45586 f_lto_pr45586_0.o-f_lto_pr45586_0.o link, -O0 -flto -flto-partition=none -fuse-linker-plugin (internal compiler error)
UNRESOLVED: gfortran.dg/lto/pr45586 f_lto_pr45586_0.o-f_lto_pr45586_0.o execute -O0 -flto -flto-partition=none -fuse-linker-plugin
-UNRESOLVED: gfortran.dg/lto/pr45586-2 f_lto_pr45586-2_0.o-f_lto_pr45586-2_0.o execute -O0 -flto -fuse-linker-plugin -fno-fat-lto-objects
+UNRESOLVED: gfortran.dg/lto/pr45586-2 f_lto_pr45586-2_0.o-f_lto_pr45586-2_0.o execute -O0 -flto -flto-partition=none -fuse-linker-plugin
UNRESOLVED: gfortran.dg/lto/pr45586-2 f_lto_pr45586-2_0.o-f_lto_pr45586-2_0.o execute -O0 -flto -flto-partition=1to1 -fno-use-linker-plugin
+FAIL: gfortran.dg/lto/pr45586-2 f_lto_pr45586-2_0.o-f_lto_pr45586-2_0.o link, -O0 -flto -flto-partition=1to1 -fno-use-linker-plugin (internal compiler error)
+UNRESOLVED: gfortran.dg/lto/pr45586-2 f_lto_pr45586-2_0.o-f_lto_pr45586-2_0.o execute -O0 -flto -fuse-linker-plugin -fno-fat-lto-objects
FAIL: gfortran.dg/lto/pr45586-2 f_lto_pr45586-2_0.o-f_lto_pr45586-2_0.o link, -O0 -flto -flto-partition=none -fuse-linker-plugin (internal compiler error)
-UNRESOLVED: gfortran.dg/lto/pr45586-2 f_lto_pr45586-2_0.o-f_lto_pr45586-2_0.o execute -O0 -flto -flto-partition=none -fuse-linker-plugin
FAIL: gfortran.dg/lto/pr45586-2 f_lto_pr45586-2_0.o-f_lto_pr45586-2_0.o link, -O0 -flto -fuse-linker-plugin -fno-fat-lto-objects (internal compiler error)
-FAIL: gfortran.dg/lto/pr45586-2 f_lto_pr45586-2_0.o-f_lto_pr45586-2_0.o link, -O0 -flto -flto-partition=1to1 -fno-use-linker-plugin (internal compiler error)
-FAIL: gfortran.dg/realloc_on_assign_14.f90 -O (internal compiler error)
-FAIL: gfortran.dg/realloc_on_assign_14.f90 -O (test for excess errors)
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -O0 (test for excess errors)
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -O3 -g (test for excess errors)
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -O0 (internal compiler error)
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -O1 (test for excess errors)
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions (test for excess errors)
-UNRESOLVED: gfortran.dg/realloc_on_assign_15.f90 -O3 -fomit-frame-pointer compilation failed to produce executable
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -O3 -fomit-frame-pointer (test for excess errors)
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -O2 (test for excess errors)
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -O3 -fomit-frame-pointer -funroll-loops (internal compiler error)
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -O1 (internal compiler error)
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -O2 (internal compiler error)
-UNRESOLVED: gfortran.dg/realloc_on_assign_15.f90 -Os compilation failed to produce executable
-UNRESOLVED: gfortran.dg/realloc_on_assign_15.f90 -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions compilation failed to produce executable
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -Os (internal compiler error)
-UNRESOLVED: gfortran.dg/realloc_on_assign_15.f90 -O3 -fomit-frame-pointer -funroll-loops compilation failed to produce executable
-UNRESOLVED: gfortran.dg/realloc_on_assign_15.f90 -O1 compilation failed to produce executable
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -O3 -g (internal compiler error)
-UNRESOLVED: gfortran.dg/realloc_on_assign_15.f90 -O0 compilation failed to produce executable
-UNRESOLVED: gfortran.dg/realloc_on_assign_15.f90 -O3 -g compilation failed to produce executable
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions (internal compiler error)
-UNRESOLVED: gfortran.dg/realloc_on_assign_15.f90 -O2 compilation failed to produce executable
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -O3 -fomit-frame-pointer (internal compiler error)
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -O3 -fomit-frame-pointer -funroll-loops (test for excess errors)
-FAIL: gfortran.dg/realloc_on_assign_15.f90 -Os (test for excess errors)
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -O3 -g (test for excess errors)
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -O2 (test for excess errors)
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -O0 (internal compiler error)
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -O0 (test for excess errors)
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -O3 -fomit-frame-pointer (internal compiler error)
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -O3 -g (internal compiler error)
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions (internal compiler error)
-UNRESOLVED: gfortran.dg/realloc_on_assign_2.f03 -Os compilation failed to produce executable
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -O2 (internal compiler error)
-UNRESOLVED: gfortran.dg/realloc_on_assign_2.f03 -O3 -fomit-frame-pointer compilation failed to produce executable
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -O1 (internal compiler error)
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions (test for excess errors)
-UNRESOLVED: gfortran.dg/realloc_on_assign_2.f03 -O0 compilation failed to produce executable
-UNRESOLVED: gfortran.dg/realloc_on_assign_2.f03 -O2 compilation failed to produce executable
-UNRESOLVED: gfortran.dg/realloc_on_assign_2.f03 -O3 -g compilation failed to produce executable
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -Os (internal compiler error)
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -O3 -fomit-frame-pointer (test for excess errors)
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -O1 (test for excess errors)
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -O3 -fomit-frame-pointer -funroll-loops (test for excess errors)
-UNRESOLVED: gfortran.dg/realloc_on_assign_2.f03 -O3 -fomit-frame-pointer -funroll-loops compilation failed to produce executable
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -Os (test for excess errors)
-FAIL: gfortran.dg/realloc_on_assign_2.f03 -O3 -fomit-frame-pointer -funroll-loops (internal compiler error)
-UNRESOLVED: gfortran.dg/realloc_on_assign_2.f03 -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions compilation failed to produce executable
-UNRESOLVED: gfortran.dg/realloc_on_assign_2.f03 -O1 compilation failed to produce executable
FAIL: gnat.dg/array11.adb (test for warnings, line 12)
FAIL: gnat.dg/object_overflow.adb (test for warnings, line 8)
FAIL: libmudflap.c++/pass55-frag.cxx (-O2) execution test
FAIL: libmudflap.c++/pass55-frag.cxx ( -O) execution test
FAIL: libmudflap.c++/pass55-frag.cxx (-O3) execution test
-FAIL: log
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c53ed7bb74a..74d1f3c34e7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,621 @@
+2012-09-16 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * calls.c (expand_call): Use emit_group_move for PARALLEL->PARALLEL
+ moves.
+
+2012-09-15 Tom de Vries <tom@codesourcery.com>
+
+ * tree-vrp.c (extract_range_from_binary_expr_1): Fix bug in handling of
+ LSHIFT_EXPR with shift range. Handle more LSHIFT_EXPR cases with shift
+ range.
+
+2012-09-15 Georg-Johann Lay <avr@gjlay.de>
+
+ PR target/54222
+ * config/avr/avr-fixed.md (ALL2S, ALL4S, ALL24S, ALL124S,
+ ALL124U): New mode iterators.
+ (<code_stdname><mode>3): New insns for SS_PLUS, SS_MINUS.
+ (<code_stdname><mode>3): New insns for US_PLUS, US_MINUS.
+ (usneg<mode>2): New insns.
+ (<code_stdname><mode>2): New expanders for SS_NEG, SS_ABS.
+ (*<code_stdname><mode>2): New insns for SS_NEG, SS_ABS.
+ * config/avr/avr-dimode.md (ALL8U, ALL8S): New mode iterators.
+ (avr_out_plus64, avr_out_minus64): Use avr_out_plus instead.
+ (<code_stdname><mode>3): New expanders for SS_PLUS, SS_MINUS.
+ (<code_stdname><mode>3): New expanders for US_PLUS, US_MINUS.
+ (<code_stdname><mode>3_insn): New insns.
+ (<code_stdname><mode>3_const_insn): New insns.
+ * config/avr/avr.md (cc): Add: plus. Remove: out_plus,
+ out_plus_noclobber, minus.
+ (length): Add: plus. Remove: out_plus, out_plus_noclobber,
+ plus64, minus, minus64.
+ (abelian): New code_attr.
+ (code_stdname): Handle: ss_plus, ss_minus, ss_neg, ss_abs,
+ us_plus, us_minus, us_neg.
+ (*add<mode>3, add<mode>3_clobber, add<mode>3, addpsi3, sub<mode>3):
+ Use avr_out_plus to output.
+ * config/avr/avr-protos.h (avr_out_plus): Change prototype.
+ (avr_out_plus_noclobber, avr_out_minus): Remove.
+ (avr_out_plus64, avr_out_minus64): Remove.
+ * config/avr/avr.c (avr_out_plus_1): Add new default arguments
+ code_sat, sign. Saturate after operation if code_sat != UNKNOWN.
+ (avr_out_plus_symbol): New static function.
+ (avr_out_plus): Rewrite.
+ (adjust_insn_length): Handle: ADJUST_LEN_PLUS. Remove handling
+ of: ADJUST_LEN_OUT_PLUS, ADJUST_LEN_PLUS64, ADJUST_LEN_MINUS,
+ ADJUST_LEN_MINUS64, ADJUST_LEN_OUT_PLUS_NOCLOBBER.
+ (notice_update_cc): Handle: CC_PLUS. Remove handling of: CC_MINUS,
+ CC_OUT_PLUS, CC_OUT_PLUS_NOCLOBBER
+ (avr_out_plus_noclobber, avr_out_minus): Remove.
+ (avr_out_plus64, avr_out_minus64): Remove.
+ (avr_print_operand): Print raw REGNO if 'r' is used with REG.
+
+2012-09-15 Oleg Endo <olegendo@gcc.gnu.org>
+
+ * config/sh/sh.c (sh_rtx_costs): Add handling of MEM, SIGN_EXTEND,
+ ZERO_EXTEND and PARALLEL cases.
+ (sh_address_cost): Correct rtx parsing and tweak cost estimations.
+
+2012-09-14 Sandra Loosemore <sandra@codesourcery.com>
+
+ * doc/tm.texi.in (Stack Arguments): Update obsolete references
+ to current_function_outgoing_args_size.
+ (Function Entry): Likewise for current_function_pops_args,
+ current_function_pretend_args_size,
+ current_function_outgoing_args_size, and
+ current_function_epilogue_delay_list.
+ (Misc): Fix garbled sentence referencing nonexistent
+ current_function_leaf_function.
+ * doc/tm.texi: Regenerated.
+
+2012-09-14 Dehao Chen <dehao@google.com>
+
+ * tree-eh.c (goto_queue_node): New field.
+ (record_in_goto_queue): New parameter.
+ (record_in_goto_queue_label): New parameter.
+ (lower_try_finally_dup_block): New parameter.
+ (maybe_record_in_goto_queue): Update source location.
+ (lower_try_finally_copy): Likewise.
+ (honor_protect_cleanup_actions): Likewise.
+ * gimplify.c (gimplify_expr): Reset the location to unknown.
+
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
+2012-09-14 Walter Lee <walt@tilera.com>
+
+ * doc/invoke.texi (Option Summary): fix typesetting for -mcpu
+ option for TILEPro and TILE-Gx.
+ (TILE-Gx Options): Fix grammar and spellings in documentation for
+ -mcmodel.
+
+2012-09-14 Marc Glisse <marc.glisse@inria.fr>
+
+ PR c++/54427
+ * fold-const.c (fold_unary_loc): Disable for VECTOR_TYPE.
+ (fold_binary_loc): Likewise.
+ * gimple-fold.c (and_comparisons_1): Handle VECTOR_TYPE.
+ (or_comparisons_1): Likewise.
+
+2012-09-14 Richard Earnshaw <rearnsha@arm.com>
+
+ PR target/54516
+ PR rtl-optimization/54540
+ * reload.c (find_dummy_reload): Don't use OUT as a reload reg
+ for IN if it overlaps a fixed register.
+
+2012-09-14 Eric Botcazou <ebotcazou@adacore.com>
+
+ PR rtl-optimization/44194
+ * calls.c (expand_call): In the PARALLEL case, copy the return value
+ into pseudos instead of spilling it onto the stack.
+ * emit-rtl.c (adjust_address_1): Rename ADJUST into ADJUST_ADDRESS and
+ add new ADJUST_OBJECT parameter.
+ If ADJUST_OBJECT is set, drop the underlying object if it cannot be
+ proved that the adjusted memory access is still within its bounds.
+ (adjust_automodify_address_1): Adjust call to adjust_address_1.
+ (widen_memory_access): Likewise.
+ * expmed.c (store_bit_field_1): Call adjust_bitfield_address instead
+ of adjust_address. Do not drop the underlying object of a MEM.
+ (store_fixed_bit_field): Likewise.
+ (extract_bit_field_1): Likewise. Fix oversight in recursion.
+ (extract_fixed_bit_field): Likewise.
+ * expr.h (adjust_address_1): Adjust prototype.
+ (adjust_address): Adjust call to adjust_address_1.
+ (adjust_address_nv): Likewise.
+ (adjust_bitfield_address): New macro.
+ (adjust_bitfield_address_nv): Likewise.
+ * expr.c (expand_assignment): Handle a PARALLEL in more cases.
+ (store_expr): Likewise.
+ (store_field): Likewise.
+
+ * dse.c: Fix typos in the head comment.
+
+2012-09-14 Christian Bruel <christian.bruel@st.com>
+
+ PR target/54546
+ * config/sh/sh-protos.h (sh_need_epilogue): Delete.
+ (sh_can_use_simple_return_p): Declare.
+ * config/sh/sh.c (sh_can_use_simple_return_p): Define.
+ (sh_need_epilogue, sh_need_epilogue_known): Delete.
+ (sh_output_function_epilogue): Remove sh_need_epilogue_known.
+ * config/sh/sh.md (simple_return, return): Define.
+ (epilogue): Use inline return rtl.
+ (sh_expand_epilogue): Cleanup parameters boolean type.
+ * config/sh/iterators.md (any_return): New iterator.
+
+2012-09-14 Christian Bruel <christian.bruel@st.com>
+
+ * config/sh/predicates.md (t_reg_operand): Check REG_P for SUBREG.
+ * config/sh/sh.c (sequence_insn_p: Check INSNP_P for SEQUENCE.
+
+2012-09-14 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/54564
+ * config/i386/sse.md (fmai_vmfmadd_<mode>): Use (match_dup 1)
+ instead of (match_dup 0) as second argument to vec_merge.
+ (*fmai_fmadd_<mode>, *fmai_fmsub_<mode>): Likewise.
+ Remove third alternative.
+ (*fmai_fnmadd_<mode>, *fmai_fnmsub_<mode>): Likewise. Negate
+ operand 2 instead of operand 1, but put it as first argument
+ of fma.
+
+2012-09-14 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/54565
+ * passes.c (init_optimization_passes): Adjust comments.
+ (execute_function_todo): Do not execute execute_update_addresses_taken
+ before processing TODO_rebuild_alias.
+ * tree-ssa-ccp.c (do_ssa_ccp): Schedule TODO_update_address_taken.
+
+2012-09-14 Richard Guenther <rguenther@suse.de>
+
+ * tree-vrp.c (register_new_assert_for): Simplify for backward
+ walk.
+ (find_assert_locations_1): Walk the basic-block backwards,
+ properly add/prune from live. Use live for asserts derived
+ from stmts.
+
+2012-09-14 Marc Glisse <marc.glisse@inria.fr>
+
+ * tree-ssa-forwprop.c (simplify_bitfield_ref): Call
+ get_prop_source_stmt.
+ (simplify_permutation): Likewise.
+ (simplify_vector_constructor): Likewise.
+
+2012-09-14 Richard Guenther <rguenther@suse.de>
+
+ * builtin-types.def (BT_FN_CONST_STRING): Add.
+ * builtins.def (BUILT_IN_FILE, BUILT_IN_FUNCTION,
+ BUILT_IN_LINE): New builtins.
+ * gimplify.c (gimplify_call_expr): Expand them.
+ * doc/extend.texi (__builtin_LINE, __builtin_FUNCTION,
+ __builtin_FILE): Document.
+
+2012-09-13 Anthony Green <green@moxielogic.com>
+
+ * config/moxie/moxie.h (LINK_SPEC): Add bi-endian support.
+ (MULTILIB_DEFAULTS): Define.
+ (ASM_SPEC): Define.
+ (BYTES_BIG_ENDIAN, WORDS_BIG_ENDIAN): Add bi-endian support.
+ (TARGET_CPU_CPP_BUILTINS): Add __MOXIE_LITTLE_ENDIAN__ and
+ __MOXIE_BIG_ENDIAN__.
+ * config/moxie/t-moxie (MULTILIB_DIRNAMES, MULTILIB_OPTIONS):
+ Define.
+ * config/moxie/moxie.opt: New file.
+ * doc/invoke.texi (Moxie Options): Add section documenting -mel
+ and -meb.
+
+2012-09-13 Paolo Carlini <paolo.carlini@oracle.com>
+ Manuel López-Ibáñez <manu@gcc.gnu.org>
+
+ PR c++/53210
+ * doc/invoke.texi ([Winit-self]): Document as enabled by -Wall
+ in C++.
+
+2012-09-13 Eric Botcazou <ebotcazou@adacore.com>
+
+ * config/sparc/predicates.md (input_operand): Do not consider TImode
+ constants as 1-instruction integer constants.
+ Use register_or_zero_operand instead of register_operand and tidy up.
+ * config/sparc/sparc.md (movti): New expander.
+ (movti_insn_sp64): New instruction.
+ (movti_insn_sp64_hq): Likewise.
+ (TImode splitters): New splitters.
+ * config/sparc/sparc.c (sparc_expand_move) <TImode>: New case.
+ (sparc_legitimate_address_p): Return 0 for REG+REG in TImode.
+
+ * config/sparc/sparc-protos.h (arith_double_4096_operand): Delete.
+ (arith_4096_operand): Likewise.
+ (zero_operand): Likewise.
+ (fp_zero_operand): Likewise.
+ (reg_or_0_operand): Likewise.
+
+2012-09-13 Jakub Jelinek <jakub@redhat.com>
+
+ * configure.ac (CXXFLAGS): Remove -O2 when not bootstrapping.
+ * configure: Regenerated.
+
+2012-08-13 Uros Bizjak <ubizjak@gmail.com>
+
+ * config/i386/i386.md (prefetch): Do not assert mode of operand 0.
+ (*prefetch_sse_<mode>): Do not set mode of address_operand predicate.
+ Rename to ...
+ (*prefetch_sse): ... this.
+ (*prefetch_3dnow_<mode>): Do not set mode of address_operand predicate.
+ Rename to ...
+ (*prefetch_3dnow): ... this.
+
+2012-09-13 Steven Bosscher <steven@gcc.gnu.org>
+
+ * ipa-pure-const.c (state_from_flags, local_pure_const): Use
+ current_function_name instead of lang_hooks.decl_printable_name.
+
+ * function.h (fndecl_name): New prototype.
+ * function.c (fndecl_name): New function.
+ * vecir.h (cgraph_node_p): New standard IR VEC type.
+ * trans-mem.c (cgraph_node_p): No need anymore to define it here.
+ * ipa-utils.h (ipa_get_nodes_in_cycle): New prototype.
+ * ipa-utils.c (ipa_get_nodes_in_cycle): New function.
+ * ipa-reference.c: Don't include langhooks.h, and certainly not twice.
+ Fix many formatting issues (long lines, short lines, spacing, etc.).
+ (get_static_name): Use fndecl_name.
+ (dump_static_vars_set_to_file): New function split out from propagate.
+ (union_static_var_sets): New function, union two sets and collapse
+ to all_module_statics as quickly as possible.
+ (intersect_static_var_sets): New function, similar to above.
+ (copy_static_var_set): Renamed from copy_global_bitmap and rewritten
+ to allocate a copy on the same bitmap_obstack as the source set.
+ (propagate_bits): Simplify, and clarify by using union_static_var_sets.
+ (generate_summary): Remove bm_temp. Print UID of promotable globals.
+ (read_write_all_from_decl): Use pass-by-reference, bless C++.
+ (get_read_write_all_from_node): New function, split out from propagate.
+ (propagate): Simplify and clarify with helper functions. Use
+ ipa_get_nodes_in_cycle to walk all nodes in a reduced node.
+ (ipa_reference_read_optimization_summary): Use fndecl_name instead of
+ lang_hooks.decl_printable_name.
+
+ * rtl.h (print_rtl_single_with_indent): New prototype.
+ * print-rtl.c (print_rtl_single_with_indent): New function.
+ * cfghooks.h (empty_block_p, split_block_before_cond_jump): New hooks.
+ * cfghooks.c (empty_block_p, split_block_before_cond_jump): Implement.
+ * cfgrtl.c (rtl_block_empty_p, rtl_split_block_before_cond_jump):
+ Implement RTL specific hooks.
+ (rtl_cfg_hooks, cfg_layout_rtl_cfg_hooks): Register the new hooks.
+ * tree-cfg.c (gimple_empty_block_p,
+ gimple_split_block_before_cond_jump): Implement GIMPLE specific hooks.
+ (gimple_cfg_hooks): Register the new hooks.
+ * tree-ssa-phiopt.c (empty_block_p): Remove in favor of new hook.
+
+2012-09-13 Richard Guenther <rguenther@suse.de>
+
+ * tree-ssa-sccvn.h (enum vn_kind): New.
+ (vn_get_stmt_kind): Likewise.
+ * tree-ssa-sccvn.c (vn_get_stmt_kind): New function, adjust
+ ADDR_EXPR handling.
+ (visit_use): Use it.
+ * tree-ssa-pre.c (compute_avail): Likewise, simplify further.
+
+2012-09-13 Venkataramanan Kumar <venkataramanan.kumar@amd.com>
+
+ * config/i386/i386.c (processor_alias_table): Enable PTA_PRFCHW
+ for targets bdver1, bdver2, btver1 and btver2.
+
+2012-09-13 Christophe Lyon <christophe.lyon@linaro.org>
+ Richard Earnshaw <rearnsha@arm.com>
+
+ * config/arm/arm.md (arm_rev): Factorize thumb1, thumb2 and arm
+ variants for rev instruction..
+ (thumb1_rev): Delete pattern.
+ (arm_revsh): New pattern to support builtin_bswap16.
+ (arm_rev16, bswaphi2): Likewise.
+
+2012-09-12 Teresa Johnson <tejohnson@google.com>
+
+ PR gcov-profile/54487
+ * configure.ac (HOST_HAS_F_SETLKW): Set based on compile
+ test using F_SETLKW with fcntl.
+ * configure, config.in: Regenerate.
+
+2012-09-12 Jan Hubicka <jh@suse.cz>
+
+ PR fortran/48636
+ * ipa-inline-analysis.c (dump_inline_hints): Dump loop stride.
+ (set_hint_predicate): New function.
+ (reset_inline_summary): Reset loop stride.
+ (remap_predicate_after_duplication): New function.
+ (remap_hint_predicate_after_duplication): New function.
+ (inline_node_duplication_hook): Update.
+ (dump_inline_summary): Dump stride summaries.
+ (estimate_function_body_sizes): Compute strides.
+ (remap_hint_predicate): New function.
+ (inline_merge_summary): Use it.
+ (inline_read_section): Read stride.
+ (inline_write_summary): Write stride.
+ * ipa-inline.c (want_inline_small_function_p): Handle strides.
+ (edge_badness): Likewise.
+ * ipa-inline.h (inline_hints_vals): Add stride hint.
+ (inline_summary): Update stride.
+
+2012-09-12 Uros Bizjak <ubizjak@gmail.com>
+
+ * config/i386/i386.c (x86_prefetch_sse): Change to unsigned char.
+ * config/i386/i386.h (x86_prefetch_sse): Ditto.
+
+2012-09-12 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/54445
+ * config/i386/predicates.md (x86_64_immediate_operand): Allow
+ negative offset for UNSPEC_DTPOFF/UNSPEC_NTPOFF.
+
+2012-09-12 Jan Hubicka <jh@suse.cz>
+
+ * common.opt (flto-partition): Add "max".
+ * invoke.texi (flto-partition): Document "max"
+
+2012-09-12 Ganesh Gopalasubramanian <Ganesh.Gopalasubramanian@amd.com>
+
+ * config/i386/i386.md : Comments on fma4 instruction selection
+ reflect requirement on register pressure based cost model.
+
+ * config/i386/driver-i386.c (host_detect_local_cpu): fma4
+ flag is set-reset as informed by the cpuid flag.
+
+ * config/i386/i386.c (processor_alias_table): fma4
+ flag is enabled for bdver2.
+
+2012-09-12 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/54489
+ * tree-ssa-pre.c: Include domwalk.h.
+ (in_fre): Remove.
+ (sccvn_valnum_from_value_id): New function.
+ (debug_bitmap_sets_for): Simplify.
+ (get_representative_for): Properly initialize the SCCVN valnum.
+ (create_expression_by_pieces): Likewise.
+ (insert_into_preds_of_block): Likewise.
+ (can_PRE_operation): Remove.
+ (make_values_for_phi): Simplify.
+ (compute_avail): Likewise.
+ (do_SCCVN_insertion): Remove.
+ (eliminate_avail, eliminate_push_avail, eliminate_insert):
+ New functions.
+ (eliminate): Split and perform a domwalk.
+ (eliminate_bb): Former eliminate part that is now dom-enter.
+ (eliminate_leave_block): New function.
+ (fini_eliminate): Likewise.
+ (init_pre): Simplify.
+ (fini_pre): Likewise.
+ (execute_pre): Fold into do_pre and do_fre.
+ (do_pre): Consume execute_pre.
+ (do_fre): Likewise.
+ * Makefile.in (tree-ssa-pre.o): Add domwalk.h dependency.
+
+2012-09-12 Diego Novillo <dnovillo@google.com>
+
+ * vec.h: Remove compatibility notes for previous distinction
+ between vectors of objects and vectors of pointers.
+
+2012-09-12 Christian Bruel <christian.bruel@st.com>
+
+ * config/sh/newlib.h (NO_IMPLICIT_EXTERN_C): Define.
+
+2012-09-12 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * rtl.h (FFS, FLOAT, ABS, PC): Don't undef.
+ * system.h (FFS, FLOAT, ABS, PC): Undef.
+
+2012-09-12 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/54553
+ * common.opt (finline): Mark with Optimization.
+
+2012-09-12 Jakub Jelinek <jakub@redhat.com>
+
+ * config.gcc: Obsolete picochip-*.
+
+2012-09-12 Nathan Froyd <froydnj@gcc.gnu.org>
+ Hans-Peter Nilsson <hp@bitrange.com>
+
+ * config/mmix/mmix.h (MMIX_REG_OK_STRICT): Delete.
+ (REG_CLASS_FROM_LETTER, CONST_OK_FOR_LETTER_P): Delete.
+ (CONST_DOUBLE_OK_FOR_LETTER_P, EXTRA_CONSTRAINT): Delete.
+ * config/mmix/mmix-protos.h (mmix_intval): Declare.
+ (mmix_const_ok_for_letter_p, mmix_extra_constraint): Delete.
+ (mmix_const_double_ok_for_letter_p): Delete.
+ * config/mmix/constraints.md: New file.
+ * config/mmix/mmix.md: Include it.
+ (iordi3): Fix typo; use "I" instead of undefined "H" constraint.
+ ("*call_real"): Update comment about not using the "p" constraint.
+ * config/mmix/predicates.md (mmix_reg_or_8bit_operand): Use
+ satisfies_constraint_I.
+ (mmix_address_operand): New predicate.
+ (mmix_symbolic_or_address_operand): Use it instead of address_operand.
+ * config/mmix/mmix.c: #include tm-constrs.h.
+ (mmix_intval): Delete declaration. Make non-static.
+ (mmix_const_ok_for_letter_p, mmix_extra_constraint): Delete.
+ (mmix_const_double_ok_for_letter_p): Delete.
+ (mmix_legitimate_address_p): Use satisfies_constraint_I.
+ (mmix_print_operand_address): Likewise.
+ (mmix_emit_sp_add): Adjust to use insn_const_int_ok_for_constraint
+ when matching "L" constraint.
+
+2012-09-11 Steven Bosscher <steven@gcc.gnu.org>
+
+ * tree.h (expand_case): Move prototype ...
+ * expr.h (expand_case): ...here.
+ (expand_sjlj_dispatch_table): New prototype.
+ * stmt.c: Include pointer-set.h instead of bitmap.h.
+ (expand_case): Use a pointer set instead of a bitmap for
+ already-seen labels. Fold label values here.
+ (add_case_node): Don't fold label values here.
+ (expand_sjlj_dispatch_table): New function.
+ * except.c (sjlj_emit_dispatch_table): Use it.
+
+2012-09-11 Marc Glisse <marc.glisse@inria.fr>
+
+ * tree-ssa-forwprop.c (simplify_vector_constructor): New function.
+ (ssa_forward_propagate_and_combine): Call it.
+
+2012-09-11 Diego Novillo <dnovillo@google.com>
+
+ * var-tracking.c (vt_add_function_parameter): Adjust for VEC changes.
+
+2012-09-11 Dominique Dhumieres <dominiq@lps.ens.fr>
+
+ * config/darwin.c (darwin_asm_named_section): Adjust for VEC changes.
+ (darwin_asm_dwarf_section): Likewise.
+
+2012-09-11 Martin Jambor <mjambor@suse.cz>
+
+ * dwarf2out.c (dwarf2out_abstract_function): Do not change cfun.
+ (premark_used_types): New parameter fun, use it instead of cfun.
+ (gen_subprogram_die): Use DECL_STRUCT_FUNCTION (decl) instead of cfun,
+ also pass it to premark_used_types.
+
+2012-09-11 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
+
+ * doc/sourcebuild.texi (arm_neon_v2_ok): Adjust command line.
+
+2012-09-11 Tobias Burnus <burnus@net-b.de>
+
+ * doc/sourcebuild.texi (arm_neon_v2_ok): Fix @anchor.
+
+2012-09-11 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
+ Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
+
+ * config/arm/neon.md (fma<VCVTF:mode>4): New pattern.
+ (*fmsub<VCVTF:mode>4): Likewise.
+ * doc/sourcebuild.texi (arm_neon_v2_ok, arm_neon_v2_hw): Document it.
+
+2012-09-11 Aldy Hernandez <aldyh@redhat.com>
+
+ PR middle-end/54149
+ * tree-ssa-loop-im.c (execute_sm_if_changed_flag_set): Only set
+ flag for writes.
+
+2012-09-11 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
+
+ PR tree-optimization/55492
+ * doc/invoke.texi (max-slsr-cand-scan): New description.
+ * gimple-ssa-strength-reduction.c (find_basis_for_candidate): Limit
+ the time spent searching for a basis.
+ * params.def (PARAM_MAX_SLSR_CANDIDATE_SCAN): New param.
+
+2012-09-11 Richard Guenther <rguenther@suse.de>
+
+ * gimple.h (gimple_register_type): Remove.
+ (print_gimple_types_stats): Adjust prototype.
+ * lto-streamer.h (print_lto_report): Likewise.
+ * lto-streamer.c (print_lto_report): Adjust.
+ * gimple.c (gimple_types, type_hash_cache, enum gtc_mode,
+ struct type_pair_d, lookup_type_pair, struct sccs,
+ next_dfs_num, gtc_next_dfs_num, struct gimple_type_leader_entry_s,
+ gimple_type_leader, gimple_lookup_type_leader, compare_type_names_p,
+ gtc_visit, gimple_types_compatible_p_1, gimple_types_compatible_p,
+ visit, iterative_hash_name, struct type_hash_pair,
+ type_hash_pair_compare, iterative_hash_gimple_type, gimple_type_hash,
+ gimple_type_eq, gimple_register_type_1, gimple_register_type):
+ Move to lto/lto.c.
+ (print_gimple_types_stats): Adjust.
+ (free_gimple_type_tables): Likewise.
+
+2012-09-11 Richard Guenther <rguenther@suse.de>
+
+ * graphite-scop-detection.c (move_sd_regions): Adjust for VEC changes.
+ (scopdet_basic_block_info): Likewise.
+ (build_scops_1): Likewise.
+ (limit_scops): Likewise.
+
+2012-09-11 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/54515
+ * gimple.c (get_base_address): Do not return NULL_TREE apart
+ from for WITH_SIZE_EXPR.
+ * gimple-fold.c (canonicalize_constructor_val): Do not call
+ get_base_address when not necessary.
+
+2012-09-10 Andrew Pinski <apinski@cavium.com>
+
+ PR tree-opt/54362
+ * trans-mem.c (thread_private_new_memory): Handle COND_EXPR also.
+
+2012-09-10 Maxim Kuvyrkov <maxim@codesourcery.com>
+
+ * config/m68k/m68k.c (m68k_sched_dfa_post_advance_cycle): Support
+ starting scheduling from a pre-existing state.
+
+2012-09-10 Diego Novillo <dnovillo@google.com>
+
+ * vec.h (vec_t::quick_push): Remove overload that accepts 'T *'.
+ Update all users.
+ (vec_t::safe_push): Likewise.
+ (vec_t::quick_insert): Likewise.
+ (vec_t::lower_bound): Likewise.
+ (vec_t::safe_insert): Likewise.
+ (vec_t::replace): Change second argument to 'T &'.
+
+2012-09-10 Maciej W. Rozycki <macro@codesourcery.com>
+
+ * config/rs6000/rs6000.md: Move a splitter next to its insn.
+
+2012-09-10 Oleg Endo <olegendo@gcc.gnu.org>
+
+ PR target/54089
+ * config/sh/sh.h (SH_DYNAMIC_SHIFT_COST): Set always to 1 if
+ dynamic shifts are available.
+ (SHIFT_COUNT_TRUNCATED): Always define to 0. Correct comment.
+ * config/sh/sh.c (ashl_lshr_seq, ext_ashl_lshr_seq): Add comments.
+ * config/sh/predicates.md (shift_count_operand): Allow
+ arith_reg_operand even if TARGET_DYNSHIFT is false.
+ * config/sh/sh.md (ashlsi3, lshrsi3): Expand library call patterns
+ if needed.
+ (ashlsi3_d_call, lshrsi3_d_call): New insns.
+
+2012-09-10 Richard Sandiford <rdsandiford@googlemail.com>
+
+ * ira.c (setup_pressure_classes): Handle synonymous classes.
+
+2012-09-10 Marc Glisse <marc.glisse@inria.fr>
+
+ * tree-ssa-forwprop.c (simplify_bitfield_ref): New function.
+ (ssa_forward_propagate_and_combine): Call it.
+
+2012-09-10 Steve Ellcey <sellcey@mips.com>
+
+ * config.gcc: Add mips*-mti-linux* target
+ Handle with_synci like other options.
+ * config/mips/gnu-user64.h (LINUX64_DRIVER_SELF_SPECS): New.
+ (DRIVER_SELF_SPECS): Define in terms of LINUX64_DRIVER_SELF_SPECS.
+ * config/mips/mips.h (MIPS_ISA_SYNCI_SPEC): New.
+ * config/mips/mti-linux.h: New file.
+ * config/mips/t-mti-linux: New file.
+
+2012-09-10 Marc Glisse <marc.glisse@inria.fr>
+
+ * tree-ssa-forwprop.c (simplify_permutation): Handle CONSTRUCTOR.
+
+2012-09-10 Martin Jambor <mjambor@suse.cz>
+
+ * params.def (PARAM_IPA_MAX_AGG_ITEMS): New parameter.
+ * ipa-prop.c: Include params.h.
+ (IPA_MAX_AFF_JF_ITEMS): Removed.
+ (determine_known_aggregate_parts): Use param value of
+ PARAM_IPA_MAX_AGG_ITEMS instead of IPA_MAX_AFF_JF_ITEMS.
+ * Makefile.in (ipa-prop.o): Add PARAMS_H dependency.
+
+2012-09-10 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/54520
+ * tree-ssa-threadupdate.c (def_split_header_continue_p):
+ Properly consider sub-loops.
+
+2012-09-10 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/predicates.md (small_symbolic_operand): Disallow
+ large offsets.
+
2012-09-10 Georg-Johann Lay <avr@gjlay.de>
PR target/54536
@@ -12,7 +630,7 @@
2012-09-09 Mark Kettenis <kettenis@gnu.org>
* config/openbsd-stdint.h (INTMAX_TYPE, UINTMAX_TYPE): Define.
-
+
2012-09-09 Jan Hubicka <jh@suse.cz>
* passes.c (ipa_write_summaries_1): Set state;
@@ -48,7 +666,8 @@
(lto_symtab_encoder_delete_node): New function.
(lto_symtab_encoder_encode_body_p, lto_set_symtab_encoder_encode_body,
lto_symtab_encoder_encode_initializer_p,
- lto_set_symtab_encoder_encode_initializer, lto_symtab_encoder_in_partition_p,
+ lto_set_symtab_encoder_encode_initializer,
+ lto_symtab_encoder_in_partition_p,
lto_symtab_encoder_in_partition_p): Update.
(compute_ltrans_boundary): Take encoder as an input.
* passes.c (ipa_write_summaries_1): Update.
@@ -69,12 +688,12 @@
2012-09-08 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
- * config/pa/pa.c (hppa_rtx_costs): Update costs for large integer modes.
+ * config/pa/pa.c (hppa_rtx_costs): Update costs for large
+ integer modes.
2012-09-08 Andi Kleen <ak@linux.intel.com>
- * gcc/lto/lto.c (do_whole_program_analysis):
- Fix last broken patch
+ * gcc/lto/lto.c (do_whole_program_analysis): Fix last broken patch.
2012-09-08 Andi Kleen <ak@linux.intel.com>
@@ -138,8 +757,8 @@
PR tree-optimization/53986
* tree-vrp.c (extract_range_from_multiplicative_op_1): Allow
LSHIFT_EXPR.
- (extract_range_from_binary_expr_1): Handle LSHIFT with constant range as
- shift amount.
+ (extract_range_from_binary_expr_1): Handle LSHIFT with constant
+ range as shift amount.
2012-09-07 Segher Boessenkool <segher@kernel.crashing.org>
@@ -162,7 +781,7 @@
(call_value_nonlocal_aix32): Ditto.
(call_value_nonlocal_aix64): Ditto.
-2012-09-06 Andi Kleen <ak@linux.intel.com>
+2012-09-06 Andi Kleen <ak@linux.intel.com>
* doc/invoke.texi (-ffat-lto-objects): Clarify that gcc-ar
et.al. should be used.
@@ -244,7 +863,7 @@
2012-09-06 Uros Bizjak <ubizjak@gmail.com>
- * configure.ac (hle prefixes): Remove .code64.
+ * configure.ac (hle prefixes): Remove .code64 directive.
* configure: Regenerated.
2012-09-06 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
@@ -312,7 +931,7 @@
2012-09-05 Andrew Pinski <apinski@cavium.com>
- * optabs.c (emit_conditional_add): Correct comment about the arguments.
+ * optabs.c (emit_conditional_add): Correct comment about the arguments.
Remove code which might swap op2 and op3 since they cannot be swapped.
* doc/md.texi (add@var{mode}cc): Fix document about how the arguments
are used.
@@ -668,7 +1287,7 @@
* config/sh/sh.md (cbranchsi4): Remove TARGET_CBRANCHDI4 check and
always invoke expand_cbranchsi4.
-2012-09-03 Andi Kleen <ak@linux.intel.com>
+2012-09-03 Andi Kleen <ak@linux.intel.com>
* tree-ssa-sccvn.c (vn_reference_fold_indirect): Initialize
addr_offset always.
@@ -1269,7 +1888,7 @@
* alias.c (rtx_equal_for_memref_p): Convert constant cases.
* combine.c (find_single_use_1, mark_used_regs_combine): Convert
to CASE_CONST_ANY.
- * cse.c (exp_equiv_p, canon_reg, fold_rtx, cse_process_notes_1,
+ * cse.c (exp_equiv_p, canon_reg, fold_rtx, cse_process_notes_1,
count_reg_usage): Convert constant cases.
* cselib.c (cselib_expand_value_rtx_1): Convert to CASE_CONST_ANY.
(cselib_subst_to_values): Convert constant cases.
@@ -14861,7 +15480,7 @@
* cgraphunit.c (cgraph_analyze_function): Use gimple_has_body_p.
2012-05-02 Kirill Yukhin <kirill.yukhin@intel.com>
- Andi Kleen <ak@linux.intel.com>
+ Andi Kleen <ak@linux.intel.com>
* coretypes.h (MEMMODEL_MASK): New.
* builtins.c (get_memmodel): Add val. Call target.memmodel_check
diff --git a/gcc/ChangeLog.MELT b/gcc/ChangeLog.MELT
index 66f21db6430..d094b1e9d02 100644
--- a/gcc/ChangeLog.MELT
+++ b/gcc/ChangeLog.MELT
@@ -1,4 +1,15 @@
+2012-09-17 Basile Starynkevitch <basile@starynkevitch.net>
+
+ {{when merging trunk svn rev 191371}}
+ * melt-runtime.c (melt_load_module_index): Push an empty slot, not
+ a null pointer, into melt_modinfvec.
+ (meltgc_run_c_extension): Push an empty slot, not
+ a null pointer, into melt_extinfvec.
+ (melt_really_initialize): Better indentation, and increase maximal
+ minore size to 32768Kwords. Push an empty slot, not a null
+ pointer, into melt_modinfvec.
+
2012-09-15 Basile Starynkevitch <basile@starynkevitch.net>
* melt-runtime.c (meltgc_read_from_val): Change the location name
diff --git a/gcc/DATESTAMP b/gcc/DATESTAMP
index 79162bbf649..f23e5dcd29e 100644
--- a/gcc/DATESTAMP
+++ b/gcc/DATESTAMP
@@ -1 +1 @@
-20120910
+20120917
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 636d6bc52ea..8c32072be9c 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -2254,7 +2254,8 @@ tree-ssa-dse.o : tree-ssa-dse.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
tree-ssa-forwprop.o : tree-ssa-forwprop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(TREE_H) $(TM_P_H) $(BASIC_BLOCK_H) $(CFGLOOP_H) \
$(TREE_FLOW_H) $(TREE_PASS_H) $(DIAGNOSTIC_H) \
- langhooks.h $(FLAGS_H) $(GIMPLE_H) $(GIMPLE_PRETTY_PRINT_H) $(EXPR_H)
+ langhooks.h $(FLAGS_H) $(GIMPLE_H) $(GIMPLE_PRETTY_PRINT_H) $(EXPR_H) \
+ $(TREE_VECTORIZER_H)
tree-ssa-phiprop.o : tree-ssa-phiprop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TM_H) $(TREE_H) $(TM_P_H) $(BASIC_BLOCK_H) \
$(TREE_FLOW_H) $(TREE_PASS_H) $(DIAGNOSTIC_H) \
@@ -2326,7 +2327,7 @@ tree-ssa-pre.o : tree-ssa-pre.c $(TREE_FLOW_H) $(CONFIG_H) \
$(TM_H) coretypes.h $(TREE_PASS_H) $(FLAGS_H) langhooks.h \
$(CFGLOOP_H) alloc-pool.h $(BASIC_BLOCK_H) $(BITMAP_H) $(HASH_TABLE_H) \
$(GIMPLE_H) $(TREE_INLINE_H) tree-iterator.h tree-ssa-sccvn.h $(PARAMS_H) \
- $(DBGCNT_H) tree-scalar-evolution.h $(GIMPLE_PRETTY_PRINT_H)
+ $(DBGCNT_H) tree-scalar-evolution.h $(GIMPLE_PRETTY_PRINT_H) domwalk.h
tree-ssa-sccvn.o : tree-ssa-sccvn.c $(TREE_FLOW_H) $(CONFIG_H) \
$(SYSTEM_H) $(TREE_H) $(DIAGNOSTIC_H) \
$(TM_H) coretypes.h dumpfile.h $(FLAGS_H) $(CFGLOOP_H) \
@@ -2954,7 +2955,7 @@ ipa-prop.o : ipa-prop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
$(TREE_FLOW_H) $(TM_H) $(TREE_PASS_H) $(FLAGS_H) $(TREE_H) \
$(TREE_INLINE_H) $(GIMPLE_H) \
$(GIMPLE_PRETTY_PRINT_H) $(LTO_STREAMER_H) \
- $(DATA_STREAMER_H) $(TREE_STREAMER_H)
+ $(DATA_STREAMER_H) $(TREE_STREAMER_H) $(PARAMS_H)
ipa-ref.o : ipa-ref.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
langhooks.h $(GGC_H) $(TARGET_H) $(CGRAPH_H) $(TREE_H) $(TARGET_H) \
$(TREE_FLOW_H) $(TM_H) $(TREE_PASS_H) $(FLAGS_H) $(TREE_H) $(GGC_H)
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 90f59f481a2..bf3aa685691 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,9 @@
+2012-09-10 Diego Novillo <dnovillo@google.com>
+
+ * gcc-interface/decl.c (build_subst_list): Adjust call to VEC_safe_push.
+ (build_variant_list): Likewise.
+ * gcc-interface/utils.c (convert): Adjust calls to VEC_quick_push.
+
2012-09-07 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (Loop_Statement_to_gnu): Revert to using
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index cb0f074d7d2..9e14d8af1bf 100644
--- a/gcc/ada/gcc-interface/decl.c
+++ b/gcc/ada/gcc-interface/decl.c
@@ -7507,9 +7507,8 @@ build_subst_list (Entity_Id gnat_subtype, Entity_Id gnat_type, bool definition)
(Node (gnat_value), gnat_subtype,
get_entity_name (gnat_discrim),
definition, true, false));
- subst_pair *s = VEC_safe_push (subst_pair, heap, gnu_list, NULL);
- s->discriminant = gnu_field;
- s->replacement = replacement;
+ subst_pair s = {gnu_field, replacement};
+ VEC_safe_push (subst_pair, heap, gnu_list, s);
}
return gnu_list;
@@ -7541,14 +7540,10 @@ build_variant_list (tree qual_union_type, VEC(subst_pair,heap) *subst_list,
still be accessed. */
if (!integer_zerop (qual))
{
- variant_desc *v;
tree variant_type = TREE_TYPE (gnu_field), variant_subpart;
+ variant_desc v = {variant_type, gnu_field, qual, NULL_TREE};
- v = VEC_safe_push (variant_desc, heap, gnu_list, NULL);
- v->type = variant_type;
- v->field = gnu_field;
- v->qual = qual;
- v->new_type = NULL_TREE;
+ VEC_safe_push (variant_desc, heap, gnu_list, v);
/* Recurse on the variant subpart of the variant, if any. */
variant_subpart = get_variant_part (variant_type);
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 4cca41bbf39..d9121c1931e 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -4615,16 +4615,14 @@ convert (tree type, tree expr)
FOR_EACH_CONSTRUCTOR_ELT(e, idx, index, value)
{
- constructor_elt *elt;
/* We expect only simple constructors. */
if (!SAME_FIELD_P (index, efield))
break;
/* The field must be the same. */
if (!SAME_FIELD_P (efield, field))
break;
- elt = VEC_quick_push (constructor_elt, v, NULL);
- elt->index = field;
- elt->value = convert (TREE_TYPE (field), value);
+ constructor_elt elt = {field, convert (TREE_TYPE (field), value)};
+ VEC_quick_push (constructor_elt, v, elt);
/* If packing has made this field a bitfield and the input
value couldn't be emitted statically any more, we need to
@@ -4690,9 +4688,8 @@ convert (tree type, tree expr)
v = VEC_alloc (constructor_elt, gc, len);
FOR_EACH_CONSTRUCTOR_VALUE (e, ix, value)
{
- constructor_elt *elt = VEC_quick_push (constructor_elt, v, NULL);
- elt->index = NULL_TREE;
- elt->value = value;
+ constructor_elt elt = {NULL_TREE, value};
+ VEC_quick_push (constructor_elt, v, elt);
}
expr = copy_node (expr);
TREE_TYPE (expr) = type;
diff --git a/gcc/alias.c b/gcc/alias.c
index 1df3529e942..0c6a7442b84 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -855,8 +855,8 @@ new_alias_set (void)
if (flag_strict_aliasing)
{
if (alias_sets == 0)
- VEC_safe_push (alias_set_entry, gc, alias_sets, (alias_set_entry) 0);
- VEC_safe_push (alias_set_entry, gc, alias_sets, (alias_set_entry) 0);
+ VEC_safe_push (alias_set_entry, gc, alias_sets, 0);
+ VEC_safe_push (alias_set_entry, gc, alias_sets, 0);
return VEC_length (alias_set_entry, alias_sets) - 1;
}
else
diff --git a/gcc/builtin-types.def b/gcc/builtin-types.def
index d8e9e566694..660300dea78 100644
--- a/gcc/builtin-types.def
+++ b/gcc/builtin-types.def
@@ -140,6 +140,7 @@ DEF_POINTER_TYPE (BT_PTR_PTR, BT_PTR)
DEF_FUNCTION_TYPE_0 (BT_FN_VOID, BT_VOID)
DEF_FUNCTION_TYPE_0 (BT_FN_BOOL, BT_BOOL)
DEF_FUNCTION_TYPE_0 (BT_FN_PTR, BT_PTR)
+DEF_FUNCTION_TYPE_0 (BT_FN_CONST_STRING, BT_CONST_STRING)
DEF_FUNCTION_TYPE_0 (BT_FN_PID, BT_PID)
DEF_FUNCTION_TYPE_0 (BT_FN_INT, BT_INT)
DEF_FUNCTION_TYPE_0 (BT_FN_UINT, BT_UINT)
diff --git a/gcc/builtins.def b/gcc/builtins.def
index de45724998e..8493ca41b34 100644
--- a/gcc/builtins.def
+++ b/gcc/builtins.def
@@ -801,6 +801,11 @@ DEF_BUILTIN_STUB (BUILT_IN_EH_POINTER, "__builtin_eh_pointer")
DEF_BUILTIN_STUB (BUILT_IN_EH_FILTER, "__builtin_eh_filter")
DEF_BUILTIN_STUB (BUILT_IN_EH_COPY_VALUES, "__builtin_eh_copy_values")
+/* __FILE__, __LINE__, __FUNCTION__ as builtins. */
+DEF_GCC_BUILTIN (BUILT_IN_FILE, "FILE", BT_FN_CONST_STRING, ATTR_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN (BUILT_IN_FUNCTION, "FUNCTION", BT_FN_CONST_STRING, ATTR_NOTHROW_LEAF_LIST)
+DEF_GCC_BUILTIN (BUILT_IN_LINE, "LINE", BT_FN_INT, ATTR_NOTHROW_LEAF_LIST)
+
/* Synchronization Primitives. */
#include "sync-builtins.def"
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 642ff7dc8d5..8b3cd2ae549 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,9 @@
+2012-09-13 Paolo Carlini <paolo.carlini@oracle.com>
+ Manuel López-Ibáñez <manu@gcc.gnu.org>
+
+ PR c++/53210
+ * c.opt ([Winit-self]): Enabled by -Wall in C++.
+
2012-08-23 Arnaud Charlet <charlet@adacore.com>
* c-ada-spec.c (dump_generic_ada_node): Fix handling of name_only
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index 502613ae8df..6de2f1c81fd 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -8535,7 +8535,7 @@ parse_optimize_options (tree args, bool attr_p)
/* Build up argv vector. Just in case the string is stored away, use garbage
collected strings. */
VEC_truncate (const_char_p, optimize_args, 0);
- VEC_safe_push (const_char_p, gc, optimize_args, (const_char_p)NULL);
+ VEC_safe_push (const_char_p, gc, optimize_args, NULL);
for (ap = args; ap != NULL_TREE; ap = TREE_CHAIN (ap))
{
diff --git a/gcc/c-family/c-pragma.c b/gcc/c-family/c-pragma.c
index 77ed0f03325..70d8748ece9 100644
--- a/gcc/c-family/c-pragma.c
+++ b/gcc/c-family/c-pragma.c
@@ -372,10 +372,8 @@ handle_pragma_weak (cpp_reader * ARG_UNUSED (dummy))
}
else
{
- pending_weak *pe;
- pe = VEC_safe_push (pending_weak, gc, pending_weaks, NULL);
- pe->name = name;
- pe->value = value;
+ pending_weak pe = {name, value};
+ VEC_safe_push (pending_weak, gc, pending_weaks, pe);
}
}
@@ -499,9 +497,8 @@ add_to_renaming_pragma_list (tree oldname, tree newname)
return;
}
- p = VEC_safe_push (pending_redefinition, gc, pending_redefine_extname, NULL);
- p->oldname = oldname;
- p->newname = newname;
+ pending_redefinition e = {oldname, newname};
+ VEC_safe_push (pending_redefinition, gc, pending_redefine_extname, e);
}
/* The current prefix set by #pragma extern_prefix. */
@@ -1236,14 +1233,14 @@ c_register_pragma_1 (const char *space, const char *name,
ns_name.space = space;
ns_name.name = name;
- VEC_safe_push (pragma_ns_name, heap, registered_pp_pragmas, &ns_name);
+ VEC_safe_push (pragma_ns_name, heap, registered_pp_pragmas, ns_name);
id = VEC_length (pragma_ns_name, registered_pp_pragmas);
id += PRAGMA_FIRST_EXTERNAL - 1;
}
else
{
VEC_safe_push (internal_pragma_handler, heap, registered_pragmas,
- &ihandler);
+ ihandler);
id = VEC_length (internal_pragma_handler, registered_pragmas);
id += PRAGMA_FIRST_EXTERNAL - 1;
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index 914d110597d..39d70ada0de 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -408,7 +408,7 @@ C C++ Var(warn_ignored_qualifiers) Warning EnabledBy(Wextra)
Warn whenever type qualifiers are ignored.
Winit-self
-C ObjC C++ ObjC++ Var(warn_init_self) Warning
+C ObjC C++ ObjC++ Var(warn_init_self) Warning LangEnabledBy(C++ ObjC++,Wall)
Warn about variables which are initialized to themselves
Wimplicit
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index 11f9be7b535..6aed2c3de84 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,32 @@
+2012-09-14 Joseph Myers <joseph@codesourcery.com>
+
+ PR c/54552
+ * c-typeck.c (c_cast_expr): When casting to a type requiring
+ C_MAYBE_CONST_EXPR to be created, pass the inner expression to
+ c_fully_fold first.
+
+2012-09-14 Joseph Myers <joseph@codesourcery.com>
+
+ PR c/54103
+ * c-typeck.c (build_unary_op): Pass original argument of
+ TRUTH_NOT_EXPR to c_objc_common_truthvalue_conversion, then remove
+ any C_MAYBE_CONST_EXPR, if it has integer operands.
+ (build_binary_op): Pass original arguments of TRUTH_ANDIF_EXPR,
+ TRUTH_ORIF_EXPR, TRUTH_AND_EXPR, TRUTH_OR_EXPR and TRUTH_XOR_EXPR
+ to c_objc_common_truthvalue_conversion, then remove any
+ C_MAYBE_CONST_EXPR, if they have integer operands. Use
+ c_objc_common_truthvalue_conversion not
+ c_common_truthvalue_conversion.
+ (c_objc_common_truthvalue_conversion): Build NE_EXPR directly and
+ call note_integer_operands for arguments with integer operands
+ that are not integer constants.
+
+2012-09-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/54559
+ * c-typeck.c (c_finish_return): Do convert to BOOLEAN_TYPE or
+ COMPLEX_TYPE with in_late_binary_op set temporarily to true.
+
2012-08-31 Jakub Jelinek <jakub@redhat.com>
PR c/54428
diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index e5d17b7ec99..d4c7b1f872e 100644
--- a/gcc/c/c-decl.c
+++ b/gcc/c/c-decl.c
@@ -6437,7 +6437,7 @@ get_parm_info (bool ellipsis, tree expr)
{
tree decl = b->decl;
tree type = TREE_TYPE (decl);
- c_arg_tag *tag;
+ c_arg_tag tag;
const char *keyword;
switch (TREE_CODE (decl))
@@ -6511,9 +6511,9 @@ get_parm_info (bool ellipsis, tree expr)
}
}
- tag = VEC_safe_push (c_arg_tag, gc, tags, NULL);
- tag->id = b->id;
- tag->type = decl;
+ tag.id = b->id;
+ tag.type = decl;
+ VEC_safe_push (c_arg_tag, gc, tags, tag);
break;
case CONST_DECL:
diff --git a/gcc/c/c-tree.h b/gcc/c/c-tree.h
index c07d994975d..17fc719b49d 100644
--- a/gcc/c/c-tree.h
+++ b/gcc/c/c-tree.h
@@ -142,8 +142,8 @@ DEF_VEC_ALLOC_O (c_expr_t, heap);
/* Append a new c_expr_t element to V. */
#define C_EXPR_APPEND(V, ELEM) \
do { \
- c_expr_t *__elem_p = VEC_safe_push (c_expr_t, gc, V, NULL); \
- *__elem_p = (ELEM); \
+ c_expr_t __elem = (ELEM); \
+ VEC_safe_push (c_expr_t, gc, V, __elem); \
} while (0)
/* A kind of type specifier. Note that this information is currently
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 99920ef288b..5b4ad285874 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -3553,7 +3553,13 @@ build_unary_op (location_t location,
"wrong type argument to unary exclamation mark");
return error_mark_node;
}
- arg = c_objc_common_truthvalue_conversion (location, arg);
+ if (int_operands)
+ {
+ arg = c_objc_common_truthvalue_conversion (location, xarg);
+ arg = remove_c_maybe_const_expr (arg);
+ }
+ else
+ arg = c_objc_common_truthvalue_conversion (location, arg);
ret = invert_truthvalue_loc (location, arg);
/* If the TRUTH_NOT_EXPR has been folded, reset the location. */
if (EXPR_P (ret) && EXPR_HAS_LOCATION (ret))
@@ -4773,8 +4779,11 @@ c_cast_expr (location_t loc, struct c_type_name *type_name, tree expr)
ret = build_c_cast (loc, type, expr);
if (type_expr)
{
+ bool inner_expr_const = true;
+ ret = c_fully_fold (ret, require_constant_value, &inner_expr_const);
ret = build2 (C_MAYBE_CONST_EXPR, TREE_TYPE (ret), type_expr, ret);
- C_MAYBE_CONST_EXPR_NON_CONST (ret) = !type_expr_const;
+ C_MAYBE_CONST_EXPR_NON_CONST (ret) = !(type_expr_const
+ && inner_expr_const);
SET_EXPR_LOCATION (ret, loc);
}
@@ -7709,7 +7718,6 @@ output_init_element (tree value, tree origtype, bool strict_string, tree type,
struct obstack * braced_init_obstack)
{
tree semantic_type = NULL_TREE;
- constructor_elt *celt;
bool maybe_const = true;
bool npc;
@@ -7876,9 +7884,8 @@ output_init_element (tree value, tree origtype, bool strict_string, tree type,
/* Otherwise, output this element either to
constructor_elements or to the assembler file. */
- celt = VEC_safe_push (constructor_elt, gc, constructor_elements, NULL);
- celt->index = field;
- celt->value = value;
+ constructor_elt celt = {field, value};
+ VEC_safe_push (constructor_elt, gc, constructor_elements, celt);
/* Advance the variable that indicates sequential elements output. */
if (TREE_CODE (constructor_type) == ARRAY_TYPE)
@@ -8684,12 +8691,18 @@ c_finish_return (location_t loc, tree retval, tree origtype)
npc, NULL_TREE, NULL_TREE, 0);
tree res = DECL_RESULT (current_function_decl);
tree inner;
+ bool save;
current_function_returns_value = 1;
if (t == error_mark_node)
return NULL_TREE;
+ save = in_late_binary_op;
+ if (TREE_CODE (TREE_TYPE (res)) == BOOLEAN_TYPE
+ || TREE_CODE (TREE_TYPE (res)) == COMPLEX_TYPE)
+ in_late_binary_op = true;
inner = t = convert (TREE_TYPE (res), t);
+ in_late_binary_op = save;
/* Strip any conversions, additions, and subtractions, and see if
we are returning the address of a local variable. Warn if so. */
@@ -9803,8 +9816,20 @@ build_binary_op (location_t location, enum tree_code code,
but that does not mean the operands should be
converted to ints! */
result_type = integer_type_node;
- op0 = c_common_truthvalue_conversion (location, op0);
- op1 = c_common_truthvalue_conversion (location, op1);
+ if (op0_int_operands)
+ {
+ op0 = c_objc_common_truthvalue_conversion (location, orig_op0);
+ op0 = remove_c_maybe_const_expr (op0);
+ }
+ else
+ op0 = c_objc_common_truthvalue_conversion (location, op0);
+ if (op1_int_operands)
+ {
+ op1 = c_objc_common_truthvalue_conversion (location, orig_op1);
+ op1 = remove_c_maybe_const_expr (op1);
+ }
+ else
+ op1 = c_objc_common_truthvalue_conversion (location, op1);
converted = 1;
boolean_op = true;
}
@@ -10516,12 +10541,17 @@ c_objc_common_truthvalue_conversion (location_t location, tree expr)
int_const = (TREE_CODE (expr) == INTEGER_CST && !TREE_OVERFLOW (expr));
int_operands = EXPR_INT_CONST_OPERANDS (expr);
- if (int_operands)
- expr = remove_c_maybe_const_expr (expr);
-
- /* ??? Should we also give an error for vectors rather than leaving
- those to give errors later? */
- expr = c_common_truthvalue_conversion (location, expr);
+ if (int_operands && TREE_CODE (expr) != INTEGER_CST)
+ {
+ expr = remove_c_maybe_const_expr (expr);
+ expr = build2 (NE_EXPR, integer_type_node, expr,
+ convert (TREE_TYPE (expr), integer_zero_node));
+ expr = note_integer_operands (expr);
+ }
+ else
+ /* ??? Should we also give an error for vectors rather than leaving
+ those to give errors later? */
+ expr = c_common_truthvalue_conversion (location, expr);
if (TREE_CODE (expr) == INTEGER_CST && int_operands && !int_const)
{
diff --git a/gcc/calls.c b/gcc/calls.c
index 5bc1b1ebb87..2180a622002 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -3272,16 +3272,14 @@ expand_call (tree exp, rtx target, int ignore)
else if (GET_CODE (valreg) == PARALLEL)
{
if (target == 0)
- {
- /* This will only be assigned once, so it can be readonly. */
- tree nt = build_qualified_type (rettype,
- (TYPE_QUALS (rettype)
- | TYPE_QUAL_CONST));
-
- target = assign_temp (nt, 1, 1);
- }
-
- if (! rtx_equal_p (target, valreg))
+ target = emit_group_move_into_temps (valreg);
+ else if (rtx_equal_p (target, valreg))
+ ;
+ else if (GET_CODE (target) == PARALLEL)
+ /* Handle the result of a emit_group_move_into_temps
+ call in the previous pass. */
+ emit_group_move (target, valreg);
+ else
emit_group_store (target, valreg, rettype,
int_size_in_bytes (rettype));
diff --git a/gcc/cfghooks.c b/gcc/cfghooks.c
index 1417e48299d..acd1f7abebc 100644
--- a/gcc/cfghooks.c
+++ b/gcc/cfghooks.c
@@ -1306,3 +1306,21 @@ copy_bbs (basic_block *bbs, unsigned n, basic_block *new_bbs,
bbs[i]->flags &= ~BB_DUPLICATED;
}
+/* Return true if BB contains only labels or non-executable
+ instructions */
+bool
+empty_block_p (basic_block bb)
+{
+ gcc_assert (cfg_hooks->empty_block_p);
+ return cfg_hooks->empty_block_p (bb);
+}
+
+/* Split a basic block if it ends with a conditional branch and if
+ the other part of the block is not empty. */
+basic_block
+split_block_before_cond_jump (basic_block bb)
+{
+ gcc_assert (cfg_hooks->split_block_before_cond_jump);
+ return cfg_hooks->split_block_before_cond_jump (bb);
+}
+
diff --git a/gcc/cfghooks.h b/gcc/cfghooks.h
index cd4bd4165ec..951bdf6e17d 100644
--- a/gcc/cfghooks.h
+++ b/gcc/cfghooks.h
@@ -138,6 +138,13 @@ struct cfg_hooks
/* Add PHI arguments queued in PENDINT_STMT list on edge E to edge
E->dest (only in tree-ssa loop versioning. */
void (*flush_pending_stmts) (edge);
+
+ /* True if a block contains no executable instructions. */
+ bool (*empty_block_p) (basic_block);
+
+ /* Split a basic block if it ends with a conditional branch and if
+ the other part of the block is not empty. */
+ basic_block (*split_block_before_cond_jump) (basic_block);
};
extern void verify_flow_info (void);
@@ -166,6 +173,8 @@ extern bool predicted_by_p (const_basic_block bb, enum br_predictor predictor);
extern bool can_duplicate_block_p (const_basic_block);
extern basic_block duplicate_block (basic_block, edge, basic_block);
extern bool block_ends_with_call_p (basic_block bb);
+extern bool empty_block_p (basic_block);
+extern basic_block split_block_before_cond_jump (basic_block);
extern bool block_ends_with_condjump_p (const_basic_block bb);
extern int flow_call_edges_add (sbitmap);
extern void execute_on_growing_pred (edge);
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index c62b5bce33f..4df289d8889 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -4120,6 +4120,51 @@ rtl_make_forwarder_block (edge fallthru ATTRIBUTE_UNUSED)
{
}
+/* Return true if BB contains only labels or non-executable
+ instructions. */
+
+static bool
+rtl_block_empty_p (basic_block bb)
+{
+ rtx insn;
+
+ if (bb == ENTRY_BLOCK_PTR || bb == EXIT_BLOCK_PTR)
+ return true;
+
+ FOR_BB_INSNS (bb, insn)
+ if (NONDEBUG_INSN_P (insn) && !any_uncondjump_p (insn))
+ return false;
+
+ return true;
+}
+
+/* Split a basic block if it ends with a conditional branch and if
+ the other part of the block is not empty. */
+
+static basic_block
+rtl_split_block_before_cond_jump (basic_block bb)
+{
+ rtx insn;
+ rtx split_point = NULL;
+ rtx last = NULL;
+ bool found_code = false;
+
+ FOR_BB_INSNS (bb, insn)
+ {
+ if (any_condjump_p (insn))
+ split_point = last;
+ else if (NONDEBUG_INSN_P (insn))
+ found_code = true;
+ last = insn;
+ }
+
+ /* Did not find everything. */
+ if (found_code && split_point)
+ return split_block (bb, split_point)->dest;
+ else
+ return NULL;
+}
+
/* Return 1 if BB ends with a call, possibly followed by some
instructions that must stay with the call, 0 otherwise. */
@@ -4432,7 +4477,9 @@ struct cfg_hooks rtl_cfg_hooks = {
NULL, /* lv_add_condition_to_bb */
NULL, /* lv_adjust_loop_header_phi*/
NULL, /* extract_cond_bb_edges */
- NULL /* flush_pending_stmts */
+ NULL, /* flush_pending_stmts */
+ rtl_block_empty_p, /* block_empty_p */
+ rtl_split_block_before_cond_jump, /* split_block_before_cond_jump */
};
/* Implementation of CFG manipulation for cfg layout RTL, where
@@ -4470,7 +4517,9 @@ struct cfg_hooks cfg_layout_rtl_cfg_hooks = {
rtl_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
NULL, /* lv_adjust_loop_header_phi*/
rtl_extract_cond_bb_edges, /* extract_cond_bb_edges */
- NULL /* flush_pending_stmts */
+ NULL, /* flush_pending_stmts */
+ rtl_block_empty_p, /* block_empty_p */
+ rtl_split_block_before_cond_jump, /* split_block_before_cond_jump */
};
#include "gt-cfgrtl.h"
diff --git a/gcc/common.opt b/gcc/common.opt
index 39b06afeeb4..2cc388e9c96 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -1436,7 +1436,7 @@ Perform indirect inlining
; General flag to enable inlining. Specifying -fno-inline will disable
; all inlining apart from always-inline functions.
finline
-Common Report Var(flag_no_inline,0) Init(0)
+Common Report Var(flag_no_inline,0) Init(0) Optimization
Enable inlining of function declared \"inline\", disabling disables all inlining
finline-small-functions
@@ -1586,12 +1586,16 @@ Link-time optimization with number of parallel jobs or jobserver.
flto-partition=1to1
Common Var(flag_lto_partition_1to1)
-Partition functions and vars at linktime based on object files they originate from
+Partition symbols and vars at linktime based on object files they originate from
flto-partition=balanced
Common Var(flag_lto_partition_balanced)
Partition functions and vars at linktime into approximately same sized buckets
+flto-partition=max
+Common Var(flag_lto_partition_max)
+Put every symbol into separate partition
+
flto-partition=none
Common Var(flag_lto_partition_none)
Disable partioning and streaming
diff --git a/gcc/config.gcc b/gcc/config.gcc
index 6d9c68d81ff..c84348b8392 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -245,7 +245,8 @@ md_file=
# Obsolete configurations.
case ${target} in
- score-* \
+ picochip-* \
+ | score-* \
)
if test "x$enable_obsolete" != xyes; then
echo "*** Configuration ${target} is obsolete." >&2
@@ -1696,6 +1697,14 @@ mips*-*-netbsd*) # NetBSD/mips, either endian.
tm_file="elfos.h ${tm_file} mips/elf.h netbsd.h netbsd-elf.h mips/netbsd.h"
extra_options="${extra_options} netbsd.opt netbsd-elf.opt"
;;
+mips*-mti-linux*)
+ tm_file="dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/gnu-user64.h mips/linux64.h mips/linux-common.h mips/mti-linux.h"
+ tmake_file="${tmake_file} mips/t-mti-linux"
+ tm_defines="${tm_defines} MIPS_ISA_DEFAULT=33 MIPS_ABI_DEFAULT=ABI_32"
+ gnu_ld=yes
+ gas=yes
+ test x$with_llsc != x || with_llsc=yes
+ ;;
mips64*-*-linux* | mipsisa64*-*-linux*)
tm_file="dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/gnu-user64.h mips/linux64.h mips/linux-common.h"
tmake_file="${tmake_file} mips/t-linux64"
@@ -3273,10 +3282,11 @@ case "${target}" in
yes)
with_synci=synci
;;
- "" | no)
- # No is the default.
+ no)
with_synci=no-synci
;;
+ "")
+ ;;
*)
echo "Unknown synci type used in --with-synci" 1>&2
exit 1
diff --git a/gcc/config.in b/gcc/config.in
index 7fe6485c3af..b13805d98ce 100644
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -1600,6 +1600,12 @@
#endif
+/* Define if F_SETLKW supported by fcntl. */
+#ifndef USED_FOR_TARGET
+#undef HOST_HAS_F_SETLKW
+#endif
+
+
/* Define as const if the declaration of iconv() needs const. */
#ifndef USED_FOR_TARGET
#undef ICONV_CONST
diff --git a/gcc/config/alpha/predicates.md b/gcc/config/alpha/predicates.md
index 598742f81e7..0a1885bd5f9 100644
--- a/gcc/config/alpha/predicates.md
+++ b/gcc/config/alpha/predicates.md
@@ -328,26 +328,50 @@
(define_predicate "small_symbolic_operand"
(match_code "const,symbol_ref")
{
+ HOST_WIDE_INT ofs = 0, max_ofs = 0;
+
if (! TARGET_SMALL_DATA)
- return 0;
+ return false;
if (GET_CODE (op) == CONST
&& GET_CODE (XEXP (op, 0)) == PLUS
&& CONST_INT_P (XEXP (XEXP (op, 0), 1)))
- op = XEXP (XEXP (op, 0), 0);
+ {
+ ofs = INTVAL (XEXP (XEXP (op, 0), 1));
+ op = XEXP (XEXP (op, 0), 0);
+ }
if (GET_CODE (op) != SYMBOL_REF)
- return 0;
+ return false;
/* ??? There's no encode_section_info equivalent for the rtl
constant pool, so SYMBOL_FLAG_SMALL never gets set. */
if (CONSTANT_POOL_ADDRESS_P (op))
- return GET_MODE_SIZE (get_pool_mode (op)) <= g_switch_value;
+ {
+ max_ofs = GET_MODE_SIZE (get_pool_mode (op));
+ if (max_ofs > g_switch_value)
+ return false;
+ }
+ else if (SYMBOL_REF_LOCAL_P (op)
+ && SYMBOL_REF_SMALL_P (op)
+ && !SYMBOL_REF_WEAK (op)
+ && !SYMBOL_REF_TLS_MODEL (op))
+ {
+ if (SYMBOL_REF_DECL (op))
+ max_ofs = tree_low_cst (DECL_SIZE_UNIT (SYMBOL_REF_DECL (op)), 1);
+ }
+ else
+ return false;
- return (SYMBOL_REF_LOCAL_P (op)
- && SYMBOL_REF_SMALL_P (op)
- && !SYMBOL_REF_WEAK (op)
- && !SYMBOL_REF_TLS_MODEL (op));
+ /* Given that we know that the GP is always 8 byte aligned, we can
+ always adjust by 7 without overflowing. */
+ if (max_ofs < 8)
+ max_ofs = 8;
+
+ /* Since we know this is an object in a small data section, we know the
+ entire section is addressable via GP. We don't know where the section
+ boundaries are, but we know the entire object is within. */
+ return IN_RANGE (ofs, 0, max_ofs - 1);
})
;; Return true if OP is a SYMBOL_REF or CONST referencing a variable
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index a60e659bf68..43a9f1fef3f 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -11371,20 +11371,15 @@
)
(define_insn "*arm_rev"
- [(set (match_operand:SI 0 "s_register_operand" "=r")
- (bswap:SI (match_operand:SI 1 "s_register_operand" "r")))]
- "TARGET_32BIT && arm_arch6"
- "rev%?\t%0, %1"
- [(set_attr "predicable" "yes")
- (set_attr "length" "4")]
-)
-
-(define_insn "*thumb1_rev"
- [(set (match_operand:SI 0 "s_register_operand" "=l")
- (bswap:SI (match_operand:SI 1 "s_register_operand" "l")))]
- "TARGET_THUMB1 && arm_arch6"
- "rev\t%0, %1"
- [(set_attr "length" "2")]
+ [(set (match_operand:SI 0 "s_register_operand" "=l,l,r")
+ (bswap:SI (match_operand:SI 1 "s_register_operand" "l,l,r")))]
+ "arm_arch6"
+ "@
+ rev\t%0, %1
+ rev%?\t%0, %1
+ rev%?\t%0, %1"
+ [(set_attr "arch" "t1,t2,32")
+ (set_attr "length" "2,2,4")]
)
(define_expand "arm_legacy_rev"
@@ -11472,6 +11467,40 @@
"
)
+;; bswap16 patterns: use revsh and rev16 instructions for the signed
+;; and unsigned variants, respectively. For rev16, expose
+;; byte-swapping in the lower 16 bits only.
+(define_insn "*arm_revsh"
+ [(set (match_operand:SI 0 "s_register_operand" "=l,l,r")
+ (sign_extend:SI (bswap:HI (match_operand:HI 1 "s_register_operand" "l,l,r"))))]
+ "arm_arch6"
+ "@
+ revsh\t%0, %1
+ revsh%?\t%0, %1
+ revsh%?\t%0, %1"
+ [(set_attr "arch" "t1,t2,32")
+ (set_attr "length" "2,2,4")]
+)
+
+(define_insn "*arm_rev16"
+ [(set (match_operand:HI 0 "s_register_operand" "=l,l,r")
+ (bswap:HI (match_operand:HI 1 "s_register_operand" "l,l,r")))]
+ "arm_arch6"
+ "@
+ rev16\t%0, %1
+ rev16%?\t%0, %1
+ rev16%?\t%0, %1"
+ [(set_attr "arch" "t1,t2,32")
+ (set_attr "length" "2,2,4")]
+)
+
+(define_expand "bswaphi2"
+ [(set (match_operand:HI 0 "s_register_operand" "=r")
+ (bswap:HI (match_operand:HI 1 "s_register_operand" "r")))]
+"arm_arch6"
+""
+)
+
;; Load the load/store multiple patterns
(include "ldmstm.md")
diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md
index faf909078b4..fe0618c2258 100644
--- a/gcc/config/arm/neon.md
+++ b/gcc/config/arm/neon.md
@@ -707,6 +707,33 @@
(const_string "neon_mla_qqq_32_qqd_32_scalar")))))]
)
+;; Fused multiply-accumulate
+(define_insn "fma<VCVTF:mode>4"
+ [(set (match_operand:VCVTF 0 "register_operand" "=w")
+ (fma:VCVTF (match_operand:VCVTF 1 "register_operand" "w")
+ (match_operand:VCVTF 2 "register_operand" "w")
+ (match_operand:VCVTF 3 "register_operand" "0")))]
+ "TARGET_NEON && TARGET_FMA && flag_unsafe_math_optimizations"
+ "vfma%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
+ [(set (attr "neon_type")
+ (if_then_else (match_test "<Is_d_reg>")
+ (const_string "neon_fp_vmla_ddd")
+ (const_string "neon_fp_vmla_qqq")))]
+)
+
+(define_insn "*fmsub<VCVTF:mode>4"
+ [(set (match_operand:VCVTF 0 "register_operand" "=w")
+ (fma:VCVTF (neg:VCVTF (match_operand:VCVTF 1 "register_operand" "w"))
+ (match_operand:VCVTF 2 "register_operand" "w")
+ (match_operand:VCVTF 3 "register_operand" "0")))]
+ "TARGET_NEON && TARGET_FMA && flag_unsafe_math_optimizations"
+ "vfms%?.<V_if_elem>\\t%<V_reg>0, %<V_reg>1, %<V_reg>2"
+ [(set (attr "neon_type")
+ (if_then_else (match_test "<Is_d_reg>")
+ (const_string "neon_fp_vmla_ddd")
+ (const_string "neon_fp_vmla_qqq")))]
+)
+
(define_insn "ior<mode>3"
[(set (match_operand:VDQ 0 "s_register_operand" "=w,w")
(ior:VDQ (match_operand:VDQ 1 "s_register_operand" "w,0")
diff --git a/gcc/config/avr/avr-dimode.md b/gcc/config/avr/avr-dimode.md
index ed5752319eb..31527dbf041 100644
--- a/gcc/config/avr/avr-dimode.md
+++ b/gcc/config/avr/avr-dimode.md
@@ -48,10 +48,10 @@
(ACC_B 10)])
;; Supported modes that are 8 bytes wide
-(define_mode_iterator ALL8 [(DI "")
- (DQ "") (UDQ "")
- (DA "") (UDA "")
- (TA "") (UTA "")])
+(define_mode_iterator ALL8 [DI DQ UDQ DA UDA TA UTA])
+
+(define_mode_iterator ALL8U [UDQ UDA UTA])
+(define_mode_iterator ALL8S [ DQ DA TA])
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Addition
@@ -124,9 +124,9 @@
"avr_have_dimode
&& !s8_operand (operands[0], VOIDmode)"
{
- return avr_out_plus64 (operands[0], NULL);
+ return avr_out_plus (insn, operands);
}
- [(set_attr "adjust_len" "plus64")
+ [(set_attr "adjust_len" "plus")
(set_attr "cc" "clobber")])
@@ -185,11 +185,106 @@
(match_operand:ALL8 0 "const_operand" "n Ynn")))]
"avr_have_dimode"
{
- return avr_out_minus64 (operands[0], NULL);
+ return avr_out_plus (insn, operands);
+ }
+ [(set_attr "adjust_len" "plus")
+ (set_attr "cc" "clobber")])
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Signed Saturating Addition and Subtraction
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(define_expand "<code_stdname><mode>3"
+ [(set (match_operand:ALL8S 0 "general_operand" "")
+ (ss_addsub:ALL8S (match_operand:ALL8S 1 "general_operand" "")
+ (match_operand:ALL8S 2 "general_operand" "")))]
+ "avr_have_dimode"
+ {
+ rtx acc_a = gen_rtx_REG (<MODE>mode, ACC_A);
+
+ emit_move_insn (acc_a, operands[1]);
+
+ if (const_operand (operands[2], GET_MODE (operands[2])))
+ {
+ emit_insn (gen_<code_stdname><mode>3_const_insn (operands[2]));
+ }
+ else
+ {
+ emit_move_insn (gen_rtx_REG (<MODE>mode, ACC_B), operands[2]);
+ emit_insn (gen_<code_stdname><mode>3_insn ());
+ }
+
+ emit_move_insn (operands[0], acc_a);
+ DONE;
+ })
+
+(define_insn "<code_stdname><mode>3_insn"
+ [(set (reg:ALL8S ACC_A)
+ (ss_addsub:ALL8S (reg:ALL8S ACC_A)
+ (reg:ALL8S ACC_B)))]
+ "avr_have_dimode"
+ "%~call __<code_stdname><mode>3"
+ [(set_attr "adjust_len" "call")
+ (set_attr "cc" "clobber")])
+
+(define_insn "<code_stdname><mode>3_const_insn"
+ [(set (reg:ALL8S ACC_A)
+ (ss_addsub:ALL8S (reg:ALL8S ACC_A)
+ (match_operand:ALL8S 0 "const_operand" "n Ynn")))]
+ "avr_have_dimode"
+ {
+ return avr_out_plus (insn, operands);
}
- [(set_attr "adjust_len" "minus64")
+ [(set_attr "adjust_len" "plus")
+ (set_attr "cc" "clobber")])
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Unsigned Saturating Addition and Subtraction
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(define_expand "<code_stdname><mode>3"
+ [(set (match_operand:ALL8U 0 "general_operand" "")
+ (us_addsub:ALL8U (match_operand:ALL8U 1 "general_operand" "")
+ (match_operand:ALL8U 2 "general_operand" "")))]
+ "avr_have_dimode"
+ {
+ rtx acc_a = gen_rtx_REG (<MODE>mode, ACC_A);
+
+ emit_move_insn (acc_a, operands[1]);
+
+ if (const_operand (operands[2], GET_MODE (operands[2])))
+ {
+ emit_insn (gen_<code_stdname><mode>3_const_insn (operands[2]));
+ }
+ else
+ {
+ emit_move_insn (gen_rtx_REG (<MODE>mode, ACC_B), operands[2]);
+ emit_insn (gen_<code_stdname><mode>3_insn ());
+ }
+
+ emit_move_insn (operands[0], acc_a);
+ DONE;
+ })
+
+(define_insn "<code_stdname><mode>3_insn"
+ [(set (reg:ALL8U ACC_A)
+ (us_addsub:ALL8U (reg:ALL8U ACC_A)
+ (reg:ALL8U ACC_B)))]
+ "avr_have_dimode"
+ "%~call __<code_stdname><mode>3"
+ [(set_attr "adjust_len" "call")
(set_attr "cc" "clobber")])
+(define_insn "<code_stdname><mode>3_const_insn"
+ [(set (reg:ALL8U ACC_A)
+ (us_addsub:ALL8U (reg:ALL8U ACC_A)
+ (match_operand:ALL8U 0 "const_operand" "n Ynn")))]
+ "avr_have_dimode"
+ {
+ return avr_out_plus (insn, operands);
+ }
+ [(set_attr "adjust_len" "plus")
+ (set_attr "cc" "clobber")])
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Negation
diff --git a/gcc/config/avr/avr-fixed.md b/gcc/config/avr/avr-fixed.md
index bfbdaecf215..5a994992150 100644
--- a/gcc/config/avr/avr-fixed.md
+++ b/gcc/config/avr/avr-fixed.md
@@ -29,6 +29,12 @@
(HA "") (UHA "")])
(define_mode_iterator ALL4A [(SA "") (USA "")])
+(define_mode_iterator ALL2S [HQ HA])
+(define_mode_iterator ALL4S [SA SQ])
+(define_mode_iterator ALL24S [ HQ HA SA SQ])
+(define_mode_iterator ALL124S [ QQ HQ HA SA SQ])
+(define_mode_iterator ALL124U [UQQ UHQ UHA USA USQ])
+
;;; Conversions
(define_mode_iterator FIXED_A
@@ -72,6 +78,112 @@
(set_attr "adjust_len" "ufract")])
;******************************************************************************
+;** Saturated Addition and Subtraction
+;******************************************************************************
+
+;; Fixme: It would be nice if we could expand the 32-bit versions to a
+;; transparent libgcc call if $2 is a REG. Problem is that it is
+;; not possible to describe that addition is commutative.
+;; And defining register classes/constraintrs for the involved hard
+;; registers and let IRA do the work, yields inacceptable bloated code.
+;; Thus, we have to live with the up to 11 instructions that are output
+;; for these 32-bit saturated operations.
+
+;; "ssaddqq3" "ssaddhq3" "ssaddha3" "ssaddsq3" "ssaddsa3"
+;; "sssubqq3" "sssubhq3" "sssubha3" "sssubsq3" "sssubsa3"
+(define_insn "<code_stdname><mode>3"
+ [(set (match_operand:ALL124S 0 "register_operand" "=??d,d")
+ (ss_addsub:ALL124S (match_operand:ALL124S 1 "register_operand" "<abelian>0,0")
+ (match_operand:ALL124S 2 "nonmemory_operand" "r,Ynn")))]
+ ""
+ {
+ return avr_out_plus (insn, operands);
+ }
+ [(set_attr "cc" "clobber")
+ (set_attr "adjust_len" "plus")])
+
+;; "usadduqq3" "usadduhq3" "usadduha3" "usaddusq3" "usaddusa3"
+;; "ussubuqq3" "ussubuhq3" "ussubuha3" "ussubusq3" "ussubusa3"
+(define_insn "<code_stdname><mode>3"
+ [(set (match_operand:ALL124U 0 "register_operand" "=??r,d")
+ (us_addsub:ALL124U (match_operand:ALL124U 1 "register_operand" "<abelian>0,0")
+ (match_operand:ALL124U 2 "nonmemory_operand" "r,Ynn")))]
+ ""
+ {
+ return avr_out_plus (insn, operands);
+ }
+ [(set_attr "cc" "clobber")
+ (set_attr "adjust_len" "plus")])
+
+;******************************************************************************
+;** Saturated Negation and Absolute Value
+;******************************************************************************
+
+;; Fixme: This will always result in 0. Dunno why simplify-rtx.c says
+;; "unknown" on how to optimize this. libgcc call would be in order,
+;; but the performance is *PLAIN* *HORROR* because the optimizers don't
+;; manage to optimize out MEMCPY that's sprincled all over fixed-bit.c */
+
+(define_expand "usneg<mode>2"
+ [(parallel [(match_operand:ALL124U 0 "register_operand" "")
+ (match_operand:ALL124U 1 "nonmemory_operand" "")])]
+ ""
+ {
+ emit_move_insn (operands[0], CONST0_RTX (<MODE>mode));
+ DONE;
+ })
+
+(define_insn "ssnegqq2"
+ [(set (match_operand:QQ 0 "register_operand" "=r")
+ (ss_neg:QQ (match_operand:QQ 1 "register_operand" "0")))]
+ ""
+ "neg %0\;brvc 0f\;dec %0\;0:"
+ [(set_attr "cc" "clobber")
+ (set_attr "length" "3")])
+
+(define_insn "ssabsqq2"
+ [(set (match_operand:QQ 0 "register_operand" "=r")
+ (ss_abs:QQ (match_operand:QQ 1 "register_operand" "0")))]
+ ""
+ "sbrc %0,7\;neg %0\;sbrc %0,7\;dec %0"
+ [(set_attr "cc" "clobber")
+ (set_attr "length" "4")])
+
+;; "ssneghq2" "ssnegha2" "ssnegsq2" "ssnegsa2"
+;; "ssabshq2" "ssabsha2" "ssabssq2" "ssabssa2"
+(define_expand "<code_stdname><mode>2"
+ [(set (match_dup 2)
+ (match_operand:ALL24S 1 "register_operand" ""))
+ (set (match_dup 2)
+ (ss_abs_neg:ALL24S (match_dup 2)))
+ (set (match_operand:ALL24S 0 "register_operand" "")
+ (match_dup 2))]
+ ""
+ {
+ operands[2] = gen_rtx_REG (<MODE>mode, 26 - GET_MODE_SIZE (<MODE>mode));
+ })
+
+;; "*ssneghq2" "*ssnegha2"
+;; "*ssabshq2" "*ssabsha2"
+(define_insn "*<code_stdname><mode>2"
+ [(set (reg:ALL2S 24)
+ (ss_abs_neg:ALL2S (reg:ALL2S 24)))]
+ ""
+ "%~call __<code_stdname>_2"
+ [(set_attr "type" "xcall")
+ (set_attr "cc" "clobber")])
+
+;; "*ssnegsq2" "*ssnegsa2"
+;; "*ssabssq2" "*ssabssa2"
+(define_insn "*<code_stdname><mode>2"
+ [(set (reg:ALL4S 22)
+ (ss_abs_neg:ALL4S (reg:ALL4S 22)))]
+ ""
+ "%~call __<code_stdname>_4"
+ [(set_attr "type" "xcall")
+ (set_attr "cc" "clobber")])
+
+;******************************************************************************
; mul
;; "mulqq3" "muluqq3"
diff --git a/gcc/config/avr/avr-protos.h b/gcc/config/avr/avr-protos.h
index 5d6fabb6b6d..690c89bcf01 100644
--- a/gcc/config/avr/avr-protos.h
+++ b/gcc/config/avr/avr-protos.h
@@ -91,12 +91,8 @@ extern int avr_starting_frame_offset (void);
extern void avr_output_addr_vec_elt (FILE *stream, int value);
extern const char *avr_out_sbxx_branch (rtx insn, rtx operands[]);
extern const char* avr_out_bitop (rtx, rtx*, int*);
-extern const char* avr_out_plus (rtx*, int*, int*);
-extern const char* avr_out_plus_noclobber (rtx*, int*, int*);
-extern const char* avr_out_plus64 (rtx, int*);
+extern const char* avr_out_plus (rtx, rtx*, int* =NULL, int* =NULL);
extern const char* avr_out_addto_sp (rtx*, int*);
-extern const char* avr_out_minus (rtx*, int*, int*);
-extern const char* avr_out_minus64 (rtx, int*);
extern const char* avr_out_xload (rtx, rtx*, int*);
extern const char* avr_out_movmem (rtx, rtx*, int*);
extern const char* avr_out_insert_bits (rtx*, int*);
diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c
index e69e35aaecf..c46f488603f 100644
--- a/gcc/config/avr/avr.c
+++ b/gcc/config/avr/avr.c
@@ -2069,9 +2069,11 @@ avr_print_operand (FILE *file, rtx x, int code)
else if (REG_P (x))
{
if (x == zero_reg_rtx)
- fprintf (file, "__zero_reg__");
+ fprintf (file, "__zero_reg__");
+ else if (code == 'r' && REGNO (x) < 32)
+ fprintf (file, "%d", (int) REGNO (x));
else
- fprintf (file, reg_names[true_regnum (x) + abcd]);
+ fprintf (file, reg_names[REGNO (x) + abcd]);
}
else if (CONST_INT_P (x))
{
@@ -2172,7 +2174,7 @@ avr_print_operand (FILE *file, rtx x, int code)
/* Use normal symbol for direct address no linker trampoline needed */
output_addr_const (file, x);
}
- else if (GET_CODE (x) == CONST_FIXED)
+ else if (CONST_FIXED_P (x))
{
HOST_WIDE_INT ival = INTVAL (avr_to_int_mode (x));
if (code != 0)
@@ -2213,9 +2215,7 @@ notice_update_cc (rtx body ATTRIBUTE_UNUSED, rtx insn)
default:
break;
- case CC_OUT_PLUS:
- case CC_OUT_PLUS_NOCLOBBER:
- case CC_MINUS:
+ case CC_PLUS:
case CC_LDI:
{
rtx *op = recog_data.operand;
@@ -2229,18 +2229,8 @@ notice_update_cc (rtx body ATTRIBUTE_UNUSED, rtx insn)
default:
gcc_unreachable();
- case CC_OUT_PLUS:
- avr_out_plus (op, &len_dummy, &icc);
- cc = (enum attr_cc) icc;
- break;
-
- case CC_OUT_PLUS_NOCLOBBER:
- avr_out_plus_noclobber (op, &len_dummy, &icc);
- cc = (enum attr_cc) icc;
- break;
-
- case CC_MINUS:
- avr_out_minus (op, &len_dummy, &icc);
+ case CC_PLUS:
+ avr_out_plus (insn, op, &len_dummy, &icc);
cc = (enum attr_cc) icc;
break;
@@ -4246,7 +4236,7 @@ avr_out_compare (rtx insn, rtx *xop, int *plen)
/* Map fixed mode operands to integer operands with the same binary
representation. They are easier to handle in the remainder. */
- if (CONST_FIXED == GET_CODE (xval))
+ if (CONST_FIXED_P (xval))
{
xreg = avr_to_int_mode (xop[0]);
xval = avr_to_int_mode (xop[1]);
@@ -5987,19 +5977,32 @@ lshrsi3_out (rtx insn, rtx operands[], int *len)
}
-/* Output addition of register XOP[0] and compile time constant XOP[2]:
-
+/* Output addition of register XOP[0] and compile time constant XOP[2].
+ CODE == PLUS: perform addition by using ADD instructions or
+ CODE == MINUS: perform addition by using SUB instructions:
+
XOP[0] = XOP[0] + XOP[2]
+
+ Or perform addition/subtraction with register XOP[2] depending on CODE:
+
+ XOP[0] = XOP[0] +/- XOP[2]
- and return "". If PLEN == NULL, print assembler instructions to perform the
- addition; otherwise, set *PLEN to the length of the instruction sequence (in
- words) printed with PLEN == NULL. XOP[3] is an 8-bit scratch register.
- CODE == PLUS: perform addition by using ADD instructions.
- CODE == MINUS: perform addition by using SUB instructions.
- Set *PCC to effect on cc0 according to respective CC_* insn attribute. */
+ If PLEN == NULL, print assembler instructions to perform the operation;
+ otherwise, set *PLEN to the length of the instruction sequence (in words)
+ printed with PLEN == NULL. XOP[3] is an 8-bit scratch register or NULL_RTX.
+ Set *PCC to effect on cc0 according to respective CC_* insn attribute.
+
+ CODE_SAT == UNKNOWN: Perform ordinary, non-saturating operation.
+ CODE_SAT != UNKNOWN: Perform operation and saturate according to CODE_SAT.
+ If CODE_SAT != UNKNOWN then SIGN contains the sign of the summand resp.
+ the subtrahend in the original insn, provided it is a compile time constant.
+ In all other cases, SIGN is 0.
+
+ Return "". */
static void
-avr_out_plus_1 (rtx *xop, int *plen, enum rtx_code code, int *pcc)
+avr_out_plus_1 (rtx *xop, int *plen, enum rtx_code code, int *pcc,
+ enum rtx_code code_sat = UNKNOWN, int sign = 0)
{
/* MODE of the operation. */
enum machine_mode mode = GET_MODE (xop[0]);
@@ -6026,6 +6029,41 @@ avr_out_plus_1 (rtx *xop, int *plen, enum rtx_code code, int *pcc)
/* Value to add. There are two ways to add VAL: R += VAL and R -= -VAL. */
rtx xval = xop[2];
+ /* Output a BRVC instruction. Only needed with saturation. */
+ bool out_brvc = true;
+
+ if (plen)
+ *plen = 0;
+
+ if (REG_P (xop[2]))
+ {
+ *pcc = MINUS == code ? (int) CC_SET_CZN : (int) CC_SET_N;
+
+ for (i = 0; i < n_bytes; i++)
+ {
+ /* We operate byte-wise on the destination. */
+ op[0] = simplify_gen_subreg (QImode, xop[0], mode, i);
+ op[1] = simplify_gen_subreg (QImode, xop[2], mode, i);
+
+ if (i == 0)
+ avr_asm_len (code == PLUS ? "add %0,%1" : "sub %0,%1",
+ op, plen, 1);
+ else
+ avr_asm_len (code == PLUS ? "adc %0,%1" : "sbc %0,%1",
+ op, plen, 1);
+ }
+
+ if (reg_overlap_mentioned_p (xop[0], xop[2]))
+ {
+ gcc_assert (REGNO (xop[0]) == REGNO (xop[2]));
+
+ if (MINUS == code)
+ return;
+ }
+
+ goto saturate;
+ }
+
/* Except in the case of ADIW with 16-bit register (see below)
addition does not set cc0 in a usable way. */
@@ -6034,13 +6072,39 @@ avr_out_plus_1 (rtx *xop, int *plen, enum rtx_code code, int *pcc)
if (CONST_FIXED_P (xval))
xval = avr_to_int_mode (xval);
+ /* Adding/Subtracting zero is a no-op. */
+
+ if (xval == const0_rtx)
+ {
+ *pcc = CC_NONE;
+ return;
+ }
+
if (MINUS == code)
xval = simplify_unary_operation (NEG, imode, xval, imode);
op[2] = xop[3];
- if (plen)
- *plen = 0;
+ if (SS_PLUS == code_sat && MINUS == code
+ && sign < 0
+ && 0x80 == (INTVAL (simplify_gen_subreg (QImode, xval, imode, n_bytes-1))
+ & GET_MODE_MASK (QImode)))
+ {
+ /* We compute x + 0x80 by means of SUB instructions. We negated the
+ constant subtrahend above and are left with x - (-128) so that we
+ need something like SUBI r,128 which does not exist because SUBI sets
+ V according to the sign of the subtrahend. Notice the only case
+ where this must be done is when NEG overflowed in case [2s] because
+ the V computation needs the right sign of the subtrahend. */
+
+ rtx msb = simplify_gen_subreg (QImode, xop[0], mode, n_bytes-1);
+
+ avr_asm_len ("subi %0,128" CR_TAB
+ "brmi 0f", &msb, plen, 2);
+ out_brvc = false;
+
+ goto saturate;
+ }
for (i = 0; i < n_bytes; i++)
{
@@ -6082,7 +6146,7 @@ avr_out_plus_1 (rtx *xop, int *plen, enum rtx_code code, int *pcc)
op, plen, 1);
if (n_bytes == 2 && PLUS == code)
- *pcc = CC_SET_ZN;
+ *pcc = CC_SET_ZN;
}
i++;
@@ -6099,6 +6163,7 @@ avr_out_plus_1 (rtx *xop, int *plen, enum rtx_code code, int *pcc)
continue;
}
else if ((val8 == 1 || val8 == 0xff)
+ && UNKNOWN == code_sat
&& !started
&& i == n_bytes - 1)
{
@@ -6111,7 +6176,17 @@ avr_out_plus_1 (rtx *xop, int *plen, enum rtx_code code, int *pcc)
{
case PLUS:
- gcc_assert (plen != NULL || REG_P (op[2]));
+ gcc_assert (plen != NULL || (op[2] && REG_P (op[2])));
+
+ if (plen != NULL && UNKNOWN != code_sat)
+ {
+ /* This belongs to the x + 0x80 corner case. The code with
+ ADD instruction is not smaller, thus make this case
+ expensive so that the caller won't pick it. */
+
+ *plen += 10;
+ break;
+ }
if (clobber_val != (int) val8)
avr_asm_len ("ldi %2,%1", op, plen, 1);
@@ -6147,133 +6222,369 @@ avr_out_plus_1 (rtx *xop, int *plen, enum rtx_code code, int *pcc)
} /* for all sub-bytes */
- /* No output doesn't change cc0. */
-
- if (plen && *plen == 0)
- *pcc = CC_NONE;
-}
+ saturate:
+ if (UNKNOWN == code_sat)
+ return;
-/* Output addition of register XOP[0] and compile time constant XOP[2]:
+ *pcc = (int) CC_CLOBBER;
- XOP[0] = XOP[0] + XOP[2]
+ /* Vanilla addition/subtraction is done. We are left with saturation.
+
+ We have to compute A = A <op> B where A is a register and
+ B is a register or a non-zero compile time constant CONST.
+ A is register class "r" if unsigned && B is REG. Otherwise, A is in "d".
+ B stands for the original operand $2 in INSN. In the case of B = CONST
+ SIGN in { -1, 1 } is the sign of B. Otherwise, SIGN is 0.
+
+ CODE is the instruction flavor we use in the asm sequence to perform <op>.
+
+
+ unsigned
+ operation | code | sat if | b is | sat value | case
+ -----------------+-------+----------+--------------+-----------+-------
+ + as a + b | add | C == 1 | const, reg | u+ = 0xff | [1u]
+ + as a - (-b) | sub | C == 0 | const | u+ = 0xff | [2u]
+ - as a - b | sub | C == 1 | const, reg | u- = 0 | [3u]
+ - as a + (-b) | add | C == 0 | const | u- = 0 | [4u]
+
+
+ signed
+ operation | code | sat if | b is | sat value | case
+ -----------------+-------+----------+--------------+-----------+-------
+ + as a + b | add | V == 1 | const, reg | s+ | [1s]
+ + as a - (-b) | sub | V == 1 | const | s+ | [2s]
+ - as a - b | sub | V == 1 | const, reg | s- | [3s]
+ - as a + (-b) | add | V == 1 | const | s- | [4s]
+
+ s+ = b < 0 ? -0x80 : 0x7f
+ s- = b < 0 ? 0x7f : -0x80
+
+ The cases a - b actually perform a - (-(-b)) if B is CONST.
+ */
- and return "". If PLEN == NULL, print assembler instructions to perform the
- addition; otherwise, set *PLEN to the length of the instruction sequence (in
- words) printed with PLEN == NULL.
- If PCC != 0 then set *PCC to the the instruction sequence's effect on the
- condition code (with respect to XOP[0]). */
+ op[0] = simplify_gen_subreg (QImode, xop[0], mode, n_bytes-1);
+ op[1] = n_bytes > 1
+ ? simplify_gen_subreg (QImode, xop[0], mode, n_bytes-2)
+ : NULL_RTX;
-const char*
-avr_out_plus (rtx *xop, int *plen, int *pcc)
-{
- int len_plus, len_minus;
- int cc_plus, cc_minus, cc_dummy;
+ if (!plen && flag_print_asm_name)
+ avr_fdump (asm_out_file, ";; %C (%C)\n", code_sat, code);
- if (!pcc)
- pcc = &cc_dummy;
-
- /* Work out if XOP[0] += XOP[2] is better or XOP[0] -= -XOP[2]. */
+ bool need_copy = true;
+ int len_call = 1 + AVR_HAVE_JMP_CALL;
- avr_out_plus_1 (xop, &len_plus, PLUS, &cc_plus);
- avr_out_plus_1 (xop, &len_minus, MINUS, &cc_minus);
+ switch (code_sat)
+ {
+ default:
+ gcc_unreachable();
+
+ case SS_PLUS:
+ case SS_MINUS:
+ if (!plen && flag_print_asm_name)
+ avr_fdump (asm_out_file, ";; %s = %r\n", sign < 0 ? "neg" : "pos",
+ xop[2]);
- /* Prefer MINUS over PLUS if size is equal because it sets cc0. */
+ if (out_brvc)
+ avr_asm_len ("brvc 0f", op, plen, 1);
+
+ if (reg_overlap_mentioned_p (xop[0], xop[2]))
+ {
+ /* [1s,reg] */
+
+ if (n_bytes == 1)
+ avr_asm_len ("ldi %0,0x7f" CR_TAB
+ "adc %0,__zero_reg__", op, plen, 2);
+ else
+ avr_asm_len ("ldi %0,0x7f" CR_TAB
+ "ldi %1,0xff" CR_TAB
+ "adc %1,__zero_reg__" CR_TAB
+ "adc %0,__zero_reg__", op, plen, 4);
+ }
+ else if (sign == 0 && PLUS == code)
+ {
+ /* [1s,reg] */
+
+ op[2] = simplify_gen_subreg (QImode, xop[2], mode, n_bytes-1);
+
+ if (n_bytes == 1)
+ avr_asm_len ("ldi %0,0x80" CR_TAB
+ "sbrs %2,7" CR_TAB
+ "dec %0", op, plen, 3);
+ else
+ avr_asm_len ("ldi %0,0x80" CR_TAB
+ "cp %2,%0" CR_TAB
+ "sbc %1,%1" CR_TAB
+ "sbci %0,0", op, plen, 4);
+ }
+ else if (sign == 0 && MINUS == code)
+ {
+ /* [3s,reg] */
+
+ op[2] = simplify_gen_subreg (QImode, xop[2], mode, n_bytes-1);
+
+ if (n_bytes == 1)
+ avr_asm_len ("ldi %0,0x7f" CR_TAB
+ "sbrs %2,7" CR_TAB
+ "inc %0", op, plen, 3);
+ else
+ avr_asm_len ("ldi %0,0x7f" CR_TAB
+ "cp %0,%2" CR_TAB
+ "sbc %1,%1" CR_TAB
+ "sbci %0,-1", op, plen, 4);
+ }
+ else if ((sign < 0) ^ (SS_MINUS == code_sat))
+ {
+ /* [1s,const,B < 0] [2s,B < 0] */
+ /* [3s,const,B > 0] [4s,B > 0] */
+
+ if (n_bytes == 8)
+ {
+ avr_asm_len ("%~call __clr_8", op, plen, len_call);
+ need_copy = false;
+ }
+
+ avr_asm_len ("ldi %0,0x80", op, plen, 1);
+ if (n_bytes > 1 && need_copy)
+ avr_asm_len ("clr %1", op, plen, 1);
+ }
+ else if ((sign > 0) ^ (SS_MINUS == code_sat))
+ {
+ /* [1s,const,B > 0] [2s,B > 0] */
+ /* [3s,const,B < 0] [4s,B < 0] */
+
+ if (n_bytes == 8)
+ {
+ avr_asm_len ("sec" CR_TAB
+ "%~call __sbc_8", op, plen, 1 + len_call);
+ need_copy = false;
+ }
+
+ avr_asm_len ("ldi %0,0x7f", op, plen, 1);
+ if (n_bytes > 1 && need_copy)
+ avr_asm_len ("ldi %1,0xff", op, plen, 1);
+ }
+ else
+ gcc_unreachable();
+
+ break;
+
+ case US_PLUS:
+ /* [1u] : [2u] */
+
+ avr_asm_len (PLUS == code ? "brcc 0f" : "brcs 0f", op, plen, 1);
+
+ if (n_bytes == 8)
+ {
+ if (MINUS == code)
+ avr_asm_len ("sec", op, plen, 1);
+ avr_asm_len ("%~call __sbc_8", op, plen, len_call);
+
+ need_copy = false;
+ }
+ else
+ {
+ if (MINUS == code && !test_hard_reg_class (LD_REGS, op[0]))
+ avr_asm_len ("sec" CR_TAB "sbc %0,%0", op, plen, 2);
+ else
+ avr_asm_len (PLUS == code ? "sbc %0,%0" : "ldi %0,0xff",
+ op, plen, 1);
+ }
+ break; /* US_PLUS */
+
+ case US_MINUS:
+ /* [4u] : [3u] */
+
+ avr_asm_len (PLUS == code ? "brcs 0f" : "brcc 0f", op, plen, 1);
+
+ if (n_bytes == 8)
+ {
+ avr_asm_len ("%~call __clr_8", op, plen, len_call);
+ need_copy = false;
+ }
+ else
+ avr_asm_len ("clr %0", op, plen, 1);
+
+ break;
+ }
+
+ /* We set the MSB in the unsigned case and the 2 MSBs in the signed case.
+ Now copy the right value to the LSBs. */
- if (plen)
+ if (need_copy && n_bytes > 1)
{
- *plen = (len_minus <= len_plus) ? len_minus : len_plus;
- *pcc = (len_minus <= len_plus) ? cc_minus : cc_plus;
+ if (US_MINUS == code_sat || US_PLUS == code_sat)
+ {
+ avr_asm_len ("mov %1,%0", op, plen, 1);
+
+ if (n_bytes > 2)
+ {
+ op[0] = xop[0];
+ if (AVR_HAVE_MOVW)
+ avr_asm_len ("movw %0,%1", op, plen, 1);
+ else
+ avr_asm_len ("mov %A0,%1" CR_TAB
+ "mov %B0,%1", op, plen, 2);
+ }
+ }
+ else if (n_bytes > 2)
+ {
+ op[0] = xop[0];
+ avr_asm_len ("mov %A0,%1" CR_TAB
+ "mov %B0,%1", op, plen, 2);
+ }
}
- else if (len_minus <= len_plus)
- avr_out_plus_1 (xop, NULL, MINUS, pcc);
- else
- avr_out_plus_1 (xop, NULL, PLUS, pcc);
- return "";
+ if (need_copy && n_bytes == 8)
+ {
+ if (AVR_HAVE_MOVW)
+ avr_asm_len ("movw %r0+2,%0" CR_TAB
+ "movw %r0+4,%0", xop, plen, 2);
+ else
+ avr_asm_len ("mov %r0+2,%0" CR_TAB
+ "mov %r0+3,%0" CR_TAB
+ "mov %r0+4,%0" CR_TAB
+ "mov %r0+5,%0", xop, plen, 4);
+ }
+
+ avr_asm_len ("0:", op, plen, 0);
}
-/* Same as above but XOP has just 3 entries.
- Supply a dummy 4th operand. */
+/* Output addition/subtraction of register XOP[0] and a constant XOP[2] that
+ is ont a compile-time constant:
-const char*
-avr_out_plus_noclobber (rtx *xop, int *plen, int *pcc)
+ XOP[0] = XOP[0] +/- XOP[2]
+
+ This is a helper for the function below. The only insns that need this
+ are additions/subtraction for pointer modes, i.e. HImode and PSImode. */
+
+static const char*
+avr_out_plus_symbol (rtx *xop, enum rtx_code code, int *plen, int *pcc)
{
- rtx op[4];
+ enum machine_mode mode = GET_MODE (xop[0]);
+ int n_bytes = GET_MODE_SIZE (mode);
- op[0] = xop[0];
- op[1] = xop[1];
- op[2] = xop[2];
- op[3] = NULL_RTX;
+ /* Only pointer modes want to add symbols. */
+
+ gcc_assert (mode == HImode || mode == PSImode);
- return avr_out_plus (op, plen, pcc);
+ *pcc = MINUS == code ? (int) CC_SET_CZN : (int) CC_SET_N;
+
+ avr_asm_len (PLUS == code
+ ? "subi %A0,lo8(-(%2))" CR_TAB "sbci %B0,hi8(-(%2))"
+ : "subi %A0,lo8(%2)" CR_TAB "sbci %B0,hi8(%2)",
+ xop, plen, -2);
+
+ if (3 == n_bytes)
+ avr_asm_len (PLUS == code
+ ? "sbci %C0,hlo8((-%2))"
+ : "sbci %C0,hlo8(%2)", xop, plen, 1);
+ return "";
}
-/* Output subtraction of register XOP[0] and compile time constant XOP[2]:
+/* Prepare operands of addition/subtraction to be used with avr_out_plus_1.
+
+ INSN is a single_set insn with a binary operation as SET_SRC that is
+ one of: PLUS, SS_PLUS, US_PLUS, MINUS, SS_MINUS, US_MINUS.
+
+ XOP are the operands of INSN. In the case of 64-bit operations with
+ constant XOP[] has just one element: The summand/subtrahend in XOP[0].
+ The non-saturating insns up to 32 bits may or may not supply a "d" class
+ scratch as XOP[3].
+
+ If PLEN == NULL output the instructions.
+ If PLEN != NULL set *PLEN to the length of the sequence in words.
- XOP[0] = XOP[0] - XOP[2]
+ PCC is a pointer to store the instructions' effect on cc0.
+ PCC may be NULL.
- This is basically the same as `avr_out_plus' except that we subtract.
- It's needed because (minus x const) is not mapped to (plus x -const)
- for the fixed point modes. */
+ PLEN and PCC default to NULL.
+
+ Return "" */
const char*
-avr_out_minus (rtx *xop, int *plen, int *pcc)
+avr_out_plus (rtx insn, rtx *xop, int *plen, int *pcc)
{
+ int cc_plus, cc_minus, cc_dummy;
+ int len_plus, len_minus;
rtx op[4];
+ rtx xdest = SET_DEST (single_set (insn));
+ enum machine_mode mode = GET_MODE (xdest);
+ enum machine_mode imode = int_mode_for_mode (mode);
+ int n_bytes = GET_MODE_SIZE (mode);
+ enum rtx_code code_sat = GET_CODE (SET_SRC (single_set (insn)));
+ enum rtx_code code
+ = (PLUS == code_sat || SS_PLUS == code_sat || US_PLUS == code_sat
+ ? PLUS : MINUS);
- if (pcc)
- *pcc = (int) CC_SET_CZN;
-
- if (REG_P (xop[2]))
- return avr_asm_len ("sub %A0,%A2" CR_TAB
- "sbc %B0,%B2", xop, plen, -2);
+ if (!pcc)
+ pcc = &cc_dummy;
- if (!CONST_INT_P (xop[2])
- && !CONST_FIXED_P (xop[2]))
- return avr_asm_len ("subi %A0,lo8(%2)" CR_TAB
- "sbci %B0,hi8(%2)", xop, plen, -2);
+ /* PLUS and MINUS don't saturate: Use modular wrap-around. */
- op[0] = avr_to_int_mode (xop[0]);
- op[1] = avr_to_int_mode (xop[1]);
- op[2] = gen_int_mode (-INTVAL (avr_to_int_mode (xop[2])),
- GET_MODE (op[0]));
- op[3] = xop[3];
+ if (PLUS == code_sat || MINUS == code_sat)
+ code_sat = UNKNOWN;
- return avr_out_plus (op, plen, pcc);
-}
+ if (n_bytes <= 4 && REG_P (xop[2]))
+ {
+ avr_out_plus_1 (xop, plen, code, pcc, code_sat);
+ return "";
+ }
+ if (8 == n_bytes)
+ {
+ op[0] = gen_rtx_REG (DImode, ACC_A);
+ op[1] = gen_rtx_REG (DImode, ACC_A);
+ op[2] = avr_to_int_mode (xop[0]);
+ }
+ else
+ {
+ if (!REG_P (xop[2])
+ && !CONST_INT_P (xop[2])
+ && !CONST_FIXED_P (xop[2]))
+ {
+ return avr_out_plus_symbol (xop, code, plen, pcc);
+ }
+
+ op[0] = avr_to_int_mode (xop[0]);
+ op[1] = avr_to_int_mode (xop[1]);
+ op[2] = avr_to_int_mode (xop[2]);
+ }
-/* Prepare operands of adddi3_const_insn to be used with avr_out_plus_1. */
+ /* Saturations and 64-bit operations don't have a clobber operand.
+ For the other cases, the caller will provide a proper XOP[3]. */
+
+ op[3] = PARALLEL == GET_CODE (PATTERN (insn)) ? xop[3] : NULL_RTX;
-const char*
-avr_out_plus64 (rtx addend, int *plen)
-{
- int cc_dummy;
- rtx op[4];
+ /* Saturation will need the sign of the original operand. */
- op[0] = gen_rtx_REG (DImode, 18);
- op[1] = op[0];
- op[2] = addend;
- op[3] = NULL_RTX;
+ rtx xmsb = simplify_gen_subreg (QImode, op[2], imode, n_bytes-1);
+ int sign = INTVAL (xmsb) < 0 ? -1 : 1;
- avr_out_plus_1 (op, plen, MINUS, &cc_dummy);
+ /* If we subtract and the subtrahend is a constant, then negate it
+ so that avr_out_plus_1 can be used. */
- return "";
-}
+ if (MINUS == code)
+ op[2] = simplify_unary_operation (NEG, imode, op[2], imode);
+ /* Work out the shortest sequence. */
-/* Prepare operands of subdi3_const_insn to be used with avr_out_plus64. */
+ avr_out_plus_1 (op, &len_minus, MINUS, &cc_plus, code_sat, sign);
+ avr_out_plus_1 (op, &len_plus, PLUS, &cc_minus, code_sat, sign);
-const char*
-avr_out_minus64 (rtx subtrahend, int *plen)
-{
- rtx xneg = avr_to_int_mode (subtrahend);
- xneg = simplify_unary_operation (NEG, DImode, xneg, DImode);
+ if (plen)
+ {
+ *plen = (len_minus <= len_plus) ? len_minus : len_plus;
+ *pcc = (len_minus <= len_plus) ? cc_minus : cc_plus;
+ }
+ else if (len_minus <= len_plus)
+ avr_out_plus_1 (op, NULL, MINUS, pcc, code_sat, sign);
+ else
+ avr_out_plus_1 (op, NULL, PLUS, pcc, code_sat, sign);
- return avr_out_plus64 (xneg, plen);
+ return "";
}
@@ -7004,13 +7315,7 @@ adjust_insn_length (rtx insn, int len)
case ADJUST_LEN_OUT_BITOP: avr_out_bitop (insn, op, &len); break;
- case ADJUST_LEN_OUT_PLUS: avr_out_plus (op, &len, NULL); break;
- case ADJUST_LEN_PLUS64: avr_out_plus64 (op[0], &len); break;
- case ADJUST_LEN_MINUS: avr_out_minus (op, &len, NULL); break;
- case ADJUST_LEN_MINUS64: avr_out_minus64 (op[0], &len); break;
- case ADJUST_LEN_OUT_PLUS_NOCLOBBER:
- avr_out_plus_noclobber (op, &len, NULL); break;
-
+ case ADJUST_LEN_PLUS: avr_out_plus (insn, op, &len); break;
case ADJUST_LEN_ADDTO_SP: avr_out_addto_sp (op, &len); break;
case ADJUST_LEN_MOV8: output_movqi (insn, op, &len); break;
@@ -8897,8 +9202,8 @@ avr_rtx_costs (rtx x, int codearg, int outer_code,
static int
avr_address_cost (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED,
- addr_space_t as ATTRIBUTE_UNUSED,
- bool speed ATTRIBUTE_UNUSED)
+ addr_space_t as ATTRIBUTE_UNUSED,
+ bool speed ATTRIBUTE_UNUSED)
{
int cost = 4;
diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md
index 6146fe6a013..8b13010e700 100644
--- a/gcc/config/avr/avr.md
+++ b/gcc/config/avr/avr.md
@@ -91,7 +91,7 @@
;; Condition code settings.
(define_attr "cc" "none,set_czn,set_zn,set_n,compare,clobber,
- out_plus, out_plus_noclobber,ldi,minus"
+ plus,ldi"
(const_string "none"))
(define_attr "type" "branch,branch1,arith,xcall"
@@ -138,8 +138,7 @@
;; Otherwise do special processing depending on the attribute.
(define_attr "adjust_len"
- "out_bitop, out_plus, out_plus_noclobber, plus64, addto_sp,
- minus, minus64,
+ "out_bitop, plus, addto_sp,
tsthi, tstpsi, tstsi, compare, compare64, call,
mov8, mov16, mov24, mov32, reload_in16, reload_in24, reload_in32,
ufract, sfract,
@@ -250,6 +249,10 @@
(define_code_iterator xior [xor ior])
(define_code_iterator eqne [eq ne])
+(define_code_iterator ss_addsub [ss_plus ss_minus])
+(define_code_iterator us_addsub [us_plus us_minus])
+(define_code_iterator ss_abs_neg [ss_abs ss_neg])
+
;; Define code attributes
(define_code_attr extend_su
[(sign_extend "s")
@@ -268,6 +271,10 @@
[(zero_extend "r")
(sign_extend "d")])
+(define_code_attr abelian
+ [(ss_minus "") (us_minus "")
+ (ss_plus "%") (us_plus "%")])
+
;; Map RTX code to its standard insn name
(define_code_attr code_stdname
[(ashift "ashl")
@@ -275,7 +282,10 @@
(lshiftrt "lshr")
(ior "ior")
(xor "xor")
- (rotate "rotl")])
+ (rotate "rotl")
+ (ss_plus "ssadd") (ss_minus "sssub") (ss_neg "ssneg") (ss_abs "ssabs")
+ (us_plus "usadd") (us_minus "ussub") (us_neg "usneg")
+ ])
;;========================================================================
;; The following is used by nonlocal_goto and setjmp.
@@ -1181,17 +1191,11 @@
(match_operand:ALL2 2 "nonmemory_or_const_operand" "r,s,IJ YIJ,n Ynn")))]
""
{
- if (REG_P (operands[2]))
- return "add %A0,%A2\;adc %B0,%B2";
- else if (CONST_INT_P (operands[2])
- || CONST_FIXED == GET_CODE (operands[2]))
- return avr_out_plus_noclobber (operands, NULL, NULL);
- else
- return "subi %A0,lo8(-(%2))\;sbci %B0,hi8(-(%2))";
+ return avr_out_plus (insn, operands);
}
- [(set_attr "length" "2,2,2,2")
- (set_attr "adjust_len" "*,*,out_plus_noclobber,out_plus_noclobber")
- (set_attr "cc" "set_n,set_czn,out_plus_noclobber,out_plus_noclobber")])
+ [(set_attr "length" "2")
+ (set_attr "adjust_len" "plus")
+ (set_attr "cc" "plus")])
;; Adding a constant to NO_LD_REGS might have lead to a reload of
;; that constant to LD_REGS. We don't add a scratch to *addhi3
@@ -1238,13 +1242,11 @@
(clobber (match_scratch:QI 3 "=X ,X ,&d"))]
""
{
- gcc_assert (REGNO (operands[0]) == REGNO (operands[1]));
-
- return avr_out_plus (operands, NULL, NULL);
+ return avr_out_plus (insn, operands);
}
[(set_attr "length" "4")
- (set_attr "adjust_len" "out_plus")
- (set_attr "cc" "out_plus")])
+ (set_attr "adjust_len" "plus")
+ (set_attr "cc" "plus")])
;; "addsi3"
@@ -1257,14 +1259,11 @@
(clobber (match_scratch:QI 3 "=X,X ,&d"))]
""
{
- if (REG_P (operands[2]))
- return "add %A0,%A2\;adc %B0,%B2\;adc %C0,%C2\;adc %D0,%D2";
-
- return avr_out_plus (operands, NULL, NULL);
+ return avr_out_plus (insn, operands);
}
- [(set_attr "length" "4,4,8")
- (set_attr "adjust_len" "*,out_plus,out_plus")
- (set_attr "cc" "set_n,out_plus,out_plus")])
+ [(set_attr "length" "4")
+ (set_attr "adjust_len" "plus")
+ (set_attr "cc" "plus")])
(define_insn "*addpsi3_zero_extend.qi"
[(set (match_operand:PSI 0 "register_operand" "=r")
@@ -1318,22 +1317,11 @@
(clobber (match_scratch:QI 3 "=X,X ,X,&d"))]
""
{
- static const char * const asm_code[] =
- {
- "add %A0,%A2\;adc %B0,%B2\;adc %C0,%C2",
- "subi %0,lo8(-(%2))\;sbci %B0,hi8(-(%2))\;sbci %C0,hlo8(-(%2))",
- "",
- ""
- };
-
- if (*asm_code[which_alternative])
- return asm_code[which_alternative];
-
- return avr_out_plus (operands, NULL, NULL);
+ return avr_out_plus (insn, operands);
}
- [(set_attr "length" "3,3,3,6")
- (set_attr "adjust_len" "*,*,out_plus,out_plus")
- (set_attr "cc" "set_n,set_czn,out_plus,out_plus")])
+ [(set_attr "length" "3")
+ (set_attr "adjust_len" "plus")
+ (set_attr "cc" "plus")])
(define_insn "subpsi3"
[(set (match_operand:PSI 0 "register_operand" "=r")
@@ -1401,10 +1389,10 @@
(clobber (match_scratch:QI 3 "=X,X ,&d"))]
""
{
- return avr_out_minus (operands, NULL, NULL);
+ return avr_out_plus (insn, operands);
}
- [(set_attr "adjust_len" "minus")
- (set_attr "cc" "minus")])
+ [(set_attr "adjust_len" "plus")
+ (set_attr "cc" "plus")])
(define_insn "*subhi3_zero_extend1"
[(set (match_operand:HI 0 "register_operand" "=r")
@@ -1438,14 +1426,10 @@
(clobber (match_scratch:QI 3 "=X,X ,&d"))]
""
{
- if (REG_P (operands[2]))
- return "sub %0,%2\;sbc %B0,%B2\;sbc %C0,%C2\;sbc %D0,%D2";
-
- return avr_out_minus (operands, NULL, NULL);
+ return avr_out_plus (insn, operands);
}
- [(set_attr "length" "4")
- (set_attr "adjust_len" "*,minus,minus")
- (set_attr "cc" "set_czn")])
+ [(set_attr "adjust_len" "plus")
+ (set_attr "cc" "plus")])
(define_insn "*subsi3_zero_extend"
[(set (match_operand:SI 0 "register_operand" "=r")
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index 33a831f89dc..54c92d16b75 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -1878,7 +1878,7 @@ darwin_asm_named_section (const char *name,
the assumption of how this is done. */
if (lto_section_names == NULL)
lto_section_names = VEC_alloc (darwin_lto_section_e, gc, 16);
- VEC_safe_push (darwin_lto_section_e, gc, lto_section_names, &e);
+ VEC_safe_push (darwin_lto_section_e, gc, lto_section_names, e);
}
else if (strncmp (name, "__DWARF,", 8) == 0)
darwin_asm_dwarf_section (name, flags, decl);
@@ -2698,7 +2698,7 @@ darwin_asm_dwarf_section (const char *name, unsigned int flags,
fprintf (asm_out_file, "Lsection%.*s:\n", namelen, sname);
e.count = 1;
e.name = xstrdup (sname);
- VEC_safe_push (dwarf_sect_used_entry, gc, dwarf_sect_names_table, &e);
+ VEC_safe_push (dwarf_sect_used_entry, gc, dwarf_sect_names_table, e);
}
}
diff --git a/gcc/config/i386/driver-i386.c b/gcc/config/i386/driver-i386.c
index 79bf75ffaeb..bda4e022277 100644
--- a/gcc/config/i386/driver-i386.c
+++ b/gcc/config/i386/driver-i386.c
@@ -472,8 +472,6 @@ const char *host_detect_local_cpu (int argc, const char **argv)
has_abm = ecx & bit_ABM;
has_lwp = ecx & bit_LWP;
has_fma4 = ecx & bit_FMA4;
- if (vendor == signature_AMD_ebx && has_fma4 && has_fma)
- has_fma4 = 0;
has_xop = ecx & bit_XOP;
has_tbm = ecx & bit_TBM;
has_lzcnt = ecx & bit_LZCNT;
diff --git a/gcc/config/i386/fmaintrin.h b/gcc/config/i386/fmaintrin.h
index 9ec9d17a330..f2a05607d6e 100644
--- a/gcc/config/i386/fmaintrin.h
+++ b/gcc/config/i386/fmaintrin.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2011 Free Software Foundation, Inc.
+/* Copyright (C) 2011, 2012 Free Software Foundation, Inc.
This file is part of GCC.
@@ -164,7 +164,7 @@ extern __inline __m128d
__attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_fnmadd_sd (__m128d __A, __m128d __B, __m128d __C)
{
- return (__m128d)__builtin_ia32_vfmaddsd3 (-(__v2df)__A, (__v2df)__B,
+ return (__m128d)__builtin_ia32_vfmaddsd3 ((__v2df)__A, -(__v2df)__B,
(__v2df)__C);
}
@@ -172,7 +172,7 @@ extern __inline __m128
__attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_fnmadd_ss (__m128 __A, __m128 __B, __m128 __C)
{
- return (__m128)__builtin_ia32_vfmaddss3 (-(__v4sf)__A, (__v4sf)__B,
+ return (__m128)__builtin_ia32_vfmaddss3 ((__v4sf)__A, -(__v4sf)__B,
(__v4sf)__C);
}
@@ -212,7 +212,7 @@ extern __inline __m128d
__attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_fnmsub_sd (__m128d __A, __m128d __B, __m128d __C)
{
- return (__m128d)__builtin_ia32_vfmaddsd3 (-(__v2df)__A, (__v2df)__B,
+ return (__m128d)__builtin_ia32_vfmaddsd3 ((__v2df)__A, -(__v2df)__B,
-(__v2df)__C);
}
@@ -220,7 +220,7 @@ extern __inline __m128
__attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_fnmsub_ss (__m128 __A, __m128 __B, __m128 __C)
{
- return (__m128)__builtin_ia32_vfmaddss3 (-(__v4sf)__A, (__v4sf)__B,
+ return (__m128)__builtin_ia32_vfmaddss3 ((__v4sf)__A, -(__v4sf)__B,
-(__v4sf)__C);
}
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 62d3a8c990b..df8c101cd76 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -2517,8 +2517,8 @@ enum processor_type ix86_tune;
/* Which instruction set architecture to use. */
enum processor_type ix86_arch;
-/* true if sse prefetch instruction is not NOOP. */
-int x86_prefetch_sse;
+/* True if processor has SSE prefetch instruction. */
+unsigned char x86_prefetch_sse;
/* -mstackrealign option */
static const char ix86_force_align_arg_pointer_string[]
@@ -3108,12 +3108,12 @@ ix86_option_override_internal (bool main_args_p)
| PTA_SSSE3 | PTA_SSE4_1 | PTA_SSE4_2 | PTA_AVX | PTA_AVX2
| PTA_CX16 | PTA_POPCNT | PTA_AES | PTA_PCLMUL | PTA_FSGSBASE
| PTA_RDRND | PTA_F16C | PTA_BMI | PTA_BMI2 | PTA_LZCNT
- | PTA_FMA | PTA_MOVBE | PTA_RTM | PTA_HLE},
+ | PTA_FMA | PTA_MOVBE | PTA_RTM | PTA_HLE},
{"atom", PROCESSOR_ATOM, CPU_ATOM,
PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
| PTA_SSSE3 | PTA_CX16 | PTA_MOVBE},
{"geode", PROCESSOR_GEODE, CPU_GEODE,
- PTA_MMX | PTA_3DNOW | PTA_3DNOW_A |PTA_PREFETCH_SSE},
+ PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_PREFETCH_SSE},
{"k6", PROCESSOR_K6, CPU_K6, PTA_MMX},
{"k6-2", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
{"k6-3", PROCESSOR_K6, CPU_K6, PTA_MMX | PTA_3DNOW},
@@ -3139,7 +3139,7 @@ ix86_option_override_internal (bool main_args_p)
PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
| PTA_SSE2 | PTA_NO_SAHF},
{"opteron-sse3", PROCESSOR_K8, CPU_K8,
- PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
+ PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
| PTA_SSE2 | PTA_SSE3 | PTA_NO_SAHF},
{"athlon64", PROCESSOR_K8, CPU_K8,
PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
@@ -3152,7 +3152,7 @@ ix86_option_override_internal (bool main_args_p)
| PTA_SSE2 | PTA_NO_SAHF},
{"amdfam10", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
- | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
+ | PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
{"barcelona", PROCESSOR_AMDFAM10, CPU_AMDFAM10,
PTA_64BIT | PTA_MMX | PTA_3DNOW | PTA_3DNOW_A | PTA_SSE
| PTA_SSE2 | PTA_SSE3 | PTA_SSE4A | PTA_CX16 | PTA_ABM},
@@ -3160,26 +3160,27 @@ ix86_option_override_internal (bool main_args_p)
PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
| PTA_SSE4A | PTA_CX16 | PTA_ABM | PTA_SSSE3 | PTA_SSE4_1
| PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX | PTA_FMA4
- | PTA_XOP | PTA_LWP},
+ | PTA_XOP | PTA_LWP | PTA_PRFCHW},
{"bdver2", PROCESSOR_BDVER2, CPU_BDVER2,
PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
| PTA_SSE4A | PTA_CX16 | PTA_ABM | PTA_SSSE3 | PTA_SSE4_1
- | PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX
+ | PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX | PTA_FMA4
| PTA_XOP | PTA_LWP | PTA_BMI | PTA_TBM | PTA_F16C
- | PTA_FMA},
+ | PTA_FMA | PTA_PRFCHW},
{"btver1", PROCESSOR_BTVER1, CPU_GENERIC64,
- PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
- | PTA_SSSE3 | PTA_SSE4A |PTA_ABM | PTA_CX16},
- {"generic32", PROCESSOR_GENERIC32, CPU_PENTIUMPRO,
- PTA_HLE /* flags are only used for -march switch. */ },
+ PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
+ | PTA_SSSE3 | PTA_SSE4A |PTA_ABM | PTA_CX16 | PTA_PRFCHW},
{"btver2", PROCESSOR_BTVER2, CPU_GENERIC64,
PTA_64BIT | PTA_MMX | PTA_SSE | PTA_SSE2 | PTA_SSE3
| PTA_SSSE3 | PTA_SSE4A |PTA_ABM | PTA_CX16 | PTA_SSE4_1
| PTA_SSE4_2 | PTA_AES | PTA_PCLMUL | PTA_AVX
- | PTA_BMI | PTA_F16C | PTA_MOVBE},
+ | PTA_BMI | PTA_F16C | PTA_MOVBE | PTA_PRFCHW},
+
+ {"generic32", PROCESSOR_GENERIC32, CPU_PENTIUMPRO,
+ PTA_HLE /* flags are only used for -march switch. */ },
{"generic64", PROCESSOR_GENERIC64, CPU_GENERIC64,
PTA_64BIT
- | PTA_HLE /* flags are only used for -march switch. */ },
+ | PTA_HLE /* flags are only used for -march switch. */ },
};
/* -mrecip options. */
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 53ca7a5bfe8..2e709526eab 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -458,8 +458,7 @@ extern unsigned char ix86_arch_features[X86_ARCH_LAST];
#define TARGET_FISTTP (TARGET_SSE3 && TARGET_80387)
-extern int x86_prefetch_sse;
-
+extern unsigned char x86_prefetch_sse;
#define TARGET_PREFETCH_SSE x86_prefetch_sse
#define ASSEMBLER_DIALECT (ix86_asm_dialect)
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 898e0156248..5886478e3ff 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -659,9 +659,11 @@
(eq_attr "isa" "noavx2") (symbol_ref "!TARGET_AVX2")
(eq_attr "isa" "bmi2") (symbol_ref "TARGET_BMI2")
(eq_attr "isa" "fma") (symbol_ref "TARGET_FMA")
- ;; Disable generation of FMA4 instructions for generic code
- ;; since FMA3 is preferred for targets that implement both
- ;; instruction sets.
+ ;; Fma instruction selection has to be done based on
+ ;; register pressure. For generating fma4, a cost model
+ ;; based on register pressure is required. Till then,
+ ;; fma4 instruction is disabled for targets that implement
+ ;; both fma and fma4 instruction sets.
(eq_attr "isa" "fma4")
(symbol_ref "TARGET_FMA4 && !TARGET_FMA")
]
@@ -17798,12 +17800,10 @@
int locality = INTVAL (operands[2]);
gcc_assert (rw == 0 || rw == 1);
- gcc_assert (locality >= 0 && locality <= 3);
- gcc_assert (GET_MODE (operands[0]) == Pmode
- || GET_MODE (operands[0]) == VOIDmode);
+ gcc_assert (IN_RANGE (locality, 0, 3));
+
if (TARGET_PRFCHW && rw)
operands[2] = GEN_INT (3);
-
/* Use 3dNOW prefetch in case we are asking for write prefetch not
supported by SSE counterpart or the SSE prefetch is not available
(K6 machines). Otherwise use SSE prefetch as it allows specifying
@@ -17814,8 +17814,8 @@
operands[1] = const0_rtx;
})
-(define_insn "*prefetch_sse_<mode>"
- [(prefetch (match_operand:P 0 "address_operand" "p")
+(define_insn "*prefetch_sse"
+ [(prefetch (match_operand 0 "address_operand" "p")
(const_int 0)
(match_operand:SI 1 "const_int_operand"))]
"TARGET_PREFETCH_SSE"
@@ -17825,7 +17825,7 @@
};
int locality = INTVAL (operands[1]);
- gcc_assert (locality >= 0 && locality <= 3);
+ gcc_assert (IN_RANGE (locality, 0, 3));
return patterns[locality];
}
@@ -17835,8 +17835,8 @@
(symbol_ref "memory_address_length (operands[0])"))
(set_attr "memory" "none")])
-(define_insn "*prefetch_3dnow_<mode>"
- [(prefetch (match_operand:P 0 "address_operand" "p")
+(define_insn "*prefetch_3dnow"
+ [(prefetch (match_operand 0 "address_operand" "p")
(match_operand:SI 1 "const_int_operand" "n")
(const_int 3))]
"TARGET_3DNOW || TARGET_PRFCHW"
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
index d4f40b1e8e2..5234decc978 100644
--- a/gcc/config/i386/predicates.md
+++ b/gcc/config/i386/predicates.md
@@ -201,8 +201,7 @@
{
case UNSPEC_DTPOFF:
case UNSPEC_NTPOFF:
- if (offset > 0
- && trunc_int_for_mode (offset, SImode) == offset)
+ if (trunc_int_for_mode (offset, SImode) == offset)
return true;
}
break;
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index da8bc1e1175..7934760624a 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -2072,79 +2072,75 @@
(match_operand:VF_128 1 "nonimmediate_operand")
(match_operand:VF_128 2 "nonimmediate_operand")
(match_operand:VF_128 3 "nonimmediate_operand"))
- (match_dup 0)
+ (match_dup 1)
(const_int 1)))]
"TARGET_FMA")
(define_insn "*fmai_fmadd_<mode>"
- [(set (match_operand:VF_128 0 "register_operand" "=x,x,x")
+ [(set (match_operand:VF_128 0 "register_operand" "=x,x")
(vec_merge:VF_128
(fma:VF_128
- (match_operand:VF_128 1 "nonimmediate_operand" "%0, 0,x")
- (match_operand:VF_128 2 "nonimmediate_operand" "xm, x,xm")
- (match_operand:VF_128 3 "nonimmediate_operand" " x,xm,0"))
- (match_dup 0)
+ (match_operand:VF_128 1 "nonimmediate_operand" " 0, 0")
+ (match_operand:VF_128 2 "nonimmediate_operand" "xm, x")
+ (match_operand:VF_128 3 "nonimmediate_operand" " x,xm"))
+ (match_dup 1)
(const_int 1)))]
"TARGET_FMA"
"@
vfmadd132<ssescalarmodesuffix>\t{%2, %3, %0|%0, %3, %2}
- vfmadd213<ssescalarmodesuffix>\t{%3, %2, %0|%0, %2, %3}
- vfmadd231<ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
+ vfmadd213<ssescalarmodesuffix>\t{%3, %2, %0|%0, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<MODE>")])
(define_insn "*fmai_fmsub_<mode>"
- [(set (match_operand:VF_128 0 "register_operand" "=x,x,x")
+ [(set (match_operand:VF_128 0 "register_operand" "=x,x")
(vec_merge:VF_128
(fma:VF_128
- (match_operand:VF_128 1 "nonimmediate_operand" "%0, 0,x")
- (match_operand:VF_128 2 "nonimmediate_operand" "xm, x,xm")
+ (match_operand:VF_128 1 "nonimmediate_operand" " 0, 0")
+ (match_operand:VF_128 2 "nonimmediate_operand" "xm, x")
(neg:VF_128
- (match_operand:VF_128 3 "nonimmediate_operand" " x,xm,0")))
- (match_dup 0)
+ (match_operand:VF_128 3 "nonimmediate_operand" " x,xm")))
+ (match_dup 1)
(const_int 1)))]
"TARGET_FMA"
"@
vfmsub132<ssescalarmodesuffix>\t{%2, %3, %0|%0, %3, %2}
- vfmsub213<ssescalarmodesuffix>\t{%3, %2, %0|%0, %2, %3}
- vfmsub231<ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
+ vfmsub213<ssescalarmodesuffix>\t{%3, %2, %0|%0, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<MODE>")])
(define_insn "*fmai_fnmadd_<mode>"
- [(set (match_operand:VF_128 0 "register_operand" "=x,x,x")
+ [(set (match_operand:VF_128 0 "register_operand" "=x,x")
(vec_merge:VF_128
(fma:VF_128
(neg:VF_128
- (match_operand:VF_128 1 "nonimmediate_operand" "%0, 0,x"))
- (match_operand:VF_128 2 "nonimmediate_operand" "xm, x,xm")
- (match_operand:VF_128 3 "nonimmediate_operand" " x,xm,0"))
- (match_dup 0)
+ (match_operand:VF_128 2 "nonimmediate_operand" "xm, x"))
+ (match_operand:VF_128 1 "nonimmediate_operand" " 0, 0")
+ (match_operand:VF_128 3 "nonimmediate_operand" " x,xm"))
+ (match_dup 1)
(const_int 1)))]
"TARGET_FMA"
"@
vfnmadd132<ssescalarmodesuffix>\t{%2, %3, %0|%0, %3, %2}
- vfnmadd213<ssescalarmodesuffix>\t{%3, %2, %0|%0, %2, %3}
- vfnmadd231<ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
+ vfnmadd213<ssescalarmodesuffix>\t{%3, %2, %0|%0, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<MODE>")])
(define_insn "*fmai_fnmsub_<mode>"
- [(set (match_operand:VF_128 0 "register_operand" "=x,x,x")
+ [(set (match_operand:VF_128 0 "register_operand" "=x,x")
(vec_merge:VF_128
(fma:VF_128
(neg:VF_128
- (match_operand:VF_128 1 "nonimmediate_operand" "%0, 0,x"))
- (match_operand:VF_128 2 "nonimmediate_operand" "xm, x,xm")
+ (match_operand:VF_128 2 "nonimmediate_operand" "xm, x"))
+ (match_operand:VF_128 1 "nonimmediate_operand" " 0, 0")
(neg:VF_128
- (match_operand:VF_128 3 "nonimmediate_operand" " x,xm,0")))
- (match_dup 0)
+ (match_operand:VF_128 3 "nonimmediate_operand" " x,xm")))
+ (match_dup 1)
(const_int 1)))]
"TARGET_FMA"
"@
vfnmsub132<ssescalarmodesuffix>\t{%2, %3, %0|%0, %3, %2}
- vfnmsub213<ssescalarmodesuffix>\t{%3, %2, %0|%0, %2, %3}
- vfnmsub231<ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
+ vfnmsub213<ssescalarmodesuffix>\t{%3, %2, %0|%0, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<MODE>")])
diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c
index 0e55e1c2309..b2e2e6c2564 100644
--- a/gcc/config/m68k/m68k.c
+++ b/gcc/config/m68k/m68k.c
@@ -6269,7 +6269,8 @@ m68k_sched_dfa_post_advance_cycle (void)
while (--i >= 0)
{
if (state_transition (curr_state, sched_ib.insn) >= 0)
- gcc_unreachable ();
+ /* Pick up scheduler state. */
+ ++sched_ib.filled;
}
}
diff --git a/gcc/config/mips/gnu-user64.h b/gcc/config/mips/gnu-user64.h
index ad59ba4c752..7c2187f4150 100644
--- a/gcc/config/mips/gnu-user64.h
+++ b/gcc/config/mips/gnu-user64.h
@@ -20,13 +20,17 @@ along with GCC; see the file COPYING3. If not see
/* Force the default endianness and ABI flags onto the command line
in order to make the other specs easier to write. */
-#undef DRIVER_SELF_SPECS
-#define DRIVER_SELF_SPECS \
- BASE_DRIVER_SELF_SPECS, \
+
+#define LINUX64_DRIVER_SELF_SPECS \
LINUX_DRIVER_SELF_SPECS \
" %{!EB:%{!EL:%(endian_spec)}}" \
" %{!mabi=*: -" MULTILIB_ABI_DEFAULT "}"
+#undef DRIVER_SELF_SPECS
+#define DRIVER_SELF_SPECS \
+ BASE_DRIVER_SELF_SPECS, \
+ LINUX64_DRIVER_SELF_SPECS
+
#undef GNU_USER_TARGET_LINK_SPEC
#define GNU_USER_TARGET_LINK_SPEC "\
%{G*} %{EB} %{EL} %{mips1} %{mips2} %{mips3} %{mips4} \
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index 09322f15926..7f9df4c161b 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -3989,8 +3989,8 @@ mips_multi_start (void)
static struct mips_multi_member *
mips_multi_add (void)
{
- return VEC_safe_push (mips_multi_member, heap, mips_multi_members,
- (struct mips_multi_member *) 0);
+ mips_multi_member empty;
+ return VEC_safe_push (mips_multi_member, heap, mips_multi_members, empty);
}
/* Add a normal insn with the given asm format to the current multi-insn
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index 9ce466dc44b..e04f0995273 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -728,6 +728,11 @@ struct mips_cpu_info {
#define MIPS_32BIT_OPTION_SPEC \
"mips1|mips2|mips32*|mgp32"
+/* Infer a -msynci setting from a -mips argument, on the assumption that
+ -msynci is desired where possible. */
+#define MIPS_ISA_SYNCI_SPEC \
+ "%{msynci|mno-synci:;:%{mips32r2|mips64r2:-msynci;:-mno-synci}}"
+
#if MIPS_ABI_DEFAULT == ABI_O64 \
|| MIPS_ABI_DEFAULT == ABI_N32 \
|| MIPS_ABI_DEFAULT == ABI_64
@@ -762,7 +767,6 @@ struct mips_cpu_info {
{"mips-plt", "%{!mplt:%{!mno-plt:-m%(VALUE)}}" }, \
{"synci", "%{!msynci:%{!mno-synci:-m%(VALUE)}}" }
-
/* A spec that infers the -mdsp setting from an -march argument. */
#define BASE_DRIVER_SELF_SPECS \
"%{!mno-dsp: \
diff --git a/gcc/config/mips/mti-linux.h b/gcc/config/mips/mti-linux.h
new file mode 100644
index 00000000000..36c003c60cb
--- /dev/null
+++ b/gcc/config/mips/mti-linux.h
@@ -0,0 +1,43 @@
+/* Target macros for mips*-mti-linux* targets.
+ Copyright (C) 2012
+ 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 3, 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 COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
+
+/* This target is a multilib target, specify the sysroot paths. */
+#undef SYSROOT_SUFFIX_SPEC
+#define SYSROOT_SUFFIX_SPEC \
+ "%{mips32:/mips32}%{mips64:/mips64}%{mips64r2:/mips64r2}%{msoft-float:/sof}%{mel|EL:/el}%{mabi=64:/64}%{mabi=n32:/n32}"
+
+#undef DRIVER_SELF_SPECS
+#define DRIVER_SELF_SPECS \
+ /* Make sure a -mips option is present. This helps us to pick \
+ the right multilib, and also makes the later specs easier \
+ to write. */ \
+ MIPS_ISA_LEVEL_SPEC, \
+ \
+ /* Infer the default float setting from -march. */ \
+ MIPS_ARCH_FLOAT_SPEC, \
+ \
+ /* Infer the -msynci setting from -march if not explicitly set. */ \
+ MIPS_ISA_SYNCI_SPEC, \
+ \
+ /* Base SPECs. */ \
+ BASE_DRIVER_SELF_SPECS \
+ \
+ /* Use the standard linux specs for everything else. */ \
+ LINUX64_DRIVER_SELF_SPECS
diff --git a/gcc/config/mips/t-mti-linux b/gcc/config/mips/t-mti-linux
new file mode 100644
index 00000000000..ba11706ffee
--- /dev/null
+++ b/gcc/config/mips/t-mti-linux
@@ -0,0 +1,24 @@
+# Copyright (C) 2012 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 3, 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 COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# The default build is mips32r2, hard-float big-endian. Add mips32,
+# soft-float, and little-endian variations.
+
+MULTILIB_OPTIONS = mips32/mips64/mips64r2 msoft-float EL
+MULTILIB_DIRNAMES = mips32 mips64 mips64r2 sof el
+MULTILIB_MATCHES = EL=mel EB=meb
diff --git a/gcc/config/mmix/constraints.md b/gcc/config/mmix/constraints.md
new file mode 100644
index 00000000000..954cddaa5af
--- /dev/null
+++ b/gcc/config/mmix/constraints.md
@@ -0,0 +1,112 @@
+;; MMIX constraints
+;; Copyright (C) 2012 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 3, 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 COPYING3. If not see
+;; <http://www.gnu.org/licenses/>. */
+
+(define_register_constraint "x" "SYSTEM_REGS"
+ "@internal")
+
+(define_register_constraint "y" "REMAINDER_REG"
+ "@internal")
+
+(define_register_constraint "z" "HIMULT_REG"
+ "@internal")
+
+(define_constraint "I"
+ "A 8-bit unsigned integer"
+ (and (match_code "const_int")
+ (match_test "IN_RANGE (ival, 0, 255)")))
+
+(define_constraint "J"
+ "A 16-bit unsigned integer."
+ (and (match_code "const_int")
+ (match_test "IN_RANGE (ival, 0, 65535)")))
+
+(define_constraint "K"
+ "An integer between -255 and 0."
+ (and (match_code "const_int")
+ (match_test "IN_RANGE (ival, -255, 0)")))
+
+(define_constraint "L"
+ "@internal"
+ (and (match_code "const_int")
+ (match_test "mmix_shiftable_wyde_value (ival)")))
+
+(define_constraint "M"
+ "The value 0."
+ (and (match_code "const_int")
+ (match_test "ival == 0")))
+
+(define_constraint "N"
+ "@internal"
+ (and (match_code "const_int")
+ (match_test "mmix_shiftable_wyde_value (~ival)")))
+
+(define_constraint "O"
+ "The value 3, 5, 9, or 17."
+ (and (match_code "const_int")
+ (ior (match_test "ival == 3")
+ (match_test "ival == 5")
+ (match_test "ival == 9")
+ (match_test "ival == 17"))))
+
+;; FIXME: M (or G) is redundant.
+
+(define_constraint "G"
+ "Floating-point zero."
+ (and (match_code "const_double")
+ (match_test "op == CONST0_RTX (mode)")))
+
+;; R asks whether x is to be loaded with GETA or something else. Right
+;; now, only a SYMBOL_REF and LABEL_REF can fit for
+;; TARGET_BASE_ADDRESSES.
+;;
+;; Only constant symbolic addresses apply. With TARGET_BASE_ADDRESSES,
+;; we just allow straight LABEL_REF or SYMBOL_REFs with SYMBOL_REF_FLAG
+;; set right now; only function addresses and code labels. If we change
+;; to let SYMBOL_REF_FLAG be set on other symbols, we have to check
+;; inside CONST expressions. When TARGET_BASE_ADDRESSES is not in
+;; effect, a "raw" constant check together with mmix_constant_address_p
+;; is all that's needed; we want all constant addresses to be loaded
+;; with GETA then.
+
+(define_constraint "R"
+ "@internal"
+ (and (not (match_code "const_int,const_double"))
+ (match_test "mmix_constant_address_p (op)")
+ (ior (match_test "!TARGET_BASE_ADDRESSES")
+ (match_code "LABEL_REF")
+ (and (match_code "SYMBOL_REF")
+ (match_test "SYMBOL_REF_FLAG (op)")))))
+
+;; FIXME: L (or S) is redundant.
+
+(define_constraint "S"
+ "@internal"
+ (and (match_code "const_int,const_double")
+ (match_test "mmix_shiftable_wyde_value (mmix_intval (op))")))
+
+;; FIXME: N (or T) is redundant.
+
+(define_constraint "T"
+ "@internal"
+ (and (match_code "const_int,const_double")
+ (match_test "mmix_shiftable_wyde_value (~mmix_intval (op))")))
+
+(define_address_constraint "U"
+ "@internal"
+ (match_operand 0 "mmix_address_operand"))
diff --git a/gcc/config/mmix/mmix-protos.h b/gcc/config/mmix/mmix-protos.h
index 4e8c338b80c..62cdbae442a 100644
--- a/gcc/config/mmix/mmix-protos.h
+++ b/gcc/config/mmix/mmix-protos.h
@@ -40,6 +40,7 @@ extern void mmix_asm_output_reg_push (FILE *, int);
extern void mmix_asm_output_reg_pop (FILE *, int);
extern void mmix_asm_output_skip (FILE *, int);
extern void mmix_asm_output_align (FILE *, int);
+extern HOST_WIDEST_INT mmix_intval (const_rtx);
extern int mmix_shiftable_wyde_value (unsigned HOST_WIDEST_INT);
extern void mmix_output_register_setting (FILE *, int, HOST_WIDEST_INT, int);
extern int mmix_opposite_regno (int, int);
@@ -59,9 +60,6 @@ extern void mmix_asm_output_addr_diff_elt (FILE *, rtx, int, int);
extern void mmix_asm_output_addr_vec_elt (FILE *, int);
extern enum reg_class mmix_secondary_reload_class
(enum reg_class, enum machine_mode, rtx, int);
-extern int mmix_const_ok_for_letter_p (HOST_WIDE_INT, int);
-extern int mmix_const_double_ok_for_letter_p (rtx, int);
-extern int mmix_extra_constraint (rtx, int, int);
extern rtx mmix_dynamic_chain_address (rtx);
extern rtx mmix_return_addr_rtx (int, rtx);
extern rtx mmix_eh_return_stackadj_rtx (void);
diff --git a/gcc/config/mmix/mmix.c b/gcc/config/mmix/mmix.c
index eaf5f2ed437..d5d72dfdcad 100644
--- a/gcc/config/mmix/mmix.c
+++ b/gcc/config/mmix/mmix.c
@@ -44,6 +44,7 @@ along with GCC; see the file COPYING3. If not see
#include "target.h"
#include "target-def.h"
#include "df.h"
+#include "tm-constrs.h"
/* First some local helper definitions. */
#define MMIX_FIRST_GLOBAL_REGNUM 32
@@ -118,7 +119,6 @@ static void mmix_output_shiftvalue_op_from_str
(FILE *, const char *, HOST_WIDEST_INT);
static void mmix_output_shifted_value (FILE *, HOST_WIDEST_INT);
static void mmix_output_condition (FILE *, const_rtx, int);
-static HOST_WIDEST_INT mmix_intval (const_rtx);
static void mmix_output_octa (FILE *, HOST_WIDEST_INT, int);
static bool mmix_assemble_integer (rtx, unsigned int, int);
static struct machine_function *mmix_init_machine_status (void);
@@ -459,87 +459,6 @@ mmix_secondary_reload_class (enum reg_class rclass,
return NO_REGS;
}
-/* CONST_OK_FOR_LETTER_P. */
-
-int
-mmix_const_ok_for_letter_p (HOST_WIDE_INT value, int c)
-{
- return
- (c == 'I' ? value >= 0 && value <= 255
- : c == 'J' ? value >= 0 && value <= 65535
- : c == 'K' ? value <= 0 && value >= -255
- : c == 'L' ? mmix_shiftable_wyde_value (value)
- : c == 'M' ? value == 0
- : c == 'N' ? mmix_shiftable_wyde_value (~value)
- : c == 'O' ? (value == 3 || value == 5 || value == 9
- || value == 17)
- : 0);
-}
-
-/* CONST_DOUBLE_OK_FOR_LETTER_P. */
-
-int
-mmix_const_double_ok_for_letter_p (rtx value, int c)
-{
- return
- (c == 'G' ? value == CONST0_RTX (GET_MODE (value))
- : 0);
-}
-
-/* EXTRA_CONSTRAINT.
- We need this since our constants are not always expressible as
- CONST_INT:s, but rather often as CONST_DOUBLE:s. */
-
-int
-mmix_extra_constraint (rtx x, int c, int strict)
-{
- HOST_WIDEST_INT value;
-
- /* When checking for an address, we need to handle strict vs. non-strict
- register checks. Don't use address_operand, but instead its
- equivalent (its callee, which it is just a wrapper for),
- memory_operand_p and the strict-equivalent strict_memory_address_p. */
- if (c == 'U')
- return
- strict
- ? strict_memory_address_p (Pmode, x)
- : memory_address_p (Pmode, x);
-
- /* R asks whether x is to be loaded with GETA or something else. Right
- now, only a SYMBOL_REF and LABEL_REF can fit for
- TARGET_BASE_ADDRESSES.
-
- Only constant symbolic addresses apply. With TARGET_BASE_ADDRESSES,
- we just allow straight LABEL_REF or SYMBOL_REFs with SYMBOL_REF_FLAG
- set right now; only function addresses and code labels. If we change
- to let SYMBOL_REF_FLAG be set on other symbols, we have to check
- inside CONST expressions. When TARGET_BASE_ADDRESSES is not in
- effect, a "raw" constant check together with mmix_constant_address_p
- is all that's needed; we want all constant addresses to be loaded
- with GETA then. */
- if (c == 'R')
- return
- GET_CODE (x) != CONST_INT && GET_CODE (x) != CONST_DOUBLE
- && mmix_constant_address_p (x)
- && (! TARGET_BASE_ADDRESSES
- || (GET_CODE (x) == LABEL_REF
- || (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_FLAG (x))));
-
- if (GET_CODE (x) != CONST_DOUBLE || GET_MODE (x) != VOIDmode)
- return 0;
-
- value = mmix_intval (x);
-
- /* We used to map Q->J, R->K, S->L, T->N, U->O, but we don't have to any
- more ('U' taken for address_operand, 'R' similarly). Some letters map
- outside of CONST_INT, though; we still use 'S' and 'T'. */
- if (c == 'S')
- return mmix_shiftable_wyde_value (value);
- else if (c == 'T')
- return mmix_shiftable_wyde_value (~value);
- return 0;
-}
-
/* DYNAMIC_CHAIN_ADDRESS. */
rtx
@@ -1161,8 +1080,7 @@ mmix_legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
return 1;
/* (mem (plus (reg) (0..255?))) */
- if (GET_CODE (x2) == CONST_INT
- && CONST_OK_FOR_LETTER_P (INTVAL (x2), 'I'))
+ if (satisfies_constraint_I (x2))
return 1;
return 0;
@@ -1843,8 +1761,7 @@ mmix_print_operand_address (FILE *stream, rtx x)
reg_names[MMIX_OUTPUT_REGNO (REGNO (x2))]);
return;
}
- else if (GET_CODE (x2) == CONST_INT
- && CONST_OK_FOR_LETTER_P (INTVAL (x2), 'I'))
+ else if (satisfies_constraint_I (x2))
{
output_addr_const (stream, x2);
return;
@@ -2529,7 +2446,7 @@ mmix_emit_sp_add (HOST_WIDE_INT offset)
{
/* Positive adjustments are in the epilogue only. Don't mark them
as "frame-related" for unwind info. */
- if (CONST_OK_FOR_LETTER_P (offset, 'L'))
+ if (insn_const_int_ok_for_constraint (offset, CONSTRAINT_L))
emit_insn (gen_adddi3 (stack_pointer_rtx,
stack_pointer_rtx,
GEN_INT (offset)));
@@ -2754,7 +2671,7 @@ mmix_output_condition (FILE *stream, const_rtx x, int reversed)
/* Return the bit-value for a const_int or const_double. */
-static HOST_WIDEST_INT
+HOST_WIDEST_INT
mmix_intval (const_rtx x)
{
unsigned HOST_WIDEST_INT retval;
diff --git a/gcc/config/mmix/mmix.h b/gcc/config/mmix/mmix.h
index 787f64f4bf5..07b7368e9a5 100644
--- a/gcc/config/mmix/mmix.h
+++ b/gcc/config/mmix/mmix.h
@@ -72,12 +72,6 @@ along with GCC; see the file COPYING3. If not see
untouched by the epilogue". */
#define MMIX_EH_RETURN_STACKADJ_REGNUM MMIX_STATIC_CHAIN_REGNUM
-#ifdef REG_OK_STRICT
-# define MMIX_REG_OK_STRICT 1
-#else
-# define MMIX_REG_OK_STRICT 0
-#endif
-
#define MMIX_FUNCTION_ARG_SIZE(MODE, TYPE) \
((MODE) != BLKmode ? GET_MODE_SIZE (MODE) : int_size_in_bytes (TYPE))
@@ -439,11 +433,6 @@ enum reg_class
#define INDEX_REG_CLASS GENERAL_REGS
-#define REG_CLASS_FROM_LETTER(CHAR) \
- ((CHAR) == 'x' ? SYSTEM_REGS \
- : (CHAR) == 'y' ? REMAINDER_REG \
- : (CHAR) == 'z' ? HIMULT_REG : NO_REGS)
-
#define REGNO_OK_FOR_BASE_P(REGNO) \
((REGNO) <= MMIX_LAST_GENERAL_REGISTER \
|| (REGNO) == MMIX_ARG_POINTER_REGNUM \
@@ -460,16 +449,6 @@ enum reg_class
#define CLASS_MAX_NREGS(CLASS, MODE) HARD_REGNO_NREGS (CLASS, MODE)
-#define CONST_OK_FOR_LETTER_P(VALUE, C) \
- mmix_const_ok_for_letter_p (VALUE, C)
-
-#define EXTRA_CONSTRAINT(VALUE, C) \
- mmix_extra_constraint (VALUE, C, MMIX_REG_OK_STRICT)
-
-/* Do we need anything serious here? Yes, any FLOT constant. */
-#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) \
- mmix_const_double_ok_for_letter_p (VALUE, C)
-
/* Node: Frame Layout */
diff --git a/gcc/config/mmix/mmix.md b/gcc/config/mmix/mmix.md
index 1cd397a8a14..24d6292f787 100644
--- a/gcc/config/mmix/mmix.md
+++ b/gcc/config/mmix/mmix.md
@@ -43,6 +43,7 @@
;; Operand and operator predicates.
(include "predicates.md")
+(include "constraints.md")
;; FIXME: Can we remove the reg-to-reg for smaller modes? Shouldn't they
;; be synthesized ok?
@@ -274,7 +275,7 @@
(define_insn "iordi3"
[(set (match_operand:DI 0 "register_operand" "=r,r")
(ior:DI (match_operand:DI 1 "register_operand" "%r,0")
- (match_operand:DI 2 "mmix_reg_or_constant_operand" "rH,LS")))]
+ (match_operand:DI 2 "mmix_reg_or_constant_operand" "rI,LS")))]
""
"@
OR %0,%1,%2
@@ -1037,6 +1038,7 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
;; first ("p") alternative by adding ? in the first operand
;; might do the trick. We define 'U' as a synonym to 'p', but without the
;; caveats (and very small advantages) of 'p'.
+;; As of r190682 still so: newlib/libc/stdlib/dtoa.c ICEs if "p" is used.
(define_insn "*call_real"
[(call (mem:QI
(match_operand:DI 0 "mmix_symbolic_or_address_operand" "s,rU"))
diff --git a/gcc/config/mmix/predicates.md b/gcc/config/mmix/predicates.md
index b5773b87aee..f9ba32c8832 100644
--- a/gcc/config/mmix/predicates.md
+++ b/gcc/config/mmix/predicates.md
@@ -118,7 +118,7 @@
return 1;
/* Fall through. */
default:
- return address_operand (op, mode);
+ return mmix_address_operand (op, mode);
}
})
@@ -152,4 +152,12 @@
(ior
(match_operand 0 "register_operand")
(and (match_code "const_int")
- (match_test "CONST_OK_FOR_LETTER_P (INTVAL (op), 'I')"))))
+ (match_test "satisfies_constraint_I (op)"))))
+
+;; True if this is a memory address, possibly strictly.
+;; See also comment above the "*call_real" pattern.
+
+(define_predicate "mmix_address_operand"
+ (if_then_else (match_test "reload_in_progress || reload_completed")
+ (match_test "strict_memory_address_p (Pmode, op)")
+ (match_test "memory_address_p (Pmode, op)")))
diff --git a/gcc/config/moxie/moxie.h b/gcc/config/moxie/moxie.h
index c80d26c5ae9..7604ac427a0 100644
--- a/gcc/config/moxie/moxie.h
+++ b/gcc/config/moxie/moxie.h
@@ -41,9 +41,13 @@
#define LIB_SPEC "%{!shared:%{!symbolic:-lc}}"
#undef LINK_SPEC
-#define LINK_SPEC "%{h*} %{v:-V} \
+#define LINK_SPEC "%{h*} %{v:-V} %{!mel:-EB} %{mel:-EL}\
%{static:-Bstatic} %{shared:-shared} %{symbolic:-Bsymbolic}"
+#ifndef MULTILIB_DEFAULTS
+#define MULTILIB_DEFAULTS { "meb" }
+#endif
+
/* Layout of Source Language Data Types */
#define INT_TYPE_SIZE 32
@@ -192,6 +196,7 @@ enum reg_class
/* The Overall Framework of an Assembler File */
#undef ASM_SPEC
+#define ASM_SPEC "%{!mel:-EB} %{mel:-EL}"
#define ASM_COMMENT_START "#"
#define ASM_APP_ON ""
#define ASM_APP_OFF ""
@@ -291,8 +296,8 @@ enum reg_class
/* Storage Layout */
#define BITS_BIG_ENDIAN 0
-#define BYTES_BIG_ENDIAN 1
-#define WORDS_BIG_ENDIAN 1
+#define BYTES_BIG_ENDIAN ( ! TARGET_LITTLE_ENDIAN )
+#define WORDS_BIG_ENDIAN ( ! TARGET_LITTLE_ENDIAN )
/* Alignment required for a function entry point, in bits. */
#define FUNCTION_BOUNDARY 16
@@ -473,8 +478,12 @@ enum reg_class
#define TARGET_CPU_CPP_BUILTINS() \
{ \
- builtin_define_std ("moxie"); \
- builtin_define_std ("MOXIE"); \
+ builtin_define_std ("moxie"); \
+ builtin_define_std ("MOXIE"); \
+ if (TARGET_LITTLE_ENDIAN) \
+ builtin_define ("__MOXIE_LITTLE_ENDIAN__"); \
+ else \
+ builtin_define ("__MOXIE_BIG_ENDIAN__"); \
}
#define HAS_LONG_UNCOND_BRANCH true
diff --git a/gcc/config/moxie/moxie.opt b/gcc/config/moxie/moxie.opt
new file mode 100644
index 00000000000..00f3ff82cc8
--- /dev/null
+++ b/gcc/config/moxie/moxie.opt
@@ -0,0 +1,27 @@
+; Options for the moxie compiler port.
+
+; Copyright (C) 2012 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 3, 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 COPYING3. If not see
+; <http://www.gnu.org/licenses/>.
+
+meb
+Target RejectNegative Report InverseMask(LITTLE_ENDIAN)
+Generate big-endian code
+
+mel
+Target RejectNegative Report Mask(LITTLE_ENDIAN)
+Generate little-endian code
diff --git a/gcc/config/moxie/t-moxie b/gcc/config/moxie/t-moxie
index 5498ecbb354..9111fd603ab 100644
--- a/gcc/config/moxie/t-moxie
+++ b/gcc/config/moxie/t-moxie
@@ -18,3 +18,6 @@
# along with GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
+MULTILIB_OPTIONS = meb/mel
+MULTILIB_DIRNAMES = eb el
+
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index cba8e781722..6c8f8278d58 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -9948,11 +9948,9 @@ static GTY(()) VEC(extern_symbol,gc) *extern_symbols;
void
pa_hpux_asm_output_external (FILE *file, tree decl, const char *name)
{
- extern_symbol * p = VEC_safe_push (extern_symbol, gc, extern_symbols, NULL);
-
gcc_assert (file == asm_out_file);
- p->decl = decl;
- p->name = name;
+ extern_symbol p = {decl, name};
+ VEC_safe_push (extern_symbol, gc, extern_symbols, p);
}
/* Output text required at the end of an assembler file.
diff --git a/gcc/config/rs6000/rs6000-c.c b/gcc/config/rs6000/rs6000-c.c
index a2ef08e17ca..58101ab4bff 100644
--- a/gcc/config/rs6000/rs6000-c.c
+++ b/gcc/config/rs6000/rs6000-c.c
@@ -3582,11 +3582,8 @@ altivec_resolve_overloaded_builtin (location_t loc, tree fndecl,
vec = VEC_alloc (constructor_elt, gc, size);
for(i = 0; i < size; i++)
{
- constructor_elt *elt;
-
- elt = VEC_quick_push (constructor_elt, vec, NULL);
- elt->index = NULL_TREE;
- elt->value = arg;
+ constructor_elt elt = {NULL_TREE, arg};
+ VEC_quick_push (constructor_elt, vec, elt);
}
return build_constructor (type, vec);
}
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index c125019e821..a5a3848e585 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -24901,11 +24901,8 @@ static void
add_compiler_branch_island (tree label_name, tree function_name,
int line_number)
{
- branch_island *bi = VEC_safe_push (branch_island, gc, branch_islands, NULL);
-
- bi->function_name = function_name;
- bi->label_name = label_name;
- bi->line_number = line_number;
+ branch_island bi = {function_name, label_name, line_number};
+ VEC_safe_push (branch_island, gc, branch_islands, bi);
}
/* Generate far-jump branch islands for everything recorded in
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 5dae300970c..f2bc15f14b8 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -957,6 +957,20 @@
#"
[(set_attr "type" "compare")
(set_attr "length" "4,8")])
+
+(define_split
+ [(set (match_operand:CC 2 "cc_reg_not_micro_cr0_operand" "")
+ (compare:CC (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" ""))
+ (const_int 0)))
+ (set (match_operand:SI 0 "gpc_reg_operand" "")
+ (sign_extend:SI (match_dup 1)))]
+ "reload_completed"
+ [(set (match_dup 0)
+ (sign_extend:SI (match_dup 1)))
+ (set (match_dup 2)
+ (compare:CC (match_dup 0)
+ (const_int 0)))]
+ "")
;; IBM 405, 440, 464 and 476 half-word multiplication operations.
@@ -1489,20 +1503,6 @@
DONE;
})
-(define_split
- [(set (match_operand:CC 2 "cc_reg_not_micro_cr0_operand" "")
- (compare:CC (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" ""))
- (const_int 0)))
- (set (match_operand:SI 0 "gpc_reg_operand" "")
- (sign_extend:SI (match_dup 1)))]
- "reload_completed"
- [(set (match_dup 0)
- (sign_extend:SI (match_dup 1)))
- (set (match_dup 2)
- (compare:CC (match_dup 0)
- (const_int 0)))]
- "")
-
;; Fixed-point arithmetic insns.
(define_expand "add<mode>3"
diff --git a/gcc/config/sh/iterators.md b/gcc/config/sh/iterators.md
index 9d536c525af..ec95013b2c3 100644
--- a/gcc/config/sh/iterators.md
+++ b/gcc/config/sh/iterators.md
@@ -34,3 +34,6 @@
(define_mode_attr disp04 [(QI "K04") (HI "K05")])
(define_mode_attr disp12 [(QI "K12") (HI "K13")])
+;; Return codes.
+(define_code_iterator any_return [return simple_return])
+
diff --git a/gcc/config/sh/newlib.h b/gcc/config/sh/newlib.h
index 13099c1f8d9..3b3ec1651f1 100644
--- a/gcc/config/sh/newlib.h
+++ b/gcc/config/sh/newlib.h
@@ -23,3 +23,7 @@ along with GCC; see the file COPYING3. If not see
#undef LIB_SPEC
#define LIB_SPEC "-lc -lgloss"
+
+#undef NO_IMPLICIT_EXTERN_C
+#define NO_IMPLICIT_EXTERN_C 1
+
diff --git a/gcc/config/sh/predicates.md b/gcc/config/sh/predicates.md
index 92a7b689c84..8a4f7db044c 100644
--- a/gcc/config/sh/predicates.md
+++ b/gcc/config/sh/predicates.md
@@ -791,9 +791,8 @@
/* Allow T_REG as shift count for dynamic shifts, although it is not
really possible. It will then be copied to a general purpose reg. */
if (! TARGET_SHMEDIA)
- return const_int_operand (op, mode)
- || (TARGET_DYNSHIFT && (arith_reg_operand (op, mode)
- || t_reg_operand (op, mode)));
+ return const_int_operand (op, mode) || arith_reg_operand (op, mode)
+ || (TARGET_DYNSHIFT && t_reg_operand (op, mode));
return (CONSTANT_P (op)
? (CONST_INT_P (op)
@@ -999,11 +998,12 @@
return REGNO (op) == T_REG;
case SUBREG:
- return REGNO (SUBREG_REG (op)) == T_REG;
+ return REG_P (SUBREG_REG (op)) && REGNO (SUBREG_REG (op)) == T_REG;
case ZERO_EXTEND:
case SIGN_EXTEND:
return GET_CODE (XEXP (op, 0)) == SUBREG
+ && REG_P (SUBREG_REG (XEXP (op, 0)))
&& REGNO (SUBREG_REG (XEXP (op, 0))) == T_REG;
default:
diff --git a/gcc/config/sh/sh-protos.h b/gcc/config/sh/sh-protos.h
index 2bb318b1bc3..827b1b48819 100644
--- a/gcc/config/sh/sh-protos.h
+++ b/gcc/config/sh/sh-protos.h
@@ -117,7 +117,6 @@ extern rtx get_fpscr_rtx (void);
extern int sh_media_register_for_return (void);
extern void sh_expand_prologue (void);
extern void sh_expand_epilogue (bool);
-extern bool sh_need_epilogue (void);
extern void sh_set_return_address (rtx, rtx);
extern int initial_elimination_offset (int, int);
extern bool fldi_ok (void);
@@ -155,4 +154,5 @@ extern int sh2a_get_function_vector_number (rtx);
extern bool sh2a_is_function_vector_call (rtx);
extern void sh_fix_range (const char *);
extern bool sh_hard_regno_mode_ok (unsigned int, enum machine_mode);
+extern bool sh_can_use_simple_return_p (void);
#endif /* ! GCC_SH_PROTOS_H */
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 10dad62b8f7..b54bf2fc1ef 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -2871,35 +2871,35 @@ struct ashl_lshr_sequence
static const struct ashl_lshr_sequence ashl_lshr_seq[32] =
{
- { 0, { 0 }, 0 },
+ { 0, { 0 }, 0 }, // 0
{ 1, { 1 }, LSHR_CLOBBERS_T },
{ 1, { 2 }, 0 },
{ 2, { 2, 1 }, LSHR_CLOBBERS_T },
- { 2, { 2, 2 }, 0 },
+ { 2, { 2, 2 }, 0 }, // 4
{ 3, { 2, 1, 2 }, LSHR_CLOBBERS_T },
{ 3, { 2, 2, 2 }, 0 },
{ 4, { 2, 2, 1, 2 }, LSHR_CLOBBERS_T },
- { 1, { 8 }, 0 },
+ { 1, { 8 }, 0 }, // 8
{ 2, { 8, 1 }, LSHR_CLOBBERS_T },
{ 2, { 8, 2 }, 0 },
{ 3, { 8, 1, 2 }, LSHR_CLOBBERS_T },
- { 3, { 8, 2, 2 }, 0 },
+ { 3, { 8, 2, 2 }, 0 }, // 12
{ 4, { 8, 2, 1, 2 }, LSHR_CLOBBERS_T },
{ 3, { 8, -2, 8 }, 0 },
{ 3, { 8, -1, 8 }, ASHL_CLOBBERS_T },
- { 1, { 16 }, 0 },
+ { 1, { 16 }, 0 }, // 16
{ 2, { 16, 1 }, LSHR_CLOBBERS_T },
{ 2, { 16, 2 }, 0 },
{ 3, { 16, 1, 2 }, LSHR_CLOBBERS_T },
- { 3, { 16, 2, 2 }, 0 },
+ { 3, { 16, 2, 2 }, 0 }, // 20
{ 4, { 16, 2, 1, 2 }, LSHR_CLOBBERS_T },
{ 3, { 16, -2, 8 }, 0 },
{ 3, { 16, -1, 8 }, ASHL_CLOBBERS_T },
- { 2, { 16, 8 }, 0 },
+ { 2, { 16, 8 }, 0 }, // 24
{ 3, { 16, 1, 8 }, LSHR_CLOBBERS_T },
{ 3, { 16, 8, 2 }, 0 },
{ 4, { 16, 8, 1, 2 }, LSHR_CLOBBERS_T },
- { 4, { 16, 8, 2, 2 }, 0 },
+ { 4, { 16, 8, 2, 2 }, 0 }, // 28
{ 4, { 16, -1, -2, 16 }, ASHL_CLOBBERS_T },
{ 3, { 16, -2, 16 }, 0 },
@@ -2915,35 +2915,35 @@ static const struct ashl_lshr_sequence ashl_lshr_seq[32] =
kind of sign or zero extension. */
static const struct ashl_lshr_sequence ext_ashl_lshr_seq[32] =
{
- { 0, { 0 }, 0 },
+ { 0, { 0 }, 0 }, // 0
{ 1, { 1 }, LSHR_CLOBBERS_T },
{ 1, { 2 }, 0 },
{ 2, { 2, 1 }, LSHR_CLOBBERS_T },
- { 2, { 2, 2 }, 0 },
+ { 2, { 2, 2 }, 0 }, // 4
{ 3, { 2, 1, 2 }, LSHR_CLOBBERS_T },
{ 2, { 8, -2 }, 0 },
{ 2, { 8, -1 }, ASHL_CLOBBERS_T },
- { 1, { 8 }, 0 },
+ { 1, { 8 }, 0 }, // 8
{ 2, { 8, 1 }, LSHR_CLOBBERS_T },
{ 2, { 8, 2 }, 0 },
{ 3, { 8, 1, 2 }, LSHR_CLOBBERS_T },
- { 3, { 8, 2, 2 }, 0 },
+ { 3, { 8, 2, 2 }, 0 }, // 12
{ 3, { 16, -2, -1 }, ASHL_CLOBBERS_T },
{ 2, { 16, -2 }, 0 },
{ 2, { 16, -1 }, ASHL_CLOBBERS_T },
- { 1, { 16 }, 0 },
+ { 1, { 16 }, 0 }, // 16
{ 2, { 16, 1 }, LSHR_CLOBBERS_T },
{ 2, { 16, 2 }, 0 },
{ 3, { 16, 1, 2 }, LSHR_CLOBBERS_T },
- { 3, { 16, 2, 2 }, 0 },
+ { 3, { 16, 2, 2 }, 0 }, // 20
{ 4, { 16, 2, 1, 2 }, LSHR_CLOBBERS_T },
{ 3, { 16, -2, 8 }, 0 },
{ 3, { 16, -1, 8 }, ASHL_CLOBBERS_T },
- { 2, { 16, 8 }, 0 },
+ { 2, { 16, 8 }, 0 }, // 24
{ 3, { 16, 1, 8 }, LSHR_CLOBBERS_T },
{ 3, { 16, 8, 2 }, 0 },
{ 4, { 16, 8, 1, 2 }, LSHR_CLOBBERS_T },
- { 4, { 16, 8, 2, 2 }, 0 },
+ { 4, { 16, 8, 2, 2 }, 0 }, // 28
{ 4, { 16, -1, -2, 16 }, ASHL_CLOBBERS_T },
{ 3, { 16, -2, 16 }, 0 },
{ 3, { 16, -1, 16 }, ASHL_CLOBBERS_T }
@@ -3196,6 +3196,78 @@ sh_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
}
return false;
+ /* The cost of a mem access is mainly the cost of the address mode. */
+ case MEM:
+ *total = sh_address_cost (XEXP (x, 0), GET_MODE (x), MEM_ADDR_SPACE (x),
+ true);
+ return true;
+
+ /* The cost of a sign or zero extend depends on whether the source is a
+ reg or a mem. In case of a mem take the address into acount. */
+ case SIGN_EXTEND:
+ if (REG_P (XEXP (x, 0)))
+ {
+ *total = COSTS_N_INSNS (1);
+ return true;
+ }
+ if (MEM_P (XEXP (x, 0)))
+ {
+ *total = sh_address_cost (XEXP (XEXP (x, 0), 0),
+ GET_MODE (XEXP (x, 0)),
+ MEM_ADDR_SPACE (XEXP (x, 0)), true);
+ return true;
+ }
+ return false;
+
+ case ZERO_EXTEND:
+ if (REG_P (XEXP (x, 0)))
+ {
+ *total = COSTS_N_INSNS (1);
+ return true;
+ }
+ else if (TARGET_SH2A && MEM_P (XEXP (x, 0))
+ && (GET_MODE (XEXP (x, 0)) == QImode
+ || GET_MODE (XEXP (x, 0)) == HImode))
+ {
+ /* Handle SH2A's movu.b and movu.w insn. */
+ *total = sh_address_cost (XEXP (XEXP (x, 0), 0),
+ GET_MODE (XEXP (x, 0)),
+ MEM_ADDR_SPACE (XEXP (x, 0)), true);
+ return true;
+ }
+ return false;
+
+ /* mems for SFmode and DFmode can be inside a parallel due to
+ the way the fpscr is handled. */
+ case PARALLEL:
+ for (int i = 0; i < XVECLEN (x, 0); i++)
+ {
+ rtx xx = XVECEXP (x, 0, i);
+ if (GET_CODE (xx) == SET && MEM_P (XEXP (xx, 0)))
+ {
+ *total = sh_address_cost (XEXP (XEXP (xx, 0), 0),
+ GET_MODE (XEXP (xx, 0)),
+ MEM_ADDR_SPACE (XEXP (xx, 0)), true);
+ return true;
+ }
+ if (GET_CODE (xx) == SET && MEM_P (XEXP (xx, 1)))
+ {
+ *total = sh_address_cost (XEXP (XEXP (xx, 1), 0),
+ GET_MODE (XEXP (xx, 1)),
+ MEM_ADDR_SPACE (XEXP (xx, 1)), true);
+ return true;
+ }
+ }
+
+ if (sh_1el_vec (x, VOIDmode))
+ *total = outer_code != SET;
+ else if (sh_rep_vec (x, VOIDmode))
+ *total = ((GET_MODE_UNIT_SIZE (GET_MODE (x)) + 3) / 4
+ + (outer_code != SET));
+ else
+ *total = COSTS_N_INSNS (3) + (outer_code != SET);
+ return true;
+
case CONST_INT:
if (TARGET_SHMEDIA)
{
@@ -3271,7 +3343,10 @@ sh_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
else
*total = 10;
return true;
+
case CONST_VECTOR:
+ /* FIXME: This looks broken. Only the last statement has any effect.
+ Probably this could be folded with the PARALLEL case? */
if (x == CONST0_RTX (GET_MODE (x)))
*total = 0;
else if (sh_1el_vec (x, VOIDmode))
@@ -3339,15 +3414,6 @@ sh_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
*total = COSTS_N_INSNS (20);
return true;
- case PARALLEL:
- if (sh_1el_vec (x, VOIDmode))
- *total = outer_code != SET;
- if (sh_rep_vec (x, VOIDmode))
- *total = ((GET_MODE_UNIT_SIZE (GET_MODE (x)) + 3) / 4
- + (outer_code != SET));
- *total = COSTS_N_INSNS (3) + (outer_code != SET);
- return true;
-
case FLOAT:
case FIX:
*total = 100;
@@ -3430,36 +3496,47 @@ disp_addr_displacement (rtx x)
/* Compute the cost of an address. */
static int
-sh_address_cost (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED,
+sh_address_cost (rtx x, enum machine_mode mode,
addr_space_t as ATTRIBUTE_UNUSED, bool speed ATTRIBUTE_UNUSED)
{
+ /* Simple reg, post-inc, pre-dec addressing. */
+ if (REG_P (x) || GET_CODE (x) == POST_INC || GET_CODE (x) == PRE_DEC)
+ return 1;
+
/* 'reg + disp' addressing. */
- if (satisfies_constraint_Sdd (x))
+ if (GET_CODE (x) == PLUS
+ && REG_P (XEXP (x, 0)) && CONST_INT_P (XEXP (x, 1)))
{
- const HOST_WIDE_INT offset = disp_addr_displacement (x);
- const enum machine_mode mode = GET_MODE (x);
+ const HOST_WIDE_INT offset = INTVAL (XEXP (x, 1));
+
+ if (offset == 0)
+ return 1;
- /* The displacement would fit into a 2 byte move insn. */
+ /* The displacement would fit into a 2 byte move insn.
+ HImode and QImode loads/stores with displacement put pressure on
+ R0 which will most likely require another reg copy. Thus account
+ a higher cost for that. */
if (offset > 0 && offset <= max_mov_insn_displacement (mode, false))
- return 0;
+ return (mode == HImode || mode == QImode) ? 2 : 1;
/* The displacement would fit into a 4 byte move insn (SH2A). */
if (TARGET_SH2A
&& offset > 0 && offset <= max_mov_insn_displacement (mode, true))
- return 1;
+ return 2;
/* The displacement is probably out of range and will require extra
calculations. */
- return 2;
+ return 3;
}
/* 'reg + reg' addressing. Account a slightly higher cost because of
increased pressure on R0. */
if (GET_CODE (x) == PLUS && ! CONSTANT_P (XEXP (x, 1))
&& ! TARGET_SHMEDIA)
- return 1;
+ return 3;
- return 0;
+ /* Not sure what it is - probably expensive. */
+ return 10;
}
/* Code to expand a shift. */
@@ -7899,24 +7976,6 @@ sh_expand_epilogue (bool sibcall_p)
emit_use (gen_rtx_REG (SImode, PR_REG));
}
-static int sh_need_epilogue_known = 0;
-
-bool
-sh_need_epilogue (void)
-{
- if (! sh_need_epilogue_known)
- {
- rtx epilogue;
-
- start_sequence ();
- sh_expand_epilogue (0);
- epilogue = get_insns ();
- end_sequence ();
- sh_need_epilogue_known = (epilogue == NULL ? -1 : 1);
- }
- return sh_need_epilogue_known > 0;
-}
-
/* Emit code to change the current function's return address to RA.
TEMP is available as a scratch register, if needed. */
@@ -7996,7 +8055,6 @@ static void
sh_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
HOST_WIDE_INT size ATTRIBUTE_UNUSED)
{
- sh_need_epilogue_known = 0;
}
static rtx
@@ -9876,7 +9934,7 @@ fpscr_set_from_mem (int mode, HARD_REG_SET regs_live)
static bool
sequence_insn_p (rtx insn)
{
- rtx prev, next, pat;
+ rtx prev, next;
prev = PREV_INSN (insn);
if (prev == NULL)
@@ -9886,11 +9944,7 @@ sequence_insn_p (rtx insn)
if (next == NULL)
return false;
- pat = PATTERN (next);
- if (pat == NULL)
- return false;
-
- return GET_CODE (pat) == SEQUENCE;
+ return INSN_P (next) && GET_CODE (PATTERN (next)) == SEQUENCE;
}
int
@@ -12959,4 +13013,34 @@ sh_init_sync_libfuncs (void)
init_sync_libfuncs (UNITS_PER_WORD);
}
+/* Return true if it is appropriate to emit `ret' instructions in the
+ body of a function. */
+
+bool
+sh_can_use_simple_return_p (void)
+{
+ HARD_REG_SET live_regs_mask;
+ int d;
+
+ if (! reload_completed || frame_pointer_needed)
+ return false;
+
+ /* Moving prologue around does't reduce the size. */
+ if (optimize_function_for_size_p (cfun))
+ return false;
+
+ /* Can't optimize CROSSING_JUMPS for now. */
+ if (flag_reorder_blocks_and_partition)
+ return false;
+
+ /* Finally, allow for pr save. */
+ d = calc_live_regs (&live_regs_mask);
+
+ if (rounded_frame_size (d) > 4)
+ return false;
+
+ return true;
+
+}
+
#include "gt-sh.h"
diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h
index b36287276aa..d72379022bb 100644
--- a/gcc/config/sh/sh.h
+++ b/gcc/config/sh/sh.h
@@ -1932,19 +1932,27 @@ struct sh_args {
like shad and shld. */
#define TARGET_DYNSHIFT (TARGET_SH3 || TARGET_SH2A)
-#define SH_DYNAMIC_SHIFT_COST \
- (TARGET_HARD_SH4 ? 1 : TARGET_DYNSHIFT ? (optimize_size ? 1 : 2) : 20)
-
-/* Immediate shift counts are truncated by the output routines (or was it
- the assembler?). Shift counts in a register are truncated by SH. Note
- that the native compiler puts too large (> 32) immediate shift counts
- into a register and shifts by the register, letting the SH decide what
- to do instead of doing that itself. */
-/* ??? The library routines in lib1funcs.S truncate the shift count.
- However, the SH3 has hardware shifts that do not truncate exactly as gcc
- expects - the sign bit is significant - so it appears that we need to
- leave this zero for correct SH3 code. */
-#define SHIFT_COUNT_TRUNCATED (! TARGET_SH3 && ! TARGET_SH2A)
+/* The cost of using the dynamic shift insns (shad, shld) are the same
+ if they are available. If they are not available a library function will
+ be emitted instead, which is more expensive. */
+#define SH_DYNAMIC_SHIFT_COST (TARGET_DYNSHIFT ? 1 : 20)
+
+/* Defining SHIFT_COUNT_TRUNCATED tells the combine pass that code like
+ (X << (Y % 32)) for register X, Y is equivalent to (X << Y).
+ This is not generally true when hardware dynamic shifts (shad, shld) are
+ used, because they check the sign bit _before_ the modulo op. The sign
+ bit determines whether it is a left shift or a right shift:
+ if (Y < 0)
+ return X << (Y & 31);
+ else
+ return X >> (-Y) & 31);
+
+ The dynamic shift library routines in lib1funcs.S do not use the sign bit
+ like the hardware dynamic shifts and truncate the shift count to 31.
+ We define SHIFT_COUNT_TRUNCATED to 0 and express the implied shift count
+ truncation in the library function call patterns, as this gives slightly
+ more compact code. */
+#define SHIFT_COUNT_TRUNCATED (0)
/* CANONICALIZE_COMPARISON macro for the combine pass. */
#define CANONICALIZE_COMPARISON(CODE, OP0, OP1) \
diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md
index 8b44fbda496..c510629c553 100644
--- a/gcc/config/sh/sh.md
+++ b/gcc/config/sh/sh.md
@@ -4023,6 +4023,17 @@ label:
operands[2]));
DONE;
}
+
+ /* Expand a library call for the dynamic shift. */
+ if (!CONST_INT_P (operands[2]) && !TARGET_DYNSHIFT)
+ {
+ emit_move_insn (gen_rtx_REG (SImode, R4_REG), operands[1]);
+ rtx funcaddr = gen_reg_rtx (Pmode);
+ function_symbol (funcaddr, "__ashlsi3_r0", SFUNC_STATIC);
+ emit_insn (gen_ashlsi3_d_call (operands[0], operands[2], funcaddr));
+
+ DONE;
+ }
})
(define_insn "ashlsi3_k"
@@ -4067,6 +4078,23 @@ label:
}
[(set_attr "type" "dyn_shift")])
+;; If dynamic shifts are not available use a library function.
+;; By specifying the pattern we reduce the number of call clobbered regs.
+;; In order to make combine understand the truncation of the shift amount
+;; operand we have to allow it to use pseudo regs for the shift operands.
+(define_insn "ashlsi3_d_call"
+ [(set (match_operand:SI 0 "arith_reg_dest" "=z")
+ (ashift:SI (reg:SI R4_REG)
+ (and:SI (match_operand:SI 1 "arith_reg_operand" "z")
+ (const_int 31))))
+ (use (match_operand:SI 2 "arith_reg_operand" "r"))
+ (clobber (reg:SI T_REG))
+ (clobber (reg:SI PR_REG))]
+ "TARGET_SH1 && !TARGET_DYNSHIFT"
+ "jsr @%2%#"
+ [(set_attr "type" "sfunc")
+ (set_attr "needs_delay_slot" "yes")])
+
(define_insn_and_split "ashlsi3_n"
[(set (match_operand:SI 0 "arith_reg_dest" "=r")
(ashift:SI (match_operand:SI 1 "arith_reg_operand" "0")
@@ -4512,6 +4540,16 @@ label:
operands[2]));
DONE;
}
+
+ /* Expand a library call for the dynamic shift. */
+ if (!CONST_INT_P (operands[2]) && !TARGET_DYNSHIFT)
+ {
+ emit_move_insn (gen_rtx_REG (SImode, R4_REG), operands[1]);
+ rtx funcaddr = gen_reg_rtx (Pmode);
+ function_symbol (funcaddr, "__lshrsi3_r0", SFUNC_STATIC);
+ emit_insn (gen_lshrsi3_d_call (operands[0], operands[2], funcaddr));
+ DONE;
+ }
})
(define_insn "lshrsi3_k"
@@ -4556,6 +4594,23 @@ label:
}
[(set_attr "type" "dyn_shift")])
+;; If dynamic shifts are not available use a library function.
+;; By specifying the pattern we reduce the number of call clobbered regs.
+;; In order to make combine understand the truncation of the shift amount
+;; operand we have to allow it to use pseudo regs for the shift operands.
+(define_insn "lshrsi3_d_call"
+ [(set (match_operand:SI 0 "arith_reg_dest" "=z")
+ (lshiftrt:SI (reg:SI R4_REG)
+ (and:SI (match_operand:SI 1 "arith_reg_operand" "z")
+ (const_int 31))))
+ (use (match_operand:SI 2 "arith_reg_operand" "r"))
+ (clobber (reg:SI T_REG))
+ (clobber (reg:SI PR_REG))]
+ "TARGET_SH1 && !TARGET_DYNSHIFT"
+ "jsr @%2%#"
+ [(set_attr "type" "sfunc")
+ (set_attr "needs_delay_slot" "yes")])
+
(define_insn_and_split "lshrsi3_n"
[(set (match_operand:SI 0 "arith_reg_dest" "=r")
(lshiftrt:SI (match_operand:SI 1 "arith_reg_operand" "0")
@@ -9280,7 +9335,7 @@ label:
[(return)]
""
{
- sh_expand_epilogue (1);
+ sh_expand_epilogue (true);
if (TARGET_SHCOMPACT)
{
rtx insn, set;
@@ -10099,9 +10154,13 @@ label:
}
[(set_attr "type" "load_media")])
+(define_expand "simple_return"
+ [(simple_return)]
+ "sh_can_use_simple_return_p ()")
+
(define_expand "return"
[(return)]
- "reload_completed && ! sh_need_epilogue ()"
+ "reload_completed && epilogue_completed"
{
if (TARGET_SHMEDIA)
{
@@ -10117,8 +10176,8 @@ label:
}
})
-(define_insn "*return_i"
- [(return)]
+(define_insn "*<code>_i"
+ [(any_return)]
"TARGET_SH1 && ! (TARGET_SHCOMPACT
&& (crtl->args.info.call_cookie
& CALL_COOKIE_RET_TRAMP (1)))
@@ -10244,19 +10303,12 @@ label:
(define_expand "prologue"
[(const_int 0)]
""
-{
- sh_expand_prologue ();
- DONE;
-})
+ "sh_expand_prologue (); DONE;")
(define_expand "epilogue"
[(return)]
""
-{
- sh_expand_epilogue (0);
- emit_jump_insn (gen_return ());
- DONE;
-})
+ "sh_expand_epilogue (false);")
(define_expand "eh_return"
[(use (match_operand 0 "register_operand" ""))]
diff --git a/gcc/config/sparc/predicates.md b/gcc/config/sparc/predicates.md
index 308fbd6bb74..326524b9374 100644
--- a/gcc/config/sparc/predicates.md
+++ b/gcc/config/sparc/predicates.md
@@ -357,7 +357,7 @@
(define_predicate "arith_add_operand"
(ior (match_operand 0 "arith_operand")
(match_operand 0 "const_4096_operand")))
-
+
;; Return true if OP is suitable as second double operand for add/sub.
(define_predicate "arith_double_add_operand"
(match_code "const_int,const_double,reg,subreg")
@@ -427,6 +427,7 @@
/* Allow any 1-instruction integer constant. */
if (mclass == MODE_INT
+ && mode != TImode
&& (small_int_operand (op, mode) || const_high_operand (op, mode)))
return true;
@@ -440,12 +441,10 @@
if (mclass == MODE_FLOAT && GET_CODE (op) == CONST_DOUBLE)
return true;
- if (mclass == MODE_VECTOR_INT && GET_CODE (op) == CONST_VECTOR
- && (const_zero_operand (op, mode)
- || const_all_ones_operand (op, mode)))
+ if (mclass == MODE_VECTOR_INT && const_all_ones_operand (op, mode))
return true;
- if (register_operand (op, mode))
+ if (register_or_zero_operand (op, mode))
return true;
/* If this is a SUBREG, look inside so that we handle paradoxical ones. */
diff --git a/gcc/config/sparc/sparc-protos.h b/gcc/config/sparc/sparc-protos.h
index b03f5cc5858..97f6233d392 100644
--- a/gcc/config/sparc/sparc-protos.h
+++ b/gcc/config/sparc/sparc-protos.h
@@ -82,11 +82,6 @@ extern const char *output_probe_stack_range (rtx, rtx);
extern bool emit_scc_insn (rtx []);
extern void emit_conditional_branch_insn (rtx []);
extern int mems_ok_for_ldd_peep (rtx, rtx, rtx);
-extern int arith_double_4096_operand (rtx, enum machine_mode);
-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 empty_delay_slot (rtx);
extern int eligible_for_return_delay (rtx);
extern int eligible_for_sibcall_delay (rtx);
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index fff17de9e67..ca234a23576 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -1465,6 +1465,18 @@ sparc_expand_move (enum machine_mode mode, rtx *operands)
sparc_emit_set_const64 (operands[0], operands[1]);
return true;
+ case TImode:
+ {
+ rtx high, low;
+ /* TImode isn't available in 32-bit mode. */
+ split_double (operands[1], &high, &low);
+ emit_insn (gen_movdi (operand_subword (operands[0], 0, 0, TImode),
+ high));
+ emit_insn (gen_movdi (operand_subword (operands[0], 1, 0, TImode),
+ low));
+ }
+ return true;
+
default:
gcc_unreachable ();
}
@@ -3492,6 +3504,10 @@ sparc_legitimate_address_p (enum machine_mode mode, rtx addr, bool strict)
&& ! (TARGET_ARCH64 && TARGET_HARD_QUAD))
return 0;
+ /* Likewise for TImode, but in all cases. */
+ if (mode == TImode)
+ return 0;
+
/* We prohibit REG + REG on ARCH32 if not optimizing for
DFmode/DImode because then mem_min_alignment is likely to be zero
after reload and the forced split would lack a matching splitter
diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md
index 8f19efab45d..3e854616a0a 100644
--- a/gcc/config/sparc/sparc.md
+++ b/gcc/config/sparc/sparc.md
@@ -2034,6 +2034,164 @@
DONE;
})
+(define_expand "movti"
+ [(set (match_operand:TI 0 "nonimmediate_operand" "")
+ (match_operand:TI 1 "general_operand" ""))]
+ "TARGET_ARCH64"
+{
+ if (sparc_expand_move (TImode, operands))
+ DONE;
+})
+
+;; We need to prevent reload from splitting TImode moves, because it
+;; might decide to overwrite a pointer with the value it points to.
+;; In that case we have to do the loads in the appropriate order so
+;; that the pointer is not destroyed too early.
+
+(define_insn "*movti_insn_sp64"
+ [(set (match_operand:TI 0 "nonimmediate_operand" "=r , o,?*e,?o,b")
+ (match_operand:TI 1 "input_operand" "roJ,rJ, eo, e,J"))]
+ "TARGET_ARCH64
+ && ! TARGET_HARD_QUAD
+ && (register_operand (operands[0], TImode)
+ || register_or_zero_operand (operands[1], TImode))"
+ "#"
+ [(set_attr "length" "2,2,2,2,2")
+ (set_attr "cpu_feature" "*,*,fpu,fpu,vis")])
+
+(define_insn "*movti_insn_sp64_hq"
+ [(set (match_operand:TI 0 "nonimmediate_operand" "=r , o,?*e,?*e,?m,b")
+ (match_operand:TI 1 "input_operand" "roJ,rJ, e, m, e,J"))]
+ "TARGET_ARCH64
+ && TARGET_HARD_QUAD
+ && (register_operand (operands[0], TImode)
+ || register_or_zero_operand (operands[1], TImode))"
+ "@
+ #
+ #
+ fmovq\t%1, %0
+ ldq\t%1, %0
+ stq\t%1, %0
+ #"
+ [(set_attr "type" "*,*,fpmove,fpload,fpstore,*")
+ (set_attr "length" "2,2,*,*,*,2")])
+
+;; Now all the splits to handle multi-insn TI mode moves.
+(define_split
+ [(set (match_operand:TI 0 "register_operand" "")
+ (match_operand:TI 1 "register_operand" ""))]
+ "reload_completed
+ && ((TARGET_FPU
+ && ! TARGET_HARD_QUAD)
+ || (! fp_register_operand (operands[0], TImode)
+ && ! fp_register_operand (operands[1], TImode)))"
+ [(clobber (const_int 0))]
+{
+ rtx set_dest = operands[0];
+ rtx set_src = operands[1];
+ rtx dest1, dest2;
+ rtx src1, src2;
+
+ dest1 = gen_highpart (DImode, set_dest);
+ dest2 = gen_lowpart (DImode, set_dest);
+ src1 = gen_highpart (DImode, set_src);
+ src2 = gen_lowpart (DImode, set_src);
+
+ /* Now emit using the real source and destination we found, swapping
+ the order if we detect overlap. */
+ if (reg_overlap_mentioned_p (dest1, src2))
+ {
+ emit_insn (gen_movdi (dest2, src2));
+ emit_insn (gen_movdi (dest1, src1));
+ }
+ else
+ {
+ emit_insn (gen_movdi (dest1, src1));
+ emit_insn (gen_movdi (dest2, src2));
+ }
+ DONE;
+})
+
+(define_split
+ [(set (match_operand:TI 0 "nonimmediate_operand" "")
+ (match_operand:TI 1 "const_zero_operand" ""))]
+ "reload_completed"
+ [(clobber (const_int 0))]
+{
+ rtx set_dest = operands[0];
+ rtx dest1, dest2;
+
+ switch (GET_CODE (set_dest))
+ {
+ case REG:
+ dest1 = gen_highpart (DImode, set_dest);
+ dest2 = gen_lowpart (DImode, set_dest);
+ break;
+ case MEM:
+ dest1 = adjust_address (set_dest, DImode, 0);
+ dest2 = adjust_address (set_dest, DImode, 8);
+ break;
+ default:
+ gcc_unreachable ();
+ }
+
+ emit_insn (gen_movdi (dest1, const0_rtx));
+ emit_insn (gen_movdi (dest2, const0_rtx));
+ DONE;
+})
+
+(define_split
+ [(set (match_operand:TI 0 "register_operand" "")
+ (match_operand:TI 1 "memory_operand" ""))]
+ "reload_completed
+ && offsettable_memref_p (operands[1])
+ && (! TARGET_HARD_QUAD
+ || ! fp_register_operand (operands[0], TImode))"
+ [(clobber (const_int 0))]
+{
+ rtx word0 = adjust_address (operands[1], DImode, 0);
+ rtx word1 = adjust_address (operands[1], DImode, 8);
+ rtx set_dest, dest1, dest2;
+
+ set_dest = operands[0];
+
+ dest1 = gen_highpart (DImode, set_dest);
+ dest2 = gen_lowpart (DImode, set_dest);
+
+ /* Now output, ordering such that we don't clobber any registers
+ mentioned in the address. */
+ if (reg_overlap_mentioned_p (dest1, word1))
+
+ {
+ emit_insn (gen_movdi (dest2, word1));
+ emit_insn (gen_movdi (dest1, word0));
+ }
+ else
+ {
+ emit_insn (gen_movdi (dest1, word0));
+ emit_insn (gen_movdi (dest2, word1));
+ }
+ DONE;
+})
+
+(define_split
+ [(set (match_operand:TI 0 "memory_operand" "")
+ (match_operand:TI 1 "register_operand" ""))]
+ "reload_completed
+ && offsettable_memref_p (operands[0])
+ && (! TARGET_HARD_QUAD
+ || ! fp_register_operand (operands[1], TImode))"
+ [(clobber (const_int 0))]
+{
+ rtx set_src = operands[1];
+
+ emit_insn (gen_movdi (adjust_address (operands[0], DImode, 0),
+ gen_highpart (DImode, set_src)));
+ emit_insn (gen_movdi (adjust_address (operands[0], DImode, 8),
+ gen_lowpart (DImode, set_src)));
+ DONE;
+})
+
;; Floating point move instructions
@@ -2477,7 +2635,7 @@
dest2 = adjust_address (set_dest, DFmode, 8);
break;
default:
- gcc_unreachable ();
+ gcc_unreachable ();
}
emit_insn (gen_movdf (dest1, CONST0_RTX (DFmode)));
diff --git a/gcc/configure b/gcc/configure
index 5bb409a3b4d..b656d9e5266 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -4863,10 +4863,12 @@ fi
# optimizations to be activated explicitly by the toplevel.
case "$CC" in
*/prev-gcc/xgcc*) ;;
- *) CFLAGS=`echo $CFLAGS | sed "s/-O[s0-9]* *//" ` ;;
+ *) CFLAGS=`echo $CFLAGS | sed "s/-O[s0-9]* *//" `
+ CXXFLAGS=`echo $CXXFLAGS | sed "s/-O[s0-9]* *//" ` ;;
esac
+
# Determine PICFLAG for target gnatlib.
@@ -10731,6 +10733,46 @@ $as_echo "#define HAVE_CLOCK_T 1" >>confdefs.h
fi
+# Check if F_SETLKW is supported by fcntl.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for F_SETLKW" >&5
+$as_echo_n "checking for F_SETLKW... " >&6; }
+if test "${ac_cv_f_setlkw+set}" = set; then :
+ $as_echo_n "(cached) " >&6
+else
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+#include <fcntl.h>
+int
+main ()
+{
+
+struct flock fl;
+fl.l_whence = 0;
+fl.l_start = 0;
+fl.l_len = 0;
+fl.l_pid = 0;
+return fcntl (1, F_SETLKW, &fl);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_cv_f_setlkw=yes
+else
+ ac_cv_f_setlkw=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f_setlkw" >&5
+$as_echo "$ac_cv_f_setlkw" >&6; }
+if test $ac_cv_f_setlkw = yes; then
+
+$as_echo "#define HOST_HAS_F_SETLKW 1" >>confdefs.h
+
+fi
+
# Restore CFLAGS, CXXFLAGS from before the gcc_AC_NEED_DECLARATIONS tests.
CFLAGS="$saved_CFLAGS"
CXXFLAGS="$saved_CXXFLAGS"
@@ -14796,6 +14838,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
fi
+ lt_prog_compiler_pic='-fPIC'
;;
amigaos*)
@@ -17742,7 +17785,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 17745 "configure"
+#line 17788 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -17848,7 +17891,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 17851 "configure"
+#line 17894 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -19645,6 +19688,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static_CXX='-Bstatic'
fi
+ lt_prog_compiler_pic_CXX='-fPIC'
;;
amigaos*)
diff --git a/gcc/configure.ac b/gcc/configure.ac
index 699c7904f7c..5a260228973 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -296,9 +296,11 @@ AC_SUBST(OUTPUT_OPTION)
# optimizations to be activated explicitly by the toplevel.
case "$CC" in
*/prev-gcc/xgcc*) ;;
- *) CFLAGS=`echo $CFLAGS | sed "s/-O[[s0-9]]* *//" ` ;;
+ *) CFLAGS=`echo $CFLAGS | sed "s/-O[[s0-9]]* *//" `
+ CXXFLAGS=`echo $CXXFLAGS | sed "s/-O[[s0-9]]* *//" ` ;;
esac
AC_SUBST(CFLAGS)
+AC_SUBST(CXXFLAGS)
# Determine PICFLAG for target gnatlib.
GCC_PICFLAG_FOR_TARGET
@@ -1159,6 +1161,22 @@ if test $gcc_cv_type_clock_t = yes; then
[Define if <time.h> defines clock_t.])
fi
+# Check if F_SETLKW is supported by fcntl.
+AC_CACHE_CHECK(for F_SETLKW, ac_cv_f_setlkw, [
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <fcntl.h>]], [[
+struct flock fl;
+fl.l_whence = 0;
+fl.l_start = 0;
+fl.l_len = 0;
+fl.l_pid = 0;
+return fcntl (1, F_SETLKW, &fl);]])],
+[ac_cv_f_setlkw=yes],[ac_cv_f_setlkw=no])])
+if test $ac_cv_f_setlkw = yes; then
+ AC_DEFINE(HOST_HAS_F_SETLKW, 1,
+ [Define if F_SETLKW supported by fcntl.])
+fi
+
# Restore CFLAGS, CXXFLAGS from before the gcc_AC_NEED_DECLARATIONS tests.
CFLAGS="$saved_CFLAGS"
CXXFLAGS="$saved_CXXFLAGS"
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 371fdfe152e..f70b46673b3 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,8 +1,105 @@
+2012-09-14 Marc Glisse <marc.glisse@inria.fr>
+
+ PR c++/54427
+ * typeck.c (cp_build_binary_op) [LSHIFT_EXPR, RSHIFT_EXPR, EQ_EXPR,
+ NE_EXPR, LE_EXPR, GE_EXPR, LT_EXPR, GT_EXPR]: Handle VECTOR_TYPE.
+
+2012-09-14 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * decl.c (make_typename_type): Only error out if tf_error is set
+ in complain.
+
+2012-09-13 Paolo Carlini <paolo.carlini@oracle.com>
+ Manuel López-Ibáñez <manu@gcc.gnu.org>
+
+ PR c++/53210
+ * init.c (perform_member_init): Use OPT_Winit_self instead of
+ OPT_Wuninitialized.
+
+2012-09-13 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * typeck.c (build_indirect_ref, build_function_call,
+ build_function_call_vec, build_binary_op, build_unary_op,
+ build_compound_expr, build_c_cast, build_modify_expr): Remove
+ uses of ATTRIBUTE_UNUSED on the parameters.
+ * class.c (set_linkage_according_to_type, resort_type_method_vec,
+ dfs_find_final_overrider_post, empty_base_at_nonzero_offset_p):
+ Likewise.
+ * decl.c (local_variable_p_walkfn): Likewise.
+ * except.c (wrap_cleanups_r, check_noexcept_r): Likewise.
+ * error.c (find_typenames_r): Likewise.
+ * tree.c (verify_stmt_tree_r, bot_replace,
+ handle_java_interface_attribute, handle_com_interface_attribute,
+ handle_init_priority_attribute, c_register_addr_space): Likewise.
+ * cp-gimplify.c (cxx_omp_clause_default_ctor): Likewise.
+ * cp-lang.c (objcp_tsubst_copy_and_build): Likewise.
+ * pt.c (unify_success, unify_invalid, instantiation_dependent_r):
+ Likewise.
+ * semantics.c (dfs_calculate_bases_pre): Likewise.
+ * decl2.c (fix_temporary_vars_context_r, clear_decl_external):
+ Likewise.
+ * parser.c (cp_lexer_token_at, cp_parser_omp_clause_mergeable,
+ cp_parser_omp_clause_nowait, cp_parser_omp_clause_ordered,
+ cp_parser_omp_clause_untied): Likewise.
+ * mangle.c (write_unnamed_type_name,
+ discriminator_for_string_literal): Likewise.
+ * search.c (dfs_accessible_post, dfs_debug_mark): Likewise.
+ * lex.c (handle_pragma_vtable, handle_pragma_unit,
+ handle_pragma_interface, handle_pragma_implementation,
+ handle_pragma_java_exceptions): Likewise.
+
+2012-09-13 Jason Merrill <jason@redhat.com>
+
+ PR c++/53839
+ * semantics.c (cxx_eval_indirect_ref): If we aren't looking for an
+ address, make sure the value is constant.
+
+ PR c++/54511
+ * pt.c (tsubst_decl) [VAR_DECL]: Handle DECL_ANON_UNION_VAR_P.
+
+ PR c++/53836
+ * pt.c (value_dependent_expression_p): A TREE_LIST initializer must
+ be dependent.
+
+2012-09-10 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/54541
+ PR c++/54542
+ * call.c (build_cxx_call): Add tsubst_flags_t parameter, use
+ require_complete_type_sfinae.
+ (build_op_delete_call, build_over_call): Adjust.
+ * typeck.c (build_x_compound_expr_from_vec): Add tsubst_flags_t
+ parameter.
+ (cp_build_function_call_vec): Adjust.
+ * init.c (build_new_1): Likewise.
+ * rtti.c (throw_bad_cast, throw_bad_typeid, build_dynamic_cast_1):
+ Likewise.
+ * optimize.c (build_delete_destructor_body): Likewise.
+ * cp-tree.h: Adjust declarations.
+
+ * call.c (convert_arg_to_ellipsis): Use require_complete_type_sfinae.
+
+2012-09-10 Jason Merrill <jason@redhat.com>
+
+ PR c++/54538
+ PR c++/53783
+ * pt.c (tsubst_copy_and_build) [LAMBDA_EXPR]: Go back to using RECUR
+ for LAMBDA_EXPR_EXTRA_SCOPE except for function scope.
+
+ PR c++/54506
+ * decl.c (move_signature_fn_p): Split out from move_fn_p.
+ * method.c (process_subob_fn): Use it.
+ * cp-tree.h: Declare it.
+
+2012-09-07 Jason Merrill <jason@redhat.com>
+
+ * semantics.c (sort_constexpr_mem_initializers): Tweak.
+
2012-09-09 Mark Kettenis <kettenis@openbsd.org>
* decl.c (reshape_init_class): Avoid dereferencing a
past-the-end pointer.
-
+
2012-09-07 Paolo Carlini <paolo.carlini@oracle.com>
* pt.c (num_template_headers_for_class): Rework per the code
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 159be6b7bca..6f7e34669ce 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -5525,7 +5525,7 @@ build_op_delete_call (enum tree_code code, tree addr, tree size,
for (i = 1; i < nargs; i++)
argarray[i] = CALL_EXPR_ARG (placement, i);
mark_used (fn);
- return build_cxx_call (fn, nargs, argarray);
+ return build_cxx_call (fn, nargs, argarray, complain);
}
else
{
@@ -6127,12 +6127,12 @@ convert_arg_to_ellipsis (tree arg, tsubst_flags_t complain)
arg = cp_perform_integral_promotions (arg, complain);
}
- arg = require_complete_type (arg);
+ arg = require_complete_type_sfinae (arg, complain);
arg_type = TREE_TYPE (arg);
if (arg != error_mark_node
/* In a template (or ill-formed code), we can have an incomplete type
- even after require_complete_type, in which case we don't know
+ even after require_complete_type_sfinae, in which case we don't know
whether it has trivial copy or not. */
&& COMPLETE_TYPE_P (arg_type))
{
@@ -6882,7 +6882,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
return error_mark_node;
}
- return build_cxx_call (fn, nargs, argarray);
+ return build_cxx_call (fn, nargs, argarray, complain);
}
/* Build and return a call to FN, using NARGS arguments in ARGARRAY.
@@ -6890,7 +6890,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
high-level operations. */
tree
-build_cxx_call (tree fn, int nargs, tree *argarray)
+build_cxx_call (tree fn, int nargs, tree *argarray,
+ tsubst_flags_t complain)
{
tree fndecl;
int optimize_sav;
@@ -6923,12 +6924,12 @@ build_cxx_call (tree fn, int nargs, tree *argarray)
if (VOID_TYPE_P (TREE_TYPE (fn)))
return fn;
- fn = require_complete_type (fn);
+ fn = require_complete_type_sfinae (fn, complain);
if (fn == error_mark_node)
return error_mark_node;
if (MAYBE_CLASS_TYPE_P (TREE_TYPE (fn)))
- fn = build_cplus_new (TREE_TYPE (fn), fn, tf_warning_or_error);
+ fn = build_cplus_new (TREE_TYPE (fn), fn, complain);
return convert_from_reference (fn);
}
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 13d9c768509..8de142347f4 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -711,7 +711,7 @@ get_vtable_name (tree type)
the abstract. */
void
-set_linkage_according_to_type (tree type ATTRIBUTE_UNUSED, tree decl)
+set_linkage_according_to_type (tree /*type*/, tree decl)
{
TREE_PUBLIC (decl) = 1;
determine_visibility (decl);
@@ -1820,7 +1820,7 @@ resort_method_name_cmp (const void* m1_p, const void* m2_p)
void
resort_type_method_vec (void* obj,
- void* orig_obj ATTRIBUTE_UNUSED ,
+ void* /*orig_obj*/,
gt_pointer_operator new_value,
void* cookie)
{
@@ -2039,7 +2039,7 @@ dfs_find_final_overrider_pre (tree binfo, void *data)
}
static tree
-dfs_find_final_overrider_post (tree binfo ATTRIBUTE_UNUSED, void *data)
+dfs_find_final_overrider_post (tree /*binfo*/, void *data)
{
find_final_overrider_data *ffod = (find_final_overrider_data *) data;
VEC_pop (tree, ffod->path);
@@ -3771,7 +3771,7 @@ layout_nonempty_base_or_field (record_layout_info rli,
static int
empty_base_at_nonzero_offset_p (tree type,
tree offset,
- splay_tree offsets ATTRIBUTE_UNUSED)
+ splay_tree /*offsets*/)
{
return is_empty_class (type) && !integer_zerop (offset);
}
@@ -8835,11 +8835,9 @@ add_vcall_offset (tree orig_fn, tree binfo, vtbl_init_data *vid)
offset. */
if (vid->binfo == TYPE_BINFO (vid->derived))
{
- tree_pair_p elt = VEC_safe_push (tree_pair_s, gc,
- CLASSTYPE_VCALL_INDICES (vid->derived),
- NULL);
- elt->purpose = orig_fn;
- elt->value = vid->index;
+ tree_pair_s elt = {orig_fn, vid->index};
+ VEC_safe_push (tree_pair_s, gc, CLASSTYPE_VCALL_INDICES (vid->derived),
+ elt);
}
/* The next vcall offset will be found at a more negative
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index c3d1f23184b..dd2ef067c8f 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -1318,8 +1318,7 @@ cxx_omp_clause_apply_fn (tree fn, tree arg1, tree arg2)
NULL if there's nothing to do. */
tree
-cxx_omp_clause_default_ctor (tree clause, tree decl,
- tree outer ATTRIBUTE_UNUSED)
+cxx_omp_clause_default_ctor (tree clause, tree decl, tree /*outer*/)
{
tree info = CP_OMP_CLAUSE_INFO (clause);
tree ret = NULL;
diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c
index 0e90ab2a80d..54e03946acd 100644
--- a/gcc/cp/cp-lang.c
+++ b/gcc/cp/cp-lang.c
@@ -92,11 +92,11 @@ struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
/* The following function does something real, but only in Objective-C++. */
tree
-objcp_tsubst_copy_and_build (tree t ATTRIBUTE_UNUSED,
- tree args ATTRIBUTE_UNUSED,
- tsubst_flags_t complain ATTRIBUTE_UNUSED,
- tree in_decl ATTRIBUTE_UNUSED,
- bool function_p ATTRIBUTE_UNUSED)
+objcp_tsubst_copy_and_build (tree /*t*/,
+ tree /*args*/,
+ tsubst_flags_t /*complain*/,
+ tree /*in_decl*/,
+ bool /*function_p*/)
{
return NULL_TREE;
}
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 3e0fc3f1ebc..ded247d93d1 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -4918,7 +4918,8 @@ extern tree build_integral_nontype_arg_conv (tree, tree, tsubst_flags_t);
extern tree perform_direct_initialization_if_possible (tree, tree, bool,
tsubst_flags_t);
extern tree in_charge_arg_for_name (tree);
-extern tree build_cxx_call (tree, int, tree *);
+extern tree build_cxx_call (tree, int, tree *,
+ tsubst_flags_t);
extern bool is_std_init_list (tree);
extern bool is_list_ctor (tree);
#ifdef ENABLE_CHECKING
@@ -5066,6 +5067,7 @@ extern tree build_ptrmem_type (tree, tree);
extern tree build_this_parm (tree, cp_cv_quals);
extern int copy_fn_p (const_tree);
extern bool move_fn_p (const_tree);
+extern bool move_signature_fn_p (const_tree);
extern tree get_scope_of_declarator (const cp_declarator *);
extern void grok_special_member_properties (tree);
extern int grok_ctor_properties (const_tree, const_tree);
@@ -5850,7 +5852,8 @@ extern tree build_x_conditional_expr (location_t, tree, tree, tree,
tsubst_flags_t);
extern tree build_x_compound_expr_from_list (tree, expr_list_kind,
tsubst_flags_t);
-extern tree build_x_compound_expr_from_vec (VEC(tree,gc) *, const char *);
+extern tree build_x_compound_expr_from_vec (VEC(tree,gc) *, const char *,
+ tsubst_flags_t);
extern tree build_x_compound_expr (location_t, tree, tree,
tsubst_flags_t);
extern tree build_compound_expr (location_t, tree, tree);
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 7655f78729a..6b5b986fee7 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -2639,16 +2639,16 @@ tree
declare_local_label (tree id)
{
tree decl;
- cp_label_binding *bind;
+ cp_label_binding bind;
/* Add a new entry to the SHADOWED_LABELS list so that when we leave
this scope we can restore the old value of IDENTIFIER_TYPE_VALUE. */
- bind = VEC_safe_push (cp_label_binding, gc,
- current_binding_level->shadowed_labels, NULL);
- bind->prev_value = IDENTIFIER_LABEL_VALUE (id);
+ bind.prev_value = IDENTIFIER_LABEL_VALUE (id);
decl = make_label_decl (id, /*local_p=*/1);
- bind->label = decl;
+ bind.label = decl;
+ VEC_safe_push (cp_label_binding, gc, current_binding_level->shadowed_labels,
+ bind);
return decl;
}
@@ -3235,13 +3235,15 @@ make_typename_type (tree context, tree name, enum tag_types tag_type,
name = TREE_OPERAND (fullname, 0) = DECL_NAME (name);
else if (TREE_CODE (name) == OVERLOAD)
{
- error ("%qD is not a type", name);
+ if (complain & tf_error)
+ error ("%qD is not a type", name);
return error_mark_node;
}
}
if (TREE_CODE (name) == TEMPLATE_DECL)
{
- error ("%qD used without template parameters", name);
+ if (complain & tf_error)
+ error ("%qD used without template parameters", name);
return error_mark_node;
}
gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
@@ -10536,7 +10538,7 @@ local_variable_p (const_tree t)
static tree
local_variable_p_walkfn (tree *tp, int *walk_subtrees,
- void *data ATTRIBUTE_UNUSED)
+ void * /*data*/)
{
/* Check DECL_NAME to avoid including temporaries. We don't check
DECL_ARTIFICIAL because we do want to complain about 'this'. */
@@ -10859,10 +10861,6 @@ copy_fn_p (const_tree d)
bool
move_fn_p (const_tree d)
{
- tree args;
- tree arg_type;
- bool result = false;
-
gcc_assert (DECL_FUNCTION_MEMBER_P (d));
if (cxx_dialect == cxx98)
@@ -10872,12 +10870,29 @@ move_fn_p (const_tree d)
if (TREE_CODE (d) == TEMPLATE_DECL
|| (DECL_TEMPLATE_INFO (d)
&& DECL_MEMBER_TEMPLATE_P (DECL_TI_TEMPLATE (d))))
- /* Instantiations of template member functions are never copy
+ /* Instantiations of template member functions are never move
functions. Note that member functions of templated classes are
represented as template functions internally, and we must
- accept those as copy functions. */
+ accept those as move functions. */
return 0;
+ return move_signature_fn_p (d);
+}
+
+/* D is a constructor or overloaded `operator='.
+
+ Then, this function returns true when D has the same signature as a move
+ constructor or move assignment operator (because either it is such a
+ ctor/op= or it is a template specialization with the same signature),
+ false otherwise. */
+
+bool
+move_signature_fn_p (const_tree d)
+{
+ tree args;
+ tree arg_type;
+ bool result = false;
+
args = FUNCTION_FIRST_USER_PARMTYPE (d);
if (!args)
return 0;
@@ -13769,10 +13784,8 @@ maybe_register_incomplete_var (tree var)
|| (TYPE_LANG_SPECIFIC (inner_type)
&& TYPE_BEING_DEFINED (inner_type)))
{
- incomplete_var *iv
- = VEC_safe_push (incomplete_var, gc, incomplete_vars, NULL);
- iv->decl = var;
- iv->incomplete_type = inner_type;
+ incomplete_var iv = {var, inner_type};
+ VEC_safe_push (incomplete_var, gc, incomplete_vars, iv);
}
}
}
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index f76b59605ae..0df461340bc 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -3037,8 +3037,8 @@ get_priority_info (int priority)
it's DECL_CONTECT() properly set. */
static tree
fix_temporary_vars_context_r (tree *node,
- int *unused ATTRIBUTE_UNUSED,
- void *unused1 ATTRIBUTE_UNUSED)
+ int * /*unused*/,
+ void * /*unused1*/)
{
gcc_assert (current_function_decl);
@@ -3656,7 +3656,7 @@ collect_all_refs (const char *source_file)
/* Clear DECL_EXTERNAL for NODE. */
static bool
-clear_decl_external (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
+clear_decl_external (struct cgraph_node *node, void * /*data*/)
{
DECL_EXTERNAL (node->symbol.decl) = 0;
return false;
diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index 1872d01a249..30fa0182a8f 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -1285,7 +1285,7 @@ struct find_typenames_t
};
static tree
-find_typenames_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data)
+find_typenames_r (tree *tp, int * /*walk_subtrees*/, void *data)
{
struct find_typenames_t *d = (struct find_typenames_t *)data;
tree mv = NULL_TREE;
diff --git a/gcc/cp/except.c b/gcc/cp/except.c
index ff967de37f7..ad49211b58b 100644
--- a/gcc/cp/except.c
+++ b/gcc/cp/except.c
@@ -671,8 +671,7 @@ do_free_exception (tree ptr)
Called from build_throw via walk_tree_without_duplicates. */
static tree
-wrap_cleanups_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
- void *data ATTRIBUTE_UNUSED)
+wrap_cleanups_r (tree *tp, int *walk_subtrees, void * /*data*/)
{
tree exp = *tp;
tree cleanup;
@@ -1129,8 +1128,7 @@ check_handlers (tree handlers)
expression whose type is a polymorphic class type (10.3). */
static tree
-check_noexcept_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
- void *data ATTRIBUTE_UNUSED)
+check_noexcept_r (tree *tp, int * /*walk_subtrees*/, void * /*data*/)
{
tree t = *tp;
enum tree_code code = TREE_CODE (t);
@@ -1249,11 +1247,8 @@ expr_noexcept_p (tree expr, tsubst_flags_t complain)
if (!DECL_INITIAL (fn))
{
/* Not defined yet; check again at EOF. */
- pending_noexcept *p
- = VEC_safe_push (pending_noexcept, gc,
- pending_noexcept_checks, NULL);
- p->fn = fn;
- p->loc = input_location;
+ pending_noexcept p = {fn, input_location};
+ VEC_safe_push (pending_noexcept, gc, pending_noexcept_checks, p);
}
else
maybe_noexcept_warning (fn);
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 561477ace57..d097443af55 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -253,21 +253,21 @@ build_zero_init_1 (tree type, tree nelts, bool static_storage_p,
have an upper bound of -1. */
if (!tree_int_cst_equal (max_index, integer_minus_one_node))
{
- constructor_elt *ce;
+ constructor_elt ce;
v = VEC_alloc (constructor_elt, gc, 1);
- ce = VEC_quick_push (constructor_elt, v, NULL);
/* If this is a one element array, we just use a regular init. */
if (tree_int_cst_equal (size_zero_node, max_index))
- ce->index = size_zero_node;
+ ce.index = size_zero_node;
else
- ce->index = build2 (RANGE_EXPR, sizetype, size_zero_node,
+ ce.index = build2 (RANGE_EXPR, sizetype, size_zero_node,
max_index);
- ce->value = build_zero_init_1 (TREE_TYPE (type),
+ ce.value = build_zero_init_1 (TREE_TYPE (type),
/*nelts=*/NULL_TREE,
static_storage_p, NULL_TREE);
+ VEC_quick_push (constructor_elt, v, ce);
}
/* Build a constructor to contain the initializations. */
@@ -448,28 +448,27 @@ build_value_init_noctor (tree type, tsubst_flags_t complain)
have an upper bound of -1. */
if (!tree_int_cst_equal (max_index, integer_minus_one_node))
{
- constructor_elt *ce;
+ constructor_elt ce;
v = VEC_alloc (constructor_elt, gc, 1);
- ce = VEC_quick_push (constructor_elt, v, NULL);
/* If this is a one element array, we just use a regular init. */
if (tree_int_cst_equal (size_zero_node, max_index))
- ce->index = size_zero_node;
+ ce.index = size_zero_node;
else
- ce->index = build2 (RANGE_EXPR, sizetype, size_zero_node,
- max_index);
+ ce.index = build2 (RANGE_EXPR, sizetype, size_zero_node, max_index);
- ce->value = build_value_init (TREE_TYPE (type), complain);
+ ce.value = build_value_init (TREE_TYPE (type), complain);
+ VEC_quick_push (constructor_elt, v, ce);
- if (ce->value == error_mark_node)
+ if (ce.value == error_mark_node)
return error_mark_node;
/* We shouldn't have gotten here for anything that would need
non-trivial initialization, and gimplify_init_ctor_preeval
would need to be fixed to allow it. */
- gcc_assert (TREE_CODE (ce->value) != TARGET_EXPR
- && TREE_CODE (ce->value) != AGGR_INIT_EXPR);
+ gcc_assert (TREE_CODE (ce.value) != TARGET_EXPR
+ && TREE_CODE (ce.value) != AGGR_INIT_EXPR);
}
/* Build a constructor to contain the initializations. */
@@ -579,7 +578,7 @@ perform_member_init (tree member, tree init)
if (TREE_CODE (val) == COMPONENT_REF && TREE_OPERAND (val, 1) == member
&& TREE_OPERAND (val, 0) == current_class_ref)
warning_at (DECL_SOURCE_LOCATION (current_function_decl),
- OPT_Wuninitialized, "%qD is initialized with itself",
+ OPT_Winit_self, "%qD is initialized with itself",
member);
}
@@ -2740,7 +2739,8 @@ build_new_1 (VEC(tree,gc) **placement, tree type, tree nelts,
/* We are processing something like `new int (10)', which
means allocate an int, and initialize it with 10. */
- ie = build_x_compound_expr_from_vec (*init, "new initializer");
+ ie = build_x_compound_expr_from_vec (*init, "new initializer",
+ complain);
init_expr = cp_build_modify_expr (init_expr, INIT_EXPR, ie,
complain);
}
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
index 54021f1e351..d4aebf75052 100644
--- a/gcc/cp/lex.c
+++ b/gcc/cp/lex.c
@@ -330,21 +330,21 @@ parse_strconst_pragma (const char* name, int opt)
}
static void
-handle_pragma_vtable (cpp_reader* dfile ATTRIBUTE_UNUSED )
+handle_pragma_vtable (cpp_reader* /*dfile*/)
{
parse_strconst_pragma ("vtable", 0);
sorry ("#pragma vtable no longer supported");
}
static void
-handle_pragma_unit (cpp_reader* dfile ATTRIBUTE_UNUSED )
+handle_pragma_unit (cpp_reader* /*dfile*/)
{
/* Validate syntax, but don't do anything. */
parse_strconst_pragma ("unit", 0);
}
static void
-handle_pragma_interface (cpp_reader* dfile ATTRIBUTE_UNUSED )
+handle_pragma_interface (cpp_reader* /*dfile*/)
{
tree fname = parse_strconst_pragma ("interface", 1);
struct c_fileinfo *finfo;
@@ -384,7 +384,7 @@ handle_pragma_interface (cpp_reader* dfile ATTRIBUTE_UNUSED )
any effect. */
static void
-handle_pragma_implementation (cpp_reader* dfile ATTRIBUTE_UNUSED )
+handle_pragma_implementation (cpp_reader* /*dfile*/)
{
tree fname = parse_strconst_pragma ("implementation", 1);
const char *filename;
@@ -425,7 +425,7 @@ handle_pragma_implementation (cpp_reader* dfile ATTRIBUTE_UNUSED )
/* Indicate that this file uses Java-personality exception handling. */
static void
-handle_pragma_java_exceptions (cpp_reader* dfile ATTRIBUTE_UNUSED)
+handle_pragma_java_exceptions (cpp_reader* /*dfile*/)
{
tree x;
if (pragma_lex (&x) != CPP_EOF)
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
index 5bdf02000d7..469953a5365 100644
--- a/gcc/cp/mangle.c
+++ b/gcc/cp/mangle.c
@@ -1337,7 +1337,7 @@ nested_anon_class_index (tree type)
/* <unnamed-type-name> ::= Ut [ <nonnegative number> ] _ */
static void
-write_unnamed_type_name (const tree type ATTRIBUTE_UNUSED)
+write_unnamed_type_name (const tree type)
{
int discriminator;
MANGLE_TRACE_TREE ("unnamed-type-name", type);
@@ -1694,8 +1694,8 @@ discriminator_for_local_entity (tree entity)
string literals used in FUNCTION. */
static int
-discriminator_for_string_literal (tree function ATTRIBUTE_UNUSED,
- tree string ATTRIBUTE_UNUSED)
+discriminator_for_string_literal (tree /*function*/,
+ tree /*string*/)
{
/* For now, we don't discriminate amongst string literals. */
return 0;
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index c21ae152d6b..a42ed60a99f 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -947,9 +947,10 @@ process_subob_fn (tree fn, bool move_p, tree *spec_p, bool *trivial_p,
}
}
- /* Core 1402: A non-trivial copy op suppresses the implicit
+ /* Core 1402: A non-trivial non-move ctor suppresses the implicit
declaration of the move ctor/op=. */
- if (no_implicit_p && move_p && !move_fn_p (fn) && !trivial_fn_p (fn))
+ if (no_implicit_p && move_p && !move_signature_fn_p (fn)
+ && !trivial_fn_p (fn))
*no_implicit_p = true;
if (constexpr_p && !DECL_DECLARED_CONSTEXPR_P (fn))
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 9392c01dc94..e4e982764c3 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -318,13 +318,9 @@ cxx_binding_free (cxx_binding *binding)
static cxx_binding *
new_class_binding (tree name, tree value, tree type, cp_binding_level *scope)
{
- cp_class_binding *cb;
- cxx_binding *binding;
-
- cb = VEC_safe_push (cp_class_binding, gc, scope->class_shadowed, NULL);
-
- cb->identifier = name;
- cb->base = binding = cxx_binding_make (value, type);
+ cp_class_binding cb = {cxx_binding_make (value, type), name};
+ cxx_binding *binding = cb.base;
+ VEC_safe_push (cp_class_binding, gc, scope->class_shadowed, cb);
binding->scope = scope;
return binding;
}
@@ -5884,16 +5880,16 @@ store_binding_p (tree id)
static void
store_binding (tree id, VEC(cxx_saved_binding,gc) **old_bindings)
{
- cxx_saved_binding *saved;
+ cxx_saved_binding saved;
gcc_checking_assert (store_binding_p (id));
IDENTIFIER_MARKED (id) = 1;
- saved = VEC_quick_push (cxx_saved_binding, *old_bindings, NULL);
- saved->identifier = id;
- saved->binding = IDENTIFIER_BINDING (id);
- saved->real_type_value = REAL_IDENTIFIER_TYPE_VALUE (id);
+ saved.identifier = id;
+ saved.binding = IDENTIFIER_BINDING (id);
+ saved.real_type_value = REAL_IDENTIFIER_TYPE_VALUE (id);
+ VEC_quick_push (cxx_saved_binding, *old_bindings, saved);
IDENTIFIER_BINDING (id) = NULL;
}
diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c
index 7011eb6f9f5..ec283355521 100644
--- a/gcc/cp/optimize.c
+++ b/gcc/cp/optimize.c
@@ -128,7 +128,8 @@ build_delete_destructor_body (tree delete_dtor, tree complete_dtor)
/* Call the corresponding complete destructor. */
gcc_assert (complete_dtor);
- call_dtor = build_cxx_call (complete_dtor, 1, &parm);
+ call_dtor = build_cxx_call (complete_dtor, 1, &parm,
+ tf_warning_or_error);
add_stmt (call_dtor);
add_stmt (build_stmt (0, LABEL_EXPR, cdtor_label));
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 327ad0b2c7d..e8c037885ef 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -590,13 +590,13 @@ cp_lexer_new_main (void)
lexer = cp_lexer_alloc ();
/* Put the first token in the buffer. */
- VEC_quick_push (cp_token, lexer->buffer, &token);
+ VEC_quick_push (cp_token, lexer->buffer, token);
/* Get the remaining tokens from the preprocessor. */
while (token.type != CPP_EOF)
{
cp_lexer_get_preprocessor_token (lexer, &token);
- VEC_safe_push (cp_token, gc, lexer->buffer, &token);
+ VEC_safe_push (cp_token, gc, lexer->buffer, token);
}
lexer->last_token = VEC_address (cp_token, lexer->buffer)
@@ -667,7 +667,7 @@ cp_lexer_token_position (cp_lexer *lexer, bool previous_p)
}
static inline cp_token *
-cp_lexer_token_at (cp_lexer *lexer ATTRIBUTE_UNUSED, cp_token_position pos)
+cp_lexer_token_at (cp_lexer * /*lexer*/, cp_token_position pos)
{
return pos;
}
@@ -1731,11 +1731,8 @@ cp_parser_context_new (cp_parser_context* next)
static void
push_unparsed_function_queues (cp_parser *parser)
{
- VEC_safe_push (cp_unparsed_functions_entry, gc,
- parser->unparsed_queues, NULL);
- unparsed_funs_with_default_args = NULL;
- unparsed_funs_with_definitions = make_tree_vector ();
- unparsed_nsdmis = NULL;
+ cp_unparsed_functions_entry e = {NULL, make_tree_vector (), NULL};
+ VEC_safe_push (cp_unparsed_functions_entry, gc, parser->unparsed_queues, e);
}
static void
@@ -8028,7 +8025,7 @@ start_lambda_scope (tree decl)
decl = current_function_decl;
ti.t = lambda_scope;
ti.i = lambda_count;
- VEC_safe_push (tree_int, gc, lambda_scope_stack, &ti);
+ VEC_safe_push (tree_int, gc, lambda_scope_stack, ti);
if (lambda_scope != decl)
{
/* Don't reset the count if we're still in the same function. */
@@ -21758,11 +21755,9 @@ cp_parser_save_default_args (cp_parser* parser, tree decl)
probe = TREE_CHAIN (probe))
if (TREE_PURPOSE (probe))
{
- cp_default_arg_entry *entry
- = VEC_safe_push (cp_default_arg_entry, gc,
- unparsed_funs_with_default_args, NULL);
- entry->class_type = current_class_type;
- entry->decl = decl;
+ cp_default_arg_entry entry = {current_class_type, decl};
+ VEC_safe_push (cp_default_arg_entry, gc,
+ unparsed_funs_with_default_args, entry);
break;
}
}
@@ -25327,7 +25322,7 @@ cp_parser_omp_clause_if (cp_parser *parser, tree list, location_t location)
mergeable */
static tree
-cp_parser_omp_clause_mergeable (cp_parser *parser ATTRIBUTE_UNUSED,
+cp_parser_omp_clause_mergeable (cp_parser * /*parser*/,
tree list, location_t location)
{
tree c;
@@ -25344,7 +25339,7 @@ cp_parser_omp_clause_mergeable (cp_parser *parser ATTRIBUTE_UNUSED,
nowait */
static tree
-cp_parser_omp_clause_nowait (cp_parser *parser ATTRIBUTE_UNUSED,
+cp_parser_omp_clause_nowait (cp_parser * /*parser*/,
tree list, location_t location)
{
tree c;
@@ -25390,7 +25385,7 @@ cp_parser_omp_clause_num_threads (cp_parser *parser, tree list,
ordered */
static tree
-cp_parser_omp_clause_ordered (cp_parser *parser ATTRIBUTE_UNUSED,
+cp_parser_omp_clause_ordered (cp_parser * /*parser*/,
tree list, location_t location)
{
tree c;
@@ -25583,7 +25578,7 @@ cp_parser_omp_clause_schedule (cp_parser *parser, tree list, location_t location
untied */
static tree
-cp_parser_omp_clause_untied (cp_parser *parser ATTRIBUTE_UNUSED,
+cp_parser_omp_clause_untied (cp_parser * /*parser*/,
tree list, location_t location)
{
tree c;
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index cde83f2d953..7924dff519f 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -5187,7 +5187,7 @@ has_value_dependent_address (tree op)
call.c */
static int
-unify_success (bool explain_p ATTRIBUTE_UNUSED)
+unify_success (bool /*explain_p*/)
{
return 0;
}
@@ -5202,7 +5202,7 @@ unify_parameter_deduction_failure (bool explain_p, tree parm)
}
static int
-unify_invalid (bool explain_p ATTRIBUTE_UNUSED)
+unify_invalid (bool /*explain_p*/)
{
return 1;
}
@@ -10443,6 +10443,16 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
break;
}
+ if (TREE_CODE (t) == VAR_DECL && DECL_ANON_UNION_VAR_P (t))
+ {
+ /* Just use name lookup to find a member alias for an anonymous
+ union, but then add it to the hash table. */
+ r = lookup_name (DECL_NAME (t));
+ gcc_assert (DECL_ANON_UNION_VAR_P (r));
+ register_local_specialization (r, t);
+ break;
+ }
+
/* Create a new node for the specialization we need. */
r = copy_decl (t);
if (type == NULL_TREE)
@@ -14199,8 +14209,18 @@ tsubst_copy_and_build (tree t,
LAMBDA_EXPR_MUTABLE_P (r) = LAMBDA_EXPR_MUTABLE_P (t);
LAMBDA_EXPR_DISCRIMINATOR (r)
= (LAMBDA_EXPR_DISCRIMINATOR (t));
- LAMBDA_EXPR_EXTRA_SCOPE (r)
- = tsubst (LAMBDA_EXPR_EXTRA_SCOPE (t), args, complain, in_decl);
+ /* For a function scope, we want to use tsubst so that we don't
+ complain about referring to an auto function before its return
+ type has been deduced. Otherwise, we want to use tsubst_copy so
+ that we look up the existing field/parameter/variable rather
+ than build a new one. */
+ tree scope = LAMBDA_EXPR_EXTRA_SCOPE (t);
+ if (scope && TREE_CODE (scope) == FUNCTION_DECL)
+ scope = tsubst (LAMBDA_EXPR_EXTRA_SCOPE (t), args,
+ complain, in_decl);
+ else
+ scope = RECUR (scope);
+ LAMBDA_EXPR_EXTRA_SCOPE (r) = scope;
LAMBDA_EXPR_RETURN_TYPE (r)
= tsubst (LAMBDA_EXPR_RETURN_TYPE (t), args, complain, in_decl);
@@ -19189,10 +19209,15 @@ value_dependent_expression_p (tree expression)
case VAR_DECL:
/* A constant with literal type and is initialized
- with an expression that is value-dependent. */
+ with an expression that is value-dependent.
+
+ Note that a non-dependent parenthesized initializer will have
+ already been replaced with its constant value, so if we see
+ a TREE_LIST it must be dependent. */
if (DECL_INITIAL (expression)
&& decl_constant_var_p (expression)
- && value_dependent_expression_p (DECL_INITIAL (expression)))
+ && (TREE_CODE (DECL_INITIAL (expression)) == TREE_LIST
+ || value_dependent_expression_p (DECL_INITIAL (expression))))
return true;
return false;
@@ -19539,7 +19564,7 @@ type_dependent_expression_p (tree expression)
static tree
instantiation_dependent_r (tree *tp, int *walk_subtrees,
- void *data ATTRIBUTE_UNUSED)
+ void * /*data*/)
{
if (TYPE_P (*tp))
{
@@ -20380,7 +20405,7 @@ append_type_to_template_for_access_check_1 (tree t,
VEC_safe_push (qualified_typedef_usage_t, gc,
TI_TYPEDEFS_NEEDING_ACCESS_CHECKING (ti),
- &typedef_usage);
+ typedef_usage);
}
/* Append TYPE_DECL to the template TEMPL.
diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c
index e61918094a5..95518cffe1d 100644
--- a/gcc/cp/rtti.c
+++ b/gcc/cp/rtti.c
@@ -206,7 +206,7 @@ throw_bad_cast (void)
fn = push_throw_library_fn (fn, build_function_type_list (ptr_type_node,
NULL_TREE));
- return build_cxx_call (fn, 0, NULL);
+ return build_cxx_call (fn, 0, NULL, tf_warning_or_error);
}
/* Return an expression for "__cxa_bad_typeid()". The expression
@@ -225,7 +225,7 @@ throw_bad_typeid (void)
fn = push_throw_library_fn (fn, t);
}
- return build_cxx_call (fn, 0, NULL);
+ return build_cxx_call (fn, 0, NULL, tf_warning_or_error);
}
/* Return an lvalue expression whose type is "const std::type_info"
@@ -743,7 +743,7 @@ build_dynamic_cast_1 (tree type, tree expr, tsubst_flags_t complain)
pop_abi_namespace ();
dynamic_cast_node = dcast_fn;
}
- result = build_cxx_call (dcast_fn, 4, elems);
+ result = build_cxx_call (dcast_fn, 4, elems, complain);
if (tc == REFERENCE_TYPE)
{
diff --git a/gcc/cp/search.c b/gcc/cp/search.c
index 7d358ef3a47..1614f49350e 100644
--- a/gcc/cp/search.c
+++ b/gcc/cp/search.c
@@ -819,7 +819,7 @@ friend_accessible_p (tree scope, tree decl, tree binfo)
/* Called via dfs_walk_once_accessible from accessible_p */
static tree
-dfs_accessible_post (tree binfo, void *data ATTRIBUTE_UNUSED)
+dfs_accessible_post (tree binfo, void * /*data*/)
{
if (BINFO_ACCESS (binfo) != ak_none)
{
@@ -2160,7 +2160,7 @@ maybe_suppress_debug_info (tree t)
information anyway. */
static tree
-dfs_debug_mark (tree binfo, void *data ATTRIBUTE_UNUSED)
+dfs_debug_mark (tree binfo, void * /*data*/)
{
tree t = BINFO_TYPE (binfo);
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 7cd1468dba5..db093e0b98d 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -145,11 +145,8 @@ push_deferring_access_checks (deferring_kind deferring)
deferred_access_no_check++;
else
{
- deferred_access *ptr;
-
- ptr = VEC_safe_push (deferred_access, gc, deferred_access_stack, NULL);
- ptr->deferred_access_checks = NULL;
- ptr->deferring_access_checks_kind = deferring;
+ deferred_access e = {NULL, deferring};
+ VEC_safe_push (deferred_access, gc, deferred_access_stack, e);
}
}
@@ -243,7 +240,7 @@ pop_to_parent_deferring_access_checks (void)
}
/* Insert into parent's checks. */
VEC_safe_push (deferred_access_check, gc,
- ptr->deferred_access_checks, chk);
+ ptr->deferred_access_checks, *chk);
found:;
}
}
@@ -311,7 +308,6 @@ perform_or_defer_access_check (tree binfo, tree decl, tree diag_decl,
int i;
deferred_access *ptr;
deferred_access_check *chk;
- deferred_access_check *new_access;
/* Exit if we are in a context that no access checking is performed.
@@ -341,13 +337,9 @@ perform_or_defer_access_check (tree binfo, tree decl, tree diag_decl,
}
}
/* If not, record the check. */
- new_access =
- VEC_safe_push (deferred_access_check, gc,
- ptr->deferred_access_checks, 0);
- new_access->binfo = binfo;
- new_access->decl = decl;
- new_access->diag_decl = diag_decl;
- new_access->loc = input_location;
+ deferred_access_check new_access = {binfo, decl, diag_decl, input_location};
+ VEC_safe_push (deferred_access_check, gc, ptr->deferred_access_checks,
+ new_access);
return true;
}
@@ -3463,7 +3455,7 @@ calculate_direct_bases (tree type)
/* Virtual base classes are handled separately in finish_bases */
static tree
-dfs_calculate_bases_pre (tree binfo, ATTRIBUTE_UNUSED void *data_)
+dfs_calculate_bases_pre (tree binfo, void * /*data_*/)
{
/* Don't walk bases of virtual bases */
return BINFO_VIRTUAL_P (binfo) ? dfs_skip_bases : NULL_TREE;
@@ -5903,24 +5895,26 @@ check_constexpr_ctor_body (tree last, tree list)
static VEC(constructor_elt,gc) *
sort_constexpr_mem_initializers (tree type, VEC(constructor_elt,gc) *vec)
{
- if (!CLASSTYPE_HAS_PRIMARY_BASE_P (type)
- || (CLASSTYPE_PRIMARY_BINFO (type)
- == BINFO_BASE_BINFO (TYPE_BINFO (type), 0)))
+ tree pri = CLASSTYPE_PRIMARY_BINFO (type);
+ constructor_elt elt;
+ int i;
+
+ if (pri == NULL_TREE
+ || pri == BINFO_BASE_BINFO (TYPE_BINFO (type), 0))
return vec;
/* Find the element for the primary base and move it to the beginning of
the vec. */
- tree pri = BINFO_TYPE (CLASSTYPE_PRIMARY_BINFO (type));
VEC(constructor_elt,gc) &v = *vec;
- int pri_idx;
-
- for (pri_idx = 1; ; ++pri_idx)
- if (TREE_TYPE (v[pri_idx].index) == pri)
+ pri = BINFO_TYPE (pri);
+ for (i = 1; ; ++i)
+ if (TREE_TYPE (v[i].index) == pri)
break;
- constructor_elt pri_elt = v[pri_idx];
- for (int i = 0; i < pri_idx; ++i)
- v[i+1] = v[i];
- v[0] = pri_elt;
+
+ elt = v[i];
+ for (; i > 0; --i)
+ v[i] = v[i-1];
+ v[0] = elt;
return vec;
}
@@ -7480,7 +7474,11 @@ cxx_eval_indirect_ref (const constexpr_call *call, tree t,
}
if (r == NULL_TREE)
- return t;
+ {
+ if (!addr)
+ VERIFY_CONSTANT (t);
+ return t;
+ }
return r;
}
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index ce1af73a16d..7dddf2299c3 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -1915,9 +1915,7 @@ count_trees (tree t)
/* Called from verify_stmt_tree via walk_tree. */
static tree
-verify_stmt_tree_r (tree* tp,
- int* walk_subtrees ATTRIBUTE_UNUSED ,
- void* data)
+verify_stmt_tree_r (tree* tp, int * /*walk_subtrees*/, void* data)
{
tree t = *tp;
htab_t *statements = (htab_t *) data;
@@ -2155,9 +2153,7 @@ bot_manip (tree* tp, int* walk_subtrees, void* data)
variables. */
static tree
-bot_replace (tree* t,
- int* walk_subtrees ATTRIBUTE_UNUSED ,
- void* data)
+bot_replace (tree* t, int* /*walk_subtrees*/, void* data)
{
splay_tree target_remap = ((splay_tree) data);
@@ -3001,7 +2997,7 @@ const struct attribute_spec cxx_attribute_table[] =
static tree
handle_java_interface_attribute (tree* node,
tree name,
- tree args ATTRIBUTE_UNUSED ,
+ tree /*args*/,
int flags,
bool* no_add_attrs)
{
@@ -3026,8 +3022,8 @@ handle_java_interface_attribute (tree* node,
static tree
handle_com_interface_attribute (tree* node,
tree name,
- tree args ATTRIBUTE_UNUSED ,
- int flags ATTRIBUTE_UNUSED ,
+ tree /*args*/,
+ int /*flags*/,
bool* no_add_attrs)
{
static int warned;
@@ -3056,7 +3052,7 @@ static tree
handle_init_priority_attribute (tree* node,
tree name,
tree args,
- int flags ATTRIBUTE_UNUSED ,
+ int /*flags*/,
bool* no_add_attrs)
{
tree initp_expr = TREE_VALUE (args);
@@ -3770,8 +3766,7 @@ cp_free_lang_data (tree t)
should be a C target hook. But currently this is not possible,
because this function is called via REGISTER_TARGET_PRAGMAS. */
void
-c_register_addr_space (const char *word ATTRIBUTE_UNUSED,
- addr_space_t as ATTRIBUTE_UNUSED)
+c_register_addr_space (const char * /*word*/, addr_space_t /*as*/)
{
}
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index f62532153fd..ad4b0903d67 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -2772,7 +2772,7 @@ build_x_indirect_ref (location_t loc, tree expr, ref_operator errorstring,
/* Helper function called from c-common. */
tree
-build_indirect_ref (location_t loc ATTRIBUTE_UNUSED,
+build_indirect_ref (location_t /*loc*/,
tree ptr, ref_operator errorstring)
{
return cp_build_indirect_ref (ptr, errorstring, tf_warning_or_error);
@@ -3207,7 +3207,7 @@ get_member_function_from_ptrfunc (tree *instance_ptrptr, tree function,
/* Used by the C-common bits. */
tree
-build_function_call (location_t loc ATTRIBUTE_UNUSED,
+build_function_call (location_t /*loc*/,
tree function, tree params)
{
return cp_build_function_call (function, params, tf_warning_or_error);
@@ -3215,9 +3215,9 @@ build_function_call (location_t loc ATTRIBUTE_UNUSED,
/* Used by the C-common bits. */
tree
-build_function_call_vec (location_t loc ATTRIBUTE_UNUSED,
+build_function_call_vec (location_t /*loc*/,
tree function, VEC(tree,gc) *params,
- VEC(tree,gc) *origtypes ATTRIBUTE_UNUSED)
+ VEC(tree,gc) * /*origtypes*/)
{
VEC(tree,gc) *orig_params = params;
tree ret = cp_build_function_call_vec (function, &params,
@@ -3373,7 +3373,7 @@ cp_build_function_call_vec (tree function, VEC(tree,gc) **params,
null parameters. */
check_function_arguments (fntype, nargs, argarray);
- ret = build_cxx_call (function, nargs, argarray);
+ ret = build_cxx_call (function, nargs, argarray, complain);
if (allocated != NULL)
release_tree_vector (allocated);
@@ -3693,7 +3693,7 @@ enum_cast_to_int (tree op)
/* For the c-common bits. */
tree
build_binary_op (location_t location, enum tree_code code, tree op0, tree op1,
- int convert_p ATTRIBUTE_UNUSED)
+ int /*convert_p*/)
{
return cp_build_binary_op (location, code, op0, op1, tf_warning_or_error);
}
@@ -3985,7 +3985,15 @@ cp_build_binary_op (location_t location,
Also set SHORT_SHIFT if shifting rightward. */
case RSHIFT_EXPR:
- if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
+ if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
+ && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
+ && TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE
+ && TYPE_VECTOR_SUBPARTS (type0) == TYPE_VECTOR_SUBPARTS (type1))
+ {
+ result_type = type0;
+ converted = 1;
+ }
+ else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
{
result_type = type0;
if (TREE_CODE (op1) == INTEGER_CST)
@@ -4014,7 +4022,15 @@ cp_build_binary_op (location_t location,
break;
case LSHIFT_EXPR:
- if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
+ if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
+ && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
+ && TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE
+ && TYPE_VECTOR_SUBPARTS (type0) == TYPE_VECTOR_SUBPARTS (type1))
+ {
+ result_type = type0;
+ converted = 1;
+ }
+ else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
{
result_type = type0;
if (TREE_CODE (op1) == INTEGER_CST)
@@ -4072,6 +4088,8 @@ cp_build_binary_op (location_t location,
case EQ_EXPR:
case NE_EXPR:
+ if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)
+ goto vector_compare;
if ((complain & tf_warning)
&& (FLOAT_TYPE_P (type0) || FLOAT_TYPE_P (type1)))
warning (OPT_Wfloat_equal,
@@ -4314,6 +4332,35 @@ cp_build_binary_op (location_t location,
warning (OPT_Waddress, "comparison with string literal results in unspecified behaviour");
}
+ if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)
+ {
+ vector_compare:
+ tree intt;
+ if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (type0),
+ TREE_TYPE (type1)))
+ {
+ error_at (location, "comparing vectors with different "
+ "element types");
+ inform (location, "operand types are %qT and %qT", type0, type1);
+ return error_mark_node;
+ }
+
+ if (TYPE_VECTOR_SUBPARTS (type0) != TYPE_VECTOR_SUBPARTS (type1))
+ {
+ error_at (location, "comparing vectors with different "
+ "number of elements");
+ inform (location, "operand types are %qT and %qT", type0, type1);
+ return error_mark_node;
+ }
+
+ /* Always construct signed integer vector type. */
+ intt = c_common_type_for_size (GET_MODE_BITSIZE
+ (TYPE_MODE (TREE_TYPE (type0))), 0);
+ result_type = build_opaque_vector_type (intt,
+ TYPE_VECTOR_SUBPARTS (type0));
+ converted = 1;
+ break;
+ }
build_type = boolean_type_node;
if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
|| code0 == ENUMERAL_TYPE)
@@ -5448,7 +5495,7 @@ cp_build_unary_op (enum tree_code code, tree xarg, int noconvert,
/* Hook for the c-common bits that build a unary op. */
tree
-build_unary_op (location_t location ATTRIBUTE_UNUSED,
+build_unary_op (location_t /*location*/,
enum tree_code code, tree xarg, int noconvert)
{
return cp_build_unary_op (code, xarg, noconvert, tf_warning_or_error);
@@ -5719,7 +5766,8 @@ build_x_compound_expr_from_list (tree list, expr_list_kind exp,
/* Like build_x_compound_expr_from_list, but using a VEC. */
tree
-build_x_compound_expr_from_vec (VEC(tree,gc) *vec, const char *msg)
+build_x_compound_expr_from_vec (VEC(tree,gc) *vec, const char *msg,
+ tsubst_flags_t complain)
{
if (VEC_empty (tree, vec))
return NULL_TREE;
@@ -5732,14 +5780,19 @@ build_x_compound_expr_from_vec (VEC(tree,gc) *vec, const char *msg)
tree t;
if (msg != NULL)
- permerror (input_location,
- "%s expression list treated as compound expression",
- msg);
+ {
+ if (complain & tf_error)
+ permerror (input_location,
+ "%s expression list treated as compound expression",
+ msg);
+ else
+ return error_mark_node;
+ }
expr = VEC_index (tree, vec, 0);
for (ix = 1; VEC_iterate (tree, vec, ix, t); ++ix)
expr = build_x_compound_expr (EXPR_LOCATION (t), expr,
- t, tf_warning_or_error);
+ t, complain);
return expr;
}
@@ -5778,7 +5831,7 @@ build_x_compound_expr (location_t loc, tree op1, tree op2,
/* Like cp_build_compound_expr, but for the c-common bits. */
tree
-build_compound_expr (location_t loc ATTRIBUTE_UNUSED, tree lhs, tree rhs)
+build_compound_expr (location_t /*loc*/, tree lhs, tree rhs)
{
return cp_build_compound_expr (lhs, rhs, tf_warning_or_error);
}
@@ -6646,7 +6699,7 @@ build_const_cast (tree type, tree expr, tsubst_flags_t complain)
/* Like cp_build_c_cast, but for the c-common bits. */
tree
-build_c_cast (location_t loc ATTRIBUTE_UNUSED, tree type, tree expr)
+build_c_cast (location_t /*loc*/, tree type, tree expr)
{
return cp_build_c_cast (type, expr, tf_warning_or_error);
}
@@ -6776,11 +6829,11 @@ cp_build_c_cast (tree type, tree expr, tsubst_flags_t complain)
/* For use from the C common bits. */
tree
-build_modify_expr (location_t location ATTRIBUTE_UNUSED,
- tree lhs, tree lhs_origtype ATTRIBUTE_UNUSED,
+build_modify_expr (location_t /*location*/,
+ tree lhs, tree /*lhs_origtype*/,
enum tree_code modifycode,
- location_t rhs_location ATTRIBUTE_UNUSED, tree rhs,
- tree rhs_origtype ATTRIBUTE_UNUSED)
+ location_t /*rhs_location*/, tree rhs,
+ tree /*rhs_origtype*/)
{
return cp_build_modify_expr (lhs, modifycode, rhs, tf_warning_or_error);
}
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index cea5ddabd28..e850266de87 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -8324,6 +8324,21 @@ means that the compiler can assume for x, set to arg, that
(char *) x - 8 is 32 byte aligned.
@end deftypefn
+@deftypefn {Built-in Function} int __builtin_LINE ()
+This function is the equivalent to the preprocessor @code{__LINE__}
+macro and returns the line number of the invocation of the built-in.
+@end deftypefn
+
+@deftypefn {Built-in Function} int __builtin_FUNCTION ()
+This function is the equivalent to the preprocessor @code{__FUNCTION__}
+macro and returns the function name the invocation of the built-in is in.
+@end deftypefn
+
+@deftypefn {Built-in Function} int __builtin_FILE ()
+This function is the equivalent to the preprocessor @code{__FILE__}
+macro and returns the file name the invocation of the built-in is in.
+@end deftypefn
+
@deftypefn {Built-in Function} void __builtin___clear_cache (char *@var{begin}, char *@var{end})
This function is used to flush the processor's instruction cache for
the region of memory between @var{begin} inclusive and @var{end}
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 78bfd08b4a3..188c9e79789 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -777,6 +777,9 @@ Objective-C and Objective-C++ Dialects}.
-mreturn-pointer-on-d0 @gol
-mno-crt0 -mrelax -mliw -msetlb}
+@emph{Moxie Options}
+@gccoptlist{-meb -mel}
+
@emph{PDP-11 Options}
@gccoptlist{-mfpu -msoft-float -mac0 -mno-ac0 -m40 -m45 -m10 @gol
-mbcopy -mbcopy-builtin -mint32 -mno-int16 @gol
@@ -930,10 +933,10 @@ See RS/6000 and PowerPC Options.
@gccoptlist{-Qy -Qn -YP,@var{paths} -Ym,@var{dir}}
@emph{TILE-Gx Options}
-@gccoptlist{-mcpu=CPU -m32 -m64 -mcmodel=@var{code-model}}
+@gccoptlist{-mcpu=@var{cpu} -m32 -m64 -mcmodel=@var{code-model}}
@emph{TILEPro Options}
-@gccoptlist{-mcpu=CPU -m32}
+@gccoptlist{-mcpu=@var{cpu} -m32}
@emph{V850 Options}
@gccoptlist{-mlong-calls -mno-long-calls -mep -mno-ep @gol
@@ -3353,6 +3356,8 @@ int f()
@end group
@end smallexample
+This warning is enabled by @option{-Wall} in C++.
+
@item -Wimplicit-int @r{(C and Objective-C only)}
@opindex Wimplicit-int
@opindex Wno-implicit-int
@@ -8099,9 +8104,12 @@ This option is disabled by default.
Specify the partitioning algorithm used by the link-time optimizer.
The value is either @code{1to1} to specify a partitioning mirroring
the original source files or @code{balanced} to specify partitioning
-into equally sized chunks (whenever possible). Specifying @code{none}
-as an algorithm disables partitioning and streaming completely. The
-default value is @code{balanced}.
+into equally sized chunks (whenever possible) or @code{max} to create
+new partition for every symbol where possible. Specifying @code{none}
+as an algorithm disables partitioning and streaming completely.
+The default value is @code{balanced}. While @code{1to1} can be used
+as an workaround for various code ordering issues, the @code{max}
+partitioning is intended for internal testing only.
@item -flto-compression-level=@var{n}
This option specifies the level of compression used for intermediate
@@ -9413,6 +9421,11 @@ having a regular register file and accurate register pressure classes.
See @file{haifa-sched.c} in the GCC sources for more details.
The default choice depends on the target.
+
+@item max-slsr-cand-scan
+Set the maximum number of existing candidates that will be considered when
+seeking a basis for a new straight-line strength reduction candidate.
+
@end table
@end table
@@ -10525,6 +10538,7 @@ platform.
* MIPS Options::
* MMIX Options::
* MN10300 Options::
+* Moxie Options::
* PDP-11 Options::
* picoChip Options::
* PowerPC Options::
@@ -16444,6 +16458,23 @@ instructions. This option defines the preprocessor macro
@end table
+@node Moxie Options
+@subsection Moxie Options
+@cindex Moxie Options
+
+@table @gcctabopt
+
+@item -meb
+@opindex meb
+Generate big-endian code. This is the default for @samp{moxie-*-*}
+configurations.
+
+@item -mel
+@opindex mel
+Generate little-endian code.
+
+@end table
+
@node PDP-11 Options
@subsection PDP-11 Options
@cindex PDP-11 Options
@@ -18978,13 +19009,13 @@ These @samp{-m} options are supported on the TILE-Gx:
@table @gcctabopt
@item -mcmodel=small
@opindex mcmodel=small
-Generate code for the small model. Distance for direct calls is
+Generate code for the small model. The distance for direct calls is
limited to 500M in either direction. PC-relative addresses are 32
bits. Absolute addresses support the full address range.
@item -mcmodel=large
@opindex mcmodel=large
-Generate code for the large model. There is no limiation on call
+Generate code for the large model. There is no limitation on call
distance, pc-relative addresses, or absolute addresses.
@item -mcpu=@var{name}
diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
index 7e9dbe31c2d..055567b65d1 100644
--- a/gcc/doc/sourcebuild.texi
+++ b/gcc/doc/sourcebuild.texi
@@ -1525,11 +1525,19 @@ ARM target supports generating NEON instructions.
@item arm_neon_hw
Test system supports executing NEON instructions.
+@item arm_neonv2_hw
+Test system supports executing NEON v2 instructions.
+
@item arm_neon_ok
@anchor{arm_neon_ok}
ARM Target supports @code{-mfpu=neon -mfloat-abi=softfp} or compatible
options. Some multilibs may be incompatible with these options.
+@item arm_neonv2_ok
+@anchor{arm_neonv2_ok}
+ARM Target supports @code{-mfpu=neon-vfpv4 -mfloat-abi=softfp} or compatible
+options. Some multilibs may be incompatible with these options.
+
@item arm_neon_fp16_ok
@anchor{arm_neon_fp16_ok}
ARM Target supports @code{-mfpu=neon-fp16 -mfloat-abi=softfp} or compatible
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 11b2f9aa567..d268fd8e3b6 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -3887,11 +3887,12 @@ alignment. Then the definition should be
If the value of this macro has a type, it should be an unsigned type.
@end defmac
-@findex current_function_outgoing_args_size
+@findex outgoing_args_size
+@findex crtl->outgoing_args_size
@defmac ACCUMULATE_OUTGOING_ARGS
A C expression. If nonzero, the maximum amount of space required for outgoing arguments
-will be computed and placed into the variable
-@code{current_function_outgoing_args_size}. No space will be pushed
+will be computed and placed into
+@code{crtl->outgoing_args_size}. No space will be pushed
onto the stack for each call; instead, the function prologue should
increase the stack frame size by this amount.
@@ -3925,7 +3926,7 @@ if the function called is a library function.
If @code{ACCUMULATE_OUTGOING_ARGS} is defined, this macro controls
whether the space for these arguments counts in the value of
-@code{current_function_outgoing_args_size}.
+@code{crtl->outgoing_args_size}.
@end defmac
@defmac STACK_PARMS_IN_REG_PARM_AREA
@@ -4763,7 +4764,8 @@ others leave that for the caller to do. For example, the 68020 when
given @option{-mrtd} pops arguments in functions that take a fixed
number of arguments.
-@findex current_function_pops_args
+@findex pops_args
+@findex crtl->args.pops_args
Your definition of the macro @code{RETURN_POPS_ARGS} decides which
functions pop their own arguments. @code{TARGET_ASM_FUNCTION_EPILOGUE}
needs to know what was decided. The number of bytes of the current
@@ -4773,8 +4775,9 @@ function's arguments that this function should pop is available in
@itemize @bullet
@item
-@findex current_function_pretend_args_size
-A region of @code{current_function_pretend_args_size} bytes of
+@findex pretend_args_size
+@findex crtl->args.pretend_args_size
+A region of @code{crtl->args.pretend_args_size} bytes of
uninitialized space just underneath the first argument arriving on the
stack. (This may not be at the very start of the allocated stack region
if the calling sequence has pushed anything else since pushing the stack
@@ -4801,7 +4804,7 @@ save area closer to the top of the stack.
@item
@cindex @code{ACCUMULATE_OUTGOING_ARGS} and stack frames
Optionally, when @code{ACCUMULATE_OUTGOING_ARGS} is defined, a region of
-@code{current_function_outgoing_args_size} bytes to be used for outgoing
+@code{crtl->outgoing_args_size} bytes to be used for outgoing
argument lists of the function. @xref{Stack Arguments}.
@end itemize
@@ -4850,11 +4853,12 @@ may be reconsidered for a subsequent delay slot. Also, other insns may
(at least in principle) be considered for the so far unfilled delay
slot.
-@findex current_function_epilogue_delay_list
+@findex epilogue_delay_list
+@findex crtl->epilogue_delay_list
@findex final_scan_insn
The insns accepted to fill the epilogue delay slots are put in an RTL
-list made with @code{insn_list} objects, stored in the variable
-@code{current_function_epilogue_delay_list}. The insn for the first
+list made with @code{insn_list} objects, stored in
+@code{crtl->epilogue_delay_list}. The insn for the first
delay slot comes first in the list. Your definition of the macro
@code{TARGET_ASM_FUNCTION_EPILOGUE} should fill the delay slots by
outputting the insns in this list, usually by calling
@@ -10975,8 +10979,8 @@ the hard register itself, if it is known not to be clobbered---or a
@code{MEM}.
If you are returning a @code{MEM}, this is only a hint for the allocator;
it might decide to use another register anyways.
-You may use @code{current_function_leaf_function} in the hook, functions
-that use @code{REG_N_SETS}, to determine if the hard
+You may use @code{current_function_is_leaf} or
+@code{REG_N_SETS} in the hook to determine if the hard
register in question will not be clobbered.
The default value of this hook is @code{NULL}, which disables any special
allocation.
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 54414f17f7a..86c7f5d218c 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -3863,11 +3863,12 @@ alignment. Then the definition should be
If the value of this macro has a type, it should be an unsigned type.
@end defmac
-@findex current_function_outgoing_args_size
+@findex outgoing_args_size
+@findex crtl->outgoing_args_size
@defmac ACCUMULATE_OUTGOING_ARGS
A C expression. If nonzero, the maximum amount of space required for outgoing arguments
-will be computed and placed into the variable
-@code{current_function_outgoing_args_size}. No space will be pushed
+will be computed and placed into
+@code{crtl->outgoing_args_size}. No space will be pushed
onto the stack for each call; instead, the function prologue should
increase the stack frame size by this amount.
@@ -3901,7 +3902,7 @@ if the function called is a library function.
If @code{ACCUMULATE_OUTGOING_ARGS} is defined, this macro controls
whether the space for these arguments counts in the value of
-@code{current_function_outgoing_args_size}.
+@code{crtl->outgoing_args_size}.
@end defmac
@defmac STACK_PARMS_IN_REG_PARM_AREA
@@ -4700,7 +4701,8 @@ others leave that for the caller to do. For example, the 68020 when
given @option{-mrtd} pops arguments in functions that take a fixed
number of arguments.
-@findex current_function_pops_args
+@findex pops_args
+@findex crtl->args.pops_args
Your definition of the macro @code{RETURN_POPS_ARGS} decides which
functions pop their own arguments. @code{TARGET_ASM_FUNCTION_EPILOGUE}
needs to know what was decided. The number of bytes of the current
@@ -4710,8 +4712,9 @@ function's arguments that this function should pop is available in
@itemize @bullet
@item
-@findex current_function_pretend_args_size
-A region of @code{current_function_pretend_args_size} bytes of
+@findex pretend_args_size
+@findex crtl->args.pretend_args_size
+A region of @code{crtl->args.pretend_args_size} bytes of
uninitialized space just underneath the first argument arriving on the
stack. (This may not be at the very start of the allocated stack region
if the calling sequence has pushed anything else since pushing the stack
@@ -4738,7 +4741,7 @@ save area closer to the top of the stack.
@item
@cindex @code{ACCUMULATE_OUTGOING_ARGS} and stack frames
Optionally, when @code{ACCUMULATE_OUTGOING_ARGS} is defined, a region of
-@code{current_function_outgoing_args_size} bytes to be used for outgoing
+@code{crtl->outgoing_args_size} bytes to be used for outgoing
argument lists of the function. @xref{Stack Arguments}.
@end itemize
@@ -4787,11 +4790,12 @@ may be reconsidered for a subsequent delay slot. Also, other insns may
(at least in principle) be considered for the so far unfilled delay
slot.
-@findex current_function_epilogue_delay_list
+@findex epilogue_delay_list
+@findex crtl->epilogue_delay_list
@findex final_scan_insn
The insns accepted to fill the epilogue delay slots are put in an RTL
-list made with @code{insn_list} objects, stored in the variable
-@code{current_function_epilogue_delay_list}. The insn for the first
+list made with @code{insn_list} objects, stored in
+@code{crtl->epilogue_delay_list}. The insn for the first
delay slot comes first in the list. Your definition of the macro
@code{TARGET_ASM_FUNCTION_EPILOGUE} should fill the delay slots by
outputting the insns in this list, usually by calling
@@ -10831,8 +10835,8 @@ the hard register itself, if it is known not to be clobbered---or a
@code{MEM}.
If you are returning a @code{MEM}, this is only a hint for the allocator;
it might decide to use another register anyways.
-You may use @code{current_function_leaf_function} in the hook, functions
-that use @code{REG_N_SETS}, to determine if the hard
+You may use @code{current_function_is_leaf} or
+@code{REG_N_SETS} in the hook to determine if the hard
register in question will not be clobbered.
The default value of this hook is @code{NULL}, which disables any special
allocation.
diff --git a/gcc/dse.c b/gcc/dse.c
index 9e53b50f128..bd5860e35fa 100644
--- a/gcc/dse.c
+++ b/gcc/dse.c
@@ -105,7 +105,7 @@ along with GCC; see the file COPYING3. If not see
the first pass could examine a block in either direction. The
forwards ordering is to accommodate cselib.
- We a simplifying assumption: addresses fall into four broad
+ We make a simplifying assumption: addresses fall into four broad
categories:
1) base has rtx_varies_p == false, offset is constant.
@@ -114,18 +114,18 @@ along with GCC; see the file COPYING3. If not see
4) base has rtx_varies_p == true, offset variable.
The local passes are able to process all 4 kinds of addresses. The
- global pass only handles (1).
+ global pass only handles 1).
The global problem is formulated as follows:
A store, S1, to address A, where A is not relative to the stack
frame, can be eliminated if all paths from S1 to the end of the
- of the function contain another store to A before a read to A.
+ function contain another store to A before a read to A.
If the address A is relative to the stack frame, a store S2 to A
- can be eliminated if there are no paths from S1 that reach the
+ can be eliminated if there are no paths from S2 that reach the
end of the function that read A before another store to A. In
- this case S2 can be deleted if there are paths to from S2 to the
+ this case S2 can be deleted if there are paths from S2 to the
end of the function that have no reads or writes to A. This
second case allows stores to the stack frame to be deleted that
would otherwise die when the function returns. This cannot be
@@ -136,7 +136,7 @@ along with GCC; see the file COPYING3. If not see
dataflow problem where the stores are the gens and reads are the
kills. Set union problems are rare and require some special
handling given our representation of bitmaps. A straightforward
- implementation of requires a lot of bitmaps filled with 1s.
+ implementation requires a lot of bitmaps filled with 1s.
These are expensive and cumbersome in our bitmap formulation so
care has been taken to avoid large vectors filled with 1s. See
the comments in bb_info and in the dataflow confluence functions
diff --git a/gcc/dwarf2cfi.c b/gcc/dwarf2cfi.c
index 17027857bab..355c74698aa 100644
--- a/gcc/dwarf2cfi.c
+++ b/gcc/dwarf2cfi.c
@@ -941,10 +941,8 @@ record_reg_saved_in_reg (rtx dest, rtx src)
if (dest == NULL)
return;
- elt = VEC_safe_push (reg_saved_in_data, heap,
- cur_trace->regs_saved_in_regs, NULL);
- elt->orig_reg = src;
- elt->saved_in_reg = dest;
+ reg_saved_in_data e = {src, dest};
+ VEC_safe_push (reg_saved_in_data, heap, cur_trace->regs_saved_in_regs, e);
}
/* Add an entry to QUEUED_REG_SAVES saying that REG is now saved at
@@ -954,20 +952,19 @@ static void
queue_reg_save (rtx reg, rtx sreg, HOST_WIDE_INT offset)
{
queued_reg_save *q;
+ queued_reg_save e = {reg, sreg, offset};
size_t i;
/* Duplicates waste space, but it's also necessary to remove them
for correctness, since the queue gets output in reverse order. */
FOR_EACH_VEC_ELT (queued_reg_save, queued_reg_saves, i, q)
if (compare_reg_or_pc (q->reg, reg))
- goto found;
-
- q = VEC_safe_push (queued_reg_save, heap, queued_reg_saves, NULL);
+ {
+ *q = e;
+ return;
+ }
- found:
- q->reg = reg;
- q->saved_reg = sreg;
- q->cfa_offset = offset;
+ VEC_safe_push (queued_reg_save, heap, queued_reg_saves, e);
}
/* Output all the entries in QUEUED_REG_SAVES. */
@@ -2713,23 +2710,23 @@ static void
create_pseudo_cfg (void)
{
bool saw_barrier, switch_sections;
- dw_trace_info *ti;
+ dw_trace_info ti;
rtx insn;
unsigned i;
/* The first trace begins at the start of the function,
and begins with the CIE row state. */
trace_info = VEC_alloc (dw_trace_info, heap, 16);
- ti = VEC_quick_push (dw_trace_info, trace_info, NULL);
+ memset (&ti, 0, sizeof (ti));
+ ti.head = get_insns ();
+ ti.beg_row = cie_cfi_row;
+ ti.cfa_store = cie_cfi_row->cfa;
+ ti.cfa_temp.reg = INVALID_REGNUM;
+ VEC_quick_push (dw_trace_info, trace_info, ti);
- memset (ti, 0, sizeof (*ti));
- ti->head = get_insns ();
- ti->beg_row = cie_cfi_row;
- ti->cfa_store = cie_cfi_row->cfa;
- ti->cfa_temp.reg = INVALID_REGNUM;
if (cie_return_save)
VEC_safe_push (reg_saved_in_data, heap,
- ti->regs_saved_in_regs, cie_return_save);
+ ti.regs_saved_in_regs, *cie_return_save);
/* Walk all the insns, collecting start of trace locations. */
saw_barrier = false;
@@ -2751,11 +2748,11 @@ create_pseudo_cfg (void)
else if (save_point_p (insn)
&& (LABEL_P (insn) || !saw_barrier))
{
- ti = VEC_safe_push (dw_trace_info, heap, trace_info, NULL);
- memset (ti, 0, sizeof (*ti));
- ti->head = insn;
- ti->switch_sections = switch_sections;
- ti->id = VEC_length (dw_trace_info, trace_info) - 1;
+ memset (&ti, 0, sizeof (ti));
+ ti.head = insn;
+ ti.switch_sections = switch_sections;
+ ti.id = VEC_length (dw_trace_info, trace_info) - 1;
+ VEC_safe_push (dw_trace_info, heap, trace_info, ti);
saw_barrier = false;
switch_sections = false;
@@ -2766,19 +2763,20 @@ create_pseudo_cfg (void)
avoiding stale pointer problems due to reallocation. */
trace_index = htab_create (VEC_length (dw_trace_info, trace_info),
dw_trace_info_hash, dw_trace_info_eq, NULL);
- FOR_EACH_VEC_ELT (dw_trace_info, trace_info, i, ti)
+ dw_trace_info *tp;
+ FOR_EACH_VEC_ELT (dw_trace_info, trace_info, i, tp)
{
void **slot;
if (dump_file)
fprintf (dump_file, "Creating trace %u : start at %s %d%s\n", i,
- rtx_name[(int) GET_CODE (ti->head)], INSN_UID (ti->head),
- ti->switch_sections ? " (section switch)" : "");
+ rtx_name[(int) GET_CODE (tp->head)], INSN_UID (tp->head),
+ tp->switch_sections ? " (section switch)" : "");
- slot = htab_find_slot_with_hash (trace_index, ti,
- INSN_UID (ti->head), INSERT);
+ slot = htab_find_slot_with_hash (trace_index, tp,
+ INSN_UID (tp->head), INSERT);
gcc_assert (*slot == NULL);
- *slot = (void *) ti;
+ *slot = (void *) tp;
}
}
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 9adb07106ba..06920a9d1fb 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -3484,7 +3484,7 @@ add_dwarf_attr (dw_die_ref die, dw_attr_ref attr)
if (die->die_attr == NULL)
die->die_attr = VEC_alloc (dw_attr_node, gc, 1);
- VEC_safe_push (dw_attr_node, gc, die->die_attr, attr);
+ VEC_safe_push (dw_attr_node, gc, die->die_attr, *attr);
}
static inline enum dw_val_class
@@ -8218,7 +8218,7 @@ add_pubname_string (const char *str, dw_die_ref die)
e.die = die;
e.name = xstrdup (str);
- VEC_safe_push (pubname_entry, gc, pubname_table, &e);
+ VEC_safe_push (pubname_entry, gc, pubname_table, e);
}
static void
@@ -8252,7 +8252,7 @@ add_enumerator_pubname (const char *scope_name, dw_die_ref die)
gcc_assert (scope_name);
e.name = concat (scope_name, get_AT_string (die, DW_AT_name), NULL);
e.die = die;
- VEC_safe_push (pubname_entry, gc, pubname_table, &e);
+ VEC_safe_push (pubname_entry, gc, pubname_table, e);
}
/* Add a new entry to .debug_pubtypes if appropriate. */
@@ -8295,7 +8295,7 @@ add_pubtype (tree decl, dw_die_ref die)
{
e.die = die;
e.name = concat (scope_name, name, NULL);
- VEC_safe_push (pubname_entry, gc, pubtype_table, &e);
+ VEC_safe_push (pubname_entry, gc, pubtype_table, e);
}
/* Although it might be more consistent to add the pubinfo for the
@@ -14671,7 +14671,7 @@ defer_location (tree variable, dw_die_ref die)
deferred_locations entry;
entry.variable = variable;
entry.die = die;
- VEC_safe_push (deferred_locations, gc, deferred_locations_list, &entry);
+ VEC_safe_push (deferred_locations, gc, deferred_locations_list, entry);
}
/* Helper function for tree_add_const_value_attribute. Natively encode
@@ -16762,7 +16762,6 @@ dwarf2out_abstract_function (tree decl)
/* Pretend we've just finished compiling this function. */
save_fn = current_function_decl;
current_function_decl = decl;
- push_cfun (DECL_STRUCT_FUNCTION (decl));
was_abstract = DECL_ABSTRACT (decl);
set_decl_abstract_flags (decl, 1);
@@ -16776,7 +16775,6 @@ dwarf2out_abstract_function (tree decl)
call_arg_locations = old_call_arg_locations;
call_site_count = old_call_site_count;
tail_call_site_count = old_tail_call_site_count;
- pop_cfun ();
}
/* Helper function of premark_used_types() which gets called through
@@ -16835,10 +16833,10 @@ premark_types_used_by_global_vars_helper (void **slot,
/* Mark all members of used_types_hash as perennial. */
static void
-premark_used_types (void)
+premark_used_types (struct function *fun)
{
- if (cfun && cfun->used_types_hash)
- htab_traverse (cfun->used_types_hash, premark_used_types_helper, NULL);
+ if (fun && fun->used_types_hash)
+ htab_traverse (fun->used_types_hash, premark_used_types_helper, NULL);
}
/* Mark all members of types_used_by_vars_entry as perennial. */
@@ -16901,7 +16899,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
int declaration = (current_function_decl != decl
|| class_or_namespace_scope_p (context_die));
- premark_used_types ();
+ premark_used_types (DECL_STRUCT_FUNCTION (decl));
/* It is possible to have both DECL_ABSTRACT and DECLARATION be true if we
started to generate the abstract instance of an inline, decided to output
@@ -17064,13 +17062,15 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
else if (!DECL_EXTERNAL (decl))
{
HOST_WIDE_INT cfa_fb_offset;
+ struct function *fun = DECL_STRUCT_FUNCTION (decl);
if (!old_die || !get_AT (old_die, DW_AT_inline))
equate_decl_number_to_die (decl, subr_die);
+ gcc_checking_assert (fun);
if (!flag_reorder_blocks_and_partition)
{
- dw_fde_ref fde = cfun->fde;
+ dw_fde_ref fde = fun->fde;
if (fde->dw_fde_begin)
{
/* We have already generated the labels. */
@@ -17116,7 +17116,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
else
{
/* Generate pubnames entries for the split function code ranges. */
- dw_fde_ref fde = cfun->fde;
+ dw_fde_ref fde = fun->fde;
if (fde->dw_fde_second_begin)
{
@@ -17216,9 +17216,9 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
by this displacement. */
compute_frame_pointer_to_fb_displacement (cfa_fb_offset);
- if (cfun->static_chain_decl)
+ if (fun->static_chain_decl)
add_AT_location_description (subr_die, DW_AT_static_link,
- loc_list_from_tree (cfun->static_chain_decl, 2));
+ loc_list_from_tree (fun->static_chain_decl, 2));
}
/* Generate child dies for template paramaters. */
@@ -19870,7 +19870,7 @@ append_entry_to_tmpl_value_parm_die_table (dw_die_ref die, tree arg)
entry.arg = arg;
VEC_safe_push (die_arg_entry, gc,
tmpl_value_parm_die_table,
- &entry);
+ entry);
}
/* Return TRUE if T is an instance of generic type, FALSE
@@ -20256,7 +20256,7 @@ push_dw_line_info_entry (dw_line_info_table *table,
dw_line_info_entry e;
e.opcode = opcode;
e.val = val;
- VEC_safe_push (dw_line_info_entry, gc, table->entries, &e);
+ VEC_safe_push (dw_line_info_entry, gc, table->entries, e);
}
/* Output a label to mark the beginning of a source code line entry
@@ -20376,7 +20376,7 @@ dwarf2out_start_source_file (unsigned int lineno, const char *filename)
e.code = DW_MACINFO_start_file;
e.lineno = lineno;
e.info = ggc_strdup (filename);
- VEC_safe_push (macinfo_entry, gc, macinfo_table, &e);
+ VEC_safe_push (macinfo_entry, gc, macinfo_table, e);
}
}
@@ -20395,7 +20395,7 @@ dwarf2out_end_source_file (unsigned int lineno ATTRIBUTE_UNUSED)
e.code = DW_MACINFO_end_file;
e.lineno = lineno;
e.info = NULL;
- VEC_safe_push (macinfo_entry, gc, macinfo_table, &e);
+ VEC_safe_push (macinfo_entry, gc, macinfo_table, e);
}
}
@@ -20417,12 +20417,12 @@ dwarf2out_define (unsigned int lineno ATTRIBUTE_UNUSED,
e.code = 0;
e.lineno = 0;
e.info = NULL;
- VEC_safe_push (macinfo_entry, gc, macinfo_table, &e);
+ VEC_safe_push (macinfo_entry, gc, macinfo_table, e);
}
e.code = DW_MACINFO_define;
e.lineno = lineno;
e.info = ggc_strdup (buffer);
- VEC_safe_push (macinfo_entry, gc, macinfo_table, &e);
+ VEC_safe_push (macinfo_entry, gc, macinfo_table, e);
}
}
@@ -20444,12 +20444,12 @@ dwarf2out_undef (unsigned int lineno ATTRIBUTE_UNUSED,
e.code = 0;
e.lineno = 0;
e.info = NULL;
- VEC_safe_push (macinfo_entry, gc, macinfo_table, &e);
+ VEC_safe_push (macinfo_entry, gc, macinfo_table, e);
}
e.code = DW_MACINFO_undef;
e.lineno = lineno;
e.info = ggc_strdup (buffer);
- VEC_safe_push (macinfo_entry, gc, macinfo_table, &e);
+ VEC_safe_push (macinfo_entry, gc, macinfo_table, e);
}
}
@@ -20725,7 +20725,7 @@ output_macinfo (void)
switch (ref->code)
{
case DW_MACINFO_start_file:
- VEC_safe_push (macinfo_entry, gc, files, ref);
+ VEC_safe_push (macinfo_entry, gc, files, *ref);
break;
case DW_MACINFO_end_file:
if (!VEC_empty (macinfo_entry, files))
@@ -21364,7 +21364,7 @@ move_linkage_attr (dw_die_ref die)
if (ix != VEC_length (dw_attr_node, die->die_attr) - 1)
{
VEC_pop (dw_attr_node, die->die_attr);
- VEC_quick_insert (dw_attr_node, die->die_attr, ix, &linkage);
+ VEC_quick_insert (dw_attr_node, die->die_attr, ix, linkage);
}
}
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 34d85de495f..f7639455909 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -2051,12 +2051,16 @@ change_address (rtx memref, enum machine_mode mode, rtx addr)
/* Return a memory reference like MEMREF, but with its mode changed
to MODE and its address offset by OFFSET bytes. If VALIDATE is
nonzero, the memory address is forced to be valid.
- If ADJUST is zero, OFFSET is only used to update MEM_ATTRS
- and caller is responsible for adjusting MEMREF base register. */
+ If ADJUST_ADDRESS is zero, OFFSET is only used to update MEM_ATTRS
+ and the caller is responsible for adjusting MEMREF base register.
+ If ADJUST_OBJECT is zero, the underlying object associated with the
+ memory reference is left unchanged and the caller is responsible for
+ dealing with it. Otherwise, if the new memory reference is outside
+ the underlying object, even partially, then the object is dropped. */
rtx
adjust_address_1 (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset,
- int validate, int adjust)
+ int validate, int adjust_address, int adjust_object)
{
rtx addr = XEXP (memref, 0);
rtx new_rtx;
@@ -2089,7 +2093,7 @@ adjust_address_1 (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset,
>> shift);
}
- if (adjust)
+ if (adjust_address)
{
/* If MEMREF is a LO_SUM and the offset is within the alignment of the
object, we can merge it into the LO_SUM. */
@@ -2111,10 +2115,26 @@ adjust_address_1 (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset,
if (new_rtx == memref && offset != 0)
new_rtx = copy_rtx (new_rtx);
+ /* Conservatively drop the object if we don't know where we start from. */
+ if (adjust_object && (!attrs.offset_known_p || !attrs.size_known_p))
+ {
+ attrs.expr = NULL_TREE;
+ attrs.alias = 0;
+ }
+
/* Compute the new values of the memory attributes due to this adjustment.
We add the offsets and update the alignment. */
if (attrs.offset_known_p)
- attrs.offset += offset;
+ {
+ attrs.offset += offset;
+
+ /* Drop the object if the new left end is not within its bounds. */
+ if (adjust_object && attrs.offset < 0)
+ {
+ attrs.expr = NULL_TREE;
+ attrs.alias = 0;
+ }
+ }
/* Compute the new alignment by taking the MIN of the alignment and the
lowest-order set bit in OFFSET, but don't change the alignment if OFFSET
@@ -2129,16 +2149,24 @@ adjust_address_1 (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset,
defattrs = mode_mem_attrs[(int) GET_MODE (new_rtx)];
if (defattrs->size_known_p)
{
+ /* Drop the object if the new right end is not within its bounds. */
+ if (adjust_object && (offset + defattrs->size) > attrs.size)
+ {
+ attrs.expr = NULL_TREE;
+ attrs.alias = 0;
+ }
attrs.size_known_p = true;
attrs.size = defattrs->size;
}
else if (attrs.size_known_p)
- attrs.size -= offset;
+ {
+ attrs.size -= offset;
+ /* ??? The store_by_pieces machinery generates negative sizes. */
+ gcc_assert (!(adjust_object && attrs.size < 0));
+ }
set_mem_attrs (new_rtx, &attrs);
- /* At some point, we should validate that this offset is within the object,
- if all the appropriate values are known. */
return new_rtx;
}
@@ -2152,7 +2180,7 @@ adjust_automodify_address_1 (rtx memref, enum machine_mode mode, rtx addr,
HOST_WIDE_INT offset, int validate)
{
memref = change_address_1 (memref, VOIDmode, addr, validate);
- return adjust_address_1 (memref, mode, offset, validate, 0);
+ return adjust_address_1 (memref, mode, offset, validate, 0, 0);
}
/* Return a memory reference like MEMREF, but whose address is changed by
@@ -2234,7 +2262,7 @@ replace_equiv_address_nv (rtx memref, rtx addr)
rtx
widen_memory_access (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset)
{
- rtx new_rtx = adjust_address_1 (memref, mode, offset, 1, 1);
+ rtx new_rtx = adjust_address_1 (memref, mode, offset, 1, 1, 0);
struct mem_attrs attrs;
unsigned int size = GET_MODE_SIZE (mode);
@@ -6004,7 +6032,7 @@ curr_insn_locator (void)
{
curr_rtl_loc++;
VEC_safe_push (int, heap, locations_locators_locs, curr_rtl_loc);
- VEC_safe_push (location_t, heap, locations_locators_vals, &curr_location);
+ VEC_safe_push (location_t, heap, locations_locators_vals, curr_location);
last_location = curr_location;
}
return curr_rtl_loc;
diff --git a/gcc/except.c b/gcc/except.c
index ae5a11fdaa0..801718de195 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -304,8 +304,8 @@ init_eh_for_function (void)
cfun->eh = ggc_alloc_cleared_eh_status ();
/* Make sure zero'th entries are used. */
- VEC_safe_push (eh_region, gc, cfun->eh->region_array, (eh_region) NULL);
- VEC_safe_push (eh_landing_pad, gc, cfun->eh->lp_array, (eh_landing_pad) NULL);
+ VEC_safe_push (eh_region, gc, cfun->eh->region_array, NULL);
+ VEC_safe_push (eh_landing_pad, gc, cfun->eh->lp_array, NULL);
}
/* Routines to generate the exception tree somewhat directly.
@@ -806,7 +806,7 @@ add_ehspec_entry (htab_t ehspec_hash, htab_t ttypes_hash, tree list)
if (targetm.arm_eabi_unwinder)
VEC_safe_push (tree, gc, cfun->eh->ehspec_data.arm_eabi, NULL_TREE);
else
- VEC_safe_push (uchar, gc, cfun->eh->ehspec_data.other, (uchar) 0);
+ VEC_safe_push (uchar, gc, cfun->eh->ehspec_data.other, 0);
}
return n->filter;
@@ -1361,17 +1361,9 @@ sjlj_emit_dispatch_table (rtx dispatch_label, int num_dispatch)
if (num_dispatch > 1)
{
- gimple switch_stmt;
- tree default_label = create_artificial_label (UNKNOWN_LOCATION);
rtx disp = adjust_address (fc, TYPE_MODE (integer_type_node),
sjlj_fc_call_site_ofs);
- switch_stmt = gimple_build_switch (make_tree (integer_type_node, disp),
- build_case_label (NULL, NULL,
- default_label),
- dispatch_labels);
- expand_case (switch_stmt);
- emit_label (label_rtx (default_label));
- expand_builtin_trap ();
+ expand_sjlj_dispatch_table (disp, dispatch_labels);
}
seq = get_insns ();
diff --git a/gcc/expmed.c b/gcc/expmed.c
index 24a15770a47..cde92463637 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -500,7 +500,7 @@ store_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
&& MEM_ALIGN (op0) % GET_MODE_BITSIZE (fieldmode) == 0))))
{
if (MEM_P (op0))
- op0 = adjust_address (op0, fieldmode, offset);
+ op0 = adjust_bitfield_address (op0, fieldmode, offset);
else if (GET_MODE (op0) != fieldmode)
op0 = simplify_gen_subreg (fieldmode, op0, GET_MODE (op0),
byte_offset);
@@ -517,7 +517,7 @@ store_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
if (imode != GET_MODE (op0))
{
if (MEM_P (op0))
- op0 = adjust_address (op0, imode, 0);
+ op0 = adjust_bitfield_address (op0, imode, 0);
else
{
gcc_assert (imode != BLKmode);
@@ -526,16 +526,6 @@ store_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
}
}
- /* We may be accessing data outside the field, which means
- we can alias adjacent data. */
- /* ?? not always for C++0x memory model ?? */
- if (MEM_P (op0))
- {
- op0 = shallow_copy_rtx (op0);
- set_mem_alias_set (op0, 0);
- set_mem_expr (op0, 0);
- }
-
/* If OP0 is a register, BITPOS must count within a word.
But as we have it, it counts within whatever size OP0 now has.
On a bigendian machine, these are not the same, so convert. */
@@ -718,7 +708,7 @@ store_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
/* Add OFFSET into OP0's address. */
if (MEM_P (xop0))
- xop0 = adjust_address (xop0, byte_mode, offset);
+ xop0 = adjust_bitfield_address (xop0, byte_mode, offset);
/* If xop0 is a register, we need it in OP_MODE
to make it acceptable to the format of insv. */
@@ -852,7 +842,7 @@ store_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
unit = GET_MODE_BITSIZE (bestmode);
xoffset = (bitnum / unit) * GET_MODE_SIZE (bestmode);
xbitpos = bitnum % unit;
- xop0 = adjust_address (op0, bestmode, xoffset);
+ xop0 = adjust_bitfield_address (op0, bestmode, xoffset);
/* Fetch that unit, store the bitfield in it, then store
the unit. */
@@ -1024,7 +1014,7 @@ store_fixed_bit_field (rtx op0, unsigned HOST_WIDE_INT offset,
Then alter OP0 to refer to that word. */
bitpos += (offset % (total_bits / BITS_PER_UNIT)) * BITS_PER_UNIT;
offset -= (offset % (total_bits / BITS_PER_UNIT));
- op0 = adjust_address (op0, mode, offset);
+ op0 = adjust_bitfield_address (op0, mode, offset);
}
mode = GET_MODE (op0);
@@ -1388,7 +1378,7 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
if (imode != GET_MODE (op0))
{
if (MEM_P (op0))
- op0 = adjust_address (op0, imode, 0);
+ op0 = adjust_bitfield_address (op0, imode, 0);
else if (imode != BLKmode)
{
op0 = gen_lowpart (imode, op0);
@@ -1414,20 +1404,11 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
rtx mem = assign_stack_temp (GET_MODE (op0),
GET_MODE_SIZE (GET_MODE (op0)));
emit_move_insn (mem, op0);
- op0 = adjust_address (mem, BLKmode, 0);
+ op0 = adjust_bitfield_address (mem, BLKmode, 0);
}
}
}
- /* We may be accessing data outside the field, which means
- we can alias adjacent data. */
- if (MEM_P (op0))
- {
- op0 = shallow_copy_rtx (op0);
- set_mem_alias_set (op0, 0);
- set_mem_expr (op0, 0);
- }
-
/* Extraction of a full-word or multi-word value from a structure
in a register or aligned memory can be done with just a SUBREG.
A subword value in the least significant part of a register
@@ -1487,7 +1468,7 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
&& MEM_ALIGN (op0) % bitsize == 0)))))
{
if (MEM_P (op0))
- op0 = adjust_address (op0, mode1, offset);
+ op0 = adjust_bitfield_address (op0, mode1, offset);
else if (mode1 != GET_MODE (op0))
{
rtx sub = simplify_gen_subreg (mode1, op0, GET_MODE (op0),
@@ -1513,6 +1494,7 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
unsigned int nwords = (bitsize + (BITS_PER_WORD - 1)) / BITS_PER_WORD;
unsigned int i;
+ rtx last;
if (target == 0 || !REG_P (target) || !valid_multiword_target_p (target))
target = gen_reg_rtx (mode);
@@ -1520,6 +1502,7 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
/* Indicate for flow that the entire target reg is being set. */
emit_clobber (target);
+ last = get_last_insn ();
for (i = 0; i < nwords; i++)
{
/* If I is 0, use the low-order word in both field and target;
@@ -1536,12 +1519,17 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
: (int) i * BITS_PER_WORD);
rtx target_part = operand_subword (target, wordnum, 1, VOIDmode);
rtx result_part
- = extract_bit_field (op0, MIN (BITS_PER_WORD,
- bitsize - i * BITS_PER_WORD),
- bitnum + bit_offset, 1, false, target_part, mode,
- word_mode);
+ = extract_bit_field_1 (op0, MIN (BITS_PER_WORD,
+ bitsize - i * BITS_PER_WORD),
+ bitnum + bit_offset, 1, false, target_part,
+ mode, word_mode, fallback_p);
gcc_assert (target_part);
+ if (!result_part)
+ {
+ delete_insns_since (last);
+ return NULL;
+ }
if (result_part != target_part)
emit_move_insn (target_part, result_part);
@@ -1629,7 +1617,7 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
xop0 = gen_lowpart_SUBREG (ext_mode, xop0);
if (MEM_P (xop0))
/* Get ref to first byte containing part of the field. */
- xop0 = adjust_address (xop0, byte_mode, xoffset);
+ xop0 = adjust_bitfield_address (xop0, byte_mode, xoffset);
/* Now convert from counting within UNIT to counting in EXT_MODE. */
if (BYTES_BIG_ENDIAN && !MEM_P (xop0))
@@ -1725,7 +1713,7 @@ extract_bit_field_1 (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
last = get_last_insn ();
/* Fetch it to a register in that size. */
- xop0 = adjust_address (op0, bestmode, xoffset);
+ xop0 = adjust_bitfield_address (op0, bestmode, xoffset);
xop0 = force_reg (bestmode, xop0);
result = extract_bit_field_1 (xop0, bitsize, xbitpos,
unsignedp, packedp, target,
@@ -1906,7 +1894,7 @@ extract_fixed_bit_field (enum machine_mode tmode, rtx op0,
offset -= (offset % (total_bits / BITS_PER_UNIT));
}
- op0 = adjust_address (op0, mode, offset);
+ op0 = adjust_bitfield_address (op0, mode, offset);
}
mode = GET_MODE (op0);
diff --git a/gcc/expr.c b/gcc/expr.c
index 2ed2f960aa6..c53f1a8dc9b 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -4870,8 +4870,16 @@ expand_assignment (tree to, tree from, bool nontemporal)
/* Handle calls that return values in multiple non-contiguous locations.
The Irix 6 ABI has examples of this. */
if (GET_CODE (to_rtx) == PARALLEL)
- emit_group_load (to_rtx, value, TREE_TYPE (from),
- int_size_in_bytes (TREE_TYPE (from)));
+ {
+ if (GET_CODE (value) == PARALLEL)
+ emit_group_move (to_rtx, value);
+ else
+ emit_group_load (to_rtx, value, TREE_TYPE (from),
+ int_size_in_bytes (TREE_TYPE (from)));
+ }
+ else if (GET_CODE (value) == PARALLEL)
+ emit_group_store (to_rtx, value, TREE_TYPE (from),
+ int_size_in_bytes (TREE_TYPE (from)));
else if (GET_MODE (to_rtx) == BLKmode)
emit_block_move (to_rtx, value, expr_size (from), BLOCK_OP_NORMAL);
else
@@ -4903,9 +4911,16 @@ expand_assignment (tree to, tree from, bool nontemporal)
else
temp = expand_expr (from, NULL_RTX, GET_MODE (to_rtx), EXPAND_NORMAL);
+ /* Handle calls that return values in multiple non-contiguous locations.
+ The Irix 6 ABI has examples of this. */
if (GET_CODE (to_rtx) == PARALLEL)
- emit_group_load (to_rtx, temp, TREE_TYPE (from),
- int_size_in_bytes (TREE_TYPE (from)));
+ {
+ if (GET_CODE (temp) == PARALLEL)
+ emit_group_move (to_rtx, temp);
+ else
+ emit_group_load (to_rtx, temp, TREE_TYPE (from),
+ int_size_in_bytes (TREE_TYPE (from)));
+ }
else if (temp)
emit_move_insn (to_rtx, temp);
@@ -5299,16 +5314,22 @@ store_expr (tree exp, rtx target, int call_param_p, bool nontemporal)
/* Handle calls that return values in multiple non-contiguous locations.
The Irix 6 ABI has examples of this. */
else if (GET_CODE (target) == PARALLEL)
- emit_group_load (target, temp, TREE_TYPE (exp),
- int_size_in_bytes (TREE_TYPE (exp)));
+ {
+ if (GET_CODE (temp) == PARALLEL)
+ emit_group_move (target, temp);
+ else
+ emit_group_load (target, temp, TREE_TYPE (exp),
+ int_size_in_bytes (TREE_TYPE (exp)));
+ }
+ else if (GET_CODE (temp) == PARALLEL)
+ emit_group_store (target, temp, TREE_TYPE (exp),
+ int_size_in_bytes (TREE_TYPE (exp)));
else if (GET_MODE (temp) == BLKmode)
emit_block_move (target, temp, expr_size (exp),
(call_param_p
? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
- else if (nontemporal
- && emit_storent_insn (target, temp))
- /* If we managed to emit a nontemporal store, there is nothing else to
- do. */
+ /* If we emit a nontemporal store, there is nothing else to do. */
+ else if (nontemporal && emit_storent_insn (target, temp))
;
else
{
@@ -6429,10 +6450,18 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
return const0_rtx;
}
- /* Store the value in the bitfield. */
- store_bit_field (target, bitsize, bitpos,
- bitregion_start, bitregion_end,
- mode, temp);
+ /* Handle calls that return values in multiple non-contiguous locations.
+ The Irix 6 ABI has examples of this. */
+ if (bitpos == 0
+ && bitsize == GET_MODE_BITSIZE (mode)
+ && GET_CODE (temp) == PARALLEL)
+ emit_group_store (target, temp, TREE_TYPE (exp),
+ int_size_in_bytes (TREE_TYPE (exp)));
+ else
+ /* Store the value in the bitfield. */
+ store_bit_field (target, bitsize, bitpos,
+ bitregion_start, bitregion_end,
+ mode, temp);
return const0_rtx;
}
diff --git a/gcc/expr.h b/gcc/expr.h
index 68cdb8d9109..154648e7bff 100644
--- a/gcc/expr.h
+++ b/gcc/expr.h
@@ -557,11 +557,22 @@ extern rtx change_address (rtx, enum machine_mode, rtx);
/* Return a memory reference like MEMREF, but with its mode changed
to MODE and its address offset by OFFSET bytes. */
#define adjust_address(MEMREF, MODE, OFFSET) \
- adjust_address_1 (MEMREF, MODE, OFFSET, 1, 1)
+ adjust_address_1 (MEMREF, MODE, OFFSET, 1, 1, 0)
/* Likewise, but the reference is not required to be valid. */
#define adjust_address_nv(MEMREF, MODE, OFFSET) \
- adjust_address_1 (MEMREF, MODE, OFFSET, 0, 1)
+ adjust_address_1 (MEMREF, MODE, OFFSET, 0, 1, 0)
+
+/* Return a memory reference like MEMREF, but with its mode changed
+ to MODE and its address offset by OFFSET bytes. Assume that it's
+ for a bitfield and conservatively drop the underlying object if we
+ cannot be sure to stay within its bounds. */
+#define adjust_bitfield_address(MEMREF, MODE, OFFSET) \
+ adjust_address_1 (MEMREF, MODE, OFFSET, 1, 1, 1)
+
+/* Likewise, but the reference is not required to be valid. */
+#define adjust_bitfield_address_nv(MEMREF, MODE, OFFSET) \
+ adjust_address_1 (MEMREF, MODE, OFFSET, 0, 1, 1)
/* Return a memory reference like MEMREF, but with its mode changed
to MODE and its address changed to ADDR, which is assumed to be
@@ -573,7 +584,8 @@ extern rtx change_address (rtx, enum machine_mode, rtx);
#define adjust_automodify_address_nv(MEMREF, MODE, ADDR, OFFSET) \
adjust_automodify_address_1 (MEMREF, MODE, ADDR, OFFSET, 0)
-extern rtx adjust_address_1 (rtx, enum machine_mode, HOST_WIDE_INT, int, int);
+extern rtx adjust_address_1 (rtx, enum machine_mode, HOST_WIDE_INT, int, int,
+ int);
extern rtx adjust_automodify_address_1 (rtx, enum machine_mode, rtx,
HOST_WIDE_INT, int);
@@ -721,4 +733,13 @@ extern tree build_libfunc_function (const char *);
/* Get the personality libfunc for a function decl. */
rtx get_personality_function (tree);
+
+/* In stmt.c */
+
+/* Expand a GIMPLE_SWITCH statement. */
+extern void expand_case (gimple);
+
+/* Like expand_case but special-case for SJLJ exception dispatching. */
+extern void expand_sjlj_dispatch_table (rtx, VEC(tree,heap) *);
+
#endif /* GCC_EXPR_H */
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 24e21ebbd2e..c76e7ff68d3 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -7771,7 +7771,7 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0)
return build2_loc (loc, TREE_CODE (op0), type,
TREE_OPERAND (op0, 0),
TREE_OPERAND (op0, 1));
- else if (!INTEGRAL_TYPE_P (type))
+ else if (!INTEGRAL_TYPE_P (type) && TREE_CODE (type) != VECTOR_TYPE)
return build3_loc (loc, COND_EXPR, type, op0,
constant_boolean_node (true, type),
constant_boolean_node (false, type));
@@ -9829,6 +9829,7 @@ fold_binary_loc (location_t loc,
if ((code == BIT_AND_EXPR || code == BIT_IOR_EXPR
|| code == EQ_EXPR || code == NE_EXPR)
+ && TREE_CODE (type) != VECTOR_TYPE
&& ((truth_value_p (TREE_CODE (arg0))
&& (truth_value_p (TREE_CODE (arg1))
|| (TREE_CODE (arg1) == BIT_AND_EXPR
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index f0e6cad6465..cc97cac2466 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,80 @@
+2012-09-16 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/54594
+ * resolve.c (get_checked_tb_operator_target): Add a reference to the
+ relevant quote from the F08 standard.
+
+2012-09-16 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/54594
+ * interface.c (compare_type_rank): Handle CLASS arrays.
+
+2012-09-16 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/54387
+ * expr.c (gfc_check_pointer_assign): Check for result of embracing
+ function.
+
+2012-09-16 Tobias Burnus <burnus@net-b.de>
+
+ * trans-decl.c (gfc_generate_function_code): Fix
+ gfc_option.coarray check.
+ * trans-stmt.c (compute_inner_temp_size): Fix handling
+ of gfc_option.rtcheck.
+
+2012-09-16 Mikael Morin <mikael@gcc.gnu.org>
+
+ * symbol.c (gfc_undo_symbols): Correctly undo namelists.
+
+2012-09-15 Tobias Burnus <burnus@net-b.de>
+
+ * trans-io.c (gfc_trans_transfer): Add an assert.
+
+2012-09-15 Tobias Burnus <burnus@net-b.de>
+
+ * arith.c (arith_power): Call gfc_free_expr in case of error.
+ * array.c (gfc_match_array_constructor): Initialize variable.
+ (gfc_resolve_character_array_constructor): Remove superfluous check.
+ (gfc_array_dimen_size): Add assert.
+ * check.c (numeric_check): Fix implicit typing.
+ * class.c (gfc_build_class_symbol): Add assert.
+ (finalize_component): Free memory.
+ * dump-parse-tree.c (show_namespace): Add assert.
+ * trans-io.c (transfer_namelist_element, transfer_expr): Avoid
+ memory leakage.
+ (gfc_trans_transfer): Add assert.
+ * trans.c (gfc_trans_runtime_check): Call va_end
+
+2012-09-15 Tobias Burnus <burnus@net-b.de>
+
+ * match.c (lock_unlock_statement, sync_statement): Fix potential
+ double freeing.
+ (sync_statement): Remove unreachable code.
+ * simplify.c (gfc_simplify_bessel_n2): Avoid double freeing.
+ (gfc_simplify_repeat): Remove bogus code.
+ * target-memory.h (gfc_target_encode_expr): Update prototype.
+ * target-memory.c (gfc_target_encode_expr, encode_array,
+ encode_derived): Return unsigned HOST_WIDE_INT.
+ (gfc_target_interpret_expr): Add assert.
+ (gfc_merge_initializers): Fix "== 0" check for mpz_t.
+ * symbol.c (gfc_get_typebound_proc): Add assert.
+ (gfc_merge_initializers): Remove unreachable check.
+
+2012-09-13 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/54556
+ * resolve.c (resolve_formal_arglist): Allow VALUE arguments
+ with implicit_pure.
+ (gfc_impure_variable): Don't check gfc_pure such that the
+ function also works for gfc_implicit_pure procedures.
+
+2012-09-12 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/54225
+ PR fortran/53306
+ * array.c (match_subscript, gfc_match_array_ref): Fix
+ diagnostic of coarray's '*'.
+
2012-09-07 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/54208
diff --git a/gcc/fortran/arith.c b/gcc/fortran/arith.c
index 6fa7c70fe9c..e94566aa65c 100644
--- a/gcc/fortran/arith.c
+++ b/gcc/fortran/arith.c
@@ -906,7 +906,10 @@ arith_power (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
if (gfc_notify_std (GFC_STD_F2003, "Noninteger "
"exponent in an initialization "
"expression at %L", &op2->where) == FAILURE)
- return ARITH_PROHIBIT;
+ {
+ gfc_free_expr (result);
+ return ARITH_PROHIBIT;
+ }
}
if (mpfr_cmp_si (op1->value.real, 0) < 0)
@@ -928,7 +931,10 @@ arith_power (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
if (gfc_notify_std (GFC_STD_F2003, "Noninteger "
"exponent in an initialization "
"expression at %L", &op2->where) == FAILURE)
- return ARITH_PROHIBIT;
+ {
+ gfc_free_expr (result);
+ return ARITH_PROHIBIT;
+ }
}
mpc_pow (result->value.complex, op1->value.complex,
diff --git a/gcc/fortran/array.c b/gcc/fortran/array.c
index 07fecd8aaf3..066ac1ea902 100644
--- a/gcc/fortran/array.c
+++ b/gcc/fortran/array.c
@@ -91,9 +91,7 @@ match_subscript (gfc_array_ref *ar, int init, bool match_star)
else if (!star)
m = gfc_match_expr (&ar->start[i]);
- if (m == MATCH_NO && gfc_match_char ('*') == MATCH_YES)
- return MATCH_NO;
- else if (m == MATCH_NO)
+ if (m == MATCH_NO)
gfc_error ("Expected array subscript at %C");
if (m != MATCH_YES)
return MATCH_ERROR;
@@ -224,7 +222,7 @@ coarray:
for (ar->codimen = 0; ar->codimen + ar->dimen < GFC_MAX_DIMENSIONS; ar->codimen++)
{
- m = match_subscript (ar, init, ar->codimen == (corank - 1));
+ m = match_subscript (ar, init, true);
if (m == MATCH_ERROR)
return MATCH_ERROR;
@@ -255,6 +253,13 @@ coarray:
gfc_error ("Invalid form of coarray reference at %C");
return MATCH_ERROR;
}
+ else if (ar->dimen_type[ar->codimen + ar->dimen] == DIMEN_STAR)
+ {
+ gfc_error ("Unexpected '*' for codimension %d of %d at %C",
+ ar->codimen + 1, corank);
+ return MATCH_ERROR;
+ }
+
if (ar->codimen >= corank)
{
gfc_error ("Invalid codimension %d at %C, only %d codimensions exist",
@@ -1069,6 +1074,7 @@ gfc_match_array_constructor (gfc_expr **result)
seen_ts = false;
/* Try to match an optional "type-spec ::" */
+ gfc_clear_ts (&ts);
if (gfc_match_decl_type_spec (&ts, 0) == MATCH_YES)
{
seen_ts = (gfc_match (" ::") == MATCH_YES);
@@ -1968,7 +1974,7 @@ got_charlen:
/* If gfc_extract_int above set current_length, we implicitly
know the type is BT_INTEGER and it's EXPR_CONSTANT. */
- has_ts = (expr->ts.u.cl && expr->ts.u.cl->length_from_typespec);
+ has_ts = expr->ts.u.cl->length_from_typespec;
if (! cl
|| (current_length != -1 && current_length != found_length))
@@ -2220,13 +2226,15 @@ gfc_array_dimen_size (gfc_expr *array, int dimen, mpz_t *result)
gfc_ref *ref;
int i;
+ gcc_assert (array != NULL);
+
if (array->ts.type == BT_CLASS)
return FAILURE;
if (array->rank == -1)
return FAILURE;
- if (dimen < 0 || array == NULL || dimen > array->rank - 1)
+ if (dimen < 0 || dimen > array->rank - 1)
gfc_internal_error ("gfc_array_dimen_size(): Bad dimension");
switch (array->expr_type)
diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c
index 2235b52d6d3..58c5856795d 100644
--- a/gcc/fortran/check.c
+++ b/gcc/fortran/check.c
@@ -79,7 +79,7 @@ numeric_check (gfc_expr *e, int n)
/* If the expression has not got a type, check if its namespace can
offer a default type. */
- if ((e->expr_type == EXPR_VARIABLE || e->expr_type == EXPR_VARIABLE)
+ if ((e->expr_type == EXPR_VARIABLE || e->expr_type == EXPR_FUNCTION)
&& e->symtree->n.sym->ts.type == BT_UNKNOWN
&& gfc_set_default_type (e->symtree->n.sym, 0,
e->symtree->n.sym->ns) == SUCCESS
diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index dca2cfc1cda..2e347cb8670 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -503,7 +503,9 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_attribute *attr,
gfc_component *c;
int rank;
- if (as && *as && (*as)->type == AS_ASSUMED_SIZE)
+ gcc_assert (as);
+
+ if (*as && (*as)->type == AS_ASSUMED_SIZE)
{
gfc_error ("Assumed size polymorphic objects or components, such "
"as that at %C, have not yet been implemented");
@@ -838,6 +840,7 @@ finalize_component (gfc_expr *expr, gfc_symbol *derived, gfc_component *comp,
for (c = comp->ts.u.derived->components; c; c = c->next)
finalize_component (e, c->ts.u.derived, c, stat, code);
+ gfc_free_expr (e);
}
}
diff --git a/gcc/fortran/dump-parse-tree.c b/gcc/fortran/dump-parse-tree.c
index 9d6f93c5f77..a442625cb8a 100644
--- a/gcc/fortran/dump-parse-tree.c
+++ b/gcc/fortran/dump-parse-tree.c
@@ -2248,67 +2248,63 @@ show_namespace (gfc_namespace *ns)
gfc_equiv *eq;
int i;
+ gcc_assert (ns);
save = gfc_current_ns;
show_indent ();
fputs ("Namespace:", dumpfile);
- if (ns != NULL)
+ i = 0;
+ do
{
- i = 0;
- do
- {
- int l = i;
- while (i < GFC_LETTERS - 1
- && gfc_compare_types(&ns->default_type[i+1],
- &ns->default_type[l]))
- i++;
-
- if (i > l)
- fprintf (dumpfile, " %c-%c: ", l+'A', i+'A');
- else
- fprintf (dumpfile, " %c: ", l+'A');
+ int l = i;
+ while (i < GFC_LETTERS - 1
+ && gfc_compare_types (&ns->default_type[i+1],
+ &ns->default_type[l]))
+ i++;
+
+ if (i > l)
+ fprintf (dumpfile, " %c-%c: ", l+'A', i+'A');
+ else
+ fprintf (dumpfile, " %c: ", l+'A');
- show_typespec(&ns->default_type[l]);
- i++;
- } while (i < GFC_LETTERS);
+ show_typespec(&ns->default_type[l]);
+ i++;
+ } while (i < GFC_LETTERS);
- if (ns->proc_name != NULL)
- {
- show_indent ();
- fprintf (dumpfile, "procedure name = %s", ns->proc_name->name);
- }
+ if (ns->proc_name != NULL)
+ {
+ show_indent ();
+ fprintf (dumpfile, "procedure name = %s", ns->proc_name->name);
+ }
- ++show_level;
- gfc_current_ns = ns;
- gfc_traverse_symtree (ns->common_root, show_common);
+ ++show_level;
+ gfc_current_ns = ns;
+ gfc_traverse_symtree (ns->common_root, show_common);
- gfc_traverse_symtree (ns->sym_root, show_symtree);
+ gfc_traverse_symtree (ns->sym_root, show_symtree);
- for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; op++)
- {
- /* User operator interfaces */
- intr = ns->op[op];
- if (intr == NULL)
- continue;
+ for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; op++)
+ {
+ /* User operator interfaces */
+ intr = ns->op[op];
+ if (intr == NULL)
+ continue;
- show_indent ();
- fprintf (dumpfile, "Operator interfaces for %s:",
- gfc_op2string ((gfc_intrinsic_op) op));
+ show_indent ();
+ fprintf (dumpfile, "Operator interfaces for %s:",
+ gfc_op2string ((gfc_intrinsic_op) op));
- for (; intr; intr = intr->next)
- fprintf (dumpfile, " %s", intr->sym->name);
- }
+ for (; intr; intr = intr->next)
+ fprintf (dumpfile, " %s", intr->sym->name);
+ }
- if (ns->uop_root != NULL)
- {
- show_indent ();
- fputs ("User operators:\n", dumpfile);
- gfc_traverse_user_op (ns, show_uop);
- }
+ if (ns->uop_root != NULL)
+ {
+ show_indent ();
+ fputs ("User operators:\n", dumpfile);
+ gfc_traverse_user_op (ns, show_uop);
}
- else
- ++show_level;
for (eq = ns->equiv; eq; eq = eq->next)
show_equiv (eq);
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index bc1f5e33c6a..dced05dfb46 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -3430,6 +3430,15 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
gfc_resolve_intrinsic (sym, &rvalue->where);
attr = gfc_expr_attr (rvalue);
}
+ /* Check for result of embracing function. */
+ if (sym == gfc_current_ns->proc_name
+ && sym->attr.function && sym->result == sym)
+ {
+ gfc_error ("Function result '%s' is invalid as proc-target "
+ "in procedure pointer assignment at %L",
+ sym->name, &rvalue->where);
+ return FAILURE;
+ }
}
if (attr.abstract)
{
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index 482c294ecba..b34885632eb 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -507,14 +507,18 @@ gfc_compare_types (gfc_typespec *ts1, gfc_typespec *ts2)
static int
compare_type_rank (gfc_symbol *s1, gfc_symbol *s2)
{
+ gfc_array_spec *as1, *as2;
int r1, r2;
- r1 = (s1->as != NULL) ? s1->as->rank : 0;
- r2 = (s2->as != NULL) ? s2->as->rank : 0;
+ as1 = (s1->ts.type == BT_CLASS) ? CLASS_DATA (s1)->as : s1->as;
+ as2 = (s2->ts.type == BT_CLASS) ? CLASS_DATA (s2)->as : s2->as;
+
+ r1 = as1 ? as1->rank : 0;
+ r2 = as2 ? as2->rank : 0;
if (r1 != r2
- && (!s1->as || s1->as->type != AS_ASSUMED_RANK)
- && (!s2->as || s2->as->type != AS_ASSUMED_RANK))
+ && (!as1 || as1->type != AS_ASSUMED_RANK)
+ && (!as2 || as2->type != AS_ASSUMED_RANK))
return 0; /* Ranks differ. */
return gfc_compare_types (&s1->ts, &s2->ts)
diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c
index cf85d527749..d46a495ae01 100644
--- a/gcc/fortran/match.c
+++ b/gcc/fortran/match.c
@@ -2964,11 +2964,15 @@ syntax:
gfc_syntax_error (st);
cleanup:
+ if (acq_lock != tmp)
+ gfc_free_expr (acq_lock);
+ if (errmsg != tmp)
+ gfc_free_expr (errmsg);
+ if (stat != tmp)
+ gfc_free_expr (stat);
+
gfc_free_expr (tmp);
gfc_free_expr (lockvar);
- gfc_free_expr (acq_lock);
- gfc_free_expr (stat);
- gfc_free_expr (errmsg);
return MATCH_ERROR;
}
@@ -3121,9 +3125,6 @@ sync_statement (gfc_statement st)
break;
}
- if (m == MATCH_ERROR)
- goto syntax;
-
if (gfc_match (" )%t") != MATCH_YES)
goto syntax;
@@ -3153,10 +3154,13 @@ syntax:
gfc_syntax_error (st);
cleanup:
+ if (stat != tmp)
+ gfc_free_expr (stat);
+ if (errmsg != tmp)
+ gfc_free_expr (errmsg);
+
gfc_free_expr (tmp);
gfc_free_expr (imageset);
- gfc_free_expr (stat);
- gfc_free_expr (errmsg);
return MATCH_ERROR;
}
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 28eea5d82c8..6a7b6c9d894 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -426,10 +426,12 @@ resolve_formal_arglist (gfc_symbol *proc)
}
else if (!sym->attr.pointer)
{
- if (proc->attr.function && sym->attr.intent != INTENT_IN)
+ if (proc->attr.function && sym->attr.intent != INTENT_IN
+ && !sym->value)
proc->attr.implicit_pure = 0;
- if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN)
+ if (proc->attr.subroutine && sym->attr.intent == INTENT_UNKNOWN
+ && !sym->value)
proc->attr.implicit_pure = 0;
}
}
@@ -11427,7 +11429,7 @@ get_checked_tb_operator_target (gfc_tbp_generic* target, locus where)
target_proc = target->specific->u.specific->n.sym;
gcc_assert (target_proc);
- /* All operator bindings must have a passed-object dummy argument. */
+ /* F08:C468. All operator bindings must have a passed-object dummy argument. */
if (target->specific->nopass)
{
gfc_error ("Type-bound operator at %L can't be NOPASS", &where);
@@ -13565,10 +13567,9 @@ gfc_impure_variable (gfc_symbol *sym)
}
proc = sym->ns->proc_name;
- if (sym->attr.dummy && gfc_pure (proc)
- && ((proc->attr.subroutine && sym->attr.intent == INTENT_IN)
- ||
- proc->attr.function))
+ if (sym->attr.dummy
+ && ((proc->attr.subroutine && sym->attr.intent == INTENT_IN)
+ || proc->attr.function))
return 1;
/* TODO: Sort out what can be storage associated, if anything, and include
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index 07aeee88e15..5aa27044d08 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -1370,7 +1370,11 @@ gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x,
mpfr_sub (e->value.real, e->value.real, last1, GFC_RND_MODE);
if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
- goto error;
+ {
+ /* Range_check frees "e" in that case. */
+ e = NULL;
+ goto error;
+ }
if (jn)
gfc_constructor_insert_expr (&result->value.constructor, e, &x->where,
@@ -4930,11 +4934,6 @@ gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
else
ncop = 0;
- len = e->value.character.length;
- nlen = ncop * len;
-
- result = gfc_get_constant_expr (BT_CHARACTER, e->ts.kind, &e->where);
-
if (ncop == 0)
return gfc_get_character_expr (e->ts.kind, &e->where, NULL, 0);
diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c
index 1f4a7352686..c914e65cac2 100644
--- a/gcc/fortran/symbol.c
+++ b/gcc/fortran/symbol.c
@@ -2996,7 +2996,7 @@ gfc_undo_symbols (void)
{
if (p->namelist_tail != old->namelist_tail)
{
- gfc_free_namelist (old->namelist_tail);
+ gfc_free_namelist (old->namelist_tail->next);
old->namelist_tail->next = NULL;
}
}
@@ -4846,7 +4846,9 @@ gfc_get_typebound_proc (gfc_typebound_proc *tb0)
gfc_symbol*
gfc_get_derived_super_type (gfc_symbol* derived)
{
- if (derived && derived->attr.generic)
+ gcc_assert (derived);
+
+ if (derived->attr.generic)
derived = gfc_find_dt_in_generic (derived);
if (!derived->attr.extension)
@@ -4968,7 +4970,7 @@ gfc_find_dt_in_generic (gfc_symbol *sym)
return sym;
if (sym->attr.generic)
- for (intr = (sym ? sym->generic : NULL); intr; intr = intr->next)
+ for (intr = sym->generic; intr; intr = intr->next)
if (intr->sym->attr.flavor == FL_DERIVED)
break;
return intr ? intr->sym : NULL;
diff --git a/gcc/fortran/target-memory.c b/gcc/fortran/target-memory.c
index 637811e0965..bedc668d52f 100644
--- a/gcc/fortran/target-memory.c
+++ b/gcc/fortran/target-memory.c
@@ -140,7 +140,7 @@ gfc_target_expr_size (gfc_expr *e)
return the number of bytes of the buffer that have been
used. */
-static int
+static unsigned HOST_WIDE_INT
encode_array (gfc_expr *expr, unsigned char *buffer, size_t buffer_size)
{
mpz_t array_size;
@@ -217,13 +217,14 @@ gfc_encode_character (int kind, int length, const gfc_char_t *string,
}
-static int
+static unsigned HOST_WIDE_INT
encode_derived (gfc_expr *source, unsigned char *buffer, size_t buffer_size)
{
gfc_constructor *c;
gfc_component *cmp;
int ptr;
tree type;
+ HOST_WIDE_INT size;
type = gfc_typenode_for_spec (&source->ts);
@@ -239,19 +240,24 @@ encode_derived (gfc_expr *source, unsigned char *buffer, size_t buffer_size)
+ TREE_INT_CST_LOW(DECL_FIELD_BIT_OFFSET(cmp->backend_decl))/8;
if (c->expr->expr_type == EXPR_NULL)
- memset (&buffer[ptr], 0,
- int_size_in_bytes (TREE_TYPE (cmp->backend_decl)));
+ {
+ size = int_size_in_bytes (TREE_TYPE (cmp->backend_decl));
+ gcc_assert (size >= 0);
+ memset (&buffer[ptr], 0, size);
+ }
else
gfc_target_encode_expr (c->expr, &buffer[ptr],
buffer_size - ptr);
}
- return int_size_in_bytes (type);
+ size = int_size_in_bytes (type);
+ gcc_assert (size >= 0);
+ return size;
}
/* Write a constant expression in binary form to a buffer. */
-int
+unsigned HOST_WIDE_INT
gfc_target_encode_expr (gfc_expr *source, unsigned char *buffer,
size_t buffer_size)
{
@@ -567,6 +573,7 @@ gfc_target_interpret_expr (unsigned char *buffer, size_t buffer_size,
case BT_DERIVED:
result->representation.length =
gfc_interpret_derived (buffer, buffer_size, result);
+ gcc_assert (result->representation.length >= 0);
break;
default:
@@ -678,7 +685,7 @@ gfc_merge_initializers (gfc_typespec ts, gfc_expr *e, unsigned char *data,
{
size_t elt_size = gfc_target_expr_size (c->expr);
- if (c->offset)
+ if (mpz_cmp_si (c->offset, 0) != 0)
len = elt_size * (size_t)mpz_get_si (c->offset);
len = len + gfc_merge_initializers (ts, c->expr, &data[len],
diff --git a/gcc/fortran/target-memory.h b/gcc/fortran/target-memory.h
index 6ebffe86521..cba2ea2d348 100644
--- a/gcc/fortran/target-memory.h
+++ b/gcc/fortran/target-memory.h
@@ -31,7 +31,8 @@ size_t gfc_target_expr_size (gfc_expr *);
/* Write a constant expression in binary form to a target buffer. */
int gfc_encode_character (int, int, const gfc_char_t *, unsigned char *,
size_t);
-int gfc_target_encode_expr (gfc_expr *, unsigned char *, size_t);
+unsigned HOST_WIDE_INT gfc_target_encode_expr (gfc_expr *, unsigned char *,
+ size_t);
/* Read a target buffer into a constant expression. */
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 7e59cb6dcb4..53c248d963b 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -5480,7 +5480,7 @@ gfc_generate_function_code (gfc_namespace * ns)
}
current_function_decl = old_context;
- if (decl_function_context (fndecl) && !gfc_option.coarray == GFC_FCOARRAY_LIB
+ if (decl_function_context (fndecl) && gfc_option.coarray != GFC_FCOARRAY_LIB
&& has_coarray_vars)
/* Register this function with cgraph just far enough to get it
added to our parent's nested function list.
diff --git a/gcc/fortran/trans-io.c b/gcc/fortran/trans-io.c
index 34db6fd5a11..940129eb05f 100644
--- a/gcc/fortran/trans-io.c
+++ b/gcc/fortran/trans-io.c
@@ -1611,7 +1611,7 @@ transfer_namelist_element (stmtblock_t * block, const char * var_name,
gfc_add_expr_to_block (block, tmp);
}
- if (ts->type == BT_DERIVED)
+ if (ts->type == BT_DERIVED && ts->u.derived->components)
{
gfc_component *cmp;
@@ -2146,6 +2146,9 @@ transfer_expr (gfc_se * se, gfc_typespec * ts, tree addr_expr, gfc_code * code)
break;
case BT_DERIVED:
+ if (ts->u.derived->components == NULL)
+ return;
+
/* Recurse into the elements of the derived type. */
expr = gfc_evaluate_now (addr_expr, &se->pre);
expr = build_fold_indirect_ref_loc (input_location,
@@ -2251,8 +2254,8 @@ gfc_trans_transfer (gfc_code * code)
if (expr->ref && !gfc_is_proc_ptr_comp (expr))
{
for (ref = expr->ref; ref && ref->type != REF_ARRAY;
- ref = ref->next);
- gcc_assert (ref->type == REF_ARRAY);
+ ref = ref->next);
+ gcc_assert (ref && ref->type == REF_ARRAY);
}
if (expr->ts.type != BT_DERIVED
@@ -2314,6 +2317,7 @@ gfc_trans_transfer (gfc_code * code)
tmp = gfc_finish_block (&body);
else
{
+ gcc_assert (expr->rank != 0);
gcc_assert (se.ss == gfc_ss_terminator);
gfc_trans_scalarizing_loops (&loop, &body);
diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c
index 8d7aa5fe3c3..e843692e020 100644
--- a/gcc/fortran/trans-openmp.c
+++ b/gcc/fortran/trans-openmp.c
@@ -1434,9 +1434,8 @@ gfc_trans_omp_do (gfc_code *code, stmtblock_t *pblock,
/* Initialize DOVAR. */
tmp = fold_build2_loc (input_location, MULT_EXPR, type, count, step);
tmp = fold_build2_loc (input_location, PLUS_EXPR, type, from, tmp);
- di = VEC_safe_push (dovar_init, heap, inits, NULL);
- di->var = dovar;
- di->init = tmp;
+ dovar_init e = {dovar, tmp};
+ VEC_safe_push (dovar_init, heap, inits, e);
}
if (!dovar_found)
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index 8bc491655be..204f069cc53 100644
--- a/gcc/fortran/trans-stmt.c
+++ b/gcc/fortran/trans-stmt.c
@@ -3132,7 +3132,7 @@ compute_inner_temp_size (gfc_expr *expr1, gfc_expr *expr2,
/* Calculate the bounds of the scalarization. */
save_flag = gfc_option.rtcheck;
- gfc_option.rtcheck &= !GFC_RTCHECK_BOUNDS;
+ gfc_option.rtcheck &= ~GFC_RTCHECK_BOUNDS;
gfc_conv_ss_startstride (&loop);
gfc_option.rtcheck = save_flag;
gfc_conv_loop_setup (&loop, &expr2->where);
diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c
index ff0b243a202..6365213b8f0 100644
--- a/gcc/fortran/trans.c
+++ b/gcc/fortran/trans.c
@@ -506,6 +506,7 @@ gfc_trans_runtime_check (bool error, bool once, tree cond, stmtblock_t * pblock,
gfc_add_expr_to_block (&block,
trans_runtime_error_vararg (error, where,
msgid, ap));
+ va_end (ap);
if (once)
gfc_add_modify (&block, tmpvar, boolean_false_node);
diff --git a/gcc/function.c b/gcc/function.c
index f1e0b2d3eba..72056a6eecc 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -6753,13 +6753,21 @@ reposition_prologue_and_epilogue_notes (void)
#endif /* HAVE_prologue or HAVE_epilogue */
}
+/* Returns the name of function declared by FNDECL. */
+const char *
+fndecl_name (tree fndecl)
+{
+ if (fndecl == NULL)
+ return "(nofn)";
+ return lang_hooks.decl_printable_name (fndecl, 2);
+}
+
/* Returns the name of function FN. */
const char *
function_name (struct function *fn)
{
- if (fn == NULL)
- return "(nofn)";
- return lang_hooks.decl_printable_name (fn->decl, 2);
+ tree fndecl = (fn == NULL) ? NULL : fn->decl;
+ return fndecl_name (fndecl);
}
/* Returns the name of the current function. */
diff --git a/gcc/function.h b/gcc/function.h
index 684bbce1b07..59e729dc6bf 100644
--- a/gcc/function.h
+++ b/gcc/function.h
@@ -760,6 +760,7 @@ extern void clobber_return_register (void);
extern rtx get_arg_pointer_save_area (void);
/* Returns the name of the current function. */
+extern const char *fndecl_name (tree);
extern const char *function_name (struct function *);
extern const char *current_function_name (void);
diff --git a/gcc/fwprop.c b/gcc/fwprop.c
index e64e76da221..cb571cd6d97 100644
--- a/gcc/fwprop.c
+++ b/gcc/fwprop.c
@@ -223,7 +223,7 @@ single_def_use_enter_block (struct dom_walk_data *walk_data ATTRIBUTE_UNUSED,
bitmap_copy (local_lr, &lr_bb_info->in);
/* Push a marker for the leave_block callback. */
- VEC_safe_push (df_ref, heap, reg_defs_stack, (df_ref) NULL);
+ VEC_safe_push (df_ref, heap, reg_defs_stack, NULL);
process_uses (df_get_artificial_uses (bb_index), DF_REF_AT_TOP);
process_defs (df_get_artificial_defs (bb_index), DF_REF_AT_TOP);
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 5f68d5978e3..af3c34acfeb 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -2520,7 +2520,7 @@ execute (void)
and record info about each one.
Also search for the programs that are to be run. */
- VEC_safe_push (const_char_p, heap, argbuf, (const_char_p)0);
+ VEC_safe_push (const_char_p, heap, argbuf, 0);
commands[0].prog = VEC_index (const_char_p, argbuf, 0); /* first command. */
commands[0].argv = VEC_address (const_char_p, argbuf);
diff --git a/gcc/gcse.c b/gcc/gcse.c
index 767cc66edb5..a066b36c642 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -1417,7 +1417,7 @@ canon_list_insert (rtx dest ATTRIBUTE_UNUSED, const_rtx x ATTRIBUTE_UNUSED,
{
rtx dest_addr, insn;
int bb;
- modify_pair *pair;
+ modify_pair pair;
while (GET_CODE (dest) == SUBREG
|| GET_CODE (dest) == ZERO_EXTRACT
@@ -1436,9 +1436,9 @@ canon_list_insert (rtx dest ATTRIBUTE_UNUSED, const_rtx x ATTRIBUTE_UNUSED,
insn = (rtx) v_insn;
bb = BLOCK_FOR_INSN (insn)->index;
- pair = VEC_safe_push (modify_pair, heap, canon_modify_mem_list[bb], NULL);
- pair->dest = dest;
- pair->dest_addr = dest_addr;
+ pair.dest = dest;
+ pair.dest_addr = dest_addr;
+ VEC_safe_push (modify_pair, heap, canon_modify_mem_list[bb], pair);
}
/* Record memory modification information for INSN. We do not actually care
diff --git a/gcc/genautomata.c b/gcc/genautomata.c
index 122a4a4cfbe..46a398d1a6e 100644
--- a/gcc/genautomata.c
+++ b/gcc/genautomata.c
@@ -7752,8 +7752,7 @@ output_min_issue_delay_table (automaton_t automaton)
= VEC_alloc (vect_el_t, heap, compressed_min_issue_delay_len);
for (i = 0; i < compressed_min_issue_delay_len; i++)
- VEC_quick_push (vect_el_t, compressed_min_issue_delay_vect,
- (vect_el_t) 0);
+ VEC_quick_push (vect_el_t, compressed_min_issue_delay_vect, 0);
for (i = 0; i < min_issue_delay_len; i++)
{
@@ -7845,7 +7844,7 @@ output_reserved_units_table (automaton_t automaton)
reserved_units_table = VEC_alloc (vect_el_t, heap, reserved_units_size);
for (i = 0; i < reserved_units_size; i++)
- VEC_quick_push (vect_el_t, reserved_units_table, (vect_el_t) 0);
+ VEC_quick_push (vect_el_t, reserved_units_table, 0);
for (n = 0; n < VEC_length (state_t, output_states_vect); n++)
{
state_t s = VEC_index (state_t, output_states_vect, n);
diff --git a/gcc/genextract.c b/gcc/genextract.c
index 175febeb58f..fb1428687ca 100644
--- a/gcc/genextract.c
+++ b/gcc/genextract.c
@@ -201,7 +201,7 @@ VEC_safe_set_locstr (VEC(locstr,heap) **vp, unsigned int ix, char *str)
else
{
while (ix > VEC_length (locstr, *vp))
- VEC_safe_push (locstr, heap, *vp, (locstr) NULL);
+ VEC_safe_push (locstr, heap, *vp, NULL);
VEC_safe_push (locstr, heap, *vp, str);
}
}
diff --git a/gcc/genopinit.c b/gcc/genopinit.c
index 52612794802..e0ffc8f286c 100644
--- a/gcc/genopinit.c
+++ b/gcc/genopinit.c
@@ -265,7 +265,7 @@ gen_insn (rtx insn)
{
p.op = optabs[pindex].op;
p.sort_num = (p.op << 16) | (p.m2 << 8) | p.m1;
- VEC_safe_push (pattern, heap, patterns, &p);
+ VEC_safe_push (pattern, heap, patterns, p);
return;
}
}
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 42bc0fcb83a..4dba726f274 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -30,6 +30,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-ssa-propagate.h"
#include "target.h"
#include "gimple-fold.h"
+#include "langhooks.h"
/* Return true when DECL can be referenced from current unit.
FROM_DECL (if non-null) specify constructor of variable DECL was taken from.
@@ -154,13 +155,15 @@ canonicalize_constructor_val (tree cval, tree from_decl)
}
if (TREE_CODE (cval) == ADDR_EXPR)
{
- tree base = get_base_address (TREE_OPERAND (cval, 0));
- if (!base && TREE_CODE (TREE_OPERAND (cval, 0)) == COMPOUND_LITERAL_EXPR)
+ tree base = NULL_TREE;
+ if (TREE_CODE (TREE_OPERAND (cval, 0)) == COMPOUND_LITERAL_EXPR)
{
base = COMPOUND_LITERAL_EXPR_DECL (TREE_OPERAND (cval, 0));
if (base)
TREE_OPERAND (cval, 0) = base;
}
+ else
+ base = get_base_address (TREE_OPERAND (cval, 0));
if (!base)
return NULL_TREE;
@@ -1690,6 +1693,16 @@ static tree
and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
enum tree_code code2, tree op2a, tree op2b)
{
+ tree truth_type = boolean_type_node;
+ if (TREE_CODE (TREE_TYPE (op1a)) == VECTOR_TYPE)
+ {
+ tree vec_type = TREE_TYPE (op1a);
+ tree elem = lang_hooks.types.type_for_size
+ (GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (vec_type))), 0);
+ truth_type = build_opaque_vector_type (elem,
+ TYPE_VECTOR_SUBPARTS (vec_type));
+ }
+
/* First check for ((x CODE1 y) AND (x CODE2 y)). */
if (operand_equal_p (op1a, op2a, 0)
&& operand_equal_p (op1b, op2b, 0))
@@ -1697,7 +1710,7 @@ and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
/* Result will be either NULL_TREE, or a combined comparison. */
tree t = combine_comparisons (UNKNOWN_LOCATION,
TRUTH_ANDIF_EXPR, code1, code2,
- boolean_type_node, op1a, op1b);
+ truth_type, op1a, op1b);
if (t)
return t;
}
@@ -1710,7 +1723,7 @@ and_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
tree t = combine_comparisons (UNKNOWN_LOCATION,
TRUTH_ANDIF_EXPR, code1,
swap_tree_comparison (code2),
- boolean_type_node, op1a, op1b);
+ truth_type, op1a, op1b);
if (t)
return t;
}
@@ -2152,6 +2165,16 @@ static tree
or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
enum tree_code code2, tree op2a, tree op2b)
{
+ tree truth_type = boolean_type_node;
+ if (TREE_CODE (TREE_TYPE (op1a)) == VECTOR_TYPE)
+ {
+ tree vec_type = TREE_TYPE (op1a);
+ tree elem = lang_hooks.types.type_for_size
+ (GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (vec_type))), 0);
+ truth_type = build_opaque_vector_type (elem,
+ TYPE_VECTOR_SUBPARTS (vec_type));
+ }
+
/* First check for ((x CODE1 y) OR (x CODE2 y)). */
if (operand_equal_p (op1a, op2a, 0)
&& operand_equal_p (op1b, op2b, 0))
@@ -2159,7 +2182,7 @@ or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
/* Result will be either NULL_TREE, or a combined comparison. */
tree t = combine_comparisons (UNKNOWN_LOCATION,
TRUTH_ORIF_EXPR, code1, code2,
- boolean_type_node, op1a, op1b);
+ truth_type, op1a, op1b);
if (t)
return t;
}
@@ -2172,7 +2195,7 @@ or_comparisons_1 (enum tree_code code1, tree op1a, tree op1b,
tree t = combine_comparisons (UNKNOWN_LOCATION,
TRUTH_ORIF_EXPR, code1,
swap_tree_comparison (code2),
- boolean_type_node, op1a, op1b);
+ truth_type, op1a, op1b);
if (t)
return t;
}
diff --git a/gcc/gimple-low.c b/gcc/gimple-low.c
index 7a51e8c271c..c5a16ac52d3 100644
--- a/gcc/gimple-low.c
+++ b/gcc/gimple-low.c
@@ -851,7 +851,7 @@ lower_gimple_return (gimple_stmt_iterator *gsi, struct lower_data *data)
/* Not found. Create a new label and record the return statement. */
tmp_rs.label = create_artificial_label (cfun->function_end_locus);
tmp_rs.stmt = stmt;
- VEC_safe_push (return_statements_t, heap, data->return_statements, &tmp_rs);
+ VEC_safe_push (return_statements_t, heap, data->return_statements, tmp_rs);
/* Generate a goto statement and remove the return statement. */
found:
diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c
index 0e770a949bf..87684b30543 100644
--- a/gcc/gimple-ssa-strength-reduction.c
+++ b/gcc/gimple-ssa-strength-reduction.c
@@ -54,6 +54,7 @@ along with GCC; see the file COPYING3. If not see
#include "domwalk.h"
#include "pointer-set.h"
#include "expmed.h"
+#include "params.h"
/* Information about a strength reduction candidate. Each statement
in the candidate table represents an expression of one of the
@@ -353,10 +354,14 @@ find_basis_for_candidate (slsr_cand_t c)
cand_chain_t chain;
slsr_cand_t basis = NULL;
+ // Limit potential of N^2 behavior for long candidate chains.
+ int iters = 0;
+ int max_iters = PARAM_VALUE (PARAM_MAX_SLSR_CANDIDATE_SCAN);
+
mapping_key.base_expr = c->base_expr;
chain = (cand_chain_t) htab_find (base_cand_map, &mapping_key);
- for (; chain; chain = chain->next)
+ for (; chain && iters < max_iters; chain = chain->next, ++iters)
{
slsr_cand_t one_basis = chain->cand;
diff --git a/gcc/gimple.c b/gcc/gimple.c
index 88fa7627e84..7c702cad71a 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -37,17 +37,10 @@ along with GCC; see the file COPYING3. If not see
#include "demangle.h"
#include "langhooks.h"
-/* Global type table. FIXME lto, it should be possible to re-use some
- of the type hashing routines in tree.c (type_hash_canon, type_hash_lookup,
- etc), but those assume that types were built with the various
- build_*_type routines which is not the case with the streamer. */
-static GTY((if_marked ("ggc_marked_p"), param_is (union tree_node)))
- htab_t gimple_types;
+/* Global canonical type table. */
static GTY((if_marked ("ggc_marked_p"), param_is (union tree_node)))
htab_t gimple_canonical_types;
static GTY((if_marked ("tree_int_map_marked_p"), param_is (struct tree_int_map)))
- htab_t type_hash_cache;
-static GTY((if_marked ("tree_int_map_marked_p"), param_is (struct tree_int_map)))
htab_t canonical_type_hash_cache;
/* All the tuples have their operand vector (if present) at the very bottom
@@ -2878,16 +2871,12 @@ get_base_address (tree t)
&& TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR)
t = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
- if (TREE_CODE (t) == SSA_NAME
- || DECL_P (t)
- || TREE_CODE (t) == STRING_CST
- || TREE_CODE (t) == CONSTRUCTOR
- || INDIRECT_REF_P (t)
- || TREE_CODE (t) == MEM_REF
- || TREE_CODE (t) == TARGET_MEM_REF)
- return t;
- else
+ /* ??? Either the alias oracle or all callers need to properly deal
+ with WITH_SIZE_EXPRs before we can look through those. */
+ if (TREE_CODE (t) == WITH_SIZE_EXPR)
return NULL_TREE;
+
+ return t;
}
void
@@ -3018,159 +3007,6 @@ gimple_call_copy_skip_args (gimple stmt, bitmap args_to_skip)
}
-enum gtc_mode { GTC_MERGE = 0, GTC_DIAG = 1 };
-
-static hashval_t gimple_type_hash (const void *);
-
-/* Structure used to maintain a cache of some type pairs compared by
- gimple_types_compatible_p when comparing aggregate types. There are
- three possible values for SAME_P:
-
- -2: The pair (T1, T2) has just been inserted in the table.
- 0: T1 and T2 are different types.
- 1: T1 and T2 are the same type.
-
- The two elements in the SAME_P array are indexed by the comparison
- mode gtc_mode. */
-
-struct type_pair_d
-{
- unsigned int uid1;
- unsigned int uid2;
- signed char same_p[2];
-};
-typedef struct type_pair_d *type_pair_t;
-DEF_VEC_P(type_pair_t);
-DEF_VEC_ALLOC_P(type_pair_t,heap);
-
-#define GIMPLE_TYPE_PAIR_SIZE 16381
-struct type_pair_d *type_pair_cache;
-
-
-/* Lookup the pair of types T1 and T2 in *VISITED_P. Insert a new
- entry if none existed. */
-
-static inline type_pair_t
-lookup_type_pair (tree t1, tree t2)
-{
- unsigned int index;
- unsigned int uid1, uid2;
-
- if (type_pair_cache == NULL)
- type_pair_cache = XCNEWVEC (struct type_pair_d, GIMPLE_TYPE_PAIR_SIZE);
-
- if (TYPE_UID (t1) < TYPE_UID (t2))
- {
- uid1 = TYPE_UID (t1);
- uid2 = TYPE_UID (t2);
- }
- else
- {
- uid1 = TYPE_UID (t2);
- uid2 = TYPE_UID (t1);
- }
- gcc_checking_assert (uid1 != uid2);
-
- /* iterative_hash_hashval_t imply an function calls.
- We know that UIDS are in limited range. */
- index = ((((unsigned HOST_WIDE_INT)uid1 << HOST_BITS_PER_WIDE_INT / 2) + uid2)
- % GIMPLE_TYPE_PAIR_SIZE);
- if (type_pair_cache [index].uid1 == uid1
- && type_pair_cache [index].uid2 == uid2)
- return &type_pair_cache[index];
-
- type_pair_cache [index].uid1 = uid1;
- type_pair_cache [index].uid2 = uid2;
- type_pair_cache [index].same_p[0] = -2;
- type_pair_cache [index].same_p[1] = -2;
-
- return &type_pair_cache[index];
-}
-
-/* Per pointer state for the SCC finding. The on_sccstack flag
- is not strictly required, it is true when there is no hash value
- recorded for the type and false otherwise. But querying that
- is slower. */
-
-struct sccs
-{
- unsigned int dfsnum;
- unsigned int low;
- bool on_sccstack;
- union {
- hashval_t hash;
- signed char same_p;
- } u;
-};
-
-static unsigned int next_dfs_num;
-static unsigned int gtc_next_dfs_num;
-
-
-/* GIMPLE type merging cache. A direct-mapped cache based on TYPE_UID. */
-
-typedef struct GTY(()) gimple_type_leader_entry_s {
- tree type;
- tree leader;
-} gimple_type_leader_entry;
-
-#define GIMPLE_TYPE_LEADER_SIZE 16381
-static GTY((deletable, length("GIMPLE_TYPE_LEADER_SIZE")))
- gimple_type_leader_entry *gimple_type_leader;
-
-/* Lookup an existing leader for T and return it or NULL_TREE, if
- there is none in the cache. */
-
-static inline tree
-gimple_lookup_type_leader (tree t)
-{
- gimple_type_leader_entry *leader;
-
- if (!gimple_type_leader)
- return NULL_TREE;
-
- leader = &gimple_type_leader[TYPE_UID (t) % GIMPLE_TYPE_LEADER_SIZE];
- if (leader->type != t)
- return NULL_TREE;
-
- return leader->leader;
-}
-
-/* Return true if T1 and T2 have the same name. If FOR_COMPLETION_P is
- true then if any type has no name return false, otherwise return
- true if both types have no names. */
-
-static bool
-compare_type_names_p (tree t1, tree t2)
-{
- tree name1 = TYPE_NAME (t1);
- tree name2 = TYPE_NAME (t2);
-
- if ((name1 != NULL_TREE) != (name2 != NULL_TREE))
- return false;
-
- if (name1 == NULL_TREE)
- return true;
-
- /* Either both should be a TYPE_DECL or both an IDENTIFIER_NODE. */
- if (TREE_CODE (name1) != TREE_CODE (name2))
- return false;
-
- if (TREE_CODE (name1) == TYPE_DECL)
- name1 = DECL_NAME (name1);
- gcc_checking_assert (!name1 || TREE_CODE (name1) == IDENTIFIER_NODE);
-
- if (TREE_CODE (name2) == TYPE_DECL)
- name2 = DECL_NAME (name2);
- gcc_checking_assert (!name2 || TREE_CODE (name2) == IDENTIFIER_NODE);
-
- /* Identifiers can be compared with pointer equality rather
- than a string comparison. */
- if (name1 == name2)
- return true;
-
- return false;
-}
/* Return true if the field decls F1 and F2 are at the same offset.
@@ -3223,892 +3059,6 @@ gimple_compare_field_offset (tree f1, tree f2)
return false;
}
-static bool
-gimple_types_compatible_p_1 (tree, tree, type_pair_t,
- VEC(type_pair_t, heap) **,
- struct pointer_map_t *, struct obstack *);
-
-/* DFS visit the edge from the callers type pair with state *STATE to
- the pair T1, T2 while operating in FOR_MERGING_P mode.
- Update the merging status if it is not part of the SCC containing the
- callers pair and return it.
- SCCSTACK, SCCSTATE and SCCSTATE_OBSTACK are state for the DFS walk done. */
-
-static bool
-gtc_visit (tree t1, tree t2,
- struct sccs *state,
- VEC(type_pair_t, heap) **sccstack,
- struct pointer_map_t *sccstate,
- struct obstack *sccstate_obstack)
-{
- struct sccs *cstate = NULL;
- type_pair_t p;
- void **slot;
- tree leader1, leader2;
-
- /* Check first for the obvious case of pointer identity. */
- if (t1 == t2)
- return true;
-
- /* Check that we have two types to compare. */
- if (t1 == NULL_TREE || t2 == NULL_TREE)
- return false;
-
- /* Can't be the same type if the types don't have the same code. */
- if (TREE_CODE (t1) != TREE_CODE (t2))
- return false;
-
- /* Can't be the same type if they have different CV qualifiers. */
- if (TYPE_QUALS (t1) != TYPE_QUALS (t2))
- return false;
-
- if (TREE_ADDRESSABLE (t1) != TREE_ADDRESSABLE (t2))
- return false;
-
- /* Void types and nullptr types are always the same. */
- if (TREE_CODE (t1) == VOID_TYPE
- || TREE_CODE (t1) == NULLPTR_TYPE)
- return true;
-
- /* Can't be the same type if they have different alignment or mode. */
- if (TYPE_ALIGN (t1) != TYPE_ALIGN (t2)
- || TYPE_MODE (t1) != TYPE_MODE (t2))
- return false;
-
- /* Do some simple checks before doing three hashtable queries. */
- if (INTEGRAL_TYPE_P (t1)
- || SCALAR_FLOAT_TYPE_P (t1)
- || FIXED_POINT_TYPE_P (t1)
- || TREE_CODE (t1) == VECTOR_TYPE
- || TREE_CODE (t1) == COMPLEX_TYPE
- || TREE_CODE (t1) == OFFSET_TYPE
- || POINTER_TYPE_P (t1))
- {
- /* Can't be the same type if they have different sign or precision. */
- if (TYPE_PRECISION (t1) != TYPE_PRECISION (t2)
- || TYPE_UNSIGNED (t1) != TYPE_UNSIGNED (t2))
- return false;
-
- if (TREE_CODE (t1) == INTEGER_TYPE
- && TYPE_STRING_FLAG (t1) != TYPE_STRING_FLAG (t2))
- return false;
-
- /* That's all we need to check for float and fixed-point types. */
- if (SCALAR_FLOAT_TYPE_P (t1)
- || FIXED_POINT_TYPE_P (t1))
- return true;
-
- /* For other types fall through to more complex checks. */
- }
-
- /* If the types have been previously registered and found equal
- they still are. */
- leader1 = gimple_lookup_type_leader (t1);
- leader2 = gimple_lookup_type_leader (t2);
- if (leader1 == t2
- || t1 == leader2
- || (leader1 && leader1 == leader2))
- return true;
-
- /* If the hash values of t1 and t2 are different the types can't
- possibly be the same. This helps keeping the type-pair hashtable
- small, only tracking comparisons for hash collisions. */
- if (gimple_type_hash (t1) != gimple_type_hash (t2))
- return false;
-
- /* Allocate a new cache entry for this comparison. */
- p = lookup_type_pair (t1, t2);
- if (p->same_p[GTC_MERGE] == 0 || p->same_p[GTC_MERGE] == 1)
- {
- /* We have already decided whether T1 and T2 are the
- same, return the cached result. */
- return p->same_p[GTC_MERGE] == 1;
- }
-
- if ((slot = pointer_map_contains (sccstate, p)) != NULL)
- cstate = (struct sccs *)*slot;
- /* Not yet visited. DFS recurse. */
- if (!cstate)
- {
- gimple_types_compatible_p_1 (t1, t2, p,
- sccstack, sccstate, sccstate_obstack);
- cstate = (struct sccs *)* pointer_map_contains (sccstate, p);
- state->low = MIN (state->low, cstate->low);
- }
- /* If the type is still on the SCC stack adjust the parents low. */
- if (cstate->dfsnum < state->dfsnum
- && cstate->on_sccstack)
- state->low = MIN (cstate->dfsnum, state->low);
-
- /* Return the current lattice value. We start with an equality
- assumption so types part of a SCC will be optimistically
- treated equal unless proven otherwise. */
- return cstate->u.same_p;
-}
-
-/* Worker for gimple_types_compatible.
- SCCSTACK, SCCSTATE and SCCSTATE_OBSTACK are state for the DFS walk done. */
-
-static bool
-gimple_types_compatible_p_1 (tree t1, tree t2, type_pair_t p,
- VEC(type_pair_t, heap) **sccstack,
- struct pointer_map_t *sccstate,
- struct obstack *sccstate_obstack)
-{
- struct sccs *state;
-
- gcc_assert (p->same_p[GTC_MERGE] == -2);
-
- state = XOBNEW (sccstate_obstack, struct sccs);
- *pointer_map_insert (sccstate, p) = state;
-
- VEC_safe_push (type_pair_t, heap, *sccstack, p);
- state->dfsnum = gtc_next_dfs_num++;
- state->low = state->dfsnum;
- state->on_sccstack = true;
- /* Start with an equality assumption. As we DFS recurse into child
- SCCs this assumption may get revisited. */
- state->u.same_p = 1;
-
- /* The struct tags shall compare equal. */
- if (!compare_type_names_p (t1, t2))
- goto different_types;
-
- /* We may not merge typedef types to the same type in different
- contexts. */
- if (TYPE_NAME (t1)
- && TREE_CODE (TYPE_NAME (t1)) == TYPE_DECL
- && DECL_CONTEXT (TYPE_NAME (t1))
- && TYPE_P (DECL_CONTEXT (TYPE_NAME (t1))))
- {
- if (!gtc_visit (DECL_CONTEXT (TYPE_NAME (t1)),
- DECL_CONTEXT (TYPE_NAME (t2)),
- state, sccstack, sccstate, sccstate_obstack))
- goto different_types;
- }
-
- /* If their attributes are not the same they can't be the same type. */
- if (!attribute_list_equal (TYPE_ATTRIBUTES (t1), TYPE_ATTRIBUTES (t2)))
- goto different_types;
-
- /* Do type-specific comparisons. */
- switch (TREE_CODE (t1))
- {
- case VECTOR_TYPE:
- case COMPLEX_TYPE:
- if (!gtc_visit (TREE_TYPE (t1), TREE_TYPE (t2),
- state, sccstack, sccstate, sccstate_obstack))
- goto different_types;
- goto same_types;
-
- case ARRAY_TYPE:
- /* Array types are the same if the element types are the same and
- the number of elements are the same. */
- if (!gtc_visit (TREE_TYPE (t1), TREE_TYPE (t2),
- state, sccstack, sccstate, sccstate_obstack)
- || TYPE_STRING_FLAG (t1) != TYPE_STRING_FLAG (t2)
- || TYPE_NONALIASED_COMPONENT (t1) != TYPE_NONALIASED_COMPONENT (t2))
- goto different_types;
- else
- {
- tree i1 = TYPE_DOMAIN (t1);
- tree i2 = TYPE_DOMAIN (t2);
-
- /* For an incomplete external array, the type domain can be
- NULL_TREE. Check this condition also. */
- if (i1 == NULL_TREE && i2 == NULL_TREE)
- goto same_types;
- else if (i1 == NULL_TREE || i2 == NULL_TREE)
- goto different_types;
- else
- {
- tree min1 = TYPE_MIN_VALUE (i1);
- tree min2 = TYPE_MIN_VALUE (i2);
- tree max1 = TYPE_MAX_VALUE (i1);
- tree max2 = TYPE_MAX_VALUE (i2);
-
- /* The minimum/maximum values have to be the same. */
- if ((min1 == min2
- || (min1 && min2
- && ((TREE_CODE (min1) == PLACEHOLDER_EXPR
- && TREE_CODE (min2) == PLACEHOLDER_EXPR)
- || operand_equal_p (min1, min2, 0))))
- && (max1 == max2
- || (max1 && max2
- && ((TREE_CODE (max1) == PLACEHOLDER_EXPR
- && TREE_CODE (max2) == PLACEHOLDER_EXPR)
- || operand_equal_p (max1, max2, 0)))))
- goto same_types;
- else
- goto different_types;
- }
- }
-
- case METHOD_TYPE:
- /* Method types should belong to the same class. */
- if (!gtc_visit (TYPE_METHOD_BASETYPE (t1), TYPE_METHOD_BASETYPE (t2),
- state, sccstack, sccstate, sccstate_obstack))
- goto different_types;
-
- /* Fallthru */
-
- case FUNCTION_TYPE:
- /* Function types are the same if the return type and arguments types
- are the same. */
- if (!gtc_visit (TREE_TYPE (t1), TREE_TYPE (t2),
- state, sccstack, sccstate, sccstate_obstack))
- goto different_types;
-
- if (!comp_type_attributes (t1, t2))
- goto different_types;
-
- if (TYPE_ARG_TYPES (t1) == TYPE_ARG_TYPES (t2))
- goto same_types;
- else
- {
- tree parms1, parms2;
-
- for (parms1 = TYPE_ARG_TYPES (t1), parms2 = TYPE_ARG_TYPES (t2);
- parms1 && parms2;
- parms1 = TREE_CHAIN (parms1), parms2 = TREE_CHAIN (parms2))
- {
- if (!gtc_visit (TREE_VALUE (parms1), TREE_VALUE (parms2),
- state, sccstack, sccstate, sccstate_obstack))
- goto different_types;
- }
-
- if (parms1 || parms2)
- goto different_types;
-
- goto same_types;
- }
-
- case OFFSET_TYPE:
- {
- if (!gtc_visit (TREE_TYPE (t1), TREE_TYPE (t2),
- state, sccstack, sccstate, sccstate_obstack)
- || !gtc_visit (TYPE_OFFSET_BASETYPE (t1),
- TYPE_OFFSET_BASETYPE (t2),
- state, sccstack, sccstate, sccstate_obstack))
- goto different_types;
-
- goto same_types;
- }
-
- case POINTER_TYPE:
- case REFERENCE_TYPE:
- {
- /* If the two pointers have different ref-all attributes,
- they can't be the same type. */
- if (TYPE_REF_CAN_ALIAS_ALL (t1) != TYPE_REF_CAN_ALIAS_ALL (t2))
- goto different_types;
-
- /* Otherwise, pointer and reference types are the same if the
- pointed-to types are the same. */
- if (gtc_visit (TREE_TYPE (t1), TREE_TYPE (t2),
- state, sccstack, sccstate, sccstate_obstack))
- goto same_types;
-
- goto different_types;
- }
-
- case INTEGER_TYPE:
- case BOOLEAN_TYPE:
- {
- tree min1 = TYPE_MIN_VALUE (t1);
- tree max1 = TYPE_MAX_VALUE (t1);
- tree min2 = TYPE_MIN_VALUE (t2);
- tree max2 = TYPE_MAX_VALUE (t2);
- bool min_equal_p = false;
- bool max_equal_p = false;
-
- /* If either type has a minimum value, the other type must
- have the same. */
- if (min1 == NULL_TREE && min2 == NULL_TREE)
- min_equal_p = true;
- else if (min1 && min2 && operand_equal_p (min1, min2, 0))
- min_equal_p = true;
-
- /* Likewise, if either type has a maximum value, the other
- type must have the same. */
- if (max1 == NULL_TREE && max2 == NULL_TREE)
- max_equal_p = true;
- else if (max1 && max2 && operand_equal_p (max1, max2, 0))
- max_equal_p = true;
-
- if (!min_equal_p || !max_equal_p)
- goto different_types;
-
- goto same_types;
- }
-
- case ENUMERAL_TYPE:
- {
- /* FIXME lto, we cannot check bounds on enumeral types because
- different front ends will produce different values.
- In C, enumeral types are integers, while in C++ each element
- will have its own symbolic value. We should decide how enums
- are to be represented in GIMPLE and have each front end lower
- to that. */
- tree v1, v2;
-
- /* For enumeral types, all the values must be the same. */
- if (TYPE_VALUES (t1) == TYPE_VALUES (t2))
- goto same_types;
-
- for (v1 = TYPE_VALUES (t1), v2 = TYPE_VALUES (t2);
- v1 && v2;
- v1 = TREE_CHAIN (v1), v2 = TREE_CHAIN (v2))
- {
- tree c1 = TREE_VALUE (v1);
- tree c2 = TREE_VALUE (v2);
-
- if (TREE_CODE (c1) == CONST_DECL)
- c1 = DECL_INITIAL (c1);
-
- if (TREE_CODE (c2) == CONST_DECL)
- c2 = DECL_INITIAL (c2);
-
- if (tree_int_cst_equal (c1, c2) != 1)
- goto different_types;
-
- if (TREE_PURPOSE (v1) != TREE_PURPOSE (v2))
- goto different_types;
- }
-
- /* If one enumeration has more values than the other, they
- are not the same. */
- if (v1 || v2)
- goto different_types;
-
- goto same_types;
- }
-
- case RECORD_TYPE:
- case UNION_TYPE:
- case QUAL_UNION_TYPE:
- {
- tree f1, f2;
-
- /* For aggregate types, all the fields must be the same. */
- for (f1 = TYPE_FIELDS (t1), f2 = TYPE_FIELDS (t2);
- f1 && f2;
- f1 = TREE_CHAIN (f1), f2 = TREE_CHAIN (f2))
- {
- /* Different field kinds are not compatible. */
- if (TREE_CODE (f1) != TREE_CODE (f2))
- goto different_types;
- /* Field decls must have the same name and offset. */
- if (TREE_CODE (f1) == FIELD_DECL
- && (DECL_NONADDRESSABLE_P (f1) != DECL_NONADDRESSABLE_P (f2)
- || !gimple_compare_field_offset (f1, f2)))
- goto different_types;
- /* All entities should have the same name and type. */
- if (DECL_NAME (f1) != DECL_NAME (f2)
- || !gtc_visit (TREE_TYPE (f1), TREE_TYPE (f2),
- state, sccstack, sccstate, sccstate_obstack))
- goto different_types;
- }
-
- /* If one aggregate has more fields than the other, they
- are not the same. */
- if (f1 || f2)
- goto different_types;
-
- goto same_types;
- }
-
- default:
- gcc_unreachable ();
- }
-
- /* Common exit path for types that are not compatible. */
-different_types:
- state->u.same_p = 0;
- goto pop;
-
- /* Common exit path for types that are compatible. */
-same_types:
- gcc_assert (state->u.same_p == 1);
-
-pop:
- if (state->low == state->dfsnum)
- {
- type_pair_t x;
-
- /* Pop off the SCC and set its cache values to the final
- comparison result. */
- do
- {
- struct sccs *cstate;
- x = VEC_pop (type_pair_t, *sccstack);
- cstate = (struct sccs *)*pointer_map_contains (sccstate, x);
- cstate->on_sccstack = false;
- x->same_p[GTC_MERGE] = state->u.same_p;
- }
- while (x != p);
- }
-
- return state->u.same_p;
-}
-
-/* Return true iff T1 and T2 are structurally identical. When
- FOR_MERGING_P is true the an incomplete type and a complete type
- are considered different, otherwise they are considered compatible. */
-
-static bool
-gimple_types_compatible_p (tree t1, tree t2)
-{
- VEC(type_pair_t, heap) *sccstack = NULL;
- struct pointer_map_t *sccstate;
- struct obstack sccstate_obstack;
- type_pair_t p = NULL;
- bool res;
- tree leader1, leader2;
-
- /* Before starting to set up the SCC machinery handle simple cases. */
-
- /* Check first for the obvious case of pointer identity. */
- if (t1 == t2)
- return true;
-
- /* Check that we have two types to compare. */
- if (t1 == NULL_TREE || t2 == NULL_TREE)
- return false;
-
- /* Can't be the same type if the types don't have the same code. */
- if (TREE_CODE (t1) != TREE_CODE (t2))
- return false;
-
- /* Can't be the same type if they have different CV qualifiers. */
- if (TYPE_QUALS (t1) != TYPE_QUALS (t2))
- return false;
-
- if (TREE_ADDRESSABLE (t1) != TREE_ADDRESSABLE (t2))
- return false;
-
- /* Void types and nullptr types are always the same. */
- if (TREE_CODE (t1) == VOID_TYPE
- || TREE_CODE (t1) == NULLPTR_TYPE)
- return true;
-
- /* Can't be the same type if they have different alignment or mode. */
- if (TYPE_ALIGN (t1) != TYPE_ALIGN (t2)
- || TYPE_MODE (t1) != TYPE_MODE (t2))
- return false;
-
- /* Do some simple checks before doing three hashtable queries. */
- if (INTEGRAL_TYPE_P (t1)
- || SCALAR_FLOAT_TYPE_P (t1)
- || FIXED_POINT_TYPE_P (t1)
- || TREE_CODE (t1) == VECTOR_TYPE
- || TREE_CODE (t1) == COMPLEX_TYPE
- || TREE_CODE (t1) == OFFSET_TYPE
- || POINTER_TYPE_P (t1))
- {
- /* Can't be the same type if they have different sign or precision. */
- if (TYPE_PRECISION (t1) != TYPE_PRECISION (t2)
- || TYPE_UNSIGNED (t1) != TYPE_UNSIGNED (t2))
- return false;
-
- if (TREE_CODE (t1) == INTEGER_TYPE
- && TYPE_STRING_FLAG (t1) != TYPE_STRING_FLAG (t2))
- return false;
-
- /* That's all we need to check for float and fixed-point types. */
- if (SCALAR_FLOAT_TYPE_P (t1)
- || FIXED_POINT_TYPE_P (t1))
- return true;
-
- /* For other types fall through to more complex checks. */
- }
-
- /* If the types have been previously registered and found equal
- they still are. */
- leader1 = gimple_lookup_type_leader (t1);
- leader2 = gimple_lookup_type_leader (t2);
- if (leader1 == t2
- || t1 == leader2
- || (leader1 && leader1 == leader2))
- return true;
-
- /* If the hash values of t1 and t2 are different the types can't
- possibly be the same. This helps keeping the type-pair hashtable
- small, only tracking comparisons for hash collisions. */
- if (gimple_type_hash (t1) != gimple_type_hash (t2))
- return false;
-
- /* If we've visited this type pair before (in the case of aggregates
- with self-referential types), and we made a decision, return it. */
- p = lookup_type_pair (t1, t2);
- if (p->same_p[GTC_MERGE] == 0 || p->same_p[GTC_MERGE] == 1)
- {
- /* We have already decided whether T1 and T2 are the
- same, return the cached result. */
- return p->same_p[GTC_MERGE] == 1;
- }
-
- /* Now set up the SCC machinery for the comparison. */
- gtc_next_dfs_num = 1;
- sccstate = pointer_map_create ();
- gcc_obstack_init (&sccstate_obstack);
- res = gimple_types_compatible_p_1 (t1, t2, p,
- &sccstack, sccstate, &sccstate_obstack);
- VEC_free (type_pair_t, heap, sccstack);
- pointer_map_destroy (sccstate);
- obstack_free (&sccstate_obstack, NULL);
-
- return res;
-}
-
-
-static hashval_t
-iterative_hash_gimple_type (tree, hashval_t, VEC(tree, heap) **,
- struct pointer_map_t *, struct obstack *);
-
-/* DFS visit the edge from the callers type with state *STATE to T.
- Update the callers type hash V with the hash for T if it is not part
- of the SCC containing the callers type and return it.
- SCCSTACK, SCCSTATE and SCCSTATE_OBSTACK are state for the DFS walk done. */
-
-static hashval_t
-visit (tree t, struct sccs *state, hashval_t v,
- VEC (tree, heap) **sccstack,
- struct pointer_map_t *sccstate,
- struct obstack *sccstate_obstack)
-{
- struct sccs *cstate = NULL;
- struct tree_int_map m;
- void **slot;
-
- /* If there is a hash value recorded for this type then it can't
- possibly be part of our parent SCC. Simply mix in its hash. */
- m.base.from = t;
- if ((slot = htab_find_slot (type_hash_cache, &m, NO_INSERT))
- && *slot)
- return iterative_hash_hashval_t (((struct tree_int_map *) *slot)->to, v);
-
- if ((slot = pointer_map_contains (sccstate, t)) != NULL)
- cstate = (struct sccs *)*slot;
- if (!cstate)
- {
- hashval_t tem;
- /* Not yet visited. DFS recurse. */
- tem = iterative_hash_gimple_type (t, v,
- sccstack, sccstate, sccstate_obstack);
- if (!cstate)
- cstate = (struct sccs *)* pointer_map_contains (sccstate, t);
- state->low = MIN (state->low, cstate->low);
- /* If the type is no longer on the SCC stack and thus is not part
- of the parents SCC mix in its hash value. Otherwise we will
- ignore the type for hashing purposes and return the unaltered
- hash value. */
- if (!cstate->on_sccstack)
- return tem;
- }
- if (cstate->dfsnum < state->dfsnum
- && cstate->on_sccstack)
- state->low = MIN (cstate->dfsnum, state->low);
-
- /* We are part of our parents SCC, skip this type during hashing
- and return the unaltered hash value. */
- return v;
-}
-
-/* Hash NAME with the previous hash value V and return it. */
-
-static hashval_t
-iterative_hash_name (tree name, hashval_t v)
-{
- if (!name)
- return v;
- v = iterative_hash_hashval_t (TREE_CODE (name), v);
- if (TREE_CODE (name) == TYPE_DECL)
- name = DECL_NAME (name);
- if (!name)
- return v;
- gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
- return iterative_hash_object (IDENTIFIER_HASH_VALUE (name), v);
-}
-
-/* A type, hashvalue pair for sorting SCC members. */
-
-struct type_hash_pair {
- tree type;
- hashval_t hash;
-};
-
-/* Compare two type, hashvalue pairs. */
-
-static int
-type_hash_pair_compare (const void *p1_, const void *p2_)
-{
- const struct type_hash_pair *p1 = (const struct type_hash_pair *) p1_;
- const struct type_hash_pair *p2 = (const struct type_hash_pair *) p2_;
- if (p1->hash < p2->hash)
- return -1;
- else if (p1->hash > p2->hash)
- return 1;
- return 0;
-}
-
-/* Returning a hash value for gimple type TYPE combined with VAL.
- SCCSTACK, SCCSTATE and SCCSTATE_OBSTACK are state for the DFS walk done.
-
- To hash a type we end up hashing in types that are reachable.
- Through pointers we can end up with cycles which messes up the
- required property that we need to compute the same hash value
- for structurally equivalent types. To avoid this we have to
- hash all types in a cycle (the SCC) in a commutative way. The
- easiest way is to not mix in the hashes of the SCC members at
- all. To make this work we have to delay setting the hash
- values of the SCC until it is complete. */
-
-static hashval_t
-iterative_hash_gimple_type (tree type, hashval_t val,
- VEC(tree, heap) **sccstack,
- struct pointer_map_t *sccstate,
- struct obstack *sccstate_obstack)
-{
- hashval_t v;
- void **slot;
- struct sccs *state;
-
- /* Not visited during this DFS walk. */
- gcc_checking_assert (!pointer_map_contains (sccstate, type));
- state = XOBNEW (sccstate_obstack, struct sccs);
- *pointer_map_insert (sccstate, type) = state;
-
- VEC_safe_push (tree, heap, *sccstack, type);
- state->dfsnum = next_dfs_num++;
- state->low = state->dfsnum;
- state->on_sccstack = true;
-
- /* Combine a few common features of types so that types are grouped into
- smaller sets; when searching for existing matching types to merge,
- only existing types having the same features as the new type will be
- checked. */
- v = iterative_hash_name (TYPE_NAME (type), 0);
- if (TYPE_NAME (type)
- && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
- && DECL_CONTEXT (TYPE_NAME (type))
- && TYPE_P (DECL_CONTEXT (TYPE_NAME (type))))
- v = visit (DECL_CONTEXT (TYPE_NAME (type)), state, v,
- sccstack, sccstate, sccstate_obstack);
- v = iterative_hash_hashval_t (TREE_CODE (type), v);
- v = iterative_hash_hashval_t (TYPE_QUALS (type), v);
- v = iterative_hash_hashval_t (TREE_ADDRESSABLE (type), v);
-
- /* Do not hash the types size as this will cause differences in
- hash values for the complete vs. the incomplete type variant. */
-
- /* Incorporate common features of numerical types. */
- if (INTEGRAL_TYPE_P (type)
- || SCALAR_FLOAT_TYPE_P (type)
- || FIXED_POINT_TYPE_P (type))
- {
- v = iterative_hash_hashval_t (TYPE_PRECISION (type), v);
- v = iterative_hash_hashval_t (TYPE_MODE (type), v);
- v = iterative_hash_hashval_t (TYPE_UNSIGNED (type), v);
- }
-
- /* For pointer and reference types, fold in information about the type
- pointed to. */
- if (POINTER_TYPE_P (type))
- v = visit (TREE_TYPE (type), state, v,
- sccstack, sccstate, sccstate_obstack);
-
- /* For integer types hash the types min/max values and the string flag. */
- if (TREE_CODE (type) == INTEGER_TYPE)
- {
- /* OMP lowering can introduce error_mark_node in place of
- random local decls in types. */
- if (TYPE_MIN_VALUE (type) != error_mark_node)
- v = iterative_hash_expr (TYPE_MIN_VALUE (type), v);
- if (TYPE_MAX_VALUE (type) != error_mark_node)
- v = iterative_hash_expr (TYPE_MAX_VALUE (type), v);
- v = iterative_hash_hashval_t (TYPE_STRING_FLAG (type), v);
- }
-
- /* For array types hash the domain and the string flag. */
- if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))
- {
- v = iterative_hash_hashval_t (TYPE_STRING_FLAG (type), v);
- v = visit (TYPE_DOMAIN (type), state, v,
- sccstack, sccstate, sccstate_obstack);
- }
-
- /* Recurse for aggregates with a single element type. */
- if (TREE_CODE (type) == ARRAY_TYPE
- || TREE_CODE (type) == COMPLEX_TYPE
- || TREE_CODE (type) == VECTOR_TYPE)
- v = visit (TREE_TYPE (type), state, v,
- sccstack, sccstate, sccstate_obstack);
-
- /* Incorporate function return and argument types. */
- if (TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == METHOD_TYPE)
- {
- unsigned na;
- tree p;
-
- /* For method types also incorporate their parent class. */
- if (TREE_CODE (type) == METHOD_TYPE)
- v = visit (TYPE_METHOD_BASETYPE (type), state, v,
- sccstack, sccstate, sccstate_obstack);
-
- /* Check result and argument types. */
- v = visit (TREE_TYPE (type), state, v,
- sccstack, sccstate, sccstate_obstack);
- for (p = TYPE_ARG_TYPES (type), na = 0; p; p = TREE_CHAIN (p))
- {
- v = visit (TREE_VALUE (p), state, v,
- sccstack, sccstate, sccstate_obstack);
- na++;
- }
-
- v = iterative_hash_hashval_t (na, v);
- }
-
- if (RECORD_OR_UNION_TYPE_P (type))
- {
- unsigned nf;
- tree f;
-
- for (f = TYPE_FIELDS (type), nf = 0; f; f = TREE_CHAIN (f))
- {
- v = iterative_hash_name (DECL_NAME (f), v);
- v = visit (TREE_TYPE (f), state, v,
- sccstack, sccstate, sccstate_obstack);
- nf++;
- }
-
- v = iterative_hash_hashval_t (nf, v);
- }
-
- /* Record hash for us. */
- state->u.hash = v;
-
- /* See if we found an SCC. */
- if (state->low == state->dfsnum)
- {
- tree x;
- struct tree_int_map *m;
-
- /* Pop off the SCC and set its hash values. */
- x = VEC_pop (tree, *sccstack);
- /* Optimize SCC size one. */
- if (x == type)
- {
- state->on_sccstack = false;
- m = ggc_alloc_cleared_tree_int_map ();
- m->base.from = x;
- m->to = v;
- slot = htab_find_slot (type_hash_cache, m, INSERT);
- gcc_assert (!*slot);
- *slot = (void *) m;
- }
- else
- {
- struct sccs *cstate;
- unsigned first, i, size, j;
- struct type_hash_pair *pairs;
- /* Pop off the SCC and build an array of type, hash pairs. */
- first = VEC_length (tree, *sccstack) - 1;
- while (VEC_index (tree, *sccstack, first) != type)
- --first;
- size = VEC_length (tree, *sccstack) - first + 1;
- pairs = XALLOCAVEC (struct type_hash_pair, size);
- i = 0;
- cstate = (struct sccs *)*pointer_map_contains (sccstate, x);
- cstate->on_sccstack = false;
- pairs[i].type = x;
- pairs[i].hash = cstate->u.hash;
- do
- {
- x = VEC_pop (tree, *sccstack);
- cstate = (struct sccs *)*pointer_map_contains (sccstate, x);
- cstate->on_sccstack = false;
- ++i;
- pairs[i].type = x;
- pairs[i].hash = cstate->u.hash;
- }
- while (x != type);
- gcc_assert (i + 1 == size);
- /* Sort the arrays of type, hash pairs so that when we mix in
- all members of the SCC the hash value becomes independent on
- the order we visited the SCC. Disregard hashes equal to
- the hash of the type we mix into because we cannot guarantee
- a stable sort for those across different TUs. */
- qsort (pairs, size, sizeof (struct type_hash_pair),
- type_hash_pair_compare);
- for (i = 0; i < size; ++i)
- {
- hashval_t hash;
- m = ggc_alloc_cleared_tree_int_map ();
- m->base.from = pairs[i].type;
- hash = pairs[i].hash;
- /* Skip same hashes. */
- for (j = i + 1; j < size && pairs[j].hash == pairs[i].hash; ++j)
- ;
- for (; j < size; ++j)
- hash = iterative_hash_hashval_t (pairs[j].hash, hash);
- for (j = 0; pairs[j].hash != pairs[i].hash; ++j)
- hash = iterative_hash_hashval_t (pairs[j].hash, hash);
- m->to = hash;
- if (pairs[i].type == type)
- v = hash;
- slot = htab_find_slot (type_hash_cache, m, INSERT);
- gcc_assert (!*slot);
- *slot = (void *) m;
- }
- }
- }
-
- return iterative_hash_hashval_t (v, val);
-}
-
-
-/* Returns a hash value for P (assumed to be a type). The hash value
- is computed using some distinguishing features of the type. Note
- that we cannot use pointer hashing here as we may be dealing with
- two distinct instances of the same type.
-
- This function should produce the same hash value for two compatible
- types according to gimple_types_compatible_p. */
-
-static hashval_t
-gimple_type_hash (const void *p)
-{
- const_tree t = (const_tree) p;
- VEC(tree, heap) *sccstack = NULL;
- struct pointer_map_t *sccstate;
- struct obstack sccstate_obstack;
- hashval_t val;
- void **slot;
- struct tree_int_map m;
-
- if (type_hash_cache == NULL)
- type_hash_cache = htab_create_ggc (512, tree_int_map_hash,
- tree_int_map_eq, NULL);
-
- m.base.from = CONST_CAST_TREE (t);
- if ((slot = htab_find_slot (type_hash_cache, &m, NO_INSERT))
- && *slot)
- return iterative_hash_hashval_t (((struct tree_int_map *) *slot)->to, 0);
-
- /* Perform a DFS walk and pre-hash all reachable types. */
- next_dfs_num = 1;
- sccstate = pointer_map_create ();
- gcc_obstack_init (&sccstate_obstack);
- val = iterative_hash_gimple_type (CONST_CAST_TREE (t), 0,
- &sccstack, sccstate, &sccstate_obstack);
- VEC_free (tree, heap, sccstack);
- pointer_map_destroy (sccstate);
- obstack_free (&sccstate_obstack, NULL);
-
- return val;
-}
-
/* Returning a hash value for gimple type TYPE combined with VAL.
The hash value returned is equal for types considered compatible
@@ -4236,85 +3186,8 @@ gimple_canonical_type_hash (const void *p)
}
-/* Returns nonzero if P1 and P2 are equal. */
-
-static int
-gimple_type_eq (const void *p1, const void *p2)
-{
- const_tree t1 = (const_tree) p1;
- const_tree t2 = (const_tree) p2;
- return gimple_types_compatible_p (CONST_CAST_TREE (t1),
- CONST_CAST_TREE (t2));
-}
-/* Worker for gimple_register_type.
- Register type T in the global type table gimple_types.
- When REGISTERING_MV is false first recurse for the main variant of T. */
-
-static tree
-gimple_register_type_1 (tree t, bool registering_mv)
-{
- void **slot;
- gimple_type_leader_entry *leader;
-
- /* If we registered this type before return the cached result. */
- leader = &gimple_type_leader[TYPE_UID (t) % GIMPLE_TYPE_LEADER_SIZE];
- if (leader->type == t)
- return leader->leader;
-
- /* Always register the main variant first. This is important so we
- pick up the non-typedef variants as canonical, otherwise we'll end
- up taking typedef ids for structure tags during comparison.
- It also makes sure that main variants will be merged to main variants.
- As we are operating on a possibly partially fixed up type graph
- do not bother to recurse more than once, otherwise we may end up
- walking in circles.
- If we are registering a main variant it will either remain its
- own main variant or it will be merged to something else in which
- case we do not care for the main variant leader. */
- if (!registering_mv
- && TYPE_MAIN_VARIANT (t) != t)
- gimple_register_type_1 (TYPE_MAIN_VARIANT (t), true);
-
- /* See if we already have an equivalent type registered. */
- slot = htab_find_slot (gimple_types, t, INSERT);
- if (*slot
- && *(tree *)slot != t)
- {
- tree new_type = (tree) *((tree *) slot);
- leader->type = t;
- leader->leader = new_type;
- return new_type;
- }
-
- /* If not, insert it to the cache and the hash. */
- leader->type = t;
- leader->leader = t;
- *slot = (void *) t;
- return t;
-}
-
-/* Register type T in the global type table gimple_types.
- If another type T', compatible with T, already existed in
- gimple_types then return T', otherwise return T. This is used by
- LTO to merge identical types read from different TUs. */
-
-tree
-gimple_register_type (tree t)
-{
- gcc_assert (TYPE_P (t));
-
- if (!gimple_type_leader)
- gimple_type_leader = ggc_alloc_cleared_vec_gimple_type_leader_entry_s
- (GIMPLE_TYPE_LEADER_SIZE);
-
- if (gimple_types == NULL)
- gimple_types = htab_create_ggc (16381, gimple_type_hash, gimple_type_eq, 0);
-
- return gimple_register_type_1 (t, false);
-}
-
/* The TYPE_CANONICAL merging machinery. It should closely resemble
the middle-end types_compatible_p function. It needs to avoid
claiming types are different for types that should be treated
@@ -4587,48 +3460,28 @@ gimple_register_canonical_type (tree t)
/* Show statistics on references to the global type table gimple_types. */
void
-print_gimple_types_stats (void)
-{
- if (gimple_types)
- fprintf (stderr, "GIMPLE type table: size %ld, %ld elements, "
- "%ld searches, %ld collisions (ratio: %f)\n",
- (long) htab_size (gimple_types),
- (long) htab_elements (gimple_types),
- (long) gimple_types->searches,
- (long) gimple_types->collisions,
- htab_collisions (gimple_types));
- else
- fprintf (stderr, "GIMPLE type table is empty\n");
- if (type_hash_cache)
- fprintf (stderr, "GIMPLE type hash table: size %ld, %ld elements, "
- "%ld searches, %ld collisions (ratio: %f)\n",
- (long) htab_size (type_hash_cache),
- (long) htab_elements (type_hash_cache),
- (long) type_hash_cache->searches,
- (long) type_hash_cache->collisions,
- htab_collisions (type_hash_cache));
- else
- fprintf (stderr, "GIMPLE type hash table is empty\n");
+print_gimple_types_stats (const char *pfx)
+{
if (gimple_canonical_types)
- fprintf (stderr, "GIMPLE canonical type table: size %ld, %ld elements, "
- "%ld searches, %ld collisions (ratio: %f)\n",
+ fprintf (stderr, "[%s] GIMPLE canonical type table: size %ld, "
+ "%ld elements, %ld searches, %ld collisions (ratio: %f)\n", pfx,
(long) htab_size (gimple_canonical_types),
(long) htab_elements (gimple_canonical_types),
(long) gimple_canonical_types->searches,
(long) gimple_canonical_types->collisions,
htab_collisions (gimple_canonical_types));
else
- fprintf (stderr, "GIMPLE canonical type table is empty\n");
+ fprintf (stderr, "[%s] GIMPLE canonical type table is empty\n", pfx);
if (canonical_type_hash_cache)
- fprintf (stderr, "GIMPLE canonical type hash table: size %ld, %ld elements, "
- "%ld searches, %ld collisions (ratio: %f)\n",
+ fprintf (stderr, "[%s] GIMPLE canonical type hash table: size %ld, "
+ "%ld elements, %ld searches, %ld collisions (ratio: %f)\n", pfx,
(long) htab_size (canonical_type_hash_cache),
(long) htab_elements (canonical_type_hash_cache),
(long) canonical_type_hash_cache->searches,
(long) canonical_type_hash_cache->collisions,
htab_collisions (canonical_type_hash_cache));
else
- fprintf (stderr, "GIMPLE canonical type hash table is empty\n");
+ fprintf (stderr, "[%s] GIMPLE canonical type hash table is empty\n", pfx);
}
/* Free the gimple type hashtables used for LTO type merging. */
@@ -4636,36 +3489,16 @@ print_gimple_types_stats (void)
void
free_gimple_type_tables (void)
{
- /* Last chance to print stats for the tables. */
- if (flag_lto_report)
- print_gimple_types_stats ();
-
- if (gimple_types)
- {
- htab_delete (gimple_types);
- gimple_types = NULL;
- }
if (gimple_canonical_types)
{
htab_delete (gimple_canonical_types);
gimple_canonical_types = NULL;
}
- if (type_hash_cache)
- {
- htab_delete (type_hash_cache);
- type_hash_cache = NULL;
- }
if (canonical_type_hash_cache)
{
htab_delete (canonical_type_hash_cache);
canonical_type_hash_cache = NULL;
}
- if (type_pair_cache)
- {
- free (type_pair_cache);
- type_pair_cache = NULL;
- }
- gimple_type_leader = NULL;
}
diff --git a/gcc/gimple.h b/gcc/gimple.h
index 15b597fc187..797cd944450 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -882,9 +882,8 @@ extern bool is_gimple_call_addr (tree);
extern void recalculate_side_effects (tree);
extern bool gimple_compare_field_offset (tree, tree);
-extern tree gimple_register_type (tree);
extern tree gimple_register_canonical_type (tree);
-extern void print_gimple_types_stats (void);
+extern void print_gimple_types_stats (const char *);
extern void free_gimple_type_tables (void);
extern tree gimple_unsigned_type (tree);
extern tree gimple_signed_type (tree);
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 03973537ee6..31883162e66 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -2498,21 +2498,11 @@ gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
transform all calls in the same manner as the expanders do, but
we do transform most of them. */
fndecl = get_callee_fndecl (*expr_p);
- if (fndecl && DECL_BUILT_IN (fndecl))
- {
- tree new_tree = fold_call_expr (input_location, *expr_p, !want_value);
-
- if (new_tree && new_tree != *expr_p)
- {
- /* There was a transformation of this call which computes the
- same value, but in a more efficient way. Return and try
- again. */
- *expr_p = new_tree;
- return GS_OK;
- }
-
- if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
- && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_VA_START)
+ if (fndecl
+ && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
+ switch (DECL_FUNCTION_CODE (fndecl))
+ {
+ case BUILT_IN_VA_START:
{
builtin_va_start_p = TRUE;
if (call_expr_nargs (*expr_p) < 2)
@@ -2527,6 +2517,40 @@ gimplify_call_expr (tree *expr_p, gimple_seq *pre_p, bool want_value)
*expr_p = build_empty_stmt (EXPR_LOCATION (*expr_p));
return GS_OK;
}
+ break;
+ }
+ case BUILT_IN_LINE:
+ {
+ expanded_location loc = expand_location (EXPR_LOCATION (*expr_p));
+ *expr_p = build_int_cst (TREE_TYPE (*expr_p), loc.line);
+ return GS_OK;
+ }
+ case BUILT_IN_FILE:
+ {
+ expanded_location loc = expand_location (EXPR_LOCATION (*expr_p));
+ *expr_p = build_string_literal (strlen (loc.file) + 1, loc.file);
+ return GS_OK;
+ }
+ case BUILT_IN_FUNCTION:
+ {
+ const char *function;
+ function = IDENTIFIER_POINTER (DECL_NAME (current_function_decl));
+ *expr_p = build_string_literal (strlen (function) + 1, function);
+ return GS_OK;
+ }
+ default:
+ ;
+ }
+ if (fndecl && DECL_BUILT_IN (fndecl))
+ {
+ tree new_tree = fold_call_expr (input_location, *expr_p, !want_value);
+ if (new_tree && new_tree != *expr_p)
+ {
+ /* There was a transformation of this call which computes the
+ same value, but in a more efficient way. Return and try
+ again. */
+ *expr_p = new_tree;
+ return GS_OK;
}
}
@@ -7429,6 +7453,15 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
gimple_seq eval, cleanup;
gimple try_;
+ /* Calls to destructors are generated automatically in FINALLY/CATCH
+ block. They should have location as UNKNOWN_LOCATION. However,
+ gimplify_call_expr will reset these call stmts to input_location
+ if it finds stmt's location is unknown. To prevent resetting for
+ destructors, we set the input_location to unknown.
+ Note that this only affects the destructor calls in FINALLY/CATCH
+ block, and will automatically reset to its original value by the
+ end of gimplify_expr. */
+ input_location = UNKNOWN_LOCATION;
eval = cleanup = NULL;
gimplify_and_add (TREE_OPERAND (*expr_p, 0), &eval);
gimplify_and_add (TREE_OPERAND (*expr_p, 1), &cleanup);
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index b66a193afee..892c561d6a3 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -182,21 +182,22 @@ Expression::convert_for_assignment(Translate_context* context, Type* lhs_type,
VEC(constructor_elt,gc)* init = VEC_alloc(constructor_elt, gc, 3);
- constructor_elt* elt = VEC_quick_push(constructor_elt, init, NULL);
+ constructor_elt empty = {NULL, NULL};
+ constructor_elt* elt = VEC_quick_push(constructor_elt, init, empty);
tree field = TYPE_FIELDS(lhs_type_tree);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)),
"__values") == 0);
elt->index = field;
elt->value = fold_convert(TREE_TYPE(field), null_pointer_node);
- elt = VEC_quick_push(constructor_elt, init, NULL);
+ elt = VEC_quick_push(constructor_elt, init, empty);
field = DECL_CHAIN(field);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)),
"__count") == 0);
elt->index = field;
elt->value = fold_convert(TREE_TYPE(field), integer_zero_node);
- elt = VEC_quick_push(constructor_elt, init, NULL);
+ elt = VEC_quick_push(constructor_elt, init, empty);
field = DECL_CHAIN(field);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)),
"__capacity") == 0);
@@ -315,7 +316,8 @@ Expression::convert_type_to_interface(Translate_context* context,
VEC(constructor_elt,gc)* init = VEC_alloc(constructor_elt, gc, 2);
- constructor_elt* elt = VEC_quick_push(constructor_elt, init, NULL);
+ constructor_elt empty = {NULL, NULL};
+ constructor_elt* elt = VEC_quick_push(constructor_elt, init, empty);
tree field = TYPE_FIELDS(lhs_type_tree);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)),
(lhs_is_empty ? "__type_descriptor" : "__methods")) == 0);
@@ -323,7 +325,7 @@ Expression::convert_type_to_interface(Translate_context* context,
elt->value = fold_convert_loc(location.gcc_location(), TREE_TYPE(field),
first_field_value);
- elt = VEC_quick_push(constructor_elt, init, NULL);
+ elt = VEC_quick_push(constructor_elt, init, empty);
field = DECL_CHAIN(field);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)), "__object") == 0);
elt->index = field;
@@ -439,7 +441,8 @@ Expression::convert_interface_to_interface(Translate_context* context,
VEC(constructor_elt,gc)* init = VEC_alloc(constructor_elt, gc, 2);
- constructor_elt* elt = VEC_quick_push(constructor_elt, init, NULL);
+ constructor_elt empty = {NULL, NULL};
+ constructor_elt* elt = VEC_quick_push(constructor_elt, init, empty);
tree field = TYPE_FIELDS(lhs_type_tree);
elt->index = field;
@@ -502,7 +505,7 @@ Expression::convert_interface_to_interface(Translate_context* context,
// The second field is simply the object pointer.
- elt = VEC_quick_push(constructor_elt, init, NULL);
+ elt = VEC_quick_push(constructor_elt, init, empty);
field = DECL_CHAIN(field);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)), "__object") == 0);
elt->index = field;
@@ -9959,20 +9962,21 @@ Array_index_expression::do_get_tree(Translate_context* context)
VEC(constructor_elt,gc)* init = VEC_alloc(constructor_elt, gc, 3);
- constructor_elt* elt = VEC_quick_push(constructor_elt, init, NULL);
+ constructor_elt empty = {NULL, NULL};
+ constructor_elt* elt = VEC_quick_push(constructor_elt, init, empty);
tree field = TYPE_FIELDS(struct_tree);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)), "__values") == 0);
elt->index = field;
elt->value = value_pointer;
- elt = VEC_quick_push(constructor_elt, init, NULL);
+ elt = VEC_quick_push(constructor_elt, init, empty);
field = DECL_CHAIN(field);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)), "__count") == 0);
elt->index = field;
elt->value = fold_convert_loc(loc.gcc_location(), TREE_TYPE(field),
result_length_tree);
- elt = VEC_quick_push(constructor_elt, init, NULL);
+ elt = VEC_quick_push(constructor_elt, init, empty);
field = DECL_CHAIN(field);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)), "__capacity") == 0);
elt->index = field;
@@ -11355,7 +11359,8 @@ Struct_construction_expression::do_get_tree(Translate_context* context)
if (val == error_mark_node || TREE_TYPE(val) == error_mark_node)
return error_mark_node;
- constructor_elt* elt = VEC_quick_push(constructor_elt, elts, NULL);
+ constructor_elt empty = {NULL, NULL};
+ constructor_elt* elt = VEC_quick_push(constructor_elt, elts, empty);
elt->index = field;
elt->value = val;
if (!TREE_CONSTANT(val))
@@ -11583,7 +11588,8 @@ Array_construction_expression::get_constructor_tree(Translate_context* context,
{
if (this->indexes_ != NULL)
go_assert(pi != this->indexes_->end());
- constructor_elt* elt = VEC_quick_push(constructor_elt, values, NULL);
+ constructor_elt empty = {NULL, NULL};
+ constructor_elt* elt = VEC_quick_push(constructor_elt, values, empty);
if (this->indexes_ == NULL)
elt->index = size_int(i);
@@ -11793,7 +11799,8 @@ Open_array_construction_expression::do_get_tree(Translate_context* context)
if (constructor_type == error_mark_node)
return error_mark_node;
VEC(constructor_elt,gc)* vec = VEC_alloc(constructor_elt, gc, 1);
- constructor_elt* elt = VEC_quick_push(constructor_elt, vec, NULL);
+ constructor_elt empty = {NULL, NULL};
+ constructor_elt* elt = VEC_quick_push(constructor_elt, vec, empty);
elt->index = size_int(0);
Gogo* gogo = context->gogo();
Btype* btype = element_type->get_backend(gogo);
@@ -11886,19 +11893,20 @@ Open_array_construction_expression::do_get_tree(Translate_context* context)
VEC(constructor_elt,gc)* init = VEC_alloc(constructor_elt, gc, 3);
- constructor_elt* elt = VEC_quick_push(constructor_elt, init, NULL);
+ constructor_elt empty = {NULL, NULL};
+ constructor_elt* elt = VEC_quick_push(constructor_elt, init, empty);
tree field = TYPE_FIELDS(type_tree);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)), "__values") == 0);
elt->index = field;
elt->value = fold_convert(TREE_TYPE(field), space);
- elt = VEC_quick_push(constructor_elt, init, NULL);
+ elt = VEC_quick_push(constructor_elt, init, empty);
field = DECL_CHAIN(field);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)), "__count") == 0);
elt->index = field;
elt->value = fold_convert(TREE_TYPE(field), length_tree);
- elt = VEC_quick_push(constructor_elt, init, NULL);
+ elt = VEC_quick_push(constructor_elt, init, empty);
field = DECL_CHAIN(field);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)),"__capacity") == 0);
elt->index = field;
@@ -12102,7 +12110,8 @@ Map_construction_expression::do_get_tree(Translate_context* context)
VEC(constructor_elt,gc)* one = VEC_alloc(constructor_elt, gc, 2);
- constructor_elt* elt = VEC_quick_push(constructor_elt, one, NULL);
+ constructor_elt empty = {NULL, NULL};
+ constructor_elt* elt = VEC_quick_push(constructor_elt, one, empty);
elt->index = key_field;
tree val_tree = (*pv)->get_tree(context);
elt->value = Expression::convert_for_assignment(context, key_type,
@@ -12115,7 +12124,7 @@ Map_construction_expression::do_get_tree(Translate_context* context)
++pv;
- elt = VEC_quick_push(constructor_elt, one, NULL);
+ elt = VEC_quick_push(constructor_elt, one, empty);
elt->index = val_field;
val_tree = (*pv)->get_tree(context);
elt->value = Expression::convert_for_assignment(context, val_type,
@@ -12126,7 +12135,7 @@ Map_construction_expression::do_get_tree(Translate_context* context)
if (!TREE_CONSTANT(elt->value))
one_is_constant = false;
- elt = VEC_quick_push(constructor_elt, values, NULL);
+ elt = VEC_quick_push(constructor_elt, values, empty);
elt->index = size_int(i);
elt->value = build_constructor(struct_type, one);
if (one_is_constant)
diff --git a/gcc/go/gofrontend/gogo-tree.cc b/gcc/go/gofrontend/gogo-tree.cc
index c933d937596..9a181a344ad 100644
--- a/gcc/go/gofrontend/gogo-tree.cc
+++ b/gcc/go/gofrontend/gogo-tree.cc
@@ -354,7 +354,8 @@ Gogo::register_gc_vars(const std::vector<Named_object*>& var_gc,
{
VEC(constructor_elt,gc)* init = VEC_alloc(constructor_elt, gc, 2);
- constructor_elt* elt = VEC_quick_push(constructor_elt, init, NULL);
+ constructor_elt empty = {NULL, NULL};
+ constructor_elt* elt = VEC_quick_push(constructor_elt, init, empty);
tree field = TYPE_FIELDS(root_type);
elt->index = field;
Bvariable* bvar = (*p)->get_backend_variable(this, NULL);
@@ -362,12 +363,12 @@ Gogo::register_gc_vars(const std::vector<Named_object*>& var_gc,
go_assert(TREE_CODE(decl) == VAR_DECL);
elt->value = build_fold_addr_expr(decl);
- elt = VEC_quick_push(constructor_elt, init, NULL);
+ elt = VEC_quick_push(constructor_elt, init, empty);
field = DECL_CHAIN(field);
elt->index = field;
elt->value = DECL_SIZE_UNIT(decl);
- elt = VEC_quick_push(constructor_elt, roots_init, NULL);
+ elt = VEC_quick_push(constructor_elt, roots_init, empty);
elt->index = size_int(i);
elt->value = build_constructor(root_type, init);
}
@@ -376,17 +377,18 @@ Gogo::register_gc_vars(const std::vector<Named_object*>& var_gc,
VEC(constructor_elt,gc)* init = VEC_alloc(constructor_elt, gc, 2);
- constructor_elt* elt = VEC_quick_push(constructor_elt, init, NULL);
+ constructor_elt empty = {NULL, NULL};
+ constructor_elt* elt = VEC_quick_push(constructor_elt, init, empty);
tree field = TYPE_FIELDS(root_type);
elt->index = field;
elt->value = fold_convert(TREE_TYPE(field), null_pointer_node);
- elt = VEC_quick_push(constructor_elt, init, NULL);
+ elt = VEC_quick_push(constructor_elt, init, empty);
field = DECL_CHAIN(field);
elt->index = field;
elt->value = size_zero_node;
- elt = VEC_quick_push(constructor_elt, roots_init, NULL);
+ elt = VEC_quick_push(constructor_elt, roots_init, empty);
elt->index = size_int(i);
elt->value = build_constructor(root_type, init);
@@ -394,12 +396,12 @@ Gogo::register_gc_vars(const std::vector<Named_object*>& var_gc,
VEC(constructor_elt,gc)* root_list_init = VEC_alloc(constructor_elt, gc, 2);
- elt = VEC_quick_push(constructor_elt, root_list_init, NULL);
+ elt = VEC_quick_push(constructor_elt, root_list_init, empty);
field = TYPE_FIELDS(root_list_type);
elt->index = field;
elt->value = fold_convert(TREE_TYPE(field), null_pointer_node);
- elt = VEC_quick_push(constructor_elt, root_list_init, NULL);
+ elt = VEC_quick_push(constructor_elt, root_list_init, empty);
field = DECL_CHAIN(field);
elt->index = field;
elt->value = build_constructor(array_type, roots_init);
@@ -2029,7 +2031,8 @@ Gogo::go_string_constant_tree(const std::string& val)
VEC(constructor_elt, gc)* init = VEC_alloc(constructor_elt, gc, 2);
- constructor_elt* elt = VEC_quick_push(constructor_elt, init, NULL);
+ constructor_elt empty = {NULL, NULL};
+ constructor_elt* elt = VEC_quick_push(constructor_elt, init, empty);
tree field = TYPE_FIELDS(string_type);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)), "__data") == 0);
elt->index = field;
@@ -2037,7 +2040,7 @@ Gogo::go_string_constant_tree(const std::string& val)
elt->value = fold_convert(TREE_TYPE(field),
build_fold_addr_expr(str));
- elt = VEC_quick_push(constructor_elt, init, NULL);
+ elt = VEC_quick_push(constructor_elt, init, empty);
field = DECL_CHAIN(field);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)), "__length") == 0);
elt->index = field;
@@ -2089,7 +2092,8 @@ Gogo::slice_constructor(tree slice_type_tree, tree values, tree count,
tree field = TYPE_FIELDS(slice_type_tree);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)), "__values") == 0);
- constructor_elt* elt = VEC_quick_push(constructor_elt, init, NULL);
+ constructor_elt empty = {NULL, NULL};
+ constructor_elt* elt = VEC_quick_push(constructor_elt, init, empty);
elt->index = field;
go_assert(TYPE_MAIN_VARIANT(TREE_TYPE(field))
== TYPE_MAIN_VARIANT(TREE_TYPE(values)));
@@ -2104,13 +2108,13 @@ Gogo::slice_constructor(tree slice_type_tree, tree values, tree count,
field = DECL_CHAIN(field);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)), "__count") == 0);
- elt = VEC_quick_push(constructor_elt, init, NULL);
+ elt = VEC_quick_push(constructor_elt, init, empty);
elt->index = field;
elt->value = fold_convert(TREE_TYPE(field), count);
field = DECL_CHAIN(field);
go_assert(strcmp(IDENTIFIER_POINTER(DECL_NAME(field)), "__capacity") == 0);
- elt = VEC_quick_push(constructor_elt, init, NULL);
+ elt = VEC_quick_push(constructor_elt, init, empty);
elt->index = field;
elt->value = fold_convert(TREE_TYPE(field), capacity);
@@ -2170,7 +2174,8 @@ Gogo::interface_method_table_for_type(const Interface_type* interface,
count + 1);
// The first element is the type descriptor.
- constructor_elt* elt = VEC_quick_push(constructor_elt, pointers, NULL);
+ constructor_elt empty = {NULL, NULL};
+ constructor_elt* elt = VEC_quick_push(constructor_elt, pointers, empty);
elt->index = size_zero_node;
Type* td_type;
if (!is_pointer)
@@ -2204,7 +2209,7 @@ Gogo::interface_method_table_for_type(const Interface_type* interface,
go_unreachable();
fndecl = build_fold_addr_expr(fndecl);
- elt = VEC_quick_push(constructor_elt, pointers, NULL);
+ elt = VEC_quick_push(constructor_elt, pointers, empty);
elt->index = size_int(i);
elt->value = fold_convert(const_ptr_type_node, fndecl);
}
diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c
index 48bbae94dce..0ea9e6a473d 100644
--- a/gcc/graphite-scop-detection.c
+++ b/gcc/graphite-scop-detection.c
@@ -143,7 +143,7 @@ move_sd_regions (VEC (sd_region, heap) **source,
int i;
FOR_EACH_VEC_ELT (sd_region, *source, i, s)
- VEC_safe_push (sd_region, heap, *target, s);
+ VEC_safe_push (sd_region, heap, *target, *s);
VEC_free (sd_region, heap, *source);
}
@@ -500,7 +500,7 @@ scopdet_basic_block_info (basic_block bb, loop_p outermost_loop,
sd_region open_scop;
open_scop.entry = bb;
open_scop.exit = exit_e->dest;
- VEC_safe_push (sd_region, heap, *scops, &open_scop);
+ VEC_safe_push (sd_region, heap, *scops, open_scop);
VEC_free (sd_region, heap, regions);
}
}
@@ -756,7 +756,7 @@ build_scops_1 (basic_block current, loop_p outermost_loop,
else if (in_scop && (sinfo.exits || sinfo.difficult))
{
open_scop.exit = current;
- VEC_safe_push (sd_region, heap, *scops, &open_scop);
+ VEC_safe_push (sd_region, heap, *scops, open_scop);
in_scop = false;
}
@@ -771,7 +771,7 @@ build_scops_1 (basic_block current, loop_p outermost_loop,
{
open_scop.exit = sinfo.exit;
gcc_assert (open_scop.exit);
- VEC_safe_push (sd_region, heap, *scops, &open_scop);
+ VEC_safe_push (sd_region, heap, *scops, open_scop);
}
result.exit = sinfo.exit;
@@ -1205,7 +1205,7 @@ limit_scops (VEC (scop_p, heap) **scops)
&& contains_only_close_phi_nodes (open_scop.exit))
open_scop.exit = single_succ_edge (open_scop.exit)->dest;
- VEC_safe_push (sd_region, heap, regions, &open_scop);
+ VEC_safe_push (sd_region, heap, regions, open_scop);
}
}
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index ded38f5af1a..3a7b9101db9 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -1249,7 +1249,7 @@ build_sese_conditions_before (struct dom_walk_data *dw_data,
if (e->flags & EDGE_TRUE_VALUE)
VEC_safe_push (gimple, heap, *cases, stmt);
else
- VEC_safe_push (gimple, heap, *cases, (gimple) NULL);
+ VEC_safe_push (gimple, heap, *cases, NULL);
}
gbb = gbb_from_bb (bb);
diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c
index 97ae376a658..268f0777cfd 100644
--- a/gcc/ipa-inline-analysis.c
+++ b/gcc/ipa-inline-analysis.c
@@ -266,7 +266,7 @@ add_condition (struct inline_summary *summary, int operand_num,
new_cond.agg_contents = agg_contents;
new_cond.by_ref = by_ref;
new_cond.offset = offset;
- VEC_safe_push (condition, gc, summary->conds, &new_cond);
+ VEC_safe_push (condition, gc, summary->conds, new_cond);
return single_cond_predicate (i + predicate_first_dynamic_condition);
}
@@ -634,6 +634,11 @@ dump_inline_hints (FILE *f, inline_hints hints)
hints &= ~INLINE_HINT_loop_iterations;
fprintf (f, " loop_iterations");
}
+ if (hints & INLINE_HINT_loop_stride)
+ {
+ hints &= ~INLINE_HINT_loop_stride;
+ fprintf (f, " loop_stride");
+ }
gcc_assert (!hints);
}
@@ -688,7 +693,7 @@ account_size_time (struct inline_summary *summary, int size, int time,
new_entry.size = size;
new_entry.time = time;
new_entry.predicate = *pred;
- VEC_safe_push (size_time_entry, gc, summary->entry, &new_entry);
+ VEC_safe_push (size_time_entry, gc, summary->entry, new_entry);
}
else
{
@@ -719,6 +724,26 @@ edge_set_predicate (struct cgraph_edge *e, struct predicate *predicate)
}
}
+/* Set predicate for hint *P. */
+
+static void
+set_hint_predicate (struct predicate **p, struct predicate new_predicate)
+{
+ if (false_predicate_p (&new_predicate)
+ || true_predicate_p (&new_predicate))
+ {
+ if (*p)
+ pool_free (edge_predicate_pool, *p);
+ *p = NULL;
+ }
+ else
+ {
+ if (!*p)
+ *p = (struct predicate *)pool_alloc (edge_predicate_pool);
+ **p = new_predicate;
+ }
+}
+
/* KNOWN_VALS is partial mapping of parameters of NODE to constant values.
KNOWN_AGGS is a vector of aggreggate jump functions for each parameter.
@@ -953,6 +978,11 @@ reset_inline_summary (struct cgraph_node *node)
pool_free (edge_predicate_pool, info->loop_iterations);
info->loop_iterations = NULL;
}
+ if (info->loop_stride)
+ {
+ pool_free (edge_predicate_pool, info->loop_stride);
+ info->loop_stride = NULL;
+ }
VEC_free (condition, gc, info->conds);
VEC_free (size_time_entry,gc, info->entry);
for (e = node->callees; e; e = e->next_callee)
@@ -975,6 +1005,52 @@ inline_node_removal_hook (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
memset (info, 0, sizeof (inline_summary_t));
}
+/* Remap predicate P of former function to be predicate of duplicated functoin.
+ POSSIBLE_TRUTHS is clause of possible truths in the duplicated node,
+ INFO is inline summary of the duplicated node. */
+
+static struct predicate
+remap_predicate_after_duplication (struct predicate *p,
+ clause_t possible_truths,
+ struct inline_summary *info)
+{
+ struct predicate new_predicate = true_predicate ();
+ int j;
+ for (j = 0; p->clause[j]; j++)
+ if (!(possible_truths & p->clause[j]))
+ {
+ new_predicate = false_predicate ();
+ break;
+ }
+ else
+ add_clause (info->conds, &new_predicate,
+ possible_truths & p->clause[j]);
+ return new_predicate;
+}
+
+/* Same as remap_predicate_after_duplication but handle hint predicate *P.
+ Additionally care about allocating new memory slot for updated predicate
+ and set it to NULL when it becomes true or false (and thus uninteresting).
+ */
+
+static void
+remap_hint_predicate_after_duplication (struct predicate **p,
+ clause_t possible_truths,
+ struct inline_summary *info)
+{
+ struct predicate new_predicate;
+
+ if (!*p)
+ return;
+
+ new_predicate = remap_predicate_after_duplication (*p,
+ possible_truths,
+ info);
+ /* We do not want to free previous predicate; it is used by node origin. */
+ *p = NULL;
+ set_hint_predicate (p, new_predicate);
+}
+
/* Hook that is called by cgraph.c when a node is duplicated. */
@@ -1042,16 +1118,10 @@ inline_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
to be true. */
for (i = 0; VEC_iterate (size_time_entry, entry, i, e); i++)
{
- struct predicate new_predicate = true_predicate ();
- for (j = 0; e->predicate.clause[j]; j++)
- if (!(possible_truths & e->predicate.clause[j]))
- {
- new_predicate = false_predicate ();
- break;
- }
- else
- add_clause (info->conds, &new_predicate,
- possible_truths & e->predicate.clause[j]);
+ struct predicate new_predicate;
+ new_predicate = remap_predicate_after_duplication (&e->predicate,
+ possible_truths,
+ info);
if (false_predicate_p (&new_predicate))
{
optimized_out_size += e->size;
@@ -1065,22 +1135,16 @@ inline_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
Also copy constantness arrays. */
for (edge = dst->callees; edge; edge = edge->next_callee)
{
- struct predicate new_predicate = true_predicate ();
+ struct predicate new_predicate;
struct inline_edge_summary *es = inline_edge_summary (edge);
if (!edge->inline_failed)
inlined_to_p = true;
if (!es->predicate)
continue;
- for (j = 0; es->predicate->clause[j]; j++)
- if (!(possible_truths & es->predicate->clause[j]))
- {
- new_predicate = false_predicate ();
- break;
- }
- else
- add_clause (info->conds, &new_predicate,
- possible_truths & es->predicate->clause[j]);
+ new_predicate = remap_predicate_after_duplication (es->predicate,
+ possible_truths,
+ info);
if (false_predicate_p (&new_predicate)
&& !false_predicate_p (es->predicate))
{
@@ -1097,22 +1161,15 @@ inline_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
Also copy constantness arrays. */
for (edge = dst->indirect_calls; edge; edge = edge->next_callee)
{
- struct predicate new_predicate = true_predicate ();
+ struct predicate new_predicate;
struct inline_edge_summary *es = inline_edge_summary (edge);
- if (!edge->inline_failed)
- inlined_to_p = true;
+ gcc_checking_assert (edge->inline_failed);
if (!es->predicate)
continue;
- for (j = 0; es->predicate->clause[j]; j++)
- if (!(possible_truths & es->predicate->clause[j]))
- {
- new_predicate = false_predicate ();
- break;
- }
- else
- add_clause (info->conds, &new_predicate,
- possible_truths & es->predicate->clause[j]);
+ new_predicate = remap_predicate_after_duplication (es->predicate,
+ possible_truths,
+ info);
if (false_predicate_p (&new_predicate)
&& !false_predicate_p (es->predicate))
{
@@ -1124,28 +1181,12 @@ inline_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
}
edge_set_predicate (edge, &new_predicate);
}
- if (info->loop_iterations)
- {
- struct predicate new_predicate = true_predicate ();
-
- for (j = 0; info->loop_iterations->clause[j]; j++)
- if (!(possible_truths & info->loop_iterations->clause[j]))
- {
- new_predicate = false_predicate ();
- break;
- }
- else
- add_clause (info->conds, &new_predicate,
- possible_truths & info->loop_iterations->clause[j]);
- if (false_predicate_p (&new_predicate)
- || true_predicate_p (&new_predicate))
- info->loop_iterations = NULL;
- else
- {
- info->loop_iterations = (struct predicate *)pool_alloc (edge_predicate_pool);
- *info->loop_iterations = new_predicate;
- }
- }
+ remap_hint_predicate_after_duplication (&info->loop_iterations,
+ possible_truths,
+ info);
+ remap_hint_predicate_after_duplication (&info->loop_stride,
+ possible_truths,
+ info);
/* If inliner or someone after inliner will ever start producing
non-trivial clones, we will get trouble with lack of information
@@ -1175,8 +1216,14 @@ inline_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
if (info->loop_iterations)
{
predicate p = *info->loop_iterations;
- info->loop_iterations = (struct predicate *)pool_alloc (edge_predicate_pool);
- *info->loop_iterations = p;
+ info->loop_iterations = NULL;
+ set_hint_predicate (&info->loop_iterations, p);
+ }
+ if (info->loop_stride)
+ {
+ predicate p = *info->loop_stride;
+ info->loop_stride = NULL;
+ set_hint_predicate (&info->loop_stride, p);
}
}
}
@@ -1355,6 +1402,11 @@ dump_inline_summary (FILE * f, struct cgraph_node *node)
fprintf (f, " loop iterations:");
dump_predicate (f, s->conds, s->loop_iterations);
}
+ if (s->loop_stride)
+ {
+ fprintf (f, " loop stride:");
+ dump_predicate (f, s->conds, s->loop_stride);
+ }
fprintf (f, " calls:\n");
dump_inline_edge_summary (f, 4, node, s);
fprintf (f, "\n");
@@ -1851,13 +1903,37 @@ will_be_nonconstant_expr_predicate (struct ipa_node_params *info,
if (TREE_CODE (expr) == SSA_NAME)
return VEC_index (predicate_t, nonconstant_names,
SSA_NAME_VERSION (expr));
- if (BINARY_CLASS_P (expr))
+ if (BINARY_CLASS_P (expr)
+ || COMPARISON_CLASS_P (expr))
+ {
+ struct predicate p1 = will_be_nonconstant_expr_predicate
+ (info, summary, TREE_OPERAND (expr, 0),
+ nonconstant_names);
+ struct predicate p2;
+ if (true_predicate_p (&p1))
+ return p1;
+ p2 = will_be_nonconstant_expr_predicate (info, summary,
+ TREE_OPERAND (expr, 1),
+ nonconstant_names);
+ return or_predicates (summary->conds, &p1, &p2);
+ }
+ else if (TREE_CODE (expr) == COND_EXPR)
{
- struct predicate p1 = will_be_nonconstant_expr_predicate (info, summary, TREE_OPERAND (expr, 0), nonconstant_names);
+ struct predicate p1 = will_be_nonconstant_expr_predicate
+ (info, summary, TREE_OPERAND (expr, 0),
+ nonconstant_names);
struct predicate p2;
if (true_predicate_p (&p1))
return p1;
- p2 = will_be_nonconstant_expr_predicate (info, summary, TREE_OPERAND (expr, 0), nonconstant_names);
+ p2 = will_be_nonconstant_expr_predicate (info, summary,
+ TREE_OPERAND (expr, 1),
+ nonconstant_names);
+ if (true_predicate_p (&p2))
+ return p2;
+ p1 = or_predicates (summary->conds, &p1, &p2);
+ p2 = will_be_nonconstant_expr_predicate (info, summary,
+ TREE_OPERAND (expr, 2),
+ nonconstant_names);
return or_predicates (summary->conds, &p1, &p2);
}
else
@@ -2390,6 +2466,7 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early)
struct loop *loop;
loop_iterator li;
predicate loop_iterations = true_predicate ();
+ predicate loop_stride = true_predicate ();
if (dump_file && (dump_flags & TDF_DETAILS))
flow_loops_dump (dump_file, NULL, 0);
@@ -2398,8 +2475,9 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early)
{
VEC (edge, heap) *exits;
edge ex;
- unsigned int j;
+ unsigned int j, i;
struct tree_niter_desc niter_desc;
+ basic_block *body = get_loop_body (loop);
exits = get_loop_exit_edges (loop);
FOR_EACH_VEC_ELT (edge, exits, j, ex)
@@ -2416,12 +2494,39 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early)
loop_iterations = and_predicates (info->conds, &loop_iterations, &will_be_nonconstant);
}
VEC_free (edge, heap, exits);
+
+ for (i = 0; i < loop->num_nodes; i++)
+ {
+ gimple_stmt_iterator gsi;
+ for (gsi = gsi_start_bb (body[i]); !gsi_end_p (gsi); gsi_next (&gsi))
+ {
+ gimple stmt = gsi_stmt (gsi);
+ affine_iv iv;
+ ssa_op_iter iter;
+ tree use;
+
+ FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
+ {
+ predicate will_be_nonconstant;
+
+ if (!simple_iv (loop, loop_containing_stmt (stmt), use, &iv, true)
+ || is_gimple_min_invariant (iv.step))
+ continue;
+ will_be_nonconstant
+ = will_be_nonconstant_expr_predicate (parms_info, info,
+ iv.step, nonconstant_names);
+ if (!true_predicate_p (&will_be_nonconstant)
+ && !false_predicate_p (&will_be_nonconstant))
+ /* This is slightly inprecise. We may want to represent each loop with
+ independent predicate. */
+ loop_stride = and_predicates (info->conds, &loop_stride, &will_be_nonconstant);
+ }
+ }
+ }
+ free (body);
}
- if (!true_predicate_p (&loop_iterations))
- {
- inline_summary (node)->loop_iterations = (struct predicate *)pool_alloc (edge_predicate_pool);
- *inline_summary (node)->loop_iterations = loop_iterations;
- }
+ set_hint_predicate (&inline_summary (node)->loop_iterations, loop_iterations);
+ set_hint_predicate (&inline_summary (node)->loop_stride, loop_stride);
scev_finalize ();
}
inline_summary (node)->self_time = time;
@@ -2715,6 +2820,9 @@ estimate_node_size_and_time (struct cgraph_node *node,
if (info->loop_iterations
&& !evaluate_predicate (info->loop_iterations, possible_truths))
hints |=INLINE_HINT_loop_iterations;
+ if (info->loop_stride
+ && !evaluate_predicate (info->loop_stride, possible_truths))
+ hints |=INLINE_HINT_loop_stride;
if (time > MAX_TIME * INLINE_TIME_SCALE)
time = MAX_TIME * INLINE_TIME_SCALE;
@@ -3011,6 +3119,37 @@ remap_edge_summaries (struct cgraph_edge *inlined_edge,
}
}
+/* Same as remap_predicate, but set result into hint *HINT. */
+
+static void
+remap_hint_predicate (struct inline_summary *info,
+ struct inline_summary *callee_info,
+ struct predicate **hint,
+ VEC (int, heap) *operand_map,
+ VEC (int, heap) *offset_map,
+ clause_t possible_truths,
+ struct predicate *toplev_predicate)
+{
+ predicate p;
+
+ if (!*hint)
+ return;
+ p = remap_predicate (info, callee_info,
+ *hint,
+ operand_map, offset_map,
+ possible_truths,
+ toplev_predicate);
+ if (!false_predicate_p (&p)
+ && !true_predicate_p (&p))
+ {
+ if (!*hint)
+ set_hint_predicate (hint, p);
+ else
+ **hint = and_predicates (info->conds,
+ *hint,
+ &p);
+ }
+}
/* We inlined EDGE. Update summary of the function we inlined into. */
@@ -3102,28 +3241,14 @@ inline_merge_summary (struct cgraph_edge *edge)
}
remap_edge_summaries (edge, edge->callee, info, callee_info, operand_map,
offset_map, clause, &toplev_predicate);
- if (callee_info->loop_iterations)
- {
- predicate p = remap_predicate (info, callee_info,
- callee_info->loop_iterations,
- operand_map, offset_map,
- clause,
- &toplev_predicate);
- if (!false_predicate_p (&p)
- && !true_predicate_p (&p))
- {
- if (!info->loop_iterations)
- {
- info->loop_iterations
- = (struct predicate *)pool_alloc (edge_predicate_pool);
- *info->loop_iterations = p;
- }
- else
- *info->loop_iterations = and_predicates (info->conds,
- info->loop_iterations,
- &p);
- }
- }
+ remap_hint_predicate (info, callee_info,
+ &callee_info->loop_iterations,
+ operand_map, offset_map,
+ clause, &toplev_predicate);
+ remap_hint_predicate (info, callee_info,
+ &callee_info->loop_stride,
+ operand_map, offset_map,
+ clause, &toplev_predicate);
inline_update_callee_summaries (edge->callee,
inline_edge_summary (edge)->loop_depth);
@@ -3579,7 +3704,7 @@ inline_read_section (struct lto_file_decl_data *file_data, const char *data,
c.by_ref = bp_unpack_value (&bp, 1);
if (c.agg_contents)
c.offset = streamer_read_uhwi (&ib);
- VEC_safe_push (condition, gc, info->conds, &c);
+ VEC_safe_push (condition, gc, info->conds, c);
}
count2 = streamer_read_uhwi (&ib);
gcc_assert (!info->entry);
@@ -3591,15 +3716,13 @@ inline_read_section (struct lto_file_decl_data *file_data, const char *data,
e.time = streamer_read_uhwi (&ib);
e.predicate = read_predicate (&ib);
- VEC_safe_push (size_time_entry, gc, info->entry, &e);
+ VEC_safe_push (size_time_entry, gc, info->entry, e);
}
p = read_predicate (&ib);
- if (!true_predicate_p (&p))
- {
- info->loop_iterations = (struct predicate *)pool_alloc (edge_predicate_pool);
- *info->loop_iterations = p;
- }
+ set_hint_predicate (&info->loop_iterations, p);
+ p = read_predicate (&ib);
+ set_hint_predicate (&info->loop_stride, p);
for (e = node->callees; e; e = e->next_callee)
read_inline_edge_summary (&ib, e);
for (e = node->indirect_calls; e; e = e->next_callee)
@@ -3747,6 +3870,7 @@ inline_write_summary (void)
write_predicate (ob, &e->predicate);
}
write_predicate (ob, info->loop_iterations);
+ write_predicate (ob, info->loop_stride);
for (edge = node->callees; edge; edge = edge->next_callee)
write_inline_edge_summary (ob, edge);
for (edge = node->indirect_calls; edge; edge = edge->next_callee)
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index 95842bdaa6a..f5c255ca0b7 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -481,7 +481,8 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
else if (DECL_DECLARED_INLINE_P (callee->symbol.decl)
&& growth >= MAX_INLINE_INSNS_SINGLE
&& !(hints & (INLINE_HINT_indirect_call
- | INLINE_HINT_loop_iterations)))
+ | INLINE_HINT_loop_iterations
+ | INLINE_HINT_loop_stride)))
{
e->inline_failed = CIF_MAX_INLINE_INSNS_SINGLE_LIMIT;
want_inline = false;
@@ -533,7 +534,8 @@ want_inline_small_function_p (struct cgraph_edge *e, bool report)
inlining given function is very profitable. */
else if (!DECL_DECLARED_INLINE_P (callee->symbol.decl)
&& growth >= ((hints & (INLINE_HINT_indirect_call
- | INLINE_HINT_loop_iterations))
+ | INLINE_HINT_loop_iterations
+ | INLINE_HINT_loop_stride))
? MAX (MAX_INLINE_INSNS_AUTO,
MAX_INLINE_INSNS_SINGLE)
: MAX_INLINE_INSNS_AUTO))
@@ -866,7 +868,8 @@ edge_badness (struct cgraph_edge *edge, bool dump)
fprintf (dump_file, "Badness overflow\n");
}
if (hints & (INLINE_HINT_indirect_call
- | INLINE_HINT_loop_iterations))
+ | INLINE_HINT_loop_iterations
+ | INLINE_HINT_loop_stride))
badness /= 8;
if (dump)
{
diff --git a/gcc/ipa-inline.h b/gcc/ipa-inline.h
index c99071672e7..ec9cf4d13ac 100644
--- a/gcc/ipa-inline.h
+++ b/gcc/ipa-inline.h
@@ -46,7 +46,8 @@ typedef struct GTY(()) condition
They are represtented as bitmap of the following values. */
enum inline_hints_vals {
INLINE_HINT_indirect_call = 1,
- INLINE_HINT_loop_iterations = 2
+ INLINE_HINT_loop_iterations = 2,
+ INLINE_HINT_loop_stride = 4
};
typedef int inline_hints;
@@ -120,9 +121,12 @@ struct GTY(()) inline_summary
conditions conds;
VEC(size_time_entry,gc) *entry;
- /* Predicate on when some loop in the function sbecomes to have known
+ /* Predicate on when some loop in the function becomes to have known
bounds. */
struct predicate * GTY((skip)) loop_iterations;
+ /* Predicate on when some loop in the function becomes to have known
+ stride. */
+ struct predicate * GTY((skip)) loop_stride;
};
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index 141d602d6c7..9729145b7a1 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -37,6 +37,7 @@ along with GCC; see the file COPYING3. If not see
#include "lto-streamer.h"
#include "data-streamer.h"
#include "tree-streamer.h"
+#include "params.h"
/* Intermediate information about a parameter that is only useful during the
@@ -1145,9 +1146,6 @@ get_ssa_def_if_simple_copy (tree rhs)
return rhs;
}
-/* TODO: Turn this into a PARAM. */
-#define IPA_MAX_AFF_JF_ITEMS 16
-
/* Simple linked list, describing known contents of an aggregate beforere
call. */
@@ -1327,8 +1325,8 @@ determine_known_aggregate_parts (gimple call, tree arg,
*p = n;
item_count++;
- if (const_count == IPA_MAX_AFF_JF_ITEMS
- || item_count == 2 * IPA_MAX_AFF_JF_ITEMS)
+ if (const_count == PARAM_VALUE (PARAM_IPA_MAX_AGG_ITEMS)
+ || item_count == 2 * PARAM_VALUE (PARAM_IPA_MAX_AGG_ITEMS))
break;
}
@@ -1344,11 +1342,10 @@ determine_known_aggregate_parts (gimple call, tree arg,
{
if (list->constant)
{
- struct ipa_agg_jf_item *item;
- item = VEC_quick_push (ipa_agg_jf_item_t,
- jfunc->agg.items, NULL);
- item->offset = list->offset - arg_offset;
- item->value = list->constant;
+ struct ipa_agg_jf_item item;
+ item.offset = list->offset - arg_offset;
+ item.value = list->constant;
+ VEC_quick_push (ipa_agg_jf_item_t, jfunc->agg.items, item);
}
list = list->next;
}
@@ -3025,45 +3022,44 @@ ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
if (n->remove_param)
removals++;
else
- VEC_quick_push (ipa_parm_adjustment_t, tmp, n);
+ VEC_quick_push (ipa_parm_adjustment_t, tmp, *n);
}
adjustments = VEC_alloc (ipa_parm_adjustment_t, heap, outlen + removals);
for (i = 0; i < outlen; i++)
{
- struct ipa_parm_adjustment *r;
+ struct ipa_parm_adjustment r;
struct ipa_parm_adjustment *out = &VEC_index (ipa_parm_adjustment_t,
outer, i);
struct ipa_parm_adjustment *in = &VEC_index (ipa_parm_adjustment_t, tmp,
out->base_index);
+ memset (&r, 0, sizeof (r));
gcc_assert (!in->remove_param);
if (out->remove_param)
{
if (!index_in_adjustments_multiple_times_p (in->base_index, tmp))
{
- r = VEC_quick_push (ipa_parm_adjustment_t, adjustments, NULL);
- memset (r, 0, sizeof (*r));
- r->remove_param = true;
+ r.remove_param = true;
+ VEC_quick_push (ipa_parm_adjustment_t, adjustments, r);
}
continue;
}
- r = VEC_quick_push (ipa_parm_adjustment_t, adjustments, NULL);
- memset (r, 0, sizeof (*r));
- r->base_index = in->base_index;
- r->type = out->type;
+ r.base_index = in->base_index;
+ r.type = out->type;
/* FIXME: Create nonlocal value too. */
if (in->copy_param && out->copy_param)
- r->copy_param = true;
+ r.copy_param = true;
else if (in->copy_param)
- r->offset = out->offset;
+ r.offset = out->offset;
else if (out->copy_param)
- r->offset = in->offset;
+ r.offset = in->offset;
else
- r->offset = in->offset + out->offset;
+ r.offset = in->offset + out->offset;
+ VEC_quick_push (ipa_parm_adjustment_t, adjustments, r);
}
for (i = 0; i < inlen; i++)
@@ -3072,7 +3068,7 @@ ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
inner, i);
if (n->remove_param)
- VEC_quick_push (ipa_parm_adjustment_t, adjustments, n);
+ VEC_quick_push (ipa_parm_adjustment_t, adjustments, *n);
}
VEC_free (ipa_parm_adjustment_t, heap, tmp);
@@ -3240,11 +3236,10 @@ ipa_read_jump_function (struct lto_input_block *ib,
}
for (i = 0; i < count; i++)
{
- struct ipa_agg_jf_item *item = VEC_quick_push (ipa_agg_jf_item_t,
- jump_func->agg.items, NULL);
-
- item->offset = streamer_read_uhwi (ib);
- item->value = stream_read_tree (ib, data_in);
+ struct ipa_agg_jf_item item;
+ item.offset = streamer_read_uhwi (ib);
+ item.value = stream_read_tree (ib, data_in);
+ VEC_quick_push (ipa_agg_jf_item_t, jump_func->agg.items, item);
}
}
diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c
index b6810a89bcb..6bdd4d14bdf 100644
--- a/gcc/ipa-pure-const.c
+++ b/gcc/ipa-pure-const.c
@@ -192,6 +192,7 @@ warn_function_noreturn (tree decl)
= suggest_attribute (OPT_Wsuggest_attribute_noreturn, decl,
true, warned_about, "noreturn");
}
+
/* Init the function state. */
static void
@@ -387,7 +388,7 @@ state_from_flags (enum pure_const_state_e *state, bool *looping,
else
{
if (dump_file && (dump_flags & TDF_DETAILS))
- fprintf (dump_file, " neihter\n");
+ fprintf (dump_file, " neither\n");
*state = IPA_NEITHER;
*looping = true;
}
@@ -1573,7 +1574,7 @@ local_pure_const (void)
warn_function_noreturn (cfun->decl);
if (dump_file)
fprintf (dump_file, "Function found to be noreturn: %s\n",
- lang_hooks.decl_printable_name (current_function_decl, 2));
+ current_function_name ());
/* Update declaration and reduce profile to executed once. */
TREE_THIS_VOLATILE (current_function_decl) = 1;
@@ -1597,8 +1598,7 @@ local_pure_const (void)
if (dump_file)
fprintf (dump_file, "Function found to be %sconst: %s\n",
l->looping ? "looping " : "",
- lang_hooks.decl_printable_name (current_function_decl,
- 2));
+ current_function_name ());
}
else if (DECL_LOOPING_CONST_OR_PURE_P (current_function_decl)
&& !l->looping)
@@ -1610,8 +1610,7 @@ local_pure_const (void)
}
if (dump_file)
fprintf (dump_file, "Function found to be non-looping: %s\n",
- lang_hooks.decl_printable_name (current_function_decl,
- 2));
+ current_function_name ());
}
break;
@@ -1627,8 +1626,7 @@ local_pure_const (void)
if (dump_file)
fprintf (dump_file, "Function found to be %spure: %s\n",
l->looping ? "looping " : "",
- lang_hooks.decl_printable_name (current_function_decl,
- 2));
+ current_function_name ());
}
else if (DECL_LOOPING_CONST_OR_PURE_P (current_function_decl)
&& !l->looping)
@@ -1640,8 +1638,7 @@ local_pure_const (void)
}
if (dump_file)
fprintf (dump_file, "Function found to be non-looping: %s\n",
- lang_hooks.decl_printable_name (current_function_decl,
- 2));
+ current_function_name ());
}
break;
@@ -1654,8 +1651,7 @@ local_pure_const (void)
changed = true;
if (dump_file)
fprintf (dump_file, "Function found to be nothrow: %s\n",
- lang_hooks.decl_printable_name (current_function_decl,
- 2));
+ current_function_name ());
}
free (l);
if (changed)
diff --git a/gcc/ipa-reference.c b/gcc/ipa-reference.c
index 0d2ef287576..9072fe82199 100644
--- a/gcc/ipa-reference.c
+++ b/gcc/ipa-reference.c
@@ -45,7 +45,6 @@ along with GCC; see the file COPYING3. If not see
#include "tree-flow.h"
#include "tree-inline.h"
#include "tree-pass.h"
-#include "langhooks.h"
#include "pointer-set.h"
#include "splay-tree.h"
#include "ggc.h"
@@ -55,7 +54,6 @@ along with GCC; see the file COPYING3. If not see
#include "cgraph.h"
#include "flags.h"
#include "diagnostic.h"
-#include "langhooks.h"
#include "data-streamer.h"
#include "lto-streamer.h"
@@ -109,9 +107,9 @@ typedef struct ipa_reference_vars_info_d *ipa_reference_vars_info_t;
being considered by the compilation level alias analysis. */
static splay_tree reference_vars_to_consider;
-/* A bit is set for every module static we are considering. This is
- ored into the local info when asm code is found that clobbers all
- memory. */
+/* Set of all interesting module statics. A bit is set for every module
+ static we are considering. This is added to the local info when asm
+ code is found that clobbers all memory. */
static bitmap all_module_statics;
/* Obstack holding bitmaps of local analysis (live from analysis to
@@ -124,10 +122,12 @@ static bitmap_obstack optimization_summary_obstack;
static struct cgraph_2node_hook_list *node_duplication_hook_holder;
static struct cgraph_node_hook_list *node_removal_hook_holder;
-/* Vector where the reference var infos are actually stored. */
+/* Vector where the reference var infos are actually stored.
+ Indexed by UID of call graph nodes. */
DEF_VEC_P (ipa_reference_vars_info_t);
DEF_VEC_ALLOC_P (ipa_reference_vars_info_t, heap);
static VEC (ipa_reference_vars_info_t, heap) *ipa_reference_vars_vector;
+
DEF_VEC_P (ipa_reference_optimization_summary_t);
DEF_VEC_ALLOC_P (ipa_reference_optimization_summary_t, heap);
static VEC (ipa_reference_optimization_summary_t, heap) *ipa_reference_opt_sum_vector;
@@ -153,7 +153,8 @@ get_reference_optimization_summary (struct cgraph_node *node)
ipa_reference_opt_sum_vector)
<= (unsigned int) node->uid))
return NULL;
- return VEC_index (ipa_reference_optimization_summary_t, ipa_reference_opt_sum_vector,
+ return VEC_index (ipa_reference_optimization_summary_t,
+ ipa_reference_opt_sum_vector,
node->uid);
}
@@ -186,16 +187,15 @@ set_reference_optimization_summary (struct cgraph_node *node,
ipa_reference_opt_sum_vector, node->uid, info);
}
-/* Return a bitmap indexed by_DECL_UID uid for the static variables
- that are not read during the execution of the function FN. Returns
+/* Return a bitmap indexed by DECL_UID for the static variables that
+ are *not* read during the execution of the function FN. Returns
NULL if no data is available. */
bitmap
ipa_reference_get_not_read_global (struct cgraph_node *fn)
{
- ipa_reference_optimization_summary_t info;
-
- info = get_reference_optimization_summary (cgraph_function_node (fn, NULL));
+ ipa_reference_optimization_summary_t info =
+ get_reference_optimization_summary (cgraph_function_node (fn, NULL));
if (info)
return info->statics_not_read;
else if (flags_from_decl_or_type (fn->symbol.decl) & ECF_LEAF)
@@ -204,17 +204,16 @@ ipa_reference_get_not_read_global (struct cgraph_node *fn)
return NULL;
}
-/* Return a bitmap indexed by DECL_UID uid for the static variables
- that are not written during the execution of the function FN. Note
+/* Return a bitmap indexed by DECL_UID for the static variables that
+ are *not* written during the execution of the function FN. Note
that variables written may or may not be read during the function
call. Returns NULL if no data is available. */
bitmap
ipa_reference_get_not_written_global (struct cgraph_node *fn)
{
- ipa_reference_optimization_summary_t info;
-
- info = get_reference_optimization_summary (fn);
+ ipa_reference_optimization_summary_t info =
+ get_reference_optimization_summary (fn);
if (info)
return info->statics_not_written;
else if (flags_from_decl_or_type (fn->symbol.decl) & ECF_LEAF)
@@ -277,89 +276,147 @@ get_static_name (int index)
{
splay_tree_node stn =
splay_tree_lookup (reference_vars_to_consider, index);
- if (stn)
- return lang_hooks.decl_printable_name ((tree)(stn->value), 2);
- return NULL;
+ return fndecl_name ((tree)(stn->value));
+}
+
+/* Dump a set of static vars to FILE. */
+static void
+dump_static_vars_set_to_file (FILE *f, bitmap set)
+{
+ unsigned int index;
+ bitmap_iterator bi;
+ if (set == NULL)
+ return;
+ else if (set == all_module_statics)
+ fprintf (f, "ALL");
+ else
+ EXECUTE_IF_SET_IN_BITMAP (set, 0, index, bi)
+ {
+ fprintf (f, "%s ", get_static_name (index));
+ }
+}
+
+/* Compute X |= Y, taking into account the possibility that
+ either X or Y is already the maximum set.
+ Return true if X is the maximum set after taking the union with Y. */
+
+static bool
+union_static_var_sets (bitmap &x, bitmap y)
+{
+ if (x != all_module_statics)
+ {
+ if (y == all_module_statics)
+ {
+ BITMAP_FREE (x);
+ x = all_module_statics;
+ }
+ else if (bitmap_ior_into (x, y))
+ {
+ /* The union may have reduced X to the maximum set.
+ In that case, we want to make that visible explicitly.
+ Even though bitmap_equal_p can be very expensive, it
+ turns out to be an overall win to check this here for
+ an LTO bootstrap of GCC itself. Liberally extrapoliate
+ that result to be applicable to all cases. */
+ if (bitmap_equal_p (x, all_module_statics))
+ {
+ BITMAP_FREE (x);
+ x = all_module_statics;
+ }
+ }
+ }
+ return x == all_module_statics;
+}
+
+/* Compute X &= Y, taking into account the possibility that
+ X may become the maximum set. */
+
+static bool
+intersect_static_var_sets (bitmap &x, bitmap y)
+{
+ if (x != all_module_statics)
+ {
+ bitmap_and_into (x, y);
+ /* As with union_static_var_sets, reducing to the maximum
+ set as early as possible is an overall win. */
+ if (bitmap_equal_p (x, all_module_statics))
+ {
+ BITMAP_FREE (x);
+ x = all_module_statics;
+ }
+ }
+ return x == all_module_statics;
}
-/* Or in all of the bits from every callee of X into X_GLOBAL, the caller's cycle,
- bit vector. There are several cases to check to avoid the sparse
- bitmap oring. */
+/* Return a copy of SET on the bitmap obstack containing SET.
+ But if SET is NULL or the maximum set, return that instead. */
+
+static bitmap
+copy_static_var_set (bitmap set)
+{
+ if (set == NULL || set == all_module_statics)
+ return set;
+ bitmap_obstack *o = set->obstack;
+ gcc_checking_assert (o);
+ bitmap copy = BITMAP_ALLOC (o);
+ bitmap_copy (copy, set);
+ return copy;
+}
+
+/* Compute the union all of the statics read and written by every callee of X
+ into X_GLOBAL->statics_read and X_GLOBAL->statics_written. X_GLOBAL is
+ actually the set representing the cycle containing X. If the read and
+ written sets of X_GLOBAL has been reduced to the maximum set, we don't
+ have to look at the remaining callees. */
static void
propagate_bits (ipa_reference_global_vars_info_t x_global, struct cgraph_node *x)
{
struct cgraph_edge *e;
- for (e = x->callees; e; e = e->next_callee)
+ bool read_all = x_global->statics_read == all_module_statics;
+ bool write_all = x_global->statics_written == all_module_statics;
+ for (e = x->callees;
+ e && !(read_all && write_all);
+ e = e->next_callee)
{
enum availability avail;
struct cgraph_node *y = cgraph_function_node (e->callee, &avail);
-
if (!y)
continue;
+
/* Only look into nodes we can propagate something. */
+ int flags = flags_from_decl_or_type (y->symbol.decl);
if (avail > AVAIL_OVERWRITABLE
- || (avail == AVAIL_OVERWRITABLE
- && (flags_from_decl_or_type (y->symbol.decl) & ECF_LEAF)))
+ || (avail == AVAIL_OVERWRITABLE && (flags & ECF_LEAF)))
{
- int flags = flags_from_decl_or_type (y->symbol.decl);
if (get_reference_vars_info (y))
{
- ipa_reference_vars_info_t y_info
- = get_reference_vars_info (y);
+ ipa_reference_vars_info_t y_info = get_reference_vars_info (y);
ipa_reference_global_vars_info_t y_global = &y_info->global;
- /* Calls in current cycle do not have global computed yet. */
+ /* Calls in the current cycle do not have their global set
+ computed yet (but everything else does because we're
+ visiting nodes in topological order). */
if (!y_global->statics_read)
continue;
- /* If function is declared const, it reads no memory even if it
+ /* If the function is const, it reads no memory even if it
seems so to local analysis. */
if (flags & ECF_CONST)
continue;
- if (x_global->statics_read
- != all_module_statics)
- {
- if (y_global->statics_read
- == all_module_statics)
- {
- BITMAP_FREE (x_global->statics_read);
- x_global->statics_read
- = all_module_statics;
- }
- /* Skip bitmaps that are pointer equal to node's bitmap
- (no reason to spin within the cycle). */
- else if (x_global->statics_read
- != y_global->statics_read)
- bitmap_ior_into (x_global->statics_read,
+ union_static_var_sets (x_global->statics_read,
y_global->statics_read);
- }
- /* If function is declared pure, it has no stores even if it
- seems so to local analysis; If we can not return from here,
- we can safely ignore the call. */
+ /* If the function is pure, it has no stores even if it
+ seems so to local analysis. If we cannot return from
+ the function, we can safely ignore the call. */
if ((flags & ECF_PURE)
|| cgraph_edge_cannot_lead_to_return (e))
continue;
- if (x_global->statics_written
- != all_module_statics)
- {
- if (y_global->statics_written
- == all_module_statics)
- {
- BITMAP_FREE (x_global->statics_written);
- x_global->statics_written
- = all_module_statics;
- }
- /* Skip bitmaps that are pointer equal to node's bitmap
- (no reason to spin within the cycle). */
- else if (x_global->statics_written
- != y_global->statics_written)
- bitmap_ior_into (x_global->statics_written,
+ union_static_var_sets (x_global->statics_written,
y_global->statics_written);
- }
}
else
gcc_unreachable ();
@@ -449,19 +506,6 @@ analyze_function (struct cgraph_node *fn)
bitmap_clear (local->statics_written);
}
-static bitmap
-copy_global_bitmap (bitmap src)
-{
- bitmap dst;
- if (!src)
- return NULL;
- if (src == all_module_statics)
- return all_module_statics;
- dst = BITMAP_ALLOC (&optimization_summary_obstack);
- bitmap_copy (dst, src);
- return dst;
-}
-
/* Called when new clone is inserted to callgraph late. */
@@ -477,8 +521,10 @@ duplicate_node_data (struct cgraph_node *src, struct cgraph_node *dst,
return;
dst_ginfo = XCNEW (struct ipa_reference_optimization_summary_d);
set_reference_optimization_summary (dst, dst_ginfo);
- dst_ginfo->statics_not_read = copy_global_bitmap (ginfo->statics_not_read);
- dst_ginfo->statics_not_written = copy_global_bitmap (ginfo->statics_not_written);
+ dst_ginfo->statics_not_read =
+ copy_static_var_set (ginfo->statics_not_read);
+ dst_ginfo->statics_not_written =
+ copy_static_var_set (ginfo->statics_not_written);
}
/* Called when node is removed. */
@@ -511,10 +557,8 @@ generate_summary (void)
struct cgraph_node *node;
unsigned int index;
bitmap_iterator bi;
- bitmap bm_temp;
ipa_init ();
- bm_temp = BITMAP_ALLOC (&local_info_obstack);
/* Process all of the functions next. */
FOR_EACH_DEFINED_FUNCTION (node)
@@ -523,12 +567,10 @@ generate_summary (void)
if (dump_file)
EXECUTE_IF_SET_IN_BITMAP (all_module_statics, 0, index, bi)
{
- fprintf (dump_file, "\nPromotable global:%s",
- get_static_name (index));
+ fprintf (dump_file, "\nPromotable global:%s (uid=%u)\n",
+ get_static_name (index), index);
}
- BITMAP_FREE(bm_temp);
-
if (dump_file)
FOR_EACH_DEFINED_FUNCTION (node)
if (cgraph_function_body_availability (node) >= AVAIL_OVERWRITABLE)
@@ -563,8 +605,8 @@ generate_summary (void)
/* Set READ_ALL/WRITE_ALL based on decl flags of NODE. */
static void
-read_write_all_from_decl (struct cgraph_node *node, bool * read_all,
- bool * write_all)
+read_write_all_from_decl (struct cgraph_node *node,
+ bool &read_all, bool &write_all)
{
tree decl = node->symbol.decl;
int flags = flags_from_decl_or_type (decl);
@@ -576,7 +618,7 @@ read_write_all_from_decl (struct cgraph_node *node, bool * read_all,
else if ((flags & ECF_PURE)
|| cgraph_node_cannot_return (node))
{
- *read_all = true;
+ read_all = true;
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, " %s/%i -> read all\n",
cgraph_node_asm_name (node), node->symbol.order);
@@ -585,23 +627,64 @@ read_write_all_from_decl (struct cgraph_node *node, bool * read_all,
{
/* TODO: To be able to produce sane results, we should also handle
common builtins, in particular throw. */
- *read_all = true;
- *write_all = true;
+ read_all = true;
+ write_all = true;
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, " %s/%i -> read all, write all\n",
cgraph_node_asm_name (node), node->symbol.order);
}
}
+/* Set READ_ALL/WRITE_ALL based on decl flags of NODE or any member
+ in the cycle of NODE. */
+
+static void
+get_read_write_all_from_node (struct cgraph_node *node,
+ bool &read_all, bool &write_all)
+{
+ struct cgraph_edge *e, *ie;
+
+ /* When function is overwritable, we can not assume anything. */
+ if (cgraph_function_body_availability (node) <= AVAIL_OVERWRITABLE)
+ read_write_all_from_decl (node, read_all, write_all);
+
+ for (e = node->callees;
+ e && !(read_all && write_all);
+ e = e->next_callee)
+ {
+ enum availability avail;
+ struct cgraph_node *callee = cgraph_function_node (e->callee, &avail);
+ gcc_checking_assert (callee);
+ if (avail <= AVAIL_OVERWRITABLE)
+ read_write_all_from_decl (callee, read_all, write_all);
+ }
+
+ for (ie = node->indirect_calls;
+ ie && !(read_all && write_all);
+ ie = ie->next_callee)
+ if (!(ie->indirect_info->ecf_flags & ECF_CONST))
+ {
+ read_all = true;
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, " indirect call -> read all\n");
+ if (!cgraph_edge_cannot_lead_to_return (ie)
+ && !(ie->indirect_info->ecf_flags & ECF_PURE))
+ {
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, " indirect call -> write all\n");
+ write_all = true;
+ }
+ }
+}
+
/* Produce the global information by preforming a transitive closure
- on the local information that was produced by ipa_analyze_function */
+ on the local information that was produced by ipa_analyze_function. */
static unsigned int
propagate (void)
{
struct cgraph_node *node;
struct varpool_node *vnode;
- struct cgraph_node *w;
struct cgraph_node **order =
XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
int order_pos;
@@ -627,12 +710,9 @@ propagate (void)
FOR_EACH_DEFINED_FUNCTION (node)
{
ipa_reference_local_vars_info_t node_l;
-
node_l = &get_reference_vars_info (node)->local;
- if (node_l->statics_read != all_module_statics)
- bitmap_and_into (node_l->statics_read, all_module_statics);
- if (node_l->statics_written != all_module_statics)
- bitmap_and_into (node_l->statics_written, all_module_statics);
+ intersect_static_var_sets (node_l->statics_read, all_module_statics);
+ intersect_static_var_sets (node_l->statics_written, all_module_statics);
}
/* Propagate the local information through the call graph to produce
@@ -645,250 +725,123 @@ propagate (void)
for (i = 0; i < order_pos; i++ )
{
+ unsigned x;
+ struct cgraph_node *w;
ipa_reference_vars_info_t node_info;
ipa_reference_global_vars_info_t node_g;
ipa_reference_local_vars_info_t node_l;
- struct cgraph_edge *e, *ie;
-
- bool read_all;
- bool write_all;
- struct ipa_dfs_info * w_info;
+ bool read_all = false;
+ bool write_all = false;
node = order[i];
if (node->alias)
continue;
+
node_info = get_reference_vars_info (node);
gcc_assert (node_info);
-
+ node_l = &node_info->local;
+ node_g = &node_info->global;
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "Starting cycle with %s/%i\n",
cgraph_node_asm_name (node), node->symbol.order);
- node_l = &node_info->local;
- node_g = &node_info->global;
-
- read_all = false;
- write_all = false;
-
- /* When function is overwritable, we can not assume anything. */
- if (cgraph_function_body_availability (node) <= AVAIL_OVERWRITABLE)
- read_write_all_from_decl (node, &read_all, &write_all);
+ VEC (cgraph_node_p, heap) *cycle_nodes = ipa_get_nodes_in_cycle (node);
- for (e = node->callees; e; e = e->next_callee)
- {
- enum availability avail;
- struct cgraph_node *callee = cgraph_function_node (e->callee, &avail);
- if (!callee || avail <= AVAIL_OVERWRITABLE)
- read_write_all_from_decl (callee, &read_all, &write_all);
- }
-
- for (ie = node->indirect_calls; ie; ie = ie->next_callee)
- if (!(ie->indirect_info->ecf_flags & ECF_CONST))
- {
- read_all = true;
- if (dump_file && (dump_flags & TDF_DETAILS))
- fprintf (dump_file, " indirect call -> read all\n");
- if (!cgraph_edge_cannot_lead_to_return (ie)
- && !(ie->indirect_info->ecf_flags & ECF_PURE))
- {
- if (dump_file && (dump_flags & TDF_DETAILS))
- fprintf (dump_file, " indirect call -> write all\n");
- write_all = true;
- }
- }
-
-
- /* If any node in a cycle is read_all or write_all
- they all are. */
- w_info = (struct ipa_dfs_info *) node->symbol.aux;
- w = w_info->next_cycle;
- while (w && (!read_all || !write_all))
+ /* If any node in a cycle is read_all or write_all, they all are. */
+ FOR_EACH_VEC_ELT (cgraph_node_p, cycle_nodes, x, w)
{
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, " Visiting %s/%i\n",
- cgraph_node_asm_name (w), w->symbol.order);
- /* When function is overwritable, we can not assume anything. */
- if (cgraph_function_body_availability (w) <= AVAIL_OVERWRITABLE)
- read_write_all_from_decl (w, &read_all, &write_all);
-
- for (e = w->callees; e; e = e->next_callee)
- {
- enum availability avail;
- struct cgraph_node *callee = cgraph_function_node (e->callee, &avail);
-
- if (avail <= AVAIL_OVERWRITABLE)
- read_write_all_from_decl (callee, &read_all, &write_all);
- }
-
- for (ie = w->indirect_calls; ie; ie = ie->next_callee)
- if (!(ie->indirect_info->ecf_flags & ECF_CONST))
- {
- read_all = true;
- if (dump_file && (dump_flags & TDF_DETAILS))
- fprintf (dump_file, " indirect call -> read all\n");
- if (!cgraph_edge_cannot_lead_to_return (ie)
- && !(ie->indirect_info->ecf_flags & ECF_PURE))
- {
- write_all = true;
- if (dump_file && (dump_flags & TDF_DETAILS))
- fprintf (dump_file, " indirect call -> write all\n");
- }
- }
-
- w_info = (struct ipa_dfs_info *) w->symbol.aux;
- w = w_info->next_cycle;
+ cgraph_node_asm_name (w), w->symbol.order);
+ get_read_write_all_from_node (w, read_all, write_all);
+ if (read_all && write_all)
+ break;
}
-
- /* Initialized the bitmaps for the reduced nodes */
+ /* Initialized the bitmaps global sets for the reduced node. */
if (read_all)
node_g->statics_read = all_module_statics;
else
- {
- node_g->statics_read = BITMAP_ALLOC (&local_info_obstack);
- bitmap_copy (node_g->statics_read,
- node_l->statics_read);
- }
+ node_g->statics_read = copy_static_var_set (node_l->statics_read);
if (write_all)
node_g->statics_written = all_module_statics;
else
- {
- node_g->statics_written = BITMAP_ALLOC (&local_info_obstack);
- bitmap_copy (node_g->statics_written,
- node_l->statics_written);
- }
+ node_g->statics_written = copy_static_var_set (node_l->statics_written);
- propagate_bits (node_g, node);
- w_info = (struct ipa_dfs_info *) node->symbol.aux;
- w = w_info->next_cycle;
- while (w && (!read_all || !write_all))
+ /* Merge the sets of this cycle with all sets of callees reached
+ from this cycle. */
+ FOR_EACH_VEC_ELT (cgraph_node_p, cycle_nodes, x, w)
{
- ipa_reference_vars_info_t w_ri =
- get_reference_vars_info (w);
- ipa_reference_local_vars_info_t w_l = &w_ri->local;
- int flags = flags_from_decl_or_type (w->symbol.decl);
-
- /* These global bitmaps are initialized from the local info
- of all of the nodes in the region. However there is no
- need to do any work if the bitmaps were set to
- all_module_statics. */
- if (!read_all && !(flags & ECF_CONST))
- bitmap_ior_into (node_g->statics_read,
- w_l->statics_read);
- if (!write_all
- && !(flags & ECF_PURE)
- && !cgraph_node_cannot_return (w))
- bitmap_ior_into (node_g->statics_written,
- w_l->statics_written);
+ if (read_all && write_all)
+ break;
+
+ if (w != node)
+ {
+ ipa_reference_vars_info_t w_ri = get_reference_vars_info (w);
+ ipa_reference_local_vars_info_t w_l = &w_ri->local;
+ int flags = flags_from_decl_or_type (w->symbol.decl);
+
+ if (!(flags & ECF_CONST))
+ read_all = union_static_var_sets (node_g->statics_read,
+ w_l->statics_read);
+ if (!(flags & ECF_PURE)
+ && !cgraph_node_cannot_return (w))
+ write_all = union_static_var_sets (node_g->statics_written,
+ w_l->statics_written);
+ }
+
propagate_bits (node_g, w);
- w_info = (struct ipa_dfs_info *) w->symbol.aux;
- w = w_info->next_cycle;
}
/* All nodes within a cycle have the same global info bitmaps. */
- node_info->global = *node_g;
- w_info = (struct ipa_dfs_info *) node->symbol.aux;
- w = w_info->next_cycle;
- while (w)
+ FOR_EACH_VEC_ELT (cgraph_node_p, cycle_nodes, x, w)
{
- ipa_reference_vars_info_t w_ri =
- get_reference_vars_info (w);
-
+ ipa_reference_vars_info_t w_ri = get_reference_vars_info (w);
w_ri->global = *node_g;
-
- w_info = (struct ipa_dfs_info *) w->symbol.aux;
- w = w_info->next_cycle;
}
+
+ VEC_free (cgraph_node_p, heap, cycle_nodes);
}
if (dump_file)
{
- for (i = 0; i < order_pos; i++ )
+ for (i = 0; i < order_pos; i++)
{
- ipa_reference_vars_info_t node_info;
- ipa_reference_global_vars_info_t node_g;
- ipa_reference_local_vars_info_t node_l;
- unsigned int index;
- bitmap_iterator bi;
- struct ipa_dfs_info * w_info;
+ unsigned x;
+ struct cgraph_node *w;
node = order[i];
if (node->alias)
continue;
- node_info = get_reference_vars_info (node);
- node_g = &node_info->global;
- node_l = &node_info->local;
+
fprintf (dump_file,
"\nFunction name:%s/%i:",
cgraph_node_asm_name (node), node->symbol.order);
- fprintf (dump_file, "\n locals read: ");
- if (node_l->statics_read)
- EXECUTE_IF_SET_IN_BITMAP (node_l->statics_read,
- 0, index, bi)
- {
- fprintf (dump_file, "%s ",
- get_static_name (index));
- }
- fprintf (dump_file, "\n locals written: ");
- if (node_l->statics_written)
- EXECUTE_IF_SET_IN_BITMAP (node_l->statics_written,
- 0, index, bi)
- {
- fprintf(dump_file, "%s ",
- get_static_name (index));
- }
- w_info = (struct ipa_dfs_info *) node->symbol.aux;
- w = w_info->next_cycle;
- while (w)
+ ipa_reference_vars_info_t node_info = get_reference_vars_info (node);
+ ipa_reference_global_vars_info_t node_g = &node_info->global;
+
+ VEC (cgraph_node_p, heap) *cycle_nodes = ipa_get_nodes_in_cycle (node);
+ FOR_EACH_VEC_ELT (cgraph_node_p, cycle_nodes, x, w)
{
- ipa_reference_vars_info_t w_ri =
- get_reference_vars_info (w);
+ ipa_reference_vars_info_t w_ri = get_reference_vars_info (w);
ipa_reference_local_vars_info_t w_l = &w_ri->local;
- fprintf (dump_file, "\n next cycle: %s/%i ",
- cgraph_node_asm_name (w), w->symbol.order);
+ if (w != node)
+ fprintf (dump_file, "\n next cycle: %s/%i ",
+ cgraph_node_asm_name (w), w->symbol.order);
fprintf (dump_file, "\n locals read: ");
- if (w_l->statics_read)
- EXECUTE_IF_SET_IN_BITMAP (w_l->statics_read,
- 0, index, bi)
- {
- fprintf (dump_file, "%s ",
- get_static_name (index));
- }
-
+ dump_static_vars_set_to_file (dump_file, w_l->statics_read);
fprintf (dump_file, "\n locals written: ");
- if (w_l->statics_written)
- EXECUTE_IF_SET_IN_BITMAP (w_l->statics_written,
- 0, index, bi)
- {
- fprintf (dump_file, "%s ",
- get_static_name (index));
- }
-
- w_info = (struct ipa_dfs_info *) w->symbol.aux;
- w = w_info->next_cycle;
+ dump_static_vars_set_to_file (dump_file, w_l->statics_written);
}
+ VEC_free (cgraph_node_p, heap, cycle_nodes);
+
fprintf (dump_file, "\n globals read: ");
- if (node_g->statics_read == all_module_statics)
- fprintf (dump_file, "ALL");
- else
- EXECUTE_IF_SET_IN_BITMAP (node_g->statics_read,
- 0, index, bi)
- {
- fprintf (dump_file, "%s ",
- get_static_name (index));
- }
+ dump_static_vars_set_to_file (dump_file, node_g->statics_read);
fprintf (dump_file, "\n globals written: ");
- if (node_g->statics_written == all_module_statics)
- fprintf (dump_file, "ALL");
- else
- EXECUTE_IF_SET_IN_BITMAP (node_g->statics_written,
- 0, index, bi)
- {
- fprintf (dump_file, "%s ",
- get_static_name (index));
- }
+ dump_static_vars_set_to_file (dump_file, node_g->statics_written);
+ fprintf (dump_file, "\n");
}
}
@@ -1140,8 +1093,7 @@ ipa_reference_read_optimization_summary (void)
var_index);
bitmap_set_bit (all_module_statics, DECL_UID (v_decl));
if (dump_file)
- fprintf (dump_file, " %s",
- lang_hooks.decl_printable_name (v_decl, 2));
+ fprintf (dump_file, " %s", fndecl_name (v_decl));
}
for (i = 0; i < f_count; i++)
@@ -1180,8 +1132,7 @@ ipa_reference_read_optimization_summary (void)
var_index);
bitmap_set_bit (info->statics_not_read, DECL_UID (v_decl));
if (dump_file)
- fprintf (dump_file, " %s",
- lang_hooks.decl_printable_name (v_decl, 2));
+ fprintf (dump_file, " %s", fndecl_name (v_decl));
}
if (dump_file)
@@ -1203,8 +1154,7 @@ ipa_reference_read_optimization_summary (void)
var_index);
bitmap_set_bit (info->statics_not_written, DECL_UID (v_decl));
if (dump_file)
- fprintf (dump_file, " %s",
- lang_hooks.decl_printable_name (v_decl, 2));
+ fprintf (dump_file, " %s", fndecl_name (v_decl));
}
if (dump_file)
fprintf (dump_file, "\n");
diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c
index be1d2cce230..e1d1c4928e6 100644
--- a/gcc/ipa-split.c
+++ b/gcc/ipa-split.c
@@ -912,7 +912,7 @@ find_split_points (int overall_time, int overall_size)
first.set_ssa_names = 0;
first.used_ssa_names = 0;
first.bbs_visited = 0;
- VEC_safe_push (stack_entry, heap, stack, &first);
+ VEC_safe_push (stack_entry, heap, stack, first);
ENTRY_BLOCK_PTR->aux = (void *)(intptr_t)-1;
while (!VEC_empty (stack_entry, stack))
@@ -994,7 +994,7 @@ find_split_points (int overall_time, int overall_size)
new_entry.non_ssa_vars = BITMAP_ALLOC (NULL);
new_entry.can_split = true;
bitmap_set_bit (new_entry.bbs_visited, dest->index);
- VEC_safe_push (stack_entry, heap, stack, &new_entry);
+ VEC_safe_push (stack_entry, heap, stack, new_entry);
dest->aux = (void *)(intptr_t)VEC_length (stack_entry, stack);
}
/* Back edge found, record the earliest point. */
diff --git a/gcc/ipa-utils.c b/gcc/ipa-utils.c
index bda19fe159e..91fc3806a2e 100644
--- a/gcc/ipa-utils.c
+++ b/gcc/ipa-utils.c
@@ -154,8 +154,11 @@ searchc (struct searchc_env* env, struct cgraph_node *v,
/* Topsort the call graph by caller relation. Put the result in ORDER.
- The REDUCE flag is true if you want the cycles reduced to single nodes. Set
- ALLOW_OVERWRITABLE if nodes with such availability should be included.
+ The REDUCE flag is true if you want the cycles reduced to single nodes.
+ You can use ipa_get_nodes_in_cycle to obtain a vector containing all real
+ call graph nodes in a reduced node.
+
+ Set ALLOW_OVERWRITABLE if nodes with such availability should be included.
IGNORE_EDGE, if non-NULL is a hook that may make some edges insignificant
for the topological sort. */
@@ -231,6 +234,23 @@ ipa_free_postorder_info (void)
}
}
+/* Get the set of nodes for the cycle in the reduced call graph starting
+ from NODE. */
+
+VEC (cgraph_node_p, heap) *
+ipa_get_nodes_in_cycle (struct cgraph_node *node)
+{
+ VEC (cgraph_node_p, heap) *v = NULL;
+ struct ipa_dfs_info *node_dfs_info;
+ while (node)
+ {
+ VEC_safe_push (cgraph_node_p, heap, v, node);
+ node_dfs_info = (struct ipa_dfs_info *) node->symbol.aux;
+ node = node_dfs_info->next_cycle;
+ }
+ return v;
+}
+
struct postorder_stack
{
struct cgraph_node *node;
diff --git a/gcc/ipa-utils.h b/gcc/ipa-utils.h
index 7e2190eaee5..f9562406059 100644
--- a/gcc/ipa-utils.h
+++ b/gcc/ipa-utils.h
@@ -42,6 +42,7 @@ void ipa_print_order (FILE*, const char *, struct cgraph_node**, int);
int ipa_reduced_postorder (struct cgraph_node **, bool, bool,
bool (*ignore_edge) (struct cgraph_edge *));
void ipa_free_postorder_info (void);
+VEC (cgraph_node_p, heap) *ipa_get_nodes_in_cycle (struct cgraph_node *);
int ipa_reverse_postorder (struct cgraph_node **);
tree get_base_var (tree);
diff --git a/gcc/ira.c b/gcc/ira.c
index 691614e8d5a..ad0ae0a8e6e 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -789,7 +789,7 @@ setup_pressure_classes (void)
hard registers and movement between them is costly
(e.g. SPARC FPCC registers). We still should consider it
as a candidate for a pressure class. */
- && alloc_reg_class_subclasses[cl][0] != LIM_REG_CLASSES)
+ && alloc_reg_class_subclasses[cl][0] < cl)
{
/* Check that the moves between any hard registers of the
current class are not more expensive for a legal mode
diff --git a/gcc/java/class.c b/gcc/java/class.c
index f806cea1414..a89b83183b6 100644
--- a/gcc/java/class.c
+++ b/gcc/java/class.c
@@ -2198,9 +2198,10 @@ make_class_data (tree type)
for (i = 0; i < count; i++)
{
- constructor_elt *elt = VEC_quick_push (constructor_elt, v, NULL);
- elt->index = build_int_cst (sizetype, i);
- elt->value = build_int_cstu (byte_type_node, data[i]);
+ constructor_elt elt;
+ elt.index = build_int_cst (sizetype, i);
+ elt.value = build_int_cstu (byte_type_node, data[i]);
+ VEC_quick_push (constructor_elt, v, elt);
}
DECL_INITIAL (array) = build_constructor (type, v);
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index 0429c02ca34..8041cdd99c4 100644
--- a/gcc/java/expr.c
+++ b/gcc/java/expr.c
@@ -2296,14 +2296,13 @@ get_symbol_table_index (tree t, tree special,
{
method_entry *e;
unsigned i;
+ method_entry elem = {t, special};
FOR_EACH_VEC_ELT (method_entry, *symbol_table, i, e)
if (t == e->method && special == e->special)
goto done;
- e = VEC_safe_push (method_entry, gc, *symbol_table, NULL);
- e->method = t;
- e->special = special;
+ VEC_safe_push (method_entry, gc, *symbol_table, elem);
done:
return i + 1;
diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
index 6223d1a6a57..24222883da4 100644
--- a/gcc/lto-cgraph.c
+++ b/gcc/lto-cgraph.c
@@ -114,7 +114,7 @@ lto_symtab_encoder_encode (lto_symtab_encoder_t encoder,
if (!slot)
slot = pointer_map_insert (encoder->map, node);
*slot = (void *) (intptr_t) (ref + 1);
- VEC_safe_push (lto_encoder_entry, heap, encoder->nodes, &entry);
+ VEC_safe_push (lto_encoder_entry, heap, encoder->nodes, entry);
}
else
ref = (size_t) *slot - 1;
diff --git a/gcc/lto-streamer.c b/gcc/lto-streamer.c
index 66624f9a021..51c6658ec92 100644
--- a/gcc/lto-streamer.c
+++ b/gcc/lto-streamer.c
@@ -180,12 +180,10 @@ lto_get_section_name (int section_type, const char *name, struct lto_file_decl_d
/* Show various memory usage statistics related to LTO. */
void
-print_lto_report (void)
+print_lto_report (const char *s)
{
- const char *s = (flag_lto) ? "LTO" : (flag_wpa) ? "WPA" : "LTRANS";
unsigned i;
- fprintf (stderr, "%s statistics\n", s);
fprintf (stderr, "[%s] # of input files: "
HOST_WIDE_INT_PRINT_UNSIGNED "\n", s, lto_stats.num_input_files);
@@ -197,9 +195,6 @@ print_lto_report (void)
HOST_WIDE_INT_PRINT_UNSIGNED "\n", s,
lto_stats.num_function_bodies);
- fprintf (stderr, "[%s] ", s);
- print_gimple_types_stats ();
-
for (i = 0; i < NUM_TREE_CODES; i++)
if (lto_stats.num_trees[i])
fprintf (stderr, "[%s] # of '%s' objects read: "
diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h
index cab5906e026..abeaa4b2417 100644
--- a/gcc/lto-streamer.h
+++ b/gcc/lto-streamer.h
@@ -785,7 +785,7 @@ extern const char *lto_tag_name (enum LTO_tags);
extern bitmap lto_bitmap_alloc (void);
extern void lto_bitmap_free (bitmap);
extern char *lto_get_section_name (int, const char *, struct lto_file_decl_data *);
-extern void print_lto_report (void);
+extern void print_lto_report (const char *);
extern void lto_streamer_init (void);
extern bool gate_lto_out (void);
#ifdef LTO_STREAMER_DEBUG
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog
index b7a9de5c8cd..8b2a469d864 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,64 @@
+2012-09-12 Jan Hubicka <jh@suse.cz>
+
+ * lto.c (do_whole_program_analysis): Care timevars, statistics and
+ AUX pointer cleaning. Add max partitioning.
+ * lto-partition.c (enum symbol_class): New.
+ (get_symbol_class): New function.
+ (symbol_partitioned_p): New function.
+ (add_references_to_partition): Remove.
+ (add_aliases_to_partition): Remove.
+ (add_cgraph_node_to_partition_1): Remove.
+ (add_cgraph_node_to_partition): Remove.
+ (add_symbol_to_partition): New function.
+ (add_symbol_to_partition_1): New function.
+ (contained_in_symbol): New function.
+ (partition_cgraph_node_p): Remove.
+ (partition_varpool_node_p): Remove.
+ (partition_symbol_p): Remove.
+ (lto_1_to_1_map): Cleanup.
+ (lto_max_map): New.
+ (lto_balanced_map): Update.
+ (lto_promote_cross_file_statics): Update.
+ * lto-partition.h (lto_max_map): Declare.
+ * timevar.def (TV_WHOPR_PARTITIONING): New timevar.
+
+2012-09-11 Jan Hubicka <jh@suse.cz>
+
+ PR lto/54312
+ * lto.c (uniquify_nodes): Remove quadratic loop checking if the
+ type is variant leader.
+
+2012-09-11 Richard Guenther <rguenther@suse.de>
+
+ * lto.c (enum gtc_mode): Remove.
+ (struct type_pair_d): Adjust.
+ (lookup_type_pair): Likewise.
+ (gimple_type_leader): Do not mark as deletable.
+ (gimple_lookup_type_leader): Adjust.
+ (gtc_visit): Likewise.
+ (gimple_types_compatible_p_1): Likewise.
+ (gimple_types_compatible_p): Likewise.
+ (gimple_type_hash): Likewise.
+ (gimple_register_type): Likewise.
+ (read_cgraph_and_symbols): Manage lifetime of tables
+ here.
+
+2012-09-11 Richard Guenther <rguenther@suse.de>
+
+ * lto.c (gimple_types, type_hash_cache, enum gtc_mode,
+ struct type_pair_d, lookup_type_pair, struct sccs,
+ next_dfs_num, gtc_next_dfs_num, struct gimple_type_leader_entry_s,
+ gimple_type_leader, gimple_lookup_type_leader, compare_type_names_p,
+ gtc_visit, gimple_types_compatible_p_1, gimple_types_compatible_p,
+ visit, iterative_hash_name, struct type_hash_pair,
+ type_hash_pair_compare, iterative_hash_gimple_type, gimple_type_hash,
+ gimple_type_eq, gimple_register_type_1, gimple_register_type):
+ Move here from gimple.c
+ (read_cgraph_and_symbols): Free hash tables here.
+ (print_lto_report_1): New function wrapping print_lto_report.
+ (do_whole_program_analysis): Call it.
+ (lto_main): Likewise.
+
2012-09-10 Jan Hubicka <jh@suse.cz>
* lto-partition.c (partition_symbol_p): Forward declare.
diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c
index 4775ee60340..b1310335a4a 100644
--- a/gcc/lto/lto-partition.c
+++ b/gcc/lto/lto-partition.c
@@ -31,13 +31,70 @@ along with GCC; see the file COPYING3. If not see
#include "ipa-utils.h"
#include "lto-partition.h"
+/* Classifcation of symbols into classes WRT partitioning. */
+enum symbol_class
+{
+ /* External declarations are ignored by partitioning algorithms and they are
+ added into the boundary later via compute_ltrans_boundary. */
+ SYMBOL_EXTERNAL,
+ /* Partitioned symbols are pur into one of partitions. */
+ SYMBOL_PARTITION,
+ /* Duplicated symbols (such as comdat or constant pool references) are
+ copied into every node needing them via add_symbol_to_partition. */
+ SYMBOL_DUPLICATE
+};
+
VEC(ltrans_partition, heap) *ltrans_partitions;
-static void add_cgraph_node_to_partition (ltrans_partition part, struct cgraph_node *node);
-static void add_varpool_node_to_partition (ltrans_partition part, struct varpool_node *vnode);
-static bool partition_symbol_p (symtab_node node);
+static void add_symbol_to_partition (ltrans_partition part, symtab_node node);
+
+/* Classify symbol NODE. */
+
+enum symbol_class
+get_symbol_class (symtab_node node)
+{
+ /* Inline clones are always duplicated.
+ This include external delcarations. */
+ if (symtab_function_p (node)
+ && cgraph (node)->global.inlined_to)
+ return SYMBOL_DUPLICATE;
+
+ /* External declarations are external. */
+ if (DECL_EXTERNAL (node->symbol.decl))
+ return SYMBOL_EXTERNAL;
+
+ if (symtab_variable_p (node))
+ {
+ /* Constant pool references use local symbol names that can not
+ be promoted global. We should never put into a constant pool
+ objects that can not be duplicated across partitions. */
+ if (DECL_IN_CONSTANT_POOL (node->symbol.decl))
+ return SYMBOL_DUPLICATE;
+ gcc_checking_assert (varpool (node)->analyzed);
+ }
+ /* Functions that are cloned may stay in callgraph even if they are unused.
+ Handle them as external; compute_ltrans_boundary take care to make
+ proper things to happen (i.e. to make them appear in the boundary but
+ with body streamed, so clone can me materialized). */
+ else if (!cgraph (node)->analyzed)
+ return SYMBOL_EXTERNAL;
+
+ /* Weakref aliases are always duplicated. */
+ if (lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl)))
+ return SYMBOL_DUPLICATE;
+
+ /* Comdats are duplicated to every use unless they are keyed.
+ Those do not need duplication. */
+ if (DECL_COMDAT (node->symbol.decl)
+ && !node->symbol.force_output
+ && !symtab_used_from_object_file_p ((symtab_node) node))
+ return SYMBOL_DUPLICATE;
+
+ return SYMBOL_PARTITION;
+}
/* Create new partition with name NAME. */
+
static ltrans_partition
new_partition (const char *name)
{
@@ -50,6 +107,7 @@ new_partition (const char *name)
}
/* Free memory used by ltrans datastructures. */
+
void
free_ltrans_partitions (void)
{
@@ -57,160 +115,175 @@ free_ltrans_partitions (void)
ltrans_partition part;
for (idx = 0; VEC_iterate (ltrans_partition, ltrans_partitions, idx, part); idx++)
{
+ if (part->initializers_visited)
+ pointer_set_destroy (part->initializers_visited);
/* Symtab encoder is freed after streaming. */
free (part);
}
VEC_free (ltrans_partition, heap, ltrans_partitions);
}
-/* Add all referenced symbols referenced by REFS that are not external and not
- partitioned into PART. */
-static void
-add_references_to_partition (ltrans_partition part, struct ipa_ref_list *refs)
+/* Return true if symbol is already in some partition. */
+
+static inline bool
+symbol_partitioned_p (symtab_node node)
{
- int i;
- struct ipa_ref *ref;
- for (i = 0; ipa_ref_list_reference_iterate (refs, i, ref); i++)
- {
- if (DECL_EXTERNAL (ref->referred->symbol.decl)
- || partition_symbol_p (ref->referred)
- || lto_symtab_encoder_in_partition_p (part->encoder, ref->referred))
- continue;
- if (symtab_function_p (ref->referred))
- add_cgraph_node_to_partition (part, ipa_ref_node (ref));
- else
- add_varpool_node_to_partition (part, ipa_ref_varpool_node (ref));
- }
+ return node->symbol.aux;
}
-/* Look for all (nonweakref) aliases in REFS and add them into PART. */
+/* Add references into the partition. */
static void
-add_aliases_to_partition (ltrans_partition part, struct ipa_ref_list *refs)
+add_references_to_partition (ltrans_partition part, symtab_node node)
{
int i;
struct ipa_ref *ref;
- for (i = 0; ipa_ref_list_referring_iterate (refs, i, ref); i++)
- if (ref->use == IPA_REF_ALIAS
- && !lto_symtab_encoder_in_partition_p (part->encoder,
- ref->referring)
- && !lookup_attribute ("weakref",
- DECL_ATTRIBUTES
- (ref->referring->symbol.decl)))
+ /* Add all duplicated references to the partition. */
+ for (i = 0; ipa_ref_list_reference_iterate (&node->symbol.ref_list, i, ref); i++)
+ if (get_symbol_class (ref->referred) == SYMBOL_DUPLICATE)
+ add_symbol_to_partition (part, ref->referred);
+ /* References to a readonly variable may be constant foled into its value.
+ Recursively look into the initializers of the constant variable and add
+ references, too. */
+ else if (symtab_variable_p (ref->referred)
+ && const_value_known_p (ref->referred->symbol.decl)
+ && !lto_symtab_encoder_in_partition_p (part->encoder, ref->referred))
{
- if (symtab_function_p (ref->referring))
- add_cgraph_node_to_partition (part, ipa_ref_referring_node (ref));
- else
- add_varpool_node_to_partition (part,
- ipa_ref_referring_varpool_node (ref));
+ if (!part->initializers_visited)
+ part->initializers_visited = pointer_set_create ();
+ if (!pointer_set_insert (part->initializers_visited, ref->referred))
+ add_references_to_partition (part, ref->referred);
}
}
-/* Worker for add_cgraph_node_to_partition. */
+/* Helper function for add_symbol_to_partition doing the actual dirty work
+ of adding NODE to PART. */
static bool
-add_cgraph_node_to_partition_1 (struct cgraph_node *node, void *data)
+add_symbol_to_partition_1 (ltrans_partition part, symtab_node node)
{
- ltrans_partition part = (ltrans_partition) data;
+ enum symbol_class c = get_symbol_class (node);
+ int i;
+ struct ipa_ref *ref;
+ symtab_node node1;
+ /* If NODE is already there, we have nothing to do. */
if (lto_symtab_encoder_in_partition_p (part->encoder, (symtab_node) node))
+ return true;
+
+ /* non-duplicated aliases or tunks of a duplicated symbol needs to be output
+ just once.
+
+ Be lax about comdats; they may or may not be duplicated and we may
+ end up in need to duplicate keyed comdat because it has unkeyed alias. */
+ if (c == SYMBOL_PARTITION && !DECL_COMDAT (node->symbol.decl)
+ && symbol_partitioned_p (node))
return false;
- /* non-COMDAT aliases of COMDAT functions needs to be output just once. */
- if (!DECL_COMDAT (node->symbol.decl)
- && !node->global.inlined_to
- && node->symbol.aux)
- {
- gcc_assert (node->thunk.thunk_p || node->alias);
- return false;
- }
+ /* Be sure that we never try to duplicate partitioned symbol
+ or add external symbol. */
+ gcc_assert (c != SYMBOL_EXTERNAL
+ && (c == SYMBOL_DUPLICATE || !symbol_partitioned_p (node)));
+
+ lto_set_symtab_encoder_in_partition (part->encoder, (symtab_node) node);
- if (node->symbol.aux)
+ if (symbol_partitioned_p (node))
{
node->symbol.in_other_partition = 1;
if (cgraph_dump_file)
- fprintf (cgraph_dump_file, "Node %s/%i now used in multiple partitions\n",
- cgraph_node_name (node), node->uid);
+ fprintf (cgraph_dump_file, "Symbol node %s now used in multiple partitions\n",
+ symtab_node_name (node));
}
node->symbol.aux = (void *)((size_t)node->symbol.aux + 1);
- lto_set_symtab_encoder_in_partition (part->encoder, (symtab_node)node);
- return false;
-}
-
-/* Add NODE to partition as well as the inline callees and referred comdats into partition PART. */
-
-static void
-add_cgraph_node_to_partition (ltrans_partition part, struct cgraph_node *node)
-{
- struct cgraph_edge *e;
- struct cgraph_node *n;
-
- /* If NODE is already there, we have nothing to do. */
- if (lto_symtab_encoder_in_partition_p (part->encoder, (symtab_node) node))
- return;
-
- cgraph_for_node_thunks_and_aliases (node, add_cgraph_node_to_partition_1, part, true);
- part->insns += inline_summary (node)->self_size;
+ if (symtab_function_p (node))
+ {
+ struct cgraph_node *cnode = cgraph (node);
+ struct cgraph_edge *e;
+ part->insns += inline_summary (cnode)->self_size;
+
+ /* Add all inline clones and callees that are duplicated. */
+ for (e = cnode->callees; e; e = e->next_callee)
+ if (!e->inline_failed)
+ add_symbol_to_partition_1 (part, (symtab_node) e->callee);
+ else if (get_symbol_class ((symtab_node) e->callee) == SYMBOL_DUPLICATE)
+ add_symbol_to_partition (part, (symtab_node) e->callee);
+
+ /* Add all thunks associated with the function. */
+ for (e = cnode->callers; e; e = e->next_caller)
+ if (e->caller->thunk.thunk_p)
+ add_symbol_to_partition_1 (part, (symtab_node) e->caller);
+ }
- for (e = node->callees; e; e = e->next_callee)
- if ((!e->inline_failed
- || (!DECL_EXTERNAL (e->callee->symbol.decl)
- && !partition_symbol_p ((symtab_node) e->callee))))
- add_cgraph_node_to_partition (part, e->callee);
+ add_references_to_partition (part, node);
- /* The only way to assemble non-weakref alias is to add the aliased object into
- the unit. */
- add_references_to_partition (part, &node->symbol.ref_list);
- n = cgraph_function_node (node, NULL);
- if (n != node
- && !lookup_attribute ("weakref",
- DECL_ATTRIBUTES (node->symbol.decl)))
- add_cgraph_node_to_partition (part, n);
+ /* Add all aliases associated with the symbol. */
+ for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, i, ref); i++)
+ if (ref->use == IPA_REF_ALIAS
+ && !lookup_attribute ("weakref",
+ DECL_ATTRIBUTES
+ (ref->referring->symbol.decl)))
+ add_symbol_to_partition_1 (part, ref->referring);
+ /* Ensure that SAME_COMDAT_GROUP lists all allways added in a group. */
if (node->symbol.same_comdat_group)
- for (n = cgraph (node->symbol.same_comdat_group);
- n != node; n = cgraph (n->symbol.same_comdat_group))
- add_cgraph_node_to_partition (part, n);
+ for (node1 = node->symbol.same_comdat_group;
+ node1 != node; node1 = node1->symbol.same_comdat_group)
+ {
+ bool added = add_symbol_to_partition_1 (part, node1);
+ gcc_assert (added);
+ }
+ return true;
}
-/* Add VNODE to partition as well as comdat references partition PART. */
+/* If symbol NODE is really part of other symbol's definition (i.e. it is
+ internal label, thunk, alias or so), return the outer symbol.
+ When add_symbol_to_partition_1 is called on the outer symbol it must
+ eventually add NODE, too. */
+static symtab_node
+contained_in_symbol (symtab_node node)
+{
+ /* Weakrefs are never contained in anything. */
+ if (lookup_attribute ("weakref",
+ DECL_ATTRIBUTES (node->symbol.decl)))
+ return node;
+ if (symtab_function_p (node))
+ {
+ struct cgraph_node *cnode = cgraph_function_node (cgraph (node), NULL);
+ if (cnode->global.inlined_to)
+ cnode = cnode->global.inlined_to;
+ return (symtab_node) cnode;
+ }
+ else if (symtab_variable_p (node))
+ return (symtab_node) varpool_variable_node (varpool (node), NULL);
+ return node;
+}
+
+/* Add symbol NODE to partition. When definition of NODE is part
+ of other symbol definition, add the other symbol, too. */
static void
-add_varpool_node_to_partition (ltrans_partition part, struct varpool_node *vnode)
+add_symbol_to_partition (ltrans_partition part, symtab_node node)
{
- struct varpool_node *v;
+ symtab_node node1;
- /* If NODE is already there, we have nothing to do. */
- if (lto_symtab_encoder_in_partition_p (part->encoder, (symtab_node) vnode))
- return;
+ /* Verify that we do not try to duplicate something that can not be. */
+ gcc_checking_assert (get_symbol_class (node) == SYMBOL_DUPLICATE
+ || !symbol_partitioned_p (node));
- lto_set_symtab_encoder_in_partition (part->encoder, (symtab_node) vnode);
+ while ((node1 = contained_in_symbol (node)) != node)
+ node = node1;
- if (vnode->symbol.aux)
- {
- vnode->symbol.in_other_partition = 1;
- if (cgraph_dump_file)
- fprintf (cgraph_dump_file, "Varpool node %s now used in multiple partitions\n",
- varpool_node_name (vnode));
- }
- vnode->symbol.aux = (void *)((size_t)vnode->symbol.aux + 1);
-
- /* The only way to assemble non-weakref alias is to add the aliased object into
- the unit. */
- v = varpool_variable_node (vnode, NULL);
- if (v != vnode
- && !lookup_attribute ("weakref",
- DECL_ATTRIBUTES (vnode->symbol.decl)))
- add_varpool_node_to_partition (part, v);
-
- add_references_to_partition (part, &vnode->symbol.ref_list);
- add_aliases_to_partition (part, &vnode->symbol.ref_list);
-
- if (vnode->symbol.same_comdat_group
- && !lto_symtab_encoder_in_partition_p (part->encoder,
- vnode->symbol.same_comdat_group))
- add_varpool_node_to_partition (part, varpool (vnode->symbol.same_comdat_group));
+ /* If we have duplicated symbol contained in something we can not duplicate,
+ we are very badly screwed. The other way is possible, so we do not
+ assert this in add_symbol_to_partition_1.
+
+ Be lax about comdats; they may or may not be duplicated and we may
+ end up in need to duplicate keyed comdat because it has unkeyed alias. */
+ gcc_assert (get_symbol_class (node) == SYMBOL_DUPLICATE
+ || DECL_COMDAT (node->symbol.decl)
+ || !symbol_partitioned_p (node));
+ add_symbol_to_partition_1 (part, node);
}
/* Undo all additions until number of cgraph nodes in PARITION is N_CGRAPH_NODES
@@ -223,6 +296,12 @@ undo_partition (ltrans_partition partition, unsigned int n_nodes)
{
symtab_node node = lto_symtab_encoder_deref (partition->encoder,
n_nodes);
+
+ /* After UNDO we no longer know what was visited. */
+ if (partition->initializers_visited)
+ pointer_set_destroy (partition->initializers_visited);
+ partition->initializers_visited = NULL;
+
if (symtab_function_p (node))
partition->insns -= inline_summary (cgraph (node))->self_size;
lto_symtab_encoder_delete_node (partition->encoder, node);
@@ -230,85 +309,25 @@ undo_partition (ltrans_partition partition, unsigned int n_nodes)
}
}
-/* Return true if NODE should be partitioned.
- This means that partitioning algorithm should put NODE into one of partitions.
- This apply to most functions with bodies. Functions that are not partitions
- are put into every unit needing them. This is the case of i.e. COMDATs. */
-
-static bool
-partition_cgraph_node_p (struct cgraph_node *node)
-{
- /* We will get proper partition based on function they are inlined to. */
- if (node->global.inlined_to)
- return false;
- /* Nodes without a body do not need partitioning. */
- if (!node->analyzed)
- return false;
- /* Extern inlines and comdat are always only in partitions they are needed. */
- if (DECL_EXTERNAL (node->symbol.decl)
- || (DECL_COMDAT (node->symbol.decl)
- && !node->symbol.force_output
- && !symtab_used_from_object_file_p ((symtab_node) node)))
- return false;
- if (lookup_attribute ("weakref", DECL_ATTRIBUTES (node->symbol.decl)))
- return false;
- return true;
-}
-
-/* Return true if VNODE should be partitioned.
- This means that partitioning algorithm should put VNODE into one of partitions. */
-
-static bool
-partition_varpool_node_p (struct varpool_node *vnode)
-{
- if (!vnode->analyzed)
- return false;
- /* Constant pool and comdat are always only in partitions they are needed. */
- if (DECL_IN_CONSTANT_POOL (vnode->symbol.decl)
- || DECL_EXTERNAL (vnode->symbol.decl)
- || (DECL_COMDAT (vnode->symbol.decl)
- && !vnode->symbol.force_output
- && !symtab_used_from_object_file_p ((symtab_node) vnode)))
- return false;
- if (lookup_attribute ("weakref", DECL_ATTRIBUTES (vnode->symbol.decl)))
- return false;
- return true;
-}
-
-/* Return true if NODE should be partitioned.
- This means that partitioning algorithm should put NODE into one of partitions. */
-
-static bool
-partition_symbol_p (symtab_node node)
-{
- if (symtab_function_p (node))
- return partition_cgraph_node_p (cgraph (node));
- else
- return partition_varpool_node_p (varpool (node));
-}
-
/* Group cgrah nodes by input files. This is used mainly for testing
right now. */
void
lto_1_to_1_map (void)
{
- struct cgraph_node *node;
- struct varpool_node *vnode;
+ symtab_node node;
struct lto_file_decl_data *file_data;
struct pointer_map_t *pmap;
ltrans_partition partition;
void **slot;
int npartitions = 0;
- timevar_push (TV_WHOPR_WPA);
-
pmap = pointer_map_create ();
- FOR_EACH_DEFINED_FUNCTION (node)
+ FOR_EACH_SYMBOL (node)
{
- if (!partition_cgraph_node_p (node)
- || node->symbol.aux)
+ if (get_symbol_class (node) != SYMBOL_PARTITION
+ || symbol_partitioned_p (node))
continue;
file_data = node->symbol.lto_file_data;
@@ -337,32 +356,8 @@ lto_1_to_1_map (void)
npartitions++;
}
- add_cgraph_node_to_partition (partition, node);
- }
-
- FOR_EACH_VARIABLE (vnode)
- {
- if (!partition_varpool_node_p (vnode)
- || vnode->symbol.aux)
- continue;
- file_data = vnode->symbol.lto_file_data;
- slot = pointer_map_contains (pmap, file_data);
- if (slot)
- partition = (ltrans_partition) *slot;
- else
- {
- partition = new_partition (file_data->file_name);
- slot = pointer_map_insert (pmap, file_data);
- *slot = partition;
- npartitions++;
- }
-
- add_varpool_node_to_partition (partition, vnode);
+ add_symbol_to_partition (partition, (symtab_node) node);
}
- FOR_EACH_FUNCTION (node)
- node->symbol.aux = NULL;
- FOR_EACH_VARIABLE (vnode)
- vnode->symbol.aux = NULL;
/* If the cgraph is empty, create one cgraph node set so that there is still
an output file for any variables that need to be exported in a DSO. */
@@ -371,10 +366,28 @@ lto_1_to_1_map (void)
pointer_map_destroy (pmap);
- timevar_pop (TV_WHOPR_WPA);
+}
+
+/* Maximal partitioning. Put every new symbol into new partition if possible. */
- lto_stats.num_cgraph_partitions += VEC_length (ltrans_partition,
- ltrans_partitions);
+void
+lto_max_map (void)
+{
+ symtab_node node;
+ ltrans_partition partition;
+ int npartitions = 0;
+
+ FOR_EACH_SYMBOL (node)
+ {
+ if (get_symbol_class (node) != SYMBOL_PARTITION
+ || symbol_partitioned_p (node))
+ continue;
+ partition = new_partition (symtab_node_asm_name (node));
+ add_symbol_to_partition (partition, (symtab_node) node);
+ npartitions++;
+ }
+ if (!npartitions)
+ new_partition ("empty");
}
/* Helper function for qsort; sort nodes by order. */
@@ -467,7 +480,7 @@ lto_balanced_map (void)
for (i = 0; i < postorder_len; i++)
{
node = postorder[i];
- if (partition_cgraph_node_p (node))
+ if (get_symbol_class ((symtab_node) node) == SYMBOL_PARTITION)
{
order[n_nodes++] = node;
total_size += inline_summary (node)->size;
@@ -480,13 +493,13 @@ lto_balanced_map (void)
qsort (order, n_nodes, sizeof (struct cgraph_node *), node_cmp);
FOR_EACH_VARIABLE (vnode)
- if (partition_varpool_node_p (vnode))
+ if (get_symbol_class ((symtab_node) vnode) == SYMBOL_PARTITION)
n_varpool_nodes++;
varpool_order = XNEWVEC (struct varpool_node *, n_varpool_nodes);
n_varpool_nodes = 0;
FOR_EACH_VARIABLE (vnode)
- if (partition_varpool_node_p (vnode))
+ if (get_symbol_class ((symtab_node) vnode) == SYMBOL_PARTITION)
varpool_order[n_varpool_nodes++] = vnode;
qsort (varpool_order, n_varpool_nodes, sizeof (struct varpool_node *),
varpool_node_cmp);
@@ -504,7 +517,7 @@ lto_balanced_map (void)
for (i = 0; i < n_nodes; i++)
{
- if (order[i]->symbol.aux)
+ if (symbol_partitioned_p ((symtab_node) order[i]))
continue;
current_order = order[i]->symbol.order;
@@ -513,19 +526,19 @@ lto_balanced_map (void)
while (varpool_pos < n_varpool_nodes
&& varpool_order[varpool_pos]->symbol.order < current_order)
{
- if (!varpool_order[varpool_pos]->symbol.aux)
- add_varpool_node_to_partition (partition, varpool_order[varpool_pos]);
+ if (!symbol_partitioned_p ((symtab_node) varpool_order[varpool_pos]))
+ add_symbol_to_partition (partition, (symtab_node) varpool_order[varpool_pos]);
varpool_pos++;
}
- add_cgraph_node_to_partition (partition, order[i]);
+ add_symbol_to_partition (partition, (symtab_node) order[i]);
total_size -= inline_summary (order[i])->size;
/* Once we added a new node to the partition, we also want to add
all referenced variables unless they was already added into some
earlier partition.
- add_cgraph_node_to_partition adds possibly multiple nodes and
+ add_symbol_to_partition adds possibly multiple nodes and
variables that are needed to satisfy needs of ORDER[i].
We remember last visited cgraph and varpool node from last iteration
of outer loop that allows us to process every new addition.
@@ -605,9 +618,9 @@ lto_balanced_map (void)
vnode = ipa_ref_varpool_node (ref);
if (!vnode->finalized)
continue;
- if (!vnode->symbol.aux && flag_toplevel_reorder
- && partition_varpool_node_p (vnode))
- add_varpool_node_to_partition (partition, vnode);
+ if (!symbol_partitioned_p ((symtab_node) vnode) && flag_toplevel_reorder
+ && get_symbol_class ((symtab_node) vnode) == SYMBOL_PARTITION)
+ add_symbol_to_partition (partition, (symtab_node) vnode);
index = lto_symtab_encoder_lookup (partition->encoder,
(symtab_node)vnode);
if (index != LCC_NOT_FOUND
@@ -638,9 +651,9 @@ lto_balanced_map (void)
vnode = ipa_ref_referring_varpool_node (ref);
gcc_assert (vnode->finalized);
- if (!vnode->symbol.aux && flag_toplevel_reorder
- && partition_varpool_node_p (vnode))
- add_varpool_node_to_partition (partition, vnode);
+ if (!symbol_partitioned_p ((symtab_node) vnode) && flag_toplevel_reorder
+ && get_symbol_class ((symtab_node) vnode) == SYMBOL_PARTITION)
+ add_symbol_to_partition (partition, (symtab_node) vnode);
index = lto_symtab_encoder_lookup (partition->encoder,
(symtab_node)vnode);
if (index != LCC_NOT_FOUND
@@ -696,7 +709,7 @@ lto_balanced_map (void)
}
i = best_i;
/* When we are finished, avoid creating empty partition. */
- while (i < n_nodes - 1 && order[i + 1]->symbol.aux)
+ while (i < n_nodes - 1 && symbol_partitioned_p ((symtab_node) order[i + 1]))
i++;
if (i == n_nodes - 1)
break;
@@ -728,15 +741,16 @@ lto_balanced_map (void)
if (flag_toplevel_reorder)
{
FOR_EACH_VARIABLE (vnode)
- if (partition_varpool_node_p (vnode) && !vnode->symbol.aux)
- add_varpool_node_to_partition (partition, vnode);
+ if (get_symbol_class ((symtab_node) vnode) == SYMBOL_PARTITION
+ && !symbol_partitioned_p ((symtab_node) vnode))
+ add_symbol_to_partition (partition, (symtab_node) vnode);
}
else
{
while (varpool_pos < n_varpool_nodes)
{
- if (!varpool_order[varpool_pos]->symbol.aux)
- add_varpool_node_to_partition (partition, varpool_order[varpool_pos]);
+ if (!symbol_partitioned_p ((symtab_node) varpool_order[varpool_pos]))
+ add_symbol_to_partition (partition, (symtab_node) varpool_order[varpool_pos]);
varpool_pos++;
}
free (varpool_order);
@@ -806,7 +820,7 @@ lto_promote_cross_file_statics (void)
|| lto_symtab_encoder_in_partition_p (encoder, node)
/* ... or if we do not partition it. This mean that it will
appear in every partition refernecing it. */
- || !partition_symbol_p (node))
+ || get_symbol_class ((symtab_node) node) != SYMBOL_PARTITION)
continue;
promote_symbol (node);
diff --git a/gcc/lto/lto-partition.h b/gcc/lto/lto-partition.h
index e044934e5e7..5bf4055269f 100644
--- a/gcc/lto/lto-partition.h
+++ b/gcc/lto/lto-partition.h
@@ -25,6 +25,7 @@ struct ltrans_partition_def
lto_symtab_encoder_t encoder;
const char * name;
int insns;
+ pointer_set_t *initializers_visited;
};
typedef struct ltrans_partition_def *ltrans_partition;
@@ -34,6 +35,7 @@ DEF_VEC_ALLOC_P(ltrans_partition,heap);
extern VEC(ltrans_partition, heap) *ltrans_partitions;
void lto_1_to_1_map (void);
+void lto_max_map (void);
void lto_balanced_map (void);
void lto_promote_cross_file_statics (void);
void free_ltrans_partitions (void);
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index 3123871cd00..c15f9cff5a7 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -276,6 +276,1115 @@ lto_read_in_decl_state (struct data_in *data_in, const uint32_t *data,
return data;
}
+
+
+/* Global type table. FIXME, it should be possible to re-use some
+ of the type hashing routines in tree.c (type_hash_canon, type_hash_lookup,
+ etc), but those assume that types were built with the various
+ build_*_type routines which is not the case with the streamer. */
+static GTY((if_marked ("ggc_marked_p"), param_is (union tree_node)))
+ htab_t gimple_types;
+static GTY((if_marked ("tree_int_map_marked_p"), param_is (struct tree_int_map)))
+ htab_t type_hash_cache;
+
+static hashval_t gimple_type_hash (const void *);
+
+/* Structure used to maintain a cache of some type pairs compared by
+ gimple_types_compatible_p when comparing aggregate types. There are
+ three possible values for SAME_P:
+
+ -2: The pair (T1, T2) has just been inserted in the table.
+ 0: T1 and T2 are different types.
+ 1: T1 and T2 are the same type. */
+
+struct type_pair_d
+{
+ unsigned int uid1;
+ unsigned int uid2;
+ signed char same_p;
+};
+typedef struct type_pair_d *type_pair_t;
+DEF_VEC_P(type_pair_t);
+DEF_VEC_ALLOC_P(type_pair_t,heap);
+
+#define GIMPLE_TYPE_PAIR_SIZE 16381
+struct type_pair_d *type_pair_cache;
+
+
+/* Lookup the pair of types T1 and T2 in *VISITED_P. Insert a new
+ entry if none existed. */
+
+static inline type_pair_t
+lookup_type_pair (tree t1, tree t2)
+{
+ unsigned int index;
+ unsigned int uid1, uid2;
+
+ if (TYPE_UID (t1) < TYPE_UID (t2))
+ {
+ uid1 = TYPE_UID (t1);
+ uid2 = TYPE_UID (t2);
+ }
+ else
+ {
+ uid1 = TYPE_UID (t2);
+ uid2 = TYPE_UID (t1);
+ }
+ gcc_checking_assert (uid1 != uid2);
+
+ /* iterative_hash_hashval_t imply an function calls.
+ We know that UIDS are in limited range. */
+ index = ((((unsigned HOST_WIDE_INT)uid1 << HOST_BITS_PER_WIDE_INT / 2) + uid2)
+ % GIMPLE_TYPE_PAIR_SIZE);
+ if (type_pair_cache [index].uid1 == uid1
+ && type_pair_cache [index].uid2 == uid2)
+ return &type_pair_cache[index];
+
+ type_pair_cache [index].uid1 = uid1;
+ type_pair_cache [index].uid2 = uid2;
+ type_pair_cache [index].same_p = -2;
+
+ return &type_pair_cache[index];
+}
+
+/* Per pointer state for the SCC finding. The on_sccstack flag
+ is not strictly required, it is true when there is no hash value
+ recorded for the type and false otherwise. But querying that
+ is slower. */
+
+struct sccs
+{
+ unsigned int dfsnum;
+ unsigned int low;
+ bool on_sccstack;
+ union {
+ hashval_t hash;
+ signed char same_p;
+ } u;
+};
+
+static unsigned int next_dfs_num;
+static unsigned int gtc_next_dfs_num;
+
+/* GIMPLE type merging cache. A direct-mapped cache based on TYPE_UID. */
+
+typedef struct GTY(()) gimple_type_leader_entry_s {
+ tree type;
+ tree leader;
+} gimple_type_leader_entry;
+
+#define GIMPLE_TYPE_LEADER_SIZE 16381
+static GTY((length("GIMPLE_TYPE_LEADER_SIZE")))
+ gimple_type_leader_entry *gimple_type_leader;
+
+/* Lookup an existing leader for T and return it or NULL_TREE, if
+ there is none in the cache. */
+
+static inline tree
+gimple_lookup_type_leader (tree t)
+{
+ gimple_type_leader_entry *leader;
+
+ leader = &gimple_type_leader[TYPE_UID (t) % GIMPLE_TYPE_LEADER_SIZE];
+ if (leader->type != t)
+ return NULL_TREE;
+
+ return leader->leader;
+}
+
+
+/* Return true if T1 and T2 have the same name. If FOR_COMPLETION_P is
+ true then if any type has no name return false, otherwise return
+ true if both types have no names. */
+
+static bool
+compare_type_names_p (tree t1, tree t2)
+{
+ tree name1 = TYPE_NAME (t1);
+ tree name2 = TYPE_NAME (t2);
+
+ if ((name1 != NULL_TREE) != (name2 != NULL_TREE))
+ return false;
+
+ if (name1 == NULL_TREE)
+ return true;
+
+ /* Either both should be a TYPE_DECL or both an IDENTIFIER_NODE. */
+ if (TREE_CODE (name1) != TREE_CODE (name2))
+ return false;
+
+ if (TREE_CODE (name1) == TYPE_DECL)
+ name1 = DECL_NAME (name1);
+ gcc_checking_assert (!name1 || TREE_CODE (name1) == IDENTIFIER_NODE);
+
+ if (TREE_CODE (name2) == TYPE_DECL)
+ name2 = DECL_NAME (name2);
+ gcc_checking_assert (!name2 || TREE_CODE (name2) == IDENTIFIER_NODE);
+
+ /* Identifiers can be compared with pointer equality rather
+ than a string comparison. */
+ if (name1 == name2)
+ return true;
+
+ return false;
+}
+
+static bool
+gimple_types_compatible_p_1 (tree, tree, type_pair_t,
+ VEC(type_pair_t, heap) **,
+ struct pointer_map_t *, struct obstack *);
+
+/* DFS visit the edge from the callers type pair with state *STATE to
+ the pair T1, T2 while operating in FOR_MERGING_P mode.
+ Update the merging status if it is not part of the SCC containing the
+ callers pair and return it.
+ SCCSTACK, SCCSTATE and SCCSTATE_OBSTACK are state for the DFS walk done. */
+
+static bool
+gtc_visit (tree t1, tree t2,
+ struct sccs *state,
+ VEC(type_pair_t, heap) **sccstack,
+ struct pointer_map_t *sccstate,
+ struct obstack *sccstate_obstack)
+{
+ struct sccs *cstate = NULL;
+ type_pair_t p;
+ void **slot;
+ tree leader1, leader2;
+
+ /* Check first for the obvious case of pointer identity. */
+ if (t1 == t2)
+ return true;
+
+ /* Check that we have two types to compare. */
+ if (t1 == NULL_TREE || t2 == NULL_TREE)
+ return false;
+
+ /* Can't be the same type if the types don't have the same code. */
+ if (TREE_CODE (t1) != TREE_CODE (t2))
+ return false;
+
+ /* Can't be the same type if they have different CV qualifiers. */
+ if (TYPE_QUALS (t1) != TYPE_QUALS (t2))
+ return false;
+
+ if (TREE_ADDRESSABLE (t1) != TREE_ADDRESSABLE (t2))
+ return false;
+
+ /* Void types and nullptr types are always the same. */
+ if (TREE_CODE (t1) == VOID_TYPE
+ || TREE_CODE (t1) == NULLPTR_TYPE)
+ return true;
+
+ /* Can't be the same type if they have different alignment or mode. */
+ if (TYPE_ALIGN (t1) != TYPE_ALIGN (t2)
+ || TYPE_MODE (t1) != TYPE_MODE (t2))
+ return false;
+
+ /* Do some simple checks before doing three hashtable queries. */
+ if (INTEGRAL_TYPE_P (t1)
+ || SCALAR_FLOAT_TYPE_P (t1)
+ || FIXED_POINT_TYPE_P (t1)
+ || TREE_CODE (t1) == VECTOR_TYPE
+ || TREE_CODE (t1) == COMPLEX_TYPE
+ || TREE_CODE (t1) == OFFSET_TYPE
+ || POINTER_TYPE_P (t1))
+ {
+ /* Can't be the same type if they have different sign or precision. */
+ if (TYPE_PRECISION (t1) != TYPE_PRECISION (t2)
+ || TYPE_UNSIGNED (t1) != TYPE_UNSIGNED (t2))
+ return false;
+
+ if (TREE_CODE (t1) == INTEGER_TYPE
+ && TYPE_STRING_FLAG (t1) != TYPE_STRING_FLAG (t2))
+ return false;
+
+ /* That's all we need to check for float and fixed-point types. */
+ if (SCALAR_FLOAT_TYPE_P (t1)
+ || FIXED_POINT_TYPE_P (t1))
+ return true;
+
+ /* For other types fall through to more complex checks. */
+ }
+
+ /* If the types have been previously registered and found equal
+ they still are. */
+ leader1 = gimple_lookup_type_leader (t1);
+ leader2 = gimple_lookup_type_leader (t2);
+ if (leader1 == t2
+ || t1 == leader2
+ || (leader1 && leader1 == leader2))
+ return true;
+
+ /* If the hash values of t1 and t2 are different the types can't
+ possibly be the same. This helps keeping the type-pair hashtable
+ small, only tracking comparisons for hash collisions. */
+ if (gimple_type_hash (t1) != gimple_type_hash (t2))
+ return false;
+
+ /* Allocate a new cache entry for this comparison. */
+ p = lookup_type_pair (t1, t2);
+ if (p->same_p == 0 || p->same_p == 1)
+ {
+ /* We have already decided whether T1 and T2 are the
+ same, return the cached result. */
+ return p->same_p == 1;
+ }
+
+ if ((slot = pointer_map_contains (sccstate, p)) != NULL)
+ cstate = (struct sccs *)*slot;
+ /* Not yet visited. DFS recurse. */
+ if (!cstate)
+ {
+ gimple_types_compatible_p_1 (t1, t2, p,
+ sccstack, sccstate, sccstate_obstack);
+ cstate = (struct sccs *)* pointer_map_contains (sccstate, p);
+ state->low = MIN (state->low, cstate->low);
+ }
+ /* If the type is still on the SCC stack adjust the parents low. */
+ if (cstate->dfsnum < state->dfsnum
+ && cstate->on_sccstack)
+ state->low = MIN (cstate->dfsnum, state->low);
+
+ /* Return the current lattice value. We start with an equality
+ assumption so types part of a SCC will be optimistically
+ treated equal unless proven otherwise. */
+ return cstate->u.same_p;
+}
+
+/* Worker for gimple_types_compatible.
+ SCCSTACK, SCCSTATE and SCCSTATE_OBSTACK are state for the DFS walk done. */
+
+static bool
+gimple_types_compatible_p_1 (tree t1, tree t2, type_pair_t p,
+ VEC(type_pair_t, heap) **sccstack,
+ struct pointer_map_t *sccstate,
+ struct obstack *sccstate_obstack)
+{
+ struct sccs *state;
+
+ gcc_assert (p->same_p == -2);
+
+ state = XOBNEW (sccstate_obstack, struct sccs);
+ *pointer_map_insert (sccstate, p) = state;
+
+ VEC_safe_push (type_pair_t, heap, *sccstack, p);
+ state->dfsnum = gtc_next_dfs_num++;
+ state->low = state->dfsnum;
+ state->on_sccstack = true;
+ /* Start with an equality assumption. As we DFS recurse into child
+ SCCs this assumption may get revisited. */
+ state->u.same_p = 1;
+
+ /* The struct tags shall compare equal. */
+ if (!compare_type_names_p (t1, t2))
+ goto different_types;
+
+ /* We may not merge typedef types to the same type in different
+ contexts. */
+ if (TYPE_NAME (t1)
+ && TREE_CODE (TYPE_NAME (t1)) == TYPE_DECL
+ && DECL_CONTEXT (TYPE_NAME (t1))
+ && TYPE_P (DECL_CONTEXT (TYPE_NAME (t1))))
+ {
+ if (!gtc_visit (DECL_CONTEXT (TYPE_NAME (t1)),
+ DECL_CONTEXT (TYPE_NAME (t2)),
+ state, sccstack, sccstate, sccstate_obstack))
+ goto different_types;
+ }
+
+ /* If their attributes are not the same they can't be the same type. */
+ if (!attribute_list_equal (TYPE_ATTRIBUTES (t1), TYPE_ATTRIBUTES (t2)))
+ goto different_types;
+
+ /* Do type-specific comparisons. */
+ switch (TREE_CODE (t1))
+ {
+ case VECTOR_TYPE:
+ case COMPLEX_TYPE:
+ if (!gtc_visit (TREE_TYPE (t1), TREE_TYPE (t2),
+ state, sccstack, sccstate, sccstate_obstack))
+ goto different_types;
+ goto same_types;
+
+ case ARRAY_TYPE:
+ /* Array types are the same if the element types are the same and
+ the number of elements are the same. */
+ if (!gtc_visit (TREE_TYPE (t1), TREE_TYPE (t2),
+ state, sccstack, sccstate, sccstate_obstack)
+ || TYPE_STRING_FLAG (t1) != TYPE_STRING_FLAG (t2)
+ || TYPE_NONALIASED_COMPONENT (t1) != TYPE_NONALIASED_COMPONENT (t2))
+ goto different_types;
+ else
+ {
+ tree i1 = TYPE_DOMAIN (t1);
+ tree i2 = TYPE_DOMAIN (t2);
+
+ /* For an incomplete external array, the type domain can be
+ NULL_TREE. Check this condition also. */
+ if (i1 == NULL_TREE && i2 == NULL_TREE)
+ goto same_types;
+ else if (i1 == NULL_TREE || i2 == NULL_TREE)
+ goto different_types;
+ else
+ {
+ tree min1 = TYPE_MIN_VALUE (i1);
+ tree min2 = TYPE_MIN_VALUE (i2);
+ tree max1 = TYPE_MAX_VALUE (i1);
+ tree max2 = TYPE_MAX_VALUE (i2);
+
+ /* The minimum/maximum values have to be the same. */
+ if ((min1 == min2
+ || (min1 && min2
+ && ((TREE_CODE (min1) == PLACEHOLDER_EXPR
+ && TREE_CODE (min2) == PLACEHOLDER_EXPR)
+ || operand_equal_p (min1, min2, 0))))
+ && (max1 == max2
+ || (max1 && max2
+ && ((TREE_CODE (max1) == PLACEHOLDER_EXPR
+ && TREE_CODE (max2) == PLACEHOLDER_EXPR)
+ || operand_equal_p (max1, max2, 0)))))
+ goto same_types;
+ else
+ goto different_types;
+ }
+ }
+
+ case METHOD_TYPE:
+ /* Method types should belong to the same class. */
+ if (!gtc_visit (TYPE_METHOD_BASETYPE (t1), TYPE_METHOD_BASETYPE (t2),
+ state, sccstack, sccstate, sccstate_obstack))
+ goto different_types;
+
+ /* Fallthru */
+
+ case FUNCTION_TYPE:
+ /* Function types are the same if the return type and arguments types
+ are the same. */
+ if (!gtc_visit (TREE_TYPE (t1), TREE_TYPE (t2),
+ state, sccstack, sccstate, sccstate_obstack))
+ goto different_types;
+
+ if (!comp_type_attributes (t1, t2))
+ goto different_types;
+
+ if (TYPE_ARG_TYPES (t1) == TYPE_ARG_TYPES (t2))
+ goto same_types;
+ else
+ {
+ tree parms1, parms2;
+
+ for (parms1 = TYPE_ARG_TYPES (t1), parms2 = TYPE_ARG_TYPES (t2);
+ parms1 && parms2;
+ parms1 = TREE_CHAIN (parms1), parms2 = TREE_CHAIN (parms2))
+ {
+ if (!gtc_visit (TREE_VALUE (parms1), TREE_VALUE (parms2),
+ state, sccstack, sccstate, sccstate_obstack))
+ goto different_types;
+ }
+
+ if (parms1 || parms2)
+ goto different_types;
+
+ goto same_types;
+ }
+
+ case OFFSET_TYPE:
+ {
+ if (!gtc_visit (TREE_TYPE (t1), TREE_TYPE (t2),
+ state, sccstack, sccstate, sccstate_obstack)
+ || !gtc_visit (TYPE_OFFSET_BASETYPE (t1),
+ TYPE_OFFSET_BASETYPE (t2),
+ state, sccstack, sccstate, sccstate_obstack))
+ goto different_types;
+
+ goto same_types;
+ }
+
+ case POINTER_TYPE:
+ case REFERENCE_TYPE:
+ {
+ /* If the two pointers have different ref-all attributes,
+ they can't be the same type. */
+ if (TYPE_REF_CAN_ALIAS_ALL (t1) != TYPE_REF_CAN_ALIAS_ALL (t2))
+ goto different_types;
+
+ /* Otherwise, pointer and reference types are the same if the
+ pointed-to types are the same. */
+ if (gtc_visit (TREE_TYPE (t1), TREE_TYPE (t2),
+ state, sccstack, sccstate, sccstate_obstack))
+ goto same_types;
+
+ goto different_types;
+ }
+
+ case INTEGER_TYPE:
+ case BOOLEAN_TYPE:
+ {
+ tree min1 = TYPE_MIN_VALUE (t1);
+ tree max1 = TYPE_MAX_VALUE (t1);
+ tree min2 = TYPE_MIN_VALUE (t2);
+ tree max2 = TYPE_MAX_VALUE (t2);
+ bool min_equal_p = false;
+ bool max_equal_p = false;
+
+ /* If either type has a minimum value, the other type must
+ have the same. */
+ if (min1 == NULL_TREE && min2 == NULL_TREE)
+ min_equal_p = true;
+ else if (min1 && min2 && operand_equal_p (min1, min2, 0))
+ min_equal_p = true;
+
+ /* Likewise, if either type has a maximum value, the other
+ type must have the same. */
+ if (max1 == NULL_TREE && max2 == NULL_TREE)
+ max_equal_p = true;
+ else if (max1 && max2 && operand_equal_p (max1, max2, 0))
+ max_equal_p = true;
+
+ if (!min_equal_p || !max_equal_p)
+ goto different_types;
+
+ goto same_types;
+ }
+
+ case ENUMERAL_TYPE:
+ {
+ /* FIXME lto, we cannot check bounds on enumeral types because
+ different front ends will produce different values.
+ In C, enumeral types are integers, while in C++ each element
+ will have its own symbolic value. We should decide how enums
+ are to be represented in GIMPLE and have each front end lower
+ to that. */
+ tree v1, v2;
+
+ /* For enumeral types, all the values must be the same. */
+ if (TYPE_VALUES (t1) == TYPE_VALUES (t2))
+ goto same_types;
+
+ for (v1 = TYPE_VALUES (t1), v2 = TYPE_VALUES (t2);
+ v1 && v2;
+ v1 = TREE_CHAIN (v1), v2 = TREE_CHAIN (v2))
+ {
+ tree c1 = TREE_VALUE (v1);
+ tree c2 = TREE_VALUE (v2);
+
+ if (TREE_CODE (c1) == CONST_DECL)
+ c1 = DECL_INITIAL (c1);
+
+ if (TREE_CODE (c2) == CONST_DECL)
+ c2 = DECL_INITIAL (c2);
+
+ if (tree_int_cst_equal (c1, c2) != 1)
+ goto different_types;
+
+ if (TREE_PURPOSE (v1) != TREE_PURPOSE (v2))
+ goto different_types;
+ }
+
+ /* If one enumeration has more values than the other, they
+ are not the same. */
+ if (v1 || v2)
+ goto different_types;
+
+ goto same_types;
+ }
+
+ case RECORD_TYPE:
+ case UNION_TYPE:
+ case QUAL_UNION_TYPE:
+ {
+ tree f1, f2;
+
+ /* For aggregate types, all the fields must be the same. */
+ for (f1 = TYPE_FIELDS (t1), f2 = TYPE_FIELDS (t2);
+ f1 && f2;
+ f1 = TREE_CHAIN (f1), f2 = TREE_CHAIN (f2))
+ {
+ /* Different field kinds are not compatible. */
+ if (TREE_CODE (f1) != TREE_CODE (f2))
+ goto different_types;
+ /* Field decls must have the same name and offset. */
+ if (TREE_CODE (f1) == FIELD_DECL
+ && (DECL_NONADDRESSABLE_P (f1) != DECL_NONADDRESSABLE_P (f2)
+ || !gimple_compare_field_offset (f1, f2)))
+ goto different_types;
+ /* All entities should have the same name and type. */
+ if (DECL_NAME (f1) != DECL_NAME (f2)
+ || !gtc_visit (TREE_TYPE (f1), TREE_TYPE (f2),
+ state, sccstack, sccstate, sccstate_obstack))
+ goto different_types;
+ }
+
+ /* If one aggregate has more fields than the other, they
+ are not the same. */
+ if (f1 || f2)
+ goto different_types;
+
+ goto same_types;
+ }
+
+ default:
+ gcc_unreachable ();
+ }
+
+ /* Common exit path for types that are not compatible. */
+different_types:
+ state->u.same_p = 0;
+ goto pop;
+
+ /* Common exit path for types that are compatible. */
+same_types:
+ gcc_assert (state->u.same_p == 1);
+
+pop:
+ if (state->low == state->dfsnum)
+ {
+ type_pair_t x;
+
+ /* Pop off the SCC and set its cache values to the final
+ comparison result. */
+ do
+ {
+ struct sccs *cstate;
+ x = VEC_pop (type_pair_t, *sccstack);
+ cstate = (struct sccs *)*pointer_map_contains (sccstate, x);
+ cstate->on_sccstack = false;
+ x->same_p = state->u.same_p;
+ }
+ while (x != p);
+ }
+
+ return state->u.same_p;
+}
+
+/* Return true iff T1 and T2 are structurally identical. When
+ FOR_MERGING_P is true the an incomplete type and a complete type
+ are considered different, otherwise they are considered compatible. */
+
+static bool
+gimple_types_compatible_p (tree t1, tree t2)
+{
+ VEC(type_pair_t, heap) *sccstack = NULL;
+ struct pointer_map_t *sccstate;
+ struct obstack sccstate_obstack;
+ type_pair_t p = NULL;
+ bool res;
+ tree leader1, leader2;
+
+ /* Before starting to set up the SCC machinery handle simple cases. */
+
+ /* Check first for the obvious case of pointer identity. */
+ if (t1 == t2)
+ return true;
+
+ /* Check that we have two types to compare. */
+ if (t1 == NULL_TREE || t2 == NULL_TREE)
+ return false;
+
+ /* Can't be the same type if the types don't have the same code. */
+ if (TREE_CODE (t1) != TREE_CODE (t2))
+ return false;
+
+ /* Can't be the same type if they have different CV qualifiers. */
+ if (TYPE_QUALS (t1) != TYPE_QUALS (t2))
+ return false;
+
+ if (TREE_ADDRESSABLE (t1) != TREE_ADDRESSABLE (t2))
+ return false;
+
+ /* Void types and nullptr types are always the same. */
+ if (TREE_CODE (t1) == VOID_TYPE
+ || TREE_CODE (t1) == NULLPTR_TYPE)
+ return true;
+
+ /* Can't be the same type if they have different alignment or mode. */
+ if (TYPE_ALIGN (t1) != TYPE_ALIGN (t2)
+ || TYPE_MODE (t1) != TYPE_MODE (t2))
+ return false;
+
+ /* Do some simple checks before doing three hashtable queries. */
+ if (INTEGRAL_TYPE_P (t1)
+ || SCALAR_FLOAT_TYPE_P (t1)
+ || FIXED_POINT_TYPE_P (t1)
+ || TREE_CODE (t1) == VECTOR_TYPE
+ || TREE_CODE (t1) == COMPLEX_TYPE
+ || TREE_CODE (t1) == OFFSET_TYPE
+ || POINTER_TYPE_P (t1))
+ {
+ /* Can't be the same type if they have different sign or precision. */
+ if (TYPE_PRECISION (t1) != TYPE_PRECISION (t2)
+ || TYPE_UNSIGNED (t1) != TYPE_UNSIGNED (t2))
+ return false;
+
+ if (TREE_CODE (t1) == INTEGER_TYPE
+ && TYPE_STRING_FLAG (t1) != TYPE_STRING_FLAG (t2))
+ return false;
+
+ /* That's all we need to check for float and fixed-point types. */
+ if (SCALAR_FLOAT_TYPE_P (t1)
+ || FIXED_POINT_TYPE_P (t1))
+ return true;
+
+ /* For other types fall through to more complex checks. */
+ }
+
+ /* If the types have been previously registered and found equal
+ they still are. */
+ leader1 = gimple_lookup_type_leader (t1);
+ leader2 = gimple_lookup_type_leader (t2);
+ if (leader1 == t2
+ || t1 == leader2
+ || (leader1 && leader1 == leader2))
+ return true;
+
+ /* If the hash values of t1 and t2 are different the types can't
+ possibly be the same. This helps keeping the type-pair hashtable
+ small, only tracking comparisons for hash collisions. */
+ if (gimple_type_hash (t1) != gimple_type_hash (t2))
+ return false;
+
+ /* If we've visited this type pair before (in the case of aggregates
+ with self-referential types), and we made a decision, return it. */
+ p = lookup_type_pair (t1, t2);
+ if (p->same_p == 0 || p->same_p == 1)
+ {
+ /* We have already decided whether T1 and T2 are the
+ same, return the cached result. */
+ return p->same_p == 1;
+ }
+
+ /* Now set up the SCC machinery for the comparison. */
+ gtc_next_dfs_num = 1;
+ sccstate = pointer_map_create ();
+ gcc_obstack_init (&sccstate_obstack);
+ res = gimple_types_compatible_p_1 (t1, t2, p,
+ &sccstack, sccstate, &sccstate_obstack);
+ VEC_free (type_pair_t, heap, sccstack);
+ pointer_map_destroy (sccstate);
+ obstack_free (&sccstate_obstack, NULL);
+
+ return res;
+}
+
+static hashval_t
+iterative_hash_gimple_type (tree, hashval_t, VEC(tree, heap) **,
+ struct pointer_map_t *, struct obstack *);
+
+/* DFS visit the edge from the callers type with state *STATE to T.
+ Update the callers type hash V with the hash for T if it is not part
+ of the SCC containing the callers type and return it.
+ SCCSTACK, SCCSTATE and SCCSTATE_OBSTACK are state for the DFS walk done. */
+
+static hashval_t
+visit (tree t, struct sccs *state, hashval_t v,
+ VEC (tree, heap) **sccstack,
+ struct pointer_map_t *sccstate,
+ struct obstack *sccstate_obstack)
+{
+ struct sccs *cstate = NULL;
+ struct tree_int_map m;
+ void **slot;
+
+ /* If there is a hash value recorded for this type then it can't
+ possibly be part of our parent SCC. Simply mix in its hash. */
+ m.base.from = t;
+ if ((slot = htab_find_slot (type_hash_cache, &m, NO_INSERT))
+ && *slot)
+ return iterative_hash_hashval_t (((struct tree_int_map *) *slot)->to, v);
+
+ if ((slot = pointer_map_contains (sccstate, t)) != NULL)
+ cstate = (struct sccs *)*slot;
+ if (!cstate)
+ {
+ hashval_t tem;
+ /* Not yet visited. DFS recurse. */
+ tem = iterative_hash_gimple_type (t, v,
+ sccstack, sccstate, sccstate_obstack);
+ if (!cstate)
+ cstate = (struct sccs *)* pointer_map_contains (sccstate, t);
+ state->low = MIN (state->low, cstate->low);
+ /* If the type is no longer on the SCC stack and thus is not part
+ of the parents SCC mix in its hash value. Otherwise we will
+ ignore the type for hashing purposes and return the unaltered
+ hash value. */
+ if (!cstate->on_sccstack)
+ return tem;
+ }
+ if (cstate->dfsnum < state->dfsnum
+ && cstate->on_sccstack)
+ state->low = MIN (cstate->dfsnum, state->low);
+
+ /* We are part of our parents SCC, skip this type during hashing
+ and return the unaltered hash value. */
+ return v;
+}
+
+/* Hash NAME with the previous hash value V and return it. */
+
+static hashval_t
+iterative_hash_name (tree name, hashval_t v)
+{
+ if (!name)
+ return v;
+ v = iterative_hash_hashval_t (TREE_CODE (name), v);
+ if (TREE_CODE (name) == TYPE_DECL)
+ name = DECL_NAME (name);
+ if (!name)
+ return v;
+ gcc_assert (TREE_CODE (name) == IDENTIFIER_NODE);
+ return iterative_hash_object (IDENTIFIER_HASH_VALUE (name), v);
+}
+
+/* A type, hashvalue pair for sorting SCC members. */
+
+struct type_hash_pair {
+ tree type;
+ hashval_t hash;
+};
+
+/* Compare two type, hashvalue pairs. */
+
+static int
+type_hash_pair_compare (const void *p1_, const void *p2_)
+{
+ const struct type_hash_pair *p1 = (const struct type_hash_pair *) p1_;
+ const struct type_hash_pair *p2 = (const struct type_hash_pair *) p2_;
+ if (p1->hash < p2->hash)
+ return -1;
+ else if (p1->hash > p2->hash)
+ return 1;
+ return 0;
+}
+
+/* Returning a hash value for gimple type TYPE combined with VAL.
+ SCCSTACK, SCCSTATE and SCCSTATE_OBSTACK are state for the DFS walk done.
+
+ To hash a type we end up hashing in types that are reachable.
+ Through pointers we can end up with cycles which messes up the
+ required property that we need to compute the same hash value
+ for structurally equivalent types. To avoid this we have to
+ hash all types in a cycle (the SCC) in a commutative way. The
+ easiest way is to not mix in the hashes of the SCC members at
+ all. To make this work we have to delay setting the hash
+ values of the SCC until it is complete. */
+
+static hashval_t
+iterative_hash_gimple_type (tree type, hashval_t val,
+ VEC(tree, heap) **sccstack,
+ struct pointer_map_t *sccstate,
+ struct obstack *sccstate_obstack)
+{
+ hashval_t v;
+ void **slot;
+ struct sccs *state;
+
+ /* Not visited during this DFS walk. */
+ gcc_checking_assert (!pointer_map_contains (sccstate, type));
+ state = XOBNEW (sccstate_obstack, struct sccs);
+ *pointer_map_insert (sccstate, type) = state;
+
+ VEC_safe_push (tree, heap, *sccstack, type);
+ state->dfsnum = next_dfs_num++;
+ state->low = state->dfsnum;
+ state->on_sccstack = true;
+
+ /* Combine a few common features of types so that types are grouped into
+ smaller sets; when searching for existing matching types to merge,
+ only existing types having the same features as the new type will be
+ checked. */
+ v = iterative_hash_name (TYPE_NAME (type), 0);
+ if (TYPE_NAME (type)
+ && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
+ && DECL_CONTEXT (TYPE_NAME (type))
+ && TYPE_P (DECL_CONTEXT (TYPE_NAME (type))))
+ v = visit (DECL_CONTEXT (TYPE_NAME (type)), state, v,
+ sccstack, sccstate, sccstate_obstack);
+ v = iterative_hash_hashval_t (TREE_CODE (type), v);
+ v = iterative_hash_hashval_t (TYPE_QUALS (type), v);
+ v = iterative_hash_hashval_t (TREE_ADDRESSABLE (type), v);
+
+ /* Do not hash the types size as this will cause differences in
+ hash values for the complete vs. the incomplete type variant. */
+
+ /* Incorporate common features of numerical types. */
+ if (INTEGRAL_TYPE_P (type)
+ || SCALAR_FLOAT_TYPE_P (type)
+ || FIXED_POINT_TYPE_P (type))
+ {
+ v = iterative_hash_hashval_t (TYPE_PRECISION (type), v);
+ v = iterative_hash_hashval_t (TYPE_MODE (type), v);
+ v = iterative_hash_hashval_t (TYPE_UNSIGNED (type), v);
+ }
+
+ /* For pointer and reference types, fold in information about the type
+ pointed to. */
+ if (POINTER_TYPE_P (type))
+ v = visit (TREE_TYPE (type), state, v,
+ sccstack, sccstate, sccstate_obstack);
+
+ /* For integer types hash the types min/max values and the string flag. */
+ if (TREE_CODE (type) == INTEGER_TYPE)
+ {
+ /* OMP lowering can introduce error_mark_node in place of
+ random local decls in types. */
+ if (TYPE_MIN_VALUE (type) != error_mark_node)
+ v = iterative_hash_expr (TYPE_MIN_VALUE (type), v);
+ if (TYPE_MAX_VALUE (type) != error_mark_node)
+ v = iterative_hash_expr (TYPE_MAX_VALUE (type), v);
+ v = iterative_hash_hashval_t (TYPE_STRING_FLAG (type), v);
+ }
+
+ /* For array types hash the domain and the string flag. */
+ if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type))
+ {
+ v = iterative_hash_hashval_t (TYPE_STRING_FLAG (type), v);
+ v = visit (TYPE_DOMAIN (type), state, v,
+ sccstack, sccstate, sccstate_obstack);
+ }
+
+ /* Recurse for aggregates with a single element type. */
+ if (TREE_CODE (type) == ARRAY_TYPE
+ || TREE_CODE (type) == COMPLEX_TYPE
+ || TREE_CODE (type) == VECTOR_TYPE)
+ v = visit (TREE_TYPE (type), state, v,
+ sccstack, sccstate, sccstate_obstack);
+
+ /* Incorporate function return and argument types. */
+ if (TREE_CODE (type) == FUNCTION_TYPE || TREE_CODE (type) == METHOD_TYPE)
+ {
+ unsigned na;
+ tree p;
+
+ /* For method types also incorporate their parent class. */
+ if (TREE_CODE (type) == METHOD_TYPE)
+ v = visit (TYPE_METHOD_BASETYPE (type), state, v,
+ sccstack, sccstate, sccstate_obstack);
+
+ /* Check result and argument types. */
+ v = visit (TREE_TYPE (type), state, v,
+ sccstack, sccstate, sccstate_obstack);
+ for (p = TYPE_ARG_TYPES (type), na = 0; p; p = TREE_CHAIN (p))
+ {
+ v = visit (TREE_VALUE (p), state, v,
+ sccstack, sccstate, sccstate_obstack);
+ na++;
+ }
+
+ v = iterative_hash_hashval_t (na, v);
+ }
+
+ if (RECORD_OR_UNION_TYPE_P (type))
+ {
+ unsigned nf;
+ tree f;
+
+ for (f = TYPE_FIELDS (type), nf = 0; f; f = TREE_CHAIN (f))
+ {
+ v = iterative_hash_name (DECL_NAME (f), v);
+ v = visit (TREE_TYPE (f), state, v,
+ sccstack, sccstate, sccstate_obstack);
+ nf++;
+ }
+
+ v = iterative_hash_hashval_t (nf, v);
+ }
+
+ /* Record hash for us. */
+ state->u.hash = v;
+
+ /* See if we found an SCC. */
+ if (state->low == state->dfsnum)
+ {
+ tree x;
+ struct tree_int_map *m;
+
+ /* Pop off the SCC and set its hash values. */
+ x = VEC_pop (tree, *sccstack);
+ /* Optimize SCC size one. */
+ if (x == type)
+ {
+ state->on_sccstack = false;
+ m = ggc_alloc_cleared_tree_int_map ();
+ m->base.from = x;
+ m->to = v;
+ slot = htab_find_slot (type_hash_cache, m, INSERT);
+ gcc_assert (!*slot);
+ *slot = (void *) m;
+ }
+ else
+ {
+ struct sccs *cstate;
+ unsigned first, i, size, j;
+ struct type_hash_pair *pairs;
+ /* Pop off the SCC and build an array of type, hash pairs. */
+ first = VEC_length (tree, *sccstack) - 1;
+ while (VEC_index (tree, *sccstack, first) != type)
+ --first;
+ size = VEC_length (tree, *sccstack) - first + 1;
+ pairs = XALLOCAVEC (struct type_hash_pair, size);
+ i = 0;
+ cstate = (struct sccs *)*pointer_map_contains (sccstate, x);
+ cstate->on_sccstack = false;
+ pairs[i].type = x;
+ pairs[i].hash = cstate->u.hash;
+ do
+ {
+ x = VEC_pop (tree, *sccstack);
+ cstate = (struct sccs *)*pointer_map_contains (sccstate, x);
+ cstate->on_sccstack = false;
+ ++i;
+ pairs[i].type = x;
+ pairs[i].hash = cstate->u.hash;
+ }
+ while (x != type);
+ gcc_assert (i + 1 == size);
+ /* Sort the arrays of type, hash pairs so that when we mix in
+ all members of the SCC the hash value becomes independent on
+ the order we visited the SCC. Disregard hashes equal to
+ the hash of the type we mix into because we cannot guarantee
+ a stable sort for those across different TUs. */
+ qsort (pairs, size, sizeof (struct type_hash_pair),
+ type_hash_pair_compare);
+ for (i = 0; i < size; ++i)
+ {
+ hashval_t hash;
+ m = ggc_alloc_cleared_tree_int_map ();
+ m->base.from = pairs[i].type;
+ hash = pairs[i].hash;
+ /* Skip same hashes. */
+ for (j = i + 1; j < size && pairs[j].hash == pairs[i].hash; ++j)
+ ;
+ for (; j < size; ++j)
+ hash = iterative_hash_hashval_t (pairs[j].hash, hash);
+ for (j = 0; pairs[j].hash != pairs[i].hash; ++j)
+ hash = iterative_hash_hashval_t (pairs[j].hash, hash);
+ m->to = hash;
+ if (pairs[i].type == type)
+ v = hash;
+ slot = htab_find_slot (type_hash_cache, m, INSERT);
+ gcc_assert (!*slot);
+ *slot = (void *) m;
+ }
+ }
+ }
+
+ return iterative_hash_hashval_t (v, val);
+}
+
+/* Returns a hash value for P (assumed to be a type). The hash value
+ is computed using some distinguishing features of the type. Note
+ that we cannot use pointer hashing here as we may be dealing with
+ two distinct instances of the same type.
+
+ This function should produce the same hash value for two compatible
+ types according to gimple_types_compatible_p. */
+
+static hashval_t
+gimple_type_hash (const void *p)
+{
+ const_tree t = (const_tree) p;
+ VEC(tree, heap) *sccstack = NULL;
+ struct pointer_map_t *sccstate;
+ struct obstack sccstate_obstack;
+ hashval_t val;
+ void **slot;
+ struct tree_int_map m;
+
+ m.base.from = CONST_CAST_TREE (t);
+ if ((slot = htab_find_slot (type_hash_cache, &m, NO_INSERT))
+ && *slot)
+ return iterative_hash_hashval_t (((struct tree_int_map *) *slot)->to, 0);
+
+ /* Perform a DFS walk and pre-hash all reachable types. */
+ next_dfs_num = 1;
+ sccstate = pointer_map_create ();
+ gcc_obstack_init (&sccstate_obstack);
+ val = iterative_hash_gimple_type (CONST_CAST_TREE (t), 0,
+ &sccstack, sccstate, &sccstate_obstack);
+ VEC_free (tree, heap, sccstack);
+ pointer_map_destroy (sccstate);
+ obstack_free (&sccstate_obstack, NULL);
+
+ return val;
+}
+
+/* Returns nonzero if P1 and P2 are equal. */
+
+static int
+gimple_type_eq (const void *p1, const void *p2)
+{
+ const_tree t1 = (const_tree) p1;
+ const_tree t2 = (const_tree) p2;
+ return gimple_types_compatible_p (CONST_CAST_TREE (t1),
+ CONST_CAST_TREE (t2));
+}
+
+
+/* Worker for gimple_register_type.
+ Register type T in the global type table gimple_types.
+ When REGISTERING_MV is false first recurse for the main variant of T. */
+
+static tree
+gimple_register_type_1 (tree t, bool registering_mv)
+{
+ void **slot;
+ gimple_type_leader_entry *leader;
+
+ /* If we registered this type before return the cached result. */
+ leader = &gimple_type_leader[TYPE_UID (t) % GIMPLE_TYPE_LEADER_SIZE];
+ if (leader->type == t)
+ return leader->leader;
+
+ /* Always register the main variant first. This is important so we
+ pick up the non-typedef variants as canonical, otherwise we'll end
+ up taking typedef ids for structure tags during comparison.
+ It also makes sure that main variants will be merged to main variants.
+ As we are operating on a possibly partially fixed up type graph
+ do not bother to recurse more than once, otherwise we may end up
+ walking in circles.
+ If we are registering a main variant it will either remain its
+ own main variant or it will be merged to something else in which
+ case we do not care for the main variant leader. */
+ if (!registering_mv
+ && TYPE_MAIN_VARIANT (t) != t)
+ gimple_register_type_1 (TYPE_MAIN_VARIANT (t), true);
+
+ /* See if we already have an equivalent type registered. */
+ slot = htab_find_slot (gimple_types, t, INSERT);
+ if (*slot
+ && *(tree *)slot != t)
+ {
+ tree new_type = (tree) *((tree *) slot);
+ leader->type = t;
+ leader->leader = new_type;
+ return new_type;
+ }
+
+ /* If not, insert it to the cache and the hash. */
+ leader->type = t;
+ leader->leader = t;
+ *slot = (void *) t;
+ return t;
+}
+
+/* Register type T in the global type table gimple_types.
+ If another type T', compatible with T, already existed in
+ gimple_types then return T', otherwise return T. This is used by
+ LTO to merge identical types read from different TUs. */
+
+static tree
+gimple_register_type (tree t)
+{
+ gcc_assert (TYPE_P (t));
+ return gimple_register_type_1 (t, false);
+}
+
+#define GIMPLE_REGISTER_TYPE(tt) \
+ (TREE_VISITED (tt) ? gimple_register_type (tt) : tt)
+
+
+
/* A hashtable of trees that potentially refer to variables or functions
that must be replaced with their prevailing variant. */
static GTY((if_marked ("ggc_marked_p"), param_is (union tree_node))) htab_t
@@ -289,9 +1398,6 @@ remember_with_vars (tree t)
*(tree *) htab_find_slot (tree_with_vars, t, INSERT) = t;
}
-#define GIMPLE_REGISTER_TYPE(tt) \
- (TREE_VISITED (tt) ? gimple_register_type (tt) : tt)
-
#define LTO_FIXUP_TREE(tt) \
do \
{ \
@@ -744,6 +1850,7 @@ uniquify_nodes (struct data_in *data_in, unsigned from)
variant list state before fixup is broken. */
tree tem, mv;
+#ifdef ENABLE_CHECKING
/* Remove us from our main variant list if we are not the
variant leader. */
if (TYPE_MAIN_VARIANT (t) != t)
@@ -751,10 +1858,9 @@ uniquify_nodes (struct data_in *data_in, unsigned from)
tem = TYPE_MAIN_VARIANT (t);
while (tem && TYPE_NEXT_VARIANT (tem) != t)
tem = TYPE_NEXT_VARIANT (tem);
- if (tem)
- TYPE_NEXT_VARIANT (tem) = TYPE_NEXT_VARIANT (t);
- TYPE_NEXT_VARIANT (t) = NULL_TREE;
+ gcc_assert (!tem && !TYPE_NEXT_VARIANT (t));
}
+#endif
/* Query our new main variant. */
mv = GIMPLE_REGISTER_TYPE (TYPE_MAIN_VARIANT (t));
@@ -1498,11 +2604,28 @@ lto_wpa_write_files (void)
fprintf (cgraph_dump_file, "Writing partition %s to file %s, %i insns\n",
part->name, temp_filename, part->insns);
+ fprintf (cgraph_dump_file, " Symbols in partition: ");
for (lsei = lsei_start_in_partition (part->encoder); !lsei_end_p (lsei);
lsei_next_in_partition (&lsei))
{
symtab_node node = lsei_node (lsei);
- fprintf (cgraph_dump_file, "%s ", symtab_node_name (node));
+ fprintf (cgraph_dump_file, "%s ", symtab_node_asm_name (node));
+ }
+ fprintf (cgraph_dump_file, "\n Symbols in boundary: ");
+ for (lsei = lsei_start (part->encoder); !lsei_end_p (lsei);
+ lsei_next (&lsei))
+ {
+ symtab_node node = lsei_node (lsei);
+ if (!lto_symtab_encoder_in_partition_p (part->encoder, node))
+ {
+ fprintf (cgraph_dump_file, "%s ", symtab_node_asm_name (node));
+ if (symtab_function_p (node)
+ && lto_symtab_encoder_encode_body_p (part->encoder, cgraph (node)))
+ fprintf (cgraph_dump_file, "(body included)");
+ else if (symtab_variable_p (node)
+ && lto_symtab_encoder_encode_initializer_p (part->encoder, varpool (node)))
+ fprintf (cgraph_dump_file, "(initializer included)");
+ }
}
fprintf (cgraph_dump_file, "\n");
}
@@ -1765,6 +2888,12 @@ read_cgraph_and_symbols (unsigned nfiles, const char **fnames)
tree_with_vars = htab_create_ggc (101, htab_hash_pointer, htab_eq_pointer,
NULL);
+ type_hash_cache = htab_create_ggc (512, tree_int_map_hash,
+ tree_int_map_eq, NULL);
+ type_pair_cache = XCNEWVEC (struct type_pair_d, GIMPLE_TYPE_PAIR_SIZE);
+ gimple_type_leader = ggc_alloc_cleared_vec_gimple_type_leader_entry_s
+ (GIMPLE_TYPE_LEADER_SIZE);
+ gimple_types = htab_create_ggc (16381, gimple_type_hash, gimple_type_eq, 0);
if (!quiet_flag)
fprintf (stderr, "Reading object files:");
@@ -1835,6 +2964,13 @@ read_cgraph_and_symbols (unsigned nfiles, const char **fnames)
lto_fixup_decls (all_file_decl_data);
htab_delete (tree_with_vars);
tree_with_vars = NULL;
+ htab_delete (gimple_types);
+ gimple_types = NULL;
+ htab_delete (type_hash_cache);
+ type_hash_cache = NULL;
+ free (type_pair_cache);
+ type_pair_cache = NULL;
+ gimple_type_leader = NULL;
free_gimple_type_tables ();
ggc_collect ();
@@ -1936,12 +3072,46 @@ materialize_cgraph (void)
}
+/* Show various memory usage statistics related to LTO. */
+static void
+print_lto_report_1 (void)
+{
+ const char *pfx = (flag_lto) ? "LTO" : (flag_wpa) ? "WPA" : "LTRANS";
+ fprintf (stderr, "%s statistics\n", pfx);
+
+ if (gimple_types)
+ fprintf (stderr, "[%s] GIMPLE type table: size %ld, %ld elements, "
+ "%ld searches, %ld collisions (ratio: %f)\n", pfx,
+ (long) htab_size (gimple_types),
+ (long) htab_elements (gimple_types),
+ (long) gimple_types->searches,
+ (long) gimple_types->collisions,
+ htab_collisions (gimple_types));
+ else
+ fprintf (stderr, "[%s] GIMPLE type table is empty\n", pfx);
+ if (type_hash_cache)
+ fprintf (stderr, "[%s] GIMPLE type hash table: size %ld, %ld elements, "
+ "%ld searches, %ld collisions (ratio: %f)\n", pfx,
+ (long) htab_size (type_hash_cache),
+ (long) htab_elements (type_hash_cache),
+ (long) type_hash_cache->searches,
+ (long) type_hash_cache->collisions,
+ htab_collisions (type_hash_cache));
+ else
+ fprintf (stderr, "[%s] GIMPLE type hash table is empty\n", pfx);
+
+ print_gimple_types_stats (pfx);
+ print_lto_report (pfx);
+}
+
/* Perform whole program analysis (WPA) on the callgraph and write out the
optimization plan. */
static void
do_whole_program_analysis (void)
{
+ symtab_node node;
+
timevar_start (TV_PHASE_OPT_GEN);
/* Note that since we are in WPA mode, materialize_cgraph will not
@@ -1976,17 +3146,31 @@ do_whole_program_analysis (void)
dump_cgraph (cgraph_dump_file);
dump_varpool (cgraph_dump_file);
}
+#ifdef ENABLE_CHECKING
verify_cgraph ();
+#endif
bitmap_obstack_release (NULL);
/* We are about to launch the final LTRANS phase, stop the WPA timer. */
timevar_pop (TV_WHOPR_WPA);
+ timevar_push (TV_WHOPR_PARTITIONING);
if (flag_lto_partition_1to1)
lto_1_to_1_map ();
+ else if (flag_lto_partition_max)
+ lto_max_map ();
else
lto_balanced_map ();
+ /* AUX pointers are used by partitioning code to bookkeep number of
+ partitions symbol is in. This is no longer needed. */
+ FOR_EACH_SYMBOL (node)
+ node->symbol.aux = NULL;
+
+ lto_stats.num_cgraph_partitions += VEC_length (ltrans_partition,
+ ltrans_partitions);
+ timevar_pop (TV_WHOPR_PARTITIONING);
+
timevar_stop (TV_PHASE_OPT_GEN);
timevar_start (TV_PHASE_STREAM_OUT);
@@ -2010,7 +3194,7 @@ do_whole_program_analysis (void)
/* Show the LTO report before launching LTRANS. */
if (flag_lto_report)
- print_lto_report ();
+ print_lto_report_1 ();
if (mem_report_wpa)
dump_memory_report (true);
}
@@ -2136,7 +3320,7 @@ lto_main (void)
launched directly by the driver we would not need to do
this. */
if (flag_lto_report)
- print_lto_report ();
+ print_lto_report_1 ();
}
}
diff --git a/gcc/melt-runtime.c b/gcc/melt-runtime.c
index 9c85c07fbf1..10c317b5b2f 100644
--- a/gcc/melt-runtime.c
+++ b/gcc/melt-runtime.c
@@ -9077,7 +9077,7 @@ melt_load_module_index (const char*srcbase, const char*flavor, char**errorp)
minf.mmi_modpath = xstrdup (sopath);
minf.mmi_startrout = MELTDESCR_REQUIRED (melt_start_this_module);
minf.mmi_magic = MELT_MODULE_MAGIC;
- VEC_safe_push (melt_module_info_t, heap, melt_modinfvec, &minf);
+ VEC_safe_push (melt_module_info_t, heap, melt_modinfvec, minf);
debugeprintf ("melt_load_module_index successful ix %d srcbase %s sopath %s flavor %s",
ix, srcbase, sopath, flavor);
if (!quiet_flag || melt_flag_debug) {
@@ -9303,10 +9303,11 @@ meltgc_run_c_extension (melt_ptr_t basename_p, melt_ptr_t env_p, melt_ptr_t litv
int ix = 0;
if (!melt_extinfvec)
{
+ melt_extension_info_t emptymei = {0};
melt_extinfvec = VEC_alloc (melt_extension_info_t, heap, 32);
/* don't use the index 0 so push a null at 0 in modextvec. */
VEC_safe_push (melt_extension_info_t, heap, melt_extinfvec,
- (melt_extension_info_t *) 0);
+ emptymei);
}
ix = VEC_length (melt_extension_info_t, melt_extinfvec);
gcc_assert (ix > 0);
@@ -9315,7 +9316,7 @@ meltgc_run_c_extension (melt_ptr_t basename_p, melt_ptr_t env_p, melt_ptr_t litv
mext.mmx_extpath = xstrdup (sopath);
mext.mmx_rank = ix;
mext.mmx_magic = MELT_EXTENSION_MAGIC;
- VEC_safe_push (melt_extension_info_t, heap, melt_extinfvec, &mext);
+ VEC_safe_push (melt_extension_info_t, heap, melt_extinfvec, mext);
debugeprintf ("meltgc_run_c_extension %s has index %d",
basenamebuf, ix);
}
@@ -10602,13 +10603,18 @@ melt_really_initialize (const char* pluginame, const char*versionstr)
if (melt_minorsizekilow == 0) {
const char* minzstr = melt_argument ("minor-zone");
melt_minorsizekilow = minzstr ? (atol (minzstr)) : 0;
- if (melt_minorsizekilow<256) melt_minorsizekilow=256;
- else if (melt_minorsizekilow>16384) melt_minorsizekilow=16384;
+ if (melt_minorsizekilow < 256)
+ melt_minorsizekilow = 256;
+ else if (melt_minorsizekilow > 32768)
+ melt_minorsizekilow = 32768;
}
melt_modinfvec = VEC_alloc (melt_module_info_t, heap, 32);
- /* don't use the index 0 so push a null at 0 in modinfvec. */
- VEC_safe_push (melt_module_info_t, heap, melt_modinfvec,
- (melt_module_info_t *) 0);
+ /* don't use the index 0 so push an empty at 0 in modinfvec. */
+ {
+ melt_module_info_t emptymi = {0};
+ VEC_safe_push (melt_module_info_t, heap, melt_modinfvec,
+ emptymi);
+ }
/* The program handle dlopen is not traced! */
proghandle = dlopen (NULL, RTLD_NOW | RTLD_GLOBAL);
if (!proghandle)
diff --git a/gcc/objc/objc-next-runtime-abi-02.c b/gcc/objc/objc-next-runtime-abi-02.c
index 4f47a579087..cf899d379bd 100644
--- a/gcc/objc/objc-next-runtime-abi-02.c
+++ b/gcc/objc/objc-next-runtime-abi-02.c
@@ -1068,7 +1068,7 @@ objc_v2_get_class_reference (tree ident)
decl = build_v2_class_reference_decl (ident);
e.ident = ident;
e.data = decl;
- VEC_safe_push (ident_data_tuple, gc, classrefs, &e);
+ VEC_safe_push (ident_data_tuple, gc, classrefs, e);
return decl;
}
@@ -1233,7 +1233,7 @@ build_v2_selector_messenger_reference (tree sel_name, tree message_func_decl)
e.func = message_func_decl;
e.selname = sel_name;
e.refdecl = decl;
- VEC_safe_push (msgref_entry, gc, msgrefs, &e);
+ VEC_safe_push (msgref_entry, gc, msgrefs, e);
return decl;
}
@@ -1290,7 +1290,7 @@ objc_v2_get_protocol_reference (tree ident)
decl = build_v2_protocollist_ref_decl (ident);
e.id = ident;
e.refdecl = decl;
- VEC_safe_push (prot_list_entry, gc, protrefs, &e);
+ VEC_safe_push (prot_list_entry, gc, protrefs, e);
return decl;
}
@@ -1476,7 +1476,7 @@ next_runtime_abi_02_get_class_super_ref (location_t loc ATTRIBUTE_UNUSED,
decl = build_v2_superclass_ref_decl (id, inst_meth);
e.ident = id;
e.data = decl;
- VEC_safe_push (ident_data_tuple, gc, list, &e);
+ VEC_safe_push (ident_data_tuple, gc, list, e);
return decl;
}
@@ -2126,7 +2126,7 @@ objc_add_to_protocol_list (tree protocol_interface_decl, tree protocol_decl)
protlist = VEC_alloc (prot_list_entry, gc, 32);
e.id = protocol_interface_decl;
e.refdecl = protocol_decl;
- VEC_safe_push (prot_list_entry, gc, protlist, &e);
+ VEC_safe_push (prot_list_entry, gc, protlist, e);
}
/* Build the __protocol_list section table containing address of all
@@ -2806,7 +2806,7 @@ ivar_offset_ref (tree class_name, tree field_decl)
e.decl = decl;
e.offset = byte_position (field_decl);
- VEC_safe_push (ivarref_entry, gc, ivar_offset_refs, &e);
+ VEC_safe_push (ivarref_entry, gc, ivar_offset_refs, e);
return decl;
}
@@ -3082,7 +3082,7 @@ objc_v2_add_to_ehtype_list (tree name)
/* Not found, or new list. */
e.ident = name;
e.data = NULL_TREE;
- VEC_safe_push (ident_data_tuple, gc, ehtype_list, &e);
+ VEC_safe_push (ident_data_tuple, gc, ehtype_list, e);
}
static void
diff --git a/gcc/opts-common.c b/gcc/opts-common.c
index 354bce07dc2..e024537fa0f 100644
--- a/gcc/opts-common.c
+++ b/gcc/opts-common.c
@@ -1144,12 +1144,8 @@ set_option (struct gcc_options *opts, struct gcc_options *opts_set,
{
VEC(cl_deferred_option,heap) *vec
= (VEC(cl_deferred_option,heap) *) *(void **) flag_var;
- cl_deferred_option *p;
-
- p = VEC_safe_push (cl_deferred_option, heap, vec, NULL);
- p->opt_index = opt_index;
- p->arg = arg;
- p->value = value;
+ cl_deferred_option p = {opt_index, arg, value};
+ VEC_safe_push (cl_deferred_option, heap, vec, p);
*(void **) flag_var = vec;
if (set_flag_var)
*(void **) set_flag_var = vec;
diff --git a/gcc/params.def b/gcc/params.def
index df2df283517..59b64c5c452 100644
--- a/gcc/params.def
+++ b/gcc/params.def
@@ -909,6 +909,12 @@ DEFPARAM (PARAM_IPA_CP_EVAL_THRESHOLD,
"beneficial to clone.",
500, 0, 0)
+DEFPARAM (PARAM_IPA_MAX_AGG_ITEMS,
+ "ipa-max-agg-items",
+ "Maximum number of aggregate content items for a parameter in "
+ "jump functions and lattices",
+ 16, 0, 0)
+
/* WHOPR partitioning configuration. */
DEFPARAM (PARAM_LTO_PARTITIONS,
@@ -997,6 +1003,13 @@ DEFPARAM (PARAM_SCHED_PRESSURE_ALGORITHM,
"Which -fsched-pressure algorithm to apply",
1, 1, 2)
+/* Maximum length of candidate scans in straight-line strength reduction. */
+DEFPARAM (PARAM_MAX_SLSR_CANDIDATE_SCAN,
+ "max-slsr-cand-scan",
+ "Maximum length of candidate scans for straight-line "
+ "strength reduction",
+ 50, 1, 999999)
+
/*
Local variables:
mode:c
diff --git a/gcc/passes.c b/gcc/passes.c
index 9644d63e587..cc766d95b55 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -1297,11 +1297,11 @@ init_optimization_passes (void)
NEXT_PASS (pass_remove_cgraph_callee_edges);
NEXT_PASS (pass_rename_ssa_copies);
NEXT_PASS (pass_ccp);
+ /* After CCP we rewrite no longer addressed locals into SSA
+ form if possible. */
NEXT_PASS (pass_forwprop);
/* pass_build_ealias is a dummy pass that ensures that we
- execute TODO_rebuild_alias at this point. Re-building
- alias information also rewrites no longer addressed
- locals into SSA form if possible. */
+ execute TODO_rebuild_alias at this point. */
NEXT_PASS (pass_build_ealias);
NEXT_PASS (pass_sra_early);
NEXT_PASS (pass_fre);
@@ -1371,11 +1371,11 @@ init_optimization_passes (void)
NEXT_PASS (pass_rename_ssa_copies);
NEXT_PASS (pass_complete_unrolli);
NEXT_PASS (pass_ccp);
+ /* After CCP we rewrite no longer addressed locals into SSA
+ form if possible. */
NEXT_PASS (pass_forwprop);
/* pass_build_alias is a dummy pass that ensures that we
- execute TODO_rebuild_alias at this point. Re-building
- alias information also rewrites no longer addressed
- locals into SSA form if possible. */
+ execute TODO_rebuild_alias at this point. */
NEXT_PASS (pass_build_alias);
NEXT_PASS (pass_return_slot);
NEXT_PASS (pass_phiprop);
@@ -1414,6 +1414,8 @@ init_optimization_passes (void)
NEXT_PASS (pass_object_sizes);
NEXT_PASS (pass_strlen);
NEXT_PASS (pass_ccp);
+ /* After CCP we rewrite no longer addressed locals into SSA
+ form if possible. */
NEXT_PASS (pass_copy_prop);
NEXT_PASS (pass_cse_sincos);
NEXT_PASS (pass_optimize_bswap);
@@ -1773,13 +1775,10 @@ execute_function_todo (void *data)
cfun->last_verified &= ~TODO_verify_ssa;
}
- if (flags & TODO_rebuild_alias)
- {
- execute_update_addresses_taken ();
- if (flag_tree_pta)
- compute_may_aliases ();
- }
- else if (optimize && (flags & TODO_update_address_taken))
+ if (flag_tree_pta && (flags & TODO_rebuild_alias))
+ compute_may_aliases ();
+
+ if (optimize && (flags & TODO_update_address_taken))
execute_update_addresses_taken ();
if (flags & TODO_remove_unused_locals)
diff --git a/gcc/po/ChangeLog b/gcc/po/ChangeLog
index 43e37d95cbe..d65b6c4f068 100644
--- a/gcc/po/ChangeLog
+++ b/gcc/po/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-15 Joseph Myers <joseph@codesourcery.com>
+
+ * vi.po: Update.
+
2012-07-05 Joseph Myers <joseph@codesourcery.com>
* hr.po: New.
diff --git a/gcc/po/vi.po b/gcc/po/vi.po
index ba02ee7109d..dec7d2d754b 100644
--- a/gcc/po/vi.po
+++ b/gcc/po/vi.po
@@ -1,16 +1,17 @@
# Vietnamese translation for GCC.
-# Copyright © 2010 Free Software Foundation, Inc.
+# Copyright © 2012 Free Software Foundation, Inc.
# This file is distributed under the same license as the gcc package.
# Clytie Siddall <clytie@riverland.net.au>, 2010.
+# Trần Ngá»c Quân <vnwildman@gmail.com>,2012.
#
msgid ""
msgstr ""
-"Project-Id-Version: gcc 4.5.0\n"
+"Project-Id-Version: gcc 4.7.1\n"
"Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n"
"POT-Creation-Date: 2012-06-13 21:42+0000\n"
-"PO-Revision-Date: 2010-10-13 22:15+1030\n"
-"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
-"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n"
+"PO-Revision-Date: 2012-09-15 08:58+0700\n"
+"Last-Translator: Trần Ngá»c Quân <vnwildman@gmail.com>\n"
+"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
"Language: vi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -21,7 +22,7 @@ msgstr ""
#: c-decl.c:4713 c-typeck.c:5961 toplev.c:1013 c-family/c-pretty-print.c:424
#: cp/error.c:656 cp/error.c:938
msgid "<anonymous>"
-msgstr "<nặc danh>"
+msgstr "<nặc-danh>"
#: c-objc-common.c:173
msgid "({anonymous})"
@@ -30,7 +31,7 @@ msgstr "({nặc danh})"
#: c-parser.c:946 cp/parser.c:22268
#, gcc-internal-format
msgid "expected end of line"
-msgstr "mong đợi kết thúc dòng"
+msgstr "cần kết thúc dòng"
#: c-parser.c:1796 c-parser.c:1810 c-parser.c:4116 c-parser.c:4569
#: c-parser.c:4830 c-parser.c:4988 c-parser.c:5005 c-parser.c:5170
@@ -41,7 +42,7 @@ msgstr "mong đợi kết thúc dòng"
#: cp/parser.c:22214
#, gcc-internal-format
msgid "expected %<;%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<;%>"
#: c-parser.c:1840 c-parser.c:2438 c-parser.c:2729 c-parser.c:2794
#: c-parser.c:3407 c-parser.c:3519 c-parser.c:3524 c-parser.c:4613
@@ -53,13 +54,13 @@ msgstr "mong đợi %<;%>"
#: c-parser.c:8935 c-parser.c:8960 cp/parser.c:22217
#, gcc-internal-format
msgid "expected %<(%>"
-msgstr "mong đợi %<(%>"
+msgstr "cần %<(%>"
#: c-parser.c:1845 c-parser.c:6389 c-parser.c:6427 c-parser.c:6555
#: cp/parser.c:21789 cp/parser.c:22232
#, gcc-internal-format
msgid "expected %<,%>"
-msgstr "mong đợi %<,%>"
+msgstr "cần %<,%>"
#: c-parser.c:1866 c-parser.c:2453 c-parser.c:2765 c-parser.c:2804
#: c-parser.c:3012 c-parser.c:3176 c-parser.c:3238 c-parser.c:3290
@@ -75,80 +76,77 @@ msgstr "mong đợi %<,%>"
#: c-parser.c:9937 c-parser.c:9979 c-parser.c:10725 cp/parser.c:22262
#, gcc-internal-format
msgid "expected %<)%>"
-msgstr "mong đợi %<)%>"
+msgstr "cần %<)%>"
#: c-parser.c:3095 c-parser.c:3904 c-parser.c:3938 c-parser.c:5224
#: c-parser.c:6491 c-parser.c:6760 c-parser.c:6866 c-parser.c:10628
#: c-parser.c:10630 cp/parser.c:22226
#, gcc-internal-format
msgid "expected %<]%>"
-msgstr "mong đợi %<]%>"
+msgstr "cần %<]%>"
#: c-parser.c:3271
msgid "expected %<;%>, %<,%> or %<)%>"
-msgstr "mong đợi %<;%>, %<,%> or %<)%>"
+msgstr "cần %<;%>, %<,%> hoặc %<)%>"
#: c-parser.c:3767 c-parser.c:9776 cp/parser.c:22220 cp/parser.c:24037
#, gcc-internal-format
msgid "expected %<}%>"
-msgstr "mong đợi %<}%>"
+msgstr "cần %<}%>"
#: c-parser.c:4057 c-parser.c:7936 c-parser.c:10222 c-parser.c:2318
#: c-parser.c:2521 c-parser.c:7490 cp/parser.c:14425 cp/parser.c:22223
#, gcc-internal-format
msgid "expected %<{%>"
-msgstr "mong đợi %<{%>"
+msgstr "cần %<{%>"
#: c-parser.c:4276 c-parser.c:4285 c-parser.c:5128 c-parser.c:5469
#: c-parser.c:7701 c-parser.c:8076 c-parser.c:8133 c-parser.c:9148
#: cp/parser.c:22256 cp/parser.c:23258
#, gcc-internal-format
msgid "expected %<:%>"
-msgstr "mong đợi %<:%>"
+msgstr "cần %<:%>"
#: c-parser.c:4824 cp/parser.c:22150
#, gcc-internal-format
msgid "expected %<while%>"
-msgstr "mong đợi %<while%>"
+msgstr "cần %<while%>"
#: c-parser.c:6279
-#, fuzzy
-#| msgid "expected %<;%>"
msgid "expected %<.%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<.%>"
#: c-parser.c:7161 c-parser.c:7193 c-parser.c:7433 cp/parser.c:23821
#: cp/parser.c:23895
#, gcc-internal-format
msgid "expected %<@end%>"
-msgstr "mong đợi %<@end%>"
+msgstr "cần %<@end%>"
#: c-parser.c:7850 cp/parser.c:22241
#, gcc-internal-format
msgid "expected %<>%>"
-msgstr "mong đợi %<>%>"
+msgstr "cần %<>%>"
#: c-parser.c:9246 cp/parser.c:22265
#, gcc-internal-format
msgid "expected %<,%> or %<)%>"
-msgstr "mong đợi %<,%> hoặc %<)%>"
+msgstr "cần %<,%> hoặc %<)%>"
#: c-parser.c:9499 c-parser.c:9530 c-parser.c:9766 c-parser.c:9918
#: c-parser.c:3961 cp/parser.c:22244
#, gcc-internal-format
msgid "expected %<=%>"
-msgstr "mong đợi %<=%>"
+msgstr "cần %<=%>"
#: c-parser.c:10279 c-parser.c:10269 cp/parser.c:26674
#, gcc-internal-format
msgid "expected %<#pragma omp section%> or %<}%>"
-msgstr "mong đợi %<#pragma omp section%> hoặc %<}%>"
+msgstr "cần %<#pragma omp section%> hoặc %<}%>"
#: c-parser.c:10616 cp/parser.c:22229
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<[%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<[%>"
#: c-typeck.c:6604
msgid "(anonymous)"
@@ -171,10 +169,9 @@ msgid "return not followed by barrier"
msgstr "trả lại không có hàng rào theo sau"
#: collect2.c:1691
-#, fuzzy, c-format
-#| msgid "collect2 version %s"
+#, c-format
msgid "collect2 version %s\n"
-msgstr "collect2 phiên bản %s"
+msgstr "collect2 phiên bản %s\n"
#: collect2.c:1798
#, c-format
@@ -229,23 +226,22 @@ msgstr "Chức năng lan truyá»n hằng số / sao chép bị tắt"
#: diagnostic.c:136
#, c-format
msgid "%s: all warnings being treated as errors"
-msgstr ""
+msgstr "%s: xử lý các cảnh báo như là các lỗi"
#: diagnostic.c:141
#, c-format
msgid "%s: some warnings being treated as errors"
-msgstr ""
+msgstr "%s: xử lý một số các cảnh báo như là các lỗi"
#: diagnostic.c:219
#, c-format
msgid "compilation terminated due to -Wfatal-errors.\n"
-msgstr "tiến trình biên dịch bị chấm dứt do « -Wfatal-errors ».\n"
+msgstr "tiến trình biên dịch bị chấm dứt do -Wfatal-errors.\n"
#: diagnostic.c:229
-#, fuzzy, c-format
-#| msgid "compilation terminated due to -Wfatal-errors.\n"
+#, c-format
msgid "compilation terminated due to -fmax-errors=%u.\n"
-msgstr "tiến trình biên dịch bị chấm dứt do « -Wfatal-errors ».\n"
+msgstr "tiến trình biên dịch bị chấm dứt do -fmax-errors=%u.\n"
#: diagnostic.c:240
#, c-format
@@ -271,19 +267,19 @@ msgstr "%s:%d: lá»™n xá»™n do lá»—i trÆ°á»›c nên hủy bá»\n"
#: diagnostic.c:880
#, c-format
msgid "Internal compiler error: Error reporting routines re-entered.\n"
-msgstr "Lỗi biên dịch nội bộ : đã nhập lại hàm thông báo lỗi.\n"
+msgstr "Lỗi biên dịch nội bộ: đã nhập lại hàm thông báo lỗi.\n"
#: final.c:1160
msgid "negative insn length"
-msgstr "chiá»u dài lệnh âm"
+msgstr "chiá»u dài insn âm"
#: final.c:2716
msgid "could not split insn"
-msgstr "không thể chia tách lệnh"
+msgstr "không thể chia tách insn"
#: final.c:3124
msgid "invalid 'asm': "
-msgstr "« asm » sai"
+msgstr "'asm' sai: "
#: final.c:3307
#, c-format
@@ -313,7 +309,7 @@ msgstr "%%-code sai"
#: final.c:3474
#, c-format
msgid "'%%l' operand isn't a label"
-msgstr "toán hạng « %%l » không phải là một nhãn"
+msgstr "toán hạng '%%l' không phải là một nhãn"
#. We can't handle floating point constants;
#. PRINT_OPERAND must handle them.
@@ -342,7 +338,7 @@ msgid ""
"Setting spec %s to '%s'\n"
"\n"
msgstr ""
-"Äang lập đặc tả %s thành « %s »\n"
+"Äang lập đặc tả %s thành '%s'\n"
"\n"
#: gcc.c:1636
@@ -366,7 +362,7 @@ msgid ""
"spec is '%s'\n"
"\n"
msgstr ""
-"đặc tả là « %s »\n"
+"đặc tả là '%s'\n"
"\n"
#: gcc.c:2249
@@ -411,16 +407,16 @@ msgid " --target-help Display target specific command line options\n
msgstr " --target-help Hiển thị những tuỳ chá»n dòng lệnh đặc trÆ°ng cho đích\n"
#: gcc.c:2961
-#, fuzzy
-#| msgid " --help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]\n"
msgid " --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]\n"
msgstr ""
-" --help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]\n"
+" --help={common|optimizers|params|target|warnings|[^]{joined|separate|undocumented}}[,...]\n"
"\n"
"help\t\t\t\ttrợ giúp\n"
+"common\t\t\t\tchung\n"
"optimizers\t\tbộ tối ưu hoá\n"
-"warnings\t\t\tcảnh báo\n"
"params\t\t\t(viết tắt parameters) tham số\n"
+"warnings\t\t\tcảnh báo\n"
+"target\t\t\tđích\n"
"joined\t\t\tnối lại\n"
"separate\t\t\tkhông nối lại\n"
"undocumented\t\tkhông có tài liệu diễn tả\n"
@@ -431,7 +427,7 @@ msgstr " Hiển thị má»™t số loại tuỳ chá»n d
#: gcc.c:2964
msgid " (Use '-v --help' to display command line options of sub-processes)\n"
-msgstr " (Hãy sá»­ dụng « -v --help » để hiển thị các tuỳ chá»n dòng lệnh của tiến trình con)\n"
+msgstr " (Hãy sá»­ dụng '-v --help' để hiển thị các tuỳ chá»n dòng lệnh của tiến trình con)\n"
#: gcc.c:2965
msgid " --version Display compiler version information\n"
@@ -497,31 +493,31 @@ msgstr " -print-sysroot-headers-suffix Hiển thị hậu tố sysroot dùng
msgid " -Wa,<options> Pass comma-separated <options> on to the assembler\n"
msgstr ""
" -Wa,<tuỳ_chá»n>\n"
-" Gá»­i cho chÆ°Æ¡ng trình dịch mã số các tuỳ chá»n này định giá»›i bằng dấu phẩy\n"
+" Chuyển cho chÆ°Æ¡ng trình dịch mã số các tuỳ chá»n này định giá»›i bằng dấu phẩy\n"
#: gcc.c:2981
msgid " -Wp,<options> Pass comma-separated <options> on to the preprocessor\n"
msgstr ""
" -Wp,<tuỳ_chá»n>\n"
-" Gá»­i cho bá»™ tiá»n xá»­ lý các tuỳ chá»n này định giá»›i bằng dấu phẩy\n"
+" Chuyển cho bá»™ tiá»n xá»­ lý các tuỳ chá»n này định giá»›i bằng dấu phẩy\n"
#: gcc.c:2982
msgid " -Wl,<options> Pass comma-separated <options> on to the linker\n"
msgstr ""
" -Wl,<tuỳ_chá»n>\n"
-" Gá»­i cho bá»™ liên kết các tuỳ chá»n này định giá»›i bằng dấu phẩy\n"
+" Chuyển cho bá»™ liên kết các tuỳ chá»n này định giá»›i bằng dấu phẩy\n"
#: gcc.c:2983
msgid " -Xassembler <arg> Pass <arg> on to the assembler\n"
-msgstr " -Xassembler <đối_số> Gửi đối số này cho chương trình dịch mã số\n"
+msgstr " -Xassembler <đối_số> Chuyển đối số này cho chương trình dịch mã số\n"
#: gcc.c:2984
msgid " -Xpreprocessor <arg> Pass <arg> on to the preprocessor\n"
-msgstr " -Xpreprocessor <đối_số> Gá»­i đối số này cho bá»™ tiá»n xá»­ lý\n"
+msgstr " -Xpreprocessor <đối_số> Chuyển đối số này cho bá»™ tiá»n xá»­ lý\n"
#: gcc.c:2985
msgid " -Xlinker <arg> Pass <arg> on to the linker\n"
-msgstr " -Xlinker <đối_số> Gửi đối số này cho bộ liên kết\n"
+msgstr " -Xlinker <đối_số> Chuyển đối số này cho bộ liên kết\n"
#: gcc.c:2986
msgid " -save-temps Do not delete intermediate files\n"
@@ -574,7 +570,7 @@ msgstr " -v Hiển thị những chương trình được
#: gcc.c:3000
msgid " -### Like -v but options quoted and commands not executed\n"
msgstr ""
-" -### Giống nhÆ° « -v » nhÆ°ng mà tuỳ chá»n nằm trong dấu nháy\n"
+" -### Giống nhÆ° -v nhÆ°ng mà tuỳ chá»n nằm trong dấu nháy\n"
" và lệnh không được thực hiện\n"
#: gcc.c:3001
@@ -594,16 +590,12 @@ msgid " -o <file> Place the output into <file>\n"
msgstr " -o <tệp> Äể kết xuất vào tập tin này\n"
#: gcc.c:3005
-#, fuzzy
-#| msgid " -pipe Use pipes rather than intermediate files\n"
msgid " -pie Create a position independent executable\n"
-msgstr " -pipe Dùng ống dẫn thay cho tập tin trung gian\n"
+msgstr " -pie Tạo vị trí độc lập thi hành\n"
#: gcc.c:3006
-#, fuzzy
-#| msgid " --help Display this information\n"
msgid " -shared Create a shared library\n"
-msgstr " --help Hiển thị trợ giúp này\n"
+msgstr " -shared Tạo thư viện chia sẻ (liên kết động)\n"
#: gcc.c:3007
msgid ""
@@ -614,7 +606,7 @@ msgid ""
msgstr ""
" -x <ngôn_ngữ> Ghi rõ ngôn ngữ của những tập tin nhập vào mà theo sau\n"
" \t\t Các ngôn ngữ có thể sử dụng: c, c++, none\n"
-" « none » (không có) = hoàn nguyên vỠứng dụng mặc định\n"
+" 'none' (không có) = hoàn nguyên vỠứng dụng mặc định\n"
" là đoán ngôn ngữ dựa vào phần mở rộng của tập tin\n"
#: gcc.c:3014
@@ -626,15 +618,14 @@ msgid ""
" other options on to these processes the -W<letter> options must be used.\n"
msgstr ""
"\n"
-"Tuỳ chá»n bắt đầu vá»›i má»™t của « -g, -f, -m, -O, -W, --param »\n"
+"Tuỳ chá»n bắt đầu vá»›i má»™t của -g, -f, -m, -O, -W, --param\n"
"thì được tá»± Ä‘á»™ng gá»­i cho những tiến trình con khác nhau được %s gá»i.\n"
-"Phải sá»­ dụng tuỳ chá»n « -W<chữ> » để gá»­i thêm tuỳ chá»n cho những tiến trình này.\n"
+"Phải sá»­ dụng tuỳ chá»n -W<chữ> để gá»­i thêm tuỳ chá»n cho những tiến trình này.\n"
#: gcc.c:5239
-#, fuzzy, c-format
-#| msgid "Processing spec %c%s%c, which is '%s'\n"
+#, c-format
msgid "Processing spec (%s), which is '%s'\n"
-msgstr "Äang xá»­ lý đặc tả %c%s%c, mà « %s »\n"
+msgstr "Äang xá»­ lý đặc tả (%s), cái mà '%s'\n"
#: gcc.c:6497
#, c-format
@@ -695,7 +686,7 @@ msgstr "Cấu hình bằng %s\n"
#: gcc.c:6629
#, c-format
msgid "Thread model: %s\n"
-msgstr "Mẫu nhánh: %s\n"
+msgstr "Mô hình tuyến trình: %s\n"
#: gcc.c:6640
#, c-format
@@ -726,7 +717,7 @@ msgid ""
"Use \"-Wl,OPTION\" to pass \"OPTION\" to the linker.\n"
"\n"
msgstr ""
-"Hãy sá»­ dụng « -Wl,tùy_chá»n » để gá»­i tuỳ chá»n đó cho bá»™ liên kết.\n"
+"Hãy sá»­ dụng \"-Wl,TÙY_CHỌN\" để gá»­i tuỳ chá»n đó cho bá»™ liên kết.\n"
"\n"
#: gcc.c:8090
@@ -736,7 +727,7 @@ msgid ""
"=================\n"
"\n"
msgstr ""
-"Tuỳ chá»n dịch mã số\n"
+"Tuỳ chá»n dịch ASM\n"
"=================\n"
"\n"
@@ -746,19 +737,16 @@ msgid ""
"Use \"-Wa,OPTION\" to pass \"OPTION\" to the assembler.\n"
"\n"
msgstr ""
-"Hãy sá»­ dụng « -Wl,tùy_chá»n » để gá»­i tuỳ chá»n đó cho chÆ°Æ¡ng trình dịch mã số.\n"
+"Hãy sá»­ dụng \"-Wl,TÙY_CHỌN\" để gá»­i tuỳ chá»n đó cho chÆ°Æ¡ng trình dịch mã số.\n"
"\n"
#: gcov.c:458
-#, fuzzy, c-format
-#| msgid ""
-#| "Usage: gcov [OPTION]... SOURCEFILE...\n"
-#| "\n"
+#, c-format
msgid ""
"Usage: gcov [OPTION]... SOURCE|OBJ...\n"
"\n"
msgstr ""
-"Sử dụng: gcov [TÙY_CHỌN]... TỆP_NGUỒN...\n"
+"Sử dụng: gcov [TÙY_CHỌN]... TẬP_TIN_NGUỒN|OBJ...\n"
"\n"
#: gcov.c:459
@@ -824,13 +812,12 @@ msgstr ""
#: gcov.c:471
#, c-format
msgid " -s, --source-prefix DIR Source prefix to elide\n"
-msgstr ""
+msgstr " -s, --source-prefix TMỤC Tiá»n tố mã nguồn cho elide\n"
#: gcov.c:472
-#, fuzzy, c-format
-#| msgid " -a, --all-blocks Show information for every basic block\n"
+#, c-format
msgid " -r, --relative-only Only show data for relative sources\n"
-msgstr " -a, --all-blocks Hiển thị thông tin cho má»i khối cÆ¡ bản\n"
+msgstr " -r, --relative-only Chỉ hiển thị dữ liệu cho dữ liệu nguồn có liên quan\n"
#: gcov.c:473
#, c-format
@@ -843,10 +830,9 @@ msgid " -u, --unconditional-branches Show unconditional branch counts too\n"
msgstr " -u, --unconditional-branches CÅ©ng hiển thị số đếm các nhánh không Ä‘iá»u khiển\n"
#: gcov.c:475
-#, fuzzy, c-format
-#| msgid " --help Display this information\n"
+#, c-format
msgid " -d, --display-progress Display progress information\n"
-msgstr " --help Hiển thị trợ giúp này\n"
+msgstr " -d, --display-progress Hiển thị tiến trình công việc\n"
#: gcov.c:476
#, c-format
@@ -873,7 +859,7 @@ msgid ""
"FITNESS FOR A PARTICULAR PURPOSE.\n"
"\n"
msgstr ""
-"Äây là phần má»m tá»± do : bạn có quyá»n sá»­a đổi và phát hành lại nó.\n"
+"Äây là phần má»m tá»± do: bạn có quyá»n sá»­a đổi và phát hành lại nó.\n"
"KHÔNG CÓ BẢO HÀNH GÃŒ CẢ, THẬM CHà KHÔNG CÓ BẢO ÄẢM ÄƯỢC NGỤ Ã\n"
"KHẢ NÄ‚NG BÃN HAY KHẢ NÄ‚NG LÀM ÄƯỢC VIỆC DỨT KHOÃT.\n"
"\n"
@@ -884,33 +870,29 @@ msgid "\n"
msgstr "\n"
#: gcov.c:720
-#, fuzzy, c-format
-#| msgid "%s:creating '%s'\n"
+#, c-format
msgid "Creating '%s'\n"
-msgstr "%s: đang tạo « %s »\n"
+msgstr "Äang tạo '%s'\n"
#: gcov.c:723
-#, fuzzy, c-format
-#| msgid "%s:error writing output file '%s'\n"
+#, c-format
msgid "Error writing output file '%s'\n"
-msgstr "%s: gặp lỗi khi ghi tập tin kết xuất « %s »\n"
+msgstr "Lỗi khi ghi tập tin kết xuất '%s'\n"
#: gcov.c:728
-#, fuzzy, c-format
-#| msgid "%s:could not open output file '%s'\n"
+#, c-format
msgid "Could not open output file '%s'\n"
-msgstr "%s: không thể mở tập tin kết xuất « %s »\n"
+msgstr "Không thể mở tập tin kết xuất '%s'\n"
#: gcov.c:734
-#, fuzzy, c-format
-#| msgid "[Leaving %s]\n"
+#, c-format
msgid "Removing '%s'\n"
-msgstr "[Äang rá»i khá»i %s]\n"
+msgstr "Gỡ bỠ'%s'\n"
#: gcov.c:976
#, c-format
msgid "%s:source file is newer than graph file '%s'\n"
-msgstr "%s: tập tin nguồn vẫn mới hơn tập tin đồ thị « %s »\n"
+msgstr "%s: tập tin nguồn vẫn mới hơn tập tin đồ thị '%s'\n"
#: gcov.c:981
#, c-format
@@ -930,12 +912,12 @@ msgstr "%s: không phải là một tập tin đồ thị gcov\n"
#: gcov.c:1025
#, c-format
msgid "%s:version '%.4s', prefer '%.4s'\n"
-msgstr "%s: phiên bản « %.4s » mà thích « %.4s » hơn\n"
+msgstr "%s: phiên bản '%.4s' mà thích '%.4s' hơn\n"
#: gcov.c:1065
#, c-format
msgid "%s:already seen blocks for '%s'\n"
-msgstr "%s: đã thấy khối cho « %s »\n"
+msgstr "%s: đã thấy khối cho '%s'\n"
#: gcov.c:1196
#, c-format
@@ -960,7 +942,7 @@ msgstr "%s: không phải là một tập tin dữ liệu gcov\n"
#: gcov.c:1242
#, c-format
msgid "%s:version '%.4s', prefer version '%.4s'\n"
-msgstr "%s: phiên bản « %.4s » mà thích phiên bản « %.4s » hơn\n"
+msgstr "%s: phiên bản '%.4s' mà thích phiên bản '%.4s' hơn\n"
#: gcov.c:1248
#, c-format
@@ -970,12 +952,12 @@ msgstr "%s: dấu hiệu không tương ứng với tập tin đồ thị\n"
#: gcov.c:1283
#, c-format
msgid "%s:unknown function '%u'\n"
-msgstr "%s: không rõ hàm « %u »\n"
+msgstr "%s: không rõ hàm '%u'\n"
#: gcov.c:1297
#, c-format
msgid "%s:profile mismatch for '%s'\n"
-msgstr "%s: hồ sơ không tương ứng với « %s »\n"
+msgstr "%s: hồ sơ không tương ứng với '%s'\n"
#: gcov.c:1316
#, c-format
@@ -985,22 +967,22 @@ msgstr "%s: bị tràn\n"
#: gcov.c:1362
#, c-format
msgid "%s:'%s' lacks entry and/or exit blocks\n"
-msgstr "%s: « %s » còn thiếu khối đi vào và/hay đi ra\n"
+msgstr "%s: '%s' còn thiếu khối đi vào và/hay đi ra\n"
#: gcov.c:1367
#, c-format
msgid "%s:'%s' has arcs to entry block\n"
-msgstr "%s: « %s » có cung đến khối đi vào\n"
+msgstr "%s: '%s' có cung đến khối đi vào\n"
#: gcov.c:1375
#, c-format
msgid "%s:'%s' has arcs from exit block\n"
-msgstr "%s: « %s » có cung từ khối đi vào\n"
+msgstr "%s: '%s' có cung từ khối đi vào\n"
#: gcov.c:1583
#, c-format
msgid "%s:graph is unsolvable for '%s'\n"
-msgstr "%s: đồ thị không thể giải được cho « %s »\n"
+msgstr "%s: đồ thị không thể giải được cho '%s'\n"
#: gcov.c:1691
#, c-format
@@ -1010,12 +992,12 @@ msgstr "Dòng được thực hiện: %s trên %d\n"
#: gcov.c:1694
#, c-format
msgid "No executable lines\n"
-msgstr "Không có dòng thực thị\n"
+msgstr "Không có dòng thực thi\n"
#: gcov.c:1702
#, c-format
msgid "%s '%s'\n"
-msgstr "%s « %s »\n"
+msgstr "%s '%s'\n"
#: gcov.c:1709
#, c-format
@@ -1045,12 +1027,12 @@ msgstr "Không có cuá»™c gá»i\n"
#: gcov.c:1973
#, c-format
msgid "%s:no lines for '%s'\n"
-msgstr "%s: không có dòng cho « %s »\n"
+msgstr "%s: không có dòng cho '%s'\n"
#: gcov.c:2167
#, c-format
msgid "call %2d returned %s\n"
-msgstr "cuá»™c gá»i %2d trả lại %s\n"
+msgstr "cuá»™c gá»i %2d trả vá» %s\n"
#: gcov.c:2172
#, c-format
@@ -1078,10 +1060,9 @@ msgid "unconditional %2d never executed\n"
msgstr "%2d không Ä‘iá»u kiện chÆ°a bao giá» thá»±c hiện\n"
#: gcov.c:2262
-#, fuzzy, c-format
-#| msgid "%s:cannot open source file\n"
+#, c-format
msgid "Cannot open source file %s\n"
-msgstr "%s: không thể mở tập tin nguồn\n"
+msgstr "Không thể mở tập tin nguồn %s\n"
#: gcse.c:2626
msgid "PRE disabled"
@@ -1093,13 +1074,11 @@ msgstr "GCSE bị tắt"
#: gengtype-state.c:154
#, fuzzy, c-format
-#| msgid "%s:%d:%d: instantiated from %qs\n"
msgid "%s:%d:%d: Invalid state file; %s"
msgstr "%s:%d:%d: lần tạo từ %qs\n"
#: gengtype-state.c:158
#, fuzzy, c-format
-#| msgid "%s:%d: instantiated from %qs\n"
msgid "%s:%d: Invalid state file; %s"
msgstr "%s:%d: lần tạo từ %qs\n"
@@ -1109,12 +1088,12 @@ msgstr "%s:%d: lần tạo từ %qs\n"
#: gengtype-state.c:169
#, c-format
msgid "%s:%d:%d: Invalid state file; "
-msgstr ""
+msgstr "%s:%d:%d: Tập tin tình trạng không hợp lệ; "
#: gengtype-state.c:174
#, c-format
msgid "%s:%d: Invalid state file; "
-msgstr ""
+msgstr "%s:%d: Sai tập tin trạng thái; "
#: gengtype-state.c:699
#, c-format
@@ -1123,65 +1102,58 @@ msgstr ""
#: gengtype-state.c:754
#, fuzzy, c-format
-#| msgid "unexpected base-type in cris_print_base"
msgid "Unexpected type in write_state_scalar_type"
msgstr "gặp loại cÆ¡ bản (base-type) bất thÆ°á»ng trong cris_print_index"
#: gengtype-state.c:769
#, fuzzy, c-format
-#| msgid "unexpected base-type in cris_print_base"
msgid "Unexpected type in write_state_string_type"
msgstr "gặp loại cÆ¡ bản (base-type) bất thÆ°á»ng trong cris_print_index"
#: gengtype-state.c:973
-#, fuzzy, c-format
-#| msgid "Unexpected EOF"
+#, c-format
msgid "Unexpected type..."
-msgstr "Gặp kết thúc tập tin bất thÆ°á»ng"
+msgstr "Kiểu bất thÆ°á»ng..."
#: gengtype-state.c:1153
#, fuzzy, c-format
-#| msgid "could not write to temporary file %s"
msgid "failed to write state trailer [%s]"
msgstr "không thể ghi vào tập tin tạm thá»i %s"
#: gengtype-state.c:1179
#, c-format
msgid "Failed to open file %s for writing state: %s"
-msgstr ""
+msgstr "Không thể mở tập tin %s để ghi trạng thái: %s"
#: gengtype-state.c:1209
#, fuzzy, c-format
-#| msgid "%s:error writing output file '%s'\n"
msgid "output error when writing state file %s [%s]"
-msgstr "%s: gặp lỗi khi ghi tập tin kết xuất « %s »\n"
+msgstr "%s: gặp lỗi khi ghi tập tin kết xuất %s\n"
#: gengtype-state.c:1212
#, fuzzy, c-format
-#| msgid "%s: Failed to close output file %s\n"
msgid "failed to close state file %s [%s]"
msgstr "%s: Không đóng được tập tin kết xuất %s\n"
#: gengtype-state.c:1215
#, c-format
msgid "failed to rename %s to state file %s [%s]"
-msgstr ""
+msgstr "gặp lỗi khi đổi tên %s thành tập tin trạng thái %s [%s]"
#: gengtype-state.c:2406
#, c-format
msgid "Failed to open state file %s for reading [%s]"
-msgstr ""
+msgstr "Gặp lá»—i khi mở tập tin trạng thái %s để Ä‘á»c [%s]"
#: gengtype-state.c:2444
#, fuzzy, c-format
-#| msgid "%s: Failed to close output file %s\n"
msgid "failed to close read state file %s [%s]"
msgstr "%s: Không đóng được tập tin kết xuất %s\n"
#: incpath.c:76
#, c-format
msgid "ignoring duplicate directory \"%s\"\n"
-msgstr "đang bỠqua thư mục trùng « %s »\n"
+msgstr "đang bỠqua thư mục trùng \"%s\"\n"
#: incpath.c:79
#, c-format
@@ -1191,7 +1163,7 @@ msgstr " vì nó là một thư mục không phải hệ thống mà nhân đô
#: incpath.c:83
#, c-format
msgid "ignoring nonexistent directory \"%s\"\n"
-msgstr "đang bỠqua thư mục không tồn tại « %s »\n"
+msgstr "đang bỠqua thư mục không tồn tại \"%s\"\n"
#: incpath.c:353
#, c-format
@@ -1215,16 +1187,15 @@ msgstr "<có sẵn>"
#. Opening quotation mark.
#: intl.c:63
msgid "`"
-msgstr "« "
+msgstr "`"
#. Closing quotation mark.
#: intl.c:66
msgid "'"
-msgstr " »"
+msgstr "'"
#: ipa-pure-const.c:156
#, fuzzy
-#| msgid "Warn about functions which might be candidates for format attributes"
msgid "function might be candidate for attribute %<%s%>"
msgstr "Cảnh báo vỠhàm có thể yêu cầu thuộc tính định dạng"
@@ -1234,7 +1205,7 @@ msgstr ""
#: langhooks.c:374
msgid "At top level:"
-msgstr "Ở cấp đầu :"
+msgstr "Ở cấp đầu:"
#: langhooks.c:394 cp/error.c:2987
#, c-format
@@ -1320,19 +1291,19 @@ msgstr "không thể ghi vào tập tin tạm thá»i %s"
#: lto-wrapper.c:321
#, c-format
msgid "malformed COLLECT_GCC_OPTIONS"
-msgstr ""
+msgstr "COLLECT_GCC_OPTIONS dị hình"
#: lto-wrapper.c:445
#, c-format
msgid "environment variable COLLECT_GCC must be set"
-msgstr ""
+msgstr "biến môi trÆ°á»ng COLLECT_GCC cần được đặt"
#: lto-wrapper.c:448
#, c-format
msgid "environment variable COLLECT_GCC_OPTIONS must be set"
-msgstr ""
+msgstr "biến môi trÆ°á»ng COLLECT_GCC_OPTIONS cần được đặt"
-# Literal: don't translate; Nghĩa chữ : dừng dịch
+# Literal: don't translate; Nghĩa chữ: dừng dịch
#: lto-wrapper.c:734
#, c-format
msgid "fopen: %s"
@@ -1345,7 +1316,7 @@ msgstr "Cái chuyển này còn thiếu tài liệu hướng dẫn"
#: opts.c:1028
msgid "[default]"
-msgstr ""
+msgstr "[mặc định]"
#: opts.c:1039
msgid "[enabled]"
@@ -1363,7 +1334,7 @@ msgstr " Không tìm thấy tuỳ chá»n có những đặc Ä‘iểm đã muốn\
#: opts.c:1067
#, c-format
msgid " None found. Use --help=%s to show *all* the options supported by the %s front-end\n"
-msgstr " Không tìm thấy. Hãy sá»­ dụng « --help=%s » để hiển thị * tất cả * các tuỳ chá»n được giao diện %s há»— trợ\n"
+msgstr " Không tìm thấy. Hãy sá»­ dụng --help=%s để hiển thị * tất cả * các tuỳ chá»n được giao diện %s há»— trợ\n"
#: opts.c:1073
#, c-format
@@ -1388,7 +1359,7 @@ msgstr "Theo đây có những tuỳ chá»n không phụ thuá»™c vào ngôn ngá»
#: opts.c:1180
msgid "The --param option recognizes the following as parameters"
-msgstr "Tuỳ chá»n « --param » nhận ra những Ä‘iá»u theo đây nhÆ° là tham số"
+msgstr "Tuỳ chá»n --param nhận ra những Ä‘iá»u theo đây nhÆ° là tham số"
#: opts.c:1186
msgid "The following options are specific to just the language "
@@ -1416,7 +1387,7 @@ msgstr "Theo đây có những tuỳ chá»n liên quan đến ngôn ngữ"
#: opts.c:2061
msgid "enabled by default"
-msgstr ""
+msgstr "mặc định được bật"
#: plugin.c:782
msgid "Event"
@@ -1433,7 +1404,7 @@ msgstr "*** CẢNH BÃO *** có phần bổ sung vẫn hoạt Ä‘á»™ng: đừng t
#: reload.c:3812
msgid "unable to generate reloads for:"
-msgstr "không thể tạo ra việc nạp lại cho :"
+msgstr "không thể tạo ra việc nạp lại cho:"
#: reload1.c:2120
msgid "this is the insn:"
@@ -1451,7 +1422,6 @@ msgstr "Chế độ VOIDmode trên một đầu ra"
#: reload1.c:8672
#, fuzzy
-#| msgid "Failure trying to reload:"
msgid "failure trying to reload:"
msgstr "Không thành công khi thử nạp lại:"
@@ -1461,12 +1431,12 @@ msgstr "không nhận ra lệnh:"
#: rtl-error.c:120
msgid "insn does not satisfy its constraints:"
-msgstr "lệnh không thá»a những ràng buá»™c của nó :"
+msgstr "lệnh không thá»a những ràng buá»™c của nó:"
#: targhooks.c:1404
#, c-format
msgid "created and used with differing settings of '%s'"
-msgstr "được tạo và sử dụng với thiết lập khác nhau của « %s »"
+msgstr "được tạo và sử dụng với thiết lập khác nhau của '%s'"
#: targhooks.c:1406
msgid "out of memory"
@@ -1474,11 +1444,11 @@ msgstr "không đủ bộ nhớ"
#: targhooks.c:1421
msgid "created and used with different settings of -fpic"
-msgstr "được tạo và sử dụng với thiết lập khác nhau của « -fpic »"
+msgstr "được tạo và sử dụng với thiết lập khác nhau của -fpic"
#: targhooks.c:1423
msgid "created and used with different settings of -fpie"
-msgstr "được tạo và sử dụng với thiết lập khác nhau của « -fpie »"
+msgstr "được tạo và sử dụng với thiết lập khác nhau của -fpie"
#: tlink.c:392
#, c-format
@@ -1574,23 +1544,23 @@ msgstr "hàm không phải là ứng xử để chèn vào trực tiếp"
#: cif-code.def:59
msgid "--param large-function-growth limit reached"
-msgstr "đã tới giới hạn « --param large-function-growth »"
+msgstr "đã tới giới hạn --param large-function-growth"
#: cif-code.def:61
msgid "--param large-stack-frame-growth limit reached"
-msgstr "đã tới giới hạn « --param large-stack-frame-growth »"
+msgstr "đã tới giới hạn --param large-stack-frame-growth"
#: cif-code.def:63
msgid "--param max-inline-insns-single limit reached"
-msgstr "đã tới giới hạn « --param max-inline-insns-single »"
+msgstr "đã tới giới hạn --param max-inline-insns-single"
#: cif-code.def:65
msgid "--param max-inline-insns-auto limit reached"
-msgstr "đã tới giới hạn « --param max-inline-insns-auto »"
+msgstr "đã tới giới hạn --param max-inline-insns-auto"
#: cif-code.def:67
msgid "--param inline-unit-growth limit reached"
-msgstr "đã tới giới hạn « --param inline-unit-growth »"
+msgstr "đã tới giới hạn --param inline-unit-growth"
#. Recursive inlining.
#: cif-code.def:70
@@ -1651,7 +1621,7 @@ msgstr "lá»—i nghiêm trá»ng: "
#: diagnostic.def:34
msgid "internal compiler error: "
-msgstr "lỗi biên dịch nôi bộ : "
+msgstr "lỗi biên dịch nội bộ: "
#: diagnostic.def:35
msgid "error: "
@@ -1663,15 +1633,15 @@ msgstr "tiếc là chưa thực hiện: "
#: diagnostic.def:37
msgid "warning: "
-msgstr "cảnh báo : "
+msgstr "cảnh báo: "
#: diagnostic.def:38
msgid "anachronism: "
-msgstr "lá»—i thá»i: "
+msgstr "sai niên đại: "
#: diagnostic.def:39
msgid "note: "
-msgstr "ghi chú : "
+msgstr "ghi chú: "
#: diagnostic.def:40
msgid "debug: "
@@ -1735,11 +1705,11 @@ msgstr ""
#: params.def:127
msgid "If -fvariable-expansion-in-unroller is used, the maximum number of times that an individual variable will be expanded during loop unrolling"
-msgstr "Dùng « -fvariable-expansion-in-unroller » thì số tối đa các lần mở rộng một biến nào đó trong khi bỠcuộn vòng lặp"
+msgstr "Dùng -fvariable-expansion-in-unroller thì số tối đa các lần mở rộng một biến nào đó trong khi bỠcuộn vòng lặp"
#: params.def:133
msgid "If -ftree-vectorize is used, the minimal loop bound of a loop to be considered for vectorization"
-msgstr "Dùng « -ftree-vectorize » thì biên giới vòng lặp tối thiểu của một vòng lặp cần tính để véc-tơ hoá"
+msgstr "Dùng -ftree-vectorize thì biên giới vòng lặp tối thiểu của một vòng lặp cần tính để véc-tơ hoá"
#: params.def:144
msgid "The maximum number of instructions to consider to fill a delay slot"
@@ -1755,7 +1725,6 @@ msgstr "Chiá»u dài tối Ä‘a của danh sách các thao tác bị hoãn của
#: params.def:172
#, fuzzy
-#| msgid "The maximum number of instructions to consider to unroll in a loop"
msgid "The maximum number of backtrack attempts the scheduler should make when modulo scheduling a loop"
msgstr "Số tối đa các lệnh cần tính nên bỠcuộn trong một vòng lặp"
@@ -1797,7 +1766,6 @@ msgstr "Vùng nhớ tối đa cho GCSE cấp phát"
#: params.def:219
#, fuzzy
-#| msgid "The maximum number of instructions to consider to unroll in a loop"
msgid "The maximum ratio of insertions to deletions of expressions in GCSE"
msgstr "Số tối đa các lệnh cần tính nên bỠcuộn trong một vòng lặp"
@@ -1979,7 +1947,6 @@ msgstr "Äóng kết vá»›i kích cỡ biểu tượng được sá»­ dụng trong
#: params.def:490
#, fuzzy
-#| msgid "Bound on size of expressions used in the scalar evolutions analyzer"
msgid "Bound on the complexity of the expressions in the scalar evolutions analyzer"
msgstr "Äóng kết vá»›i kích cỡ biểu tượng được sá»­ dụng trong bá»™ phân tích sá»± khai căn vô hÆ°á»›ng"
@@ -2233,13 +2200,11 @@ msgstr ""
#: params.def:916
#, fuzzy
-#| msgid "Maximum number of nops to insert for a hint (Default 2)"
msgid "Maximum number of namespaces to search for alternatives when name lookup fails"
msgstr "Số tối Ä‘a các nops cần chèn cho má»™t lá»i gợi ý (mặc định là 2)"
#: params.def:923
#, fuzzy
-#| msgid "Maximum number of times that an insn could be scheduled"
msgid "Maximum number of conditional store pairs that can be sunk"
msgstr "Số tối Ä‘a các lần có thể định thá»i má»™t lệnh nào đó"
@@ -2257,13 +2222,11 @@ msgstr ""
#: params.def:949
#, fuzzy
-#| msgid "Allow branches to be packed with other instructions"
msgid "Allow new data races on packed data loads to be introduced"
msgstr "Cho phép đóng gói nhánh với câu lệnh khác"
#: params.def:954
#, fuzzy
-#| msgid "Allow branches to be packed with other instructions"
msgid "Allow new data races on packed data stores to be introduced"
msgstr "Cho phép đóng gói nhánh với câu lệnh khác"
@@ -2285,83 +2248,81 @@ msgstr ""
#: c-family/c-format.c:367
msgid "format"
-msgstr ""
+msgstr "định dạng"
#: c-family/c-format.c:368
#, fuzzy
-#| msgid "field width"
msgid "field width specifier"
msgstr "bá» rá»™ng trÆ°á»ng"
#: c-family/c-format.c:369
#, fuzzy
-#| msgid "field precision"
msgid "field precision specifier"
msgstr "ồ chính xác trÆ°á»ng"
#: c-family/c-format.c:483 c-family/c-format.c:507 config/i386/msformat-c.c:49
msgid "' ' flag"
-msgstr "cỠ« »"
+msgstr "cá» ' '"
#: c-family/c-format.c:483 c-family/c-format.c:507 config/i386/msformat-c.c:49
msgid "the ' ' printf flag"
-msgstr "cỠprintf « »"
+msgstr "cá» printf ' '"
#: c-family/c-format.c:484 c-family/c-format.c:508 c-family/c-format.c:542
#: c-family/c-format.c:605 config/i386/msformat-c.c:50
msgid "'+' flag"
-msgstr "cỠ« + »"
+msgstr "cá» '+'"
#: c-family/c-format.c:484 c-family/c-format.c:508 c-family/c-format.c:542
#: config/i386/msformat-c.c:50
msgid "the '+' printf flag"
-msgstr "cỠprintf « + »"
+msgstr "cá» printf '+'"
#: c-family/c-format.c:485 c-family/c-format.c:509 c-family/c-format.c:543
#: c-family/c-format.c:581 config/i386/msformat-c.c:51
#: config/i386/msformat-c.c:86
msgid "'#' flag"
-msgstr "cỠ« # »"
+msgstr "cá» '#'"
#: c-family/c-format.c:485 c-family/c-format.c:509 c-family/c-format.c:543
#: config/i386/msformat-c.c:51
msgid "the '#' printf flag"
-msgstr "cỠprintf « # »"
+msgstr "cá» printf '#'"
#: c-family/c-format.c:486 c-family/c-format.c:510 c-family/c-format.c:579
#: config/i386/msformat-c.c:52
msgid "'0' flag"
-msgstr "cỠ« 0 »"
+msgstr "cá» '0'"
#: c-family/c-format.c:486 c-family/c-format.c:510 config/i386/msformat-c.c:52
msgid "the '0' printf flag"
-msgstr "cỠprintf « 0 »"
+msgstr "cá» printf '0'"
#: c-family/c-format.c:487 c-family/c-format.c:511 c-family/c-format.c:578
#: c-family/c-format.c:608 config/i386/msformat-c.c:53
msgid "'-' flag"
-msgstr "cỠ« - »"
+msgstr "cá» '-'"
#: c-family/c-format.c:487 c-family/c-format.c:511 config/i386/msformat-c.c:53
msgid "the '-' printf flag"
-msgstr "cỠprintf « - »"
+msgstr "cá» printf '-'"
#: c-family/c-format.c:488 c-family/c-format.c:561 config/i386/msformat-c.c:54
#: config/i386/msformat-c.c:74
msgid "''' flag"
-msgstr "cỠ« ' »"
+msgstr "cá» '''"
#: c-family/c-format.c:488 config/i386/msformat-c.c:54
msgid "the ''' printf flag"
-msgstr "cỠprintf « ' »"
+msgstr "cá» printf '''"
#: c-family/c-format.c:489 c-family/c-format.c:562
msgid "'I' flag"
-msgstr "cỠ« I »"
+msgstr "cá» 'I'"
#: c-family/c-format.c:489
msgid "the 'I' printf flag"
-msgstr "cỠprintf « I »"
+msgstr "cá» printf 'I'"
#: c-family/c-format.c:490 c-family/c-format.c:512 c-family/c-format.c:559
#: c-family/c-format.c:582 c-family/c-format.c:609 config/sol2-c.c:45
@@ -2397,11 +2358,11 @@ msgstr "đồ sá»­a đổi chiá»u dài theo định dạng printf"
#: c-family/c-format.c:544
msgid "'q' flag"
-msgstr "cỠ« q »"
+msgstr "cá» 'q'"
#: c-family/c-format.c:544
msgid "the 'q' diagnostic flag"
-msgstr "cỠchẩn đoán « q »"
+msgstr "cỠchẩn đoán 'q'"
#: c-family/c-format.c:556 config/i386/msformat-c.c:70
msgid "assignment suppression"
@@ -2413,19 +2374,19 @@ msgstr "tính năng scanf để thu hồi sự gán"
#: c-family/c-format.c:557 config/i386/msformat-c.c:71
msgid "'a' flag"
-msgstr "cỠ« a »"
+msgstr "cá» 'a'"
#: c-family/c-format.c:557 config/i386/msformat-c.c:71
msgid "the 'a' scanf flag"
-msgstr "cỠscanf « a »"
+msgstr "cá» scanf 'a'"
#: c-family/c-format.c:558
msgid "'m' flag"
-msgstr "cỠ« m »"
+msgstr "cá» 'm'"
#: c-family/c-format.c:558
msgid "the 'm' scanf flag"
-msgstr "cỠscanf « m »"
+msgstr "cá» scanf 'm'"
#: c-family/c-format.c:559 config/i386/msformat-c.c:72
msgid "field width in scanf format"
@@ -2437,39 +2398,39 @@ msgstr "đồ sá»­a đổi chiá»u dài theo định dạng scanf"
#: c-family/c-format.c:561 config/i386/msformat-c.c:74
msgid "the ''' scanf flag"
-msgstr "cỠscanf « ' »"
+msgstr "cá» scanf '''"
#: c-family/c-format.c:562
msgid "the 'I' scanf flag"
-msgstr "cỠscanf « I »"
+msgstr "cá» scanf 'I'"
#: c-family/c-format.c:577
msgid "'_' flag"
-msgstr "cỠ« _ »"
+msgstr "cá» '_'"
#: c-family/c-format.c:577
msgid "the '_' strftime flag"
-msgstr "cỠstrftime « _ »"
+msgstr "cá» strftime '_'"
#: c-family/c-format.c:578
msgid "the '-' strftime flag"
-msgstr "cỠstrftime « - »"
+msgstr "cá» strftime '-'"
#: c-family/c-format.c:579
msgid "the '0' strftime flag"
-msgstr "cỠstrftime « 0 »"
+msgstr "cá» strftime '0'"
#: c-family/c-format.c:580 c-family/c-format.c:604
msgid "'^' flag"
-msgstr "cỠ« ^ »"
+msgstr "cá» '^'"
#: c-family/c-format.c:580
msgid "the '^' strftime flag"
-msgstr "cỠstrftime « ^ »"
+msgstr "cá» strftime '^'"
#: c-family/c-format.c:581 config/i386/msformat-c.c:86
msgid "the '#' strftime flag"
-msgstr "cỠstrftime « # »"
+msgstr "cá» strftime '#'"
#: c-family/c-format.c:582
msgid "field width in strftime format"
@@ -2477,23 +2438,23 @@ msgstr "chiá»u rá»™ng của trÆ°á»ng theo định dạng stfrtime"
#: c-family/c-format.c:583
msgid "'E' modifier"
-msgstr "đồ sửa đổi « E »"
+msgstr "đồ sửa đổi 'E'"
#: c-family/c-format.c:583
msgid "the 'E' strftime modifier"
-msgstr "đồ sửa đổi « E » của strftime"
+msgstr "đồ sửa đổi 'E' của strftime"
#: c-family/c-format.c:584
msgid "'O' modifier"
-msgstr "đồ sửa đổi « O »"
+msgstr "đồ sửa đổi 'O'"
#: c-family/c-format.c:584
msgid "the 'O' strftime modifier"
-msgstr "đồ sửa đổi « O » của strftime"
+msgstr "đồ sửa đổi 'O' của strftime"
#: c-family/c-format.c:585
msgid "the 'O' modifier"
-msgstr "đồ sửa đổi « O »"
+msgstr "đồ sửa đổi 'O'"
#: c-family/c-format.c:603
msgid "fill character"
@@ -2505,31 +2466,31 @@ msgstr "ký tá»± Ä‘iá»n vào theo định dạng strftime"
#: c-family/c-format.c:604
msgid "the '^' strfmon flag"
-msgstr "cỠstrfmon « ^ »"
+msgstr "cá» strfmon '^'"
#: c-family/c-format.c:605
msgid "the '+' strfmon flag"
-msgstr "cỠstrfmon « + »"
+msgstr "cá» strfmon '+'"
#: c-family/c-format.c:606
msgid "'(' flag"
-msgstr "cỠ« ( »"
+msgstr "cá» '('"
#: c-family/c-format.c:606
msgid "the '(' strfmon flag"
-msgstr "cỠstrfmon « ( »"
+msgstr "cá» strfmon '('"
#: c-family/c-format.c:607
msgid "'!' flag"
-msgstr "cỠ« ! »"
+msgstr "cá» '!'"
#: c-family/c-format.c:607
msgid "the '!' strfmon flag"
-msgstr "cỠstrfmon « ! »"
+msgstr "cá» strfmon '!'"
#: c-family/c-format.c:608
msgid "the '-' strfmon flag"
-msgstr "cỠstrfmon « - »"
+msgstr "cá» strfmon '-'"
#: c-family/c-format.c:609
msgid "field width in strfmon format"
@@ -2696,9 +2657,8 @@ msgstr "gặp lệnh căn cứ vào trong dãy có Ä‘iá»u kiện"
#: config/arm/arm.c:17253
#, fuzzy, c-format
-#| msgid "invalid operand for code '%c'"
msgid "Unsupported operand for code '%c'"
-msgstr "sai lập toán hạng cho mã « %c »"
+msgstr "sai lập toán hạng cho mã '%c'"
#: config/arm/arm.c:17301
#, c-format
@@ -2717,7 +2677,7 @@ msgstr "sai lập toán hạng dá»i"
#: config/bfin/bfin.c:1480 config/bfin/bfin.c:1487
#, c-format
msgid "invalid operand for code '%c'"
-msgstr "sai lập toán hạng cho mã « %c »"
+msgstr "sai lập toán hạng cho mã '%c'"
#: config/arm/arm.c:17462
#, c-format
@@ -2731,11 +2691,11 @@ msgstr "toán hạng còn thiếu"
#: config/arm/arm.c:20407
msgid "function parameters cannot have __fp16 type"
-msgstr "tham số hàm không thể có loại « __fp16 »"
+msgstr "tham số hàm không thể có loại __fp16"
#: config/arm/arm.c:20417
msgid "functions cannot return __fp16 type"
-msgstr "hàm không thể trả lại loại « __fp16 »"
+msgstr "hàm không thể trả lại loại __fp16"
#: config/avr/avr.c:1806
#, c-format
@@ -2744,17 +2704,15 @@ msgstr "toán hạng địa chỉ yêu cầu ràng buộc cho thanh ghi X, Y, ha
#: config/avr/avr.c:1959
msgid "operands to %T/%t must be reg + const_int:"
-msgstr ""
+msgstr "các toán hạng cho %T/%t phải là reg + const_int:"
#: config/avr/avr.c:1997 config/avr/avr.c:2052
#, fuzzy
-#| msgid "bad address, not (reg+disp):"
msgid "bad address, not an I/O address:"
msgstr "địa chỉ sai, không phải (reg+disp):"
#: config/avr/avr.c:2006
#, fuzzy
-#| msgid "bad address, not a constant):"
msgid "bad address, not a constant:"
msgstr "địa chỉ sai, không phải là một hằng số):"
@@ -2768,11 +2726,11 @@ msgstr "địa chỉ sai, không phải post_inc hoặc pre_dec:"
#: config/avr/avr.c:2042
msgid "internal compiler error. Bad address:"
-msgstr "lỗi biên dịch nội bộ : địa chỉ sai:"
+msgstr "lá»—i biên dịch ná»™i bá»™. Äịa chỉ sai:"
#: config/avr/avr.c:2072
msgid "internal compiler error. Unknown mode:"
-msgstr "lỗi biên dịch nội bộ : không rõ chế độ :"
+msgstr "lỗi biên dịch nội bộ. Không hiểu chế độ:"
#: config/avr/avr.c:2871 config/avr/avr.c:3444 config/avr/avr.c:3730
msgid "invalid insn:"
@@ -2797,7 +2755,7 @@ msgstr "lệnh dá»i sai:"
#: config/avr/avr.c:4549 config/avr/avr.c:5030 config/avr/avr.c:5445
msgid "internal compiler error. Incorrect shift:"
-msgstr "lá»—i biên dịch ná»™i bá»™ : dá»i không đúng:"
+msgstr "lỗi biên dịch nội bộ. Dịch không đúng:"
#: config/bfin/bfin.c:1385
#, c-format
@@ -2828,27 +2786,27 @@ msgstr "gặp loại cÆ¡ bản (base-type) bất thÆ°á»ng trong cris_print_inde
#: config/cris/cris.c:711
msgid "invalid operand for 'b' modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « b »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'b'"
#: config/cris/cris.c:728
msgid "invalid operand for 'o' modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « o »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'o'"
#: config/cris/cris.c:747
msgid "invalid operand for 'O' modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « O »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'O'"
#: config/cris/cris.c:780
msgid "invalid operand for 'p' modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « p »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'p'"
#: config/cris/cris.c:819
msgid "invalid operand for 'z' modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « z »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'z'"
#: config/cris/cris.c:883 config/cris/cris.c:917
msgid "invalid operand for 'H' modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « H »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'H'"
#: config/cris/cris.c:893
msgid "bad register"
@@ -2856,23 +2814,23 @@ msgstr "thanh ghi sai"
#: config/cris/cris.c:937
msgid "invalid operand for 'e' modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « e »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'e'"
#: config/cris/cris.c:954
msgid "invalid operand for 'm' modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « m »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'm'"
#: config/cris/cris.c:979
msgid "invalid operand for 'A' modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « A »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'A'"
#: config/cris/cris.c:1002
msgid "invalid operand for 'D' modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « D »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'D'"
#: config/cris/cris.c:1016
msgid "invalid operand for 'T' modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « T »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'T'"
#: config/cris/cris.c:1036 config/moxie/moxie.c:181
msgid "invalid operand modifier letter"
@@ -2902,7 +2860,6 @@ msgstr "gặp hiệu ứng khác bất thÆ°á»ng trong địa chỉ"
#. right?
#: config/cris/cris.c:3711
#, fuzzy
-#| msgid "Unidentifiable call op"
msgid "unidentifiable call op"
msgstr "Không thể nhận diện toán tá»­ gá»i"
@@ -2989,43 +2946,43 @@ msgstr "gặp lệnh sai trong frv_print_operand, lập sai const_double"
#: config/frv/frv.c:2850
msgid "bad insn to frv_print_operand, 'e' modifier:"
-msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi « e »:"
+msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi 'e':"
#: config/frv/frv.c:2858
msgid "bad insn to frv_print_operand, 'F' modifier:"
-msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi « F »:"
+msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi 'F':"
#: config/frv/frv.c:2874
msgid "bad insn to frv_print_operand, 'f' modifier:"
-msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi « f »:"
+msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi 'f':"
#: config/frv/frv.c:2888
msgid "bad insn to frv_print_operand, 'g' modifier:"
-msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi « g »:"
+msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi 'g':"
#: config/frv/frv.c:2936
msgid "bad insn to frv_print_operand, 'L' modifier:"
-msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi « L »:"
+msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi 'L':"
#: config/frv/frv.c:2949
msgid "bad insn to frv_print_operand, 'M/N' modifier:"
-msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi « M/N »:"
+msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi 'M/N':"
#: config/frv/frv.c:2970
msgid "bad insn to frv_print_operand, 'O' modifier:"
-msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi « O »:"
+msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi 'O':"
#: config/frv/frv.c:2988
msgid "bad insn to frv_print_operand, P modifier:"
-msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi « P »:"
+msgstr "lệnh sai tới frv_print_operand, bộ sửa đổi 'P':"
#: config/frv/frv.c:3008
msgid "bad insn in frv_print_operand, z case"
-msgstr "lệnh sai tá»›i frv_print_operand, trÆ°á»ng hợp « z »"
+msgstr "lệnh sai tá»›i frv_print_operand, trÆ°á»ng hợp 'z'"
#: config/frv/frv.c:3039
msgid "bad insn in frv_print_operand, 0 case"
-msgstr "lệnh sai tá»›i frv_print_operand, trÆ°á»ng hợp « 0 »"
+msgstr "lệnh sai tá»›i frv_print_operand, trÆ°á»ng hợp '0'"
#: config/frv/frv.c:3044
msgid "frv_print_operand: unknown code"
@@ -3051,58 +3008,57 @@ msgstr "lập sai UNSPEC như là toán hạng"
#: config/i386/i386.c:13801
#, c-format
msgid "'%%&' used without any local dynamic TLS references"
-msgstr "« %%& » bị sử dụng mà không có tham chiếu TLS năng động cục bộ"
+msgstr "'%%&' bị sử dụng mà không có tham chiếu TLS năng động cục bộ"
#: config/i386/i386.c:13892 config/i386/i386.c:13967
#, c-format
msgid "invalid operand size for operand code '%c'"
-msgstr "sai lập kích cỡ toán hạng cho mã toán hạng « %c »"
+msgstr "sai lập kích cỡ toán hạng cho mã toán hạng '%c'"
#: config/i386/i386.c:13962
#, c-format
msgid "invalid operand type used with operand code '%c'"
-msgstr "sử dụng loại toán hạng không hợp lệ với mã toán hạng « %c »"
+msgstr "sử dụng loại toán hạng không hợp lệ với mã toán hạng '%c'"
#: config/i386/i386.c:14043 config/i386/i386.c:14083
#, c-format
msgid "operand is not a condition code, invalid operand code 'D'"
-msgstr "toán hạng không phải là má»™t mã Ä‘iá»u kiện, mã toán hạng sai « D »"
+msgstr "toán hạng không phải là má»™t mã Ä‘iá»u kiện, mã toán hạng sai 'D'"
#: config/i386/i386.c:14109
#, c-format
msgid "operand is neither a constant nor a condition code, invalid operand code 'C'"
-msgstr "toán hạng không phải là hằng số, cÅ©ng không phải là má»™t mã Ä‘iá»u kiện, mã toán hạng sai « C »"
+msgstr "toán hạng không phải là hằng số, cÅ©ng không phải là má»™t mã Ä‘iá»u kiện, mã toán hạng sai 'C'"
#: config/i386/i386.c:14119
#, c-format
msgid "operand is neither a constant nor a condition code, invalid operand code 'F'"
-msgstr "toán hạng không phải là hằng số, cÅ©ng không phải là má»™t mã Ä‘iá»u kiện, mã toán hạng sai « F »"
+msgstr "toán hạng không phải là hằng số, cÅ©ng không phải là má»™t mã Ä‘iá»u kiện, mã toán hạng sai 'F'"
#: config/i386/i386.c:14137
#, c-format
msgid "operand is neither a constant nor a condition code, invalid operand code 'c'"
-msgstr "toán hạng không phải là hằng số, cÅ©ng không phải là má»™t mã Ä‘iá»u kiện, mã toán hạng sai « c »"
+msgstr "toán hạng không phải là hằng số, cÅ©ng không phải là má»™t mã Ä‘iá»u kiện, mã toán hạng sai 'c'"
#: config/i386/i386.c:14147
#, c-format
msgid "operand is neither a constant nor a condition code, invalid operand code 'f'"
-msgstr "toán hạng không phải là hằng số, cÅ©ng không phải là má»™t mã Ä‘iá»u kiện, mã toán hạng sai « f »"
+msgstr "toán hạng không phải là hằng số, cÅ©ng không phải là má»™t mã Ä‘iá»u kiện, mã toán hạng sai 'f'"
#: config/i386/i386.c:14162
#, fuzzy, c-format
-#| msgid "operand is not a condition code, invalid operand code 'D'"
msgid "operand is not an offsettable memory reference, invalid operand code 'H'"
-msgstr "toán hạng không phải là má»™t mã Ä‘iá»u kiện, mã toán hạng sai « D »"
+msgstr "toán hạng không phải là má»™t mã Ä‘iá»u kiện, mã toán hạng sai 'D'"
#: config/i386/i386.c:14257
#, c-format
msgid "operand is not a condition code, invalid operand code 'Y'"
-msgstr "toán hạng không phải là má»™t mã Ä‘iá»u kiện, mã toán hạng sai « Y »"
+msgstr "toán hạng không phải là má»™t mã Ä‘iá»u kiện, mã toán hạng sai 'Y'"
#: config/i386/i386.c:14287
#, c-format
msgid "invalid operand code '%c'"
-msgstr "mã toán hạng sai « %c »"
+msgstr "mã toán hạng sai '%c'"
#: config/i386/i386.c:14342
#, c-format
@@ -3119,7 +3075,6 @@ msgstr "Sá»­ dụng bố trí trÆ°á»ng bit sở hữu (MS)"
#: config/i386/i386-interix.h:79
#, fuzzy
-#| msgid "Use native (MS) bitfield layout"
msgid "Use gcc default bitfield layout"
msgstr "Sá»­ dụng bố trí trÆ°á»ng bit sở hữu (MS)"
@@ -3133,12 +3088,12 @@ msgstr "chÆ°a xác định biến môi trÆ°á»ng DJGPP"
#: config/i386/xm-djgpp.h:63
#, c-format
msgid "environment variable DJGPP points to missing file '%s'"
-msgstr "biến môi trÆ°á»ng DJGPP chỉ tá»›i tập tin còn thiếu « %s »"
+msgstr "biến môi trÆ°á»ng DJGPP chỉ tá»›i tập tin còn thiếu '%s'"
#: config/i386/xm-djgpp.h:66
#, c-format
msgid "environment variable DJGPP points to corrupt file '%s'"
-msgstr "biến môi trÆ°á»ng DJGPP chỉ tá»›i tập tin bị há»ng « %s »"
+msgstr "biến môi trÆ°á»ng DJGPP chỉ tá»›i tập tin bị há»ng '%s'"
#: config/ia64/ia64.c:5177
#, c-format
@@ -3180,7 +3135,6 @@ msgstr "sai sử dụng %%d, %%x hoặc %%X"
#: config/lm32/lm32.c:521
#, fuzzy, c-format
-#| msgid "Only 0.0 can be loaded as an immediate"
msgid "only 0.0 can be loaded as an immediate"
msgstr "Chỉ 0.0 nạp được nhÆ° là má»™t Ä‘iá»u ngay lập tức"
@@ -3218,7 +3172,7 @@ msgstr "sai lập toán hạng tới mã %%H/%%L"
#: config/m32r/m32r.c:2128
msgid "bad insn for 'A'"
-msgstr "sai lập lệnh cho « A »"
+msgstr "sai lập lệnh cho 'A'"
#: config/m32r/m32r.c:2175
#, c-format
@@ -3262,31 +3216,28 @@ msgid "invalid %%L code"
msgstr "mã %%L sai"
#: config/microblaze/microblaze.c:1734
-#, fuzzy, c-format
-#| msgid "unknown spec function '%s'"
+#, c-format
msgid "unknown punctuation '%c'"
-msgstr "không rõ hàm đặc tả « %s »"
+msgstr "không hiểu dấu chấm câu '%c'"
#: config/microblaze/microblaze.c:1743
#, c-format
msgid "null pointer"
-msgstr ""
+msgstr "con trá» rá»—ng"
#: config/microblaze/microblaze.c:1778
#, c-format
msgid "PRINT_OPERAND, invalid insn for %%C"
-msgstr ""
+msgstr "PRINT_OPERAND, sai insn cho %%C"
#: config/microblaze/microblaze.c:1807
#, c-format
msgid "PRINT_OPERAND, invalid insn for %%N"
-msgstr ""
+msgstr "PRINT_OPERAND, sai insn cho %%N"
#: config/microblaze/microblaze.c:1827 config/microblaze/microblaze.c:1988
-#, fuzzy
-#| msgid "invalid address"
msgid "insn contains an invalid address !"
-msgstr "địa chỉ sai"
+msgstr "insn chứa một địa chỉ sai !"
#: config/microblaze/microblaze.c:1841 config/microblaze/microblaze.c:2028
#: config/xtensa/xtensa.c:2437
@@ -3301,14 +3252,14 @@ msgstr ""
#: config/mips/mips.c:7709 config/mips/mips.c:7730 config/mips/mips.c:7850
#, c-format
msgid "'%%%c' is not a valid operand prefix"
-msgstr "« %%%c » không phải là má»™t tiá»n tố toán hạng đúng"
+msgstr "'%%%c' không phải là má»™t tiá»n tố toán hạng đúng"
#: config/mips/mips.c:7787 config/mips/mips.c:7794 config/mips/mips.c:7801
#: config/mips/mips.c:7808 config/mips/mips.c:7868 config/mips/mips.c:7882
#: config/mips/mips.c:7895 config/mips/mips.c:7904
#, c-format
msgid "invalid use of '%%%c'"
-msgstr "sai sử dụng « %%%c »"
+msgstr "sai sử dụng '%%%c'"
#: config/mips/mips.c:8126
msgid "mips_debugger_offset called with non stack/frame/arg pointer"
@@ -3316,48 +3267,48 @@ msgstr "mips_debugger_offset bị gá»i mà không có hàm trá» tá»›i đống/
#: config/mmix/mmix.c:1611 config/mmix/mmix.c:1741
msgid "MMIX Internal: Expected a CONST_INT, not this"
-msgstr "MMIX nội bộ : mong đợi một CONST_INT, không phải như thế"
+msgstr "MMIX nội bộ: mong đợi một CONST_INT, không phải như thế"
#: config/mmix/mmix.c:1690
msgid "MMIX Internal: Bad value for 'm', not a CONST_INT"
-msgstr "MMIX nội bộ : sai lập giá trị cho « m », không phải là một CONST_INT"
+msgstr "MMIX nội bộ: sai lập giá trị cho 'm', không phải là một CONST_INT"
#: config/mmix/mmix.c:1709
msgid "MMIX Internal: Expected a register, not this"
-msgstr "MMIX nội bộ : mong đợi một thanh ghi, không phải như thế"
+msgstr "MMIX nội bộ: mong đợi một thanh ghi, không phải như thế"
#: config/mmix/mmix.c:1719
msgid "MMIX Internal: Expected a constant, not this"
-msgstr "MMIX nội bộ : mong đợi một rằng buộc, không phải như thế"
+msgstr "MMIX nội bộ: mong đợi một rằng buộc, không phải như thế"
#. We need the original here.
#: config/mmix/mmix.c:1803
msgid "MMIX Internal: Cannot decode this operand"
-msgstr "MMIX nội bộ : không thể giải mã toán hạng này"
+msgstr "MMIX nội bộ: không thể giải mã toán hạng này"
#: config/mmix/mmix.c:1860
msgid "MMIX Internal: This is not a recognized address"
-msgstr "MMIX nội bộ : đây không phải là một địa chỉ nhận ra"
+msgstr "MMIX nội bộ: đây không phải là một địa chỉ nhận ra"
#: config/mmix/mmix.c:2735
msgid "MMIX Internal: Trying to output invalidly reversed condition:"
-msgstr "MMIX ná»™i bá»™ : Ä‘ang thá»­ xuất Ä‘iá»u kiện sai đảo ngược:"
+msgstr "MMIX ná»™i bá»™: Ä‘ang thá»­ xuất Ä‘iá»u kiện sai đảo ngược:"
#: config/mmix/mmix.c:2742
msgid "MMIX Internal: What's the CC of this?"
-msgstr "MMIX ná»™i bá»™ : CC của Ä‘iá»u này là gì?"
+msgstr "MMIX ná»™i bá»™: CC của Ä‘iá»u này là gì?"
#: config/mmix/mmix.c:2746
msgid "MMIX Internal: What is the CC of this?"
-msgstr "MMIX ná»™i bá»™ : CC của Ä‘iá»u này là gì?"
+msgstr "MMIX ná»™i bá»™: CC của Ä‘iá»u này là gì?"
#: config/mmix/mmix.c:2810
msgid "MMIX Internal: This is not a constant:"
-msgstr "MMIX nội bộ : đây không phải là một hằng số :"
+msgstr "MMIX nội bộ: đây không phải là một hằng số:"
#: config/picochip/picochip.c:2665
msgid "picochip_print_memory_address - Operand isn't memory based"
-msgstr "picochip_print_memory_address : toán hạng không phải dựa vào vùng nhớ"
+msgstr "picochip_print_memory_address: toán hạng không phải dựa vào vùng nhớ"
#: config/picochip/picochip.c:2924
msgid "Unknown mode in print_operand (CONST_DOUBLE) :"
@@ -3384,31 +3335,31 @@ msgstr "Không đủ sức chứa trong đống.\n"
#: config/rs6000/host-darwin.c:116
#, c-format
msgid "Try running '%s' in the shell to raise its limit.\n"
-msgstr "Hãy thử chạy « %s » trong trình bao để tăng giới hạn.\n"
+msgstr "Hãy thử chạy '%s' trong trình bao để tăng giới hạn.\n"
#: config/rs6000/rs6000.c:2758
msgid "-mvsx requires hardware floating point"
-msgstr "« -mvsx » yêu cầu điểm phù động loại phần cứng"
+msgstr "-mvsx yêu cầu điểm phù động loại phần cứng"
#: config/rs6000/rs6000.c:2763
msgid "-mvsx and -mpaired are incompatible"
-msgstr "« -mvsx » và « -mpaired » không tương thích với nhau"
+msgstr "-mvsx và -mpaired không tương thích với nhau"
#: config/rs6000/rs6000.c:2768
msgid "-mvsx used with little endian code"
-msgstr "« -mvsx » bị sá»­ dụng vá»›i mã vá» cuối nhá»"
+msgstr "-mvsx bị sá»­ dụng vá»›i mã vá» cuối nhá»"
#: config/rs6000/rs6000.c:2770
msgid "-mvsx needs indexed addressing"
-msgstr "« -mvsx » yêu cầu đặt địa chỉ một cách phụ lục"
+msgstr "-mvsx yêu cầu đặt địa chỉ một cách phụ lục"
#: config/rs6000/rs6000.c:2774
msgid "-mvsx and -mno-altivec are incompatible"
-msgstr "« -mvsx » và « -mno-altivec » không tương thích với nhau"
+msgstr "-mvsx và -mno-altivec không tương thích với nhau"
#: config/rs6000/rs6000.c:2776
msgid "-mno-altivec disables vsx"
-msgstr "« -mno-altivec » thì tắt vsx"
+msgstr "-mno-altivec thì tắt vsx"
#: config/rs6000/rs6000.c:7324
msgid "bad move"
@@ -3492,7 +3443,7 @@ msgstr "giá trị %%x sai"
#: config/rs6000/rs6000.c:15323
#, c-format
msgid "invalid %%y value, try using the 'Z' constraint"
-msgstr "giá trị %%y sai, hãy thử sử dụng ràng buộc « Z »"
+msgstr "giá trị %%y sai, hãy thử sử dụng ràng buộc 'Z'"
#: config/rs6000/rs6000.c:26944
msgid "AltiVec argument passed to unprototyped function"
@@ -3510,15 +3461,13 @@ msgstr "không thể phân ly địa chỉ"
#: config/s390/s390.c:5210
#, fuzzy, c-format
-#| msgid "invalid operand for 'b' modifier"
msgid "invalid comparison operator for 'E' output modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « b »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'b'"
#: config/s390/s390.c:5231
#, fuzzy, c-format
-#| msgid "invalid operand for 'b' modifier"
msgid "invalid reference for 'J' output modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « b »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'b'"
#: config/s390/s390.c:5245
#, c-format
@@ -3527,9 +3476,8 @@ msgstr ""
#: config/s390/s390.c:5256
#, fuzzy, c-format
-#| msgid "invalid operand for 'O' modifier"
msgid "invalid address for 'O' output modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « O »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'O'"
#: config/s390/s390.c:5274
#, c-format
@@ -3538,9 +3486,8 @@ msgstr ""
#: config/s390/s390.c:5285
#, fuzzy, c-format
-#| msgid "invalid operand for 'b' modifier"
msgid "invalid address for 'R' output modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « b »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'b'"
#: config/s390/s390.c:5303
#, c-format
@@ -3549,9 +3496,8 @@ msgstr ""
#: config/s390/s390.c:5313
#, fuzzy, c-format
-#| msgid "invalid operand for 'b' modifier"
msgid "invalid address for 'S' output modifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « b »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'b'"
#: config/s390/s390.c:5333
#, c-format
@@ -3565,32 +3511,28 @@ msgstr ""
#: config/s390/s390.c:5408
#, fuzzy, c-format
-#| msgid "invalid operand output code"
msgid "invalid constant - try using an output modifier"
msgstr "sai lập mã kết xuất toán hạng"
#: config/s390/s390.c:5411
#, fuzzy, c-format
-#| msgid "invalid operand for 'o' modifier"
msgid "invalid constant for output modifier '%c'"
-msgstr "sai lập toán hạng cho sự sửa đổi « o »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'o'"
#: config/s390/s390.c:5418
#, fuzzy, c-format
-#| msgid "invalid expression as operand"
msgid "invalid expression - try using an output modifier"
msgstr "sai lập biểu tượng dưới dạng toán hạng"
#: config/s390/s390.c:5421
#, fuzzy, c-format
-#| msgid "invalid operand for 'o' modifier"
msgid "invalid expression for output modifier '%c'"
-msgstr "sai lập toán hạng cho sự sửa đổi « o »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'o'"
#: config/score/score.c:1344
#, c-format
msgid "invalid operand for code: '%c'"
-msgstr "sai lập toán hạng cho mã: « %c »"
+msgstr "sai lập toán hạng cho mã: '%c'"
#: config/sh/sh.c:1031
#, c-format
@@ -3631,16 +3573,14 @@ msgstr "toán hạng %%B sai"
#: config/sparc/sparc.c:8247 config/tilegx/tilegx.c:4934
#: config/tilepro/tilepro.c:4499
-#, fuzzy, c-format
-#| msgid "invalid %%P operand"
+#, c-format
msgid "invalid %%C operand"
-msgstr "gặp toán hạng %%P sai"
+msgstr "sai toán hạng %%C"
#: config/sparc/sparc.c:8264 config/tilegx/tilegx.c:4967
-#, fuzzy, c-format
-#| msgid "invalid %%P operand"
+#, c-format
msgid "invalid %%D operand"
-msgstr "gặp toán hạng %%P sai"
+msgstr "sai toán hạng %%D"
#: config/sparc/sparc.c:8280
#, c-format
@@ -3665,17 +3605,17 @@ msgstr "hằng số điểm phù động không phải là một toán hạng ng
#: config/stormy16/stormy16.c:1722 config/stormy16/stormy16.c:1793
#, c-format
msgid "'B' operand is not constant"
-msgstr "toán hạng « B » không phải là một hằng số"
+msgstr "toán hạng 'B' không phải là một hằng số"
#: config/stormy16/stormy16.c:1749
#, c-format
msgid "'B' operand has multiple bits set"
-msgstr "toán hạng « B » có nhiá»u bit được lập"
+msgstr "toán hạng 'B' có nhiá»u bit được lập"
#: config/stormy16/stormy16.c:1775
#, c-format
msgid "'o' operand is not constant"
-msgstr "toán hạng « o » không phải là một hằng số"
+msgstr "toán hạng 'o' không phải là một hằng số"
#: config/stormy16/stormy16.c:1807
#, c-format
@@ -3694,92 +3634,78 @@ msgstr "toán hạng %%d sai"
#: config/tilegx/tilegx.c:5033
#, fuzzy, c-format
-#| msgid "invalid %%L code"
msgid "invalid %%H specifier"
msgstr "mã %%L sai"
#: config/tilegx/tilegx.c:5069 config/tilepro/tilepro.c:4513
-#, fuzzy, c-format
-#| msgid "invalid %%P operand"
+#, c-format
msgid "invalid %%h operand"
-msgstr "gặp toán hạng %%P sai"
+msgstr "sai toán hạng %%h"
#: config/tilegx/tilegx.c:5081 config/tilepro/tilepro.c:4577
-#, fuzzy, c-format
-#| msgid "invalid %%P operand"
+#, c-format
msgid "invalid %%I operand"
-msgstr "gặp toán hạng %%P sai"
+msgstr "sai toán hạng %%I"
#: config/tilegx/tilegx.c:5095 config/tilepro/tilepro.c:4591
-#, fuzzy, c-format
-#| msgid "invalid %%P operand"
+#, c-format
msgid "invalid %%i operand"
-msgstr "gặp toán hạng %%P sai"
+msgstr "sai toán hạng %%i"
#: config/tilegx/tilegx.c:5118 config/tilepro/tilepro.c:4614
-#, fuzzy, c-format
-#| msgid "invalid %%P operand"
+#, c-format
msgid "invalid %%j operand"
-msgstr "gặp toán hạng %%P sai"
+msgstr "sai toán hạng %%j"
#: config/tilegx/tilegx.c:5149
-#, fuzzy, c-format
-#| msgid "invalid %%c operand"
+#, c-format
msgid "invalid %%%c operand"
-msgstr "toán hạng %%c sai"
+msgstr "sai toán hạng %%%c"
#: config/tilegx/tilegx.c:5164 config/tilepro/tilepro.c:4728
-#, fuzzy, c-format
-#| msgid "invalid %%P operand"
+#, c-format
msgid "invalid %%N operand"
-msgstr "gặp toán hạng %%P sai"
+msgstr "sai toán hạng %%N"
#: config/tilegx/tilegx.c:5208
#, fuzzy, c-format
-#| msgid "invalid operand for 'b' modifier"
msgid "invalid operand for 'r' specifier"
-msgstr "sai lập toán hạng cho sự sửa đổi « b »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'b'"
#: config/tilegx/tilegx.c:5233 config/tilepro/tilepro.c:4810
#, c-format
msgid "unable to print out operand yet; code == %d (%c)"
-msgstr ""
+msgstr "thậm chí không thể in ra toán hạng; mã == %d (%c)"
#: config/tilepro/tilepro.c:4549
-#, fuzzy, c-format
-#| msgid "invalid %%P operand"
+#, c-format
msgid "invalid %%H operand"
-msgstr "gặp toán hạng %%P sai"
+msgstr "sai toán hạng %%H"
#: config/tilepro/tilepro.c:4653
-#, fuzzy, c-format
-#| msgid "invalid %%P operand"
+#, c-format
msgid "invalid %%L operand"
-msgstr "gặp toán hạng %%P sai"
+msgstr "sai toán hạng %%L"
#: config/tilepro/tilepro.c:4713
-#, fuzzy, c-format
-#| msgid "invalid %%P operand"
+#, c-format
msgid "invalid %%M operand"
-msgstr "gặp toán hạng %%P sai"
+msgstr "sai toán hạng %%M"
#: config/tilepro/tilepro.c:4756
-#, fuzzy, c-format
-#| msgid "invalid %%P operand"
+#, c-format
msgid "invalid %%t operand"
-msgstr "gặp toán hạng %%P sai"
+msgstr "sai toán hạng %%t"
#: config/tilepro/tilepro.c:4763
-#, fuzzy, c-format
-#| msgid "invalid %%P operand"
+#, c-format
msgid "invalid %%t operand '"
-msgstr "gặp toán hạng %%P sai"
+msgstr "sai toán hạng %%t '"
#: config/tilepro/tilepro.c:4784
-#, fuzzy, c-format
-#| msgid "invalid %%P operand"
+#, c-format
msgid "invalid %%r operand"
-msgstr "gặp toán hạng %%P sai"
+msgstr "sai toán hạng %%r"
#: config/v850/v850.c:260
msgid "const_double_split got a bad insn:"
@@ -3886,7 +3812,7 @@ msgstr "<lỗi loại>"
msgid "<anonymous %s>"
msgstr "<%s nặc danh>"
-# Literal: don't translate; Nghĩa chữ : dừng dịch
+# Literal: don't translate; Nghĩa chữ: dừng dịch
#. A lambda's "type" is essentially its signature.
#: cp/error.c:663
msgid "<lambda"
@@ -3915,14 +3841,11 @@ msgid "<return value> "
msgstr "<giá trị trả lại>"
#: cp/error.c:1031
-#, fuzzy
-#| msgid "({anonymous})"
msgid "{anonymous}"
-msgstr "({nặc danh})"
+msgstr "{nặc danh}"
#: cp/error.c:1128
#, fuzzy
-#| msgid "<template parameter error>"
msgid "<template arguments error>"
msgstr "<lỗi tham số mẫu>"
@@ -3998,25 +3921,23 @@ msgstr "Trong hàm λ"
#: cp/error.c:3005
#, fuzzy, c-format
-#| msgid "%s: In instantiation of %qs:\n"
msgid "%s: In substitution of %qS:\n"
msgstr "%s: Trong bộ tạo lần %qs:\n"
#: cp/error.c:3006
#, fuzzy
-#| msgid "%s: In instantiation of %qs:\n"
msgid "%s: In instantiation of %q#D:\n"
msgstr "%s: Trong bộ tạo lần %qs:\n"
#: cp/error.c:3029
#, c-format
msgid "%s:%d:%d: "
-msgstr ""
+msgstr "%s:%d:%d: "
#: cp/error.c:3032
#, c-format
msgid "%s:%d: "
-msgstr ""
+msgstr "%s:%d: "
#: cp/error.c:3040
#, c-format
@@ -4034,15 +3955,15 @@ msgstr ""
#: cp/error.c:3047
msgid "required from %q#D\n"
-msgstr ""
+msgstr "được yêu cầu từ %q#D\n"
#: cp/error.c:3054
msgid "recursively required from here"
-msgstr ""
+msgstr "yêu cầu đệ quy từ đây"
#: cp/error.c:3055
msgid "required from here"
-msgstr ""
+msgstr "được yêu cầu từ đây"
#: cp/error.c:3097
#, c-format
@@ -4056,13 +3977,11 @@ msgstr "%s:%d: [ đang bỠqua %d ngữ cảnh tạo lần ]\n"
#: cp/error.c:3163
#, fuzzy, c-format
-#| msgid "%s:%d:%d: instantiated from %qs\n"
msgid "%s:%d:%d: in constexpr expansion of %qs"
msgstr "%s:%d:%d: lần tạo từ %qs\n"
#: cp/error.c:3167
#, fuzzy, c-format
-#| msgid "%s:%d: instantiated from %qs\n"
msgid "%s:%d: in constexpr expansion of %qs"
msgstr "%s:%d: lần tạo từ %qs\n"
@@ -4071,8 +3990,7 @@ msgid "candidates are:"
msgstr "ứng cử là:"
#: cp/pt.c:17843 cp/call.c:3289
-#, fuzzy, gcc-internal-format
-#| msgid "candidate is:"
+#, gcc-internal-format
msgid "candidate is:"
msgid_plural "candidates are:"
msgstr[0] "ứng cử là:"
@@ -4197,22 +4115,22 @@ msgstr "thao tác nhị phân loại yếu tố"
#: fortran/check.c:1638 fortran/check.c:2554 fortran/check.c:2608
#, c-format
msgid "arguments '%s' and '%s' for intrinsic %s"
-msgstr "đối số « %s » và « %s » cho %s thực chất"
+msgstr "đối số '%s' và '%s' cho %s thực chất"
#: fortran/check.c:2360
#, c-format
msgid "arguments 'a%d' and 'a%d' for intrinsic '%s'"
-msgstr "đối số « a%d » và « a%d » cho « %s » thực chất"
+msgstr "đối số 'a%d' và 'a%d' cho '%s' thực chất"
#: fortran/check.c:2873 fortran/intrinsic.c:3932
#, c-format
msgid "arguments '%s' and '%s' for intrinsic '%s'"
-msgstr "đối số « %s » và « %s » cho « %s » thực chất"
+msgstr "đối số '%s' và '%s' cho '%s' thực chất"
#: fortran/error.c:738 fortran/error.c:792 fortran/error.c:827
#: fortran/error.c:902
msgid "Warning:"
-msgstr "Cảnh báo :"
+msgstr "Cảnh báo:"
#: fortran/error.c:794 fortran/error.c:882 fortran/error.c:932
msgid "Error:"
@@ -4264,7 +4182,7 @@ msgstr "Äang Ä‘iá»u khiển:"
#: fortran/interface.c:2478 fortran/intrinsic.c:3641
msgid "actual argument to INTENT = OUT/INOUT"
-msgstr ""
+msgstr "tham số thực tế cho INTENT = OUT/INOUT"
#: fortran/io.c:549
msgid "Positive width required"
@@ -4276,7 +4194,7 @@ msgstr "Yêu cầu chiá»u rá»™ng không phải âm"
#: fortran/io.c:551
msgid "Unexpected element '%c' in format string at %L"
-msgstr "Gặp yếu tố bất thÆ°á»ng « %c » trong chuá»—i định dạng tại %L"
+msgstr "Gặp yếu tố bất thÆ°á»ng '%c' trong chuá»—i định dạng tại %L"
#: fortran/io.c:553
msgid "Unexpected end of format string"
@@ -4292,28 +4210,28 @@ msgstr "Thiếu dấu ngoặc đơn mở đi trước"
#: fortran/io.c:603
msgid "Left parenthesis required after '*'"
-msgstr "Äẳng sau « * » thì yêu cầu má»™t dấu ngoặc Ä‘Æ¡n mở"
+msgstr "Äẳng sau '*' thì yêu cầu má»™t dấu ngoặc Ä‘Æ¡n mở"
#: fortran/io.c:634
msgid "Expected P edit descriptor"
-msgstr "Mong đợi bộ mô tả chỉnh sửa « P »"
+msgstr "cần bộ mô tả chỉnh sửa P"
#. P requires a prior number.
#: fortran/io.c:642
msgid "P descriptor requires leading scale factor"
-msgstr "Bộ mô tả « P » yêu cầu hệ số tỷ lệ đi trước"
+msgstr "Bộ mô tả P yêu cầu hệ số tỷ lệ đi trước"
#: fortran/io.c:737 fortran/io.c:751
msgid "Comma required after P descriptor"
-msgstr "Äẳng sau bá»™ mô tả « P » thì yêu cầu má»™t dấu phẩy"
+msgstr "Äẳng sau bá»™ mô tả P thì yêu cầu má»™t dấu phẩy"
#: fortran/io.c:765
msgid "Positive width required with T descriptor"
-msgstr "Dùng bá»™ mô tả « T » thì yêu cầu chiá»u rá»™ng dÆ°Æ¡ng"
+msgstr "Dùng bá»™ mô tả T thì yêu cầu chiá»u rá»™ng dÆ°Æ¡ng"
#: fortran/io.c:844
msgid "E specifier not allowed with g0 descriptor"
-msgstr "Dùng bộ mô tả « g0 » thì không cho phép bộ ghi rõ « E »"
+msgstr "Dùng bộ mô tả g0 thì không cho phép bộ ghi rõ E"
#: fortran/io.c:914
msgid "Positive exponent width required"
@@ -4326,11 +4244,10 @@ msgstr "Bộ ghi rõ định dạng thì yêu cầu một dấu chấm"
#: fortran/io.c:1533
#, c-format
msgid "%s tag"
-msgstr ""
+msgstr "thẻ %s"
#: fortran/io.c:2868
#, fuzzy
-#| msgid "internal function"
msgid "internal unit in WRITE"
msgstr "hàm nội bộ"
@@ -4474,12 +4391,12 @@ msgstr "Gặp ngữ cảnh sai cho hàm trỠNULL() tại %%L"
#: fortran/resolve.c:3814
#, c-format
msgid "Operand of unary numeric operator '%s' at %%L is %s"
-msgstr "Tại %%L có một toán tử thuộc số nguyên phân « %s » với toán hạng %s"
+msgstr "Tại %%L có một toán tử thuộc số nguyên phân '%s' với toán hạng %s"
#: fortran/resolve.c:3830
#, c-format
msgid "Operands of binary numeric operator '%s' at %%L are %s/%s"
-msgstr "Tại %%L có một toán tử thuộc số nhị phân « %s » với các toán hạng %s/%s"
+msgstr "Tại %%L có một toán tử thuộc số nhị phân '%s' với các toán hạng %s/%s"
#: fortran/resolve.c:3845
#, c-format
@@ -4489,12 +4406,12 @@ msgstr "Tại %%L có một toán tử ghép nối chuỗi với các toán hạ
#: fortran/resolve.c:3864
#, c-format
msgid "Operands of logical operator '%s' at %%L are %s/%s"
-msgstr "Tại %%L có một toán tử hợp lý « %s » với các toán hạng %s/%s"
+msgstr "Tại %%L có một toán tử hợp lý '%s' với các toán hạng %s/%s"
#: fortran/resolve.c:3878
#, c-format
msgid "Operand of .not. operator at %%L is %s"
-msgstr "Tại %%L có một toán tử « .not. » với toán hạng %s"
+msgstr "Tại %%L có một toán tử .not. với toán hạng %s"
#: fortran/resolve.c:3892
msgid "COMPLEX quantities cannot be compared at %L"
@@ -4508,22 +4425,22 @@ msgstr "Tại %%L thì các bộ hợp lý phải được so sánh với %s tha
#: fortran/resolve.c:3927
#, c-format
msgid "Operands of comparison operator '%s' at %%L are %s/%s"
-msgstr "Tại %%L có một toán tử so sánh « %s » với các toán hạng %s/%s"
+msgstr "Tại %%L có một toán tử so sánh '%s' với các toán hạng %s/%s"
#: fortran/resolve.c:3935
#, c-format
msgid "Unknown operator '%s' at %%L"
-msgstr "Không rõ toán tử « %s » tại %%L"
+msgstr "Không rõ toán tử '%s' tại %%L"
#: fortran/resolve.c:3937
#, c-format
msgid "Operand of user operator '%s' at %%L is %s"
-msgstr "Tại %%L có má»™t toán tá»­ ngÆ°á»i dùng « %s » vá»›i toán hạng %s"
+msgstr "Tại %%L có má»™t toán tá»­ ngÆ°á»i dùng '%s' vá»›i toán hạng %s"
#: fortran/resolve.c:3941
#, c-format
msgid "Operands of user operator '%s' at %%L are %s/%s"
-msgstr "Tại %%L có má»™t toán tá»­ ngÆ°á»i dùng « %s » vá»›i các toán hạng %s/%s"
+msgstr "Tại %%L có má»™t toán tá»­ ngÆ°á»i dùng '%s' vá»›i các toán hạng %s/%s"
#: fortran/resolve.c:4029
#, c-format
@@ -4536,7 +4453,6 @@ msgstr "Biến vòng lặp"
#: fortran/resolve.c:6405
#, fuzzy
-#| msgid "Loop variable"
msgid "iterator variable"
msgstr "Biến vòng lặp"
@@ -4554,23 +4470,19 @@ msgstr "Biểu thức bước trong vòng lặp DO (làm)"
#: fortran/resolve.c:6674 fortran/resolve.c:6677
msgid "DEALLOCATE object"
-msgstr ""
+msgstr "đối tượng DEALLOCATE"
#: fortran/resolve.c:7019 fortran/resolve.c:7021
msgid "ALLOCATE object"
-msgstr ""
+msgstr "đối tượng ALLOCATE"
#: fortran/resolve.c:7201 fortran/resolve.c:8434
-#, fuzzy
-#| msgid "Loop variable"
msgid "STAT variable"
-msgstr "Biến vòng lặp"
+msgstr "biến STAT"
#: fortran/resolve.c:7244 fortran/resolve.c:8446
-#, fuzzy
-#| msgid "Loop variable"
msgid "ERRMSG variable"
-msgstr "Biến vòng lặp"
+msgstr "Biến ERRMSG"
#: fortran/resolve.c:8312
msgid "item in READ"
@@ -4578,7 +4490,7 @@ msgstr ""
#: fortran/resolve.c:8458
msgid "ACQUIRED_LOCK variable"
-msgstr ""
+msgstr "biến ACQUIRED_LOCK"
#: fortran/trans-array.c:1408
#, c-format
@@ -4592,12 +4504,12 @@ msgstr ""
#: fortran/trans-decl.c:4791
#, c-format
msgid "Actual string length does not match the declared one for dummy argument '%s' (%ld/%ld)"
-msgstr "Chiá»u dài chuá»—i thật không tÆ°Æ¡ng ứng vá»›i Ä‘iá»u tuyên bố cho đối số giả « %s » (%ld/%ld)"
+msgstr "Chiá»u dài chuá»—i thật không tÆ°Æ¡ng ứng vá»›i Ä‘iá»u tuyên bố cho đối số giả '%s' (%ld/%ld)"
#: fortran/trans-decl.c:4799
#, c-format
msgid "Actual string length is shorter than the declared one for dummy argument '%s' (%ld/%ld)"
-msgstr "Chiá»u dài chuá»—i thật vẫn nhá» hÆ¡n Ä‘iá»u tuyên bố cho đối số giả « %s » (%ld/%ld)"
+msgstr "Chiá»u dài chuá»—i thật vẫn nhá» hÆ¡n Ä‘iá»u tuyên bố cho đối số giả '%s' (%ld/%ld)"
#: fortran/trans-expr.c:5964
#, c-format
@@ -4611,7 +4523,6 @@ msgstr "%3$s chứa các chiá»u dài ký tá»± khác nhau (%1$ld/%2$ld)"
#: fortran/trans-intrinsic.c:6054
#, fuzzy, c-format
-#| msgid "Argument NCOPIES of REPEAT intrinsic is negative (its value is %lld)"
msgid "Argument NCOPIES of REPEAT intrinsic is negative (its value is %ld)"
msgstr "Äiá»u thá»±c chất REPEAT (lặp lại) có đối số NCOPIES (số các bản sao) vá»›i giá trị âm (%lld)"
@@ -4662,20 +4573,18 @@ msgstr ""
#: fortran/trans.c:794
#, fuzzy, c-format
-#| msgid "Attempting to allocate already allocated array '%s'"
msgid "Attempting to allocate already allocated variable '%s'"
-msgstr "Äang thá»­ cấp phát má»™t mảng đã cấp phát « %s »"
+msgstr "Äang thá»­ cấp phát má»™t mảng đã cấp phát '%s'"
#: fortran/trans.c:800
#, fuzzy
-#| msgid "Attempting to allocate already allocatedarray"
msgid "Attempting to allocate already allocated variable"
msgstr "Äang thá»­ cấp phát má»™t mảng đã cấp phát"
#: fortran/trans.c:909 fortran/trans.c:1053
#, c-format
msgid "Attempt to DEALLOCATE unallocated '%s'"
-msgstr "Äang thá»­ BỎ cấp phát má»™t mảng đã bá» cấp phát « %s »"
+msgstr "Äang thá»­ BỎ cấp phát má»™t mảng đã bá» cấp phát '%s'"
#: go/go-backend.c:170
msgid "lseek failed while reading export data"
@@ -4683,13 +4592,12 @@ msgstr ""
#: go/go-backend.c:177
#, fuzzy
-#| msgid "Memory allocation failed"
msgid "memory allocation failed while reading export data"
msgstr "Lỗi cấp phát vùng nhớ"
#: go/go-backend.c:185
msgid "read failed while reading export data"
-msgstr ""
+msgstr "Ä‘á»c gặp lá»—i khi Ä‘á»c dữ liệu xuất"
#: go/go-backend.c:191
msgid "short read while reading export data"
@@ -4728,7 +4636,7 @@ msgstr "gặp lá»—i khi phân tích cú pháp của các thuá»™c tính cuối cÃ
#: java/jcf-dump.c:1134
#, c-format
msgid "Try 'jcf-dump --help' for more information.\n"
-msgstr "Hãy thử chạy câu lệnh trợ giúp « jcf-dump --help » để xem thêm thông tin.\n"
+msgstr "Hãy thử chạy câu lệnh trợ giúp 'jcf-dump --help' để xem thêm thông tin.\n"
#: java/jcf-dump.c:1141
#, c-format
@@ -4756,7 +4664,7 @@ msgstr " -c Tháo rá»i các thân phÆ°Æ¡ng pháp\n"
#: java/jcf-dump.c:1144
#, c-format
msgid " --javap Generate output in 'javap' format\n"
-msgstr " --javap Tạo kết xuất bằng định dạng « javap »\n"
+msgstr " --javap Tạo kết xuất bằng định dạng 'javap'\n"
#: java/jcf-dump.c:1146
#, c-format
@@ -4815,7 +4723,7 @@ msgstr "jcf-dump: chưa ghi rõ hạng nào\n"
#: java/jcf-dump.c:1282
#, c-format
msgid "Cannot open '%s' for output.\n"
-msgstr "Không thể mở « %s » cho kết xuất.\n"
+msgstr "Không thể mở '%s' cho kết xuất.\n"
#: java/jcf-dump.c:1327
#, c-format
@@ -4844,47 +4752,44 @@ msgstr "%s: Không đóng được tập tin kết xuất %s\n"
#: gcc.c:654
msgid "-fuse-linker-plugin is not supported in this configuration"
-msgstr ""
+msgstr "-fuse-linker-plugin không được hỗ trợ trong cấu hình này"
#: gcc.c:778 ada/gcc-interface/lang-specs.h:33 java/jvspec.c:80
msgid "-pg and -fomit-frame-pointer are incompatible"
-msgstr "hai tùy chá»n « --pg » và « --fomit-frame-pointer » không tÆ°Æ¡ng thích vá»›i nhau"
+msgstr "hai tùy chá»n --pg và --fomit-frame-pointer không tÆ°Æ¡ng thích vá»›i nhau"
#: gcc.c:945
msgid "GNU C no longer supports -traditional without -E"
-msgstr "C của GNU không còn hỗ trợ « -traditional » mà không có « -E »"
+msgstr "C của GNU không còn hỗ trợ -traditional mà không có -E"
#: gcc.c:954
msgid "-E or -x required when input is from standard input"
-msgstr "Nhập từ đầu vào tiêu chuẩn thì cÅ©ng yêu cầu tuỳ chá»n « -E » hoặc « -x »"
+msgstr "Nhập từ đầu vào tiêu chuẩn thì cÅ©ng yêu cầu tuỳ chá»n -E hoặc -x"
#: config/cris/cris.h:192
#, fuzzy
-#| msgid "Do not specify both -march=... and -mcpu=..."
msgid "do not specify both -march=... and -mcpu=..."
-msgstr "Äừng ghi rõ đồng thá»i hai tuỳ chá»n « -march=... » và « -mcpu=... »"
+msgstr "Äừng ghi rõ đồng thá»i hai tuỳ chá»n -march=... và -mcpu=..."
#: config/alpha/freebsd.h:34 config/sparc/freebsd.h:46
#: config/ia64/freebsd.h:26 config/arm/freebsd.h:31 config/i386/freebsd.h:96
#: config/i386/freebsd64.h:35 config/rs6000/sysv4.h:771
#, fuzzy
-#| msgid "consider using `-pg' instead of `-p' with gprof(1)"
msgid "consider using '-pg' instead of '-p' with gprof(1)"
-msgstr "sử dụng gprof(1) thì đỠnghị bạn lập « -pg » thay cho « -p »"
+msgstr "sử dụng gprof(1) thì đỠnghị bạn lập '-pg' thay cho '-p'"
#: ada/gcc-interface/lang-specs.h:34
msgid "-c or -S required for Ada"
-msgstr "sử dụng Ada thì cũng yêu cầu « -c » hoặc « -S »"
+msgstr "sử dụng Ada thì cũng yêu cầu -c hoặc -S"
#: ada/gcc-interface/lang-specs.h:52
#, fuzzy
-#| msgid "-c or -S required for Ada"
msgid "-c required for gnat2why"
-msgstr "sử dụng Ada thì cũng yêu cầu « -c » hoặc « -S »"
+msgstr "sử dụng Ada thì cũng yêu cầu -c hoặc -S"
#: config/rx/rx.h:57
msgid "-mas100-syntax is incompatible with -gdwarf"
-msgstr "« -mas100-syntax » không tương thích với « -gdwarf »"
+msgstr "-mas100-syntax không tương thích với -gdwarf"
#: config/rx/rx.h:58
msgid "rx200 cpu does not have FPU hardware"
@@ -4894,16 +4799,15 @@ msgstr "CPU rx200 không có phần cứng đơn vị điểm phù động (FPU)
#: config/sparc/netbsd-elf.h:109 config/sparc/netbsd-elf.h:118
#: config/sparc/sol2.h:201 config/sparc/sol2.h:207
msgid "may not use both -m32 and -m64"
-msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n « -m32 » và « -m64 »"
+msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n -m32 và -m64"
#: config/pa/pa64-hpux.h:30 config/pa/pa64-hpux.h:33 config/pa/pa64-hpux.h:42
#: config/pa/pa64-hpux.h:45 config/pa/pa-hpux10.h:89 config/pa/pa-hpux10.h:92
#: config/pa/pa-hpux10.h:100 config/pa/pa-hpux10.h:103
#: config/pa/pa-hpux11.h:108 config/pa/pa-hpux11.h:111
#, fuzzy
-#| msgid "Warning: consider linking with `-static' as system libraries with"
msgid "warning: consider linking with '-static' as system libraries with"
-msgstr "Cảnh báo : đỠnghị bạn liên kết dùng « -static » vì thư viện hệ thống"
+msgstr "cảnh báo: đỠnghị bạn liên kết dùng \"-static\" vì thư viện hệ thống"
#: config/pa/pa64-hpux.h:31 config/pa/pa64-hpux.h:34 config/pa/pa64-hpux.h:43
#: config/pa/pa64-hpux.h:46 config/pa/pa-hpux10.h:90 config/pa/pa-hpux10.h:93
@@ -4914,36 +4818,36 @@ msgstr " cÅ©ng há»— trợ chức năng Ä‘o hiệu năng sá»­ dụng chỉ Ä‘Æ°á
#: config/lynx.h:70
msgid "cannot use mthreads and mlegacy-threads together"
-msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n « mthreads » và « mlegacy-threads »"
+msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n mthreads và mlegacy-threads"
#: config/lynx.h:95
msgid "cannot use mshared and static together"
-msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n « mshared » và « static »"
+msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n mshared và static"
#: config/i386/mingw-w64.h:83 config/i386/mingw32.h:116
#: config/i386/cygwin.h:114
msgid "shared and mdll are not compatible"
-msgstr "« shared » và « mdll » không tương thích với nhau"
+msgstr "shared và mdll không tương thích với nhau"
#: config/s390/tpf.h:116
msgid "static is not supported on TPF-OS"
-msgstr "trên TPF-OS thì không hỗ trợ « static »"
+msgstr "trên TPF-OS thì không hỗ trợ static"
#: config/rs6000/freebsd64.h:160 config/rs6000/freebsd64.h:172
msgid "consider using `-pg' instead of `-p' with gprof(1)"
-msgstr "sử dụng gprof(1) thì đỠnghị bạn lập « -pg » thay cho « -p »"
+msgstr "sử dụng gprof(1) thì đỠnghị bạn lập \"-pg\" thay cho \"-p\""
#: config/mips/mips.h:1169
msgid "may not use both -EB and -EL"
-msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n « -EB » và « -EL »"
+msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n -EB và -EL"
#: config/mips/r3900.h:38
msgid "-mhard-float not supported"
-msgstr "không hỗ trợ « -mhard-float »"
+msgstr "không hỗ trợ -mhard-float"
#: config/mips/r3900.h:40
msgid "-msingle-float and -msoft-float cannot both be specified"
-msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n « -msingle-float » và « -msoft-float »"
+msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n -msingle-float và -msoft-float"
#: config/sol2-bi.h:108 config/sol2-bi.h:113
msgid "does not support multilib"
@@ -4951,13 +4855,12 @@ msgstr "không hỗ trợ chức năng đa thư viện"
#: config/arm/arm.h:157
#, fuzzy
-#| msgid "-msoft-float and -mhard_float may not be used together"
msgid "-mfloat-abi=soft and -mfloat-abi=hard may not be used together"
-msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n « -msoft-float » (loại má»m) và « -mhard_float » (loại cứng)"
+msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n -msoft-float (loại má»m) và -mhard_float (loại cứng)"
#: config/arm/arm.h:159
msgid "-mbig-endian and -mlittle-endian may not be used together"
-msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n « -mbig-endian » (vá» cuối lá»›n) và « -mlittle-endian » (vá» cuối nhá»)"
+msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n -mbig-endian (vá» cuối lá»›n) và -mlittle-endian (vá» cuối nhá»)"
#: config/bfin/elf.h:55
msgid "no processor type specified for linking"
@@ -4969,39 +4872,39 @@ msgstr "m210 không có há»— trợ vá» cuối nhá»"
#: config/vxworks.h:71
msgid "-Xbind-now and -Xbind-lazy are incompatible"
-msgstr "hai tùy chá»n « -Xbind-now » và « -Xbind-lazy » không tÆ°Æ¡ng thích vá»›i nhau"
+msgstr "hai tùy chá»n -Xbind-now và -Xbind-lazy không tÆ°Æ¡ng thích vá»›i nhau"
#: config/darwin.h:244
msgid "-current_version only allowed with -dynamiclib"
-msgstr "chỉ cho phép sử dụng « -current_version » với « -dynamiclib »"
+msgstr "chỉ cho phép sử dụng -current_version với -dynamiclib"
#: config/darwin.h:246
msgid "-install_name only allowed with -dynamiclib"
-msgstr "chỉ cho phép sử dụng « -install_name » với « -dynamiclib »"
+msgstr "chỉ cho phép sử dụng -install_name với -dynamiclib"
#: config/darwin.h:251
msgid "-bundle not allowed with -dynamiclib"
-msgstr "không cho phép sử dụng « -bundle » với « -dynamiclib »"
+msgstr "không cho phép sử dụng -bundle với -dynamiclib"
#: config/darwin.h:252
msgid "-bundle_loader not allowed with -dynamiclib"
-msgstr "không cho phép sử dụng « -bundle_loader » với « -dynamiclib »"
+msgstr "không cho phép sử dụng -bundle_loader với -dynamiclib"
#: config/darwin.h:253
msgid "-client_name not allowed with -dynamiclib"
-msgstr "không cho phép sử dụng « -client_name » với « -dynamiclib »"
+msgstr "không cho phép sử dụng -client_name với -dynamiclib"
#: config/darwin.h:258
msgid "-force_flat_namespace not allowed with -dynamiclib"
-msgstr "không cho phép sử dụng « -force_flat_namespace » với « -dynamiclib »"
+msgstr "không cho phép sử dụng -force_flat_namespace với -dynamiclib"
#: config/darwin.h:260
msgid "-keep_private_externs not allowed with -dynamiclib"
-msgstr "không cho phép sử dụng « -keep_private_externs » với « -dynamiclib »"
+msgstr "không cho phép sử dụng -keep_private_externs với -dynamiclib"
#: config/darwin.h:261
msgid "-private_bundle not allowed with -dynamiclib"
-msgstr "không cho phép sử dụng « -private_bundle » với « -dynamiclib »"
+msgstr "không cho phép sử dụng -private_bundle với -dynamiclib"
#: objc/lang-specs.h:31 objc/lang-specs.h:42
msgid "GNU Objective C no longer supports traditional compilation"
@@ -5013,23 +4916,23 @@ msgstr ""
#: config/vax/netbsd-elf.h:51
msgid "the -shared option is not currently supported for VAX ELF"
-msgstr "tuỳ chá»n « -shared » (chia sẻ) hiện thá»i không được há»— trợ cho VAX ELF"
+msgstr "tuỳ chá»n -shared (chia sẻ) hiện thá»i không được há»— trợ cho VAX ELF"
#: fortran/lang-specs.h:55 fortran/lang-specs.h:69
msgid "gfortran does not support -E without -cpp"
-msgstr "gfortran không hỗ trợ sử dụng « -E » mà không có « -cpp »"
+msgstr "gfortran không hỗ trợ sử dụng -E mà không có -cpp"
#: java/lang-specs.h:33
msgid "-fjni and -femit-class-files are incompatible"
-msgstr "hai tùy chá»n « --fjni » và « --femit-class-files » không tÆ°Æ¡ng thích vá»›i nhau"
+msgstr "hai tùy chá»n --fjni và --femit-class-files không tÆ°Æ¡ng thích vá»›i nhau"
#: java/lang-specs.h:34
msgid "-fjni and -femit-class-file are incompatible"
-msgstr "hai tùy chá»n « --fjni » và « --femit-class-file » không tÆ°Æ¡ng thích vá»›i nhau"
+msgstr "hai tùy chá»n --fjni và --femit-class-file không tÆ°Æ¡ng thích vá»›i nhau"
#: java/lang-specs.h:35 java/lang-specs.h:36
msgid "-femit-class-file should used along with -fsyntax-only"
-msgstr "có nên kết hợp tuỳ chá»n « --femit-class-file »vá»›i « -fsyntax-only »"
+msgstr "có nên kết hợp tuỳ chá»n --femit-class-filevá»›i -fsyntax-only"
#: config/sh/sh.h:430 config/sh/sh.h:433
msgid "SH2a does not support little-endian"
@@ -5045,7 +4948,7 @@ msgstr ""
#: config/vax/vax.h:50 config/vax/vax.h:51
msgid "profiling not supported with -mg"
-msgstr "không hỗ trợ sử dụng chức năng đo hiệu năng sử dụng với « -mg »"
+msgstr "không hỗ trợ sử dụng chức năng đo hiệu năng sử dụng với -mg"
#: java/lang.opt:122
msgid "Warn if deprecated empty statements are found"
@@ -5061,11 +4964,11 @@ msgstr "Cảnh báo nếu ghi rõ bộ sửa đổi không cần thiết"
#: java/lang.opt:150
msgid "--CLASSPATH\tDeprecated; use --classpath instead"
-msgstr "--CLASSPATH\tBị phản đối; có nên sử dụng « --classpath » để thay thế"
+msgstr "--CLASSPATH\tBị phản đối; có nên sử dụng --classpath để thay thế"
#: java/lang.opt:157
msgid "Permit the use of the assert keyword"
-msgstr "Cho phép sử dụng từ khoá « assert »"
+msgstr "Cho phép sử dụng từ khoá assert"
#: java/lang.opt:179
msgid "--bootclasspath=<path>\tReplace system path"
@@ -5085,7 +4988,7 @@ msgstr "Xuất một tập tin hạng"
#: java/lang.opt:198
msgid "Alias for -femit-class-file"
-msgstr "Bí danh cho « -femit-class-file »"
+msgstr "Bí danh cho -femit-class-file"
#: java/lang.opt:202
msgid "--encoding=<encoding>\tChoose input encoding (defaults from your locale)"
@@ -5157,7 +5060,6 @@ msgstr "Lập phiên bản VM đích"
#: ada/gcc-interface/lang.opt:51
#, fuzzy
-#| msgid "-I <dir>\tAdd <dir> to the end of the main include path"
msgid "-I <dir>.\tAdd <dir> to the end of the main source path"
msgstr "-I <thÆ°_mục>\tPhụ thêm thÆ° mục này vào Ä‘Æ°á»ng dẫn bao gồm chính"
@@ -5166,18 +5068,16 @@ msgid "Enable most warning messages"
msgstr "Hiệu lực phần lớn các thông điệp cảnh báo"
#: ada/gcc-interface/lang.opt:59
-#, fuzzy
-#| msgid "Synonym for -Wcomment"
msgid "Synonym of -gnatk8"
-msgstr "Từ đồng nghĩa với « -Wcomment »"
+msgstr "Từ đồng nghĩa với -gnatk8"
#: ada/gcc-interface/lang.opt:63
msgid "Do not look for source files in standard path"
-msgstr ""
+msgstr "Không tìm các tập tin mã nguồn trong Ä‘Æ°á»ng dẫn tiêu chuẩn"
#: ada/gcc-interface/lang.opt:67
msgid "Do not look for object files in standard path"
-msgstr ""
+msgstr "Không tìm các tập tin đối tượng trong Ä‘Æ°á»ng dẫn tiêu chuẩn"
#: ada/gcc-interface/lang.opt:71
msgid "Select the runtime"
@@ -5185,11 +5085,11 @@ msgstr ""
#: ada/gcc-interface/lang.opt:75
msgid "Catch typos"
-msgstr ""
+msgstr "Bắt gặp lỗi đánh máy"
#: ada/gcc-interface/lang.opt:79
msgid "Set name of output ALI file (internal switch)"
-msgstr ""
+msgstr "Äặt tên cho tập tin kết xuất ALI (chuyển ná»™i bá»™)"
#: ada/gcc-interface/lang.opt:83
msgid "-gnat<options>\tSpecify options to GNAT"
@@ -5209,7 +5109,7 @@ msgstr "Cảnh báo vỠsự xếp hàng các khối CHUNG"
#: fortran/lang.opt:207
msgid "Warn about missing ampersand in continued character constants"
-msgstr "Cảnh báo vỠký hiệu « & » còn thiếu trong hằng ký tự tiếp tục"
+msgstr "Cảnh báo vỠký hiệu '&' còn thiếu trong hằng ký tự tiếp tục"
#: fortran/lang.opt:211
msgid "Warn about creation of array temporaries"
@@ -5221,13 +5121,11 @@ msgstr "Cảnh báo vỠbiểu thức ký tự bị cắt ngắn"
#: fortran/lang.opt:223
#, fuzzy
-#| msgid "Warn about implicit function declarations"
msgid "Warn about most implicit conversions"
msgstr "Cảnh báo vá» lá»i tuyên bố hàm ngầm"
#: fortran/lang.opt:227
#, fuzzy
-#| msgid "Warn about implicit function declarations"
msgid "Warn about function call elimination"
msgstr "Cảnh báo vá» lá»i tuyên bố hàm ngầm"
@@ -5253,7 +5151,7 @@ msgstr ""
#: fortran/lang.opt:255
msgid "Warn about \"suspicious\" constructs"
-msgstr "Cảnh báo vá» cấu trúc « đáng ngá»"
+msgstr "Cảnh báo vá» cấu trúc \"đáng ngá»\""
#: fortran/lang.opt:259
msgid "Permit nonconforming uses of the tab character"
@@ -5269,7 +5167,6 @@ msgstr "Cảnh báo nếu má»™t thủ tục ngÆ°á»i dùng có cùng má»™t tên
#: fortran/lang.opt:271
#, fuzzy
-#| msgid "Warn about possible aliasing of dummy arguments"
msgid "Warn about unused dummy arguments."
msgstr "Cảnh báo vỠđối số giả có thể bị chồng lấp"
@@ -5335,11 +5232,11 @@ msgstr "Sử dụng phần mở rộng hàm trỠCray Pointer"
#: fortran/lang.opt:347
msgid "Ignore 'D' in column one in fixed form"
-msgstr "Có dạng cố định thì qua chữ « D » trong cột đầu tiên"
+msgstr "Có dạng cố định thì qua chữ 'D' trong cột đầu tiên"
#: fortran/lang.opt:351
msgid "Treat lines with 'D' in column one as comments"
-msgstr "Thấy dòng có chữ « D » trong cột đầu tiên là ghi chú"
+msgstr "Thấy dòng có chữ 'D' trong cột đầu tiên là ghi chú"
#: fortran/lang.opt:355
msgid "Set the default double precision kind to an 8 byte wide type"
@@ -5355,7 +5252,7 @@ msgstr "Lập loại thật mặc định thành má»™t loại có chiá»u rá»™ng
#: fortran/lang.opt:367
msgid "Allow dollar signs in entity names"
-msgstr "Cho phép tên thực thể chứa dấu đồng đô la « $ »"
+msgstr "Cho phép tên thực thể chứa dấu đồng đô la \"$\""
#: fortran/lang.opt:371 common.opt:659 common.opt:826 common.opt:830
#: common.opt:834 common.opt:838 common.opt:1320
@@ -5368,13 +5265,11 @@ msgstr "Một khi phân tích cú pháp thì hiển thị cây mã nguồn"
#: fortran/lang.opt:379
#, fuzzy
-#| msgid "Display the code tree after parsing"
msgid "Display the code tree after front end optimization"
msgstr "Một khi phân tích cú pháp thì hiển thị cây mã nguồn"
#: fortran/lang.opt:383
#, fuzzy
-#| msgid "Display the code tree after parsing"
msgid "Display the code tree after parsing; deprecated option"
msgstr "Một khi phân tích cú pháp thì hiển thị cây mã nguồn"
@@ -5392,7 +5287,7 @@ msgstr "Giả sử là tập tin nguồn có dạng cố định"
#: fortran/lang.opt:399
msgid "Interpret any INTEGER(4) as an INTEGER(8)"
-msgstr ""
+msgstr "Biên dịch bất kỳ INTEGER(8) như là INTEGER(4)"
#: fortran/lang.opt:403
msgid "Specify where to find the compiled intrinsic modules"
@@ -5423,10 +5318,8 @@ msgid "-ffree-line-length-<n>\tUse n as character line width in free mode"
msgstr "-ffree-line-length-<số>\tTrong chế Ä‘á»™ tá»± do thì chiá»u rá»™ng dòng ký tá»± là số này"
#: fortran/lang.opt:431
-#, fuzzy
-#| msgid "Enable linker optimizations"
msgid "Enable front end optimization"
-msgstr "Hiệu lực số tối ưu hoá bộ liên kết"
+msgstr "Cho phép tối Æ°u hoá từ chÆ°Æ¡ng trình gá»i"
#: fortran/lang.opt:435
msgid "Specify that no implicit typing is allowed, unless overridden by explicit IMPLICIT statements"
@@ -5475,7 +5368,7 @@ msgstr "-fmax-stack-var-size=<số>\tKích cỡ theo byte của mảng lá»›n nhá
#: fortran/lang.opt:475
msgid "Put all local arrays on stack."
-msgstr ""
+msgstr "Äặt toàn bá»™ các mảng ná»™i bá»™ vào stack."
#: fortran/lang.opt:479
msgid "Set default accessibility of module entities to PRIVATE."
@@ -5495,27 +5388,27 @@ msgstr "Hiệu lực chức năng kiểm tra phạm vi trong khi biên dịch"
#: fortran/lang.opt:503
msgid "Interpret any REAL(4) as a REAL(8)"
-msgstr ""
+msgstr "Biên dịch bất kỳ REAL(4) như là REAL(8)"
#: fortran/lang.opt:507
msgid "Interpret any REAL(4) as a REAL(10)"
-msgstr ""
+msgstr "Biên dịch bất kỳ REAL(4) như là REAL(10)"
#: fortran/lang.opt:511
msgid "Interpret any REAL(4) as a REAL(16)"
-msgstr ""
+msgstr "Biên dịch bất kỳ REAL(4) như là REAL(16)"
#: fortran/lang.opt:515
msgid "Interpret any REAL(8) as a REAL(4)"
-msgstr ""
+msgstr "Biên dịch bất kỳ REAL(8) như là REAL(4)"
#: fortran/lang.opt:519
msgid "Interpret any REAL(8) as a REAL(10)"
-msgstr ""
+msgstr "Biên dịch bất kỳ REAL(8) như là REAL(10)"
#: fortran/lang.opt:523
msgid "Interpret any REAL(8) as a REAL(16)"
-msgstr ""
+msgstr "Biên dịch bất kỳ REAL(8) như là REAL(16)"
#: fortran/lang.opt:527
msgid "Reallocate the LHS in assignments"
@@ -5575,7 +5468,6 @@ msgstr "Làm cho hợp với tiêu chuẩn ISO Fortran 2008"
#: fortran/lang.opt:623
#, fuzzy
-#| msgid "Conform to the ISO Fortran 2008 standard"
msgid "Conform to the ISO Fortran 2008 standard including TS 29113"
msgstr "Làm cho hợp với tiêu chuẩn ISO Fortran 2008"
@@ -5748,7 +5640,7 @@ msgstr "Lập loại CPU đích"
#: config/frv/frv.opt:73
msgid "Known FR-V CPUs (for use with the -mcpu= option):"
-msgstr ""
+msgstr "Không hiểu FR-V CPUs (để dùng vá»›i tùy chá»n -mcpu=):"
#: config/frv/frv.opt:122
msgid "Use fp double instructions"
@@ -5877,7 +5769,6 @@ msgstr "Äặt mục đích là bá»™ xá»­ lý AM33/2.0"
#: config/mn10300/mn10300.opt:38
#, fuzzy
-#| msgid "Target the AM33 processor"
msgid "Target the AM34 processor"
msgstr "Äặt mục đích là bá»™ xá»­ lý AM33"
@@ -5899,13 +5790,11 @@ msgstr "Trả lại hàm trỠtrong cả hai a0 và d0"
#: config/mn10300/mn10300.opt:63
#, fuzzy
-#| msgid "Allow gcc to use the repeat/erepeat instructions"
msgid "Allow gcc to generate LIW instructions"
msgstr "Cho phép gcc sử dụng câu lệnh repeat/erepeat"
#: config/mn10300/mn10300.opt:67
#, fuzzy
-#| msgid "Allow gcc to use the repeat/erepeat instructions"
msgid "Allow gcc to generate the SETLB and Lcc instructions"
msgstr "Cho phép gcc sử dụng câu lệnh repeat/erepeat"
@@ -6028,7 +5917,7 @@ msgstr "Sử dụng tên thanh ghi loại in/loc/out"
#: config/ia64/ia64.opt:56
msgid "Enable use of sdata/scommon/sbss"
-msgstr "Hiệu lực sử dụng « sdata/scommon/sbss »"
+msgstr "Hiệu lực sử dụng sdata/scommon/sbss"
#: config/ia64/ia64.opt:60
msgid "Generate code without GP reg"
@@ -6089,7 +5978,7 @@ msgstr "Ghi rõ phạm vi các thanh ghi cần làm cho cố định"
#: config/ia64/ia64.opt:127
msgid "Known Itanium CPUs (for use with the -mtune= option):"
-msgstr ""
+msgstr "Không hiểu Itanium CPUs (để dùng vá»›i tùy chá»n -mcpu=):"
#: config/ia64/ia64.opt:137
msgid "Use data speculation before reload"
@@ -6141,7 +6030,7 @@ msgstr "Äang định thá»i thì cÅ©ng để má»™t bit dừng lại vào đẳn
#: config/ia64/ia64.opt:185
msgid "Assume that floating-point stores and loads are not likely to cause conflict when placed into one instruction group"
-msgstr "Giả sử rằng các việc nạp/lưu loại điểm phù động không phải rất có thể gây ra sự xung đột khi được để vào cùng một nhóm câu lệnh"
+msgstr "Giả sử rằng các việc nạp/lưu dấu chấm động không phải rất có thể gây ra sự xung đột khi được để vào cùng một nhóm câu lệnh"
#: config/ia64/ia64.opt:189
msgid "Soft limit on number of memory insns per instruction group, giving lower priority to subsequent memory insns attempting to schedule in the same insn group. Frequently useful to prevent cache bank conflicts. Default value is 1"
@@ -6149,9 +6038,8 @@ msgstr "Giá»›i hạn má»m vá» số các câu lệnh vùng nhá»› má»—i nhóm cÃ
#: config/ia64/ia64.opt:193
#, fuzzy
-#| msgid "Disallow more than `msched-max-memory-insns' in instruction group. Otherwise, limit is `soft' (prefer non-memory operations when limit is reached)"
msgid "Disallow more than 'msched-max-memory-insns' in instruction group. Otherwise, limit is 'soft' (prefer non-memory operations when limit is reached)"
-msgstr "Ép buá»™c giá»›i hạn cứng là số tối Ä‘a các câu lệnh vùng nhá»› « msched-max-memory-insns » trong nhóm câu lệnh. Không thì giá»›i hạn là « má»m » (thích thao tác không phải vùng nhá»› hÆ¡n khi tá»›i giá»›i hạn này)"
+msgstr "Ép buá»™c giá»›i hạn cứng là số tối Ä‘a các câu lệnh vùng nhá»› 'msched-max-memory-insns' trong nhóm câu lệnh. Không thì giá»›i hạn là 'má»m' (thích thao tác không phải vùng nhá»› hÆ¡n khi tá»›i giá»›i hạn này)"
#: config/ia64/ia64.opt:197
msgid "Don't generate checks for control speculation in selective scheduling"
@@ -6191,7 +6079,6 @@ msgstr "Äừng sá»­ dụng Ä‘iểm phù Ä‘á»™ng loại phần cứng"
#: config/sparc/sparc.opt:42
#, fuzzy
-#| msgid "Use alternate register names"
msgid "Use flat register window model"
msgstr "Sử dụng tên thanh ghi xen kẽ"
@@ -6217,31 +6104,26 @@ msgstr "Biên dịch cho ABI loại V8+"
#: config/sparc/sparc.opt:66
#, fuzzy
-#| msgid "Use UltraSPARC Visual Instruction Set extensions"
msgid "Use UltraSPARC Visual Instruction Set version 1.0 extensions"
msgstr "Sử dụng phần mở rộng của Tập hợp Câu lệnh Trực quan UltraSPARC"
#: config/sparc/sparc.opt:70
#, fuzzy
-#| msgid "Use UltraSPARC Visual Instruction Set extensions"
msgid "Use UltraSPARC Visual Instruction Set version 2.0 extensions"
msgstr "Sử dụng phần mở rộng của Tập hợp Câu lệnh Trực quan UltraSPARC"
#: config/sparc/sparc.opt:74
#, fuzzy
-#| msgid "Use UltraSPARC Visual Instruction Set extensions"
msgid "Use UltraSPARC Visual Instruction Set version 3.0 extensions"
msgstr "Sử dụng phần mở rộng của Tập hợp Câu lệnh Trực quan UltraSPARC"
#: config/sparc/sparc.opt:78
#, fuzzy
-#| msgid "Use UltraSPARC Visual Instruction Set extensions"
msgid "Use UltraSPARC Fused Multiply-Add extensions"
msgstr "Sử dụng phần mở rộng của Tập hợp Câu lệnh Trực quan UltraSPARC"
#: config/sparc/sparc.opt:82
#, fuzzy
-#| msgid "Use decimal floating point instructions"
msgid "Use UltraSPARC Population-Count instruction"
msgstr "Sử dụng câu lệnh loại điểm phù động thập phân"
@@ -6282,10 +6164,8 @@ msgid "Use given SPARC-V9 code model"
msgstr "Sử dụng mẫu mã SPARC-V9 đưa ra"
#: config/sparc/sparc.opt:189
-#, fuzzy
-#| msgid "-mdebug=\tEnable debug output"
msgid "Enable debug output"
-msgstr "-mdebug=\tBật kết xuất gỡ rối"
+msgstr "Bật kết xuất gỡ rối"
#: config/sparc/sparc.opt:193
msgid "Enable strict 32-bit psABI struct return checking."
@@ -6362,7 +6242,7 @@ msgstr "Äừng gá»i bẫy nào chuyển hết vùng nhá»› tạm ra ngoài"
#: config/m32r/m32r.opt:105
msgid "Small data area: none, sdata, use"
msgstr ""
-"Vùng dữ liệu nhỠ:\n"
+"Vùng dữ liệu nhá»:\n"
" • none\tkhông có\n"
" • sdata\n"
" • use\tsử dụng"
@@ -6433,7 +6313,7 @@ msgstr "Tạo ra mã cho một 68851"
#: config/m68k/m68k.opt:96
msgid "Generate code that uses 68881 floating-point instructions"
-msgstr "Tạo ra mã sử dụng câu lệnh loại điểm phù động 68881"
+msgstr "Tạo ra mã sử dụng chỉ lệnh dấu chấm động 68881"
#: config/m68k/m68k.opt:100
msgid "Align variables on a 32-bit boundary"
@@ -6486,7 +6366,7 @@ msgstr "Sá»­ dụng quy Æ°á»›c gá»i thông thÆ°á»ng"
#: config/m68k/m68k.opt:156
msgid "Consider type 'int' to be 32 bits wide"
-msgstr "Thấy « type » (loại) « int » (số nguyên) có chiá»u rá»™ng 32 bit"
+msgstr "Thấy 'type' (loại) 'int' (số nguyên) có chiá»u rá»™ng 32 bit"
#: config/m68k/m68k.opt:160
msgid "Generate pc-relative code"
@@ -6494,7 +6374,7 @@ msgstr "Tạo ra mã tương đối với PC (pc-relative)"
#: config/m68k/m68k.opt:164
msgid "Use different calling convention using 'rtd'"
-msgstr "Sá»­ dụng má»™t quy Æ°á»›c gá»i khác bằng « rtd »"
+msgstr "Sá»­ dụng má»™t quy Æ°á»›c gá»i khác bằng 'rtd'"
#: config/m68k/m68k.opt:168 config/bfin/bfin.opt:78
msgid "Enable separate data segment"
@@ -6506,7 +6386,7 @@ msgstr "mã số (ID) của thư viện dùng chung cần xây dựng"
#: config/m68k/m68k.opt:176
msgid "Consider type 'int' to be 16 bits wide"
-msgstr "Thấy « type » (loại) « int » (số nguyên) có chiá»u rá»™ng 16 bit"
+msgstr "Thấy 'type' (loại) 'int' (số nguyên) có chiá»u rá»™ng 16 bit"
#: config/m68k/m68k.opt:180
msgid "Generate code with library calls for floating point"
@@ -6534,15 +6414,15 @@ msgstr "Sá»­ dụng toán há»c IEEE cho phép so sánh loại Ä‘iểm phù Ä‘á»
#: config/m68k/m68k-tables.opt:25
msgid "Known M68K CPUs (for use with the -mcpu= option):"
-msgstr ""
+msgstr "Không hiểu M68K CPUs (để dùng vá»›i tùy chá»n -mcpu=):"
#: config/m68k/m68k-tables.opt:347
msgid "Known M68K microarchitectures (for use with the -mtune= option):"
-msgstr ""
+msgstr "Không hiểu kiến trúc M68K (để dùng vá»›i tùy chá»n -mtune=):"
#: config/m68k/m68k-tables.opt:393
msgid "Known M68K ISAs (for use with the -march= option):"
-msgstr ""
+msgstr "Không hiểu M68K ISAs(để dùng vá»›i tùy chá»n -march=):"
#: config/i386/interix.opt:33 config/i386/cygming.opt:47
msgid "Use the GNU extension to the PE format for aligned common data"
@@ -6610,7 +6490,7 @@ msgstr "Nhánh có giá này (1-5, đơn vị tùy ý)"
#: config/i386/i386.opt:137
msgid "Data greater than given threshold will go into .ldata section in x86-64 medium model"
-msgstr "Dữ liệu vượt quá ngưỡng này thì để vào phần « .ldata » trong mẫu môi giới x86-64"
+msgstr "Dữ liệu vượt quá ngưỡng này thì để vào phần .ldata trong mẫu môi giới x86-64"
#: config/i386/i386.opt:141
msgid "Use given x86-64 code model"
@@ -6621,10 +6501,8 @@ msgid "Known code models (for use with the -mcmodel= option):"
msgstr ""
#: config/i386/i386.opt:163
-#, fuzzy
-#| msgid "`-mcpu=' is deprecated. Use `-mtune=' or '-march=' instead."
msgid "%<-mcpu=%> is deprecated; use %<-mtune=%> or %<-march=%> instead"
-msgstr "« -mcpu » bị phản đối. Hãy sử dụng « -mtune » hoặc « -march » để thay thế."
+msgstr "%<-mcpu=%> bị phản đối; dùng %<-mtune=%> hoặc %<-march=%> để thay thế"
#: config/i386/i386.opt:167
msgid "Generate sin, cos, sqrt for FPU"
@@ -6644,7 +6522,7 @@ msgstr "Tạo ra toán há»c loại Ä‘iểm phù Ä‘á»™ng dùng tập hợp câu
#: config/i386/i386.opt:183
msgid "Valid arguments to -mfpmath=:"
-msgstr ""
+msgstr "Äối số hợp lệ cho -mfpmath=:"
#: config/i386/i386.opt:216
msgid "Inline all known string operations"
@@ -6655,32 +6533,24 @@ msgid "Inline memset/memcpy string operations, but perform inline version only f
msgstr "Chèn vào trá»±c tiếp các thao tác chuá»—i loại memset/memcpy, mà thá»±c hiện phiên bản trá»±c tiếp chỉ cho khối nhá»"
#: config/i386/i386.opt:223
-#, fuzzy
-#| msgid "`-mintel-syntax' is deprecated. Use `-masm=intel' instead."
msgid "%<-mintel-syntax%> and %<-mno-intel-syntax%> are deprecated; use %<-masm=intel%> and %<-masm=att%> instead"
-msgstr "« -mintel-syntax » bị phản đối. Hãy sử dụng « -masm=intel » để thay thế."
+msgstr "%<-mintel-syntax%> và %<-mno-intel-syntax%> bị phản đối; dùng %<-masm=intel%> và %<-masm=att%> để thay thế"
#: config/i386/i386.opt:244
msgid "Omit the frame pointer in leaf functions"
msgstr "BỠsót hàm trỠkhung trong hàm lá"
#: config/i386/i386.opt:248
-#, fuzzy
-#| msgid "Set 80387 floating-point precision (-mpc32, -mpc64, -mpc80)"
msgid "Set 80387 floating-point precision to 32-bit"
-msgstr "Lập độ chính xác điểm phù động 80387 (-mpc32, -mpc64, -mpc80)"
+msgstr "Äặt Ä‘á»™ chính xác dấu chấm Ä‘á»™ng 80387 thành 32-bít"
#: config/i386/i386.opt:252
-#, fuzzy
-#| msgid "Set 80387 floating-point precision (-mpc32, -mpc64, -mpc80)"
msgid "Set 80387 floating-point precision to 64-bit"
-msgstr "Lập độ chính xác điểm phù động 80387 (-mpc32, -mpc64, -mpc80)"
+msgstr "Äặt Ä‘á»™ chính xác dấu chấm Ä‘á»™ng 80387 thành 64-bít"
#: config/i386/i386.opt:256
-#, fuzzy
-#| msgid "Set 80387 floating-point precision (-mpc32, -mpc64, -mpc80)"
msgid "Set 80387 floating-point precision to 80-bit"
-msgstr "Lập độ chính xác điểm phù động 80387 (-mpc32, -mpc64, -mpc80)"
+msgstr "Äặt Ä‘á»™ chính xác dấu chấm Ä‘á»™ng 80387 thành 80-bít"
#: config/i386/i386.opt:260
msgid "Attempt to keep stack aligned to this power of 2"
@@ -6724,7 +6594,7 @@ msgstr "Chá»n chiến lược để tạo ra thao tác chuá»—i dùng"
#: config/i386/i386.opt:304
msgid "Valid arguments to -mstringop-strategy=:"
-msgstr ""
+msgstr "Äối số hợp lệ cho -mstringop-strategy=:"
#: config/i386/i386.opt:329
msgid "Use given thread-local storage dialect"
@@ -6732,7 +6602,7 @@ msgstr "Sử dụng phương ngôn lưu theo nhánh cục bộ"
#: config/i386/i386.opt:333
msgid "Known TLS dialects (for use with the -mtls-dialect= option):"
-msgstr ""
+msgstr "Không hiểu TLS dialects (để dùng vá»›i tùy chá»n -mtls-dialect=):"
#: config/i386/i386.opt:343
#, c-format
@@ -6745,7 +6615,7 @@ msgstr "Tạo ra mã thích hợp với ABI đưa ra"
#: config/i386/i386.opt:355
msgid "Known ABIs (for use with the -mabi= option):"
-msgstr ""
+msgstr "Không hiểu ABIs (để dùng vá»›i tùy chá»n -mabi=):"
#: config/i386/i386.opt:365 config/rs6000/rs6000.opt:196
msgid "Vector library ABI to use"
@@ -6792,10 +6662,8 @@ msgid "Generate 64bit x86-64 code"
msgstr "Tạo ra mã x86-64 64-bit"
#: config/i386/i386.opt:419
-#, fuzzy
-#| msgid "Generate 64bit x86-64 code"
msgid "Generate 32bit x86-64 code"
-msgstr "Tạo ra mã x86-64 64-bit"
+msgstr "Tạo ra mã x86-64 32-bit"
#: config/i386/i386.opt:423
msgid "Support MMX built-in functions"
@@ -6838,20 +6706,16 @@ msgid "Do not support SSE4.1 and SSE4.2 built-in functions and code generation"
msgstr "Äừng há»— trợ hàm dá»±ng sẵn và chức năng tạo ra mã loại SSE4.1 và SSE4.2"
#: config/i386/i386.opt:466
-#, fuzzy
-#| msgid "'-msse5' was removed."
msgid "%<-msse5%> was removed"
-msgstr "« -msse5 » đã bị gỡ bá»."
+msgstr "%<-msse5%> đã bị gỡ bá»"
#: config/i386/i386.opt:471
msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 and AVX built-in functions and code generation"
msgstr "Hỗ trợ các hàm dựng sẵn và chức năng tạo ra mã loại MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 và AVX"
#: config/i386/i386.opt:475
-#, fuzzy
-#| msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and FMA built-in functions and code generation"
msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and AVX2 built-in functions and code generation"
-msgstr "Hỗ trợ các hàm dựng sẵn và chức năng tạo ra mã loại MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX và FMA"
+msgstr "Hỗ trợ các hàm dựng sẵn và chức năng tạo ra mã loại MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX và AVX2"
#: config/i386/i386.opt:479
msgid "Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX and FMA built-in functions and code generation"
@@ -6883,25 +6747,21 @@ msgstr "Hỗ trợ chức năng tạo ra mã là câu lệnh popcnt."
#: config/i386/i386.opt:507
#, fuzzy
-#| msgid "Support FMA4 built-in functions and code generation "
msgid "Support BMI built-in functions and code generation"
msgstr "Hỗ trợ các hàm dựng sẵn và chức năng tạo ra mã loại FMA4"
#: config/i386/i386.opt:511
#, fuzzy
-#| msgid "Support FMA4 built-in functions and code generation "
msgid "Support BMI2 built-in functions and code generation"
msgstr "Hỗ trợ các hàm dựng sẵn và chức năng tạo ra mã loại FMA4"
#: config/i386/i386.opt:515
#, fuzzy
-#| msgid "Support LWP built-in functions and code generation "
msgid "Support LZCNT built-in function and code generation"
msgstr "Hỗ trợ các hàm dựng sẵn và chức năng tạo ra mã loại LWP"
#: config/i386/i386.opt:519
#, fuzzy
-#| msgid "Support FMA4 built-in functions and code generation "
msgid "Support TBM built-in functions and code generation"
msgstr "Hỗ trợ các hàm dựng sẵn và chức năng tạo ra mã loại FMA4"
@@ -6935,25 +6795,21 @@ msgstr "Mã hoá câu lệnh SSE vá»›i tiá»n tố VEX"
#: config/i386/i386.opt:551
#, fuzzy
-#| msgid "Support AES built-in functions and code generation"
msgid "Support FSGSBASE built-in functions and code generation"
msgstr "Hỗ trợ các hàm dựng sẵn và chức năng tạo ra mã loại AES"
#: config/i386/i386.opt:555
#, fuzzy
-#| msgid "Support AES built-in functions and code generation"
msgid "Support RDRND built-in functions and code generation"
msgstr "Hỗ trợ các hàm dựng sẵn và chức năng tạo ra mã loại AES"
#: config/i386/i386.opt:559
#, fuzzy
-#| msgid "Support FMA4 built-in functions and code generation "
msgid "Support F16C built-in functions and code generation"
msgstr "Hỗ trợ các hàm dựng sẵn và chức năng tạo ra mã loại FMA4"
#: config/i386/i386.opt:563
#, fuzzy
-#| msgid "Call mcount for profiling before a function prologue"
msgid "Emit profiling counter call at function entry before prologue."
msgstr "Gá»i mcount để Ä‘o hiệu năng sá»­ dụng đẳng trÆ°á»›c má»™t Ä‘oạn mở đầu hàm"
@@ -7131,7 +6987,7 @@ msgstr "Tránh sự tạo ra câu lệnh nạp/lưu phụ lục khi có thể"
#: config/rs6000/rs6000.opt:256
msgid "Mark __tls_get_addr calls with argument info"
-msgstr "Äánh dấu cuá»™c gá»i « __tls_get_addr » bằng thông tin vỠđối số"
+msgstr "Äánh dấu cuá»™c gá»i __tls_get_addr bằng thông tin vỠđối số"
#: config/rs6000/rs6000.opt:263
msgid "Schedule the start and end of the procedure"
@@ -7151,7 +7007,6 @@ msgstr "Làm cho hợp hơn với cú pháp XLC của IBM"
#: config/rs6000/rs6000.opt:279 config/rs6000/rs6000.opt:283
#, fuzzy
-#| msgid "Generate software reciprocal sqrt for better throughput"
msgid "Generate software reciprocal divide and square root for better throughput."
msgstr "Tạo ra cân bậc hai đảo loại phần má»m để tăng tốc Ä‘á»™ truyá»n dữ liệu"
@@ -7188,18 +7043,12 @@ msgid "Generate VRSAVE instructions when generating AltiVec code"
msgstr "Tạo ra câu lệnh VRSAVE khi tạo ra mã AltiVec"
#: config/rs6000/rs6000.opt:326
-#, fuzzy
-#| msgid "-mvrsave=yes/no\tDeprecated option. Use -mvrsave/-mno-vrsave instead"
msgid "Deprecated option. Use -mno-vrsave instead"
-msgstr ""
-"-mvrsave=yes/no\t\tTùy chá»n bị phản đối.\n"
-"\tHãy sử dụng « -mvrsave/-mno-vrsave » để thay thế. (yes=có, no=không)"
+msgstr "Tùy chá»n bị phản đối. Dùng -mno-vrsave để thay thế"
#: config/rs6000/rs6000.opt:330
-#, fuzzy
-#| msgid "Deprecated. Use -Os instead"
msgid "Deprecated option. Use -mvrsave instead"
-msgstr "Bị phân đối nên hãy sử dụng đối số « -Os » để thay thế"
+msgstr "Tùy chá»n bị phản đối. Dùng -mvrsave để thay thế"
#: config/rs6000/rs6000.opt:334
msgid "Specify how many bytes should be moved inline before calling out to memcpy/memmove"
@@ -7210,18 +7059,12 @@ msgid "Generate isel instructions"
msgstr "Tạo ra câu lệnh isel"
#: config/rs6000/rs6000.opt:342
-#, fuzzy
-#| msgid "-misel=yes/no\tDeprecated option. Use -misel/-mno-isel instead"
msgid "Deprecated option. Use -mno-isel instead"
-msgstr ""
-"-misel=yes/no\t\tTùy chá»n bị phản đối.\n"
-"\tHãy sử dụng « -misel/-mno-isel » để thay thế. (yes=có, no=không)"
+msgstr "Tùy chá»n bị phản đối. Dùng -mno để thay thế"
#: config/rs6000/rs6000.opt:346
-#, fuzzy
-#| msgid "Deprecated. Use -Os instead"
msgid "Deprecated option. Use -misel instead"
-msgstr "Bị phân đối nên hãy sử dụng đối số « -Os » để thay thế"
+msgstr "Tùy chá»n bị phản đối. Dùng -misel để thay thế"
#: config/rs6000/rs6000.opt:350
msgid "Generate SPE SIMD instructions on E500"
@@ -7232,18 +7075,12 @@ msgid "Generate PPC750CL paired-single instructions"
msgstr "Tạo ra câu lệnh đôi-đơn PPC750CL"
#: config/rs6000/rs6000.opt:358
-#, fuzzy
-#| msgid "-mspe=yes/no\tDeprecated option. Use -mspe/-mno-spe instead"
msgid "Deprecated option. Use -mno-spe instead"
-msgstr ""
-"-mspe=yes/no\t\tTùy chá»n bị phản đối.\n"
-"\tHãy sử dụng « -mspe/-mno-spe » để thay thế. (yes=có, no=không)"
+msgstr "Tùy chá»n bị phản đối. Dùng -mno-spe để thay thế"
#: config/rs6000/rs6000.opt:362
-#, fuzzy
-#| msgid "Deprecated. Use -Os instead"
msgid "Deprecated option. Use -mspe instead"
-msgstr "Bị phân đối nên hãy sử dụng đối số « -Os » để thay thế"
+msgstr "Tùy chá»n bị phản đối. Dùng -mspe để thay thế"
#: config/rs6000/rs6000.opt:366
msgid "-mdebug=\tEnable debug output"
@@ -7251,35 +7088,30 @@ msgstr "-mdebug=\tBật kết xuất gỡ rối"
#: config/rs6000/rs6000.opt:370
#, fuzzy
-#| msgid "Use the Cray Pointer extension"
msgid "Use the AltiVec ABI extensions"
msgstr "Sử dụng phần mở rộng hàm trỠCray Pointer"
#: config/rs6000/rs6000.opt:374
#, fuzzy
-#| msgid "Do not use the bit-field instructions"
msgid "Do not use the AltiVec ABI extensions"
msgstr "Äừng sá»­ dụng câu lệnh loại trÆ°á»ng-bit"
#: config/rs6000/rs6000.opt:378
#, fuzzy
-#| msgid "Use the Cray Pointer extension"
msgid "Use the SPE ABI extensions"
msgstr "Sử dụng phần mở rộng hàm trỠCray Pointer"
#: config/rs6000/rs6000.opt:382
-#, fuzzy
-#| msgid "Do not use the bit-field instructions"
msgid "Do not use the SPE ABI extensions"
-msgstr "Äừng sá»­ dụng câu lệnh loại trÆ°á»ng-bit"
+msgstr "Không dùng lệnh mở rộng SPE ABI"
#: config/rs6000/rs6000.opt:389
msgid "using darwin64 ABI"
-msgstr ""
+msgstr "sử dụng darwin64 ABI"
#: config/rs6000/rs6000.opt:392
msgid "using old darwin ABI"
-msgstr ""
+msgstr "sử dụng darwin ABI kiểu cũ"
#: config/rs6000/rs6000.opt:395
msgid "using IEEE extended precision long double"
@@ -7315,7 +7147,7 @@ msgstr "Cảnh báo khi xuất một câu lệnh mã vi Cell"
#: config/rs6000/rs6000.opt:438
msgid "Warn about deprecated 'vector long ...' AltiVec type usage"
-msgstr "Cảnh báo vỠsử dụng loại AltiVec « vector long ... »"
+msgstr "Cảnh báo vỠsử dụng loại AltiVec 'vector long ...'"
#: config/rs6000/rs6000.opt:442
msgid "-mfloat-gprs=\tSelect GPR floating point method"
@@ -7323,7 +7155,7 @@ msgstr "-mfloat-gprs=\tChá»n phÆ°Æ¡ng pháp Ä‘iểm phù Ä‘á»™ng GPR"
#: config/rs6000/rs6000.opt:446
msgid "Valid arguments to -mfloat-gprs=:"
-msgstr ""
+msgstr "Äối số hợp lệ cho -mfloat-gprs=:"
#: config/rs6000/rs6000.opt:462
msgid "-mlong-double-<n>\tSpecify size of long double (64 or 128 bits)"
@@ -7342,10 +7174,8 @@ msgid "Specify alignment of structure fields default/natural"
msgstr "Ghi rõ cách xếp hàng các trÆ°á»ng cấu trúc: mặc định (default) hay tá»± nhiên (natural)"
#: config/rs6000/rs6000.opt:478
-#, fuzzy
-#| msgid "in argument to unary !"
msgid "Valid arguments to -malign-:"
-msgstr "trong đối số tới bộ nguyên phân !"
+msgstr "Äối số hợp lệ cho -malign-:"
#: config/rs6000/rs6000.opt:488
msgid "Specify scheduling priority for dispatch slot restricted insns"
@@ -7365,7 +7195,7 @@ msgstr "ÄÆ¡n vị Ä‘iểm phù Ä‘á»™ng không há»— trợ phép chia và phép t
#: config/rs6000/rs6000.opt:504
msgid "-mfpu=\tSpecify FP (sp, dp, sp-lite, dp-lite) (implies -mxilinx-fpu)"
-msgstr "-mfpu=\tGhi rõ điểm phù động (sp, dp, sp-lite, dp-lite) (cũng ngụ ý « -mxilinx-fpu »)"
+msgstr "-mfpu=\tGhi rõ điểm phù động (sp, dp, sp-lite, dp-lite) (cũng ngụ ý -mxilinx-fpu)"
#: config/rs6000/rs6000.opt:526
msgid "Specify Xilinx FPU."
@@ -7397,7 +7227,7 @@ msgstr "Gá»i mcount để Ä‘o hiệu năng sá»­ dụng đẳng trÆ°á»›c má»™t Ä
#: config/rs6000/linux64.opt:28
msgid "Select code model"
-msgstr ""
+msgstr "Chá»n mô hình mã"
#: config/rs6000/sysv4.opt:25
msgid "Select ABI calling convention"
@@ -7451,23 +7281,23 @@ msgstr "Sử dụng phương pháp mặc định để quản lý sdata"
#: config/rs6000/sysv4.opt:118
msgid "Link with libsim.a, libc.a and sim-crt0.o"
-msgstr "Liên kết với « libsim.a », « libc.a » và « sim-crt0.o »"
+msgstr "Liên kết với libsim.a, libc.a và sim-crt0.o"
#: config/rs6000/sysv4.opt:122
msgid "Link with libads.a, libc.a and crt0.o"
-msgstr "Liên kết với « libads.a », « libc.a » và « crt0.o »"
+msgstr "Liên kết với libads.a, libc.a và crt0.o"
#: config/rs6000/sysv4.opt:126
msgid "Link with libyk.a, libc.a and crt0.o"
-msgstr "Liên kết với « libyk.a », « libc.a » và « crt0.o »"
+msgstr "Liên kết với libyk.a, libc.a và crt0.o"
#: config/rs6000/sysv4.opt:130
msgid "Link with libmvme.a, libc.a and crt0.o"
-msgstr "Liên kết với « libmvme.a », « libc.a » và « crt0.o »"
+msgstr "Liên kết với libmvme.a, libc.a và crt0.o"
#: config/rs6000/sysv4.opt:134
msgid "Set the PPC_EMB bit in the ELF flags header"
-msgstr "Lập bit « PPC_EMB » trong phần đầu cỠELF"
+msgstr "Lập bit PPC_EMB trong phần đầu cỠELF"
#: config/rs6000/sysv4.opt:154
msgid "Generate code to use a non-exec PLT and GOT"
@@ -7479,7 +7309,7 @@ msgstr "Tạo ra mã cho BSS PLT thực hiện cũ"
#: config/rs6000/rs6000-tables.opt:24
msgid "Known CPUs (for use with the -mcpu= and -mtune= options):"
-msgstr ""
+msgstr "Không hiểu CPUs (để dùng vá»›i tùy chá»n -mcpu= và -mtune=):"
#: config/spu/spu.opt:20
msgid "Emit warnings when run-time relocations are generated"
@@ -7543,7 +7373,7 @@ msgstr "Truy cập đến biến trong đối tượng PPU 64-bit"
#: config/spu/spu.opt:96
msgid "Allow conversions between __ea and generic pointers (default)"
-msgstr "Cho phép chuyển đổi giữa hàm trỠloại « __ea » và chung (mặc định)"
+msgstr "Cho phép chuyển đổi giữa hàm trỠloại __ea và chung (mặc định)"
#: config/spu/spu.opt:100
msgid "Size (in KB) of software data cache"
@@ -7587,7 +7417,7 @@ msgstr "Tạo ra mã vá» cuối nhá»"
#: config/mcore/mcore.opt:56 config/fr30/fr30.opt:27
msgid "Assume that run-time support has been provided, so omit -lsim from the linker command line"
-msgstr "Giả sá»­ đã cung cấp há»— trợ vào lúc chạy, vì thế bá» sót « -lsim » khá»i dòng lệnh liên kết"
+msgstr "Giả sá»­ đã cung cấp há»— trợ vào lúc chạy, vì thế bá» sót -lsim khá»i dòng lệnh liên kết"
#: config/mcore/mcore.opt:60
msgid "Use arbitrary sized immediates in bit operations"
@@ -7618,14 +7448,11 @@ msgid "Use simulator runtime"
msgstr "Sá»­ dụng thá»i gian chạy của bá»™ mô phá»ng"
#: config/c6x/c6x.opt:46
-#, fuzzy
-#| msgid "no arguments for spec function"
msgid "Valid arguments for the -msdata= option"
-msgstr "không có đối số tới hàm đặc tả"
+msgstr "Äối số hợp lệ cho tùy chá»n -msdata="
#: config/c6x/c6x.opt:59
#, fuzzy
-#| msgid "Compile for the Thumb not the ARM"
msgid "Compile for the DSBT shared library ABI"
msgstr "Biên dịch cho Thumb, không phải cho ARM"
@@ -7635,7 +7462,7 @@ msgstr "Tránh sá»± tạo ra cuá»™c gá»i tÆ°Æ¡ng đối vá»›i PC; sá»­ dụng h
#: config/c6x/c6x-tables.opt:24
msgid "Known C6X ISAs (for use with the -march= option):"
-msgstr ""
+msgstr "Không hiểu C6X ISAs (để dùng vá»›i tùy chá»n -march=):"
#: config/sh/sh.opt:45
msgid "Generate SH1 code"
@@ -7819,7 +7646,7 @@ msgstr "Hiệu lực mẫu cbranchdi4"
#: config/sh/sh.opt:234
msgid "Emit cmpeqdi_t pattern even when -mcbranchdi is in effect."
-msgstr "Xuất mẫu « cmpeqdi_t pattern » ngay cả khi tuỳ chá»n « -mcbranchdi » vẫn hoạt Ä‘á»™ng."
+msgstr "Xuất mẫu cmpeqdi_t pattern ngay cả khi tuỳ chá»n -mcbranchdi vẫn hoạt Ä‘á»™ng."
#: config/sh/sh.opt:238
msgid "Enable SH5 cut2 workaround"
@@ -7839,7 +7666,7 @@ msgstr "Ghi rõ tên cho hàm chia đã ký 32-bit"
#: config/sh/sh.opt:254
msgid "Enable the use of 64-bit floating point registers in fmov instructions. See -mdalign if 64-bit alignment is required."
-msgstr "Hiệu lực sử dụng thay ghi điểm phù động 64-bit trong câu lệnh fmov. Xem « -mdalign » nếu cũng yêu cầu xếp hàng theo 64-bit."
+msgstr "Hiệu lực sử dụng thay ghi điểm phù động 64-bit trong câu lệnh fmov. Xem -mdalign nếu cũng yêu cầu xếp hàng theo 64-bit."
#: config/sh/sh.opt:262
msgid "Enable the use of the fused floating point multiply-accumulate operation"
@@ -7855,7 +7682,7 @@ msgstr "Theo quy Æ°á»›c gá»i SuperH / Renesas (còn gá»i là Hitachi)"
#: config/sh/sh.opt:274
msgid "Increase the IEEE compliance for floating-point code"
-msgstr "Äối vá»›i mã Ä‘iểm phù Ä‘á»™ng thì làm hợp hÆ¡n vá»›i IEEE"
+msgstr "Äối vá»›i mã dấu chấm Ä‘á»™ng Ä‘á»™ng thì làm hợp hÆ¡n vá»›i IEEE"
#: config/sh/sh.opt:278
msgid "Enable the use of the indexed addressing mode for SHmedia32/SHcompact"
@@ -7883,7 +7710,7 @@ msgstr "Äánh dấu thanh ghi MAC nhÆ° là bị cuá»™c gá»i ghi đè"
#: config/sh/sh.opt:304
msgid "Make structs a multiple of 4 bytes (warning: ABI altered)"
-msgstr "Làm cho cấu trúc là một bội số cho 4 byte (cảnh báo : ABI bị sửa đổi)"
+msgstr "Làm cho cấu trúc là một bội số cho 4 byte (cảnh báo: ABI bị sửa đổi)"
#: config/sh/sh.opt:308
msgid "Emit function-calls using global offset table when generating PIC"
@@ -7903,7 +7730,7 @@ msgstr ""
#: config/sh/sh.opt:328
msgid "Deprecated. Use -Os instead"
-msgstr "Bị phân đối nên hãy sử dụng đối số « -Os » để thay thế"
+msgstr "Bị phân đối nên hãy sử dụng đối số -Os để thay thế"
#: config/sh/sh.opt:332
msgid "Cost to assume for a multiply insn"
@@ -7911,11 +7738,11 @@ msgstr "Giá cần giả sử cho một câu lệnh nhân lên"
#: config/sh/sh.opt:336
msgid "Don't generate privileged-mode only code; implies -mno-inline-ic_invalidate if the inline code would not work in user mode."
-msgstr "Äừng tạo ra mã chỉ có chế Ä‘á»™ quyá»n đặc biệt; cÅ©ng ngụ ý « -mno-inline-ic_invalidate » nếu mã trá»±c tiếp không có tác Ä‘á»™ng trong chế Ä‘á»™ ngÆ°á»i dùng"
+msgstr "Äừng tạo ra mã chỉ có chế Ä‘á»™ quyá»n đặc biệt; cÅ©ng ngụ ý -mno-inline-ic_invalidate nếu mã trá»±c tiếp không có tác Ä‘á»™ng trong chế Ä‘á»™ ngÆ°á»i dùng"
#: config/sh/sh.opt:342
msgid "Pretend a branch-around-a-move is a conditional move."
-msgstr "Làm ra vẻ rằng « branch-around-a-move » là má»™t sá»± di chuyển có Ä‘iá»u kiện."
+msgstr "Làm ra vẻ rằng branch-around-a-move là má»™t sá»± di chuyển có Ä‘iá»u kiện."
#: config/sh/superh.opt:6
msgid "Board name [and memory region]."
@@ -7927,7 +7754,7 @@ msgstr "Tên lúc chạy."
#: config/arm/arm.opt:26
msgid "TLS dialect to use:"
-msgstr ""
+msgstr "TLS dialect được dùng:"
#: config/arm/arm.opt:36
msgid "Specify an ABI"
@@ -7935,7 +7762,7 @@ msgstr "Ghi rõ một ABI"
#: config/arm/arm.opt:40
msgid "Known ARM ABIs (for use with the -mabi= option):"
-msgstr ""
+msgstr "Không hiểu ARM ABIs (để dùng vá»›i tùy chá»n -mabi=):"
#: config/arm/arm.opt:59
msgid "Generate a call to abort if a noreturn function returns"
@@ -7955,7 +7782,6 @@ msgstr "Tạo ra mã PIC loại vào lại"
#: config/arm/arm.opt:90
#, fuzzy
-#| msgid "Generate code for 32 bit addressing"
msgid "Generate code in 32 bit ARM state."
msgstr "Tạo ra mã để đặt địa chỉ 32 bit"
@@ -7985,11 +7811,11 @@ msgstr "Ghi rõ có nên sử dụng phần cứng điểm phù động hay khô
#: config/arm/arm.opt:118
msgid "Known floating-point ABIs (for use with the -mfloat-abi= option):"
-msgstr ""
+msgstr "Không hiểu kiểu dấu chấm Ä‘á»™ng ABIs (để dùng vá»›i tùy chá»n -mfloat-abi=):"
#: config/arm/arm.opt:137
msgid "Specify the __fp16 floating-point format"
-msgstr "Ghi rõ định dạng điểm phù động « __fp16 »"
+msgstr "Ghi rõ định dấu chấm động __fp16"
#: config/arm/arm.opt:141
msgid "Known __fp16 formats (for use with the -mfp16-format= option):"
@@ -8025,7 +7851,6 @@ msgstr "Ghi rõ sự xếp hàng bit tối thiểu của cấu trúc"
#: config/arm/arm.opt:202
#, fuzzy
-#| msgid "Generate code for GNU as"
msgid "Generate code for Thumb state"
msgstr "Tạo ra mã cho as của GNU"
@@ -8035,7 +7860,6 @@ msgstr "Há»— trợ cuá»™c gá»i giữa các tập hợp câu lệnh loại Thumb
#: config/arm/arm.opt:210
#, fuzzy
-#| msgid "Use given thread-local storage dialect"
msgid "Specify thread local storage scheme"
msgstr "Sử dụng phương ngôn lưu theo nhánh cục bộ"
@@ -8045,7 +7869,7 @@ msgstr "Ghi rõ cách truy cập đến hàm trỠmạch"
#: config/arm/arm.opt:218
msgid "Valid arguments to -mtp=:"
-msgstr ""
+msgstr "Äối số hợp lệ cho -mtp=:"
#: config/arm/arm.opt:231
msgid "Thumb: Generate (non-leaf) stack frames even if not needed"
@@ -8057,7 +7881,6 @@ msgstr "Thumb: Tạo ra khung đống (loại lá) ngay cả khi không cần th
#: config/arm/arm.opt:248
#, fuzzy
-#| msgid "Assume big endian bytes, little endian words"
msgid "Assume big endian bytes, little endian words. This option is deprecated."
msgstr "Giả sá»­ các byte vá» cuối lá»›n, các từ vá» cuối nhá»"
@@ -8067,7 +7890,6 @@ msgstr "Sử dụng thanh ghi từ bốn (thay cho từ đôi) Neon để véc-t
#: config/arm/arm.opt:256
#, fuzzy
-#| msgid "Use Neon quad-word (rather than double-word) registers for vectorization"
msgid "Use Neon double-word (rather than quad-word) registers for vectorization"
msgstr "Sử dụng thanh ghi từ bốn (thay cho từ đôi) Neon để véc-tơ hoá"
@@ -8089,15 +7911,15 @@ msgstr "BỠqua thuộc tính dllimport vỠhàm"
#: config/arm/arm-tables.opt:25
msgid "Known ARM CPUs (for use with the -mcpu= and -mtune= options):"
-msgstr ""
+msgstr "Không hiểu ARM CPUs (để dùng vá»›i tùy chá»n -mcpu= và -mtune=):"
#: config/arm/arm-tables.opt:275
msgid "Known ARM architectures (for use with the -march= option):"
-msgstr ""
+msgstr "Không hiểu kiến trúc ARM (để dùng vá»›i tùy chá»n -march=):"
#: config/arm/arm-tables.opt:357
msgid "Known ARM FPUs (for use with the -mfpu= option):"
-msgstr ""
+msgstr "Không hiểu ARM FPUs (để dùng vá»›i tùy chá»n -mfpu=):"
#: config/pdp11/pdp11.opt:23
msgid "Generate code for an 11/10"
@@ -8113,7 +7935,7 @@ msgstr "Tạo ra mã cho một 11/45"
#: config/pdp11/pdp11.opt:35
msgid "Return floating-point results in ac0 (fr0 in Unix assembler syntax)"
-msgstr "Trả lại kết quả điểm phù động bằng ac0 (bằng fr0 trong cú pháp dịch mã số UNIX)"
+msgstr "Trả lại kết quả dấu chấm động theo ac0 (bằng fr0 trong cú pháp dịch mã số UNIX)"
#: config/pdp11/pdp11.opt:39
msgid "Do not use inline patterns for copying memory"
@@ -8193,7 +8015,6 @@ msgstr "Làm yếu các nhánh"
#: config/avr/avr.opt:67
#, fuzzy
-#| msgid "Make the linker relaxation machine assume that a program counter wrap-around occures."
msgid "Make the linker relaxation machine assume that a program counter wrap-around occurs."
msgstr "Làm cho máy làm yếu bộ liên kết giả sử rằng bộ đếm chương trình đã cuộn lại."
@@ -8211,7 +8032,7 @@ msgstr ""
#: config/avr/avr-tables.opt:24
msgid "Known MCU names:"
-msgstr ""
+msgstr "Các tên MCU được biết:"
#: config/rl78/rl78.opt:27 config/rx/rx.opt:84
msgid "Use the simulator runtime."
@@ -8292,7 +8113,7 @@ msgstr "Sá»­ dụng quy Æ°á»›c gá»i di Ä‘á»™ng"
#: config/pa/pa.opt:107
msgid "Specify CPU for scheduling purposes. Valid arguments are 700, 7100, 7100LC, 7200, 7300, and 8000"
-msgstr "Ghi rõ CPU cho mục đích định thá»i, má»™t của: 700, 7100, 7100LC, 7200, 7300, 8000"
+msgstr "Ghi rõ CPU cho mục đích định thá»i. Äối số hợp lệ là 700, 7100, 7100LC, 7200, 7300, và 8000"
#: config/pa/pa.opt:140
msgid "Do not disable space regs"
@@ -8340,7 +8161,7 @@ msgstr "-mabi=ABI\tTạo ra làm hợp với ABI đưa ra"
#: config/mips/mips.opt:36
msgid "Known MIPS ABIs (for use with the -mabi= option):"
-msgstr ""
+msgstr "Không hiểu MIPS ABIs (để dùng vá»›i tùy chá»n -mabi=):"
#: config/mips/mips.opt:55
msgid "Generate code that can be used in SVR4-style dynamic objects"
@@ -8348,7 +8169,7 @@ msgstr "Tạo ra mã có thể sử dụng được trong đối tượng năng
#: config/mips/mips.opt:59
msgid "Use PMC-style 'mad' instructions"
-msgstr "Sử dụng câu lệnh « mad » loại PMC"
+msgstr "Sử dụng câu lệnh mad loại PMC"
#: config/mips/mips.opt:63
msgid "-march=ISA\tGenerate code for the given ISA"
@@ -8376,7 +8197,7 @@ msgstr "-mcode-readable=THIẾT_LẬP\tGhi rõ khi nào câu lệnh có quyá»n
#: config/mips/mips.opt:87
msgid "Valid arguments to -mcode-readable=:"
-msgstr ""
+msgstr "Äối số hợp lệ cho -mcode-readable=:"
#: config/mips/mips.opt:100
msgid "Use branch-and-break sequences to check for integer divide by zero"
@@ -8392,7 +8213,7 @@ msgstr "Cho phép sử dụng câu lệnh MDMX"
#: config/mips/mips.opt:112
msgid "Allow hardware floating-point instructions to cover both 32-bit and 64-bit operations"
-msgstr "Cho phép câu lệnh điểm phù động phần cứng bao quát thao tác cả hai 32-bit và 64-bit"
+msgstr "Cho phép xá»­ lý dấu chấm Ä‘á»™ng phần cứng bao quát thao tác cả hai hệ Ä‘iá»u hành 32-bit và 64-bit"
#: config/mips/mips.opt:116
msgid "Use MIPS-DSP instructions"
@@ -8412,11 +8233,10 @@ msgstr "Sử dụng toán tử dịch mã số %reloc() kiểu NewABI"
#: config/mips/mips.opt:146
msgid "Use -G for data that is not defined by the current object"
-msgstr "Sá»­ dụng « -G » cho dữ liệu không phải được xác định bởi đối tượng hiện thá»i"
+msgstr "Sá»­ dụng -G cho dữ liệu không phải được xác định bởi đối tượng hiện thá»i"
#: config/mips/mips.opt:150
#, fuzzy
-#| msgid "Work around certain R4000 errata"
msgid "Work around certain 24K errata"
msgstr "Khắc phục một số lỗi R4000 nào đó"
@@ -8454,11 +8274,11 @@ msgstr "Äã bật ngoại lệ Ä‘iểm phù Ä‘á»™ng"
#: config/mips/mips.opt:186
msgid "Use 32-bit floating-point registers"
-msgstr "Sử dụng thanh ghi điểm phù động 32-bit"
+msgstr "Sử dụng thanh ghi dấu chấm động 32-bit"
#: config/mips/mips.opt:190
msgid "Use 64-bit floating-point registers"
-msgstr "Sử dụng thanh ghi điểm phù động 64-bit"
+msgstr "Sử dụng thanh ghi dấu chấm động 64-bit"
#: config/mips/mips.opt:194
msgid "-mflush-func=FUNC\tUse FUNC to flush the cache before calling stack trampolines"
@@ -8466,7 +8286,7 @@ msgstr "-mflush-func=HÀM\tSá»­ dụng hàm này để chuyển hết vùng nhá»
#: config/mips/mips.opt:198
msgid "Generate floating-point multiply-add instructions"
-msgstr "Tạo ra câu lệnh nhân-cộng loại điểm phù động"
+msgstr "Tạo ra câu lệnh nhân-cộng kiểu dấu chấm động"
#: config/mips/mips.opt:202
msgid "Use 32-bit general registers"
@@ -8482,11 +8302,11 @@ msgstr "Sá»­ dụng chức năng đặt địa chỉ tÆ°Æ¡ng đối vá»›i GP Ä‘á
#: config/mips/mips.opt:214
msgid "When generating -mabicalls code, allow executables to use PLTs and copy relocations"
-msgstr "Khi tạo ra mãn « -mabicalls » thì cho phép tập tin thực thi sử dụng PLT và sao chép sự định vị lại"
+msgstr "Khi tạo ra mãn -mabicalls thì cho phép tập tin thực thi sử dụng PLT và sao chép sự định vị lại"
#: config/mips/mips.opt:218
msgid "Allow the use of hardware floating-point ABI and instructions"
-msgstr "Cho phép sử dụng ABI và các câu lệnh loại điểm phù động phần cứng"
+msgstr "Cho phép sử dụng ABI và các câu lệnh kiểu dấu chấm động phần cứng"
#: config/mips/mips.opt:222
msgid "Generate code that can be safely linked with MIPS16 code."
@@ -8510,7 +8330,7 @@ msgstr "Sử dụng câu lệnh ll, sc và sync"
#: config/mips/mips.opt:242
msgid "Use -G for object-local data"
-msgstr "Sử dụng « -G » cho dữ liệu cục bộ với đối tượng"
+msgstr "Sử dụng -G cho dữ liệu cục bộ với đối tượng"
#: config/mips/mips.opt:246
msgid "Use indirect calls"
@@ -8526,7 +8346,7 @@ msgstr "Sử dụng một loại dài 64-bit"
#: config/mips/mips.opt:258
msgid "Pass the address of the ra save location to _mcount in $12"
-msgstr "Gửi địa chỉ của vị trí lưu « ra » cho « _mcount » trong $12"
+msgstr "Gửi địa chỉ của vị trí lưu ra cho _mcount trong $12"
#: config/mips/mips.opt:262
msgid "Don't optimize block moves"
@@ -8538,7 +8358,7 @@ msgstr "Cho phép sử dụng câu lệnh MT"
#: config/mips/mips.opt:270
msgid "Prevent the use of all floating-point operations"
-msgstr "Ngăn cản sử dụng câu lệnh nào loại điểm phù động"
+msgstr "Ngăn cản sử dụng lệnh dấu chấm động nào"
#: config/mips/mips.opt:274
msgid "Do not use a cache-flushing function before calling stack trampolines"
@@ -8558,7 +8378,7 @@ msgstr "Äừng sá»­ dụng câu lệnh MIPS-3D"
#: config/mips/mips.opt:290
msgid "Use paired-single floating-point instructions"
-msgstr "Sử dụng câu lệnh điểm phù động đôi-đơn"
+msgstr "Sử dụng câu lệnh dấu chấm động đôi-đơn"
#: config/mips/mips.opt:294
msgid "-mr10k-cache-barrier=SETTING\tSpecify when r10k cache barriers should be inserted"
@@ -8566,7 +8386,7 @@ msgstr "-mr10k-cache-barrier=THIẾT_LẬP\tGhi rõ khi nào nên chèn rào cáº
#: config/mips/mips.opt:298
msgid "Valid arguments to -mr10k-cache-barrier=:"
-msgstr ""
+msgstr "Äối số hợp lệ cho -mr10k-cache-barrier=:"
#: config/mips/mips.opt:311
msgid "Try to allow the linker to turn PIC calls into direct calls"
@@ -8574,11 +8394,11 @@ msgstr "Thá»­ cho phép bá»™ liên kết chuyển đổi cuá»™c gá»i PIC sang c
#: config/mips/mips.opt:315
msgid "When generating -mabicalls code, make the code suitable for use in shared libraries"
-msgstr "Khi tạo ra mã « -mabicalls », làm cho mã thích hợp với sử dụng trong thư viện dùng chung"
+msgstr "Khi tạo ra mã -mabicalls, làm cho mã thích hợp với sử dụng trong thư viện dùng chung"
#: config/mips/mips.opt:319
msgid "Restrict the use of hardware floating-point instructions to 32-bit operations"
-msgstr "Hạn chế sử dụng câu lệnh điểm phù động phần cứng thành thao tác 32-bit"
+msgstr "Hạn chế sử dụng câu lệnh dấu chấm động phần cứng thành thao tác 32-bit"
#: config/mips/mips.opt:323
msgid "Use SmartMIPS instructions"
@@ -8586,7 +8406,7 @@ msgstr "Sử dụng câu lệnh SmartMIPS"
#: config/mips/mips.opt:327
msgid "Prevent the use of all hardware floating-point instructions"
-msgstr "Ngăn cản sử dụng câu lệnh nào có loại điểm phù động phần cứng"
+msgstr "Ngăn cản sử dụng câu lệnh nào có loại dấu chấm động phần cứng"
#: config/mips/mips.opt:331
msgid "Optimize lui/addiu address loads"
@@ -8606,7 +8426,7 @@ msgstr "-mtune=BỘ_XỬ_LÃ\tTối Æ°u hoá kết xuất cho bá»™ xá»­ lý này
#: config/mips/mips.opt:347 config/iq2000/iq2000.opt:74
msgid "Put uninitialized constants in ROM (needs -membedded-data)"
-msgstr "Äể vào ROM các hằng số chÆ°a sÆ¡ khởi (yêu cầu « -membedded-data »)"
+msgstr "Äể vào ROM các hằng số chÆ°a sÆ¡ khởi (yêu cầu -membedded-data)"
#: config/mips/mips.opt:351
msgid "Perform VR4130-specific alignment optimizations"
@@ -8618,11 +8438,11 @@ msgstr "BỠgiới hạn vỠkích cỡ GOT"
#: config/mips/mips-tables.opt:24
msgid "Known MIPS CPUs (for use with the -march= and -mtune= options):"
-msgstr ""
+msgstr "Không hiểu MIPS CPUs (để dùng vá»›i tùy chá»n -march= và -mtune=):"
#: config/mips/mips-tables.opt:28
msgid "Known MIPS ISA levels (for use with the -mips option):"
-msgstr ""
+msgstr "Không hiểu mức MIPS ISA (để dùng vá»›i tùy chá»n -mips):"
#: config/fr30/fr30.opt:23
msgid "Assume small address space"
@@ -8654,7 +8474,7 @@ msgstr "Sử dụng các mẫu adddi3/subdi3 mới"
#: config/cris/linux.opt:27
msgid "Together with -fpic and -fPIC, do not use GOTPLT references"
-msgstr "Äừng sá»­ dụng tham chiếu GOTPLT cùng vá»›i « -fpic » hoặc « -fPIC »"
+msgstr "Äừng sá»­ dụng tham chiếu GOTPLT cùng vá»›i -fpic hoặc -fPIC"
#: config/cris/cris.opt:45
msgid "Work around bug in multiplication instruction"
@@ -8710,7 +8530,7 @@ msgstr "Sá»­ dụng những tuỳ chá»n hiệu lá»±c nhiá»u tính năng nhất
#: config/cris/cris.opt:158
msgid "Override -mbest-lib-options"
-msgstr "Ghi đè lên « -mbest-lib-options »"
+msgstr "Ghi đè lên -mbest-lib-options"
#: config/cris/cris.opt:165
msgid "-march=ARCH\tGenerate code for the specified chip or CPU version"
@@ -8778,7 +8598,7 @@ msgstr "Hiệu lực chức năng gỡ rối hậu phương"
#: config/v850/v850.opt:41
msgid "Do not use the callt instruction"
-msgstr "Äừng sá»­ dụng câu lệnh « callt »"
+msgstr "Äừng sá»­ dụng câu lệnh callt"
#: config/v850/v850.opt:45
msgid "Reuse r30 on a per function basis"
@@ -8814,7 +8634,6 @@ msgstr "Lập kích cỡ tối đa của dữ liệu thích hợp với vùng TD
#: config/v850/v850.opt:83
#, fuzzy
-#| msgid "Enforce strict alignment"
msgid "Do not enforce strict alignment"
msgstr "Ép buộc sự xếp hàng ngặt"
@@ -8835,22 +8654,16 @@ msgid "Compile for the v850e1 processor"
msgstr "Biên dịch cho bộ xử lý v850e1"
#: config/v850/v850.opt:106
-#, fuzzy
-#| msgid "Compile for the v850e processor"
msgid "Compile for the v850es variant of the v850e1"
-msgstr "Biên dịch cho bộ xử lý v850e"
+msgstr "Biên dịch cho bộ xử lý v850e và biến thể của v852el"
#: config/v850/v850.opt:110
-#, fuzzy
-#| msgid "Compile for the v850e processor"
msgid "Compile for the v850e2 processor"
-msgstr "Biên dịch cho bộ xử lý v850e"
+msgstr "Biên dịch cho bộ xử lý v850e2"
#: config/v850/v850.opt:114
-#, fuzzy
-#| msgid "Compile for the v850e processor"
msgid "Compile for the v850e2v3 processor"
-msgstr "Biên dịch cho bộ xử lý v850e"
+msgstr "Biên dịch cho bộ xử lý v850e3v3"
#: config/v850/v850.opt:118
msgid "Set the max size of data eligible for the ZDA area"
@@ -8882,7 +8695,7 @@ msgstr "Tạo ra kết quả chia có phần dư với cùng một ký hiệu (-
#: config/mmix/mmix.opt:49
msgid "Prepend global symbols with \":\" (for use with PREFIX)"
-msgstr "Thêm dấu hai chấm « : » vào trÆ°á»›c ký hiệu toàn cục (để sá»­ dụng vá»›i TIỀN_Tá»)"
+msgstr "Thêm dấu hai chấm \":\" vào trÆ°á»›c ký hiệu toàn cục (để sá»­ dụng vá»›i TIỀN_Tá»)"
#: config/mmix/mmix.opt:53
msgid "Do not provide a default start-address 0x100 of the program"
@@ -8934,7 +8747,7 @@ msgstr "Ghi rõ CPU cho mục đích định thá»i"
#: config/iq2000/iq2000.opt:51
msgid "Known IQ2000 CPUs (for use with the -mcpu= option):"
-msgstr ""
+msgstr "Không hiểu IQ2000 CPUs (để dùng vá»›i tùy chá»n -mcpu=):"
#: config/iq2000/iq2000.opt:65 config/microblaze/microblaze.opt:80
msgid "Use GP relative sdata/sbss sections"
@@ -8942,7 +8755,7 @@ msgstr "Sử dụng phần sdata/sbss tương đối với GP"
#: config/iq2000/iq2000.opt:70
msgid "No default crt0.o"
-msgstr "Không có « crt0.o » mặc định"
+msgstr "Không có crt0.o mặc định"
#: config/bfin/bfin.opt:48
msgid "Omit frame pointer for leaf functions"
@@ -8970,7 +8783,7 @@ msgstr "Tạo ra mã sẽ không được liên kết đối với thư viện d
#: config/bfin/bfin.opt:86
msgid "Link with the fast floating-point library"
-msgstr "Liên kết với thư viện điểm phù động nhanh"
+msgstr "Liên kết với thư viện dấu chấm động nhanh"
#: config/bfin/bfin.opt:98
msgid "Do stack checking using bounds in L1 scratch memory"
@@ -8998,7 +8811,7 @@ msgstr "Giả sử là các ICPLB được hiệu lực vào lúc chạy."
#: config/epiphany/epiphany.opt:24
msgid "Don't use any of r32..r63."
-msgstr ""
+msgstr "Äừng sá»­ dụng r32..r63."
#: config/epiphany/epiphany.opt:28
msgid "preferentially allocate registers that allow short instruction generation."
@@ -9006,25 +8819,21 @@ msgstr ""
#: config/epiphany/epiphany.opt:32
#, fuzzy
-#| msgid "Relax branches"
msgid "Set branch cost"
msgstr "Làm yếu các nhánh"
#: config/epiphany/epiphany.opt:36
#, fuzzy
-#| msgid "Enable all optional instructions"
msgid "enable conditional move instruction usage."
msgstr "Hiệu lá»±c tất cả các câu lệnh vẫn tuỳ chá»n"
#: config/epiphany/epiphany.opt:40
#, fuzzy
-#| msgid "The number of insns executed before prefetch is completed"
msgid "set number of nops to emit before each insn pattern"
msgstr "Số các lệnh được thực hiện trước khi hoàn tất quá trình lấy sẵn (prefetch)"
#: config/epiphany/epiphany.opt:52
#, fuzzy
-#| msgid "Use software floating point"
msgid "Use software floating point comparisons"
msgstr "Sá»­ dụng Ä‘iểm phù Ä‘á»™ng loại phần má»m"
@@ -9034,11 +8843,11 @@ msgstr ""
#: config/epiphany/epiphany.opt:60
msgid "Enable use of POST_INC / POST_DEC"
-msgstr ""
+msgstr "Cho phép sử dụng POST_INC / POST_DEC"
#: config/epiphany/epiphany.opt:64
msgid "Enable use of POST_MODIFY"
-msgstr ""
+msgstr "Cho phép sử dụng POST_MODIFY"
#: config/epiphany/epiphany.opt:68
msgid "Set number of bytes on the stack preallocated for use by the callee."
@@ -9050,13 +8859,11 @@ msgstr ""
#: config/epiphany/epiphany.opt:76
#, fuzzy
-#| msgid "Generate call insns as indirect calls, if necessary"
msgid "Generate call insns as indirect calls"
msgstr "Tạo ra câu lệnh gá»i dÆ°á»›i dạng cuá»™c gá»i gián tiếp, nếu cần thiết"
#: config/epiphany/epiphany.opt:80
#, fuzzy
-#| msgid "Generate call insns as indirect calls, if necessary"
msgid "Generate call insns as direct calls"
msgstr "Tạo ra câu lệnh gá»i dÆ°á»›i dạng cuá»™c gá»i gián tiếp, nếu cần thiết"
@@ -9066,7 +8873,6 @@ msgstr ""
#: config/epiphany/epiphany.opt:108
#, fuzzy
-#| msgid "Use structs on stronger alignment for double-word copies"
msgid "Vectorize for double-word operations."
msgstr "Sử dụng cấu trúc khi xếp hàng mạnh hơn các bản sao từ đôi"
@@ -9076,17 +8882,15 @@ msgstr ""
#: config/epiphany/epiphany.opt:128
msgid "Set register to hold -1."
-msgstr ""
+msgstr "Äặt thanh ghi giữ giá trị -1"
#: config/cr16/cr16.opt:23
#, fuzzy
-#| msgid "-msim\tUse simulator runtime"
msgid "-msim Use simulator runtime"
msgstr "-msim\tSá»­ dụng khoảng thá»i gian chạy của bá»™ mô phá»ng"
#: config/cr16/cr16.opt:27
#, fuzzy
-#| msgid "Generate bit instructions"
msgid "Generate SBIT, CBIT instructions"
msgstr "Tạo ra câu lệnh bit"
@@ -9100,41 +8904,35 @@ msgstr ""
#: config/cr16/cr16.opt:42
#, fuzzy
-#| msgid "Generate code for a cpu32"
msgid "Generate code for CR16C architecture"
msgstr "Tạo ra mã cho một cpu32"
#: config/cr16/cr16.opt:46
#, fuzzy
-#| msgid "Generate code for GNU assembler (gas)"
msgid "Generate code for CR16C+ architecture (Default)"
msgstr "Tạo ra mã cho bộ dịch mã số GNU (gas)"
#: config/cr16/cr16.opt:50
#, fuzzy
-#| msgid "Pointers are 32-bit"
msgid "Treat integers as 32-bit."
msgstr "Hàm trỠlà 32-bit"
#: config/tilegx/tilegx.opt:24 config/tilepro/tilepro.opt:29
#, fuzzy
-#| msgid "-mcpu=\tUse features of and schedule code for given CPU"
msgid "-mcpu=CPU\tUse features of and schedule code for given CPU"
msgstr "-mcpu=\tSá»­ dụng các tính năng của CPU Ä‘Æ°a ra, và định thá»i mã cho CPU đó"
#: config/tilegx/tilegx.opt:28
msgid "Known TILE-Gx CPUs (for use with the -mcpu= option):"
-msgstr ""
+msgstr "Không hiểuTILE-Gx CPUs (để dùng vá»›i tùy chá»n -mcpu=):"
#: config/tilegx/tilegx.opt:35
#, fuzzy
-#| msgid "Compile for 32-bit pointers"
msgid "Compile with 32 bit longs and pointers."
msgstr "Biên dịch cho hàm trỠloại 32-bit"
#: config/tilegx/tilegx.opt:39
#, fuzzy
-#| msgid "Compile for 64-bit pointers"
msgid "Compile with 64 bit longs and pointers."
msgstr "Biên dịch cho hàm trỠloại 64-bit"
@@ -9144,7 +8942,7 @@ msgstr ""
#: config/tilepro/tilepro.opt:33
msgid "Known TILEPro CPUs (for use with the -mcpu= option):"
-msgstr ""
+msgstr "Không hiểu TILEPro CPUs (để dùng vá»›i tùy chá»n -mcpu=):"
#: config/picochip/picochip.opt:23
msgid "Specify which type of AE to target. This option sets the mul-type and byte-access."
@@ -9256,21 +9054,19 @@ msgstr "Hỗ trợ SCORE 7D ISA"
#: config/score/score.opt:51
msgid "Known SCORE architectures (for use with the -march= option):"
-msgstr ""
+msgstr "Không hiểu kiến trúc SCORE (để dùng vá»›i tùy chá»n -march=):"
#: config/linux.opt:24
msgid "Use Bionic C library"
-msgstr ""
+msgstr "Sử dụng thư viện C của Bionic"
#: config/linux.opt:28
msgid "Use GNU C library"
-msgstr ""
+msgstr "Sử dụng thư viện C của GNU"
#: config/linux.opt:32
-#, fuzzy
-#| msgid "Use uClibc instead of GNU libc"
msgid "Use uClibc C library"
-msgstr "Sử dụng thư viện uClibc thay cho libc của GNU"
+msgstr "Sử dụng thư viện uClibc"
#: config/mep/mep.opt:23
msgid "Enable absolute difference instructions"
@@ -9326,7 +9122,7 @@ msgstr "Hiệu lá»±c chức năng định thá»i IVC2"
#: config/mep/mep.opt:71
msgid "Const variables default to the near section"
-msgstr "Giá trị bất biến có thể lập được thì có phần mặc định là « near » (gần)"
+msgstr "Giá trị bất biến có thể lập được thì có phần mặc định là near (gần)"
#: config/mep/mep.opt:78
msgid "Enable 32-bit divide instructions"
@@ -9338,7 +9134,7 @@ msgstr "Biến __io thì hay thay đổi theo mặc định"
#: config/mep/mep.opt:97
msgid "All variables default to the far section"
-msgstr "Tất cả các giá trị có thể lập được thì có phần mặc định là « far » (xa)"
+msgstr "Tất cả các giá trị có thể lập được thì có phần mặc định là far (xa)"
#: config/mep/mep.opt:101
msgid "Enable leading zero instructions"
@@ -9346,7 +9142,7 @@ msgstr "Hiệu lực câu lệnh có số không đi trước"
#: config/mep/mep.opt:108
msgid "All variables default to the near section"
-msgstr "Tất cả các giá trị có thể lập được thì có phần mặc định là « near » (gần)"
+msgstr "Tất cả các giá trị có thể lập được thì có phần mặc định là near (gần)"
#: config/mep/mep.opt:112
msgid "Enable min/max instructions"
@@ -9366,7 +9162,7 @@ msgstr "Cho phép gcc sử dụng câu lệnh repeat/erepeat"
#: config/mep/mep.opt:131
msgid "All variables default to the tiny section"
-msgstr "Tất cả các giá trị có thể lập được thì có phần mặc định là « tiny » (rất nhá»)"
+msgstr "Tất cả các giá trị có thể lập được thì có phần mặc định là tiny (rất nhá»)"
#: config/mep/mep.opt:135
msgid "Enable saturation instructions"
@@ -9382,7 +9178,7 @@ msgstr "Sá»­ dụng thá»i gian chạy của bá»™ mô phá»ng mà không có vé
#: config/mep/mep.opt:151
msgid "All functions default to the far section"
-msgstr "Tất cả các hàm thì có phần mặc định là « far » (xa)"
+msgstr "Tất cả các hàm thì có phần mặc định là far (xa)"
#: config/mep/mep.opt:155
msgid "Variables this size and smaller go in the tiny section. (default 4)"
@@ -9462,7 +9258,7 @@ msgstr "Hiệu lá»±c câu lệnh chia và câu lệnh tạo giá trị tuyệt Ä
#: config/lm32/lm32.opt:32
msgid "Enable barrel shift instructions"
-msgstr "Hiệu lực câu lệnh « barrel shift »"
+msgstr "Hiệu lực câu lệnh barrel shift"
#: config/lm32/lm32.opt:36
msgid "Enable sign extend instructions"
@@ -9474,13 +9270,11 @@ msgstr "Hiệu lá»±c câu lệnh được ngÆ°á»i dùng xác định"
#: config/microblaze/microblaze.opt:40
#, fuzzy
-#| msgid "Use software floating point"
msgid "Use software emulation for floating point (default)"
msgstr "Sá»­ dụng Ä‘iểm phù Ä‘á»™ng loại phần má»m"
#: config/microblaze/microblaze.opt:44
#, fuzzy
-#| msgid "Use decimal floating point instructions"
msgid "Use hardware floating point instructions"
msgstr "Sử dụng câu lệnh loại điểm phù động thập phân"
@@ -9489,14 +9283,11 @@ msgid "Use table lookup optimization for small signed integer divisions"
msgstr ""
#: config/microblaze/microblaze.opt:52
-#, fuzzy
-#| msgid "-mcpu=\tUse features of and schedule code for given CPU"
msgid "-mcpu=PROCESSOR\t\tUse features of and schedule code for given CPU"
-msgstr "-mcpu=\tSá»­ dụng các tính năng của CPU Ä‘Æ°a ra, và định thá»i mã cho CPU đó"
+msgstr "-mcpu=PROCESSOR\tSá»­ dụng các tính năng của định thá»i mã cho CPU đã cho"
#: config/microblaze/microblaze.opt:56
#, fuzzy
-#| msgid "Don't optimize block moves"
msgid "Don't optimize block moves, use memcpy"
msgstr "Äừng tối Æ°u hoá sá»± di chuyển khối"
@@ -9514,7 +9305,6 @@ msgstr ""
#: config/microblaze/microblaze.opt:72
#, fuzzy
-#| msgid "Use fp double instructions"
msgid "Use pattern compare instructions"
msgstr "Sử dụng câu lệnh đôi loại điểm phù động"
@@ -9525,7 +9315,6 @@ msgstr ""
#: config/microblaze/microblaze.opt:76
#, fuzzy
-#| msgid "Generate instances of Class at runtime"
msgid "Check for stack overflow at runtime"
msgstr "Lúc chạy thì tạo ra các thể hiện Hạng"
@@ -9544,35 +9333,32 @@ msgstr ""
#: config/microblaze/microblaze.opt:92
#, fuzzy
-#| msgid "Use decimal floating point instructions"
msgid "Use hardware floating point conversion instructions"
msgstr "Sử dụng câu lệnh loại điểm phù động thập phân"
#: config/microblaze/microblaze.opt:96
#, fuzzy
-#| msgid "Use decimal floating point instructions"
msgid "Use hardware floating point square root instruction"
msgstr "Sử dụng câu lệnh loại điểm phù động thập phân"
#: config/microblaze/microblaze.opt:100
msgid "Description for mxl-mode-executable"
-msgstr ""
+msgstr "Mô tả cho mxl-mode-executable"
#: config/microblaze/microblaze.opt:104
msgid "Description for mxl-mode-xmdstub"
-msgstr ""
+msgstr "Mô tả cho mxl-mode-xmdstub"
#: config/microblaze/microblaze.opt:108
msgid "Description for mxl-mode-bootstrap"
-msgstr ""
+msgstr "Mô tả cho mxl-mode-bootstrap"
#: config/microblaze/microblaze.opt:112
msgid "Description for mxl-mode-novectors"
-msgstr ""
+msgstr "Mô tả cho mxl-mode-novectors"
#: config/linux-android.opt:23
#, fuzzy
-#| msgid "Generate code for the Android operating system."
msgid "Generate code for the Android platform."
msgstr "Tạo ra mã cho hệ Ä‘iá»u hành Android."
@@ -9581,10 +9367,8 @@ msgid "-G<number>\tPut global and static data smaller than <number> bytes into a
msgstr ""
#: config/sol2.opt:32
-#, fuzzy
-#| msgid "Pass -assert pure-text to linker"
msgid "Pass -z text to linker"
-msgstr "Gửi cho bộ liên kết « -assert pure-text »"
+msgstr "Chuyển tùy chá»n -z text cho bá»™ liên kết"
#: config/fused-madd.opt:23
msgid "%<-mfused-madd%> is deprecated; use %<-ffp-contract=%> instead"
@@ -9606,13 +9390,13 @@ msgstr ""
#: c-family/c.opt:1141 c-family/c.opt:1145 c-family/c.opt:1149
#, c-format
msgid "missing path after %qs"
-msgstr ""
+msgstr "thiếu Ä‘Æ°á»ng dẫn sau %qs"
#: c-family/c.opt:186
msgid "-A<question>=<answer>\tAssert the <answer> to <question>. Putting '-' before <question> disables the <answer> to <question>"
msgstr ""
"-A<há»i>=<đáp>\tKhắng định trả lá»i cho má»™t câu há»i nào đó.\n"
-"\t\tThêm dấu trừ « - » vào trÆ°á»›c <há»i> thì tắt <đáp> đó."
+"\t\tThêm dấu trừ - vào trÆ°á»›c <há»i> thì tắt <đáp> đó."
#: c-family/c.opt:190
msgid "Do not discard comments"
@@ -9656,11 +9440,11 @@ msgstr "Thấy tập tin phần đầu còn thiếu là tập tin được tạo
#: c-family/c.opt:233
msgid "Like -M but ignore system header files"
-msgstr "Giống như « -M » mà bỠqua tập tin phần đầu của hệ thống"
+msgstr "Giống như -M mà bỠqua tập tin phần đầu của hệ thống"
#: c-family/c.opt:237
msgid "Like -MD but ignore system header files"
-msgstr "Giống như « -MD » mà bỠqua tập tin phần đầu của hệ thống"
+msgstr "Giống như -MD mà bỠqua tập tin phần đầu của hệ thống"
#: c-family/c.opt:241
msgid "Generate phony targets for all headers"
@@ -9681,7 +9465,7 @@ msgstr "-MT <đích>\tThêm một đích không phải được trích dẫn"
#: c-family/c.opt:253
msgid "Do not generate #line directives"
-msgstr "Äừng tạo ra chỉ thị « #line »"
+msgstr "Äừng tạo ra chỉ thị #line"
#: c-family/c.opt:257
msgid "-U<macro>\tUndefine <macro>"
@@ -9716,10 +9500,8 @@ msgid "Deprecated in favor of -Wc++11-compat"
msgstr ""
#: c-family/c.opt:296
-#, fuzzy
-#| msgid "Warn about C++ constructs whose meaning differs between ISO C++ 1998 and ISO C++ 200x"
msgid "Warn about C++ constructs whose meaning differs between ISO C++ 1998 and ISO C++ 2011"
-msgstr "Cảnh báo vỠcấu trúc C++ có nghĩa khác nhau giữa ISO C++ 1998 và ISO C++ 200x"
+msgstr "Cảnh báo vỠcấu trúc C++ mà nó có nghĩa khác nhau giữa ISO C++ 1998 và ISO C++ 2011"
#: c-family/c.opt:300
msgid "Warn about casts which discard qualifiers"
@@ -9727,11 +9509,11 @@ msgstr "Cảnh báo vá» sá»± gán mà loại bá» Ä‘oạn Ä‘iá»u kiện"
#: c-family/c.opt:304
msgid "Warn about subscripts whose type is \"char\""
-msgstr "Cảnh báo vỠchữ in thấp có loại « char »"
+msgstr "Cảnh báo vỠchữ in thấp có loại 'char'"
#: c-family/c.opt:308
msgid "Warn about variables that might be changed by \"longjmp\" or \"vfork\""
-msgstr "Cảnh báo vỠbiến có thể bị thay đổi bởi « longjmp » hoặc « vfork »"
+msgstr "Cảnh báo vỠbiến có thể bị thay đổi bởi 'longjmp' hoặc 'vfork'"
#: c-family/c.opt:312
msgid "Warn about possibly nested block comments, and C++ comments spanning more than one physical line"
@@ -9739,7 +9521,7 @@ msgstr "Cảnh báo vỠghi chú khối có thể lồng nhau, và ghi chú C++
#: c-family/c.opt:316
msgid "Synonym for -Wcomment"
-msgstr "Từ đồng nghĩa với « -Wcomment »"
+msgstr "Từ đồng nghĩa với -Wcomment"
#: c-family/c.opt:320
msgid "Warn for implicit type conversions that may change a value"
@@ -9763,7 +9545,6 @@ msgstr "Cảnh báo khi phát hiện má»™t lá»i tuyên bố đẳng sau má»™t c
#: c-family/c.opt:340
#, fuzzy
-#| msgid "Warn about non-virtual destructors"
msgid "Warn about deleting polymorphic objects with non-virtual destructors"
msgstr "Cảnh báo vỠbộ hủy cấu trúc không phải ảo"
@@ -9781,11 +9562,11 @@ msgstr "Cảnh báo vỠsự vượt quá quy tắc Effective C++"
#: c-family/c.opt:356
msgid "Warn about an empty body in an if or else statement"
-msgstr "Cảnh báo vỠthân trống trong một câu lệnh « if » (nếu) hay « else » (không thì)"
+msgstr "Cảnh báo vỠthân trống trong một câu lệnh 'if' (nếu) hay 'else' (không thì)"
#: c-family/c.opt:360
msgid "Warn about stray tokens after #elif and #endif"
-msgstr "Cảnh báo vỠhiệu bài thừa đẳng sau « #elif » và « #endif »"
+msgstr "Cảnh báo vỠhiệu bài thừa đẳng sau #elif và #endif"
#: c-family/c.opt:364
msgid "Warn about comparison of different enum types"
@@ -9793,7 +9574,7 @@ msgstr "Cảnh báo vỠsự so sánh các loại đếm (enum) khác nhau"
#: c-family/c.opt:372
msgid "This switch is deprecated; use -Werror=implicit-function-declaration instead"
-msgstr "Cái chuyển này bị phản đối: hãy thay thế bằng « -Werror=implicit-function-declaration »"
+msgstr "Cái chuyển này bị phản đối: hãy thay thế bằng -Werror=implicit-function-declaration"
#: c-family/c.opt:376
msgid "Warn if testing floating point numbers for equality"
@@ -9837,13 +9618,11 @@ msgstr "Cảnh báo vỠbiến bị tự sơ khởi"
#: c-family/c.opt:419
#, fuzzy
-#| msgid "Warn about implicit function declarations"
msgid "Warn about implicit declarations"
msgstr "Cảnh báo vá» lá»i tuyên bố hàm ngầm"
#: c-family/c.opt:423
#, fuzzy
-#| msgid "Warn for implicit type conversions that may change a value"
msgid "Warn about implicit conversions from \"float\" to \"double\""
msgstr "Cảnh báo vỠsự chuyển đổi loại ngầm có thể thay đổi một giá trị"
@@ -9861,7 +9640,7 @@ msgstr "Cảnh báo khi có một sự gán cho một hàm trỠtừ một số
#: c-family/c.opt:442
msgid "Warn about invalid uses of the \"offsetof\" macro"
-msgstr "Cảnh báo khi sai sử dụng vĩ lệnh « offsetof »"
+msgstr "Cảnh báo khi sai sử dụng vĩ lệnh 'offsetof'"
#: c-family/c.opt:446
msgid "Warn about PCH files that are found but not used"
@@ -9877,11 +9656,11 @@ msgstr "Cảnh báo khi một toán tử hợp lý cứ ước lượng là đú
#: c-family/c.opt:458
msgid "Do not warn about using \"long long\" when -pedantic"
-msgstr "Bật « -pedantic » thì đừng cảnh báo vỠsử dụng « long long »"
+msgstr "Bật -pedantic thì đừng cảnh báo vỠsử dụng 'long long'"
#: c-family/c.opt:462
msgid "Warn about suspicious declarations of \"main\""
-msgstr "Cảnh báo vá» lá»i tuyên bố « main » đáng ngá»"
+msgstr "Cảnh báo vá» lá»i tuyên bố 'main' đáng ngá»"
#: c-family/c.opt:466
msgid "Warn about possibly missing braces around initializers"
@@ -9925,7 +9704,7 @@ msgstr ""
#: c-family/c.opt:506
msgid "Warn about \"extern\" declarations not at file scope"
-msgstr "Cảnh báo vá» lá»i tuyên bố « extern » (bên ngoài) ở ngoại phạm vi tập tin"
+msgstr "Cảnh báo vá» lá»i tuyên bố 'extern' (bên ngoài) ở ngoại phạm vi tập tin"
#: c-family/c.opt:510
msgid "Warn when a noexcept expression evaluates to false even though the expression can't actually throw"
@@ -10117,7 +9896,7 @@ msgstr ""
#: c-family/c.opt:702
msgid "A synonym for -std=c89 (for C) or -std=c++98 (for C++)"
-msgstr ""
+msgstr "Äồng nghÄ©a -std=c89 (cho C) hoặc -std=c++98 (cho C++)"
#: c-family/c.opt:710
msgid "Enforce class member access control semantics"
@@ -10139,10 +9918,8 @@ msgstr ""
#: c-family/c.opt:721 c-family/c.opt:839 c-family/c.opt:1078
#: c-family/c.opt:1082 c-family/c.opt:1098
-#, fuzzy
-#| msgid "-pipe not supported"
msgid "No longer supported"
-msgstr "không hỗ trợ « -pipe »"
+msgstr "không còn được hỗ trợ nữa"
#: c-family/c.opt:725
msgid "Recognize the \"asm\" keyword"
@@ -10150,7 +9927,7 @@ msgstr ""
#: c-family/c.opt:733
msgid "Recognize built-in functions"
-msgstr ""
+msgstr "Chấp nhận các hàm dựng sẵn"
#: c-family/c.opt:740
msgid "Check the return value of new"
@@ -10346,7 +10123,6 @@ msgstr ""
#: c-family/c.opt:970
#, fuzzy
-#| msgid "Enable linker relaxations"
msgid "Enable Plan 9 language extensions"
msgstr "Hiệu lực hàm yếu vỠbộ liên kết"
@@ -10652,7 +10428,7 @@ msgstr ""
#: lto/lang.opt:41
msgid "The resolution file"
-msgstr ""
+msgstr "Tập tin phân giải"
#: common.opt:270
msgid "Display this information"
@@ -10704,7 +10480,6 @@ msgstr ""
#: common.opt:516
#, fuzzy
-#| msgid "Produce a backtrace when a runtime error is encountered"
msgid "Warn when a #warning directive is encountered"
msgstr "Xuất một vết ngược khi gặp lỗi lúc chạy"
@@ -10794,13 +10569,11 @@ msgstr ""
#: common.opt:615
#, fuzzy
-#| msgid "Warn about functions which might be candidates for format attributes"
msgid "Warn about functions which might be candidates for __attribute__((const))"
msgstr "Cảnh báo vỠhàm có thể yêu cầu thuộc tính định dạng"
#: common.opt:619
#, fuzzy
-#| msgid "Warn about functions which might be candidates for format attributes"
msgid "Warn about functions which might be candidates for __attribute__((pure))"
msgstr "Cảnh báo vỠhàm có thể yêu cầu thuộc tính định dạng"
@@ -10822,7 +10595,6 @@ msgstr ""
#: common.opt:643
#, fuzzy
-#| msgid "Warn whenever type qualifiers are ignored."
msgid "Warn whenever a trampoline is generated"
msgstr "Cảnh báo khi nào Ä‘oạn Ä‘iá»u kiện loại bị bá» qua."
@@ -10836,41 +10608,40 @@ msgstr ""
#: common.opt:655
#, fuzzy
-#| msgid "Warn about variables which are initialized to themselves"
msgid "Warn about maybe uninitialized automatic variables"
msgstr "Cảnh báo vỠbiến bị tự sơ khởi"
#: common.opt:663
msgid "Enable all -Wunused- warnings"
-msgstr ""
+msgstr "Bật tấ cả -Wunused- warnings"
#: common.opt:667
msgid "Warn when a function parameter is only set, otherwise unused"
-msgstr ""
+msgstr "Cảnh báo khi tham số của hàm chỉ được đặt, nếu không thì không sử dụng"
#: common.opt:671
msgid "Warn when a variable is only set, otherwise unused"
-msgstr ""
+msgstr "Cảnh báo khi biến chỉ được đặt, nếu không thì không sử dụng"
#: common.opt:675
msgid "Warn when a function is unused"
-msgstr ""
+msgstr "Cảnh báo khi hàm không được dùng"
#: common.opt:679
msgid "Warn when a label is unused"
-msgstr ""
+msgstr "Cảnh báo khi nhãn không được dùng"
#: common.opt:683
msgid "Warn when a function parameter is unused"
-msgstr ""
+msgstr "Cảnh báo khi tham số của hàm không được dùng"
#: common.opt:687
msgid "Warn when an expression value is unused"
-msgstr ""
+msgstr "Cảnh báo khi giá trị của biểu thức không được dùng"
#: common.opt:691
msgid "Warn when a variable is unused"
-msgstr ""
+msgstr "Cảnh báo khi biến không được dùng"
#: common.opt:695
msgid "Warn in case profiles in -fprofile-use do not match"
@@ -10906,7 +10677,7 @@ msgstr ""
#: common.opt:812
msgid "Align all labels"
-msgstr ""
+msgstr "Cân chỉnh tất cả các nhãn"
#: common.opt:819
msgid "Align the start of loops"
@@ -11038,7 +10809,6 @@ msgstr ""
#: common.opt:983
#, fuzzy
-#| msgid "Try to allow the linker to turn PIC calls into direct calls"
msgid "Try to convert virtual calls to direct ones."
msgstr "Thá»­ cho phép bá»™ liên kết chuyển đổi cuá»™c gá»i PIC sang cuá»™c gá»i trá»±c tiếp"
@@ -11076,7 +10846,6 @@ msgstr ""
#: common.opt:1035
#, fuzzy
-#| msgid "options passed: "
msgid "Dump optimization passes"
msgstr "tuỳ chá»n được gá»­i: "
@@ -11126,9 +10895,8 @@ msgstr ""
#: common.opt:1086
#, fuzzy, c-format
-#| msgid "unknown spec function '%s'"
msgid "unknown excess precision style %qs"
-msgstr "không rõ hàm đặc tả « %s »"
+msgstr "không rõ hàm đặc tả %qs"
#: common.opt:1099
msgid "Output lto objects containing both the intermediate language and binary output."
@@ -11156,7 +10924,6 @@ msgstr ""
#: common.opt:1126
#, fuzzy, c-format
-#| msgid "Place floating point constants in TOC"
msgid "unknown floating point contraction style %qs"
msgstr "Äể vào TOC hằng số loại Ä‘iểm phù Ä‘á»™ng"
@@ -11198,7 +10965,7 @@ msgstr ""
#: common.opt:1182
msgid "Mark all loops as parallel"
-msgstr ""
+msgstr "Äánh dấu tất cả các vòng lặp là xá»­ lý song song"
#: common.opt:1186
msgid "Enable Loop Strip Mining transformation"
@@ -11218,7 +10985,6 @@ msgstr ""
#: common.opt:1202
#, fuzzy
-#| msgid "Enable leading zero instructions"
msgid "Enable Loop Flattening transformation"
msgstr "Hiệu lực câu lệnh có số không đi trước"
@@ -11268,7 +11034,6 @@ msgstr ""
#: common.opt:1260
#, fuzzy
-#| msgid "function not declared inline and code size would grow"
msgid "Integrate functions not declared \"inline\" into their callers when profitable"
msgstr "hàm không phải được tuyên bố trực tiếp, và kích cỡ mã sẽ tăng lại"
@@ -11331,7 +11096,7 @@ msgstr ""
#: common.opt:1327
#, c-format
msgid "unknown IRA algorithm %qs"
-msgstr ""
+msgstr "không hiểu thuật toán IRA %qs"
#: common.opt:1337
msgid "-fira-region=[one|all|mixed] Set regions for IRA"
@@ -11339,7 +11104,6 @@ msgstr ""
#: common.opt:1340
#, fuzzy, c-format
-#| msgid "unknown relocation unspec"
msgid "unknown IRA region %qs"
msgstr "không rõ bỠghi rõ bố trí lại"
@@ -11397,7 +11161,6 @@ msgstr ""
#: common.opt:1410
#, fuzzy
-#| msgid "Disable indexed addressing"
msgid "Disable partioning and streaming"
msgstr "Tắt chức năng đặt địa chỉ loại phụ lục"
@@ -11415,7 +11178,6 @@ msgstr ""
#: common.opt:1427
#, fuzzy
-#| msgid "-fmax-errors=<n>\tMaximum number of errors to report"
msgid "-fmax-errors=<number>\tMaximum number of errors to report"
msgstr "-fmax-errors=<số>\tSố tối đa các lỗi cần thông báo"
@@ -11749,7 +11511,6 @@ msgstr ""
#: common.opt:1802
#, fuzzy
-#| msgid "Generate APCS conformant stack frames"
msgid "Generate discontiguous stack frames"
msgstr "Tạo ra các khung đống làm hợp với APCS"
@@ -11787,7 +11548,6 @@ msgstr ""
#: common.opt:1841
#, fuzzy
-#| msgid "Reuse r30 on a per function basis"
msgid "Output stack usage information on a per-function basis"
msgstr "Sử dụng lại r30 một cách từng hàm"
@@ -11821,7 +11581,6 @@ msgstr ""
#: common.opt:1880
#, fuzzy, c-format
-#| msgid "unknown insn mode"
msgid "unknown TLS model %qs"
msgstr "không rõ chế độ lệnh"
@@ -11847,7 +11606,6 @@ msgstr ""
#: common.opt:1919
#, fuzzy
-#| msgid "Enable linker optimizations"
msgid "Enable SSA-BIT-CCP optimization on trees"
msgstr "Hiệu lực số tối ưu hoá bộ liên kết"
@@ -11881,7 +11639,6 @@ msgstr ""
#: common.opt:1959
#, fuzzy
-#| msgid "Enable most warning messages"
msgid "Enable tail merging on trees"
msgstr "Hiệu lực phần lớn các thông điệp cảnh báo"
@@ -11899,7 +11656,6 @@ msgstr ""
#: common.opt:1975
#, fuzzy
-#| msgid "Enable linker optimizations"
msgid "Enable string length optimizations on trees"
msgstr "Hiệu lực số tối ưu hoá bộ liên kết"
@@ -12053,7 +11809,6 @@ msgstr ""
#: common.opt:2158
#, fuzzy, c-format
-#| msgid "unrecognized address"
msgid "unrecognized visibility value %qs"
msgstr "không nhận ra địa chỉ"
@@ -12143,7 +11898,7 @@ msgstr ""
#: common.opt:2279
msgid "-o <file>\tPlace output into <file>"
-msgstr ""
+msgstr "-o <tập tin>\tÄặt kết xuất vào <tập tin>"
#: common.opt:2283
msgid "Enable function profiling"
@@ -12182,10 +11937,8 @@ msgid "Create a position independent executable"
msgstr ""
#: go/gofrontend/expressions.cc:853
-#, fuzzy
-#| msgid "invalid use of '%%%c'"
msgid "invalid use of type"
-msgstr "sai sử dụng « %%%c »"
+msgstr "sử dụng kiểu sai"
#: go/gofrontend/expressions.cc:2533 go/gofrontend/expressions.cc:2599
#: go/gofrontend/expressions.cc:2615
@@ -12193,38 +11946,28 @@ msgid "constant refers to itself"
msgstr ""
#: go/gofrontend/expressions.cc:3900
-#, fuzzy
-#| msgid "Expected expression type"
msgid "expected numeric type"
-msgstr "Mong đợi một loại biểu thức"
+msgstr "cần kiểu số"
#: go/gofrontend/expressions.cc:3905
-#, fuzzy
-#| msgid "Expected expression type"
msgid "expected boolean type"
-msgstr "Mong đợi một loại biểu thức"
+msgstr "cần kiểu boolean"
#: go/gofrontend/expressions.cc:3911
-#, fuzzy
-#| msgid "Expected integer string"
msgid "expected integer or boolean type"
-msgstr "Mong đợi một chuỗi số nguyên"
+msgstr "cần số nguyên hoặc lôgíc"
#: go/gofrontend/expressions.cc:3918
#, fuzzy
-#| msgid "invalid operand to %%R"
msgid "invalid operand for unary %<&%>"
msgstr "sai lập toán hạng tới %%R"
#: go/gofrontend/expressions.cc:3927
-#, fuzzy
-#| msgid "Expected integer"
msgid "expected pointer"
-msgstr "Mong đợi một số nguyên"
+msgstr "cần con trá»"
#: go/gofrontend/expressions.cc:5588 go/gofrontend/expressions.cc:5606
#, fuzzy
-#| msgid "Bad type in constant expression"
msgid "incompatible types in binary expression"
msgstr "Gặp loại saio trong biểu thức bất biến"
@@ -12238,15 +11981,12 @@ msgstr ""
#: go/gofrontend/expressions.cc:5638
#, fuzzy
-#| msgid "negative insn length"
msgid "negative shift count"
msgstr "chiá»u dài lệnh âm"
#: go/gofrontend/expressions.cc:6431
-#, fuzzy
-#| msgid "move insn not handled"
msgid "object is not a method"
-msgstr "lệnh di chuyển chưa quản lý"
+msgstr "đối tượng không phải là phương thức"
#: go/gofrontend/expressions.cc:6440
msgid "method type does not match object type"
@@ -12261,20 +12001,16 @@ msgstr ""
#: go/gofrontend/expressions.cc:7686 go/gofrontend/expressions.cc:7729
#: go/gofrontend/expressions.cc:7785 go/gofrontend/expressions.cc:8967
#: go/gofrontend/expressions.cc:8986
-#, fuzzy
-#| msgid "no arguments"
msgid "not enough arguments"
-msgstr "không có đối số nào"
+msgstr "không đủ đối số"
#: go/gofrontend/expressions.cc:6750 go/gofrontend/expressions.cc:6807
#: go/gofrontend/expressions.cc:7544 go/gofrontend/expressions.cc:7669
#: go/gofrontend/expressions.cc:7691 go/gofrontend/expressions.cc:7734
#: go/gofrontend/expressions.cc:7787 go/gofrontend/expressions.cc:8662
#: go/gofrontend/expressions.cc:8972 go/gofrontend/expressions.cc:8993
-#, fuzzy
-#| msgid "no arguments"
msgid "too many arguments"
-msgstr "không có đối số nào"
+msgstr "quá nhiá»u đối số"
#: go/gofrontend/expressions.cc:6809
msgid "argument 1 must be a map"
@@ -12282,7 +12018,6 @@ msgstr ""
#: go/gofrontend/expressions.cc:6876
#, fuzzy
-#| msgid "internal function"
msgid "invalid type for make function"
msgstr "hàm nội bộ"
@@ -12292,19 +12027,16 @@ msgstr ""
#: go/gofrontend/expressions.cc:6904
#, fuzzy
-#| msgid "bad insn for 'A'"
msgid "bad size for make"
-msgstr "sai lập lệnh cho « A »"
+msgstr "sai lập lệnh cho 'A'"
#: go/gofrontend/expressions.cc:6919
msgid "bad capacity when making slice"
msgstr ""
#: go/gofrontend/expressions.cc:6930
-#, fuzzy
-#| msgid "too many arguments to %%:version-compare"
msgid "too many arguments to make"
-msgstr "quá nhiá»u đối số tá»›i %%:version-compare"
+msgstr "quá nhiá»u đối số để thá»±c hiện"
#: go/gofrontend/expressions.cc:7588
msgid "argument must be array or slice or channel"
@@ -12316,7 +12048,6 @@ msgstr ""
#: go/gofrontend/expressions.cc:7644
#, fuzzy
-#| msgid "Support 3DNow! built-in functions"
msgid "unsupported argument type to builtin function"
msgstr "Hỗ trợ các hàm dựng sẵn 3DNow!"
@@ -12330,7 +12061,6 @@ msgstr ""
#: go/gofrontend/expressions.cc:7677
#, fuzzy
-#| msgid "target is not pointer or reference"
msgid "argument must be a field reference"
msgstr "đích không phải là một hàm trỠhoặc một tham chiếu"
@@ -12364,21 +12094,17 @@ msgstr ""
#: go/gofrontend/expressions.cc:7797
#, fuzzy
-#| msgid "Do not use hardware floating point"
msgid "complex arguments must have floating-point type"
msgstr "Äừng sá»­ dụng Ä‘iểm phù Ä‘á»™ng loại phần cứng"
#: go/gofrontend/expressions.cc:8666
#, fuzzy
-#| msgid "invalid use of '%%%c'"
msgid "invalid use of %<...%> with non-slice"
-msgstr "sai sử dụng « %%%c »"
+msgstr "sai sử dụng '%%%c'"
#: go/gofrontend/expressions.cc:8920 go/gofrontend/expressions.cc:9361
-#, fuzzy
-#| msgid "Expected string"
msgid "expected function"
-msgstr "Mong đợi một chuỗi"
+msgstr "cần hàm"
#: go/gofrontend/expressions.cc:8939
msgid "incompatible type for receiver"
@@ -12394,7 +12120,7 @@ msgstr ""
#: go/gofrontend/expressions.cc:9688 go/gofrontend/expressions.cc:10110
msgid "index must be integer"
-msgstr ""
+msgstr "chỉ số phải là số nguyên"
#: go/gofrontend/expressions.cc:9694 go/gofrontend/expressions.cc:10114
msgid "slice end must be integer"
@@ -12406,7 +12132,6 @@ msgstr ""
#: go/gofrontend/expressions.cc:10344
#, fuzzy
-#| msgid "Enable the normal mode"
msgid "incompatible type for map index"
msgstr "Hiệu lá»±c chế Ä‘á»™ thông thÆ°á»ng"
@@ -12424,7 +12149,6 @@ msgstr ""
#: go/gofrontend/expressions.cc:12933 go/gofrontend/expressions.cc:12941
#, fuzzy
-#| msgid "invalid constraints for operand"
msgid "invalid unsafe.Pointer conversion"
msgstr "sai lập ràng buộc cho toán hạng"
@@ -12437,10 +12161,8 @@ msgid "impossible type assertion: type does not implement interface"
msgstr ""
#: go/gofrontend/expressions.cc:13142 go/gofrontend/statements.cc:1387
-#, fuzzy
-#| msgid "Expected name"
msgid "expected channel"
-msgstr "Mong đợi một tên"
+msgstr "cần kênh"
#: go/gofrontend/expressions.cc:13147 go/gofrontend/statements.cc:1392
msgid "invalid receive on send-only channel"
@@ -12452,7 +12174,6 @@ msgstr ""
#: go/gofrontend/statements.cc:590
#, fuzzy
-#| msgid "invalid addressing mode"
msgid "invalid left hand side of assignment"
msgstr "sai lập chế độ đặt địa chỉ"
@@ -12462,19 +12183,16 @@ msgstr ""
#: go/gofrontend/statements.cc:1254
#, fuzzy
-#| msgid "expected end of line"
msgid "expected map index on left hand side"
-msgstr "mong đợi kết thúc dòng"
+msgstr "cần kết thúc dòng"
#: go/gofrontend/statements.cc:2632 go/gofrontend/statements.cc:2661
#, fuzzy
-#| msgid "in argument to unary !"
msgid "not enough arguments to return"
msgstr "trong đối số tới bộ nguyên phân !"
#: go/gofrontend/statements.cc:2640
#, fuzzy
-#| msgid "Return values of functions in FPU registers"
msgid "return with value in function with no return type"
msgstr "Trả lại giá trị của hàm trong thanh ghi FPU (đơn vị điểm phù động)"
@@ -12483,10 +12201,8 @@ msgid "too many values in return statement"
msgstr ""
#: go/gofrontend/statements.cc:3145
-#, fuzzy
-#| msgid "Expected expression type"
msgid "expected boolean expression"
-msgstr "Mong đợi một loại biểu thức"
+msgstr "cần một biểu thức lôgíc"
#: go/gofrontend/statements.cc:4334
msgid "incompatible types in send"
@@ -12506,7 +12222,6 @@ msgstr ""
#: go/gofrontend/types.cc:527
#, fuzzy
-#| msgid "Warn about comparison of different enum types"
msgid "invalid comparison of non-ordered type"
msgstr "Cảnh báo vỠsự so sánh các loại đếm (enum) khác nhau"
@@ -12524,13 +12239,11 @@ msgstr ""
#: go/gofrontend/types.cc:553
#, fuzzy, c-format
-#| msgid "invalid operand to %%R"
msgid "invalid operation (%s)"
msgstr "sai lập toán hạng tới %%R"
#: go/gofrontend/types.cc:576
#, fuzzy
-#| msgid "invalid use of non-lvalue array"
msgid "invalid comparison of non-comparable type"
msgstr "sai sử dụng mảng không phải lvalue"
@@ -12540,7 +12253,6 @@ msgstr ""
#: go/gofrontend/types.cc:605
#, fuzzy
-#| msgid "invalid use of non-lvalue array"
msgid "invalid comparison of non-comparable array"
msgstr "sai sử dụng mảng không phải lvalue"
@@ -12564,7 +12276,6 @@ msgstr ""
#: go/gofrontend/types.cc:3227 go/gofrontend/types.cc:3240
#: go/gofrontend/types.cc:3255
#, fuzzy
-#| msgid "maximum number of parameters in a SCoP"
msgid "different number of parameters"
msgstr "số tối đa các tham số trong một SCoP"
@@ -12611,22 +12322,22 @@ msgstr ""
#: go/gofrontend/types.cc:6741 go/gofrontend/types.cc:6754
msgid "type has no methods"
-msgstr ""
+msgstr "kiểu không có phương thức"
#: go/gofrontend/types.cc:6775
#, c-format
msgid "ambiguous method %s%s%s"
-msgstr ""
+msgstr "phương thức còn mơ hồ %s%s%s"
#: go/gofrontend/types.cc:6778
#, c-format
msgid "missing method %s%s%s"
-msgstr ""
+msgstr "thiếu phương thức%s%s%s"
#: go/gofrontend/types.cc:6818
#, c-format
msgid "method %s%s%s requires a pointer"
-msgstr ""
+msgstr "phÆ°Æ¡ng thức %s%s%s yêu cầu má»™t con trá»"
#. Warn about and ignore all others for now, but store them.
#: attribs.c:315 c-family/c-common.c:7387 objc/objc-act.c:4952
@@ -12744,7 +12455,6 @@ msgstr ""
#: builtins.c:4937
#, fuzzy, gcc-internal-format
-#| msgid "Omit frame pointer for leaf functions"
msgid "trampoline generated for nested function %qD"
msgstr "BỠsót hàm trỠkhung cho hàm lá"
@@ -12938,12 +12648,12 @@ msgstr ""
#: c-decl.c:1174 cp/decl.c:628
#, gcc-internal-format
msgid "unused variable %q+D"
-msgstr ""
+msgstr "biến chưa được dùng %q+D"
#: c-decl.c:1178
#, gcc-internal-format
msgid "variable %qD set but not used"
-msgstr ""
+msgstr "biến %qD được đặt nhưng lại chưa được dùng"
#: c-decl.c:1183
#, gcc-internal-format
@@ -13033,7 +12743,7 @@ msgstr ""
#: c-decl.c:1729 c-decl.c:1742 c-decl.c:1778
#, gcc-internal-format
msgid "conflicting types for %q+D"
-msgstr ""
+msgstr "kiểu xung đột cho %q+D"
#: c-decl.c:1758
#, gcc-internal-format
@@ -13093,7 +12803,7 @@ msgstr ""
#: c-decl.c:1945
#, gcc-internal-format
msgid "but not here"
-msgstr ""
+msgstr "nhưng không phải ở đây"
#: c-decl.c:1963
#, gcc-internal-format
@@ -13228,7 +12938,7 @@ msgstr ""
#: c-decl.c:3099 c-decl.c:3371
#, gcc-internal-format
msgid "%qD declared here"
-msgstr ""
+msgstr "%qD được khai báo ở đây"
#: c-decl.c:3153 c-decl.c:3242
#, gcc-internal-format
@@ -13243,7 +12953,7 @@ msgstr ""
#: c-decl.c:3273 cp/decl.c:2921
#, gcc-internal-format
msgid "duplicate label %qD"
-msgstr ""
+msgstr "nhãn nhân đôi %qD"
#: c-decl.c:3304
#, gcc-internal-format
@@ -13307,7 +13017,6 @@ msgstr ""
#: c-decl.c:3762
#, fuzzy, gcc-internal-format
-#| msgid "derived type declaration"
msgid "%<_Noreturn%> in empty declaration"
msgstr "lá»i tuyên bố loại có hÆ°á»›ng"
@@ -13344,7 +13053,7 @@ msgstr ""
#: c-decl.c:3808 c-parser.c:1498
#, gcc-internal-format
msgid "empty declaration"
-msgstr ""
+msgstr "khai báo trống rỗng"
#: c-decl.c:3880
#, gcc-internal-format
@@ -13367,7 +13076,7 @@ msgstr ""
#: c-decl.c:4004
#, gcc-internal-format
msgid "%q+D is usually a function"
-msgstr ""
+msgstr "%q+D thÆ°á»ng là má»™t hàm"
#: c-decl.c:4013
#, gcc-internal-format
@@ -13383,7 +13092,7 @@ msgstr ""
#: c-decl.c:4024
#, gcc-internal-format
msgid "parameter %qD is initialized"
-msgstr ""
+msgstr "tham số %qD được khởi tạo"
#. Although C99 is unclear about whether incomplete arrays
#. of VLAs themselves count as VLAs, it does not make
@@ -13406,7 +13115,6 @@ msgstr ""
#: c-decl.c:4189
#, fuzzy, gcc-internal-format
-#| msgid "enum conversion in initialization is invalid in C++"
msgid "uninitialized const member in %qT is invalid in C++"
msgstr "chuyển đổi enum trong bộ sơ khởi thì không hợp lệ trong C++"
@@ -13568,17 +13276,17 @@ msgstr ""
#: c-decl.c:5058
#, gcc-internal-format
msgid "duplicate %<const%>"
-msgstr ""
+msgstr "lặp lại %<const%>"
#: c-decl.c:5060
#, gcc-internal-format
msgid "duplicate %<restrict%>"
-msgstr ""
+msgstr "lặp lại %<restrict%>"
#: c-decl.c:5062
#, gcc-internal-format
msgid "duplicate %<volatile%>"
-msgstr ""
+msgstr "lặp lại %<volatile%>"
#: c-decl.c:5066
#, gcc-internal-format, gfc-internal-format
@@ -13851,7 +13559,6 @@ msgstr ""
#: c-decl.c:5784
#, fuzzy, gcc-internal-format
-#| msgid "no arguments for spec function"
msgid "alignment specified for function %qE"
msgstr "không có đối số tới hàm đặc tả"
@@ -13999,7 +13706,7 @@ msgstr ""
#: c-decl.c:6321
#, gcc-internal-format, gfc-internal-format
msgid "parameter %u has void type"
-msgstr ""
+msgstr "tham số %u có kiểu void"
#: c-decl.c:6406
#, gcc-internal-format
@@ -14036,17 +13743,17 @@ msgstr ""
#: c-decl.c:6593
#, gcc-internal-format
msgid "enum type defined here"
-msgstr ""
+msgstr "kiểu enum được định nghĩa ở đây"
#: c-decl.c:6599
#, gcc-internal-format
msgid "struct defined here"
-msgstr ""
+msgstr "struct được định nghĩa ở đây"
#: c-decl.c:6605
#, gcc-internal-format
msgid "union defined here"
-msgstr ""
+msgstr "union được định nghĩa ở đây"
#: c-decl.c:6678
#, gcc-internal-format
@@ -14091,17 +13798,17 @@ msgstr ""
#: c-decl.c:6894 c-decl.c:6913 c-decl.c:6976
#, gcc-internal-format
msgid "duplicate member %q+D"
-msgstr ""
+msgstr "thành viên trùng lặp %q+D"
#: c-decl.c:7086
#, gcc-internal-format
msgid "union has no named members"
-msgstr ""
+msgstr "union không có thành viên nào"
#: c-decl.c:7088
#, gcc-internal-format
msgid "union has no members"
-msgstr ""
+msgstr "union không có thành viên nào"
#: c-decl.c:7093
#, gcc-internal-format
@@ -14111,7 +13818,7 @@ msgstr ""
#: c-decl.c:7095
#, gcc-internal-format
msgid "struct has no members"
-msgstr ""
+msgstr "struct không có thành viên nào"
#: c-decl.c:7158
#, gcc-internal-format
@@ -14237,7 +13944,7 @@ msgstr ""
#: c-decl.c:7978
#, gcc-internal-format
msgid "old-style function definition"
-msgstr ""
+msgstr "định nghĩa hàm theo cách cũ"
#: c-decl.c:7987
#, gcc-internal-format
@@ -14247,7 +13954,7 @@ msgstr ""
#: c-decl.c:8002
#, gcc-internal-format
msgid "%qD declared as a non-parameter"
-msgstr ""
+msgstr "%qD đã được định nghĩa là không có tham số"
#: c-decl.c:8008
#, gcc-internal-format
@@ -14370,7 +14077,7 @@ msgstr ""
#: c-decl.c:8860 c-decl.c:9171 c-decl.c:9565
#, gcc-internal-format
msgid "duplicate %qE"
-msgstr ""
+msgstr "lặp lại %qE"
#: c-decl.c:8886 c-decl.c:9182 c-decl.c:9439
#, gcc-internal-format
@@ -14380,31 +14087,30 @@ msgstr ""
#: c-decl.c:8898 cp/parser.c:2512
#, gcc-internal-format
msgid "%<long long long%> is too long for GCC"
-msgstr ""
+msgstr "%<long long long%> là quá dài đối với GCC"
#: c-decl.c:8911
#, gcc-internal-format
msgid "ISO C90 does not support %<long long%>"
-msgstr ""
+msgstr "ISO C90 không hỗ trợ %<long long%>"
#: c-decl.c:9077 c-parser.c:6639
#, gcc-internal-format
msgid "ISO C90 does not support complex types"
-msgstr ""
+msgstr "ISO C90 không hỗ trợ kiểu complex"
#: c-decl.c:9116
#, gcc-internal-format
msgid "ISO C does not support saturating types"
-msgstr ""
+msgstr "ISO C không hỗ trợ kiểu saturating"
#: c-decl.c:9190
#, gcc-internal-format
msgid "%<__int128%> is not supported for this target"
-msgstr ""
+msgstr "%<__int128%> không được hỗ trợ cho đích này"
#: c-decl.c:9195
#, fuzzy, gcc-internal-format
-#| msgid "SH2a does not support little-endian"
msgid "ISO C does not support %<__int128%> type"
msgstr "SH2a không há»— trợ tình trạng vá» cuối nhá»"
@@ -14441,27 +14147,27 @@ msgstr ""
#: c-decl.c:9530
#, gcc-internal-format
msgid "%<__thread%> used with %<auto%>"
-msgstr ""
+msgstr "%<__thread%> được dùng với %<auto%>"
#: c-decl.c:9532
#, gcc-internal-format
msgid "%<__thread%> used with %<register%>"
-msgstr ""
+msgstr "%<__thread%> được dùng với %<register%>"
#: c-decl.c:9534
#, gcc-internal-format
msgid "%<__thread%> used with %<typedef%>"
-msgstr ""
+msgstr "%<__thread%> được dùng với %<typedef%>"
#: c-decl.c:9545
#, gcc-internal-format
msgid "%<__thread%> before %<extern%>"
-msgstr ""
+msgstr "%<__thread%> trÆ°á»›c %<extern%>"
#: c-decl.c:9554
#, gcc-internal-format
msgid "%<__thread%> before %<static%>"
-msgstr ""
+msgstr "%<__thread%> trÆ°á»›c %<static%>"
#: c-decl.c:9570
#, gcc-internal-format
@@ -14471,12 +14177,12 @@ msgstr ""
#: c-decl.c:9577
#, gcc-internal-format
msgid "%<__thread%> used with %qE"
-msgstr ""
+msgstr "%<__thread%> được dùng với %qE"
#: c-decl.c:9644
#, gcc-internal-format
msgid "%<_Sat%> is used without %<_Fract%> or %<_Accum%>"
-msgstr ""
+msgstr "%<_Sat%> được dùng mà không có %<_Fract%> or %<_Accum%>"
#: c-decl.c:9658
#, gcc-internal-format
@@ -14491,7 +14197,7 @@ msgstr ""
#: c-decl.c:9896 toplev.c:484
#, gcc-internal-format
msgid "%q+F used but never defined"
-msgstr ""
+msgstr "%q+F được dùng mà chưa từng được định nghĩa"
#: c-parser.c:244
#, gcc-internal-format
@@ -14519,10 +14225,9 @@ msgid "expected declaration specifiers"
msgstr ""
#: c-parser.c:1511 c-parser.c:2632
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>, %<,%> or %<)%>"
+#, gcc-internal-format
msgid "expected %<;%>, identifier or %<(%>"
-msgstr "mong đợi %<;%>, %<,%> or %<)%>"
+msgstr "cần %<;%>, định danh hoặc %<(%>"
#: c-parser.c:1529 cp/parser.c:23810 cp/parser.c:23884
#, gcc-internal-format
@@ -14535,10 +14240,9 @@ msgid "prefix attributes are ignored for implementations"
msgstr ""
#: c-parser.c:1585
-#, fuzzy, gcc-internal-format
-#| msgid "Expected attribute bit name"
+#, gcc-internal-format
msgid "unexpected attribute"
-msgstr "Mong đợi một tên bit thuộc tính"
+msgstr "cần thuộc tính"
#: c-parser.c:1628
#, gcc-internal-format
@@ -14548,7 +14252,7 @@ msgstr ""
#: c-parser.c:1703 cp/parser.c:10475
#, gcc-internal-format
msgid "expected %<,%> or %<;%>"
-msgstr ""
+msgstr "cần %<,%> hoặc %<;%>"
#. This can appear in many cases looking nothing like a
#. function definition, so we don't give a more specific
@@ -14585,13 +14289,11 @@ msgstr ""
#: c-parser.c:1877
#, fuzzy, gcc-internal-format
-#| msgid "array index in initializer is not an integer constant expression"
msgid "expression in static assertion is not an integer constant expression"
msgstr "bộ sơ khởi chứa một chỉ mục mảng không phải là một biểu tượng hằng số nguyên"
#: c-parser.c:1882
#, fuzzy, gcc-internal-format
-#| msgid "initializer element is not constant"
msgid "expression in static assertion is not constant"
msgstr "yếu tố sơ khởi không phải hằng số"
@@ -14611,7 +14313,7 @@ msgstr ""
#: cp/parser.c:24654 cp/parser.c:24684 cp/parser.c:24754 cp/parser.c:26971
#, gcc-internal-format
msgid "expected identifier"
-msgstr ""
+msgstr "cần định danh"
#: c-parser.c:2295 cp/parser.c:14618
#, gcc-internal-format
@@ -14621,7 +14323,7 @@ msgstr ""
#: c-parser.c:2301
#, gcc-internal-format
msgid "expected %<,%> or %<}%>"
-msgstr ""
+msgstr "cần %<,%> hoặc %<}%>"
#: c-parser.c:2332
#, gcc-internal-format
@@ -14631,7 +14333,7 @@ msgstr ""
#: c-parser.c:2448
#, gcc-internal-format
msgid "expected class name"
-msgstr ""
+msgstr "cần tên lớp"
#: c-parser.c:2467
#, gcc-internal-format
@@ -14656,34 +14358,32 @@ msgstr ""
#: c-parser.c:2695
#, gcc-internal-format
msgid "expected %<,%>, %<;%> or %<}%>"
-msgstr ""
+msgstr "cần %<,%>, %<;%> hoặc %<}%>"
#: c-parser.c:2702
#, gcc-internal-format
msgid "expected %<:%>, %<,%>, %<;%>, %<}%> or %<__attribute__%>"
-msgstr ""
+msgstr "cần %<:%>, %<,%>, %<;%>, %<}%> hoặc %<__attribute__%>"
#: c-parser.c:2755
#, gcc-internal-format
msgid "%<typeof%> applied to a bit-field"
-msgstr ""
+msgstr "%<typeof%> được áp dụng cho một bit-field"
#: c-parser.c:2789
-#, fuzzy, gcc-internal-format
-#| msgid "SH2a does not support little-endian"
+#, gcc-internal-format
msgid "ISO C99 does not support %<_Alignas%>"
-msgstr "SH2a không há»— trợ tình trạng vá» cuối nhá»"
+msgstr "ISO C99 không hỗ trợ %<_Alignas%>"
#: c-parser.c:2792
-#, fuzzy, gcc-internal-format
-#| msgid "SH2a does not support little-endian"
+#, gcc-internal-format
msgid "ISO C90 does not support %<_Alignas%>"
-msgstr "SH2a không há»— trợ tình trạng vá» cuối nhá»"
+msgstr "ISO C90 không hỗ trợ %<_Alignas%>"
#: c-parser.c:3020
#, gcc-internal-format
msgid "expected identifier or %<(%>"
-msgstr ""
+msgstr "cần một định danh hoặc %<(%>"
#: c-parser.c:3227
#, gcc-internal-format
@@ -14743,12 +14443,12 @@ msgstr ""
#: c-parser.c:4213
#, gcc-internal-format
msgid "expected %<}%> before %<else%>"
-msgstr ""
+msgstr "cần %<}%> trước %<else%>"
#: c-parser.c:4218 cp/parser.c:8996
#, gcc-internal-format
msgid "%<else%> without a previous %<if%>"
-msgstr ""
+msgstr "%<else%> mà không có %<if%> ở trước"
#: c-parser.c:4235
#, gcc-internal-format
@@ -14758,7 +14458,7 @@ msgstr ""
#: c-parser.c:4280
#, gcc-internal-format
msgid "expected %<:%> or %<...%>"
-msgstr ""
+msgstr "cần %<:%> hoặc %<...%>"
#: c-parser.c:4311
#, gcc-internal-format
@@ -14768,7 +14468,7 @@ msgstr ""
#: c-parser.c:4486
#, gcc-internal-format
msgid "expected identifier or %<*%>"
-msgstr ""
+msgstr "cần một định danh hoặc %<*%>"
#. Avoid infinite loop in error recovery:
#. c_parser_skip_until_found stops at a closing nesting
@@ -14777,7 +14477,7 @@ msgstr ""
#: c-parser.c:4559 cp/parser.c:8724
#, gcc-internal-format
msgid "expected statement"
-msgstr ""
+msgstr "cần biểu thức"
#: c-parser.c:4657 cp/parser.c:9078
#, gcc-internal-format
@@ -14801,7 +14501,6 @@ msgstr ""
#: c-parser.c:4982
#, fuzzy, gcc-internal-format
-#| msgid "invalid register in the instruction"
msgid "invalid iterating variable in fast enumeration"
msgstr "lệnh chứa một thanh ghi sai"
@@ -14828,19 +14527,17 @@ msgstr ""
#: c-parser.c:6026
#, gcc-internal-format
msgid "%<sizeof%> applied to a bit-field"
-msgstr ""
+msgstr "%<sizeof%> được áp dụng cho bit-field"
#: c-parser.c:6047
-#, fuzzy, gcc-internal-format
-#| msgid "does not support multilib"
+#, gcc-internal-format
msgid "ISO C99 does not support %qE"
-msgstr "không hỗ trợ chức năng đa thư viện"
+msgstr "ISO C99 không hỗ trợ %qE"
#: c-parser.c:6050
-#, fuzzy, gcc-internal-format
-#| msgid "does not support multilib"
+#, gcc-internal-format
msgid "ISO C90 does not support %qE"
-msgstr "không hỗ trợ chức năng đa thư viện"
+msgstr "ISO C90 không hỗ trợ %qE"
#: c-parser.c:6101
#, gcc-internal-format
@@ -14848,10 +14545,9 @@ msgid "ISO C does not allow %<%E (expression)%>"
msgstr ""
#: c-parser.c:6126
-#, fuzzy, gcc-internal-format
-#| msgid "cannot decompose address"
+#, gcc-internal-format
msgid "cannot take address of %qs"
-msgstr "không thể phân ly địa chỉ"
+msgstr "không thể lấy địa chỉ của %qs"
#: c-parser.c:6297 c-parser.c:6747 c-parser.c:6766
#, gcc-internal-format
@@ -14880,7 +14576,6 @@ msgstr ""
#: c-parser.c:6602
#, fuzzy, gcc-internal-format
-#| msgid "wrong type argument to bit-complement"
msgid "wrong number of arguments to %<__builtin_complex%>"
msgstr "đối số có loại sai đối với phần bù bit"
@@ -14892,12 +14587,12 @@ msgstr ""
#: c-parser.c:6633
#, gcc-internal-format
msgid "%<__builtin_complex%> operands of different types"
-msgstr ""
+msgstr "%<__builtin_complex%> toán hạng không đúng kiểu"
#: c-parser.c:6679
#, gcc-internal-format
msgid "wrong number of arguments to %<__builtin_shuffle%>"
-msgstr ""
+msgstr "sai số tham số cho %<__builtin_shuffle%>"
#: c-parser.c:6801
#, gcc-internal-format
@@ -14916,9 +14611,8 @@ msgstr ""
#: c-parser.c:7141
#, fuzzy, gcc-internal-format
-#| msgid "expected %<,%> or %<)%>"
msgid "expected identifier or %<)%>"
-msgstr "mong đợi %<,%> hoặc %<)%>"
+msgstr "cần %<,%> hoặc %<)%>"
#: c-parser.c:7237
#, gcc-internal-format
@@ -14952,19 +14646,18 @@ msgstr ""
#: c-parser.c:8270 c-parser.c:8327 cp/parser.c:24714
#, fuzzy, gcc-internal-format
-#| msgid "<unknown operator>"
msgid "unknown property attribute"
msgstr "<không rõ toán hạng>"
#: c-parser.c:8291 cp/parser.c:24674
#, gcc-internal-format
msgid "missing %<=%> (after %<getter%> attribute)"
-msgstr ""
+msgstr "thiếu %<=%> (sau thuộc tính %<getter%>)"
#: c-parser.c:8294 cp/parser.c:24677
#, gcc-internal-format
msgid "missing %<=%> (after %<setter%> attribute)"
-msgstr ""
+msgstr "thiếu %<=%> (sau thuộc tính %<setter%>)"
#: c-parser.c:8308 cp/parser.c:24692
#, gcc-internal-format
@@ -14984,27 +14677,27 @@ msgstr ""
#: c-parser.c:8506 cp/parser.c:27295
#, gcc-internal-format
msgid "%<#pragma omp barrier%> may only be used in compound statements"
-msgstr ""
+msgstr "%<#pragma omp barrier%> chỉ có thể sử dụng trong các biểu thức phức hợp"
#: c-parser.c:8517 cp/parser.c:27310
#, gcc-internal-format
msgid "%<#pragma omp flush%> may only be used in compound statements"
-msgstr ""
+msgstr "%<#pragma omp flush%> chỉ có thể sử dụng trong các biểu thức phức hợp"
#: c-parser.c:8528 cp/parser.c:27326
#, gcc-internal-format
msgid "%<#pragma omp taskwait%> may only be used in compound statements"
-msgstr ""
+msgstr "%<#pragma omp taskwait%> chỉ có thể sử dụng trong các biểu thức phức hợp"
#: c-parser.c:8539 cp/parser.c:27342
#, gcc-internal-format
msgid "%<#pragma omp taskyield%> may only be used in compound statements"
-msgstr ""
+msgstr "%<#pragma omp taskyield%> chỉ có thể sử dụng trong các biểu thức phức hợp"
#: c-parser.c:8552 cp/parser.c:27370
#, gcc-internal-format
msgid "%<#pragma omp section%> may only be used in %<#pragma omp sections%> construct"
-msgstr ""
+msgstr "%<#pragma omp section%> chỉ có thể sử dụng trong cấu trúc %<#pragma omp sections%>"
#: c-parser.c:8558 cp/parser.c:27285
#, gcc-internal-format
@@ -15014,7 +14707,7 @@ msgstr ""
#: c-parser.c:8723 cp/parser.c:24962
#, gcc-internal-format
msgid "too many %qs clauses"
-msgstr ""
+msgstr "quá nhiá»u mệnh Ä‘á» %qs"
#: c-parser.c:8825 cp/parser.c:25077
#, gcc-internal-format
@@ -15024,12 +14717,12 @@ msgstr ""
#: c-parser.c:8891 cp/parser.c:25128
#, gcc-internal-format
msgid "expected %<none%> or %<shared%>"
-msgstr ""
+msgstr "cần %<none%> hoặc %<shared%>"
#: c-parser.c:9026 c-parser.c:9240
#, gcc-internal-format
msgid "expected integer expression"
-msgstr ""
+msgstr "cần biểu thức nguyên"
#: c-parser.c:9038
#, gcc-internal-format
@@ -15039,7 +14732,7 @@ msgstr ""
#: c-parser.c:9142 cp/parser.c:25347
#, gcc-internal-format
msgid "expected %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, %<||%>, %<min%> or %<max%>"
-msgstr ""
+msgstr "cần %<+%>, %<*%>, %<-%>, %<&%>, %<^%>, %<|%>, %<&&%>, %<||%>, %<min%> hoặc %<max%>"
#: c-parser.c:9231 cp/parser.c:25432
#, gcc-internal-format
@@ -15059,12 +14752,12 @@ msgstr ""
#: c-parser.c:9381 cp/parser.c:25583
#, gcc-internal-format
msgid "expected %<#pragma omp%> clause"
-msgstr ""
+msgstr "cần mệnh đỠ%<#pragma omp%>"
#: c-parser.c:9390 cp/parser.c:25592
#, gcc-internal-format
msgid "%qs is not valid for %qs"
-msgstr ""
+msgstr "%qs không hợp lệ cho %qs"
#: c-parser.c:9682 cp/parser.c:25876
#, gcc-internal-format
@@ -15079,12 +14772,12 @@ msgstr ""
#: c-parser.c:9826 c-parser.c:9847
#, gcc-internal-format
msgid "expected %<(%> or end of line"
-msgstr ""
+msgstr "cần %<(%> hoặc xuống dòng"
#: c-parser.c:9882 cp/parser.c:26195
#, gcc-internal-format
msgid "for statement expected"
-msgstr ""
+msgstr "cần câu lệnh for"
#: c-parser.c:9935 cp/semantics.c:4702 cp/semantics.c:4772
#, gcc-internal-format
@@ -15109,7 +14802,7 @@ msgstr ""
#: c-parser.c:10568
#, gcc-internal-format
msgid "%qD is not a variable"
-msgstr ""
+msgstr "%qD không phải là một biến"
#: c-parser.c:10570 cp/semantics.c:4327
#, gcc-internal-format
@@ -15159,7 +14852,7 @@ msgstr ""
#: c-typeck.c:235 c-typeck.c:8627 c-typeck.c:8659 cp/call.c:3736
#, gcc-internal-format
msgid "invalid use of void expression"
-msgstr ""
+msgstr "sử dụng sai biểu thức void"
#: c-typeck.c:243
#, gcc-internal-format
@@ -15235,7 +14928,7 @@ msgstr ""
#: c-typeck.c:2160
#, gcc-internal-format
msgid "%qT has no member named %qE"
-msgstr ""
+msgstr "%qT không có thành viên nào mang tên %qE"
#: c-typeck.c:2214
#, gcc-internal-format
@@ -15332,7 +15025,6 @@ msgstr ""
#: c-typeck.c:3045
#, fuzzy, gcc-internal-format
-#| msgid "too many arguments to %%:version-compare"
msgid "too many arguments to method %qE"
msgstr "quá nhiá»u đối số tá»›i %%:version-compare"
@@ -15344,7 +15036,7 @@ msgstr ""
#: c-typeck.c:3051 c-typeck.c:3285 cp/decl2.c:4257 cp/typeck.c:3363
#, gcc-internal-format
msgid "declared here"
-msgstr ""
+msgstr "được khai báo ở đây"
#: c-typeck.c:3086
#, gcc-internal-format, gfc-internal-format
@@ -15424,7 +15116,7 @@ msgstr ""
#: c-typeck.c:3384
#, gcc-internal-format
msgid "comparison between %qT and %qT"
-msgstr ""
+msgstr "so sánh giữa %qT và %qT"
#: c-typeck.c:3436
#, gcc-internal-format
@@ -16109,7 +15801,7 @@ msgstr "gặp yếu tố thừa trong bộ sơ khởi vô hướng"
#: c-typeck.c:8707
#, gcc-internal-format
msgid "ISO C forbids %<goto *expr;%>"
-msgstr ""
+msgstr "ISO C cấm %<goto *expr;%>"
#: c-typeck.c:8729 cp/typeck.c:7766
#, gcc-internal-format
@@ -16199,26 +15891,25 @@ msgstr ""
#: c-typeck.c:9950 cp/typeck.c:3939
#, gcc-internal-format
msgid "right shift count is negative"
-msgstr ""
+msgstr "số lượng dịch trái là số âm"
#: c-typeck.c:9961 cp/typeck.c:3946
#, gcc-internal-format
msgid "right shift count >= width of type"
-msgstr ""
+msgstr "số lượng dịch phải >= độ rộng của kiểu"
#: c-typeck.c:10002 cp/typeck.c:3968
#, gcc-internal-format
msgid "left shift count is negative"
-msgstr ""
+msgstr "số lượng dịch trái là số âm"
#: c-typeck.c:10009 cp/typeck.c:3974
#, gcc-internal-format
msgid "left shift count >= width of type"
-msgstr ""
+msgstr "số lượng dịch trái >= độ rộng của kiểu"
#: c-typeck.c:10032 c-typeck.c:10169
#, fuzzy, gcc-internal-format
-#| msgid "Warn about comparison of different enum types"
msgid "comparing vectors with different element types"
msgstr "Cảnh báo vỠsự so sánh các loại đếm (enum) khác nhau"
@@ -16446,108 +16137,107 @@ msgstr ""
#: cfghooks.c:259
#, gcc-internal-format
msgid "verify_flow_info failed"
-msgstr ""
+msgstr "verify_flow_info gặp lỗi"
#: cfghooks.c:320
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support redirect_edge_and_branch"
-msgstr ""
+msgstr "%s không hỗ trợ redirect_edge_and_branch"
#: cfghooks.c:340
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support can_remove_branch_p"
-msgstr ""
+msgstr "%s không hỗ trợ can_remove_branch_p"
#: cfghooks.c:393
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support redirect_edge_and_branch_force"
-msgstr ""
+msgstr "%s không hỗ trợ redirect_edge_and_branch_force"
#: cfghooks.c:431
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support split_block"
-msgstr ""
+msgstr "%s không hỗ trợ split_block"
#: cfghooks.c:483
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support move_block_after"
-msgstr ""
+msgstr "%s không hỗ trợ move_block_after"
#: cfghooks.c:496
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support delete_basic_block"
-msgstr ""
+msgstr "%s không hỗ trợ delete_basic_block"
#: cfghooks.c:546
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support split_edge"
-msgstr ""
+msgstr "%s không hỗ trợ split_edge"
#: cfghooks.c:619
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support create_basic_block"
-msgstr ""
+msgstr "%s không hỗ trợ create_basic_block"
#: cfghooks.c:647
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support can_merge_blocks_p"
-msgstr ""
+msgstr "%s không hỗ trợ can_merge_blocks_p"
#: cfghooks.c:658
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support predict_edge"
-msgstr ""
+msgstr "%s không hỗ trợ predict_edge"
#: cfghooks.c:667
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support predicted_by_p"
-msgstr ""
+msgstr "%s không hỗ trợ predicted_by_p"
#: cfghooks.c:681
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support merge_blocks"
-msgstr ""
+msgstr "%s không hỗ trợ merge_blocks"
#: cfghooks.c:734
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support make_forwarder_block"
-msgstr ""
+msgstr "%s không hỗ trợ make_forwarder_block"
#: cfghooks.c:889
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "does not support multilib"
msgid "%s does not support force_nonfallthru"
msgstr "không hỗ trợ chức năng đa thư viện"
#: cfghooks.c:917
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support can_duplicate_block_p"
-msgstr ""
+msgstr "%s không hỗ trợ can_duplicate_block_p"
#: cfghooks.c:939
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support duplicate_block"
-msgstr ""
+msgstr "%s không hỗ trợ duplicate_block"
#: cfghooks.c:1014
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support block_ends_with_call_p"
-msgstr ""
+msgstr "%s không hỗ trợ block_ends_with_call_p"
#: cfghooks.c:1025
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support block_ends_with_condjump_p"
-msgstr ""
+msgstr "%s không hỗ trợ block_ends_with_condjump_p"
#: cfghooks.c:1043
#, gcc-internal-format, gfc-internal-format
msgid "%s does not support flow_call_edges_add"
-msgstr ""
+msgstr "%s không hỗ trợ flow_call_edges_add"
#: cfgloop.c:1335
#, gcc-internal-format, gfc-internal-format
msgid "size of loop %d should be %d, not %d"
-msgstr ""
+msgstr "kích thước của vòng lặp %d nên là %d, không phải %d"
#: cfgloop.c:1349
#, gcc-internal-format, gfc-internal-format
@@ -16631,7 +16321,6 @@ msgstr ""
#: cfgloop.c:1542
#, fuzzy, gcc-internal-format
-#| msgid "too many lto output files"
msgid "too many loop exits recorded"
msgstr "quá nhiá»u tập tin kết xuất lto"
@@ -16693,7 +16382,7 @@ msgstr ""
#: cfgrtl.c:1948
#, gcc-internal-format, gfc-internal-format
msgid "too many eh edges %i"
-msgstr ""
+msgstr "quá nhiá»u eh edges %i"
#: cfgrtl.c:1956
#, gcc-internal-format, gfc-internal-format
@@ -16738,17 +16427,17 @@ msgstr ""
#: cfgrtl.c:2018 cfgrtl.c:2028
#, gcc-internal-format, gfc-internal-format
msgid "NOTE_INSN_BASIC_BLOCK is missing for block %d"
-msgstr ""
+msgstr "NOTE_INSN_BASIC_BLOCK bị thiếu cho khối %d"
#: cfgrtl.c:2041
#, gcc-internal-format, gfc-internal-format
msgid "NOTE_INSN_BASIC_BLOCK %d in middle of basic block %d"
-msgstr ""
+msgstr "NOTE_INSN_BASIC_BLOCK %d tại giữa của khối cơ bản %d"
#: cfgrtl.c:2051
#, gcc-internal-format, gfc-internal-format
msgid "in basic block %d:"
-msgstr ""
+msgstr "trong khối cơ bản %d:"
#: cfgrtl.c:2103 cfgrtl.c:2193
#, gcc-internal-format, gfc-internal-format
@@ -16993,7 +16682,7 @@ msgstr ""
#: cgraphunit.c:802
#, gcc-internal-format
msgid "verify_cgraph_node failed"
-msgstr ""
+msgstr "verify_cgraph_node gặp lỗi"
#: cgraphunit.c:851
#, gcc-internal-format
@@ -17017,7 +16706,6 @@ msgstr ""
#: cgraphunit.c:1032
#, fuzzy, gcc-internal-format
-#| msgid "function not inlinable"
msgid "always_inline function might not be inlinable"
msgstr "hàm không thể chèn vào trực tiếp"
@@ -17042,10 +16730,9 @@ msgid "nodes with unreleased memory found"
msgstr ""
#: collect2.c:900
-#, fuzzy, gcc-internal-format
-#| msgid "COLLECT_LTO_WRAPPER must be set."
+#, gcc-internal-format
msgid "COLLECT_LTO_WRAPPER must be set"
-msgstr "COLLECT_LTO_WRAPPER phải được lập."
+msgstr "COLLECT_LTO_WRAPPER phải được đặt"
#: collect2.c:1231
#, gcc-internal-format
@@ -17060,32 +16747,29 @@ msgstr ""
#: collect2.c:1470
#, gcc-internal-format
msgid "can't open %s: %m"
-msgstr ""
+msgstr "không thể mở %s: %m"
#: collect2.c:1584
#, gcc-internal-format, gfc-internal-format
msgid "unknown demangling style '%s'"
msgstr ""
-# Literal: don't translate; Nghĩa chữ : dừng dịch
+# Literal: don't translate; Nghĩa chữ: dừng dịch
#: collect2.c:1680 collect2.c:1863 collect2.c:1898
-#, fuzzy, gcc-internal-format
-#| msgid "fopen %s"
+#, gcc-internal-format
msgid "fopen %s: %m"
-msgstr "fopen %s"
+msgstr "fopen %s: %m"
-# Literal: don't translate; Nghĩa chữ : dừng dịch
+# Literal: don't translate; Nghĩa chữ: dừng dịch
#: collect2.c:1683 collect2.c:1868 collect2.c:1901
-#, fuzzy, gcc-internal-format
-#| msgid "fclose %s"
+#, gcc-internal-format
msgid "fclose %s: %m"
-msgstr "fclose %s"
+msgstr "fclose %s: %m"
#: collect2.c:1965
-#, fuzzy, gcc-internal-format
-#| msgid "can't get program status"
+#, gcc-internal-format
msgid "can't get program status: %m"
-msgstr "không thể lấy trạng thái vỠchương trình"
+msgstr "không thể lấy trạng thái vỠchương trình: %m"
#: collect2.c:1973
#, gcc-internal-format, gfc-internal-format
@@ -17110,29 +16794,27 @@ msgstr "không thể đóng đáp ứng tập tin %s"
#: collect2.c:2077
#, gcc-internal-format, gfc-internal-format
msgid "cannot find '%s'"
-msgstr "không tìm thấy « %s »"
+msgstr "không tìm thấy '%s'"
#: collect2.c:2081 collect2.c:2617 collect2.c:2813 gcc.c:2658
-#, fuzzy, gcc-internal-format
-#| msgid "pex_init failed"
+#, gcc-internal-format
msgid "pex_init failed: %m"
-msgstr "pex_init bị lỗi"
+msgstr "pex_init bị lỗi: %m"
#: collect2.c:2090 collect2.c:2626 collect2.c:2821 gcc.c:7027
#, gcc-internal-format
msgid "%s: %m"
-msgstr ""
+msgstr "%s: %m"
#: collect2.c:2591
#, gcc-internal-format
msgid "cannot find 'nm'"
-msgstr "không tìm thấy « nm »"
+msgstr "không tìm thấy 'nm'"
#: collect2.c:2639
-#, fuzzy, gcc-internal-format
-#| msgid "can't open nm output"
+#, gcc-internal-format
msgid "can't open nm output: %m"
-msgstr "không thể mở kết xuất nm"
+msgstr "không thể mở kết xuất nm: %m"
#: collect2.c:2722
#, gcc-internal-format, gfc-internal-format
@@ -17147,13 +16829,12 @@ msgstr "hàm fini được tìm trong đối tượng %s"
#: collect2.c:2788
#, gcc-internal-format
msgid "cannot find 'ldd'"
-msgstr ""
+msgstr "không tìm thấy 'ldd'"
#: collect2.c:2834
-#, fuzzy, gcc-internal-format
-#| msgid "can't open ldd output"
+#, gcc-internal-format
msgid "can't open ldd output: %m"
-msgstr "không thể mở kết xuất ldd"
+msgstr "không thể mở kết xuất ldd: %m"
#: collect2.c:2852
#, gcc-internal-format, gfc-internal-format
@@ -17163,7 +16844,7 @@ msgstr "không tìm thấy quan hệ phụ thuộc năng động %s"
#: collect2.c:2864
#, gcc-internal-format, gfc-internal-format
msgid "unable to open dynamic dependency '%s'"
-msgstr "không thể mở quan hệ phụ thuộc năng động « %s »"
+msgstr "không thể mở quan hệ phụ thuộc năng động '%s'"
#: collect2.c:3025
#, gcc-internal-format, gfc-internal-format
@@ -17183,7 +16864,7 @@ msgstr "không tìm thấy thư viện lib%s"
#: convert.c:83
#, gcc-internal-format
msgid "cannot convert to a pointer type"
-msgstr ""
+msgstr "không thể chuyển đổi thành kiểu con trá»"
#: convert.c:384
#, gcc-internal-format
@@ -17233,7 +16914,7 @@ msgstr ""
#: coverage.c:189
#, gcc-internal-format
msgid "%qs is not a gcov data file"
-msgstr ""
+msgstr "%qs không phải là tập tin dữ liệu gcov"
#: coverage.c:200
#, gcc-internal-format
@@ -17263,7 +16944,7 @@ msgstr ""
#: coverage.c:311
#, gcc-internal-format
msgid "%qs has overflowed"
-msgstr ""
+msgstr "%qs có chỗ bị tràn"
#: coverage.c:361
#, gcc-internal-format
@@ -17303,18 +16984,17 @@ msgstr ""
#: coverage.c:603
#, gcc-internal-format
msgid "error writing %qs"
-msgstr ""
+msgstr "lá»—i ghi %qs"
#: coverage.c:1111
#, gcc-internal-format, gfc-internal-format
msgid "cannot open %s"
-msgstr ""
+msgstr "không thể mở %s"
#: cppspec.c:92
-#, fuzzy, gcc-internal-format
-#| msgid "\"%s\" is not a valid option to the preprocessor"
+#, gcc-internal-format
msgid "%qs is not a valid option to the preprocessor"
-msgstr "« %s » không phải là má»™t tuỳ chá»n hợp lệ cho bá»™ tiá»n xá»­ lý"
+msgstr "'%qs' không phải là má»™t tuỳ chá»n hợp lệ cho bá»™ tiá»n xá»­ lý"
#: cppspec.c:111
#, gcc-internal-format
@@ -17349,12 +17029,12 @@ msgstr ""
#: dbgcnt.c:136
#, gcc-internal-format, gfc-internal-format
msgid "-fdbg-cnt=%s"
-msgstr ""
+msgstr "-fdbg-cnt=%s"
#: dbgcnt.c:137
#, gcc-internal-format, gfc-internal-format
msgid " %s"
-msgstr ""
+msgstr " %s"
#: dbxout.c:3363
#, gcc-internal-format
@@ -17364,7 +17044,7 @@ msgstr ""
#: diagnostic.c:899
#, gcc-internal-format, gfc-internal-format
msgid "in %s, at %s:%d"
-msgstr ""
+msgstr "trong %s, tại %s:%d"
#: dominance.c:1027
#, gcc-internal-format, gfc-internal-format
@@ -17464,7 +17144,7 @@ msgstr ""
#: except.c:3332
#, gcc-internal-format
msgid "verify_eh_tree failed"
-msgstr ""
+msgstr "verify_eh_tree gặp lỗi"
#: explow.c:1444
#, gcc-internal-format
@@ -17523,13 +17203,11 @@ msgstr ""
#: final.c:4430 toplev.c:1421 tree-optimize.c:173
#, fuzzy, gcc-internal-format
-#| msgid "could not open response file %s"
msgid "could not open final insn dump file %qs: %m"
msgstr "không thể mở tập tin đáp ứng %s"
#: final.c:4483 tree-optimize.c:189
#, fuzzy, gcc-internal-format
-#| msgid "could not close response file %s"
msgid "could not close final insn dump file %qs: %m"
msgstr "không thể đóng đáp ứng tập tin %s"
@@ -17575,7 +17253,6 @@ msgstr ""
#: fold-const.c:8840
#, fuzzy, gcc-internal-format
-#| msgid "assuming signed overflow does not occur when simplifying && or || to & or |"
msgid "assuming signed overflow does not occur when changing X +- C1 cmp C2 to X cmp C1 +- C2"
msgstr "giả sử rằng sự tràn đã ký không xảy ra khi giản dị hoá && hoặc || tới & hoặc |"
@@ -17612,12 +17289,12 @@ msgstr ""
#: function.c:4502
#, gcc-internal-format
msgid "function returns an aggregate"
-msgstr ""
+msgstr "hàm trả vỠmột tập hợp"
#: function.c:4896
#, gcc-internal-format
msgid "unused parameter %q+D"
-msgstr ""
+msgstr "tham số chưa dùng %q+D"
#: gcc.c:1732 gcc.c:1752
#, gcc-internal-format, gfc-internal-format
@@ -17636,9 +17313,8 @@ msgstr "đặc tả chứa đặc tả %s không có tên mới"
#: gcc.c:1824
#, fuzzy, gcc-internal-format
-#| msgid "%s: attempt to rename spec '%s' to already defined spec '%s'"
msgid "%s: attempt to rename spec %qs to already defined spec %qs"
-msgstr "%s: đã thử thay đổi tên của đặc tả « %s » thành đặc tả đã xác định « %s »"
+msgstr "%s: đã thử thay đổi tên của đặc tả '%s' thành đặc tả đã xác định '%s'"
#: gcc.c:1845
#, gcc-internal-format, gfc-internal-format
@@ -17657,44 +17333,38 @@ msgstr "tập tin đặc tả không có đặc tả để liên kết"
#: gcc.c:2450
#, fuzzy, gcc-internal-format
-#| msgid "system path '%s' is not absolute"
msgid "system path %qs is not absolute"
-msgstr "Ä‘Æ°á»ng dẫn « %s » không phải tuyệt đối"
+msgstr "Ä‘Æ°á»ng dẫn '%s' không phải tuyệt đối"
#: gcc.c:2535
#, gcc-internal-format
msgid "-pipe not supported"
-msgstr "không hỗ trợ « -pipe »"
+msgstr "không hỗ trợ -pipe"
#: gcc.c:2697
-#, fuzzy, gcc-internal-format
-#| msgid "failed to get exit status"
+#, gcc-internal-format
msgid "failed to get exit status: %m"
-msgstr "không lấy được trạng thái thoát"
+msgstr "không lấy được trạng thái thoát: %m"
#: gcc.c:2703
-#, fuzzy, gcc-internal-format
-#| msgid "failed to get process times"
+#, gcc-internal-format
msgid "failed to get process times: %m"
-msgstr "không lấy được thá»i gian tiến trình"
+msgstr "không lấy được thá»i gian tiến trình: %m"
#: gcc.c:2729
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "programs: %s\n"
+#, gcc-internal-format, gfc-internal-format
msgid "%s (program %s)"
-msgstr "chương trình: %s\n"
+msgstr "%s (chương trình %s)"
#: gcc.c:3148 opts-common.c:986 opts-common.c:1058
#, fuzzy, gcc-internal-format
-#| msgid "unrecognized address"
msgid "unrecognized command line option %qs"
msgstr "không nhận ra địa chỉ"
#: gcc.c:3401
#, fuzzy, gcc-internal-format
-#| msgid "'%s' is an unknown -save-temps option"
msgid "%qs is an unknown -save-temps option"
-msgstr "« %s » là má»™t tuỳ chá»n « -save-temps » không rõ"
+msgstr "'%s' là má»™t tuỳ chá»n -save-temps không rõ"
#: gcc.c:3862
#, gcc-internal-format
@@ -17708,15 +17378,13 @@ msgstr ""
#: gcc.c:4115
#, fuzzy, gcc-internal-format
-#| msgid "unable to locate default linker script '%s' in the library search paths"
msgid "unable to locate default linker script %qs in the library search paths"
-msgstr "không tìm thấy văn lệnh liên kết mặc định « %s » trong các Ä‘Æ°á»ng dẫn tìm kiếm thÆ° viện"
+msgstr "không tìm thấy văn lệnh liên kết mặc định '%s' trong các Ä‘Æ°á»ng dẫn tìm kiếm thÆ° viện"
#: gcc.c:4318
#, fuzzy, gcc-internal-format
-#| msgid "switch '%s' does not start with '-'"
msgid "switch %qs does not start with %<-%>"
-msgstr "cái chuyển « %s » không bắt đầu bằng « - »"
+msgstr "cái chuyển '%s' không bắt đầu bằng '-'"
#: gcc.c:4321
#, gcc-internal-format
@@ -17739,28 +17407,24 @@ msgid "could not close temporary response file %s"
msgstr "không thể đóng tập tin đáp ứng tạm thá»i %s"
#: gcc.c:4547
-#, fuzzy, gcc-internal-format
-#| msgid "spec '%s' invalid"
+#, gcc-internal-format
msgid "spec %qs invalid"
-msgstr "đặc tả « %s » không hợp lệ"
+msgstr "đặc tả %qs không hợp lệ"
#: gcc.c:4696
-#, fuzzy, gcc-internal-format
-#| msgid "spec '%s' has invalid '%%0%c'"
+#, gcc-internal-format
msgid "spec %qs has invalid %<%%0%c%>"
-msgstr "đặc tả « %s » có « %%0%c » không hợp lệ"
+msgstr "đặc tả %qs có %<%%0%c%> không hợp lệ"
#: gcc.c:5006
-#, fuzzy, gcc-internal-format
-#| msgid "spec '%s' has invalid '%%W%c"
+#, gcc-internal-format
msgid "spec %qs has invalid %<%%W%c%>"
-msgstr "đặc tả « %s » có « %%W%c » không hợp lệ"
+msgstr "đặc tả %qs có %<%%W%c%> không hợp lệ"
#: gcc.c:5028
-#, fuzzy, gcc-internal-format
-#| msgid "spec '%s' has invalid '%%x%c'"
+#, gcc-internal-format
msgid "spec %qs has invalid %<%%x%c%>"
-msgstr "đặc tả « %s » có « %%x%c » không hợp lệ"
+msgstr "đặc tả %qs có %<%%x%c%> không hợp lệ"
#. Catch the case where a spec string contains something like
#. '%{foo:%*}'. i.e. there is no * in the pattern on the left
@@ -17776,16 +17440,14 @@ msgid "spec failure: unrecognized spec option %qc"
msgstr ""
#: gcc.c:5319
-#, fuzzy, gcc-internal-format
-#| msgid "unknown spec function '%s'"
+#, gcc-internal-format
msgid "unknown spec function %qs"
-msgstr "không rõ hàm đặc tả « %s »"
+msgstr "không hiểu hàm đặc tả %qs"
#: gcc.c:5337
-#, fuzzy, gcc-internal-format
-#| msgid "error in args to spec function '%s'"
+#, gcc-internal-format
msgid "error in args to spec function %qs"
-msgstr "gặp lỗi trong các đối số tới hàm đặc tả « %s »"
+msgstr "gặp lỗi trong các đối số tới hàm đặc tả %qs"
#: gcc.c:5385
#, gcc-internal-format
@@ -17804,16 +17466,14 @@ msgid "malformed spec function arguments"
msgstr "đối số hàm đặc tả dạng sai"
#: gcc.c:5668
-#, fuzzy, gcc-internal-format
-#| msgid "braced spec '%s' is invalid at '%c'"
+#, gcc-internal-format
msgid "braced spec %qs is invalid at %qc"
-msgstr "đặc tả giữa ngoặc móc « %s » không hợp lệ tại « %c »"
+msgstr "đặc tả giữa ngoặc móc %qs không hợp lệ tại %qc"
#: gcc.c:5756
-#, fuzzy, gcc-internal-format
-#| msgid "braced spec body '%s' is invalid"
+#, gcc-internal-format
msgid "braced spec body %qs is invalid"
-msgstr "sai lập thân của đặc tả giữa ngoặc móc « %s »"
+msgstr "thân của đặc tả giữa ngoặc móc %qs không hợp lệ"
#: gcc.c:6005
#, gcc-internal-format, gfc-internal-format
@@ -17823,7 +17483,7 @@ msgstr ""
#: gcc.c:6016
#, gcc-internal-format, gfc-internal-format
msgid "%s: -fcompare-debug failure (length)"
-msgstr ""
+msgstr "%s: -fcompare-debug thất bại (độ dài)"
#: gcc.c:6026 gcc.c:6067
#, gcc-internal-format, gfc-internal-format
@@ -17833,29 +17493,27 @@ msgstr ""
#: gcc.c:6046 gcc.c:6083
#, gcc-internal-format, gfc-internal-format
msgid "%s: -fcompare-debug failure"
-msgstr ""
+msgstr "%s: -fcompare-debug thất bại"
#: gcc.c:6161
-#, fuzzy, gcc-internal-format
-#| msgid "pex_init failed"
+#, gcc-internal-format
msgid "atexit failed"
-msgstr "pex_init bị lỗi"
+msgstr "atexit gặp lỗi"
#: gcc.c:6302
#, gcc-internal-format
msgid "spec failure: more than one arg to SYSROOT_SUFFIX_SPEC"
-msgstr ""
+msgstr "spec thất bại: có nhiá»u hÆ¡n má»™t đối số chuyển cho SYSROOT_SUFFIX_SPEC"
#: gcc.c:6325
#, gcc-internal-format
msgid "spec failure: more than one arg to SYSROOT_HEADERS_SUFFIX_SPEC"
-msgstr ""
+msgstr "spec thất bại: có nhiá»u hÆ¡n má»™t đối số chuyển cho SYSROOT_HEADERS_SUFFIX_SPEC"
#: gcc.c:6491
-#, fuzzy, gcc-internal-format
-#| msgid "unrecognizable insn:"
+#, gcc-internal-format
msgid "unrecognized option %<-%s%>"
-msgstr "không nhận ra lệnh:"
+msgstr "không thừa nhận tùy chá»n %<-%s%>"
#. The error status indicates that only one set of fixed
#. headers should be built.
@@ -17872,17 +17530,17 @@ msgstr "không có tập tin nhập vào"
#: gcc.c:6700
#, gcc-internal-format
msgid "cannot specify -o with -c, -S or -E with multiple files"
-msgstr "không thể ghi rõ nhiá»u tập tin vá»›i tuỳ chá»n « -S » hoặc « -E », và hai tuỳ chá»n « -o » và « c » loại từ lẫn nhau"
+msgstr "không thể ghi rõ nhiá»u tập tin vá»›i tuỳ chá»n -S hoặc -E, và hai tuỳ chá»n -o và c loại từ lẫn nhau"
#: gcc.c:6730
#, gcc-internal-format, gfc-internal-format
msgid "%s: %s compiler not installed on this system"
-msgstr ""
+msgstr "%s: trình biên dịch %s chưa được cài đặt trên hệ thống này"
#: gcc.c:6752
#, gcc-internal-format
msgid "recompiling with -fcompare-debug"
-msgstr ""
+msgstr "hãy dịch lại vá»›i tùy chá»n -fcompare-debug"
#: gcc.c:6768
#, gcc-internal-format
@@ -17895,10 +17553,9 @@ msgid "comparing final insns dumps"
msgstr ""
#: gcc.c:6883
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "-fuse-linker-plugin, but liblto_plugin.so not found"
+#, gcc-internal-format, gfc-internal-format
msgid "-fuse-linker-plugin, but %s not found"
-msgstr "-fuse-linker-plugin, mà không tìm thấy liblto_plugin.so"
+msgstr "-fuse-linker-plugin, mà không tìm thấy %s"
#: gcc.c:6915
#, gcc-internal-format, gfc-internal-format
@@ -17908,43 +17565,37 @@ msgstr ""
#: gcc.c:6956
#, gcc-internal-format, gfc-internal-format
msgid "language %s not recognized"
-msgstr ""
+msgstr "không chấp nhận ngôn ngữ %s"
#: gcc.c:7182
-#, fuzzy, gcc-internal-format
-#| msgid "multilib spec '%s' is invalid"
+#, gcc-internal-format
msgid "multilib spec %qs is invalid"
-msgstr "đặc tả đa thư viện « %s » không hợp lệ"
+msgstr "đặc tả đa thư viện %qs không hợp lệ"
#: gcc.c:7374
-#, fuzzy, gcc-internal-format
-#| msgid "multilib exclusions '%s' is invalid"
+#, gcc-internal-format
msgid "multilib exclusions %qs is invalid"
-msgstr "sự loại từ đa thư viện « %s » không hợp lệ"
+msgstr "sự loại từ đa thư viện %qs không hợp lệ"
#: gcc.c:7432 gcc.c:7573
-#, fuzzy, gcc-internal-format
-#| msgid "multilib select '%s' is invalid"
+#, gcc-internal-format
msgid "multilib select %qs is invalid"
-msgstr "sá»± lá»±a chá»n Ä‘a thÆ° viện « %s » không hợp lệ"
+msgstr "sá»± lá»±a chá»n Ä‘a thÆ° viện %qs không hợp lệ"
#: gcc.c:7611
-#, fuzzy, gcc-internal-format
-#| msgid "multilib exclusion '%s' is invalid"
+#, gcc-internal-format
msgid "multilib exclusion %qs is invalid"
-msgstr "sự loại từ đa thư viện « %s » không hợp lệ"
+msgstr "sự loại từ đa thư viện %qs không hợp lệ"
#: gcc.c:7817
-#, fuzzy, gcc-internal-format
-#| msgid "environment variable \"%s\" not defined"
+#, gcc-internal-format
msgid "environment variable %qs not defined"
-msgstr "chÆ°a xác định biến môi trÆ°á»ng « %s »"
+msgstr "chÆ°a định nghÄ©a biến môi trÆ°á»ng%qs"
#: gcc.c:7929 gcc.c:7934
-#, fuzzy, gcc-internal-format
-#| msgid "invalid version number `%s'"
+#, gcc-internal-format
msgid "invalid version number %qs"
-msgstr "số thứ tự phiên bản không hợp lệ « %s »"
+msgstr "số thứ tự phiên bản không hợp lệ %qs"
#: gcc.c:7977
#, gcc-internal-format, gfc-internal-format
@@ -17957,10 +17608,9 @@ msgid "too many arguments to %%:version-compare"
msgstr "quá nhiá»u đối số tá»›i %%:version-compare"
#: gcc.c:8024
-#, fuzzy, gcc-internal-format
-#| msgid "unknown operator '%s' in %%:version-compare"
+#, gcc-internal-format
msgid "unknown operator %qs in %%:version-compare"
-msgstr "không rõ toán tử « %s » trong %%:version-compare"
+msgstr "không hiểu toán tử %qs trong %%:version-compare"
#: gcc.c:8147
#, gcc-internal-format, gfc-internal-format
@@ -17985,30 +17635,30 @@ msgstr "quá nhiá»u đối số tá»›i %%:compare-debug-auxbase-opt"
#: gcc.c:8260
#, gcc-internal-format, gfc-internal-format
msgid "argument to %%:compare-debug-auxbase-opt does not end in .gk"
-msgstr "đối số tới %%:compare-debug-auxbase-opt không kết thúc bằng « .gk »"
+msgstr "đối số tới %%:compare-debug-auxbase-opt không kết thúc bằng .gk"
#: ggc-common.c:467 ggc-common.c:475 ggc-common.c:549 ggc-common.c:568
#: ggc-page.c:2308 ggc-page.c:2339 ggc-page.c:2346 ggc-zone.c:2431
#: ggc-zone.c:2442 ggc-zone.c:2446
#, gcc-internal-format
msgid "can%'t write PCH file: %m"
-msgstr ""
+msgstr "can%'t ghi tập tin PCH: %m"
#: ggc-common.c:561 config/i386/host-cygwin.c:55
#, gcc-internal-format
msgid "can%'t get position in PCH file: %m"
-msgstr ""
+msgstr "can%'t lấy vị trí trong tập tin PCH: %m"
#: ggc-common.c:571
#, gcc-internal-format
msgid "can%'t write padding to PCH file: %m"
-msgstr ""
+msgstr "can%'t ghi phần đệm vào PCH: %m"
#: ggc-common.c:626 ggc-common.c:634 ggc-common.c:641 ggc-common.c:644
#: ggc-common.c:654 ggc-common.c:657 ggc-page.c:2436 ggc-zone.c:2465
#, gcc-internal-format
msgid "can%'t read PCH file: %m"
-msgstr ""
+msgstr "can%'t Ä‘á»c tập tin PCH: %m"
#: ggc-common.c:649
#, gcc-internal-format
@@ -18018,17 +17668,17 @@ msgstr ""
#: ggc-page.c:1648
#, gcc-internal-format
msgid "open /dev/zero: %m"
-msgstr ""
+msgstr "mở /dev/zero: %m"
#: ggc-page.c:2324 ggc-page.c:2330
#, gcc-internal-format
msgid "can%'t write PCH file"
-msgstr ""
+msgstr "can%'t ghi tập tin PCH"
#: ggc-zone.c:2428 ggc-zone.c:2439
#, gcc-internal-format
msgid "can%'t seek PCH file: %m"
-msgstr ""
+msgstr "can%'t seek tập tin PCH: %m"
#: gimple-streamer-in.c:187
#, gcc-internal-format
@@ -18038,7 +17688,7 @@ msgstr ""
#: gimple-streamer-in.c:193
#, gcc-internal-format
msgid "original type declared here"
-msgstr ""
+msgstr "kiểu nguyên bản được khai báo ở đây"
#: gimple-streamer-in.c:195
#, gcc-internal-format
@@ -18048,7 +17698,7 @@ msgstr ""
#: gimple-streamer-in.c:201
#, gcc-internal-format
msgid "type of field declared here"
-msgstr ""
+msgstr "kiểu của trÆ°á»ng được khai báo ở đây"
#: gimple-streamer-in.c:208
#, gcc-internal-format
@@ -18128,42 +17778,39 @@ msgstr ""
#: gimplify.c:7794
#, gcc-internal-format
msgid "gimplification failed"
-msgstr ""
+msgstr "gimplification gặp lỗi"
#: godump.c:1234
#, fuzzy, gcc-internal-format
-#| msgid "could not close response file %s"
msgid "could not close Go dump file: %m"
msgstr "không thể đóng đáp ứng tập tin %s"
#: godump.c:1246
#, fuzzy, gcc-internal-format
-#| msgid "%s:could not open output file '%s'\n"
msgid "could not open Go dump file %qs: %m"
-msgstr "%s: không thể mở tập tin kết xuất « %s »\n"
+msgstr "%s: không thể mở tập tin kết xuất %s\n"
#: graph.c:411 toplev.c:1531 java/jcf-parse.c:1751 java/jcf-parse.c:1889
#: objc/objc-act.c:449
#, gcc-internal-format
msgid "can%'t open %s: %m"
-msgstr ""
+msgstr "can%'t mở %s: %m"
#: graphite-clast-to-gimple.c:1339 graphite-poly.c:691 toplev.c:930
#: toplev.c:1133
#, gcc-internal-format
msgid "can%'t open %s for writing: %m"
-msgstr ""
+msgstr "can%'t mở %s để ghi: %m"
#: graphite-poly.c:593
#, fuzzy, gcc-internal-format
-#| msgid "field width in printf format"
msgid "the file is not in OpenScop format"
msgstr "chiá»u rá»™ng của trÆ°á»ng theo định dạng printf"
#: graphite-poly.c:604
#, gcc-internal-format
msgid "the language is not recognized"
-msgstr ""
+msgstr "không chấp nhận ngôn ngữ"
#: graphite-poly.c:615
#, gcc-internal-format
@@ -18178,7 +17825,7 @@ msgstr ""
#: graphite-poly.c:719
#, gcc-internal-format
msgid "can%'t open %s for reading: %m"
-msgstr ""
+msgstr "can%'t mở %s để Ä‘á»c: %m"
#: graphite-poly.c:746
#, gcc-internal-format, gfc-internal-format
@@ -18243,19 +17890,16 @@ msgstr ""
#: lto-cgraph.c:1465
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "[cannot find %s]"
msgid "cannot find LTO cgraph in %s"
msgstr "[không tìm thấy %s]"
#: lto-cgraph.c:1475
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "[cannot find %s]"
msgid "cannot find LTO varpool in %s"
msgstr "[không tìm thấy %s]"
#: lto-cgraph.c:1483
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "could not find specs file %s\n"
msgid "cannot find LTO section refs in %s"
msgstr "không tìm thấy tập tin đặc tả %s\n"
@@ -18263,7 +17907,7 @@ msgstr "không tìm thấy tập tin đặc tả %s\n"
#: lto-compress.c:287 lto-compress.c:308
#, gcc-internal-format, gfc-internal-format
msgid "compressed stream: %s"
-msgstr ""
+msgstr "dòng dữ liệu được nén: %s"
#: lto-section-in.c:423
#, gcc-internal-format, gfc-internal-format
@@ -18282,9 +17926,8 @@ msgstr ""
#: lto-streamer-out.c:324
#, fuzzy, gcc-internal-format
-#| msgid "static is not supported on TPF-OS"
msgid "tree code %qs is not supported in LTO streams"
-msgstr "trên TPF-OS thì không hỗ trợ « static »"
+msgstr "trên TPF-OS thì không hỗ trợ static"
#: lto-streamer.c:163
#, gcc-internal-format, gfc-internal-format
@@ -18299,7 +17942,7 @@ msgstr ""
#: lto-symtab.c:474
#, gcc-internal-format
msgid "%qD has already been defined"
-msgstr ""
+msgstr "%qD đã định nghĩa rồi"
#: lto-symtab.c:476
#, gcc-internal-format
@@ -18329,12 +17972,12 @@ msgstr ""
#: lto-symtab.c:661
#, gcc-internal-format
msgid "variable %qD redeclared as function"
-msgstr ""
+msgstr "biến %qD được định nghĩa lại là một hàm"
#: lto-symtab.c:667
#, gcc-internal-format
msgid "function %qD redeclared as variable"
-msgstr ""
+msgstr "hàm %qD được định nghĩa lại thành một biến"
#: omp-low.c:1846
#, gcc-internal-format
@@ -18389,7 +18032,6 @@ msgstr ""
#: opts-common.c:1007
#, fuzzy, gcc-internal-format
-#| msgid "in argument to unary !"
msgid "missing argument to %qs"
msgstr "trong đối số tới bộ nguyên phân !"
@@ -18399,16 +18041,14 @@ msgid "argument to %qs should be a non-negative integer"
msgstr ""
#: opts-common.c:1028
-#, fuzzy, gcc-internal-format
-#| msgid "warning: unrecognized argument to --help= option: %.*s\n"
+#, gcc-internal-format
msgid "unrecognized argument in option %qs"
-msgstr "cảnh báo : không nhận ra đối số tá»›i tuỳ chá»n « --help= »: %.*s\n"
+msgstr "không nhận ra đối số tá»›i tuỳ chá»n %qs"
#: opts-common.c:1044
-#, fuzzy, gcc-internal-format
-#| msgid "in argument to unary !"
+#, gcc-internal-format
msgid "valid arguments to %qs are: %s"
-msgstr "trong đối số tới bộ nguyên phân !"
+msgstr "đối số hợp lệ cho cho %qs là: %s"
#: opts-global.c:102
#, gcc-internal-format
@@ -18437,10 +18077,9 @@ msgid "plugin support is disabled; configure with --enable-plugin"
msgstr ""
#: opts-global.c:403
-#, fuzzy, gcc-internal-format
-#| msgid "unrecognized address"
+#, gcc-internal-format
msgid "unrecognized register name %qs"
-msgstr "không nhận ra địa chỉ"
+msgstr "không nhận ra tên thanh ghi %qs"
#: opts.c:91
#, gcc-internal-format
@@ -18513,16 +18152,14 @@ msgid "unrecognized include_flags 0x%x passed to print_specific_help"
msgstr ""
#: opts.c:1386
-#, fuzzy, gcc-internal-format
-#| msgid "warning: --help argument %.*s is ambiguous, please be more specific\n"
+#, gcc-internal-format
msgid "--help argument %q.*s is ambiguous, please be more specific"
-msgstr "cảnh báo : đối số « --help » %.*s vẫn mơ hồ, hãy chính xác hơn\n"
+msgstr "đối số --help %q.*s chưa rõ ràng, hãy chính xác hơn"
#: opts.c:1395
-#, fuzzy, gcc-internal-format
-#| msgid "warning: unrecognized argument to --help= option: %.*s\n"
+#, gcc-internal-format
msgid "unrecognized argument to --help= option: %q.*s"
-msgstr "cảnh báo : không nhận ra đối số tá»›i tuỳ chá»n « --help= »: %.*s\n"
+msgstr "không nhận ra đối số cho tuỳ chá»n --help=: %q.*s"
#: opts.c:1547
#, gcc-internal-format, gfc-internal-format
@@ -18547,7 +18184,7 @@ msgstr ""
#: opts.c:1774
#, gcc-internal-format
msgid "invalid --param value %qs"
-msgstr ""
+msgstr "sai giá trị cho tùy chá»n --param %qs"
#: opts.c:1892
#, gcc-internal-format
@@ -18587,7 +18224,7 @@ msgstr ""
#: opts.c:2016
#, gcc-internal-format, gfc-internal-format
msgid "-Werror=%s: no option -%s"
-msgstr ""
+msgstr "-Werror=%s: không có tùy chá»n -%s"
#: params.c:121
#, gcc-internal-format
@@ -18603,19 +18240,17 @@ msgstr ""
#: params.c:136
#, gcc-internal-format
msgid "invalid parameter %qs"
-msgstr ""
+msgstr "tham số sai %qs"
#: passes.c:700
-#, fuzzy, gcc-internal-format
-#| msgid "unrecognized address"
+#, gcc-internal-format
msgid "unrecognized option -fenable"
-msgstr "không nhận ra địa chỉ"
+msgstr "không thừa nhận tùy chá»n -fenable"
#: passes.c:702
-#, fuzzy, gcc-internal-format
-#| msgid "unrecognized address"
+#, gcc-internal-format
msgid "unrecognized option -fdisable"
-msgstr "không nhận ra địa chỉ"
+msgstr "không thừa nhận tùy chá»n -fdisable"
#: passes.c:710
#, gcc-internal-format, gfc-internal-format
@@ -18639,25 +18274,21 @@ msgstr ""
#: passes.c:778 passes.c:806
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Inline all known string operations"
msgid "Invalid range %s in option %s"
msgstr "Chèn vào trực tiếp tất cả các thao tác chuỗi được biết"
#: passes.c:825
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Enable clip instructions"
msgid "enable pass %s for function %s"
msgstr "Hiệu lực các câu lệnh trích đoạn"
#: passes.c:836
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Use stubs for function prologues"
msgid "disable pass %s for function %s"
msgstr "Sử dụng mẩu cho đoạn mở đầu hàm"
#: passes.c:1049
#, fuzzy, gcc-internal-format
-#| msgid "invalid expression as operand"
msgid "invalid pass positioning operation"
msgstr "sai lập biểu tượng dưới dạng toán hạng"
@@ -18720,12 +18351,13 @@ msgid "plugin %s registered a null callback function for event %s"
msgstr ""
#: plugin.c:567
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "[cannot find %s]"
+#, gcc-internal-format, gfc-internal-format
msgid ""
"cannot load plugin %s\n"
"%s"
-msgstr "[không tìm thấy %s]"
+msgstr ""
+"không thể tải phần bổ xung %s\n"
+"%s"
#: plugin.c:576
#, gcc-internal-format, gfc-internal-format
@@ -18736,17 +18368,15 @@ msgstr ""
#: plugin.c:585
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "could not find specs file %s\n"
msgid ""
"cannot find %s in plugin %s\n"
"%s"
msgstr "không tìm thấy tập tin đặc tả %s\n"
#: plugin.c:593
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "(static initializers for %s)"
+#, gcc-internal-format, gfc-internal-format
msgid "fail to initialize plugin %s"
-msgstr "(bộ sơ khởi tĩnh cho %s)"
+msgstr "gặp lỗi khi khởi tạo phần bổ xung %s"
#: plugin.c:874
#, gcc-internal-format
@@ -18878,7 +18508,7 @@ msgstr ""
#: reginfo.c:891
#, gcc-internal-format
msgid "conflicts with %qD"
-msgstr ""
+msgstr "xung Ä‘á»™t vá»›i %qD"
#: reginfo.c:896
#, gcc-internal-format
@@ -18953,22 +18583,22 @@ msgstr ""
#: rtl.c:752
#, gcc-internal-format, gfc-internal-format
msgid "RTL check: expected elt %d type '%c', have '%c' (rtx %s) in %s, at %s:%d"
-msgstr ""
+msgstr "kiểm tra RTL: cần elt %d kiểu '%c', nhận '%c' (rtx %s) trong %s, tại %s:%d"
#: rtl.c:762
#, gcc-internal-format, gfc-internal-format
msgid "RTL check: expected elt %d type '%c' or '%c', have '%c' (rtx %s) in %s, at %s:%d"
-msgstr ""
+msgstr "kiểm tra RTL: cần elt %d kiểu '%c' hoặc '%c', nhận '%c' (rtx %s) trong %s, tại %s:%d"
#: rtl.c:771
#, gcc-internal-format, gfc-internal-format
msgid "RTL check: expected code '%s', have '%s' in %s, at %s:%d"
-msgstr ""
+msgstr "kiểm tra RTL: cần mã '%s', nhận '%s' trong %s, tại %s:%d"
#: rtl.c:781
#, gcc-internal-format, gfc-internal-format
msgid "RTL check: expected code '%s' or '%s', have '%s' in %s, at %s:%d"
-msgstr ""
+msgstr "kiểm tra RTL: cần mã '%s' hoặc '%s', nhận '%s' trong %s, tại %s:%d"
#: rtl.c:808
#, gcc-internal-format, gfc-internal-format
@@ -19108,12 +18738,12 @@ msgstr ""
#: stor-layout.c:711
#, gcc-internal-format
msgid "size of %q+D is %d bytes"
-msgstr ""
+msgstr "kích thước của %q+D là %d byte"
#: stor-layout.c:713
#, gcc-internal-format
msgid "size of %q+D is larger than %wd bytes"
-msgstr ""
+msgstr "kích thước của %q+D lớn hơn %wd byte"
#: stor-layout.c:1131
#, gcc-internal-format
@@ -19128,11 +18758,10 @@ msgstr ""
#: stor-layout.c:1152
#, gcc-internal-format
msgid "padding struct to align %q+D"
-msgstr ""
+msgstr "chèn thêm cấu trúc cho vừa %q+D"
#: stor-layout.c:1214
#, fuzzy, gcc-internal-format
-#| msgid "Warn about packed bit-fields whose offset changed in GCC 4.4"
msgid "offset of packed bit-field %qD has changed in GCC 4.4"
msgstr "Cảnh báo vá» trÆ°á»ng bit đóng gói có hiệu số bị thay đổi trong GCC 4.4"
@@ -19192,16 +18821,14 @@ msgid "#pragma GCC target is not supported for this machine"
msgstr ""
#: tlink.c:492
-#, fuzzy, gcc-internal-format
-#| msgid "removing .rpo file"
+#, gcc-internal-format
msgid "removing .rpo file: %m"
-msgstr "đang gỡ bỠtập tin .rpo"
+msgstr "đang gỡ bỠtập tin .rpo: %m"
#: tlink.c:494
-#, fuzzy, gcc-internal-format
-#| msgid "renaming .rpo file"
+#, gcc-internal-format
msgid "renaming .rpo file: %m"
-msgstr "đang thay tên tập tin .rpo"
+msgstr "đang đổi tên tập tin .rpo: %m"
#: tlink.c:498
#, gcc-internal-format, gfc-internal-format
@@ -19290,7 +18917,6 @@ msgstr ""
#: toplev.c:1427
#, fuzzy, gcc-internal-format
-#| msgid "could not close response file %s"
msgid "could not close zeroed insn dump file %qs: %m"
msgstr "không thể đóng đáp ứng tập tin %s"
@@ -19362,7 +18988,7 @@ msgstr ""
#: toplev.c:1873
#, gcc-internal-format
msgid "error writing to %s: %m"
-msgstr ""
+msgstr "lỗi ghi vào %s: %m"
#: toplev.c:1875 java/jcf-parse.c:1770
#, gcc-internal-format
@@ -19371,7 +18997,6 @@ msgstr ""
#: trans-mem.c:570
#, fuzzy, gcc-internal-format
-#| msgid "Allow the use of MDMX instructions"
msgid "invalid volatile use of %qD inside transaction"
msgstr "Cho phép sử dụng câu lệnh MDMX"
@@ -19392,7 +19017,6 @@ msgstr ""
#: trans-mem.c:674
#, fuzzy, gcc-internal-format
-#| msgid "originally indirect function call not considered for inlining"
msgid "unsafe indirect function call within atomic transaction"
msgstr "cuá»™c gá»i hàm gián tiếp lần đầu tiên không phải được tính để chèn vào trá»±c tiếp"
@@ -19433,7 +19057,6 @@ msgstr ""
#: trans-mem.c:731
#, fuzzy, gcc-internal-format
-#| msgid "Enable saturation instructions"
msgid "outer transaction in transaction"
msgstr "Hiệu lực câu lệnh lập trạng thái bão hoà"
@@ -19478,14 +19101,12 @@ msgid "INDIRECT_REF in gimple IL"
msgstr ""
#: tree-cfg.c:2695
-#, fuzzy, gcc-internal-format
-#| msgid "invalid operand to %%R"
+#, gcc-internal-format
msgid "invalid first operand of MEM_REF"
-msgstr "sai lập toán hạng tới %%R"
+msgstr "sai toán hạng thứ nhất của MEM_REF"
#: tree-cfg.c:2701
#, fuzzy, gcc-internal-format
-#| msgid "invalid operand to %%R"
msgid "invalid offset operand of MEM_REF"
msgstr "sai lập toán hạng tới %%R"
@@ -19552,7 +19173,7 @@ msgstr ""
#: tree-cfg.c:2915
#, gcc-internal-format
msgid "invalid CASE_CHAIN"
-msgstr ""
+msgstr "sai CASE_CHAIN"
#: tree-cfg.c:2943
#, gcc-internal-format
@@ -19601,13 +19222,11 @@ msgstr ""
#: tree-cfg.c:3063
#, fuzzy, gcc-internal-format
-#| msgid "invalid operand to %%R"
msgid "invalid address operand in MEM_REF"
msgstr "sai lập toán hạng tới %%R"
#: tree-cfg.c:3070
#, fuzzy, gcc-internal-format
-#| msgid "invalid shift operand"
msgid "invalid offset operand in MEM_REF"
msgstr "sai lập toán hạng dá»i"
@@ -19703,7 +19322,6 @@ msgstr ""
#: tree-cfg.c:3326
#, fuzzy, gcc-internal-format
-#| msgid "Warn about comparison of different enum types"
msgid "bogus comparison result type"
msgstr "Cảnh báo vỠsự so sánh các loại đếm (enum) khác nhau"
@@ -19809,7 +19427,6 @@ msgstr ""
#: tree-cfg.c:3797
#, fuzzy, gcc-internal-format
-#| msgid "invalid operand in the instruction"
msgid "invalid operands in ternary operation"
msgstr "lệnh chứa một toán hạng sai"
@@ -19820,13 +19437,11 @@ msgstr ""
#: tree-cfg.c:3827
#, fuzzy, gcc-internal-format
-#| msgid "Generate fused multiply/add instructions"
msgid "type mismatch in fused multiply-add expression"
msgstr "Tạo ra câu lệnh nhân/cộng hợp nhau"
#: tree-cfg.c:3853
#, fuzzy, gcc-internal-format
-#| msgid "Bad type in constant expression"
msgid "type mismatch in vector permute expression"
msgstr "Gặp loại saio trong biểu thức bất biến"
@@ -19842,7 +19457,6 @@ msgstr ""
#: tree-cfg.c:3892
#, fuzzy, gcc-internal-format
-#| msgid "Bad type in constant expression"
msgid "invalid mask type in vector permute expression"
msgstr "Gặp loại saio trong biểu thức bất biến"
@@ -19907,21 +19521,19 @@ msgid "invalid labels in gimple cond"
msgstr ""
#: tree-cfg.c:4275 tree-cfg.c:4284
-#, fuzzy, gcc-internal-format
-#| msgid "invalid address"
+#, gcc-internal-format
msgid "invalid PHI result"
-msgstr "địa chỉ sai"
+msgstr "kết quả PHI không hợp lệ"
#: tree-cfg.c:4294
#, gcc-internal-format
msgid "missing PHI def"
-msgstr ""
+msgstr "thiếu PHI def"
#: tree-cfg.c:4308
-#, fuzzy, gcc-internal-format
-#| msgid "invalid %%H value"
+#, gcc-internal-format
msgid "invalid PHI argument"
-msgstr "giá trị %%H sai"
+msgstr "sai tham số PHI"
#: tree-cfg.c:4315
#, gcc-internal-format, gfc-internal-format
@@ -19931,7 +19543,7 @@ msgstr ""
#: tree-cfg.c:4399 tree-cfg.c:4595
#, gcc-internal-format
msgid "verify_gimple failed"
-msgstr ""
+msgstr "verify_gimple gặp lỗi"
#: tree-cfg.c:4460
#, gcc-internal-format
@@ -19956,7 +19568,7 @@ msgstr ""
#: tree-cfg.c:4555
#, gcc-internal-format
msgid "in statement"
-msgstr ""
+msgstr "tại câu lệnh"
#: tree-cfg.c:4570
#, gcc-internal-format
@@ -19996,7 +19608,7 @@ msgstr ""
#: tree-cfg.c:4673 tree-cfg.c:4682 tree-cfg.c:4707
#, gcc-internal-format
msgid "label "
-msgstr ""
+msgstr "nhãn"
#: tree-cfg.c:4697
#, gcc-internal-format, gfc-internal-format
@@ -20046,7 +19658,7 @@ msgstr ""
#: tree-cfg.c:4888
#, gcc-internal-format, gfc-internal-format
msgid "missing edge %i->%i"
-msgstr ""
+msgstr "thiếu edge %i->%i"
#: tree-cfg.c:7544
#, gcc-internal-format
@@ -20070,7 +19682,6 @@ msgstr ""
#: tree-dump.c:932
#, fuzzy, gcc-internal-format
-#| msgid "could not open response file %s"
msgid "could not open dump file %qs: %m"
msgstr "không thể mở tập tin đáp ứng %s"
@@ -20187,7 +19798,7 @@ msgstr ""
#: tree-inline.c:3845 tree-inline.c:3860
#, gcc-internal-format
msgid "called from here"
-msgstr ""
+msgstr "được gá»i từ đây"
#: tree-inline.c:3858
#, gcc-internal-format
@@ -20228,7 +19839,7 @@ msgstr ""
#: tree-ssa-coalesce.c:966 tree-ssa-coalesce.c:1188 tree-ssa-live.c:1340
#, gcc-internal-format
msgid "SSA corruption"
-msgstr ""
+msgstr "ngắt SSA"
#: tree-profile.c:418
#, gcc-internal-format
@@ -20262,7 +19873,6 @@ msgstr ""
#: tree-ssa-operands.c:1175
#, fuzzy, gcc-internal-format
-#| msgid "operand number missing after %%-letter"
msgid "use operand missing for stmt"
msgstr "số thứ tự toán hạng còn thiếu đằng sau %%-letter"
@@ -20272,10 +19882,9 @@ msgid "excess def operand for stmt"
msgstr ""
#: tree-ssa-operands.c:1200
-#, fuzzy, gcc-internal-format
-#| msgid "operand number missing after %%-letter"
+#, gcc-internal-format
msgid "def operand missing for stmt"
-msgstr "số thứ tự toán hạng còn thiếu đằng sau %%-letter"
+msgstr "thiếu toán hạng def cho stmt"
#: tree-ssa-operands.c:1207
#, gcc-internal-format
@@ -20355,7 +19964,7 @@ msgstr ""
#: tree-ssa.c:782
#, gcc-internal-format
msgid "SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set"
-msgstr ""
+msgstr "SSA_NAME_OCCURS_IN_ABNORMAL_PHI cần được đặt"
#: tree-ssa.c:790
#, gcc-internal-format
@@ -20400,17 +20009,17 @@ msgstr ""
#: tree-ssa.c:1050
#, gcc-internal-format
msgid "verify_ssa failed"
-msgstr ""
+msgstr "verify_ssa gặp lỗi"
#: tree-ssa.c:1616 varasm.c:326
#, gcc-internal-format
msgid "%qD was declared here"
-msgstr ""
+msgstr "%qD đã được khai báo ở đây"
#: tree-ssa.c:1648
#, gcc-internal-format
msgid "%qD is used uninitialized in this function"
-msgstr ""
+msgstr "%qD được dùng để bỠkhởi tạo trong hàm này"
#: tree-ssa.c:1685
#, gcc-internal-format
@@ -21205,12 +20814,12 @@ msgstr ""
#: c-family/c-common.c:5441
#, gcc-internal-format
msgid "duplicate case value"
-msgstr ""
+msgstr "trùng giá trị cho case"
#: c-family/c-common.c:5442
#, gcc-internal-format
msgid "previously used here"
-msgstr ""
+msgstr "cái trước được dùng là ở đây"
#: c-family/c-common.c:5446
#, gcc-internal-format
@@ -21259,7 +20868,6 @@ msgstr ""
#: c-family/c-common.c:6088 lto/lto-lang.c:220
#, fuzzy, gcc-internal-format
-#| msgid "Emit indirect branches to local functions"
msgid "%qE attribute has no effect on unit local functions"
msgstr "Xuất nhánh gián tiếp tới hàm cục bộ"
@@ -21311,12 +20919,12 @@ msgstr ""
#: c-family/c-common.c:6577
#, gcc-internal-format
msgid "use __attribute__ ((vector_size)) instead"
-msgstr ""
+msgstr "sử dụng __attribute__ ((vector_size)) để thay thế"
#: c-family/c-common.c:6586
#, gcc-internal-format
msgid "unable to emulate %qs"
-msgstr ""
+msgstr "không thể mô phá»ng %qs"
#: c-family/c-common.c:6597
#, gcc-internal-format
@@ -21371,7 +20979,6 @@ msgstr ""
#: c-family/c-common.c:6747
#, fuzzy, gcc-internal-format
-#| msgid "array index in initializer is not an integer constant expression"
msgid "requested alignment is not an integer constant"
msgstr "bộ sơ khởi chứa một chỉ mục mảng không phải là một biểu tượng hằng số nguyên"
@@ -21498,7 +21105,6 @@ msgstr ""
#: c-family/c-common.c:7397
#, fuzzy, gcc-internal-format
-#| msgid "attribute declaration"
msgid "%qE attribute duplicated"
msgstr "lá»i tuyên bố thuá»™c tính"
@@ -21524,7 +21130,6 @@ msgstr ""
#: c-family/c-common.c:7565
#, fuzzy, gcc-internal-format
-#| msgid "no arguments for spec function"
msgid "transaction_wrap argument is not a function"
msgstr "không có đối số tới hàm đặc tả"
@@ -21658,7 +21263,6 @@ msgstr ""
#: c-family/c-common.c:8522
#, fuzzy, gcc-internal-format
-#| msgid "no arguments for spec function"
msgid "non-integer argument 3 in call to function %qE"
msgstr "không có đối số tới hàm đặc tả"
@@ -21874,7 +21478,6 @@ msgstr ""
#: c-family/c-common.c:9427
#, fuzzy, gcc-internal-format
-#| msgid "no arguments for spec function"
msgid "incorrect number of arguments to function %qE"
msgstr "không có đối số tới hàm đặc tả"
@@ -21900,7 +21503,6 @@ msgstr ""
#: c-family/c-common.c:9477
#, fuzzy, gcc-internal-format
-#| msgid "mismatched arguments"
msgid "size mismatch in argument %d of %qE"
msgstr "các đối số không tương ứng với nhau"
@@ -22017,7 +21619,7 @@ msgstr ""
#: c-family/c-common.c:10188
#, gcc-internal-format
msgid "division by zero"
-msgstr ""
+msgstr "chía cho 0"
#: c-family/c-common.c:10220
#, gcc-internal-format
@@ -22534,7 +22136,7 @@ msgstr ""
#: c-family/c-opts.c:308
#, gcc-internal-format
msgid "-I- specified twice"
-msgstr ""
+msgstr "-I- được chỉ định hai lần"
#: c-family/c-opts.c:311
#, gcc-internal-format
@@ -22569,57 +22171,57 @@ msgstr ""
#: c-family/c-opts.c:970
#, gcc-internal-format
msgid "-Wformat-y2k ignored without -Wformat"
-msgstr ""
+msgstr "-Wformat-y2k bị lỠđi nếu không có -Wformat"
#: c-family/c-opts.c:972
#, gcc-internal-format
msgid "-Wformat-extra-args ignored without -Wformat"
-msgstr ""
+msgstr "-Wformat-extra-args bị lỠđi nếu không có -Wformat"
#: c-family/c-opts.c:974
#, gcc-internal-format
msgid "-Wformat-zero-length ignored without -Wformat"
-msgstr ""
+msgstr "-Wformat-zero-length bị lỠđi nếu không có -Wformat"
#: c-family/c-opts.c:976
#, gcc-internal-format
msgid "-Wformat-nonliteral ignored without -Wformat"
-msgstr ""
+msgstr "-Wformat-nonliteral bị lỠđi nếu không có -Wformat"
#: c-family/c-opts.c:978
#, gcc-internal-format
msgid "-Wformat-contains-nul ignored without -Wformat"
-msgstr ""
+msgstr "-Wformat-contains-nul bị lỠđi nếu không có -Wformat"
#: c-family/c-opts.c:980
#, gcc-internal-format
msgid "-Wformat-security ignored without -Wformat"
-msgstr ""
+msgstr "-Wformat-security bị lỠđi nếu không có -Wformat"
#: c-family/c-opts.c:1017
#, gcc-internal-format
msgid "opening output file %s: %m"
-msgstr ""
+msgstr "mở tập tin kết xuất %s: %m"
#: c-family/c-opts.c:1022
#, gcc-internal-format, gfc-internal-format
msgid "too many filenames given. Type %s --help for usage"
-msgstr ""
+msgstr "chỉ ra quá nhiá»u tên tập tin. Gõ lệnh %s --help để biết cách dùng"
#: c-family/c-opts.c:1152
#, gcc-internal-format
msgid "opening dependency file %s: %m"
-msgstr ""
+msgstr "mở tập tin phụ thuộc %s: %m"
#: c-family/c-opts.c:1162
#, gcc-internal-format
msgid "closing dependency file %s: %m"
-msgstr ""
+msgstr "đóng tập tin phụ thuộc %s: %m"
#: c-family/c-opts.c:1165
#, gcc-internal-format
msgid "when writing output to %s: %m"
-msgstr ""
+msgstr "khi ghi kết xuất ra %s: %m"
#: c-family/c-opts.c:1245
#, gcc-internal-format
@@ -22629,7 +22231,7 @@ msgstr ""
#: c-family/c-opts.c:1268
#, gcc-internal-format
msgid "-MG may only be used with -M or -MM"
-msgstr ""
+msgstr "-MG chỉ nên dùng với -M hoặc -MM"
#: c-family/c-opts.c:1298
#, gcc-internal-format
@@ -22654,28 +22256,28 @@ msgstr ""
#: c-family/c-pch.c:154
#, gcc-internal-format
msgid "can%'t write to %s: %m"
-msgstr ""
+msgstr "can%'t ghi vào %s: %m"
#: c-family/c-pch.c:160
#, gcc-internal-format
msgid "%qs is not a valid output file"
-msgstr ""
+msgstr "%qs không phải là tập tin đầu ra hợp lệ"
#: c-family/c-pch.c:193 c-family/c-pch.c:208 c-family/c-pch.c:225
#, gcc-internal-format
msgid "can%'t write %s: %m"
-msgstr ""
+msgstr "can%'t ghi %s: %m"
#: c-family/c-pch.c:198 c-family/c-pch.c:215
#, gcc-internal-format
msgid "can%'t seek in %s: %m"
-msgstr ""
+msgstr "can%'t seek trong %s: %m"
#: c-family/c-pch.c:206 c-family/c-pch.c:253 c-family/c-pch.c:294
#: c-family/c-pch.c:345
#, gcc-internal-format
msgid "can%'t read %s: %m"
-msgstr ""
+msgstr "can%'t Ä‘á»c %s: %m"
#: c-family/c-pch.c:483
#, gcc-internal-format
@@ -22685,22 +22287,22 @@ msgstr ""
#: c-family/c-pch.c:484
#, gcc-internal-format
msgid "use #include instead"
-msgstr ""
+msgstr "sử dụng #include để thay thế"
#: c-family/c-pch.c:490
#, gcc-internal-format
msgid "%s: couldn%'t open PCH file: %m"
-msgstr ""
+msgstr "%s: couldn%'t mở tập tin PCH: %m"
#: c-family/c-pch.c:495
#, gcc-internal-format
msgid "use -Winvalid-pch for more information"
-msgstr ""
+msgstr "sử dụng -Winvalid-pch để có thêm thông tin"
#: c-family/c-pch.c:496
#, gcc-internal-format, gfc-internal-format
msgid "%s: PCH file was invalid"
-msgstr ""
+msgstr "%s: tập tin PCH không hợp lệ"
#: c-family/c-pragma.c:101
#, gcc-internal-format
@@ -22978,10 +22580,9 @@ msgid "ISO C does not support %<#pragma STDC FLOAT_CONST_DECIMAL64%>"
msgstr ""
#: c-family/c-semantics.c:159
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "wrong type argument to abs"
+#, gcc-internal-format, gfc-internal-format
msgid "wrong type argument to %s"
-msgstr "đối số có loại sai đối với bộ tuyệt đối"
+msgstr "sai kiểu đối số cho %s"
#: common/config/alpha/alpha-common.c:78
#, gcc-internal-format
@@ -22996,7 +22597,7 @@ msgstr ""
#: common/config/bfin/bfin-common.c:324
#, gcc-internal-format, gfc-internal-format
msgid "-mcpu=%s is not valid"
-msgstr ""
+msgstr "-mcpu=%s không hợp lệ"
#: common/config/bfin/bfin-common.c:360
#, gcc-internal-format, gfc-internal-format
@@ -23075,7 +22676,6 @@ msgstr ""
#: common/config/rx/rx-common.c:60
#, fuzzy, gcc-internal-format
-#| msgid "rx200 cpu does not have FPU hardware"
msgid "the RX200 cpu does not have FPU hardware"
msgstr "CPU rx200 không có phần cứng đơn vị điểm phù động (FPU)"
@@ -23172,7 +22772,6 @@ msgstr ""
#: config/darwin.c:1826
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "could not open temporary response file %s"
msgid "failed to open temporary file %s for LTO output"
msgstr "không thể mở tập tin đáp ứng tạm thá»i %s"
@@ -23193,7 +22792,6 @@ msgstr ""
#: config/darwin.c:2790
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "could not open temporary response file %s"
msgid "failed to open temporary file %s with LTO output"
msgstr "không thể mở tập tin đáp ứng tạm thá»i %s"
@@ -23219,15 +22817,13 @@ msgstr ""
#: config/darwin.c:3230
#, fuzzy, gcc-internal-format
-#| msgid "Support AES built-in functions and code generation"
msgid "built-in function %qD takes one argument only"
msgstr "Hỗ trợ các hàm dựng sẵn và chức năng tạo ra mã loại AES"
#: config/darwin.c:3304
#, fuzzy, gcc-internal-format
-#| msgid "argument to '-Xlinker' is missing"
msgid "CFString literal is missing"
-msgstr "đối số tới « -Xlinker » còn thiếu"
+msgstr "đối số tới -Xlinker còn thiếu"
#: config/darwin.c:3315
#, gcc-internal-format
@@ -23480,22 +23076,22 @@ msgstr ""
#: config/arm/arm.c:1823
#, gcc-internal-format
msgid "Thumb-2 iWMMXt"
-msgstr ""
+msgstr "Thumb-2 iWMMXt"
#: config/arm/arm.c:1827
#, gcc-internal-format
msgid "__fp16 and no ldrh"
-msgstr ""
+msgstr "__fp16 và không ldrh"
#: config/arm/arm.c:1847
#, gcc-internal-format
msgid "-mfloat-abi=hard and VFP"
-msgstr ""
+msgstr "-mfloat-abi=hard và VFP"
#: config/arm/arm.c:1872
#, gcc-internal-format
msgid "can not use -mtp=cp15 with 16-bit Thumb"
-msgstr ""
+msgstr "không thể sử dụng -mtp=cp15 với 16-bit Thumb"
#: config/arm/arm.c:1888
#, gcc-internal-format
@@ -23550,7 +23146,7 @@ msgstr ""
#: config/arm/arm.c:4057
#, gcc-internal-format
msgid "PCS variant"
-msgstr ""
+msgstr "biến thể PCS"
#: config/arm/arm.c:4252
#, gcc-internal-format
@@ -23579,19 +23175,19 @@ msgstr ""
#: config/arm/arm.c:20667
#, gcc-internal-format
msgid "argument must be a constant"
-msgstr ""
+msgstr "tham số phải là một hằng"
#. @@@ better error message
#: config/arm/arm.c:21036 config/arm/arm.c:21073
#, gcc-internal-format
msgid "selector must be an immediate"
-msgstr ""
+msgstr "bá»™ chá»n phải là má»™t giá trị trá»±c tiếp"
#. @@@ better error message
#: config/arm/arm.c:21116
#, gcc-internal-format
msgid "mask must be an immediate"
-msgstr ""
+msgstr "mặt nạ phải là một giá trị trực tiếp"
#: config/arm/arm.c:21900
#, gcc-internal-format
@@ -23629,16 +23225,14 @@ msgid "function attributes %qs and %qs have no effect on %qs function"
msgstr ""
#: config/avr/avr.c:573
-#, fuzzy, gcc-internal-format
-#| msgid "'-%c' option must have argument"
+#, gcc-internal-format
msgid "%qs function cannot have arguments"
-msgstr "Tuỳ chá»n « -%c » phải có đối số"
+msgstr "%qs hàm không có đối số"
#: config/avr/avr.c:576
-#, fuzzy, gcc-internal-format
-#| msgid "functions cannot return __fp16 type"
+#, gcc-internal-format
msgid "%qs function cannot return a value"
-msgstr "hàm không thể trả lại loại « __fp16 »"
+msgstr "%qs hàm không trả vỠgiá trị nào"
#: config/avr/avr.c:583
#, gcc-internal-format
@@ -23667,7 +23261,6 @@ msgstr ""
#: config/avr/avr.c:2464
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Number of registers used to pass integer arguments"
msgid "fixed register %s used to pass parameter to function"
msgstr "Số các thanh ghi được sử dụng để gửi đối số nguyên cho đích"
@@ -23723,7 +23316,6 @@ msgstr ""
#: config/avr/avr.c:10628
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Unexpected end of module in string constant"
msgid "%s expects a compile time integer constant"
msgstr "Gặp kết thúc mô-Ä‘un bất thÆ°á»ng trong hằng số chuá»—i"
@@ -23749,9 +23341,8 @@ msgstr ""
#: config/bfin/bfin.c:2362
#, fuzzy, gcc-internal-format
-#| msgid "cannot use mthreads and mlegacy-threads together"
msgid "can%'t use multiple stack checking methods together"
-msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n « mthreads » và « mlegacy-threads »"
+msgstr "không cho phép sá»­ dụng đồng thá»i hai tuỳ chá»n mthreads và mlegacy-threads"
#: config/bfin/bfin.c:2365
#, gcc-internal-format
@@ -23780,9 +23371,8 @@ msgstr ""
#: config/bfin/bfin.c:2399
#, fuzzy, gcc-internal-format
-#| msgid "-mglibc and -muclibc used together"
msgid "-mcorea and -mcoreb can%'t be used together"
-msgstr "« -mglibc » và « -muclibc » bị dùng với nhau"
+msgstr "-mglibc và -muclibc bị dùng với nhau"
#: config/bfin/bfin.c:4641
#, gcc-internal-format
@@ -23857,7 +23447,7 @@ msgstr ""
#: config/cris/cris.c:1875
#, gcc-internal-format
msgid "unknown cc_attr value"
-msgstr ""
+msgstr "không hiểu giá trị cc_attr"
#. If we get here, the caller got its initial tests wrong.
#: config/cris/cris.c:2266
@@ -23891,16 +23481,14 @@ msgid "that particular -g option is invalid with -maout and -melinux"
msgstr ""
#: config/cris/cris.c:2832
-#, fuzzy, gcc-internal-format
-#| msgid "<unknown>"
+#, gcc-internal-format
msgid "unknown src"
-msgstr "<không rõ>"
+msgstr "không rõ nguồn"
#: config/cris/cris.c:2893
-#, fuzzy, gcc-internal-format
-#| msgid "unknown insn mode"
+#, gcc-internal-format
msgid "unknown dest"
-msgstr "không rõ chế độ lệnh"
+msgstr "không rõ đích"
#: config/cris/cris.c:3178
#, gcc-internal-format, gfc-internal-format
@@ -23914,7 +23502,6 @@ msgstr ""
#: config/cris/cris.c:3780
#, fuzzy, gcc-internal-format
-#| msgid "PIC register isn't set up"
msgid "emitting PIC operand, but PIC register isn%'t set up"
msgstr "Chưa thiết lập thanh ghi PIC"
@@ -23970,7 +23557,7 @@ msgstr ""
#: config/cris/cris.h:731
#, gcc-internal-format
msgid "no FUNCTION_PROFILER for CRIS"
-msgstr ""
+msgstr "không có FUNCTION_PROFILER cho CRIS"
#: config/epiphany/epiphany.c:441 config/epiphany/epiphany.c:481
#, gcc-internal-format
@@ -24191,9 +23778,8 @@ msgstr ""
#: config/i386/i386.c:3786
#, fuzzy, gcc-internal-format
-#| msgid "-mas100-syntax is incompatible with -gdwarf"
msgid "-mno-fentry isn%'t compatible with SEH"
-msgstr "« -mas100-syntax » không tương thích với « -gdwarf »"
+msgstr "-mas100-syntax không tương thích với -gdwarf"
#: config/i386/i386.c:3856 config/rs6000/rs6000.c:3331
#, gcc-internal-format, gfc-internal-format
@@ -24216,10 +23802,9 @@ msgid "fastcall and regparm attributes are not compatible"
msgstr ""
#: config/i386/i386.c:4912
-#, fuzzy, gcc-internal-format
-#| msgid "shared and mdll are not compatible"
+#, gcc-internal-format
msgid "regparam and thiscall attributes are not compatible"
-msgstr "« shared » và « mdll » không tương thích với nhau"
+msgstr "không tương thích với nhau"
#: config/i386/i386.c:4919 config/i386/i386.c:31819
#, gcc-internal-format
@@ -24242,10 +23827,9 @@ msgid "fastcall and stdcall attributes are not compatible"
msgstr ""
#: config/i386/i386.c:4962 config/i386/i386.c:5011
-#, fuzzy, gcc-internal-format
-#| msgid "shared and mdll are not compatible"
+#, gcc-internal-format
msgid "fastcall and thiscall attributes are not compatible"
-msgstr "« shared » và « mdll » không tương thích với nhau"
+msgstr "các thuộc tính fastcall và thiscall không tương thích với nhau"
#: config/i386/i386.c:4972 config/i386/i386.c:4989
#, gcc-internal-format
@@ -24258,16 +23842,14 @@ msgid "stdcall and fastcall attributes are not compatible"
msgstr ""
#: config/i386/i386.c:4980 config/i386/i386.c:5007
-#, fuzzy, gcc-internal-format
-#| msgid "shared and mdll are not compatible"
+#, gcc-internal-format
msgid "stdcall and thiscall attributes are not compatible"
-msgstr "« shared » và « mdll » không tương thích với nhau"
+msgstr "các thuộc tính stdcall và thiscal không tương thích với nhau"
#: config/i386/i386.c:4997 config/i386/i386.c:5015
-#, fuzzy, gcc-internal-format
-#| msgid "shared and mdll are not compatible"
+#, gcc-internal-format
msgid "cdecl and thiscall attributes are not compatible"
-msgstr "« shared » và « mdll » không tương thích với nhau"
+msgstr "các thuộc tính cdecl và thiscall không tương thích với nhau"
#: config/i386/i386.c:5003
#, gcc-internal-format
@@ -24561,7 +24143,7 @@ msgstr ""
#: config/spu/spu.c:5213
#, gcc-internal-format, gfc-internal-format
msgid "%s-%s is an empty range"
-msgstr ""
+msgstr "%s-%s là một vùng trống rỗng"
#: config/ia64/ia64.c:10963
#, gcc-internal-format
@@ -24657,7 +24239,7 @@ msgstr ""
#: config/m68k/m68k.c:478
#, gcc-internal-format, gfc-internal-format
msgid "-mcpu=%s conflicts with -march=%s"
-msgstr ""
+msgstr "-mcpu=%s xung Ä‘á»™t vá»›i -march=%s"
#: config/m68k/m68k.c:549
#, gcc-internal-format
@@ -24667,7 +24249,7 @@ msgstr ""
#: config/m68k/m68k.c:611
#, gcc-internal-format, gfc-internal-format
msgid "-falign-labels=%d is not supported"
-msgstr ""
+msgstr "-falign-labels=%d không được hỗ trợ"
#: config/m68k/m68k.c:616
#, gcc-internal-format, gfc-internal-format
@@ -24767,37 +24349,37 @@ msgstr ""
#: config/mep/mep.c:353
#, gcc-internal-format
msgid "-fpic is not supported"
-msgstr ""
+msgstr "-fpic không được hỗ trợ"
#: config/mep/mep.c:355
#, gcc-internal-format
msgid "-fPIC is not supported"
-msgstr ""
+msgstr "-fPIC không được hỗ trợ"
#: config/mep/mep.c:357
#, gcc-internal-format
msgid "only one of -ms and -mm may be given"
-msgstr ""
+msgstr "chỉ má»™t trong số các tùy chá»n sau được chỉ ra: -ms và -mm"
#: config/mep/mep.c:359
#, gcc-internal-format
msgid "only one of -ms and -ml may be given"
-msgstr ""
+msgstr "chỉ má»™t trong số các tùy chá»n sau được chỉ ra: -ms và -ml"
#: config/mep/mep.c:361
#, gcc-internal-format
msgid "only one of -mm and -ml may be given"
-msgstr ""
+msgstr "chỉ má»™t trong số các tùy chá»n sau được chỉ ra: -mm và -ml"
#: config/mep/mep.c:363
#, gcc-internal-format
msgid "only one of -ms and -mtiny= may be given"
-msgstr ""
+msgstr "chỉ má»™t trong số các tùy chá»n sau được chỉ ra: -ms và -mtiny="
#: config/mep/mep.c:365
#, gcc-internal-format
msgid "only one of -mm and -mtiny= may be given"
-msgstr ""
+msgstr "chỉ má»™t trong số các tùy chá»n sau được chỉ ra: -mm và -mtiny="
#: config/mep/mep.c:367
#, gcc-internal-format
@@ -24936,12 +24518,12 @@ msgstr ""
#: config/mep/mep.c:6363
#, gcc-internal-format
msgid "too few arguments to %qE"
-msgstr ""
+msgstr "quá ít đối số cho %qE"
#: config/mep/mep.c:6368
#, gcc-internal-format
msgid "too many arguments to %qE"
-msgstr ""
+msgstr "quá nhiá»u đối số cho %qE"
#: config/mep/mep.c:6386
#, gcc-internal-format
@@ -25056,7 +24638,7 @@ msgstr ""
#: config/mips/mips.c:15845
#, gcc-internal-format
msgid "%<-mgp32%> used with a 64-bit ABI"
-msgstr ""
+msgstr "%<-mgp32%> dùng với 64-bit ABI"
#: config/mips/mips.c:15847
#, gcc-internal-format
@@ -25079,10 +24661,9 @@ msgid "%<-mgp32%> and %<-mfp64%> can only be combined when using the o32 ABI"
msgstr ""
#: config/mips/mips.c:15895 config/mips/mips.c:15897 config/mips/mips.c:15910
-#, fuzzy, gcc-internal-format
-#| msgid "-mas100-syntax is incompatible with -gdwarf"
+#, gcc-internal-format
msgid "%qs is incompatible with %qs"
-msgstr "« -mas100-syntax » không tương thích với « -gdwarf »"
+msgstr "%qs không tương thích với %qs"
#. We have traditionally allowed non-abicalls code to use
#. an LP64 form of o64. However, it would take a bit more
@@ -25218,7 +24799,7 @@ msgstr ""
#: config/pa/pa.c:510
#, gcc-internal-format
msgid "-g option disabled"
-msgstr ""
+msgstr "tùy chá»n -g bị tắt"
#: config/pa/pa.c:8622
#, gcc-internal-format, gfc-internal-format
@@ -25368,7 +24949,7 @@ msgstr ""
#: config/rs6000/rs6000-c.c:66
#, gcc-internal-format
msgid "missing number"
-msgstr ""
+msgstr "thiếu số"
#: config/rs6000/rs6000-c.c:68
#, gcc-internal-format
@@ -25388,27 +24969,27 @@ msgstr ""
#: config/rs6000/rs6000-c.c:3528
#, gcc-internal-format, gfc-internal-format
msgid "%s only accepts %d arguments"
-msgstr ""
+msgstr "%s chỉ chấp nhận %d tham số"
#: config/rs6000/rs6000-c.c:3533
#, gcc-internal-format, gfc-internal-format
msgid "%s only accepts 1 argument"
-msgstr ""
+msgstr "%s chỉ chấp nhận một tham số"
#: config/rs6000/rs6000-c.c:3538
#, gcc-internal-format, gfc-internal-format
msgid "%s only accepts 2 arguments"
-msgstr ""
+msgstr "%s chỉ chấp nhận hai tham số"
#: config/rs6000/rs6000-c.c:3603
#, gcc-internal-format
msgid "vec_extract only accepts 2 arguments"
-msgstr ""
+msgstr "vec_extract chỉ chấp nhận hai tham số"
#: config/rs6000/rs6000-c.c:3679
#, gcc-internal-format
msgid "vec_insert only accepts 3 arguments"
-msgstr ""
+msgstr "vec_insert chỉ chấp nhận ba tham số"
#: config/rs6000/rs6000-c.c:3782
#, gcc-internal-format
@@ -25423,17 +25004,17 @@ msgstr ""
#: config/rs6000/rs6000.c:2436
#, gcc-internal-format
msgid "-mrecip requires -ffinite-math or -ffast-math"
-msgstr ""
+msgstr "-mrecip cần -ffinite-math hoặc -ffast-math"
#: config/rs6000/rs6000.c:2438
#, gcc-internal-format
msgid "-mrecip requires -fno-trapping-math or -ffast-math"
-msgstr ""
+msgstr "-mrecip cần -fno-trapping-math hoặc -ffast-math"
#: config/rs6000/rs6000.c:2440
#, gcc-internal-format
msgid "-mrecip requires -freciprocal-math or -ffast-math"
-msgstr ""
+msgstr "-mrecip yêu cầu -freciprocal-math hoặc -ffast-math"
#: config/rs6000/rs6000.c:2535
#, gcc-internal-format
@@ -25456,10 +25037,9 @@ msgid "AltiVec not supported in this target"
msgstr ""
#: config/rs6000/rs6000.c:2712
-#, fuzzy, gcc-internal-format
-#| msgid "profiling not supported with -mg"
+#, gcc-internal-format
msgid "SPE not supported in this target"
-msgstr "không hỗ trợ sử dụng chức năng đo hiệu năng sử dụng với « -mg »"
+msgstr "SPE không được hỗ trợ ở đích này"
#: config/rs6000/rs6000.c:2739
#, gcc-internal-format
@@ -25712,27 +25292,25 @@ msgid "emitting conditional microcode insn %s\t[%s] #%d"
msgstr ""
#: config/rs6000/rs6000.c:27207
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "invalid use of '%%%c'"
+#, gcc-internal-format, gfc-internal-format
msgid "invalid cpu \"%s\" for %s\"%s\"%s"
-msgstr "sai sử dụng « %%%c »"
+msgstr "sai cpu \"%s\" cho %s\"%s\"%s"
#: config/rs6000/rs6000.c:27210
#, gcc-internal-format, gfc-internal-format
msgid "%s\"%s\"%s is not allowed"
-msgstr ""
+msgstr "%s\"%s\"%s là không được phép"
#: config/rs6000/rs6000.c:27212
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "spec '%s' is invalid"
+#, gcc-internal-format, gfc-internal-format
msgid "%s\"%s\"%s is invalid"
-msgstr "đặc tả « %s » không hợp lệ"
+msgstr "%s\"%s\"%s không hợp lệ"
#: config/rs6000/aix43.h:32 config/rs6000/aix51.h:32 config/rs6000/aix52.h:32
#: config/rs6000/aix53.h:32 config/rs6000/aix61.h:32
#, gcc-internal-format
msgid "-maix64 and POWER architecture are incompatible"
-msgstr ""
+msgstr "-maix64 và kiến trúc POWER là không tương thích"
#: config/rs6000/aix43.h:37 config/rs6000/aix51.h:37 config/rs6000/aix52.h:37
#: config/rs6000/aix53.h:37 config/rs6000/aix61.h:37
@@ -25802,49 +25380,49 @@ msgstr ""
#: config/rs6000/rs6000.h:1655
#, gcc-internal-format
msgid "RETURN_ADDRESS_OFFSET not supported"
-msgstr ""
+msgstr "RETURN_ADDRESS_OFFSET không được hỗ trợ"
#. The macro SUBTARGET_OVERRIDE_OPTIONS is provided for subtargets, to
#. get control in TARGET_OPTION_OVERRIDE.
#: config/rs6000/sysv4.h:114
#, gcc-internal-format, gfc-internal-format
msgid "bad value for -mcall-%s"
-msgstr ""
+msgstr "sai giá trị cho -mcall-%s"
#: config/rs6000/sysv4.h:130
#, gcc-internal-format, gfc-internal-format
msgid "bad value for -msdata=%s"
-msgstr ""
+msgstr "sai giá trị cho -msdata=%s"
#: config/rs6000/sysv4.h:147
#, gcc-internal-format, gfc-internal-format
msgid "-mrelocatable and -msdata=%s are incompatible"
-msgstr ""
+msgstr "-mrelocatable và -msdata=%s là không tương thích"
#: config/rs6000/sysv4.h:156
#, gcc-internal-format, gfc-internal-format
msgid "-f%s and -msdata=%s are incompatible"
-msgstr ""
+msgstr "-f%s và -msdata=%s là không tương thích"
#: config/rs6000/sysv4.h:165
#, gcc-internal-format, gfc-internal-format
msgid "-msdata=%s and -mcall-%s are incompatible"
-msgstr ""
+msgstr "-msdata=%s và -mcall-%s là không tương thích"
#: config/rs6000/sysv4.h:174
#, gcc-internal-format
msgid "-mrelocatable and -mno-minimal-toc are incompatible"
-msgstr ""
+msgstr "-mrelocatable và -mno-minimal-toc là không tương thích"
#: config/rs6000/sysv4.h:180
#, gcc-internal-format, gfc-internal-format
msgid "-mrelocatable and -mcall-%s are incompatible"
-msgstr ""
+msgstr "-mrelocatable và -mcall-%s là không tương thích"
#: config/rs6000/sysv4.h:187
#, gcc-internal-format, gfc-internal-format
msgid "-fPIC and -mcall-%s are incompatible"
-msgstr ""
+msgstr "-fPIC và -mcall-%s là không tương thích"
#: config/rs6000/sysv4.h:194
#, gcc-internal-format
@@ -25869,7 +25447,7 @@ msgstr ""
#: config/rx/rx.c:2383
#, gcc-internal-format, gfc-internal-format
msgid "__builtin_rx_%s takes 'C', 'Z', 'S', 'O', 'I', or 'U'"
-msgstr ""
+msgstr "__builtin_rx_%s nhận 'C', 'Z', 'S', 'O', 'I', hoặc 'U'"
#: config/rx/rx.c:2385
#, gcc-internal-format
@@ -25898,13 +25476,11 @@ msgstr ""
#: config/s390/s390.c:1553
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Use decimal floating point instructions"
msgid "hardware decimal floating point instructions not available on %s"
msgstr "Sử dụng câu lệnh loại điểm phù động thập phân"
#: config/s390/s390.c:1556
#, fuzzy, gcc-internal-format
-#| msgid "Use decimal floating point instructions"
msgid "hardware decimal floating point instructions not available in ESA/390 mode"
msgstr "Sử dụng câu lệnh loại điểm phù động thập phân"
@@ -26074,12 +25650,12 @@ msgstr ""
#: config/spu/spu.c:548
#, gcc-internal-format, gfc-internal-format
msgid "bad value (%s) for -march= switch"
-msgstr ""
+msgstr "sai giá trị (%s) cho chuyển -march="
#: config/spu/spu.c:559
#, gcc-internal-format, gfc-internal-format
msgid "bad value (%s) for -mtune= switch"
-msgstr ""
+msgstr "sai giá trị (%s) cho chuyển -mtune"
#: config/spu/spu.c:5467 config/spu/spu.c:5470
#, gcc-internal-format
@@ -26138,13 +25714,11 @@ msgstr ""
#: config/tilegx/tilegx.c:3397 config/tilepro/tilepro.c:3101
#, fuzzy, gcc-internal-format
-#| msgid "bad condition code"
msgid "bad builtin icode"
msgstr "mã Ä‘iá»u kiện sai"
#: config/tilegx/tilegx.c:3438 config/tilepro/tilepro.c:3127
#, fuzzy, gcc-internal-format
-#| msgid "operand 1 must be a hard register"
msgid "operand must be an immediate of the right size"
msgstr "toán hạng 1 phải là một thanh ghi cứng"
@@ -26414,19 +25988,17 @@ msgstr[0] ""
#: cp/call.c:3148
#, gcc-internal-format
msgid "%s%D(%T, %T, %T) <built-in>"
-msgstr ""
+msgstr "%s%D(%T, %T, %T) <dựng-sắn>"
#: cp/call.c:3153
-#, fuzzy, gcc-internal-format
-#| msgid "<built-in>"
+#, gcc-internal-format
msgid "%s%D(%T, %T) <built-in>"
-msgstr "<có sẵn>"
+msgstr "%s%D(%T, %T) <dựng-sẵn>"
#: cp/call.c:3157
-#, fuzzy, gcc-internal-format
-#| msgid "<built-in>"
+#, gcc-internal-format
msgid "%s%D(%T) <built-in>"
-msgstr "<có sẵn>"
+msgstr "%s%D(%T) <dựng-sẵn>"
#: cp/call.c:3161
#, gcc-internal-format
@@ -26446,7 +26018,7 @@ msgstr ""
#: cp/call.c:3167
#, gcc-internal-format
msgid "%s%#D"
-msgstr ""
+msgstr "%s%#D"
#: cp/call.c:3186
#, gcc-internal-format
@@ -26639,17 +26211,17 @@ msgstr ""
#: cp/call.c:5487
#, gcc-internal-format
msgid "%q+#D is private"
-msgstr ""
+msgstr "%q+#D là private"
#: cp/call.c:5489
#, gcc-internal-format
msgid "%q+#D is protected"
-msgstr ""
+msgstr "%q+#D là protected"
#: cp/call.c:5491
#, gcc-internal-format
msgid "%q+#D is inaccessible"
-msgstr ""
+msgstr "%q+#D là không thể truy cập"
#: cp/call.c:5492
#, gcc-internal-format
@@ -26683,7 +26255,6 @@ msgstr ""
#: cp/call.c:5604
#, fuzzy, gcc-internal-format
-#| msgid "invalid conversion from %<__fpreg%>"
msgid "invalid user-defined conversion from %qT to %qT"
msgstr "sai chuyển đổi từ %<__fpreg%>"
@@ -26836,12 +26407,12 @@ msgstr ""
#: cp/call.c:8127
#, gcc-internal-format
msgid "choosing %qD over %qD"
-msgstr ""
+msgstr "đóng %qD thông qua %qD"
#: cp/call.c:8128
#, gcc-internal-format
msgid " for conversion from %qT to %qT"
-msgstr ""
+msgstr " cho chuyển đổi từ %qT thành %qT"
#: cp/call.c:8131
#, gcc-internal-format
@@ -26856,12 +26427,12 @@ msgstr ""
#: cp/call.c:8253
#, gcc-internal-format
msgid " candidate 1: %q+#F"
-msgstr ""
+msgstr " ứng cử 1: %q+#F"
#: cp/call.c:8255
#, gcc-internal-format
msgid " candidate 2: %q+#F"
-msgstr ""
+msgstr " ứng cử 2: %q+#F"
#: cp/call.c:8296
#, gcc-internal-format
@@ -26871,7 +26442,7 @@ msgstr ""
#: cp/call.c:8449
#, gcc-internal-format
msgid "could not convert %qE from %qT to %qT"
-msgstr ""
+msgstr "không thể chuyển đổi %qE từ %qT thành %qT"
#: cp/call.c:8639
#, gcc-internal-format
@@ -26906,12 +26477,12 @@ msgstr ""
#: cp/class.c:1103
#, gcc-internal-format
msgid "%q+#D cannot be overloaded"
-msgstr ""
+msgstr "%q+#D không thể được quá tải"
#: cp/class.c:1104
#, gcc-internal-format
msgid "with %q+#D"
-msgstr ""
+msgstr "vá»›i %q+#D"
#: cp/class.c:1173
#, gcc-internal-format
@@ -26982,12 +26553,12 @@ msgstr ""
#: cp/class.c:2595
#, gcc-internal-format
msgid "%q+D was hidden"
-msgstr ""
+msgstr "%q+D bị ẩn"
#: cp/class.c:2596
#, gcc-internal-format
msgid " by %q+D"
-msgstr ""
+msgstr " bởi %q+D"
#: cp/class.c:2639 cp/decl2.c:1359
#, gcc-internal-format
@@ -27161,7 +26732,6 @@ msgstr ""
#: cp/class.c:4904
#, fuzzy, gcc-internal-format
-#| msgid "Warn about non-virtual destructors"
msgid " %q+T has a non-trivial destructor"
msgstr "Cảnh báo vỠbộ hủy cấu trúc không phải ảo"
@@ -27344,9 +26914,8 @@ msgstr ""
#: cp/cvt.c:204 cp/decl.c:10586 cp/typeck.c:4101
#, fuzzy, gcc-internal-format
-#| msgid "'B' operand is not constant"
msgid "zero as null pointer constant"
-msgstr "toán hạng « B » không phải là một hằng số"
+msgstr "toán hạng B không phải là một hằng số"
#: cp/cvt.c:378
#, gcc-internal-format
@@ -27580,7 +27149,6 @@ msgstr ""
#: cp/cvt.c:1231
#, fuzzy, gcc-internal-format
-#| msgid "<unresolved overloaded function type>"
msgid "statement cannot resolve address of overloaded function"
msgstr "<chưa giải quyết loại hàm quá tải>"
@@ -27841,7 +27409,7 @@ msgstr ""
#: cp/decl.c:1572
#, gcc-internal-format
msgid "prototype for %q+#D"
-msgstr ""
+msgstr "nguyên mẫu cho %q+#D"
#: cp/decl.c:1574
#, gcc-internal-format
@@ -27920,7 +27488,7 @@ msgstr ""
#: cp/decl.c:2395
#, gcc-internal-format
msgid "%q#D not declared in class"
-msgstr ""
+msgstr "%q#D chưa được khai báo trong lớp"
#: cp/decl.c:2409 cp/decl.c:2454
#, gcc-internal-format
@@ -27958,17 +27526,17 @@ msgstr ""
#: cp/decl.c:2679
#, gcc-internal-format
msgid "jump to label %qD"
-msgstr ""
+msgstr "nhảy tới nhãn %qD"
#: cp/decl.c:2681
#, gcc-internal-format
msgid "jump to case label"
-msgstr ""
+msgstr "nhảy tới nhãn lệnh case"
#: cp/decl.c:2683 cp/decl.c:2825 cp/decl.c:2865
#, gcc-internal-format
msgid " from here"
-msgstr ""
+msgstr " từ đây"
#: cp/decl.c:2702 cp/decl.c:2868
#, gcc-internal-format
@@ -28019,7 +27587,7 @@ msgstr ""
#: cp/decl.c:3225
#, gcc-internal-format
msgid "%qD is not a type"
-msgstr ""
+msgstr "%qD không phải là một kiểu"
#: cp/decl.c:3231 cp/parser.c:5055
#, gcc-internal-format
@@ -28029,7 +27597,7 @@ msgstr ""
#: cp/decl.c:3240
#, gcc-internal-format
msgid "%q#T is not a class"
-msgstr ""
+msgstr "%q#T không phải là một lớp"
#: cp/decl.c:3264 cp/decl.c:3354
#, gcc-internal-format
@@ -28064,7 +27632,7 @@ msgstr ""
#: cp/decl.c:3364 cp/friend.c:327 cp/friend.c:335
#, gcc-internal-format
msgid "%q+D declared here"
-msgstr ""
+msgstr "%q+D được khai báo ở đây"
#: cp/decl.c:4082
#, gcc-internal-format
@@ -28153,7 +27721,6 @@ msgstr ""
#: cp/decl.c:4227
#, fuzzy, gcc-internal-format
-#| msgid "attribute declaration"
msgid "attribute ignored in declaration of %q#T"
msgstr "lá»i tuyên bố thuá»™c tính"
@@ -28206,7 +27773,7 @@ msgstr ""
#: cp/decl.c:4461
#, gcc-internal-format
msgid "duplicate initialization of %qD"
-msgstr ""
+msgstr "khởi tạo lặp lại cho %qD"
#: cp/decl.c:4466
#, gcc-internal-format
@@ -28271,7 +27838,7 @@ msgstr ""
#: cp/decl.c:4770
#, gcc-internal-format
msgid "zero-size array %qD"
-msgstr ""
+msgstr "mảng có kích thước bằng không %qD"
#. An automatic variable with an incomplete type: that is an error.
#. Don't talk about array types here, since we took care of that
@@ -28374,7 +27941,6 @@ msgstr ""
#: cp/decl.c:5469
#, fuzzy, gcc-internal-format
-#| msgid "source is of incomplete class type"
msgid "%q#D has incomplete type"
msgstr "nguồn có loại hạng không hoàn toàn"
@@ -28400,7 +27966,6 @@ msgstr ""
#: cp/decl.c:5641
#, fuzzy, gcc-internal-format
-#| msgid "non-static initialization of a flexible array member"
msgid "non-constant in-class initialization invalid for static member %qD"
msgstr "một bộ phận mảng dẻo bị sơ khởi một cách không phải tĩnh"
@@ -28477,7 +28042,7 @@ msgstr ""
#: cp/decl.c:6999
#, gcc-internal-format
msgid "%qD declared as a %<virtual%> variable"
-msgstr ""
+msgstr "%qD được khai báo là một biến %<virtual%>"
#: cp/decl.c:7001
#, gcc-internal-format
@@ -28537,7 +28102,7 @@ msgstr ""
#: cp/decl.c:7037
#, gcc-internal-format
msgid "%q+D declared as a friend"
-msgstr ""
+msgstr "%q+D được khai báo là friend"
#: cp/decl.c:7043
#, gcc-internal-format
@@ -28637,7 +28202,6 @@ msgstr ""
#: cp/decl.c:7416
#, fuzzy, gcc-internal-format
-#| msgid "In static member function %qs"
msgid "%qD must be a non-member function"
msgstr "Trong hàm bộ phận tĩnh %qs"
@@ -28682,7 +28246,6 @@ msgstr ""
#: cp/decl.c:7828
#, fuzzy, gcc-internal-format
-#| msgid "initialization of flexible array member in a nested context"
msgid "in-class initialization of static data member %q#D of incomplete type"
msgstr "bộ phận mảng dẻo bị sơ khởi trong một ngữ cảnh lồng nhau"
@@ -28784,7 +28347,7 @@ msgstr ""
#: cp/decl.c:8170
#, gcc-internal-format
msgid "creating array of void"
-msgstr ""
+msgstr "tạo mảng void"
#: cp/decl.c:8175
#, gcc-internal-format
@@ -28794,7 +28357,7 @@ msgstr ""
#: cp/decl.c:8177
#, gcc-internal-format
msgid "creating array of functions"
-msgstr ""
+msgstr "tạo mảng hàm"
#: cp/decl.c:8182
#, gcc-internal-format
@@ -28804,7 +28367,7 @@ msgstr ""
#: cp/decl.c:8184
#, gcc-internal-format
msgid "creating array of references"
-msgstr ""
+msgstr "tạo mảng tham chiếu"
#: cp/decl.c:8189
#, gcc-internal-format
@@ -28929,62 +28492,62 @@ msgstr ""
#: cp/decl.c:8769
#, gcc-internal-format
msgid "%<__int128%> is not supported by this target"
-msgstr ""
+msgstr "%<__int128%> không được hỗ trợ bởi đích này"
#: cp/decl.c:8774
#, gcc-internal-format
msgid "ISO C++ does not support %<__int128%> for %qs"
-msgstr ""
+msgstr "ISO C++ không hỗ trợ %<__int128%> cho %qs"
#: cp/decl.c:8795 cp/decl.c:8815
#, gcc-internal-format
msgid "%<signed%> or %<unsigned%> invalid for %qs"
-msgstr ""
+msgstr "%<signed%> hoặc %<unsigned%> không hợp lệ với %qs"
#: cp/decl.c:8797
#, gcc-internal-format
msgid "%<signed%> and %<unsigned%> specified together for %qs"
-msgstr ""
+msgstr "%<signed%> và %<unsigned%> được chỉ định cùng với nhau cho %qs"
#: cp/decl.c:8799
#, gcc-internal-format
msgid "%<long long%> invalid for %qs"
-msgstr ""
+msgstr "%<long long%> không hợp lệ với %qs"
#: cp/decl.c:8801
#, gcc-internal-format
msgid "%<long%> invalid for %qs"
-msgstr ""
+msgstr "%<long%>không hợp lệ với %qs"
#: cp/decl.c:8803
#, gcc-internal-format
msgid "%<short%> invalid for %qs"
-msgstr ""
+msgstr "%<short%> không hợp lệ với %qs"
#: cp/decl.c:8805
#, gcc-internal-format
msgid "%<long%> or %<short%> invalid for %qs"
-msgstr ""
+msgstr "%<long%> hoặc %<short%> không hợp lệ với %qs"
#: cp/decl.c:8807
#, gcc-internal-format
msgid "%<long%>, %<int%>, %<short%>, or %<char%> invalid for %qs"
-msgstr ""
+msgstr "%<long%>, %<int%>, %<short%>, hoặc %<char%> không hợp lệ cho %qs"
#: cp/decl.c:8809
#, gcc-internal-format
msgid "%<long%> or %<short%> specified with char for %qs"
-msgstr ""
+msgstr "%<long%> hoặc %<short%> đựoc chỉ định với kiểu char với %qs"
#: cp/decl.c:8811
#, gcc-internal-format
msgid "%<long%> and %<short%> specified together for %qs"
-msgstr ""
+msgstr "%<long%> và %<short%> được chỉ định cùng nhau với %qs"
#: cp/decl.c:8817
#, gcc-internal-format
msgid "%<short%> or %<long%> invalid for %qs"
-msgstr ""
+msgstr "%<short%> hoặc %<long%> không hợp lệ với %qs"
#: cp/decl.c:8825
#, gcc-internal-format
@@ -29009,7 +28572,7 @@ msgstr ""
#: cp/decl.c:8950
#, gcc-internal-format
msgid "%<%T::%D%> is not a valid declarator"
-msgstr ""
+msgstr "%<%T::%D%>không phải là khai báo hợp lệ"
#: cp/decl.c:8959
#, gcc-internal-format
@@ -29110,7 +28673,6 @@ msgstr ""
#: cp/decl.c:9239
#, fuzzy, gcc-internal-format
-#| msgid "In static member function %qs"
msgid "constructor cannot be static member function"
msgstr "Trong hàm bộ phận tĩnh %qs"
@@ -29131,7 +28693,6 @@ msgstr ""
#: cp/decl.c:9274
#, fuzzy, gcc-internal-format
-#| msgid "(static initializers for %s)"
msgid "can%'t initialize friend function %qs"
msgstr "(bộ sơ khởi tĩnh cho %s)"
@@ -30131,7 +29692,6 @@ msgstr ""
#: cp/decl2.c:4255
#, fuzzy, gcc-internal-format
-#| msgid "In member function %qs"
msgid "use of deleted function %qD"
msgstr "Trong hàm bộ phận %qs"
@@ -30408,7 +29968,6 @@ msgstr ""
#: cp/init.c:671
#, fuzzy, gcc-internal-format
-#| msgid "invalid initializer"
msgid "invalid initializer for array member %q#D"
msgstr "bộ sơ khởi sai"
@@ -30594,7 +30153,6 @@ msgstr ""
#: cp/init.c:2574
#, fuzzy, gcc-internal-format
-#| msgid "array index in initializer exceeds array bounds"
msgid "parenthesized initializer in array new"
msgstr "bộ sơ khởi chứa một chỉ mục mảng vượt quá giới hạn mảng"
@@ -30790,15 +30348,13 @@ msgstr ""
#: cp/method.c:1025
#, fuzzy, gcc-internal-format
-#| msgid "(static initializers for %s)"
msgid "initializer for %q+#D is invalid"
msgstr "(bộ sơ khởi tĩnh cho %s)"
#: cp/method.c:1048
#, fuzzy, gcc-internal-format
-#| msgid "Put uninitialized constants in ROM (needs -membedded-data)"
msgid "uninitialized non-static const member %q#D"
-msgstr "Äể vào ROM các hằng số chÆ°a sÆ¡ khởi (yêu cầu « -membedded-data »)"
+msgstr "Äể vào ROM các hằng số chÆ°a sÆ¡ khởi (yêu cầu -membedded-data)"
#: cp/method.c:1055
#, gcc-internal-format
@@ -30883,13 +30439,11 @@ msgstr ""
#: cp/name-lookup.c:555
#, fuzzy, gcc-internal-format
-#| msgid "Warn about global functions without previous declarations"
msgid "%q#D conflicts with a previous declaration"
msgstr "Cảnh báo vá» hàm toàn cục không có lá»i tuyên bố trÆ°á»›c"
#: cp/name-lookup.c:557
#, fuzzy, gcc-internal-format
-#| msgid "attribute declaration"
msgid "previous declaration %q+#D"
msgstr "lá»i tuyên bố thuá»™c tính"
@@ -31212,10 +30766,9 @@ msgid "%<%E::%E%> is not a type"
msgstr ""
#: cp/parser.c:2428
-#, fuzzy, gcc-internal-format
-#| msgid "'%s' is not a valid class name"
+#, gcc-internal-format
msgid "%<%E::%E%> is not a class or namespace"
-msgstr "« %s » không phải là một tên hạng đúng"
+msgstr "%<%E::%E%> không phải là một lớp hoặc namespace"
#: cp/parser.c:2433
#, gcc-internal-format
@@ -31228,10 +30781,9 @@ msgid "%<::%E%> is not a type"
msgstr ""
#: cp/parser.c:2449
-#, fuzzy, gcc-internal-format
-#| msgid "'%s' is not a valid class name"
+#, gcc-internal-format
msgid "%<::%E%> is not a class or namespace"
-msgstr "« %s » không phải là một tên hạng đúng"
+msgstr "%<::%E%> không phải một lớp hay namespace"
#: cp/parser.c:2453
#, gcc-internal-format
@@ -31239,16 +30791,14 @@ msgid "%<::%E%> is not a class, namespace, or enumeration"
msgstr ""
#: cp/parser.c:2465
-#, fuzzy, gcc-internal-format
-#| msgid "source is not of class type"
+#, gcc-internal-format
msgid "%qE is not a type"
-msgstr "nguồn không phải có loại hạng"
+msgstr "%qE không phải là một kiểu"
#: cp/parser.c:2468
-#, fuzzy, gcc-internal-format
-#| msgid "'%s' is not a valid class name"
+#, gcc-internal-format
msgid "%qE is not a class or namespace"
-msgstr "« %s » không phải là một tên hạng đúng"
+msgstr "%qE không phải một lớp hay namespace"
#: cp/parser.c:2472
#, gcc-internal-format
@@ -31292,7 +30842,6 @@ msgstr ""
#: cp/parser.c:2641
#, fuzzy, gcc-internal-format
-#| msgid "initializer element is not a constant expression"
msgid "floating-point literal cannot appear in a constant-expression"
msgstr "yếu tố sơ khởi không phải là một biểu tượng hằng số"
@@ -31303,7 +30852,6 @@ msgstr ""
#: cp/parser.c:2650
#, fuzzy, gcc-internal-format
-#| msgid "Bad type in constant expression"
msgid "%<typeid%> operator cannot appear in a constant-expression"
msgstr "Gặp loại saio trong biểu thức bất biến"
@@ -31314,31 +30862,26 @@ msgstr ""
#: cp/parser.c:2658
#, fuzzy, gcc-internal-format
-#| msgid "Bad type in constant expression"
msgid "a function call cannot appear in a constant-expression"
msgstr "Gặp loại saio trong biểu thức bất biến"
#: cp/parser.c:2662
#, fuzzy, gcc-internal-format
-#| msgid "initializer element is not a constant expression"
msgid "an increment cannot appear in a constant-expression"
msgstr "yếu tố sơ khởi không phải là một biểu tượng hằng số"
#: cp/parser.c:2666
#, fuzzy, gcc-internal-format
-#| msgid "Bad type in constant expression"
msgid "an decrement cannot appear in a constant-expression"
msgstr "Gặp loại saio trong biểu thức bất biến"
#: cp/parser.c:2670
#, fuzzy, gcc-internal-format
-#| msgid "array index in initializer is not an integer constant expression"
msgid "an array reference cannot appear in a constant-expression"
msgstr "bộ sơ khởi chứa một chỉ mục mảng không phải là một biểu tượng hằng số nguyên"
#: cp/parser.c:2674
#, fuzzy, gcc-internal-format
-#| msgid "Bad type in constant expression"
msgid "the address of a label cannot appear in a constant-expression"
msgstr "Gặp loại saio trong biểu thức bất biến"
@@ -31349,13 +30892,11 @@ msgstr ""
#: cp/parser.c:2682
#, fuzzy, gcc-internal-format
-#| msgid "Bad type in constant expression"
msgid "an assignment cannot appear in a constant-expression"
msgstr "Gặp loại saio trong biểu thức bất biến"
#: cp/parser.c:2685
#, fuzzy, gcc-internal-format
-#| msgid "Bad type in constant expression"
msgid "a comma operator cannot appear in a constant-expression"
msgstr "Gặp loại saio trong biểu thức bất biến"
@@ -31366,13 +30907,11 @@ msgstr ""
#: cp/parser.c:2693
#, fuzzy, gcc-internal-format
-#| msgid "array index in initializer is not an integer constant expression"
msgid "a transaction expression cannot appear in a constant-expression"
msgstr "bộ sơ khởi chứa một chỉ mục mảng không phải là một biểu tượng hằng số nguyên"
#: cp/parser.c:2739
#, fuzzy, gcc-internal-format
-#| msgid "Bad type in constant expression"
msgid "%qs cannot appear in a constant-expression"
msgstr "Gặp loại saio trong biểu thức bất biến"
@@ -31435,10 +30974,9 @@ msgid "%qE in %q#T does not name a type"
msgstr ""
#: cp/parser.c:3400
-#, fuzzy, gcc-internal-format
-#| msgid "Expected string"
+#, gcc-internal-format
msgid "expected string-literal"
-msgstr "Mong đợi một chuỗi"
+msgstr "cần một chuỗi chữ"
#: cp/parser.c:3462
#, gcc-internal-format
@@ -31471,10 +31009,9 @@ msgid "unable to find string literal operator %qD with %qT, %qT arguments"
msgstr ""
#: cp/parser.c:3821 cp/parser.c:10370
-#, fuzzy, gcc-internal-format
-#| msgid "derived type declaration"
+#, gcc-internal-format
msgid "expected declaration"
-msgstr "lá»i tuyên bố loại có hÆ°á»›ng"
+msgstr "cần khai báo"
#: cp/parser.c:3924
#, gcc-internal-format
@@ -31492,10 +31029,9 @@ msgid "statement-expressions are not allowed outside functions nor in template-a
msgstr ""
#: cp/parser.c:4087 cp/parser.c:4237 cp/parser.c:4390
-#, fuzzy, gcc-internal-format
-#| msgid "Expected expression type"
+#, gcc-internal-format
msgid "expected primary-expression"
-msgstr "Mong đợi một loại biểu thức"
+msgstr "cần biểu thức cơ bản"
#: cp/parser.c:4117
#, gcc-internal-format
@@ -31504,9 +31040,8 @@ msgstr ""
#: cp/parser.c:4232
#, fuzzy, gcc-internal-format
-#| msgid "Warn about \"extern\" declarations not at file scope"
msgid "a template declaration cannot appear at block scope"
-msgstr "Cảnh báo vá» lá»i tuyên bố « extern » (bên ngoài) ở ngoại phạm vi tập tin"
+msgstr "Cảnh báo vá» lá»i tuyên bố 'extern' (bên ngoài) ở ngoại phạm vi tập tin"
#: cp/parser.c:4366
#, gcc-internal-format
@@ -31515,9 +31050,8 @@ msgstr ""
#: cp/parser.c:4530
#, fuzzy, gcc-internal-format
-#| msgid "Expected expression type"
msgid "expected id-expression"
-msgstr "Mong đợi một loại biểu thức"
+msgstr "cần một loại biểu thức"
#: cp/parser.c:4660
#, gcc-internal-format
@@ -31541,9 +31075,8 @@ msgstr ""
#: cp/parser.c:4841 cp/parser.c:16238
#, fuzzy, gcc-internal-format
-#| msgid "Expected name"
msgid "expected unqualified-id"
-msgstr "Mong đợi một tên"
+msgstr "cần một tên"
#: cp/parser.c:4948
#, gcc-internal-format
@@ -31593,10 +31126,9 @@ msgid "invalid use of %qD"
msgstr ""
#: cp/parser.c:6041
-#, fuzzy, gcc-internal-format
-#| msgid "'%s' is not a valid class name"
+#, gcc-internal-format
msgid "%<%D::%D%> is not a class member"
-msgstr "« %s » không phải là một tên hạng đúng"
+msgstr "%<%D::%D%> không phải là thành viên lớp"
#: cp/parser.c:6302
#, gcc-internal-format
@@ -31781,9 +31313,8 @@ msgstr ""
#: cp/parser.c:9931 cp/parser.c:22280
#, fuzzy, gcc-internal-format
-#| msgid "Expected name"
msgid "expected jump-statement"
-msgstr "Mong đợi một tên"
+msgstr "cần một tên"
#: cp/parser.c:10063 cp/parser.c:18871
#, gcc-internal-format
@@ -31829,7 +31360,6 @@ msgstr ""
#: cp/parser.c:10888
#, fuzzy, gcc-internal-format
-#| msgid "Enable linker optimizations"
msgid "invalid linkage-specification"
msgstr "Hiệu lực số tối ưu hoá bộ liên kết"
@@ -31845,7 +31375,6 @@ msgstr ""
#: cp/parser.c:11366
#, fuzzy, gcc-internal-format
-#| msgid "nonconstant array index in initializer"
msgid "only constructors take member initializers"
msgstr "bộ sơ khởi chứa một chỉ mục mảng không phải hằng số"
@@ -31881,9 +31410,8 @@ msgstr ""
#: cp/parser.c:11867
#, fuzzy, gcc-internal-format
-#| msgid "Expected integer"
msgid "expected suffix identifier"
-msgstr "Mong đợi một số nguyên"
+msgstr "cần một số nguyên"
#: cp/parser.c:11872
#, gcc-internal-format
@@ -31892,7 +31420,6 @@ msgstr ""
#: cp/parser.c:11887
#, fuzzy, gcc-internal-format
-#| msgid "unexpected operand"
msgid "expected operator"
msgstr "gặp toán hạng bất thÆ°á»ng"
@@ -31919,15 +31446,13 @@ msgstr ""
#: cp/parser.c:12406
#, fuzzy, gcc-internal-format
-#| msgid "unexpected operand"
msgid "expected template-id"
msgstr "gặp toán hạng bất thÆ°á»ng"
#: cp/parser.c:12453 cp/parser.c:22238
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<<%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<<%>"
#: cp/parser.c:12460
#, gcc-internal-format
@@ -31947,9 +31472,8 @@ msgstr ""
#. The name does not name a template.
#: cp/parser.c:12610 cp/parser.c:12725 cp/parser.c:12936
#, fuzzy, gcc-internal-format
-#| msgid "Expected name"
msgid "expected template-name"
-msgstr "Mong đợi một tên"
+msgstr "cần một tên"
#. Explain what went wrong.
#: cp/parser.c:12656
@@ -31969,7 +31493,6 @@ msgstr ""
#: cp/parser.c:12901 cp/parser.c:12919 cp/parser.c:13060
#, fuzzy, gcc-internal-format
-#| msgid "template-parameter-"
msgid "expected template-argument"
msgstr "template-parameter-"
@@ -31995,21 +31518,18 @@ msgstr ""
#: cp/parser.c:13441
#, fuzzy, gcc-internal-format
-#| msgid "expected end of line"
msgid "expected type specifier"
-msgstr "mong đợi kết thúc dòng"
+msgstr "cần kết thúc dòng"
#: cp/parser.c:13688
#, fuzzy, gcc-internal-format
-#| msgid "Expected expression type"
msgid "expected template-id for type"
-msgstr "Mong đợi một loại biểu thức"
+msgstr "cần một loại biểu thức"
#: cp/parser.c:13715
#, fuzzy, gcc-internal-format
-#| msgid "Expected name"
msgid "expected type-name"
-msgstr "Mong đợi một tên"
+msgstr "cần một tên"
#: cp/parser.c:13952
#, gcc-internal-format
@@ -32047,10 +31567,9 @@ msgid "%qD is not an enumerator-name"
msgstr ""
#: cp/parser.c:14436
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<,%> or %<)%>"
+#, gcc-internal-format
msgid "expected %<;%> or %<{%>"
-msgstr "mong đợi %<,%> hoặc %<)%>"
+msgstr "cần %<;%> hoặc %<{%>"
#: cp/parser.c:14484
#, gcc-internal-format
@@ -32089,9 +31608,8 @@ msgstr ""
#: cp/parser.c:14728
#, fuzzy, gcc-internal-format
-#| msgid "Expected name"
msgid "expected namespace-name"
-msgstr "Mong đợi một tên"
+msgstr "cần một tên"
#: cp/parser.c:14853
#, gcc-internal-format
@@ -32136,13 +31654,11 @@ msgstr ""
#. Anything else is an error.
#: cp/parser.c:15629 cp/parser.c:17509
#, fuzzy, gcc-internal-format
-#| msgid "Expected integer"
msgid "expected initializer"
-msgstr "Mong đợi một số nguyên"
+msgstr "cần một số nguyên"
#: cp/parser.c:15649
#, fuzzy, gcc-internal-format
-#| msgid "derived type declaration"
msgid "invalid type in declaration"
msgstr "lá»i tuyên bố loại có hÆ°á»›ng"
@@ -32187,15 +31703,13 @@ msgstr ""
#. form.
#: cp/parser.c:16333
#, fuzzy, gcc-internal-format
-#| msgid "invalid operand to %%R"
msgid "invalid declarator"
msgstr "sai lập toán hạng tới %%R"
#: cp/parser.c:16399
#, fuzzy, gcc-internal-format
-#| msgid "Expected P edit descriptor"
msgid "expected declarator"
-msgstr "Mong đợi bộ mô tả chỉnh sửa « P »"
+msgstr "cần bộ mô tả chỉnh sửa P"
#: cp/parser.c:16494
#, gcc-internal-format
@@ -32209,7 +31723,6 @@ msgstr ""
#: cp/parser.c:16513
#, fuzzy, gcc-internal-format
-#| msgid "unexpected operand"
msgid "expected ptr-operator"
msgstr "gặp toán hạng bất thÆ°á»ng"
@@ -32235,15 +31748,13 @@ msgstr ""
#: cp/parser.c:16892
#, fuzzy, gcc-internal-format
-#| msgid "Expected integer"
msgid "expected type-specifier"
-msgstr "Mong đợi một số nguyên"
+msgstr "cần một số nguyên"
#: cp/parser.c:17136
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<,%> or %<)%>"
+#, gcc-internal-format
msgid "expected %<,%> or %<...%>"
-msgstr "mong đợi %<,%> hoặc %<)%>"
+msgstr "cần %<,%> hoặc %<...%>"
#: cp/parser.c:17193
#, gcc-internal-format
@@ -32282,9 +31793,8 @@ msgstr ""
#: cp/parser.c:17755 cp/parser.c:17879
#, fuzzy, gcc-internal-format
-#| msgid "Expected name"
msgid "expected class-name"
-msgstr "Mong đợi một tên"
+msgstr "cần một tên"
#: cp/parser.c:18067
#, gcc-internal-format
@@ -32302,10 +31812,9 @@ msgid "expected %<;%> after union definition"
msgstr ""
#: cp/parser.c:18392
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<,%> or %<)%>"
+#, gcc-internal-format
msgid "expected %<{%> or %<:%>"
-msgstr "mong đợi %<,%> hoặc %<)%>"
+msgstr "cần %<{%> hoặc %<:%>"
#: cp/parser.c:18403
#, gcc-internal-format
@@ -32354,9 +31863,8 @@ msgstr ""
#: cp/parser.c:18661 cp/parser.c:22283
#, fuzzy, gcc-internal-format
-#| msgid "Expected name"
msgid "expected class-key"
-msgstr "Mong đợi một tên"
+msgstr "cần một tên"
#: cp/parser.c:18890
#, gcc-internal-format
@@ -32374,10 +31882,9 @@ msgid "pure-specifier on function-definition"
msgstr ""
#: cp/parser.c:19166
-#, fuzzy, gcc-internal-format
-#| msgid "expected end of line"
+#, gcc-internal-format
msgid "expected %<;%> at end of member declaration"
-msgstr "mong đợi kết thúc dòng"
+msgstr "cần %<;%> tại cuối khai báo thành viên"
#: cp/parser.c:19237
#, gcc-internal-format
@@ -32386,7 +31893,6 @@ msgstr ""
#: cp/parser.c:19272
#, fuzzy, gcc-internal-format
-#| msgid "<brace-enclosed initializer list>"
msgid "a brace-enclosed initializer is not allowed here"
msgstr "<danh sách bộ sơ khởi nằm trong dấu ngoặc>"
@@ -32466,7 +31972,6 @@ msgstr ""
#: cp/parser.c:21134
#, fuzzy, gcc-internal-format
-#| msgid "invalid initializer"
msgid "invalid explicit specialization"
msgstr "bộ sơ khởi sai"
@@ -32506,118 +32011,99 @@ msgid "%<__thread%> before %qD"
msgstr ""
#: cp/parser.c:22141
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<new%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<new%>"
#: cp/parser.c:22144
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<while%>"
+#, gcc-internal-format
msgid "expected %<delete%>"
-msgstr "mong đợi %<while%>"
+msgstr "cần %<delete%>"
#: cp/parser.c:22147
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<@end%>"
+#, gcc-internal-format
msgid "expected %<return%>"
-msgstr "mong đợi %<@end%>"
+msgstr "cần %<return%>"
#: cp/parser.c:22153
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<@end%>"
+#, gcc-internal-format
msgid "expected %<extern%>"
-msgstr "mong đợi %<@end%>"
+msgstr "cần %<extern%>"
#: cp/parser.c:22156
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<while%>"
+#, gcc-internal-format
msgid "expected %<static_assert%>"
-msgstr "mong đợi %<while%>"
+msgstr "cần %<static_assert%>"
#: cp/parser.c:22159
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<while%>"
+#, gcc-internal-format
msgid "expected %<decltype%>"
-msgstr "mong đợi %<while%>"
+msgstr "cần %<decltype%>"
#: cp/parser.c:22162
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<operator%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<operator%>"
#: cp/parser.c:22165
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<class%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<class%>"
#: cp/parser.c:22168
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<while%>"
+#, gcc-internal-format
msgid "expected %<template%>"
-msgstr "mong đợi %<while%>"
+msgstr "cần %<template%>"
#: cp/parser.c:22171
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<namespace%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<namespace%>"
#: cp/parser.c:22174
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<using%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<using%>"
#: cp/parser.c:22177
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<asm%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<asm%>"
#: cp/parser.c:22180
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<try%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<try%>"
#: cp/parser.c:22183
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<catch%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<catch%>"
#: cp/parser.c:22186
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<throw%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<throw%>"
#: cp/parser.c:22189
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<while%>"
+#, gcc-internal-format
msgid "expected %<__label__%>"
-msgstr "mong đợi %<while%>"
+msgstr "cần %<__label__%>"
#: cp/parser.c:22192
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<@try%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<@try%>"
#: cp/parser.c:22195
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<@end%>"
+#, gcc-internal-format
msgid "expected %<@synchronized%>"
-msgstr "mong đợi %<@end%>"
+msgstr "cần %<@synchronized%>"
#: cp/parser.c:22198
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<@throw%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<@throw%>"
#: cp/parser.c:22201
#, gcc-internal-format
@@ -32625,46 +32111,39 @@ msgid "expected %<__transaction_atomic%>"
msgstr ""
#: cp/parser.c:22204
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<while%>"
+#, gcc-internal-format
msgid "expected %<__transaction_relaxed%>"
-msgstr "mong đợi %<while%>"
+msgstr "cần %<__transaction_relaxed%>"
#: cp/parser.c:22235
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<:%>"
+#, gcc-internal-format
msgid "expected %<::%>"
-msgstr "mong đợi %<:%>"
+msgstr "cần %<::%>"
#: cp/parser.c:22247
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<...%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<...%>"
#: cp/parser.c:22250
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<*%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<*%>"
#: cp/parser.c:22253
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>"
+#, gcc-internal-format
msgid "expected %<~%>"
-msgstr "mong đợi %<;%>"
+msgstr "cần %<~%>"
#: cp/parser.c:22259
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<,%> or %<)%>"
+#, gcc-internal-format
msgid "expected %<:%> or %<::%>"
-msgstr "mong đợi %<,%> hoặc %<)%>"
+msgstr "cần %<:%> hoặc %<::%>"
#: cp/parser.c:22287
-#, fuzzy, gcc-internal-format
-#| msgid "expected %<;%>, %<,%> or %<)%>"
+#, gcc-internal-format
msgid "expected %<class%>, %<typename%>, or %<template%>"
-msgstr "mong đợi %<;%>, %<,%> or %<)%>"
+msgstr "cần %<class%>, %<typename%>, hoặc %<template%>"
#: cp/parser.c:22525
#, gcc-internal-format
@@ -32748,9 +32227,8 @@ msgstr ""
#: cp/parser.c:24512 cp/parser.c:24519 cp/parser.c:24526
#, fuzzy, gcc-internal-format
-#| msgid "invalid operand for 'p' modifier"
msgid "invalid type for property"
-msgstr "sai lập toán hạng cho sự sửa đổi « p »"
+msgstr "sai lập toán hạng cho sự sửa đổi 'p'"
#: cp/parser.c:26256
#, gcc-internal-format
@@ -33270,10 +32748,9 @@ msgid " %qT is an ambiguous base class of %qT"
msgstr ""
#: cp/pt.c:5616
-#, fuzzy, gcc-internal-format
-#| msgid " inlined from %qs"
+#, gcc-internal-format
msgid " %qT is not derived from %qT"
-msgstr " trực tiếp từ %qs"
+msgstr " %qT không được dẫn xuất từ %qT"
#: cp/pt.c:5627
#, gcc-internal-format
@@ -33292,7 +32769,6 @@ msgstr ""
#: cp/pt.c:5656
#, fuzzy, gcc-internal-format
-#| msgid "<unresolved overloaded function type>"
msgid " could not resolve address from overloaded function %qE"
msgstr "<chưa giải quyết loại hàm quá tải>"
@@ -33789,7 +33265,6 @@ msgstr ""
#: cp/pt.c:19221
#, fuzzy, gcc-internal-format
-#| msgid "template-parameter-"
msgid "invalid template non-type parameter"
msgstr "template-parameter-"
@@ -33833,7 +33308,6 @@ msgstr ""
#: cp/repo.c:227
#, fuzzy, gcc-internal-format
-#| msgid "cannot create temporary file"
msgid "can%'t create repository information file %qs"
msgstr "không thể tạo tập tin tạm thá»i"
@@ -33933,10 +33407,9 @@ msgid "overriding deleted function %q+D"
msgstr ""
#: cp/search.c:1969
-#, fuzzy, gcc-internal-format
-#| msgid "internal function"
+#, gcc-internal-format
msgid "virtual function %q+D"
-msgstr "hàm nội bộ"
+msgstr "hàm ảo %q+D"
#: cp/search.c:1970
#, gcc-internal-format
@@ -34200,7 +33673,6 @@ msgstr ""
#: cp/semantics.c:5193
#, fuzzy, gcc-internal-format
-#| msgid "<unresolved overloaded function type>"
msgid "decltype cannot resolve address of overloaded function"
msgstr "<chưa giải quyết loại hàm quá tải>"
@@ -34221,7 +33693,6 @@ msgstr ""
#: cp/semantics.c:5717
#, fuzzy, gcc-internal-format
-#| msgid "invalid register in the move instruction"
msgid "invalid return type %qT of constexpr function %q+D"
msgstr "gặp thanh ghi sai trong lệnh di chuyển"
@@ -34252,7 +33723,6 @@ msgstr ""
#: cp/semantics.c:6163
#, fuzzy, gcc-internal-format
-#| msgid "Do not use push to store function arguments"
msgid "%q+D is not usable as a constexpr function because:"
msgstr "Äừng sá»­ dụng push để lÆ°u các đối số hàm"
@@ -34268,10 +33738,9 @@ msgstr ""
#. The definition of fun was somehow unsuitable.
#: cp/semantics.c:6529
-#, fuzzy, gcc-internal-format
-#| msgid "Bad type in constant expression"
+#, gcc-internal-format
msgid "%qD called in a constant expression"
-msgstr "Gặp loại saio trong biểu thức bất biến"
+msgstr "%qD được gá»i trong má»™t biểu thức hằng"
#: cp/semantics.c:6533
#, gcc-internal-format
@@ -34289,32 +33758,27 @@ msgid "constexpr evaluation depth exceeds maximum of %d (use -fconstexpr-depth=
msgstr ""
#: cp/semantics.c:6653
-#, fuzzy, gcc-internal-format
-#| msgid "Bad type in constant expression"
+#, gcc-internal-format
msgid "%q+E is not a constant expression"
-msgstr "Gặp loại saio trong biểu thức bất biến"
+msgstr "%q+E không phải biểu thức hằng"
#: cp/semantics.c:6793
#, fuzzy, gcc-internal-format
-#| msgid "Array reference out of bounds"
msgid "array subscript out of bound"
msgstr "Tham chiếu mảng ở ngoại phạm vi"
#: cp/semantics.c:6839 cp/semantics.c:6899 cp/semantics.c:7536
-#, fuzzy, gcc-internal-format
-#| msgid "Bad type in constant expression"
+#, gcc-internal-format
msgid "%qE is not a constant expression"
-msgstr "Gặp loại saio trong biểu thức bất biến"
+msgstr "%qE không phải là biểu thức hằng"
#: cp/semantics.c:6845
#, fuzzy, gcc-internal-format
-#| msgid "initializer element is not a constant expression"
msgid "mutable %qD is not usable in a constant expression"
msgstr "yếu tố sơ khởi không phải là một biểu tượng hằng số"
#: cp/semantics.c:6860
#, fuzzy, gcc-internal-format
-#| msgid "array index in initializer is not an integer constant expression"
msgid "accessing %qD member instead of initialized %qD member in constant expression"
msgstr "bộ sơ khởi chứa một chỉ mục mảng không phải là một biểu tượng hằng số nguyên"
@@ -34325,13 +33789,11 @@ msgstr ""
#: cp/semantics.c:7432
#, fuzzy, gcc-internal-format
-#| msgid "initializer element is not a constant expression"
msgid "the value of %qD is not usable in a constant expression"
msgstr "yếu tố sơ khởi không phải là một biểu tượng hằng số"
#: cp/semantics.c:7439
#, fuzzy, gcc-internal-format
-#| msgid "excess elements in union initializer"
msgid "%qD used in its own initializer"
msgstr "gặp yếu tố thừa trong bộ sơ khởi hợp"
@@ -34347,7 +33809,6 @@ msgstr ""
#: cp/semantics.c:7451
#, fuzzy, gcc-internal-format
-#| msgid "initializer element is not a constant expression"
msgid "%qD was not initialized with a constant expression"
msgstr "yếu tố sơ khởi không phải là một biểu tượng hằng số"
@@ -34368,21 +33829,18 @@ msgstr ""
#: cp/semantics.c:7552 cp/semantics.c:8355
#, fuzzy, gcc-internal-format
-#| msgid "Bad type in constant expression"
msgid "temporary of non-literal type %qT in a constant expression"
msgstr "Gặp loại saio trong biểu thức bất biến"
#: cp/semantics.c:7800 cp/semantics.c:8259 cp/semantics.c:8509
#, fuzzy, gcc-internal-format
-#| msgid "initializer element is not a constant expression"
msgid "expression %qE is not a constant-expression"
msgstr "yếu tố sơ khởi không phải là một biểu tượng hằng số"
#: cp/semantics.c:7805
#, fuzzy, gcc-internal-format
-#| msgid "Expected expression type"
msgid "unexpected expression %qE of kind %s"
-msgstr "Mong đợi một loại biểu thức"
+msgstr "cần một loại biểu thức"
#: cp/semantics.c:7836
#, gcc-internal-format
@@ -34416,33 +33874,28 @@ msgstr ""
#: cp/semantics.c:8284
#, fuzzy, gcc-internal-format
-#| msgid "initializer element is not a constant expression"
msgid "difference of two pointer expressions is not a constant expression"
msgstr "yếu tố sơ khởi không phải là một biểu tượng hằng số"
#: cp/semantics.c:8303
#, fuzzy, gcc-internal-format
-#| msgid "initializer element is not a constant expression"
msgid "pointer comparison expression is not a constant expression"
msgstr "yếu tố sơ khởi không phải là một biểu tượng hằng số"
#: cp/semantics.c:8404
#, fuzzy, gcc-internal-format
-#| msgid "initializer element is not a constant expression"
msgid "division by zero is not a constant-expression"
msgstr "yếu tố sơ khởi không phải là một biểu tượng hằng số"
#: cp/semantics.c:8517
#, fuzzy, gcc-internal-format
-#| msgid "nonconstant array index in initializer"
msgid "non-constant array initialization"
msgstr "bộ sơ khởi chứa một chỉ mục mảng không phải hằng số"
#: cp/semantics.c:8523
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "expected end of line"
+#, gcc-internal-format, gfc-internal-format
msgid "unexpected AST of kind %s"
-msgstr "mong đợi kết thúc dòng"
+msgstr "cần AST thuộc kiểu %s"
#: cp/semantics.c:9013
#, gcc-internal-format
@@ -34725,52 +34178,44 @@ msgid "%qE cannot be used as a function"
msgstr ""
#: cp/typeck.c:3346
-#, fuzzy, gcc-internal-format
-#| msgid "too many arguments to %%:version-compare"
+#, gcc-internal-format
msgid "too many arguments to constructor %q#D"
-msgstr "quá nhiá»u đối số tá»›i %%:version-compare"
+msgstr "quá nhiá»u đối số cho cấu tá»­ %q#D"
#: cp/typeck.c:3347
-#, fuzzy, gcc-internal-format
-#| msgid "too few arguments to %%:version-compare"
+#, gcc-internal-format
msgid "too few arguments to constructor %q#D"
-msgstr "quá ít đối số tới %%:version-compare"
+msgstr "quá ít đối số cho hủy tử %q#D"
#: cp/typeck.c:3352
-#, fuzzy, gcc-internal-format
-#| msgid "no arguments for spec function"
+#, gcc-internal-format
msgid "too many arguments to member function %q#D"
-msgstr "không có đối số tới hàm đặc tả"
+msgstr "quá nhiá»u đối số cho hàm thành viên %q#D"
#: cp/typeck.c:3353
-#, fuzzy, gcc-internal-format
-#| msgid "no arguments for spec function"
+#, gcc-internal-format
msgid "too few arguments to member function %q#D"
-msgstr "không có đối số tới hàm đặc tả"
+msgstr "quá ít đối số cho hàm thành viên %q#D"
#: cp/typeck.c:3359
-#, fuzzy, gcc-internal-format
-#| msgid "no arguments for spec function"
+#, gcc-internal-format
msgid "too many arguments to function %q#D"
-msgstr "không có đối số tới hàm đặc tả"
+msgstr "quá nhiá»u đối số cho hàm %q#D"
#: cp/typeck.c:3360
-#, fuzzy, gcc-internal-format
-#| msgid "no arguments for spec function"
+#, gcc-internal-format
msgid "too few arguments to function %q#D"
-msgstr "không có đối số tới hàm đặc tả"
+msgstr "quá ít đối số cho hàm %q#D"
#: cp/typeck.c:3370
-#, fuzzy, gcc-internal-format
-#| msgid "too many arguments to %%:version-compare"
+#, gcc-internal-format
msgid "too many arguments to method %q#D"
-msgstr "quá nhiá»u đối số tá»›i %%:version-compare"
+msgstr "quá nhiá»u đối số cho phÆ°Æ¡ng thức %q#D"
#: cp/typeck.c:3371
-#, fuzzy, gcc-internal-format
-#| msgid "too few arguments to %%:version-compare"
+#, gcc-internal-format
msgid "too few arguments to method %q#D"
-msgstr "quá ít đối số tới %%:version-compare"
+msgstr "quá ít đối số cho phương thức %q#D"
#: cp/typeck.c:3374
#, gcc-internal-format
@@ -35102,7 +34547,6 @@ msgstr ""
#: cp/typeck.c:6903
#, fuzzy, gcc-internal-format
-#| msgid "nonconstant array index in initializer"
msgid "assigning to an array from an initializer list"
msgstr "bộ sơ khởi chứa một chỉ mục mảng không phải hằng số"
@@ -35178,31 +34622,26 @@ msgstr ""
#: cp/typeck.c:7535
#, fuzzy, gcc-internal-format
-#| msgid "Warn about functions which might be candidates for format attributes"
msgid "parameter %qP of %qD might be a candidate for a format attribute"
msgstr "Cảnh báo vỠhàm có thể yêu cầu thuộc tính định dạng"
#: cp/typeck.c:7539
#, fuzzy, gcc-internal-format
-#| msgid "Warn about functions which might be candidates for format attributes"
msgid "parameter might be a candidate for a format attribute"
msgstr "Cảnh báo vỠhàm có thể yêu cầu thuộc tính định dạng"
#: cp/typeck.c:7544
#, fuzzy, gcc-internal-format
-#| msgid "Warn about functions which might be candidates for format attributes"
msgid "target of conversion might be a candidate for a format attribute"
msgstr "Cảnh báo vỠhàm có thể yêu cầu thuộc tính định dạng"
#: cp/typeck.c:7549
#, fuzzy, gcc-internal-format
-#| msgid "Warn about functions which might be candidates for format attributes"
msgid "target of initialization might be a candidate for a format attribute"
msgstr "Cảnh báo vỠhàm có thể yêu cầu thuộc tính định dạng"
#: cp/typeck.c:7559
#, fuzzy, gcc-internal-format
-#| msgid "Warn about functions which might be candidates for format attributes"
msgid "left-hand side of assignment might be a candidate for a format attribute"
msgstr "Cảnh báo vỠhàm có thể yêu cầu thuộc tính định dạng"
@@ -35433,7 +34872,6 @@ msgstr ""
#: cp/typeck2.c:471
#, fuzzy, gcc-internal-format
-#| msgid "<brace-enclosed initializer list>"
msgid "invalid use of brace-enclosed initializer list"
msgstr "<danh sách bộ sơ khởi nằm trong dấu ngoặc>"
@@ -35644,9 +35082,8 @@ msgstr ""
#: fortran/array.c:107
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Unexpected element '%c' in format string at %L"
msgid "Unexpected '*' in coarray subscript at %C"
-msgstr "Gặp yếu tố bất thÆ°á»ng « %c » trong chuá»—i định dạng tại %L"
+msgstr "Gặp yếu tố bất thÆ°á»ng '%c' trong chuá»—i định dạng tại %L"
#: fortran/array.c:131
#, gcc-internal-format, gfc-internal-format
@@ -38247,15 +37684,13 @@ msgstr ""
#: fortran/frontend-passes.c:377 fortran/frontend-passes.c:380
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "error in args to spec function '%s'"
msgid "Removing call to function '%s' at %L"
-msgstr "gặp lỗi trong các đối số tới hàm đặc tả « %s »"
+msgstr "gặp lỗi trong các đối số tới hàm đặc tả '%s'"
#: fortran/gfortranspec.c:170
#, fuzzy, gcc-internal-format
-#| msgid "overflowed output arg list for '%s'"
msgid "overflowed output arg list for %qs"
-msgstr "tràn danh sách đối số kết xuất cho « %s »"
+msgstr "tràn danh sách đối số kết xuất cho '%s'"
#: fortran/gfortranspec.c:330
#, gcc-internal-format
@@ -39550,9 +38985,8 @@ msgstr ""
#: fortran/match.c:1837
#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "Expected expression type"
msgid "Expected association at %C"
-msgstr "Mong đợi một loại biểu thức"
+msgstr "Cần một loại biểu thức"
#: fortran/match.c:1846
#, gcc-internal-format, gfc-internal-format
@@ -43962,7 +43396,7 @@ msgstr ""
#: fortran/symbol.c:1598
#, gcc-internal-format, gfc-internal-format
msgid "Fortran 2003: BIND(C) at %L"
-msgstr ""
+msgstr "Fortran 2003: BIND(C) tại %L"
#: fortran/symbol.c:1615
#, gcc-internal-format, gfc-internal-format
@@ -43972,7 +43406,7 @@ msgstr ""
#: fortran/symbol.c:1619
#, gcc-internal-format, gfc-internal-format
msgid "Fortran 2003: EXTENDS at %L"
-msgstr ""
+msgstr "Fortran 2003: EXTENDS tại %L"
#: fortran/symbol.c:1641
#, gcc-internal-format, gfc-internal-format
@@ -44017,7 +43451,7 @@ msgstr ""
#: fortran/symbol.c:1967
#, gcc-internal-format, gfc-internal-format
msgid "Symbol '%s' at %C is ambiguous"
-msgstr ""
+msgstr "Ký hiệu '%s' tại %C chưa rõ ràng"
#: fortran/symbol.c:1999
#, gcc-internal-format, gfc-internal-format
@@ -44360,17 +43794,17 @@ msgstr ""
#: fortran/trans-types.c:530
#, gcc-internal-format
msgid "REAL(KIND=8) is not available for -freal-4-real-8 option"
-msgstr ""
+msgstr "REAL(KIND=8) không phải là biến cho tùy chá»n -freal-4-real-8"
#: fortran/trans-types.c:537
#, gcc-internal-format
msgid "REAL(KIND=10) is not available for -freal-4-real-10 option"
-msgstr ""
+msgstr "REAL(KIND=10) không phải là biến cho tùy chá»n -freal-4-real-10"
#: fortran/trans-types.c:544
#, gcc-internal-format
msgid "REAL(KIND=16) is not available for -freal-4-real-16 option"
-msgstr ""
+msgstr "REAL(KIND=16) không phải là biến cho tùy chá»n -freal-4-real-16"
#: fortran/trans-types.c:558
#, gcc-internal-format
@@ -44380,17 +43814,17 @@ msgstr ""
#: fortran/trans-types.c:567
#, gcc-internal-format
msgid "REAL(KIND=4) is not available for -freal-8-real-4 option"
-msgstr ""
+msgstr "REAL(KIND=4) không phải là biến cho tùy chá»n -freal-8-real-4"
#: fortran/trans-types.c:574
#, gcc-internal-format
msgid "REAL(KIND=10) is not available for -freal-8-real-10 option"
-msgstr ""
+msgstr "REAL(KIND=10) không phải là biến cho tùy chá»n -freal-8-real-10"
#: fortran/trans-types.c:581
#, gcc-internal-format
msgid "REAL(KIND=10) is not available for -freal-8-real-16 option"
-msgstr ""
+msgstr "REAL(KIND=10) không phải là biến cho tùy chá»n -freal-8-real-16"
#: fortran/trans-types.c:1432
#, gcc-internal-format, gfc-internal-format
@@ -44475,7 +43909,7 @@ msgstr ""
#: java/expr.c:1690
#, gcc-internal-format
msgid "field %qs not found"
-msgstr ""
+msgstr "không tìm thấy trÆ°á»ng %qs"
#: java/expr.c:2249
#, gcc-internal-format, gfc-internal-format
@@ -44485,7 +43919,7 @@ msgstr ""
#: java/expr.c:2442
#, gcc-internal-format, gfc-internal-format
msgid "failed to find class '%s'"
-msgstr ""
+msgstr "không tìm thấy lớp '%s'"
#: java/expr.c:2483
#, gcc-internal-format, gfc-internal-format
@@ -44510,7 +43944,7 @@ msgstr ""
#: java/expr.c:2885
#, gcc-internal-format, gfc-internal-format
msgid "missing field '%s' in '%s'"
-msgstr ""
+msgstr "thiếu trÆ°á»ng '%s' trong '%s'"
#: java/expr.c:2892
#, gcc-internal-format, gfc-internal-format
@@ -44540,7 +43974,6 @@ msgstr ""
#. duplicate code from LOAD macro
#: java/expr.c:3549
#, fuzzy, gcc-internal-format
-#| msgid "unrecognized address"
msgid "unrecognized wide sub-instruction"
msgstr "không nhận ra địa chỉ"
@@ -44616,15 +44049,14 @@ msgid "no input file specified"
msgstr ""
#: java/jcf-parse.c:1885
-#, fuzzy, gcc-internal-format
-#| msgid "no input files"
+#, gcc-internal-format
msgid "can%'t close input file %s: %m"
-msgstr "không có tập tin nhập vào"
+msgstr "can%'t đóng tập tin đầu vào %s: %m"
#: java/jcf-parse.c:1928
#, gcc-internal-format, gfc-internal-format
msgid "bad zip/jar file %s"
-msgstr ""
+msgstr "tập tin zip/jar sai %s"
#: java/jcf-parse.c:2130
#, gcc-internal-format, gfc-internal-format
@@ -44632,21 +44064,19 @@ msgid "error while reading %s from zip file"
msgstr ""
#: java/jvspec.c:396
-#, fuzzy, gcc-internal-format
-#| msgid "can't specify '-D' without '--main'\n"
+#, gcc-internal-format
msgid "can%'t specify %<-D%> without %<--main%>"
-msgstr "không thể ghi rõ tùy chá»n « -D » mà không có « --main »\n"
+msgstr "can%'t chỉ định %<-D%> mà không có %<--main%>"
#: java/jvspec.c:399
-#, fuzzy, gcc-internal-format
-#| msgid "'%s' is not a valid class name"
+#, gcc-internal-format
msgid "%qs is not a valid class name"
-msgstr "« %s » không phải là một tên hạng đúng"
+msgstr "'%qs' không phải là một tên lớp đúng"
#: java/jvspec.c:405
#, gcc-internal-format
msgid "--resource requires -o"
-msgstr "« --resource » cũng yêu cầu « -o »"
+msgstr "'--resource' cũng yêu cầu '-o'"
#: java/jvspec.c:412
#, gcc-internal-format
@@ -44656,7 +44086,7 @@ msgstr ""
#: java/jvspec.c:419
#, gcc-internal-format
msgid "cannot specify both -C and -o"
-msgstr "không thể ghi rõ đồng thá»i hai tùy chá»n « --C » và « -o »"
+msgstr "không thể ghi rõ đồng thá»i hai tùy chá»n --C và -o"
#: java/jvspec.c:431
#, gcc-internal-format
@@ -44670,9 +44100,8 @@ msgstr "chÆ°a thá»±c hiện chức năng sá»­ dụng @FILE vá»›i nhiá»u tập t
#: java/jvspec.c:537
#, fuzzy, gcc-internal-format
-#| msgid "cannot specify 'main' class when not linking"
msgid "cannot specify %<main%> class when not linking"
-msgstr "không liên kết thì cũng không thể ghi rõ hạng « main » (chính)"
+msgstr "không liên kết thì cũng không thể ghi rõ hạng 'main' (chính)"
#: java/lang.c:583
#, gcc-internal-format
@@ -44727,31 +44156,29 @@ msgstr ""
#: lto/lto-lang.c:730
#, gcc-internal-format
msgid "-fwpa and -fltrans are mutually exclusive"
-msgstr ""
+msgstr "-fwpa và -fltrans loại trừ lẫn nhau"
#: lto/lto-object.c:112
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "options enabled: "
+#, gcc-internal-format, gfc-internal-format
msgid "open %s failed: %s"
-msgstr "tuỳ chá»n đã bật: "
+msgstr "mở %s gặp lỗi: %s"
#: lto/lto-object.c:153 lto/lto-object.c:186 lto/lto-object.c:284
#: lto/lto-object.c:341 lto/lto-object.c:365
#, gcc-internal-format, gfc-internal-format
msgid "%s: %s"
-msgstr ""
+msgstr "%s: %s"
#: lto/lto-object.c:155
#, gcc-internal-format, gfc-internal-format
msgid "%s: %s: %s"
-msgstr ""
+msgstr "%s: %s: %s"
# Literal: don't translate; Nghĩa chữ : dừng dịch
#: lto/lto-object.c:195
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "fclose %s"
+#, gcc-internal-format, gfc-internal-format
msgid "close: %s"
-msgstr "fclose %s"
+msgstr "close: %s"
#: lto/lto-object.c:252
#, gcc-internal-format, gfc-internal-format
@@ -44759,10 +44186,9 @@ msgid "two or more sections for %s"
msgstr ""
#: lto/lto.c:235
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "argument to '-%s' is missing"
+#, gcc-internal-format, gfc-internal-format
msgid "%s: section %s is missing"
-msgstr "đối số tới « -%s » còn thiếu"
+msgstr "%s: phần %s còn thiếu"
#: lto/lto.c:950
#, gcc-internal-format
@@ -44791,13 +44217,11 @@ msgstr ""
#: lto/lto.c:1043
#, fuzzy, gcc-internal-format
-#| msgid "invalid register in the instruction"
msgid "invalid line in the resolution file"
msgstr "lệnh chứa một thanh ghi sai"
#: lto/lto.c:1056
#, fuzzy, gcc-internal-format
-#| msgid "invalid register in the instruction"
msgid "invalid resolution in the resolution file"
msgstr "lệnh chứa một thanh ghi sai"
@@ -44812,22 +44236,19 @@ msgid "cannot read LTO decls from %s"
msgstr ""
#: lto/lto.c:1261
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "[cannot find %s]"
+#, gcc-internal-format, gfc-internal-format
msgid "Cannot open %s"
-msgstr "[không tìm thấy %s]"
+msgstr "Không thể mở %s"
#: lto/lto.c:1282
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "[cannot find %s]"
+#, gcc-internal-format, gfc-internal-format
msgid "Cannot map %s"
-msgstr "[không tìm thấy %s]"
+msgstr "Không thể map %s"
#: lto/lto.c:1293
-#, fuzzy, gcc-internal-format, gfc-internal-format
-#| msgid "[cannot find %s]"
+#, gcc-internal-format, gfc-internal-format
msgid "Cannot read %s"
-msgstr "[không tìm thấy %s]"
+msgstr "Không thể Ä‘á»c %s"
#: lto/lto.c:2272
#, gcc-internal-format
@@ -44842,7 +44263,7 @@ msgstr ""
#: lto/lto.c:2321
#, gcc-internal-format
msgid "lto_obj_file_open() failed"
-msgstr ""
+msgstr "lto_obj_file_open() gặp lỗi"
#: lto/lto.c:2347
#, gcc-internal-format
@@ -44856,7 +44277,6 @@ msgstr ""
#: lto/lto.c:2582
#, fuzzy, gcc-internal-format
-#| msgid "could not open response file %s"
msgid "could not open symbol resolution file: %m"
msgstr "không thể mở tập tin đáp ứng %s"
@@ -44972,7 +44392,6 @@ msgstr ""
#: objc/objc-act.c:890
#, fuzzy, gcc-internal-format
-#| msgid "derived type declaration"
msgid "invalid property declaration"
msgstr "lá»i tuyên bố loại có hÆ°á»›ng"
@@ -45015,7 +44434,6 @@ msgstr ""
#: objc/objc-act.c:1016
#, fuzzy, gcc-internal-format
-#| msgid "<declaration error>"
msgid "redeclaration of property %qD"
msgstr "<lỗi tuyên bố>"
@@ -45030,19 +44448,16 @@ msgstr ""
#: objc/objc-act.c:1081
#, fuzzy, gcc-internal-format
-#| msgid "Warn about global functions without previous declarations"
msgid "'nonatomic' attribute of property %qD conflicts with previous declaration"
msgstr "Cảnh báo vá» hàm toàn cục không có lá»i tuyên bố trÆ°á»›c"
#: objc/objc-act.c:1091
#, fuzzy, gcc-internal-format
-#| msgid "Warn about global functions without previous declarations"
msgid "'getter' attribute of property %qD conflicts with previous declaration"
msgstr "Cảnh báo vá» hàm toàn cục không có lá»i tuyên bố trÆ°á»›c"
#: objc/objc-act.c:1104
#, fuzzy, gcc-internal-format
-#| msgid "Warn about global functions without previous declarations"
msgid "'setter' attribute of property %qD conflicts with previous declaration"
msgstr "Cảnh báo vá» hàm toàn cục không có lá»i tuyên bố trÆ°á»›c"
@@ -45053,13 +44468,11 @@ msgstr ""
#: objc/objc-act.c:1126
#, fuzzy, gcc-internal-format
-#| msgid "Warn about global functions without previous declarations"
msgid "'readonly' attribute of property %qD conflicts with previous declaration"
msgstr "Cảnh báo vá» hàm toàn cục không có lá»i tuyên bố trÆ°á»›c"
#: objc/objc-act.c:1164
#, fuzzy, gcc-internal-format
-#| msgid "Warn about global functions without previous declarations"
msgid "type of property %qD conflicts with previous declaration"
msgstr "Cảnh báo vá» hàm toàn cục không có lá»i tuyên bố trÆ°á»›c"
@@ -45072,15 +44485,13 @@ msgstr ""
#. parser won't call this function if it is not. This is only a
#. double-check for safety.
#: objc/objc-act.c:1653
-#, fuzzy, gcc-internal-format
-#| msgid "could not find libgcc.a"
+#, gcc-internal-format
msgid "could not find class %qE"
-msgstr "không tìm thấy libgcc.a"
+msgstr "không tìm thấy lớp %qE"
#. Again, this should never happen, but we do check.
#: objc/objc-act.c:1661
#, fuzzy, gcc-internal-format
-#| msgid "could not find specs file %s\n"
msgid "could not find interface for class %qE"
msgstr "không tìm thấy tập tin đặc tả %s\n"
@@ -45220,12 +44631,12 @@ msgstr ""
#: objc/objc-act.c:3332
#, gcc-internal-format
msgid "cannot find class %qE"
-msgstr ""
+msgstr "không tìm thấy lớp %qE"
#: objc/objc-act.c:3334
#, gcc-internal-format
msgid "class %qE already exists"
-msgstr ""
+msgstr "lớp %qE đã có trước rồi"
#: objc/objc-act.c:3376 objc/objc-act.c:6829
#, gcc-internal-format
@@ -45487,7 +44898,6 @@ msgstr ""
#: objc/objc-act.c:6225
#, fuzzy, gcc-internal-format
-#| msgid "initialization of a flexible array member"
msgid "instance variable %qs uses flexible array member"
msgstr "đã sơ khởi một bộ phận mảng dẻo"
@@ -45601,7 +45011,6 @@ msgstr ""
#. TODO: This should be caught much earlier than this.
#: objc/objc-act.c:7377
#, fuzzy, gcc-internal-format
-#| msgid "invalid register in the move instruction"
msgid "invalid setter, it must have one argument"
msgstr "gặp thanh ghi sai trong lệnh di chuyển"
@@ -45648,7 +45057,7 @@ msgstr ""
#: objc/objc-act.c:7699
#, gcc-internal-format
msgid "%<@synthesize%> is not available in Objective-C 1.0"
-msgstr ""
+msgstr "%<@synthesize%> không sẵn dùng trong Objective-C 1.0"
#. We can get here only in Objective-C; the Objective-C++ parser
#. detects the problem while parsing, outputs the error
@@ -45672,7 +45081,7 @@ msgstr ""
#: objc/objc-act.c:7808
#, gcc-internal-format
msgid "%<@dynamic%> is not available in Objective-C 1.0"
-msgstr ""
+msgstr "%<@dynamic%> không sẵn dùng trong Objective-C 1.0"
#. We can get here only in Objective-C; the Objective-C++ parser
#. detects the problem while parsing, outputs the error
@@ -45745,11 +45154,9 @@ msgstr ""
#. should be impossible for real properties, which always
#. have a getter.
#: objc/objc-act.c:9424
-#, fuzzy, gcc-internal-format
-#| msgid "%d destructor found\n"
-#| msgid_plural "%d destructors found\n"
+#, gcc-internal-format
msgid "no %qs getter found"
-msgstr "Tìm thấy %d bộ hủy cấu trúc\n"
+msgstr "không tìm thấy getter %qs"
#: objc/objc-act.c:9664
#, gcc-internal-format
@@ -45785,7 +45192,7 @@ msgstr ""
#: objc/objc-gnu-runtime-abi-01.c:131
#, gcc-internal-format
msgid "%<-fobjc-gc%> is ignored for %<-fgnu-runtime%>"
-msgstr ""
+msgstr "%<-fobjc-gc%> bị lỠđi cho %<-fgnu-runtime%>"
#: objc/objc-gnu-runtime-abi-01.c:139
#, gcc-internal-format
@@ -45806,7 +45213,7 @@ msgstr ""
#: objc/objc-next-runtime-abi-02.c:244
#, gcc-internal-format
msgid "%<-fobjc-sjlj-exceptions%> is ignored for %<-fnext-runtime%> when %<-fobjc-abi-version%> >= 2"
-msgstr ""
+msgstr "%<-fobjc-sjlj-exceptions%> bị lỠđi cho %<-fnext-runtime%> khi %<-fobjc-abi-version%> >= 2"
#: objc/objc-runtime-shared-support.c:426
#, gcc-internal-format
@@ -45821,7 +45228,7 @@ msgstr ""
#~ "Please submit a full bug report.\n"
#~ "See %s for instructions."
#~ msgstr ""
-#~ "Gặp lỗi nội bộ : %s (chương trình %s)\n"
+#~ "Gặp lỗi nội bộ: %s (chương trình %s)\n"
#~ "Hãy gửi một báo cáo lỗi đầy đủ.\n"
#~ "Xem %s để tìm hướng dẫn."
@@ -45891,196 +45298,3 @@ msgstr ""
#~ msgid "invalid operand to %%V code"
#~ msgstr "sai lập toán hạng tới mã %%V"
-
-# Unsure of meaning; có nghĩa không chắc lắm
-#~ msgid " (frv)"
-#~ msgstr " (frv)"
-
-#~ msgid "invalid rotate insn"
-#~ msgstr "lệnh quay sai"
-
-#~ msgid "registers IX, IY and Z used in the same INSN"
-#~ msgstr "sử dụng ba thanh ghi IX, IY, Z trong cùng một lệnh"
-
-#~ msgid "cannot do z-register replacement"
-#~ msgstr "không thể làm sự thay thế thanh ghi Z"
-
-#~ msgid "invalid Z register replacement for insn"
-#~ msgstr "lệnh chứa một sự thay thế thanh ghi Z sai"
-
-#~ msgid "UNKNOWN in print_operand !?"
-#~ msgstr "KHÔNG RÕ trong print_operand !?"
-
-#~ msgid "%s:%d:%d: instantiated from here"
-#~ msgstr "%s:%d:%d: lần tạo từ đây"
-
-#~ msgid "%s:%d: instantiated from here"
-#~ msgstr "%s:%d: lần tạo từ đây"
-
-#~ msgid "argument to '%s' missing\n"
-#~ msgstr "thiếu đối số tới « %s »\n"
-
-#~ msgid "argument to '%s' missing"
-#~ msgstr "thiếu đối số tới « %s »"
-
-#~ msgid "Warning: Using -M <directory> is deprecated, use -J instead\n"
-#~ msgstr "Cảnh báo : dùng « -M <thư_mục> » bị phản đối: nên dùng « -J » để thay thế\n"
-
-#~ msgid "internal error: bad hash value in dynamic dispatch"
-#~ msgstr "gặp lá»—i ná»™i bá»™ : giá trị chuá»—i duy nhất sai trong Ä‘iá»u vận năng Ä‘á»™ng"
-
-#~ msgid "Array bound mismatch"
-#~ msgstr "Biên giới mảng không tương ứng"
-
-#~ msgid "Attempt to allocate negative amount of memory. Possible integer overflow"
-#~ msgstr "Thử cấp phát một vùng nhớ âm. Có thể tràn số nguyên"
-
-#~ msgid "Out of memory"
-#~ msgstr "Không đủ bộ nhớ"
-
-#~ msgid "Attempt to allocate a negative amount of memory."
-#~ msgstr "Äang thá»­ cấp phát má»™t vùng nhá»› âm."
-
-#~ msgid "ax ; {int $0x80 | syscall"
-#~ msgstr "ax ; {int $0x80 | cuá»™c_gá»i_hệ_thống"
-
-#~ msgid "GCC does not support -C or -CC without -E"
-#~ msgstr "GCC không hỗ trợ « -C » hoặc « -CC » mà không có « -E »"
-
-#~ msgid "Static linking is not supported."
-#~ msgstr "Không hỗ trợ chức năng liên kết tĩnh."
-
-#~ msgid "mno-cygwin and mno-win32 are not compatible"
-#~ msgstr "hai tùy chá»n « mno-cygwin » và « mno-win32 » không tÆ°Æ¡ng thích vá»›i nhau"
-
-#~ msgid "consider using `-pg' instead of `-p' with gprof(1) "
-#~ msgstr "sử dụng gprof(1) thì đỠnghị bạn sử dụng « -pg » thay cho « -p »"
-
-#~ msgid "`-mno-intel-syntax' is deprecated. Use `-masm=att' instead."
-#~ msgstr "« -mno-intel-syntax » bị phản đối. Hãy sử dụng « -masm=att » để thay thế."
-
-#~ msgid "Dump a core file when a runtime error occurs"
-#~ msgstr "Gặp lỗi lúc chạy thì đổ một tập tin lõi"
-
-#~ msgid "Enable fused multiply/add instructions"
-#~ msgstr "Hiệu lực câu lệnh nhân/cộng hợp nhau"
-
-#~ msgid "Enable fused multiply/add and multiply/subtract instructions"
-#~ msgstr "Hiệu lực câu lệnh hợp nhau loại nhân/cộng và nhân/trừ"
-
-#~ msgid "! It would be better to auto-generate this file."
-#~ msgstr "! Tốt hơn nếu tự động tạo ra tập tin này."
-
-#~ msgid "SYMBOL_VECTOR=(__divdi3=PROCEDURE)"
-#~ msgstr "VÉC_TÆ -KÃ_HIỆU=(__divdi3=THỦ_TỤC)"
-
-#~ msgid "Generate code for little-endian"
-#~ msgstr "Tạo ra mã cho tình trạng cuối nhá»"
-
-#~ msgid "Generate code for big-endian"
-#~ msgstr "Tạo ra mã cho tình trạng cuối lớn"
-
-#~ msgid "Enable automatic generation of fused floating point multiply-add instructions"
-#~ msgstr "Hiệu lực khả năng tự động tạo ra câu lệnh nhân-cộng loại điểm phù động hợp nhau"
-
-#~ msgid "Use the Cygwin interface"
-#~ msgstr "Sử dụng giao diện Cygwin"
-
-#~ msgid "-mabi=\tSpecify ABI to use"
-#~ msgstr "-mabi=\tGhi rõ ABI cần sử dụng"
-
-#~ msgid "Prepend the name of the cpu to all public symbol names"
-#~ msgstr "Phụ thêm tên CPU vào tất cả các tên ký hiệu công cộng"
-
-#~ msgid "-mcpu=CPU\tCompile code for ARC variant CPU"
-#~ msgstr "-mcpu=CPU\tBiên dịch mã cho CPU biến thế ARC"
-
-#~ msgid "-mtext=SECTION\tPut functions in SECTION"
-#~ msgstr "-mtext=PHẦN\tÄể các hàm vào phần này"
-
-#~ msgid "-mdata=SECTION\tPut data in SECTION"
-#~ msgstr "-mdata=PHẦN\tÄể dữ liệu vào phần này"
-
-#~ msgid "-mrodata=SECTION\tPut read-only data in SECTION"
-#~ msgstr "-mrodata=PHẦN\tÄể dữ liệu chỉ-Ä‘á»c vào phần này"
-
-#~ msgid "Alias for -mfloat-abi=hard"
-#~ msgstr "Bí danh cho « -mfloat-abi=hard »"
-
-#~ msgid "Alias for -mfloat-abi=soft"
-#~ msgstr "Bí danh cho « -mfloat-abi=soft »"
-
-#~ msgid "Use 16-bit abs patterns"
-#~ msgstr "Sử dụng mẫu tuyệt đối 16-bit"
-
-#~ msgid "Restrict doloop to the given nesting level"
-#~ msgstr "Hạn chế doloop thành cấp lồng nhau đưa ra"
-
-#~ msgid "Enable fused multiply/add and multiply/subtract FP instructions"
-#~ msgstr "Hiệu lực câu lệnh nhân/cộng và nhân/trừ loại điểm phù động hợp nhau"
-
-#~ msgid "Use the mips-tfile postpass"
-#~ msgstr "Sử dụng postpass loại mips-tfile"
-
-#~ msgid "Compile for a 68HC11"
-#~ msgstr "Biên dịch cho một 68HC11"
-
-#~ msgid "Compile for a 68HC12"
-#~ msgstr "Biên dịch cho một 68HC12"
-
-#~ msgid "Compile for a 68HCS12"
-#~ msgstr "Biên dịch cho một 68HCS12"
-
-#~ msgid "Auto pre/post decrement increment allowed"
-#~ msgstr "Cho phép tá»± Ä‘á»™ng tiá»n/hậu giảm/tăng dần"
-
-#~ msgid "Min/max instructions allowed"
-#~ msgstr "Cho phép câu lệnh tối đa/thiểu"
-
-#~ msgid "Use call and rtc for function calls and returns"
-#~ msgstr "Sá»­ dụng call và rtc cho cuá»™c gá»i và cuá»™c trả lại của hàm"
-
-#~ msgid "Auto pre/post decrement increment not allowed"
-#~ msgstr "Không cho phép tá»± Ä‘á»™ng tiá»n/hậu tăng/giảm dần"
-
-#~ msgid "Use jsr and rts for function calls and returns"
-#~ msgstr "Sá»­ dụng jsr và rts cho cuá»™c gá»i và cuá»™c trả lại của hàm"
-
-#~ msgid "Min/max instructions not allowed"
-#~ msgstr "Không cho phép câu lệnh tối đa/thiểu"
-
-#~ msgid "Use direct addressing mode for soft registers"
-#~ msgstr "Sá»­ dụng chế Ä‘á»™ đặt địa chỉ trá»±c tiếp cho thanh ghi má»m"
-
-#~ msgid "Compile with 32-bit integer mode"
-#~ msgstr "Biên dịch với chế độ số nguyên 32-bit"
-
-#~ msgid "Specify the register allocation order"
-#~ msgstr "Ghi rõ thứ tự cấp phát thanh ghi"
-
-#~ msgid "Do not use direct addressing mode for soft registers"
-#~ msgstr "Äừng sá»­ dụng chế Ä‘á»™ đặt địa chỉ trá»±c tiếp cho thanh ghi má»m"
-
-#~ msgid "Compile with 16-bit integer mode"
-#~ msgstr "Biên dịch với chế độ số nguyên 16-bit"
-
-#~ msgid "Indicate the number of soft registers available"
-#~ msgstr "Ngụ ý số các thanh ghi má»m còn sẵn sàng"
-
-#~ msgid "Support SCORE 5 ISA"
-#~ msgstr "Hỗ trợ SCORE 5 ISA"
-
-#~ msgid "Support SCORE 5U ISA"
-#~ msgstr "Hỗ trợ SCORE 5U ISA"
-
-#~ msgid "Support SCORE 3 ISA"
-#~ msgstr "Hỗ trợ SCORE 3 ISA"
-
-#~ msgid "Support SCORE 3d ISA"
-#~ msgstr "Hỗ trợ SCORE 3d ISA"
-
-#~ msgid "Use GNU libc instead of uClibc"
-#~ msgstr "Sử dụng thư viện libc của GNU thay cho uClibc"
-
-#~ msgid "Alias for -mcpu."
-#~ msgstr "Bí danh cho « -mcpu »."
diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c
index 526b2f29697..57d531d879c 100644
--- a/gcc/print-rtl.c
+++ b/gcc/print-rtl.c
@@ -811,11 +811,27 @@ print_rtl (FILE *outf, const_rtx rtx_first)
int
print_rtl_single (FILE *outf, const_rtx x)
{
+ return print_rtl_single_with_indent (outf, x, 0);
+}
+
+/* Like print_rtl_single, except specify a file and indentation. */
+
+int
+print_rtl_single_with_indent (FILE *outf, const_rtx x, int ind)
+{
+ int old_indent = indent;
+ char *s_indent = (char *) alloca ((size_t) ind + 1);
+ memset ((void *) s_indent, ' ', (size_t) ind);
+ s_indent[ind] = '\0';
+
+ indent = ind;
outfile = outf;
sawclose = 0;
+ fputs (s_indent, outfile);
fputs (print_rtx_head, outfile);
print_rtx (x);
putc ('\n', outf);
+ indent = old_indent;
return 1;
}
diff --git a/gcc/read-rtl.c b/gcc/read-rtl.c
index 71ecf537642..30c2fb69484 100644
--- a/gcc/read-rtl.c
+++ b/gcc/read-rtl.c
@@ -684,11 +684,8 @@ validate_const_int (const char *string)
static void
record_iterator_use (struct mapping *iterator, void *ptr)
{
- struct iterator_use *iuse;
-
- iuse = VEC_safe_push (iterator_use, heap, iterator_uses, NULL);
- iuse->iterator = iterator;
- iuse->ptr = ptr;
+ struct iterator_use iuse = {iterator, ptr};
+ VEC_safe_push (iterator_use, heap, iterator_uses, iuse);
}
/* Record that PTR uses attribute VALUE, which must match a built-in
@@ -698,12 +695,8 @@ static void
record_attribute_use (struct iterator_group *group, void *ptr,
const char *value)
{
- struct attribute_use *ause;
-
- ause = VEC_safe_push (attribute_use, heap, attribute_uses, NULL);
- ause->group = group;
- ause->value = value;
- ause->ptr = ptr;
+ struct attribute_use ause = {group, value, ptr};
+ VEC_safe_push (attribute_use, heap, attribute_uses, ause);
}
/* Interpret NAME as either a built-in value, iterator or attribute
diff --git a/gcc/ree.c b/gcc/ree.c
index 1d0f1949b80..99ecd578097 100644
--- a/gcc/ree.c
+++ b/gcc/ree.c
@@ -816,11 +816,8 @@ add_removable_extension (const_rtx expr, rtx insn,
/* Then add the candidate to the list and insert the reaching definitions
into the definition map. */
- cand = VEC_safe_push (ext_cand, heap, *insn_list, NULL);
- cand->expr = expr;
- cand->code = code;
- cand->mode = mode;
- cand->insn = insn;
+ ext_cand e = {expr, code, mode, insn};
+ VEC_safe_push (ext_cand, heap, *insn_list, e);
idx = VEC_length (ext_cand, *insn_list);
for (def = defs; def; def = def->next)
diff --git a/gcc/reload.c b/gcc/reload.c
index f4f3ed03d85..2e41ed6498e 100644
--- a/gcc/reload.c
+++ b/gcc/reload.c
@@ -2036,7 +2036,12 @@ find_dummy_reload (rtx real_in, rtx real_out, rtx *inloc, rtx *outloc,
However, we only ignore IN in its role as this reload.
If the insn uses IN elsewhere and it contains OUT,
that counts. We can't be sure it's the "same" operand
- so it might not go through this reload. */
+ so it might not go through this reload.
+
+ We also need to avoid using OUT if it, or part of it, is a
+ fixed register. Modifying such registers, even transiently,
+ may have undefined effects on the machine, such as modifying
+ the stack pointer. */
saved_rtx = *inloc;
*inloc = const0_rtx;
@@ -2049,7 +2054,8 @@ find_dummy_reload (rtx real_in, rtx real_out, rtx *inloc, rtx *outloc,
for (i = 0; i < nwords; i++)
if (! TEST_HARD_REG_BIT (reg_class_contents[(int) rclass],
- regno + i))
+ regno + i)
+ || fixed_regs[regno + i])
break;
if (i == nwords)
diff --git a/gcc/reload1.c b/gcc/reload1.c
index 77c7ba0911a..1bcdfad9377 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -659,15 +659,12 @@ grow_reg_equivs (void)
int old_size = VEC_length (reg_equivs_t, reg_equivs);
int max_regno = max_reg_num ();
int i;
+ reg_equivs_t ze;
+ memset (&ze, 0, sizeof (reg_equivs_t));
VEC_reserve (reg_equivs_t, gc, reg_equivs, max_regno);
for (i = old_size; i < max_regno; i++)
- {
- VEC_quick_insert (reg_equivs_t, reg_equivs, i, 0);
- memset (&VEC_index (reg_equivs_t, reg_equivs, i), 0,
- sizeof (reg_equivs_t));
- }
-
+ VEC_quick_insert (reg_equivs_t, reg_equivs, i, ze);
}
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 42378b9f69f..cf52efb6389 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -33,11 +33,6 @@ along with GCC; see the file COPYING3. If not see
#include "hashtab.h"
#include "flags.h"
-#undef FFS /* Some systems predefine this symbol; don't let it interfere. */
-#undef FLOAT /* Likewise. */
-#undef ABS /* Likewise. */
-#undef PC /* Likewise. */
-
/* Value used by some passes to "recognize" noop moves as valid
instructions. */
#define NOOP_MOVE_INSN_CODE INT_MAX
@@ -2513,6 +2508,7 @@ extern void print_mem_expr (FILE *, const_tree);
extern void print_rtl (FILE *, const_rtx);
extern void print_simple_rtl (FILE *, const_rtx);
extern int print_rtl_single (FILE *, const_rtx);
+extern int print_rtl_single_with_indent (FILE *, const_rtx, int);
extern void print_inline_rtx (FILE *, const_rtx, int);
/* In function.c */
diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c
index 1f1095ecfed..2a7a17066f6 100644
--- a/gcc/sel-sched-ir.c
+++ b/gcc/sel-sched-ir.c
@@ -1542,7 +1542,7 @@ insert_in_history_vect (VEC (expr_history_def, heap) **pvect,
vinsn_attach (old_expr_vinsn);
vinsn_attach (new_expr_vinsn);
- VEC_safe_insert (expr_history_def, heap, vect, ind, &temp);
+ VEC_safe_insert (expr_history_def, heap, vect, ind, temp);
*pvect = vect;
}
diff --git a/gcc/stmt.c b/gcc/stmt.c
index 8d76b3eea08..b64b0807433 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -52,7 +52,7 @@ along with GCC; see the file COPYING3. If not see
#include "regs.h"
#include "alloc-pool.h"
#include "pretty-print.h"
-#include "bitmap.h"
+#include "pointer-set.h"
#include "params.h"
#include "dumpfile.h"
@@ -113,9 +113,6 @@ static int node_has_low_bound (case_node_ptr, tree);
static int node_has_high_bound (case_node_ptr, tree);
static int node_is_bounded (case_node_ptr, tree);
static void emit_case_nodes (rtx, case_node_ptr, rtx, tree);
-static struct case_node *add_case_node (struct case_node *, tree,
- tree, tree, tree, alloc_pool);
-
/* Return the rtx-label that corresponds to a LABEL_DECL,
creating it if necessary. */
@@ -1650,31 +1647,34 @@ expand_stack_restore (tree var)
emit_stack_restore (SAVE_BLOCK, sa);
fixup_args_size_notes (prev, get_last_insn (), 0);
}
+
+/* Generate code to jump to LABEL if OP0 and OP1 are equal in mode MODE. */
+static void
+do_jump_if_equal (enum machine_mode mode, rtx op0, rtx op1, rtx label,
+ int unsignedp)
+{
+ do_compare_rtx_and_jump (op0, op1, EQ, unsignedp, mode,
+ NULL_RTX, NULL_RTX, label, -1);
+}
/* Do the insertion of a case label into case_list. The labels are
fed to us in descending order from the sorted vector of case labels used
in the tree part of the middle end. So the list we construct is
- sorted in ascending order. The bounds on the case range, LOW and HIGH,
- are converted to case's index type TYPE. Note that the original type
- of the case index in the source code is usually "lost" during
- gimplification due to type promotion, but the case labels retain the
- original type. */
+ sorted in ascending order. */
static struct case_node *
-add_case_node (struct case_node *head, tree type, tree low, tree high,
+add_case_node (struct case_node *head, tree low, tree high,
tree label, alloc_pool case_node_pool)
{
struct case_node *r;
gcc_checking_assert (low);
- gcc_checking_assert (! high || (TREE_TYPE (low) == TREE_TYPE (high)));
+ gcc_checking_assert (high && (TREE_TYPE (low) == TREE_TYPE (high)));
- /* Add this label to the chain. Make sure to drop overflow flags. */
+ /* Add this label to the chain. */
r = (struct case_node *) pool_alloc (case_node_pool);
- r->low = build_int_cst_wide (type, TREE_INT_CST_LOW (low),
- TREE_INT_CST_HIGH (low));
- r->high = build_int_cst_wide (type, TREE_INT_CST_LOW (high),
- TREE_INT_CST_HIGH (high));
+ r->low = low;
+ r->high = high;
r->code_label = label;
r->parent = r->left = NULL;
r->right = head;
@@ -1952,17 +1952,10 @@ expand_case (gimple stmt)
rtx default_label = NULL_RTX;
unsigned int count, uniq;
int i;
- rtx before_case, end;
int ncases = gimple_switch_num_labels (stmt);
tree index_expr = gimple_switch_index (stmt);
tree index_type = TREE_TYPE (index_expr);
-
tree elt;
- bitmap label_bitmap;
-
- /* The insn after which the case dispatch should finally
- be emitted. Zero for a dummy. */
- rtx start;
/* A list of case labels; it is first built as a list and it may then
be rearranged into a nearly balanced binary tree. */
@@ -2005,17 +1998,15 @@ expand_case (gimple stmt)
how to expand this switch(). */
uniq = 0;
count = 0;
- label_bitmap = BITMAP_ALLOC (NULL);
+ struct pointer_set_t *seen_labels = pointer_set_create ();
for (i = gimple_switch_num_labels (stmt) - 1; i >= 1; --i)
{
- tree low, high;
- rtx lab;
-
elt = gimple_switch_label (stmt, i);
- low = CASE_LOW (elt);
+ tree low = CASE_LOW (elt);
gcc_assert (low);
- high = CASE_HIGH (elt);
+ tree high = CASE_HIGH (elt);
gcc_assert (! high || tree_int_cst_lt (low, high));
+ tree lab = CASE_LABEL (elt);
/* Count the elements.
A range counts double, since it requires two compares. */
@@ -2025,20 +2016,35 @@ expand_case (gimple stmt)
/* If we have not seen this label yet, then increase the
number of unique case node targets seen. */
- lab = label_rtx (CASE_LABEL (elt));
- if (bitmap_set_bit (label_bitmap, CODE_LABEL_NUMBER (lab)))
+ if (!pointer_set_insert (seen_labels, lab))
uniq++;
+ /* The bounds on the case range, LOW and HIGH, have to be converted
+ to case's index type TYPE. Note that the original type of the
+ case index in the source code is usually "lost" during
+ gimplification due to type promotion, but the case labels retain the
+ original type. Make sure to drop overflow flags. */
+ low = fold_convert (index_type, low);
+ if (TREE_OVERFLOW (low))
+ low = build_int_cst_wide (index_type,
+ TREE_INT_CST_LOW (low),
+ TREE_INT_CST_HIGH (low));
+
/* The canonical from of a case label in GIMPLE is that a simple case
has an empty CASE_HIGH. For the casesi and tablejump expanders,
the back ends want simple cases to have high == low. */
if (! high)
high = low;
-
- case_list = add_case_node (case_list, index_type, low, high,
- CASE_LABEL (elt), case_node_pool);
+ high = fold_convert (index_type, high);
+ if (TREE_OVERFLOW (high))
+ high = build_int_cst_wide (index_type,
+ TREE_INT_CST_LOW (high),
+ TREE_INT_CST_HIGH (high));
+
+ case_list = add_case_node (case_list, low, high, lab,
+ case_node_pool);
}
- BITMAP_FREE (label_bitmap);
+ pointer_set_destroy (seen_labels);
/* cleanup_tree_cfg removes all SWITCH_EXPR with a single
destination, such as one with a default case only.
@@ -2046,7 +2052,7 @@ expand_case (gimple stmt)
type, so we should never get a zero here. */
gcc_assert (count > 0);
- before_case = start = get_last_insn ();
+ rtx before_case = get_last_insn ();
/* Decide how to expand this switch.
The two options at this point are a dispatch table (casesi or
@@ -2060,23 +2066,108 @@ expand_case (gimple stmt)
case_list, default_label,
minval, maxval, range);
- before_case = NEXT_INSN (before_case);
- end = get_last_insn ();
- reorder_insns (before_case, end, start);
+ reorder_insns (NEXT_INSN (before_case), get_last_insn (), before_case);
free_temp_slots ();
free_alloc_pool (case_node_pool);
}
-/* Generate code to jump to LABEL if OP0 and OP1 are equal in mode MODE. */
+/* Expand the dispatch to a short decrement chain if there are few cases
+ to dispatch to. Likewise if neither casesi nor tablejump is available,
+ or if flag_jump_tables is set. Otherwise, expand as a casesi or a
+ tablejump. The index mode is always the mode of integer_type_node.
+ Trap if no case matches the index.
-static void
-do_jump_if_equal (enum machine_mode mode, rtx op0, rtx op1, rtx label,
- int unsignedp)
+ DISPATCH_INDEX is the index expression to switch on. It should be a
+ memory or register operand.
+
+ DISPATCH_TABLE is a set of case labels. The set should be sorted in
+ ascending order, be contiguous, starting with value 0, and contain only
+ single-valued case labels. */
+
+void
+expand_sjlj_dispatch_table (rtx dispatch_index,
+ VEC(tree,heap) *dispatch_table)
{
- do_compare_rtx_and_jump (op0, op1, EQ, unsignedp, mode,
- NULL_RTX, NULL_RTX, label, -1);
+ tree index_type = integer_type_node;
+ enum machine_mode index_mode = TYPE_MODE (index_type);
+
+ int ncases = VEC_length (tree, dispatch_table);
+
+ do_pending_stack_adjust ();
+ rtx before_case = get_last_insn ();
+
+ /* Expand as a decrement-chain if there are 5 or fewer dispatch
+ labels. This covers more than 98% of the cases in libjava,
+ and seems to be a reasonable compromise between the "old way"
+ of expanding as a decision tree or dispatch table vs. the "new
+ way" with decrement chain or dispatch table. */
+ if (VEC_length (tree, dispatch_table) <= 5
+ || (!HAVE_casesi && !HAVE_tablejump)
+ || !flag_jump_tables)
+ {
+ /* Expand the dispatch as a decrement chain:
+
+ "switch(index) {case 0: do_0; case 1: do_1; ...; case N: do_N;}"
+
+ ==>
+
+ if (index == 0) do_0; else index--;
+ if (index == 0) do_1; else index--;
+ ...
+ if (index == 0) do_N; else index--;
+
+ This is more efficient than a dispatch table on most machines.
+ The last "index--" is redundant but the code is trivially dead
+ and will be cleaned up by later passes. */
+ rtx index = copy_to_mode_reg (index_mode, dispatch_index);
+ rtx zero = CONST0_RTX (index_mode);
+ for (int i = 0; i < ncases; i++)
+ {
+ tree elt = VEC_index (tree, dispatch_table, i);
+ rtx lab = label_rtx (CASE_LABEL (elt));
+ do_jump_if_equal (index_mode, index, zero, lab, 0);
+ force_expand_binop (index_mode, sub_optab,
+ index, CONST1_RTX (index_mode),
+ index, 0, OPTAB_DIRECT);
+ }
+ }
+ else
+ {
+ /* Similar to expand_case, but much simpler. */
+ struct case_node *case_list = 0;
+ alloc_pool case_node_pool = create_alloc_pool ("struct sjlj_case pool",
+ sizeof (struct case_node),
+ ncases);
+ tree index_expr = make_tree (index_type, dispatch_index);
+ tree minval = build_int_cst (index_type, 0);
+ tree maxval = CASE_LOW (VEC_last (tree, dispatch_table));
+ tree range = maxval;
+ rtx default_label = gen_label_rtx ();
+
+ for (int i = ncases - 1; i > 0; --i)
+ {
+ tree elt = VEC_index (tree, dispatch_table, i);
+ tree low = CASE_LOW (elt);
+ tree lab = CASE_LABEL (elt);
+ case_list = add_case_node (case_list, low, low, lab, case_node_pool);
+ }
+
+ emit_case_dispatch_table (index_expr, index_type,
+ case_list, default_label,
+ minval, maxval, range);
+ emit_label (default_label);
+ free_alloc_pool (case_node_pool);
+ }
+
+ /* Dispatching something not handled? Trap! */
+ expand_builtin_trap ();
+
+ reorder_insns (NEXT_INSN (before_case), get_last_insn (), before_case);
+
+ free_temp_slots ();
}
+
/* Take an ordered list of case nodes
and transform them into a near optimal binary tree,
diff --git a/gcc/system.h b/gcc/system.h
index 48c9c894e34..ed36bae3e3b 100644
--- a/gcc/system.h
+++ b/gcc/system.h
@@ -638,6 +638,11 @@ extern int vsnprintf(char *, size_t, const char *, va_list);
/* Get libiberty declarations. */
#include "libiberty.h"
+#undef FFS /* Some systems predefine this symbol; don't let it interfere. */
+#undef FLOAT /* Likewise. */
+#undef ABS /* Likewise. */
+#undef PC /* Likewise. */
+
/* Provide a default for the HOST_BIT_BUCKET.
This suffices for POSIX-like hosts. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c977af8f3aa..4b68ef8d9e9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,278 @@
+2012-09-16 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/54594
+ * gfortran.dg/typebound_generic_14.f03: New.
+
+2012-09-16 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/54387
+ * gfortran.dg/proc_ptr_38.f90: New.
+
+2012-09-16 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
+
+ PR debug/54460
+ * g++.dg/debug/dwarf2/nested-3.C: Add hppa assembler comment character
+ to scary regexp.
+
+ PR testsuite/54007
+ * gnat.dg/lto15.adb: Require lto.
+
+ * gfortran.dg/bind_c_array_params_2.f90: Adjust scan-assembler-times
+ "myBindC" for hppa*-*-hpux*.
+
+2012-09-16 Mikael Morin <mikael@gcc.gnu.org>
+
+ * gfortran.dg/namelist_75.f90: New test.
+
+2012-09-15 Tom de Vries <tom@codesourcery.com>
+
+ * gcc.dg/tree-ssa/vrp82.c: New test.
+ * gcc.dg/tree-ssa/vrp83.c: Same.
+ * gcc.dg/tree-ssa/vrp84.c: Same.
+
+2012-09-15 Tom de Vries <tom@codesourcery.com>
+
+ * gcc.dg/tree-ssa/vrp80-2.c: Rename to ...
+ * gcc.dg/tree-ssa/vrp81.c: ... this.
+
+2012-09-15 Georg-Johann Lay <avr@gjlay.de>
+
+ PR target/54222
+ * gcc.target/avr/torture/fix-types.h: New.
+ * gcc.target/avr/torture/vals-hr.def: New.
+ * gcc.target/avr/torture/vals-r.def: New.
+ * gcc.target/avr/torture/vals-k.def: New.
+ * gcc.target/avr/torture/vals-ur.def: New.
+ * gcc.target/avr/torture/vals-uk.def: New.
+ * gcc.target/avr/torture/vals-uhr.def: New.
+ * gcc.target/avr/torture/vals-llk.def: New.
+ * gcc.target/avr/torture/vals-ullk.def: New.
+ * gcc.target/avr/torture/sat-hr-plus-minus.c: New.
+ * gcc.target/avr/torture/sat-r-plus-minus.c: New.
+ * gcc.target/avr/torture/sat-k-plus-minus.c: New.
+ * gcc.target/avr/torture/sat-ur-plus-minus.c: New.
+ * gcc.target/avr/torture/sat-uk-plus-minus.c: New.
+ * gcc.target/avr/torture/sat-uhr-plus-minus.c: New.
+ * gcc.target/avr/torture/sat-llk-plus-minus.c: New.
+ * gcc.target/avr/torture/sat-ullk-plus-minus.c: New.
+
+2012-09-14 Dehao Chen <dehao@google.com>
+
+ * g++.dg/debug/dwarf2/deallocator.C: New test.
+
+2012-09-14 Joseph Myers <joseph@codesourcery.com>
+
+ PR c/54552
+ * gcc.c-torture/compile/pr54552-1.c: New test.
+
+2012-09-14 Marc Glisse <marc.glisse@inria.fr>
+
+ PR c++/54427
+ * g++.dg/other/vector-compare.C: New testcase.
+ * gcc/testsuite/c-c++-common/vector-compare-3.c: New testcase.
+ * gcc.dg/vector-shift.c: Move ...
+ * c-c++-common/vector-shift.c: ... here.
+ * gcc.dg/vector-shift1.c: Move ...
+ * c-c++-common/vector-shift1.c: ... here.
+ * gcc.dg/vector-shift3.c: Move ...
+ * c-c++-common/vector-shift3.c: ... here.
+ * gcc.dg/vector-compare-1.c: Move ...
+ * c-c++-common/vector-compare-1.c: ... here.
+ * gcc.dg/vector-compare-2.c: Move ...
+ * c-c++-common/vector-compare-2.c: ... here.
+ * gcc.c-torture/execute/vector-compare-1.c: Move ...
+ * c-c++-common/torture/vector-compare-1.c: ... here.
+ * gcc.c-torture/execute/vector-compare-2.x: Delete.
+ * gcc.c-torture/execute/vector-compare-2.c: Move ...
+ * c-c++-common/torture/vector-compare-2.c: ... here.
+ * gcc.c-torture/execute/vector-shift.c: Move ...
+ * c-c++-common/torture/vector-shift.c: ... here.
+ * gcc.c-torture/execute/vector-shift2.c: Move ...
+ * c-c++-common/torture/vector-shift2.c: ... here.
+ * gcc.c-torture/execute/vector-subscript-1.c: Move ...
+ * c-c++-common/torture/vector-subscript-1.c: ... here.
+ * gcc.c-torture/execute/vector-subscript-2.c: Move ...
+ * c-c++-common/torture/vector-subscript-2.c: ... here.
+ * gcc.c-torture/execute/vector-subscript-3.c: Move ...
+ * c-c++-common/torture/vector-subscript-3.c: ... here.
+
+2012-09-14 Joseph Myers <joseph@codesourcery.com>
+
+ PR c/54103
+ * gcc.c-torture/compile/pr54103-1.c,
+ gcc.c-torture/compile/pr54103-2.c,
+ gcc.c-torture/compile/pr54103-3.c,
+ gcc.c-torture/compile/pr54103-4.c,
+ gcc.c-torture/compile/pr54103-5.c,
+ gcc.c-torture/compile/pr54103-6.c: New tests.
+ * gcc.dg/c90-const-expr-8.c: Update expected column number.
+
+2012-09-14 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc.dg/pr44194-1.c: Check that there are no memory accesses left.
+
+2012-09-14 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/54564
+ * config/i386/fmaintrin.h (_mm_fnmadd_sd, _mm_fnmadd_ss,
+ _mm_fnmsub_sd, _mm_fnmsub_ss): Negate the second argument instead
+ of the first.
+
+2012-09-14 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/54565
+ * gcc.dg/tree-ssa/ssa-ccp-17.c: Adjust.
+ * gcc.dg/tree-ssa/forwprop-6.c: Likewise. Remove XFAIL.
+
+2012-09-14 Ulrich Weigand <ulrich.weigand@linaro.org>
+
+ * gcc.target/arm/combine-movs.c: Add missing space.
+
+2012-09-14 Richard Guenther <rguenther@suse.de>
+
+ * g++.dg/torture/builtin-location.C: New testcase.
+
+2012-09-13 Paolo Carlini <paolo.carlini@oracle.com>
+ Manuel López-Ibáñez <manu@gcc.gnu.org>
+
+ PR c++/53210
+ * g++.dg/warn/Wuninitialized-self.C: New.
+
+2012-09-13 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/54559
+ * gcc.c-torture/compile/pr54559.c: New test.
+
+2012-09-13 Jason Merrill <jason@redhat.com>
+
+ PR c++/53839
+ * g++.dg/cpp0x/constexpr-temp1.C: New.
+
+ PR c++/54511
+ * g++.dg/template/anonunion2.C: New.
+
+ PR c++/53836
+ * g++.dg/template/init10.C: New.
+
+2012-09-13 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/54556
+ * gfortran.dg/implicit_pure_3.f90: New.
+
+2012-09-13 Richard Guenther <rguenther@suse.de>
+
+ * gcc.dg/tree-ssa/ssa-fre-37.c: New testcase.
+
+2012-09-13 Christophe Lyon <christophe.lyon@linaro.org>
+
+ * gcc.target/arm/builtin-bswap-1.c: New testcase.
+
+2012-09-12 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
+ * c-c++-common/pr51712.c: Handle for short-enum targets.
+
+2012-09-12 Terry Guo <terry.guo@arm.com>
+
+ * gcc.target/arm/combine-movs.c: Check movs for ARM mode
+ and lsrs for Thumb2 mode.
+
+2012-09-12 Jan Hubicka <jh@suse.cz>
+
+ * gcc.dg/ipa/inlinehint-2.c: New testcase.
+
+2012-09-12 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/54445
+ * gcc.target/i386/pr54445-1.c: New file.
+ * gcc.target/i386/pr54445-2.c: Likewise.
+
+2012-09-12 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/54225
+ PR fortran/53306
+ * gfortran.dg/coarray_10.f90: Update dg-error.
+ * gfortran.dg/coarray_28.f90: New.
+ * gfortran.dg/array_section_3.f90: New.
+
+2012-09-11 Christophe Lyon <christophe.lyon@linaro.org>
+
+ gcc/testsuite/
+ * gcc.target/arm/neon-vset_lanes8.c, gcc.target/arm/pr51835.c,
+ gcc.target/arm/pr48252.c: Fix for big-endian support.
+
+2012-09-11 Marc Glisse <marc.glisse@inria.fr>
+
+ * gcc.dg/tree-ssa/forwprop-22.c: New testcase.
+
+2012-09-11 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
+ Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
+
+ * gcc.target/arm/neon-vfma-1.c: New testcase.
+ * gcc.target/arm/neon-vfms-1.c: Likewise.
+ * gcc.target/arm/neon-vmla-1.c: Update test to use int instead
+ of float.
+ * gcc.target/arm/neon-vmls-1.c: Likewise.
+ * lib/target-supports.exp (add_options_for_arm_neonv2): New
+ function.
+ (check_effective_target_arm_neonv2_ok_nocache): Likewise.
+ (check_effective_target_arm_neonv2_ok): Likewise.
+ (check_effective_target_arm_neonv2_hw): Likewise.
+ (check_effective_target_arm_neonv2): Likewise.
+
+2012-09-11 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/54515
+ * g++.dg/tree-ssa/pr54515.C: New testcase.
+
+2012-09-10 Andrew Pinski <apinski@cavium.com>
+
+ PR tree-opt/c54362
+ * gcc.dg/tm/memopt-16.c: New testcase.
+
+2012-09-10 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/54541
+ PR c++/54542
+ * g++.dg/cpp0x/sfinae40.C: New.
+ * g++.dg/cpp0x/sfinae41.C: Likewise.
+
+2012-09-10 Jason Merrill <jason@redhat.com>
+
+ PR c++/54538
+ * g++.dg/cpp0x/lambda/lambda-mangle4.C: New.
+
+2012-09-10 Oleg Endo <olegendo@gcc.gnu.org>
+
+ PR target/54089
+ * gcc.target/sh/pr54089-3.c: New.
+
+2012-09-10 Marc Glisse <marc.glisse@inria.fr>
+
+ * gcc.dg/tree-ssa/forwprop-21.c: New testcase.
+
+2012-09-10 Aldy Hernandez <aldyh@redhat.com>
+
+ * gcc.dg/tm/reg-promotion.c: Modify dump message check.
+
+2012-09-10 Aldy Hernandez <aldyh@redhat.com>
+
+ * gcc.dg/pr52558-2.c: Delete.
+ * gcc.dg/simulate-thread/speculative-store-3.c: New.
+
+2012-09-10 Marc Glisse <marc.glisse@inria.fr>
+
+ * gcc.dg/tree-ssa/forwprop-20.c: New testcase.
+
+2012-09-10 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/54520
+ * gcc.dg/torture/pr54520.c: New testcase.
+
+2012-09-10 Jason Merrill <jason@redhat.com>
+
+ PR c++/54506
+ * g++.dg/cpp0x/implicit14.C: New.
+
2012-09-07 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/54208
diff --git a/gcc/testsuite/c-c++-common/pr51712.c b/gcc/testsuite/c-c++-common/pr51712.c
index 4d9eba33afe..69e316d2452 100644
--- a/gcc/testsuite/c-c++-common/pr51712.c
+++ b/gcc/testsuite/c-c++-common/pr51712.c
@@ -1,6 +1,7 @@
/* PR c/51712 */
/* { dg-do compile } */
/* { dg-options "-Wtype-limits" } */
+/* { dg-additional-options "-fno-short-enums" { target short_enums } } */
enum test_enum {
FOO,
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-compare-1.c b/gcc/testsuite/c-c++-common/torture/vector-compare-1.c
index 8967d439406..4cdfcf718c1 100644
--- a/gcc/testsuite/gcc.c-torture/execute/vector-compare-1.c
+++ b/gcc/testsuite/c-c++-common/torture/vector-compare-1.c
@@ -1,3 +1,4 @@
+/* { dg-do run } */
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type
@@ -38,7 +39,7 @@ int main (int argc, char *argv[]) {
vector (4, int) ires;
int i;
- i0 = (vector (4, INT)){argc, 1, 2, 10};
+ i0 = (vector (4, INT)){(INT)argc, 1, 2, 10};
i1 = (vector (4, INT)){0, 3, 2, (INT)-23};
test (4, i0, i1, ires, "%i");
#undef INT
@@ -48,7 +49,7 @@ int main (int argc, char *argv[]) {
vector (4, INT) u0;
vector (4, INT) u1;
- u0 = (vector (4, INT)){argc, 1, 2, 10};
+ u0 = (vector (4, INT)){(INT)argc, 1, 2, 10};
u1 = (vector (4, INT)){0, 3, 2, (INT)-23};
test (4, u0, u1, ures, "%u");
#undef INT
@@ -59,7 +60,7 @@ int main (int argc, char *argv[]) {
vector (8, SHORT) s1;
vector (8, short) sres;
- s0 = (vector (8, SHORT)){argc, 1, 2, 10, 6, 87, (SHORT)-5, 2};
+ s0 = (vector (8, SHORT)){(SHORT)argc, 1, 2, 10, 6, 87, (SHORT)-5, 2};
s1 = (vector (8, SHORT)){0, 3, 2, (SHORT)-23, 12, 10, (SHORT)-2, 0};
test (8, s0, s1, sres, "%i");
#undef SHORT
@@ -69,7 +70,7 @@ int main (int argc, char *argv[]) {
vector (8, SHORT) us1;
vector (8, short) usres;
- us0 = (vector (8, SHORT)){argc, 1, 2, 10, 6, 87, (SHORT)-5, 2};
+ us0 = (vector (8, SHORT)){(SHORT)argc, 1, 2, 10, 6, 87, (SHORT)-5, 2};
us1 = (vector (8, SHORT)){0, 3, 2, (SHORT)-23, 12, 10, (SHORT)-2, 0};
test (8, us0, us1, usres, "%u");
#undef SHORT
@@ -79,8 +80,8 @@ int main (int argc, char *argv[]) {
vector (16, CHAR) c1;
vector (16, signed char) cres;
- c0 = (vector (16, CHAR)){argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \
- argc, 1, 2, 10, 6, 87, (CHAR)-5, 2 };
+ c0 = (vector (16, CHAR)){(CHAR)argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \
+ (CHAR)argc, 1, 2, 10, 6, 87, (CHAR)-5, 2 };
c1 = (vector (16, CHAR)){0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0, \
0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0};
@@ -92,8 +93,8 @@ int main (int argc, char *argv[]) {
vector (16, CHAR) uc1;
vector (16, signed char) ucres;
- uc0 = (vector (16, CHAR)){argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \
- argc, 1, 2, 10, 6, 87, (CHAR)-5, 2 };
+ uc0 = (vector (16, CHAR)){(CHAR)argc, 1, 2, 10, 6, 87, (CHAR)-5, 2, \
+ (CHAR)argc, 1, 2, 10, 6, 87, (CHAR)-5, 2 };
uc1 = (vector (16, CHAR)){0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0, \
0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0};
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.c b/gcc/testsuite/c-c++-common/torture/vector-compare-2.c
index 398c8254a47..45453e6b98d 100644
--- a/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.c
+++ b/gcc/testsuite/c-c++-common/torture/vector-compare-2.c
@@ -1,3 +1,5 @@
+/* { dg-do run } */
+/* { dg-options "-Wno-psabi" } */
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-shift.c b/gcc/testsuite/c-c++-common/torture/vector-shift.c
index f52eb58a1b9..f690b7c3d6e 100644
--- a/gcc/testsuite/gcc.c-torture/execute/vector-shift.c
+++ b/gcc/testsuite/c-c++-common/torture/vector-shift.c
@@ -1,3 +1,4 @@
+/* { dg-do run } */
#define vector __attribute__((vector_size(sizeof(int)*4) ))
@@ -16,7 +17,7 @@ static vector unsigned int unumbersrightshiftallones = {0, 0, 1, 1};
#define TEST(result, expected) \
do { \
- typeof(result) result1 = result; \
+ __typeof__(result) result1 = result; \
if(sizeof (result1) != sizeof (expected)) \
__builtin_abort (); \
if (__builtin_memcmp (&result1, &expected, sizeof(result1)) != 0) \
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-shift2.c b/gcc/testsuite/c-c++-common/torture/vector-shift2.c
index 55f10355522..d3a2ef87cd5 100644
--- a/gcc/testsuite/gcc.c-torture/execute/vector-shift2.c
+++ b/gcc/testsuite/c-c++-common/torture/vector-shift2.c
@@ -1,3 +1,4 @@
+/* { dg-do run } */
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-subscript-1.c b/gcc/testsuite/c-c++-common/torture/vector-subscript-1.c
index 8ad8d454857..bb1350ebedc 100644
--- a/gcc/testsuite/gcc.c-torture/execute/vector-subscript-1.c
+++ b/gcc/testsuite/c-c++-common/torture/vector-subscript-1.c
@@ -1,4 +1,4 @@
-/* dg-do run */
+/* { dg-do run } */
#define vector __attribute__((vector_size(sizeof(int)*4) ))
/* Check to make sure that we extract and insert the vector at the same
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-subscript-2.c b/gcc/testsuite/c-c++-common/torture/vector-subscript-2.c
index d0e5b889c66..2e4a7488bbe 100644
--- a/gcc/testsuite/gcc.c-torture/execute/vector-subscript-2.c
+++ b/gcc/testsuite/c-c++-common/torture/vector-subscript-2.c
@@ -1,3 +1,4 @@
+/* { dg-do run } */
#define vector __attribute__((vector_size(sizeof(int)*4) ))
/* Check to make sure that we extract and insert the vector at the same
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-subscript-3.c b/gcc/testsuite/c-c++-common/torture/vector-subscript-3.c
index 97d531c1733..bb5c91485d7 100644
--- a/gcc/testsuite/gcc.c-torture/execute/vector-subscript-3.c
+++ b/gcc/testsuite/c-c++-common/torture/vector-subscript-3.c
@@ -1,4 +1,4 @@
-/* dg-do run */
+/* { dg-do run } */
#define vector __attribute__((vector_size(16) ))
/* Check whether register declaration of vector type still
diff --git a/gcc/testsuite/gcc.dg/vector-compare-1.c b/gcc/testsuite/c-c++-common/vector-compare-1.c
index f6c1b404b0c..ef99ae472dc 100644
--- a/gcc/testsuite/gcc.dg/vector-compare-1.c
+++ b/gcc/testsuite/c-c++-common/vector-compare-1.c
@@ -1,5 +1,6 @@
/* { dg-do compile } */
/* { dg-options "-mabi=altivec" { target { { powerpc*-*-linux* } && ilp32 } } } */
+/* { dg-prune-output "operand types are" } */
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type
@@ -14,6 +15,6 @@ foo (vector (4, int) x, vector (4, float) y)
vector (4, float) f4;
r4 = x > y; /* { dg-error "comparing vectors with different element types" } */
- r8 = (x != p4); /* { dg-error "incompatible types when assigning to type" } */
+ r8 = (x != p4); /* { dg-error "incompatible types when assigning to type|cannot convert" } */
r8 == r4; /* { dg-error "comparing vectors with different number of elements" } */
}
diff --git a/gcc/testsuite/gcc.dg/vector-compare-2.c b/gcc/testsuite/c-c++-common/vector-compare-2.c
index 8cbcf0787c4..8cbcf0787c4 100644
--- a/gcc/testsuite/gcc.dg/vector-compare-2.c
+++ b/gcc/testsuite/c-c++-common/vector-compare-2.c
diff --git a/gcc/testsuite/c-c++-common/vector-compare-3.c b/gcc/testsuite/c-c++-common/vector-compare-3.c
new file mode 100644
index 00000000000..d6b0dac7cb9
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/vector-compare-3.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+typedef int v4i __attribute__((vector_size(4*sizeof(int))));
+
+// fold should not turn (vec_other)(x<y) into (x<y)?vec_other(-1):vec_other(0).
+
+void use (v4i const *z);
+
+void
+f (v4i *x, v4i *y)
+{
+ v4i const zz = *x < *y;
+ use (&zz);
+}
+
+// Optimizations shouldn't introduce a boolean type in there
+
+void
+g (v4i *x, v4i const *y, v4i *z, v4i *t)
+{
+ *z = *x < *y | *x == *y;
+ *t = *x < *y & *x > *y;
+}
+
diff --git a/gcc/testsuite/gcc.dg/vector-shift.c b/gcc/testsuite/c-c++-common/vector-shift.c
index f2b12ba73f6..593bb366943 100644
--- a/gcc/testsuite/gcc.dg/vector-shift.c
+++ b/gcc/testsuite/c-c++-common/vector-shift.c
@@ -1,4 +1,5 @@
/* { dg-do compile } */
+/* { dg-prune-output "in evaluation of" } */
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type
diff --git a/gcc/testsuite/gcc.dg/vector-shift1.c b/gcc/testsuite/c-c++-common/vector-shift1.c
index 51bc0ad3989..db8035667a9 100644
--- a/gcc/testsuite/gcc.dg/vector-shift1.c
+++ b/gcc/testsuite/c-c++-common/vector-shift1.c
@@ -1,4 +1,5 @@
/* { dg-do compile } */
+/* { dg-prune-output "in evaluation of" } */
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type
@@ -11,7 +12,7 @@ int main (int argc, char *argv[]) {
vint <<= vfloat0; /* { dg-error "nvalid operands to binary <<" } */
vfloat0 >>= vint; /* { dg-error "nvalid operands to binary >>" } */
- vfloat0 <<= vfloat1; /* { dg-error "nvalid operands to binary <<" } */
+ vfloat0 <<= vfloat1; /* { dg-error "nvalid operands" } */
return 0;
}
diff --git a/gcc/testsuite/gcc.dg/vector-shift3.c b/gcc/testsuite/c-c++-common/vector-shift3.c
index 38a9843d117..c26fb8d98ca 100644
--- a/gcc/testsuite/gcc.dg/vector-shift3.c
+++ b/gcc/testsuite/c-c++-common/vector-shift3.c
@@ -5,11 +5,11 @@ __attribute__((vector_size((elcount)*sizeof(type)))) type
int main (int argc, char *argv[]) {
- vector(8, short) v0 = {argc,2,3,4,5,6,7};
+ vector(8, short) v0 = {(short)argc,2,3,4,5,6,7};
short sc;
- scalar1 <<= v0; /* { dg-error ".*scalar1.*undeclared" } */
+ scalar1 <<= v0; /* { dg-error "scalar1.*(undeclared|was not declared)" } */
return 0;
}
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-temp1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-temp1.C
new file mode 100644
index 00000000000..d0654363270
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-temp1.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++11 } }
+
+struct A { int i; };
+constexpr A f2 (const A& a) { return a; }
+constexpr int f1 (const A &a) { return f2(a).i; }
+A g(const A &a)
+{
+ return { f1(a) };
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/implicit14.C b/gcc/testsuite/g++.dg/cpp0x/implicit14.C
new file mode 100644
index 00000000000..8a56244631b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/implicit14.C
@@ -0,0 +1,26 @@
+// PR c++/54506
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct A
+{
+ A() {}
+
+ A(A const volatile &&) = delete;
+ A &operator =(A const volatile &&) = delete;
+
+ template <class U> A(A<U> &&) {}
+ template <class U> A &operator =(A<U> &&) { return *this; }
+};
+
+struct B
+{
+ A<int> a;
+ B() = default;
+};
+
+int main()
+{
+ B b = B();
+ b = B();
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C
new file mode 100644
index 00000000000..0d37637fe9c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-mangle4.C
@@ -0,0 +1,13 @@
+// PR c++/54538
+// { dg-do compile { target c++11 } }
+
+template <class T>
+struct A
+{
+ // { dg-final { scan-assembler "_ZNK1AIcE1pMUlvE_cvPFvvEEv" } }
+ // { dg-final { scan-assembler "_ZNK1AIiE1pMUlvE_cvPFvvEEv" } }
+ void (*p)() = []{};
+};
+
+A<int> a1;
+A<char> a2;
diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae40.C b/gcc/testsuite/g++.dg/cpp0x/sfinae40.C
new file mode 100644
index 00000000000..18e5fecb268
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/sfinae40.C
@@ -0,0 +1,21 @@
+// PR c++/54541
+// { dg-do compile { target c++11 } }
+
+template <typename T> T&& declval();
+
+struct X;
+
+X f(int);
+
+template <class T>
+void g(decltype((void)f(declval<T>())) *)
+{}
+
+template <class T>
+void g(...)
+{}
+
+int main()
+{
+ g<int>(0);
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae41.C b/gcc/testsuite/g++.dg/cpp0x/sfinae41.C
new file mode 100644
index 00000000000..bd6f624f0ad
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/sfinae41.C
@@ -0,0 +1,17 @@
+// PR c++/54542
+// { dg-do compile { target c++11 } }
+
+template <class T>
+void f(decltype(new T(1, 2)) *)
+{
+ T(1, 2);
+}
+
+template <class T>
+void f(...)
+{}
+
+int main()
+{
+ f<int>(0);
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/deallocator.C b/gcc/testsuite/g++.dg/debug/dwarf2/deallocator.C
new file mode 100644
index 00000000000..eab38a3ade2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/deallocator.C
@@ -0,0 +1,33 @@
+// Test that debug info generated for auto-inserted deallocator is
+// correctly attributed.
+// This patch scans for the lineno directly from assembly, which may
+// differ between different architectures. Because it mainly tests
+// FE generated debug info, without losing generality, only x86
+// assembly is scanned in this test.
+// { dg-do compile { target { i?86-*-* x86_64-*-* } } }
+// { dg-options "-O2 -fno-exceptions -g -dA" }
+
+struct t {
+ t ();
+ ~t ();
+ void foo();
+ void bar();
+};
+
+int bar();
+
+void foo(int i)
+{
+ for (int j = 0; j < 10; j++)
+ {
+ t test;
+ test.foo();
+ if (i + j)
+ {
+ test.bar();
+ return;
+ }
+ }
+ return;
+}
+// { dg-final { scan-assembler "deallocator.C:28" } }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/nested-3.C b/gcc/testsuite/g++.dg/debug/dwarf2/nested-3.C
index a59359c7b9d..47c6d0b1cd5 100644
--- a/gcc/testsuite/g++.dg/debug/dwarf2/nested-3.C
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/nested-3.C
@@ -59,4 +59,4 @@ main ()
//
// Hence the scary regexp:
//
-// { dg-final { scan-assembler "\[^\n\r\]*\\(DIE \\(0x(\[0-9a-f\]+)\\) DW_TAG_namespace\\)\[\n\r\]+\[^\n\r\]*\"thread\[\^\n\r]+\[\n\r\]+(\[^\n\r\]*\[\n\r\]+)+\[^\n\r\]*\\(DIE \\(0x(\[0-9a-f\]+)\\) DW_TAG_class_type\\)(\[\n\r\]+\[^\n\r\]*)+\"Executor\[^\n\r\]+\[\n\r\]+\[^\n\r\]*DW_AT_declaration\[\n\r\]+\[^\n\r\]*DW_AT_signature\[^#/!|@\]*\[#/!|@\] \[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_subprogram\\)\[\n\r\]+(\[^\n\r\]*\[\n\r\]+)+\[^\n\r\]*\"CurrentExecutor\[^\n\r\]+\[\n\r\]+(\[^\n\r\]*\[\n\r\]+)+(\[^\n\r\]*\[\n\r\]+)+\[^\n\r\]*end of children of DIE 0x\\3\[\n\r]+\[^\n\r\]*end of children of DIE 0x\\1\[\n\r]+" } }
+// { dg-final { scan-assembler "\[^\n\r\]*\\(DIE \\(0x(\[0-9a-f\]+)\\) DW_TAG_namespace\\)\[\n\r\]+\[^\n\r\]*\"thread\[\^\n\r]+\[\n\r\]+(\[^\n\r\]*\[\n\r\]+)+\[^\n\r\]*\\(DIE \\(0x(\[0-9a-f\]+)\\) DW_TAG_class_type\\)(\[\n\r\]+\[^\n\r\]*)+\"Executor\[^\n\r\]+\[\n\r\]+\[^\n\r\]*DW_AT_declaration\[\n\r\]+\[^\n\r\]*DW_AT_signature\[^#;/!|@\]*\[#;/!|@\] \[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_subprogram\\)\[\n\r\]+(\[^\n\r\]*\[\n\r\]+)+\[^\n\r\]*\"CurrentExecutor\[^\n\r\]+\[\n\r\]+(\[^\n\r\]*\[\n\r\]+)+(\[^\n\r\]*\[\n\r\]+)+\[^\n\r\]*end of children of DIE 0x\\3\[\n\r]+\[^\n\r\]*end of children of DIE 0x\\1\[\n\r]+" } }
diff --git a/gcc/testsuite/g++.dg/other/vector-compare.C b/gcc/testsuite/g++.dg/other/vector-compare.C
new file mode 100644
index 00000000000..b2d1ecbc5ed
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/vector-compare.C
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-std=gnu++11 -Wall" } */
+
+// Check that we can compare vector types that really are the same through
+// typedefs.
+
+typedef float v4f __attribute__((vector_size(4*sizeof(float))));
+
+template <class T> void eat (T&&) {}
+
+template <class T, int n>
+struct Vec
+{
+ typedef T type __attribute__((vector_size(4*sizeof(T))));
+
+ template <class U>
+ static void fun (type const& t, U& u) { eat (t > u); }
+};
+
+long long
+f (v4f *x, v4f const *y)
+{
+ return ((*x < *y) | (*x <= *y))[2];
+}
+
+int main ()
+{
+ v4f x = {0,1,2,3};
+ Vec<const volatile float,4>::type f = {-1,5,2,3.1};
+ auto c = (x == f) == (x >= x);
+ eat (c[3]);
+ Vec<const volatile float,4>::fun (f, x);
+ Vec<const volatile float,4>::fun (x, f);
+ Vec<const volatile float,4>::fun (f, f);
+ Vec<const volatile float,4>::fun (x, x);
+}
diff --git a/gcc/testsuite/g++.dg/template/anonunion2.C b/gcc/testsuite/g++.dg/template/anonunion2.C
new file mode 100644
index 00000000000..cb3c12dff1e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/anonunion2.C
@@ -0,0 +1,6 @@
+template <int i>
+struct S
+{
+ S () { union { int a; }; a = 0; }
+};
+S<0> s;
diff --git a/gcc/testsuite/g++.dg/template/init10.C b/gcc/testsuite/g++.dg/template/init10.C
new file mode 100644
index 00000000000..1480622d365
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/init10.C
@@ -0,0 +1,15 @@
+template <int N>
+struct A { };
+
+template <int Q>
+void g()
+{
+ const int M ( Q );
+
+ A<M> a;
+}
+
+void h()
+{
+ g<3>();
+}
diff --git a/gcc/testsuite/g++.dg/torture/builtin-location.C b/gcc/testsuite/g++.dg/torture/builtin-location.C
new file mode 100644
index 00000000000..cad53de4b48
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/builtin-location.C
@@ -0,0 +1,31 @@
+// { dg-do run }
+
+#include <cstring>
+
+const char *gfile;
+const char *gfn;
+int gline;
+
+void bar (const char *file = __builtin_FILE (),
+ const char *function = __builtin_FUNCTION (),
+ int line = __builtin_LINE ())
+{
+ gfile = file;
+ gfn = function;
+ gline = line;
+}
+
+extern "C" void abort (void);
+
+int main()
+{
+ int here;
+ bar (); here = __LINE__;
+ if (std::strcmp (gfn, __FUNCTION__) != 0)
+ abort ();
+ if (std::strcmp (gfile, __FILE__) != 0)
+ abort ();
+ if (gline != here)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr54515.C b/gcc/testsuite/g++.dg/tree-ssa/pr54515.C
new file mode 100644
index 00000000000..11ed46893bf
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr54515.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+template < typename T > T h2le (T)
+{
+ T a;
+ unsigned short &b = a;
+ short c = 0;
+ unsigned char (&d)[2] = reinterpret_cast < unsigned char (&)[2] > (c);
+ unsigned char (&e)[2] = reinterpret_cast < unsigned char (&)[2] > (b);
+ e[0] = d[0];
+ return a;
+}
+
+void
+bar ()
+{
+ h2le ((unsigned short) 0);
+}
diff --git a/gcc/testsuite/g++.dg/warn/Winit-self.C b/gcc/testsuite/g++.dg/warn/Winit-self.C
new file mode 100644
index 00000000000..60a72741661
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Winit-self.C
@@ -0,0 +1,8 @@
+// PR c++/53210
+// { dg-options "-Wall" }
+
+struct S
+{
+ S(int i) : j(j) { } // { dg-warning "is initialized with itself" }
+ int j;
+};
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54103-1.c b/gcc/testsuite/gcc.c-torture/compile/pr54103-1.c
new file mode 100644
index 00000000000..d941f3e1fdf
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr54103-1.c
@@ -0,0 +1,5 @@
+void
+f (void)
+{
+ 0 || 0 / 0 ? : 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54103-2.c b/gcc/testsuite/gcc.c-torture/compile/pr54103-2.c
new file mode 100644
index 00000000000..4bd624965e8
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr54103-2.c
@@ -0,0 +1,5 @@
+void
+f (void)
+{
+ 0 / 0 || 0 ? : 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54103-3.c b/gcc/testsuite/gcc.c-torture/compile/pr54103-3.c
new file mode 100644
index 00000000000..9be0b94ce31
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr54103-3.c
@@ -0,0 +1,5 @@
+void
+f (void)
+{
+ 1 && 0 / 0 ? : 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54103-4.c b/gcc/testsuite/gcc.c-torture/compile/pr54103-4.c
new file mode 100644
index 00000000000..89ce24cd912
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr54103-4.c
@@ -0,0 +1,5 @@
+void
+f (void)
+{
+ 0 / 0 && 1 ? : 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54103-5.c b/gcc/testsuite/gcc.c-torture/compile/pr54103-5.c
new file mode 100644
index 00000000000..9594b28955f
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr54103-5.c
@@ -0,0 +1,5 @@
+void
+f (void)
+{
+ !(0 / 0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54103-6.c b/gcc/testsuite/gcc.c-torture/compile/pr54103-6.c
new file mode 100644
index 00000000000..2b0b0baa916
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr54103-6.c
@@ -0,0 +1,5 @@
+void
+f (void)
+{
+ 0 || 65536*65536 ? : 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54552-1.c b/gcc/testsuite/gcc.c-torture/compile/pr54552-1.c
new file mode 100644
index 00000000000..bc20053a162
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr54552-1.c
@@ -0,0 +1,8 @@
+void
+f (void)
+{
+ unsigned n = 10;
+
+ typedef double T[n];
+ (double (*)[n])((unsigned char (*)[sizeof (T)]){ 0 });
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54559.c b/gcc/testsuite/gcc.c-torture/compile/pr54559.c
new file mode 100644
index 00000000000..847497f0b7d
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr54559.c
@@ -0,0 +1,9 @@
+/* PR c/54559 */
+
+typedef double _Complex T;
+
+T
+foo (double x, double y)
+{
+ return x + y * (T) (__extension__ 1.0iF);
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.x b/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.x
deleted file mode 100644
index cb7b119b8cb..00000000000
--- a/gcc/testsuite/gcc.c-torture/execute/vector-compare-2.x
+++ /dev/null
@@ -1,2 +0,0 @@
-set additional_flags "-Wno-psabi"
-return 0
diff --git a/gcc/testsuite/gcc.dg/c90-const-expr-8.c b/gcc/testsuite/gcc.dg/c90-const-expr-8.c
index b00bb9718f8..4923bc68046 100644
--- a/gcc/testsuite/gcc.dg/c90-const-expr-8.c
+++ b/gcc/testsuite/gcc.dg/c90-const-expr-8.c
@@ -22,6 +22,6 @@ enum e {
E5 = 0 * -INT_MIN, /* { dg-warning "12:integer overflow in expression" } */
/* { dg-error "3:overflow in constant expression" "constant" { target *-*-* } 22 } */
E6 = 0 * !-INT_MIN, /* { dg-warning "13:integer overflow in expression" } */
- /* { dg-error "3:not an integer constant" "constant" { target *-*-* } 24 } */
+ /* { dg-error "8:not an integer constant" "constant" { target *-*-* } 24 } */
E7 = INT_MIN % -1 /* Not an overflow. */
};
diff --git a/gcc/testsuite/gcc.dg/ipa/inlinehint-2.c b/gcc/testsuite/gcc.dg/ipa/inlinehint-2.c
new file mode 100644
index 00000000000..a06d7255629
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/inlinehint-2.c
@@ -0,0 +1,13 @@
+/* { dg-options "-O3 -c -fdump-ipa-inline-details -fno-early-inlining -fno-ipa-cp" } */
+t(int s, void **p)
+{
+ int i;
+ for (i;i<10000;i+=s)
+ p[i]=0;
+}
+m(void **p)
+{
+ t (10, p);
+}
+/* { dg-final { scan-ipa-dump "loop_stride" "inline" } } */
+/* { dg-final { cleanup-ipa-dump "inline" } } */
diff --git a/gcc/testsuite/gcc.dg/pr44194-1.c b/gcc/testsuite/gcc.dg/pr44194-1.c
index d993a42a02b..1772a9949d3 100644
--- a/gcc/testsuite/gcc.dg/pr44194-1.c
+++ b/gcc/testsuite/gcc.dg/pr44194-1.c
@@ -1,6 +1,7 @@
/* { dg-do compile { target { { { { { i?86-*-* x86_64-*-* } && x32 } || lp64 } && { ! s390*-*-* } } && { ! alpha*-*-* } } } } */
-/* { dg-options "-O2 -fdump-rtl-dse1" } */
-/* Restricting to 64-bit targets since 32-bit targets return
+/* { dg-options "-O2 -fdump-rtl-dse1 -fdump-rtl-final" } */
+
+/* Restrict to 64-bit targets since 32-bit targets usually return small
structures in memory. */
struct ints { int a, b, c; } foo();
@@ -10,5 +11,9 @@ void func() {
struct ints s = foo();
bar(s.a, s.b);
}
-/* { dg-final { scan-rtl-dump "global deletions = (2|3)" "dse1" } } */
+
+/* { dg-final { scan-rtl-dump "global deletions = (2|3)" "dse1" } } */
/* { dg-final { cleanup-rtl-dump "dse1" } } */
+
+/* { dg-final { scan-rtl-dump-not "set \\(mem" "final" } } */
+/* { dg-final { cleanup-rtl-dump "final" } } */
diff --git a/gcc/testsuite/gcc.dg/pr52558-2.c b/gcc/testsuite/gcc.dg/pr52558-2.c
deleted file mode 100644
index 6d5f51c4f0c..00000000000
--- a/gcc/testsuite/gcc.dg/pr52558-2.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* { dg-do compile } */
-/* { dg-options "--param allow-store-data-races=0 -O2 -fdump-tree-lim1" } */
-
-/* Test that g_2 is not written to unless !g_1. */
-
-int g_1 = 1;
-int g_2 = 0;
-
-int func_1(void)
-{
- int l;
- for (l = 0; l < 1234; l++)
- {
- if (g_1)
- return l;
- else
- g_2 = 0;
- }
- return 999;
-}
-
-/* { dg-final { scan-tree-dump-times "MEM.*g_2_lsm_flag" 1 "lim1" } } */
-/* { dg-final { cleanup-tree-dump "lim1" } } */
diff --git a/gcc/testsuite/gcc.dg/simulate-thread/speculative-store-3.c b/gcc/testsuite/gcc.dg/simulate-thread/speculative-store-3.c
new file mode 100644
index 00000000000..203c026048d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/simulate-thread/speculative-store-3.c
@@ -0,0 +1,71 @@
+/* { dg-do link } */
+/* { dg-options "--param allow-store-data-races=0 -O2" } */
+/* { dg-final { simulate-thread } } */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "simulate-thread.h"
+
+/* Test distilled from PR52558. */
+
+int g_1 = 1;
+int g_2 = 0, insns = 0;
+int f;
+
+/* Test that g_2 is not written to unless !g_1. */
+
+__attribute__((noinline))
+int funky()
+{
+ int l;
+ for (l = 0; l != 4; l++)
+ {
+ if (g_1)
+ {
+ /* g_1 is globally true so we should always execute here,
+ thus never writing to g_2 under any circumstance in this
+ code path. */
+ return l;
+ }
+ for (g_2 = 0; g_2 >= 26; ++g_2)
+ ;
+ }
+ return 999;
+}
+
+int simulate_thread_final_verify ()
+{
+ /* If g_2 != insns, someone must have cached `g_2' and stored a
+ racy value into it. */
+ if (g_2 != insns)
+ {
+ printf("FAIL: g_2 was incorrectly cached\n");
+ return 1;
+ }
+ return 0;
+}
+
+void simulate_thread_other_threads ()
+{
+ ++insns;
+ ++g_2;
+}
+
+int simulate_thread_step_verify ()
+{
+ return 0;
+}
+
+__attribute__((noinline))
+void simulate_thread_main()
+{
+ f = funky();
+}
+
+int main()
+{
+ simulate_thread_main ();
+ simulate_thread_done ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/simulate-thread/speculative-store-4.c b/gcc/testsuite/gcc.dg/simulate-thread/speculative-store-4.c
new file mode 100644
index 00000000000..59f81b756be
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/simulate-thread/speculative-store-4.c
@@ -0,0 +1,54 @@
+/* { dg-do link } */
+/* { dg-options "--param allow-store-data-races=0" } */
+/* { dg-final { simulate-thread } } */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "simulate-thread.h"
+
+/* PR 54139 */
+/* Test that speculative stores do not happen for --param
+ allow-store-data-races=0. */
+
+int g_13=1, insns=1;
+
+__attribute__((noinline))
+void simulate_thread_main()
+{
+ int l_245;
+
+ /* Since g_13 is unilaterally set positive above, there should be
+ no store to g_13 below. */
+ for (l_245 = 0; l_245 <= 1; l_245 += 1)
+ for (; g_13 <= 0; g_13 = 1)
+ ;
+}
+
+int main()
+{
+ simulate_thread_main ();
+ simulate_thread_done ();
+ return 0;
+}
+
+void simulate_thread_other_threads ()
+{
+ ++g_13;
+ ++insns;
+}
+
+int simulate_thread_step_verify ()
+{
+ return 0;
+}
+
+int simulate_thread_final_verify ()
+{
+ if (g_13 != insns)
+ {
+ printf("FAIL: g_13 was incorrectly cached\n");
+ return 1;
+ }
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/tm/memopt-16.c b/gcc/testsuite/gcc.dg/tm/memopt-16.c
new file mode 100644
index 00000000000..c230240de57
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tm/memopt-16.c
@@ -0,0 +1,43 @@
+/* { dg-do compile } */
+/* { dg-options "-fgnu-tm -O3 -fdump-tree-tmmark" } */
+/* Like memopt-12.c but the phi is inside a look which causes
+ it to be converted into a COND_EXPR. */
+
+extern int test(void) __attribute__((transaction_safe));
+extern void *malloc (__SIZE_TYPE__) __attribute__((malloc,transaction_safe));
+
+struct large { int foo[500]; };
+
+int f(int j)
+{
+ int *p1, *p2, *p3;
+
+ p1 = malloc (sizeof (*p1)*5000);
+ __transaction_atomic {
+ _Bool t;
+ int i = 1;
+ *p1 = 0;
+
+ p2 = malloc (sizeof (*p2)*6000);
+ *p2 = 1;
+ t = test();
+
+ for (i = 0;i < j;i++)
+ {
+
+ /* p3 = PHI (p1, p2) */
+ if (t)
+ p3 = p1;
+ else
+ p3 = p2;
+
+ /* Since both p1 and p2 are thread-private, we can inherit the
+ logging already done. No ITM_W* instrumentation necessary. */
+ *p3 = 555;
+ }
+ }
+ return p3[something()];
+}
+
+/* { dg-final { scan-tree-dump-times "ITM_WU" 0 "tmmark" } } */
+/* { dg-final { cleanup-tree-dump "tmmark" } } */
diff --git a/gcc/testsuite/gcc.dg/tm/reg-promotion.c b/gcc/testsuite/gcc.dg/tm/reg-promotion.c
index 337c29f6c6e..e48bfb2795d 100644
--- a/gcc/testsuite/gcc.dg/tm/reg-promotion.c
+++ b/gcc/testsuite/gcc.dg/tm/reg-promotion.c
@@ -20,5 +20,5 @@ void func()
}
}
-/* { dg-final { scan-tree-dump-times "MEM count_lsm.. count_lsm_flag" 1 "lim1" } } */
+/* { dg-final { scan-tree-dump-times "Cannot hoist conditional load of count because it is in a transaction" 1 "lim1" } } */
/* { dg-final { cleanup-tree-dump "lim1" } } */
diff --git a/gcc/testsuite/gcc.dg/torture/pr54520.c b/gcc/testsuite/gcc.dg/torture/pr54520.c
new file mode 100644
index 00000000000..5884b2f353a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr54520.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+char *a;
+void
+fn1 ()
+{
+ char *p = a;
+ while (p && *p != '\0')
+ {
+ while (*p == '\t')
+ *p++ = '\0';
+ if (*p != '\0')
+ p = 0;
+ }
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-20.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-20.c
new file mode 100644
index 00000000000..5b0e8ee9806
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-20.c
@@ -0,0 +1,70 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target double64 } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+#include <stdint.h>
+
+/* All of these optimizations happen for unsupported vector modes as a
+ consequence of the lowering pass. We need to test with a vector mode
+ that is supported by default on at least some architectures, or make
+ the test target specific so we can pass a flag like -mavx. */
+
+typedef double vecf __attribute__ ((vector_size (2 * sizeof (double))));
+typedef int64_t veci __attribute__ ((vector_size (2 * sizeof (int64_t))));
+
+void f (double d, vecf* r)
+{
+ vecf x = { -d, 5 };
+ vecf y = { 1, 4 };
+ veci m = { 2, 0 };
+ *r = __builtin_shuffle (x, y, m); // { 1, -d }
+}
+
+void g (float d, vecf* r)
+{
+ vecf x = { d, 5 };
+ vecf y = { 1, 4 };
+ veci m = { 2, 1 };
+ *r = __builtin_shuffle (x, y, m); // { 1, 5 }
+}
+
+void h (double d, vecf* r)
+{
+ vecf x = { d + 1, 5 };
+ vecf y = { 1 , 4 };
+ veci m = { 2 , 0 };
+ *r = __builtin_shuffle (y, x, m); // { d + 1, 1 }
+}
+
+void i (float d, vecf* r)
+{
+ vecf x = { d, 5 };
+ veci m = { 1, 0 };
+ *r = __builtin_shuffle (x, m); // { 5, d }
+}
+
+void j (vecf* r)
+{
+ vecf y = { 1, 2 };
+ veci m = { 0, 0 };
+ *r = __builtin_shuffle (y, m); // { 1, 1 }
+}
+
+void k (vecf* r)
+{
+ vecf x = { 3, 4 };
+ vecf y = { 1, 2 };
+ veci m = { 3, 0 };
+ *r = __builtin_shuffle (x, y, m); // { 2, 3 }
+}
+
+void l (double d, vecf* r)
+{
+ vecf x = { -d, 5 };
+ vecf y = { d, 4 };
+ veci m = { 2, 0 };
+ *r = __builtin_shuffle (x, y, m); // { d, -d }
+}
+
+/* { dg-final { scan-tree-dump-not "VEC_PERM_EXPR" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-21.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-21.c
new file mode 100644
index 00000000000..4859fa8c305
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-21.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+typedef int v4si __attribute__ ((vector_size (4 * sizeof(int))));
+
+int
+test (v4si *x, v4si *y)
+{
+ v4si m = { 2, 3, 6, 5 };
+ v4si z = __builtin_shuffle (*x, *y, m);
+ return z[2];
+}
+/* { dg-final { scan-tree-dump-not "VEC_PERM_EXPR" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-22.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-22.c
new file mode 100644
index 00000000000..9c66c997205
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-22.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_double } */
+/* { dg-require-effective-target vect_perm } */
+/* { dg-options "-O -fdump-tree-optimized" } */
+
+typedef double vec __attribute__((vector_size (2 * sizeof (double))));
+void f (vec *px, vec *y, vec *z)
+{
+ vec x = *px;
+ vec t1 = { x[1], x[0] };
+ vec t2 = { x[0], x[1] };
+ *y = t1;
+ *z = t2;
+}
+
+/* { dg-final { scan-tree-dump-times "VEC_PERM_EXPR" 1 "optimized" } } */
+/* { dg-final { scan-tree-dump-not "BIT_FIELD_REF" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-6.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-6.c
index 54e51097e4c..a7a4a41d876 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-6.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-6.c
@@ -22,6 +22,7 @@ void f(void)
particular situation before doing this transformation we have to
assure that a is killed by a dominating store via type float for
it to be valid. Then we might as well handle the situation by
- value-numbering, removing the load alltogether. */
-/* { dg-final { scan-tree-dump-times "VIEW_CONVERT_EXPR" 1 "forwprop1" { xfail *-*-* } } } */
+ value-numbering, removing the load alltogether.
+ ??? We now do this after CPP re-writes a into SSA form. */
+/* { dg-final { scan-tree-dump-times "VIEW_CONVERT_EXPR" 1 "forwprop1" } } */
/* { dg-final { cleanup-tree-dump "forwprop1" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-17.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-17.c
index aece3c7cdc7..338d8a86297 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-17.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-17.c
@@ -26,7 +26,7 @@ int foobar(void)
return ((const struct Foo *)p)->i;
}
-/* { dg-final { scan-tree-dump "= i;" "ccp1" } } */
+/* { dg-final { scan-tree-dump "= i_.;" "ccp1" } } */
/* { dg-final { scan-tree-dump "= f.i;" "ccp1" } } */
/* { dg-final { scan-tree-dump "= g.i;" "ccp1" } } */
/* { dg-final { cleanup-tree-dump "ccp1" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-37.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-37.c
new file mode 100644
index 00000000000..bd4c5ef8a28
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-37.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-fre1" } */
+
+int a[256];
+int *b, *c;
+void foo (int i, int j)
+{
+ b = &a[i+j];
+ c = &a[i+j];
+}
+
+/* We should remove the redundant address computation. */
+
+/* { dg-final { scan-tree-dump-times " = &a" 1 "fre1" } } */
+/* { dg-final { cleanup-tree-dump "fre1" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp80-2.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp81.c
index bb38f27c0d7..bb38f27c0d7 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/vrp80-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp81.c
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp82.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp82.c
new file mode 100644
index 00000000000..8f9b2ff0544
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp82.c
@@ -0,0 +1,57 @@
+/* { dg-do link } */
+/* { dg-options "-O2" } */
+
+extern void link_error (void);
+
+void
+f2 (int c, int b)
+{
+ int s = 0;
+ if (c == 0)
+ s += 1;
+ else if (c < 1)
+ s -= 1;
+ /* s in [-1, 1]. */
+ b = (b & 1) + 1;
+ /* b in range [1, 2]. */
+ b = s << b;
+ /* b in range [-4, 4]. */
+ if (b == -5 || b == 5)
+ link_error ();
+}
+
+void
+f3 (int s, int b)
+{
+ if (s >> 3 == -2)
+ {
+ /* s in range [-16, -9]. */
+ b = (b & 1) + 1;
+ /* b in range [1, 2]. */
+ b = s << b;
+ /* b in range [bmin << smax, bmax << smin],
+ == [-16 << 2, -9 << 1]
+ == [-64, -18]. */
+ if (b == -65 || b == -17)
+ link_error ();
+ }
+}
+
+void
+f4 (unsigned int s, unsigned int b)
+{
+ s |= ~0xffU;
+ /* s in [0xffffff00, 0xffffffff]. */
+ b = (b & 1) + 1;
+ /* b in [1, 2]. */
+ b = s << b;
+ /* s in [0xfffffc00, 0xfffffffe]. */
+ if (b == ~0x3ffU - 1 || b == ~0x1U + 1)
+ link_error ();
+}
+
+int
+main ()
+{
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp83.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp83.c
new file mode 100644
index 00000000000..6237adfe944
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp83.c
@@ -0,0 +1,60 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp1" } */
+
+extern void vrp_keep (void);
+
+void
+f2 (int c, int b)
+{
+ int s = 0;
+ if (c == 0)
+ s += 1;
+ else if (c < 1)
+ s -= 1;
+ /* s in [-1, 1]. */
+ b = (b & 1) + 1;
+ /* b in range [1, 2]. */
+ b = s << b;
+ /* b in range [-4, 4]. */
+ if (b == -4)
+ vrp_keep ();
+ if (b == 4)
+ vrp_keep ();
+}
+
+void
+f3 (int s, int b)
+{
+ if (s >> 3 == -2)
+ {
+ /* s in range [-16, -9]. */
+ b = (b & 1) + 1;
+ /* b in range [1, 2]. */
+ b = s << b;
+ /* b in range [bmin << smax, bmax << smin],
+ == [-16 << 2, -9 << 1]
+ == [-64, -18]. */
+ if (b == -64)
+ vrp_keep ();
+ if (b == -18)
+ vrp_keep ();
+ }
+}
+
+void
+f4 (unsigned int s, unsigned int b)
+{
+ s |= ~(0xffU);
+ /* s in [0xffffff00, 0xffffffff]. */
+ b = (b & 1) + 1;
+ /* b in [1, 2]. */
+ b = s << b;
+ /* s in [0xfffffc00, 0xfffffffe]. */
+ if (b == ~0x3ffU)
+ vrp_keep ();
+ if (b == ~0x1U)
+ vrp_keep ();
+}
+
+/* { dg-final { scan-tree-dump-times "vrp_keep \\(" 6 "vrp1"} } */
+/* { dg-final { cleanup-tree-dump "vrp1" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp84.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp84.c
new file mode 100644
index 00000000000..8f8dc0d2ebe
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp84.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-vrp1" } */
+
+extern void vrp_keep (void);
+
+void
+f2 (int s, int b)
+{
+ if (s > 1)
+ s = 1;
+ /* s in [minint, 1]. */
+ b = (b & 1) + 1;
+ /* b in range [1, 2]. */
+ b = s << b;
+ /* b in range [minint+4, maxint-3]. */
+ if (b == -2)
+ vrp_keep ();
+}
+
+/* { dg-final { scan-tree-dump-times "vrp_keep \\(" 1 "vrp1"} } */
+/* { dg-final { cleanup-tree-dump "vrp1" } } */
diff --git a/gcc/testsuite/gcc.target/arm/builtin-bswap-1.c b/gcc/testsuite/gcc.target/arm/builtin-bswap-1.c
new file mode 100644
index 00000000000..43195bd8235
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/builtin-bswap-1.c
@@ -0,0 +1,81 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-require-effective-target arm_arch_v6_ok } */
+/* { dg-add-options arm_arch_v6 } */
+/* { dg-final { scan-assembler-not "orr\[ \t\]" } } */
+/* { dg-final { scan-assembler-times "revsh\\t" 1 { target { arm_nothumb } } } } */
+/* { dg-final { scan-assembler-times "revshne\\t" 1 { target { arm_nothumb } } } } */
+/* { dg-final { scan-assembler-times "revsh\\t" 2 { target { ! arm_nothumb } } } } */
+/* { dg-final { scan-assembler-times "rev16\\t" 1 { target { arm_nothumb } } } } */
+/* { dg-final { scan-assembler-times "rev16ne\\t" 1 { target { arm_nothumb } } } } */
+/* { dg-final { scan-assembler-times "rev16\\t" 2 { target { ! arm_nothumb } } } } */
+/* { dg-final { scan-assembler-times "rev\\t" 2 { target { arm_nothumb } } } } */
+/* { dg-final { scan-assembler-times "revne\\t" 2 { target { arm_nothumb } } } } */
+/* { dg-final { scan-assembler-times "rev\\t" 4 { target { ! arm_nothumb } } } } */
+
+/* revsh */
+short swaps16 (short x)
+{
+ return __builtin_bswap16 (x);
+}
+
+extern short foos16 (short);
+
+/* revshne */
+short swaps16_cond (short x, int y)
+{
+ short z = x;
+ if (y)
+ z = __builtin_bswap16 (x);
+ return foos16 (z);
+}
+
+/* rev16 */
+unsigned short swapu16 (unsigned short x)
+{
+ return __builtin_bswap16 (x);
+}
+
+extern unsigned short foou16 (unsigned short);
+
+/* rev16ne */
+unsigned short swapu16_cond (unsigned short x, int y)
+{
+ unsigned short z = x;
+ if (y)
+ z = __builtin_bswap16 (x);
+ return foou16 (z);
+}
+
+/* rev */
+int swaps32 (int x) {
+ return __builtin_bswap32 (x);
+}
+
+extern int foos32 (int);
+
+/* revne */
+int swaps32_cond (int x, int y)
+{
+ int z = x;
+ if (y)
+ z = __builtin_bswap32 (x);
+ return foos32 (z);
+}
+
+/* rev */
+unsigned int swapu32 (unsigned int x)
+{
+ return __builtin_bswap32 (x);
+}
+
+extern unsigned int foou32 (unsigned int);
+
+/* revne */
+unsigned int swapsu2 (unsigned int x, int y)
+{
+ int z = x;
+ if (y)
+ z = __builtin_bswap32 (x);
+ return foou32 (z);
+}
diff --git a/gcc/testsuite/gcc.target/arm/combine-movs.c b/gcc/testsuite/gcc.target/arm/combine-movs.c
index 4209a331427..8925feeb4f2 100644
--- a/gcc/testsuite/gcc.target/arm/combine-movs.c
+++ b/gcc/testsuite/gcc.target/arm/combine-movs.c
@@ -9,4 +9,5 @@ void foo (unsigned long r[], unsigned int d)
r[i] = 0;
}
-/* { dg-final { scan-assembler "movs\tr\[0-9\]" } } */
+/* { dg-final { scan-assembler "lsrs\tr\[0-9\]" { target arm_thumb2_ok } } } */
+/* { dg-final { scan-assembler "movs\tr\[0-9\]" { target { ! arm_thumb2_ok} } } } */
diff --git a/gcc/testsuite/gcc.target/arm/neon-vfma-1.c b/gcc/testsuite/gcc.target/arm/neon-vfma-1.c
new file mode 100644
index 00000000000..a003a8274f6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/neon-vfma-1.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_neonv2_ok } */
+/* { dg-options "-O2 -ftree-vectorize -ffast-math" } */
+/* { dg-add-options arm_neonv2 } */
+/* { dg-final { scan-assembler "vfma\\.f32\[ \]+\[dDqQ]" } } */
+
+/* Verify that VFMA is used. */
+void f1(int n, float a, float x[], float y[]) {
+ int i;
+ for (i = 0; i < n; ++i)
+ y[i] = a * x[i] + y[i];
+}
diff --git a/gcc/testsuite/gcc.target/arm/neon-vfms-1.c b/gcc/testsuite/gcc.target/arm/neon-vfms-1.c
new file mode 100644
index 00000000000..8cefd8a851c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/neon-vfms-1.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target arm_neonv2_ok } */
+/* { dg-options "-O2 -ftree-vectorize -ffast-math" } */
+/* { dg-add-options arm_neonv2 } */
+/* { dg-final { scan-assembler "vfms\\.f32\[ \]+\[dDqQ]" } } */
+
+/* Verify that VFMS is used. */
+void f1(int n, float a, float x[], float y[]) {
+ int i;
+ for (i = 0; i < n; ++i)
+ y[i] = a * -x[i] + y[i];
+}
diff --git a/gcc/testsuite/gcc.target/arm/neon-vmla-1.c b/gcc/testsuite/gcc.target/arm/neon-vmla-1.c
index 9d239ed47d0..c60c014e0c2 100644
--- a/gcc/testsuite/gcc.target/arm/neon-vmla-1.c
+++ b/gcc/testsuite/gcc.target/arm/neon-vmla-1.c
@@ -1,10 +1,10 @@
/* { dg-require-effective-target arm_neon_hw } */
/* { dg-options "-O2 -ftree-vectorize -ffast-math" } */
/* { dg-add-options arm_neon } */
-/* { dg-final { scan-assembler "vmla\\.f32" } } */
+/* { dg-final { scan-assembler "vmla\\.i32" } } */
/* Verify that VMLA is used. */
-void f1(int n, float a, float x[], float y[]) {
+void f1(int n, int a, int x[], int y[]) {
int i;
for (i = 0; i < n; ++i)
y[i] = a * x[i] + y[i];
diff --git a/gcc/testsuite/gcc.target/arm/neon-vmls-1.c b/gcc/testsuite/gcc.target/arm/neon-vmls-1.c
index 2beaebe17cf..89ee82b0fe8 100644
--- a/gcc/testsuite/gcc.target/arm/neon-vmls-1.c
+++ b/gcc/testsuite/gcc.target/arm/neon-vmls-1.c
@@ -1,10 +1,10 @@
/* { dg-require-effective-target arm_neon_hw } */
/* { dg-options "-O2 -ftree-vectorize -ffast-math" } */
/* { dg-add-options arm_neon } */
-/* { dg-final { scan-assembler "vmls\\.f32" } } */
+/* { dg-final { scan-assembler "vmls\\.i32" } } */
/* Verify that VMLS is used. */
-void f1(int n, float a, float x[], float y[]) {
+void f1(int n, int a, int x[], int y[]) {
int i;
for (i = 0; i < n; ++i)
y[i] = y[i] - a * x[i];
diff --git a/gcc/testsuite/gcc.target/arm/neon-vset_lanes8.c b/gcc/testsuite/gcc.target/arm/neon-vset_lanes8.c
index e87102edbe2..51d38fd1dfc 100644
--- a/gcc/testsuite/gcc.target/arm/neon-vset_lanes8.c
+++ b/gcc/testsuite/gcc.target/arm/neon-vset_lanes8.c
@@ -9,11 +9,14 @@
#include <stdlib.h>
#include <string.h>
-int8x8_t x = { 1, 2, 3, 4, 5, 6, 7, 8 };
-int8x8_t y = { 1, 2, 3, 16, 5, 6, 7, 8 };
+int8_t x_init[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
+int8_t y_init[8] = { 1, 2, 3, 16, 5, 6, 7, 8 };
int main (void)
{
+ int8x8_t x = vld1_s8 (x_init);
+ int8x8_t y = vld1_s8 (y_init);
+
x = vset_lane_s8 (16, x, 3);
if (memcmp (&x, &y, sizeof (x)) != 0)
abort();
diff --git a/gcc/testsuite/gcc.target/arm/pr48252.c b/gcc/testsuite/gcc.target/arm/pr48252.c
index 1a06c71e1be..17f729bb341 100644
--- a/gcc/testsuite/gcc.target/arm/pr48252.c
+++ b/gcc/testsuite/gcc.target/arm/pr48252.c
@@ -8,11 +8,14 @@
int main(void)
{
- uint8x8_t v1 = {1, 1, 1, 1, 1, 1, 1, 1};
- uint8x8_t v2 = {2, 2, 2, 2, 2, 2, 2, 2};
+ uint8_t v1_init[8] = {1, 1, 1, 1, 1, 1, 1, 1};
+ uint8_t v2_init[8] = {2, 2, 2, 2, 2, 2, 2, 2};
+ uint8x8_t v1 = vld1_u8 (v1_init);
+ uint8x8_t v2 = vld1_u8 (v2_init);
uint8x8x2_t vd1, vd2;
union {uint8x8_t v; uint8_t buf[8];} d1, d2, d3, d4;
int i;
+ uint8_t odd, even;
vd1 = vzip_u8(v1, vdup_n_u8(0));
vd2 = vzip_u8(v2, vdup_n_u8(0));
@@ -22,9 +25,17 @@ int main(void)
vst1_u8(d3.buf, vd2.val[0]);
vst1_u8(d4.buf, vd2.val[1]);
+#ifdef __ARMEL__
+ odd = 1;
+ even = 0;
+#else
+ odd = 0;
+ even = 1;
+#endif
+
for (i = 0; i < 8; i++)
- if ((i % 2 == 0 && d4.buf[i] != 2)
- || (i % 2 == 1 && d4.buf[i] != 0))
+ if ((i % 2 == even && d4.buf[i] != 2)
+ || (i % 2 == odd && d4.buf[i] != 0))
abort ();
return 0;
diff --git a/gcc/testsuite/gcc.target/arm/pr51835.c b/gcc/testsuite/gcc.target/arm/pr51835.c
index 858b72f8ad8..500eb6e9f7b 100644
--- a/gcc/testsuite/gcc.target/arm/pr51835.c
+++ b/gcc/testsuite/gcc.target/arm/pr51835.c
@@ -11,4 +11,5 @@ unsigned int func2 (double d)
return (unsigned int)d;
}
-/* { dg-final { scan-assembler-times "fmrrd\[\\t \]+r0,\[\\t \]*r1,\[\\t \]*d0" 2 } } */
+/* { dg-final { scan-assembler-times "fmrrd\[\\t \]+r0,\[\\t \]*r1,\[\\t \]*d0" 2 { target { arm_little_endian } } } } */
+/* { dg-final { scan-assembler-times "fmrrd\[\\t \]+r1,\[\\t \]*r0,\[\\t \]*d0" 2 { target { ! arm_little_endian } } } } */
diff --git a/gcc/testsuite/gcc.target/avr/torture/fix-types.h b/gcc/testsuite/gcc.target/avr/torture/fix-types.h
new file mode 100644
index 00000000000..f6a2aeb6fa2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/fix-types.h
@@ -0,0 +1,134 @@
+typedef __INT8_TYPE__ int_hr_t;
+typedef __UINT8_TYPE__ int_uhr_t;
+
+typedef __INT16_TYPE__ int_hk_t;
+typedef __UINT16_TYPE__ int_uhk_t;
+typedef __INT16_TYPE__ int_r_t;
+typedef __UINT16_TYPE__ int_ur_t;
+
+typedef __INT32_TYPE__ int_k_t;
+typedef __UINT32_TYPE__ int_uk_t;
+typedef __INT32_TYPE__ int_lr_t;
+typedef __UINT32_TYPE__ int_ulr_t;
+
+typedef __INT64_TYPE__ int_lk_t;
+typedef __UINT64_TYPE__ int_ulk_t;
+typedef __INT64_TYPE__ int_llr_t;
+typedef __UINT64_TYPE__ int_ullr_t;
+typedef __INT64_TYPE__ int_llk_t;
+typedef __UINT64_TYPE__ int_ullk_t;
+
+typedef __INT16_TYPE__ xint_hr_t;
+typedef __UINT16_TYPE__ xint_uhr_t;
+
+typedef __INT32_TYPE__ xint_hk_t;
+typedef __UINT32_TYPE__ xint_uhk_t;
+typedef __INT32_TYPE__ xint_r_t;
+typedef __UINT32_TYPE__ xint_ur_t;
+
+typedef __INT64_TYPE__ xint_k_t;
+typedef __UINT64_TYPE__ xint_uk_t;
+typedef __INT64_TYPE__ xint_lr_t;
+typedef __UINT64_TYPE__ xint_ulr_t;
+
+#define INThr_MAX __INT8_MAX__
+#define INThr_MIN (-__INT8_MAX__-1)
+#define INTuhr_MAX __UINT8_MAX__
+
+#define INTr_MAX __INT16_MAX__
+#define INTr_MIN (-__INT16_MAX__-1)
+#define INTur_MAX __UINT16_MAX__
+
+#define INThk_MAX __INT16_MAX__
+#define INThk_MIN (-__INT16_MAX__-1)
+#define INTuhk_MAX __UINT16_MAX__
+
+#define INTlr_MAX __INT32_MAX__
+#define INTlr_MIN (-__INT32_MAX__-1)
+#define INTulr_MAX __UINT32_MAX__
+
+#define INTk_MAX __INT32_MAX__
+#define INTk_MIN (-__INT32_MAX__-1)
+#define INTuk_MAX __UINT32_MAX__
+
+#define INTlk_MAX __INT64_MAX__
+#define INTlk_MIN (-__INT64_MAX__-1)
+#define INTulk_MAX __UINT64_MAX__
+
+#define INTllk_MAX __INT64_MAX__
+#define INTllk_MIN (-__INT64_MAX__-1)
+#define INTullk_MAX __UINT64_MAX__
+
+#define SS_FUN(NAME, OP, T, FX) \
+ T __attribute__((noinline,noclone)) \
+ NAME##_##FX (T fa, T fb) \
+ { \
+ int_##FX##_t ia; \
+ int_##FX##_t ib; \
+ xint_##FX##_t ic; \
+ __builtin_memcpy (&ia, &fa, sizeof (ia)); \
+ __builtin_memcpy (&ib, &fb, sizeof (ib)); \
+ ic = (xint_##FX##_t) ia OP ib; \
+ if (ic > INT##FX##_MAX) \
+ ic = INT##FX##_MAX; \
+ else if (ic < INT##FX##_MIN) \
+ ic = INT##FX##_MIN; \
+ ia = (int_##FX##_t) ic; \
+ __builtin_memcpy (&fa, &ia, sizeof (ia)); \
+ return fa; \
+ }
+
+#define US_FUN(NAME, OP, T, FX) \
+ T __attribute__((noinline,noclone)) \
+ NAME##_##FX (T fa, T fb) \
+ { \
+ int_##FX##_t ia; \
+ int_##FX##_t ib; \
+ xint_##FX##_t ic; \
+ __builtin_memcpy (&ia, &fa, sizeof (ia)); \
+ __builtin_memcpy (&ib, &fb, sizeof (ib)); \
+ ic = (xint_##FX##_t) ia OP ib; \
+ if (ic > INT##FX##_MAX) \
+ ic = INT##FX##_MAX; \
+ else if (ic < 0) \
+ ic = 0; \
+ ia = (int_##FX##_t) ic; \
+ __builtin_memcpy (&fa, &ia, sizeof (ia)); \
+ return fa; \
+ }
+
+#define SS_LFUN(NAME, OP, T, FX, CMP) \
+ T __attribute__((noinline,noclone)) \
+ NAME##_##FX (T fa, T fb) \
+ { \
+ int_##FX##_t ia; \
+ int_##FX##_t ib; \
+ int_##FX##_t ic; \
+ __builtin_memcpy (&ia, &fa, sizeof (ia)); \
+ __builtin_memcpy (&ib, &fb, sizeof (ib)); \
+ ic = (int_##FX##_t) ia OP ib; \
+ if (ic < ia && ib CMP 0) \
+ ic = INT##FX##_MAX; \
+ else if (ic > ia && 0 CMP ib) \
+ ic = INT##FX##_MIN; \
+ __builtin_memcpy (&fa, &ic, sizeof (ic)); \
+ return fa; \
+ }
+
+#define US_LFUN(NAME, OP, T, FX, CMP) \
+ T __attribute__((noinline,noclone)) \
+ NAME##_##FX (T fa, T fb) \
+ { \
+ int_##FX##_t ia; \
+ int_##FX##_t ib; \
+ int_##FX##_t ic; \
+ __builtin_memcpy (&ia, &fa, sizeof (ia)); \
+ __builtin_memcpy (&ib, &fb, sizeof (ib)); \
+ ic = (int_##FX##_t) ia OP ib; \
+ if (ia CMP ic && 1 CMP 0) \
+ ic = INT##FX##_MAX; \
+ if (ia CMP ic && 0 CMP 1) \
+ ic = 0; \
+ __builtin_memcpy (&fa, &ic, sizeof (ic)); \
+ return fa; \
+ }
diff --git a/gcc/testsuite/gcc.target/avr/torture/sat-hr-plus-minus.c b/gcc/testsuite/gcc.target/avr/torture/sat-hr-plus-minus.c
new file mode 100644
index 00000000000..1e6215e4f41
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/sat-hr-plus-minus.c
@@ -0,0 +1,98 @@
+/* { dg-do run } */
+/* { dg-options "-std=gnu99 -fwrapv" } */
+
+#include "fix-types.h"
+
+extern void abort (void);
+extern void exit (int);
+
+typedef short _Fract fx_t;
+typedef short _Sat _Fract satfx_t;
+typedef char intfx_t;
+
+SS_FUN (ss_add, +, fx_t, hr)
+SS_FUN (ss_sub, -, fx_t, hr)
+
+#define VAL(N, X) \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_add2_##N (satfx_t a) \
+ { \
+ return ss_add_hr (a, X##P##-##7hr); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_add_##N (satfx_t a) \
+ { \
+ return a + X##P##-##7hr; \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_sub2_##N (satfx_t a) \
+ { \
+ return ss_sub_hr (a, X##P##-##7hr); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_sub_##N (satfx_t a) \
+ { \
+ return a - X##P##-##7hr; \
+ }
+#include "vals-hr.def"
+#undef VAL
+
+__attribute__((noinline,noclone))
+satfx_t ss_add2_99 (satfx_t a)
+{
+ return ss_add_hr (a, __FRACT_MIN__);
+}
+
+__attribute__((noinline,noclone))
+satfx_t ss_add_99 (satfx_t a)
+{
+ return a + __FRACT_MIN__;
+}
+
+__attribute__((noinline,noclone))
+satfx_t ss_sub2_99 (satfx_t a)
+{
+ return ss_sub_hr (a, __FRACT_MIN__);
+}
+
+__attribute__((noinline,noclone))
+satfx_t ss_sub_99 (satfx_t a)
+{
+ return a - __FRACT_MIN__;
+}
+
+
+satfx_t (* __flash const fun[])(satfx_t) =
+{
+#define VAL(N, X) \
+ ss_add_##N, ss_add2_##N, \
+ ss_sub_##N, ss_sub2_##N,
+#include "vals-hr.def"
+ VAL (99,)
+#undef VAL
+};
+
+
+const volatile __flash intfx_t vals[] =
+ {
+ 0, 1, 2, 0x7f, 0x80, 0x81, 0xff,
+ 0x40, 0x3e, 0x3f, 0xbf, 0xc0, 0xc1
+ };
+
+int main (void)
+{
+ for (unsigned int i = 0; i < sizeof (vals) / sizeof (*vals); i++)
+ {
+ satfx_t a, f1, f2;
+ intfx_t val = vals[i];
+ __builtin_memcpy (&a, &val, sizeof (satfx_t));
+ for (unsigned int f = 0; f < sizeof (fun) / sizeof (*fun); f += 2)
+ {
+ if (fun[f](a) != fun[f+1](a))
+ abort();
+ }
+ }
+
+ exit (0);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/avr/torture/sat-k-plus-minus.c b/gcc/testsuite/gcc.target/avr/torture/sat-k-plus-minus.c
new file mode 100644
index 00000000000..8a26ffeeb3e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/sat-k-plus-minus.c
@@ -0,0 +1,108 @@
+/* { dg-do run } */
+/* { dg-options "-std=gnu99 -fwrapv" } */
+
+#include "fix-types.h"
+
+extern void abort (void);
+extern void exit (int);
+
+typedef _Accum fx_t;
+typedef _Sat _Accum satfx_t;
+typedef long intfx_t;
+
+SS_FUN (ss_add, +, fx_t, k)
+SS_FUN (ss_sub, -, fx_t, k)
+
+#define VAL(N, X) \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_add2_##N (satfx_t a) \
+ { \
+ return ss_add_k (a, X##P##-##16k); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_add_##N (satfx_t a) \
+ { \
+ return a + X##P##-##16k; \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_sub2_##N (satfx_t a) \
+ { \
+ return ss_sub_k (a, X##P##-##16k); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_sub_##N (satfx_t a) \
+ { \
+ return a - X##P##-##16k; \
+ }
+#include "vals-k.def"
+#undef VAL
+
+__attribute__((noinline,noclone))
+satfx_t ss_add2_99 (satfx_t a)
+{
+ return ss_add_k (a, __ACCUM_MIN__);
+}
+
+__attribute__((noinline,noclone))
+satfx_t ss_add_99 (satfx_t a)
+{
+ return a + __ACCUM_MIN__;
+}
+
+__attribute__((noinline,noclone))
+satfx_t ss_sub2_99 (satfx_t a)
+{
+ return ss_sub_k (a, __ACCUM_MIN__);
+}
+
+__attribute__((noinline,noclone))
+satfx_t ss_sub_99 (satfx_t a)
+{
+ return a - __ACCUM_MIN__;
+}
+
+
+satfx_t (* __flash const fun[])(satfx_t) =
+{
+#define VAL(N, X) \
+ ss_add_##N, ss_add2_##N, \
+ ss_sub_##N, ss_sub2_##N,
+#include "vals-k.def"
+ VAL (99,)
+#undef VAL
+};
+
+
+const volatile __flash intfx_t vals[] =
+ {
+ 0, -1, 1, -2, 2, -127, -128, -129,
+ 0x7f, 0x80, 0x81, 0x100,
+ 0x40000000, 0x3e800000, 0x3f800000,
+ 0x7ffffffe, 0x7fffffff, 0x7f800000,
+ 0x7f7f7f7f, 0x7f810080, 0x7f008000,
+ 0x7f000001,
+ 0x80000000, 0x80000001, 0x80808080,
+ 0x80810000, 0x80ffffff, 0x80fffffe,
+ 0x81000000, 0x81800000, 0x81800000,
+ 0xff000000, 0xffffff01, 0xffffff80,
+ 0xffffff7f, 0xff80ff80
+ };
+
+
+int main (void)
+{
+ for (unsigned int i = 0; i < sizeof (vals) / sizeof (*vals); i++)
+ {
+ satfx_t a, f1, f2;
+ intfx_t val = vals[i];
+ __builtin_memcpy (&a, &val, sizeof (satfx_t));
+ for (unsigned int f = 0; f < sizeof (fun) / sizeof (*fun); f += 2)
+ {
+ if (fun[f](a) != fun[f+1](a))
+ abort();
+ }
+ }
+
+ exit (0);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/avr/torture/sat-llk-plus-minus.c b/gcc/testsuite/gcc.target/avr/torture/sat-llk-plus-minus.c
new file mode 100644
index 00000000000..e81cbb187e0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/sat-llk-plus-minus.c
@@ -0,0 +1,108 @@
+/* { dg-do run } */
+/* { dg-options "-std=gnu99 -fwrapv" } */
+
+#include "fix-types.h"
+
+extern void abort (void);
+extern void exit (int);
+
+typedef long long _Accum fx_t;
+typedef long long _Sat _Accum satfx_t;
+typedef long long intfx_t;
+
+SS_LFUN (ss_add, +, fx_t, llk, >)
+SS_LFUN (ss_sub, -, fx_t, llk, <)
+
+#define VAL(N, X) \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_add2_##N (satfx_t a) \
+ { \
+ return ss_add_llk (a, X##P##-##48llk); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_add_##N (satfx_t a) \
+ { \
+ return a + X##P##-##48llk; \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_sub2_##N (satfx_t a) \
+ { \
+ return ss_sub_llk (a, X##P##-##48llk); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_sub_##N (satfx_t a) \
+ { \
+ return a - X##P##-##48llk; \
+ }
+#include "vals-llk.def"
+#undef VAL
+
+__attribute__((noinline,noclone))
+satfx_t ss_add2_99 (satfx_t a)
+{
+ return ss_add_llk (a, __LLACCUM_MIN__);
+}
+
+__attribute__((noinline,noclone))
+satfx_t ss_add_99 (satfx_t a)
+{
+ return a + __LLACCUM_MIN__;
+}
+
+__attribute__((noinline,noclone))
+satfx_t ss_sub2_99 (satfx_t a)
+{
+ return ss_sub_llk (a, __LLACCUM_MIN__);
+}
+
+__attribute__((noinline,noclone))
+satfx_t ss_sub_99 (satfx_t a)
+{
+ return a - __LLACCUM_MIN__;
+}
+
+
+satfx_t (* __flash const fun[])(satfx_t) =
+{
+#define VAL(N, X) \
+ ss_add_##N, ss_add2_##N, \
+ ss_sub_##N, ss_sub2_##N,
+#include "vals-llk.def"
+ VAL (99,)
+#undef VAL
+};
+
+
+const volatile __flash intfx_t vals[] =
+ {
+ 0, -1, 1, -2, 2, -127, -128, -129,
+ 0x7f, 0x80, 0x81, 0x100,
+ 0x4000000000000000, 0x3e80000000000000, 0x3f80000000000000,
+ 0x7ffffffffffffffe, 0x7fffffffffffffff, 0x7f80000000000000,
+ 0x7f7f7f7f7f7f7f7f, 0x7f81000000000080, 0x7f00000080000000,
+ 0x7f00000000000001,
+ 0x8000000000000000, 0x8000000000000001, 0x8080808080808080,
+ 0x8081000000000000, 0x80ffffffffffffff, 0x80fffffffffffffe,
+ 0x8100000000000000, 0x8180000000000000, 0x818000000000000,
+ 0xff00000000000000, 0xffffffffffffff01, 0xffffffffffffff80,
+ 0xffffffffffffff7f, 0xff80ff80ff80ff80
+ };
+
+
+int main (void)
+{
+ for (unsigned int i = 0; i < sizeof (vals) / sizeof (*vals); i++)
+ {
+ satfx_t a, f1, f2;
+ intfx_t val = vals[i];
+ __builtin_memcpy (&a, &val, sizeof (satfx_t));
+ for (unsigned int f = 0; f < sizeof (fun) / sizeof (*fun); f += 2)
+ {
+ if (fun[f](a) != fun[f+1](a))
+ abort();
+ }
+ }
+
+ exit (0);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/avr/torture/sat-r-plus-minus.c b/gcc/testsuite/gcc.target/avr/torture/sat-r-plus-minus.c
new file mode 100644
index 00000000000..e59bcf655ab
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/sat-r-plus-minus.c
@@ -0,0 +1,107 @@
+/* { dg-do run } */
+/* { dg-options "-std=gnu99 -fwrapv" } */
+
+#include "fix-types.h"
+
+extern void abort (void);
+extern void exit (int);
+
+typedef _Fract fx_t;
+typedef _Sat _Fract satfx_t;
+typedef int intfx_t;
+
+SS_FUN (ss_add, +, fx_t, r)
+SS_FUN (ss_sub, -, fx_t, r)
+
+#define VAL(N, X) \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_add2_##N (satfx_t a) \
+ { \
+ return ss_add_r (a, X##P##-##15r); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_add_##N (satfx_t a) \
+ { \
+ return a + X##P##-##15r; \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_sub2_##N (satfx_t a) \
+ { \
+ return ss_sub_r (a, X##P##-##15r); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t ss_sub_##N (satfx_t a) \
+ { \
+ return a - X##P##-##15r; \
+ }
+#include "vals-r.def"
+#undef VAL
+
+__attribute__((noinline,noclone))
+satfx_t ss_add2_99 (satfx_t a)
+{
+ return ss_add_r (a, __FRACT_MIN__);
+}
+
+__attribute__((noinline,noclone))
+satfx_t ss_add_99 (satfx_t a)
+{
+ return a + __FRACT_MIN__;
+}
+
+__attribute__((noinline,noclone))
+satfx_t ss_sub2_99 (satfx_t a)
+{
+ return ss_sub_r (a, __FRACT_MIN__);
+}
+
+__attribute__((noinline,noclone))
+satfx_t ss_sub_99 (satfx_t a)
+{
+ return a - __FRACT_MIN__;
+}
+
+
+satfx_t (* __flash const fun[])(satfx_t) =
+{
+#define VAL(N, X) \
+ ss_add_##N, ss_add2_##N, \
+ ss_sub_##N, ss_sub2_##N,
+#include "vals-r.def"
+ VAL (99,)
+#undef VAL
+};
+
+
+const volatile __flash intfx_t vals[] =
+ {
+ 0, -1, 1, -2, 2, -127, -128, -129,
+ 0x7f, 0x80, 0x81, 0x100,
+ 0x4000, 0x3e80, 0x3f80,
+ 0x7ffe, 0x7fff,
+ 0x7f7f, 0x7f81, 0x7f80,
+ 0x7f01,
+ 0x8000, 0x8001, 0x8080,
+ 0x8081, 0x80ff, 0x80fe,
+ 0x8100, 0x8180, 0x817f,
+ 0xff00, 0xff01, 0xff01,
+ 0xff7f, 0xff80
+ };
+
+int main (void)
+{
+ for (unsigned int i = 0; i < sizeof (vals) / sizeof (*vals); i++)
+ {
+ satfx_t a, f1, f2;
+ intfx_t val = vals[i];
+ __builtin_memcpy (&a, &val, sizeof (satfx_t));
+ for (unsigned int f = 0; f < sizeof (fun) / sizeof (*fun); f += 2)
+ {
+ if (fun[f](a) != fun[f+1](a))
+ abort();
+ }
+ }
+
+ exit (0);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/avr/torture/sat-uhr-plus-minus.c b/gcc/testsuite/gcc.target/avr/torture/sat-uhr-plus-minus.c
new file mode 100644
index 00000000000..6dd191f7ac3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/sat-uhr-plus-minus.c
@@ -0,0 +1,73 @@
+/* { dg-do run } */
+/* { dg-options "-std=gnu99 -fwrapv" } */
+
+#include "fix-types.h"
+
+extern void abort (void);
+extern void exit (int);
+
+typedef unsigned short _Fract fx_t;
+typedef unsigned short _Sat _Fract satfx_t;
+typedef unsigned char intfx_t;
+
+US_LFUN (us_add, +, fx_t, uhr, >)
+US_LFUN (us_sub, -, fx_t, uhr, <)
+
+#define VAL(N, X) \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_add2_##N (satfx_t a) \
+ { \
+ return us_add_uhr (a, X##P##-##8uhr); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_add_##N (satfx_t a) \
+ { \
+ return a + X##P##-##8uhr; \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_sub2_##N (satfx_t a) \
+ { \
+ return us_sub_uhr (a, X##P##-##8uhr); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_sub_##N (satfx_t a) \
+ { \
+ return a - X##P##-##8uhr; \
+ }
+#include "vals-uhr.def"
+#undef VAL
+
+satfx_t (* __flash const fun[])(satfx_t) =
+{
+#define VAL(N, X) \
+ us_add_##N, us_add2_##N, \
+ us_sub_##N, us_sub2_##N,
+#include "vals-uhr.def"
+#undef VAL
+};
+
+
+const volatile __flash intfx_t vals[] =
+ {
+ 0, 1, 2, 0x7f, 0x80, 0x81, 0xff,
+ 0x40, 0x3e, 0x3f, 0xbf, 0xc0, 0xc1
+ };
+
+
+int main (void)
+{
+ for (unsigned int i = 0; i < sizeof (vals) / sizeof (*vals); i++)
+ {
+ satfx_t a, f1, f2;
+ intfx_t val = vals[i];
+ __builtin_memcpy (&a, &val, sizeof (satfx_t));
+ for (unsigned int f = 0; f < sizeof (fun) / sizeof (*fun); f += 2)
+ {
+ if (fun[f](a) != fun[f+1](a))
+ abort();
+ }
+ }
+
+ exit (0);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/avr/torture/sat-uk-plus-minus.c b/gcc/testsuite/gcc.target/avr/torture/sat-uk-plus-minus.c
new file mode 100644
index 00000000000..c9a7cd6ba4d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/sat-uk-plus-minus.c
@@ -0,0 +1,82 @@
+/* { dg-do run } */
+/* { dg-options "-std=gnu99 -fwrapv" } */
+
+#include "fix-types.h"
+
+extern void abort (void);
+extern void exit (int);
+
+typedef unsigned _Accum fx_t;
+typedef unsigned _Sat _Accum satfx_t;
+typedef unsigned long intfx_t;
+
+US_LFUN (us_add, +, fx_t, uk, >)
+US_LFUN (us_sub, -, fx_t, uk, <)
+
+#define VAL(N, X) \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_add2_##N (satfx_t a) \
+ { \
+ return us_add_uk (a, X##P##-##16uk); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_add_##N (satfx_t a) \
+ { \
+ return a + X##P##-##16uk; \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_sub2_##N (satfx_t a) \
+ { \
+ return us_sub_uk (a, X##P##-##16uk); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_sub_##N (satfx_t a) \
+ { \
+ return a - X##P##-##16uk; \
+ }
+#include "vals-uk.def"
+#undef VAL
+
+satfx_t (* __flash const fun[])(satfx_t) =
+{
+#define VAL(N, X) \
+ us_add_##N, us_add2_##N, \
+ us_sub_##N, us_sub2_##N,
+#include "vals-uk.def"
+#undef VAL
+};
+
+
+const volatile __flash intfx_t vals[] =
+ {
+ 0, -1, 1, -2, 2, -127, -128, -129,
+ 0x7f, 0x80, 0x81, 0x100,
+ 0x40000000, 0x3e800000, 0x3f800000,
+ 0x7ffffffe, 0x7fffffff, 0x7f800000,
+ 0x7f7f7f7f, 0x7f810080, 0x7f008000,
+ 0x7f000001,
+ 0x80000000, 0x80000001, 0x80808080,
+ 0x80810000, 0x80ffffff, 0x80fffffe,
+ 0x81000000, 0x81800000, 0x81800000,
+ 0xff000000, 0xffffff01, 0xffffff80,
+ 0xffffff7f, 0xff80ff80
+ };
+
+
+int main (void)
+{
+ for (unsigned int i = 0; i < sizeof (vals) / sizeof (*vals); i++)
+ {
+ satfx_t a, f1, f2;
+ intfx_t val = vals[i];
+ __builtin_memcpy (&a, &val, sizeof (satfx_t));
+ for (unsigned int f = 0; f < sizeof (fun) / sizeof (*fun); f += 2)
+ {
+ if (fun[f](a) != fun[f+1](a))
+ abort();
+ }
+ }
+
+ exit (0);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/avr/torture/sat-ullk-plus-minus.c b/gcc/testsuite/gcc.target/avr/torture/sat-ullk-plus-minus.c
new file mode 100644
index 00000000000..22ebb8af50f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/sat-ullk-plus-minus.c
@@ -0,0 +1,82 @@
+/* { dg-do run } */
+/* { dg-options "-std=gnu99 -fwrapv" } */
+
+#include "fix-types.h"
+
+extern void abort (void);
+extern void exit (int);
+
+typedef unsigned long long _Accum fx_t;
+typedef unsigned long long _Sat _Accum satfx_t;
+typedef unsigned long long intfx_t;
+
+US_LFUN (us_add, +, fx_t, ullk, >)
+US_LFUN (us_sub, -, fx_t, ullk, <)
+
+#define VAL(N, X) \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_add2_##N (satfx_t a) \
+ { \
+ return us_add_ullk (a, X##P##-##48ullk); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_add_##N (satfx_t a) \
+ { \
+ return a + X##P##-##48ullk; \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_sub2_##N (satfx_t a) \
+ { \
+ return us_sub_ullk (a, X##P##-##48ullk); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_sub_##N (satfx_t a) \
+ { \
+ return a - X##P##-##48ullk; \
+ }
+#include "vals-ullk.def"
+#undef VAL
+
+satfx_t (* __flash const fun[])(satfx_t) =
+{
+#define VAL(N, X) \
+ us_add_##N, us_add2_##N, \
+ us_sub_##N, us_sub2_##N,
+#include "vals-ullk.def"
+#undef VAL
+};
+
+
+const volatile __flash intfx_t vals[] =
+ {
+ 0, -1, 1, -2, 2, -127, -128, -129,
+ 0x7f, 0x80, 0x81, 0x100,
+ 0x4000000000000000, 0x3e80000000000000, 0x3f80000000000000,
+ 0x7ffffffffffffffe, 0x7fffffffffffffff, 0x7f80000000000000,
+ 0x7f7f7f7f7f7f7f7f, 0x7f81000000000080, 0x7f00000080000000,
+ 0x7f00000000000001,
+ 0x8000000000000000, 0x8000000000000001, 0x8080808080808080,
+ 0x8081000000000000, 0x80ffffffffffffff, 0x80fffffffffffffe,
+ 0x8100000000000000, 0x8180000000000000, 0x818000000000000,
+ 0xff00000000000000, 0xffffffffffffff01, 0xffffffffffffff80,
+ 0xffffffffffffff7f, 0xff80ff80ff80ff80
+ };
+
+
+int main (void)
+{
+ for (unsigned int i = 0; i < sizeof (vals) / sizeof (*vals); i++)
+ {
+ satfx_t a, f1, f2;
+ intfx_t val = vals[i];
+ __builtin_memcpy (&a, &val, sizeof (satfx_t));
+ for (unsigned int f = 0; f < sizeof (fun) / sizeof (*fun); f += 2)
+ {
+ if (fun[f](a) != fun[f+1](a))
+ abort();
+ }
+ }
+
+ exit (0);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/avr/torture/sat-ur-plus-minus.c b/gcc/testsuite/gcc.target/avr/torture/sat-ur-plus-minus.c
new file mode 100644
index 00000000000..bc3c0bbcd94
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/sat-ur-plus-minus.c
@@ -0,0 +1,82 @@
+/* { dg-do run } */
+/* { dg-options "-std=gnu99 -fwrapv" } */
+
+#include "fix-types.h"
+
+extern void abort (void);
+extern void exit (int);
+
+typedef unsigned _Fract fx_t;
+typedef unsigned _Sat _Fract satfx_t;
+typedef unsigned int intfx_t;
+
+US_LFUN (us_add, +, fx_t, ur, >)
+US_LFUN (us_sub, -, fx_t, ur, <)
+
+#define VAL(N, X) \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_add2_##N (satfx_t a) \
+ { \
+ return us_add_ur (a, X##P##-##16ur); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_add_##N (satfx_t a) \
+ { \
+ return a + X##P##-##16ur; \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_sub2_##N (satfx_t a) \
+ { \
+ return us_sub_ur (a, X##P##-##16ur); \
+ } \
+ __attribute__((noinline,noclone)) \
+ satfx_t us_sub_##N (satfx_t a) \
+ { \
+ return a - X##P##-##16ur; \
+ }
+#include "vals-ur.def"
+#undef VAL
+
+satfx_t (* __flash const fun[])(satfx_t) =
+{
+#define VAL(N, X) \
+ us_add_##N, us_add2_##N, \
+ us_sub_##N, us_sub2_##N,
+#include "vals-ur.def"
+#undef VAL
+};
+
+
+const volatile __flash intfx_t vals[] =
+ {
+ 0, -1, 1, -2, 2, -127, -128, -129,
+ 0x7f, 0x80, 0x81, 0x100,
+ 0x4000, 0x3e80, 0x3f80,
+ 0x7ffe, 0x7fff,
+ 0x7f7f, 0x7f81, 0x7f80,
+ 0x7f01,
+ 0x8000, 0x8001, 0x8080,
+ 0x8081, 0x80ff, 0x80fe,
+ 0x8100, 0x8180, 0x817f,
+ 0xff00, 0xff01, 0xff01,
+ 0xff7f, 0xff80
+ };
+
+
+int main (void)
+{
+ for (unsigned int i = 0; i < sizeof (vals) / sizeof (*vals); i++)
+ {
+ satfx_t a, f1, f2;
+ intfx_t val = vals[i];
+ __builtin_memcpy (&a, &val, sizeof (satfx_t));
+ for (unsigned int f = 0; f < sizeof (fun) / sizeof (*fun); f += 2)
+ {
+ if (fun[f](a) != fun[f+1](a))
+ abort();
+ }
+ }
+
+ exit (0);
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/avr/torture/vals-hr.def b/gcc/testsuite/gcc.target/avr/torture/vals-hr.def
new file mode 100644
index 00000000000..f6619c2ff57
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/vals-hr.def
@@ -0,0 +1,12 @@
+VAL (01, 0x0)
+VAL (02, 0x1)
+VAL (03, 0x3f)
+VAL (04,-0x3f)
+VAL (07, 0x40)
+VAL (08,-0x40)
+VAL (10,-0x1)
+VAL (12, 0x3f)
+VAL (13,-0x3f)
+VAL (14, 0x7f)
+VAL (15,-0x7f)
+
diff --git a/gcc/testsuite/gcc.target/avr/torture/vals-k.def b/gcc/testsuite/gcc.target/avr/torture/vals-k.def
new file mode 100644
index 00000000000..a490c69b366
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/vals-k.def
@@ -0,0 +1,32 @@
+VAL (01, 0x0)
+VAL (02, 0x1)
+VAL (03, 0x3f)
+VAL (04, 0x80)
+VAL (05, -0x1)
+VAL (06, -0x3f)
+VAL (07, 0x40000000)
+VAL (08,-0x40000000)
+
+VAL (10,-0x7fffffff)
+VAL (11, 0x7fffffff)
+VAL (12, 0x7f800000)
+VAL (13,-0x7f800000)
+VAL (14, 0x7f800001)
+VAL (15,-0x7f800001)
+VAL (16, 0x7f7f7f7f)
+VAL (17,-0x7f7f7f7f)
+VAL (18, 0x7f808080)
+VAL (19,-0x7f808080)
+VAL (20, 0x3e800000)
+VAL (21,-0x3e800000)
+VAL (22, 0x3f800000)
+VAL (23,-0x3f800000)
+VAL (24, 0x400000)
+VAL (25,-0x400000)
+VAL (26, 0x3f000000)
+VAL (27,-0x3f000000)
+VAL (28, 0xffff00)
+VAL (29,-0xffff00)
+VAL (30, 0x00ff00ff)
+VAL (31,-0x00ff00ff)
+
diff --git a/gcc/testsuite/gcc.target/avr/torture/vals-llk.def b/gcc/testsuite/gcc.target/avr/torture/vals-llk.def
new file mode 100644
index 00000000000..726a7ebed35
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/vals-llk.def
@@ -0,0 +1,32 @@
+VAL (01, 0x0)
+VAL (02, 0x1)
+VAL (03, 0x3f)
+VAL (04, 0x80)
+VAL (05, -0x1)
+VAL (06, -0x3f)
+VAL (07, 0x4000000000000000)
+VAL (08,-0x4000000000000000)
+
+VAL (10,-0x7fffffffffffffff)
+VAL (11, 0x7fffffffffffffff)
+VAL (12, 0x7f80000000000000)
+VAL (13,-0x7f80000000000000)
+VAL (14, 0x7f80000000000001)
+VAL (15,-0x7f80000000000001)
+VAL (16, 0x7f7f7f7f7f7f7f7f)
+VAL (17,-0x7f7f7f7f7f7f7f7f)
+VAL (18, 0x7f80808080808000)
+VAL (19,-0x7f80808080808000)
+VAL (20, 0x3e80000000000000)
+VAL (21,-0x3e80000000000000)
+VAL (22, 0x3f80000000000000)
+VAL (23,-0x3f80000000000000)
+VAL (24, 0x40000000000000)
+VAL (25,-0x40000000000000)
+VAL (26, 0x3f000000000000)
+VAL (27,-0x3f000000000000)
+VAL (28, 0xffffff00)
+VAL (29,-0xffffff00)
+VAL (30, 0x00ff00ff00ff00ff)
+VAL (31,-0x00ff00ff00ff00ff)
+
diff --git a/gcc/testsuite/gcc.target/avr/torture/vals-r.def b/gcc/testsuite/gcc.target/avr/torture/vals-r.def
new file mode 100644
index 00000000000..0c5f83f7d02
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/vals-r.def
@@ -0,0 +1,30 @@
+VAL (01, 0x0)
+VAL (02, 0x1)
+VAL (03, 0x3f)
+VAL (04, 0x80)
+VAL (05, -0x1)
+VAL (06, -0x3f)
+VAL (07, 0x4000)
+VAL (08,-0x4000)
+
+VAL (10,-0x7fff)
+VAL (11, 0x7fff)
+VAL (12, 0x7f80)
+VAL (13,-0x7f80)
+VAL (14, 0x7f81)
+VAL (15,-0x7f81)
+VAL (16, 0x7f7f)
+VAL (17,-0x7f7f)
+VAL (18, 0x7f80)
+VAL (19,-0x7f80)
+VAL (20, 0x3e80)
+VAL (21,-0x3e80)
+VAL (22, 0x3f80)
+VAL (23,-0x3f80)
+VAL (24, 0x40)
+VAL (25,-0x40)
+VAL (26, 0x3f00)
+VAL (27,-0x3f00)
+VAL (30, 0x00ff)
+VAL (31,-0x00ff)
+
diff --git a/gcc/testsuite/gcc.target/avr/torture/vals-uhr.def b/gcc/testsuite/gcc.target/avr/torture/vals-uhr.def
new file mode 100644
index 00000000000..71441567ca5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/vals-uhr.def
@@ -0,0 +1,13 @@
+VAL (01, 0x0)
+VAL (02, 0x1)
+VAL (03, 0x3f)
+VAL (07, 0x40)
+VAL (08, 0xc0)
+VAL (10, 0xc1)
+VAL (12, 0xff)
+VAL (14, 0x7f)
+VAL (16, 0x81)
+VAL (20, 0xbf)
+
+VAL (99, 0x80)
+
diff --git a/gcc/testsuite/gcc.target/avr/torture/vals-uk.def b/gcc/testsuite/gcc.target/avr/torture/vals-uk.def
new file mode 100644
index 00000000000..3e212836f4d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/vals-uk.def
@@ -0,0 +1,23 @@
+VAL (01, 0x0)
+VAL (02, 0x1)
+VAL (03, 0x3f)
+VAL (04, 0x80)
+VAL (07, 0x40000000)
+VAL (08, 0xc0000000)
+VAL (10, 0x7fffffff)
+VAL (12, 0x7f800000)
+VAL (14, 0x7f800001)
+VAL (16, 0x7f7f7f7f)
+VAL (18, 0x7f808000)
+VAL (20, 0x3e800000)
+VAL (22, 0x3f800000)
+VAL (24, 0x40000000)
+VAL (26, 0x3f000000)
+VAL (28, 0xffff00)
+VAL (30, 0x00ff00ff)
+VAL (31, 0xff00ff00)
+VAL (32, 0x10000000)
+VAL (33, 0xff000000)
+
+VAL (99, 0x80000000)
+
diff --git a/gcc/testsuite/gcc.target/avr/torture/vals-ullk.def b/gcc/testsuite/gcc.target/avr/torture/vals-ullk.def
new file mode 100644
index 00000000000..620182be640
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/vals-ullk.def
@@ -0,0 +1,20 @@
+VAL (01, 0x0)
+VAL (02, 0x1)
+VAL (03, 0x3f)
+VAL (04, 0x80)
+VAL (07, 0x4000000000000000)
+VAL (08, 0x4000000000000000)
+VAL (10, 0x7fffffffffffffff)
+VAL (12, 0x7f80000000000000)
+VAL (14, 0x7f80000000000001)
+VAL (16, 0x7f7f7f7f7f7f7f7f)
+VAL (18, 0x7f80808080808000)
+VAL (20, 0x3e80000000000000)
+VAL (22, 0x3f80000000000000)
+VAL (24, 0x40000000000000)
+VAL (26, 0x3f000000000000)
+VAL (28, 0xffffff00)
+VAL (30, 0x00ff00ff00ff00ff)
+
+VAL (99, 0x8000000000000000)
+
diff --git a/gcc/testsuite/gcc.target/avr/torture/vals-ur.def b/gcc/testsuite/gcc.target/avr/torture/vals-ur.def
new file mode 100644
index 00000000000..d6ea8f1c50d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/vals-ur.def
@@ -0,0 +1,17 @@
+VAL (01, 0x0)
+VAL (02, 0x1)
+VAL (03, 0x3f)
+VAL (04, 0x80)
+VAL (07, 0x4000)
+VAL (08, 0xc000)
+VAL (10, 0x7fff)
+VAL (12, 0x7f80)
+VAL (14, 0x7f81)
+VAL (16, 0x7f7f)
+VAL (20, 0x3e80)
+VAL (22, 0x3f80)
+VAL (26, 0x3f00)
+VAL (32, 0x100)
+
+VAL (99, 0x8000)
+
diff --git a/gcc/testsuite/gcc.target/i386/pr54445-1.c b/gcc/testsuite/gcc.target/i386/pr54445-1.c
new file mode 100644
index 00000000000..72ef84e5361
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr54445-1.c
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+__thread unsigned char tls_array[64];
+
+unsigned char
+__attribute__ ((noinline))
+tls_array_lookup_with_negative_constant(long long int position) {
+ return tls_array[position - 1];
+}
+
+int
+main ()
+{
+ int i;
+
+ for (i = 0; i < sizeof (tls_array) / sizeof (tls_array[0]); i++)
+ tls_array[i] = i;
+
+ for (i = 0; i < sizeof (tls_array) / sizeof (tls_array[0]); i++)
+ if (i != tls_array_lookup_with_negative_constant (i + 1))
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr54445-2.c b/gcc/testsuite/gcc.target/i386/pr54445-2.c
new file mode 100644
index 00000000000..5151c132840
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr54445-2.c
@@ -0,0 +1,11 @@
+/* { dg-do compile { target { *-*-linux* && { ! { ia32 } } } } } */
+/* { dg-options "-O2 -fno-pic" } */
+
+__thread unsigned char tls_array[64];
+
+unsigned char
+tls_array_lookup_with_negative_constant(long long int position) {
+ return tls_array[position - 1];
+}
+
+/* { dg-final { scan-assembler "mov(b|zbl)\[ \t\](%fs:)?tls_array@tpoff-1\\(%" } } */
diff --git a/gcc/testsuite/gcc.target/sh/pr54089-3.c b/gcc/testsuite/gcc.target/sh/pr54089-3.c
new file mode 100644
index 00000000000..ffb976ba11b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/sh/pr54089-3.c
@@ -0,0 +1,40 @@
+/* The dynamic shift library functions truncate the shift count to 5 bits.
+ Verify that this is taken into account and no extra shift count
+ truncations are generated before the library call. */
+/* { dg-do compile { target "sh*-*-*" } } */
+/* { dg-options "-O1" } */
+/* { dg-skip-if "" { "sh*-*-*" } { "*" } { "-m1*" "-m2" "-m2e*" } } */
+/* { dg-final { scan-assembler-not "and" } } */
+/* { dg-final { scan-assembler-not "31" } } */
+
+int
+test00 (unsigned int a, int* b, int c, int* d, unsigned int e)
+{
+ int s = 0;
+ int i;
+ for (i = 0; i < c; ++i)
+ s += d[i] + b[i] + (e << (i & 31));
+ return s;
+}
+
+int
+test01 (unsigned int a, int* b, int c, int* d, unsigned int e)
+{
+ int s = 0;
+ int i;
+ for (i = 0; i < c; ++i)
+ s += d[i] + b[i] + (e >> (i & 31));
+ return s;
+}
+
+int
+test03 (unsigned int a, unsigned int b)
+{
+ return b << (a & 31);
+}
+
+unsigned int
+test04 (unsigned int a, int b)
+{
+ return a >> (b & 31);
+}
diff --git a/gcc/testsuite/gfortran.dg/array_section_3.f90 b/gcc/testsuite/gfortran.dg/array_section_3.f90
new file mode 100644
index 00000000000..d3093d14d50
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/array_section_3.f90
@@ -0,0 +1,17 @@
+! { dg-do compile }
+!
+! PR fortran/54225
+!
+! Contributed by robb wu
+!
+program test
+ implicit none
+ real :: A(2,3)
+
+ print *, A(1, *) ! { dg-error "Expected array subscript" }
+end program
+
+subroutine test2
+integer, dimension(2) :: a
+a(*) = 1 ! { dg-error "Expected array subscript" }
+end
diff --git a/gcc/testsuite/gfortran.dg/bind_c_array_params_2.f90 b/gcc/testsuite/gfortran.dg/bind_c_array_params_2.f90
index 04a70066c10..9018766c0c0 100644
--- a/gcc/testsuite/gfortran.dg/bind_c_array_params_2.f90
+++ b/gcc/testsuite/gfortran.dg/bind_c_array_params_2.f90
@@ -15,6 +15,7 @@ integer :: aa(4,4)
call test(aa)
end
-! { dg-final { scan-assembler-times "myBindC" 1 } }
+! { dg-final { scan-assembler-times "myBindC" 1 { target { ! { hppa*-*-hpux* } } } } }
+! { dg-final { scan-assembler-times "myBindC,%r2" 1 { target { hppa*-*-hpux* } } } }
! { dg-final { scan-tree-dump-times "test \\\(&parm\\." 1 "original" } }
! { dg-final { cleanup-tree-dump "original" } }
diff --git a/gcc/testsuite/gfortran.dg/coarray_10.f90 b/gcc/testsuite/gfortran.dg/coarray_10.f90
index 99f5782e35b..78abb5ad191 100644
--- a/gcc/testsuite/gfortran.dg/coarray_10.f90
+++ b/gcc/testsuite/gfortran.dg/coarray_10.f90
@@ -30,12 +30,12 @@ end subroutine this_image_check
subroutine rank_mismatch()
implicit none
integer,allocatable :: A(:)[:,:,:,:]
- allocate(A(1)[1,1,1:*]) ! { dg-error "Unexpected ... for codimension" }
+ allocate(A(1)[1,1,1:*]) ! { dg-error "Too few codimensions" }
allocate(A(1)[1,1,1,1,1,*]) ! { dg-error "Invalid codimension 5" }
allocate(A(1)[1,1,1,*])
allocate(A(1)[1,1]) ! { dg-error "Too few codimensions" }
allocate(A(1)[1,*]) ! { dg-error "Too few codimensions" }
- allocate(A(1)[1,1:*]) ! { dg-error "Unexpected ... for codimension" }
+ allocate(A(1)[1,1:*]) ! { dg-error "Too few codimensions" }
A(1)[1,1,1] = 1 ! { dg-error "Too few codimensions" }
A(1)[1,1,1,1,1,1] = 1 ! { dg-error "Invalid codimension 5" }
@@ -48,5 +48,5 @@ end subroutine rank_mismatch
subroutine rank_mismatch2()
implicit none
integer, allocatable:: A(:)[:,:,:]
- allocate(A(1)[7:8,4:*]) ! { dg-error "Unexpected .*. for codimension 2 of 3" }
+ allocate(A(1)[7:8,4:*]) ! { dg-error "Too few codimensions" }
end subroutine rank_mismatch2
diff --git a/gcc/testsuite/gfortran.dg/coarray_28.f90 b/gcc/testsuite/gfortran.dg/coarray_28.f90
new file mode 100644
index 00000000000..ca6f863568a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray_28.f90
@@ -0,0 +1,10 @@
+! { dg-do compile }
+! { dg-options "-fcoarray=single" }
+!
+! PR fortran/54225
+!
+
+integer, allocatable :: a[:,:]
+
+allocate (a[*,4]) ! { dg-error "Unexpected '.' for codimension 1 of 2" }
+end
diff --git a/gcc/testsuite/gfortran.dg/implicit_pure_3.f90 b/gcc/testsuite/gfortran.dg/implicit_pure_3.f90
new file mode 100644
index 00000000000..d9d7734dab3
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/implicit_pure_3.f90
@@ -0,0 +1,109 @@
+! { dg-do compile }
+! { dg-options "-O2 -fdump-tree-optimized" }
+!
+! PR fortran/54556
+!
+! Contributed by Joost VandeVondele
+!
+MODULE parallel_rng_types
+
+ IMPLICIT NONE
+
+ ! Global parameters in this module
+ INTEGER, PARAMETER :: dp=8
+
+ TYPE rng_stream_type
+ PRIVATE
+ CHARACTER(LEN=40) :: name
+ INTEGER :: distribution_type
+ REAL(KIND=dp), DIMENSION(3,2) :: bg,cg,ig
+ LOGICAL :: antithetic,extended_precision
+ REAL(KIND=dp) :: buffer
+ LOGICAL :: buffer_filled
+ END TYPE rng_stream_type
+
+ REAL(KIND=dp), DIMENSION(3,3) :: a1p0,a1p76,a1p127,&
+ a2p0,a2p76,a2p127,&
+ inv_a1,inv_a2
+
+ INTEGER, PARAMETER :: GAUSSIAN = 1,&
+ UNIFORM = 2
+
+ REAL(KIND=dp), PARAMETER :: norm = 2.328306549295727688e-10_dp,&
+ m1 = 4294967087.0_dp,&
+ m2 = 4294944443.0_dp,&
+ a12 = 1403580.0_dp,&
+ a13n = 810728.0_dp,&
+ a21 = 527612.0_dp,&
+ a23n = 1370589.0_dp,&
+ two17 = 131072.0_dp,& ! 2**17
+ two53 = 9007199254740992.0_dp,& ! 2**53
+ fact = 5.9604644775390625e-8_dp ! 1/2**24
+
+
+CONTAINS
+
+ FUNCTION rn32(rng_stream) RESULT(u)
+
+ TYPE(rng_stream_type), POINTER :: rng_stream
+ REAL(KIND=dp) :: u
+
+ INTEGER :: k
+ REAL(KIND=dp) :: p1, p2
+
+! -------------------------------------------------------------------------
+! Component 1
+
+ p1 = a12*rng_stream%cg(2,1) - a13n*rng_stream%cg(1,1)
+ k = INT(p1/m1)
+ p1 = p1 - k*m1
+ IF (p1 < 0.0_dp) p1 = p1 + m1
+ rng_stream%cg(1,1) = rng_stream%cg(2,1)
+ rng_stream%cg(2,1) = rng_stream%cg(3,1)
+ rng_stream%cg(3,1) = p1
+
+ ! Component 2
+
+ p2 = a21*rng_stream%cg(3,2) - a23n*rng_stream%cg(1,2)
+ k = INT(p2/m2)
+ p2 = p2 - k*m2
+ IF (p2 < 0.0_dp) p2 = p2 + m2
+ rng_stream%cg(1,2) = rng_stream%cg(2,2)
+ rng_stream%cg(2,2) = rng_stream%cg(3,2)
+ rng_stream%cg(3,2) = p2
+
+ ! Combination
+
+ IF (p1 > p2) THEN
+ u = (p1 - p2)*norm
+ ELSE
+ u = (p1 - p2 + m1)*norm
+ END IF
+
+ IF (rng_stream%antithetic) u = 1.0_dp - u
+
+ END FUNCTION rn32
+
+! *****************************************************************************
+ FUNCTION rn53(rng_stream) RESULT(u)
+
+ TYPE(rng_stream_type), POINTER :: rng_stream
+ REAL(KIND=dp) :: u
+
+ u = rn32(rng_stream)
+
+ IF (rng_stream%antithetic) THEN
+ u = u + (rn32(rng_stream) - 1.0_dp)*fact
+ IF (u < 0.0_dp) u = u + 1.0_dp
+ ELSE
+ u = u + rn32(rng_stream)*fact
+ IF (u >= 1.0_dp) u = u - 1.0_dp
+ END IF
+
+ END FUNCTION rn53
+
+END MODULE
+
+! { dg-final { scan-module-absence "parallel_rng_types" "IMPLICIT_PURE" } }
+! { dg-final { scan-tree-dump-times "rn32 \\(rng_stream" 3 "optimized" } }
+! { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc/testsuite/gfortran.dg/namelist_75.f90 b/gcc/testsuite/gfortran.dg/namelist_75.f90
new file mode 100644
index 00000000000..c88da65d6b2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/namelist_75.f90
@@ -0,0 +1,10 @@
+! { dg-do compile }
+!
+! Tests a write-after-free memory error fix in gfc_undo_symbols
+
+program test_nml
+
+ namelist /foo/ bar, baz
+ namelist /foo/ wrong, , ! { dg-error "Syntax error in NAMELIST" }
+
+end program test_nml
diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_38.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_38.f90
new file mode 100644
index 00000000000..9387b6b8fea
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/proc_ptr_38.f90
@@ -0,0 +1,16 @@
+! { dg-do compile }
+!
+! PR 54387: [F03] Wrongly accepts non-proc result variable on the RHS of a proc-pointer assignment
+!
+! Contributed by James Van Buskirk
+
+integer function foo()
+ procedure(), pointer :: i
+ i => foo ! { dg-error "is invalid as proc-target in procedure pointer assignment" }
+end
+
+recursive function bar() result (res)
+ integer :: res
+ procedure(), pointer :: j
+ j => bar
+end
diff --git a/gcc/testsuite/gfortran.dg/typebound_generic_14.f03 b/gcc/testsuite/gfortran.dg/typebound_generic_14.f03
new file mode 100644
index 00000000000..8515cf4378f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/typebound_generic_14.f03
@@ -0,0 +1,27 @@
+! { dg-do compile }
+!
+! PR 54594: [OOP] Type-bound ASSIGNMENTs (elemental + array version) rejected as ambiguous
+!
+! Contributed by James van Buskirk
+
+module a_mod
+
+ type :: a
+ contains
+ procedure, NOPASS :: a_ass, a_ass_sv
+ generic :: ass => a_ass, a_ass_sv
+ end type
+
+contains
+
+ impure elemental subroutine a_ass (out)
+ class(a), intent(out) :: out
+ end subroutine
+
+ subroutine a_ass_sv (out)
+ class(a), intent(out) :: out(:)
+ end subroutine
+
+end module
+
+! { dg-final { cleanup-modules "a_mod" } }
diff --git a/gcc/testsuite/gnat.dg/lto15.adb b/gcc/testsuite/gnat.dg/lto15.adb
index b1bc25196f1..be5b008e8c6 100644
--- a/gcc/testsuite/gnat.dg/lto15.adb
+++ b/gcc/testsuite/gnat.dg/lto15.adb
@@ -1,5 +1,6 @@
-- { dg-do compile }
-- { dg-options "-O -flto -g" }
+-- { dg-require-effective-target lto }
package body Lto15 is
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index f597316ac4d..8f793b7e509 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -2099,6 +2099,19 @@ proc add_options_for_arm_neon { flags } {
return "$flags $et_arm_neon_flags"
}
+# Add the options needed for NEON. We need either -mfloat-abi=softfp
+# or -mfloat-abi=hard, but if one is already specified by the
+# multilib, use it. Similarly, if a -mfpu option already enables
+# NEON, do not add -mfpu=neon.
+
+proc add_options_for_arm_neonv2 { flags } {
+ if { ! [check_effective_target_arm_neonv2_ok] } {
+ return "$flags"
+ }
+ global et_arm_neonv2_flags
+ return "$flags $et_arm_neonv2_flags"
+}
+
# Return 1 if this is an ARM target supporting -mfpu=neon
# -mfloat-abi=softfp or equivalent options. Some multilibs may be
# incompatible with these options. Also set et_arm_neon_flags to the
@@ -2127,6 +2140,38 @@ proc check_effective_target_arm_neon_ok { } {
check_effective_target_arm_neon_ok_nocache]
}
+# Return 1 if this is an ARM target supporting -mfpu=neon-vfpv4
+# -mfloat-abi=softfp or equivalent options. Some multilibs may be
+# incompatible with these options. Also set et_arm_neonv2_flags to the
+# best options to add.
+
+proc check_effective_target_arm_neonv2_ok_nocache { } {
+ global et_arm_neonv2_flags
+ set et_arm_neonv2_flags ""
+ if { [check_effective_target_arm32] } {
+ foreach flags {"" "-mfloat-abi=softfp" "-mfpu=neon-vfpv4" "-mfpu=neon-vfpv4 -mfloat-abi=softfp"} {
+ if { [check_no_compiler_messages_nocache arm_neonv2_ok object {
+ #include "arm_neon.h"
+ float32x2_t
+ foo (float32x2_t a, float32x2_t b, float32x2_t c)
+ {
+ return vfma_f32 (a, b, c);
+ }
+ } "$flags"] } {
+ set et_arm_neonv2_flags $flags
+ return 1
+ }
+ }
+ }
+
+ return 0
+}
+
+proc check_effective_target_arm_neonv2_ok { } {
+ return [check_cached_effective_target arm_neonv2_ok \
+ check_effective_target_arm_neonv2_ok_nocache]
+}
+
# Add the options needed for NEON. We need either -mfloat-abi=softfp
# or -mfloat-abi=hard, but if one is already specified by the
# multilib, use it.
@@ -2318,6 +2363,21 @@ proc check_effective_target_arm_neon_hw { } {
} [add_options_for_arm_neon ""]]
}
+proc check_effective_target_arm_neonv2_hw { } {
+ return [check_runtime arm_neon_hwv2_available {
+ #include "arm_neon.h"
+ int
+ main (void)
+ {
+ float32x2_t a, b, c;
+ asm ("vfma.f32 %P0, %P1, %P2"
+ : "=w" (a)
+ : "w" (b), "w" (c));
+ return 0;
+ }
+ } [add_options_for_arm_neonv2 ""]]
+}
+
# Return 1 if this is a ARM target with NEON enabled.
proc check_effective_target_arm_neon { } {
@@ -2334,6 +2394,24 @@ proc check_effective_target_arm_neon { } {
}
}
+proc check_effective_target_arm_neonv2 { } {
+ if { [check_effective_target_arm32] } {
+ return [check_no_compiler_messages arm_neon object {
+ #ifndef __ARM_NEON__
+ #error not NEON
+ #else
+ #ifndef __ARM_FEATURE_FMA
+ #error not NEONv2
+ #else
+ int dummy;
+ #endif
+ #endif
+ }]
+ } else {
+ return 0
+ }
+}
+
# Return 1 if this a Loongson-2E or -2F target using an ABI that supports
# the Loongson vector modes.
diff --git a/gcc/timevar.def b/gcc/timevar.def
index 149066e9f43..8f99b509558 100644
--- a/gcc/timevar.def
+++ b/gcc/timevar.def
@@ -81,6 +81,7 @@ DEFTIMEVAR (TV_IPA_LTO_CGRAPH_MERGE , "ipa lto cgraph merge")
DEFTIMEVAR (TV_LTO , "lto")
DEFTIMEVAR (TV_WHOPR_WPA , "whopr wpa")
DEFTIMEVAR (TV_WHOPR_WPA_IO , "whopr wpa I/O")
+DEFTIMEVAR (TV_WHOPR_PARTITIONING , "whopr partitioning")
DEFTIMEVAR (TV_WHOPR_LTRANS , "whopr ltrans")
DEFTIMEVAR (TV_IPA_REFERENCE , "ipa reference")
DEFTIMEVAR (TV_IPA_PROFILE , "ipa profile")
diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c
index edb678e8c1e..9ce646a6af0 100644
--- a/gcc/trans-mem.c
+++ b/gcc/trans-mem.c
@@ -1379,6 +1379,19 @@ thread_private_new_memory (basic_block entry_block, tree x)
/* x = (cast*) foo ==> foo */
else if (code == VIEW_CONVERT_EXPR || code == NOP_EXPR)
x = gimple_assign_rhs1 (stmt);
+ /* x = c ? op1 : op2 == > op1 or op2 just like a PHI */
+ else if (code == COND_EXPR)
+ {
+ tree op1 = gimple_assign_rhs2 (stmt);
+ tree op2 = gimple_assign_rhs3 (stmt);
+ enum thread_memory_type mem;
+ retval = thread_private_new_memory (entry_block, op1);
+ if (retval == mem_non_local)
+ goto new_memory_ret;
+ mem = thread_private_new_memory (entry_block, op2);
+ retval = MIN (retval, mem);
+ goto new_memory_ret;
+ }
else
{
retval = mem_non_local;
@@ -3569,11 +3582,6 @@ struct tm_ipa_cg_data
bool want_irr_scan_normal;
};
-typedef struct cgraph_node *cgraph_node_p;
-
-DEF_VEC_P (cgraph_node_p);
-DEF_VEC_ALLOC_P (cgraph_node_p, heap);
-
typedef VEC (cgraph_node_p, heap) *cgraph_node_queue;
/* Return the ipa data associated with NODE, allocating zeroed memory
diff --git a/gcc/tree-call-cdce.c b/gcc/tree-call-cdce.c
index be020dab809..c879548483b 100644
--- a/gcc/tree-call-cdce.c
+++ b/gcc/tree-call-cdce.c
@@ -374,7 +374,7 @@ gen_conditions_for_domain (tree arg, inp_domain domain,
{
/* Now push a separator. */
if (domain.has_lb)
- VEC_quick_push (gimple, conds, (gimple)NULL);
+ VEC_quick_push (gimple, conds, NULL);
gen_one_condition (arg, domain.ub,
(domain.is_ub_inclusive
@@ -496,7 +496,7 @@ gen_conditions_for_pow_int_base (tree base, tree expn,
type is integer. */
/* Push a separator. */
- VEC_quick_push (gimple, conds, (gimple)NULL);
+ VEC_quick_push (gimple, conds, NULL);
temp = create_tmp_var (int_type, "DCE_COND1");
cst0 = build_int_cst (int_type, 0);
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 0c350a6f257..1a166cc4994 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -5335,6 +5335,44 @@ gimple_move_block_after (basic_block bb, basic_block after)
}
+/* Return TRUE if block BB has no executable statements, otherwise return
+ FALSE. */
+
+bool
+gimple_empty_block_p (basic_block bb)
+{
+ /* BB must have no executable statements. */
+ gimple_stmt_iterator gsi = gsi_after_labels (bb);
+ if (phi_nodes (bb))
+ return false;
+ if (gsi_end_p (gsi))
+ return true;
+ if (is_gimple_debug (gsi_stmt (gsi)))
+ gsi_next_nondebug (&gsi);
+ return gsi_end_p (gsi);
+}
+
+
+/* Split a basic block if it ends with a conditional branch and if the
+ other part of the block is not empty. */
+
+static basic_block
+gimple_split_block_before_cond_jump (basic_block bb)
+{
+ gimple last, split_point;
+ gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
+ if (gsi_end_p (gsi))
+ return NULL;
+ last = gsi_stmt (gsi);
+ if (gimple_code (last) != GIMPLE_COND
+ && gimple_code (last) != GIMPLE_SWITCH)
+ return NULL;
+ gsi_prev_nondebug (&gsi);
+ split_point = gsi_stmt (gsi);
+ return split_block (bb, split_point)->dest;
+}
+
+
/* Return true if basic_block can be duplicated. */
static bool
@@ -7492,7 +7530,9 @@ struct cfg_hooks gimple_cfg_hooks = {
gimple_lv_add_condition_to_bb, /* lv_add_condition_to_bb */
gimple_lv_adjust_loop_header_phi, /* lv_adjust_loop_header_phi*/
extract_true_false_edges_from_block, /* extract_cond_bb_edges */
- flush_pending_stmts /* flush_pending_stmts */
+ flush_pending_stmts, /* flush_pending_stmts */
+ gimple_empty_block_p, /* block_empty_p */
+ gimple_split_block_before_cond_jump, /* split_block_before_cond_jump */
};
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index 38327b0d2c3..0f68fdf4020 100644
--- a/gcc/tree-data-ref.c
+++ b/gcc/tree-data-ref.c
@@ -4300,7 +4300,7 @@ static bool
get_references_in_stmt (gimple stmt, VEC (data_ref_loc, heap) **references)
{
bool clobbers_memory = false;
- data_ref_loc *ref;
+ data_ref_loc ref;
tree *op0, *op1;
enum gimple_code stmt_code = gimple_code (stmt);
@@ -4329,9 +4329,9 @@ get_references_in_stmt (gimple stmt, VEC (data_ref_loc, heap) **references)
&& (base = get_base_address (*op1))
&& TREE_CODE (base) != SSA_NAME))
{
- ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
- ref->pos = op1;
- ref->is_read = true;
+ ref.pos = op1;
+ ref.is_read = true;
+ VEC_safe_push (data_ref_loc, heap, *references, ref);
}
}
else if (stmt_code == GIMPLE_CALL)
@@ -4347,9 +4347,9 @@ get_references_in_stmt (gimple stmt, VEC (data_ref_loc, heap) **references)
if (DECL_P (*op1)
|| (REFERENCE_CLASS_P (*op1) && get_base_address (*op1)))
{
- ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
- ref->pos = op1;
- ref->is_read = true;
+ ref.pos = op1;
+ ref.is_read = true;
+ VEC_safe_push (data_ref_loc, heap, *references, ref);
}
}
}
@@ -4360,9 +4360,9 @@ get_references_in_stmt (gimple stmt, VEC (data_ref_loc, heap) **references)
&& (DECL_P (*op0)
|| (REFERENCE_CLASS_P (*op0) && get_base_address (*op0))))
{
- ref = VEC_safe_push (data_ref_loc, heap, *references, NULL);
- ref->pos = op0;
- ref->is_read = false;
+ ref.pos = op0;
+ ref.is_read = false;
+ VEC_safe_push (data_ref_loc, heap, *references, ref);
}
return clobbers_memory;
}
diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c
index f8f10a42276..423923fb66a 100644
--- a/gcc/tree-dfa.c
+++ b/gcc/tree-dfa.c
@@ -729,7 +729,7 @@ dump_enumerated_decls_push (tree *tp, int *walk_subtrees, void *data)
return NULL_TREE;
nt.t = *tp;
nt.num = VEC_length (numbered_tree, *list);
- VEC_safe_push (numbered_tree, heap, *list, &nt);
+ VEC_safe_push (numbered_tree, heap, *list, nt);
*walk_subtrees = 0;
return NULL_TREE;
}
diff --git a/gcc/tree-diagnostic.c b/gcc/tree-diagnostic.c
index 1276cbea6af..2756ed21374 100644
--- a/gcc/tree-diagnostic.c
+++ b/gcc/tree-diagnostic.c
@@ -127,7 +127,7 @@ maybe_unwind_expanded_macro_loc (diagnostic_context *context,
loc.where = where;
loc.map = map;
- VEC_safe_push (loc_map_pair, heap, loc_vec, &loc);
+ VEC_safe_push (loc_map_pair, heap, loc_vec, loc);
/* WHERE is the location of a token inside the expansion of a
macro. MAP is the map holding the locations of that macro
diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
index ec74d9d4c41..65f85c94605 100644
--- a/gcc/tree-eh.c
+++ b/gcc/tree-eh.c
@@ -321,6 +321,7 @@ static bitmap eh_region_may_contain_throw_map;
struct goto_queue_node
{
treemple stmt;
+ location_t location;
gimple_seq repl_stmt;
gimple cont_stmt;
int index;
@@ -560,7 +561,8 @@ static void
record_in_goto_queue (struct leh_tf_state *tf,
treemple new_stmt,
int index,
- bool is_label)
+ bool is_label,
+ location_t location)
{
size_t active, size;
struct goto_queue_node *q;
@@ -583,6 +585,7 @@ record_in_goto_queue (struct leh_tf_state *tf,
memset (q, 0, sizeof (*q));
q->stmt = new_stmt;
q->index = index;
+ q->location = location;
q->is_label = is_label;
}
@@ -590,7 +593,8 @@ record_in_goto_queue (struct leh_tf_state *tf,
TF is not null. */
static void
-record_in_goto_queue_label (struct leh_tf_state *tf, treemple stmt, tree label)
+record_in_goto_queue_label (struct leh_tf_state *tf, treemple stmt, tree label,
+ location_t location)
{
int index;
treemple temp, new_stmt;
@@ -629,7 +633,7 @@ record_in_goto_queue_label (struct leh_tf_state *tf, treemple stmt, tree label)
since with a GIMPLE_COND we have an easy access to the then/else
labels. */
new_stmt = stmt;
- record_in_goto_queue (tf, new_stmt, index, true);
+ record_in_goto_queue (tf, new_stmt, index, true, location);
}
/* For any GIMPLE_GOTO or GIMPLE_RETURN, decide whether it leaves a try_finally
@@ -649,19 +653,22 @@ maybe_record_in_goto_queue (struct leh_state *state, gimple stmt)
{
case GIMPLE_COND:
new_stmt.tp = gimple_op_ptr (stmt, 2);
- record_in_goto_queue_label (tf, new_stmt, gimple_cond_true_label (stmt));
+ record_in_goto_queue_label (tf, new_stmt, gimple_cond_true_label (stmt),
+ EXPR_LOCATION (*new_stmt.tp));
new_stmt.tp = gimple_op_ptr (stmt, 3);
- record_in_goto_queue_label (tf, new_stmt, gimple_cond_false_label (stmt));
+ record_in_goto_queue_label (tf, new_stmt, gimple_cond_false_label (stmt),
+ EXPR_LOCATION (*new_stmt.tp));
break;
case GIMPLE_GOTO:
new_stmt.g = stmt;
- record_in_goto_queue_label (tf, new_stmt, gimple_goto_dest (stmt));
+ record_in_goto_queue_label (tf, new_stmt, gimple_goto_dest (stmt),
+ gimple_location (stmt));
break;
case GIMPLE_RETURN:
tf->may_return = true;
new_stmt.g = stmt;
- record_in_goto_queue (tf, new_stmt, -1, false);
+ record_in_goto_queue (tf, new_stmt, -1, false, gimple_location (stmt));
break;
default:
@@ -866,13 +873,19 @@ frob_into_branch_around (gimple tp, eh_region region, tree over)
Make sure to record all new labels found. */
static gimple_seq
-lower_try_finally_dup_block (gimple_seq seq, struct leh_state *outer_state)
+lower_try_finally_dup_block (gimple_seq seq, struct leh_state *outer_state,
+ location_t loc)
{
gimple region = NULL;
gimple_seq new_seq;
+ gimple_stmt_iterator gsi;
new_seq = copy_gimple_seq_and_replace_locals (seq);
+ for (gsi = gsi_start (new_seq); !gsi_end_p (gsi); gsi_next (&gsi))
+ if (gimple_location (gsi_stmt (gsi)) == UNKNOWN_LOCATION)
+ gimple_set_location (gsi_stmt (gsi), loc);
+
if (outer_state->tf)
region = outer_state->tf->try_finally_expr;
collect_finally_tree_1 (new_seq, region);
@@ -967,7 +980,8 @@ honor_protect_cleanup_actions (struct leh_state *outer_state,
gimple_try_set_cleanup (tf->top_p, gimple_eh_else_n_body (eh_else));
}
else if (this_state)
- finally = lower_try_finally_dup_block (finally, outer_state);
+ finally = lower_try_finally_dup_block (finally, outer_state,
+ UNKNOWN_LOCATION);
finally_may_fallthru = gimple_seq_may_fallthru (finally);
/* If this cleanup consists of a TRY_CATCH_EXPR with TRY_CATCH_IS_CLEANUP
@@ -1184,7 +1198,7 @@ lower_try_finally_copy (struct leh_state *state, struct leh_tf_state *tf)
if (tf->may_fallthru)
{
- seq = lower_try_finally_dup_block (finally, state);
+ seq = lower_try_finally_dup_block (finally, state, tf_loc);
lower_eh_constructs_1 (state, &seq);
gimple_seq_add_seq (&new_stmt, seq);
@@ -1200,7 +1214,7 @@ lower_try_finally_copy (struct leh_state *state, struct leh_tf_state *tf)
if (eh_else)
seq = gimple_eh_else_e_body (eh_else);
else
- seq = lower_try_finally_dup_block (finally, state);
+ seq = lower_try_finally_dup_block (finally, state, tf_loc);
lower_eh_constructs_1 (state, &seq);
emit_post_landing_pad (&eh_seq, tf->region);
@@ -1250,7 +1264,7 @@ lower_try_finally_copy (struct leh_state *state, struct leh_tf_state *tf)
x = gimple_build_label (lab);
gimple_seq_add_stmt (&new_stmt, x);
- seq = lower_try_finally_dup_block (finally, state);
+ seq = lower_try_finally_dup_block (finally, state, q->location);
lower_eh_constructs_1 (state, &seq);
gimple_seq_add_seq (&new_stmt, seq);
diff --git a/gcc/tree-emutls.c b/gcc/tree-emutls.c
index b30469c8e59..88e77dace60 100644
--- a/gcc/tree-emutls.c
+++ b/gcc/tree-emutls.c
@@ -149,29 +149,29 @@ tree
default_emutls_var_init (tree to, tree decl, tree proxy)
{
VEC(constructor_elt,gc) *v = VEC_alloc (constructor_elt, gc, 4);
- constructor_elt *elt;
+ constructor_elt elt;
tree type = TREE_TYPE (to);
tree field = TYPE_FIELDS (type);
- elt = VEC_quick_push (constructor_elt, v, NULL);
- elt->index = field;
- elt->value = fold_convert (TREE_TYPE (field), DECL_SIZE_UNIT (decl));
+ elt.index = field;
+ elt.value = fold_convert (TREE_TYPE (field), DECL_SIZE_UNIT (decl));
+ VEC_quick_push (constructor_elt, v, elt);
- elt = VEC_quick_push (constructor_elt, v, NULL);
field = DECL_CHAIN (field);
- elt->index = field;
- elt->value = build_int_cst (TREE_TYPE (field),
- DECL_ALIGN_UNIT (decl));
+ elt.index = field;
+ elt.value = build_int_cst (TREE_TYPE (field),
+ DECL_ALIGN_UNIT (decl));
+ VEC_quick_push (constructor_elt, v, elt);
- elt = VEC_quick_push (constructor_elt, v, NULL);
field = DECL_CHAIN (field);
- elt->index = field;
- elt->value = null_pointer_node;
+ elt.index = field;
+ elt.value = null_pointer_node;
+ VEC_quick_push (constructor_elt, v, elt);
- elt = VEC_quick_push (constructor_elt, v, NULL);
field = DECL_CHAIN (field);
- elt->index = field;
- elt->value = proxy;
+ elt.index = field;
+ elt.value = proxy;
+ VEC_quick_push (constructor_elt, v, elt);
return build_constructor (type, v);
}
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index aafaa15a805..ef3f5f99ed6 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -3999,7 +3999,7 @@ splice_all_param_accesses (VEC (access_p, heap) **representatives)
result = UNUSED_PARAMS;
}
else
- VEC_quick_push (access_p, *representatives, (access_p) NULL);
+ VEC_quick_push (access_p, *representatives, NULL);
}
if (result == NO_GOOD_ACCESS)
@@ -4050,36 +4050,35 @@ turn_representatives_into_adjustments (VEC (access_p, heap) *representatives,
if (!repr || no_accesses_p (repr))
{
- struct ipa_parm_adjustment *adj;
+ struct ipa_parm_adjustment adj;
- adj = VEC_quick_push (ipa_parm_adjustment_t, adjustments, NULL);
- memset (adj, 0, sizeof (*adj));
- adj->base_index = get_param_index (parm, parms);
- adj->base = parm;
+ memset (&adj, 0, sizeof (adj));
+ adj.base_index = get_param_index (parm, parms);
+ adj.base = parm;
if (!repr)
- adj->copy_param = 1;
+ adj.copy_param = 1;
else
- adj->remove_param = 1;
+ adj.remove_param = 1;
+ VEC_quick_push (ipa_parm_adjustment_t, adjustments, adj);
}
else
{
- struct ipa_parm_adjustment *adj;
+ struct ipa_parm_adjustment adj;
int index = get_param_index (parm, parms);
for (; repr; repr = repr->next_grp)
{
- adj = VEC_quick_push (ipa_parm_adjustment_t, adjustments, NULL);
- memset (adj, 0, sizeof (*adj));
+ memset (&adj, 0, sizeof (adj));
gcc_assert (repr->base == parm);
- adj->base_index = index;
- adj->base = repr->base;
- adj->type = repr->type;
- adj->alias_ptr_type = reference_alias_ptr_type (repr->expr);
- adj->offset = repr->offset;
- adj->by_ref = (POINTER_TYPE_P (TREE_TYPE (repr->base))
- && (repr->grp_maybe_modified
- || repr->grp_not_necessarilly_dereferenced));
-
+ adj.base_index = index;
+ adj.base = repr->base;
+ adj.type = repr->type;
+ adj.alias_ptr_type = reference_alias_ptr_type (repr->expr);
+ adj.offset = repr->offset;
+ adj.by_ref = (POINTER_TYPE_P (TREE_TYPE (repr->base))
+ && (repr->grp_maybe_modified
+ || repr->grp_not_necessarilly_dereferenced));
+ VEC_quick_push (ipa_parm_adjustment_t, adjustments, adj);
}
}
}
diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c
index 830f6f33460..bf684749926 100644
--- a/gcc/tree-ssa-ccp.c
+++ b/gcc/tree-ssa-ccp.c
@@ -2134,6 +2134,7 @@ struct gimple_opt_pass pass_ccp =
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_verify_ssa
+ | TODO_update_address_taken
| TODO_verify_stmts | TODO_ggc_collect/* todo_flags_finish */
}
};
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index 4a89df25fbb..9065006c55e 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -1231,7 +1231,7 @@ build_and_record_new_cond (enum tree_code code,
cond->ops.binary.opnd1 = op1;
c.value = boolean_true_node;
- VEC_safe_push (cond_equivalence, heap, *p, &c);
+ VEC_safe_push (cond_equivalence, heap, *p, c);
}
/* Record that COND is true and INVERTED is false into the edge information
@@ -1338,7 +1338,7 @@ record_conditions (struct edge_info *edge_info, tree cond, tree inverted)
two slots. */
initialize_expr_from_cond (cond, &c.cond);
c.value = boolean_true_node;
- VEC_safe_push (cond_equivalence, heap, edge_info->cond_equivalences, &c);
+ VEC_safe_push (cond_equivalence, heap, edge_info->cond_equivalences, c);
/* It is possible for INVERTED to be the negation of a comparison,
and not a valid RHS or GIMPLE_COND condition. This happens because
@@ -1347,7 +1347,7 @@ record_conditions (struct edge_info *edge_info, tree cond, tree inverted)
obey the trichotomy law. */
initialize_expr_from_cond (inverted, &c.cond);
c.value = boolean_false_node;
- VEC_safe_push (cond_equivalence, heap, edge_info->cond_equivalences, &c);
+ VEC_safe_push (cond_equivalence, heap, edge_info->cond_equivalences, c);
}
/* A helper function for record_const_or_copy and record_equality.
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index 3f5b2f99f5a..2d17bfa4d2f 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -33,6 +33,7 @@ along with GCC; see the file COPYING3. If not see
#include "gimple.h"
#include "expr.h"
#include "cfgloop.h"
+#include "tree-vectorizer.h"
/* This pass propagates the RHS of assignment statements into use
sites of the LHS of the assignment. It's basically a specialized
@@ -2574,6 +2575,77 @@ combine_conversions (gimple_stmt_iterator *gsi)
return 0;
}
+/* Combine an element access with a shuffle. Returns true if there were
+ any changes made, else it returns false. */
+
+static bool
+simplify_bitfield_ref (gimple_stmt_iterator *gsi)
+{
+ gimple stmt = gsi_stmt (*gsi);
+ gimple def_stmt;
+ tree op, op0, op1, op2;
+ tree elem_type;
+ unsigned idx, n, size;
+ enum tree_code code;
+
+ op = gimple_assign_rhs1 (stmt);
+ gcc_checking_assert (TREE_CODE (op) == BIT_FIELD_REF);
+
+ op0 = TREE_OPERAND (op, 0);
+ if (TREE_CODE (op0) != SSA_NAME
+ || TREE_CODE (TREE_TYPE (op0)) != VECTOR_TYPE)
+ return false;
+
+ elem_type = TREE_TYPE (TREE_TYPE (op0));
+ if (TREE_TYPE (op) != elem_type)
+ return false;
+
+ size = TREE_INT_CST_LOW (TYPE_SIZE (elem_type));
+ op1 = TREE_OPERAND (op, 1);
+ n = TREE_INT_CST_LOW (op1) / size;
+ if (n != 1)
+ return false;
+
+ def_stmt = get_prop_source_stmt (op0, false, NULL);
+ if (!def_stmt || !can_propagate_from (def_stmt))
+ return false;
+
+ op2 = TREE_OPERAND (op, 2);
+ idx = TREE_INT_CST_LOW (op2) / size;
+
+ code = gimple_assign_rhs_code (def_stmt);
+
+ if (code == VEC_PERM_EXPR)
+ {
+ tree p, m, index, tem;
+ unsigned nelts;
+ m = gimple_assign_rhs3 (def_stmt);
+ if (TREE_CODE (m) != VECTOR_CST)
+ return false;
+ nelts = VECTOR_CST_NELTS (m);
+ idx = TREE_INT_CST_LOW (VECTOR_CST_ELT (m, idx));
+ idx %= 2 * nelts;
+ if (idx < nelts)
+ {
+ p = gimple_assign_rhs1 (def_stmt);
+ }
+ else
+ {
+ p = gimple_assign_rhs2 (def_stmt);
+ idx -= nelts;
+ }
+ index = build_int_cst (TREE_TYPE (TREE_TYPE (m)), idx * size);
+ tem = build3 (BIT_FIELD_REF, TREE_TYPE (op),
+ unshare_expr (p), op1, index);
+ gimple_assign_set_rhs1 (stmt, tem);
+ fold_stmt (gsi);
+ update_stmt (gsi_stmt (*gsi));
+ return true;
+ }
+
+ return false;
+}
+
/* Determine whether applying the 2 permutations (mask1 then mask2)
gives back one of the input. */
@@ -2606,45 +2678,52 @@ is_combined_permutation_identity (tree mask1, tree mask2)
return maybe_identity1 ? 1 : maybe_identity2 ? 2 : 0;
}
-/* Combine two shuffles in a row. Returns 1 if there were any changes
- made, 2 if cfg-cleanup needs to run. Else it returns 0. */
+/* Combine a shuffle with its arguments. Returns 1 if there were any
+ changes made, 2 if cfg-cleanup needs to run. Else it returns 0. */
static int
simplify_permutation (gimple_stmt_iterator *gsi)
{
gimple stmt = gsi_stmt (*gsi);
gimple def_stmt;
- tree op0, op1, op2, op3;
- enum tree_code code = gimple_assign_rhs_code (stmt);
- enum tree_code code2;
+ tree op0, op1, op2, op3, arg0, arg1;
+ enum tree_code code;
+ bool single_use_op0 = false;
- gcc_checking_assert (code == VEC_PERM_EXPR);
+ gcc_checking_assert (gimple_assign_rhs_code (stmt) == VEC_PERM_EXPR);
op0 = gimple_assign_rhs1 (stmt);
op1 = gimple_assign_rhs2 (stmt);
op2 = gimple_assign_rhs3 (stmt);
- if (TREE_CODE (op0) != SSA_NAME)
- return 0;
-
if (TREE_CODE (op2) != VECTOR_CST)
return 0;
- if (op0 != op1)
- return 0;
+ if (TREE_CODE (op0) == VECTOR_CST)
+ {
+ code = VECTOR_CST;
+ arg0 = op0;
+ }
+ else if (TREE_CODE (op0) == SSA_NAME)
+ {
+ def_stmt = get_prop_source_stmt (op0, false, &single_use_op0);
+ if (!def_stmt || !can_propagate_from (def_stmt))
+ return 0;
- def_stmt = SSA_NAME_DEF_STMT (op0);
- if (!def_stmt || !is_gimple_assign (def_stmt)
- || !can_propagate_from (def_stmt))
+ code = gimple_assign_rhs_code (def_stmt);
+ arg0 = gimple_assign_rhs1 (def_stmt);
+ }
+ else
return 0;
- code2 = gimple_assign_rhs_code (def_stmt);
-
/* Two consecutive shuffles. */
- if (code2 == VEC_PERM_EXPR)
+ if (code == VEC_PERM_EXPR)
{
tree orig;
int ident;
+
+ if (op0 != op1)
+ return 0;
op3 = gimple_assign_rhs3 (def_stmt);
if (TREE_CODE (op3) != VECTOR_CST)
return 0;
@@ -2660,7 +2739,133 @@ simplify_permutation (gimple_stmt_iterator *gsi)
return remove_prop_source_from_use (op0) ? 2 : 1;
}
- return false;
+ /* Shuffle of a constructor. */
+ else if (code == CONSTRUCTOR || code == VECTOR_CST)
+ {
+ tree opt;
+ bool ret = false;
+ if (op0 != op1)
+ {
+ if (TREE_CODE (op0) == SSA_NAME && !single_use_op0)
+ return 0;
+
+ if (TREE_CODE (op1) == VECTOR_CST)
+ arg1 = op1;
+ else if (TREE_CODE (op1) == SSA_NAME)
+ {
+ enum tree_code code2;
+
+ gimple def_stmt2 = get_prop_source_stmt (op1, true, NULL);
+ if (!def_stmt2 || !can_propagate_from (def_stmt2))
+ return 0;
+
+ code2 = gimple_assign_rhs_code (def_stmt2);
+ if (code2 != CONSTRUCTOR && code2 != VECTOR_CST)
+ return 0;
+ arg1 = gimple_assign_rhs1 (def_stmt2);
+ }
+ else
+ return 0;
+ }
+ else
+ {
+ /* Already used twice in this statement. */
+ if (TREE_CODE (op0) == SSA_NAME && num_imm_uses (op0) > 2)
+ return 0;
+ arg1 = arg0;
+ }
+ opt = fold_ternary (VEC_PERM_EXPR, TREE_TYPE(op0), arg0, arg1, op2);
+ if (!opt
+ || (TREE_CODE (opt) != CONSTRUCTOR && TREE_CODE(opt) != VECTOR_CST))
+ return 0;
+ gimple_assign_set_rhs_from_tree (gsi, opt);
+ update_stmt (gsi_stmt (*gsi));
+ if (TREE_CODE (op0) == SSA_NAME)
+ ret = remove_prop_source_from_use (op0);
+ if (op0 != op1 && TREE_CODE (op1) == SSA_NAME)
+ ret |= remove_prop_source_from_use (op1);
+ return ret ? 2 : 1;
+ }
+
+ return 0;
+}
+
+/* Recognize a VEC_PERM_EXPR. Returns true if there were any changes. */
+
+static bool
+simplify_vector_constructor (gimple_stmt_iterator *gsi)
+{
+ gimple stmt = gsi_stmt (*gsi);
+ gimple def_stmt;
+ tree op, op2, orig, type, elem_type;
+ unsigned elem_size, nelts, i;
+ enum tree_code code;
+ constructor_elt *elt;
+ unsigned char *sel;
+ bool maybe_ident;
+
+ gcc_checking_assert (gimple_assign_rhs_code (stmt) == CONSTRUCTOR);
+
+ op = gimple_assign_rhs1 (stmt);
+ type = TREE_TYPE (op);
+ gcc_checking_assert (TREE_CODE (type) == VECTOR_TYPE);
+
+ nelts = TYPE_VECTOR_SUBPARTS (type);
+ elem_type = TREE_TYPE (type);
+ elem_size = TREE_INT_CST_LOW (TYPE_SIZE (elem_type));
+
+ sel = XALLOCAVEC (unsigned char, nelts);
+ orig = NULL;
+ maybe_ident = true;
+ FOR_EACH_VEC_ELT (constructor_elt, CONSTRUCTOR_ELTS (op), i, elt)
+ {
+ tree ref, op1;
+
+ if (i >= nelts)
+ return false;
+
+ if (TREE_CODE (elt->value) != SSA_NAME)
+ return false;
+ def_stmt = get_prop_source_stmt (elt->value, false, NULL);
+ if (!def_stmt)
+ return false;
+ code = gimple_assign_rhs_code (def_stmt);
+ if (code != BIT_FIELD_REF)
+ return false;
+ op1 = gimple_assign_rhs1 (def_stmt);
+ ref = TREE_OPERAND (op1, 0);
+ if (orig)
+ {
+ if (ref != orig)
+ return false;
+ }
+ else
+ {
+ if (TREE_CODE (ref) != SSA_NAME)
+ return false;
+ orig = ref;
+ }
+ if (TREE_INT_CST_LOW (TREE_OPERAND (op1, 1)) != elem_size)
+ return false;
+ sel[i] = TREE_INT_CST_LOW (TREE_OPERAND (op1, 2)) / elem_size;
+ if (sel[i] != i) maybe_ident = false;
+ }
+ if (i < nelts)
+ return false;
+
+ if (maybe_ident)
+ {
+ gimple_assign_set_rhs_from_tree (gsi, orig);
+ }
+ else
+ {
+ op2 = vect_gen_perm_mask (type, sel);
+ if (!op2)
+ return false;
+ gimple_assign_set_rhs_with_ops_1 (gsi, VEC_PERM_EXPR, orig, orig, op2);
+ }
+ update_stmt (gsi_stmt (*gsi));
+ return true;
}
/* Main entry point for the forward propagation and statement combine
@@ -2832,6 +3037,11 @@ ssa_forward_propagate_and_combine (void)
cfg_changed = true;
changed = did_something != 0;
}
+ else if (code == BIT_FIELD_REF)
+ changed = simplify_bitfield_ref (&gsi);
+ else if (code == CONSTRUCTOR
+ && TREE_CODE (TREE_TYPE (rhs1)) == VECTOR_TYPE)
+ changed = simplify_vector_constructor (&gsi);
break;
}
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index 0f61631cc79..67cab3a31ae 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -2113,9 +2113,14 @@ execute_sm_if_changed_flag_set (struct loop *loop, mem_ref_p ref)
gimple_stmt_iterator gsi;
gimple stmt;
- gsi = gsi_for_stmt (loc->stmt);
- stmt = gimple_build_assign (flag, boolean_true_node);
- gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
+ /* Only set the flag for writes. */
+ if (is_gimple_assign (loc->stmt)
+ && gimple_assign_lhs_ptr (loc->stmt) == loc->ref)
+ {
+ gsi = gsi_for_stmt (loc->stmt);
+ stmt = gimple_build_assign (flag, boolean_true_node);
+ gsi_insert_after (&gsi, stmt, GSI_CONTINUE_LINKING);
+ }
}
VEC_free (mem_ref_loc_p, heap, locs);
return flag;
diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
index c8ec5026659..948620fa8cd 100644
--- a/gcc/tree-ssa-phiopt.c
+++ b/gcc/tree-ssa-phiopt.c
@@ -519,24 +519,6 @@ blocks_in_phiopt_order (void)
#undef VISITED_P
}
-
-/* Return TRUE if block BB has no executable statements, otherwise return
- FALSE. */
-
-bool
-empty_block_p (basic_block bb)
-{
- /* BB must have no executable statements. */
- gimple_stmt_iterator gsi = gsi_after_labels (bb);
- if (phi_nodes (bb))
- return false;
- if (gsi_end_p (gsi))
- return true;
- if (is_gimple_debug (gsi_stmt (gsi)))
- gsi_next_nondebug (&gsi);
- return gsi_end_p (gsi);
-}
-
/* Replace PHI node element whose edge is E in block BB with variable NEW.
Remove the edge from COND_BLOCK which does not lead to BB (COND_BLOCK
is known to have two edges, one of which must reach BB). */
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index 9e217b5f0a4..ab9f2f467c3 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-scalar-evolution.h"
#include "params.h"
#include "dbgcnt.h"
+#include "domwalk.h"
/* TODO:
@@ -351,8 +352,6 @@ get_or_alloc_expr_for_name (tree name)
return result;
}
-static bool in_fre = false;
-
/* An unordered bitmap set. One bitmap tracks values, the other,
expressions. */
typedef struct bitmap_set
@@ -637,6 +636,25 @@ get_expr_value_id (pre_expr expr)
}
}
+/* Return a SCCVN valnum (SSA name or constant) for the PRE value-id VAL. */
+
+static tree
+sccvn_valnum_from_value_id (unsigned int val)
+{
+ bitmap_iterator bi;
+ unsigned int i;
+ bitmap exprset = VEC_index (bitmap, value_expressions, val);
+ EXECUTE_IF_SET_IN_BITMAP (exprset, 0, i, bi)
+ {
+ pre_expr vexpr = expression_for_id (i);
+ if (vexpr->kind == NAME)
+ return VN_INFO (PRE_EXPR_NAME (vexpr))->valnum;
+ else if (vexpr->kind == CONSTANT)
+ return PRE_EXPR_CONSTANT (vexpr);
+ }
+ return NULL_TREE;
+}
+
/* Remove an expression EXPR from a bitmapped set. */
static void
@@ -1022,16 +1040,13 @@ DEBUG_FUNCTION void
debug_bitmap_sets_for (basic_block bb)
{
print_bitmap_set (stderr, AVAIL_OUT (bb), "avail_out", bb->index);
- if (!in_fre)
- {
- print_bitmap_set (stderr, EXP_GEN (bb), "exp_gen", bb->index);
- print_bitmap_set (stderr, PHI_GEN (bb), "phi_gen", bb->index);
- print_bitmap_set (stderr, TMP_GEN (bb), "tmp_gen", bb->index);
- print_bitmap_set (stderr, ANTIC_IN (bb), "antic_in", bb->index);
- if (do_partial_partial)
- print_bitmap_set (stderr, PA_IN (bb), "pa_in", bb->index);
- print_bitmap_set (stderr, NEW_SETS (bb), "new_sets", bb->index);
- }
+ print_bitmap_set (stderr, EXP_GEN (bb), "exp_gen", bb->index);
+ print_bitmap_set (stderr, PHI_GEN (bb), "phi_gen", bb->index);
+ print_bitmap_set (stderr, TMP_GEN (bb), "tmp_gen", bb->index);
+ print_bitmap_set (stderr, ANTIC_IN (bb), "antic_in", bb->index);
+ if (do_partial_partial)
+ print_bitmap_set (stderr, PA_IN (bb), "pa_in", bb->index);
+ print_bitmap_set (stderr, NEW_SETS (bb), "new_sets", bb->index);
}
/* Print out the expressions that have VAL to OUTFILE. */
@@ -1402,11 +1417,9 @@ get_representative_for (const pre_expr e)
that we will return. */
name = make_temp_ssa_name (get_expr_type (e), gimple_build_nop (), "pretmp");
VN_INFO_GET (name)->value_id = value_id;
- if (e->kind == CONSTANT)
- VN_INFO (name)->valnum = PRE_EXPR_CONSTANT (e);
- else
+ VN_INFO (name)->valnum = sccvn_valnum_from_value_id (value_id);
+ if (VN_INFO (name)->valnum == NULL_TREE)
VN_INFO (name)->valnum = name;
-
add_to_value (value_id, get_or_alloc_expr_for_name (name));
if (dump_file)
{
@@ -2563,23 +2576,6 @@ compute_antic (void)
sbitmap_free (changed_blocks);
}
-/* Return true if OP is a tree which we can perform PRE on.
- This may not match the operations we can value number, but in
- a perfect world would. */
-
-static bool
-can_PRE_operation (tree op)
-{
- return UNARY_CLASS_P (op)
- || BINARY_CLASS_P (op)
- || COMPARISON_CLASS_P (op)
- || TREE_CODE (op) == MEM_REF
- || TREE_CODE (op) == COMPONENT_REF
- || TREE_CODE (op) == VIEW_CONVERT_EXPR
- || TREE_CODE (op) == CALL_EXPR
- || TREE_CODE (op) == ARRAY_REF;
-}
-
/* Inserted expressions are placed onto this worklist, which is used
for performing quick dead code elimination of insertions we made
@@ -3072,8 +3068,7 @@ create_expression_by_pieces (basic_block block, pre_expr expr,
VN_INFO (forcedname)->value_id = get_next_value_id ();
nameexpr = get_or_alloc_expr_for_name (forcedname);
add_to_value (VN_INFO (forcedname)->value_id, nameexpr);
- if (!in_fre)
- bitmap_value_replace_in_set (NEW_SETS (block), nameexpr);
+ bitmap_value_replace_in_set (NEW_SETS (block), nameexpr);
bitmap_value_replace_in_set (AVAIL_OUT (block), nameexpr);
}
}
@@ -3097,9 +3092,12 @@ create_expression_by_pieces (basic_block block, pre_expr expr,
we are creating the expression by pieces, and this particular piece of
the expression may have been represented. There is no harm in replacing
here. */
- VN_INFO_GET (name)->valnum = name;
value_id = get_expr_value_id (expr);
- VN_INFO (name)->value_id = value_id;
+ VN_INFO_GET (name)->value_id = value_id;
+ VN_INFO (name)->valnum = sccvn_valnum_from_value_id (value_id);
+ if (VN_INFO (name)->valnum == NULL_TREE)
+ VN_INFO (name)->valnum = name;
+ gcc_assert (VN_INFO (name)->valnum != NULL_TREE);
nameexpr = get_or_alloc_expr_for_name (name);
add_to_value (value_id, nameexpr);
if (NEW_SETS (block))
@@ -3339,9 +3337,11 @@ insert_into_preds_of_block (basic_block block, unsigned int exprnum,
phi = create_phi_node (temp, block);
gimple_set_plf (phi, NECESSARY, false);
- VN_INFO_GET (gimple_phi_result (phi))->valnum = gimple_phi_result (phi);
- VN_INFO (gimple_phi_result (phi))->value_id = val;
- bitmap_set_bit (inserted_exprs, SSA_NAME_VERSION (gimple_phi_result (phi)));
+ VN_INFO_GET (temp)->value_id = val;
+ VN_INFO (temp)->valnum = sccvn_valnum_from_value_id (val);
+ if (VN_INFO (temp)->valnum == NULL_TREE)
+ VN_INFO (temp)->valnum = temp;
+ bitmap_set_bit (inserted_exprs, SSA_NAME_VERSION (temp));
FOR_EACH_EDGE (pred, ei, block->preds)
{
pre_expr ae = VEC_index (pre_expr, avail, pred->dest_idx);
@@ -3353,7 +3353,7 @@ insert_into_preds_of_block (basic_block block, unsigned int exprnum,
add_phi_arg (phi, PRE_EXPR_NAME (ae), pred, UNKNOWN_LOCATION);
}
- newphi = get_or_alloc_expr_for_name (gimple_phi_result (phi));
+ newphi = get_or_alloc_expr_for_name (temp);
add_to_value (val, newphi);
/* The value should *not* exist in PHI_GEN, or else we wouldn't be doing
@@ -3782,8 +3782,6 @@ add_to_exp_gen (basic_block block, tree op)
{
pre_expr result;
- gcc_checking_assert (!in_fre);
-
if (TREE_CODE (op) == SSA_NAME && ssa_undefined_value_p (op))
return;
@@ -3797,6 +3795,7 @@ static void
make_values_for_phi (gimple phi, basic_block block)
{
tree result = gimple_phi_result (phi);
+ unsigned i;
/* We have no need for virtual phis, as they don't represent
actual computations. */
@@ -3806,18 +3805,14 @@ make_values_for_phi (gimple phi, basic_block block)
pre_expr e = get_or_alloc_expr_for_name (result);
add_to_value (get_expr_value_id (e), e);
bitmap_value_insert_into_set (AVAIL_OUT (block), e);
- if (!in_fre)
+ bitmap_insert_into_set (PHI_GEN (block), e);
+ for (i = 0; i < gimple_phi_num_args (phi); ++i)
{
- unsigned i;
- bitmap_insert_into_set (PHI_GEN (block), e);
- for (i = 0; i < gimple_phi_num_args (phi); ++i)
+ tree arg = gimple_phi_arg_def (phi, i);
+ if (TREE_CODE (arg) == SSA_NAME)
{
- tree arg = gimple_phi_arg_def (phi, i);
- if (TREE_CODE (arg) == SSA_NAME)
- {
- e = get_or_alloc_expr_for_name (arg);
- add_to_value (get_expr_value_id (e), e);
- }
+ e = get_or_alloc_expr_for_name (arg);
+ add_to_value (get_expr_value_id (e), e);
}
}
}
@@ -3855,8 +3850,7 @@ compute_avail (void)
e = get_or_alloc_expr_for_name (name);
add_to_value (get_expr_value_id (e), e);
- if (!in_fre)
- bitmap_insert_into_set (TMP_GEN (ENTRY_BLOCK_PTR), e);
+ bitmap_insert_into_set (TMP_GEN (ENTRY_BLOCK_PTR), e);
bitmap_value_insert_into_set (AVAIL_OUT (ENTRY_BLOCK_PTR), e);
}
@@ -3924,30 +3918,26 @@ compute_avail (void)
pre_expr e = get_or_alloc_expr_for_name (op);
add_to_value (get_expr_value_id (e), e);
- if (!in_fre)
- bitmap_insert_into_set (TMP_GEN (block), e);
+ bitmap_insert_into_set (TMP_GEN (block), e);
bitmap_value_insert_into_set (AVAIL_OUT (block), e);
}
- /* That's all we need to do when doing FRE. */
- if (in_fre)
+ if (gimple_has_side_effects (stmt)
+ || stmt_could_throw_p (stmt)
+ || is_gimple_debug (stmt))
continue;
- if (gimple_has_side_effects (stmt) || stmt_could_throw_p (stmt))
- continue;
+ FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
+ add_to_exp_gen (block, op);
switch (gimple_code (stmt))
{
case GIMPLE_RETURN:
- FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
- add_to_exp_gen (block, op);
continue;
case GIMPLE_CALL:
{
vn_reference_t ref;
- unsigned int i;
- vn_reference_op_t vro;
pre_expr result = NULL;
VEC(vn_reference_op_s, heap) *ops = NULL;
@@ -3963,18 +3953,6 @@ compute_avail (void)
if (!ref)
continue;
- for (i = 0; VEC_iterate (vn_reference_op_s,
- ref->operands, i,
- vro); i++)
- {
- if (vro->op0 && TREE_CODE (vro->op0) == SSA_NAME)
- add_to_exp_gen (block, vro->op0);
- if (vro->op1 && TREE_CODE (vro->op1) == SSA_NAME)
- add_to_exp_gen (block, vro->op1);
- if (vro->op2 && TREE_CODE (vro->op2) == SSA_NAME)
- add_to_exp_gen (block, vro->op2);
- }
-
/* If the value of the call is not invalidated in
this block until it is computed, add the expression
to EXP_GEN. */
@@ -3999,28 +3977,19 @@ compute_avail (void)
case GIMPLE_ASSIGN:
{
pre_expr result = NULL;
- switch (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt)))
+ switch (vn_get_stmt_kind (stmt))
{
- case tcc_unary:
- case tcc_binary:
- case tcc_comparison:
+ case VN_NARY:
{
vn_nary_op_t nary;
- unsigned int i;
-
vn_nary_op_lookup_pieces (gimple_num_ops (stmt) - 1,
gimple_assign_rhs_code (stmt),
gimple_expr_type (stmt),
gimple_assign_rhs1_ptr (stmt),
&nary);
-
if (!nary)
continue;
- for (i = 0; i < nary->length; i++)
- if (TREE_CODE (nary->op[i]) == SSA_NAME)
- add_to_exp_gen (block, nary->op[i]);
-
/* If the NARY traps and there was a preceding
point in the block that might not return avoid
adding the nary to EXP_GEN. */
@@ -4035,31 +4004,15 @@ compute_avail (void)
break;
}
- case tcc_declaration:
- case tcc_reference:
+ case VN_REFERENCE:
{
vn_reference_t ref;
- unsigned int i;
- vn_reference_op_t vro;
-
vn_reference_lookup (gimple_assign_rhs1 (stmt),
gimple_vuse (stmt),
VN_WALK, &ref);
if (!ref)
continue;
- for (i = 0; VEC_iterate (vn_reference_op_s,
- ref->operands, i,
- vro); i++)
- {
- if (vro->op0 && TREE_CODE (vro->op0) == SSA_NAME)
- add_to_exp_gen (block, vro->op0);
- if (vro->op1 && TREE_CODE (vro->op1) == SSA_NAME)
- add_to_exp_gen (block, vro->op1);
- if (vro->op2 && TREE_CODE (vro->op2) == SSA_NAME)
- add_to_exp_gen (block, vro->op2);
- }
-
/* If the value of the reference is not invalidated in
this block until it is computed, add the expression
to EXP_GEN. */
@@ -4093,18 +4046,12 @@ compute_avail (void)
}
default:
- /* For any other statement that we don't
- recognize, simply add all referenced
- SSA_NAMEs to EXP_GEN. */
- FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
- add_to_exp_gen (block, op);
continue;
}
get_or_alloc_expression_id (result);
add_to_value (get_expr_value_id (result), result);
bitmap_value_insert_into_set (EXP_GEN (block), result);
-
continue;
}
default:
@@ -4123,407 +4070,471 @@ compute_avail (void)
free (worklist);
}
-/* Insert the expression for SSA_VN that SCCVN thought would be simpler
- than the available expressions for it. The insertion point is
- right before the first use in STMT. Returns the SSA_NAME that should
- be used for replacement. */
+
+/* Local state for the eliminate domwalk. */
+static VEC (gimple, heap) *el_to_remove;
+static VEC (gimple, heap) *el_to_update;
+static unsigned int el_todo;
+static VEC (tree, heap) *el_avail;
+static VEC (tree, heap) *el_avail_stack;
+
+/* Return a leader for OP that is available at the current point of the
+ eliminate domwalk. */
static tree
-do_SCCVN_insertion (gimple stmt, tree ssa_vn)
+eliminate_avail (tree op)
{
- basic_block bb = gimple_bb (stmt);
- gimple_stmt_iterator gsi;
- gimple_seq stmts = NULL;
- tree expr;
- pre_expr e;
+ tree valnum = VN_INFO (op)->valnum;
+ if (TREE_CODE (valnum) == SSA_NAME)
+ {
+ if (SSA_NAME_IS_DEFAULT_DEF (valnum))
+ return valnum;
+ if (VEC_length (tree, el_avail) > SSA_NAME_VERSION (valnum))
+ return VEC_index (tree, el_avail, SSA_NAME_VERSION (valnum));
+ }
+ else if (is_gimple_min_invariant (valnum))
+ return valnum;
+ return NULL_TREE;
+}
+
+/* At the current point of the eliminate domwalk make OP available. */
- /* First create a value expression from the expression we want
- to insert and associate it with the value handle for SSA_VN. */
- e = get_or_alloc_expr_for (vn_get_expr_for (ssa_vn));
- if (e == NULL)
+static void
+eliminate_push_avail (tree op)
+{
+ tree valnum = VN_INFO (op)->valnum;
+ if (TREE_CODE (valnum) == SSA_NAME)
+ {
+ if (VEC_length (tree, el_avail) <= SSA_NAME_VERSION (valnum))
+ VEC_safe_grow_cleared (tree, heap,
+ el_avail, SSA_NAME_VERSION (valnum) + 1);
+ VEC_replace (tree, el_avail, SSA_NAME_VERSION (valnum), op);
+ VEC_safe_push (tree, heap, el_avail_stack, op);
+ }
+}
+
+/* Insert the expression recorded by SCCVN for VAL at *GSI. Returns
+ the leader for the expression if insertion was successful. */
+
+static tree
+eliminate_insert (gimple_stmt_iterator *gsi, tree val)
+{
+ tree expr = vn_get_expr_for (val);
+ if (!CONVERT_EXPR_P (expr)
+ && TREE_CODE (expr) != VIEW_CONVERT_EXPR)
return NULL_TREE;
- /* Then use create_expression_by_pieces to generate a valid
- expression to insert at this point of the IL stream. */
- expr = create_expression_by_pieces (bb, e, &stmts, stmt, NULL);
- if (expr == NULL_TREE)
+ tree op = TREE_OPERAND (expr, 0);
+ tree leader = TREE_CODE (op) == SSA_NAME ? eliminate_avail (op) : op;
+ if (!leader)
return NULL_TREE;
- gsi = gsi_for_stmt (stmt);
- gsi_insert_seq_before (&gsi, stmts, GSI_SAME_STMT);
- return expr;
+ tree res = make_temp_ssa_name (TREE_TYPE (val), NULL, "pretmp");
+ gimple tem = gimple_build_assign (res,
+ build1 (TREE_CODE (expr),
+ TREE_TYPE (expr), leader));
+ gsi_insert_before (gsi, tem, GSI_SAME_STMT);
+ VN_INFO_GET (res)->valnum = val;
+
+ if (TREE_CODE (leader) == SSA_NAME)
+ gimple_set_plf (SSA_NAME_DEF_STMT (leader), NECESSARY, true);
+
+ pre_stats.insertions++;
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, "Inserted ");
+ print_gimple_stmt (dump_file, tem, 0, 0);
+ }
+
+ return res;
}
-/* Eliminate fully redundant computations. */
+/* Perform elimination for the basic-block B during the domwalk. */
-static unsigned int
-eliminate (void)
+static void
+eliminate_bb (dom_walk_data *, basic_block b)
{
- VEC (gimple, heap) *to_remove = NULL;
- VEC (gimple, heap) *to_update = NULL;
- basic_block b;
- unsigned int todo = 0;
gimple_stmt_iterator gsi;
gimple stmt;
- unsigned i;
- FOR_EACH_BB (b)
+ /* Mark new bb. */
+ VEC_safe_push (tree, heap, el_avail_stack, NULL_TREE);
+
+ for (gsi = gsi_start_phis (b); !gsi_end_p (gsi);)
{
- for (gsi = gsi_start_bb (b); !gsi_end_p (gsi); gsi_next (&gsi))
+ gimple stmt, phi = gsi_stmt (gsi);
+ tree sprime = NULL_TREE, res = PHI_RESULT (phi);
+ gimple_stmt_iterator gsi2;
+
+ /* We want to perform redundant PHI elimination. Do so by
+ replacing the PHI with a single copy if possible.
+ Do not touch inserted, single-argument or virtual PHIs. */
+ if (gimple_phi_num_args (phi) == 1
+ || virtual_operand_p (res))
{
- tree lhs = NULL_TREE;
- tree rhs = NULL_TREE;
-
- stmt = gsi_stmt (gsi);
-
- if (gimple_has_lhs (stmt))
- lhs = gimple_get_lhs (stmt);
-
- if (gimple_assign_single_p (stmt))
- rhs = gimple_assign_rhs1 (stmt);
-
- /* Lookup the RHS of the expression, see if we have an
- available computation for it. If so, replace the RHS with
- the available computation.
-
- See PR43491.
- We don't replace global register variable when it is a the RHS of
- a single assign. We do replace local register variable since gcc
- does not guarantee local variable will be allocated in register. */
- if (gimple_has_lhs (stmt)
- && TREE_CODE (lhs) == SSA_NAME
- && !gimple_assign_ssa_name_copy_p (stmt)
- && (!gimple_assign_single_p (stmt)
- || (!is_gimple_min_invariant (rhs)
- && (gimple_assign_rhs_code (stmt) != VAR_DECL
- || !is_global_var (rhs)
- || !DECL_HARD_REGISTER (rhs))))
- && !gimple_has_volatile_ops (stmt)
- && !has_zero_uses (lhs))
- {
- tree sprime = NULL;
- pre_expr lhsexpr = get_or_alloc_expr_for_name (lhs);
- pre_expr sprimeexpr;
- gimple orig_stmt = stmt;
+ gsi_next (&gsi);
+ continue;
+ }
- sprimeexpr = bitmap_find_leader (AVAIL_OUT (b),
- get_expr_value_id (lhsexpr),
- NULL);
+ sprime = eliminate_avail (res);
+ if (!sprime
+ || sprime == res)
+ {
+ eliminate_push_avail (res);
+ gsi_next (&gsi);
+ continue;
+ }
+ else if (is_gimple_min_invariant (sprime))
+ {
+ if (!useless_type_conversion_p (TREE_TYPE (res),
+ TREE_TYPE (sprime)))
+ sprime = fold_convert (TREE_TYPE (res), sprime);
+ }
- if (sprimeexpr)
- {
- if (sprimeexpr->kind == CONSTANT)
- sprime = PRE_EXPR_CONSTANT (sprimeexpr);
- else if (sprimeexpr->kind == NAME)
- sprime = PRE_EXPR_NAME (sprimeexpr);
- else
- gcc_unreachable ();
- }
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, "Replaced redundant PHI node defining ");
+ print_generic_expr (dump_file, res, 0);
+ fprintf (dump_file, " with ");
+ print_generic_expr (dump_file, sprime, 0);
+ fprintf (dump_file, "\n");
+ }
- /* If there is no existing leader but SCCVN knows this
- value is constant, use that constant. */
- if (!sprime && is_gimple_min_invariant (VN_INFO (lhs)->valnum))
- {
- sprime = VN_INFO (lhs)->valnum;
- if (!useless_type_conversion_p (TREE_TYPE (lhs),
- TREE_TYPE (sprime)))
- sprime = fold_convert (TREE_TYPE (lhs), sprime);
+ remove_phi_node (&gsi, false);
+
+ if (inserted_exprs
+ && !bitmap_bit_p (inserted_exprs, SSA_NAME_VERSION (res))
+ && TREE_CODE (sprime) == SSA_NAME)
+ gimple_set_plf (SSA_NAME_DEF_STMT (sprime), NECESSARY, true);
+
+ if (!useless_type_conversion_p (TREE_TYPE (res), TREE_TYPE (sprime)))
+ sprime = fold_convert (TREE_TYPE (res), sprime);
+ stmt = gimple_build_assign (res, sprime);
+ SSA_NAME_DEF_STMT (res) = stmt;
+ gimple_set_plf (stmt, NECESSARY, gimple_plf (phi, NECESSARY));
+
+ gsi2 = gsi_after_labels (b);
+ gsi_insert_before (&gsi2, stmt, GSI_NEW_STMT);
+ /* Queue the copy for eventual removal. */
+ VEC_safe_push (gimple, heap, el_to_remove, stmt);
+ /* If we inserted this PHI node ourself, it's not an elimination. */
+ if (inserted_exprs
+ && bitmap_bit_p (inserted_exprs, SSA_NAME_VERSION (res)))
+ pre_stats.phis--;
+ else
+ pre_stats.eliminations++;
+ }
- if (dump_file && (dump_flags & TDF_DETAILS))
- {
- fprintf (dump_file, "Replaced ");
- print_gimple_expr (dump_file, stmt, 0, 0);
- fprintf (dump_file, " with ");
- print_generic_expr (dump_file, sprime, 0);
- fprintf (dump_file, " in ");
- print_gimple_stmt (dump_file, stmt, 0, 0);
- }
- pre_stats.eliminations++;
- propagate_tree_value_into_stmt (&gsi, sprime);
- stmt = gsi_stmt (gsi);
- update_stmt (stmt);
-
- /* If we removed EH side-effects from the statement, clean
- its EH information. */
- if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
- {
- bitmap_set_bit (need_eh_cleanup,
- gimple_bb (stmt)->index);
- if (dump_file && (dump_flags & TDF_DETAILS))
- fprintf (dump_file, " Removed EH side-effects.\n");
- }
- continue;
- }
+ for (gsi = gsi_start_bb (b); !gsi_end_p (gsi); gsi_next (&gsi))
+ {
+ tree lhs = NULL_TREE;
+ tree rhs = NULL_TREE;
+
+ stmt = gsi_stmt (gsi);
+
+ if (gimple_has_lhs (stmt))
+ lhs = gimple_get_lhs (stmt);
+
+ if (gimple_assign_single_p (stmt))
+ rhs = gimple_assign_rhs1 (stmt);
+
+ /* Lookup the RHS of the expression, see if we have an
+ available computation for it. If so, replace the RHS with
+ the available computation.
+
+ See PR43491.
+ We don't replace global register variable when it is a the RHS of
+ a single assign. We do replace local register variable since gcc
+ does not guarantee local variable will be allocated in register. */
+ if (gimple_has_lhs (stmt)
+ && TREE_CODE (lhs) == SSA_NAME
+ && !gimple_assign_ssa_name_copy_p (stmt)
+ && (!gimple_assign_single_p (stmt)
+ || (!is_gimple_min_invariant (rhs)
+ && (gimple_assign_rhs_code (stmt) != VAR_DECL
+ || !is_global_var (rhs)
+ || !DECL_HARD_REGISTER (rhs))))
+ && !gimple_has_volatile_ops (stmt))
+ {
+ tree sprime;
+ gimple orig_stmt = stmt;
+ sprime = eliminate_avail (lhs);
+ if (!sprime)
+ {
/* If there is no existing usable leader but SCCVN thinks
it has an expression it wants to use as replacement,
insert that. */
- if (!sprime || sprime == lhs)
+ tree val = VN_INFO (lhs)->valnum;
+ if (val != VN_TOP
+ && TREE_CODE (val) == SSA_NAME
+ && VN_INFO (val)->needs_insertion
+ && (sprime = eliminate_insert (&gsi, val)) != NULL_TREE)
+ eliminate_push_avail (sprime);
+ }
+ else if (is_gimple_min_invariant (sprime))
+ {
+ /* If there is no existing leader but SCCVN knows this
+ value is constant, use that constant. */
+ if (!useless_type_conversion_p (TREE_TYPE (lhs),
+ TREE_TYPE (sprime)))
+ sprime = fold_convert (TREE_TYPE (lhs), sprime);
+
+ if (dump_file && (dump_flags & TDF_DETAILS))
{
- tree val = VN_INFO (lhs)->valnum;
- if (val != VN_TOP
- && TREE_CODE (val) == SSA_NAME
- && VN_INFO (val)->needs_insertion
- && can_PRE_operation (vn_get_expr_for (val)))
- sprime = do_SCCVN_insertion (stmt, val);
+ fprintf (dump_file, "Replaced ");
+ print_gimple_expr (dump_file, stmt, 0, 0);
+ fprintf (dump_file, " with ");
+ print_generic_expr (dump_file, sprime, 0);
+ fprintf (dump_file, " in ");
+ print_gimple_stmt (dump_file, stmt, 0, 0);
}
- if (sprime
- && sprime != lhs
- && (rhs == NULL_TREE
- || TREE_CODE (rhs) != SSA_NAME
- || may_propagate_copy (rhs, sprime)))
+ pre_stats.eliminations++;
+ propagate_tree_value_into_stmt (&gsi, sprime);
+ stmt = gsi_stmt (gsi);
+ update_stmt (stmt);
+
+ /* If we removed EH side-effects from the statement, clean
+ its EH information. */
+ if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
{
- bool can_make_abnormal_goto
- = is_gimple_call (stmt)
- && stmt_can_make_abnormal_goto (stmt);
+ bitmap_set_bit (need_eh_cleanup,
+ gimple_bb (stmt)->index);
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, " Removed EH side-effects.\n");
+ }
+ continue;
+ }
- gcc_assert (sprime != rhs);
+ /* If there is no usable leader mark lhs as leader for its value. */
+ if (!sprime)
+ eliminate_push_avail (lhs);
- if (dump_file && (dump_flags & TDF_DETAILS))
- {
- fprintf (dump_file, "Replaced ");
- print_gimple_expr (dump_file, stmt, 0, 0);
- fprintf (dump_file, " with ");
- print_generic_expr (dump_file, sprime, 0);
- fprintf (dump_file, " in ");
- print_gimple_stmt (dump_file, stmt, 0, 0);
- }
+ if (sprime
+ && sprime != lhs
+ && (rhs == NULL_TREE
+ || TREE_CODE (rhs) != SSA_NAME
+ || may_propagate_copy (rhs, sprime)))
+ {
+ bool can_make_abnormal_goto
+ = is_gimple_call (stmt)
+ && stmt_can_make_abnormal_goto (stmt);
- if (TREE_CODE (sprime) == SSA_NAME)
- gimple_set_plf (SSA_NAME_DEF_STMT (sprime),
- NECESSARY, true);
- /* We need to make sure the new and old types actually match,
- which may require adding a simple cast, which fold_convert
- will do for us. */
- if ((!rhs || TREE_CODE (rhs) != SSA_NAME)
- && !useless_type_conversion_p (gimple_expr_type (stmt),
- TREE_TYPE (sprime)))
- sprime = fold_convert (gimple_expr_type (stmt), sprime);
-
- pre_stats.eliminations++;
- propagate_tree_value_into_stmt (&gsi, sprime);
- stmt = gsi_stmt (gsi);
- update_stmt (stmt);
-
- /* If we removed EH side-effects from the statement, clean
- its EH information. */
- if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
- {
- bitmap_set_bit (need_eh_cleanup,
- gimple_bb (stmt)->index);
- if (dump_file && (dump_flags & TDF_DETAILS))
- fprintf (dump_file, " Removed EH side-effects.\n");
- }
+ gcc_assert (sprime != rhs);
- /* Likewise for AB side-effects. */
- if (can_make_abnormal_goto
- && !stmt_can_make_abnormal_goto (stmt))
- {
- bitmap_set_bit (need_ab_cleanup,
- gimple_bb (stmt)->index);
- if (dump_file && (dump_flags & TDF_DETAILS))
- fprintf (dump_file, " Removed AB side-effects.\n");
- }
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, "Replaced ");
+ print_gimple_expr (dump_file, stmt, 0, 0);
+ fprintf (dump_file, " with ");
+ print_generic_expr (dump_file, sprime, 0);
+ fprintf (dump_file, " in ");
+ print_gimple_stmt (dump_file, stmt, 0, 0);
}
- }
- /* If the statement is a scalar store, see if the expression
- has the same value number as its rhs. If so, the store is
- dead. */
- else if (gimple_assign_single_p (stmt)
- && !gimple_has_volatile_ops (stmt)
- && !is_gimple_reg (gimple_assign_lhs (stmt))
- && (TREE_CODE (rhs) == SSA_NAME
- || is_gimple_min_invariant (rhs)))
- {
- tree val;
- val = vn_reference_lookup (gimple_assign_lhs (stmt),
- gimple_vuse (stmt), VN_WALK, NULL);
- if (TREE_CODE (rhs) == SSA_NAME)
- rhs = VN_INFO (rhs)->valnum;
- if (val
- && operand_equal_p (val, rhs, 0))
+
+ if (TREE_CODE (sprime) == SSA_NAME)
+ gimple_set_plf (SSA_NAME_DEF_STMT (sprime),
+ NECESSARY, true);
+ /* We need to make sure the new and old types actually match,
+ which may require adding a simple cast, which fold_convert
+ will do for us. */
+ if ((!rhs || TREE_CODE (rhs) != SSA_NAME)
+ && !useless_type_conversion_p (gimple_expr_type (stmt),
+ TREE_TYPE (sprime)))
+ sprime = fold_convert (gimple_expr_type (stmt), sprime);
+
+ pre_stats.eliminations++;
+ propagate_tree_value_into_stmt (&gsi, sprime);
+ stmt = gsi_stmt (gsi);
+ update_stmt (stmt);
+
+ /* If we removed EH side-effects from the statement, clean
+ its EH information. */
+ if (maybe_clean_or_replace_eh_stmt (orig_stmt, stmt))
{
+ bitmap_set_bit (need_eh_cleanup,
+ gimple_bb (stmt)->index);
if (dump_file && (dump_flags & TDF_DETAILS))
- {
- fprintf (dump_file, "Deleted redundant store ");
- print_gimple_stmt (dump_file, stmt, 0, 0);
- }
+ fprintf (dump_file, " Removed EH side-effects.\n");
+ }
- /* Queue stmt for removal. */
- VEC_safe_push (gimple, heap, to_remove, stmt);
+ /* Likewise for AB side-effects. */
+ if (can_make_abnormal_goto
+ && !stmt_can_make_abnormal_goto (stmt))
+ {
+ bitmap_set_bit (need_ab_cleanup,
+ gimple_bb (stmt)->index);
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, " Removed AB side-effects.\n");
}
}
- /* Visit COND_EXPRs and fold the comparison with the
- available value-numbers. */
- else if (gimple_code (stmt) == GIMPLE_COND)
+ }
+ /* If the statement is a scalar store, see if the expression
+ has the same value number as its rhs. If so, the store is
+ dead. */
+ else if (gimple_assign_single_p (stmt)
+ && !gimple_has_volatile_ops (stmt)
+ && !is_gimple_reg (gimple_assign_lhs (stmt))
+ && (TREE_CODE (rhs) == SSA_NAME
+ || is_gimple_min_invariant (rhs)))
+ {
+ tree val;
+ val = vn_reference_lookup (gimple_assign_lhs (stmt),
+ gimple_vuse (stmt), VN_WALK, NULL);
+ if (TREE_CODE (rhs) == SSA_NAME)
+ rhs = VN_INFO (rhs)->valnum;
+ if (val
+ && operand_equal_p (val, rhs, 0))
{
- tree op0 = gimple_cond_lhs (stmt);
- tree op1 = gimple_cond_rhs (stmt);
- tree result;
-
- if (TREE_CODE (op0) == SSA_NAME)
- op0 = VN_INFO (op0)->valnum;
- if (TREE_CODE (op1) == SSA_NAME)
- op1 = VN_INFO (op1)->valnum;
- result = fold_binary (gimple_cond_code (stmt), boolean_type_node,
- op0, op1);
- if (result && TREE_CODE (result) == INTEGER_CST)
+ if (dump_file && (dump_flags & TDF_DETAILS))
{
- if (integer_zerop (result))
- gimple_cond_make_false (stmt);
- else
- gimple_cond_make_true (stmt);
- update_stmt (stmt);
- todo = TODO_cleanup_cfg;
+ fprintf (dump_file, "Deleted redundant store ");
+ print_gimple_stmt (dump_file, stmt, 0, 0);
}
+
+ /* Queue stmt for removal. */
+ VEC_safe_push (gimple, heap, el_to_remove, stmt);
}
- /* Visit indirect calls and turn them into direct calls if
- possible. */
- if (is_gimple_call (stmt))
+ }
+ /* Visit COND_EXPRs and fold the comparison with the
+ available value-numbers. */
+ else if (gimple_code (stmt) == GIMPLE_COND)
+ {
+ tree op0 = gimple_cond_lhs (stmt);
+ tree op1 = gimple_cond_rhs (stmt);
+ tree result;
+
+ if (TREE_CODE (op0) == SSA_NAME)
+ op0 = VN_INFO (op0)->valnum;
+ if (TREE_CODE (op1) == SSA_NAME)
+ op1 = VN_INFO (op1)->valnum;
+ result = fold_binary (gimple_cond_code (stmt), boolean_type_node,
+ op0, op1);
+ if (result && TREE_CODE (result) == INTEGER_CST)
{
- tree orig_fn = gimple_call_fn (stmt);
- tree fn;
- if (!orig_fn)
- continue;
- if (TREE_CODE (orig_fn) == SSA_NAME)
- fn = VN_INFO (orig_fn)->valnum;
- else if (TREE_CODE (orig_fn) == OBJ_TYPE_REF
- && TREE_CODE (OBJ_TYPE_REF_EXPR (orig_fn)) == SSA_NAME)
- fn = VN_INFO (OBJ_TYPE_REF_EXPR (orig_fn))->valnum;
+ if (integer_zerop (result))
+ gimple_cond_make_false (stmt);
else
- continue;
- if (gimple_call_addr_fndecl (fn) != NULL_TREE
- && useless_type_conversion_p (TREE_TYPE (orig_fn),
- TREE_TYPE (fn)))
- {
- bool can_make_abnormal_goto
- = stmt_can_make_abnormal_goto (stmt);
- bool was_noreturn = gimple_call_noreturn_p (stmt);
-
- if (dump_file && (dump_flags & TDF_DETAILS))
- {
- fprintf (dump_file, "Replacing call target with ");
- print_generic_expr (dump_file, fn, 0);
- fprintf (dump_file, " in ");
- print_gimple_stmt (dump_file, stmt, 0, 0);
- }
+ gimple_cond_make_true (stmt);
+ update_stmt (stmt);
+ el_todo = TODO_cleanup_cfg;
+ }
+ }
+ /* Visit indirect calls and turn them into direct calls if
+ possible. */
+ if (is_gimple_call (stmt))
+ {
+ tree orig_fn = gimple_call_fn (stmt);
+ tree fn;
+ if (!orig_fn)
+ continue;
+ if (TREE_CODE (orig_fn) == SSA_NAME)
+ fn = VN_INFO (orig_fn)->valnum;
+ else if (TREE_CODE (orig_fn) == OBJ_TYPE_REF
+ && TREE_CODE (OBJ_TYPE_REF_EXPR (orig_fn)) == SSA_NAME)
+ fn = VN_INFO (OBJ_TYPE_REF_EXPR (orig_fn))->valnum;
+ else
+ continue;
+ if (gimple_call_addr_fndecl (fn) != NULL_TREE
+ && useless_type_conversion_p (TREE_TYPE (orig_fn),
+ TREE_TYPE (fn)))
+ {
+ bool can_make_abnormal_goto
+ = stmt_can_make_abnormal_goto (stmt);
+ bool was_noreturn = gimple_call_noreturn_p (stmt);
- gimple_call_set_fn (stmt, fn);
- VEC_safe_push (gimple, heap, to_update, stmt);
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ {
+ fprintf (dump_file, "Replacing call target with ");
+ print_generic_expr (dump_file, fn, 0);
+ fprintf (dump_file, " in ");
+ print_gimple_stmt (dump_file, stmt, 0, 0);
+ }
- /* When changing a call into a noreturn call, cfg cleanup
- is needed to fix up the noreturn call. */
- if (!was_noreturn && gimple_call_noreturn_p (stmt))
- todo |= TODO_cleanup_cfg;
+ gimple_call_set_fn (stmt, fn);
+ VEC_safe_push (gimple, heap, el_to_update, stmt);
- /* If we removed EH side-effects from the statement, clean
- its EH information. */
- if (maybe_clean_or_replace_eh_stmt (stmt, stmt))
- {
- bitmap_set_bit (need_eh_cleanup,
- gimple_bb (stmt)->index);
- if (dump_file && (dump_flags & TDF_DETAILS))
- fprintf (dump_file, " Removed EH side-effects.\n");
- }
+ /* When changing a call into a noreturn call, cfg cleanup
+ is needed to fix up the noreturn call. */
+ if (!was_noreturn && gimple_call_noreturn_p (stmt))
+ el_todo |= TODO_cleanup_cfg;
- /* Likewise for AB side-effects. */
- if (can_make_abnormal_goto
- && !stmt_can_make_abnormal_goto (stmt))
- {
- bitmap_set_bit (need_ab_cleanup,
- gimple_bb (stmt)->index);
- if (dump_file && (dump_flags & TDF_DETAILS))
- fprintf (dump_file, " Removed AB side-effects.\n");
- }
+ /* If we removed EH side-effects from the statement, clean
+ its EH information. */
+ if (maybe_clean_or_replace_eh_stmt (stmt, stmt))
+ {
+ bitmap_set_bit (need_eh_cleanup,
+ gimple_bb (stmt)->index);
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, " Removed EH side-effects.\n");
+ }
- /* Changing an indirect call to a direct call may
- have exposed different semantics. This may
- require an SSA update. */
- todo |= TODO_update_ssa_only_virtuals;
+ /* Likewise for AB side-effects. */
+ if (can_make_abnormal_goto
+ && !stmt_can_make_abnormal_goto (stmt))
+ {
+ bitmap_set_bit (need_ab_cleanup,
+ gimple_bb (stmt)->index);
+ if (dump_file && (dump_flags & TDF_DETAILS))
+ fprintf (dump_file, " Removed AB side-effects.\n");
}
+
+ /* Changing an indirect call to a direct call may
+ have exposed different semantics. This may
+ require an SSA update. */
+ el_todo |= TODO_update_ssa_only_virtuals;
}
}
+ }
+}
- for (gsi = gsi_start_phis (b); !gsi_end_p (gsi);)
- {
- gimple stmt, phi = gsi_stmt (gsi);
- tree sprime = NULL_TREE, res = PHI_RESULT (phi);
- pre_expr sprimeexpr, resexpr;
- gimple_stmt_iterator gsi2;
-
- /* We want to perform redundant PHI elimination. Do so by
- replacing the PHI with a single copy if possible.
- Do not touch inserted, single-argument or virtual PHIs. */
- if (gimple_phi_num_args (phi) == 1
- || virtual_operand_p (res))
- {
- gsi_next (&gsi);
- continue;
- }
+/* Make no longer available leaders no longer available. */
- resexpr = get_or_alloc_expr_for_name (res);
- sprimeexpr = bitmap_find_leader (AVAIL_OUT (b),
- get_expr_value_id (resexpr), NULL);
- if (sprimeexpr)
- {
- if (sprimeexpr->kind == CONSTANT)
- sprime = PRE_EXPR_CONSTANT (sprimeexpr);
- else if (sprimeexpr->kind == NAME)
- sprime = PRE_EXPR_NAME (sprimeexpr);
- else
- gcc_unreachable ();
- }
- if (!sprime && is_gimple_min_invariant (VN_INFO (res)->valnum))
- {
- sprime = VN_INFO (res)->valnum;
- if (!useless_type_conversion_p (TREE_TYPE (res),
- TREE_TYPE (sprime)))
- sprime = fold_convert (TREE_TYPE (res), sprime);
- }
- if (!sprime
- || sprime == res)
- {
- gsi_next (&gsi);
- continue;
- }
+static void
+eliminate_leave_block (dom_walk_data *, basic_block)
+{
+ tree entry;
+ while ((entry = VEC_pop (tree, el_avail_stack)) != NULL_TREE)
+ VEC_replace (tree, el_avail,
+ SSA_NAME_VERSION (VN_INFO (entry)->valnum), NULL_TREE);
+}
- if (dump_file && (dump_flags & TDF_DETAILS))
- {
- fprintf (dump_file, "Replaced redundant PHI node defining ");
- print_generic_expr (dump_file, res, 0);
- fprintf (dump_file, " with ");
- print_generic_expr (dump_file, sprime, 0);
- fprintf (dump_file, "\n");
- }
+/* Eliminate fully redundant computations. */
- remove_phi_node (&gsi, false);
+static unsigned int
+eliminate (void)
+{
+ struct dom_walk_data walk_data;
+ gimple_stmt_iterator gsi;
+ gimple stmt;
+ unsigned i;
- if (!bitmap_bit_p (inserted_exprs, SSA_NAME_VERSION (res))
- && TREE_CODE (sprime) == SSA_NAME)
- gimple_set_plf (SSA_NAME_DEF_STMT (sprime), NECESSARY, true);
+ need_eh_cleanup = BITMAP_ALLOC (NULL);
+ need_ab_cleanup = BITMAP_ALLOC (NULL);
- if (!useless_type_conversion_p (TREE_TYPE (res), TREE_TYPE (sprime)))
- sprime = fold_convert (TREE_TYPE (res), sprime);
- stmt = gimple_build_assign (res, sprime);
- SSA_NAME_DEF_STMT (res) = stmt;
- gimple_set_plf (stmt, NECESSARY, gimple_plf (phi, NECESSARY));
-
- gsi2 = gsi_after_labels (b);
- gsi_insert_before (&gsi2, stmt, GSI_NEW_STMT);
- /* Queue the copy for eventual removal. */
- VEC_safe_push (gimple, heap, to_remove, stmt);
- /* If we inserted this PHI node ourself, it's not an elimination. */
- if (bitmap_bit_p (inserted_exprs, SSA_NAME_VERSION (res)))
- pre_stats.phis--;
- else
- pre_stats.eliminations++;
- }
- }
+ el_to_remove = NULL;
+ el_to_update = NULL;
+ el_todo = 0;
+ el_avail = NULL;
+ el_avail_stack = NULL;
+
+ walk_data.dom_direction = CDI_DOMINATORS;
+ walk_data.initialize_block_local_data = NULL;
+ walk_data.before_dom_children = eliminate_bb;
+ walk_data.after_dom_children = eliminate_leave_block;
+ walk_data.global_data = NULL;
+ walk_data.block_local_data_size = 0;
+ init_walk_dominator_tree (&walk_data);
+ walk_dominator_tree (&walk_data, ENTRY_BLOCK_PTR);
+ fini_walk_dominator_tree (&walk_data);
+
+ VEC_free (tree, heap, el_avail);
+ VEC_free (tree, heap, el_avail_stack);
/* We cannot remove stmts during BB walk, especially not release SSA
names there as this confuses the VN machinery. The stmts ending
- up in to_remove are either stores or simple copies. */
- FOR_EACH_VEC_ELT (gimple, to_remove, i, stmt)
+ up in el_to_remove are either stores or simple copies. */
+ FOR_EACH_VEC_ELT (gimple, el_to_remove, i, stmt)
{
tree lhs = gimple_assign_lhs (stmt);
tree rhs = gimple_assign_rhs1 (stmt);
@@ -4539,7 +4550,8 @@ eliminate (void)
{
SET_USE (use_p, rhs);
update_stmt (use_stmt);
- if (bitmap_bit_p (inserted_exprs, SSA_NAME_VERSION (lhs))
+ if (inserted_exprs
+ && bitmap_bit_p (inserted_exprs, SSA_NAME_VERSION (lhs))
&& TREE_CODE (rhs) == SSA_NAME)
gimple_set_plf (SSA_NAME_DEF_STMT (rhs), NECESSARY, true);
}
@@ -4553,21 +4565,43 @@ eliminate (void)
unlink_stmt_vdef (stmt);
if (gsi_remove (&gsi, true))
bitmap_set_bit (need_eh_cleanup, bb->index);
- if (TREE_CODE (lhs) == SSA_NAME)
+ if (inserted_exprs
+ && TREE_CODE (lhs) == SSA_NAME)
bitmap_clear_bit (inserted_exprs, SSA_NAME_VERSION (lhs));
release_defs (stmt);
}
}
- VEC_free (gimple, heap, to_remove);
+ VEC_free (gimple, heap, el_to_remove);
/* We cannot update call statements with virtual operands during
SSA walk. This might remove them which in turn makes our
VN lattice invalid. */
- FOR_EACH_VEC_ELT (gimple, to_update, i, stmt)
+ FOR_EACH_VEC_ELT (gimple, el_to_update, i, stmt)
update_stmt (stmt);
- VEC_free (gimple, heap, to_update);
+ VEC_free (gimple, heap, el_to_update);
- return todo;
+ return el_todo;
+}
+
+/* Perform CFG cleanups made necessary by elimination. */
+
+static void
+fini_eliminate (void)
+{
+ bool do_eh_cleanup = !bitmap_empty_p (need_eh_cleanup);
+ bool do_ab_cleanup = !bitmap_empty_p (need_ab_cleanup);
+
+ if (do_eh_cleanup)
+ gimple_purge_all_dead_eh_edges (need_eh_cleanup);
+
+ if (do_ab_cleanup)
+ gimple_purge_all_dead_abnormal_call_edges (need_ab_cleanup);
+
+ BITMAP_FREE (need_eh_cleanup);
+ BITMAP_FREE (need_ab_cleanup);
+
+ if (do_eh_cleanup || do_ab_cleanup)
+ cleanup_tree_cfg ();
}
/* Borrow a bit of tree-ssa-dce.c for the moment.
@@ -4767,20 +4801,18 @@ my_rev_post_order_compute (int *post_order, bool include_entry_exit)
/* Initialize data structures used by PRE. */
static void
-init_pre (bool do_fre)
+init_pre (void)
{
basic_block bb;
next_expression_id = 1;
expressions = NULL;
- VEC_safe_push (pre_expr, heap, expressions, (pre_expr)NULL);
+ VEC_safe_push (pre_expr, heap, expressions, NULL);
value_expressions = VEC_alloc (bitmap, heap, get_max_value_id () + 1);
VEC_safe_grow_cleared (bitmap, heap, value_expressions,
get_max_value_id() + 1);
name_to_id = NULL;
- in_fre = do_fre;
-
inserted_exprs = BITMAP_ALLOC (NULL);
connect_infinite_loops_to_exit ();
@@ -4804,28 +4836,19 @@ init_pre (bool do_fre)
sizeof (struct pre_expr_d), 30);
FOR_ALL_BB (bb)
{
- if (!do_fre)
- {
- EXP_GEN (bb) = bitmap_set_new ();
- PHI_GEN (bb) = bitmap_set_new ();
- TMP_GEN (bb) = bitmap_set_new ();
- }
+ EXP_GEN (bb) = bitmap_set_new ();
+ PHI_GEN (bb) = bitmap_set_new ();
+ TMP_GEN (bb) = bitmap_set_new ();
AVAIL_OUT (bb) = bitmap_set_new ();
}
-
- need_eh_cleanup = BITMAP_ALLOC (NULL);
- need_ab_cleanup = BITMAP_ALLOC (NULL);
}
/* Deallocate data structures used by PRE. */
static void
-fini_pre (bool do_fre)
+fini_pre ()
{
- bool do_eh_cleanup = !bitmap_empty_p (need_eh_cleanup);
- bool do_ab_cleanup = !bitmap_empty_p (need_ab_cleanup);
-
free (postorder);
VEC_free (bitmap, heap, value_expressions);
BITMAP_FREE (inserted_exprs);
@@ -4839,28 +4862,12 @@ fini_pre (bool do_fre)
free_aux_for_blocks ();
free_dominance_info (CDI_POST_DOMINATORS);
-
- if (do_eh_cleanup)
- gimple_purge_all_dead_eh_edges (need_eh_cleanup);
-
- if (do_ab_cleanup)
- gimple_purge_all_dead_abnormal_call_edges (need_ab_cleanup);
-
- BITMAP_FREE (need_eh_cleanup);
- BITMAP_FREE (need_ab_cleanup);
-
- if (do_eh_cleanup || do_ab_cleanup)
- cleanup_tree_cfg ();
-
- if (!do_fre)
- loop_optimizer_finalize ();
}
-/* Main entry point to the SSA-PRE pass. DO_FRE is true if the caller
- only wants to do full redundancy elimination. */
+/* Gate and execute functions for PRE. */
static unsigned int
-execute_pre (bool do_fre)
+do_pre (void)
{
unsigned int todo = 0;
@@ -4869,18 +4876,15 @@ execute_pre (bool do_fre)
/* This has to happen before SCCVN runs because
loop_optimizer_init may create new phis, etc. */
- if (!do_fre)
- loop_optimizer_init (LOOPS_NORMAL);
+ loop_optimizer_init (LOOPS_NORMAL);
- if (!run_scc_vn (do_fre ? VN_WALKREWRITE : VN_WALK))
+ if (!run_scc_vn (VN_WALK))
{
- if (!do_fre)
- loop_optimizer_finalize ();
-
+ loop_optimizer_finalize ();
return 0;
}
- init_pre (do_fre);
+ init_pre ();
scev_initialize ();
/* Collect and value number expressions computed in each basic block. */
@@ -4889,13 +4893,16 @@ execute_pre (bool do_fre)
if (dump_file && (dump_flags & TDF_DETAILS))
{
basic_block bb;
-
FOR_ALL_BB (bb)
{
- print_bitmap_set (dump_file, EXP_GEN (bb), "exp_gen", bb->index);
- print_bitmap_set (dump_file, PHI_GEN (bb), "phi_gen", bb->index);
- print_bitmap_set (dump_file, TMP_GEN (bb), "tmp_gen", bb->index);
- print_bitmap_set (dump_file, AVAIL_OUT (bb), "avail_out", bb->index);
+ print_bitmap_set (dump_file, EXP_GEN (bb),
+ "exp_gen", bb->index);
+ print_bitmap_set (dump_file, PHI_GEN (bb),
+ "phi_gen", bb->index);
+ print_bitmap_set (dump_file, TMP_GEN (bb),
+ "tmp_gen", bb->index);
+ print_bitmap_set (dump_file, AVAIL_OUT (bb),
+ "avail_out", bb->index);
}
}
@@ -4904,7 +4911,7 @@ execute_pre (bool do_fre)
fixed, don't run it when he have an incredibly large number of
bb's. If we aren't going to run insert, there is no point in
computing ANTIC, either, even though it's plenty fast. */
- if (!do_fre && n_basic_blocks < 4000)
+ if (n_basic_blocks < 4000)
{
compute_antic ();
insert ();
@@ -4926,37 +4933,28 @@ execute_pre (bool do_fre)
statistics_counter_event (cfun, "Constified", pre_stats.constified);
clear_expression_ids ();
- if (!do_fre)
- {
- remove_dead_inserted_code ();
- todo |= TODO_verify_flow;
- }
+ remove_dead_inserted_code ();
+ todo |= TODO_verify_flow;
scev_finalize ();
- fini_pre (do_fre);
-
- if (!do_fre)
- /* TODO: tail_merge_optimize may merge all predecessors of a block, in which
- case we can merge the block with the remaining predecessor of the block.
- It should either:
- - call merge_blocks after each tail merge iteration
- - call merge_blocks after all tail merge iterations
- - mark TODO_cleanup_cfg when necessary
- - share the cfg cleanup with fini_pre. */
- todo |= tail_merge_optimize (todo);
+ fini_pre ();
+ fini_eliminate ();
+ loop_optimizer_finalize ();
+
+ /* TODO: tail_merge_optimize may merge all predecessors of a block, in which
+ case we can merge the block with the remaining predecessor of the block.
+ It should either:
+ - call merge_blocks after each tail merge iteration
+ - call merge_blocks after all tail merge iterations
+ - mark TODO_cleanup_cfg when necessary
+ - share the cfg cleanup with fini_pre. */
+ todo |= tail_merge_optimize (todo);
+
free_scc_vn ();
return todo;
}
-/* Gate and execute functions for PRE. */
-
-static unsigned int
-do_pre (void)
-{
- return execute_pre (false);
-}
-
static bool
gate_pre (void)
{
@@ -4990,7 +4988,25 @@ struct gimple_opt_pass pass_pre =
static unsigned int
execute_fre (void)
{
- return execute_pre (true);
+ unsigned int todo = 0;
+
+ if (!run_scc_vn (VN_WALKREWRITE))
+ return 0;
+
+ memset (&pre_stats, 0, sizeof (pre_stats));
+
+ /* Remove all the redundant expressions. */
+ todo |= eliminate ();
+
+ fini_eliminate ();
+
+ free_scc_vn ();
+
+ statistics_counter_event (cfun, "Insertions", pre_stats.insertions);
+ statistics_counter_event (cfun, "Eliminated", pre_stats.eliminations);
+ statistics_counter_event (cfun, "Constified", pre_stats.constified);
+
+ return todo;
}
static bool
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
index 2b1298d1402..960e2c3c389 100644
--- a/gcc/tree-ssa-reassoc.c
+++ b/gcc/tree-ssa-reassoc.c
@@ -1344,7 +1344,7 @@ undistribute_ops_list (enum tree_code opcode,
c.cnt = 1;
c.id = next_oecount_id++;
c.op = oe1->op;
- VEC_safe_push (oecount, heap, cvec, &c);
+ VEC_safe_push (oecount, heap, cvec, c);
idx = VEC_length (oecount, cvec) + 41;
slot = htab_find_slot (ctable, (void *)idx, INSERT);
if (!*slot)
@@ -3118,7 +3118,7 @@ attempt_builtin_powi (gimple stmt, VEC(operand_entry_t, heap) **ops)
rfnew.rank = oe->rank;
rfnew.count = oe->count;
rfnew.repr = NULL_TREE;
- VEC_safe_push (repeat_factor, heap, repeat_factor_vec, &rfnew);
+ VEC_safe_push (repeat_factor, heap, repeat_factor_vec, rfnew);
}
}
}
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 5cc88ae2242..2e5ed741a02 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -287,6 +287,63 @@ vn_get_expr_for (tree name)
return expr;
}
+/* Return the vn_kind the expression computed by the stmt should be
+ associated with. */
+
+enum vn_kind
+vn_get_stmt_kind (gimple stmt)
+{
+ switch (gimple_code (stmt))
+ {
+ case GIMPLE_CALL:
+ return VN_REFERENCE;
+ case GIMPLE_PHI:
+ return VN_PHI;
+ case GIMPLE_ASSIGN:
+ {
+ enum tree_code code = gimple_assign_rhs_code (stmt);
+ tree rhs1 = gimple_assign_rhs1 (stmt);
+ switch (get_gimple_rhs_class (code))
+ {
+ case GIMPLE_UNARY_RHS:
+ case GIMPLE_BINARY_RHS:
+ case GIMPLE_TERNARY_RHS:
+ return VN_NARY;
+ case GIMPLE_SINGLE_RHS:
+ switch (TREE_CODE_CLASS (code))
+ {
+ case tcc_reference:
+ /* VOP-less references can go through unary case. */
+ if ((code == REALPART_EXPR
+ || code == IMAGPART_EXPR
+ || code == VIEW_CONVERT_EXPR
+ || code == BIT_FIELD_REF)
+ && TREE_CODE (TREE_OPERAND (rhs1, 0)) == SSA_NAME)
+ return VN_NARY;
+
+ /* Fallthrough. */
+ case tcc_declaration:
+ return VN_REFERENCE;
+
+ case tcc_constant:
+ return VN_CONSTANT;
+
+ default:
+ if (code == ADDR_EXPR)
+ return (is_gimple_min_invariant (rhs1)
+ ? VN_CONSTANT : VN_REFERENCE);
+ else if (code == CONSTRUCTOR)
+ return VN_NARY;
+ return VN_NONE;
+ }
+ default:
+ return VN_NONE;
+ }
+ }
+ default:
+ return VN_NONE;
+ }
+}
/* Free a phi operation structure VP. */
@@ -591,21 +648,21 @@ copy_reference_ops_from_ref (tree ref, VEC(vn_reference_op_s, heap) **result)
temp.op1 = TMR_STEP (ref);
temp.op2 = TMR_OFFSET (ref);
temp.off = -1;
- VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
+ VEC_safe_push (vn_reference_op_s, heap, *result, temp);
memset (&temp, 0, sizeof (temp));
temp.type = NULL_TREE;
temp.opcode = ERROR_MARK;
temp.op0 = TMR_INDEX2 (ref);
temp.off = -1;
- VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
+ VEC_safe_push (vn_reference_op_s, heap, *result, temp);
memset (&temp, 0, sizeof (temp));
temp.type = NULL_TREE;
temp.opcode = TREE_CODE (TMR_BASE (ref));
temp.op0 = TMR_BASE (ref);
temp.off = -1;
- VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
+ VEC_safe_push (vn_reference_op_s, heap, *result, temp);
return;
}
@@ -700,7 +757,7 @@ copy_reference_ops_from_ref (tree ref, VEC(vn_reference_op_s, heap) **result)
temp.opcode = MEM_REF;
temp.op0 = build_int_cst (build_pointer_type (TREE_TYPE (ref)), 0);
temp.off = 0;
- VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
+ VEC_safe_push (vn_reference_op_s, heap, *result, temp);
temp.opcode = ADDR_EXPR;
temp.op0 = build_fold_addr_expr (ref);
temp.type = TREE_TYPE (temp.op0);
@@ -739,7 +796,7 @@ copy_reference_ops_from_ref (tree ref, VEC(vn_reference_op_s, heap) **result)
default:
gcc_unreachable ();
}
- VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
+ VEC_safe_push (vn_reference_op_s, heap, *result, temp);
if (REFERENCE_CLASS_P (ref)
|| TREE_CODE (ref) == MODIFY_EXPR
@@ -949,7 +1006,7 @@ copy_reference_ops_from_call (gimple call,
temp.type = TREE_TYPE (lhs);
temp.op0 = lhs;
temp.off = -1;
- VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
+ VEC_safe_push (vn_reference_op_s, heap, *result, temp);
}
/* Copy the type, opcode, function being called and static chain. */
@@ -959,7 +1016,7 @@ copy_reference_ops_from_call (gimple call,
temp.op0 = gimple_call_fn (call);
temp.op1 = gimple_call_chain (call);
temp.off = -1;
- VEC_safe_push (vn_reference_op_s, heap, *result, &temp);
+ VEC_safe_push (vn_reference_op_s, heap, *result, temp);
/* Copy the call arguments. As they can be references as well,
just chain them together. */
@@ -3364,44 +3421,13 @@ visit_use (tree use)
}
else
{
- switch (get_gimple_rhs_class (code))
+ switch (vn_get_stmt_kind (stmt))
{
- case GIMPLE_UNARY_RHS:
- case GIMPLE_BINARY_RHS:
- case GIMPLE_TERNARY_RHS:
+ case VN_NARY:
changed = visit_nary_op (lhs, stmt);
break;
- case GIMPLE_SINGLE_RHS:
- switch (TREE_CODE_CLASS (code))
- {
- case tcc_reference:
- /* VOP-less references can go through unary case. */
- if ((code == REALPART_EXPR
- || code == IMAGPART_EXPR
- || code == VIEW_CONVERT_EXPR
- || code == BIT_FIELD_REF)
- && TREE_CODE (TREE_OPERAND (rhs1, 0)) == SSA_NAME)
- {
- changed = visit_nary_op (lhs, stmt);
- break;
- }
- /* Fallthrough. */
- case tcc_declaration:
- changed = visit_reference_op_load (lhs, rhs1, stmt);
- break;
- default:
- if (code == ADDR_EXPR)
- {
- changed = visit_nary_op (lhs, stmt);
- break;
- }
- else if (code == CONSTRUCTOR)
- {
- changed = visit_nary_op (lhs, stmt);
- break;
- }
- changed = defs_to_varying (stmt);
- }
+ case VN_REFERENCE:
+ changed = visit_reference_op_load (lhs, rhs1, stmt);
break;
default:
changed = defs_to_varying (stmt);
@@ -3766,7 +3792,7 @@ start_over:
{
/* Recurse by pushing the current use walking state on
the stack and starting over. */
- VEC_safe_push(ssa_op_iter, heap, itervec, &iter);
+ VEC_safe_push(ssa_op_iter, heap, itervec, iter);
VEC_safe_push(tree, heap, namevec, name);
name = use;
goto start_over;
diff --git a/gcc/tree-ssa-sccvn.h b/gcc/tree-ssa-sccvn.h
index 6109463ffa9..956bde22da1 100644
--- a/gcc/tree-ssa-sccvn.h
+++ b/gcc/tree-ssa-sccvn.h
@@ -121,6 +121,9 @@ typedef struct vn_constant_s
tree constant;
} *vn_constant_t;
+enum vn_kind { VN_NONE, VN_CONSTANT, VN_NARY, VN_REFERENCE, VN_PHI };
+enum vn_kind vn_get_stmt_kind (gimple);
+
/* Hash the constant CONSTANT with distinguishing type incompatible
constants in the types_compatible_p sense. */
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 4969edc4b5b..688b0688b82 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -826,7 +826,7 @@ constraint_expr_less (struct constraint_expr a, struct constraint_expr b)
arbitrary, but consistent, in order to give them an ordering. */
static bool
-constraint_less (const constraint_t a, const constraint_t b)
+constraint_less (const constraint_t &a, const constraint_t &b)
{
if (constraint_expr_less (a->lhs, b->lhs))
return true;
@@ -2793,12 +2793,12 @@ get_constraint_for_ssa_var (tree t, VEC(ce_s, heap) **results, bool address_p)
for (; vi; vi = vi->next)
{
cexpr.var = vi->id;
- VEC_safe_push (ce_s, heap, *results, &cexpr);
+ VEC_safe_push (ce_s, heap, *results, cexpr);
}
return;
}
- VEC_safe_push (ce_s, heap, *results, &cexpr);
+ VEC_safe_push (ce_s, heap, *results, cexpr);
}
/* Process constraint T, performing various simplifications and then
@@ -2945,7 +2945,7 @@ get_constraint_for_ptr_offset (tree ptr, tree offset,
c2.type = ADDRESSOF;
c2.offset = 0;
if (c2.var != c.var)
- VEC_safe_push (ce_s, heap, *results, &c2);
+ VEC_safe_push (ce_s, heap, *results, c2);
temp = temp->next;
}
while (temp);
@@ -2980,7 +2980,7 @@ get_constraint_for_ptr_offset (tree ptr, tree offset,
c2.var = temp->next->id;
c2.type = ADDRESSOF;
c2.offset = 0;
- VEC_safe_push (ce_s, heap, *results, &c2);
+ VEC_safe_push (ce_s, heap, *results, c2);
}
c.var = temp->id;
c.offset = 0;
@@ -3024,7 +3024,7 @@ get_constraint_for_component_ref (tree t, VEC(ce_s, heap) **results,
temp.offset = 0;
temp.var = integer_id;
temp.type = SCALAR;
- VEC_safe_push (ce_s, heap, *results, &temp);
+ VEC_safe_push (ce_s, heap, *results, temp);
return;
}
@@ -3046,7 +3046,7 @@ get_constraint_for_component_ref (tree t, VEC(ce_s, heap) **results,
temp.offset = 0;
temp.var = anything_id;
temp.type = ADDRESSOF;
- VEC_safe_push (ce_s, heap, *results, &temp);
+ VEC_safe_push (ce_s, heap, *results, temp);
return;
}
}
@@ -3087,7 +3087,7 @@ get_constraint_for_component_ref (tree t, VEC(ce_s, heap) **results,
bitpos, bitmaxsize))
{
cexpr.var = curr->id;
- VEC_safe_push (ce_s, heap, *results, &cexpr);
+ VEC_safe_push (ce_s, heap, *results, cexpr);
if (address_p)
break;
}
@@ -3102,7 +3102,7 @@ get_constraint_for_component_ref (tree t, VEC(ce_s, heap) **results,
while (curr->next != NULL)
curr = curr->next;
cexpr.var = curr->id;
- VEC_safe_push (ce_s, heap, *results, &cexpr);
+ VEC_safe_push (ce_s, heap, *results, cexpr);
}
else if (VEC_length (ce_s, *results) == 0)
/* Assert that we found *some* field there. The user couldn't be
@@ -3115,7 +3115,7 @@ get_constraint_for_component_ref (tree t, VEC(ce_s, heap) **results,
cexpr.type = SCALAR;
cexpr.var = anything_id;
cexpr.offset = 0;
- VEC_safe_push (ce_s, heap, *results, &cexpr);
+ VEC_safe_push (ce_s, heap, *results, cexpr);
}
}
else if (bitmaxsize == 0)
@@ -3239,7 +3239,7 @@ get_constraint_for_1 (tree t, VEC (ce_s, heap) **results, bool address_p,
temp.var = nonlocal_id;
temp.type = ADDRESSOF;
temp.offset = 0;
- VEC_safe_push (ce_s, heap, *results, &temp);
+ VEC_safe_push (ce_s, heap, *results, temp);
return;
}
@@ -3249,7 +3249,7 @@ get_constraint_for_1 (tree t, VEC (ce_s, heap) **results, bool address_p,
temp.var = readonly_id;
temp.type = SCALAR;
temp.offset = 0;
- VEC_safe_push (ce_s, heap, *results, &temp);
+ VEC_safe_push (ce_s, heap, *results, temp);
return;
}
@@ -3310,7 +3310,7 @@ get_constraint_for_1 (tree t, VEC (ce_s, heap) **results, bool address_p,
if (curr->offset - vi->offset < size)
{
cs.var = curr->id;
- VEC_safe_push (ce_s, heap, *results, &cs);
+ VEC_safe_push (ce_s, heap, *results, cs);
}
else
break;
@@ -3352,7 +3352,7 @@ get_constraint_for_1 (tree t, VEC (ce_s, heap) **results, bool address_p,
unsigned j;
get_constraint_for_1 (val, &tmp, address_p, lhs_p);
FOR_EACH_VEC_ELT (ce_s, tmp, j, rhsp)
- VEC_safe_push (ce_s, heap, *results, rhsp);
+ VEC_safe_push (ce_s, heap, *results, *rhsp);
VEC_truncate (ce_s, tmp, 0);
}
VEC_free (ce_s, heap, tmp);
@@ -3376,7 +3376,7 @@ get_constraint_for_1 (tree t, VEC (ce_s, heap) **results, bool address_p,
temp.type = ADDRESSOF;
temp.var = nonlocal_id;
temp.offset = 0;
- VEC_safe_push (ce_s, heap, *results, &temp);
+ VEC_safe_push (ce_s, heap, *results, temp);
return;
}
default:;
@@ -3386,7 +3386,7 @@ get_constraint_for_1 (tree t, VEC (ce_s, heap) **results, bool address_p,
temp.type = ADDRESSOF;
temp.var = anything_id;
temp.offset = 0;
- VEC_safe_push (ce_s, heap, *results, &temp);
+ VEC_safe_push (ce_s, heap, *results, temp);
}
/* Given a gimple tree T, return the constraint expression vector for it. */
@@ -3793,7 +3793,7 @@ handle_rhs_call (gimple stmt, VEC(ce_s, heap) **results)
rhsc.var = get_call_use_vi (stmt)->id;
rhsc.offset = 0;
rhsc.type = SCALAR;
- VEC_safe_push (ce_s, heap, *results, &rhsc);
+ VEC_safe_push (ce_s, heap, *results, rhsc);
}
/* The static chain escapes as well. */
@@ -3820,7 +3820,7 @@ handle_rhs_call (gimple stmt, VEC(ce_s, heap) **results)
rhsc.var = nonlocal_id;
rhsc.offset = 0;
rhsc.type = SCALAR;
- VEC_safe_push (ce_s, heap, *results, &rhsc);
+ VEC_safe_push (ce_s, heap, *results, rhsc);
}
/* For non-IPA mode, generate constraints necessary for a call
@@ -3845,7 +3845,7 @@ handle_lhs_call (gimple stmt, tree lhs, int flags, VEC(ce_s, heap) *rhsc,
tmpc.var = escaped_id;
tmpc.offset = 0;
tmpc.type = SCALAR;
- VEC_safe_push (ce_s, heap, lhsc, &tmpc);
+ VEC_safe_push (ce_s, heap, lhsc, tmpc);
}
/* If the call returns an argument unmodified override the rhs
@@ -3880,7 +3880,7 @@ handle_lhs_call (gimple stmt, tree lhs, int flags, VEC(ce_s, heap) *rhsc,
tmpc.var = vi->id;
tmpc.offset = 0;
tmpc.type = ADDRESSOF;
- VEC_safe_push (ce_s, heap, rhsc, &tmpc);
+ VEC_safe_push (ce_s, heap, rhsc, tmpc);
process_all_all_constraints (lhsc, rhsc);
VEC_free (ce_s, heap, rhsc);
}
@@ -3909,7 +3909,7 @@ handle_const_call (gimple stmt, VEC(ce_s, heap) **results)
rhsc.var = uses->id;
rhsc.offset = 0;
rhsc.type = SCALAR;
- VEC_safe_push (ce_s, heap, *results, &rhsc);
+ VEC_safe_push (ce_s, heap, *results, rhsc);
}
/* May return arguments. */
@@ -3921,7 +3921,7 @@ handle_const_call (gimple stmt, VEC(ce_s, heap) **results)
struct constraint_expr *argp;
get_constraint_for_rhs (arg, &argc);
FOR_EACH_VEC_ELT (ce_s, argc, i, argp)
- VEC_safe_push (ce_s, heap, *results, argp);
+ VEC_safe_push (ce_s, heap, *results, *argp);
VEC_free(ce_s, heap, argc);
}
@@ -3929,7 +3929,7 @@ handle_const_call (gimple stmt, VEC(ce_s, heap) **results)
rhsc.var = nonlocal_id;
rhsc.offset = 0;
rhsc.type = ADDRESSOF;
- VEC_safe_push (ce_s, heap, *results, &rhsc);
+ VEC_safe_push (ce_s, heap, *results, rhsc);
}
/* For non-IPA mode, generate constraints necessary for a call to a
@@ -3971,12 +3971,12 @@ handle_pure_call (gimple stmt, VEC(ce_s, heap) **results)
rhsc.var = uses->id;
rhsc.offset = 0;
rhsc.type = SCALAR;
- VEC_safe_push (ce_s, heap, *results, &rhsc);
+ VEC_safe_push (ce_s, heap, *results, rhsc);
}
rhsc.var = nonlocal_id;
rhsc.offset = 0;
rhsc.type = SCALAR;
- VEC_safe_push (ce_s, heap, *results, &rhsc);
+ VEC_safe_push (ce_s, heap, *results, rhsc);
}
@@ -4412,7 +4412,7 @@ find_func_aliases_for_call (gimple t)
&& DECL_BY_REFERENCE (DECL_RESULT (fndecl)))
{
VEC(ce_s, heap) *tem = NULL;
- VEC_safe_push (ce_s, heap, tem, &rhs);
+ VEC_safe_push (ce_s, heap, tem, rhs);
do_deref (&tem);
rhs = VEC_index (ce_s, tem, 0);
VEC_free(ce_s, heap, tem);
@@ -4549,7 +4549,7 @@ find_func_aliases (gimple origt)
get_constraint_for_rhs (gimple_assign_rhs2 (t), &rhsc);
get_constraint_for_rhs (gimple_assign_rhs3 (t), &tmp);
FOR_EACH_VEC_ELT (ce_s, tmp, i, rhsp)
- VEC_safe_push (ce_s, heap, rhsc, rhsp);
+ VEC_safe_push (ce_s, heap, rhsc, *rhsp);
VEC_free (ce_s, heap, tmp);
}
else if (truth_value_p (code))
@@ -4567,7 +4567,7 @@ find_func_aliases (gimple origt)
{
get_constraint_for_rhs (gimple_op (t, i), &tmp);
FOR_EACH_VEC_ELT (ce_s, tmp, j, rhsp)
- VEC_safe_push (ce_s, heap, rhsc, rhsp);
+ VEC_safe_push (ce_s, heap, rhsc, *rhsp);
VEC_truncate (ce_s, tmp, 0);
}
VEC_free (ce_s, heap, tmp);
@@ -5191,13 +5191,8 @@ push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack,
if (!pair
&& offset + foff != 0)
{
- pair = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL);
- pair->offset = 0;
- pair->size = offset + foff;
- pair->has_unknown_size = false;
- pair->must_have_pointers = false;
- pair->may_have_pointers = false;
- pair->only_restrict_pointers = false;
+ fieldoff_s e = {0, offset + foff, false, false, false, false};
+ pair = VEC_safe_push (fieldoff_s, heap, *fieldstack, e);
}
if (!DECL_SIZE (field)
@@ -5217,19 +5212,20 @@ push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack,
}
else
{
- pair = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL);
- pair->offset = offset + foff;
- pair->has_unknown_size = has_unknown_size;
+ fieldoff_s e;
+ e.offset = offset + foff;
+ e.has_unknown_size = has_unknown_size;
if (!has_unknown_size)
- pair->size = TREE_INT_CST_LOW (DECL_SIZE (field));
+ e.size = TREE_INT_CST_LOW (DECL_SIZE (field));
else
- pair->size = -1;
- pair->must_have_pointers = must_have_pointers_p;
- pair->may_have_pointers = true;
- pair->only_restrict_pointers
+ e.size = -1;
+ e.must_have_pointers = must_have_pointers_p;
+ e.may_have_pointers = true;
+ e.only_restrict_pointers
= (!has_unknown_size
&& POINTER_TYPE_P (TREE_TYPE (field))
&& TYPE_RESTRICT (TREE_TYPE (field)));
+ VEC_safe_push (fieldoff_s, heap, *fieldstack, e);
}
}
diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c
index 30336a18e81..ba6d69af942 100644
--- a/gcc/tree-ssa-threadupdate.c
+++ b/gcc/tree-ssa-threadupdate.c
@@ -846,8 +846,9 @@ static bool
def_split_header_continue_p (const_basic_block bb, const void *data)
{
const_basic_block new_header = (const_basic_block) data;
- return (bb->loop_father == new_header->loop_father
- && bb != new_header);
+ return (bb != new_header
+ && (loop_depth (bb->loop_father)
+ >= loop_depth (new_header->loop_father)));
}
/* Thread jumps through the header of LOOP. Returns true if cfg changes.
@@ -1031,10 +1032,11 @@ thread_through_loop_header (struct loop *loop, bool may_peel_loop_headers)
nblocks = dfs_enumerate_from (header, 0, def_split_header_continue_p,
bblocks, loop->num_nodes, tgt_bb);
for (i = 0; i < nblocks; i++)
- {
- remove_bb_from_loops (bblocks[i]);
- add_bb_to_loop (bblocks[i], loop_outer (loop));
- }
+ if (bblocks[i]->loop_father == loop)
+ {
+ remove_bb_from_loops (bblocks[i]);
+ add_bb_to_loop (bblocks[i], loop_outer (loop));
+ }
free (bblocks);
/* If the new header has multiple latches mark it so. */
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index f8eb7233035..7ba11e193d6 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -68,7 +68,7 @@ redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus)
new_node.result = result;
new_node.locus = locus;
- VEC_safe_push (edge_var_map, heap, head, &new_node);
+ VEC_safe_push (edge_var_map, heap, head, new_node);
if (old_head != head)
{
/* The push did some reallocation. Update the pointer map. */
diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c
index bb89d30fc32..bbbd3caca02 100644
--- a/gcc/tree-switch-conversion.c
+++ b/gcc/tree-switch-conversion.c
@@ -868,13 +868,11 @@ build_constructors (gimple swtch, struct switch_conv_info *info)
int k;
for (k = 0; k < info->phi_count; k++)
{
- constructor_elt *elt;
+ constructor_elt elt;
- elt = VEC_quick_push (constructor_elt,
- info->constructors[k], NULL);
- elt->index = int_const_binop (MINUS_EXPR, pos,
- info->range_min);
- elt->value = info->default_values[k];
+ elt.index = int_const_binop (MINUS_EXPR, pos, info->range_min);
+ elt.value = info->default_values[k];
+ VEC_quick_push (constructor_elt, info->constructors[k], elt);
}
pos = int_const_binop (PLUS_EXPR, pos, integer_one_node);
@@ -896,12 +894,11 @@ build_constructors (gimple swtch, struct switch_conv_info *info)
do
{
- constructor_elt *elt;
+ constructor_elt elt;
- elt = VEC_quick_push (constructor_elt,
- info->constructors[j], NULL);
- elt->index = int_const_binop (MINUS_EXPR, pos, info->range_min);
- elt->value = val;
+ elt.index = int_const_binop (MINUS_EXPR, pos, info->range_min);
+ elt.value = val;
+ VEC_quick_push (constructor_elt, info->constructors[j], elt);
pos = int_const_binop (PLUS_EXPR, pos, integer_one_node);
} while (!tree_int_cst_lt (high, pos)
diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c
index 5b583124cab..b217b1123e9 100644
--- a/gcc/tree-vect-generic.c
+++ b/gcc/tree-vect-generic.c
@@ -252,9 +252,8 @@ expand_vector_piecewise (gimple_stmt_iterator *gsi, elem_op_func f,
i += delta, index = int_const_binop (PLUS_EXPR, index, part_width))
{
tree result = f (gsi, inner_type, a, b, index, part_width, code);
- constructor_elt *ce = VEC_quick_push (constructor_elt, v, NULL);
- ce->index = NULL_TREE;
- ce->value = result;
+ constructor_elt ce = {NULL_TREE, result};
+ VEC_quick_push (constructor_elt, v, ce);
}
return build_constructor (type, v);
diff --git a/gcc/tree-vect-loop-manip.c b/gcc/tree-vect-loop-manip.c
index fb354ae28d1..508dff0f714 100644
--- a/gcc/tree-vect-loop-manip.c
+++ b/gcc/tree-vect-loop-manip.c
@@ -214,7 +214,7 @@ adjust_debug_stmts (tree from, tree to, basic_block bb)
ai.bb = bb;
if (adjust_vec)
- VEC_safe_push (adjust_info, stack, adjust_vec, &ai);
+ VEC_safe_push (adjust_info, stack, adjust_vec, ai);
else
adjust_debug_stmts_now (&ai);
}
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index b2d0a6b4042..11dbdfb5a02 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -1099,7 +1099,7 @@ vect_slp_rearrange_stmts (slp_tree node, unsigned int group_size,
tmp_stmts = VEC_alloc (gimple, heap, group_size);
for (i = 0; i < group_size; i++)
- VEC_safe_push (gimple, heap, tmp_stmts, (gimple)NULL);
+ VEC_safe_push (gimple, heap, tmp_stmts, NULL);
FOR_EACH_VEC_ELT (gimple, SLP_TREE_SCALAR_STMTS (node), i, stmt)
{
@@ -2663,7 +2663,7 @@ vect_create_mask_and_perm (gimple stmt, gimple next_scalar_stmt,
stmts later. */
for (i = VEC_length (gimple, SLP_TREE_VEC_STMTS (node));
i < (int) SLP_TREE_NUMBER_OF_VEC_STMTS (node); i++)
- VEC_quick_push (gimple, SLP_TREE_VEC_STMTS (node), (gimple)NULL);
+ VEC_quick_push (gimple, SLP_TREE_VEC_STMTS (node), NULL);
perm_dest = vect_create_destination_var (gimple_assign_lhs (stmt), vectype);
for (i = 0; i < ncopies; i++)
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index 76418386e1a..bad0fa24191 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -94,7 +94,7 @@ add_stmt_info_to_vec (stmt_vector_for_cost *stmt_cost_vec, int count,
si.kind = kind;
si.stmt = stmt;
si.misalign = misalign;
- VEC_safe_push (stmt_info_for_cost, heap, *stmt_cost_vec, &si);
+ VEC_safe_push (stmt_info_for_cost, heap, *stmt_cost_vec, si);
}
/************************************************************************
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 47c68d8710c..34f1d1aaf66 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -2766,20 +2766,63 @@ extract_range_from_binary_expr_1 (value_range_t *vr,
else if (code == LSHIFT_EXPR
&& range_int_cst_p (&vr0))
{
- int overflow_pos = TYPE_PRECISION (expr_type);
+ int prec = TYPE_PRECISION (expr_type);
+ int overflow_pos = prec;
int bound_shift;
- double_int bound;
+ double_int bound, complement, low_bound, high_bound;
+ bool uns = TYPE_UNSIGNED (expr_type);
+ bool in_bounds = false;
- if (!TYPE_UNSIGNED (expr_type))
+ if (!uns)
overflow_pos -= 1;
bound_shift = overflow_pos - TREE_INT_CST_LOW (vr1.max);
- bound = double_int_one.llshift (bound_shift,
- TYPE_PRECISION (expr_type));
- if (tree_to_double_int (vr0.max).ult (bound))
+ /* If bound_shift == HOST_BITS_PER_DOUBLE_INT, the llshift can
+ overflow. However, for that to happen, vr1.max needs to be
+ zero, which means vr1 is a singleton range of zero, which
+ means it should be handled by the previous LSHIFT_EXPR
+ if-clause. */
+ bound = double_int_one.llshift (bound_shift, prec);
+ complement = ~(bound - double_int_one);
+
+ if (uns)
+ {
+ low_bound = bound;
+ high_bound = complement.zext (prec);
+ if (tree_to_double_int (vr0.max).ult (low_bound))
+ {
+ /* [5, 6] << [1, 2] == [10, 24]. */
+ /* We're shifting out only zeroes, the value increases
+ monotonically. */
+ in_bounds = true;
+ }
+ else if (high_bound.ult (tree_to_double_int (vr0.min)))
+ {
+ /* [0xffffff00, 0xffffffff] << [1, 2]
+ == [0xfffffc00, 0xfffffffe]. */
+ /* We're shifting out only ones, the value decreases
+ monotonically. */
+ in_bounds = true;
+ }
+ }
+ else
+ {
+ /* [-1, 1] << [1, 2] == [-4, 4]. */
+ low_bound = complement.sext (prec);
+ high_bound = bound;
+ if (tree_to_double_int (vr0.max).slt (high_bound)
+ && low_bound.slt (tree_to_double_int (vr0.min)))
+ {
+ /* For non-negative numbers, we're shifting out only
+ zeroes, the value increases monotonically.
+ For negative numbers, we're shifting out only ones, the
+ value decreases monotomically. */
+ in_bounds = true;
+ }
+ }
+
+ if (in_bounds)
{
- /* In the absense of overflow, (a << b) is equivalent
- to (a * 2^b). */
extract_range_from_multiplicative_op_1 (vr, code, &vr0, &vr1);
return;
}
@@ -4384,24 +4427,7 @@ register_new_assert_for (tree name, tree expr,
&& (loc->expr == expr
|| operand_equal_p (loc->expr, expr, 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
+ /* 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. */
@@ -5439,7 +5465,6 @@ find_assert_locations_1 (basic_block bb, sbitmap live)
{
gimple_stmt_iterator si;
gimple last;
- gimple phi;
bool need_assert;
need_assert = false;
@@ -5462,7 +5487,7 @@ find_assert_locations_1 (basic_block bb, sbitmap live)
/* Traverse all the statements in BB marking used names and looking
for statements that may infer assertions for their used operands. */
- for (si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si))
+ for (si = gsi_last_bb (bb); !gsi_end_p (si); gsi_prev (&si))
{
gimple stmt;
tree op;
@@ -5479,8 +5504,10 @@ find_assert_locations_1 (basic_block bb, sbitmap live)
tree value;
enum tree_code comp_code;
- /* Mark OP in our live bitmap. */
- SET_BIT (live, SSA_NAME_VERSION (op));
+ /* If op is not live beyond this stmt, do not bother to insert
+ asserts for it. */
+ if (!TEST_BIT (live, SSA_NAME_VERSION (op)))
+ continue;
/* 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
@@ -5520,25 +5547,28 @@ find_assert_locations_1 (basic_block bb, sbitmap live)
}
}
- /* If OP is used only once, namely in this STMT, don't
- bother creating an ASSERT_EXPR for it. Such an
- ASSERT_EXPR would do nothing but increase compile time. */
- if (!has_single_use (op))
- {
- register_new_assert_for (op, op, comp_code, value,
- bb, NULL, si);
- need_assert = true;
- }
+ register_new_assert_for (op, op, comp_code, value, bb, NULL, si);
+ need_assert = true;
}
}
+
+ /* Update live. */
+ FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_USE)
+ SET_BIT (live, SSA_NAME_VERSION (op));
+ FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF)
+ RESET_BIT (live, SSA_NAME_VERSION (op));
}
- /* Traverse all PHI nodes in BB marking used operands. */
+ /* Traverse all PHI nodes in BB, updating live. */
for (si = gsi_start_phis (bb); !gsi_end_p(si); gsi_next (&si))
{
use_operand_p arg_p;
ssa_op_iter i;
- phi = gsi_stmt (si);
+ gimple phi = gsi_stmt (si);
+ tree res = gimple_phi_result (phi);
+
+ if (virtual_operand_p (res))
+ continue;
FOR_EACH_PHI_ARG (arg_p, phi, i, SSA_OP_USE)
{
@@ -5546,6 +5576,8 @@ find_assert_locations_1 (basic_block bb, sbitmap live)
if (TREE_CODE (arg) == SSA_NAME)
SET_BIT (live, SSA_NAME_VERSION (arg));
}
+
+ RESET_BIT (live, SSA_NAME_VERSION (res));
}
return need_assert;
@@ -8493,7 +8525,7 @@ simplify_switch_using_ranges (gimple stmt)
/* And queue an update for the stmt. */
su.stmt = stmt;
su.vec = vec2;
- VEC_safe_push (switch_update, heap, to_update_switch_stmts, &su);
+ VEC_safe_push (switch_update, heap, to_update_switch_stmts, su);
return false;
}
diff --git a/gcc/tree.c b/gcc/tree.c
index 469f47356c8..a7492de8a92 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -1443,12 +1443,10 @@ tree
build_constructor_single (tree type, tree index, tree value)
{
VEC(constructor_elt,gc) *v;
- constructor_elt *elt;
+ constructor_elt elt = {index, value};
v = VEC_alloc (constructor_elt, gc, 1);
- elt = VEC_quick_push (constructor_elt, v, NULL);
- elt->index = index;
- elt->value = value;
+ VEC_quick_push (constructor_elt, v, elt);
return build_constructor (type, v);
}
diff --git a/gcc/tree.h b/gcc/tree.h
index d81aa3c423c..f9c9a7f884e 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -1546,9 +1546,8 @@ struct GTY(()) tree_vec {
/* Append a new constructor element to V, with the specified INDEX and VAL. */
#define CONSTRUCTOR_APPEND_ELT(V, INDEX, VALUE) \
do { \
- constructor_elt *_ce___ = VEC_safe_push (constructor_elt, gc, V, NULL); \
- _ce___->index = INDEX; \
- _ce___->value = VALUE; \
+ constructor_elt _ce___ = {INDEX, VALUE}; \
+ VEC_safe_push (constructor_elt, gc, V, _ce___); \
} while (0)
/* True if NODE, a FIELD_DECL, is to be processed as a bitfield for
@@ -6118,7 +6117,6 @@ extern bool parse_input_constraint (const char **, int, int, int, int,
const char * const *, bool *, bool *);
extern void expand_asm_stmt (gimple);
extern tree resolve_asm_operand_names (tree, tree, tree, tree);
-extern void expand_case (gimple);
#ifdef HARD_CONST
/* Silly ifdef to avoid having all includers depend on hard-reg-set.h. */
extern tree tree_overlaps_hard_reg_set (tree, HARD_REG_SET *);
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index 818fb2456b5..9f5bc126114 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -5510,7 +5510,7 @@ add_uses (rtx *ploc, void *data)
if (dump_file && (dump_flags & TDF_DETAILS))
log_op_type (mo.u.loc, cui->bb, cui->insn, mo.type, dump_file);
- VEC_safe_push (micro_operation, heap, VTI (bb)->mos, &mo);
+ VEC_safe_push (micro_operation, heap, VTI (bb)->mos, mo);
}
return 0;
@@ -5794,7 +5794,7 @@ add_stores (rtx loc, const_rtx expr, void *cuip)
if (dump_file && (dump_flags & TDF_DETAILS))
log_op_type (moa.u.loc, cui->bb, cui->insn,
moa.type, dump_file);
- VEC_safe_push (micro_operation, heap, VTI (bb)->mos, &moa);
+ VEC_safe_push (micro_operation, heap, VTI (bb)->mos, moa);
}
resolve = false;
@@ -5881,7 +5881,7 @@ add_stores (rtx loc, const_rtx expr, void *cuip)
log_and_return:
if (dump_file && (dump_flags & TDF_DETAILS))
log_op_type (mo.u.loc, cui->bb, cui->insn, mo.type, dump_file);
- VEC_safe_push (micro_operation, heap, VTI (bb)->mos, &mo);
+ VEC_safe_push (micro_operation, heap, VTI (bb)->mos, mo);
}
/* Arguments to the call. */
@@ -6300,7 +6300,7 @@ add_with_sets (rtx insn, struct cselib_set *sets, int n_sets)
if (dump_file && (dump_flags & TDF_DETAILS))
log_op_type (PATTERN (insn), bb, insn, mo.type, dump_file);
- VEC_safe_push (micro_operation, heap, VTI (bb)->mos, &mo);
+ VEC_safe_push (micro_operation, heap, VTI (bb)->mos, mo);
}
n1 = VEC_length (micro_operation, VTI (bb)->mos);
@@ -7864,7 +7864,9 @@ loc_exp_insert_dep (variable var, rtx x, htab_t vars)
led = (loc_exp_dep *) pool_alloc (loc_exp_dep_pool);
else
{
- VEC_quick_push (loc_exp_dep, VAR_LOC_DEP_VEC (var), NULL);
+ loc_exp_dep empty;
+ memset (&empty, 0, sizeof (empty));
+ VEC_quick_push (loc_exp_dep, VAR_LOC_DEP_VEC (var), empty);
led = &VEC_last (loc_exp_dep, VAR_LOC_DEP_VEC (var));
}
led->dv = var->dv;
@@ -9354,13 +9356,13 @@ vt_add_function_parameter (tree parm)
&& HARD_REGISTER_P (incoming)
&& OUTGOING_REGNO (REGNO (incoming)) != REGNO (incoming))
{
- parm_reg_t *p
- = VEC_safe_push (parm_reg_t, gc, windowed_parm_regs, NULL);
- p->incoming = incoming;
+ parm_reg_t p;
+ p.incoming = incoming;
incoming
= gen_rtx_REG_offset (incoming, GET_MODE (incoming),
OUTGOING_REGNO (REGNO (incoming)), 0);
- p->outgoing = incoming;
+ p.outgoing = incoming;
+ VEC_safe_push (parm_reg_t, gc, windowed_parm_regs, p);
}
else if (MEM_P (incoming)
&& REG_P (XEXP (incoming, 0))
@@ -9369,11 +9371,11 @@ vt_add_function_parameter (tree parm)
rtx reg = XEXP (incoming, 0);
if (OUTGOING_REGNO (REGNO (reg)) != REGNO (reg))
{
- parm_reg_t *p
- = VEC_safe_push (parm_reg_t, gc, windowed_parm_regs, NULL);
- p->incoming = reg;
+ parm_reg_t p;
+ p.incoming = reg;
reg = gen_raw_REG (GET_MODE (reg), OUTGOING_REGNO (REGNO (reg)));
- p->outgoing = reg;
+ p.outgoing = reg;
+ VEC_safe_push (parm_reg_t, gc, windowed_parm_regs, p);
incoming = replace_equiv_address_nv (incoming, reg);
}
}
@@ -9815,7 +9817,7 @@ vt_initialize (void)
log_op_type (PATTERN (insn), bb, insn,
MO_ADJUST, dump_file);
VEC_safe_push (micro_operation, heap, VTI (bb)->mos,
- &mo);
+ mo);
VTI (bb)->out.stack_adjust += pre;
}
}
@@ -9847,7 +9849,7 @@ vt_initialize (void)
log_op_type (PATTERN (insn), bb, insn,
MO_ADJUST, dump_file);
VEC_safe_push (micro_operation, heap, VTI (bb)->mos,
- &mo);
+ mo);
VTI (bb)->out.stack_adjust += post;
}
diff --git a/gcc/varasm.c b/gcc/varasm.c
index d476b8ad7cd..a587c80fd34 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -2999,9 +2999,8 @@ copy_constant (tree exp)
CONSTRUCTOR_ELTS (exp)));
FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, purpose, value)
{
- constructor_elt *ce = VEC_quick_push (constructor_elt, v, NULL);
- ce->index = purpose;
- ce->value = copy_constant (value);
+ constructor_elt ce = {purpose, copy_constant (value)};
+ VEC_quick_push (constructor_elt, v, ce);
}
CONSTRUCTOR_ELTS (copy) = v;
return copy;
@@ -5563,9 +5562,8 @@ assemble_alias (tree decl, tree target)
do_assemble_alias (decl, target);
else
{
- alias_pair *p = VEC_safe_push (alias_pair, gc, alias_pairs, NULL);
- p->decl = decl;
- p->target = target;
+ alias_pair p = {decl, target};
+ VEC_safe_push (alias_pair, gc, alias_pairs, p);
}
}
@@ -5628,14 +5626,9 @@ static int
dump_tm_clone_to_vec (void **slot, void *info)
{
struct tree_map *map = (struct tree_map *) *slot;
- VEC(tm_alias_pair,heap) **tm_alias_pairs
- = (VEC(tm_alias_pair, heap) **) info;
- tm_alias_pair *p;
-
- p = VEC_safe_push (tm_alias_pair, heap, *tm_alias_pairs, NULL);
- p->from = map->base.from;
- p->to = map->to;
- p->uid = DECL_UID (p->from);
+ VEC(tm_alias_pair,heap) **tm_alias_pairs = (VEC(tm_alias_pair, heap) **) info;
+ tm_alias_pair p = {DECL_UID (map->base.from), map->base.from, map->to};
+ VEC_safe_push (tm_alias_pair, heap, *tm_alias_pairs, p);
return 1;
}
diff --git a/gcc/vec.h b/gcc/vec.h
index fbf95d22682..8858f6afea1 100644
--- a/gcc/vec.h
+++ b/gcc/vec.h
@@ -31,23 +31,6 @@ along with GCC; see the file COPYING3. If not see
sometimes backed by out-of-line generic functions. The vectors are
designed to interoperate with the GTY machinery.
- FIXME - Remove the following compatibility notes after a handler
- class for vec_t is implemented.
-
- To preserve compatibility with the existing API, some functions
- that manipulate vector elements implement two overloads: one taking
- a pointer to the element and others that take a pointer to a
- pointer to the element.
-
- This used to be implemented with three different families of macros
- and structures: structure objects, scalar objects and of pointers.
- Both the structure object and pointer variants passed pointers to
- objects around -- in the former case the pointers were stored into
- the vector and in the latter case the pointers were dereferenced and
- the objects copied into the vector. The scalar object variant was
- suitable for int-like objects, and the vector elements were returned
- by value.
-
There are both 'index' and 'iterate' accessors. The index accessor
is implemented by operator[]. The iterator returns a boolean
iteration condition and updates the iteration variable passed by
@@ -124,7 +107,6 @@ along with GCC; see the file COPYING3. If not see
VEC_safe_push(tree,gc,s->v,decl); // append some decl onto the end
for (ix = 0; VEC_iterate(tree,s->v,ix,elt); ix++)
{ do something with elt }
-
*/
#if ENABLE_CHECKING
@@ -178,19 +160,15 @@ struct GTY(()) vec_t
bool space (int VEC_CHECK_DECL);
void splice (vec_t<T> * VEC_CHECK_DECL);
- T &quick_push (T VEC_CHECK_DECL);
- T *quick_push (const T * VEC_CHECK_DECL);
+ T *quick_push (const T & VEC_CHECK_DECL);
T &pop (ALONE_VEC_CHECK_DECL);
void truncate (unsigned VEC_CHECK_DECL);
- void replace (unsigned, T VEC_CHECK_DECL);
- void quick_insert (unsigned, T VEC_CHECK_DECL);
- void quick_insert (unsigned, const T * VEC_CHECK_DECL);
+ void replace (unsigned, const T & VEC_CHECK_DECL);
+ void quick_insert (unsigned, const T & VEC_CHECK_DECL);
void ordered_remove (unsigned VEC_CHECK_DECL);
void unordered_remove (unsigned VEC_CHECK_DECL);
void block_remove (unsigned, unsigned VEC_CHECK_DECL);
-
- unsigned lower_bound (T, bool (*)(T, T)) const;
- unsigned lower_bound (const T *, bool (*)(const T *, const T *)) const;
+ unsigned lower_bound (T, bool (*)(const T &, const T &)) const;
/* Class-static member functions. Some of these will become member
functions of a future handler class wrapping vec_t. */
@@ -221,10 +199,7 @@ struct GTY(()) vec_t
MEM_STAT_DECL);
template<enum vec_allocation_t A>
- static T &safe_push (vec_t<T> **, T VEC_CHECK_DECL MEM_STAT_DECL);
-
- template<enum vec_allocation_t A>
- static T *safe_push (vec_t<T> **, const T * VEC_CHECK_DECL MEM_STAT_DECL);
+ static T *safe_push (vec_t<T> **, const T & VEC_CHECK_DECL MEM_STAT_DECL);
template<enum vec_allocation_t A>
static void safe_grow (vec_t<T> **, int VEC_CHECK_DECL MEM_STAT_DECL);
@@ -233,11 +208,7 @@ struct GTY(()) vec_t
static void safe_grow_cleared (vec_t<T> **, int VEC_CHECK_DECL MEM_STAT_DECL);
template<enum vec_allocation_t A>
- static void safe_insert (vec_t<T> **, unsigned, T * VEC_CHECK_DECL
- MEM_STAT_DECL);
-
- template<enum vec_allocation_t A>
- static void safe_insert (vec_t<T> **, unsigned, T obj VEC_CHECK_DECL
+ static void safe_insert (vec_t<T> **, unsigned, const T & VEC_CHECK_DECL
MEM_STAT_DECL);
static bool iterate (const vec_t<T> *, unsigned, T *);
@@ -802,63 +773,32 @@ vec_t<T>::safe_splice (vec_t<T> **dst, vec_t<T> *src VEC_CHECK_DECL
}
-/* Push OBJ (a new element) onto the end, returns a reference to the slot
- filled in. There must be sufficient space in the vector. */
+/* Push OBJ (a new element) onto the end of the vector. There must be
+ sufficient space in the vector. Return a pointer to the slot
+ where OBJ was inserted. */
-template<typename T>
-T &
-vec_t<T>::quick_push (T obj VEC_CHECK_DECL)
-{
- VEC_ASSERT (prefix_.num_ < prefix_.alloc_, "push", T, base);
- vec_[prefix_.num_] = obj;
- T &val = vec_[prefix_.num_];
- prefix_.num_++;
- return val;
-}
-
-
-/* Push PTR (a new pointer to an element) onto the end, returns a
- pointer to the slot filled in. The new value can be NULL, in which
- case NO initialization is performed. There must be sufficient
- space in the vector. */
template<typename T>
T *
-vec_t<T>::quick_push (const T *ptr VEC_CHECK_DECL)
+vec_t<T>::quick_push (const T &obj VEC_CHECK_DECL)
{
VEC_ASSERT (prefix_.num_ < prefix_.alloc_, "push", T, base);
T *slot = &vec_[prefix_.num_++];
- if (ptr)
- *slot = *ptr;
+ *slot = obj;
return slot;
}
-/* Push a new element OBJ onto the end of VEC. Returns a reference to
- the slot filled in. Reallocates V, if needed. */
-
-template<typename T>
-template<enum vec_allocation_t A>
-T &
-vec_t<T>::safe_push (vec_t<T> **vec, T obj VEC_CHECK_DECL MEM_STAT_DECL)
-{
- reserve<A> (vec, 1 VEC_CHECK_PASS PASS_MEM_STAT);
- return (*vec)->quick_push (obj VEC_CHECK_PASS);
-}
-
-
-/* Push a pointer PTR to a new element onto the end of VEC. Returns a
- pointer to the slot filled in. For object vectors, the new value
- can be NULL, in which case NO initialization is performed.
- Reallocates VEC, if needed. */
+/* Push a new element OBJ onto the end of VEC. Reallocates VEC, if
+ needed. Return a pointer to the slot where OBJ was inserted. */
template<typename T>
template<enum vec_allocation_t A>
T *
-vec_t<T>::safe_push (vec_t<T> **vec, const T *ptr VEC_CHECK_DECL MEM_STAT_DECL)
+vec_t<T>::safe_push (vec_t<T> **vec, const T &obj VEC_CHECK_DECL MEM_STAT_DECL)
{
reserve<A> (vec, 1 VEC_CHECK_PASS PASS_MEM_STAT);
- return (*vec)->quick_push (ptr VEC_CHECK_PASS);
+ return (*vec)->quick_push (obj VEC_CHECK_PASS);
}
@@ -923,7 +863,7 @@ vec_t<T>::safe_grow_cleared (vec_t<T> **vec, int size VEC_CHECK_DECL
template<typename T>
void
-vec_t<T>::replace (unsigned ix, T obj VEC_CHECK_DECL)
+vec_t<T>::replace (unsigned ix, const T &obj VEC_CHECK_DECL)
{
VEC_ASSERT (ix < prefix_.num_, "replace", T, base);
vec_[ix] = obj;
@@ -935,7 +875,7 @@ vec_t<T>::replace (unsigned ix, T obj VEC_CHECK_DECL)
template<typename T>
void
-vec_t<T>::quick_insert (unsigned ix, T obj VEC_CHECK_DECL)
+vec_t<T>::quick_insert (unsigned ix, const T &obj VEC_CHECK_DECL)
{
VEC_ASSERT (prefix_.num_ < prefix_.alloc_, "insert", T, base);
VEC_ASSERT (ix <= prefix_.num_, "insert", T, base);
@@ -945,30 +885,13 @@ vec_t<T>::quick_insert (unsigned ix, T obj VEC_CHECK_DECL)
}
-/* Insert an element, *PTR, at the IXth position of V. The new value
- can be NULL, in which case no initialization of the inserted slot
- takes place. There must be sufficient space. */
-
-template<typename T>
-void
-vec_t<T>::quick_insert (unsigned ix, const T *ptr VEC_CHECK_DECL)
-{
- VEC_ASSERT (prefix_.num_ < prefix_.alloc_, "insert", T, base);
- VEC_ASSERT (ix <= prefix_.num_, "insert", T, base);
- T *slot = &vec_[ix];
- memmove (slot + 1, slot, (prefix_.num_++ - ix) * sizeof (T));
- if (ptr)
- *slot = *ptr;
-}
-
-
-/* Insert an element, VAL, at the IXth position of VEC. Reallocate
+/* Insert an element, OBJ, at the IXth position of VEC. Reallocate
VEC, if necessary. */
template<typename T>
template<enum vec_allocation_t A>
void
-vec_t<T>::safe_insert (vec_t<T> **vec, unsigned ix, T obj VEC_CHECK_DECL
+vec_t<T>::safe_insert (vec_t<T> **vec, unsigned ix, const T &obj VEC_CHECK_DECL
MEM_STAT_DECL)
{
reserve<A> (vec, 1 VEC_CHECK_PASS PASS_MEM_STAT);
@@ -976,22 +899,6 @@ vec_t<T>::safe_insert (vec_t<T> **vec, unsigned ix, T obj VEC_CHECK_DECL
}
-/* Insert an element, *PTR, at the IXth position of VEC. Return a pointer
- to the slot created. For vectors of object, the new value can be
- NULL, in which case no initialization of the inserted slot takes
- place. Reallocate V, if necessary. */
-
-template<typename T>
-template<enum vec_allocation_t A>
-void
-vec_t<T>::safe_insert (vec_t<T> **vec, unsigned ix, T *ptr VEC_CHECK_DECL
- MEM_STAT_DECL)
-{
- reserve<A> (vec, 1 VEC_CHECK_PASS PASS_MEM_STAT);
- (*vec)->quick_insert (ix, ptr VEC_CHECK_PASS);
-}
-
-
/* Remove an element from the IXth position of this vector. Ordering of
remaining elements is preserved. This is an O(N) operation due to
a memmove. */
@@ -1043,14 +950,14 @@ vec_t<T>::block_remove (unsigned ix, unsigned len VEC_CHECK_DECL)
template<typename T>
unsigned
-vec_t<T>::lower_bound (T obj, bool (*lessthan)(T, T)) const
+vec_t<T>::lower_bound (T obj, bool (*lessthan)(const T &, const T &)) const
{
unsigned int len = VEC_length (T, this);
unsigned int half, middle;
unsigned int first = 0;
while (len > 0)
{
- half = len >> 1;
+ half = len / 2;
middle = first;
middle += half;
T middle_elem = (*this)[middle];
@@ -1067,38 +974,6 @@ vec_t<T>::lower_bound (T obj, bool (*lessthan)(T, T)) const
}
-/* Find and return the first position in which *PTR could be inserted
- without changing the ordering of this vector. LESSTHAN is a
- function that returns true if the first argument is strictly less
- than the second. */
-
-template<typename T>
-unsigned
-vec_t<T>::lower_bound (const T *ptr,
- bool (*lessthan)(const T *, const T *)) const
-{
- unsigned int len = VEC_length (T, this);
- unsigned int half, middle;
- unsigned int first = 0;
- while (len > 0)
- {
- half = len >> 1;
- middle = first;
- middle += half;
- const T *middle_elem = &(*this)[middle];
- if (lessthan (middle_elem, ptr))
- {
- first = middle;
- ++first;
- len = len - half - 1;
- }
- else
- len = half;
- }
- return first;
-}
-
-
void *vec_heap_o_reserve_1 (void *, int, size_t, size_t, bool MEM_STAT_DECL);
void *vec_gc_o_reserve_1 (void *, int, size_t, size_t, bool MEM_STAT_DECL);
diff --git a/gcc/vecir.h b/gcc/vecir.h
index 97e7b781840..e0d911a579e 100644
--- a/gcc/vecir.h
+++ b/gcc/vecir.h
@@ -49,4 +49,9 @@ DEF_VEC_P(rtx);
DEF_VEC_ALLOC_P(rtx,heap);
DEF_VEC_ALLOC_P(rtx,gc);
+/* A varray of call graph nodes. */
+typedef struct cgraph_node *cgraph_node_p;
+DEF_VEC_P (cgraph_node_p);
+DEF_VEC_ALLOC_P (cgraph_node_p, heap);
+
#endif /* GCC_VECIR_H */
diff --git a/libatomic/ChangeLog b/libatomic/ChangeLog
index ac46c3f2890..602c6c07941 100644
--- a/libatomic/ChangeLog
+++ b/libatomic/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
2012-05-22 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR other/53231
diff --git a/libatomic/configure b/libatomic/configure
index 9a7e5a53c04..239bcee4351 100755
--- a/libatomic/configure
+++ b/libatomic/configure
@@ -8069,6 +8069,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
fi
+ lt_prog_compiler_pic='-fPIC'
;;
amigaos*)
diff --git a/libffi/ChangeLog b/libffi/ChangeLog
index 73599767c25..9d31a064930 100644
--- a/libffi/ChangeLog
+++ b/libffi/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
2012-08-26 Andrew Pinski <apinski@cavium.com>
PR libffi/53014
diff --git a/libffi/configure b/libffi/configure
index 28ed5131ca5..24b9f418127 100755
--- a/libffi/configure
+++ b/libffi/configure
@@ -7827,6 +7827,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
fi
+ lt_prog_compiler_pic='-fPIC'
;;
amigaos*)
@@ -10773,7 +10774,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 10776 "configure"
+#line 10777 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -10879,7 +10880,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 10882 "configure"
+#line 10883 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index cc030f2640a..2045aac2803 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,32 @@
+2012-09-15 Georg-Johann Lay <avr@gjlay.de>
+
+ PR target/54222
+ * config/avr/lib1funcs-fixed.S (__ssneg_2, __ssabs_2, __ssneg_4,
+ __ssabs_4, __clr_8, __ssneg_8, __ssabs_8,
+ __usadd_8, __ussub_8, __ssadd_8, __sssub_8): New functions.
+ (__divsa3): Use __negsi2 to negate r_quoL.
+ * config/avr/lib1funcs.S (FALIAS): New macro.
+ (__divmodsi4): Break out and use __divmodsi4_neg1 as...
+ (__negsi2): ...this new function.
+ * config/avr/t-avr (LIB1ASMFUNCS): Add _negsi2, _clr_8,
+ _ssneg_2, _ssneg_4, _ssneg_8, _ssabs_2, _ssabs_4,
+ _ssabs_8, _ssadd_8, _sssub_8, _usadd_8, _ussub_8.
+ (LIB2FUNCS_EXCLUDE): Fix typo for _add _sub.
+ Add: _ssadd*, _sssub*, _ssneg*, _ssabs* for signed fixed modes.
+ Add: _usadd*, _ussub*, _usneg* for unsigned fixed modes.
+
+2012-09-10 Oleg Endo <olegendo@gcc.gnu.org>
+
+ PR target/54089
+ * config/sh/lib1funcs.S (ashlsi3): Reimplement as ashlsi3_r0.
+ (lshrsi3): Reimplement as lshrsi3_r0.
+
+2012-09-10 Andreas Schwab <schwab@linux-m68k.org>
+
+ PR target/46191
+ * config/t-slibgcc-libgcc (SHLIB_MAKE_SOLINK): Use -lgcc instead
+ of libgcc.a.
+
2012-09-07 Teresa Johnson <tejohnson@google.com>
PR gcov-profile/54487
diff --git a/libgcc/config/avr/lib1funcs-fixed.S b/libgcc/config/avr/lib1funcs-fixed.S
index c1aff53d5fd..ddcd02e197c 100644
--- a/libgcc/config/avr/lib1funcs-fixed.S
+++ b/libgcc/config/avr/lib1funcs-fixed.S
@@ -808,8 +808,8 @@ DEFUN __divsa3
XCALL __udivusa3
sbrs r0, 7 ; negate result if needed
ret
- NEG4 r_quoL
- ret
+ ;; negate r_quoL
+ XJMP __negsi2
ENDF __divsa3
#endif /* defined (L_divsa3) */
@@ -872,3 +872,223 @@ ENDF __udivusa3
#undef r_divHL
#undef r_divHH
#undef r_cnt
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Saturation, 2 Bytes
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; First Argument and Return Register
+#define A0 24
+#define A1 A0+1
+
+#if defined (L_ssneg_2)
+DEFUN __ssneg_2
+ NEG2 A0
+ brvc 0f
+ sbiw A0, 1
+0: ret
+ENDF __ssneg_2
+#endif /* L_ssneg_2 */
+
+#if defined (L_ssabs_2)
+DEFUN __ssabs_2
+ sbrs A1, 7
+ ret
+ XJMP __ssneg_2
+ENDF __ssabs_2
+#endif /* L_ssabs_2 */
+
+#undef A0
+#undef A1
+
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Saturation, 4 Bytes
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; First Argument and Return Register
+#define A0 22
+#define A1 A0+1
+#define A2 A0+2
+#define A3 A0+3
+
+#if defined (L_ssneg_4)
+DEFUN __ssneg_4
+ XCALL __negsi2
+ brvc 0f
+ ldi A3, 0x7f
+ ldi A2, 0xff
+ ldi A1, 0xff
+ ldi A0, 0xff
+0: ret
+ENDF __ssneg_4
+#endif /* L_ssneg_4 */
+
+#if defined (L_ssabs_4)
+DEFUN __ssabs_4
+ sbrs A3, 7
+ ret
+ XJMP __ssneg_4
+ENDF __ssabs_4
+#endif /* L_ssabs_4 */
+
+#undef A0
+#undef A1
+#undef A2
+#undef A3
+
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Saturation, 8 Bytes
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; First Argument and Return Register
+#define A0 18
+#define A1 A0+1
+#define A2 A0+2
+#define A3 A0+3
+#define A4 A0+4
+#define A5 A0+5
+#define A6 A0+6
+#define A7 A0+7
+
+#if defined (L_clr_8)
+FALIAS __usneguta2
+FALIAS __usneguda2
+FALIAS __usnegudq2
+
+;; Clear Carry and all Bytes
+DEFUN __clr_8
+ ;; Clear Carry and set Z
+ sub A7, A7
+ ;; FALLTHRU
+ENDF __clr_8
+;; Propagate Carry to all Bytes, Carry unaltered
+DEFUN __sbc_8
+ sbc A7, A7
+ sbc A6, A6
+ wmov A4, A6
+ wmov A2, A6
+ wmov A0, A6
+ ret
+ENDF __sbc_8
+#endif /* L_clr_8 */
+
+#if defined (L_ssneg_8)
+FALIAS __ssnegta2
+FALIAS __ssnegda2
+FALIAS __ssnegdq2
+
+DEFUN __ssneg_8
+ XCALL __negdi2
+ brvc 0f
+ ;; A[] = 0x7fffffff
+ sec
+ XCALL __sbc_8
+ ldi A7, 0x7f
+0: ret
+ENDF __ssneg_8
+#endif /* L_ssneg_8 */
+
+#if defined (L_ssabs_8)
+FALIAS __ssabsta2
+FALIAS __ssabsda2
+FALIAS __ssabsdq2
+
+DEFUN __ssabs_8
+ sbrs A7, 7
+ ret
+ XJMP __ssneg_8
+ENDF __ssabs_8
+#endif /* L_ssabs_8 */
+
+;; Second Argument
+#define B0 10
+#define B1 B0+1
+#define B2 B0+2
+#define B3 B0+3
+#define B4 B0+4
+#define B5 B0+5
+#define B6 B0+6
+#define B7 B0+7
+
+#if defined (L_usadd_8)
+FALIAS __usadduta3
+FALIAS __usadduda3
+FALIAS __usaddudq3
+
+DEFUN __usadd_8
+ XCALL __adddi3
+ brcs 0f
+ ret
+ ;; A[] = 0xffffffff
+0: XJMP __sbc_8
+ENDF __usadd_8
+#endif /* L_usadd_8 */
+
+#if defined (L_ussub_8)
+FALIAS __ussubuta3
+FALIAS __ussubuda3
+FALIAS __ussubudq3
+
+DEFUN __ussub_8
+ XCALL __subdi3
+ brcs 0f
+ ret
+ ;; A[] = 0
+0: XJMP __clr_8
+ENDF __ussub_8
+#endif /* L_ussub_8 */
+
+#if defined (L_ssadd_8)
+FALIAS __ssaddta3
+FALIAS __ssaddda3
+FALIAS __ssadddq3
+
+DEFUN __ssadd_8
+ ;; A = (B >= 0) ? INT64_MAX : INT64_MIN
+ XCALL __adddi3
+ brvc 0f
+ cpi B7, 0x80
+ XCALL __sbc_8
+ subi A7, 0x80
+0: ret
+ENDF __ssadd_8
+#endif /* L_ssadd_8 */
+
+#if defined (L_sssub_8)
+FALIAS __sssubta3
+FALIAS __sssubda3
+FALIAS __sssubdq3
+
+DEFUN __sssub_8
+ XCALL __subdi3
+ brvc 0f
+ ;; A = (B < 0) ? INT64_MAX : INT64_MIN
+ ldi A7, 0x7f
+ cp A7, B7
+ XCALL __sbc_8
+ subi A7, 0x80
+0: ret
+ENDF __sssub_8
+#endif /* L_sssub_8 */
+
+#undef A0
+#undef A1
+#undef A2
+#undef A3
+#undef A4
+#undef A5
+#undef A6
+#undef A7
+#undef B0
+#undef B1
+#undef B2
+#undef B3
+#undef B4
+#undef B5
+#undef B6
+#undef B7
diff --git a/libgcc/config/avr/lib1funcs.S b/libgcc/config/avr/lib1funcs.S
index 6b9879ee7d7..ad979189306 100644
--- a/libgcc/config/avr/lib1funcs.S
+++ b/libgcc/config/avr/lib1funcs.S
@@ -91,6 +91,14 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
.endfunc
.endm
+.macro FALIAS name
+.global \name
+.func \name
+\name:
+.size \name, .-\name
+.endfunc
+.endm
+
;; Negate a 2-byte value held in consecutive registers
.macro NEG2 reg
com \reg+1
@@ -99,6 +107,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
.endm
;; Negate a 4-byte value held in consecutive registers
+;; Sets the V flag for signed overflow tests if REG >= 16
.macro NEG4 reg
com \reg+3
com \reg+2
@@ -1325,7 +1334,7 @@ DEFUN __divmodsi4
bst r_arg1HH,7 ; store sign of dividend
brtc 0f
com __tmp_reg__ ; r0.7 is sign of result
- rcall __divmodsi4_neg1 ; dividend negative: negate
+ XCALL __negsi2 ; dividend negative: negate
0:
sbrc r_arg2HH,7
rcall __divmodsi4_neg2 ; divisor negative: negate
@@ -1333,16 +1342,7 @@ DEFUN __divmodsi4
sbrc __tmp_reg__, 7 ; correct quotient sign
rcall __divmodsi4_neg2
brtc __divmodsi4_exit ; correct remainder sign
-__divmodsi4_neg1:
- ;; correct dividend/remainder sign
- com r_arg1HH
- com r_arg1HL
- com r_arg1H
- neg r_arg1L
- sbci r_arg1H, 0xff
- sbci r_arg1HL,0xff
- sbci r_arg1HH,0xff
- ret
+ XJMP __negsi2
__divmodsi4_neg2:
;; correct divisor/quotient sign
com r_arg2HH
@@ -1357,6 +1357,16 @@ __divmodsi4_exit:
ENDF __divmodsi4
#endif /* defined (L_divmodsi4) */
+#if defined (L_negsi2)
+;; (set (reg:SI 22)
+;; (neg:SI (reg:SI 22)))
+;; Sets the V flag for signed overflow tests
+DEFUN __negsi2
+ NEG4 22
+ ret
+ENDF __negsi2
+#endif /* L_negsi2 */
+
#undef r_remHH
#undef r_remHL
#undef r_remH
@@ -1689,6 +1699,8 @@ ENDF __divdi3_moddi3
;; (set (reg:DI 18)
;; (plus:DI (reg:DI 18)
;; (reg:DI 10)))
+;; Sets the V flag for signed overflow tests
+;; Sets the C flag for unsigned overflow tests
DEFUN __adddi3
ADD A0,B0 $ adc A1,B1 $ adc A2,B2 $ adc A3,B3
adc A4,B4 $ adc A5,B5 $ adc A6,B6 $ adc A7,B7
@@ -1700,6 +1712,8 @@ ENDF __adddi3
;; (set (reg:DI 18)
;; (plus:DI (reg:DI 18)
;; (sign_extend:SI (reg:QI 26))))
+;; Sets the V flag for signed overflow tests
+;; Sets the C flag for unsigned overflow tests provided 0 <= R26 < 128
DEFUN __adddi3_s8
clr TT
sbrc r26, 7
@@ -1714,6 +1728,8 @@ ENDF __adddi3_s8
;; (set (reg:DI 18)
;; (minus:DI (reg:DI 18)
;; (reg:DI 10)))
+;; Sets the V flag for signed overflow tests
+;; Sets the C flag for unsigned overflow tests
DEFUN __subdi3
SUB A0,B0 $ sbc A1,B1 $ sbc A2,B2 $ sbc A3,B3
sbc A4,B4 $ sbc A5,B5 $ sbc A6,B6 $ sbc A7,B7
@@ -1747,6 +1763,9 @@ ENDF __cmpdi2_s8
#endif /* L_cmpdi2_s8 */
#if defined (L_negdi2)
+;; (set (reg:DI 18)
+;; (neg:DI (reg:DI 18)))
+;; Sets the V flag for signed overflow tests
DEFUN __negdi2
com A4 $ com A5 $ com A6 $ com A7
diff --git a/libgcc/config/avr/t-avr b/libgcc/config/avr/t-avr
index 749613376b3..d1f55e408d3 100644
--- a/libgcc/config/avr/t-avr
+++ b/libgcc/config/avr/t-avr
@@ -20,7 +20,7 @@ LIB1ASMFUNCS = \
_divdi3 _udivdi3 \
_muldi3 \
_udivmod64 \
- _negdi2 \
+ _negsi2 _negdi2 \
_prologue \
_epilogue \
_exit \
@@ -72,7 +72,12 @@ LIB1ASMFUNCS += \
_divqq3 _udivuqq3 \
_divhq3 _udivuhq3 \
_divha3 _udivuha3 \
- _divsa3 _udivusa3
+ _divsa3 _udivusa3 \
+ _clr_8 \
+ _ssneg_2 _ssneg_4 _ssneg_8 \
+ _ssabs_2 _ssabs_4 _ssabs_8 \
+ _ssadd_8 _sssub_8 \
+ _usadd_8 _ussub_8
LIB2FUNCS_EXCLUDE = \
_moddi3 _umoddi3 \
@@ -103,6 +108,7 @@ endif
# Filter out supported conversions from fixed-bit.c
+# Also filter out TQ and UTQ.
conv_XY=$(conv)$(mode1)$(mode2)
func_X=$(func)$(mode)
@@ -141,8 +147,20 @@ allfix_modes = QQ UQQ HQ UHQ HA UHA SQ USQ SA USA DA UDA DQ UDQ TQ UTQ TA UTA
LIB2FUNCS_EXCLUDE += \
$(foreach func,_add _sub,\
- $(foreach mode,$(allfix_modes),$(func_X)3))
+ $(foreach mode,$(allfix_modes),$(func_X)))
LIB2FUNCS_EXCLUDE += \
$(foreach func,_lshr _ashl _ashr _cmp,\
$(foreach mode,$(allfix_modes),$(func_X)))
+
+
+usat_modes = UQQ UHQ UHA USQ USA UDQ UDA UTQ UTA
+ssat_modes = QQ HQ HA SQ SA DQ DA TQ TA
+
+LIB2FUNCS_EXCLUDE += \
+ $(foreach func,_ssadd _sssub _ssneg _ssabs,\
+ $(foreach mode,$(ssat_modes),$(func_X)))
+
+LIB2FUNCS_EXCLUDE += \
+ $(foreach func,_usadd _ussub _usneg,\
+ $(foreach mode,$(usat_modes),$(func_X)))
diff --git a/libgcc/config/sh/lib1funcs.S b/libgcc/config/sh/lib1funcs.S
index 2f0ca16cd91..c5a00db9a20 100644
--- a/libgcc/config/sh/lib1funcs.S
+++ b/libgcc/config/sh/lib1funcs.S
@@ -1,5 +1,5 @@
/* Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
- 2004, 2005, 2006, 2009
+ 2004, 2005, 2006, 2009, 2012
Free Software Foundation, Inc.
This file is free software; you can redistribute it and/or modify it
@@ -241,7 +241,7 @@ GLOBAL(ashiftrt_r4_0):
! Entry:
!
! r4: Value to shift
-! r5: Shifts
+! r5: Shift count
!
! Exit:
!
@@ -249,7 +249,7 @@ GLOBAL(ashiftrt_r4_0):
!
! Destroys:
!
-! (none)
+! T bit, r5
!
.global GLOBAL(ashrsi3)
@@ -388,318 +388,353 @@ LOCAL(ashrsi3_0):
!
! GLOBAL(ashlsi3)
+! (For compatibility with older binaries, not used by compiler)
!
! Entry:
-!
-! r4: Value to shift
-! r5: Shifts
+! r4: Value to shift
+! r5: Shift count
!
! Exit:
-!
-! r0: Result
+! r0: Result
!
! Destroys:
+! T bit
+!
!
-! (none)
+! GLOBAL(ashlsi3_r0)
!
+! Entry:
+! r4: Value to shift
+! r0: Shift count
+!
+! Exit:
+! r0: Result
+!
+! Destroys:
+! T bit
+
.global GLOBAL(ashlsi3)
+ .global GLOBAL(ashlsi3_r0)
HIDDEN_FUNC(GLOBAL(ashlsi3))
- .align 2
+ HIDDEN_FUNC(GLOBAL(ashlsi3_r0))
GLOBAL(ashlsi3):
- mov #31,r0
- and r0,r5
- mova LOCAL(ashlsi3_table),r0
- mov.b @(r0,r5),r5
+ mov r5,r0
+ .align 2
+GLOBAL(ashlsi3_r0):
+
#ifdef __sh1__
- add r5,r0
+ and #31,r0
+ shll2 r0
+ mov.l r4,@-r15
+ mov r0,r4
+ mova LOCAL(ashlsi3_table),r0
+ add r4,r0
+ mov.l @r15+,r4
jmp @r0
+ mov r4,r0
+ .align 2
#else
- braf r5
-#endif
+ and #31,r0
+ shll2 r0
+ braf r0
mov r4,r0
+#endif
- .align 2
LOCAL(ashlsi3_table):
- .byte LOCAL(ashlsi3_0)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_1)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_2)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_3)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_4)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_5)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_6)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_7)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_8)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_9)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_10)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_11)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_12)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_13)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_14)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_15)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_16)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_17)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_18)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_19)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_20)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_21)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_22)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_23)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_24)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_25)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_26)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_27)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_28)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_29)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_30)-LOCAL(ashlsi3_table)
- .byte LOCAL(ashlsi3_31)-LOCAL(ashlsi3_table)
-
-LOCAL(ashlsi3_6):
- shll2 r0
-LOCAL(ashlsi3_4):
- shll2 r0
-LOCAL(ashlsi3_2):
+ rts // << 0
+ nop
+LOCAL(ashlsi_1):
+ rts // << 1
+ shll r0
+LOCAL(ashlsi_2): // << 2
rts
shll2 r0
-
-LOCAL(ashlsi3_7):
- shll2 r0
-LOCAL(ashlsi3_5):
+ bra LOCAL(ashlsi_1) // << 3
shll2 r0
-LOCAL(ashlsi3_3):
+ bra LOCAL(ashlsi_2) // << 4
shll2 r0
-LOCAL(ashlsi3_1):
- rts
+ bra LOCAL(ashlsi_5) // << 5
shll r0
-
-LOCAL(ashlsi3_14):
- shll2 r0
-LOCAL(ashlsi3_12):
+ bra LOCAL(ashlsi_6) // << 6
shll2 r0
-LOCAL(ashlsi3_10):
- shll2 r0
-LOCAL(ashlsi3_8):
+ bra LOCAL(ashlsi_7) // << 7
+ shll r0
+LOCAL(ashlsi_8): // << 8
rts
shll8 r0
-
-LOCAL(ashlsi3_15):
- shll2 r0
-LOCAL(ashlsi3_13):
+ bra LOCAL(ashlsi_8) // << 9
+ shll r0
+ bra LOCAL(ashlsi_8) // << 10
shll2 r0
-LOCAL(ashlsi3_11):
+ bra LOCAL(ashlsi_11) // << 11
+ shll r0
+ bra LOCAL(ashlsi_12) // << 12
shll2 r0
-LOCAL(ashlsi3_9):
+ bra LOCAL(ashlsi_13) // << 13
+ shll r0
+ bra LOCAL(ashlsi_14) // << 14
+ shll8 r0
+ bra LOCAL(ashlsi_15) // << 15
shll8 r0
+LOCAL(ashlsi_16): // << 16
rts
+ shll16 r0
+ bra LOCAL(ashlsi_16) // << 17
shll r0
-
-LOCAL(ashlsi3_22):
- shll2 r0
-LOCAL(ashlsi3_20):
+ bra LOCAL(ashlsi_16) // << 18
shll2 r0
-LOCAL(ashlsi3_18):
+ bra LOCAL(ashlsi_19) // << 19
+ shll r0
+ bra LOCAL(ashlsi_20) // << 20
shll2 r0
-LOCAL(ashlsi3_16):
- rts
+ bra LOCAL(ashlsi_21) // << 21
+ shll r0
+ bra LOCAL(ashlsi_22) // << 22
shll16 r0
-
-LOCAL(ashlsi3_23):
- shll2 r0
-LOCAL(ashlsi3_21):
+ bra LOCAL(ashlsi_23) // << 23
+ shll16 r0
+ bra LOCAL(ashlsi_16) // << 24
+ shll8 r0
+ bra LOCAL(ashlsi_25) // << 25
+ shll r0
+ bra LOCAL(ashlsi_26) // << 26
shll2 r0
-LOCAL(ashlsi3_19):
+ bra LOCAL(ashlsi_27) // << 27
+ shll r0
+ bra LOCAL(ashlsi_28) // << 28
shll2 r0
-LOCAL(ashlsi3_17):
+ bra LOCAL(ashlsi_29) // << 29
+ shll16 r0
+ bra LOCAL(ashlsi_30) // << 30
shll16 r0
+ and #1,r0 // << 31
rts
- shll r0
+ rotr r0
-LOCAL(ashlsi3_30):
- shll2 r0
-LOCAL(ashlsi3_28):
+LOCAL(ashlsi_7):
shll2 r0
-LOCAL(ashlsi3_26):
+LOCAL(ashlsi_5):
+LOCAL(ashlsi_6):
shll2 r0
-LOCAL(ashlsi3_24):
- shll16 r0
rts
- shll8 r0
-
-LOCAL(ashlsi3_31):
+LOCAL(ashlsi_13):
shll2 r0
-LOCAL(ashlsi3_29):
+LOCAL(ashlsi_12):
+LOCAL(ashlsi_11):
+ shll8 r0
+ rts
+LOCAL(ashlsi_21):
shll2 r0
-LOCAL(ashlsi3_27):
+LOCAL(ashlsi_20):
+LOCAL(ashlsi_19):
+ shll16 r0
+ rts
+LOCAL(ashlsi_28):
+LOCAL(ashlsi_27):
shll2 r0
-LOCAL(ashlsi3_25):
+LOCAL(ashlsi_26):
+LOCAL(ashlsi_25):
shll16 r0
+ rts
+ shll8 r0
+
+LOCAL(ashlsi_22):
+LOCAL(ashlsi_14):
+ shlr2 r0
+ rts
shll8 r0
+
+LOCAL(ashlsi_23):
+LOCAL(ashlsi_15):
+ shlr r0
rts
- shll r0
+ shll8 r0
-LOCAL(ashlsi3_0):
+LOCAL(ashlsi_29):
+ shlr r0
+LOCAL(ashlsi_30):
+ shlr2 r0
rts
- nop
+ shll16 r0
ENDFUNC(GLOBAL(ashlsi3))
+ ENDFUNC(GLOBAL(ashlsi3_r0))
#endif
#ifdef L_lshiftrt
!
! GLOBAL(lshrsi3)
+! (For compatibility with older binaries, not used by compiler)
!
! Entry:
-!
-! r4: Value to shift
-! r5: Shifts
+! r4: Value to shift
+! r5: Shift count
!
! Exit:
-!
-! r0: Result
+! r0: Result
!
! Destroys:
+! T bit
!
-! (none)
!
+! GLOBAL(lshrsi3_r0)
+!
+! Entry:
+! r4: Value to shift
+! r0: Shift count
+!
+! Exit:
+! r0: Result
+!
+! Destroys:
+! T bit
+
.global GLOBAL(lshrsi3)
+ .global GLOBAL(lshrsi3_r0)
HIDDEN_FUNC(GLOBAL(lshrsi3))
- .align 2
+ HIDDEN_FUNC(GLOBAL(lshrsi3_r0))
GLOBAL(lshrsi3):
- mov #31,r0
- and r0,r5
- mova LOCAL(lshrsi3_table),r0
- mov.b @(r0,r5),r5
+ mov r5,r0
+ .align 2
+GLOBAL(lshrsi3_r0):
+
#ifdef __sh1__
- add r5,r0
+ and #31,r0
+ shll2 r0
+ mov.l r4,@-r15
+ mov r0,r4
+ mova LOCAL(lshrsi3_table),r0
+ add r4,r0
+ mov.l @r15+,r4
jmp @r0
+ mov r4,r0
+ .align 2
#else
- braf r5
-#endif
+ and #31,r0
+ shll2 r0
+ braf r0
mov r4,r0
-
- .align 2
+#endif
LOCAL(lshrsi3_table):
- .byte LOCAL(lshrsi3_0)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_1)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_2)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_3)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_4)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_5)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_6)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_7)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_8)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_9)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_10)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_11)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_12)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_13)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_14)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_15)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_16)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_17)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_18)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_19)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_20)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_21)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_22)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_23)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_24)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_25)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_26)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_27)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_28)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_29)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_30)-LOCAL(lshrsi3_table)
- .byte LOCAL(lshrsi3_31)-LOCAL(lshrsi3_table)
-
-LOCAL(lshrsi3_6):
- shlr2 r0
-LOCAL(lshrsi3_4):
- shlr2 r0
-LOCAL(lshrsi3_2):
+ rts // >> 0
+ nop
+LOCAL(lshrsi_1): // >> 1
+ rts
+ shlr r0
+LOCAL(lshrsi_2): // >> 2
rts
shlr2 r0
-
-LOCAL(lshrsi3_7):
- shlr2 r0
-LOCAL(lshrsi3_5):
+ bra LOCAL(lshrsi_1) // >> 3
shlr2 r0
-LOCAL(lshrsi3_3):
+ bra LOCAL(lshrsi_2) // >> 4
shlr2 r0
-LOCAL(lshrsi3_1):
- rts
+ bra LOCAL(lshrsi_5) // >> 5
shlr r0
-
-LOCAL(lshrsi3_14):
- shlr2 r0
-LOCAL(lshrsi3_12):
- shlr2 r0
-LOCAL(lshrsi3_10):
+ bra LOCAL(lshrsi_6) // >> 6
shlr2 r0
-LOCAL(lshrsi3_8):
+ bra LOCAL(lshrsi_7) // >> 7
+ shlr r0
+LOCAL(lshrsi_8): // >> 8
rts
shlr8 r0
-
-LOCAL(lshrsi3_15):
- shlr2 r0
-LOCAL(lshrsi3_13):
+ bra LOCAL(lshrsi_8) // >> 9
+ shlr r0
+ bra LOCAL(lshrsi_8) // >> 10
shlr2 r0
-LOCAL(lshrsi3_11):
+ bra LOCAL(lshrsi_11) // >> 11
+ shlr r0
+ bra LOCAL(lshrsi_12) // >> 12
shlr2 r0
-LOCAL(lshrsi3_9):
+ bra LOCAL(lshrsi_13) // >> 13
+ shlr r0
+ bra LOCAL(lshrsi_14) // >> 14
shlr8 r0
+ bra LOCAL(lshrsi_15) // >> 15
+ shlr8 r0
+LOCAL(lshrsi_16): // >> 16
rts
+ shlr16 r0
+ bra LOCAL(lshrsi_16) // >> 17
shlr r0
-
-LOCAL(lshrsi3_22):
+ bra LOCAL(lshrsi_16) // >> 18
shlr2 r0
-LOCAL(lshrsi3_20):
- shlr2 r0
-LOCAL(lshrsi3_18):
+ bra LOCAL(lshrsi_19) // >> 19
+ shlr r0
+ bra LOCAL(lshrsi_20) // >> 20
shlr2 r0
-LOCAL(lshrsi3_16):
- rts
+ bra LOCAL(lshrsi_21) // >> 21
+ shlr r0
+ bra LOCAL(lshrsi_22) // >> 22
shlr16 r0
-
-LOCAL(lshrsi3_23):
- shlr2 r0
-LOCAL(lshrsi3_21):
+ bra LOCAL(lshrsi_23) // >> 23
+ shlr16 r0
+ bra LOCAL(lshrsi_16) // >> 24
+ shlr8 r0
+ bra LOCAL(lshrsi_25) // >> 25
+ shlr r0
+ bra LOCAL(lshrsi_26) // >> 26
shlr2 r0
-LOCAL(lshrsi3_19):
+ bra LOCAL(lshrsi_27) // >> 27
+ shlr r0
+ bra LOCAL(lshrsi_28) // >> 28
shlr2 r0
-LOCAL(lshrsi3_17):
+ bra LOCAL(lshrsi_29) // >> 29
shlr16 r0
+ bra LOCAL(lshrsi_30) // >> 30
+ shlr16 r0
+ shll r0 // >> 31
rts
- shlr r0
+ movt r0
-LOCAL(lshrsi3_30):
+LOCAL(lshrsi_7):
shlr2 r0
-LOCAL(lshrsi3_28):
+LOCAL(lshrsi_5):
+LOCAL(lshrsi_6):
shlr2 r0
-LOCAL(lshrsi3_26):
- shlr2 r0
-LOCAL(lshrsi3_24):
- shlr16 r0
rts
- shlr8 r0
-
-LOCAL(lshrsi3_31):
+LOCAL(lshrsi_13):
shlr2 r0
-LOCAL(lshrsi3_29):
+LOCAL(lshrsi_12):
+LOCAL(lshrsi_11):
+ shlr8 r0
+ rts
+LOCAL(lshrsi_21):
shlr2 r0
-LOCAL(lshrsi3_27):
+LOCAL(lshrsi_20):
+LOCAL(lshrsi_19):
+ shlr16 r0
+ rts
+LOCAL(lshrsi_28):
+LOCAL(lshrsi_27):
shlr2 r0
-LOCAL(lshrsi3_25):
+LOCAL(lshrsi_26):
+LOCAL(lshrsi_25):
shlr16 r0
+ rts
+ shlr8 r0
+
+LOCAL(lshrsi_22):
+LOCAL(lshrsi_14):
+ shll2 r0
+ rts
shlr8 r0
+
+LOCAL(lshrsi_23):
+LOCAL(lshrsi_15):
+ shll r0
rts
- shlr r0
+ shlr8 r0
-LOCAL(lshrsi3_0):
+LOCAL(lshrsi_29):
+ shll r0
+LOCAL(lshrsi_30):
+ shll2 r0
rts
- nop
+ shlr16 r0
ENDFUNC(GLOBAL(lshrsi3))
+ ENDFUNC(GLOBAL(lshrsi3_r0))
#endif
#ifdef L_movmem
diff --git a/libgcc/config/t-slibgcc-libgcc b/libgcc/config/t-slibgcc-libgcc
index ec36b2727ae..066822667d9 100644
--- a/libgcc/config/t-slibgcc-libgcc
+++ b/libgcc/config/t-slibgcc-libgcc
@@ -25,7 +25,7 @@ SHLIB_MAKE_SOLINK = \
(echo "/* GNU ld script"; \
echo " Use the shared library, but some functions are only in"; \
echo " the static library. */"; \
- echo "GROUP ( $(SHLIB_SONAME) libgcc.a )" \
+ echo "GROUP ( $(SHLIB_SONAME) -lgcc )" \
) > $(SHLIB_DIR)/$(SHLIB_SOLINK)
SHLIB_INSTALL_SOLINK = \
$(INSTALL_DATA) $(SHLIB_DIR)/$(SHLIB_SOLINK) \
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index b5664f37b5a..f8a68d74171 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
2012-09-05 Uros Bizjak <ubizjak@gmail.com>
* config/fpu-387.h (set_fpu): Prefix stmxcsr and ldmxcsr with %v.
diff --git a/libgfortran/configure b/libgfortran/configure
index 3c1ca430a32..5ee6f23aa26 100755
--- a/libgfortran/configure
+++ b/libgfortran/configure
@@ -9354,6 +9354,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
fi
+ lt_prog_compiler_pic='-fPIC'
;;
amigaos*)
@@ -12327,7 +12328,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 12330 "configure"
+#line 12331 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -12433,7 +12434,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 12436 "configure"
+#line 12437 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -13217,6 +13218,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static_FC='-Bstatic'
fi
+ lt_prog_compiler_pic_FC='-fPIC'
;;
amigaos*)
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index 2f761d7177f..ce8384d108d 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
2012-08-29 Chung-Lin Tang <cltang@codesourcery.com>
* config/linux/mips/futex.h (sys_futex0): Change to static
diff --git a/libitm/ChangeLog b/libitm/ChangeLog
index 2d10d5e8f97..7c894ba6929 100644
--- a/libitm/ChangeLog
+++ b/libitm/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
2012-07-31 Uros Bizjak <ubizjak@gmail.com>
* config/x86/target.h (cpu_relax): Use __builtin_ia32_pause.
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index 6b598024e23..69b13d7222c 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -1,3 +1,12 @@
+2012-09-14 Dehao Chen <dehao@google.com>
+
+ * testsuite/libjava.lang/sourcelocation.java: New cases.
+ * testsuite/libjava.lang/sourcelocation.out: New cases.
+
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
2012-07-19 Tristan Gingold <gingold@adacore.com>
Richard Henderson <rth@redhat.com>
diff --git a/libjava/classpath/ChangeLog b/libjava/classpath/ChangeLog
index cd6b8aa9d5d..b1da426ab3d 100644
--- a/libjava/classpath/ChangeLog
+++ b/libjava/classpath/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
2012-08-09 Dodji Seketeli <dodji@redhat.com>
Use accessor functions to manipulate xmlOutputBuffer
diff --git a/libjava/classpath/configure b/libjava/classpath/configure
index 21d0d5f755e..48a422ab102 100755
--- a/libjava/classpath/configure
+++ b/libjava/classpath/configure
@@ -8845,6 +8845,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
fi
+ lt_prog_compiler_pic='-fPIC'
;;
amigaos*)
@@ -11818,7 +11819,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11821 "configure"
+#line 11822 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -11924,7 +11925,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11927 "configure"
+#line 11928 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -15103,6 +15104,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static_CXX='-Bstatic'
fi
+ lt_prog_compiler_pic_CXX='-fPIC'
;;
amigaos*)
@@ -23885,7 +23887,7 @@ else
JAVA_TEST=Object.java
CLASS_TEST=Object.class
cat << \EOF > $JAVA_TEST
-/* #line 23888 "configure" */
+/* #line 23890 "configure" */
package java.lang;
public class Object
@@ -23978,7 +23980,7 @@ EOF
if uudecode$EXEEXT Test.uue; then
ac_cv_prog_uudecode_base64=yes
else
- echo "configure: 23981: uudecode had trouble decoding base 64 file 'Test.uue'" >&5
+ echo "configure: 23983: uudecode had trouble decoding base 64 file 'Test.uue'" >&5
echo "configure: failed file was:" >&5
cat Test.uue >&5
ac_cv_prog_uudecode_base64=no
@@ -24006,7 +24008,7 @@ JAVA_TEST=Test.java
CLASS_TEST=Test.class
TEST=Test
cat << \EOF > $JAVA_TEST
-/* [#]line 24009 "configure" */
+/* [#]line 24011 "configure" */
public class Test {
public static void main (String args[]) {
System.exit (0);
@@ -24214,7 +24216,7 @@ if test "x${use_glibj_zip}" = xfalse || \
JAVA_TEST=Test.java
CLASS_TEST=Test.class
cat << \EOF > $JAVA_TEST
- /* #line 24217 "configure" */
+ /* #line 24219 "configure" */
public class Test
{
public static void main(String args)
diff --git a/libjava/configure b/libjava/configure
index 0bd423dadef..7d6db50d14c 100755
--- a/libjava/configure
+++ b/libjava/configure
@@ -10392,6 +10392,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
fi
+ lt_prog_compiler_pic='-fPIC'
;;
amigaos*)
@@ -13365,7 +13366,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 13368 "configure"
+#line 13369 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -13471,7 +13472,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 13474 "configure"
+#line 13475 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -15274,6 +15275,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static_CXX='-Bstatic'
fi
+ lt_prog_compiler_pic_CXX='-fPIC'
;;
amigaos*)
@@ -17367,6 +17369,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static_GCJ='-Bstatic'
fi
+ lt_prog_compiler_pic_GCJ='-fPIC'
;;
amigaos*)
@@ -19464,7 +19467,7 @@ if test "${enable_sjlj_exceptions+set}" = set; then :
enableval=$enable_sjlj_exceptions; :
else
cat > conftest.$ac_ext << EOF
-#line 19467 "configure"
+#line 19470 "configure"
struct S { ~S(); };
void bar();
void foo()
diff --git a/libjava/testsuite/libjava.lang/sourcelocation.jar b/libjava/testsuite/libjava.lang/sourcelocation.jar
new file mode 100644
index 00000000000..90f38f4b8bb
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/sourcelocation.jar
Binary files differ
diff --git a/libjava/testsuite/libjava.lang/sourcelocation.java b/libjava/testsuite/libjava.lang/sourcelocation.java
new file mode 100644
index 00000000000..6cf1e40ef4a
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/sourcelocation.java
@@ -0,0 +1,18 @@
+/* This test should test the source location attribution.
+ We print the line number of different parts of the program to make sure
+ that the source code attribution is correct.
+ To make this test pass, one need to have up-to-date addr2line installed
+ to parse the dwarf4 data format.
+*/
+public class sourcelocation {
+ public static void main(String args[]) {
+ try {
+ System.out.println(new Exception().getStackTrace()[0].getLineNumber());
+ throw new Exception();
+ } catch (Exception e) {
+ System.out.println(new Exception().getStackTrace()[0].getLineNumber());
+ } finally {
+ System.out.println(new Exception().getStackTrace()[0].getLineNumber());
+ }
+ }
+}
diff --git a/libjava/testsuite/libjava.lang/sourcelocation.out b/libjava/testsuite/libjava.lang/sourcelocation.out
new file mode 100644
index 00000000000..781c91b5c39
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/sourcelocation.out
@@ -0,0 +1,3 @@
+10
+13
+15
diff --git a/libmudflap/ChangeLog b/libmudflap/ChangeLog
index d70c6771f07..8956c3c981a 100644
--- a/libmudflap/ChangeLog
+++ b/libmudflap/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
2012-07-13 Richard Guenther <rguenther@suse.de>
* testsuite/libmudflap.c++/ctors.exp: Explicitely specify -O0.
diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog
index fe1d395c6f9..9bccceaab89 100644
--- a/libobjc/ChangeLog
+++ b/libobjc/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
2012-07-19 Tristan Gingold <gingold@adacore.com>
Richard Henderson <rth@redhat.com>
diff --git a/libobjc/configure b/libobjc/configure
index 5028c28fba0..a220b155893 100755
--- a/libobjc/configure
+++ b/libobjc/configure
@@ -7621,6 +7621,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
fi
+ lt_prog_compiler_pic='-fPIC'
;;
amigaos*)
@@ -10594,7 +10595,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 10597 "configure"
+#line 10598 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -10700,7 +10701,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 10703 "configure"
+#line 10704 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -11471,7 +11472,7 @@ if test "${enable_sjlj_exceptions+set}" = set; then :
enableval=$enable_sjlj_exceptions; :
else
cat > conftest.$ac_ext << EOF
-#line 11474 "configure"
+#line 11475 "configure"
@interface Frob
@end
@implementation Frob
diff --git a/libquadmath/ChangeLog b/libquadmath/ChangeLog
index b5e92149e50..dd37cd348a4 100644
--- a/libquadmath/ChangeLog
+++ b/libquadmath/ChangeLog
@@ -1,9 +1,13 @@
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
2012-05-29 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/51007
* configure.ac: Allow gnu, gnu* variants for --enable-symvers argument.
* configure: Regenerated.
-
+
2012-05-16 H.J. Lu <hongjiu.lu@intel.com>
* configure: Regenerated.
diff --git a/libssp/ChangeLog b/libssp/ChangeLog
index eed64ba47f8..64874e1c003 100644
--- a/libssp/ChangeLog
+++ b/libssp/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
2012-05-29 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/51007
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 4ecedf818bd..128f7cb0805 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,76 @@
+2012-09-16 Edward Smith-Rowland <3dw4rd@verizon.net>
+
+ * include/ext/random.tcc (__gnu_cxx::rice_distribution<>
+ ::__generate_impl): Remove bogus _Adaptor usage.
+
+2012-09-16 Paolo Carlini <paolo.carlini@oracle.com>
+
+ * include/ext/random (rice_distribution<>::operator==): Change
+ inline friend definition to non-template.
+ * testsuite/ext/random/rice_distribution/requirements/
+ explicit_instantiation/1.cc: New.
+
+ * testsuite/26_numerics/random/normal_mv_distribution: Move...
+ * testsuite/ext/random/normal_mv_distribution: ... here.
+ * testsuite/26_numerics/random/simd_fast_mersenne_twister_engine:
+ Move...
+ * testsuite/ext/random/simd_fast_mersenne_twister_engine: ... here.
+ * testsuite/26_numerics/random/beta_distribution: Move...
+ * testsuite/ext/random/beta_distribution: ... here.
+ * testsuite/26_numerics/random/rice_distribution: Move...
+ * testsuite/ext/random/rice_distribution: ... here.
+
+2012-09-14 Edward Smith-Rowland <3dw4rd@verizon.net>
+
+ * include/ext/random: Add __gnu_cxx::rice_distribution<> class.
+ * include/ext/random.tcc: Add out-of-line functions for
+ __gnu_cxx::rice_distribution<>.
+ * testsuite/26_numerics/random/rice_distribution/
+ operators/equal.cc: New file.
+ * testsuite/26_numerics/random/rice_distribution/
+ operators/serialize.cc: New file.
+ * testsuite/26_numerics/random/rice_distribution/
+ operators/inequal.cc: New file.
+ * testsuite/26_numerics/random/rice_distribution/
+ cons/parms.cc: New file.
+ * testsuite/26_numerics/random/rice_distribution/
+ cons/default.cc: New file.
+ * testsuite/26_numerics/random/rice_distribution/
+ requirements/typedefs.cc: New file.
+
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
+2012-09-14 Jonathan Wakely <jwakely.gcc@gmail.com>
+ H.J. Lu <hongjiu.lu@intel.com>
+
+ PR libstdc++/54576
+ * src/c++11/random.cc: Check if _GLIBCXX_USE_C99_STDINT_TR1 is defined.
+
+2012-09-12 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * acinclude.m4 (GLIBCXX_CHECK_ASSEMBLER_HWCAP): Define.
+ * configure.ac: Call GLIBCXX_CHECK_ASSEMBLER_HWCAP.
+ * fragment.am (CONFIG_CXXFLAGS): Add $(HWCAP_FLAGS).
+ * configure: Regenerate.
+ * Makefile.in: Regenerate.
+ * doc/Makefile.in: Regenerate.
+ * include/Makefile.in: Regenerate.
+ * libsupc++/Makefile.in: Regenerate.
+ * po/Makefile.in: Regenerate.
+ * python/Makefile.in: Regenerate.
+ * src/Makefile.in: Regenerate.
+ * src/c++11/Makefile.in: Regenerate.
+ * src/c++98/Makefile.in: Regenerate.
+ * testsuite/Makefile.in: Regenerate.
+
+2012-09-11 Jakub Jelinek <jakub@redhat.com>
+
+ PR libstdc++/54172
+ * libsupc++/guard.cc (__cxa_guard_acquire): Fix up the last
+ argument of the first __atomic_compare_exchange_n.
+
2012-09-10 Sebastian Huber <sebastian.huber@embedded-brains.de>
Jonathan Wakely <jwakely.gcc@gmail.com>
diff --git a/libstdc++-v3/Makefile.in b/libstdc++-v3/Makefile.in
index 1b1c3dd09af..7870fc35c1f 100644
--- a/libstdc++-v3/Makefile.in
+++ b/libstdc++-v3/Makefile.in
@@ -174,6 +174,7 @@ FGREP = @FGREP@
GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@
GLIBCXX_LIBS = @GLIBCXX_LIBS@
GREP = @GREP@
+HWCAP_FLAGS = @HWCAP_FLAGS@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -318,7 +319,7 @@ toolexeclibdir = $(glibcxx_toolexeclibdir)
# These bits are all figured out from configure. Look in acinclude.m4
# or configure.ac to see how they are set. See GLIBCXX_EXPORT_FLAGS.
CONFIG_CXXFLAGS = \
- $(SECTION_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
+ $(SECTION_FLAGS) $(HWCAP_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
WARN_CXXFLAGS = \
$(WARN_FLAGS) $(WERROR_FLAG) -fdiagnostics-show-location=once
diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index 794df5c22be..ab26660782e 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -169,6 +169,32 @@ AC_DEFUN([GLIBCXX_CHECK_COMPILER_FEATURES], [
dnl
+dnl Check if the assembler used supports disabling generation of hardware
+dnl capabilities. This is only supported by Sun as at the moment.
+dnl
+dnl Defines:
+dnl HWCAP_FLAGS='-Wa,-nH' if possible.
+dnl
+AC_DEFUN([GLIBCXX_CHECK_ASSEMBLER_HWCAP], [
+ test -z "$HWCAP_FLAGS" && HWCAP_FLAGS=''
+
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Wa,-nH"
+
+ AC_MSG_CHECKING([for as that supports -Wa,-nH])
+ AC_TRY_COMPILE([], [return 0;], [ac_hwcap_flags=yes],[ac_hwcap_flags=no])
+ if test "$ac_hwcap_flags" = "yes"; then
+ HWCAP_FLAGS="-Wa,-nH $HWCAP_FLAGS"
+ fi
+ AC_MSG_RESULT($ac_hwcap_flags)
+
+ CFLAGS="$ac_save_CFLAGS"
+
+ AC_SUBST(HWCAP_FLAGS)
+])
+
+
+dnl
dnl If GNU ld is in use, check to see if tricky linker opts can be used. If
dnl the native linker is in use, all variables will be defined to something
dnl safe (like an empty string).
diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure
index ff4caf4315c..6ad3e6289fe 100755
--- a/libstdc++-v3/configure
+++ b/libstdc++-v3/configure
@@ -639,6 +639,7 @@ BUILD_INFO_FALSE
BUILD_INFO_TRUE
baseline_subdir_switch
baseline_dir
+HWCAP_FLAGS
GLIBCXX_LDBL_COMPAT_FALSE
GLIBCXX_LDBL_COMPAT_TRUE
ENABLE_VISIBILITY_FALSE
@@ -8534,6 +8535,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
fi
+ lt_prog_compiler_pic='-fPIC'
;;
amigaos*)
@@ -11507,7 +11509,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11510 "configure"
+#line 11512 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -11613,7 +11615,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 11616 "configure"
+#line 11618 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -13416,6 +13418,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static_CXX='-Bstatic'
fi
+ lt_prog_compiler_pic_CXX='-fPIC'
;;
amigaos*)
@@ -14994,7 +14997,7 @@ fi
#
# Fake what AC_TRY_COMPILE does. XXX Look at redoing this new-style.
cat > conftest.$ac_ext << EOF
-#line 14997 "configure"
+#line 15000 "configure"
struct S { ~S(); };
void bar();
void foo()
@@ -15329,7 +15332,7 @@ $as_echo "$glibcxx_cv_atomic_long_long" >&6; }
# Fake what AC_TRY_COMPILE does.
cat > conftest.$ac_ext << EOF
-#line 15332 "configure"
+#line 15335 "configure"
int main()
{
typedef bool atomic_type;
@@ -15364,7 +15367,7 @@ $as_echo "$glibcxx_cv_atomic_bool" >&6; }
rm -f conftest*
cat > conftest.$ac_ext << EOF
-#line 15367 "configure"
+#line 15370 "configure"
int main()
{
typedef short atomic_type;
@@ -15399,7 +15402,7 @@ $as_echo "$glibcxx_cv_atomic_short" >&6; }
rm -f conftest*
cat > conftest.$ac_ext << EOF
-#line 15402 "configure"
+#line 15405 "configure"
int main()
{
// NB: _Atomic_word not necessarily int.
@@ -15435,7 +15438,7 @@ $as_echo "$glibcxx_cv_atomic_int" >&6; }
rm -f conftest*
cat > conftest.$ac_ext << EOF
-#line 15438 "configure"
+#line 15441 "configure"
int main()
{
typedef long long atomic_type;
@@ -15514,7 +15517,7 @@ $as_echo "$as_me: WARNING: Performance of certain classes will degrade as a resu
# unnecessary for this test.
cat > conftest.$ac_ext << EOF
-#line 15517 "configure"
+#line 15520 "configure"
int main()
{
_Decimal32 d1;
@@ -15556,7 +15559,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
# unnecessary for this test.
cat > conftest.$ac_ext << EOF
-#line 15559 "configure"
+#line 15562 "configure"
template<typename T1, typename T2>
struct same
{ typedef T2 type; };
@@ -15590,7 +15593,7 @@ $as_echo "$enable_int128" >&6; }
rm -f conftest*
cat > conftest.$ac_ext << EOF
-#line 15593 "configure"
+#line 15596 "configure"
template<typename T1, typename T2>
struct same
{ typedef T2 type; };
@@ -70647,6 +70650,43 @@ $as_echo "#define _GLIBCXX_LONG_DOUBLE_COMPAT 1" >>confdefs.h
esac
+# Check if assembler supports disabling hardware capability support.
+
+ test -z "$HWCAP_FLAGS" && HWCAP_FLAGS=''
+
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -Wa,-nH"
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for as that supports -Wa,-nH" >&5
+$as_echo_n "checking for as that supports -Wa,-nH... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ac_hwcap_flags=yes
+else
+ ac_hwcap_flags=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ if test "$ac_hwcap_flags" = "yes"; then
+ HWCAP_FLAGS="-Wa,-nH $HWCAP_FLAGS"
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_hwcap_flags" >&5
+$as_echo "$ac_hwcap_flags" >&6; }
+
+ CFLAGS="$ac_save_CFLAGS"
+
+
+
+
# Check if assembler supports rdrand opcode.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rdrand support in assembler" >&5
diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac
index c09c685e099..559a811be41 100644
--- a/libstdc++-v3/configure.ac
+++ b/libstdc++-v3/configure.ac
@@ -333,6 +333,9 @@ case "$target" in
esac
GLIBCXX_CONDITIONAL(GLIBCXX_LDBL_COMPAT, test $ac_ldbl_compat = yes)
+# Check if assembler supports disabling hardware capability support.
+GLIBCXX_CHECK_ASSEMBLER_HWCAP
+
# Check if assembler supports rdrand opcode.
GLIBCXX_CHECK_X86_RDRAND
diff --git a/libstdc++-v3/doc/Makefile.in b/libstdc++-v3/doc/Makefile.in
index 9161e69c200..9b1c7eddec1 100644
--- a/libstdc++-v3/doc/Makefile.in
+++ b/libstdc++-v3/doc/Makefile.in
@@ -146,6 +146,7 @@ FGREP = @FGREP@
GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@
GLIBCXX_LIBS = @GLIBCXX_LIBS@
GREP = @GREP@
+HWCAP_FLAGS = @HWCAP_FLAGS@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -300,7 +301,7 @@ toolexeclibdir = $(glibcxx_toolexeclibdir)
# These bits are all figured out from configure. Look in acinclude.m4
# or configure.ac to see how they are set. See GLIBCXX_EXPORT_FLAGS.
CONFIG_CXXFLAGS = \
- $(SECTION_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
+ $(SECTION_FLAGS) $(HWCAP_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
WARN_CXXFLAGS = \
$(WARN_FLAGS) $(WERROR_FLAG) -fdiagnostics-show-location=once
diff --git a/libstdc++-v3/fragment.am b/libstdc++-v3/fragment.am
index 304d39637d9..64247afbe24 100644
--- a/libstdc++-v3/fragment.am
+++ b/libstdc++-v3/fragment.am
@@ -22,7 +22,7 @@ endif
# These bits are all figured out from configure. Look in acinclude.m4
# or configure.ac to see how they are set. See GLIBCXX_EXPORT_FLAGS.
CONFIG_CXXFLAGS = \
- $(SECTION_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
+ $(SECTION_FLAGS) $(HWCAP_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
WARN_CXXFLAGS = \
$(WARN_FLAGS) $(WERROR_FLAG) -fdiagnostics-show-location=once
diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in
index c5537295ff9..eb8bd1f032b 100644
--- a/libstdc++-v3/include/Makefile.in
+++ b/libstdc++-v3/include/Makefile.in
@@ -1,9 +1,9 @@
-# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
# This Makefile.in 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.
@@ -146,6 +146,7 @@ FGREP = @FGREP@
GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@
GLIBCXX_LIBS = @GLIBCXX_LIBS@
GREP = @GREP@
+HWCAP_FLAGS = @HWCAP_FLAGS@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -290,7 +291,7 @@ toolexeclibdir = $(glibcxx_toolexeclibdir)
# These bits are all figured out from configure. Look in acinclude.m4
# or configure.ac to see how they are set. See GLIBCXX_EXPORT_FLAGS.
CONFIG_CXXFLAGS = \
- $(SECTION_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
+ $(SECTION_FLAGS) $(HWCAP_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
WARN_CXXFLAGS = \
$(WARN_FLAGS) $(WERROR_FLAG) -fdiagnostics-show-location=once
@@ -1199,7 +1200,6 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
-$(top_srcdir)/fragment.am:
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -1235,15 +1235,10 @@ install-am: all-am
installcheck: installcheck-am
install-strip:
- if test -z '$(STRIP)'; then \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
diff --git a/libstdc++-v3/include/ext/random b/libstdc++-v3/include/ext/random
index 6bb438a8558..e53204074fc 100644
--- a/libstdc++-v3/include/ext/random
+++ b/libstdc++-v3/include/ext/random
@@ -87,7 +87,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ seed(__sd); }
template<typename _Sseq, typename = typename
- std::enable_if<!std::is_same<_Sseq, simd_fast_mersenne_twister_engine>::value>
+ std::enable_if<!std::is_same<_Sseq,
+ simd_fast_mersenne_twister_engine>::value>
::type>
explicit
simd_fast_mersenne_twister_engine(_Sseq& __q)
@@ -149,7 +150,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
typename _CharT, typename _Traits>
friend std::basic_ostream<_CharT, _Traits>&
operator<<(std::basic_ostream<_CharT, _Traits>& __os,
- const __gnu_cxx::simd_fast_mersenne_twister_engine<_UIntType_2,
+ const __gnu_cxx::simd_fast_mersenne_twister_engine
+ <_UIntType_2,
__m_2, __pos1_2, __sl1_2, __sl2_2, __sr1_2, __sr2_2,
__msk1_2, __msk2_2, __msk3_2, __msk4_2,
__parity1_2, __parity2_2, __parity3_2, __parity4_2>& __x);
@@ -532,16 +534,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ this->__generate_impl(__f, __t, __urng, __p); }
/**
- * @brief Return true if two beta distributions have the same
- * parameters and the sequences that would be generated
- * are equal.
- */
- friend bool
- operator==(const beta_distribution& __d1,
- const beta_distribution& __d2)
- { return __d1.param() == __d2.param(); }
-
- /**
* @brief Inserts a %beta_distribution random number distribution
* @p __x into the output stream @p __os.
*
@@ -582,13 +574,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
};
/**
+ * @brief Return true if two beta distributions have the same
+ * parameters and the sequences that would be generated
+ * are equal.
+ */
+ template<typename _RealType>
+ inline bool
+ operator==(const __gnu_cxx::beta_distribution<_RealType>& __d1,
+ const __gnu_cxx::beta_distribution<_RealType>& __d2)
+ { return __d1.param() == __d2.param(); }
+
+ /**
* @brief Return true if two beta distributions are different.
*/
- template<typename _RealType>
- inline bool
- operator!=(const __gnu_cxx::beta_distribution<_RealType>& __d1,
- const __gnu_cxx::beta_distribution<_RealType>& __d2)
- { return !(__d1 == __d2); }
+ template<typename _RealType>
+ inline bool
+ operator!=(const __gnu_cxx::beta_distribution<_RealType>& __d1,
+ const __gnu_cxx::beta_distribution<_RealType>& __d2)
+ { return !(__d1 == __d2); }
/**
@@ -896,6 +899,248 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return !(__d1 == __d2); }
+ /**
+ * @brief A Rice continuous distribution for random numbers.
+ *
+ * The formula for the Rice probability density function is
+ * @f[
+ * p(x|\nu,\sigma) = \frac{x}{\sigma^2}
+ * \exp\left(-\frac{x^2+\nu^2}{2\sigma^2}\right)
+ * I_0\left(\frac{x \nu}{\sigma^2}\right)
+ * @f]
+ * where @f$I_0(z)@f$ is the modified Bessel function of the first kind
+ * of order 0 and @f$\nu >= 0@f$ and @f$\sigma > 0@f$.
+ *
+ * <table border=1 cellpadding=10 cellspacing=0>
+ * <caption align=top>Distribution Statistics</caption>
+ * <tr><td>Mean</td><td>@f$\sqrt{\pi/2}L_{1/2}(-\nu^2/2\sigma^2)@f$</td></tr>
+ * <tr><td>Variance</td><td>@f$2\sigma^2 + \nu^2
+ * + (\pi\sigma^2/2)L^2_{1/2}(-\nu^2/2\sigma^2)@f$</td></tr>
+ * <tr><td>Range</td><td>@f$[0, \infty)@f$</td></tr>
+ * </table>
+ * where @f$L_{1/2}(x)@f$ is the Laguerre polynomial of order 1/2.
+ */
+ template<typename _RealType = double>
+ class
+ rice_distribution
+ {
+ static_assert(std::is_floating_point<_RealType>::value,
+ "template argument not a floating point type");
+ public:
+ /** The type of the range of the distribution. */
+ typedef _RealType result_type;
+ /** Parameter type. */
+ struct param_type
+ {
+ typedef rice_distribution<result_type> distribution_type;
+
+ param_type(result_type __nu = result_type(0),
+ result_type __sigma = result_type(1))
+ : _M_nu(__nu), _M_sigma(__sigma)
+ {
+ _GLIBCXX_DEBUG_ASSERT(_M_nu >= result_type(0));
+ _GLIBCXX_DEBUG_ASSERT(_M_sigma > result_type(0));
+ }
+
+ result_type
+ nu() const
+ { return _M_nu; }
+
+ result_type
+ sigma() const
+ { return _M_sigma; }
+
+ friend bool
+ operator==(const param_type& __p1, const param_type& __p2)
+ { return __p1._M_nu == __p2._M_nu
+ && __p1._M_sigma == __p2._M_sigma; }
+
+ private:
+ void _M_initialize();
+
+ result_type _M_nu;
+ result_type _M_sigma;
+ };
+
+ /**
+ * @brief Constructors.
+ */
+ explicit
+ rice_distribution(result_type __nu = result_type(0),
+ result_type __sigma = result_type(1))
+ : _M_param(__nu, __sigma),
+ _M_ndx(__nu, __sigma),
+ _M_ndy(result_type(0), __sigma)
+ { }
+
+ explicit
+ rice_distribution(const param_type& __p)
+ : _M_param(__p),
+ _M_ndx(__p.nu(), __p.sigma()),
+ _M_ndy(result_type(0), __p.sigma())
+ { }
+
+ /**
+ * @brief Resets the distribution state.
+ */
+ void
+ reset()
+ {
+ _M_ndx.reset();
+ _M_ndy.reset();
+ }
+
+ /**
+ * @brief Return the parameters of the distribution.
+ */
+ result_type
+ nu() const
+ { return _M_param.nu(); }
+
+ result_type
+ sigma() const
+ { return _M_param.sigma(); }
+
+ /**
+ * @brief Returns the parameter set of the distribution.
+ */
+ param_type
+ param() const
+ { return _M_param; }
+
+ /**
+ * @brief Sets the parameter set of the distribution.
+ * @param __param The new parameter set of the distribution.
+ */
+ void
+ param(const param_type& __param)
+ { _M_param = __param; }
+
+ /**
+ * @brief Returns the greatest lower bound value of the distribution.
+ */
+ result_type
+ min() const
+ { return result_type(0); }
+
+ /**
+ * @brief Returns the least upper bound value of the distribution.
+ */
+ result_type
+ max() const
+ { return std::numeric_limits<result_type>::max(); }
+
+ /**
+ * @brief Generating functions.
+ */
+ template<typename _UniformRandomNumberGenerator>
+ result_type
+ operator()(_UniformRandomNumberGenerator& __urng)
+ {
+ result_type __x = this->_M_ndx(__urng);
+ result_type __y = this->_M_ndy(__urng);
+ return std::hypot(__x, __y);
+ }
+
+ template<typename _UniformRandomNumberGenerator>
+ result_type
+ operator()(_UniformRandomNumberGenerator& __urng,
+ const param_type& __p)
+ {
+ typename std::normal_distribution<result_type>::param_type
+ __px(__p.nu(), __p.sigma()), __py(result_type(0), __p.sigma());
+ result_type __x = this->_M_ndx(__px, __urng);
+ result_type __y = this->_M_ndy(__py, __urng);
+ return std::hypot(__x, __y);
+ }
+
+ template<typename _ForwardIterator,
+ typename _UniformRandomNumberGenerator>
+ void
+ __generate(_ForwardIterator __f, _ForwardIterator __t,
+ _UniformRandomNumberGenerator& __urng)
+ { this->__generate(__f, __t, __urng, this->param()); }
+
+ template<typename _ForwardIterator,
+ typename _UniformRandomNumberGenerator>
+ void
+ __generate(_ForwardIterator __f, _ForwardIterator __t,
+ _UniformRandomNumberGenerator& __urng,
+ const param_type& __p)
+ { this->__generate_impl(__f, __t, __urng, __p); }
+
+ template<typename _UniformRandomNumberGenerator>
+ void
+ __generate(result_type* __f, result_type* __t,
+ _UniformRandomNumberGenerator& __urng,
+ const param_type& __p)
+ { this->__generate_impl(__f, __t, __urng, __p); }
+
+ /**
+ * @brief Return true if two Rice distributions have
+ * the same parameters and the sequences that would
+ * be generated are equal.
+ */
+ friend bool
+ operator==(const rice_distribution& __d1,
+ const rice_distribution& __d2)
+ { return (__d1.param() == __d2.param()
+ && __d1._M_ndx == __d2._M_ndx
+ && __d1._M_ndy == __d2._M_ndy); }
+
+ /**
+ * @brief Inserts a %rice_distribution random number distribution
+ * @p __x into the output stream @p __os.
+ *
+ * @param __os An output stream.
+ * @param __x A %rice_distribution random number distribution.
+ *
+ * @returns The output stream with the state of @p __x inserted or in
+ * an error state.
+ */
+ template<typename _RealType1, typename _CharT, typename _Traits>
+ friend std::basic_ostream<_CharT, _Traits>&
+ operator<<(std::basic_ostream<_CharT, _Traits>&,
+ const rice_distribution<_RealType1>&);
+
+ /**
+ * @brief Extracts a %rice_distribution random number distribution
+ * @p __x from the input stream @p __is.
+ *
+ * @param __is An input stream.
+ * @param __x A %rice_distribution random number
+ * generator engine.
+ *
+ * @returns The input stream with @p __x extracted or in an error state.
+ */
+ template<typename _RealType1, typename _CharT, typename _Traits>
+ friend std::basic_istream<_CharT, _Traits>&
+ operator>>(std::basic_istream<_CharT, _Traits>&,
+ rice_distribution<_RealType1>&);
+
+ private:
+ template<typename _ForwardIterator,
+ typename _UniformRandomNumberGenerator>
+ void
+ __generate_impl(_ForwardIterator __f, _ForwardIterator __t,
+ _UniformRandomNumberGenerator& __urng,
+ const param_type& __p);
+
+ param_type _M_param;
+
+ std::normal_distribution<result_type> _M_ndx;
+ std::normal_distribution<result_type> _M_ndy;
+ };
+
+ /**
+ * @brief Return true if two Rice distributions are not equal.
+ */
+ template<typename _RealType1>
+ inline bool
+ operator!=(const rice_distribution<_RealType1>& __d1,
+ const rice_distribution<_RealType1>& __d2)
+ { return !(__d1 == __d2); }
+
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std
diff --git a/libstdc++-v3/include/ext/random.tcc b/libstdc++-v3/include/ext/random.tcc
index 988dc222829..24735b41120 100644
--- a/libstdc++-v3/include/ext/random.tcc
+++ b/libstdc++-v3/include/ext/random.tcc
@@ -751,6 +751,75 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
+ template<typename _RealType>
+ template<typename _OutputIterator,
+ typename _UniformRandomNumberGenerator>
+ void
+ rice_distribution<_RealType>::
+ __generate_impl(_OutputIterator __f, _OutputIterator __t,
+ _UniformRandomNumberGenerator& __urng,
+ const param_type& __p)
+ {
+ __glibcxx_function_requires(_OutputIteratorConcept<_OutputIterator>)
+
+ while (__f != __t)
+ {
+ typename std::normal_distribution<result_type>::param_type
+ __px(__p.nu(), __p.sigma()), __py(result_type(0), __p.sigma());
+ result_type __x = this->_M_ndx(__px, __urng);
+ result_type __y = this->_M_ndy(__py, __urng);
+ *__f++ = std::hypot(__x, __y);
+ }
+ }
+
+ template<typename _RealType, typename _CharT, typename _Traits>
+ std::basic_ostream<_CharT, _Traits>&
+ operator<<(std::basic_ostream<_CharT, _Traits>& __os,
+ const rice_distribution<_RealType>& __x)
+ {
+ typedef std::basic_ostream<_CharT, _Traits> __ostream_type;
+ typedef typename __ostream_type::ios_base __ios_base;
+
+ const typename __ios_base::fmtflags __flags = __os.flags();
+ const _CharT __fill = __os.fill();
+ const std::streamsize __precision = __os.precision();
+ const _CharT __space = __os.widen(' ');
+ __os.flags(__ios_base::scientific | __ios_base::left);
+ __os.fill(__space);
+ __os.precision(std::numeric_limits<_RealType>::max_digits10);
+
+ __os << __x.nu() << __space << __x.sigma();
+ __os << __space << __x._M_ndx;
+ __os << __space << __x._M_ndy;
+
+ __os.flags(__flags);
+ __os.fill(__fill);
+ __os.precision(__precision);
+ return __os;
+ }
+
+ template<typename _RealType, typename _CharT, typename _Traits>
+ std::basic_istream<_CharT, _Traits>&
+ operator>>(std::basic_istream<_CharT, _Traits>& __is,
+ rice_distribution<_RealType>& __x)
+ {
+ typedef std::basic_istream<_CharT, _Traits> __istream_type;
+ typedef typename __istream_type::ios_base __ios_base;
+
+ const typename __ios_base::fmtflags __flags = __is.flags();
+ __is.flags(__ios_base::dec | __ios_base::skipws);
+
+ _RealType __nu, __sigma;
+ __is >> __nu >> __sigma;
+ __is >> __x._M_ndx;
+ __is >> __x._M_ndy;
+ __x.param(typename rice_distribution<_RealType>::
+ param_type(__nu, __sigma));
+
+ __is.flags(__flags);
+ return __is;
+ }
+
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
diff --git a/libstdc++-v3/libsupc++/Makefile.in b/libstdc++-v3/libsupc++/Makefile.in
index 4399c3db057..fc53994a144 100644
--- a/libstdc++-v3/libsupc++/Makefile.in
+++ b/libstdc++-v3/libsupc++/Makefile.in
@@ -212,6 +212,7 @@ FGREP = @FGREP@
GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@
GLIBCXX_LIBS = @GLIBCXX_LIBS@
GREP = @GREP@
+HWCAP_FLAGS = @HWCAP_FLAGS@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -356,7 +357,7 @@ toolexeclibdir = $(glibcxx_toolexeclibdir)
# These bits are all figured out from configure. Look in acinclude.m4
# or configure.ac to see how they are set. See GLIBCXX_EXPORT_FLAGS.
CONFIG_CXXFLAGS = \
- $(SECTION_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
+ $(SECTION_FLAGS) $(HWCAP_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
WARN_CXXFLAGS = \
$(WARN_FLAGS) $(WERROR_FLAG) -fdiagnostics-show-location=once
diff --git a/libstdc++-v3/libsupc++/guard.cc b/libstdc++-v3/libsupc++/guard.cc
index 60165cdecb4..f8550c03fae 100644
--- a/libstdc++-v3/libsupc++/guard.cc
+++ b/libstdc++-v3/libsupc++/guard.cc
@@ -253,7 +253,7 @@ namespace __cxxabiv1
int expected(0);
if (__atomic_compare_exchange_n(gi, &expected, pending_bit, false,
__ATOMIC_ACQ_REL,
- __ATOMIC_RELAXED))
+ __ATOMIC_ACQUIRE))
{
// This thread should do the initialization.
return 1;
diff --git a/libstdc++-v3/po/Makefile.in b/libstdc++-v3/po/Makefile.in
index 4dbaea1c15a..a03bd3829a1 100644
--- a/libstdc++-v3/po/Makefile.in
+++ b/libstdc++-v3/po/Makefile.in
@@ -146,6 +146,7 @@ FGREP = @FGREP@
GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@
GLIBCXX_LIBS = @GLIBCXX_LIBS@
GREP = @GREP@
+HWCAP_FLAGS = @HWCAP_FLAGS@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -290,7 +291,7 @@ toolexeclibdir = $(glibcxx_toolexeclibdir)
# These bits are all figured out from configure. Look in acinclude.m4
# or configure.ac to see how they are set. See GLIBCXX_EXPORT_FLAGS.
CONFIG_CXXFLAGS = \
- $(SECTION_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
+ $(SECTION_FLAGS) $(HWCAP_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
WARN_CXXFLAGS = \
$(WARN_FLAGS) $(WERROR_FLAG) -fdiagnostics-show-location=once
diff --git a/libstdc++-v3/python/Makefile.in b/libstdc++-v3/python/Makefile.in
index 9467c70494f..cf5d87116db 100644
--- a/libstdc++-v3/python/Makefile.in
+++ b/libstdc++-v3/python/Makefile.in
@@ -176,6 +176,7 @@ FGREP = @FGREP@
GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@
GLIBCXX_LIBS = @GLIBCXX_LIBS@
GREP = @GREP@
+HWCAP_FLAGS = @HWCAP_FLAGS@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -320,7 +321,7 @@ toolexeclibdir = $(glibcxx_toolexeclibdir)
# These bits are all figured out from configure. Look in acinclude.m4
# or configure.ac to see how they are set. See GLIBCXX_EXPORT_FLAGS.
CONFIG_CXXFLAGS = \
- $(SECTION_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
+ $(SECTION_FLAGS) $(HWCAP_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
WARN_CXXFLAGS = \
$(WARN_FLAGS) $(WERROR_FLAG) -fdiagnostics-show-location=once
diff --git a/libstdc++-v3/src/Makefile.in b/libstdc++-v3/src/Makefile.in
index f797d19b7f8..8dbabc36949 100644
--- a/libstdc++-v3/src/Makefile.in
+++ b/libstdc++-v3/src/Makefile.in
@@ -205,6 +205,7 @@ FGREP = @FGREP@
GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@
GLIBCXX_LIBS = @GLIBCXX_LIBS@
GREP = @GREP@
+HWCAP_FLAGS = @HWCAP_FLAGS@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -349,7 +350,7 @@ toolexeclibdir = $(glibcxx_toolexeclibdir)
# These bits are all figured out from configure. Look in acinclude.m4
# or configure.ac to see how they are set. See GLIBCXX_EXPORT_FLAGS.
CONFIG_CXXFLAGS = \
- $(SECTION_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
+ $(SECTION_FLAGS) $(HWCAP_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
WARN_CXXFLAGS = \
$(WARN_FLAGS) $(WERROR_FLAG) -fdiagnostics-show-location=once
diff --git a/libstdc++-v3/src/c++11/Makefile.in b/libstdc++-v3/src/c++11/Makefile.in
index af26eaf002d..1d265760569 100644
--- a/libstdc++-v3/src/c++11/Makefile.in
+++ b/libstdc++-v3/src/c++11/Makefile.in
@@ -1,9 +1,9 @@
-# Makefile.in generated by automake 1.11.6 from Makefile.am.
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
# This Makefile.in 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.
@@ -163,6 +163,7 @@ FGREP = @FGREP@
GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@
GLIBCXX_LIBS = @GLIBCXX_LIBS@
GREP = @GREP@
+HWCAP_FLAGS = @HWCAP_FLAGS@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -307,7 +308,7 @@ toolexeclibdir = $(glibcxx_toolexeclibdir)
# These bits are all figured out from configure. Look in acinclude.m4
# or configure.ac to see how they are set. See GLIBCXX_EXPORT_FLAGS.
CONFIG_CXXFLAGS = \
- $(SECTION_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
+ $(SECTION_FLAGS) $(HWCAP_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
WARN_CXXFLAGS = \
$(WARN_FLAGS) $(WERROR_FLAG) -fdiagnostics-show-location=once
@@ -427,7 +428,6 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
-$(top_srcdir)/fragment.am:
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -446,7 +446,7 @@ clean-noinstLTLIBRARIES:
echo "rm -f \"$${dir}/so_locations\""; \
rm -f "$${dir}/so_locations"; \
done
-libc++11convenience.la: $(libc__11convenience_la_OBJECTS) $(libc__11convenience_la_DEPENDENCIES) $(EXTRA_libc__11convenience_la_DEPENDENCIES)
+libc++11convenience.la: $(libc__11convenience_la_OBJECTS) $(libc__11convenience_la_DEPENDENCIES)
$(CXXLINK) $(libc__11convenience_la_OBJECTS) $(libc__11convenience_la_LIBADD) $(LIBS)
mostlyclean-compile:
@@ -535,15 +535,10 @@ install-am: all-am
installcheck: installcheck-am
install-strip:
- if test -z '$(STRIP)'; then \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- install; \
- else \
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
- "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
- fi
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
diff --git a/libstdc++-v3/src/c++11/random.cc b/libstdc++-v3/src/c++11/random.cc
index 4342df4d546..9280e15089f 100644
--- a/libstdc++-v3/src/c++11/random.cc
+++ b/libstdc++-v3/src/c++11/random.cc
@@ -24,6 +24,8 @@
#include <random>
+#ifdef _GLIBCXX_USE_C99_STDINT_TR1
+
#if defined __i386__ || defined __x86_64__
# include <cpuid.h>
#endif
@@ -142,5 +144,5 @@ namespace std _GLIBCXX_VISIBILITY(default)
0xffffffffUL, 7,
0x9d2c5680UL, 15,
0xefc60000UL, 18, 1812433253UL>;
-
}
+#endif
diff --git a/libstdc++-v3/src/c++98/Makefile.in b/libstdc++-v3/src/c++98/Makefile.in
index 2ee02719c44..be5781e0f5d 100644
--- a/libstdc++-v3/src/c++98/Makefile.in
+++ b/libstdc++-v3/src/c++98/Makefile.in
@@ -178,6 +178,7 @@ FGREP = @FGREP@
GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@
GLIBCXX_LIBS = @GLIBCXX_LIBS@
GREP = @GREP@
+HWCAP_FLAGS = @HWCAP_FLAGS@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -322,7 +323,7 @@ toolexeclibdir = $(glibcxx_toolexeclibdir)
# These bits are all figured out from configure. Look in acinclude.m4
# or configure.ac to see how they are set. See GLIBCXX_EXPORT_FLAGS.
CONFIG_CXXFLAGS = \
- $(SECTION_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
+ $(SECTION_FLAGS) $(HWCAP_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
WARN_CXXFLAGS = \
$(WARN_FLAGS) $(WERROR_FLAG) -fdiagnostics-show-location=once
diff --git a/libstdc++-v3/testsuite/Makefile.in b/libstdc++-v3/testsuite/Makefile.in
index e919747e734..b33cdf15bc9 100644
--- a/libstdc++-v3/testsuite/Makefile.in
+++ b/libstdc++-v3/testsuite/Makefile.in
@@ -146,6 +146,7 @@ FGREP = @FGREP@
GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@
GLIBCXX_LIBS = @GLIBCXX_LIBS@
GREP = @GREP@
+HWCAP_FLAGS = @HWCAP_FLAGS@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
@@ -293,7 +294,7 @@ toolexeclibdir = $(glibcxx_toolexeclibdir)
# These bits are all figured out from configure. Look in acinclude.m4
# or configure.ac to see how they are set. See GLIBCXX_EXPORT_FLAGS.
CONFIG_CXXFLAGS = \
- $(SECTION_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
+ $(SECTION_FLAGS) $(HWCAP_FLAGS) $(EXTRA_CXX_FLAGS) -frandom-seed=$@
WARN_CXXFLAGS = \
$(WARN_FLAGS) $(WERROR_FLAG) -fdiagnostics-show-location=once
diff --git a/libstdc++-v3/testsuite/26_numerics/random/beta_distribution/cons/default.cc b/libstdc++-v3/testsuite/ext/random/beta_distribution/cons/default.cc
index 3aa2d851e98..3aa2d851e98 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/beta_distribution/cons/default.cc
+++ b/libstdc++-v3/testsuite/ext/random/beta_distribution/cons/default.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/beta_distribution/cons/parms.cc b/libstdc++-v3/testsuite/ext/random/beta_distribution/cons/parms.cc
index 9d6c0b18da7..9d6c0b18da7 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/beta_distribution/cons/parms.cc
+++ b/libstdc++-v3/testsuite/ext/random/beta_distribution/cons/parms.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/beta_distribution/operators/equal.cc b/libstdc++-v3/testsuite/ext/random/beta_distribution/operators/equal.cc
index a31a6545d53..a31a6545d53 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/beta_distribution/operators/equal.cc
+++ b/libstdc++-v3/testsuite/ext/random/beta_distribution/operators/equal.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/beta_distribution/operators/inequal.cc b/libstdc++-v3/testsuite/ext/random/beta_distribution/operators/inequal.cc
index d7eda3935bf..d7eda3935bf 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/beta_distribution/operators/inequal.cc
+++ b/libstdc++-v3/testsuite/ext/random/beta_distribution/operators/inequal.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/beta_distribution/operators/serialize.cc b/libstdc++-v3/testsuite/ext/random/beta_distribution/operators/serialize.cc
index dd2fed8d590..dd2fed8d590 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/beta_distribution/operators/serialize.cc
+++ b/libstdc++-v3/testsuite/ext/random/beta_distribution/operators/serialize.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/beta_distribution/requirements/explicit_instantiation/1.cc b/libstdc++-v3/testsuite/ext/random/beta_distribution/requirements/explicit_instantiation/1.cc
index a572b1478ae..a572b1478ae 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/beta_distribution/requirements/explicit_instantiation/1.cc
+++ b/libstdc++-v3/testsuite/ext/random/beta_distribution/requirements/explicit_instantiation/1.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/beta_distribution/requirements/typedefs.cc b/libstdc++-v3/testsuite/ext/random/beta_distribution/requirements/typedefs.cc
index 33b18ae535c..33b18ae535c 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/beta_distribution/requirements/typedefs.cc
+++ b/libstdc++-v3/testsuite/ext/random/beta_distribution/requirements/typedefs.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/cons/default.cc b/libstdc++-v3/testsuite/ext/random/normal_mv_distribution/cons/default.cc
index a51fde40f03..a51fde40f03 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/cons/default.cc
+++ b/libstdc++-v3/testsuite/ext/random/normal_mv_distribution/cons/default.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/cons/parms.cc b/libstdc++-v3/testsuite/ext/random/normal_mv_distribution/cons/parms.cc
index d12722183e1..d12722183e1 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/cons/parms.cc
+++ b/libstdc++-v3/testsuite/ext/random/normal_mv_distribution/cons/parms.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/operators/equal.cc b/libstdc++-v3/testsuite/ext/random/normal_mv_distribution/operators/equal.cc
index 99b75817947..99b75817947 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/operators/equal.cc
+++ b/libstdc++-v3/testsuite/ext/random/normal_mv_distribution/operators/equal.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/operators/inequal.cc b/libstdc++-v3/testsuite/ext/random/normal_mv_distribution/operators/inequal.cc
index 80472a13214..80472a13214 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/operators/inequal.cc
+++ b/libstdc++-v3/testsuite/ext/random/normal_mv_distribution/operators/inequal.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/operators/serialize.cc b/libstdc++-v3/testsuite/ext/random/normal_mv_distribution/operators/serialize.cc
index 3620a9b12bc..3620a9b12bc 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/operators/serialize.cc
+++ b/libstdc++-v3/testsuite/ext/random/normal_mv_distribution/operators/serialize.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/requirements/explicit_instantiation/1.cc b/libstdc++-v3/testsuite/ext/random/normal_mv_distribution/requirements/explicit_instantiation/1.cc
index 55c4431a972..55c4431a972 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/requirements/explicit_instantiation/1.cc
+++ b/libstdc++-v3/testsuite/ext/random/normal_mv_distribution/requirements/explicit_instantiation/1.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/requirements/typedefs.cc b/libstdc++-v3/testsuite/ext/random/normal_mv_distribution/requirements/typedefs.cc
index 4a0a14c9020..4a0a14c9020 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/normal_mv_distribution/requirements/typedefs.cc
+++ b/libstdc++-v3/testsuite/ext/random/normal_mv_distribution/requirements/typedefs.cc
diff --git a/libstdc++-v3/testsuite/ext/random/rice_distribution/cons/default.cc b/libstdc++-v3/testsuite/ext/random/rice_distribution/cons/default.cc
new file mode 100644
index 00000000000..3a49140fcb9
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/random/rice_distribution/cons/default.cc
@@ -0,0 +1,47 @@
+// { dg-options "-std=c++0x" }
+// { dg-require-cstdint "" }
+//
+// 2012-01-28 Edward M. Smith-Rowland <3dw4rd@verizon.net>
+//
+// Copyright (C) 2012 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 3, 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 COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// 26.4.8.3.* Class template rice_distribution [rand.dist.ext.rice]
+// 26.4.2.4 Concept RandomNumberDistribution [rand.concept.dist]
+
+#include <ext/random>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ __gnu_cxx::rice_distribution<> u;
+ VERIFY( u.nu() == 0.0 );
+ VERIFY( u.sigma() == 1.0 );
+ VERIFY( u.min() == 0.0 );
+ typedef __gnu_cxx::rice_distribution<>::result_type result_type;
+ VERIFY( u.max() == std::numeric_limits<result_type>::max() );
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/ext/random/rice_distribution/cons/parms.cc b/libstdc++-v3/testsuite/ext/random/rice_distribution/cons/parms.cc
new file mode 100644
index 00000000000..fa79ef521ae
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/random/rice_distribution/cons/parms.cc
@@ -0,0 +1,47 @@
+// { dg-options "-std=c++0x" }
+// { dg-require-cstdint "" }
+//
+// 2012-01-28 Edward M. Smith-Rowland <3dw4rd@verizon.net>
+//
+// Copyright (C) 2012 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 3, 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 COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// 26.4.8.3.* Class template rice_distribution [rand.dist.ext.rice]
+// 26.4.2.4 Concept RandomNumberDistribution [rand.concept.dist]
+
+#include <ext/random>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ __gnu_cxx::rice_distribution<> u(1.5, 3.0);
+ VERIFY( u.nu() == 1.5 );
+ VERIFY( u.sigma() == 3.0 );
+ VERIFY( u.min() == 0.0 );
+ typedef __gnu_cxx::rice_distribution<>::result_type result_type;
+ VERIFY( u.max() == std::numeric_limits<result_type>::max() );
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/ext/random/rice_distribution/operators/equal.cc b/libstdc++-v3/testsuite/ext/random/rice_distribution/operators/equal.cc
new file mode 100644
index 00000000000..2539d6ed42b
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/random/rice_distribution/operators/equal.cc
@@ -0,0 +1,44 @@
+// { dg-options "-std=c++0x" }
+// { dg-require-cstdint "" }
+//
+// 2012-01-28 Edward M. Smith-Rowland <3dw4rd@verizon.net>
+//
+// Copyright (C) 2012 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 3, 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 COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// 26.5.8.4.5 Class template rice_distribution [rand.dist.ext.rice]
+
+#include <ext/random>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ __gnu_cxx::rice_distribution<double> u(2.0, 3.0), v, w;
+
+ VERIFY( v == w );
+ VERIFY( !(u == v) );
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/ext/random/rice_distribution/operators/inequal.cc b/libstdc++-v3/testsuite/ext/random/rice_distribution/operators/inequal.cc
new file mode 100644
index 00000000000..a3f15124af9
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/random/rice_distribution/operators/inequal.cc
@@ -0,0 +1,44 @@
+// { dg-options "-std=c++0x" }
+// { dg-require-cstdint "" }
+//
+// 2012-01-28 Edward M. Smith-Rowland <3dw4rd@verizon.net>
+//
+// Copyright (C) 2012 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 3, 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 COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// 26.5.8.4.5 Class template rice_distribution [rand.dist.ext.rice]
+
+#include <ext/random>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ __gnu_cxx::rice_distribution<double> u(2.0, 3.0), v, w;
+
+ VERIFY( u != v );
+ VERIFY( !(v != w) );
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/ext/random/rice_distribution/operators/serialize.cc b/libstdc++-v3/testsuite/ext/random/rice_distribution/operators/serialize.cc
new file mode 100644
index 00000000000..9d39c3098e5
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/random/rice_distribution/operators/serialize.cc
@@ -0,0 +1,51 @@
+// { dg-options "-std=c++0x" }
+// { dg-require-cstdint "" }
+//
+// 2012-01-28 Edward M. Smith-Rowland <3dw4rd@verizon.net>
+//
+// Copyright (C) 2012 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 3, 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 COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// 26.4.8.3.* Class template rice_distribution [rand.dist.ext.rice]
+// 26.4.2.4 Concept RandomNumberDistribution [rand.concept.dist]
+
+#include <ext/random>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ std::stringstream str;
+ __gnu_cxx::rice_distribution<double> u(1.5, 3.0), v;
+ std::minstd_rand0 rng;
+
+ u(rng); // advance
+ str << u;
+
+ str >> v;
+ VERIFY( u == v );
+}
+
+int
+main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/ext/random/rice_distribution/requirements/explicit_instantiation/1.cc b/libstdc++-v3/testsuite/ext/random/rice_distribution/requirements/explicit_instantiation/1.cc
new file mode 100644
index 00000000000..2026c9ec51d
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/random/rice_distribution/requirements/explicit_instantiation/1.cc
@@ -0,0 +1,26 @@
+// { dg-do compile }
+// { dg-options "-std=c++11" }
+// { dg-require-cstdint "" }
+//
+// Copyright (C) 2012 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 3, 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 COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <ext/random>
+
+template class __gnu_cxx::rice_distribution<float>;
+template class __gnu_cxx::rice_distribution<double>;
+template class __gnu_cxx::rice_distribution<long double>;
diff --git a/libstdc++-v3/testsuite/ext/random/rice_distribution/requirements/typedefs.cc b/libstdc++-v3/testsuite/ext/random/rice_distribution/requirements/typedefs.cc
new file mode 100644
index 00000000000..b524a7b5aa3
--- /dev/null
+++ b/libstdc++-v3/testsuite/ext/random/rice_distribution/requirements/typedefs.cc
@@ -0,0 +1,36 @@
+// { dg-do compile }
+// { dg-options "-std=c++0x" }
+// { dg-require-cstdint "" }
+//
+// 2012-01-28 Edward M. Smith-Rowland <3dw4rd@verizon.net>
+//
+// Copyright (C) 2012 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 3, 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 COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// 26.4.8.3.* Class template rice_distribution [rand.dist.ext.rice]
+// 26.4.2.4 Concept RandomNumberDistribution [rand.concept.dist]
+
+#include <ext/random>
+
+void
+test01()
+{
+ typedef __gnu_cxx::rice_distribution<double> test_type;
+
+ typedef test_type::result_type result_type;
+ typedef test_type::param_type param_type;
+}
diff --git a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/cons/copy.cc b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/copy.cc
index 8371f4628fa..8371f4628fa 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/cons/copy.cc
+++ b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/copy.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/cons/default.cc b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/default.cc
index 5b6489a4028..5b6489a4028 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/cons/default.cc
+++ b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/default.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/cons/seed1.cc b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/seed1.cc
index 1926958ea4e..1926958ea4e 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/cons/seed1.cc
+++ b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/seed1.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/cons/seed2.cc b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/seed2.cc
index 464512c4521..464512c4521 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/cons/seed2.cc
+++ b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/seed2.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/cons/seed_seq.cc b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/seed_seq.cc
index 4820fa493d9..4820fa493d9 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/cons/seed_seq.cc
+++ b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/cons/seed_seq.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/operators/equal.cc b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/operators/equal.cc
index 80022a68d89..80022a68d89 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/operators/equal.cc
+++ b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/operators/equal.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/operators/inequal.cc b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/operators/inequal.cc
index 15aaf127814..15aaf127814 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/operators/inequal.cc
+++ b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/operators/inequal.cc
diff --git a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/operators/serialize.cc b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/operators/serialize.cc
index ddc62b5605e..ddc62b5605e 100644
--- a/libstdc++-v3/testsuite/26_numerics/random/simd_fast_mersenne_twister_engine/operators/serialize.cc
+++ b/libstdc++-v3/testsuite/ext/random/simd_fast_mersenne_twister_engine/operators/serialize.cc
diff --git a/libtool.m4 b/libtool.m4
index a7f99ac7dbc..8a14e2b22f9 100644
--- a/libtool.m4
+++ b/libtool.m4
@@ -3580,6 +3580,7 @@ m4_if([$1], [CXX], [
# AIX 5 now supports IA64 processor
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
fi
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
;;
amigaos*)
@@ -3891,6 +3892,7 @@ m4_if([$1], [CXX], [
# AIX 5 now supports IA64 processor
_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
fi
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
;;
amigaos*)
diff --git a/lto-plugin/ChangeLog b/lto-plugin/ChangeLog
index 75c14055b94..c8ed0f3f6e7 100644
--- a/lto-plugin/ChangeLog
+++ b/lto-plugin/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
2012-05-29 Joseph Myers <joseph@codesourcery.com>
* lto-plugin.c: Fix typo.
diff --git a/lto-plugin/configure b/lto-plugin/configure
index a119f1dc1bc..77f2d61b384 100755
--- a/lto-plugin/configure
+++ b/lto-plugin/configure
@@ -7608,6 +7608,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
fi
+ lt_prog_compiler_pic='-fPIC'
;;
amigaos*)
@@ -10554,7 +10555,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 10557 "configure"
+#line 10558 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -10660,7 +10661,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 10663 "configure"
+#line 10664 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
diff --git a/zlib/ChangeLog.gcj b/zlib/ChangeLog.gcj
index b2c00395077..74e6155f539 100644
--- a/zlib/ChangeLog.gcj
+++ b/zlib/ChangeLog.gcj
@@ -1,3 +1,7 @@
+2012-09-14 David Edelsohn <dje.gcc@gmail.com>
+
+ * configure: Regenerated.
+
2012-05-16 H.J. Lu <hongjiu.lu@intel.com>
* configure: Regenerated.
diff --git a/zlib/Makefile.in b/zlib/Makefile.in
index b8d7a857c0b..4d4d1e484ff 100644
--- a/zlib/Makefile.in
+++ b/zlib/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.5 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
diff --git a/zlib/aclocal.m4 b/zlib/aclocal.m4
index 3e7b9754f23..fab04ed5c47 100644
--- a/zlib/aclocal.m4
+++ b/zlib/aclocal.m4
@@ -1,4 +1,4 @@
-# generated automatically by aclocal 1.11.5 -*- Autoconf -*-
+# generated automatically by aclocal 1.11.6 -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
@@ -38,7 +38,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
[am__api_version='1.11'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro.
-m4_if([$1], [1.11.5], [],
+m4_if([$1], [1.11.6], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
@@ -54,7 +54,7 @@ m4_define([_AM_AUTOCONF_VERSION], [])
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.5])dnl
+[AM_AUTOMAKE_VERSION([1.11.6])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
diff --git a/zlib/configure b/zlib/configure
index 8d51eec30ec..38b3b25e720 100755
--- a/zlib/configure
+++ b/zlib/configure
@@ -7423,6 +7423,7 @@ $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
# AIX 5 now supports IA64 processor
lt_prog_compiler_static='-Bstatic'
fi
+ lt_prog_compiler_pic='-fPIC'
;;
amigaos*)
@@ -10396,7 +10397,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 10399 "configure"
+#line 10400 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -10502,7 +10503,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 10505 "configure"
+#line 10506 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H