diff options
author | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-09-17 05:30:37 +0000 |
---|---|---|
committer | bstarynk <bstarynk@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-09-17 05:30:37 +0000 |
commit | 51d619308377f16a8ff13df95becfe2282198844 (patch) | |
tree | 21b147aea83b41c5c37fba84ea32c18f1c7de253 | |
parent | 9b39d7e80300d4a7fc3399d0896881027479b72a (diff) | |
download | gcc-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
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, ¶ms, @@ -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 Binary files differnew file mode 100644 index 00000000000..90f38f4b8bb --- /dev/null +++ b/libjava/testsuite/libjava.lang/sourcelocation.jar 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 |