From c257e4c69fa5749f65d4348aa34cf2b1dd888bbb Mon Sep 17 00:00:00 2001 From: "(no author)" <(no author)@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Fri, 8 Oct 2004 20:22:32 +0000 Subject: This commit was manufactured by cvs2svn to create tag 'immuse-rewrite-start'. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/tags/immuse-rewrite-start@88792 138bc75d-0d04-0410-961f-82ee72b054a4 --- ChangeLog | 9 + MAINTAINERS | 21 +- gcc/ChangeLog | 348 ++ gcc/Makefile.in | 1 + gcc/builtins.c | 152 +- gcc/c-ppoutput.c | 2 +- gcc/c-typeck.c | 336 +- gcc/cfghooks.c | 8 + gcc/cfgloopmanip.c | 10 +- gcc/config/i386/scodbx.h | 84 - gcc/config/i386/xm-dgux.h | 4 - gcc/config/i386/xm-sun.h | 21 - gcc/config/i386/xm-sysv3.h | 3 - gcc/config/ia64/ia64-protos.h | 1 + gcc/config/ia64/ia64.c | 34 +- gcc/config/ia64/ia64.h | 10 +- gcc/config/m32r/m32r.c | 4 +- gcc/config/m32r/m32r.h | 7 +- gcc/config/mips/mips.c | 39 + gcc/config/mips/mips.md | 3 +- gcc/config/pa/pa.h | 3 +- gcc/config/rs6000/altivec.md | 209 +- gcc/config/rs6000/rs6000-protos.h | 1 + gcc/config/rs6000/rs6000.c | 299 +- gcc/config/rs6000/sysv4.h | 4 +- gcc/config/s390/s390-protos.h | 3 +- gcc/config/s390/s390.c | 158 +- gcc/config/s390/s390.h | 18 +- gcc/config/s390/s390.md | 352 +- gcc/config/s390/tpf.h | 8 +- gcc/config/sh/sh.c | 4 +- gcc/config/sh/sh.md | 44 +- gcc/config/sh/symbian.c | 3 +- gcc/config/sparc/sparc.c | 64 +- gcc/cp/ChangeLog | 97 + gcc/cp/call.c | 2 +- gcc/cp/class.c | 137 +- gcc/cp/cp-tree.h | 26 +- gcc/cp/decl.c | 3 +- gcc/cp/decl2.c | 8 +- gcc/cp/init.c | 12 +- gcc/cp/parser.c | 8 +- gcc/cp/pt.c | 524 +-- gcc/cp/search.c | 404 ++- gcc/cp/semantics.c | 1 + gcc/dbxout.c | 26 +- gcc/defaults.h | 10 - gcc/doc/install.texi | 2 +- gcc/doc/tm.texi | 7 - gcc/dwarf2.h | 200 +- gcc/dwarf2out.c | 12 +- gcc/expmed.c | 5 + gcc/fortran/ChangeLog | 34 + gcc/fortran/primary.c | 36 +- gcc/fortran/resolve.c | 4 +- gcc/fortran/simplify.c | 122 +- gcc/fortran/trans-array.c | 4 +- gcc/fortran/trans-stmt.c | 152 +- gcc/function.c | 8 +- gcc/hooks.c | 12 - gcc/hooks.h | 2 - gcc/lambda-code.c | 348 +- gcc/libgcc2.c | 2 +- gcc/loop-doloop.c | 47 +- gcc/loop-iv.c | 2 +- gcc/po/ChangeLog | 8 + gcc/po/de.po | 222 +- gcc/po/gcc.pot | 3438 ++++++++++---------- gcc/rtl.h | 4 + gcc/system.h | 2 +- gcc/testsuite/ChangeLog | 105 +- gcc/testsuite/g++.dg/ext/asm6.C | 11 + gcc/testsuite/g++.dg/warn/Winline-4.C | 17 + gcc/testsuite/gcc.c-torture/compile/20041007-1.c | 16 + gcc/testsuite/gcc.c-torture/compile/acc1.c | 21 + gcc/testsuite/gcc.dg/20011119-1.c | 2 +- gcc/testsuite/gcc.dg/Wconversion-2.c | 64 + gcc/testsuite/gcc.dg/assign-warn-1.c | 123 + gcc/testsuite/gcc.dg/assign-warn-2.c | 124 + gcc/testsuite/gcc.dg/cpp/ident-1.c | 7 + gcc/testsuite/gcc.dg/darwin-abi-2.c | 1 + gcc/testsuite/gcc.dg/darwin-longdouble.c | 2 + gcc/testsuite/gcc.dg/doloop-2.c | 19 + gcc/testsuite/gcc.dg/func-args-1.c | 53 + gcc/testsuite/gcc.dg/noncompile/20020213-1.c | 10 +- gcc/testsuite/gcc.dg/ppc-fsel-1.c | 4 +- gcc/testsuite/gcc.dg/ppc-fsel-3.c | 11 + gcc/testsuite/gcc.dg/ultrasp11.c | 25 + gcc/testsuite/gcc.dg/warn-1.c | 2 +- gcc/testsuite/gfortran.dg/do_1.f90 | 80 + gcc/testsuite/gfortran.dg/empty_format_1.f90 | 21 + gcc/testsuite/gfortran.dg/intrinsic_verify_1.f90 | 12 + gcc/testsuite/gfortran.dg/ishft.f90 | 59 + gcc/testsuite/gfortran.dg/use_allocated_1.f90 | 18 + .../gfortran.fortran-torture/compile/nested.f90 | 23 + .../execute/intrinsic_mvbits.f90 | 5 + .../execute/intrinsic_pack.f90 | 3 +- gcc/testsuite/objc.dg/method-9.m | 2 +- gcc/tree-cfg.c | 102 +- gcc/tree-flow-inline.h | 2 - gcc/tree-flow.h | 3 +- gcc/tree-inline.c | 3 +- gcc/tree-nested.c | 15 +- gcc/tree-pretty-print.c | 20 +- gcc/tree-ssa-loop-ivopts.c | 2 +- gcc/tree-ssa-pre.c | 2 +- gcc/tree-tailcall.c | 34 +- gcc/version.c | 2 +- include/ChangeLog | 6 + include/xtensa-config.h | 15 +- libcpp/ChangeLog | 6 + libcpp/pch.c | 6 +- libgfortran/ChangeLog | 15 + libgfortran/intrinsics/string_intrinsics.c | 5 +- libgfortran/io/transfer.c | 7 +- libgfortran/io/unix.c | 1 + libobjc/ChangeLog | 5 + libobjc/archive.c | 104 +- libstdc++-v3/ChangeLog | 72 + libstdc++-v3/Makefile.in | 2 + libstdc++-v3/acinclude.m4 | 5 + libstdc++-v3/configure | 29 +- libstdc++-v3/configure.ac | 1 - libstdc++-v3/include/Makefile.am | 21 +- libstdc++-v3/include/Makefile.in | 22 +- libstdc++-v3/include/bits/c++config | 2 +- libstdc++-v3/include/bits/list.tcc | 5 +- libstdc++-v3/include/bits/stl_tree.h | 3 +- libstdc++-v3/include/ext/array_allocator.h | 141 + libstdc++-v3/include/tr1/array | 200 ++ libstdc++-v3/libmath/Makefile.in | 2 + libstdc++-v3/libsupc++/Makefile.in | 2 + libstdc++-v3/po/Makefile.in | 2 + libstdc++-v3/scripts/create_testsuite_files | 17 +- libstdc++-v3/src/Makefile.in | 2 + libstdc++-v3/src/mt_allocator.cc | 4 +- libstdc++-v3/testsuite/Makefile.am | 12 +- libstdc++-v3/testsuite/Makefile.in | 11 +- libstdc++-v3/testsuite/ext/array_allocator/1.cc | 65 + libstdc++-v3/testsuite/ext/array_allocator/2.cc | 72 + .../ext/mt_allocator/deallocate_global-1.cc | 75 - .../ext/mt_allocator/deallocate_global-3.cc | 75 - .../ext/mt_allocator/deallocate_global_thread-1.cc | 75 + .../ext/mt_allocator/deallocate_global_thread-3.cc | 75 + .../ext/mt_allocator/deallocate_local-1.cc | 78 - .../ext/mt_allocator/deallocate_local-3.cc | 78 - .../ext/mt_allocator/deallocate_local_thread-1.cc | 78 + .../ext/mt_allocator/deallocate_local_thread-3.cc | 78 + .../testsuite/ext/mt_allocator/instantiate.cc | 6 +- libstdc++-v3/testsuite/lib/libstdc++.exp | 11 +- libstdc++-v3/testsuite/thread/pthread1.cc | 4 - libstdc++-v3/testsuite/thread/pthread2.cc | 5 - libstdc++-v3/testsuite/thread/pthread3.cc | 5 - libstdc++-v3/testsuite/thread/pthread4.cc | 4 - libstdc++-v3/testsuite/thread/pthread5.cc | 4 - libstdc++-v3/testsuite/thread/pthread6.cc | 5 - libstdc++-v3/testsuite/thread/pthread7-rope.cc | 14 +- 157 files changed, 6940 insertions(+), 3815 deletions(-) delete mode 100644 gcc/config/i386/scodbx.h delete mode 100644 gcc/config/i386/xm-dgux.h delete mode 100644 gcc/config/i386/xm-sun.h delete mode 100644 gcc/config/i386/xm-sysv3.h create mode 100644 gcc/testsuite/g++.dg/ext/asm6.C create mode 100644 gcc/testsuite/g++.dg/warn/Winline-4.C create mode 100644 gcc/testsuite/gcc.c-torture/compile/20041007-1.c create mode 100644 gcc/testsuite/gcc.c-torture/compile/acc1.c create mode 100644 gcc/testsuite/gcc.dg/Wconversion-2.c create mode 100644 gcc/testsuite/gcc.dg/assign-warn-1.c create mode 100644 gcc/testsuite/gcc.dg/assign-warn-2.c create mode 100644 gcc/testsuite/gcc.dg/cpp/ident-1.c create mode 100644 gcc/testsuite/gcc.dg/doloop-2.c create mode 100644 gcc/testsuite/gcc.dg/func-args-1.c create mode 100644 gcc/testsuite/gcc.dg/ppc-fsel-3.c create mode 100644 gcc/testsuite/gcc.dg/ultrasp11.c create mode 100644 gcc/testsuite/gfortran.dg/do_1.f90 create mode 100644 gcc/testsuite/gfortran.dg/empty_format_1.f90 create mode 100644 gcc/testsuite/gfortran.dg/intrinsic_verify_1.f90 create mode 100644 gcc/testsuite/gfortran.dg/ishft.f90 create mode 100644 gcc/testsuite/gfortran.dg/use_allocated_1.f90 create mode 100644 gcc/testsuite/gfortran.fortran-torture/compile/nested.f90 create mode 100644 libstdc++-v3/include/ext/array_allocator.h create mode 100644 libstdc++-v3/include/tr1/array create mode 100644 libstdc++-v3/testsuite/ext/array_allocator/1.cc create mode 100644 libstdc++-v3/testsuite/ext/array_allocator/2.cc delete mode 100644 libstdc++-v3/testsuite/ext/mt_allocator/deallocate_global-1.cc delete mode 100644 libstdc++-v3/testsuite/ext/mt_allocator/deallocate_global-3.cc create mode 100644 libstdc++-v3/testsuite/ext/mt_allocator/deallocate_global_thread-1.cc create mode 100644 libstdc++-v3/testsuite/ext/mt_allocator/deallocate_global_thread-3.cc delete mode 100644 libstdc++-v3/testsuite/ext/mt_allocator/deallocate_local-1.cc delete mode 100644 libstdc++-v3/testsuite/ext/mt_allocator/deallocate_local-3.cc create mode 100644 libstdc++-v3/testsuite/ext/mt_allocator/deallocate_local_thread-1.cc create mode 100644 libstdc++-v3/testsuite/ext/mt_allocator/deallocate_local_thread-3.cc diff --git a/ChangeLog b/ChangeLog index 6aa769d8248..7bbbb85e421 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2004-10-07 J"orn Rennecke + + * MAINTAINERS: Update my email address. + +2004-10-07 Kazu Hirata + + * MAINTAINERS (Language Front Ends Maintainers): New. Move + entries belonging to this category. + 2004-10-06 Josef Zlomek * MAINTAINERS: Update my e-mail address. diff --git a/MAINTAINERS b/MAINTAINERS index 3ecce26c9b5..686dd332221 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -72,7 +72,7 @@ rs6000 port David Edelsohn dje@watson.ibm.com rs6000 vector extns Aldy Hernandez aldyh@redhat.com s390 port Hartmut Penner hpenner@de.ibm.com s390 port Ulrich Weigand uweigand@de.ibm.com -sh port Joern Rennecke joern.rennecke@superh.com +sh port Joern Rennecke joern.rennecke@st.com sh port Alexandre Oliva aoliva@redhat.com sparc port Richard Henderson rth@redhat.com sparc port David S. Miller davem@redhat.com @@ -99,7 +99,7 @@ VxWorks ports Zack Weinberg zack@codesourcery.com VxWorks ports Nathan Sidwell nathan@codesourcery.com windows, cygwin, mingw Christopher Faylor cgf@redhat.com - Various Maintainers + Language Front Ends Maintainers C front end/ISO C99 Joseph Myers jsm@polyomino.org.uk C front end/ISO C99 Richard Henderson rth@redhat.com @@ -114,18 +114,22 @@ fortran 95 Toon Moene toon@moene.indiv.nluug.nl c++ Jason Merrill jason@redhat.com c++ Mark Mitchell mark@codesourcery.com c++ Nathan Sidwell nathan@codesourcery.com -cpplib Dave Brolley brolley@redhat.com -cpplib Per Bothner per@bothner.com -cpplib Zack Weinberg zack@codesourcery.com -cpplib Neil Booth neil@daikokuya.co.uk java Per Bothner per@bothner.com java Andrew Haley aph@redhat.com -libgcj Tom Tromey tromey@redhat.com -libgcj Bryce McKinlay bryce@gcc.gnu.org mercury Fergus Henderson fjh@cs.mu.oz.au objective-c Stan Shebs shebs@apple.com objective-c Ovidiu Predescu ovidiu@cup.hp.com objective-c Ziemowit Laski zlaski@apple.com +treelang Tim Josling tej@melbpc.org.au + + Various Maintainers + +cpplib Dave Brolley brolley@redhat.com +cpplib Per Bothner per@bothner.com +cpplib Zack Weinberg zack@codesourcery.com +cpplib Neil Booth neil@daikokuya.co.uk +libgcj Tom Tromey tromey@redhat.com +libgcj Bryce McKinlay bryce@gcc.gnu.org libobjc Nicola Pero n.pero@mi.flashnet.it libobjc Andrew Pinski pinskia@physics.uc.edu alias analysis John Carr jfc@mit.edu @@ -167,7 +171,6 @@ docs co-maintainer Gerald Pfeifer gerald@pfeifer.com docs co-maintainer Joseph Myers jsm@polyomino.org.uk predict.def Jan Hubicka jh@suse.cz contrib/regression Geoff Keating geoffk@geoffk.org -treelang Tim Josling tej@melbpc.org.au new regalloc (ra*) Michael Matz matz@suse.de gcov Jan Hubicka jh@suse.cz gcov Nathan Sidwell nathan@codesourcery.com diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 71d6d1b3b8f..3f1b1a7909b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,351 @@ +2004-10-08 Andrew Pinski + + PR c/16999 + * c-ppoutput.c (cb_ident): Don't quote string as it is already + quoted. + +2004-10-08 Diego Novillo + + * tree-ssa-pre.c (init_pre): Use size of ARRAY_REF to allocate + reference_node_pool. + +2004-10-08 Kazu Hirata + + * tree-cfg.c: Fix a comment typo. + +2004-10-08 Andreas Krebbel + + * config/s390/s390.c (s390_register_info): Don't save fprs for + -msoft-float. + (s390_conditional_register_usage): Make fprs 'fixed' for -msoft-float. + +2004-10-08 Ulrich Weigand + + * config/s390/s390.h (TARGET_DEFAULT_BACKCHAIN): New define. + (TARGET_DEFAULT): Use symbolic values. + * config/s390/tpf.h (TARGET_DEFAULT_BACKCHAIN): Redefine. + (TARGET_DEFAULT): Use symbolic values. + * config/s390/s390.c (s390_backchain_string): Initialize to + TARGET_DEFAULT_BACKCHAIN. + +2004-10-08 Kaveh R. Ghazi + + * builtins.c (expand_builtin_mempcpy): Move tree handling code to + fold_builtin_mempcpy. Accept a type parameter. Delete duplicate + code. + (expand_builtin_strcat): Accept a type parameter. + (fold_builtin_mempcpy): Accept a type and endp parameter. + + * builtins.c (expand_builtin_strncpy): Delete duplicate code. + Accept an `exp' instead of an `arglist'. + +2004-10-08 Nathan Sidwell + + * tree-tailcall.c (tree_optimize_tail_calls_1): Use fold_convert, + reverting my 2004-09-07 patch to use build_int_cst. + +2004-10-08 Eric Botcazou + + PR target/17245 + * config/sparc/sparc.c (input_operand): Remove redundant code + for handling LO_SUM. + (legitimate_address_p) : Do not recheck TARGET_V9. + : If LO_SUM is offsettable, accept it for TFmode on V9. + Otherwise only accept it for TFmode if quad move insns are available. + +2004-10-08 Kazu Hirata + + * tree-cfg.c (tree_forwarder_block_p): Reorder checks so that + common cases will be caught earlier than others. + +2004-10-08 Michael Matz + + * loop-doloop.c (doloop_optimize): Extend count. + +2004-10-08 Kaz Kojima + + * config/sh/sh.md (prefetch_media, prefetch_i4): New insns. + (prefetch): Convert to expander. + +2004-10-08 Kaz Kojima + + * config/sh/sh.md (tls_global_dynamic): Use MEM pattern for the + first argument of CALL. + (tls_local_dynamic): Likewise. + +2004-10-08 Joseph S. Myers + + * c-typeck.c (enum impl_conv): New. + (convert_for_assignment): Use it. Take tree for function called + instead of its name. Handle ObjC selectors for diagnostics at + start of function. Select diagnostic text within the function + using full sentences for diagnsotics. Use %qE to name functions + in diagnostics. + (convert_arguments, build_modify_expr, + c_convert_parm_for_inlining, digest_init, c_finish_return): Update + callers to convert_for_assignment. + (warn_for_assignment): Remove. + +2004-10-08 Nick Clifton + + * config/sh/symbian.c (symbian_possibly_export_base_class): + Replace use of deleted TYPE_USES_VIRTUAL_BASECLASSES macro with + TYPE_CONTAINS_VPTR_P. + +2004-10-08 Kazuhiro Inaoka + + * config/m32r/m32r.h (CONDITIONAL_REGISTER_USAGE): Don't exclude + fixed registers form all_used_regs. Update call_really_used_regs. + (CALL_REALLY_USED_REGISTERS): Define. + * config/m32r/m32r.c (MUST_SAVE_REGISTER): Replace call_used_regs + with call_really_used_regs. + +2004-10-08 Alan Modra + + * config/rs6000/sysv4.h (STARTFILE_LINUX_SPEC): Choose gcrt1.o + for -profile as well as -p and -pg. + +2004-10-07 Andrew Pinski + + * libgcc2.c (__moddi3): Cast &w to UDWtype*. + +2004-10-07 Kazu Hirata + + * tree-cfg.c (tree_block_forwards_to): Remove. + * tree-flow.h: Remove the corresponding prototype. + +2004-10-07 Kazu Hirata + + * tree-flow-inline.h (phi_nodes): Remove an unnecessary check + for ENTRY_BLOCK_PTR and EXIT_BLOCK_PTR. + +2004-10-07 Geoffrey Keating + + Radar 3813796 + * config/rs6000/rs6000.c (rs6000_generate_compare): When + flag_trapping_math is in effect, don't generate subtract + instructions. + +2004-10-07 Ulrich Weigand + + * config/s390/s390-protos.h (s390_narrow_logical_operator): Add. + * config/s390/s390.c (s390_narrow_logical_operator): New function. + (s390_extra_constraint_str): Add 'A' constraints. + (s390_const_ok_for_constraint_p): Add 'Nx' constraints. + * config/s390/s390.h (EXTRA_MEMORY_CONSTRAINT): Add 'A' constraint. + (CONSTRAINT_LEN): Likewise. + * config/s390/s390.md ("*anddi3"): Add NI alternative and splitter. + ("*andsi3_zarch", "*andsi3_esa"): Likewise. + ("*andhi3_zarch", "*andhi3_esa"): Likewise. + ("*iordi3"): Add OI alternative and splitter. + ("*iorsi3_zarch", "*iorsi3_esa"): Likewise. + ("*iorhi3_zarch", "*iorhi3_esa"): Likewise. + ("*xordi3"): Add XI alternative and splitter. + ("*xorsi3", "*xorhi3"): Likewise. + +2004-10-07 Richard Sandiford + + * config/mips/mips.c (mips_function_rodata_section): New function. + (TARGET_ASM_FUNCTION_RODATA_SECTION): Use it. + +2004-10-07 Devang Patel + + * rs6000/altivec.md (UNSPEC_VCMPBFP, UNSPEC_VCMPEQUB, UNSPEC_VCMPEQUH, + UNSPEC_VCMPEQUW, UNSPEC_VCMPGEFP, UNSPEC_VCMPGTUB, UNSPEC_VCMPGTSB, + UNSPEC_VCMPGTUH, UNSPEC_VCMPGTSH, UNSPEC_VCMPGTUW, UNSPEC_VCMPGTSW, + UNSPEC_VCMPGTFP, UNSPEC_VSEL4SI, UNSPEC_VSEL4SF, UNSPEC_VSEL8HI, + UNSPEC_VSEL16QI, UNSPEC_VCOND_V4SI, UNSPEC_VCOND_V4SF, UNSPEC_VCOND_V8HI, + UNSPEC_VCOND_V16QI, UNSPEC_VCONDU_V4SI, UNSPEC_VCONDU_V8HI, + UNSPEC_VCONDU_V16QI): New constant defines. + (vcondv4si, vcondv4sf, vcondv8hi, vcondv16qi, vconduv4si, vconduv8hi, + vconduv16qi): New patterns. + * rs6000/rs6000-protos.h (rs6000_emit_vector_cond_expr): New function. + * rs6000/rs6000.c (rs6000_emit_vector_cond_expr): New function. + (get_vec_cmp_insn): Same. + (get_vsel_insn): Same. + (rs6000_emit_vector_compare): Same. + (rs6000_emit_vector_select): Same. + (INSN_NOT_AVAILABLE): New. + +2004-10-07 Zdenek Dvorak + + PR tree-optimization/17749 + * tree-tailcall.c (find_tail_calls): Check that parameter is + a gimple_reg. + +2004-10-07 Kazu Hirata + + * config/ia64/ia64.c: Fix a comment typo. + +2004-10-07 Eric Botcazou + + * doc/install.texi (*-*-solaris2*): Fix marker for URL. + +2004-10-07 Giovanni Bajo + + PR c++/17115 + * tree-inline.c (expand_call_inline): Do not warn for functions + marked with attribute noinline. + +2004-10-07 Eric Botcazou + + PR target/17862 + * config/sparc/sparc.c (sparc_output_mi_thunk): Set + current_function_uses_only_leaf_regs as well as sparc_leaf_function_p. + + * config/sparc/sparc.c (sparc_gimplify_va_arg): Pass 'false' instead + of 0 as 4th argument to pass_by_reference. + Call build_va_arg_indirect_ref instead of build_fold_indirect_ref. + +2004-10-06 Eric Christopher + + * config/sh/sh.c (sh_dwarf_calling_convention): Fix renesas dwarf + attribute. + +2004-10-07 Richard Sandiford + + PR target/17770 + * config/mips/mips.md (mov_l): Remove hazard=none attribute. + +2004-10-07 Zdenek Dvorak + + PR rtl-optimization/17791 + * loop-doloop.c (doloop_modify): Take number of iterations as + argument. + (doloop_optimize): Extend or shorten the number of iterations + when changing mode of counter register. + * loop-iv.c (lowpart_subreg): Export. + * rtl.h (lowpart_subreg): Declare. + +2004-10-07 Zdenek Dvorak + + PR tree-optimization/17806 + * cfghooks.c (split_edge): Update IRREDUCIBLE_LOOP flags. + * cfgloopmanip.c (loop_split_edge_with): Updating of IRREDUCIBLE_LOOP + flags moved to split_edge. + +2004-10-07 Eric Botcazou + + PR middle-end/17285 + * expmed.c (expand_sdiv_pow2): Force a stack adjustment + before tentatively building the conditional move sequence. + +2004-10-07 Richard Sandiford + + PR target/16815 + * function.c (assign_parm_setup_block_p): Tighten BLOCK_REG_PADDING + check. + * config/pa/pa.h (BLOCK_REG_PADDING): Define in terms of + function_arg_padding. + +2004-10-07 Richard Sandiford + + PR bootstrap/17857 + * Makefile.in (stmp-fixproto): Pass FIX_HEADER=build/... to fixproto. + +2004-10-07 Kazu Hirata + + * hooks.c (hook_int_void_1, hook_void_int): Remove. + * hooks.h: Remove the corresponding prototypes. + +2004-10-06 Andrew Pinski + + PR middle-end/17849 + * tree-nested.c (walk_stmt_info): Add changed field. + (convert_nonlocal_reference): Set changed to when we + change a decl to unnested decl. + : Instead of checking if the immediate part + of the ADDR_EXPR changed, check the field changed. + Use recompute_tree_invarant_for_addr_expr instead of unsetting + TREE_INVARIANT. + (convert_local_reference): Set changed to when we + change a decl to unnested decl. + : Instead of checking if the immediate part + of the ADDR_EXPR changed, check the field changed. + Also call recompute_tree_invarant_for_addr_expr on the ADDR_EXPR. + +2004-10-06 Kazu Hirata + + * defaults.h (DWARF2_GENERATE_TEXT_SECTION_LABEL): Remove. + * dwarf2out.c (dwarf2out_init): Remove references to + DWARF2_GENERATE_TEXT_SECTION_LABEL. + * system.h: Poison DWARF2_GENERATE_TEXT_SECTION_LABEL. + * doc/tm.texi (DWARF2_GENERATE_TEXT_SECTION_LABEL): Remove. + +2004-10-06 Joseph S. Myers + + * c-typeck.c (convert_arguments): Take expression for called + function rather than its name. Handle ObjC selectors directly + rather than relying on warn_for_assignment to do so. Call warning + directly rather than warn_for_assignment. Use %qE in diagnostics. + Say "argument" rather than "arg" in diagnostics. + (build_function_call): Update call to convert_arguments. + +2004-10-06 Andrew Pinski + + PR debug/17787 + * dbxout.c (dbxout_symbol): Really handle RECORD, UNION, and + ENUMs specially instead of just saying we do. + +2004-10-06 Eric Christopher + + * dwarf2.h: Sync with include/elf/dwarf2.h + +2004-10-06 Daniel Berlin + + * tree-pretty-print.c (dump_generic_node): Fix printing of BINFO + and TREE_VEC nodes. + +2004-10-06 Daniel Berlin + + * lambda-code.c (lambda_loopnest_to_gcc_loopnest): Convert + to use FOR_EACH_SSA_USE_OPERAND iterator, and propagate_value. + +2004-10-06 Daniel Berlin + + * lambda-code.c (compute_nest_using_fourier_motzkin): New + function. + (lambda_compute_auxillary_space): Split from here. + +2004-10-06 Daniel Berlin + + * tree-ssa-loop-ivopts.c (expr_invariant_in_loop): Make non-static. + * tree-flow.h: Add prototype. + * lambda-code.c (invariant_in_loop_and_outer_loops): Use + expr_invariant_in_loop. + +2004-10-06 Kazu Hirata + + * tree-cfg.c (thread_jumps): Remove a duplicate check for + EXIT_BLOCK_PTR. + +2004-10-06 Ulrich Weigand + + * config/s390/s390-protos.h (s_imm_operand): Remove. + (s390_pool_operand): Add prototype. + * config/s390/s390.c (general_s_operand): Remove. + (s_imm_operand): Remove. + (s_operand): Merge contents of general_s_operand. + (s390_pool_operand): New function. + * config/s390/s390.h (PREDICATE_CODES): Remove s_imm_operand. + * config/s390/s390.md ("*cmpdi_cct", "*cmpsi_cct"): New insns. + ("*cmpdi_ccu"): Merge Q->Q alternative. + ("*cmpsi_ccu", "*cmphi_ccu"): Likewise. + ("*cmpqi_ccu"): Merge Q->Q, n->Q, n->S alternatives. + ("*cli"): Remove. + ("*cmpdi_ccu_mem", "*cmpsi_ccu_mem"): Likewise. + ("*cmphi_ccu_mem", "*cmpqi_ccu_mem"): Likewise. + ("*movstricthi"): Use memory_operand instead of s_imm_operand. + +2004-10-06 Steve Ellcey + + * config/ia64/ia64.h (FUNCTION_ARG_BOUNDARY): Change macro to + call ia64_function_arg_boundary. + * config/ia64/ia64-protos.h (ia64_function_arg_boundary): New. + * config/ia64/ia64.c (ia64_function_arg_boundary): New. + (ia64_function_arg_advance): Do not put 128 bit floats into + FP registers. + 2004-10-06 Kaveh R. Ghazi * builtins.c (expand_builtin_strcpy): Delete duplicate code. diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 2f129272b76..50cf9dd5487 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -2901,6 +2901,7 @@ stmp-fixproto: fixhdr.ready fixproto stmp-int-hdrs else \ : This line works around a 'make' bug in BSDI 1.1.; \ FIXPROTO_DEFINES="$(FIXPROTO_DEFINES)"; export FIXPROTO_DEFINES; \ + FIX_HEADER="build/fix-header$(build_exeext)"; export FIX_HEADER; \ mkinstalldirs="$(mkinstalldirs)"; \ export mkinstalldirs; \ if [ -d "$(SYSTEM_HEADER_DIR)" ]; then \ diff --git a/gcc/builtins.c b/gcc/builtins.c index 11fd5687a0e..76be4a7f619 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -107,12 +107,12 @@ static rtx expand_builtin_memcmp (tree, tree, rtx, enum machine_mode); static rtx expand_builtin_strcmp (tree, rtx, enum machine_mode); static rtx expand_builtin_strncmp (tree, rtx, enum machine_mode); static rtx builtin_memcpy_read_str (void *, HOST_WIDE_INT, enum machine_mode); -static rtx expand_builtin_strcat (tree, rtx, enum machine_mode); +static rtx expand_builtin_strcat (tree, tree, rtx, enum machine_mode); static rtx expand_builtin_strncat (tree, rtx, enum machine_mode); static rtx expand_builtin_strspn (tree, rtx, enum machine_mode); static rtx expand_builtin_strcspn (tree, rtx, enum machine_mode); static rtx expand_builtin_memcpy (tree, rtx, enum machine_mode); -static rtx expand_builtin_mempcpy (tree, rtx, enum machine_mode, int); +static rtx expand_builtin_mempcpy (tree, tree, rtx, enum machine_mode, int); static rtx expand_builtin_memmove (tree, tree, rtx, enum machine_mode); static rtx expand_builtin_bcopy (tree, tree); static rtx expand_builtin_strcpy (tree, rtx, enum machine_mode); @@ -162,7 +162,7 @@ static tree fold_builtin_ceil (tree); static tree fold_builtin_round (tree); static tree fold_builtin_bitop (tree); static tree fold_builtin_memcpy (tree); -static tree fold_builtin_mempcpy (tree); +static tree fold_builtin_mempcpy (tree, tree, int); static tree fold_builtin_memmove (tree, tree); static tree fold_builtin_strchr (tree); static tree fold_builtin_memcmp (tree); @@ -2621,7 +2621,7 @@ expand_builtin_memcpy (tree exp, rtx target, enum machine_mode mode) stpcpy. */ static rtx -expand_builtin_mempcpy (tree arglist, rtx target, enum machine_mode mode, +expand_builtin_mempcpy (tree arglist, tree type, rtx target, enum machine_mode mode, int endp) { if (!validate_arglist (arglist, @@ -2648,48 +2648,20 @@ expand_builtin_mempcpy (tree arglist, rtx target, enum machine_mode mode, unsigned int dest_align = get_pointer_alignment (dest, BIGGEST_ALIGNMENT); rtx dest_mem, src_mem, len_rtx; + tree result = fold_builtin_mempcpy (arglist, type, endp); - /* If DEST is not a pointer type, call the normal function. */ - if (dest_align == 0) + if (result) + return expand_expr (result, target, mode, EXPAND_NORMAL); + + /* If either SRC or DEST is not a pointer type, don't do this + operation in-line. */ + if (dest_align == 0 || src_align == 0) return 0; - /* If SRC and DEST are the same (and not volatile), do nothing. */ - if (operand_equal_p (src, dest, 0)) - { - tree expr; - - if (endp == 0) - { - /* Evaluate and ignore LEN in case it has side-effects. */ - expand_expr (len, const0_rtx, VOIDmode, EXPAND_NORMAL); - return expand_expr (dest, target, mode, EXPAND_NORMAL); - } - - if (endp == 2) - len = fold (build2 (MINUS_EXPR, TREE_TYPE (len), len, - integer_one_node)); - len = fold_convert (TREE_TYPE (dest), len); - expr = fold (build2 (PLUS_EXPR, TREE_TYPE (dest), dest, len)); - return expand_expr (expr, target, mode, EXPAND_NORMAL); - } - /* If LEN is not constant, call the normal function. */ if (! host_integerp (len, 1)) return 0; - /* If the LEN parameter is zero, return DEST. */ - if (tree_low_cst (len, 1) == 0) - { - /* Evaluate and ignore SRC in case it has side-effects. */ - expand_expr (src, const0_rtx, VOIDmode, EXPAND_NORMAL); - return expand_expr (dest, target, mode, EXPAND_NORMAL); - } - - /* If either SRC is not a pointer type, don't do this - operation in-line. */ - if (src_align == 0) - return 0; - len_rtx = expand_expr (len, NULL_RTX, VOIDmode, 0); src_str = c_getstr (src); @@ -2779,7 +2751,7 @@ expand_builtin_memmove (tree arglist, tree type, rtx target, it is ok to use memcpy as well. */ if (integer_onep (len)) { - rtx ret = expand_builtin_mempcpy (arglist, target, mode, + rtx ret = expand_builtin_mempcpy (arglist, type, target, mode, /*endp=*/0); if (ret) return ret; @@ -2950,7 +2922,8 @@ expand_builtin_stpcpy (tree exp, rtx target, enum machine_mode mode) narglist = build_tree_list (NULL_TREE, lenp1); narglist = tree_cons (NULL_TREE, src, narglist); narglist = tree_cons (NULL_TREE, dst, narglist); - ret = expand_builtin_mempcpy (narglist, target, mode, /*endp=*/2); + ret = expand_builtin_mempcpy (narglist, TREE_TYPE (exp), + target, mode, /*endp=*/2); if (ret) return ret; @@ -3010,35 +2983,21 @@ builtin_strncpy_read_str (void *data, HOST_WIDE_INT offset, if we failed the caller should emit a normal call. */ static rtx -expand_builtin_strncpy (tree arglist, rtx target, enum machine_mode mode) +expand_builtin_strncpy (tree exp, rtx target, enum machine_mode mode) { - if (!validate_arglist (arglist, - POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE)) - return 0; - else + tree arglist = TREE_OPERAND (exp, 1); + if (validate_arglist (arglist, + POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE)) { tree slen = c_strlen (TREE_VALUE (TREE_CHAIN (arglist)), 1); tree len = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); - tree fn; - - /* We must be passed a constant len parameter. */ - if (TREE_CODE (len) != INTEGER_CST) - return 0; - - /* If the len parameter is zero, return the dst parameter. */ - if (integer_zerop (len)) - { - /* Evaluate and ignore the src argument in case it has - side-effects. */ - expand_expr (TREE_VALUE (TREE_CHAIN (arglist)), const0_rtx, - VOIDmode, EXPAND_NORMAL); - /* Return the dst parameter. */ - return expand_expr (TREE_VALUE (arglist), target, mode, - EXPAND_NORMAL); - } + tree result = fold_builtin_strncpy (exp, slen); + + if (result) + return expand_expr (result, target, mode, EXPAND_NORMAL); - /* Now, we must be passed a constant src ptr parameter. */ - if (slen == 0 || TREE_CODE (slen) != INTEGER_CST) + /* We must be passed a constant len and src parameter. */ + if (!host_integerp (len, 1) || !slen || !host_integerp (slen, 1)) return 0; slen = size_binop (PLUS_EXPR, slen, ssize_int (1)); @@ -3068,14 +3027,8 @@ expand_builtin_strncpy (tree arglist, rtx target, enum machine_mode mode) dest_mem = convert_memory_address (ptr_mode, dest_mem); return dest_mem; } - - /* OK transform into builtin memcpy. */ - fn = implicit_built_in_decls[BUILT_IN_MEMCPY]; - if (!fn) - return 0; - return expand_expr (build_function_call_expr (fn, arglist), - target, mode, EXPAND_NORMAL); } + return 0; } /* Callback routine for store_by_pieces. Read GET_MODE_BITSIZE (MODE) @@ -3610,7 +3563,7 @@ expand_builtin_strncmp (tree exp, rtx target, enum machine_mode mode) otherwise try to get the result in TARGET, if convenient. */ static rtx -expand_builtin_strcat (tree arglist, rtx target, enum machine_mode mode) +expand_builtin_strcat (tree arglist, tree type, rtx target, enum machine_mode mode) { if (!validate_arglist (arglist, POINTER_TYPE, POINTER_TYPE, VOID_TYPE)) return 0; @@ -3660,7 +3613,7 @@ expand_builtin_strcat (tree arglist, rtx target, enum machine_mode mode) pass in a target of zero, it should never actually be used. If this was successful return the original dst, not the result of mempcpy. */ - if (expand_builtin_mempcpy (arglist, /*target=*/0, mode, /*endp=*/0)) + if (expand_builtin_mempcpy (arglist, type, /*target=*/0, mode, /*endp=*/0)) return expand_expr (dst, target, mode, EXPAND_NORMAL); else return 0; @@ -5391,7 +5344,7 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode, break; case BUILT_IN_STRNCPY: - target = expand_builtin_strncpy (arglist, target, mode); + target = expand_builtin_strncpy (exp, target, mode); if (target) return target; break; @@ -5403,7 +5356,7 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode, break; case BUILT_IN_STRCAT: - target = expand_builtin_strcat (arglist, target, mode); + target = expand_builtin_strcat (arglist, TREE_TYPE (exp), target, mode); if (target) return target; break; @@ -5459,7 +5412,7 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode, break; case BUILT_IN_MEMPCPY: - target = expand_builtin_mempcpy (arglist, target, mode, /*endp=*/ 1); + target = expand_builtin_mempcpy (arglist, TREE_TYPE (exp), target, mode, /*endp=*/ 1); if (target) return target; break; @@ -6991,31 +6944,34 @@ fold_builtin_memcpy (tree exp) NULL_TREE if no simplification can be made. */ static tree -fold_builtin_mempcpy (tree exp) +fold_builtin_mempcpy (tree arglist, tree type, int endp) { - tree arglist = TREE_OPERAND (exp, 1); - tree dest, src, len; - - if (!validate_arglist (arglist, - POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE)) - return 0; + if (validate_arglist (arglist, + POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE)) + { + tree dest = TREE_VALUE (arglist); + tree src = TREE_VALUE (TREE_CHAIN (arglist)); + tree len = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); - dest = TREE_VALUE (arglist); - src = TREE_VALUE (TREE_CHAIN (arglist)); - len = TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))); + /* If the LEN parameter is zero, return DEST. */ + if (integer_zerop (len)) + return omit_one_operand (type, dest, src); - /* If the LEN parameter is zero, return DEST. */ - if (integer_zerop (len)) - return omit_one_operand (TREE_TYPE (exp), dest, src); + /* If SRC and DEST are the same (and not volatile), return DEST+LEN. */ + if (operand_equal_p (src, dest, 0)) + { + if (endp == 0) + return omit_one_operand (type, dest, len); - /* If SRC and DEST are the same (and not volatile), return DEST+LEN. */ - if (operand_equal_p (src, dest, 0)) - { - tree temp = fold_convert (TREE_TYPE (dest), len); - temp = fold (build2 (PLUS_EXPR, TREE_TYPE (dest), dest, temp)); - return fold_convert (TREE_TYPE (exp), temp); + if (endp == 2) + len = fold (build2 (MINUS_EXPR, TREE_TYPE (len), len, + ssize_int (1))); + + len = fold_convert (TREE_TYPE (dest), len); + len = fold (build2 (PLUS_EXPR, TREE_TYPE (dest), dest, len)); + return fold_convert (type, len); + } } - return 0; } @@ -7984,7 +7940,7 @@ fold_builtin_1 (tree exp, bool ignore) return fold_builtin_memcpy (exp); case BUILT_IN_MEMPCPY: - return fold_builtin_mempcpy (exp); + return fold_builtin_mempcpy (arglist, type, /*endp=*/1); case BUILT_IN_MEMMOVE: return fold_builtin_memmove (arglist, type); diff --git a/gcc/c-ppoutput.c b/gcc/c-ppoutput.c index 95563995e7c..64b27a75f62 100644 --- a/gcc/c-ppoutput.c +++ b/gcc/c-ppoutput.c @@ -304,7 +304,7 @@ cb_ident (cpp_reader *pfile ATTRIBUTE_UNUSED, source_location line, const cpp_string *str) { maybe_print_line (line); - fprintf (print.outf, "#ident \"%s\"\n", str->text); + fprintf (print.outf, "#ident %s\n", str->text); print.src_line++; } diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 27c8cd47c83..64669c88ca3 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -55,6 +55,15 @@ enum lvalue_use { lv_asm }; +/* Possible cases of implicit bad conversions. Used to select + diagnostic messages in convert_for_assignment. */ +enum impl_conv { + ic_argpass, + ic_assign, + ic_init, + ic_return +}; + /* The level of nesting inside "__alignof__". */ int in_alignof; @@ -81,9 +90,8 @@ static tree default_function_array_conversion (tree); static tree lookup_field (tree, tree); static tree convert_arguments (tree, tree, tree, tree); static tree pointer_diff (tree, tree); -static tree convert_for_assignment (tree, tree, const char *, tree, tree, +static tree convert_for_assignment (tree, tree, enum impl_conv, tree, tree, int); -static void warn_for_assignment (const char *, const char *, tree, int); static tree valid_compound_expr_initializer (tree, tree); static void push_string (const char *); static void push_member_name (tree); @@ -1976,7 +1984,7 @@ build_function_call (tree function, tree params) function prototype, or apply default promotions. */ coerced_params - = convert_arguments (TYPE_ARG_TYPES (fntype), params, name, fundecl); + = convert_arguments (TYPE_ARG_TYPES (fntype), params, function, fundecl); /* Check that the arguments to the function are valid. */ @@ -2014,7 +2022,8 @@ build_function_call (tree function, tree params) It may be 0, if that info is not available. It is used only for generating error messages. - NAME is an IDENTIFIER_NODE or 0. It is used only for error messages. + FUNCTION is a tree for the called function. It is used only for + error messages, where it is formatted with %qE. This is also where warnings about wrong number of args are generated. @@ -2022,11 +2031,21 @@ build_function_call (tree function, tree params) with the elements of the list in the TREE_VALUE slots of those nodes. */ static tree -convert_arguments (tree typelist, tree values, tree name, tree fundecl) +convert_arguments (tree typelist, tree values, tree function, tree fundecl) { tree typetail, valtail; tree result = NULL; int parmnum; + tree selector; + + /* Change pointer to function to the function itself for + diagnostics. */ + if (TREE_CODE (function) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (function, 0)) == FUNCTION_DECL) + function = TREE_OPERAND (function, 0); + + /* Handle an ObjC selector specially for diagnostics. */ + selector = objc_message_selector (); /* Scan the given expressions and types, producing individual converted arguments and pushing them on RESULT in reverse order. */ @@ -2037,17 +2056,21 @@ convert_arguments (tree typelist, tree values, tree name, tree fundecl) { tree type = typetail ? TREE_VALUE (typetail) : 0; tree val = TREE_VALUE (valtail); + tree rname = function; + int argnum = parmnum + 1; if (type == void_type_node) { - if (name) - error ("too many arguments to function %qs", - IDENTIFIER_POINTER (name)); - else - error ("too many arguments to function"); + error ("too many arguments to function %qE", function); break; } + if (selector && argnum > 2) + { + rname = selector; + argnum -= 2; + } + /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */ /* Do not use STRIP_NOPS here! We do not want an enumerator with value 0 to convert automatically to a pointer. */ @@ -2078,22 +2101,34 @@ convert_arguments (tree typelist, tree values, tree name, tree fundecl) if (INTEGRAL_TYPE_P (type) && TREE_CODE (TREE_TYPE (val)) == REAL_TYPE) - warn_for_assignment ("%s as integer rather than floating due to prototype", (char *) 0, name, parmnum + 1); + warning ("passing argument %d of %qE as integer " + "rather than floating due to prototype", + argnum, rname); if (INTEGRAL_TYPE_P (type) && TREE_CODE (TREE_TYPE (val)) == COMPLEX_TYPE) - warn_for_assignment ("%s as integer rather than complex due to prototype", (char *) 0, name, parmnum + 1); + warning ("passing argument %d of %qE as integer " + "rather than complex due to prototype", + argnum, rname); else if (TREE_CODE (type) == COMPLEX_TYPE && TREE_CODE (TREE_TYPE (val)) == REAL_TYPE) - warn_for_assignment ("%s as complex rather than floating due to prototype", (char *) 0, name, parmnum + 1); + warning ("passing argument %d of %qE as complex " + "rather than floating due to prototype", + argnum, rname); else if (TREE_CODE (type) == REAL_TYPE && INTEGRAL_TYPE_P (TREE_TYPE (val))) - warn_for_assignment ("%s as floating rather than integer due to prototype", (char *) 0, name, parmnum + 1); + warning ("passing argument %d of %qE as floating " + "rather than integer due to prototype", + argnum, rname); else if (TREE_CODE (type) == COMPLEX_TYPE && INTEGRAL_TYPE_P (TREE_TYPE (val))) - warn_for_assignment ("%s as complex rather than integer due to prototype", (char *) 0, name, parmnum + 1); + warning ("passing argument %d of %qE as complex " + "rather than integer due to prototype", + argnum, rname); else if (TREE_CODE (type) == REAL_TYPE && TREE_CODE (TREE_TYPE (val)) == COMPLEX_TYPE) - warn_for_assignment ("%s as floating rather than complex due to prototype", (char *) 0, name, parmnum + 1); + warning ("passing argument %d of %qE as floating " + "rather than complex due to prototype", + argnum, rname); /* ??? At some point, messages should be written about conversions between complex types, but that's too messy to do now. */ @@ -2103,9 +2138,9 @@ convert_arguments (tree typelist, tree values, tree name, tree fundecl) /* Warn if any argument is passed as `float', since without a prototype it would be `double'. */ if (formal_prec == TYPE_PRECISION (float_type_node)) - warn_for_assignment ("%s as % rather than " - "% due to prototype", - (char *) 0, name, parmnum + 1); + warning ("passing argument %d of %qE as % " + "rather than % due to prototype", + argnum, rname); } /* Detect integer changing in width or signedness. These warnings are only activated with @@ -2123,7 +2158,8 @@ convert_arguments (tree typelist, tree values, tree name, tree fundecl) and the actual arg is that enum type. */ ; else if (formal_prec != TYPE_PRECISION (type1)) - warn_for_assignment ("%s with different width due to prototype", (char *) 0, name, parmnum + 1); + warning ("passing argument %d of %qE with different " + "width due to prototype", argnum, rname); else if (TYPE_UNSIGNED (type) == TYPE_UNSIGNED (type1)) ; /* Don't complain if the formal parameter type @@ -2149,15 +2185,17 @@ convert_arguments (tree typelist, tree values, tree name, tree fundecl) && TYPE_UNSIGNED (TREE_TYPE (val))) ; else if (TYPE_UNSIGNED (type)) - warn_for_assignment ("%s as unsigned due to prototype", (char *) 0, name, parmnum + 1); + warning ("passing argument %d of %qE as unsigned " + "due to prototype", argnum, rname); else - warn_for_assignment ("%s as signed due to prototype", (char *) 0, name, parmnum + 1); + warning ("passing argument %d of %qE as signed " + "due to prototype", argnum, rname); } } - parmval = convert_for_assignment (type, val, - (char *) 0, /* arg passing */ - fundecl, name, parmnum + 1); + parmval = convert_for_assignment (type, val, ic_argpass, + fundecl, function, + parmnum + 1); if (targetm.calls.promote_prototypes (fundecl ? TREE_TYPE (fundecl) : 0) && INTEGRAL_TYPE_P (type) @@ -2180,13 +2218,7 @@ convert_arguments (tree typelist, tree values, tree name, tree fundecl) } if (typetail != 0 && TREE_VALUE (typetail) != void_type_node) - { - if (name) - error ("too few arguments to function %qs", - IDENTIFIER_POINTER (name)); - else - error ("too few arguments to function"); - } + error ("too few arguments to function %qE", function); return nreverse (result); } @@ -3362,7 +3394,7 @@ build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs) /* Convert new value to destination type. */ - newrhs = convert_for_assignment (lhstype, newrhs, _("assignment"), + newrhs = convert_for_assignment (lhstype, newrhs, ic_assign, NULL_TREE, NULL_TREE, 0); if (TREE_CODE (newrhs) == ERROR_MARK) return error_mark_node; @@ -3379,7 +3411,7 @@ build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs) if (olhstype == TREE_TYPE (result)) return result; - return convert_for_assignment (olhstype, result, _("assignment"), + return convert_for_assignment (olhstype, result, ic_assign, NULL_TREE, NULL_TREE, 0); } @@ -3388,21 +3420,63 @@ build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs) The real work of conversion is done by `convert'. The purpose of this function is to generate error messages for assignments that are not allowed in C. - ERRTYPE is a string to use in error messages: - "assignment", "return", etc. If it is null, this is parameter passing - for a function call (and different error messages are output). + ERRTYPE says whether it is argument passing, assignment, + initialization or return. - FUNNAME is the name of the function being called, - as an IDENTIFIER_NODE, or null. + FUNCTION is a tree for the function being called. PARMNUM is the number of the argument, for printing in error messages. */ static tree -convert_for_assignment (tree type, tree rhs, const char *errtype, - tree fundecl, tree funname, int parmnum) +convert_for_assignment (tree type, tree rhs, enum impl_conv errtype, + tree fundecl, tree function, int parmnum) { enum tree_code codel = TREE_CODE (type); tree rhstype; enum tree_code coder; + tree rname = NULL_TREE; + + if (errtype == ic_argpass) + { + tree selector; + /* Change pointer to function to the function itself for + diagnostics. */ + if (TREE_CODE (function) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (function, 0)) == FUNCTION_DECL) + function = TREE_OPERAND (function, 0); + + /* Handle an ObjC selector specially for diagnostics. */ + selector = objc_message_selector (); + rname = function; + if (selector && parmnum > 2) + { + rname = selector; + parmnum -= 2; + } + } + + /* This macro is used to emit diagnostics to ensure that all format + strings are complete sentences, visible to gettext and checked at + compile time. */ +#define WARN_FOR_ASSIGNMENT(AR, AS, IN, RE) \ + do { \ + switch (errtype) \ + { \ + case ic_argpass: \ + pedwarn (AR, parmnum, rname); \ + break; \ + case ic_assign: \ + pedwarn (AS); \ + break; \ + case ic_init: \ + pedwarn (IN); \ + break; \ + case ic_return: \ + pedwarn (RE); \ + break; \ + default: \ + gcc_unreachable (); \ + } \ + } while (0) /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */ /* Do not use STRIP_NOPS here. We do not want an enumerator @@ -3479,7 +3553,8 @@ convert_for_assignment (tree type, tree rhs, const char *errtype, /* Conversion to a transparent union from its member types. This applies only to function arguments. */ - else if (codel == UNION_TYPE && TYPE_TRANSPARENT_UNION (type) && !errtype) + else if (codel == UNION_TYPE && TYPE_TRANSPARENT_UNION (type) + && errtype == ic_argpass) { tree memb_types; tree marginal_memb_type = 0; @@ -3554,13 +3629,27 @@ convert_for_assignment (tree type, tree rhs, const char *errtype, function where an ordinary one is wanted, but not vice-versa. */ if (TYPE_QUALS (ttl) & ~TYPE_QUALS (ttr)) - warn_for_assignment ("%s makes qualified function pointer from unqualified", - errtype, funname, parmnum); + WARN_FOR_ASSIGNMENT (N_("passing argument %d of %qE " + "makes qualified function " + "pointer from unqualified"), + N_("assignment makes qualified " + "function pointer from " + "unqualified"), + N_("initialization makes qualified " + "function pointer from " + "unqualified"), + N_("return makes qualified function " + "pointer from unqualified")); } else if (TYPE_QUALS (ttr) & ~TYPE_QUALS (ttl)) - warn_for_assignment ("%s discards qualifiers from pointer target type", - errtype, funname, - parmnum); + WARN_FOR_ASSIGNMENT (N_("passing argument %d of %qE discards " + "qualifiers from pointer target type"), + N_("assignment discards qualifiers " + "from pointer target type"), + N_("initialization discards qualifiers " + "from pointer target type"), + N_("return discards qualifiers from " + "pointer target type")); } if (pedantic && !DECL_IN_SYSTEM_HEADER (fundecl)) @@ -3602,17 +3691,29 @@ convert_for_assignment (tree type, tree rhs, const char *errtype, which are not ANSI null ptr constants. */ && (!integer_zerop (rhs) || TREE_CODE (rhs) == NOP_EXPR) && TREE_CODE (ttl) == FUNCTION_TYPE))) - warn_for_assignment ("ISO C forbids %s between function " - "pointer and %", - errtype, funname, parmnum); + WARN_FOR_ASSIGNMENT (N_("ISO C forbids passing argument %d of " + "%qE between function pointer " + "and %"), + N_("ISO C forbids assignment between " + "function pointer and %"), + N_("ISO C forbids initialization between " + "function pointer and %"), + N_("ISO C forbids return between function " + "pointer and %")); /* Const and volatile mean something different for function types, so the usual warnings are not appropriate. */ else if (TREE_CODE (ttr) != FUNCTION_TYPE && TREE_CODE (ttl) != FUNCTION_TYPE) { if (TYPE_QUALS (ttr) & ~TYPE_QUALS (ttl)) - warn_for_assignment ("%s discards qualifiers from pointer target type", - errtype, funname, parmnum); + WARN_FOR_ASSIGNMENT (N_("passing argument %d of %qE discards " + "qualifiers from pointer target type"), + N_("assignment discards qualifiers " + "from pointer target type"), + N_("initialization discards qualifiers " + "from pointer target type"), + N_("return discards qualifiers from " + "pointer target type")); /* If this is not a case of ignoring a mismatch in signedness, no warning. */ else if (VOID_TYPE_P (ttl) || VOID_TYPE_P (ttr) @@ -3620,8 +3721,14 @@ convert_for_assignment (tree type, tree rhs, const char *errtype, ; /* If there is a mismatch, do warn. */ else - warn_for_assignment ("pointer targets in %s differ in signedness", - errtype, funname, parmnum); + WARN_FOR_ASSIGNMENT (N_("pointer targets in passing argument " + "%d of %qE differ in signedness"), + N_("pointer targets in assignment " + "differ in signedness"), + N_("pointer targets in initialization " + "differ in signedness"), + N_("pointer targets in return differ " + "in signedness")); } else if (TREE_CODE (ttl) == FUNCTION_TYPE && TREE_CODE (ttr) == FUNCTION_TYPE) @@ -3631,13 +3738,24 @@ convert_for_assignment (tree type, tree rhs, const char *errtype, it is okay to use a const or volatile function where an ordinary one is wanted, but not vice-versa. */ if (TYPE_QUALS (ttl) & ~TYPE_QUALS (ttr)) - warn_for_assignment ("%s makes qualified function pointer from unqualified", - errtype, funname, parmnum); + WARN_FOR_ASSIGNMENT (N_("passing argument %d of %qE makes " + "qualified function pointer " + "from unqualified"), + N_("assignment makes qualified function " + "pointer from unqualified"), + N_("initialization makes qualified " + "function pointer from unqualified"), + N_("return makes qualified function " + "pointer from unqualified")); } } else - warn_for_assignment ("%s from incompatible pointer type", - errtype, funname, parmnum); + WARN_FOR_ASSIGNMENT (N_("passing argument %d of %qE from " + "incompatible pointer type"), + N_("assignment from incompatible pointer type"), + N_("initialization from incompatible " + "pointer type"), + N_("return from incompatible pointer type")); return convert (type, rhs); } else if (codel == POINTER_TYPE && coder == ARRAY_TYPE) @@ -3656,39 +3774,49 @@ convert_for_assignment (tree type, tree rhs, const char *errtype, && TREE_CODE (TREE_TYPE (rhs)) == INTEGER_TYPE && TREE_CODE (TREE_OPERAND (rhs, 0)) == INTEGER_CST && integer_zerop (TREE_OPERAND (rhs, 0)))) - warn_for_assignment ("%s makes pointer from integer without a cast", - errtype, funname, parmnum); + WARN_FOR_ASSIGNMENT (N_("passing argument %d of %qE makes " + "pointer from integer without a cast"), + N_("assignment makes pointer from integer " + "without a cast"), + N_("initialization makes pointer from " + "integer without a cast"), + N_("return makes pointer from integer " + "without a cast")); return convert (type, rhs); } else if (codel == INTEGER_TYPE && coder == POINTER_TYPE) { - warn_for_assignment ("%s makes integer from pointer without a cast", - errtype, funname, parmnum); + WARN_FOR_ASSIGNMENT (N_("passing argument %d of %qE makes integer " + "from pointer without a cast"), + N_("assignment makes integer from pointer " + "without a cast"), + N_("initialization makes integer from pointer " + "without a cast"), + N_("return makes integer from pointer " + "without a cast")); return convert (type, rhs); } else if (codel == BOOLEAN_TYPE && coder == POINTER_TYPE) return convert (type, rhs); - if (!errtype) + switch (errtype) { - if (funname) - { - tree selector = objc_message_selector (); - - if (selector && parmnum > 2) - error ("incompatible type for argument %d of %qs", - parmnum - 2, IDENTIFIER_POINTER (selector)); - else - error ("incompatible type for argument %d of %qs", - parmnum, IDENTIFIER_POINTER (funname)); - } - else - error ("incompatible type for argument %d of indirect function call", - parmnum); + case ic_argpass: + error ("incompatible type for argument %d of %qE", parmnum, rname); + break; + case ic_assign: + error ("incompatible types in assignment"); + break; + case ic_init: + error ("incompatible types in initialization"); + break; + case ic_return: + error ("incompatible types in return"); + break; + default: + gcc_unreachable (); } - else - error ("incompatible types in %s", errtype); return error_mark_node; } @@ -3709,56 +3837,14 @@ c_convert_parm_for_inlining (tree parm, tree value, tree fn, int argnum) type = TREE_TYPE (parm); ret = convert_for_assignment (type, value, - (char *) 0 /* arg passing */, fn, - DECL_NAME (fn), argnum); + ic_argpass, fn, + fn, argnum); if (targetm.calls.promote_prototypes (TREE_TYPE (fn)) && INTEGRAL_TYPE_P (type) && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))) ret = default_conversion (ret); return ret; } - -/* Print a warning using MSGID. - It gets OPNAME as its one parameter. - If OPNAME is null, it is replaced by "passing arg ARGNUM of 'FUNCTION'". - FUNCTION and ARGNUM are handled specially if we are building an - Objective-C selector. */ - -static void -warn_for_assignment (const char *msgid, const char *opname, tree function, - int argnum) -{ - if (opname == 0) - { - tree selector = objc_message_selector (); - char * new_opname; - - if (selector && argnum > 2) - { - function = selector; - argnum -= 2; - } - gcc_assert (argnum > 0); - if (function) - { - /* Function name is known; supply it. */ - const char *const argstring = _("passing arg %d of '%s'"); - new_opname = (char *) alloca (IDENTIFIER_LENGTH (function) - + strlen (argstring) + 1 + 25 /*%d*/ + 1); - sprintf (new_opname, argstring, argnum, - IDENTIFIER_POINTER (function)); - } - else - { - /* Function name unknown (call through ptr); just give arg number. */ - const char *const argnofun = _("passing arg %d of pointer to function"); - new_opname = (char *) alloca (strlen (argnofun) + 1 + 25 /*%d*/ + 1); - sprintf (new_opname, argnofun, argnum); - } - opname = new_opname; - } - pedwarn (msgid, opname); -} /* If VALUE is a compound expr all of whose expressions are constant, then return its value. Otherwise, return error_mark_node. @@ -4226,7 +4312,7 @@ digest_init (tree type, tree init, bool strict_string, int require_constant) for arrays and functions. We must not call it in the case where inside_init is a null pointer constant. */ inside_init - = convert_for_assignment (type, init, _("initialization"), + = convert_for_assignment (type, init, ic_init, NULL_TREE, NULL_TREE, 0); /* Check to see if we have already given an error message. */ @@ -6366,7 +6452,7 @@ c_finish_return (tree retval) } else { - tree t = convert_for_assignment (valtype, retval, _("return"), + tree t = convert_for_assignment (valtype, retval, ic_return, NULL_TREE, NULL_TREE, 0); tree res = DECL_RESULT (current_function_decl); tree inner; diff --git a/gcc/cfghooks.c b/gcc/cfghooks.c index e6a624c3550..948c2b4c13d 100644 --- a/gcc/cfghooks.c +++ b/gcc/cfghooks.c @@ -389,6 +389,7 @@ split_edge (edge e) gcov_type count = e->count; int freq = EDGE_FREQUENCY (e); edge f; + bool irr = (e->flags & EDGE_IRREDUCIBLE_LOOP) != 0; if (!cfg_hooks->split_edge) internal_error ("%s does not support split_edge.", cfg_hooks->name); @@ -399,6 +400,13 @@ split_edge (edge e) EDGE_SUCC (ret, 0)->probability = REG_BR_PROB_BASE; EDGE_SUCC (ret, 0)->count = count; + if (irr) + { + ret->flags |= BB_IRREDUCIBLE_LOOP; + EDGE_PRED (ret, 0)->flags |= EDGE_IRREDUCIBLE_LOOP; + EDGE_SUCC (ret, 0)->flags |= EDGE_IRREDUCIBLE_LOOP; + } + if (dom_computed[CDI_DOMINATORS]) set_immediate_dominator (CDI_DOMINATORS, ret, EDGE_PRED (ret, 0)->src); diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c index e5ec7bddaab..6d47756f588 100644 --- a/gcc/cfgloopmanip.c +++ b/gcc/cfgloopmanip.c @@ -1241,7 +1241,6 @@ loop_split_edge_with (edge e, rtx insns) { basic_block src, dest, new_bb; struct loop *loop_c; - edge new_e; src = e->src; dest = e->dest; @@ -1252,14 +1251,7 @@ loop_split_edge_with (edge e, rtx insns) new_bb = split_edge (e); add_bb_to_loop (new_bb, loop_c); - new_bb->flags = insns ? BB_SUPERBLOCK : 0; - - new_e = EDGE_SUCC (new_bb, 0); - if (e->flags & EDGE_IRREDUCIBLE_LOOP) - { - new_bb->flags |= BB_IRREDUCIBLE_LOOP; - new_e->flags |= EDGE_IRREDUCIBLE_LOOP; - } + new_bb->flags |= (insns ? BB_SUPERBLOCK : 0); if (insns) emit_insn_after (insns, BB_END (new_bb)); diff --git a/gcc/config/i386/scodbx.h b/gcc/config/i386/scodbx.h deleted file mode 100644 index 7da93053256..00000000000 --- a/gcc/config/i386/scodbx.h +++ /dev/null @@ -1,84 +0,0 @@ -/* Definitions for Intel 386 running SCO Unix System V, - using dbx-in-coff encapsulation. - Copyright (C) 1992, 1995, 1996, 1999 Free Software Foundation, Inc. - -This file is part of GNU CC. - -GNU CC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU CC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "i386/svr3dbx.h" - -/* Overridden defines for SCO systems from sco.h. */ - -/* By default, target has a 80387, uses IEEE compatible arithmetic, - and returns float values in the 387, ie, - (TARGET_80387 | TARGET_FLOAT_RETURNS_IN_80387) - - SCO's software emulation of a 387 fails to handle the `fucomp' - opcode. fucomp is only used when generating IEEE compliant code. - So don't make TARGET_IEEE_FP default for SCO. */ - -#undef TARGET_SUBTARGET_DEFAULT -#define TARGET_SUBTARGET_DEFAULT (MASK_80387 | MASK_FLOAT_RETURNS) - -/* Use crt1.o as a startup file and crtn.o as a closing file. */ - -#undef STARTFILE_SPEC -#define STARTFILE_SPEC \ - "%{!r:%{!z:svr3.ifile%s}%{z:svr3z.ifile%s}}\ - %{pg:gcrt1.o%s}%{!pg:%{p:mcrt1.o%s}%{!p:crt1.o%s}}" - -/* Library spec, including SCO international language support. */ - -#undef LIB_SPEC -#define LIB_SPEC \ - "%{p:-L/usr/lib/libp}%{pg:-L/usr/lib/libp} %{scointl:libintl.a%s} -lc" - -/* Specify predefined symbols in preprocessor. */ - -#undef CPP_PREDEFINES -#define CPP_PREDEFINES "-Dunix -DM_UNIX -DM_I386 -DM_COFF -DM_WORDSWAP -Asystem=svr3" - -#undef CPP_SPEC -#define CPP_SPEC "%(cpp_cpu) %{scointl:-DM_INTERNAT}" - -/* This spec is used for telling cpp whether char is signed or not. */ - -#undef SIGNED_CHAR_SPEC -#if DEFAULT_SIGNED_CHAR -#define SIGNED_CHAR_SPEC \ - "%{funsigned-char:-D__CHAR_UNSIGNED__ -D_CHAR_UNSIGNED}" -#else -#define SIGNED_CHAR_SPEC \ - "%{!fsigned-char:-D__CHAR_UNSIGNED__ -D_CHAR_UNSIGNED}" -#endif - -/* caller has to pop the extra argument passed to functions that return - structures. */ - -#undef RETURN_POPS_ARGS -#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) \ - ((FUNDECL) && TREE_CODE (FUNDECL) == IDENTIFIER_NODE ? 0 \ - : (TARGET_RTD \ - && (TYPE_ARG_TYPES (FUNTYPE) == 0 \ - || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (FUNTYPE))) \ - == void_type_node))) ? (SIZE) \ - : 0) -/* On other 386 systems, the last line looks like this: - : (aggregate_value_p (TREE_TYPE (FUNTYPE))) ? GET_MODE_SIZE (Pmode) : 0) */ - -/* Handle #pragma pack. */ -#define HANDLE_SYSV_PRAGMA diff --git a/gcc/config/i386/xm-dgux.h b/gcc/config/i386/xm-dgux.h deleted file mode 100644 index 881c5c7be9d..00000000000 --- a/gcc/config/i386/xm-dgux.h +++ /dev/null @@ -1,4 +0,0 @@ -/* Configuration for GCC for Intel i386 running DG/ux */ - -/* looks just like sysv4 for now */ -#include "xm-svr4.h" diff --git a/gcc/config/i386/xm-sun.h b/gcc/config/i386/xm-sun.h deleted file mode 100644 index 6c0f0a25630..00000000000 --- a/gcc/config/i386/xm-sun.h +++ /dev/null @@ -1,21 +0,0 @@ -/* Configuration for GNU C-compiler for Intel 80386 running SunOS 4.0. - Copyright (C) 1988, 1997 Free Software Foundation, Inc. - -This file is part of GNU CC. - -GNU CC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU CC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#define USG diff --git a/gcc/config/i386/xm-sysv3.h b/gcc/config/i386/xm-sysv3.h deleted file mode 100644 index 9a655443ff5..00000000000 --- a/gcc/config/i386/xm-sysv3.h +++ /dev/null @@ -1,3 +0,0 @@ -/* Configuration for GCC for Intel i386 running System V Release 3. */ - -#include "xm-svr3.h" diff --git a/gcc/config/ia64/ia64-protos.h b/gcc/config/ia64/ia64-protos.h index 19e1335b17e..ab5062c8c72 100644 --- a/gcc/config/ia64/ia64-protos.h +++ b/gcc/config/ia64/ia64-protos.h @@ -77,6 +77,7 @@ extern int ia64_function_arg_partial_nregs (CUMULATIVE_ARGS *, enum machine_mode, tree, int); extern void ia64_function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode, tree, int); +extern int ia64_function_arg_boundary (enum machine_mode, tree); extern void ia64_asm_output_external (FILE *, tree, const char *); #endif /* TREE_CODE */ diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index b51cc7a9408..5eed72144ef 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -3325,10 +3325,11 @@ ia64_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode, cum->fp_regs = fp_regs; } - /* Integral and aggregates go in general registers. If we have run out of - FR registers, then FP values must also go in general registers. This can - happen when we have a SFmode HFA. */ - else if (! FLOAT_MODE_P (mode) || cum->fp_regs == MAX_ARGUMENT_SLOTS) + /* Integral and aggregates go in general registers. So do TFmode FP values. + If we have run out of FR registers, then other FP values must also go in + general registers. This can happen when we have a SFmode HFA. */ + else if (mode == TFmode || mode == TCmode + || (! FLOAT_MODE_P (mode) || cum->fp_regs == MAX_ARGUMENT_SLOTS)) cum->int_regs = cum->words; /* If there is a prototype, then FP values go in a FR register when @@ -3351,6 +3352,31 @@ ia64_function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode, } } +/* Arguments with alignment larger than 8 bytes start at the next even + boundary. On ILP32 HPUX, TFmode arguments start on next even boundary + even though their normal alignment is 8 bytes. See ia64_function_arg. */ + +int +ia64_function_arg_boundary (enum machine_mode mode, tree type) +{ + + if (mode == TFmode && TARGET_HPUX && TARGET_ILP32) + return PARM_BOUNDARY * 2; + + if (type) + { + if (TYPE_ALIGN (type) > PARM_BOUNDARY) + return PARM_BOUNDARY * 2; + else + return PARM_BOUNDARY; + } + + if (GET_MODE_BITSIZE (mode) > PARM_BOUNDARY) + return PARM_BOUNDARY * 2; + else + return PARM_BOUNDARY; +} + /* Variable sized types are passed by reference. */ /* ??? At present this is a GCC extension to the IA-64 ABI. */ diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h index 58304a9b366..aab51f83000 100644 --- a/gcc/config/ia64/ia64.h +++ b/gcc/config/ia64/ia64.h @@ -1376,15 +1376,11 @@ do { \ /* If defined, a C expression that gives the alignment boundary, in bits, of an argument with the specified mode and type. */ -/* Arguments with alignment larger than 8 bytes start at the next even - boundary. See ia64_function_arg. */ +/* Return the alignment boundary in bits for an argument with a specified + mode and type. */ #define FUNCTION_ARG_BOUNDARY(MODE, TYPE) \ - (((TYPE) ? (TYPE_ALIGN (TYPE) > 8 * BITS_PER_UNIT) \ - : (((((MODE) == BLKmode \ - ? int_size_in_bytes (TYPE) : GET_MODE_SIZE (MODE)) \ - + UNITS_PER_WORD - 1) / UNITS_PER_WORD) > 1)) \ - ? 128 : PARM_BOUNDARY) + ia64_function_arg_boundary (MODE, TYPE) /* A C expression that is nonzero if REGNO is the number of a hard register in which function arguments are sometimes passed. This does *not* include diff --git a/gcc/config/m32r/m32r.c b/gcc/config/m32r/m32r.c index 9e3404a1891..b5621568997 100644 --- a/gcc/config/m32r/m32r.c +++ b/gcc/config/m32r/m32r.c @@ -1591,8 +1591,8 @@ static struct m32r_frame_info zero_frame_info; The return address and frame pointer are treated separately. Don't consider them here. */ #define MUST_SAVE_REGISTER(regno, interrupt_p) \ -((regno) != RETURN_ADDR_REGNUM && (regno) != FRAME_POINTER_REGNUM \ - && (regs_ever_live[regno] && (!call_used_regs[regno] || interrupt_p))) + ((regno) != RETURN_ADDR_REGNUM && (regno) != FRAME_POINTER_REGNUM \ + && (regs_ever_live[regno] && (!call_really_used_regs[regno] || interrupt_p))) #define MUST_SAVE_FRAME_POINTER (regs_ever_live[FRAME_POINTER_REGNUM]) #define MUST_SAVE_RETURN_ADDR (regs_ever_live[RETURN_ADDR_REGNUM] || current_function_profile) diff --git a/gcc/config/m32r/m32r.h b/gcc/config/m32r/m32r.h index 9befbeee570..d5aa56b82e6 100644 --- a/gcc/config/m32r/m32r.h +++ b/gcc/config/m32r/m32r.h @@ -633,6 +633,8 @@ extern enum m32r_sdata m32r_sdata; SUBTARGET_CALL_USED_REGISTERS \ } +#define CALL_REALLY_USED_REGISTERS CALL_USED_REGISTERS + /* Zero or more C statements that may conditionally modify two variables `fixed_regs' and `call_used_regs' (both of type `char []') after they have been initialized from the two preceding macros. @@ -649,7 +651,10 @@ extern enum m32r_sdata m32r_sdata; do \ { \ if (flag_pic) \ - fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \ + { \ + fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \ + call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \ + } \ } \ while (0) #endif diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 242c2f76aa0..048e5a8a365 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -292,6 +292,7 @@ static void mips_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, static int symbolic_expression_p (rtx); static void mips_select_rtx_section (enum machine_mode, rtx, unsigned HOST_WIDE_INT); +static void mips_function_rodata_section (tree); static bool mips_in_small_data_p (tree); static int mips_fpr_return_fields (tree, tree *); static bool mips_return_in_msb (tree); @@ -722,6 +723,8 @@ const struct mips_cpu_info mips_cpu_info_table[] = { #define TARGET_ASM_FUNCTION_EPILOGUE mips_output_function_epilogue #undef TARGET_ASM_SELECT_RTX_SECTION #define TARGET_ASM_SELECT_RTX_SECTION mips_select_rtx_section +#undef TARGET_ASM_FUNCTION_RODATA_SECTION +#define TARGET_ASM_FUNCTION_RODATA_SECTION mips_function_rodata_section #undef TARGET_SCHED_REORDER #define TARGET_SCHED_REORDER mips_sched_reorder @@ -6574,6 +6577,42 @@ mips_select_rtx_section (enum machine_mode mode, rtx x, } } +/* Implement TARGET_ASM_FUNCTION_RODATA_SECTION. + + The complication here is that, with the combination TARGET_ABICALLS + && !TARGET_GPWORD, jump tables will use absolute addresses, and should + therefore not be included in the read-only part of a DSO. Handle such + cases by selecting a normal data section instead of a read-only one. + The logic apes that in default_function_rodata_section. */ + +static void +mips_function_rodata_section (tree decl) +{ + if (!TARGET_ABICALLS || TARGET_GPWORD) + default_function_rodata_section (decl); + else if (decl && DECL_SECTION_NAME (decl)) + { + const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl)); + if (DECL_ONE_ONLY (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0) + { + char *rname = ASTRDUP (name); + rname[14] = 'd'; + named_section_real (rname, SECTION_LINKONCE | SECTION_WRITE, decl); + } + else if (flag_function_sections && flag_data_sections + && strncmp (name, ".text.", 6) == 0) + { + char *rname = ASTRDUP (name); + memcpy (rname + 1, "data", 4); + named_section_flags (rname, SECTION_WRITE); + } + else + data_section (); + } + else + data_section (); +} + /* Implement TARGET_IN_SMALL_DATA_P. Return true if it would be safe to access DECL using %gp_rel(...)($gp). */ diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md index 70428ae78ed..3bcc72a6f90 100644 --- a/gcc/config/mips/mips.md +++ b/gcc/config/mips/mips.md @@ -2828,8 +2828,7 @@ beq\t%2,%.,1b\;\ "!TARGET_MIPS16" "l\t%0,%2" [(set_attr "type" "load") - (set_attr "mode" "") - (set_attr "hazard" "none")]) + (set_attr "mode" "")]) (define_insn "mov_r" [(set (match_operand:GPR 0 "register_operand" "=d") diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index 5c5d8bf39f0..18fb21706a3 100644 --- a/gcc/config/pa/pa.h +++ b/gcc/config/pa/pa.h @@ -918,7 +918,8 @@ struct hppa_args {int words, nargs_prototype, incoming, indirect; }; We use a DImode register in the parallel for 5 to 7 byte structures so that there is only one element. This allows the object to be correctly padded. */ -#define BLOCK_REG_PADDING(MODE, TYPE, FIRST) (TARGET_64BIT ? upward : downward) +#define BLOCK_REG_PADDING(MODE, TYPE, FIRST) \ + function_arg_padding ((MODE), (TYPE)) /* Do not expect to understand this without reading it several times. I'm tempted to try and simply it, but I worry about breaking something. */ diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md index 0eb29b1ea37..17866a9131e 100644 --- a/gcc/config/rs6000/altivec.md +++ b/gcc/config/rs6000/altivec.md @@ -23,6 +23,30 @@ [(UNSPEC_VSPLTISW 141) (UNSPEC_VSPLTISH 140) (UNSPEC_VSPLTISB 139) + (UNSPEC_VCMPBFP 50) + (UNSPEC_VCMPEQUB 51) + (UNSPEC_VCMPEQUH 52) + (UNSPEC_VCMPEQUW 53) + (UNSPEC_VCMPEQFP 54) + (UNSPEC_VCMPGEFP 55) + (UNSPEC_VCMPGTUB 56) + (UNSPEC_VCMPGTSB 57) + (UNSPEC_VCMPGTUH 58) + (UNSPEC_VCMPGTSH 59) + (UNSPEC_VCMPGTUW 60) + (UNSPEC_VCMPGTSW 61) + (UNSPEC_VCMPGTFP 62) + (UNSPEC_VSEL4SI 159) + (UNSPEC_VSEL4SF 160) + (UNSPEC_VSEL8HI 161) + (UNSPEC_VSEL16QI 162) + (UNSPEC_VCOND_V4SI 301) + (UNSPEC_VCOND_V4SF 302) + (UNSPEC_VCOND_V8HI 303) + (UNSPEC_VCOND_V16QI 304) + (UNSPEC_VCONDU_V4SI 305) + (UNSPEC_VCONDU_V8HI 306) + (UNSPEC_VCONDU_V16QI 307) ]) ;; Generic LVX load instruction. @@ -496,7 +520,8 @@ (define_insn "altivec_vcmpbfp" [(set (match_operand:V4SI 0 "register_operand" "=v") (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v") - (match_operand:V4SF 2 "register_operand" "v")] 50))] + (match_operand:V4SF 2 "register_operand" "v")] + UNSPEC_VCMPBFP))] "TARGET_ALTIVEC" "vcmpbfp %0,%1,%2" [(set_attr "type" "veccmp")]) @@ -504,7 +529,8 @@ (define_insn "altivec_vcmpequb" [(set (match_operand:V16QI 0 "register_operand" "=v") (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v") - (match_operand:V16QI 2 "register_operand" "v")] 51))] + (match_operand:V16QI 2 "register_operand" "v")] + UNSPEC_VCMPEQUB))] "TARGET_ALTIVEC" "vcmpequb %0,%1,%2" [(set_attr "type" "vecsimple")]) @@ -512,7 +538,8 @@ (define_insn "altivec_vcmpequh" [(set (match_operand:V8HI 0 "register_operand" "=v") (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v") - (match_operand:V8HI 2 "register_operand" "v")] 52))] + (match_operand:V8HI 2 "register_operand" "v")] + UNSPEC_VCMPEQUH))] "TARGET_ALTIVEC" "vcmpequh %0,%1,%2" [(set_attr "type" "vecsimple")]) @@ -520,7 +547,8 @@ (define_insn "altivec_vcmpequw" [(set (match_operand:V4SI 0 "register_operand" "=v") (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v") - (match_operand:V4SI 2 "register_operand" "v")] 53))] + (match_operand:V4SI 2 "register_operand" "v")] + UNSPEC_VCMPEQUW))] "TARGET_ALTIVEC" "vcmpequw %0,%1,%2" [(set_attr "type" "vecsimple")]) @@ -528,7 +556,8 @@ (define_insn "altivec_vcmpeqfp" [(set (match_operand:V4SI 0 "register_operand" "=v") (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v") - (match_operand:V4SF 2 "register_operand" "v")] 54))] + (match_operand:V4SF 2 "register_operand" "v")] + UNSPEC_VCMPEQFP))] "TARGET_ALTIVEC" "vcmpeqfp %0,%1,%2" [(set_attr "type" "veccmp")]) @@ -536,7 +565,8 @@ (define_insn "altivec_vcmpgefp" [(set (match_operand:V4SI 0 "register_operand" "=v") (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v") - (match_operand:V4SF 2 "register_operand" "v")] 55))] + (match_operand:V4SF 2 "register_operand" "v")] + UNSPEC_VCMPGEFP))] "TARGET_ALTIVEC" "vcmpgefp %0,%1,%2" [(set_attr "type" "veccmp")]) @@ -544,7 +574,8 @@ (define_insn "altivec_vcmpgtub" [(set (match_operand:V16QI 0 "register_operand" "=v") (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v") - (match_operand:V16QI 2 "register_operand" "v")] 56))] + (match_operand:V16QI 2 "register_operand" "v")] + UNSPEC_VCMPGTUB))] "TARGET_ALTIVEC" "vcmpgtub %0,%1,%2" [(set_attr "type" "vecsimple")]) @@ -552,7 +583,8 @@ (define_insn "altivec_vcmpgtsb" [(set (match_operand:V16QI 0 "register_operand" "=v") (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v") - (match_operand:V16QI 2 "register_operand" "v")] 57))] + (match_operand:V16QI 2 "register_operand" "v")] + UNSPEC_VCMPGTSB))] "TARGET_ALTIVEC" "vcmpgtsb %0,%1,%2" [(set_attr "type" "vecsimple")]) @@ -560,7 +592,8 @@ (define_insn "altivec_vcmpgtuh" [(set (match_operand:V8HI 0 "register_operand" "=v") (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v") - (match_operand:V8HI 2 "register_operand" "v")] 58))] + (match_operand:V8HI 2 "register_operand" "v")] + UNSPEC_VCMPGTUH))] "TARGET_ALTIVEC" "vcmpgtuh %0,%1,%2" [(set_attr "type" "vecsimple")]) @@ -568,7 +601,8 @@ (define_insn "altivec_vcmpgtsh" [(set (match_operand:V8HI 0 "register_operand" "=v") (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v") - (match_operand:V8HI 2 "register_operand" "v")] 59))] + (match_operand:V8HI 2 "register_operand" "v")] + UNSPEC_VCMPGTSH))] "TARGET_ALTIVEC" "vcmpgtsh %0,%1,%2" [(set_attr "type" "vecsimple")]) @@ -576,7 +610,8 @@ (define_insn "altivec_vcmpgtuw" [(set (match_operand:V4SI 0 "register_operand" "=v") (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v") - (match_operand:V4SI 2 "register_operand" "v")] 60))] + (match_operand:V4SI 2 "register_operand" "v")] + UNSPEC_VCMPGTUW))] "TARGET_ALTIVEC" "vcmpgtuw %0,%1,%2" [(set_attr "type" "vecsimple")]) @@ -584,7 +619,8 @@ (define_insn "altivec_vcmpgtsw" [(set (match_operand:V4SI 0 "register_operand" "=v") (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v") - (match_operand:V4SI 2 "register_operand" "v")] 61))] + (match_operand:V4SI 2 "register_operand" "v")] + UNSPEC_VCMPGTSW))] "TARGET_ALTIVEC" "vcmpgtsw %0,%1,%2" [(set_attr "type" "vecsimple")]) @@ -592,7 +628,8 @@ (define_insn "altivec_vcmpgtfp" [(set (match_operand:V4SI 0 "register_operand" "=v") (unspec:V4SI [(match_operand:V4SF 1 "register_operand" "v") - (match_operand:V4SF 2 "register_operand" "v")] 62))] + (match_operand:V4SF 2 "register_operand" "v")] + UNSPEC_VCMPGTFP))] "TARGET_ALTIVEC" "vcmpgtfp %0,%1,%2" [(set_attr "type" "veccmp")]) @@ -1640,11 +1677,146 @@ "vrefp %0,%1" [(set_attr "type" "vecfloat")]) +(define_expand "vcondv4si" + [(set (match_operand:V4SI 0 "register_operand" "=v") + (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v") + (match_operand:V4SI 2 "register_operand" "v") + (match_operand:V4SI 3 "comparison_operator" "") + (match_operand:V4SI 4 "register_operand" "v") + (match_operand:V4SI 5 "register_operand" "v") + ] UNSPEC_VCOND_V4SI))] + "TARGET_ALTIVEC" + " +{ + if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2], + operands[3], operands[4], operands[5])) + DONE; + else + FAIL; +} + ") + +(define_expand "vconduv4si" + [(set (match_operand:V4SI 0 "register_operand" "=v") + (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v") + (match_operand:V4SI 2 "register_operand" "v") + (match_operand:V4SI 3 "comparison_operator" "") + (match_operand:V4SI 4 "register_operand" "v") + (match_operand:V4SI 5 "register_operand" "v") + ] UNSPEC_VCONDU_V4SI))] + "TARGET_ALTIVEC" + " +{ + if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2], + operands[3], operands[4], operands[5])) + DONE; + else + FAIL; +} + ") + +(define_expand "vcondv4sf" + [(set (match_operand:V4SF 0 "register_operand" "=v") + (unspec:V4SF [(match_operand:V4SI 1 "register_operand" "v") + (match_operand:V4SF 2 "register_operand" "v") + (match_operand:V4SF 3 "comparison_operator" "") + (match_operand:V4SF 4 "register_operand" "v") + (match_operand:V4SF 5 "register_operand" "v") + ] UNSPEC_VCOND_V4SF))] + "TARGET_ALTIVEC" + " +{ + if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2], + operands[3], operands[4], operands[5])) + DONE; + else + FAIL; +} + ") + +(define_expand "vcondv8hi" + [(set (match_operand:V4SF 0 "register_operand" "=v") + (unspec:V8HI [(match_operand:V4SI 1 "register_operand" "v") + (match_operand:V8HI 2 "register_operand" "v") + (match_operand:V8HI 3 "comparison_operator" "") + (match_operand:V8HI 4 "register_operand" "v") + (match_operand:V8HI 5 "register_operand" "v") + ] UNSPEC_VCOND_V8HI))] + "TARGET_ALTIVEC" + " +{ + if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2], + operands[3], operands[4], operands[5])) + DONE; + else + FAIL; +} + ") + +(define_expand "vconduv8hi" + [(set (match_operand:V4SF 0 "register_operand" "=v") + (unspec:V8HI [(match_operand:V4SI 1 "register_operand" "v") + (match_operand:V8HI 2 "register_operand" "v") + (match_operand:V8HI 3 "comparison_operator" "") + (match_operand:V8HI 4 "register_operand" "v") + (match_operand:V8HI 5 "register_operand" "v") + ] UNSPEC_VCONDU_V8HI))] + "TARGET_ALTIVEC" + " +{ + if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2], + operands[3], operands[4], operands[5])) + DONE; + else + FAIL; +} + ") + +(define_expand "vcondv16qi" + [(set (match_operand:V4SF 0 "register_operand" "=v") + (unspec:V16QI [(match_operand:V4SI 1 "register_operand" "v") + (match_operand:V16QI 2 "register_operand" "v") + (match_operand:V16QI 3 "comparison_operator" "") + (match_operand:V16QI 4 "register_operand" "v") + (match_operand:V16QI 5 "register_operand" "v") + ] UNSPEC_VCOND_V16QI))] + "TARGET_ALTIVEC" + " +{ + if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2], + operands[3], operands[4], operands[5])) + DONE; + else + FAIL; +} + ") + +(define_expand "vconduv16qi" + [(set (match_operand:V4SF 0 "register_operand" "=v") + (unspec:V16QI [(match_operand:V4SI 1 "register_operand" "v") + (match_operand:V16QI 2 "register_operand" "v") + (match_operand:V16QI 3 "comparison_operator" "") + (match_operand:V16QI 4 "register_operand" "v") + (match_operand:V16QI 5 "register_operand" "v") + ] UNSPEC_VCONDU_V16QI))] + "TARGET_ALTIVEC" + " +{ + if (rs6000_emit_vector_cond_expr (operands[0], operands[1], operands[2], + operands[3], operands[4], operands[5])) + DONE; + else + FAIL; +} + ") + + (define_insn "altivec_vsel_4si" [(set (match_operand:V4SI 0 "register_operand" "=v") (unspec:V4SI [(match_operand:V4SI 1 "register_operand" "v") (match_operand:V4SI 2 "register_operand" "v") - (match_operand:V4SI 3 "register_operand" "v")] 159))] + (match_operand:V4SI 3 "register_operand" "v")] + UNSPEC_VSEL4SI))] "TARGET_ALTIVEC" "vsel %0,%1,%2,%3" [(set_attr "type" "vecperm")]) @@ -1653,7 +1825,8 @@ [(set (match_operand:V4SF 0 "register_operand" "=v") (unspec:V4SF [(match_operand:V4SF 1 "register_operand" "v") (match_operand:V4SF 2 "register_operand" "v") - (match_operand:V4SI 3 "register_operand" "v")] 160))] + (match_operand:V4SI 3 "register_operand" "v")] + UNSPEC_VSEL4SF))] "TARGET_ALTIVEC" "vsel %0,%1,%2,%3" [(set_attr "type" "vecperm")]) @@ -1662,7 +1835,8 @@ [(set (match_operand:V8HI 0 "register_operand" "=v") (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v") (match_operand:V8HI 2 "register_operand" "v") - (match_operand:V8HI 3 "register_operand" "v")] 161))] + (match_operand:V8HI 3 "register_operand" "v")] + UNSPEC_VSEL8HI))] "TARGET_ALTIVEC" "vsel %0,%1,%2,%3" [(set_attr "type" "vecperm")]) @@ -1671,7 +1845,8 @@ [(set (match_operand:V16QI 0 "register_operand" "=v") (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v") (match_operand:V16QI 2 "register_operand" "v") - (match_operand:V16QI 3 "register_operand" "v")] 162))] + (match_operand:V16QI 3 "register_operand" "v")] + UNSPEC_VSEL16QI))] "TARGET_ALTIVEC" "vsel %0,%1,%2,%3" [(set_attr "type" "vecperm")]) diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h index 32034dedab7..d3a3122ed5c 100644 --- a/gcc/config/rs6000/rs6000-protos.h +++ b/gcc/config/rs6000/rs6000-protos.h @@ -124,6 +124,7 @@ extern char * output_cbranch (rtx, const char *, int, rtx); extern char * output_e500_flip_eq_bit (rtx, rtx); extern rtx rs6000_emit_set_const (rtx, enum machine_mode, rtx, int); extern int rs6000_emit_cmove (rtx, rtx, rtx, rtx); +extern int rs6000_emit_vector_cond_expr (rtx, rtx, rtx, rtx, rtx, rtx); extern void rs6000_emit_minmax (rtx, enum rtx_code, rtx, rtx); extern void output_toc (FILE *, rtx, int, enum machine_mode); extern void rs6000_initialize_trampoline (rtx, rtx, rtx); diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index be377ebf440..0d5c8b4d4b0 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -760,7 +760,15 @@ static tree rs6000_build_builtin_va_list (void); static tree rs6000_gimplify_va_arg (tree, tree, tree *, tree *); static bool rs6000_must_pass_in_stack (enum machine_mode, tree); static bool rs6000_vector_mode_supported_p (enum machine_mode); +static int get_vec_cmp_insn (enum rtx_code, enum machine_mode, + enum machine_mode); +static rtx rs6000_emit_vector_compare (enum rtx_code, rtx, rtx, + enum machine_mode); +static int get_vsel_insn (enum machine_mode); +static void rs6000_emit_vector_select (rtx, rtx, rtx, rtx); + +const int INSN_NOT_AVAILABLE = -1; static enum machine_mode rs6000_eh_return_filter_mode (void); /* Hash table stuff for keeping track of TOC entries. */ @@ -11202,6 +11210,271 @@ output_e500_flip_eq_bit (rtx dst, rtx src) return string; } +/* Return insn index for the vector compare instruction for given CODE, + and DEST_MODE, OP_MODE. Return INSN_NOT_AVAILABLE if valid insn is + not available. */ + +static int +get_vec_cmp_insn (enum rtx_code code, + enum machine_mode dest_mode, + enum machine_mode op_mode) +{ + if (!TARGET_ALTIVEC) + return INSN_NOT_AVAILABLE; + + switch (code) + { + case EQ: + if (dest_mode == V16QImode && op_mode == V16QImode) + return UNSPEC_VCMPEQUB; + if (dest_mode == V8HImode && op_mode == V8HImode) + return UNSPEC_VCMPEQUH; + if (dest_mode == V4SImode && op_mode == V4SImode) + return UNSPEC_VCMPEQUW; + if (dest_mode == V4SImode && op_mode == V4SFmode) + return UNSPEC_VCMPEQFP; + break; + case GE: + if (dest_mode == V4SImode && op_mode == V4SFmode) + return UNSPEC_VCMPGEFP; + case GT: + if (dest_mode == V16QImode && op_mode == V16QImode) + return UNSPEC_VCMPGTSB; + if (dest_mode == V8HImode && op_mode == V8HImode) + return UNSPEC_VCMPGTSH; + if (dest_mode == V4SImode && op_mode == V4SImode) + return UNSPEC_VCMPGTSW; + if (dest_mode == V4SImode && op_mode == V4SFmode) + return UNSPEC_VCMPGTFP; + break; + case GTU: + if (dest_mode == V16QImode && op_mode == V16QImode) + return UNSPEC_VCMPGTUB; + if (dest_mode == V8HImode && op_mode == V8HImode) + return UNSPEC_VCMPGTUH; + if (dest_mode == V4SImode && op_mode == V4SImode) + return UNSPEC_VCMPGTUW; + break; + default: + break; + } + return INSN_NOT_AVAILABLE; +} + +/* Emit vector compare for operands OP0 and OP1 using code RCODE. + DMODE is expected destination mode. This is a recursive function. */ + +static rtx +rs6000_emit_vector_compare (enum rtx_code rcode, + rtx op0, rtx op1, + enum machine_mode dmode) +{ + int vec_cmp_insn; + rtx mask; + enum machine_mode dest_mode; + enum machine_mode op_mode = GET_MODE (op1); + +#ifdef ENABLE_CHECKING + if (!TARGET_ALTIVEC) + abort (); + + if (GET_MODE (op0) != GET_MODE (op1)) + abort (); +#endif + + /* Floating point vector compare instructions uses destination V4SImode. + Move destination to appropriate mode later. */ + if (dmode == V4SFmode) + dest_mode = V4SImode; + else + dest_mode = dmode; + + mask = gen_reg_rtx (dest_mode); + vec_cmp_insn = get_vec_cmp_insn (rcode, dest_mode, op_mode); + + if (vec_cmp_insn == INSN_NOT_AVAILABLE) + { + bool swap_operands = false; + bool try_again = false; + switch (rcode) + { + case LT: + rcode = GT; + swap_operands = true; + try_again = true; + break; + case LTU: + rcode = GTU; + swap_operands = true; + try_again = true; + break; + case NE: + /* Treat A != B as ~(A==B). */ + { + enum insn_code nor_code; + rtx eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1, + dest_mode); + + nor_code = one_cmpl_optab->handlers[(int)dest_mode].insn_code; + if (nor_code == CODE_FOR_nothing) + abort (); + emit_insn (GEN_FCN (nor_code) (mask, eq_rtx)); + + if (dmode != dest_mode) + { + rtx temp = gen_reg_rtx (dest_mode); + convert_move (temp, mask, 0); + return temp; + } + return mask; + } + break; + case GE: + case GEU: + case LE: + case LEU: + /* Try GT/GTU/LT/LTU OR EQ */ + { + rtx c_rtx, eq_rtx; + enum insn_code ior_code; + enum rtx_code new_code; + + if (rcode == GE) + new_code = GT; + else if (rcode == GEU) + new_code = GTU; + else if (rcode == LE) + new_code = LT; + else if (rcode == LEU) + new_code = LTU; + else + abort (); + + c_rtx = rs6000_emit_vector_compare (new_code, + op0, op1, dest_mode); + eq_rtx = rs6000_emit_vector_compare (EQ, op0, op1, + dest_mode); + + ior_code = ior_optab->handlers[(int)dest_mode].insn_code; + if (ior_code == CODE_FOR_nothing) + abort (); + emit_insn (GEN_FCN (ior_code) (mask, c_rtx, eq_rtx)); + if (dmode != dest_mode) + { + rtx temp = gen_reg_rtx (dest_mode); + convert_move (temp, mask, 0); + return temp; + } + return mask; + } + break; + default: + abort (); + } + + if (try_again) + { + vec_cmp_insn = get_vec_cmp_insn (rcode, dest_mode, op_mode); + if (vec_cmp_insn == INSN_NOT_AVAILABLE) + /* You only get two chances. */ + abort (); + } + + if (swap_operands) + { + rtx tmp; + tmp = op0; + op0 = op1; + op1 = tmp; + } + } + + emit_insn (gen_rtx_fmt_ee (SET, + VOIDmode, + mask, + gen_rtx_fmt_Ei (UNSPEC, dest_mode, + gen_rtvec (2, op0, op1), + vec_cmp_insn))); + if (dmode != dest_mode) + { + rtx temp = gen_reg_rtx (dest_mode); + convert_move (temp, mask, 0); + return temp; + } + return mask; +} + +/* Return vector select instruction for MODE. Return INSN_NOT_AVAILABLE, if + valid insn doesn exist for given mode. */ + +static int +get_vsel_insn (enum machine_mode mode) +{ + switch (mode) + { + case V4SImode: + return UNSPEC_VSEL4SI; + break; + case V4SFmode: + return UNSPEC_VSEL4SF; + break; + case V8HImode: + return UNSPEC_VSEL8HI; + break; + case V16QImode: + return UNSPEC_VSEL16QI; + break; + default: + return INSN_NOT_AVAILABLE; + break; + } + return INSN_NOT_AVAILABLE; +} + +/* Emit vector select insn where DEST is destination using + operands OP1, OP2 and MASK. */ + +static void +rs6000_emit_vector_select (rtx dest, rtx op1, rtx op2, rtx mask) +{ + rtx t, temp; + enum machine_mode dest_mode = GET_MODE (dest); + int vsel_insn_index = get_vsel_insn (GET_MODE (dest)); + + temp = gen_reg_rtx (dest_mode); + + t = gen_rtx_fmt_ee (SET, VOIDmode, temp, + gen_rtx_fmt_Ei (UNSPEC, dest_mode, + gen_rtvec (3, op1, op2, mask), + vsel_insn_index)); + emit_insn (t); + emit_move_insn (dest, temp); + return; +} + +/* Emit vector conditional expression. + DEST is destination. OP1 and OP2 are two VEC_COND_EXPR operands. + CC_OP0 and CC_OP1 are the two operands for the relation operation COND. */ + +int +rs6000_emit_vector_cond_expr (rtx dest, rtx op1, rtx op2, + rtx cond, rtx cc_op0, rtx cc_op1) +{ + enum machine_mode dest_mode = GET_MODE (dest); + enum rtx_code rcode = GET_CODE (cond); + rtx mask; + + if (!TARGET_ALTIVEC) + return 0; + + /* Get the vector mask for the given relational operations. */ + mask = rs6000_emit_vector_compare (rcode, cc_op0, cc_op1, dest_mode); + + rs6000_emit_vector_select (dest, op1, op2, mask); + + return 1; +} + /* Emit a conditional move: move TRUE_COND to DEST if OP of the operands of the last comparison is nonzero/true, FALSE_COND if it is zero/false. Return 0 if the hardware has no such operation. */ @@ -11216,6 +11489,7 @@ rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond) enum machine_mode compare_mode = GET_MODE (op0); enum machine_mode result_mode = GET_MODE (dest); rtx temp; + bool is_against_zero; /* These modes should always match. */ if (GET_MODE (op1) != compare_mode @@ -11240,6 +11514,17 @@ rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond) && GET_MODE_CLASS (compare_mode) == MODE_FLOAT) return 0; + is_against_zero = op1 == CONST0_RTX (compare_mode); + + /* A floating-point subtract might overflow, underflow, or produce + an inexact result, thus changing the floating-point flags, so it + can't be generated if we care about that. It's safe if one side + of the construct is zero, since then no subtract will be + generated. */ + if (GET_MODE_CLASS (compare_mode) == MODE_FLOAT + && flag_trapping_math && ! is_against_zero) + return 0; + /* Eliminate half of the comparisons by switching operands, this makes the remaining code simpler. */ if (code == UNLT || code == UNGT || code == UNORDERED || code == NE @@ -11272,14 +11557,18 @@ rs6000_emit_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond) || (! rtx_equal_p (op0, true_cond) && ! rtx_equal_p (op1, true_cond)))) return 0; + /* At this point we know we can use fsel. */ /* Reduce the comparison to a comparison against zero. */ - temp = gen_reg_rtx (compare_mode); - emit_insn (gen_rtx_SET (VOIDmode, temp, - gen_rtx_MINUS (compare_mode, op0, op1))); - op0 = temp; - op1 = CONST0_RTX (compare_mode); + if (! is_against_zero) + { + temp = gen_reg_rtx (compare_mode); + emit_insn (gen_rtx_SET (VOIDmode, temp, + gen_rtx_MINUS (compare_mode, op0, op1))); + op0 = temp; + op1 = CONST0_RTX (compare_mode); + } /* If we don't care about NaNs we can reduce some of the comparisons down to faster ones. */ diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h index 79a44a0ef57..59bef4137ea 100644 --- a/gcc/config/rs6000/sysv4.h +++ b/gcc/config/rs6000/sysv4.h @@ -1110,12 +1110,12 @@ extern int fixuplabelno; #ifdef HAVE_LD_PIE #define STARTFILE_LINUX_SPEC "\ -%{!shared: %{pg|p:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \ +%{!shared: %{pg|p|profile:gcrt1.o%s;pie:Scrt1.o%s;:crt1.o%s}} \ %{mnewlib:ecrti.o%s;:crti.o%s} \ %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}" #else #define STARTFILE_LINUX_SPEC "\ -%{!shared: %{pg|p:gcrt1.o%s;:crt1.o%s}} \ +%{!shared: %{pg|p|profile:gcrt1.o%s;:crt1.o%s}} \ %{mnewlib:ecrti.o%s;:crti.o%s} \ %{static:crtbeginT.o%s;shared|pie:crtbeginS.o%s;:crtbegin.o%s}" #endif diff --git a/gcc/config/s390/s390-protos.h b/gcc/config/s390/s390-protos.h index 78b90a8b32c..4e88c1d0123 100644 --- a/gcc/config/s390/s390-protos.h +++ b/gcc/config/s390/s390-protos.h @@ -37,7 +37,6 @@ extern int const0_operand (rtx, enum machine_mode); extern int consttable_operand (rtx, enum machine_mode); extern int larl_operand (rtx, enum machine_mode); extern int s_operand (rtx, enum machine_mode); -extern int s_imm_operand (rtx, enum machine_mode); extern int shift_count_operand (rtx, enum machine_mode); extern int bras_sym_operand (rtx, enum machine_mode); extern int load_multiple_operation (rtx, enum machine_mode); @@ -88,6 +87,8 @@ extern rtx s390_emit_call (rtx, rtx, rtx, rtx); extern void s390_expand_logical_operator (enum rtx_code, enum machine_mode, rtx *); extern bool s390_logical_operator_ok_p (rtx *); +extern void s390_narrow_logical_operator (enum rtx_code, rtx *, rtx *); +extern bool s390_pool_operand (rtx); extern bool s390_output_addr_const_extra (FILE*, rtx); extern void print_operand_address (FILE *, rtx); diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index c1414cf48f3..1d4d813458b 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -195,9 +195,9 @@ enum processor_flags s390_arch_flags; const char *s390_tune_string; /* for -mtune= */ const char *s390_arch_string; /* for -march= */ -/* String to specify backchain mode. */ -const char *s390_backchain_string = ""; /* "" no-backchain ,"1" backchain, - "2" kernel-backchain */ +/* String to specify backchain mode: + "" no-backchain, "1" backchain, "2" kernel-backchain. */ +const char *s390_backchain_string = TARGET_DEFAULT_BACKCHAIN; const char *s390_warn_framesize_string; const char *s390_warn_dynamicstack_string; @@ -279,7 +279,6 @@ static int s390_match_ccmode_set (rtx, enum machine_mode); static int s390_branch_condition_mask (rtx); static const char *s390_branch_condition_mnemonic (rtx, int); static int check_mode (rtx, enum machine_mode *); -static int general_s_operand (rtx, enum machine_mode, int); static int s390_short_displacement (rtx); static int s390_decompose_address (rtx, struct s390_address *); static rtx get_thread_pointer (void); @@ -1167,6 +1166,27 @@ s390_logical_operator_ok_p (rtx *operands) return true; } +/* Narrow logical operation CODE of memory operand MEMOP with immediate + operand IMMOP to switch from SS to SI type instructions. */ + +void +s390_narrow_logical_operator (enum rtx_code code, rtx *memop, rtx *immop) +{ + int def = code == AND ? -1 : 0; + HOST_WIDE_INT mask; + int part; + + gcc_assert (GET_CODE (*memop) == MEM); + gcc_assert (!MEM_VOLATILE_P (*memop)); + + mask = s390_extract_part (*immop, QImode, def); + part = s390_single_part (*immop, GET_MODE (*memop), QImode, def); + gcc_assert (part >= 0); + + *memop = adjust_address (*memop, QImode, part); + *immop = gen_int_mode (mask, QImode); +} + /* Change optimizations to be performed, depending on the optimization level. @@ -1423,15 +1443,12 @@ larl_operand (register rtx op, enum machine_mode mode) return 0; } -/* Helper routine to implement s_operand and s_imm_operand. +/* Return true if OP is a valid S-type operand. OP is the current operation. - MODE is the current operation mode. - ALLOW_IMMEDIATE specifies whether immediate operands should - be accepted or not. */ + MODE is the current operation mode. */ -static int -general_s_operand (register rtx op, enum machine_mode mode, - int allow_immediate) +int +s_operand (rtx op, enum machine_mode mode) { struct s390_address addr; @@ -1447,58 +1464,49 @@ general_s_operand (register rtx op, enum machine_mode mode, && GET_CODE (SUBREG_REG (op)) == MEM) op = SUBREG_REG (op); - switch (GET_CODE (op)) - { - /* Constants are OK as s-operand if ALLOW_IMMEDIATE - is true and we are still before reload. */ - case CONST_INT: - case CONST_DOUBLE: - if (!allow_immediate || reload_completed) - return 0; - return 1; - - /* Memory operands are OK unless they already use an - index register. */ - case MEM: - if (!s390_decompose_address (XEXP (op, 0), &addr)) - return 0; - if (addr.indx) - return 0; - /* Do not allow literal pool references unless ALLOW_IMMEDIATE - is true. This prevents compares between two literal pool - entries from being accepted. */ - if (!allow_immediate - && addr.base && REGNO (addr.base) == BASE_REGNUM) - return 0; - return 1; - - default: - break; - } + if (GET_CODE (op) != MEM) + return 0; + if (!s390_decompose_address (XEXP (op, 0), &addr)) + return 0; + if (addr.indx) + return 0; - return 0; + return 1; } -/* Return true if OP is a valid S-type operand. - OP is the current operation. - MODE is the current operation mode. */ +/* Return true if OP is a memory operand pointing to the + literal pool, or an immediate operand. */ -int -s_operand (register rtx op, enum machine_mode mode) +bool +s390_pool_operand (rtx op) { - return general_s_operand (op, mode, 0); -} + struct s390_address addr; -/* Return true if OP is a valid S-type operand or an immediate - operand that can be addressed as S-type operand by forcing - it into the literal pool. - OP is the current operation. - MODE is the current operation mode. */ + /* Just like memory_operand, allow (subreg (mem ...)) + after reload. */ + if (reload_completed + && GET_CODE (op) == SUBREG + && GET_CODE (SUBREG_REG (op)) == MEM) + op = SUBREG_REG (op); -int -s_imm_operand (register rtx op, enum machine_mode mode) -{ - return general_s_operand (op, mode, 1); + switch (GET_CODE (op)) + { + case CONST_INT: + case CONST_DOUBLE: + return true; + + case MEM: + if (!s390_decompose_address (XEXP (op, 0), &addr)) + return false; + if (addr.base && REG_P (addr.base) && REGNO (addr.base) == BASE_REGNUM) + return true; + if (addr.indx && REG_P (addr.indx) && REGNO (addr.indx) == BASE_REGNUM) + return true; + return false; + + default: + return false; + } } /* Return true if OP a valid shift count operand. @@ -1577,6 +1585,21 @@ s390_extra_constraint_str (rtx op, int c, const char * str) if (c != str[0]) abort (); + /* Check for offsettable variants of memory constraints. */ + if (c == 'A') + { + /* Only accept non-volatile MEMs. */ + if (!MEM_P (op) || MEM_VOLATILE_P (op)) + return 0; + + if ((reload_completed || reload_in_progress) + ? !offsettable_memref_p (op) + : !offsettable_nonstrict_memref_p (op)) + return 0; + + c = str[1]; + } + switch (c) { case 'Q': @@ -1671,7 +1694,7 @@ s390_const_ok_for_constraint_p (HOST_WIDE_INT value, { enum machine_mode mode, part_mode; int def; - unsigned char part; + int part, part_goal; if (c != str[0]) abort (); @@ -1695,7 +1718,10 @@ s390_const_ok_for_constraint_p (HOST_WIDE_INT value, return value == 2147483647; case 'N': - part = str[1] - '0'; + if (str[1] == 'x') + part_goal = -1; + else + part_goal = str[1] - '0'; switch (str[2]) { @@ -1722,7 +1748,10 @@ s390_const_ok_for_constraint_p (HOST_WIDE_INT value, if (GET_MODE_SIZE (mode) <= GET_MODE_SIZE (part_mode)) return 0; - if (s390_single_part (GEN_INT (value), mode, part_mode, def) != part) + part = s390_single_part (GEN_INT (value), mode, part_mode, def); + if (part < 0) + return 0; + if (part_goal != -1 && part_goal != part) return 0; break; @@ -6190,8 +6219,9 @@ s390_register_info (int live_regs[]) cfun_frame_layout.last_save_gpr = 6; /* Mark f0, f2 for 31 bit and f0-f4 for 64 bit to be saved. */ - for (i = 0; i < (TARGET_64BIT ? 4 : 2); i++) - cfun_set_fpr_bit (i); + if (TARGET_HARD_FLOAT) + for (i = 0; i < (TARGET_64BIT ? 4 : 2); i++) + cfun_set_fpr_bit (i); } if (!TARGET_64BIT) @@ -8374,6 +8404,12 @@ s390_conditional_register_usage (void) for (i = 18; i < 20; i++) call_used_regs[i] = call_really_used_regs[i] = 0; } + + if (TARGET_SOFT_FLOAT) + { + for (i = 16; i < 32; i++) + call_used_regs[i] = fixed_regs[i] = 1; + } } /* Corresponding function to eh_return expander. */ diff --git a/gcc/config/s390/s390.h b/gcc/config/s390/s390.h index 4d50395b67c..11b6d84ab6d 100644 --- a/gcc/config/s390/s390.h +++ b/gcc/config/s390/s390.h @@ -126,11 +126,13 @@ extern int target_flags; #define TARGET_IEEE_FLOAT 1 #ifdef DEFAULT_TARGET_64BIT -#define TARGET_DEFAULT 0x31 +#define TARGET_DEFAULT (MASK_64BIT | MASK_ZARCH | MASK_HARD_FLOAT) #else -#define TARGET_DEFAULT 0x1 +#define TARGET_DEFAULT MASK_HARD_FLOAT #endif +#define TARGET_DEFAULT_BACKCHAIN "" + #define TARGET_SWITCHES \ { { "hard-float", 1, N_("Use hardware fp")}, \ { "soft-float", -1, N_("Don't use hardware fp")}, \ @@ -542,13 +544,14 @@ extern const enum reg_class regclass_map[FIRST_PSEUDO_REGISTER]; #define EXTRA_CONSTRAINT_STR(OP, C, STR) \ s390_extra_constraint_str ((OP), (C), (STR)) -#define EXTRA_MEMORY_CONSTRAINT(C, STR) \ - ((C) == 'Q' || (C) == 'R' || (C) == 'S' || (C) == 'T') -#define EXTRA_ADDRESS_CONSTRAINT(C, STR) \ +#define EXTRA_MEMORY_CONSTRAINT(C, STR) \ + ((C) == 'Q' || (C) == 'R' || (C) == 'S' || (C) == 'T' || (C) == 'A') +#define EXTRA_ADDRESS_CONSTRAINT(C, STR) \ ((C) == 'U' || (C) == 'W' || (C) == 'Y') -#define CONSTRAINT_LEN(C, STR) \ - ((C) == 'N' ? 5 : DEFAULT_CONSTRAINT_LEN ((C), (STR))) +#define CONSTRAINT_LEN(C, STR) \ + ((C) == 'N' ? 5 : \ + (C) == 'A' ? 2 : DEFAULT_CONSTRAINT_LEN ((C), (STR))) /* Stack layout and calling conventions. */ @@ -1015,7 +1018,6 @@ do { \ /* Define the codes that are matched by predicates in aux-output.c. */ #define PREDICATE_CODES \ {"s_operand", { SUBREG, MEM }}, \ - {"s_imm_operand", { CONST_INT, CONST_DOUBLE, SUBREG, MEM }}, \ {"shift_count_operand", { REG, SUBREG, PLUS, CONST_INT }}, \ {"bras_sym_operand",{ SYMBOL_REF, CONST }}, \ {"larl_operand", { SYMBOL_REF, CONST, CONST_INT, CONST_DOUBLE }}, \ diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index 5a649932329..7d59f0c0f7e 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -34,17 +34,21 @@ ;; (-524288..524287) for long displacement ;; M -- Constant integer with a value of 0x7fffffff. ;; N -- Multiple letter constraint followed by 4 parameter letters. -;; 0..9: number of the part counting from most to least significant -;; H,Q: mode of the part -;; D,S,H: mode of the containing operand -;; 0,F: value of the other parts (F - all bits set) +;; 0..9,x: number of the part counting from most to least significant +;; H,Q: mode of the part +;; D,S,H: mode of the containing operand +;; 0,F: value of the other parts (F - all bits set) ;; ;; The constraint matches if the specified part of a constant -;; has a value different from its other parts. +;; has a value different from its other parts. If the letter x +;; is specified instead of a part number, the constraint matches +;; if there is any single part with non-default value. ;; Q -- Memory reference without index register and with short displacement. ;; R -- Memory reference with index register and short displacement. ;; S -- Memory reference without index register but with long displacement. ;; T -- Memory reference with index register and long displacement. +;; A -- Multiple letter constraint followed by Q, R, S, or T: +;; Offsettable memory reference of type specified by second letter. ;; U -- Pointer with short displacement. ;; W -- Pointer with long displacement. ;; Y -- Shift count operand. @@ -517,6 +521,39 @@ [(set_attr "op_type" "RS,RSY")]) +; Compare (equality) instructions + +(define_insn "*cmpdi_cct" + [(set (reg 33) + (compare (match_operand:DI 0 "nonimmediate_operand" "d,d,d,m,Q") + (match_operand:DI 1 "general_operand" "d,K,m,d,Q")))] + "s390_match_ccmode (insn, CCTmode) && TARGET_64BIT + && (!s390_pool_operand (operands[0]) || !s390_pool_operand (operands[1]))" + "@ + cgr\t%0,%1 + cghi\t%0,%c1 + cg\t%0,%1 + cg\t%1,%0 + clc\t%O0(8,%R0),%1" + [(set_attr "op_type" "RRE,RI,RXY,RXY,SS")]) + +(define_insn "*cmpsi_cct" + [(set (reg 33) + (compare (match_operand:SI 0 "nonimmediate_operand" "d,d,d,d,R,T,Q") + (match_operand:SI 1 "general_operand" "d,K,R,T,d,d,Q")))] + "s390_match_ccmode (insn, CCTmode) + && (!s390_pool_operand (operands[0]) || !s390_pool_operand (operands[1]))" + "@ + cr\t%0,%1 + chi\t%0,%c1 + c\t%0,%1 + cy\t%0,%1 + c\t%1,%0 + cy\t%1,%0 + clc\t%O0(4,%R0),%1" + [(set_attr "op_type" "RR,RI,RX,RXY,RX,RXY,SS")]) + + ; Compare (signed) instructions (define_insn "*cmpdi_ccs_sign" @@ -569,7 +606,7 @@ [(set (reg 33) (compare (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "d,m")) (match_operand:DI 0 "register_operand" "d,d")))] - "s390_match_ccmode(insn, CCURmode) && TARGET_64BIT" + "s390_match_ccmode (insn, CCURmode) && TARGET_64BIT" "@ clgfr\t%0,%1 clgf\t%0,%1" @@ -577,86 +614,56 @@ (define_insn "*cmpdi_ccu" [(set (reg 33) - (compare (match_operand:DI 0 "register_operand" "d,d") - (match_operand:DI 1 "general_operand" "d,m")))] - "s390_match_ccmode(insn, CCUmode) && TARGET_64BIT" + (compare (match_operand:DI 0 "nonimmediate_operand" "d,d,Q") + (match_operand:DI 1 "general_operand" "d,m,Q")))] + "s390_match_ccmode (insn, CCUmode) && TARGET_64BIT + && (!s390_pool_operand (operands[0]) || !s390_pool_operand (operands[1]))" "@ clgr\t%0,%1 - clg\t%0,%1" - [(set_attr "op_type" "RRE,RXY")]) + clg\t%0,%1 + clc\t%O0(8,%R0),%1" + [(set_attr "op_type" "RRE,RXY,SS")]) (define_insn "*cmpsi_ccu" [(set (reg 33) - (compare (match_operand:SI 0 "register_operand" "d,d,d") - (match_operand:SI 1 "general_operand" "d,R,T")))] - "s390_match_ccmode(insn, CCUmode)" + (compare (match_operand:SI 0 "nonimmediate_operand" "d,d,d,Q") + (match_operand:SI 1 "general_operand" "d,R,T,Q")))] + "s390_match_ccmode (insn, CCUmode) + && (!s390_pool_operand (operands[0]) || !s390_pool_operand (operands[1]))" "@ clr\t%0,%1 cl\t%0,%1 - cly\t%0,%1" - [(set_attr "op_type" "RR,RX,RXY")]) + cly\t%0,%1 + clc\t%O0(4,%R0),%1" + [(set_attr "op_type" "RR,RX,RXY,SS")]) (define_insn "*cmphi_ccu" [(set (reg 33) - (compare (match_operand:HI 0 "register_operand" "d,d") - (match_operand:HI 1 "s_imm_operand" "Q,S")))] - "s390_match_ccmode(insn, CCUmode)" + (compare (match_operand:HI 0 "nonimmediate_operand" "d,d,Q") + (match_operand:HI 1 "general_operand" "Q,S,Q")))] + "s390_match_ccmode (insn, CCUmode) + && (!s390_pool_operand (operands[0]) || !s390_pool_operand (operands[1])) + && !register_operand (operands[1], HImode)" "@ clm\t%0,3,%1 - clmy\t%0,3,%1" - [(set_attr "op_type" "RS,RSY")]) + clmy\t%0,3,%1 + clc\t%O0(2,%R0),%1" + [(set_attr "op_type" "RS,RSY,SS")]) (define_insn "*cmpqi_ccu" [(set (reg 33) - (compare (match_operand:QI 0 "register_operand" "d,d") - (match_operand:QI 1 "s_imm_operand" "Q,S")))] - "s390_match_ccmode(insn, CCUmode)" + (compare (match_operand:QI 0 "nonimmediate_operand" "d,d,Q,S,Q") + (match_operand:QI 1 "general_operand" "Q,S,n,n,Q")))] + "s390_match_ccmode (insn, CCUmode) + && (!s390_pool_operand (operands[0]) || !s390_pool_operand (operands[1])) + && !register_operand (operands[1], QImode)" "@ clm\t%0,1,%1 - clmy\t%0,1,%1" - [(set_attr "op_type" "RS,RSY")]) - -(define_insn "*cli" - [(set (reg 33) - (compare (match_operand:QI 0 "memory_operand" "Q,S") - (match_operand:QI 1 "immediate_operand" "n,n")))] - "s390_match_ccmode (insn, CCUmode)" - "@ + clmy\t%0,1,%1 cli\t%0,%b1 - cliy\t%0,%b1" - [(set_attr "op_type" "SI,SIY")]) - -(define_insn "*cmpdi_ccu_mem" - [(set (reg 33) - (compare (match_operand:DI 0 "s_operand" "Q") - (match_operand:DI 1 "s_imm_operand" "Q")))] - "s390_match_ccmode(insn, CCUmode)" - "clc\t%O0(8,%R0),%1" - [(set_attr "op_type" "SS")]) - -(define_insn "*cmpsi_ccu_mem" - [(set (reg 33) - (compare (match_operand:SI 0 "s_operand" "Q") - (match_operand:SI 1 "s_imm_operand" "Q")))] - "s390_match_ccmode(insn, CCUmode)" - "clc\t%O0(4,%R0),%1" - [(set_attr "op_type" "SS")]) - -(define_insn "*cmphi_ccu_mem" - [(set (reg 33) - (compare (match_operand:HI 0 "s_operand" "Q") - (match_operand:HI 1 "s_imm_operand" "Q")))] - "s390_match_ccmode(insn, CCUmode)" - "clc\t%O0(2,%R0),%1" - [(set_attr "op_type" "SS")]) - -(define_insn "*cmpqi_ccu_mem" - [(set (reg 33) - (compare (match_operand:QI 0 "s_operand" "Q") - (match_operand:QI 1 "s_imm_operand" "Q")))] - "s390_match_ccmode(insn, CCUmode)" - "clc\t%O0(1,%R0),%1" - [(set_attr "op_type" "SS")]) + cliy\t%0,%b1 + clc\t%O0(1,%R0),%1" + [(set_attr "op_type" "RS,RSY,SI,SIY,SS")]) ; DF instructions @@ -1264,7 +1271,7 @@ (define_insn "*movstricthi" [(set (strict_low_part (match_operand:HI 0 "register_operand" "+d,d")) - (match_operand:HI 1 "s_imm_operand" "Q,S")) + (match_operand:HI 1 "memory_operand" "Q,S")) (clobber (reg:CC 33))] "" "@ @@ -5131,11 +5138,11 @@ [(set_attr "op_type" "RRE,RXY")]) (define_insn "*anddi3" - [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,d,Q") + [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,d,AQ,Q") (and:DI (match_operand:DI 1 "nonimmediate_operand" - "%d,o,0,0,0,0,0,0,0") + "%d,o,0,0,0,0,0,0,0,0") (match_operand:DI 2 "general_operand" - "M,M,N0HDF,N1HDF,N2HDF,N3HDF,d,m,Q"))) + "M,M,N0HDF,N1HDF,N2HDF,N3HDF,d,m,NxQDF,Q"))) (clobber (reg:CC 33))] "TARGET_64BIT && s390_logical_operator_ok_p (operands)" "@ @@ -5147,8 +5154,19 @@ nill\t%0,%j2 ngr\t%0,%2 ng\t%0,%2 + # nc\t%O0(8,%R0),%2" - [(set_attr "op_type" "RRE,RXE,RI,RI,RI,RI,RRE,RXY,SS")]) + [(set_attr "op_type" "RRE,RXE,RI,RI,RI,RI,RRE,RXY,SI,SS")]) + +(define_split + [(set (match_operand:DI 0 "s_operand" "") + (and:DI (match_dup 0) (match_operand:DI 1 "immediate_operand" ""))) + (clobber (reg:CC 33))] + "reload_completed" + [(parallel + [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1))) + (clobber (reg:CC 33))])] + "s390_narrow_logical_operator (AND, &operands[0], &operands[1]);") (define_expand "anddi3" [(set (match_operand:DI 0 "nonimmediate_operand" "") @@ -5192,9 +5210,11 @@ [(set_attr "op_type" "RR,RX,RXY")]) (define_insn "*andsi3_zarch" - [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,Q") - (and:SI (match_operand:SI 1 "nonimmediate_operand" "%d,o,0,0,0,0,0,0") - (match_operand:SI 2 "general_operand" "M,M,N0HSF,N1HSF,d,R,T,Q"))) + [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,d,d,AQ,Q") + (and:SI (match_operand:SI 1 "nonimmediate_operand" + "%d,o,0,0,0,0,0,0,0") + (match_operand:SI 2 "general_operand" + "M,M,N0HSF,N1HSF,d,R,T,NxQSF,Q"))) (clobber (reg:CC 33))] "TARGET_ZARCH && s390_logical_operator_ok_p (operands)" "@ @@ -5205,20 +5225,32 @@ nr\t%0,%2 n\t%0,%2 ny\t%0,%2 + # nc\t%O0(4,%R0),%2" - [(set_attr "op_type" "RRE,RXE,RI,RI,RR,RX,RXY,SS")]) + [(set_attr "op_type" "RRE,RXE,RI,RI,RR,RX,RXY,SI,SS")]) (define_insn "*andsi3_esa" - [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,Q") - (and:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0") - (match_operand:SI 2 "general_operand" "d,R,Q"))) + [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,AQ,Q") + (and:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0") + (match_operand:SI 2 "general_operand" "d,R,NxQSF,Q"))) (clobber (reg:CC 33))] "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)" "@ nr\t%0,%2 n\t%0,%2 + # nc\t%O0(4,%R0),%2" - [(set_attr "op_type" "RR,RX,SS")]) + [(set_attr "op_type" "RR,RX,SI,SS")]) + +(define_split + [(set (match_operand:SI 0 "s_operand" "") + (and:SI (match_dup 0) (match_operand:SI 1 "immediate_operand" ""))) + (clobber (reg:CC 33))] + "reload_completed" + [(parallel + [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1))) + (clobber (reg:CC 33))])] + "s390_narrow_logical_operator (AND, &operands[0], &operands[1]);") (define_expand "andsi3" [(set (match_operand:SI 0 "nonimmediate_operand" "") @@ -5233,27 +5265,39 @@ ; (define_insn "*andhi3_zarch" - [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,Q") - (and:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0") - (match_operand:HI 2 "general_operand" "d,n,Q"))) + [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,AQ,Q") + (and:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0,0") + (match_operand:HI 2 "general_operand" "d,n,NxQHF,Q"))) (clobber (reg:CC 33))] "TARGET_ZARCH && s390_logical_operator_ok_p (operands)" "@ nr\t%0,%2 nill\t%0,%x2 + # nc\t%O0(2,%R0),%2" - [(set_attr "op_type" "RR,RI,SS")]) + [(set_attr "op_type" "RR,RI,SI,SS")]) (define_insn "*andhi3_esa" - [(set (match_operand:HI 0 "nonimmediate_operand" "=d,Q") - (and:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0") - (match_operand:HI 2 "general_operand" "d,Q"))) + [(set (match_operand:HI 0 "nonimmediate_operand" "=d,AQ,Q") + (and:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0") + (match_operand:HI 2 "general_operand" "d,NxQHF,Q"))) (clobber (reg:CC 33))] "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)" "@ nr\t%0,%2 + # nc\t%O0(2,%R0),%2" - [(set_attr "op_type" "RR,SS")]) + [(set_attr "op_type" "RR,SI,SS")]) + +(define_split + [(set (match_operand:HI 0 "s_operand" "") + (and:HI (match_dup 0) (match_operand:HI 1 "immediate_operand" ""))) + (clobber (reg:CC 33))] + "reload_completed" + [(parallel + [(set (match_dup 0) (and:QI (match_dup 0) (match_dup 1))) + (clobber (reg:CC 33))])] + "s390_narrow_logical_operator (AND, &operands[0], &operands[1]);") (define_expand "andhi3" [(set (match_operand:HI 0 "nonimmediate_operand" "") @@ -5336,10 +5380,10 @@ [(set_attr "op_type" "RRE,RXY")]) (define_insn "*iordi3" - [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,Q") - (ior:DI (match_operand:DI 1 "nonimmediate_operand" "0,0,0,0,0,0,0") + [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,d,d,d,d,AQ,Q") + (ior:DI (match_operand:DI 1 "nonimmediate_operand" "0,0,0,0,0,0,0,0") (match_operand:DI 2 "general_operand" - "N0HD0,N1HD0,N2HD0,N3HD0,d,m,Q"))) + "N0HD0,N1HD0,N2HD0,N3HD0,d,m,NxQD0,Q"))) (clobber (reg:CC 33))] "TARGET_64BIT && s390_logical_operator_ok_p (operands)" "@ @@ -5349,8 +5393,19 @@ oill\t%0,%i2 ogr\t%0,%2 og\t%0,%2 + # oc\t%O0(8,%R0),%2" - [(set_attr "op_type" "RI,RI,RI,RI,RRE,RXY,SS")]) + [(set_attr "op_type" "RI,RI,RI,RI,RRE,RXY,SI,SS")]) + +(define_split + [(set (match_operand:DI 0 "s_operand" "") + (ior:DI (match_dup 0) (match_operand:DI 1 "immediate_operand" ""))) + (clobber (reg:CC 33))] + "reload_completed" + [(parallel + [(set (match_dup 0) (ior:QI (match_dup 0) (match_dup 1))) + (clobber (reg:CC 33))])] + "s390_narrow_logical_operator (IOR, &operands[0], &operands[1]);") (define_expand "iordi3" [(set (match_operand:DI 0 "nonimmediate_operand" "") @@ -5392,9 +5447,9 @@ [(set_attr "op_type" "RR,RX,RXY")]) (define_insn "*iorsi3_zarch" - [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,Q") - (ior:SI (match_operand:SI 1 "nonimmediate_operand" "0,0,0,0,0,0") - (match_operand:SI 2 "general_operand" "N0HS0,N1HS0,d,R,T,Q"))) + [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,d,d,AQ,Q") + (ior:SI (match_operand:SI 1 "nonimmediate_operand" "0,0,0,0,0,0,0") + (match_operand:SI 2 "general_operand" "N0HS0,N1HS0,d,R,T,NxQS0,Q"))) (clobber (reg:CC 33))] "TARGET_ZARCH && s390_logical_operator_ok_p (operands)" "@ @@ -5403,20 +5458,32 @@ or\t%0,%2 o\t%0,%2 oy\t%0,%2 + # oc\t%O0(4,%R0),%2" - [(set_attr "op_type" "RI,RI,RR,RX,RXY,SS")]) + [(set_attr "op_type" "RI,RI,RR,RX,RXY,SI,SS")]) (define_insn "*iorsi3_esa" - [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,Q") - (ior:SI (match_operand:SI 1 "nonimmediate_operand" "0,0,0") - (match_operand:SI 2 "general_operand" "d,R,Q"))) + [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,AQ,Q") + (ior:SI (match_operand:SI 1 "nonimmediate_operand" "0,0,0,0") + (match_operand:SI 2 "general_operand" "d,R,NxQS0,Q"))) (clobber (reg:CC 33))] "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)" "@ or\t%0,%2 o\t%0,%2 + # oc\t%O0(4,%R0),%2" - [(set_attr "op_type" "RR,RX,SS")]) + [(set_attr "op_type" "RR,RX,SI,SS")]) + +(define_split + [(set (match_operand:SI 0 "s_operand" "") + (ior:SI (match_dup 0) (match_operand:SI 1 "immediate_operand" ""))) + (clobber (reg:CC 33))] + "reload_completed" + [(parallel + [(set (match_dup 0) (ior:QI (match_dup 0) (match_dup 1))) + (clobber (reg:CC 33))])] + "s390_narrow_logical_operator (IOR, &operands[0], &operands[1]);") (define_expand "iorsi3" [(set (match_operand:SI 0 "nonimmediate_operand" "") @@ -5431,27 +5498,39 @@ ; (define_insn "*iorhi3_zarch" - [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,Q") - (ior:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0") - (match_operand:HI 2 "general_operand" "d,n,Q"))) + [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,AQ,Q") + (ior:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0,0") + (match_operand:HI 2 "general_operand" "d,n,NxQH0,Q"))) (clobber (reg:CC 33))] "TARGET_ZARCH && s390_logical_operator_ok_p (operands)" "@ or\t%0,%2 oill\t%0,%x2 + # oc\t%O0(2,%R0),%2" - [(set_attr "op_type" "RR,RI,SS")]) + [(set_attr "op_type" "RR,RI,SI,SS")]) (define_insn "*iorhi3_esa" - [(set (match_operand:HI 0 "nonimmediate_operand" "=d,Q") - (ior:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0") - (match_operand:HI 2 "general_operand" "d,Q"))) + [(set (match_operand:HI 0 "nonimmediate_operand" "=d,AQ,Q") + (ior:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0") + (match_operand:HI 2 "general_operand" "d,NxQH0,Q"))) (clobber (reg:CC 33))] "!TARGET_ZARCH && s390_logical_operator_ok_p (operands)" "@ or\t%0,%2 + # oc\t%O0(2,%R0),%2" - [(set_attr "op_type" "RR,SS")]) + [(set_attr "op_type" "RR,SI,SS")]) + +(define_split + [(set (match_operand:HI 0 "s_operand" "") + (ior:HI (match_dup 0) (match_operand:HI 1 "immediate_operand" ""))) + (clobber (reg:CC 33))] + "reload_completed" + [(parallel + [(set (match_dup 0) (ior:QI (match_dup 0) (match_dup 1))) + (clobber (reg:CC 33))])] + "s390_narrow_logical_operator (IOR, &operands[0], &operands[1]);") (define_expand "iorhi3" [(set (match_operand:HI 0 "nonimmediate_operand" "") @@ -5534,16 +5613,27 @@ [(set_attr "op_type" "RRE,RXY")]) (define_insn "*xordi3" - [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,Q") - (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0") - (match_operand:DI 2 "general_operand" "d,m,Q"))) + [(set (match_operand:DI 0 "nonimmediate_operand" "=d,d,AQ,Q") + (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0,0") + (match_operand:DI 2 "general_operand" "d,m,NxQD0,Q"))) (clobber (reg:CC 33))] "TARGET_64BIT && s390_logical_operator_ok_p (operands)" "@ xgr\t%0,%2 xg\t%0,%2 + # xc\t%O0(8,%R0),%2" - [(set_attr "op_type" "RRE,RXY,SS")]) + [(set_attr "op_type" "RRE,RXY,SI,SS")]) + +(define_split + [(set (match_operand:DI 0 "s_operand" "") + (xor:DI (match_dup 0) (match_operand:DI 1 "immediate_operand" ""))) + (clobber (reg:CC 33))] + "reload_completed" + [(parallel + [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1))) + (clobber (reg:CC 33))])] + "s390_narrow_logical_operator (XOR, &operands[0], &operands[1]);") (define_expand "xordi3" [(set (match_operand:DI 0 "nonimmediate_operand" "") @@ -5585,17 +5675,28 @@ [(set_attr "op_type" "RR,RX,RXY")]) (define_insn "*xorsi3" - [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,Q") - (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0") - (match_operand:SI 2 "general_operand" "d,R,T,Q"))) + [(set (match_operand:SI 0 "nonimmediate_operand" "=d,d,d,AQ,Q") + (xor:SI (match_operand:SI 1 "nonimmediate_operand" "%0,0,0,0,0") + (match_operand:SI 2 "general_operand" "d,R,T,NxQS0,Q"))) (clobber (reg:CC 33))] "s390_logical_operator_ok_p (operands)" "@ xr\t%0,%2 x\t%0,%2 xy\t%0,%2 + # xc\t%O0(4,%R0),%2" - [(set_attr "op_type" "RR,RX,RXY,SS")]) + [(set_attr "op_type" "RR,RX,RXY,SI,SS")]) + +(define_split + [(set (match_operand:SI 0 "s_operand" "") + (xor:SI (match_dup 0) (match_operand:SI 1 "immediate_operand" ""))) + (clobber (reg:CC 33))] + "reload_completed" + [(parallel + [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1))) + (clobber (reg:CC 33))])] + "s390_narrow_logical_operator (XOR, &operands[0], &operands[1]);") (define_expand "xorsi3" [(set (match_operand:SI 0 "nonimmediate_operand" "") @@ -5610,15 +5711,26 @@ ; (define_insn "*xorhi3" - [(set (match_operand:HI 0 "nonimmediate_operand" "=d,Q") - (xor:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0") - (match_operand:HI 2 "general_operand" "d,Q"))) + [(set (match_operand:HI 0 "nonimmediate_operand" "=d,AQ,Q") + (xor:HI (match_operand:HI 1 "nonimmediate_operand" "%0,0,0") + (match_operand:HI 2 "general_operand" "d,NxQH0,Q"))) (clobber (reg:CC 33))] "s390_logical_operator_ok_p (operands)" "@ xr\t%0,%2 + # xc\t%O0(2,%R0),%2" - [(set_attr "op_type" "RR,SS")]) + [(set_attr "op_type" "RR,SI,SS")]) + +(define_split + [(set (match_operand:HI 0 "s_operand" "") + (xor:HI (match_dup 0) (match_operand:HI 1 "immediate_operand" ""))) + (clobber (reg:CC 33))] + "reload_completed" + [(parallel + [(set (match_dup 0) (xor:QI (match_dup 0) (match_dup 1))) + (clobber (reg:CC 33))])] + "s390_narrow_logical_operator (XOR, &operands[0], &operands[1]);") (define_expand "xorhi3" [(set (match_operand:HI 0 "nonimmediate_operand" "") diff --git a/gcc/config/s390/tpf.h b/gcc/config/s390/tpf.h index 8ba13e25412..e6a016a7771 100644 --- a/gcc/config/s390/tpf.h +++ b/gcc/config/s390/tpf.h @@ -54,9 +54,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #undef STACK_POINTER_OFFSET #define STACK_POINTER_OFFSET 448 -/* When building for TPF, set a generic default target that is 64 bits. */ +/* When building for TPF, set a generic default target that is 64 bits. + Also, enable TPF profiling support and the standard backchain by default. */ #undef TARGET_DEFAULT -#define TARGET_DEFAULT 0xb3 +#define TARGET_DEFAULT (MASK_64BIT | MASK_ZARCH | MASK_HARD_FLOAT \ + | MASK_TPF_PROFILING) +#undef TARGET_DEFAULT_BACKCHAIN +#define TARGET_DEFAULT_BACKCHAIN "1" /* Exception handling. */ diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 349d981ccc9..d88e159bd1f 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -9413,7 +9413,7 @@ int sh_dwarf_calling_convention (tree func) { if (sh_attr_renesas_p (func)) - return DW_CC_renesas_sh; + return DW_CC_GNU_renesas_sh; return DW_CC_normal; } @@ -10095,7 +10095,7 @@ sh_init_cumulative_args (CUMULATIVE_ARGS * pcum, pcum->prototype_p = FALSE; if (mode != VOIDmode) { - pcum->call_cookie = + pcum->call_cookie = CALL_COOKIE_RET_TRAMP (TARGET_SHCOMPACT && GET_MODE_SIZE (mode) > 4 && BASE_RETURN_VALUE_REG (mode) == FIRST_RET_REG); diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index 5adcac22664..dd9f216b587 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -6869,8 +6869,8 @@ (define_insn "tls_global_dynamic" [(set (match_operand:SI 0 "register_operand" "=&z") - (call (unspec:SI [(match_operand:SI 1 "" "")] - UNSPEC_TLSGD) + (call (mem:SI (unspec:SI [(match_operand:SI 1 "" "")] + UNSPEC_TLSGD)) (const_int 0))) (use (reg:PSI FPSCR_REG)) (use (reg:SI PIC_REG)) @@ -6898,8 +6898,8 @@ mov.l\\t1f,r4\\n\\ (define_insn "tls_local_dynamic" [(set (match_operand:SI 0 "register_operand" "=&z") - (call (unspec:SI [(match_operand:SI 1 "" "")] - UNSPEC_TLSLDM) + (call (mem:SI (unspec:SI [(match_operand:SI 1 "" "")] + UNSPEC_TLSLDM)) (const_int 0))) (use (reg:PSI FPSCR_REG)) (use (reg:SI PIC_REG)) @@ -10951,17 +10951,45 @@ mov.l\\t1f,r0\\n\\ "byterev %1, %0" [(set_attr "type" "arith_media")]) -(define_insn "prefetch" +(define_insn "prefetch_media" [(prefetch (match_operand:QI 0 "address_operand" "p") (match_operand:SI 1 "const_int_operand" "n") (match_operand:SI 2 "const_int_operand" "n"))] - "TARGET_SHMEDIA || TARGET_HARD_SH4" + "TARGET_SHMEDIA" "* { - if (TARGET_HARD_SH4) - return \"pref @%0\"; operands[0] = gen_rtx_MEM (QImode, operands[0]); output_asm_insn (\"ld%M0.b %m0,r63\", operands); return \"\"; }" [(set_attr "type" "other")]) + +(define_insn "prefetch_i4" + [(prefetch (match_operand:SI 0 "register_operand" "r") + (match_operand:SI 1 "const_int_operand" "n") + (match_operand:SI 2 "const_int_operand" "n"))] + "TARGET_HARD_SH4" + "* +{ + return \"pref @%0\"; +}" + [(set_attr "type" "other")]) + +(define_expand "prefetch" + [(prefetch (match_operand:QI 0 "address_operand" "p") + (match_operand:SI 1 "const_int_operand" "n") + (match_operand:SI 2 "const_int_operand" "n"))] + "TARGET_SHMEDIA || TARGET_HARD_SH4" + " +{ + if (TARGET_HARD_SH4 && ! register_operand (operands[0], SImode)) + { + rtx reg = gen_reg_rtx (SImode); + emit_move_insn (reg, operands[0]); + operands[0] = reg; + } + + emit_insn ((TARGET_SHMEDIA ? gen_prefetch_media : gen_prefetch_i4) + (operands[0], operands[1], operands[2])); + DONE; +}") diff --git a/gcc/config/sh/symbian.c b/gcc/config/sh/symbian.c index e4b0d2bc225..02b95f5970d 100644 --- a/gcc/config/sh/symbian.c +++ b/gcc/config/sh/symbian.c @@ -559,8 +559,7 @@ symbian_possibly_export_base_class (tree base_class) tree methods; int len; - if (! (TYPE_POLYMORPHIC_P (base_class) - || TYPE_USES_VIRTUAL_BASECLASSES (base_class))) + if (! (TYPE_CONTAINS_VPTR_P (base_class))) return; methods = CLASSTYPE_METHOD_VEC (base_class); diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index aa1fa0905b1..3f75954e6cc 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -1547,23 +1547,7 @@ input_operand (rtx op, enum machine_mode mode) /* Check for valid MEM forms. */ if (GET_CODE (op) == MEM) - { - rtx inside = XEXP (op, 0); - - if (GET_CODE (inside) == LO_SUM) - { - /* We can't allow these because all of the splits - (eventually as they trickle down into DFmode - splits) require offsettable memory references. */ - if (! TARGET_V9 - && GET_MODE (op) == TFmode) - return 0; - - return (register_operand (XEXP (inside, 0), Pmode) - && CONSTANT_P (XEXP (inside, 1))); - } - return memory_address_p (mode, inside); - } + return memory_address_p (mode, XEXP (op, 0)); return 0; } @@ -3516,15 +3500,14 @@ legitimate_address_p (enum machine_mode mode, rtx addr, int strict) else if ((REG_P (rs1) || GET_CODE (rs1) == SUBREG) && (REG_P (rs2) || GET_CODE (rs2) == SUBREG)) { - /* We prohibit REG + REG for TFmode when there are no instructions - which accept REG+REG instructions. We do this because REG+REG - is not an offsetable address. If we get the situation in reload + /* We prohibit REG + REG for TFmode when there are no quad move insns + and we consequently need to split. We do this because REG+REG + is not an offsettable address. If we get the situation in reload where source and destination of a movtf pattern are both MEMs with REG+REG address, then only one of them gets converted to an - offsetable address. */ + offsettable address. */ if (mode == TFmode - && !(TARGET_FPU && TARGET_ARCH64 && TARGET_V9 - && TARGET_HARD_QUAD)) + && ! (TARGET_FPU && TARGET_ARCH64 && TARGET_HARD_QUAD)) return 0; /* We prohibit REG + REG on ARCH32 if not optimizing for @@ -3557,10 +3540,25 @@ legitimate_address_p (enum machine_mode mode, rtx addr, int strict) if (! CONSTANT_P (imm1) || tls_symbolic_operand (rs1)) return 0; - /* We can't allow TFmode, because an offset greater than or equal to the - alignment (8) may cause the LO_SUM to overflow if !v9. */ - if (mode == TFmode && !TARGET_V9) - return 0; + if (USE_AS_OFFSETABLE_LO10) + { + /* We can't allow TFmode, because an offset greater than or equal to + the alignment (8) may cause the LO_SUM to overflow if !v9. */ + if (mode == TFmode && ! TARGET_V9) + return 0; + } + else + { + /* We prohibit LO_SUM for TFmode when there are no quad move insns + and we consequently need to split. We do this because LO_SUM + is not an offsettable address. If we get the situation in reload + where source and destination of a movtf pattern are both MEMs with + LO_SUM address, then only one of them gets converted to an + offsettable address. */ + if (mode == TFmode + && ! (TARGET_FPU && TARGET_ARCH64 && TARGET_HARD_QUAD)) + return 0; + } } else if (GET_CODE (addr) == CONST_INT && SMALL_INT (addr)) return 1; @@ -6024,7 +6022,7 @@ sparc_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p) bool indirect; tree ptrtype = build_pointer_type (type); - if (pass_by_reference (NULL, TYPE_MODE (type), type, 0)) + if (pass_by_reference (NULL, TYPE_MODE (type), type, false)) { indirect = true; size = rsize = UNITS_PER_WORD; @@ -6044,7 +6042,7 @@ sparc_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p) align = 2 * UNITS_PER_WORD; /* SPARC-V9 ABI states that structures up to 16 bytes in size - are given whole slots as needed. */ + are left-justified in their slots. */ if (AGGREGATE_TYPE_P (type)) { if (size == 0) @@ -6074,7 +6072,7 @@ sparc_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p) if (indirect) { addr = fold_convert (build_pointer_type (ptrtype), addr); - addr = build_fold_indirect_ref (addr); + addr = build_va_arg_indirect_ref (addr); } /* If the address isn't aligned properly for the type, we may need to copy to a temporary. @@ -6103,7 +6101,7 @@ sparc_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p) incr = build2 (MODIFY_EXPR, ptr_type_node, valist, incr); gimplify_and_add (incr, post_p); - return build_fold_indirect_ref (addr); + return build_va_arg_indirect_ref (addr); } /* Return the string to output an unconditional branch to LABEL, which is @@ -8543,7 +8541,7 @@ sparc_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, { /* We will emit a regular sibcall below, so we need to instruct output_sibcall that we are in a leaf function. */ - sparc_leaf_function_p = 1; + sparc_leaf_function_p = current_function_uses_only_leaf_regs = 1; /* This will cause final.c to invoke leaf_renumber_regs so we must behave as if we were in a not-yet-leafified function. */ @@ -8553,7 +8551,7 @@ sparc_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, { /* We will emit the sibcall manually below, so we will need to manually spill non-leaf registers. */ - sparc_leaf_function_p = 0; + sparc_leaf_function_p = current_function_uses_only_leaf_regs = 0; /* We really are in a leaf function. */ int_arg_first = SPARC_OUTGOING_INT_ARG_FIRST; diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 13117b89f60..80ea39131e9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,100 @@ +2004-10-08 Kazu Hirata + + * pt.c, search.c: Fix comment typos. + +2004-10-08 Nathan Sidwell + + * cp-tree.h (dfs_walk, dfs_walk_real, dfs_unmark, markedp, + unmarkedp): Remove. + (dfs_skip_bases, dfs_walk_all, dfs_walk_once): New. + * class.c (struct find_final_overrider_data): Remove most_derived, + vpath_list and vpath fields. Add path field. + (dfs_find_final_ocerrider_1): Add DEPTH parameter. Adjust. + (dfs_find_final_overrider): Rename to ... + (dfs_find_final_overrider_pre): ... here. Adjust. + (dfs_find_final_overrider_post): Adjust. + (dfs_find_final_overrider_q): Fold into + dfs_find_final_overrider_pre. + (find_final_overrider): Adjust dfs searching. + (dfs_modify_vtables): Don't mark binfo here. + (modify_all_vtables): Use dfs_walk_once. + (build_vtt_inits): Likwise. Use dfs_walk_all. + (dfs_build_secondary_vptr_vtt_inits): Don't mark binfo here. + Return dfs_skip_bases as appropriate. + (dfs_fixup_binfo_vtbls): Return dfs_skip_bases as appropriate. + * init.c (dfs_initialized_vtbl_ptrs): Return dfs_skip_bases as + appropriate. Don't mark binfo here. + (initialize_vtbl_ptrs): Use dfs_walk_once. + * search.c (struct vbase_info): Remove unused struct. + (access_in_type): Use dfs_walk_once. + (dfs_access_in_type): Don't mark binfo here. + (dfs_accessible_queue_p, dfs_accessible_p) Remove. + Fold into ... + (accessible_r): ... here. New. Specialize dfs_walk_once. + (accessible_p): Use accessible_r. + (lookup_field_queue_p): Remove. Fold into ... + (lookup_field_r): ... here. Adjust. + (lookup_member): Use dfs_walk_all. + (dfs_walk_real, dfs_walk): Replace with ... + (dfs_walk_all, dfs_walk_once): ... these. + (dfs_walk_once_r, dfs_unmark_r): Workers for dfs_walk_once. + (dfs_unmark, unmarkedp, markedp): Remove. + (dfs_get_pure_virtuals): Don't mark binfo here. + (get_pure_virtuals): Use dfs_walk_once. + (dfs_debug_unmarked_p): Remove. Fold into ... + (dfs_debug_mark): ... here. + (note_debug_info_needed): Use dfs_walk_all. + +2004-10-07 Andrew Pinski + + * pt.c (tsubst_expr) : Look passed the + CLEANUP_POINT_EXPR to get the asm expression. + +2004-10-07 Mark Mitchell + + * cp-tree.h (ICS_USER_FLAG): Remove comment about obsolete flag. + (DECL_MEMBER_TEMPLATE_P): New macro. + (is_member_template): Remove. + (class_method_index_for_fn): New function. + * pt.c (build_over_call): Use DECL_MEMBER_TEMPLATE_P. + * class.c (finish_struct_methods): Remove out-of-date comment. + * decl.c (copy_fn_p): Use DECL_MBMER_TEMPLATE_P. + * decl2.c (check_classfn): Use DECL_MEMBER_TEMPLATE_P and + class_method_index_for_fn. + * pt.c (is_member_template): Remove. + (is_member_template_class): Likewise. + (optimize_specialization_lookup_p): New function. + (retrieve_specialization): Optimize lookups for members that are + not member templates. + (register_specialization): Adjust accordingly. + (build_template_decl): Add member_template_p parameter. Set + DECL_MEMBER_TEMPLATE_P. + (process_partial_specialization): Adjust call to + retrieve_specialization. + (push_template_decl_real): Determine whether the template is a + member template. + (lookup_template_class): Use retrieve_specialization. + (tsubst_decl): Adjust call to retrieve_specialization. + (tsubst_exception_specification): New function. + (tsubst): Use it. + (tsubst_copy): Use DECL_MEMBER_TEMPLATE_P. + (instantiate_template): Adjust call to retrieve_specialization. + (regenerate_decl_from_template): Do not actually generate a new + DECL. + (instantiate_decl): Adjust call to retrieve_specialization. + (class_method_index_for_fn): New method. + +2004-10-07 Andrew Pinski + + * parser.c (cp_parser_asm_definition): Look passed the + CLEANUP_POINT_EXPR to get the asm expression. + +2004-10-06 Andrew Pinski + + PR c++/17368 + * semantics.c (finish_asm_stmt): Asm expressions need cleanup + also. + 2004-10-05 Gabriel Dos Reis Convert diagnostics to use quoting flag q 6/n diff --git a/gcc/cp/call.c b/gcc/cp/call.c index bd607abb9a3..7d4e9634e4c 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4614,7 +4614,7 @@ build_over_call (struct z_candidate *cand, int flags) primary template because `B::g' and `B::g' may have different access. */ if (DECL_TEMPLATE_INFO (fn) - && is_member_template (DECL_TI_TEMPLATE (fn))) + && DECL_MEMBER_TEMPLATE_P (DECL_TI_TEMPLATE (fn))) perform_or_defer_access_check (cand->access_path, DECL_TI_TEMPLATE (fn)); else diff --git a/gcc/cp/class.c b/gcc/cp/class.c index c2ac0a699d2..d93ee228796 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -155,9 +155,8 @@ static void add_vcall_offset_vtbl_entries_1 (tree, vtbl_init_data *); static void build_vcall_offset_vtbl_entries (tree, vtbl_init_data *); static void add_vcall_offset (tree, tree, vtbl_init_data *); static void layout_vtable_decl (tree, int); -static tree dfs_find_final_overrider (tree, void *); +static tree dfs_find_final_overrider_pre (tree, void *); static tree dfs_find_final_overrider_post (tree, void *); -static tree dfs_find_final_overrider_q (tree, int, void *); static tree find_final_overrider (tree, tree, tree); static int make_new_vtable (tree, tree); static int maybe_indent_hierarchy (FILE *, int, int); @@ -171,15 +170,14 @@ static void dump_thunk (FILE *, int, tree); static tree build_vtable (tree, tree, tree); static void initialize_vtable (tree, tree); static void layout_nonempty_base_or_field (record_layout_info, - tree, tree, splay_tree); + tree, tree, splay_tree); static tree end_of_class (tree, int); static bool layout_empty_base (tree, tree, splay_tree); static void accumulate_vtbl_inits (tree, tree, tree, tree, tree); static tree dfs_accumulate_vtbl_inits (tree, tree, tree, tree, tree); static void build_rtti_vtbl_entries (tree, vtbl_init_data *); -static void build_vcall_and_vbase_vtbl_entries (tree, - vtbl_init_data *); +static void build_vcall_and_vbase_vtbl_entries (tree, vtbl_init_data *); static void clone_constructors_and_destructors (tree); static tree build_clone (tree, tree); static void update_vtable_entry_for_fn (tree, tree, tree, tree *, unsigned); @@ -192,11 +190,11 @@ static tree dfs_fixup_binfo_vtbls (tree, void *); static int record_subobject_offset (tree, tree, splay_tree); static int check_subobject_offset (tree, tree, splay_tree); static int walk_subobject_offsets (tree, subobject_offset_fn, - tree, splay_tree, tree, int); + tree, splay_tree, tree, int); static void record_subobject_offsets (tree, tree, splay_tree, int); static int layout_conflict_p (tree, tree, splay_tree, int); static int splay_tree_compare_integer_csts (splay_tree_key k1, - splay_tree_key k2); + splay_tree_key k2); static void warn_about_ambiguous_bases (tree); static bool type_requires_array_cookie (tree); static bool contains_empty_class_p (tree); @@ -1657,17 +1655,7 @@ resort_type_method_vec (void* obj, } } -/* Warn about duplicate methods in fn_fields. Also compact method - lists so that lookup can be made faster. - - Data Structure: List of method lists. The outer list is a - TREE_LIST, whose TREE_PURPOSE field is the field name and the - TREE_VALUE is the DECL_CHAIN of the FUNCTION_DECLs. TREE_CHAIN - links the entire list of methods for TYPE_METHODS. Friends are - chained in the same way as member functions (? TREE_CHAIN or - DECL_CHAIN), but they live in the TREE_TYPE field of the outer - list. That allows them to be quickly deleted, and requires no - extra storage. +/* Warn about duplicate methods in fn_fields. Sort methods that are not special (i.e., constructors, destructors, and type conversion operators) so that we can find them faster in @@ -1686,11 +1674,9 @@ finish_struct_methods (tree t) len = VEC_length (tree, method_vec); - /* First fill in entry 0 with the constructors, entry 1 with destructors, - and the next few with type conversion operators (if any). */ + /* Clear DECL_IN_AGGR_P for all functions. */ for (fn_fields = TYPE_METHODS (t); fn_fields; fn_fields = TREE_CHAIN (fn_fields)) - /* Clear out this flag. */ DECL_IN_AGGR_P (fn_fields) = 0; if (TYPE_HAS_DESTRUCTOR (t) && !CLASSTYPE_DESTRUCTORS (t)) @@ -1800,15 +1786,10 @@ typedef struct find_final_overrider_data_s { tree fn; /* The base class in which the function was declared. */ tree declaring_base; - /* The most derived class in the hierarchy. */ - tree most_derived_type; /* The candidate overriders. */ tree candidates; - /* Each entry in this array is the next-most-derived class for a - virtual base class along the current path. */ - tree *vpath_list; - /* A pointer one past the top of the VPATH_LIST. */ - tree *vpath; + /* Path to most derived. */ + VEC (tree) *path; } find_final_overrider_data; /* Add the overrider along the current path to FFOD->CANDIDATES. @@ -1816,22 +1797,18 @@ typedef struct find_final_overrider_data_s { static bool dfs_find_final_overrider_1 (tree binfo, - tree *vpath, - find_final_overrider_data *ffod) + find_final_overrider_data *ffod, + unsigned depth) { tree method; /* If BINFO is not the most derived type, try a more derived class. A definition there will overrider a definition here. */ - if (!same_type_p (BINFO_TYPE (binfo), ffod->most_derived_type)) + if (depth) { - tree derived; - - if (BINFO_VIRTUAL_P (binfo)) - derived = *--vpath; - else - derived = BINFO_INHERITANCE_CHAIN (binfo); - if (dfs_find_final_overrider_1 (derived, vpath, ffod)) + depth--; + if (dfs_find_final_overrider_1 + (VEC_index (tree, ffod->path, depth), ffod, depth)) return true; } @@ -1865,36 +1842,23 @@ dfs_find_final_overrider_1 (tree binfo, /* Called from find_final_overrider via dfs_walk. */ static tree -dfs_find_final_overrider (tree binfo, void* data) +dfs_find_final_overrider_pre (tree binfo, void *data) { find_final_overrider_data *ffod = (find_final_overrider_data *) data; if (binfo == ffod->declaring_base) - dfs_find_final_overrider_1 (binfo, ffod->vpath, ffod); + dfs_find_final_overrider_1 (binfo, ffod, VEC_length (tree, ffod->path)); + VEC_safe_push (tree, ffod->path, binfo); return NULL_TREE; } static tree -dfs_find_final_overrider_q (tree derived, int ix, void *data) -{ - tree binfo = BINFO_BASE_BINFO (derived, ix); - find_final_overrider_data *ffod = (find_final_overrider_data *) data; - - if (BINFO_VIRTUAL_P (binfo)) - *ffod->vpath++ = derived; - - return binfo; -} - -static tree -dfs_find_final_overrider_post (tree binfo, void *data) +dfs_find_final_overrider_post (tree binfo ATTRIBUTE_UNUSED, void *data) { find_final_overrider_data *ffod = (find_final_overrider_data *) data; + VEC_pop (tree, ffod->path); - if (BINFO_VIRTUAL_P (binfo)) - ffod->vpath--; - return NULL_TREE; } @@ -1932,23 +1896,14 @@ find_final_overrider (tree derived, tree binfo, tree fn) /* Determine the depth of the hierarchy. */ ffod.fn = fn; ffod.declaring_base = binfo; - ffod.most_derived_type = BINFO_TYPE (derived); ffod.candidates = NULL_TREE; - /* The virtual depth cannot be greater than the number of virtual - bases. */ - ffod.vpath_list = (tree *) xcalloc - (VEC_length (tree, CLASSTYPE_VBASECLASSES (BINFO_TYPE (derived))), - sizeof (tree)); - ffod.vpath = ffod.vpath_list; + ffod.path = VEC_alloc (tree, 30); - dfs_walk_real (derived, - dfs_find_final_overrider, - dfs_find_final_overrider_post, - dfs_find_final_overrider_q, - &ffod); - - free (ffod.vpath_list); + dfs_walk_all (derived, dfs_find_final_overrider_pre, + dfs_find_final_overrider_post, &ffod); + VEC_free (tree, ffod.path); + /* If there was no winner, issue an error message. */ if (!ffod.candidates || TREE_CHAIN (ffod.candidates)) { @@ -2220,8 +2175,6 @@ dfs_modify_vtables (tree binfo, void* data) &virtuals, ix); } - BINFO_MARKED (binfo) = 1; - return NULL_TREE; } @@ -2241,8 +2194,7 @@ modify_all_vtables (tree t, tree virtuals) tree *fnsp; /* Update all of the vtables. */ - dfs_walk (binfo, dfs_modify_vtables, unmarkedp, t); - dfs_walk (binfo, dfs_unmark, markedp, t); + dfs_walk_once (binfo, NULL, dfs_modify_vtables, t); /* Add virtual functions not already in our primary vtable. These will be both those introduced by this class, and those overridden @@ -6775,7 +6727,7 @@ build_vtt_inits (tree binfo, tree t, tree *inits, tree *index) /* Recursively add the secondary VTTs for non-virtual bases. */ for (i = 0; BINFO_BASE_ITERATE (binfo, i, b); ++i) if (!BINFO_VIRTUAL_P (b)) - inits = build_vtt_inits (BINFO_BASE_BINFO (binfo, i), t, inits, index); + inits = build_vtt_inits (b, t, inits, index); /* Add secondary virtual pointers for all subobjects of BINFO with either virtual bases or reachable along a virtual path, except @@ -6785,9 +6737,7 @@ build_vtt_inits (tree binfo, tree t, tree *inits, tree *index) data.inits = NULL; data.type_being_constructed = BINFO_TYPE (binfo); - dfs_walk_real (binfo, dfs_build_secondary_vptr_vtt_inits, - NULL, unmarkedp, &data); - dfs_walk (binfo, dfs_unmark, markedp, 0); + dfs_walk_once (binfo, dfs_build_secondary_vptr_vtt_inits, NULL, &data); *index = data.index; @@ -6814,7 +6764,7 @@ build_vtt_inits (tree binfo, tree t, tree *inits, tree *index) } else /* Remove the ctor vtables we created. */ - dfs_walk (binfo, dfs_fixup_binfo_vtbls, 0, binfo); + dfs_walk_all (binfo, dfs_fixup_binfo_vtbls, NULL, binfo); return inits; } @@ -6827,27 +6777,25 @@ dfs_build_secondary_vptr_vtt_inits (tree binfo, void *data_) { secondary_vptr_vtt_init_data *data = (secondary_vptr_vtt_init_data *)data_; - BINFO_MARKED (binfo) = 1; - /* We don't care about bases that don't have vtables. */ if (!TYPE_VFIELD (BINFO_TYPE (binfo))) - return NULL_TREE; + return dfs_skip_bases; /* We're only interested in proper subobjects of the type being constructed. */ if (same_type_p (BINFO_TYPE (binfo), data->type_being_constructed)) return NULL_TREE; - /* We're not interested in non-virtual primary bases. */ - if (!BINFO_VIRTUAL_P (binfo) && BINFO_PRIMARY_P (binfo)) - return NULL_TREE; - /* We're only interested in bases with virtual bases or reachable via a virtual path from the type being constructed. */ - if (!CLASSTYPE_VBASECLASSES (BINFO_TYPE (binfo)) - && !binfo_via_virtual (binfo, data->type_being_constructed)) + if (!(CLASSTYPE_VBASECLASSES (BINFO_TYPE (binfo)) + || binfo_via_virtual (binfo, data->type_being_constructed))) + return dfs_skip_bases; + + /* We're not interested in non-virtual primary bases. */ + if (!BINFO_VIRTUAL_P (binfo) && BINFO_PRIMARY_P (binfo)) return NULL_TREE; - + /* Record the index where this secondary vptr can be found. */ if (data->top_level_p) { @@ -6885,9 +6833,18 @@ dfs_fixup_binfo_vtbls (tree binfo, void* data) { tree vtable = BINFO_VTABLE (binfo); + if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo))) + /* If this class has no vtable, none of its bases do. */ + return dfs_skip_bases; + + if (!vtable) + /* This might be a primary base, so have no vtable in this + hierarchy. */ + return NULL_TREE; + /* If we scribbled the construction vtable vptr into BINFO, clear it out now. */ - if (vtable && TREE_CODE (vtable) == TREE_LIST + if (TREE_CODE (vtable) == TREE_LIST && (TREE_PURPOSE (vtable) == (tree) data)) BINFO_VTABLE (binfo) = TREE_CHAIN (vtable); diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 5ff38b72575..826bd51cf29 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -39,7 +39,6 @@ struct diagnostic_context; DELETE_EXPR_USE_GLOBAL (in DELETE_EXPR). COMPOUND_EXPR_OVERLOADED (in COMPOUND_EXPR). TREE_INDIRECT_USING (in NAMESPACE_DECL). - ICS_USER_FLAG (in _CONV) CLEANUP_P (in TRY_BLOCK) AGGR_INIT_VIA_CTOR_P (in AGGR_INIT_EXPR) PTRMEM_OK_P (in ADDR_EXPR, OFFSET_REF) @@ -90,6 +89,7 @@ struct diagnostic_context; DECL_MUTABLE_P (in FIELD_DECL) 1: C_TYPEDEF_EXPLICITLY_SIGNED (in TYPE_DECL). DECL_TEMPLATE_INSTANTIATED (in a VAR_DECL or a FUNCTION_DECL) + DECL_MEMBER_TEMPLATE_P (in TEMPLATE_DECL) 2: DECL_THIS_EXTERN (in VAR_DECL or FUNCTION_DECL). DECL_IMPLICIT_TYPEDEF_P (in a TYPE_DECL) 3: DECL_IN_AGGR_P. @@ -2177,6 +2177,11 @@ struct lang_decl GTY(()) #define INNERMOST_TEMPLATE_PARMS(NODE) TREE_VALUE (NODE) +/* Nonzero if NODE (a TEMPLATE_DECL) is a member template, in the + sense of [temp.mem]. */ +#define DECL_MEMBER_TEMPLATE_P(NODE) \ + (DECL_LANG_FLAG_1 (TEMPLATE_DECL_CHECK (NODE))) + /* Nonzero if the NODE corresponds to the template parameters for a member template, whose inline definition is being processed after the class definition is complete. */ @@ -3930,7 +3935,6 @@ extern tree instantiate_decl (tree, int, int); extern int push_tinst_level (tree); extern void pop_tinst_level (void); extern int more_specialized_class (tree, tree, tree); -extern int is_member_template (tree); extern int comp_template_parms (tree, tree); extern int template_class_depth (tree); extern int is_specialization_of (tree, tree); @@ -3990,6 +3994,7 @@ extern int accessible_p (tree, tree); extern tree lookup_field_1 (tree, tree, bool); extern tree lookup_field (tree, tree, int, bool); extern int lookup_fnfields_1 (tree, tree); +extern int class_method_index_for_fn (tree, tree); extern tree lookup_fnfields (tree, tree, int); extern tree lookup_member (tree, tree, int, bool); extern int look_for_overrides (tree, tree); @@ -4009,18 +4014,11 @@ extern tree binfo_from_vbase (tree); extern tree binfo_for_vbase (tree, tree); extern tree look_for_overrides_here (tree, tree); extern int check_final_overrider (tree, tree); -extern tree dfs_walk (tree, - tree (*) (tree, void *), - tree (*) (tree, int, void *), - void *); -extern tree dfs_walk_real (tree, - tree (*) (tree, void *), - tree (*) (tree, void *), - tree (*) (tree, int, void *), - void *); -extern tree dfs_unmark (tree, void *); -extern tree markedp (tree, int, void *); -extern tree unmarkedp (tree, int, void *); +#define dfs_skip_bases ((tree)1) +extern tree dfs_walk_all (tree, tree (*) (tree, void *), + tree (*) (tree, void *), void *); +extern tree dfs_walk_once (tree, tree (*) (tree, void *), + tree (*) (tree, void *), void *); extern tree binfo_via_virtual (tree, tree); extern tree build_baselink (tree, tree, tree, tree); extern tree adjust_result_of_qualified_name_lookup diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 078e2f9326d..919b619cc83 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -8477,7 +8477,8 @@ copy_fn_p (tree d) gcc_assert (DECL_FUNCTION_MEMBER_P (d)); - if (DECL_TEMPLATE_INFO (d) && is_member_template (DECL_TI_TEMPLATE (d))) + if (DECL_TEMPLATE_INFO (d) + && DECL_MEMBER_TEMPLATE_P (DECL_TI_TEMPLATE (d))) /* Instantiations of template member functions are never copy functions. Note that member functions of templated classes are represented as template functions internally, and we must diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 3c1f9b4ed9a..896fdfc1834 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -596,7 +596,7 @@ check_classfn (tree ctype, tree function, tree template_parms) if (DECL_USE_TEMPLATE (function) && !(TREE_CODE (function) == TEMPLATE_DECL && DECL_TEMPLATE_SPECIALIZATION (function)) - && is_member_template (DECL_TI_TEMPLATE (function))) + && DECL_MEMBER_TEMPLATE_P (DECL_TI_TEMPLATE (function))) /* Since this is a specialization of a member template, we're not going to find the declaration in the class. For example, in: @@ -622,11 +622,7 @@ check_classfn (tree ctype, tree function, tree template_parms) /* OK, is this a definition of a member template? */ is_template = (template_parms != NULL_TREE); - ix = lookup_fnfields_1 (complete_type (ctype), - DECL_CONSTRUCTOR_P (function) ? ctor_identifier : - DECL_DESTRUCTOR_P (function) ? dtor_identifier : - DECL_NAME (function)); - + ix = class_method_index_for_fn (complete_type (ctype), function); if (ix >= 0) { VEC(tree) *methods = CLASSTYPE_METHOD_VEC (ctype); diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 12886836d1b..ceb6d690a6a 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -101,8 +101,10 @@ finish_init_stmts (bool is_global, tree stmt_expr, tree compound_stmt) static tree dfs_initialize_vtbl_ptrs (tree binfo, void *data) { - if ((!BINFO_PRIMARY_P (binfo) || BINFO_VIRTUAL_P (binfo)) - && TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo))) + if (!TYPE_CONTAINS_VPTR_P (BINFO_TYPE (binfo))) + return dfs_skip_bases; + + if (!BINFO_PRIMARY_P (binfo) || BINFO_VIRTUAL_P (binfo)) { tree base_ptr = TREE_VALUE ((tree) data); @@ -111,8 +113,6 @@ dfs_initialize_vtbl_ptrs (tree binfo, void *data) expand_virtual_init (binfo, base_ptr); } - BINFO_MARKED (binfo) = 1; - return NULL_TREE; } @@ -132,9 +132,7 @@ initialize_vtbl_ptrs (tree addr) class. We do these in pre-order because we can't find the virtual bases for a class until we've initialized the vtbl for that class. */ - dfs_walk_real (TYPE_BINFO (type), dfs_initialize_vtbl_ptrs, - NULL, unmarkedp, list); - dfs_walk (TYPE_BINFO (type), dfs_unmark, markedp, type); + dfs_walk_once (TYPE_BINFO (type), dfs_initialize_vtbl_ptrs, NULL, list); } /* Return an expression for the zero-initialization of an object with diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 79342dbf576..9bd3f1805b6 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -10389,7 +10389,13 @@ cp_parser_asm_definition (cp_parser* parser) inputs, clobbers); /* If the extended syntax was not used, mark the ASM_EXPR. */ if (!extended_p) - ASM_INPUT_P (asm_stmt) = 1; + { + tree temp = asm_stmt; + if (TREE_CODE (temp) == CLEANUP_POINT_EXPR) + temp = TREE_OPERAND (temp, 0); + + ASM_INPUT_P (temp) = 1; + } } else assemble_asm (string); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 3813c38ed41..9a869eaecd2 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -117,12 +117,9 @@ static int for_each_template_parm (tree, tree_fn_t, void*, htab_t); static tree build_template_parm_index (int, int, int, tree, tree); static int inline_needs_template_parms (tree); static void push_inline_template_parms_recursive (tree, int); -static tree retrieve_specialization (tree, tree); static tree retrieve_local_specialization (tree); -static tree register_specialization (tree, tree, tree); static void register_local_specialization (tree, tree); static tree reduce_template_parm_level (tree, tree, int); -static tree build_template_decl (tree, tree); static int mark_template_parm (tree, void *); static int template_parm_this_level_p (tree, void *); static tree tsubst_friend_function (tree, tree); @@ -441,67 +438,6 @@ maybe_end_member_template_processing (void) } } -/* Returns nonzero iff T is a member template function. We must be - careful as in - - template class C { void f(); } - - Here, f is a template function, and a member, but not a member - template. This function does not concern itself with the origin of - T, only its present state. So if we have - - template class C { template void f(U); } - - then neither C::f nor C::f is considered - to be a member template. But, `template void - C::f(U)' is considered a member template. */ - -int -is_member_template (tree t) -{ - if (!DECL_FUNCTION_TEMPLATE_P (t)) - /* Anything that isn't a function or a template function is - certainly not a member template. */ - return 0; - - /* A local class can't have member templates. */ - if (decl_function_context (t)) - return 0; - - return (DECL_FUNCTION_MEMBER_P (DECL_TEMPLATE_RESULT (t)) - /* If there are more levels of template parameters than - there are template classes surrounding the declaration, - then we have a member template. */ - && (TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (t)) > - template_class_depth (DECL_CONTEXT (t)))); -} - -#if 0 /* UNUSED */ -/* Returns nonzero iff T is a member template class. See - is_member_template for a description of what precisely constitutes - a member template. */ - -int -is_member_template_class (tree t) -{ - if (!DECL_CLASS_TEMPLATE_P (t)) - /* Anything that isn't a class template, is certainly not a member - template. */ - return 0; - - if (!DECL_CLASS_SCOPE_P (t)) - /* Anything whose context isn't a class type is surely not a - member template. */ - return 0; - - /* If there are more levels of template parameters than there are - template classes surrounding the declaration, then we have a - member template. */ - return (TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (t)) > - template_class_depth (DECL_CONTEXT (t))); -} -#endif - /* Return a new template argument vector which contains all of ARGS, but has as its innermost set of arguments the EXTRA_ARGS. */ @@ -826,30 +762,122 @@ maybe_process_partial_specialization (tree type) error ("explicit specialization of non-template %qT", type); } +/* Returns nonzero if we can optimize the retrieval of specializations + for TMPL, a TEMPLATE_DECL. In particular, for such a template, we + do not use DECL_TEMPLATE_SPECIALIZATIONS at all. */ + +static inline bool +optimize_specialization_lookup_p (tree tmpl) +{ + return (DECL_FUNCTION_TEMPLATE_P (tmpl) + && DECL_CLASS_SCOPE_P (tmpl) + /* DECL_CLASS_SCOPE_P holds of T::f even if T is a template + parameter. */ + && CLASS_TYPE_P (DECL_CONTEXT (tmpl)) + && !DECL_MEMBER_TEMPLATE_P (tmpl) + && !DECL_CONV_FN_P (tmpl) + /* It is possible to have a template that is not a member + template and is not a member of a template class: + + template + struct S { friend A::f(); }; + + Here, the friend function is a template, but the context does + not have template information. The optimized lookup relies + on having ARGS be the template arguments for both the class + and the function template. */ + && !DECL_FRIEND_P (DECL_TEMPLATE_RESULT (tmpl))); +} + /* Retrieve the specialization (in the sense of [temp.spec] - a specialization is either an instantiation or an explicit specialization) of TMPL for the given template ARGS. If there is no such specialization, return NULL_TREE. The ARGS are a vector of arguments, or a vector of vectors of arguments, in the case of - templates with more than one level of parameters. */ + templates with more than one level of parameters. + + If TMPL is a type template and CLASS_SPECIALIZATIONS_P is true, + then we search for a partial specialization matching ARGS. This + parameter is ignored if TMPL is not a class template. */ static tree -retrieve_specialization (tree tmpl, tree args) +retrieve_specialization (tree tmpl, tree args, + bool class_specializations_p) { - tree s; - gcc_assert (TREE_CODE (tmpl) == TEMPLATE_DECL); /* There should be as many levels of arguments as there are levels of parameters. */ gcc_assert (TMPL_ARGS_DEPTH (args) == TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl))); - - for (s = DECL_TEMPLATE_SPECIALIZATIONS (tmpl); - s != NULL_TREE; - s = TREE_CHAIN (s)) - if (comp_template_args (TREE_PURPOSE (s), args)) - return TREE_VALUE (s); + + if (optimize_specialization_lookup_p (tmpl)) + { + tree class_template; + tree class_specialization; + VEC(tree) *methods; + tree fns; + int idx; + + /* The template arguments actually apply to the containing + class. Find the class specialization with those + arguments. */ + class_template = CLASSTYPE_TI_TEMPLATE (DECL_CONTEXT (tmpl)); + class_specialization + = retrieve_specialization (class_template, args, + /*class_specializations_p=*/false); + if (!class_specialization) + return NULL_TREE; + /* Now, find the appropriate entry in the CLASSTYPE_METHOD_VEC + for the specialization. */ + idx = class_method_index_for_fn (class_specialization, tmpl); + if (idx == -1) + return NULL_TREE; + /* Iterate through the methods with the indicated name, looking + for the one that has an instance of TMPL. */ + methods = CLASSTYPE_METHOD_VEC (class_specialization); + for (fns = VEC_index (tree, methods, idx); fns; fns = OVL_NEXT (fns)) + { + tree fn = OVL_CURRENT (fns); + if (DECL_TEMPLATE_INFO (fn) && DECL_TI_TEMPLATE (fn) == tmpl) + return fn; + } + return NULL_TREE; + } + else + { + tree *sp; + tree *head; + + /* Class templates store their instantiations on the + DECL_TEMPLATE_INSTANTIATIONS list; other templates use the + DECL_TEMPLATE_SPECIALIZATIONS list. */ + if (!class_specializations_p + && TREE_CODE (DECL_TEMPLATE_RESULT (tmpl)) == TYPE_DECL) + sp = &DECL_TEMPLATE_INSTANTIATIONS (tmpl); + else + sp = &DECL_TEMPLATE_SPECIALIZATIONS (tmpl); + head = sp; + /* Iterate through the list until we find a matching template. */ + while (*sp != NULL_TREE) + { + tree spec = *sp; + + if (comp_template_args (TREE_PURPOSE (spec), args)) + { + /* Use the move-to-front heuristic to speed up future + searches. */ + if (spec != *head) + { + *sp = TREE_CHAIN (*sp); + TREE_CHAIN (spec) = *head; + *head = spec; + } + return TREE_VALUE (spec); + } + sp = &TREE_CHAIN (spec); + } + } return NULL_TREE; } @@ -1035,7 +1063,7 @@ is_specialization_of_friend (tree decl, tree friend) static tree register_specialization (tree spec, tree tmpl, tree args) { - tree s; + tree fn; gcc_assert (TREE_CODE (tmpl) == TEMPLATE_DECL); @@ -1059,73 +1087,67 @@ register_specialization (tree spec, tree tmpl, tree args) gcc_assert (TMPL_ARGS_DEPTH (args) == TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl))); - for (s = DECL_TEMPLATE_SPECIALIZATIONS (tmpl); - s != NULL_TREE; - s = TREE_CHAIN (s)) + fn = retrieve_specialization (tmpl, args, + /*class_specializations_p=*/false); + /* We can sometimes try to re-register a specialization that we've + already got. In particular, regenerate_decl_from_template calls + duplicate_decls which will update the specialization list. But, + we'll still get called again here anyhow. It's more convenient + to simply allow this than to try to prevent it. */ + if (fn == spec) + return spec; + else if (fn && DECL_TEMPLATE_SPECIALIZATION (spec)) { - tree fn = TREE_VALUE (s); - - /* We can sometimes try to re-register a specialization that we've - already got. In particular, regenerate_decl_from_template - calls duplicate_decls which will update the specialization - list. But, we'll still get called again here anyhow. It's - more convenient to simply allow this than to try to prevent it. */ - if (fn == spec) - return spec; - else if (DECL_TEMPLATE_SPECIALIZATION (spec) - && comp_template_args (TREE_PURPOSE (s), args)) + if (DECL_TEMPLATE_INSTANTIATION (fn)) { - if (DECL_TEMPLATE_INSTANTIATION (fn)) + if (TREE_USED (fn) + || DECL_EXPLICIT_INSTANTIATION (fn)) { - if (TREE_USED (fn) - || DECL_EXPLICIT_INSTANTIATION (fn)) - { - error ("specialization of %qD after instantiation", fn); - return spec; - } - else - { - /* This situation should occur only if the first - specialization is an implicit instantiation, the - second is an explicit specialization, and the - implicit instantiation has not yet been used. - That situation can occur if we have implicitly - instantiated a member function and then - specialized it later. - - We can also wind up here if a friend declaration - that looked like an instantiation turns out to be - a specialization: - - template void foo(T); - class S { friend void foo<>(int) }; - template <> void foo(int); - - We transform the existing DECL in place so that - any pointers to it become pointers to the updated - declaration. - - If there was a definition for the template, but - not for the specialization, we want this to look - as if there were no definition, and vice - versa. */ - DECL_INITIAL (fn) = NULL_TREE; - duplicate_decls (spec, fn); - - return fn; - } + error ("specialization of %qD after instantiation", + fn); + return spec; } - else if (DECL_TEMPLATE_SPECIALIZATION (fn)) + else { - if (!duplicate_decls (spec, fn) && DECL_INITIAL (spec)) - /* Dup decl failed, but this is a new definition. Set - the line number so any errors match this new - definition. */ - DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (spec); + /* This situation should occur only if the first + specialization is an implicit instantiation, the + second is an explicit specialization, and the + implicit instantiation has not yet been used. That + situation can occur if we have implicitly + instantiated a member function and then specialized + it later. + + We can also wind up here if a friend declaration that + looked like an instantiation turns out to be a + specialization: + + template void foo(T); + class S { friend void foo<>(int) }; + template <> void foo(int); + + We transform the existing DECL in place so that any + pointers to it become pointers to the updated + declaration. + + If there was a definition for the template, but not + for the specialization, we want this to look as if + there were no definition, and vice versa. */ + DECL_INITIAL (fn) = NULL_TREE; + duplicate_decls (spec, fn); return fn; } } + else if (DECL_TEMPLATE_SPECIALIZATION (fn)) + { + if (!duplicate_decls (spec, fn) && DECL_INITIAL (spec)) + /* Dup decl failed, but this is a new definition. Set the + line number so any errors match this new + definition. */ + DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (spec); + + return fn; + } } /* A specialization must be declared in the same namespace as the @@ -1134,8 +1156,9 @@ register_specialization (tree spec, tree tmpl, tree args) && !check_specialization_namespace (tmpl)) DECL_CONTEXT (spec) = decl_namespace_context (tmpl); - DECL_TEMPLATE_SPECIALIZATIONS (tmpl) - = tree_cons (args, spec, DECL_TEMPLATE_SPECIALIZATIONS (tmpl)); + if (!optimize_specialization_lookup_p (tmpl)) + DECL_TEMPLATE_SPECIALIZATIONS (tmpl) + = tree_cons (args, spec, DECL_TEMPLATE_SPECIALIZATIONS (tmpl)); return spec; } @@ -2393,14 +2416,16 @@ current_template_args (void) } /* Return a TEMPLATE_DECL corresponding to DECL, using the indicated - template PARMS. Used by push_template_decl below. */ + template PARMS. If MEMBER_TEMPLATE_P is true, the new template is + a member template. Used by push_template_decl below. */ static tree -build_template_decl (tree decl, tree parms) +build_template_decl (tree decl, tree parms, bool member_template_p) { tree tmpl = build_lang_decl (TEMPLATE_DECL, DECL_NAME (decl), NULL_TREE); DECL_TEMPLATE_PARMS (tmpl) = parms; DECL_CONTEXT (tmpl) = DECL_CONTEXT (decl); + DECL_MEMBER_TEMPLATE_P (tmpl) = member_template_p; if (DECL_LANG_SPECIFIC (decl)) { DECL_STATIC_FUNCTION_P (tmpl) = DECL_STATIC_FUNCTION_P (decl); @@ -2636,7 +2661,8 @@ process_partial_specialization (tree decl) } } - if (retrieve_specialization (maintmpl, specargs)) + if (retrieve_specialization (maintmpl, specargs, + /*class_specializations_p=*/true)) /* We've already got this specialization. */ return decl; @@ -2826,6 +2852,9 @@ push_template_decl_real (tree decl, int is_friend) int primary; int is_partial; int new_template_p = 0; + /* True if the template is a member template, in the sense of + [temp.mem]. */ + bool member_template_p = false; if (decl == error_mark_node) return decl; @@ -2862,6 +2891,8 @@ push_template_decl_real (tree decl, int is_friend) if (primary) { + if (DECL_CLASS_SCOPE_P (decl)) + member_template_p = true; if (current_lang_name == lang_name_c) error ("template with C linkage"); else if (TREE_CODE (decl) == TYPE_DECL @@ -2941,7 +2972,8 @@ push_template_decl_real (tree decl, int is_friend) } else { - tmpl = build_template_decl (decl, current_template_parms); + tmpl = build_template_decl (decl, current_template_parms, + member_template_p); new_template_p = 1; if (DECL_LANG_SPECIFIC (decl) @@ -2984,7 +3016,7 @@ push_template_decl_real (tree decl, int is_friend) if (DECL_FUNCTION_TEMPLATE_P (tmpl) && DECL_TEMPLATE_INFO (decl) && DECL_TI_ARGS (decl) && DECL_TEMPLATE_SPECIALIZATION (decl) - && is_member_template (tmpl)) + && DECL_MEMBER_TEMPLATE_P (tmpl)) { tree new_tmpl; @@ -2996,7 +3028,8 @@ push_template_decl_real (tree decl, int is_friend) args = DECL_TI_ARGS (decl); new_tmpl - = build_template_decl (decl, current_template_parms); + = build_template_decl (decl, current_template_parms, + member_template_p); DECL_TEMPLATE_RESULT (new_tmpl) = decl; TREE_TYPE (new_tmpl) = TREE_TYPE (decl); DECL_TI_TEMPLATE (decl) = new_tmpl; @@ -4342,7 +4375,6 @@ lookup_template_class (tree d1, tree gen_tmpl; tree type_decl; tree found = NULL_TREE; - tree *tp; int arg_depth; int parm_depth; int is_partial_instantiation; @@ -4466,22 +4498,11 @@ lookup_template_class (tree d1, if (found) POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, found); - for (tp = &DECL_TEMPLATE_INSTANTIATIONS (template); - *tp; - tp = &TREE_CHAIN (*tp)) - if (comp_template_args (TREE_PURPOSE (*tp), arglist)) - { - found = *tp; - - /* Use the move-to-front heuristic to speed up future - searches. */ - *tp = TREE_CHAIN (*tp); - TREE_CHAIN (found) - = DECL_TEMPLATE_INSTANTIATIONS (template); - DECL_TEMPLATE_INSTANTIATIONS (template) = found; - - POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, TREE_VALUE (found)); - } + /* If we already have this specialization, return it. */ + found = retrieve_specialization (template, arglist, + /*class_specializations_p=*/false); + if (found) + POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, found); /* This type is a "partial instantiation" if any of the template arguments still involve template parameters. Note that we set @@ -6069,7 +6090,8 @@ tsubst_decl (tree t, tree args, tree type, tsubst_flags_t complain) changed. */ gcc_assert (full_args != tmpl_args); - spec = retrieve_specialization (t, full_args); + spec = retrieve_specialization (t, full_args, + /*class_specializations_p=*/true); if (spec != NULL_TREE) { r = spec; @@ -6181,7 +6203,8 @@ tsubst_decl (tree t, tree args, tree type, tsubst_flags_t complain) args, complain, in_decl); /* Check to see if we already have this specialization. */ - spec = retrieve_specialization (gen_tmpl, argvec); + spec = retrieve_specialization (gen_tmpl, argvec, + /*class_specializations_p=*/false); if (spec) { @@ -6467,7 +6490,8 @@ tsubst_decl (tree t, tree args, tree type, tsubst_flags_t complain) tmpl = DECL_TI_TEMPLATE (t); gen_tmpl = most_general_template (tmpl); argvec = tsubst (DECL_TI_ARGS (t), args, complain, in_decl); - spec = retrieve_specialization (gen_tmpl, argvec); + spec = retrieve_specialization (gen_tmpl, argvec, + /*class_specializations_p=*/false); } else spec = retrieve_local_specialization (t); @@ -6657,6 +6681,39 @@ tsubst_function_type (tree t, return fntype; } +/* FNTYPE is a FUNCTION_TYPE or METHOD_TYPE. Substitute the template + ARGS into that specification, and return the substituted + specification. If there is no specification, return NULL_TREE. */ + +static tree +tsubst_exception_specification (tree fntype, + tree args, + tsubst_flags_t complain, + tree in_decl) +{ + tree specs; + tree new_specs; + + specs = TYPE_RAISES_EXCEPTIONS (fntype); + new_specs = NULL_TREE; + if (specs) + { + if (! TREE_VALUE (specs)) + new_specs = specs; + else + while (specs) + { + tree spec; + spec = tsubst (TREE_VALUE (specs), args, complain, in_decl); + if (spec == error_mark_node) + return spec; + new_specs = add_exception_specifier (new_specs, spec, complain); + specs = TREE_CHAIN (specs); + } + } + return new_specs; +} + /* Substitute into the PARMS of a call-declarator. */ static tree @@ -7089,32 +7146,16 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) case METHOD_TYPE: { tree fntype; - tree raises; - + tree specs; fntype = tsubst_function_type (t, args, complain, in_decl); if (fntype == error_mark_node) return error_mark_node; /* Substitute the exception specification. */ - raises = TYPE_RAISES_EXCEPTIONS (t); - if (raises) - { - tree list = NULL_TREE; - - if (! TREE_VALUE (raises)) - list = raises; - else - for (; raises != NULL_TREE; raises = TREE_CHAIN (raises)) - { - tree spec = TREE_VALUE (raises); - - spec = tsubst (spec, args, complain, in_decl); - if (spec == error_mark_node) - return spec; - list = add_exception_specifier (list, spec, complain); - } - fntype = build_exception_variant (fntype, list); - } + specs = tsubst_exception_specification (t, args, complain, + in_decl); + if (specs) + fntype = build_exception_variant (fntype, specs); return fntype; } case ARRAY_TYPE: @@ -7537,7 +7578,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl) if (DECL_TEMPLATE_TEMPLATE_PARM_P (t)) return tsubst (TREE_TYPE (DECL_TEMPLATE_RESULT (t)), args, complain, in_decl); - else if (is_member_template (t)) + else if (DECL_FUNCTION_TEMPLATE_P (t) && DECL_MEMBER_TEMPLATE_P (t)) return tsubst (t, args, complain, in_decl); else if (DECL_CLASS_SCOPE_P (t) && uses_template_parms (DECL_CONTEXT (t))) @@ -8017,7 +8058,12 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl) tsubst_expr (ASM_OUTPUTS (t), args, complain, in_decl), tsubst_expr (ASM_INPUTS (t), args, complain, in_decl), tsubst_expr (ASM_CLOBBERS (t), args, complain, in_decl)); - ASM_INPUT_P (tmp) = ASM_INPUT_P (t); + { + tree asm_expr = tmp; + if (TREE_CODE (asm_expr) == CLEANUP_POINT_EXPR) + asm_expr = TREE_OPERAND (asm_expr, 0); + ASM_INPUT_P (asm_expr) = ASM_INPUT_P (t); + } break; case TRY_BLOCK: @@ -8736,7 +8782,8 @@ instantiate_template (tree tmpl, tree targ_ptr, tsubst_flags_t complain) } /* Check to see if we already have this specialization. */ - spec = retrieve_specialization (tmpl, targ_ptr); + spec = retrieve_specialization (tmpl, targ_ptr, + /*class_specializations_p=*/false); if (spec != NULL_TREE) return spec; @@ -8750,7 +8797,8 @@ instantiate_template (tree tmpl, tree targ_ptr, tsubst_flags_t complain) targ_ptr); /* Check to see if we already have this specialization. */ - spec = retrieve_specialization (gen_tmpl, targ_ptr); + spec = retrieve_specialization (gen_tmpl, targ_ptr, + /*class_specializations_p=*/false); if (spec != NULL_TREE) return spec; } @@ -10808,75 +10856,76 @@ do_type_instantiation (tree t, tree storage, tsubst_flags_t complain) static void regenerate_decl_from_template (tree decl, tree tmpl) { - /* The most general version of TMPL. */ - tree gen_tmpl; /* The arguments used to instantiate DECL, from the most general template. */ tree args; tree code_pattern; - tree new_decl; - bool unregistered; args = DECL_TI_ARGS (decl); code_pattern = DECL_TEMPLATE_RESULT (tmpl); - /* Unregister the specialization so that when we tsubst we will not - just return DECL. We don't have to unregister DECL from TMPL - because if would only be registered there if it were a partial - instantiation of a specialization, which it isn't: it's a full - instantiation. */ - gen_tmpl = most_general_template (tmpl); - unregistered = reregister_specialization (decl, gen_tmpl, - /*new_spec=*/NULL_TREE); - - /* If the DECL was not unregistered then something peculiar is - happening: we created a specialization but did not call - register_specialization for it. */ - gcc_assert (unregistered); - /* Make sure that we can see identifiers, and compute access correctly. */ push_access_scope (decl); - /* Do the substitution to get the new declaration. */ - new_decl = tsubst (code_pattern, args, tf_error, NULL_TREE); + if (TREE_CODE (decl) == FUNCTION_DECL) + { + tree decl_parm; + tree pattern_parm; + tree specs; + int args_depth; + int parms_depth; + + args_depth = TMPL_ARGS_DEPTH (args); + parms_depth = TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl)); + if (args_depth > parms_depth) + args = get_innermost_template_args (args, parms_depth); + + specs = tsubst_exception_specification (TREE_TYPE (code_pattern), + args, tf_error, NULL_TREE); + if (specs) + TREE_TYPE (decl) = build_exception_variant (TREE_TYPE (decl), + specs); + + /* Merge parameter declarations. */ + decl_parm = skip_artificial_parms_for (decl, + DECL_ARGUMENTS (decl)); + pattern_parm + = skip_artificial_parms_for (code_pattern, + DECL_ARGUMENTS (code_pattern)); + while (decl_parm) + { + tree parm_type; + + if (DECL_NAME (decl_parm) != DECL_NAME (pattern_parm)) + DECL_NAME (decl_parm) = DECL_NAME (pattern_parm); + parm_type = tsubst (TREE_TYPE (pattern_parm), args, tf_error, + NULL_TREE); + if (!same_type_p (TREE_TYPE (decl_parm), parm_type)) + TREE_TYPE (decl_parm) = parm_type; + decl_parm = TREE_CHAIN (decl_parm); + pattern_parm = TREE_CHAIN (pattern_parm); + } - if (TREE_CODE (decl) == VAR_DECL) + /* Merge additional specifiers from the CODE_PATTERN. */ + if (DECL_DECLARED_INLINE_P (code_pattern) + && !DECL_DECLARED_INLINE_P (decl)) + DECL_DECLARED_INLINE_P (decl) = 1; + if (DECL_INLINE (code_pattern) && !DECL_INLINE (decl)) + DECL_INLINE (decl) = 1; + } + else if (TREE_CODE (decl) == VAR_DECL) { - /* Set up DECL_INITIAL, since tsubst doesn't. */ - if (!DECL_INITIALIZED_IN_CLASS_P (decl)) - DECL_INITIAL (new_decl) = + if (!DECL_INITIALIZED_IN_CLASS_P (decl) + && DECL_INITIAL (code_pattern)) + DECL_INITIAL (decl) = tsubst_expr (DECL_INITIAL (code_pattern), args, tf_error, DECL_TI_TEMPLATE (decl)); } - else if (TREE_CODE (decl) == FUNCTION_DECL) - { - /* Convince duplicate_decls to use the DECL_ARGUMENTS from the - new decl. */ - DECL_INITIAL (new_decl) = error_mark_node; - /* And don't complain about a duplicate definition. */ - DECL_INITIAL (decl) = NULL_TREE; - } + else + gcc_unreachable (); pop_access_scope (decl); - - /* The immediate parent of the new template is still whatever it was - before, even though tsubst sets DECL_TI_TEMPLATE up as the most - general template. We also reset the DECL_ASSEMBLER_NAME since - tsubst always calculates the name as if the function in question - were really a template instance, and sometimes, with friend - functions, this is not so. See tsubst_friend_function for - details. */ - DECL_TI_TEMPLATE (new_decl) = DECL_TI_TEMPLATE (decl); - COPY_DECL_ASSEMBLER_NAME (decl, new_decl); - COPY_DECL_RTL (decl, new_decl); - DECL_USE_TEMPLATE (new_decl) = DECL_USE_TEMPLATE (decl); - - /* Call duplicate decls to merge the old and new declarations. */ - duplicate_decls (new_decl, decl); - - /* Now, re-register the specialization. */ - register_specialization (decl, gen_tmpl, args); } /* Return the TEMPLATE_DECL into which DECL_TI_ARGS(DECL) should be @@ -10994,7 +11043,8 @@ instantiate_decl (tree d, int defer_ok, int undefined_ok) DECL_TEMPLATE_SPECIALIZATION. */ gen_tmpl = most_general_template (tmpl); gen_args = DECL_TI_ARGS (d); - spec = retrieve_specialization (gen_tmpl, gen_args); + spec = retrieve_specialization (gen_tmpl, gen_args, + /*class_specializations_p=*/false); if (spec != NULL_TREE && DECL_TEMPLATE_SPECIALIZATION (spec)) return spec; diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 47d08f34c74..cd6e9b2dc65 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -36,29 +36,20 @@ Boston, MA 02111-1307, USA. */ #include "toplev.h" #include "stack.h" -struct vbase_info -{ - /* The class dominating the hierarchy. */ - tree type; - /* A pointer to a complete object of the indicated TYPE. */ - tree decl_ptr; - tree inits; -}; - static int is_subobject_of_p (tree, tree); static base_kind lookup_base_r (tree, tree, base_access, bool, tree *); static int dynamic_cast_base_recurse (tree, tree, bool, tree *); -static tree dfs_debug_unmarkedp (tree, int, void *); static tree dfs_debug_mark (tree, void *); +static tree dfs_walk_once_r (tree, tree (*pre_fn) (tree, void *), + tree (*post_fn) (tree, void *), void *data); +static void dfs_unmark_r (tree); static int check_hidden_convs (tree, int, int, tree, tree, tree); static tree split_conversions (tree, tree, tree, tree); static int lookup_conversions_r (tree, int, int, tree, tree, tree, tree, tree *, tree *); static int look_for_overrides_r (tree, tree); -static tree lookup_field_queue_p (tree, int, void *); static tree lookup_field_r (tree, void *); -static tree dfs_accessible_queue_p (tree, int, void *); -static tree dfs_accessible_p (tree, void *); +static tree accessible_r (tree, bool); static tree dfs_access_in_type (tree, void *); static access_kind access_in_type (tree, tree); static int protected_accessible_p (tree, tree, tree); @@ -663,10 +654,6 @@ dfs_access_in_type (tree binfo, void *data) /* Note the access to DECL in TYPE. */ SET_BINFO_ACCESS (binfo, access); - /* Mark TYPE as visited so that if we reach it again we do not - duplicate our efforts here. */ - BINFO_MARKED (binfo) = 1; - return NULL_TREE; } @@ -688,47 +675,11 @@ access_in_type (tree type, tree decl) The algorithm we use is to make a post-order depth-first traversal of the base-class hierarchy. As we come up the tree, we annotate each node with the most lenient access. */ - dfs_walk_real (binfo, 0, dfs_access_in_type, unmarkedp, decl); - dfs_walk (binfo, dfs_unmark, markedp, 0); + dfs_walk_once (binfo, NULL, dfs_access_in_type, decl); return BINFO_ACCESS (binfo); } -/* Called from accessible_p via dfs_walk. */ - -static tree -dfs_accessible_queue_p (tree derived, int ix, void *data ATTRIBUTE_UNUSED) -{ - tree binfo = BINFO_BASE_BINFO (derived, ix); - - if (BINFO_MARKED (binfo)) - return NULL_TREE; - - /* If this class is inherited via private or protected inheritance, - then we can't see it, unless we are a friend of the derived class. */ - if (BINFO_BASE_ACCESS (derived, ix) != access_public_node - && !is_friend (BINFO_TYPE (derived), current_scope ())) - return NULL_TREE; - - return binfo; -} - -/* Called from accessible_p via dfs_walk. */ - -static tree -dfs_accessible_p (tree binfo, void *data ATTRIBUTE_UNUSED) -{ - access_kind access; - - BINFO_MARKED (binfo) = 1; - access = BINFO_ACCESS (binfo); - if (access != ak_none - && is_friend (BINFO_TYPE (binfo), current_scope ())) - return binfo; - - return NULL_TREE; -} - /* Returns nonzero if it is OK to access DECL through an object indicated by BINFO in the context of DERIVED. */ @@ -855,6 +806,43 @@ friend_accessible_p (tree scope, tree decl, tree binfo) return 0; } +static tree +accessible_r (tree binfo, bool once) +{ + tree rval = NULL_TREE; + unsigned ix; + tree base_binfo; + + /* Find the next child binfo to walk. */ + for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++) + { + bool mark = once && BINFO_VIRTUAL_P (base_binfo); + + if (mark && BINFO_MARKED (base_binfo)) + continue; + + /* If the base is inherited via private or protected + inheritance, then we can't see it, unless we are a friend of + the current binfo. */ + if (BINFO_BASE_ACCESS (binfo, ix) != access_public_node + && !is_friend (BINFO_TYPE (binfo), current_scope ())) + continue; + + if (mark) + BINFO_MARKED (base_binfo) = 1; + + rval = accessible_r (base_binfo, once); + if (rval) + return rval; + } + + if (BINFO_ACCESS (binfo) != ak_none + && is_friend (BINFO_TYPE (binfo), current_scope ())) + rval = binfo; + + return rval; +} + /* DECL is a declaration from a base class of TYPE, which was the class used to name DECL. Return nonzero if, in the current context, DECL is accessible. If TYPE is actually a BINFO node, @@ -941,12 +929,28 @@ accessible_p (tree type, tree decl) { /* Walk the hierarchy again, looking for a base class that allows access. */ - t = dfs_walk (binfo, dfs_accessible_p, dfs_accessible_queue_p, 0); - /* Clear any mark bits. Note that we have to walk the whole tree - here, since we have aborted the previous walk from some point - deep in the tree. */ - dfs_walk (binfo, dfs_unmark, 0, 0); + t = accessible_r + (binfo, CLASSTYPE_DIAMOND_SHAPED_P (BINFO_TYPE (binfo))); + if (!CLASSTYPE_DIAMOND_SHAPED_P (BINFO_TYPE (binfo))) + ;/* We are not diamond shaped, and therefore cannot + encounter the same binfo twice. */ + else if (!BINFO_INHERITANCE_CHAIN (binfo)) + { + /* We are at the top of the hierarchy, and can use the + CLASSTYPE_VBASECLASSES list for unmarking the virtual + bases. */ + VEC (tree) *vbases; + unsigned ix; + tree base_binfo; + + for (vbases = CLASSTYPE_VBASECLASSES (BINFO_TYPE (binfo)), ix = 0; + VEC_iterate (tree, vbases, ix, base_binfo); ix++) + BINFO_MARKED (base_binfo) = 0; + } + else + dfs_unmark_r (binfo); + return t != NULL_TREE; } } @@ -969,33 +973,6 @@ struct lookup_field_info { const char *errstr; }; -/* Returns nonzero if BINFO is not hidden by the value found by the - lookup so far. If BINFO is hidden, then there's no need to look in - it. DATA is really a struct lookup_field_info. Called from - lookup_field via breadth_first_search. */ - -static tree -lookup_field_queue_p (tree derived, int ix, void *data) -{ - tree binfo = BINFO_BASE_BINFO (derived, ix); - struct lookup_field_info *lfi = (struct lookup_field_info *) data; - - /* Don't look for constructors or destructors in base classes. */ - if (IDENTIFIER_CTOR_OR_DTOR_P (lfi->name)) - return NULL_TREE; - - /* If this base class is hidden by the best-known value so far, we - don't need to look. */ - if (lfi->rval_binfo && derived == lfi->rval_binfo) - return NULL_TREE; - - /* If this is a dependent base, don't look in it. */ - if (BINFO_DEPENDENT_BASE_P (binfo)) - return NULL_TREE; - - return binfo; -} - /* Within the scope of a template class, you can refer to the to the current specialization with the name of the template itself. For example: @@ -1075,6 +1052,16 @@ lookup_field_r (tree binfo, void *data) tree type = BINFO_TYPE (binfo); tree nval = NULL_TREE; + /* If this is a dependent base, don't look in it. */ + if (BINFO_DEPENDENT_BASE_P (binfo)) + return NULL_TREE; + + /* If this base class is hidden by the best-known value so far, we + don't need to look. */ + if (lfi->rval_binfo && BINFO_INHERITANCE_CHAIN (binfo) == lfi->rval_binfo + && !BINFO_VIRTUAL_P (binfo)) + return dfs_skip_bases; + /* First, look for a function. There can't be a function and a data member with the same name, and if there's a function and a type with the same name, the type is hidden by the function. */ @@ -1092,7 +1079,7 @@ lookup_field_r (tree binfo, void *data) /* If there is no declaration with the indicated name in this type, then there's nothing to do. */ if (!nval) - return NULL_TREE; + goto done; /* If we're looking up a type (as with an elaborated type specifier) we ignore all non-types we find. */ @@ -1119,14 +1106,14 @@ lookup_field_r (tree binfo, void *data) if (e != NULL) nval = TYPE_MAIN_DECL (e->type); else - return NULL_TREE; + goto done; } } /* You must name a template base class with a template-id. */ if (!same_type_p (type, lfi->type) && template_self_reference_p (type, nval)) - return NULL_TREE; + goto done; /* If the lookup already found a match, and the new value doesn't hide the old one, we might have an ambiguity. */ @@ -1165,6 +1152,10 @@ lookup_field_r (tree binfo, void *data) lfi->rval_binfo = binfo; } + done: + /* Don't look for constructors or destructors in base classes. */ + if (IDENTIFIER_CTOR_OR_DTOR_P (lfi->name)) + return dfs_skip_bases; return NULL_TREE; } @@ -1251,8 +1242,7 @@ lookup_member (tree xbasetype, tree name, int protect, bool want_type) lfi.type = type; lfi.name = name; lfi.want_type = want_type; - dfs_walk_real (basetype_path, &lookup_field_r, 0, - &lookup_field_queue_p, &lfi); + dfs_walk_all (basetype_path, &lookup_field_r, NULL, &lfi); rval = lfi.rval; rval_binfo = lfi.rval_binfo; if (rval_binfo) @@ -1464,6 +1454,22 @@ lookup_fnfields_1 (tree type, tree name) return -1; } +/* Like lookup_fnfields_1, except that the name is extracted from + FUNCTION, which is a FUNCTION_DECL or a TEMPLATE_DECL. */ + +int +class_method_index_for_fn (tree class_type, tree function) +{ + gcc_assert (TREE_CODE (function) == FUNCTION_DECL + || DECL_FUNCTION_TEMPLATE_P (function)); + + return lookup_fnfields_1 (class_type, + DECL_CONSTRUCTOR_P (function) ? ctor_identifier : + DECL_DESTRUCTOR_P (function) ? dtor_identifier : + DECL_NAME (function)); +} + + /* DECL is the result of a qualified name lookup. QUALIFYING_SCOPE is the class or namespace used to qualify the name. CONTEXT_CLASS is the class corresponding to the object in which DECL will be used. @@ -1510,66 +1516,158 @@ adjust_result_of_qualified_name_lookup (tree decl, /* Walk the class hierarchy within BINFO, in a depth-first traversal. - PREFN is called in preorder, while POSTFN is called in postorder. - If they ever returns a non-NULL value, that value is immediately - returned and the walk is terminated. Both PREFN and POSTFN can be - NULL. At each node, PREFN and POSTFN are passed the binfo to - examine. Before each base-binfo of BINFO is walked, QFN is called. - If the value returned is nonzero, the base-binfo is walked; - otherwise it is not. If QFN is NULL, it is treated as a function - which always returns 1. All callbacks are passed DATA whenever - they are called. */ + PRE_FN is called in preorder, while POST_FN is called in postorder. + If PRE_FN returns DFS_SKIP_BASES, child binfos will not be + walked. If PRE_FN or POST_FN returns a different non-NULL value, + that value is immediately returned and the walk is terminated. One + of PRE_FN and POST_FN can be NULL. At each node, PRE_FN and + POST_FN are passed the binfo to examine and the caller's DATA + value. All paths are walked, thus virtual and morally virtual + binfos can be multiply walked. */ tree -dfs_walk_real (tree binfo, - tree (*prefn) (tree, void *), - tree (*postfn) (tree, void *), - tree (*qfn) (tree, int, void *), - void *data) +dfs_walk_all (tree binfo, tree (*pre_fn) (tree, void *), + tree (*post_fn) (tree, void *), void *data) { - int i; + tree rval; + unsigned ix; tree base_binfo; - tree rval = NULL_TREE; - + /* Call the pre-order walking function. */ - if (prefn) + if (pre_fn) { - rval = (*prefn) (binfo, data); + rval = pre_fn (binfo, data); + if (rval) + { + if (rval == dfs_skip_bases) + goto skip_bases; + return rval; + } + } + + /* Find the next child binfo to walk. */ + for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++) + { + rval = dfs_walk_all (base_binfo, pre_fn, post_fn, data); if (rval) return rval; } - /* Process the basetypes. */ - for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) + skip_bases: + /* Call the post-order walking function. */ + if (post_fn) + return post_fn (binfo, data); + return NULL_TREE; +} + +/* Worker for dfs_walk_once. This behaves as dfs_walk_all, except + that binfos are walked at most once. */ + +static tree +dfs_walk_once_r (tree binfo, tree (*pre_fn) (tree, void *), + tree (*post_fn) (tree, void *), void *data) +{ + tree rval; + unsigned ix; + tree base_binfo; + + /* Call the pre-order walking function. */ + if (pre_fn) { - if (qfn) + rval = pre_fn (binfo, data); + if (rval) { - base_binfo = (*qfn) (binfo, i, data); - if (!base_binfo) + if (rval == dfs_skip_bases) + goto skip_bases; + + return rval; + } + } + + /* Find the next child binfo to walk. */ + for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++) + { + if (BINFO_VIRTUAL_P (base_binfo)) + { + if (BINFO_MARKED (base_binfo)) continue; + BINFO_MARKED (base_binfo) = 1; } - rval = dfs_walk_real (base_binfo, prefn, postfn, qfn, data); + + rval = dfs_walk_once_r (base_binfo, pre_fn, post_fn, data); if (rval) return rval; } - + + skip_bases: /* Call the post-order walking function. */ - if (postfn) - rval = (*postfn) (binfo, data); + if (post_fn) + return post_fn (binfo, data); - return rval; + return NULL_TREE; +} + +/* Worker for dfs_walk_once. Recursively unmark the virtual base binfos of + BINFO. */ + +static void +dfs_unmark_r (tree binfo) +{ + unsigned ix; + tree base_binfo; + + /* Process the basetypes. */ + for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++) + { + if (BINFO_VIRTUAL_P (base_binfo)) + { + if (!BINFO_MARKED (base_binfo)) + continue; + BINFO_MARKED (base_binfo) = 0; + } + /* Only walk, if it can contain more virtual bases. */ + if (CLASSTYPE_VBASECLASSES (BINFO_TYPE (base_binfo))) + dfs_unmark_r (base_binfo); + } } -/* Exactly like dfs_walk_real, except that there is no pre-order - function call and FN is called in post-order. */ +/* Like dfs_walk_all, except that binfos are not multiply walked. For + non-diamond shaped hierarchies this is the same as dfs_walk_all. + For diamond shaped hierarchies we must mark the virtual bases, to + avoid multiple walks. */ tree -dfs_walk (tree binfo, - tree (*fn) (tree, void *), - tree (*qfn) (tree, int, void *), - void *data) +dfs_walk_once (tree binfo, tree (*pre_fn) (tree, void *), + tree (*post_fn) (tree, void *), void *data) { - return dfs_walk_real (binfo, 0, fn, qfn, data); + tree rval; + + gcc_assert (pre_fn || post_fn); + + if (!CLASSTYPE_DIAMOND_SHAPED_P (BINFO_TYPE (binfo))) + /* We are not diamond shaped, and therefore cannot encounter the + same binfo twice. */ + rval = dfs_walk_all (binfo, pre_fn, post_fn, data); + else + { + rval = dfs_walk_once_r (binfo, pre_fn, post_fn, data); + if (!BINFO_INHERITANCE_CHAIN (binfo)) + { + /* We are at the top of the hierarchy, and can use the + CLASSTYPE_VBASECLASSES list for unmarking the virtual + bases. */ + VEC (tree) *vbases; + unsigned ix; + tree base_binfo; + + for (vbases = CLASSTYPE_VBASECLASSES (BINFO_TYPE (binfo)), ix = 0; + VEC_iterate (tree, vbases, ix, base_binfo); ix++) + BINFO_MARKED (base_binfo) = 0; + } + else + dfs_unmark_r (binfo); + } + return rval; } /* Check that virtual overrider OVERRIDER is acceptable for base function @@ -1789,8 +1887,6 @@ dfs_get_pure_virtuals (tree binfo, void *data) VEC_safe_push (tree, CLASSTYPE_PURE_VIRTUALS (type), BV_FN (virtuals)); } - - BINFO_MARKED (binfo) = 1; return NULL_TREE; } @@ -1809,39 +1905,8 @@ get_pure_virtuals (tree type) (A primary base is not interesting because the derived class of which it is a primary base will contain vtable entries for the pure virtuals in the base class. */ - dfs_walk (TYPE_BINFO (type), dfs_get_pure_virtuals, unmarkedp, type); - dfs_walk (TYPE_BINFO (type), dfs_unmark, markedp, type); + dfs_walk_once (TYPE_BINFO (type), NULL, dfs_get_pure_virtuals, type); } - -/* DEPTH-FIRST SEARCH ROUTINES. */ - -tree -markedp (tree derived, int ix, void *data ATTRIBUTE_UNUSED) -{ - tree binfo = BINFO_BASE_BINFO (derived, ix); - - return BINFO_MARKED (binfo) ? binfo : NULL_TREE; -} - -tree -unmarkedp (tree derived, int ix, void *data ATTRIBUTE_UNUSED) -{ - tree binfo = BINFO_BASE_BINFO (derived, ix); - - return !BINFO_MARKED (binfo) ? binfo : NULL_TREE; -} - -/* The worker functions for `dfs_walk'. These do not need to - test anything (vis a vis marking) if they are paired with - a predicate function (above). */ - -tree -dfs_unmark (tree binfo, void *data ATTRIBUTE_UNUSED) -{ - BINFO_MARKED (binfo) = 0; - return NULL_TREE; -} - /* Debug info for C++ classes can get very large; try to avoid emitting it everywhere. @@ -1889,23 +1954,14 @@ dfs_debug_mark (tree binfo, void *data ATTRIBUTE_UNUSED) { tree t = BINFO_TYPE (binfo); + if (CLASSTYPE_DEBUG_REQUESTED (t)) + return dfs_skip_bases; + CLASSTYPE_DEBUG_REQUESTED (t) = 1; return NULL_TREE; } -/* Returns BINFO if we haven't already noted that we want debugging - info for this base class. */ - -static tree -dfs_debug_unmarkedp (tree derived, int ix, void *data ATTRIBUTE_UNUSED) -{ - tree binfo = BINFO_BASE_BINFO (derived, ix); - - return (!CLASSTYPE_DEBUG_REQUESTED (BINFO_TYPE (binfo)) - ? binfo : NULL_TREE); -} - /* Write out the debugging information for TYPE, whose vtable is being emitted. Also walk through our bases and note that we want to write out information for them. This avoids the problem of not @@ -1922,7 +1978,7 @@ note_debug_info_needed (tree type) rest_of_type_compilation (type, toplevel_bindings_p ()); } - dfs_walk (TYPE_BINFO (type), dfs_debug_mark, dfs_debug_unmarkedp, 0); + dfs_walk_all (TYPE_BINFO (type), dfs_debug_mark, NULL, 0); } void diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 5bb6f3b4d59..78d2683f6ef 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1178,6 +1178,7 @@ finish_asm_stmt (int volatile_p, tree string, tree output_operands, output_operands, input_operands, clobbers); ASM_VOLATILE_P (r) = volatile_p; + r = maybe_cleanup_point_expr (r); return add_stmt (r); } diff --git a/gcc/dbxout.c b/gcc/dbxout.c index 8dd153e151a..bab43cb5f34 100644 --- a/gcc/dbxout.c +++ b/gcc/dbxout.c @@ -2182,22 +2182,24 @@ dbxout_symbol (tree decl, int local ATTRIBUTE_UNUSED) a different name. In that case we also want to output that. */ - if ((TREE_CODE (t) == RECORD_TYPE + if (TREE_CODE (t) == RECORD_TYPE || TREE_CODE (t) == UNION_TYPE || TREE_CODE (t) == QUAL_UNION_TYPE || TREE_CODE (t) == ENUMERAL_TYPE) - && TYPE_STUB_DECL (t) - && TYPE_STUB_DECL (t) != decl - && DECL_P (TYPE_STUB_DECL (t)) - && ! DECL_IGNORED_P (TYPE_STUB_DECL (t))) { - debug_queue_symbol (TYPE_STUB_DECL (t)); - if (TYPE_NAME (t) - && TYPE_NAME (t) != TYPE_STUB_DECL (t) - && TYPE_NAME (t) != decl - && DECL_P (TYPE_NAME (t))) - debug_queue_symbol (TYPE_NAME (t)); - } + if (TYPE_STUB_DECL (t) + && TYPE_STUB_DECL (t) != decl + && DECL_P (TYPE_STUB_DECL (t)) + && ! DECL_IGNORED_P (TYPE_STUB_DECL (t))) + { + debug_queue_symbol (TYPE_STUB_DECL (t)); + if (TYPE_NAME (t) + && TYPE_NAME (t) != TYPE_STUB_DECL (t) + && TYPE_NAME (t) != decl + && DECL_P (TYPE_NAME (t))) + debug_queue_symbol (TYPE_NAME (t)); + } + } else if (TYPE_NAME (t) && TYPE_NAME (t) != decl && DECL_P (TYPE_NAME (t))) diff --git a/gcc/defaults.h b/gcc/defaults.h index bdcefdb9827..d842742e760 100644 --- a/gcc/defaults.h +++ b/gcc/defaults.h @@ -334,16 +334,6 @@ do { fputs (integer_asm_op (POINTER_SIZE / BITS_PER_UNIT, TRUE), FILE); \ #endif #endif -/* By default, we generate a label at the beginning and end of the - text section, and compute the size of the text section by - subtracting the two. However, on some platforms that doesn't - work, and we use the section itself, rather than a label at the - beginning of it, to indicate the start of the section. On such - platforms, define this to zero. */ -#ifndef DWARF2_GENERATE_TEXT_SECTION_LABEL -#define DWARF2_GENERATE_TEXT_SECTION_LABEL 1 -#endif - /* Number of hardware registers that go into the DWARF-2 unwind info. If not defined, equals FIRST_PSEUDO_REGISTER */ diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi index dd3e706f825..18cff6a442a 100644 --- a/gcc/doc/install.texi +++ b/gcc/doc/install.texi @@ -3489,7 +3489,7 @@ The stock GNU binutils 2.15 release is broken on this platform because of a single bug. It has been fixed on the 2.15 branch in the CVS repository. You can obtain a working version by checking out the binutils-2_15-branch from the CVS repository or applying the patch -`http://sources.redhat.com/ml/binutils-cvs/2004-09/msg00036.html' to the +@uref{http://sources.redhat.com/ml/binutils-cvs/2004-09/msg00036.html} to the release. Sun bug 4296832 turns up when compiling X11 headers with GCC 2.95 or diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index c22ae29905b..71c72c84603 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -8090,13 +8090,6 @@ Dwarf 2 frame information. If @code{DWARF2_UNWIND_INFO} information not matter how you define @code{DWARF2_FRAME_INFO}. @end defmac -@defmac DWARF2_GENERATE_TEXT_SECTION_LABEL -By default, the Dwarf 2 debugging information generator will generate a -label to mark the beginning of the text section. If it is better simply -to use the name of the text section itself, rather than an explicit label, -to indicate the beginning of the text section, define this macro to zero. -@end defmac - @defmac DWARF2_ASM_LINE_DEBUG_INFO Define this macro to be a nonzero value if the assembler can generate Dwarf 2 line debug info sections. This will result in much more compact line number diff --git a/gcc/dwarf2.h b/gcc/dwarf2.h index 4199aa4f6ba..aa550176024 100644 --- a/gcc/dwarf2.h +++ b/gcc/dwarf2.h @@ -1,7 +1,7 @@ /* Declarations and definitions of codes relating to the DWARF2 symbolic debugging information format. - Copyright (C) 1992, 1993, 1995, 1996, 1997, 1999, 2000, 2001, 2002 - Free Software Foundation, Inc. + Copyright (C) 1992, 1993, 1995, 1996, 1997, 1999, 2000, 2001, 2002, + 2003, 2004 Free Software Foundation, Inc. Written by Gary Funck (gary@intrepid.com) The Ada Joint Program Office (AJPO), Florida State University and Silicon Graphics Inc. @@ -10,22 +10,22 @@ Derived from the DWARF 1 implementation written by Ron Guilmette (rfg@netcom.com), November 1990. -This file is part of GCC. + This file is part of GCC. -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 2, or (at your option) any later -version. + GCC is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2, or (at your option) any later + version. -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. + GCC is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING. If not, write to the Free -Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ + You should have received a copy of the GNU General Public License + along with GCC; see the file COPYING. If not, write to the Free + Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ /* This file is derived from the DWARF specification (a public document) Revision 2.0.0 (July 27, 1993) developed by the UNIX International @@ -41,6 +41,92 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #ifndef GCC_DWARF2_H #define GCC_DWARF2_H +/* Structure found in the .debug_line section. */ +typedef struct +{ + unsigned char li_length [4]; + unsigned char li_version [2]; + unsigned char li_prologue_length [4]; + unsigned char li_min_insn_length [1]; + unsigned char li_default_is_stmt [1]; + unsigned char li_line_base [1]; + unsigned char li_line_range [1]; + unsigned char li_opcode_base [1]; +} +DWARF2_External_LineInfo; + +typedef struct +{ + unsigned long li_length; + unsigned short li_version; + unsigned int li_prologue_length; + unsigned char li_min_insn_length; + unsigned char li_default_is_stmt; + int li_line_base; + unsigned char li_line_range; + unsigned char li_opcode_base; +} +DWARF2_Internal_LineInfo; + +/* Structure found in .debug_pubnames section. */ +typedef struct +{ + unsigned char pn_length [4]; + unsigned char pn_version [2]; + unsigned char pn_offset [4]; + unsigned char pn_size [4]; +} +DWARF2_External_PubNames; + +typedef struct +{ + unsigned long pn_length; + unsigned short pn_version; + unsigned long pn_offset; + unsigned long pn_size; +} +DWARF2_Internal_PubNames; + +/* Structure found in .debug_info section. */ +typedef struct +{ + unsigned char cu_length [4]; + unsigned char cu_version [2]; + unsigned char cu_abbrev_offset [4]; + unsigned char cu_pointer_size [1]; +} +DWARF2_External_CompUnit; + +typedef struct +{ + unsigned long cu_length; + unsigned short cu_version; + unsigned long cu_abbrev_offset; + unsigned char cu_pointer_size; +} +DWARF2_Internal_CompUnit; + +typedef struct +{ + unsigned char ar_length [4]; + unsigned char ar_version [2]; + unsigned char ar_info_offset [4]; + unsigned char ar_pointer_size [1]; + unsigned char ar_segment_size [1]; +} +DWARF2_External_ARange; + +typedef struct +{ + unsigned long ar_length; + unsigned short ar_version; + unsigned long ar_info_offset; + unsigned char ar_pointer_size; + unsigned char ar_segment_size; +} +DWARF2_Internal_ARange; + + /* Tag names and codes. */ enum dwarf_tag { @@ -103,12 +189,21 @@ enum dwarf_tag DW_TAG_imported_unit = 0x3d, /* SGI/MIPS Extensions. */ DW_TAG_MIPS_loop = 0x4081, + /* HP extensions. See: ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz . */ + DW_TAG_HP_array_descriptor = 0x4090, /* GNU extensions. */ DW_TAG_format_label = 0x4101, /* For FORTRAN 77 and Fortran 90. */ DW_TAG_function_template = 0x4102, /* For C++. */ DW_TAG_class_template = 0x4103, /* For C++. */ DW_TAG_GNU_BINCL = 0x4104, - DW_TAG_GNU_EINCL = 0x4105 + DW_TAG_GNU_EINCL = 0x4105, + /* Extensions for UPC. See: http://upc.gwu.edu/~upc. */ + DW_TAG_upc_shared_type = 0x8765, + DW_TAG_upc_strict_type = 0x8766, + DW_TAG_upc_relaxed_type = 0x8767, + /* PGI (STMicroelectronics) extensions. No documentation available. */ + DW_TAG_PGI_kanji_type = 0xA000, + DW_TAG_PGI_interface_block = 0xA020 }; #define DW_TAG_lo_user 0x4080 @@ -145,7 +240,6 @@ enum dwarf_form }; /* Attribute names and codes. */ - enum dwarf_attribute { DW_AT_sibling = 0x01, @@ -223,7 +317,7 @@ enum dwarf_attribute DW_AT_call_column = 0x57, DW_AT_call_file = 0x58, DW_AT_call_line = 0x59, - /* SGI/MIPS Extensions. */ + /* SGI/MIPS extensions. */ DW_AT_MIPS_fde = 0x2001, DW_AT_MIPS_loop_begin = 0x2002, DW_AT_MIPS_tail_loop_begin = 0x2003, @@ -235,6 +329,21 @@ enum dwarf_attribute DW_AT_MIPS_abstract_name = 0x2009, DW_AT_MIPS_clone_origin = 0x200a, DW_AT_MIPS_has_inlines = 0x200b, + /* HP extensions. */ + DW_AT_HP_block_index = 0x2000, + DW_AT_HP_unmodifiable = 0x2001, /* Same as DW_AT_MIPS_fde. */ + DW_AT_HP_actuals_stmt_list = 0x2010, + DW_AT_HP_proc_per_section = 0x2011, + DW_AT_HP_raw_data_ptr = 0x2012, + DW_AT_HP_pass_by_reference = 0x2013, + DW_AT_HP_opt_level = 0x2014, + DW_AT_HP_prof_version_id = 0x2015, + DW_AT_HP_opt_flags = 0x2016, + DW_AT_HP_cold_region_low_pc = 0x2017, + DW_AT_HP_cold_region_high_pc = 0x2018, + DW_AT_HP_all_variables_modifiable = 0x2019, + DW_AT_HP_linkage_name = 0x201a, + DW_AT_HP_prof_flags = 0x201b, /* In comp unit of procs_info for -g. */ /* GNU extensions. */ DW_AT_sf_names = 0x2101, DW_AT_src_info = 0x2102, @@ -243,8 +352,14 @@ enum dwarf_attribute DW_AT_body_begin = 0x2105, DW_AT_body_end = 0x2106, DW_AT_GNU_vector = 0x2107, - /* VMS Extensions. */ - DW_AT_VMS_rtnbeg_pd_address = 0x2201 + /* VMS extensions. */ + DW_AT_VMS_rtnbeg_pd_address = 0x2201, + /* UPC extension. */ + DW_AT_upc_threads_scaled = 0x3210, + /* PGI (STMicroelectronics) extensions. */ + DW_AT_PGI_lbase = 0x3a00, + DW_AT_PGI_soffset = 0x3a01, + DW_AT_PGI_lstride = 0x3a02 }; #define DW_AT_lo_user 0x2000 /* Implementation-defined range start. */ @@ -404,7 +519,15 @@ enum dwarf_location_atom DW_OP_call4 = 0x99, DW_OP_call_ref = 0x9a, /* GNU extensions. */ - DW_OP_GNU_push_tls_address = 0xe0 + DW_OP_GNU_push_tls_address = 0xe0, + /* HP extensions. */ + DW_OP_HP_unknown = 0xe0, /* Ouch, the same as GNU_push_tls_address. */ + DW_OP_HP_is_value = 0xe1, + DW_OP_HP_fltconst4 = 0xe2, + DW_OP_HP_fltconst8 = 0xe3, + DW_OP_HP_mod_range = 0xe4, + DW_OP_HP_unmod_range = 0xe5, + DW_OP_HP_tls = 0xe6 }; #define DW_OP_lo_user 0xe0 /* Implementation-defined range start. */ @@ -423,7 +546,15 @@ enum dwarf_type DW_ATE_unsigned = 0x7, DW_ATE_unsigned_char = 0x8, /* DWARF 3. */ - DW_ATE_imaginary_float = 0x9 + DW_ATE_imaginary_float = 0x9, + /* HP extensions. */ + DW_ATE_HP_float80 = 0x80, /* Floating-point (80 bit). */ + DW_ATE_HP_complex_float80 = 0x81, /* Complex floating-point (80 bit). */ + DW_ATE_HP_float128 = 0x82, /* Floating-point (128 bit). */ + DW_ATE_HP_complex_float128 = 0x83, /* Complex floating-point (128 bit). */ + DW_ATE_HP_floathpintel = 0x84, /* Floating-point (82 bit IA64). */ + DW_ATE_HP_imaginary_float80 = 0x85, + DW_ATE_HP_imaginary_float128 = 0x86 }; #define DW_ATE_lo_user 0x80 @@ -521,7 +652,18 @@ enum dwarf_line_number_x_ops { DW_LNE_end_sequence = 1, DW_LNE_set_address = 2, - DW_LNE_define_file = 3 + DW_LNE_define_file = 3, + /* HP extensions. */ + DW_LNE_HP_negate_is_UV_update = 0x11, + DW_LNE_HP_push_context = 0x12, + DW_LNE_HP_pop_context = 0x13, + DW_LNE_HP_set_file_line_column = 0x14, + DW_LNE_HP_set_routine_name = 0x15, + DW_LNE_HP_set_sequence = 0x16, + DW_LNE_HP_negate_post_semantics = 0x17, + DW_LNE_HP_negate_function_exit = 0x18, + DW_LNE_HP_negate_front_end_logical = 0x19, + DW_LNE_HP_define_proc = 0x20 }; /* Call frame information. */ @@ -545,17 +687,14 @@ enum dwarf_call_frame_info DW_CFA_def_cfa = 0x0c, DW_CFA_def_cfa_register = 0x0d, DW_CFA_def_cfa_offset = 0x0e, - /* DWARF 3. */ DW_CFA_def_cfa_expression = 0x0f, DW_CFA_expression = 0x10, DW_CFA_offset_extended_sf = 0x11, DW_CFA_def_cfa_sf = 0x12, DW_CFA_def_cfa_offset_sf = 0x13, - /* SGI/MIPS specific. */ DW_CFA_MIPS_advance_loc8 = 0x1d, - /* GNU extensions. */ DW_CFA_GNU_window_save = 0x2d, DW_CFA_GNU_args_size = 0x2e, @@ -566,8 +705,8 @@ enum dwarf_call_frame_info #define DW_CIE_VERSION 1 #define DW_CFA_extended 0 -#define DW_CFA_low_user 0x1c -#define DW_CFA_high_user 0x3f +#define DW_CFA_lo_user 0x1c +#define DW_CFA_hi_user 0x3f #define DW_CHILDREN_no 0x00 #define DW_CHILDREN_yes 0x01 @@ -593,10 +732,11 @@ enum dwarf_source_language DW_LANG_Ada95 = 0x000d, DW_LANG_Fortran95 = 0x000e, /* MIPS. */ - DW_LANG_Mips_Assembler = 0x8001 + DW_LANG_Mips_Assembler = 0x8001, + /* UPC. */ + DW_LANG_Upc = 0x8765 }; - #define DW_LANG_lo_user 0x8000 /* Implementation-defined range start. */ #define DW_LANG_hi_user 0xffff /* Implementation-defined range start. */ diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 11bf0f8f3f6..4b976c10e6f 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -13262,10 +13262,7 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED) ASM_GENERATE_INTERNAL_LABEL (text_end_label, TEXT_END_LABEL, 0); ASM_GENERATE_INTERNAL_LABEL (abbrev_section_label, DEBUG_ABBREV_SECTION_LABEL, 0); - if (DWARF2_GENERATE_TEXT_SECTION_LABEL) - ASM_GENERATE_INTERNAL_LABEL (text_section_label, TEXT_SECTION_LABEL, 0); - else - strcpy (text_section_label, stripattributes (TEXT_SECTION_NAME)); + ASM_GENERATE_INTERNAL_LABEL (text_section_label, TEXT_SECTION_LABEL, 0); ASM_GENERATE_INTERNAL_LABEL (debug_info_section_label, DEBUG_INFO_SECTION_LABEL, 0); @@ -13288,11 +13285,8 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED) ASM_OUTPUT_LABEL (asm_out_file, macinfo_section_label); } - if (DWARF2_GENERATE_TEXT_SECTION_LABEL) - { - text_section (); - ASM_OUTPUT_LABEL (asm_out_file, text_section_label); - } + text_section (); + ASM_OUTPUT_LABEL (asm_out_file, text_section_label); } /* A helper function for dwarf2out_finish called through diff --git a/gcc/expmed.c b/gcc/expmed.c index 232381f2c5a..98981b8f247 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -3305,6 +3305,11 @@ expand_sdiv_pow2 (enum machine_mode mode, rtx op0, HOST_WIDE_INT d) { rtx temp2; + /* ??? emit_conditional_move forces a stack adjustment via + compare_from_rtx so, if the sequence is discarded, it will + be lost. Do it now instead. */ + do_pending_stack_adjust (); + start_sequence (); temp2 = copy_to_mode_reg (mode, op0); temp = expand_binop (mode, add_optab, temp2, GEN_INT (d-1), diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 4260ff4ee6d..538486dcf90 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,37 @@ +2004-10-07 Tobias Schlueter + + PR fortran/17676 + * resolve.c (resolve_operator): Use correct operator name in message. + +2004-10-07 Tobias Schlueter + + * primary.c (match_boz_constant): Allow kind parameter suffixes. + Move standard warning further to the front. + +2004-10-07 Kazu Hirata + + * trans-stmt.c: Fix a comment typo. + +2004-10-07 Paul Brook + + PR fortran/17678 + * trans-array.c (gfc_trans_deferred_array): Leave use associated + variables alone. + +2004-10-06 Tobias Schlueter + + PR fortran/17568 + * simplify.c (twos_complement): New function. + (gfc_simplify_ishft, gfc_simplify_ishftc): Revise. + + * simplify.c (gfc_simplify_abs): Use mpfr_hypot for CABS. + +2004-10-06 Paul Brook + + * trans-stmt.c (gfc_trans_simple_do): New function. + (gfc_trans_do): Use it. Evaluate iteration bounds before entering + loop. Update comments. + 2004-10-04 Tobias Schlueter PR fortran/17283 diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c index 45348e6a760..fe6645de21e 100644 --- a/gcc/fortran/primary.c +++ b/gcc/fortran/primary.c @@ -235,7 +235,7 @@ match_integer_constant (gfc_expr ** result, int signflag) static match match_boz_constant (gfc_expr ** result) { - int radix, delim, length, x_hex; + int radix, delim, length, x_hex, kind; locus old_loc; char *buffer; gfc_expr *e; @@ -272,6 +272,12 @@ match_boz_constant (gfc_expr ** result) if (delim != '\'' && delim != '\"') goto backup; + if (x_hex && pedantic + && (gfc_notify_std (GFC_STD_GNU, "Extension: Hexadecimal " + "constant at %C uses non-standard syntax.") + == FAILURE)) + return MATCH_ERROR; + old_loc = gfc_current_locus; length = match_digits (0, radix, NULL); @@ -293,25 +299,25 @@ match_boz_constant (gfc_expr ** result) memset (buffer, '\0', length + 1); match_digits (0, radix, buffer); - gfc_next_char (); + gfc_next_char (); /* Eat delimiter. */ + + kind = get_kind (); + if (kind == -1) + return MATCH_ERROR; + if (kind == -2) + kind = gfc_default_integer_kind; + else if (pedantic + && (gfc_notify_std (GFC_STD_GNU, "Extension: Kind parameter " + "suffix to boz literal constant at %C.") + == FAILURE)) + return MATCH_ERROR; - e = gfc_convert_integer (buffer, gfc_default_integer_kind, radix, - &gfc_current_locus); + e = gfc_convert_integer (buffer, kind, radix, &gfc_current_locus); if (gfc_range_check (e) != ARITH_OK) { - gfc_error ("Integer too big for default integer kind at %C"); - - gfc_free_expr (e); - return MATCH_ERROR; - } + gfc_error ("Integer too big for integer kind %i at %C", kind); - if (x_hex - && pedantic - && (gfc_notify_std (GFC_STD_GNU, "Extension: Hexadecimal " - "constant at %C uses non-standard syntax.") - == FAILURE)) - { gfc_free_expr (e); return MATCH_ERROR; } diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 5169f5e8b0f..08f08da0cf2 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -1413,10 +1413,10 @@ resolve_operator (gfc_expr * e) case INTRINSIC_USER: if (op2 == NULL) sprintf (msg, "Operand of user operator '%s' at %%L is %s", - e->uop->ns->proc_name->name, gfc_typename (&op1->ts)); + e->uop->name, gfc_typename (&op1->ts)); else sprintf (msg, "Operands of user operator '%s' at %%L are %s/%s", - e->uop->ns->proc_name->name, gfc_typename (&op1->ts), + e->uop->name, gfc_typename (&op1->ts), gfc_typename (&op2->ts)); goto bad_op; diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 2dffff845d9..253f68677a1 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -138,13 +138,44 @@ get_kind (bt type, gfc_expr * k, const char *name, int default_kind) } +/* Checks if X, which is assumed to represent a two's complement + integer of binary width BITSIZE, has the signbit set. If so, makes + X the corresponding negative number. */ + +static void +twos_complement (mpz_t x, int bitsize) +{ + mpz_t mask; + char mask_s[bitsize + 1]; + + if (mpz_tstbit (x, bitsize - 1) == 1) + { + /* The mpz_init_set_{u|s}i functions take a long argument, but + the widest integer the target supports might be wider, so we + have to go via an intermediate string. */ + memset (mask_s, '1', bitsize); + mask_s[bitsize] = '\0'; + mpz_init_set_str (mask, mask_s, 2); + + /* We negate the number by hand, zeroing the high bits, and then + have it negated by GMP. */ + mpz_com (x, x); + mpz_add_ui (x, x, 1); + mpz_and (x, x, mask); + + mpz_neg (x, x); + + mpz_clear (mask); + } +} + + /********************** Simplification functions *****************************/ gfc_expr * gfc_simplify_abs (gfc_expr * e) { gfc_expr *result; - mpfr_t a, b; if (e->expr_type != EXPR_CONSTANT) return NULL; @@ -171,17 +202,9 @@ gfc_simplify_abs (gfc_expr * e) result = gfc_constant_result (BT_REAL, e->ts.kind, &e->where); gfc_set_model_kind (e->ts.kind); - mpfr_init (a); - mpfr_init (b); - /* FIXME: Possible numerical problems. */ - mpfr_mul (a, e->value.complex.r, e->value.complex.r, GFC_RND_MODE); - mpfr_mul (b, e->value.complex.i, e->value.complex.i, GFC_RND_MODE); - mpfr_add (a, a, b, GFC_RND_MODE); - mpfr_sqrt (result->value.real, a, GFC_RND_MODE); - - mpfr_clear (a); - mpfr_clear (b); + mpfr_hypot (result->value.real, e->value.complex.r, + e->value.complex.i, GFC_RND_MODE); result = range_check (result, "CABS"); break; @@ -1557,8 +1580,7 @@ gfc_expr * gfc_simplify_ishft (gfc_expr * e, gfc_expr * s) { gfc_expr *result; - int shift, ashift, isize, k; - long e_int; + int shift, ashift, isize, k, *bits, i; if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT) return NULL; @@ -1586,10 +1608,6 @@ gfc_simplify_ishft (gfc_expr * e, gfc_expr * s) return &gfc_bad_expr; } - e_int = mpz_get_si (e->value.integer); - if (e_int > INT_MAX || e_int < INT_MIN) - gfc_internal_error ("ISHFT: unable to extract integer"); - result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where); if (shift == 0) @@ -1597,13 +1615,43 @@ gfc_simplify_ishft (gfc_expr * e, gfc_expr * s) mpz_set (result->value.integer, e->value.integer); return range_check (result, "ISHFT"); } + + bits = gfc_getmem (isize * sizeof (int)); + + for (i = 0; i < isize; i++) + bits[i] = mpz_tstbit (e->value.integer, i); if (shift > 0) - mpz_set_si (result->value.integer, e_int << shift); + { + for (i = 0; i < shift; i++) + mpz_clrbit (result->value.integer, i); + + for (i = 0; i < isize - shift; i++) + { + if (bits[i] == 0) + mpz_clrbit (result->value.integer, i + shift); + else + mpz_setbit (result->value.integer, i + shift); + } + } else - mpz_set_si (result->value.integer, e_int >> ashift); + { + for (i = isize - 1; i >= isize - ashift; i--) + mpz_clrbit (result->value.integer, i); + + for (i = isize - 1; i >= ashift; i--) + { + if (bits[i] == 0) + mpz_clrbit (result->value.integer, i - ashift); + else + mpz_setbit (result->value.integer, i - ashift); + } + } + + twos_complement (result->value.integer, isize); - return range_check (result, "ISHFT"); + gfc_free (bits); + return result; } @@ -1651,6 +1699,12 @@ gfc_simplify_ishftc (gfc_expr * e, gfc_expr * s, gfc_expr * sz) result = gfc_constant_result (e->ts.type, e->ts.kind, &e->where); + if (shift == 0) + { + mpz_set (result->value.integer, e->value.integer); + return result; + } + bits = gfc_getmem (isize * sizeof (int)); for (i = 0; i < isize; i++) @@ -1658,20 +1712,13 @@ gfc_simplify_ishftc (gfc_expr * e, gfc_expr * s, gfc_expr * sz) delta = isize - ashift; - if (shift == 0) - { - mpz_set (result->value.integer, e->value.integer); - gfc_free (bits); - return range_check (result, "ISHFTC"); - } - - else if (shift > 0) + if (shift > 0) { for (i = 0; i < delta; i++) { if (bits[i] == 0) mpz_clrbit (result->value.integer, i + shift); - if (bits[i] == 1) + else mpz_setbit (result->value.integer, i + shift); } @@ -1679,12 +1726,9 @@ gfc_simplify_ishftc (gfc_expr * e, gfc_expr * s, gfc_expr * sz) { if (bits[i] == 0) mpz_clrbit (result->value.integer, i - delta); - if (bits[i] == 1) + else mpz_setbit (result->value.integer, i - delta); } - - gfc_free (bits); - return range_check (result, "ISHFTC"); } else { @@ -1692,7 +1736,7 @@ gfc_simplify_ishftc (gfc_expr * e, gfc_expr * s, gfc_expr * sz) { if (bits[i] == 0) mpz_clrbit (result->value.integer, i + delta); - if (bits[i] == 1) + else mpz_setbit (result->value.integer, i + delta); } @@ -1700,13 +1744,15 @@ gfc_simplify_ishftc (gfc_expr * e, gfc_expr * s, gfc_expr * sz) { if (bits[i] == 0) mpz_clrbit (result->value.integer, i + shift); - if (bits[i] == 1) + else mpz_setbit (result->value.integer, i + shift); } - - gfc_free (bits); - return range_check (result, "ISHFTC"); } + + twos_complement (result->value.integer, isize); + + gfc_free (bits); + return result; } diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index a6397d313fd..d36155dc364 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -3999,8 +3999,8 @@ gfc_trans_deferred_array (gfc_symbol * sym, tree body) && !INTEGER_CST_P (sym->ts.cl->backend_decl)) gfc_trans_init_string_length (sym->ts.cl, &fnblock); - /* Parameter variables don't need anything special. */ - if (sym->attr.dummy) + /* Parameter and use associated variables don't need anything special. */ + if (sym->attr.dummy || sym->attr.use_assoc) { gfc_add_expr_to_block (&fnblock, body); diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c index 8fd8ff801c2..501278aa909 100644 --- a/gcc/fortran/trans-stmt.c +++ b/gcc/fortran/trans-stmt.c @@ -485,13 +485,113 @@ gfc_trans_arithmetic_if (gfc_code * code) } +/* Translate the simple DO construct. This is where the loop variable has + integer type and step +-1. We can't use this in the general case + because integer overflow and floating point errors could give incorrect + results. + We translate a do loop from: + + DO dovar = from, to, step + body + END DO + + to: + + [Evaluate loop bounds and step] + dovar = from; + if ((step > 0) ? (dovar <= to) : (dovar => to)) + { + for (;;) + { + body; + cycle_label: + cond = (dovar == to); + dovar += step; + if (cond) goto end_label; + } + } + end_label: + + This helps the optimizers by avoiding the extra induction variable + used in the general case. */ + +static tree +gfc_trans_simple_do (gfc_code * code, stmtblock_t *pblock, tree dovar, + tree from, tree to, tree step) +{ + stmtblock_t body; + tree type; + tree cond; + tree tmp; + tree cycle_label; + tree exit_label; + + type = TREE_TYPE (dovar); + + /* Initialize the DO variable: dovar = from. */ + gfc_add_modify_expr (pblock, dovar, from); + + /* Cycle and exit statements are implemented with gotos. */ + cycle_label = gfc_build_label_decl (NULL_TREE); + exit_label = gfc_build_label_decl (NULL_TREE); + + /* Put the labels where they can be found later. See gfc_trans_do(). */ + code->block->backend_decl = tree_cons (cycle_label, exit_label, NULL); + + /* Loop body. */ + gfc_start_block (&body); + + /* Main loop body. */ + tmp = gfc_trans_code (code->block->next); + gfc_add_expr_to_block (&body, tmp); + + /* Label for cycle statements (if needed). */ + if (TREE_USED (cycle_label)) + { + tmp = build1_v (LABEL_EXPR, cycle_label); + gfc_add_expr_to_block (&body, tmp); + } + + /* Evaluate the loop condition. */ + cond = build2 (EQ_EXPR, boolean_type_node, dovar, to); + cond = gfc_evaluate_now (cond, &body); + + /* Increment the loop variable. */ + tmp = build2 (PLUS_EXPR, type, dovar, step); + gfc_add_modify_expr (&body, dovar, tmp); + + /* The loop exit. */ + tmp = build1_v (GOTO_EXPR, exit_label); + TREE_USED (exit_label) = 1; + tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ()); + gfc_add_expr_to_block (&body, tmp); + + /* Finish the loop body. */ + tmp = gfc_finish_block (&body); + tmp = build1_v (LOOP_EXPR, tmp); + + /* Only execute the loop if the number of iterations is positive. */ + if (tree_int_cst_sgn (step) > 0) + cond = fold (build2 (LE_EXPR, boolean_type_node, dovar, to)); + else + cond = fold (build2 (GE_EXPR, boolean_type_node, dovar, to)); + tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ()); + gfc_add_expr_to_block (pblock, tmp); + + /* Add the exit label. */ + tmp = build1_v (LABEL_EXPR, exit_label); + gfc_add_expr_to_block (pblock, tmp); + + return gfc_finish_block (pblock); +} + /* Translate the DO construct. This obviously is one of the most important ones to get right with any compiler, but especially so for Fortran. - Currently we calculate the loop count before entering the loop, but - it may be possible to optimize if step is a constant. The main - advantage is that the loop test is a single GENERIC node + We special case some loop forms as described in gfc_trans_simple_do. + For other cases we implement them with a separate loop count, + as described in the standard. We translate a do loop from: @@ -501,30 +601,24 @@ gfc_trans_arithmetic_if (gfc_code * code) to: - pre_dovar; - pre_from; - pre_to; - pre_step; - temp1=to_expr-from_expr; - step_temp=step_expr; - range_temp=step_tmp/range_temp; - for ( ; range_temp > 0 ; range_temp = range_temp - 1) + [evaluate loop bounds and step] + count = to + step - from; + dovar = from; + for (;;) { body; cycle_label: - dovar_temp = dovar - dovar=dovar_temp + step_temp; + dovar += step + count--; + if (count <=0) goto exit_label; } exit_label: - Some optimization is done for empty do loops. We can't just let - dovar=to because it's possible for from+range*loopcount!=to. Anyone - who writes empty DO deserves sub-optimal (but correct) code anyway. - TODO: Large loop counts - Does not work loop counts which do not fit into a signed integer kind, + The code above assumes the loop count fits into a signed integer kind, i.e. Does not work for loop counts > 2^31 for integer(kind=4) variables - We must support the full range. */ + We must support the full range. + TODO: Real type do variables. */ tree gfc_trans_do (gfc_code * code) @@ -545,8 +639,7 @@ gfc_trans_do (gfc_code * code) gfc_start_block (&block); - /* Create GIMPLE versions of all expressions in the iterator. */ - + /* Evaluate all the expressions in the iterator. */ gfc_init_se (&se, NULL); gfc_conv_expr_lhs (&se, code->ext.iterator->var); gfc_add_block_to_block (&block, &se.pre); @@ -556,21 +649,24 @@ gfc_trans_do (gfc_code * code) gfc_init_se (&se, NULL); gfc_conv_expr_type (&se, code->ext.iterator->start, type); gfc_add_block_to_block (&block, &se.pre); - from = se.expr; + from = gfc_evaluate_now (se.expr, &block); gfc_init_se (&se, NULL); gfc_conv_expr_type (&se, code->ext.iterator->end, type); gfc_add_block_to_block (&block, &se.pre); - to = se.expr; + to = gfc_evaluate_now (se.expr, &block); gfc_init_se (&se, NULL); gfc_conv_expr_type (&se, code->ext.iterator->step, type); - - /* We don't want this changing part way through. */ - gfc_make_safe_expr (&se); gfc_add_block_to_block (&block, &se.pre); - step = se.expr; - + step = gfc_evaluate_now (se.expr, &block); + + /* Special case simple loops. */ + if (TREE_CODE (type) == INTEGER_TYPE + && (integer_onep (step) + || tree_int_cst_equal (step, integer_minus_one_node))) + return gfc_trans_simple_do (code, &block, dovar, from, to, step); + /* Initialize loop count. This code is executed before we enter the loop body. We generate: count = (to + step - from) / step. */ diff --git a/gcc/function.c b/gcc/function.c index 0545b05a5cd..4c8d6c409c1 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -2513,8 +2513,12 @@ assign_parm_setup_block_p (struct assign_parm_data_one *data) return true; #ifdef BLOCK_REG_PADDING - if (data->locate.where_pad == (BYTES_BIG_ENDIAN ? upward : downward) - && GET_MODE_SIZE (data->promoted_mode) < UNITS_PER_WORD) + /* Only assign_parm_setup_block knows how to deal with register arguments + that are padded at the least significant end. */ + if (REG_P (data->entry_parm) + && GET_MODE_SIZE (data->promoted_mode) < UNITS_PER_WORD + && (BLOCK_REG_PADDING (data->passed_mode, data->passed_type, 1) + == (BYTES_BIG_ENDIAN ? upward : downward))) return true; #endif diff --git a/gcc/hooks.c b/gcc/hooks.c index 9470a4d84c6..d091583a2d3 100644 --- a/gcc/hooks.c +++ b/gcc/hooks.c @@ -55,13 +55,6 @@ hook_int_void_no_regs (void) return NO_REGS; } -/* Generic hook that returns 1. */ -int -hook_int_void_1 (void) -{ - return 1; -} - /* Generic hook that takes (bool) and returns false. */ bool hook_bool_bool_false (bool a ATTRIBUTE_UNUSED) @@ -151,11 +144,6 @@ hook_uint_uint_constcharptrptr_0 (unsigned int a ATTRIBUTE_UNUSED, return 0; } -void -hook_void_int (int b ATTRIBUTE_UNUSED) -{ -} - void hook_void_tree (tree a ATTRIBUTE_UNUSED) { diff --git a/gcc/hooks.h b/gcc/hooks.h index 10966a912a2..b0f47b7913f 100644 --- a/gcc/hooks.h +++ b/gcc/hooks.h @@ -40,7 +40,6 @@ extern bool hook_bool_rtx_int_int_intp_false (rtx, int, int, int *); extern bool hook_bool_constcharptr_size_t_false (const char *, size_t); extern void hook_void_void (void); -extern void hook_void_int (int); extern void hook_void_constcharptr (const char *); extern void hook_void_FILEptr_constcharptr (FILE *, const char *); extern void hook_void_tree (tree); @@ -51,7 +50,6 @@ extern int hook_int_tree_tree_1 (tree, tree); extern int hook_int_rtx_0 (rtx); extern int hook_int_size_t_constcharptr_int_0 (size_t, const char *, int); extern int hook_int_void_no_regs (void); -extern int hook_int_void_1 (void); extern unsigned hook_uint_uint_constcharptrptr_0 (unsigned, const char **); diff --git a/gcc/lambda-code.c b/gcc/lambda-code.c index cc6c9bcd04d..2f75db9f998 100644 --- a/gcc/lambda-code.c +++ b/gcc/lambda-code.c @@ -489,6 +489,168 @@ lcm (int a, int b) return (abs (a) * abs (b) / gcd (a, b)); } +/* Perform Fourier-Motzkin elimination to calculate the bounds of the + auxillary nest. + Fourier-Motzkin is a way of reducing systems of linear inequality so that + it is easy to calculate the answer and bounds. + A sketch of how it works: + Given a system of linear inequalities, ai * xj >= bk, you can always + rewrite the constraints so they are all of the form + a <= x, or x <= b, or x >= constant for some x in x1 ... xj (and some b + in b1 ... bk, and some a in a1...ai) + You can then eliminate this x from the non-constant inequalities by + rewriting these as a <= b, x >= constant, and delete the x variable. + You can then repeat this for any remaining x variables, and then we have + an easy to use variable <= constant (or no variables at all) form that we + can construct our bounds from. + + In our case, each time we eliminate, we construct part of the bound from + the ith variable, then delete the ith variable. + + Remember the constant are in our vector a, our coefficient matrix is A, + and our invariant coefficient matrix is B. + + SIZE is the size of the matrices being passed. + DEPTH is the loop nest depth. + INVARIANTS is the number of loop invariants. + A, B, and a are the coefficient matrix, invariant coefficient, and a + vector of constants, respectively. */ + +static lambda_loopnest +compute_nest_using_fourier_motzkin (int size, + int depth, + int invariants, + lambda_matrix A, + lambda_matrix B, + lambda_vector a) +{ + + int multiple, f1, f2; + int i, j, k; + lambda_linear_expression expression; + lambda_loop loop; + lambda_loopnest auxillary_nest; + lambda_matrix swapmatrix, A1, B1; + lambda_vector swapvector, a1; + int newsize; + + A1 = lambda_matrix_new (128, depth); + B1 = lambda_matrix_new (128, invariants); + a1 = lambda_vector_new (128); + + auxillary_nest = lambda_loopnest_new (depth, invariants); + + for (i = depth - 1; i >= 0; i--) + { + loop = lambda_loop_new (); + LN_LOOPS (auxillary_nest)[i] = loop; + LL_STEP (loop) = 1; + + for (j = 0; j < size; j++) + { + if (A[j][i] < 0) + { + /* Any linear expression in the matrix with a coefficient less + than 0 becomes part of the new lower bound. */ + expression = lambda_linear_expression_new (depth, invariants); + + for (k = 0; k < i; k++) + LLE_COEFFICIENTS (expression)[k] = A[j][k]; + + for (k = 0; k < invariants; k++) + LLE_INVARIANT_COEFFICIENTS (expression)[k] = -1 * B[j][k]; + + LLE_DENOMINATOR (expression) = -1 * A[j][i]; + LLE_CONSTANT (expression) = -1 * a[j]; + + /* Ignore if identical to the existing lower bound. */ + if (!lle_equal (LL_LOWER_BOUND (loop), + expression, depth, invariants)) + { + LLE_NEXT (expression) = LL_LOWER_BOUND (loop); + LL_LOWER_BOUND (loop) = expression; + } + + } + else if (A[j][i] > 0) + { + /* Any linear expression with a coefficient greater than 0 + becomes part of the new upper bound. */ + expression = lambda_linear_expression_new (depth, invariants); + for (k = 0; k < i; k++) + LLE_COEFFICIENTS (expression)[k] = -1 * A[j][k]; + + for (k = 0; k < invariants; k++) + LLE_INVARIANT_COEFFICIENTS (expression)[k] = B[j][k]; + + LLE_DENOMINATOR (expression) = A[j][i]; + LLE_CONSTANT (expression) = a[j]; + + /* Ignore if identical to the existing upper bound. */ + if (!lle_equal (LL_UPPER_BOUND (loop), + expression, depth, invariants)) + { + LLE_NEXT (expression) = LL_UPPER_BOUND (loop); + LL_UPPER_BOUND (loop) = expression; + } + + } + } + + /* This portion creates a new system of linear inequalities by deleting + the i'th variable, reducing the system by one variable. */ + newsize = 0; + for (j = 0; j < size; j++) + { + /* If the coefficient for the i'th variable is 0, then we can just + eliminate the variable straightaway. Otherwise, we have to + multiply through by the coefficients we are eliminating. */ + if (A[j][i] == 0) + { + lambda_vector_copy (A[j], A1[newsize], depth); + lambda_vector_copy (B[j], B1[newsize], invariants); + a1[newsize] = a[j]; + newsize++; + } + else if (A[j][i] > 0) + { + for (k = 0; k < size; k++) + { + if (A[k][i] < 0) + { + multiple = lcm (A[j][i], A[k][i]); + f1 = multiple / A[j][i]; + f2 = -1 * multiple / A[k][i]; + + lambda_vector_add_mc (A[j], f1, A[k], f2, + A1[newsize], depth); + lambda_vector_add_mc (B[j], f1, B[k], f2, + B1[newsize], invariants); + a1[newsize] = f1 * a[j] + f2 * a[k]; + newsize++; + } + } + } + } + + swapmatrix = A; + A = A1; + A1 = swapmatrix; + + swapmatrix = B; + B = B1; + B1 = swapmatrix; + + swapvector = a; + a = a1; + a1 = swapvector; + + size = newsize; + } + + return auxillary_nest; +} + /* Compute the loop bounds for the auxiliary space NEST. Input system used is Ax <= b. TRANS is the unimodular transformation. */ @@ -496,18 +658,15 @@ static lambda_loopnest lambda_compute_auxillary_space (lambda_loopnest nest, lambda_trans_matrix trans) { - lambda_matrix A, B, A1, B1, temp0; - lambda_vector a, a1, temp1; + lambda_matrix A, B, A1, B1; + lambda_vector a, a1; lambda_matrix invertedtrans; - int determinant, depth, invariants, size, newsize; - int i, j, k; - lambda_loopnest auxillary_nest; + int determinant, depth, invariants, size; + int i, j; lambda_loop loop; lambda_linear_expression expression; lambda_lattice lattice; - int multiple, f1, f2; - depth = LN_DEPTH (nest); invariants = LN_INVARIANTS (nest); @@ -623,136 +782,8 @@ lambda_compute_auxillary_space (lambda_loopnest nest, /* A = A1 inv(U). */ lambda_matrix_mult (A1, invertedtrans, A, size, depth, depth); - /* Perform Fourier-Motzkin elimination to calculate the bounds of the - auxillary nest. - Fourier-Motzkin is a way of reducing systems of linear inequality so that - it is easy to calculate the answer and bounds. - A sketch of how it works: - Given a system of linear inequalities, ai * xj >= bk, you can always - rewrite the constraints so they are all of the form - a <= x, or x <= b, or x >= constant for some x in x1 ... xj (and some b - in b1 ... bk, and some a in a1...ai) - You can then eliminate this x from the non-constant inequalities by - rewriting these as a <= b, x >= constant, and delete the x variable. - You can then repeat this for any remaining x variables, and then we have - an easy to use variable <= constant (or no variables at all) form that we - can construct our bounds from. - - In our case, each time we eliminate, we construct part of the bound from - the ith variable, then delete the ith variable. - - Remember the constant are in our vector a, our coefficient matrix is A, - and our invariant coefficient matrix is B */ - - /* Swap B and B1, and a1 and a. */ - temp0 = B1; - B1 = B; - B = temp0; - - temp1 = a1; - a1 = a; - a = temp1; - - auxillary_nest = lambda_loopnest_new (depth, invariants); - - for (i = depth - 1; i >= 0; i--) - { - loop = lambda_loop_new (); - LN_LOOPS (auxillary_nest)[i] = loop; - LL_STEP (loop) = 1; - - for (j = 0; j < size; j++) - { - if (A[j][i] < 0) - { - /* Lower bound. */ - expression = lambda_linear_expression_new (depth, invariants); - - for (k = 0; k < i; k++) - LLE_COEFFICIENTS (expression)[k] = A[j][k]; - for (k = 0; k < invariants; k++) - LLE_INVARIANT_COEFFICIENTS (expression)[k] = -1 * B[j][k]; - LLE_DENOMINATOR (expression) = -1 * A[j][i]; - LLE_CONSTANT (expression) = -1 * a[j]; - /* Ignore if identical to the existing lower bound. */ - if (!lle_equal (LL_LOWER_BOUND (loop), - expression, depth, invariants)) - { - LLE_NEXT (expression) = LL_LOWER_BOUND (loop); - LL_LOWER_BOUND (loop) = expression; - } - - } - else if (A[j][i] > 0) - { - /* Upper bound. */ - expression = lambda_linear_expression_new (depth, invariants); - for (k = 0; k < i; k++) - LLE_COEFFICIENTS (expression)[k] = -1 * A[j][k]; - LLE_CONSTANT (expression) = a[j]; - - for (k = 0; k < invariants; k++) - LLE_INVARIANT_COEFFICIENTS (expression)[k] = B[j][k]; - - LLE_DENOMINATOR (expression) = A[j][i]; - /* Ignore if identical to the existing upper bound. */ - if (!lle_equal (LL_UPPER_BOUND (loop), - expression, depth, invariants)) - { - LLE_NEXT (expression) = LL_UPPER_BOUND (loop); - LL_UPPER_BOUND (loop) = expression; - } - - } - } - /* creates a new system by deleting the i'th variable. */ - newsize = 0; - for (j = 0; j < size; j++) - { - if (A[j][i] == 0) - { - lambda_vector_copy (A[j], A1[newsize], depth); - lambda_vector_copy (B[j], B1[newsize], invariants); - a1[newsize] = a[j]; - newsize++; - } - else if (A[j][i] > 0) - { - for (k = 0; k < size; k++) - { - if (A[k][i] < 0) - { - multiple = lcm (A[j][i], A[k][i]); - f1 = multiple / A[j][i]; - f2 = -1 * multiple / A[k][i]; - - lambda_vector_add_mc (A[j], f1, A[k], f2, - A1[newsize], depth); - lambda_vector_add_mc (B[j], f1, B[k], f2, - B1[newsize], invariants); - a1[newsize] = f1 * a[j] + f2 * a[k]; - newsize++; - } - } - } - } - - temp0 = A; - A = A1; - A1 = temp0; - - temp0 = B; - B = B1; - B1 = temp0; - - temp1 = a; - a = a1; - a1 = temp1; - - size = newsize; - } - - return auxillary_nest; + return compute_nest_using_fourier_motzkin (size, depth, invariants, + A, B1, a1); } /* Compute the loop bounds for the target space, using the bounds of @@ -1165,27 +1196,18 @@ gcc_tree_to_linear_expression (int depth, tree expr, /* Return true if OP is invariant in LOOP and all outer loops. */ static bool -invariant_in_loop (struct loop *loop, tree op) +invariant_in_loop_and_outer_loops (struct loop *loop, tree op) { if (is_gimple_min_invariant (op)) return true; if (loop->depth == 0) return true; - if (TREE_CODE (op) == SSA_NAME) - { - tree def; - def = SSA_NAME_DEF_STMT (op); - if (TREE_CODE (SSA_NAME_VAR (op)) == PARM_DECL - && IS_EMPTY_STMT (def)) - return true; - if (IS_EMPTY_STMT (def)) - return false; - if (loop->outer - && !invariant_in_loop (loop->outer, op)) - return false; - return !flow_bb_inside_loop_p (loop, bb_for_stmt (def)); - } - return false; + if (!expr_invariant_in_loop_p (loop, op)) + return false; + if (loop->outer + && !invariant_in_loop_and_outer_loops (loop->outer, op)) + return false; + return true; } /* Generate a lambda loop from a gcc loop LOOP. Return the new lambda loop, @@ -1352,10 +1374,10 @@ gcc_loop_to_lambda_loop (struct loop *loop, int depth, } /* One part of the test may be a loop invariant tree. */ if (TREE_CODE (TREE_OPERAND (test, 1)) == SSA_NAME - && invariant_in_loop (loop, TREE_OPERAND (test, 1))) + && invariant_in_loop_and_outer_loops (loop, TREE_OPERAND (test, 1))) VEC_safe_push (tree, *invariants, TREE_OPERAND (test, 1)); else if (TREE_CODE (TREE_OPERAND (test, 0)) == SSA_NAME - && invariant_in_loop (loop, TREE_OPERAND (test, 0))) + && invariant_in_loop_and_outer_loops (loop, TREE_OPERAND (test, 0))) VEC_safe_push (tree, *invariants, TREE_OPERAND (test, 0)); /* The non-induction variable part of the test is the upper bound variable. @@ -1433,9 +1455,10 @@ find_induction_var_from_exit_cond (struct loop *loop) case LE_EXPR: case NE_EXPR: ivarop = TREE_OPERAND (test, 0); - break; + break; case GT_EXPR: case GE_EXPR: + case EQ_EXPR: ivarop = TREE_OPERAND (test, 1); break; default: @@ -1898,15 +1921,12 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest, dataflow_t imm = get_immediate_uses (SSA_NAME_DEF_STMT (oldiv)); for (j = 0; j < num_immediate_uses (imm); j++) { - size_t k; tree stmt = immediate_use (imm, j); - use_optype uses; - get_stmt_operands (stmt); - uses = STMT_USE_OPS (stmt); - for (k = 0; k < NUM_USES (uses); k++) + use_operand_p use_p; + ssa_op_iter iter; + FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE) { - use_operand_p use = USE_OP_PTR (uses, k); - if (USE_FROM_PTR (use) == oldiv) + if (USE_FROM_PTR (use_p) == oldiv) { tree newiv, stmts; lambda_body_vector lbv; @@ -1921,7 +1941,7 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest, /* Insert the statements to build that expression. */ bsi_insert_before (&bsi, stmts, BSI_SAME_STMT); - SET_USE (use, newiv); + propagate_value (use_p, newiv); modify_stmt (stmt); } diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c index 3c9e9704845..eaa55f41754 100644 --- a/gcc/libgcc2.c +++ b/gcc/libgcc2.c @@ -1022,7 +1022,7 @@ __moddi3 (DWtype u, DWtype v) if (vv.s.high < 0) vv.ll = -vv.ll; - (void) __udivmoddi4 (uu.ll, vv.ll, &w); + (void) __udivmoddi4 (uu.ll, vv.ll, (UDWtype*)&w); if (c) w = -w; diff --git a/gcc/loop-doloop.c b/gcc/loop-doloop.c index 1b5ca4dc6d2..965e2e3edd8 100644 --- a/gcc/loop-doloop.c +++ b/gcc/loop-doloop.c @@ -257,20 +257,21 @@ add_test (rtx cond, basic_block bb, basic_block dest) describes the loop, DESC describes the number of iterations of the loop, and DOLOOP_INSN is the low-overhead looping insn to emit at the end of the loop. CONDITION is the condition separated from the - DOLOOP_SEQ. */ + DOLOOP_SEQ. COUNT is the number of iterations of the LOOP. */ static void doloop_modify (struct loop *loop, struct niter_desc *desc, - rtx doloop_seq, rtx condition) + rtx doloop_seq, rtx condition, rtx count) { rtx counter_reg; - rtx count, tmp, noloop = NULL_RTX; + rtx tmp, noloop = NULL_RTX; rtx sequence; rtx jump_insn; rtx jump_label; int nonneg = 0, irr; bool increment_count; basic_block loop_end = desc->out_edge->src; + enum machine_mode mode; jump_insn = BB_END (loop_end); @@ -291,8 +292,8 @@ doloop_modify (struct loop *loop, struct niter_desc *desc, counter_reg = XEXP (condition, 0); if (GET_CODE (counter_reg) == PLUS) counter_reg = XEXP (counter_reg, 0); + mode = GET_MODE (counter_reg); - count = copy_rtx (desc->niter_expr); increment_count = false; switch (GET_CODE (condition)) { @@ -323,7 +324,7 @@ doloop_modify (struct loop *loop, struct niter_desc *desc, Note that the maximum value loaded is iterations_max - 1. */ if (desc->niter_max <= ((unsigned HOST_WIDEST_INT) 1 - << (GET_MODE_BITSIZE (GET_MODE (counter_reg)) - 1))) + << (GET_MODE_BITSIZE (mode) - 1))) nonneg = 1; break; @@ -333,7 +334,7 @@ doloop_modify (struct loop *loop, struct niter_desc *desc, } if (increment_count) - count = simplify_gen_binary (PLUS, desc->mode, count, const1_rtx); + count = simplify_gen_binary (PLUS, mode, count, const1_rtx); /* Insert initialization of the count register into the loop header. */ start_sequence (); @@ -438,12 +439,14 @@ doloop_optimize (struct loop *loop) { enum machine_mode mode; rtx doloop_seq, doloop_pat, doloop_reg; - rtx iterations; + rtx iterations, count; rtx iterations_max; rtx start_label; rtx condition; unsigned level, est_niter; struct niter_desc *desc; + unsigned word_mode_size; + unsigned HOST_WIDE_INT word_mode_max; if (dump_file) fprintf (dump_file, "Doloop: Processing loop %d.\n", loop->num); @@ -481,6 +484,7 @@ doloop_optimize (struct loop *loop) return false; } + count = copy_rtx (desc->niter_expr); iterations = desc->const_iter ? desc->niter_expr : const0_rtx; iterations_max = GEN_INT (desc->niter_max); level = get_loop_level (loop) + 1; @@ -492,8 +496,33 @@ doloop_optimize (struct loop *loop) doloop_reg = gen_reg_rtx (mode); doloop_seq = gen_doloop_end (doloop_reg, iterations, iterations_max, GEN_INT (level), start_label); - if (! doloop_seq && mode != word_mode) + + word_mode_size = GET_MODE_BITSIZE (word_mode); + word_mode_max + = ((unsigned HOST_WIDE_INT) 1 << (word_mode_size - 1) << 1) - 1; + if (! doloop_seq + && mode != word_mode + /* Before trying mode different from the one in that # of iterations is + computed, we must be sure that the number of iterations fits into + the new mode. */ + && (word_mode_size >= GET_MODE_BITSIZE (mode) + || desc->niter_max <= word_mode_max)) { + if (word_mode_size > GET_MODE_BITSIZE (mode)) + { + count = simplify_gen_unary (ZERO_EXTEND, word_mode, + count, mode); + iterations = simplify_gen_unary (ZERO_EXTEND, word_mode, + iterations, mode); + iterations_max = simplify_gen_unary (ZERO_EXTEND, word_mode, + iterations_max, mode); + } + else + { + count = lowpart_subreg (word_mode, count, mode); + iterations = lowpart_subreg (word_mode, iterations, mode); + iterations_max = lowpart_subreg (word_mode, iterations_max, mode); + } PUT_MODE (doloop_reg, word_mode); doloop_seq = gen_doloop_end (doloop_reg, iterations, iterations_max, GEN_INT (level), start_label); @@ -528,7 +557,7 @@ doloop_optimize (struct loop *loop) return false; } - doloop_modify (loop, desc, doloop_seq, condition); + doloop_modify (loop, desc, doloop_seq, condition, count); return true; } diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c index e4d757a0798..7105aaddcbc 100644 --- a/gcc/loop-iv.c +++ b/gcc/loop-iv.c @@ -156,7 +156,7 @@ assign_luids (basic_block bb) /* Generates a subreg to get the least significant part of EXPR (in mode INNER_MODE) to OUTER_MODE. */ -static rtx +rtx lowpart_subreg (enum machine_mode outer_mode, rtx expr, enum machine_mode inner_mode) { diff --git a/gcc/po/ChangeLog b/gcc/po/ChangeLog index 17b92d0154f..6e25d234fe2 100644 --- a/gcc/po/ChangeLog +++ b/gcc/po/ChangeLog @@ -1,3 +1,11 @@ +2004-10-08 Joseph S. Myers + + * gcc.pot: Regenerate. + +2004-10-07 Joseph S. Myers + + * de.po: Update. + 2004-10-05 Zack Weinberg * gcc.pot: Regenerate. diff --git a/gcc/po/de.po b/gcc/po/de.po index 8f7eb5dd01d..9b513d147e2 100644 --- a/gcc/po/de.po +++ b/gcc/po/de.po @@ -6,10 +6,10 @@ # msgid "" msgstr "" -"Project-Id-Version: gcc 3.4-b20040206\n" +"Project-Id-Version: gcc 3.4.2\n" "Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" "POT-Creation-Date: 2004-07-01 11:41-0700\n" -"PO-Revision-Date: 2004-02-15 12:14+0100\n" +"PO-Revision-Date: 2004-10-04 10:20+0100\n" "Last-Translator: Roland Stigge \n" "Language-Team: German \n" "MIME-Version: 1.0\n" @@ -121,7 +121,7 @@ msgstr "(Sie sollten also »%s« statt »%s« an »va_arg« übergeben)" #. Call abort to encourage the user to fix the program. #: builtins.c:4134 c-typeck.c:1733 msgid "if this code is reached, the program will abort" -msgstr "" +msgstr "Wenn dieser Code erreicht wird, wird das Programm abgebrochen." #: builtins.c:4241 msgid "invalid arg to `__builtin_frame_address'" @@ -284,9 +284,8 @@ msgid "invalid application of `%s' to a void type" msgstr "ungültige Anwendung von »%s« auf einen void-Typen" #: c-common.c:2951 -#, fuzzy msgid "invalid application of `%s' to incomplete type `%T' " -msgstr "ungültige Anwendung von »%s« auf einen unvollständigen Typen" +msgstr "ungültige Anwendung von »%s« auf unvollständigen Typen »%T«" #: c-common.c:2992 msgid "`__alignof' applied to a bit-field" @@ -683,9 +682,8 @@ msgid "%J'%D' declared inline after its definition" msgstr "%J»%D« nach der Definition als inline deklariert" #: c-decl.c:1221 -#, fuzzy msgid "%Jredefinition of parameter '%D'" -msgstr "%JRedefinition des typedef »%D«" +msgstr "%JRedefinition des Parameters »%D«" #: c-decl.c:1230 msgid "%Jvolatile declaration of '%D' follows non-volatile declaration" @@ -708,19 +706,16 @@ msgid "%Jredundant redeclaration of '%D'" msgstr "%Jredundante Redeklaration von »%D«" #: c-decl.c:1581 -#, fuzzy msgid "%Jdeclaration of '%D' shadows a parameter" -msgstr "Deklaration von »%s« überdeckt einen Parameter" +msgstr "%JDeklaration von »%D« überdeckt einen Parameter" #: c-decl.c:1583 -#, fuzzy msgid "%Jdeclaration of '%D' shadows a global declaration" -msgstr "Deklaration von »%s« überdeckt eine globale Deklaration" +msgstr "%JDeklaration von »%D« überdeckt eine globale Deklaration" #: c-decl.c:1585 -#, fuzzy msgid "%Jdeclaration of '%D' shadows a previous local" -msgstr "Deklaration von »%s« überdeckt einen vorhergehenden lokalen Bezeichner" +msgstr "%JDeklaration von »%D« überdeckt einen vorhergehenden lokalen Bezeichner" #: c-decl.c:1587 cp/name-lookup.c:969 cp/name-lookup.c:992 #: cp/name-lookup.c:1000 @@ -2108,9 +2103,8 @@ msgid "traditional C rejects string constant concatenation" msgstr "traditionelles C weist Stringkonstantenverkettung zurück" #: c-objc-common.c:82 -#, fuzzy msgid "%Jfunction '%F' can never be inlined because it is suppressed using -fno-inline" -msgstr "%JFunktion »%F« kann nie inline sein, da dies mit -fno-inline unterdrückt wird" +msgstr "%JFunktion »%F« kann nie inline sein, da sie mit -fno-inline unterdrückt wird" #: c-objc-common.c:92 msgid "%Jfunction '%F' can never be inlined because it might not be bound within this unit of translation" @@ -2286,9 +2280,8 @@ msgid "ISO C forbids omitting the middle term of a ?: expression" msgstr "ISO-C verbietet das Weglassen des mittleren Terms eines ?:-Ausdruckes" #: c-parse.y:611 objc/objc-parse.y:636 -#, fuzzy msgid "ISO C90 forbids compound literals" -msgstr "ISO-C89 verbietet zusammengesetzte Literale" +msgstr "ISO-C90 verbietet zusammengesetzte Literale" #: c-parse.y:625 objc/objc-parse.y:650 msgid "ISO C forbids braced-groups within expressions" @@ -2328,9 +2321,8 @@ msgid "ISO C forbids empty initializer braces" msgstr "ISO-C verbietet leere Initialisierungsklammern" #: c-parse.y:1441 objc/objc-parse.y:1491 -#, fuzzy msgid "ISO C90 forbids specifying subobject to initialize" -msgstr "ISO-C89 verbietet die Angabe von zu initialisierenden Unterobjekten" +msgstr "ISO-C90 verbietet die Angabe von zu initialisierenden Unterobjekten" #: c-parse.y:1444 objc/objc-parse.y:1494 msgid "obsolete use of designated initializer without `='" @@ -2423,7 +2415,6 @@ msgid "`...' in old-style identifier list" msgstr "»...« in einer Bezeichnerliste alten Stils" #: /usr/share/bison/bison.simple:795 -#, fuzzy msgid "parse error; also virtual memory exhausted" msgstr "Syntaxfehler; auch virtueller Speicher verbraucht" @@ -2503,9 +2494,9 @@ msgid "%s: created by version `%.*s', but this is version `%s'" msgstr "%s: durch Version »%.*s« erzeugt, aber dies ist Version »%s«" #: c-pch.c:313 -#, fuzzy, c-format +#, c-format msgid "%s: created using different flags" -msgstr "%D mit anderem Zugriff redeklariert" +msgstr "%s: mit anderen Marken erzeugt" #: c-pch.c:326 #, c-format @@ -7484,107 +7475,106 @@ msgid "trap mode not supported for VAX floats" msgstr "" #: config/alpha/alpha.c:394 -#, fuzzy msgid "128-bit long double not supported for VAX floats" -msgstr "ms-Bitfelder nicht unterstützt für objc" +msgstr "128-bit long double nicht unterstützt für VAX floats" #: config/alpha/alpha.c:422 #, c-format msgid "L%d cache latency unknown for %s" -msgstr "" +msgstr "L%d Cache-Wartezeit unbekannt für %s" #: config/alpha/alpha.c:437 #, c-format msgid "bad value `%s' for -mmemory-latency" -msgstr "" +msgstr "Falscher Wert »%s« für -mmemory-latency" #: config/alpha/alpha.c:5425 #, c-format msgid "invalid %%H value" -msgstr "" +msgstr "Ungültiger %%H-Wert" #: config/alpha/alpha.c:5446 #, c-format msgid "invalid %%J value" -msgstr "" +msgstr "Ungültiger %%J-Wert" #: config/alpha/alpha.c:5462 config/ia64/ia64.c:4263 #, c-format msgid "invalid %%r value" -msgstr "" +msgstr "Ungültiger %%r-Wert" #: config/alpha/alpha.c:5472 config/rs6000/rs6000.c:9241 #: config/xtensa/xtensa.c:2014 #, c-format msgid "invalid %%R value" -msgstr "" +msgstr "Ungültiger %%R-Wert" #: config/alpha/alpha.c:5478 config/rs6000/rs6000.c:9160 #: config/xtensa/xtensa.c:1981 #, c-format msgid "invalid %%N value" -msgstr "" +msgstr "Ungültiger %%N-Wert" #: config/alpha/alpha.c:5486 config/rs6000/rs6000.c:9188 #, c-format msgid "invalid %%P value" -msgstr "" +msgstr "Ungültiger %%P-Wert" #: config/alpha/alpha.c:5494 #, c-format msgid "invalid %%h value" -msgstr "" +msgstr "Ungültiger %%h-Wert" #: config/alpha/alpha.c:5502 config/xtensa/xtensa.c:2007 #, c-format msgid "invalid %%L value" -msgstr "" +msgstr "Ungültiger %%L-Wert" #: config/alpha/alpha.c:5541 config/rs6000/rs6000.c:9142 #, c-format msgid "invalid %%m value" -msgstr "" +msgstr "Ungültiger %%m-Wert" #: config/alpha/alpha.c:5549 config/rs6000/rs6000.c:9150 #, c-format msgid "invalid %%M value" -msgstr "" +msgstr "Ungültiger %%M-Wert" #: config/alpha/alpha.c:5593 #, c-format msgid "invalid %%U value" -msgstr "" +msgstr "Ungültiger %%U-Wert" #: config/alpha/alpha.c:5605 config/alpha/alpha.c:5619 #: config/rs6000/rs6000.c:9249 #, c-format msgid "invalid %%s value" -msgstr "" +msgstr "Ungültiger %%s-Wert" #: config/alpha/alpha.c:5642 #, c-format msgid "invalid %%C value" -msgstr "" +msgstr "Ungültiger %%C-Wert" #: config/alpha/alpha.c:5679 config/rs6000/rs6000.c:8979 #: config/rs6000/rs6000.c:8999 #, c-format msgid "invalid %%E value" -msgstr "" +msgstr "Ungültiger %%E-Wert" #: config/alpha/alpha.c:5704 config/alpha/alpha.c:5752 msgid "unknown relocation unspec" -msgstr "" +msgstr "Unbekanntes relocation unspec" #: config/alpha/alpha.c:5713 config/rs6000/rs6000.c:9562 #, c-format msgid "invalid %%xn code" -msgstr "" +msgstr "Ungültiger %%xn-Code" #: config/alpha/alpha.c:6657 config/alpha/alpha.c:6660 config/s390/s390.c:6575 #: config/s390/s390.c:6578 msgid "bad builtin fcode" -msgstr "" +msgstr "Falscher eingebauter fcode" #. Macro to define tables used to set the flags. #. This is a list in braces of pairs in braces, @@ -7595,96 +7585,96 @@ msgstr "" #: config/i386/i386.h:331 config/ns32k/ns32k.h:140 config/s390/s390.h:124 #: config/sparc/sparc.h:543 config/sparc/sparc.h:548 msgid "Use hardware fp" -msgstr "" +msgstr "Hardware-FP verwenden" #: config/alpha/alpha.h:294 config/i386/i386.h:328 config/i386/i386.h:330 #: config/sparc/sparc.h:545 config/sparc/sparc.h:550 msgid "Do not use hardware fp" -msgstr "" +msgstr "Hardware-FP nicht verwenden" #: config/alpha/alpha.h:295 msgid "Use fp registers" -msgstr "" +msgstr "FP-Register verwenden" #: config/alpha/alpha.h:297 msgid "Do not use fp registers" -msgstr "" +msgstr "FP-Register nicht verwenden" #: config/alpha/alpha.h:298 msgid "Do not assume GAS" -msgstr "" +msgstr "Nicht GAS vermuten" #: config/alpha/alpha.h:299 msgid "Assume GAS" -msgstr "" +msgstr "GAS vermuten" #: config/alpha/alpha.h:301 msgid "Request IEEE-conformant math library routines (OSF/1)" -msgstr "" +msgstr "IEEE-konforme Mathematik-Bibliotheksroutinen (OSF/1) anfordern" #: config/alpha/alpha.h:303 msgid "Emit IEEE-conformant code, without inexact exceptions" -msgstr "" +msgstr "IEEE-konformen Code erzeugen, ohne ungenaue Ausnahmen" #: config/alpha/alpha.h:305 msgid "Emit IEEE-conformant code, with inexact exceptions" -msgstr "" +msgstr "IEEE-konformen Code erzeugen, mit ungenauen Ausnahmen" #: config/alpha/alpha.h:307 msgid "Do not emit complex integer constants to read-only memory" -msgstr "" +msgstr "Keine komplexen Ganzzahlkonstanten im Nur-Lese-Speicher erzeugen" #: config/alpha/alpha.h:308 msgid "Use VAX fp" -msgstr "" +msgstr "VAX-FP verwenden" #: config/alpha/alpha.h:309 msgid "Do not use VAX fp" -msgstr "" +msgstr "VAX-FP nicht verwenden" #: config/alpha/alpha.h:310 msgid "Emit code for the byte/word ISA extension" -msgstr "" +msgstr "Code für die Byte/Word-ISA-Erweiterung erzeugen" #: config/alpha/alpha.h:313 msgid "Emit code for the motion video ISA extension" -msgstr "" +msgstr "Code für die Video-ISA-Erweiterung erzeugen" #: config/alpha/alpha.h:316 msgid "Emit code for the fp move and sqrt ISA extension" -msgstr "" +msgstr "Code für die FP-Move und SQRT-ISA-Erweiterung erzeugen" #: config/alpha/alpha.h:318 msgid "Emit code for the counting ISA extension" -msgstr "" +msgstr "Code für die zählende ISA-Erweiterung erzeugen" #: config/alpha/alpha.h:321 msgid "Emit code using explicit relocation directives" -msgstr "" +msgstr "Code mit expliziten Auslagerungsanweisungen erzeugen" #: config/alpha/alpha.h:324 msgid "Emit 16-bit relocations to the small data areas" -msgstr "" +msgstr "16-bit Auslagerungen in kleinen Datenbereichen erzeugen" #: config/alpha/alpha.h:326 msgid "Emit 32-bit relocations to the small data areas" -msgstr "" +msgstr "32-bit Auslagerungen in kleinen Datenbereichen erzeugen" #: config/alpha/alpha.h:328 msgid "Emit direct branches to local functions" -msgstr "" +msgstr "Direkte Zweige in lokalen Funktionen erzeugen" #: config/alpha/alpha.h:331 msgid "Emit rdval instead of rduniq for thread pointer" -msgstr "" +msgstr "rdval statt rduniq für Zhread-Zeiger erzeugen" #: config/alpha/alpha.h:333 msgid "Use 128-bit long double" -msgstr "" +msgstr "128-bit long double verwenden" #: config/alpha/alpha.h:335 msgid "Use 64-bit long double" -msgstr "" +msgstr "64-bit long double verwenden" #. For -mcpu= #. For -mtune= @@ -7695,154 +7685,154 @@ msgstr "" #. For -mtls-size= #: config/alpha/alpha.h:364 msgid "Use features of and schedule given CPU" -msgstr "" +msgstr "Für angegebene CPU planen und deren Eigenschaften verwenden" #: config/alpha/alpha.h:366 msgid "Schedule given CPU" -msgstr "" +msgstr "Für angegebene CPU planen" #: config/alpha/alpha.h:368 msgid "Control the generated fp rounding mode" -msgstr "" +msgstr "Den generierten FP-Rundungsmodus steuern" #: config/alpha/alpha.h:370 msgid "Control the IEEE trap mode" -msgstr "" +msgstr "Den IEEE-Trap-Modus steuern" #: config/alpha/alpha.h:372 msgid "Control the precision given to fp exceptions" -msgstr "" +msgstr "Die Präzision der FP-Ausnahmen steuern" #: config/alpha/alpha.h:374 msgid "Tune expected memory latency" -msgstr "" +msgstr "Die erwartete Speicher-Wartezeit abstimmen" #: config/alpha/alpha.h:376 config/ia64/ia64.h:267 config/rs6000/sysv4.h:90 msgid "Specify bit size of immediate TLS offsets" -msgstr "" +msgstr "Bit-Breite des unmittelbaren TLS-Versatzes angeben" #: config/arc/arc.c:147 #, c-format msgid "bad value (%s) for -mcpu switch" -msgstr "" +msgstr "Falscher Wert (%s) für -mcpu Schalter" #: config/arc/arc.c:369 #, c-format msgid "argument of `%s' attribute is not a string constant" -msgstr "" +msgstr "Argument des Attributes »%s« ist keine Zeichenkettenkonstante" #: config/arc/arc.c:376 #, c-format msgid "argument of `%s' attribute is not \"ilink1\" or \"ilink2\"" -msgstr "" +msgstr "Argument des Attributes »%s« ist nicht \"ilink1\" oder \"ilink2\"" #: config/arc/arc.c:1714 config/m32r/m32r.c:2352 #, c-format msgid "invalid operand to %%R code" -msgstr "" +msgstr "Ungültiger Operand für %%R-Code" #: config/arc/arc.c:1746 config/m32r/m32r.c:2375 #, c-format msgid "invalid operand to %%H/%%L code" -msgstr "" +msgstr "Ungültiger Operand für %%H/%%L-Code" #: config/arc/arc.c:1769 config/m32r/m32r.c:2446 #, c-format msgid "invalid operand to %%U code" -msgstr "" +msgstr "Ungültiger Operand für %%U-Code" #: config/arc/arc.c:1780 #, c-format msgid "invalid operand to %%V code" -msgstr "" +msgstr "Ungültiger Operand für %%V-Code" #. Unknown flag. #: config/arc/arc.c:1787 config/m32r/m32r.c:2473 config/sparc/sparc.c:7010 msgid "invalid operand output code" -msgstr "" +msgstr "Ungültiger Operanden-Ausgabecode" #: config/arm/arm.c:520 #, c-format msgid "switch -mcpu=%s conflicts with -march= switch" -msgstr "" +msgstr "Schalter -mcpu=%s steht in Konflikt mit dem Schalter -march=" #: config/arm/arm.c:530 config/rs6000/rs6000.c:767 config/sparc/sparc.c:424 #, c-format msgid "bad value (%s) for %s switch" -msgstr "" +msgstr "Falscher Wert (%s) für Schalter %s" #: config/arm/arm.c:672 msgid "target CPU does not support APCS-32" -msgstr "" +msgstr "Ziel-CPU unterstützt nicht APCS-32" #: config/arm/arm.c:677 msgid "target CPU does not support APCS-26" -msgstr "" +msgstr "Ziel-CPU unterstützt nicht APCS-26" #: config/arm/arm.c:683 msgid "target CPU does not support interworking" -msgstr "" +msgstr "Ziel-CPU unterstützt keine Zusammenarbeit" #: config/arm/arm.c:689 msgid "target CPU does not support THUMB instructions" -msgstr "" +msgstr "Ziel-CPU unterstützt keine THUMB-Befehle" #: config/arm/arm.c:694 msgid "future releases of GCC will not support -mapcs-26" -msgstr "" +msgstr "Zukünftige Ausgaben des GCC werden nicht -mapcs-26 unterstützen" #: config/arm/arm.c:706 msgid "enabling backtrace support is only meaningful when compiling for the Thumb" -msgstr "" +msgstr "Das Aktivieren der Ablaufverfolgung ist nur bei der Übersetzung für THUMB sinnvoll" #: config/arm/arm.c:709 msgid "enabling callee interworking support is only meaningful when compiling for the Thumb" -msgstr "" +msgstr "Das Aktivieren der Unterstützung der Aufgerufenen-Zusammenarbeit ist nur bei der Übersetzung für THUMB sinnvoll" #: config/arm/arm.c:712 msgid "enabling caller interworking support is only meaningful when compiling for the Thumb" -msgstr "" +msgstr "Das Aktivieren der Unterstützung der Aufrufer-Zusammenarbeit ist nur bei der Übersetzung für THUMB sinnvoll" #: config/arm/arm.c:718 msgid "interworking forces APCS-32 to be used" -msgstr "" +msgstr "Zusammenarbeit erzingt die Verwendung von APCS-32" #: config/arm/arm.c:724 msgid "-mapcs-stack-check incompatible with -mno-apcs-frame" -msgstr "" +msgstr "-mapcs-stack-check inkompatibel mit -mno-apcs-frame" #: config/arm/arm.c:732 msgid "-fpic and -mapcs-reent are incompatible" -msgstr "" +msgstr "-fpic und -mapcs-reent sind inkompatibel" #: config/arm/arm.c:735 msgid "APCS reentrant code not supported. Ignored" -msgstr "" +msgstr "APCS wieder einsprungsfähiger Code nicht unterstützt. Ignoriert." #: config/arm/arm.c:743 msgid "-g with -mno-apcs-frame may not give sensible debugging" -msgstr "" +msgstr "-g mit -mno-apcs-frame könnte vernünftige Fehlersuche verhindern" #: config/arm/arm.c:751 msgid "passing floating point arguments in fp regs not yet supported" -msgstr "" +msgstr "Die Übergabe von Fließkommaargumenten in FP-Registern wird noch nicht unterstützt" #: config/arm/arm.c:795 #, c-format msgid "invalid floating point emulation option: -mfpe-%s" -msgstr "" +msgstr "Ungültige Option für Fließkommaemulation: -mfpe-%s" #: config/arm/arm.c:806 msgid "-mfpe switch not supported by ep9312 target cpu - ignored." -msgstr "" +msgstr "Schalter -mfpe wird von der Ziel-CPU ep9312 nicht unterstützt. Ignoriert." #: config/arm/arm.c:826 msgid "structure size boundary can only be set to 8 or 32" -msgstr "" +msgstr "Grenze für Strukturgrößen kann nur auf 8 oder 32 gesetzt werden" #: config/arm/arm.c:834 msgid "-mpic-register= is useless without -fpic" -msgstr "" +msgstr "-mpic-register= ist ohne -fpic nutzlos" #: config/arm/arm.c:841 #, c-format @@ -13260,9 +13250,8 @@ msgid "ignoring packed attribute on unpacked non-POD field `%#D'" msgstr "" #: cp/class.c:2939 -#, fuzzy msgid "`%D' may not be static because it is a member of a union" -msgstr "»%#D« ist kein Nicht-static-Datenelement von »%T«" +msgstr "»%D« kann nicht static sein, da es ein union-Element ist" #: cp/class.c:2944 msgid "`%D' may not have reference type `%T' because it is a member of a union" @@ -14673,9 +14662,8 @@ msgid "use of enum `%#D' without previous declaration" msgstr "" #: cp/decl.c:9471 -#, fuzzy msgid "redeclaration of `%T' as a non-template" -msgstr "Deklaration von »%s« überdeckt einen Parameter" +msgstr "Redeklaration von »%T« als Nicht-Template" #: cp/decl.c:9517 msgid "derived union `%T' invalid" @@ -15197,9 +15185,8 @@ msgstr "" #. fixed correctly in mainline), but on the release branch #. we prefer this less-intrusive approacch. #: cp/init.c:2077 -#, fuzzy msgid "no suitable or ambiguous `%D' found in class `%T'" -msgstr "kein geeigneter »operator %s« für »%T«" +msgstr "kein geeignetes oder mehrdeutiges »%D« in Klasse »%T« gefunden" #: cp/init.c:2083 msgid "request for member `%D' is ambiguous" @@ -15361,25 +15348,21 @@ msgid "global declaration `%#D'" msgstr "" #: cp/name-lookup.c:961 cp/name-lookup.c:968 -#, fuzzy msgid "declaration of '%#D' shadows a parameter" -msgstr "Deklaration von »%s« überdeckt einen Parameter" +msgstr "Deklaration von »%#D« überdeckt einen Parameter" #. Location of previous decl is not useful in this case. #: cp/name-lookup.c:985 -#, fuzzy msgid "declaration of '%D' shadows a member of 'this'" -msgstr "Deklaration von »%s« überdeckt einen Parameter" +msgstr "Deklaration von »%D« überdeckt ein Element von 'this'" #: cp/name-lookup.c:991 -#, fuzzy msgid "declaration of '%D' shadows a previous local" -msgstr "Deklaration von »%s« überdeckt einen vorhergehenden lokalen Bezeichner" +msgstr "Deklaration von »%D« überdeckt einen vorhergehenden lokalen Bezeichner" #: cp/name-lookup.c:998 -#, fuzzy msgid "declaration of '%D' shadows a global declaration" -msgstr "Deklaration von »%s« überdeckt eine globale Deklaration" +msgstr "Deklaration von »%D« überdeckt eine globale Deklaration" #: cp/name-lookup.c:1167 msgid "name lookup of `%D' changed" @@ -15650,9 +15633,8 @@ msgid "ISO C++ forbids compound-literals" msgstr "ISO-C++ verbietet zusammengesetzte Literale" #: cp/parser.c:4461 -#, fuzzy msgid "array bound forbidden after parenthesized type-id" -msgstr "Attribute hinter geklammerter Initialisierung werden ignoriert" +msgstr "Feldgrenze hinter geklammerter type-id ist verboten" #: cp/parser.c:4462 msgid "try removing the parentheses around the type-id" @@ -15763,9 +15745,8 @@ msgid "attributes after parenthesized initializer ignored" msgstr "Attribute hinter geklammerter Initialisierung werden ignoriert" #: cp/parser.c:10540 -#, fuzzy msgid "`%T::%D' is not a type" -msgstr "»%s« ist kein Template" +msgstr "»%T::%D« ist kein Typ" #: cp/parser.c:11288 msgid "file ends in default argument" @@ -15853,9 +15834,8 @@ msgid "spurious `>>', use `>' to terminate a template argument list" msgstr "" #: cp/parser.c:14574 -#, fuzzy msgid "missing `>' to terminate the template argument list" -msgstr "fehlendes ')' in Makroparameterliste" +msgstr "fehlendes '>', um Templateargumentliste zu beenden" #: cp/parser.c:15062 msgid "`%s' tag used in naming `%#T'" diff --git a/gcc/po/gcc.pot b/gcc/po/gcc.pot index 80cf50a09dc..a3d593687c8 100644 --- a/gcc/po/gcc.pot +++ b/gcc/po/gcc.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n" -"POT-Creation-Date: 2004-10-05 21:45-0700\n" +"POT-Creation-Date: 2004-10-08 10:30+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -56,96 +56,96 @@ msgstr "" msgid "invalid third arg to __builtin_prefetch; using zero" msgstr "" -#: builtins.c:3790 +#: builtins.c:3775 msgid "argument of %<__builtin_args_info%> must be constant" msgstr "" -#: builtins.c:3796 +#: builtins.c:3781 msgid "argument of %<__builtin_args_info%> out of range" msgstr "" -#: builtins.c:3802 +#: builtins.c:3787 msgid "missing argument in %<__builtin_args_info%>" msgstr "" -#: builtins.c:3818 builtins.c:8715 +#: builtins.c:3803 builtins.c:8700 msgid "% used in function with fixed args" msgstr "" -#: builtins.c:3837 builtins.c:8731 +#: builtins.c:3822 builtins.c:8716 msgid "second parameter of % not last named argument" msgstr "" #. Evidently an out of date version of ; can't validate #. va_start's second argument, but can still work as intended. -#: builtins.c:3842 builtins.c:8737 +#: builtins.c:3827 builtins.c:8722 msgid "%<__builtin_next_arg%> called without an argument" msgstr "" -#: builtins.c:3927 +#: builtins.c:3912 msgid "too many arguments to function %" msgstr "" -#: builtins.c:4075 +#: builtins.c:4060 msgid "first argument to % not of type %" msgstr "" #. Unfortunately, this is merely undefined, rather than a constraint #. violation, so we cannot make this an error. If this call is never #. executed, the program is still strictly conforming. -#: builtins.c:4089 +#: builtins.c:4074 msgid "%qT is promoted to %qT when passed through %<...%>" msgstr "" -#: builtins.c:4094 +#: builtins.c:4079 msgid "(so you should pass %qT not %qT to %)" msgstr "" #. We can, however, treat "undefined" any way we please. #. Call abort to encourage the user to fix the program. -#: builtins.c:4100 c-typeck.c:1956 +#: builtins.c:4085 c-typeck.c:1964 msgid "if this code is reached, the program will abort" msgstr "" -#: builtins.c:4218 +#: builtins.c:4203 msgid "invalid arg to %<__builtin_frame_address%>" msgstr "" -#: builtins.c:4220 +#: builtins.c:4205 msgid "invalid arg to %<__builtin_return_address%>" msgstr "" -#: builtins.c:4234 +#: builtins.c:4219 msgid "unsupported arg to %<__builtin_frame_address%>" msgstr "" -#: builtins.c:4236 +#: builtins.c:4221 msgid "unsupported arg to %<__builtin_return_address%>" msgstr "" -#: builtins.c:4339 +#: builtins.c:4324 msgid "second arg to %<__builtin_expect%> must be a constant" msgstr "" -#: builtins.c:5546 +#: builtins.c:5531 msgid "__builtin_longjmp second argument must be 1" msgstr "" -#: builtins.c:5891 +#: builtins.c:5876 msgid "target format does not support infinity" msgstr "" -#: builtins.c:7566 builtins.c:7662 c-typeck.c:2185 +#: builtins.c:7551 builtins.c:7647 #, c-format msgid "too few arguments to function %qs" msgstr "" -#: builtins.c:7572 builtins.c:7668 c-typeck.c:2044 +#: builtins.c:7557 builtins.c:7653 #, c-format msgid "too many arguments to function %qs" msgstr "" -#: builtins.c:7578 builtins.c:7692 +#: builtins.c:7563 builtins.c:7677 #, c-format msgid "non-floating-point argument to function %qs" msgstr "" @@ -568,11 +568,11 @@ msgstr "" #. Use `%s' to print the string in case there are any escape #. characters in the message. -#: c-common.c:5500 c-typeck.c:3975 c-typeck.c:3990 c-typeck.c:4005 +#: c-common.c:5500 c-typeck.c:4061 c-typeck.c:4076 c-typeck.c:4091 #: final.c:2840 final.c:2842 gcc.c:4647 rtl-error.c:113 toplev.c:599 #: config/cris/cris.c:568 cp/parser.c:1924 cp/typeck.c:4160 java/expr.c:368 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:5022 java/verify.c:1552 -#: java/verify.c:1553 java/verify.c:1572 +#: ../../gcc-cvs/gcc/java/parse.y:5022 java/verify.c:1552 java/verify.c:1553 +#: java/verify.c:1572 #, c-format msgid "%s" msgstr "" @@ -593,7 +593,7 @@ msgstr "" msgid "attempt to take address of bit-field structure member %qs" msgstr "" -#: c-convert.c:83 c-typeck.c:1352 c-typeck.c:3438 cp/typeck.c:1376 +#: c-convert.c:83 c-typeck.c:1360 c-typeck.c:3512 cp/typeck.c:1376 #: cp/typeck.c:5709 fortran/convert.c:89 treelang/tree-convert.c:79 msgid "void value not ignored as it ought to be" msgstr "" @@ -915,7 +915,7 @@ msgstr "" msgid "%J%qD is usually a function" msgstr "" -#: c-decl.c:2948 cp/decl.c:3693 cp/decl2.c:857 +#: c-decl.c:2948 cp/decl.c:3693 cp/decl2.c:853 msgid "typedef %qD is initialized (use __typeof__ instead)" msgstr "" @@ -932,7 +932,7 @@ msgstr "" #. of VLAs themselves count as VLAs, it does not make #. sense to permit them to be initialized given that #. ordinary VLAs may not be initialized. -#: c-decl.c:2978 c-decl.c:2998 c-typeck.c:4255 +#: c-decl.c:2978 c-decl.c:2998 c-typeck.c:4341 msgid "variable-sized object may not be initialized" msgstr "" @@ -944,7 +944,7 @@ msgstr "" msgid "elements of array %qD have incomplete type" msgstr "" -#: c-decl.c:3065 c-decl.c:5642 cp/decl.c:3733 cp/decl.c:9837 +#: c-decl.c:3065 c-decl.c:5642 cp/decl.c:3733 cp/decl.c:9838 msgid "%Jinline function %qD given attribute noinline" msgstr "" @@ -1475,7 +1475,7 @@ msgstr "" msgid "argument %qD doesn%'t match prototype" msgstr "" -#: c-decl.c:6254 cp/decl.c:10592 +#: c-decl.c:6254 cp/decl.c:10593 msgid "no return statement in function returning non-void" msgstr "" @@ -2176,7 +2176,7 @@ msgstr "" msgid "statement with no effect" msgstr "" -#: c-gimplify.c:315 c-typeck.c:6703 cp/parser.c:6508 +#: c-gimplify.c:315 c-typeck.c:6789 cp/parser.c:6508 msgid "break statement not within loop or switch" msgstr "" @@ -2190,6 +2190,7 @@ msgid "ignoring duplicate directory \"%s\"\n" msgstr "" #: c-incpath.c:73 +#, c-format msgid " as it is a non-system directory that duplicates a system directory\n" msgstr "" @@ -2199,14 +2200,17 @@ msgid "ignoring nonexistent directory \"%s\"\n" msgstr "" #: c-incpath.c:283 +#, c-format msgid "#include \"...\" search starts here:\n" msgstr "" #: c-incpath.c:287 +#, c-format msgid "#include <...> search starts here:\n" msgstr "" #: c-incpath.c:292 +#, c-format msgid "End of search list.\n" msgstr "" @@ -2429,16 +2433,16 @@ msgstr "" #. between diagnostics with "syntax error" in them, and diagnostics #. with "parse error" in them. It's okay to give them both the same #. translation. -#: c-parse.y:54 c-parse.y:2925 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse-scan.y:1373 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:16421 -#: objc/objc-parse.y:53 objc/objc-parse.y:3528 +#: c-parse.y:54 c-parse.c:5320 c-parse.y:2925 gengtype-yacc.c:1559 +#: java/parse-scan.c:3063 ../../gcc-cvs/gcc/java/parse-scan.y:1373 +#: java/parse.c:6168 ../../gcc-cvs/gcc/java/parse.y:16421 objc/objc-parse.y:53 +#: objc/objc-parse.c:6402 objc/objc-parse.y:3528 msgid "syntax error" msgstr "" -#: /usr/share/bison/bison.simple:179 c-parse.y:2929 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse-scan.y:1377 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:16425 +#: c-parse.c:2170 c-parse.y:2929 gengtype-yacc.c:555 java/parse-scan.c:1932 +#: ../../gcc-cvs/gcc/java/parse-scan.y:1377 java/parse.c:2933 +#: ../../gcc-cvs/gcc/java/parse.y:16425 objc/objc-parse.c:2687 #: objc/objc-parse.y:3532 msgid "syntax error: cannot back up" msgstr "" @@ -2564,21 +2568,15 @@ msgstr "" msgid "ISO C requires a named argument before %<...%>" msgstr "" -#: /usr/share/bison/bison.simple:795 c-parse.y:2928 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse-scan.y:1376 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:16424 -#: objc/objc-parse.y:3531 -msgid "parse error; also virtual memory exhausted" -msgstr "" - -#: /usr/share/bison/bison.simple:799 c-parse.y:2926 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse-scan.y:1374 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:16422 -#: objc/objc-parse.y:3529 -msgid "parse error" +#: c-parse.c:5316 c-parse.y:2927 gengtype-yacc.c:1555 java/parse-scan.c:3059 +#: ../../gcc-cvs/gcc/java/parse-scan.y:1375 java/parse.c:6164 +#: ../../gcc-cvs/gcc/java/parse.y:16423 objc/objc-parse.c:6398 +#: objc/objc-parse.y:3530 +msgid "syntax error; also virtual memory exhausted" msgstr "" -#: /usr/share/bison/bison.simple:924 +#: c-parse.c:5434 gengtype-yacc.c:1673 java/parse-scan.c:3177 +#: java/parse.c:6282 objc/objc-parse.c:6516 msgid "parser stack overflow" msgstr "" @@ -2587,15 +2585,18 @@ msgstr "" msgid "syntax error at %qs token" msgstr "" -#: c-parse.y:2927 /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse-scan.y:1375 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:16423 -#: objc/objc-parse.y:3530 -msgid "syntax error; also virtual memory exhausted" +#: c-parse.y:2926 ../../gcc-cvs/gcc/java/parse-scan.y:1374 +#: ../../gcc-cvs/gcc/java/parse.y:16422 objc/objc-parse.y:3529 +msgid "parse error" +msgstr "" + +#: c-parse.y:2928 ../../gcc-cvs/gcc/java/parse-scan.y:1376 +#: ../../gcc-cvs/gcc/java/parse.y:16424 objc/objc-parse.y:3531 +msgid "parse error; also virtual memory exhausted" msgstr "" -#: c-parse.y:2930 /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse-scan.y:1378 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:16426 -#: objc/objc-parse.y:3533 +#: c-parse.y:2930 ../../gcc-cvs/gcc/java/parse-scan.y:1378 +#: ../../gcc-cvs/gcc/java/parse.y:16426 objc/objc-parse.y:3533 msgid "parse error: cannot back up" msgstr "" @@ -2796,105 +2797,105 @@ msgstr "" msgid "junk at end of %<#pragma GCC visibility%>" msgstr "" -#: c-typeck.c:140 +#: c-typeck.c:148 #, c-format msgid "%qs has an incomplete type" msgstr "" -#: c-typeck.c:162 cp/call.c:2667 +#: c-typeck.c:170 cp/call.c:2667 msgid "invalid use of void expression" msgstr "" -#: c-typeck.c:170 +#: c-typeck.c:178 msgid "invalid use of flexible array member" msgstr "" -#: c-typeck.c:176 +#: c-typeck.c:184 msgid "invalid use of array with unspecified bounds" msgstr "" -#: c-typeck.c:184 +#: c-typeck.c:192 msgid "invalid use of undefined type %<%s %s%>" msgstr "" #. If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL. -#: c-typeck.c:188 +#: c-typeck.c:196 #, c-format msgid "invalid use of incomplete typedef %qs" msgstr "" -#: c-typeck.c:375 c-typeck.c:389 +#: c-typeck.c:383 c-typeck.c:397 msgid "function types not truly compatible in ISO C" msgstr "" -#: c-typeck.c:743 +#: c-typeck.c:751 msgid "types are not quite compatible" msgstr "" -#: c-typeck.c:985 +#: c-typeck.c:993 msgid "function return types not compatible due to %" msgstr "" -#: c-typeck.c:1126 c-typeck.c:2347 +#: c-typeck.c:1134 c-typeck.c:2379 msgid "arithmetic on pointer to an incomplete type" msgstr "" -#: c-typeck.c:1481 +#: c-typeck.c:1489 msgid "%qT has no member named %qs" msgstr "" -#: c-typeck.c:1517 +#: c-typeck.c:1525 #, c-format msgid "request for member %qs in something not a structure or union" msgstr "" -#: c-typeck.c:1546 +#: c-typeck.c:1554 msgid "dereferencing pointer to incomplete type" msgstr "" -#: c-typeck.c:1550 +#: c-typeck.c:1558 msgid "dereferencing % pointer" msgstr "" -#: c-typeck.c:1567 +#: c-typeck.c:1575 #, c-format msgid "invalid type argument of %qs" msgstr "" -#: c-typeck.c:1585 cp/typeck.c:2170 +#: c-typeck.c:1593 cp/typeck.c:2170 msgid "subscript missing in array reference" msgstr "" -#: c-typeck.c:1605 +#: c-typeck.c:1613 msgid "array subscript has type %" msgstr "" -#: c-typeck.c:1613 c-typeck.c:1702 cp/typeck.c:2215 cp/typeck.c:2301 +#: c-typeck.c:1621 c-typeck.c:1710 cp/typeck.c:2215 cp/typeck.c:2301 msgid "array subscript is not an integer" msgstr "" -#: c-typeck.c:1646 +#: c-typeck.c:1654 msgid "ISO C forbids subscripting % array" msgstr "" -#: c-typeck.c:1648 +#: c-typeck.c:1656 msgid "ISO C90 forbids subscripting non-lvalue array" msgstr "" -#: c-typeck.c:1681 +#: c-typeck.c:1689 msgid "subscript has type %" msgstr "" -#: c-typeck.c:1697 cp/typeck.c:2296 +#: c-typeck.c:1705 cp/typeck.c:2296 msgid "subscripted value is neither array nor pointer" msgstr "" -#: c-typeck.c:1727 +#: c-typeck.c:1735 #, c-format msgid "local declaration of %qs hides instance variable" msgstr "" -#: c-typeck.c:1920 +#: c-typeck.c:1928 #, c-format msgid "called object %qE is not a function" msgstr "" @@ -2902,723 +2903,797 @@ msgstr "" #. This situation leads to run-time undefined behavior. We can't, #. therefore, simply error unless we can prove that all possible #. executions of the program must execute the code. -#: c-typeck.c:1952 +#: c-typeck.c:1960 msgid "function called through a non-compatible type" msgstr "" -#: c-typeck.c:1996 c-typeck.c:4202 c-typeck.c:4204 c-typeck.c:4212 -#: c-typeck.c:4237 c-typeck.c:5624 +#: c-typeck.c:2004 c-typeck.c:4288 c-typeck.c:4290 c-typeck.c:4298 +#: c-typeck.c:4323 c-typeck.c:5710 msgid "initializer element is not constant" msgstr "" -#: c-typeck.c:2047 cp/typeck.c:2569 -msgid "too many arguments to function" +#: c-typeck.c:2064 +#, c-format +msgid "too many arguments to function %qE" msgstr "" -#: c-typeck.c:2068 +#: c-typeck.c:2091 #, c-format msgid "type of formal parameter %d is incomplete" msgstr "" -#: c-typeck.c:2081 +#: c-typeck.c:2104 #, c-format -msgid "%s as integer rather than floating due to prototype" +msgid "" +"passing argument %d of %qE as integer rather than floating due to prototype" msgstr "" -#: c-typeck.c:2084 +#: c-typeck.c:2109 #, c-format -msgid "%s as integer rather than complex due to prototype" +msgid "" +"passing argument %d of %qE as integer rather than complex due to prototype" msgstr "" -#: c-typeck.c:2087 +#: c-typeck.c:2114 #, c-format -msgid "%s as complex rather than floating due to prototype" +msgid "" +"passing argument %d of %qE as complex rather than floating due to prototype" msgstr "" -#: c-typeck.c:2090 +#: c-typeck.c:2119 #, c-format -msgid "%s as floating rather than integer due to prototype" +msgid "" +"passing argument %d of %qE as floating rather than integer due to prototype" msgstr "" -#: c-typeck.c:2093 +#: c-typeck.c:2124 #, c-format -msgid "%s as complex rather than integer due to prototype" +msgid "" +"passing argument %d of %qE as complex rather than integer due to prototype" msgstr "" -#: c-typeck.c:2096 +#: c-typeck.c:2129 #, c-format -msgid "%s as floating rather than complex due to prototype" +msgid "" +"passing argument %d of %qE as floating rather than complex due to prototype" msgstr "" -#: c-typeck.c:2106 -msgid "%s as % rather than % due to prototype" +#: c-typeck.c:2141 +msgid "" +"passing argument %d of %qE as % rather than % due to " +"prototype" msgstr "" -#: c-typeck.c:2126 +#: c-typeck.c:2161 #, c-format -msgid "%s with different width due to prototype" +msgid "passing argument %d of %qE with different width due to prototype" msgstr "" -#: c-typeck.c:2152 +#: c-typeck.c:2188 #, c-format -msgid "%s as unsigned due to prototype" +msgid "passing argument %d of %qE as unsigned due to prototype" msgstr "" -#: c-typeck.c:2154 +#: c-typeck.c:2191 #, c-format -msgid "%s as signed due to prototype" +msgid "passing argument %d of %qE as signed due to prototype" msgstr "" -#: c-typeck.c:2188 cp/typeck.c:2675 -msgid "too few arguments to function" +#: c-typeck.c:2221 +#, c-format +msgid "too few arguments to function %qE" msgstr "" -#: c-typeck.c:2223 +#: c-typeck.c:2255 msgid "suggest parentheses around + or - inside shift" msgstr "" -#: c-typeck.c:2230 +#: c-typeck.c:2262 msgid "suggest parentheses around && within ||" msgstr "" -#: c-typeck.c:2239 +#: c-typeck.c:2271 msgid "suggest parentheses around arithmetic in operand of |" msgstr "" -#: c-typeck.c:2243 +#: c-typeck.c:2275 msgid "suggest parentheses around comparison in operand of |" msgstr "" -#: c-typeck.c:2252 +#: c-typeck.c:2284 msgid "suggest parentheses around arithmetic in operand of ^" msgstr "" -#: c-typeck.c:2256 +#: c-typeck.c:2288 msgid "suggest parentheses around comparison in operand of ^" msgstr "" -#: c-typeck.c:2263 +#: c-typeck.c:2295 msgid "suggest parentheses around + or - in operand of &" msgstr "" -#: c-typeck.c:2267 +#: c-typeck.c:2299 msgid "suggest parentheses around comparison in operand of &" msgstr "" -#: c-typeck.c:2273 +#: c-typeck.c:2305 msgid "comparisons like X<=Y<=Z do not have their mathematical meaning" msgstr "" -#: c-typeck.c:2299 +#: c-typeck.c:2331 msgid "pointer of type % used in subtraction" msgstr "" -#: c-typeck.c:2301 +#: c-typeck.c:2333 msgid "pointer to a function used in subtraction" msgstr "" -#: c-typeck.c:2390 +#: c-typeck.c:2422 msgid "wrong type argument to unary plus" msgstr "" -#: c-typeck.c:2403 +#: c-typeck.c:2435 msgid "wrong type argument to unary minus" msgstr "" -#: c-typeck.c:2420 +#: c-typeck.c:2452 msgid "ISO C does not support %<~%> for complex conjugation" msgstr "" -#: c-typeck.c:2426 +#: c-typeck.c:2458 msgid "wrong type argument to bit-complement" msgstr "" -#: c-typeck.c:2434 +#: c-typeck.c:2466 msgid "wrong type argument to abs" msgstr "" -#: c-typeck.c:2446 +#: c-typeck.c:2478 msgid "wrong type argument to conjugation" msgstr "" -#: c-typeck.c:2460 +#: c-typeck.c:2492 msgid "wrong type argument to unary exclamation mark" msgstr "" -#: c-typeck.c:2497 +#: c-typeck.c:2529 msgid "ISO C does not support %<++%> and %<--%> on complex types" msgstr "" -#: c-typeck.c:2513 c-typeck.c:2545 +#: c-typeck.c:2545 c-typeck.c:2577 msgid "wrong type argument to increment" msgstr "" -#: c-typeck.c:2515 c-typeck.c:2547 +#: c-typeck.c:2547 c-typeck.c:2579 msgid "wrong type argument to decrement" msgstr "" -#: c-typeck.c:2536 +#: c-typeck.c:2568 msgid "increment of pointer to unknown structure" msgstr "" -#: c-typeck.c:2538 +#: c-typeck.c:2570 msgid "decrement of pointer to unknown structure" msgstr "" -#: c-typeck.c:2628 +#: c-typeck.c:2660 msgid "attempt to take address of bit-field structure member %qD" msgstr "" -#: c-typeck.c:2710 +#: c-typeck.c:2742 msgid "invalid lvalue in assignment" msgstr "" -#: c-typeck.c:2713 +#: c-typeck.c:2745 msgid "invalid lvalue in increment" msgstr "" -#: c-typeck.c:2716 +#: c-typeck.c:2748 msgid "invalid lvalue in decrement" msgstr "" -#: c-typeck.c:2719 +#: c-typeck.c:2751 msgid "invalid lvalue in unary %<&%>" msgstr "" -#: c-typeck.c:2722 +#: c-typeck.c:2754 msgid "invalid lvalue in asm statement" msgstr "" -#: c-typeck.c:2750 +#: c-typeck.c:2782 #, c-format msgid "assignment of read-only member %qs" msgstr "" -#: c-typeck.c:2751 +#: c-typeck.c:2783 #, c-format msgid "increment of read-only member %qs" msgstr "" -#: c-typeck.c:2752 +#: c-typeck.c:2784 #, c-format msgid "decrement of read-only member %qs" msgstr "" -#: c-typeck.c:2756 +#: c-typeck.c:2788 #, c-format msgid "assignment of read-only variable %qs" msgstr "" -#: c-typeck.c:2757 +#: c-typeck.c:2789 #, c-format msgid "increment of read-only variable %qs" msgstr "" -#: c-typeck.c:2758 +#: c-typeck.c:2790 #, c-format msgid "decrement of read-only variable %qs" msgstr "" -#: c-typeck.c:2761 +#: c-typeck.c:2793 msgid "assignment of read-only location" msgstr "" -#: c-typeck.c:2762 +#: c-typeck.c:2794 msgid "increment of read-only location" msgstr "" -#: c-typeck.c:2763 +#: c-typeck.c:2795 msgid "decrement of read-only location" msgstr "" -#: c-typeck.c:2781 +#: c-typeck.c:2813 #, c-format msgid "cannot take address of bit-field %qs" msgstr "" -#: c-typeck.c:2809 +#: c-typeck.c:2841 #, c-format msgid "global register variable %qs used in nested function" msgstr "" -#: c-typeck.c:2813 +#: c-typeck.c:2845 #, c-format msgid "register variable %qs used in nested function" msgstr "" -#: c-typeck.c:2820 +#: c-typeck.c:2852 #, c-format msgid "address of global register variable %qs requested" msgstr "" -#: c-typeck.c:2825 +#: c-typeck.c:2857 #, c-format msgid "address of register variable %qs requested" msgstr "" -#: c-typeck.c:2873 +#: c-typeck.c:2905 msgid "non-lvalue array in conditional expression" msgstr "" -#: c-typeck.c:2917 +#: c-typeck.c:2949 msgid "signed and unsigned type in conditional expression" msgstr "" -#: c-typeck.c:2924 +#: c-typeck.c:2956 msgid "ISO C forbids conditional expr with only one void side" msgstr "" -#: c-typeck.c:2940 c-typeck.c:2948 +#: c-typeck.c:2972 c-typeck.c:2980 msgid "ISO C forbids conditional expr between % and function pointer" msgstr "" -#: c-typeck.c:2955 +#: c-typeck.c:2987 msgid "pointer type mismatch in conditional expression" msgstr "" -#: c-typeck.c:2962 c-typeck.c:2972 +#: c-typeck.c:2994 c-typeck.c:3004 msgid "pointer/integer type mismatch in conditional expression" msgstr "" -#: c-typeck.c:2986 +#: c-typeck.c:3018 msgid "type mismatch in conditional expression" msgstr "" -#: c-typeck.c:3029 +#: c-typeck.c:3061 msgid "left-hand operand of comma expression has no effect" msgstr "" -#: c-typeck.c:3062 +#: c-typeck.c:3094 msgid "cast specifies array type" msgstr "" -#: c-typeck.c:3068 +#: c-typeck.c:3100 msgid "cast specifies function type" msgstr "" -#: c-typeck.c:3078 +#: c-typeck.c:3110 msgid "ISO C forbids casting nonscalar to the same type" msgstr "" -#: c-typeck.c:3096 +#: c-typeck.c:3128 msgid "ISO C forbids casts to union type" msgstr "" -#: c-typeck.c:3105 +#: c-typeck.c:3137 msgid "cast to union type from type not present in union" msgstr "" -#: c-typeck.c:3156 +#: c-typeck.c:3188 msgid "cast adds new qualifiers to function type" msgstr "" #. There are qualifiers present in IN_OTYPE that are not #. present in IN_TYPE. -#: c-typeck.c:3161 +#: c-typeck.c:3193 msgid "cast discards qualifiers from pointer target type" msgstr "" -#: c-typeck.c:3176 +#: c-typeck.c:3208 msgid "cast increases required alignment of target type" msgstr "" -#: c-typeck.c:3182 cp/typeck.c:4959 +#: c-typeck.c:3214 cp/typeck.c:4959 msgid "cast from pointer to integer of different size" msgstr "" -#: c-typeck.c:3187 +#: c-typeck.c:3219 msgid "cast from function call of type %qT to non-matching type %qT" msgstr "" -#: c-typeck.c:3195 cp/typeck.c:4966 +#: c-typeck.c:3227 cp/typeck.c:4966 msgid "cast to pointer from integer of different size" msgstr "" -#: c-typeck.c:3207 +#: c-typeck.c:3239 msgid "type-punning to incomplete type might break strict-aliasing rules" msgstr "" -#: c-typeck.c:3214 +#: c-typeck.c:3246 msgid "dereferencing type-punned pointer will break strict-aliasing rules" msgstr "" -#: c-typeck.c:3217 +#: c-typeck.c:3249 msgid "dereferencing type-punned pointer might break strict-aliasing rules" msgstr "" -#: c-typeck.c:3229 +#: c-typeck.c:3261 msgid "ISO C forbids conversion of function pointer to object pointer type" msgstr "" -#: c-typeck.c:3238 +#: c-typeck.c:3270 msgid "ISO C forbids conversion of object pointer to function pointer type" msgstr "" -#. Convert new value to destination type. -#: c-typeck.c:3365 c-typeck.c:3382 -msgid "assignment" -msgstr "" - -#: c-typeck.c:3449 +#: c-typeck.c:3523 msgid "cannot pass rvalue to reference parameter" msgstr "" -#: c-typeck.c:3557 c-typeck.c:3634 +#: c-typeck.c:3632 c-typeck.c:3741 #, c-format -msgid "%s makes qualified function pointer from unqualified" +msgid "" +"passing argument %d of %qE makes qualified function pointer from unqualified" +msgstr "" + +#: c-typeck.c:3635 c-typeck.c:3744 +msgid "assignment makes qualified function pointer from unqualified" +msgstr "" + +#: c-typeck.c:3638 c-typeck.c:3746 +msgid "initialization makes qualified function pointer from unqualified" +msgstr "" + +#: c-typeck.c:3641 c-typeck.c:3748 +msgid "return makes qualified function pointer from unqualified" msgstr "" -#: c-typeck.c:3561 c-typeck.c:3614 +#: c-typeck.c:3645 c-typeck.c:3709 #, c-format -msgid "%s discards qualifiers from pointer target type" +msgid "passing argument %d of %qE discards qualifiers from pointer target type" msgstr "" -#: c-typeck.c:3567 +#: c-typeck.c:3647 c-typeck.c:3711 +msgid "assignment discards qualifiers from pointer target type" +msgstr "" + +#: c-typeck.c:3649 c-typeck.c:3713 +msgid "initialization discards qualifiers from pointer target type" +msgstr "" + +#: c-typeck.c:3651 c-typeck.c:3715 +msgid "return discards qualifiers from pointer target type" +msgstr "" + +#: c-typeck.c:3656 msgid "ISO C prohibits argument conversion to union type" msgstr "" -#: c-typeck.c:3605 -msgid "ISO C forbids %s between function pointer and %" +#: c-typeck.c:3694 +msgid "" +"ISO C forbids passing argument %d of %qE between function pointer and %" +msgstr "" + +#: c-typeck.c:3697 +msgid "ISO C forbids assignment between function pointer and %" +msgstr "" + +#: c-typeck.c:3699 +msgid "ISO C forbids initialization between function pointer and %" msgstr "" -#: c-typeck.c:3623 +#: c-typeck.c:3701 +msgid "ISO C forbids return between function pointer and %" +msgstr "" + +#: c-typeck.c:3724 #, c-format -msgid "pointer targets in %s differ in signedness" +msgid "pointer targets in passing argument %d of %qE differ in signedness" +msgstr "" + +#: c-typeck.c:3726 +msgid "pointer targets in assignment differ in signedness" +msgstr "" + +#: c-typeck.c:3728 +msgid "pointer targets in initialization differ in signedness" msgstr "" -#: c-typeck.c:3639 +#: c-typeck.c:3730 +msgid "pointer targets in return differ in signedness" +msgstr "" + +#: c-typeck.c:3753 #, c-format -msgid "%s from incompatible pointer type" +msgid "passing argument %d of %qE from incompatible pointer type" msgstr "" -#: c-typeck.c:3645 c-typeck.c:4162 cp/typeck.c:1402 +#: c-typeck.c:3755 +msgid "assignment from incompatible pointer type" +msgstr "" + +#: c-typeck.c:3756 +msgid "initialization from incompatible pointer type" +msgstr "" + +#: c-typeck.c:3758 +msgid "return from incompatible pointer type" +msgstr "" + +#: c-typeck.c:3763 c-typeck.c:4248 cp/typeck.c:1402 msgid "invalid use of non-lvalue array" msgstr "" -#: c-typeck.c:3659 +#: c-typeck.c:3777 #, c-format -msgid "%s makes pointer from integer without a cast" +msgid "passing argument %d of %qE makes pointer from integer without a cast" msgstr "" -#: c-typeck.c:3666 -#, c-format -msgid "%s makes integer from pointer without a cast" +#: c-typeck.c:3779 +msgid "assignment makes pointer from integer without a cast" msgstr "" -#: c-typeck.c:3680 c-typeck.c:3683 -#, c-format -msgid "incompatible type for argument %d of %qs" +#: c-typeck.c:3781 +msgid "initialization makes pointer from integer without a cast" msgstr "" -#: c-typeck.c:3687 -#, c-format -msgid "incompatible type for argument %d of indirect function call" +#: c-typeck.c:3783 +msgid "return makes pointer from integer without a cast" msgstr "" -#: c-typeck.c:3691 +#: c-typeck.c:3790 #, c-format -msgid "incompatible types in %s" +msgid "passing argument %d of %qE makes integer from pointer without a cast" msgstr "" -#. Function name is known; supply it. -#: c-typeck.c:3745 -#, c-format -msgid "passing arg %d of '%s'" +#: c-typeck.c:3792 +msgid "assignment makes integer from pointer without a cast" +msgstr "" + +#: c-typeck.c:3794 +msgid "initialization makes integer from pointer without a cast" +msgstr "" + +#: c-typeck.c:3796 +msgid "return makes integer from pointer without a cast" msgstr "" -#. Function name unknown (call through ptr); just give arg number. -#: c-typeck.c:3754 +#: c-typeck.c:3806 #, c-format -msgid "passing arg %d of pointer to function" +msgid "incompatible type for argument %d of %qE" msgstr "" -#: c-typeck.c:3810 +#: c-typeck.c:3809 +msgid "incompatible types in assignment" +msgstr "" + +#: c-typeck.c:3812 +msgid "incompatible types in initialization" +msgstr "" + +#: c-typeck.c:3815 +msgid "incompatible types in return" +msgstr "" + +#: c-typeck.c:3896 msgid "traditional C rejects automatic aggregate initialization" msgstr "" -#: c-typeck.c:3978 c-typeck.c:3993 c-typeck.c:4008 +#: c-typeck.c:4064 c-typeck.c:4079 c-typeck.c:4094 #, c-format msgid "(near initialization for %qs)" msgstr "" -#: c-typeck.c:4022 +#: c-typeck.c:4108 msgid "array initialized from parenthesized string constant" msgstr "" -#: c-typeck.c:4086 cp/typeck2.c:708 +#: c-typeck.c:4172 cp/typeck2.c:708 msgid "char-array initialized from wide string" msgstr "" -#: c-typeck.c:4091 +#: c-typeck.c:4177 msgid "wchar_t-array initialized from non-wide string" msgstr "" -#: c-typeck.c:4109 cp/typeck2.c:730 +#: c-typeck.c:4195 cp/typeck2.c:730 msgid "initializer-string for array of chars is too long" msgstr "" -#: c-typeck.c:4115 +#: c-typeck.c:4201 msgid "array of inappropriate type initialized from string constant" msgstr "" -#: c-typeck.c:4185 +#: c-typeck.c:4271 msgid "array initialized from non-constant array expression" msgstr "" -#: c-typeck.c:4229 -msgid "initialization" -msgstr "" - -#: c-typeck.c:4244 c-typeck.c:5628 +#: c-typeck.c:4330 c-typeck.c:5714 msgid "initializer element is not computable at load time" msgstr "" -#: c-typeck.c:4259 cp/typeck2.c:808 +#: c-typeck.c:4345 cp/typeck2.c:808 msgid "invalid initializer" msgstr "" -#: c-typeck.c:4529 cp/decl.c:4512 +#: c-typeck.c:4615 cp/decl.c:4512 msgid "opaque vector types cannot be initialized" msgstr "" -#: c-typeck.c:4725 +#: c-typeck.c:4811 msgid "extra brace group at end of initializer" msgstr "" -#: c-typeck.c:4745 +#: c-typeck.c:4831 msgid "missing braces around initializer" msgstr "" -#: c-typeck.c:4805 +#: c-typeck.c:4891 msgid "braces around scalar initializer" msgstr "" -#: c-typeck.c:4862 +#: c-typeck.c:4948 msgid "initialization of flexible array member in a nested context" msgstr "" -#: c-typeck.c:4864 +#: c-typeck.c:4950 msgid "initialization of a flexible array member" msgstr "" -#: c-typeck.c:4891 +#: c-typeck.c:4977 msgid "missing initializer" msgstr "" -#: c-typeck.c:4913 +#: c-typeck.c:4999 msgid "empty scalar initializer" msgstr "" -#: c-typeck.c:4918 +#: c-typeck.c:5004 msgid "extra elements in scalar initializer" msgstr "" -#: c-typeck.c:5006 +#: c-typeck.c:5092 msgid "initialization designators may not nest" msgstr "" -#: c-typeck.c:5028 c-typeck.c:5103 +#: c-typeck.c:5114 c-typeck.c:5189 msgid "array index in non-array initializer" msgstr "" -#: c-typeck.c:5033 c-typeck.c:5156 +#: c-typeck.c:5119 c-typeck.c:5242 msgid "field name not in record or union initializer" msgstr "" -#: c-typeck.c:5079 +#: c-typeck.c:5165 msgid "array index in initializer not of integer type" msgstr "" -#: c-typeck.c:5099 c-typeck.c:5101 +#: c-typeck.c:5185 c-typeck.c:5187 msgid "nonconstant array index in initializer" msgstr "" -#: c-typeck.c:5105 c-typeck.c:5108 +#: c-typeck.c:5191 c-typeck.c:5194 msgid "array index in initializer exceeds array bounds" msgstr "" -#: c-typeck.c:5119 +#: c-typeck.c:5205 msgid "empty index range in initializer" msgstr "" -#: c-typeck.c:5128 +#: c-typeck.c:5214 msgid "array index range in initializer exceeds array bounds" msgstr "" -#: c-typeck.c:5168 +#: c-typeck.c:5254 #, c-format msgid "unknown field %qs specified in initializer" msgstr "" -#: c-typeck.c:5204 c-typeck.c:5225 c-typeck.c:5691 +#: c-typeck.c:5290 c-typeck.c:5311 c-typeck.c:5777 msgid "initialized field with side-effects overwritten" msgstr "" -#: c-typeck.c:5900 +#: c-typeck.c:5986 msgid "excess elements in char array initializer" msgstr "" -#: c-typeck.c:5907 c-typeck.c:5953 +#: c-typeck.c:5993 c-typeck.c:6039 msgid "excess elements in struct initializer" msgstr "" -#: c-typeck.c:5968 +#: c-typeck.c:6054 msgid "non-static initialization of a flexible array member" msgstr "" -#: c-typeck.c:6036 +#: c-typeck.c:6122 msgid "excess elements in union initializer" msgstr "" -#: c-typeck.c:6058 +#: c-typeck.c:6144 msgid "traditional C rejects initialization of unions" msgstr "" -#: c-typeck.c:6122 +#: c-typeck.c:6208 msgid "excess elements in array initializer" msgstr "" -#: c-typeck.c:6152 +#: c-typeck.c:6238 msgid "excess elements in vector initializer" msgstr "" -#: c-typeck.c:6175 +#: c-typeck.c:6261 msgid "excess elements in scalar initializer" msgstr "" -#: c-typeck.c:6337 +#: c-typeck.c:6423 msgid "ISO C forbids %" msgstr "" -#: c-typeck.c:6351 +#: c-typeck.c:6437 msgid "function declared % has a % statement" msgstr "" -#: c-typeck.c:6358 +#: c-typeck.c:6444 msgid "% with no value, in function returning non-void" msgstr "" -#: c-typeck.c:6365 +#: c-typeck.c:6451 msgid "% with a value, in function returning void" msgstr "" -#: c-typeck.c:6369 -msgid "return" -msgstr "" - -#: c-typeck.c:6422 +#: c-typeck.c:6508 msgid "function returns address of local variable" msgstr "" -#: c-typeck.c:6483 cp/semantics.c:856 +#: c-typeck.c:6569 cp/semantics.c:856 msgid "switch quantity not an integer" msgstr "" -#: c-typeck.c:6493 +#: c-typeck.c:6579 msgid "% switch expression not converted to % in ISO C" msgstr "" -#: c-typeck.c:6530 cp/parser.c:6017 +#: c-typeck.c:6616 cp/parser.c:6017 msgid "case label not within a switch statement" msgstr "" -#: c-typeck.c:6532 +#: c-typeck.c:6618 msgid "% label not within a switch statement" msgstr "" -#: c-typeck.c:6596 +#: c-typeck.c:6682 msgid "%Hsuggest explicit braces to avoid ambiguous %" msgstr "" -#: c-typeck.c:6606 +#: c-typeck.c:6692 msgid "%Hempty body in an if-statement" msgstr "" -#: c-typeck.c:6614 +#: c-typeck.c:6700 msgid "%Hempty body in an else-statement" msgstr "" -#: c-typeck.c:6705 cp/parser.c:6519 +#: c-typeck.c:6791 cp/parser.c:6519 msgid "continue statement not within a loop" msgstr "" -#: c-typeck.c:6722 +#: c-typeck.c:6808 msgid "%Hstatement with no effect" msgstr "" -#: c-typeck.c:6751 +#: c-typeck.c:6837 msgid "expression statement has incomplete type" msgstr "" -#: c-typeck.c:7074 c-typeck.c:7113 +#: c-typeck.c:7160 c-typeck.c:7199 msgid "division by zero" msgstr "" -#: c-typeck.c:7158 cp/typeck.c:2965 +#: c-typeck.c:7244 cp/typeck.c:2965 msgid "right shift count is negative" msgstr "" -#: c-typeck.c:7165 cp/typeck.c:2971 +#: c-typeck.c:7251 cp/typeck.c:2971 msgid "right shift count >= width of type" msgstr "" -#: c-typeck.c:7186 cp/typeck.c:2990 +#: c-typeck.c:7272 cp/typeck.c:2990 msgid "left shift count is negative" msgstr "" -#: c-typeck.c:7189 cp/typeck.c:2992 +#: c-typeck.c:7275 cp/typeck.c:2992 msgid "left shift count >= width of type" msgstr "" -#: c-typeck.c:7210 +#: c-typeck.c:7296 msgid "shift count is negative" msgstr "" -#: c-typeck.c:7212 +#: c-typeck.c:7298 msgid "shift count >= width of type" msgstr "" -#: c-typeck.c:7229 cp/typeck.c:3027 +#: c-typeck.c:7315 cp/typeck.c:3027 msgid "comparing floating point with == or != is unsafe" msgstr "" -#: c-typeck.c:7253 c-typeck.c:7260 +#: c-typeck.c:7339 c-typeck.c:7346 msgid "ISO C forbids comparison of % with function pointer" msgstr "" -#: c-typeck.c:7264 c-typeck.c:7304 c-typeck.c:7332 +#: c-typeck.c:7350 c-typeck.c:7390 c-typeck.c:7418 msgid "comparison of distinct pointer types lacks a cast" msgstr "" -#: c-typeck.c:7278 c-typeck.c:7283 c-typeck.c:7352 c-typeck.c:7357 +#: c-typeck.c:7364 c-typeck.c:7369 c-typeck.c:7438 c-typeck.c:7443 msgid "comparison between pointer and integer" msgstr "" -#: c-typeck.c:7299 c-typeck.c:7327 +#: c-typeck.c:7385 c-typeck.c:7413 msgid "ISO C forbids ordered comparisons of pointers to functions" msgstr "" -#: c-typeck.c:7324 +#: c-typeck.c:7410 msgid "comparison of complete and incomplete pointers" msgstr "" -#: c-typeck.c:7340 c-typeck.c:7347 +#: c-typeck.c:7426 c-typeck.c:7433 msgid "ordered comparison of pointer with integer zero" msgstr "" -#: c-typeck.c:7372 cp/typeck.c:3168 +#: c-typeck.c:7458 cp/typeck.c:3168 msgid "unordered comparison on non-floating point argument" msgstr "" -#: c-typeck.c:7585 +#: c-typeck.c:7671 msgid "comparison between signed and unsigned" msgstr "" -#: c-typeck.c:7631 cp/typeck.c:3432 +#: c-typeck.c:7717 cp/typeck.c:3432 msgid "comparison of promoted ~unsigned with constant" msgstr "" -#: c-typeck.c:7639 cp/typeck.c:3440 +#: c-typeck.c:7725 cp/typeck.c:3440 msgid "comparison of promoted ~unsigned with unsigned" msgstr "" @@ -3710,62 +3785,62 @@ msgstr "" msgid "%s does not support delete_basic_block." msgstr "" -#: cfghooks.c:394 +#: cfghooks.c:395 #, c-format msgid "%s does not support split_edge." msgstr "" -#: cfghooks.c:448 +#: cfghooks.c:456 #, c-format msgid "%s does not support create_basic_block." msgstr "" -#: cfghooks.c:476 +#: cfghooks.c:484 #, c-format msgid "%s does not support can_merge_blocks_p." msgstr "" -#: cfghooks.c:487 +#: cfghooks.c:495 #, c-format msgid "%s does not support predict_edge." msgstr "" -#: cfghooks.c:496 +#: cfghooks.c:504 #, c-format msgid "%s does not support predicted_by_p." msgstr "" -#: cfghooks.c:510 +#: cfghooks.c:518 #, c-format msgid "%s does not support merge_blocks." msgstr "" -#: cfghooks.c:556 +#: cfghooks.c:564 #, c-format msgid "%s does not support make_forwarder_block." msgstr "" -#: cfghooks.c:662 +#: cfghooks.c:670 #, c-format msgid "%s does not support can_duplicate_block_p." msgstr "" -#: cfghooks.c:689 +#: cfghooks.c:697 #, c-format msgid "%s does not support duplicate_block." msgstr "" -#: cfghooks.c:755 +#: cfghooks.c:763 #, c-format msgid "%s does not support block_ends_with_call_p" msgstr "" -#: cfghooks.c:766 +#: cfghooks.c:774 #, c-format msgid "%s does not support block_ends_with_condjump_p" msgstr "" -#: cfghooks.c:784 +#: cfghooks.c:792 #, c-format msgid "%s does not support flow_call_edges_add" msgstr "" @@ -4347,7 +4422,7 @@ msgstr "" msgid "too many input files" msgstr "" -#: cse.c:6735 +#: cse.c:6733 #, c-format msgid ";; Processing block from %d to %d, %d sets.\n" msgstr "" @@ -4486,6 +4561,10 @@ msgstr "" msgid "`%%l' operand isn't a label" msgstr "" +#. We can't handle floating point constants; +#. PRINT_OPERAND must handle them. +#. We can't handle floating point constants; PRINT_OPERAND must +#. handle them. #. We can't handle floating point constants; #. PRINT_OPERAND must handle them. #: final.c:3289 vmsdbgout.c:487 config/i386/i386.c:5835 @@ -4536,19 +4615,19 @@ msgstr "" msgid "impossible constraint in %" msgstr "" -#: function.c:3457 +#: function.c:3461 msgid "%Jvariable %qD might be clobbered by % or %" msgstr "" -#: function.c:3478 +#: function.c:3482 msgid "%Jargument %qD might be clobbered by % or %" msgstr "" -#: function.c:3869 +#: function.c:3873 msgid "function returns an aggregate" msgstr "" -#: function.c:4202 +#: function.c:4206 msgid "%Junused parameter %qD" msgstr "" @@ -4886,6 +4965,7 @@ msgid "(C)" msgstr "" #: gcc.c:3409 java/gjavah.c:2327 java/jcf-dump.c:917 java/jv-scan.c:129 +#, c-format msgid "" "This is free software; see the source for copying conditions. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" @@ -5062,6 +5142,7 @@ msgid "libraries: %s\n" msgstr "" #: gcc.c:6337 +#, c-format msgid "" "\n" "For bug reporting instructions, please see:\n" @@ -5504,7 +5585,7 @@ msgid "`" msgstr "" #. Closing quotation mark. -#: intl.c:61 /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15438 +#: intl.c:61 ../../gcc-cvs/gcc/java/parse.y:15438 msgid "'" msgstr "" @@ -5996,7 +6077,7 @@ msgstr "" msgid "can't use '%s' as a %s register" msgstr "" -#: regclass.c:780 config/ia64/ia64.c:4107 config/ia64/ia64.c:4114 +#: regclass.c:780 config/ia64/ia64.c:4133 config/ia64/ia64.c:4140 #: config/pa/pa.c:328 config/pa/pa.c:335 #, c-format msgid "unknown register name: %s" @@ -6345,6 +6426,7 @@ msgid "collect: tweaking %s in %s\n" msgstr "" #: tlink.c:751 +#, c-format msgid "collect: relinking\n" msgstr "" @@ -6410,6 +6492,7 @@ msgid "type is deprecated" msgstr "" #: toplev.c:1064 +#, c-format msgid "" "\n" "Target specific options:\n" @@ -6421,12 +6504,14 @@ msgid " -m%-23s [undocumented]\n" msgstr "" #: toplev.c:1106 +#, c-format msgid "" "\n" "There are undocumented target specific options as well.\n" msgstr "" #: toplev.c:1108 +#, c-format msgid " They exist, but they are not documented.\n" msgstr "" @@ -6569,149 +6654,149 @@ msgstr "" msgid "%Hwill never be executed" msgstr "" -#: tree-cfg.c:3094 +#: tree-cfg.c:3031 msgid "SSA name in freelist but still referenced" msgstr "" -#: tree-cfg.c:3104 +#: tree-cfg.c:3041 msgid "GIMPLE register modified with BIT_FIELD_REF" msgstr "" -#: tree-cfg.c:3124 +#: tree-cfg.c:3061 msgid "address taken, but ADDRESSABLE bit not set" msgstr "" -#: tree-cfg.c:3133 +#: tree-cfg.c:3070 msgid "non-boolean used in condition" msgstr "" -#: tree-cfg.c:3189 +#: tree-cfg.c:3126 msgid "Invalid reference prefix." msgstr "" -#: tree-cfg.c:3254 +#: tree-cfg.c:3191 msgid "Is not a valid GIMPLE statement." msgstr "" -#: tree-cfg.c:3274 +#: tree-cfg.c:3211 msgid "Statement marked for throw, but doesn%'t." msgstr "" -#: tree-cfg.c:3279 +#: tree-cfg.c:3216 msgid "Statement marked for throw in middle of block." msgstr "" -#: tree-cfg.c:3379 +#: tree-cfg.c:3316 msgid "PHI def is not a GIMPLE value" msgstr "" -#: tree-cfg.c:3395 tree-cfg.c:3411 +#: tree-cfg.c:3332 tree-cfg.c:3348 msgid "Incorrect sharing of tree nodes" msgstr "" -#: tree-cfg.c:3420 +#: tree-cfg.c:3357 msgid "verify_stmts failed." msgstr "" -#: tree-cfg.c:3441 +#: tree-cfg.c:3378 msgid "ENTRY_BLOCK has a statement list associated with it\n" msgstr "" -#: tree-cfg.c:3447 +#: tree-cfg.c:3384 msgid "EXIT_BLOCK has a statement list associated with it\n" msgstr "" -#: tree-cfg.c:3454 +#: tree-cfg.c:3391 #, c-format msgid "Fallthru to exit from bb %d\n" msgstr "" -#: tree-cfg.c:3470 +#: tree-cfg.c:3407 #, c-format msgid "Label %s to block does not match in bb %d\n" msgstr "" -#: tree-cfg.c:3479 +#: tree-cfg.c:3416 #, c-format msgid "Label %s has incorrect context in bb %d\n" msgstr "" -#: tree-cfg.c:3493 +#: tree-cfg.c:3430 #, c-format msgid "Control flow in the middle of basic block %d\n" msgstr "" -#: tree-cfg.c:3503 +#: tree-cfg.c:3440 #, c-format msgid "Label %s in the middle of basic block %d\n" msgstr "" -#: tree-cfg.c:3520 +#: tree-cfg.c:3457 #, c-format msgid "Fallthru edge after a control statement in bb %d \n" msgstr "" -#: tree-cfg.c:3535 +#: tree-cfg.c:3472 #, c-format msgid "Structured COND_EXPR at the end of bb %d\n" msgstr "" -#: tree-cfg.c:3548 tree-cfg.c:3586 tree-cfg.c:3598 tree-cfg.c:3669 +#: tree-cfg.c:3485 tree-cfg.c:3523 tree-cfg.c:3535 tree-cfg.c:3606 #, c-format msgid "Wrong outgoing edge flags at end of bb %d\n" msgstr "" -#: tree-cfg.c:3556 +#: tree-cfg.c:3493 msgid "% label does not match edge at end of bb %d\n" msgstr "" -#: tree-cfg.c:3564 +#: tree-cfg.c:3501 msgid "% label does not match edge at end of bb %d\n" msgstr "" -#: tree-cfg.c:3574 +#: tree-cfg.c:3511 #, c-format msgid "Explicit goto at end of bb %d\n" msgstr "" -#: tree-cfg.c:3603 +#: tree-cfg.c:3540 #, c-format msgid "Return edge does not point to exit in bb %d\n" msgstr "" -#: tree-cfg.c:3636 +#: tree-cfg.c:3573 msgid "Found default case not at end of case vector" msgstr "" -#: tree-cfg.c:3642 +#: tree-cfg.c:3579 msgid "" "Case labels not sorted:\n" " " msgstr "" -#: tree-cfg.c:3653 +#: tree-cfg.c:3590 msgid "No default case found at end of case vector" msgstr "" -#: tree-cfg.c:3661 +#: tree-cfg.c:3598 #, c-format msgid "Extra outgoing edge %d->%d\n" msgstr "" -#: tree-cfg.c:3683 +#: tree-cfg.c:3620 #, c-format msgid "Missing edge %i->%i\n" msgstr "" -#: tree-cfg.c:5255 +#: tree-cfg.c:5187 msgid "%Jfunction might be possible candidate for attribute %" msgstr "" -#: tree-cfg.c:5282 tree-cfg.c:5286 +#: tree-cfg.c:5214 tree-cfg.c:5218 msgid "%H% function does return" msgstr "" -#: tree-cfg.c:5306 tree-cfg.c:5311 +#: tree-cfg.c:5238 tree-cfg.c:5243 msgid "%Hcontrol reaches end of non-void function" msgstr "" @@ -6768,11 +6853,11 @@ msgstr "" msgid "originally indirect function call not considered for inlining" msgstr "" -#: tree-inline.c:1473 tree-inline.c:1480 +#: tree-inline.c:1473 tree-inline.c:1481 msgid "%Jinlining failed in call to '%F': %s" msgstr "" -#: tree-inline.c:1474 tree-inline.c:1481 +#: tree-inline.c:1474 tree-inline.c:1482 msgid "called from here" msgstr "" @@ -7570,7 +7655,7 @@ msgstr "" msgid "bad value `%s' for -mfp-trap-mode switch" msgstr "" -#: config/alpha/alpha.c:347 config/rs6000/rs6000.c:1645 +#: config/alpha/alpha.c:347 config/rs6000/rs6000.c:1653 #, c-format msgid "bad value `%s' for -mtls-size switch" msgstr "" @@ -7620,24 +7705,24 @@ msgstr "" msgid "invalid %%J value" msgstr "" -#: config/alpha/alpha.c:4584 config/ia64/ia64.c:3710 +#: config/alpha/alpha.c:4584 config/ia64/ia64.c:3736 #, c-format msgid "invalid %%r value" msgstr "" -#: config/alpha/alpha.c:4594 config/rs6000/rs6000.c:10304 +#: config/alpha/alpha.c:4594 config/rs6000/rs6000.c:10312 #: config/xtensa/xtensa.c:1951 #, c-format msgid "invalid %%R value" msgstr "" -#: config/alpha/alpha.c:4600 config/rs6000/rs6000.c:10223 +#: config/alpha/alpha.c:4600 config/rs6000/rs6000.c:10231 #: config/xtensa/xtensa.c:1918 #, c-format msgid "invalid %%N value" msgstr "" -#: config/alpha/alpha.c:4608 config/rs6000/rs6000.c:10251 +#: config/alpha/alpha.c:4608 config/rs6000/rs6000.c:10259 #, c-format msgid "invalid %%P value" msgstr "" @@ -7652,12 +7737,12 @@ msgstr "" msgid "invalid %%L value" msgstr "" -#: config/alpha/alpha.c:4663 config/rs6000/rs6000.c:10205 +#: config/alpha/alpha.c:4663 config/rs6000/rs6000.c:10213 #, c-format msgid "invalid %%m value" msgstr "" -#: config/alpha/alpha.c:4671 config/rs6000/rs6000.c:10213 +#: config/alpha/alpha.c:4671 config/rs6000/rs6000.c:10221 #, c-format msgid "invalid %%M value" msgstr "" @@ -7668,7 +7753,7 @@ msgid "invalid %%U value" msgstr "" #: config/alpha/alpha.c:4727 config/alpha/alpha.c:4741 -#: config/rs6000/rs6000.c:10312 +#: config/rs6000/rs6000.c:10320 #, c-format msgid "invalid %%s value" msgstr "" @@ -7678,8 +7763,8 @@ msgstr "" msgid "invalid %%C value" msgstr "" -#: config/alpha/alpha.c:4801 config/rs6000/rs6000.c:10042 -#: config/rs6000/rs6000.c:10062 +#: config/alpha/alpha.c:4801 config/rs6000/rs6000.c:10050 +#: config/rs6000/rs6000.c:10070 #, c-format msgid "invalid %%E value" msgstr "" @@ -7688,16 +7773,24 @@ msgstr "" msgid "unknown relocation unspec" msgstr "" -#: config/alpha/alpha.c:4835 config/rs6000/rs6000.c:10630 +#: config/alpha/alpha.c:4835 config/rs6000/rs6000.c:10638 #, c-format msgid "invalid %%xn code" msgstr "" -#: config/alpha/alpha.c:5795 config/alpha/alpha.c:5798 config/s390/s390.c:7703 -#: config/s390/s390.c:7706 +#: config/alpha/alpha.c:5795 config/alpha/alpha.c:5798 config/s390/s390.c:7732 +#: config/s390/s390.c:7735 msgid "bad builtin fcode" msgstr "" +#. Macro to define tables used to set the flags. +#. This is a list in braces of pairs in braces, +#. each pair being { "NAME", VALUE } +#. where VALUE is the bits to set or minus the bits to clear. +#. An empty string NAME is used to identify the default VALUE. +#. WARNING: Do not mark empty strings for translation, as calling +#. gettext on an empty string does NOT return an empty +#. string. #. Macro to define tables used to set the flags. #. This is a list in braces of pairs in braces, #. each pair being { "NAME", VALUE } @@ -7869,6 +7962,7 @@ msgid "invalid operand to %%V code" msgstr "" #. Unknown flag. +#. Undocumented flag. #: config/arc/arc.c:1812 config/m32r/m32r.c:2251 config/sparc/sparc.c:7298 msgid "invalid operand output code" msgstr "" @@ -7878,7 +7972,7 @@ msgstr "" msgid "switch -mcpu=%s conflicts with -march= switch" msgstr "" -#: config/arm/arm.c:784 config/rs6000/rs6000.c:1199 config/sparc/sparc.c:621 +#: config/arm/arm.c:784 config/rs6000/rs6000.c:1207 config/sparc/sparc.c:621 #, c-format msgid "bad value (%s) for %s switch" msgstr "" @@ -7979,7 +8073,7 @@ msgstr "" #: config/i386/i386.c:1731 config/ip2k/ip2k.c:3181 #: config/m68hc11/m68hc11.c:1350 config/m68k/m68k.c:288 #: config/mcore/mcore.c:3375 config/ns32k/ns32k.c:1068 -#: config/rs6000/rs6000.c:16366 config/sh/sh.c:7146 config/sh/sh.c:7167 +#: config/rs6000/rs6000.c:16655 config/sh/sh.c:7146 config/sh/sh.c:7167 #: config/sh/sh.c:7202 config/stormy16/stormy16.c:2413 config/v850/v850.c:2207 #, c-format msgid "`%s' attribute only applies to functions" @@ -7988,7 +8082,7 @@ msgstr "" #: config/arm/arm.c:2630 config/arm/arm.c:2657 config/avr/avr.c:4514 #: config/h8300/h8300.c:5779 config/h8300/h8300.c:5802 config/i386/i386.c:1713 #: config/i386/i386.c:14495 config/ia64/ia64.c:512 config/ip2k/ip2k.c:3163 -#: config/m68hc11/m68hc11.c:1314 config/rs6000/rs6000.c:16331 +#: config/m68hc11/m68hc11.c:1314 config/rs6000/rs6000.c:16620 #: config/sh/symbian.c:414 config/sh/symbian.c:421 #, c-format msgid "`%s' attribute ignored" @@ -8358,12 +8452,6 @@ msgstr "" msgid "c4x_rptb_rpts_p: Repeat block top label moved\n" msgstr "" -#. ??? HACK. We shouldn't have flag_inline_trees at all. -#. Name of the c4x assembler. -#. Name of the c4x linker. -#. Define assembler options. -#. Define linker options. -#. Specify the end file to link with. #. Target compilation option flags. #. Small memory model. #. Use 24-bit MPYI for C3x. @@ -9020,6 +9108,7 @@ msgstr "" #. #define TARGET_VERSION fprintf (stderr, " (68k, MIT syntax)"); #. #endif #: config/frv/frv.h:542 +#, c-format msgid " (frv)" msgstr "" @@ -9653,41 +9742,41 @@ msgstr "" msgid "%Jaddress area attribute cannot be specified for functions" msgstr "" -#: config/ia64/ia64.c:3755 +#: config/ia64/ia64.c:3781 msgid "ia64_print_operand: unknown code" msgstr "" -#: config/ia64/ia64.c:4095 config/pa/pa.c:316 +#: config/ia64/ia64.c:4121 config/pa/pa.c:316 msgid "value of -mfixed-range must have form REG1-REG2" msgstr "" -#: config/ia64/ia64.c:4122 config/pa/pa.c:343 +#: config/ia64/ia64.c:4148 config/pa/pa.c:343 #, c-format msgid "%s-%s is an empty range" msgstr "" -#: config/ia64/ia64.c:4173 +#: config/ia64/ia64.c:4199 msgid "cannot optimize floating point division for both latency and throughput" msgstr "" -#: config/ia64/ia64.c:4190 +#: config/ia64/ia64.c:4216 msgid "cannot optimize integer division for both latency and throughput" msgstr "" -#: config/ia64/ia64.c:4207 +#: config/ia64/ia64.c:4233 msgid "cannot optimize square root for both latency and throughput" msgstr "" -#: config/ia64/ia64.c:4221 +#: config/ia64/ia64.c:4247 msgid "not yet implemented: latency-optimized inline square root" msgstr "" -#: config/ia64/ia64.c:4233 +#: config/ia64/ia64.c:4259 #, c-format msgid "bad value (%s) for -mtls-size= switch" msgstr "" -#: config/ia64/ia64.c:4249 +#: config/ia64/ia64.c:4275 #, c-format msgid "bad value (%s) for -tune= switch" msgstr "" @@ -9844,7 +9933,7 @@ msgstr "" msgid "PRINT_OPERAND: Unknown punctuation '%c'" msgstr "" -#: config/iq2000/iq2000.c:3312 config/mips/mips.c:4801 +#: config/iq2000/iq2000.c:3312 config/mips/mips.c:4804 #: config/xtensa/xtensa.c:1887 msgid "PRINT_OPERAND null pointer" msgstr "" @@ -9854,12 +9943,12 @@ msgstr "" msgid "invalid %%P operand" msgstr "" -#: config/iq2000/iq2000.c:3389 config/rs6000/rs6000.c:10241 +#: config/iq2000/iq2000.c:3389 config/rs6000/rs6000.c:10249 #, c-format msgid "invalid %%p value" msgstr "" -#: config/iq2000/iq2000.c:3453 config/mips/mips.c:4927 +#: config/iq2000/iq2000.c:3453 config/mips/mips.c:4930 #, c-format msgid "invalid use of %%d, %%x, or %%X" msgstr "" @@ -9952,7 +10041,7 @@ msgid "post-increment address is not a register" msgstr "" #: config/m32r/m32r.c:2355 config/m32r/m32r.c:2371 -#: config/rs6000/rs6000.c:16563 +#: config/rs6000/rs6000.c:16852 msgid "bad address" msgstr "" @@ -10142,7 +10231,7 @@ msgstr "" msgid "-fPIC is not currently supported on the 68000 or 68010\n" msgstr "" -#: config/m68k/m68k.c:543 config/rs6000/rs6000.c:12732 +#: config/m68k/m68k.c:543 config/rs6000/rs6000.c:13021 msgid "stack limit expression is not supported" msgstr "" @@ -10336,131 +10425,131 @@ msgstr "" msgid "Maximum amount for a single stack increment operation" msgstr "" -#: config/mips/mips.c:3998 +#: config/mips/mips.c:4001 #, c-format msgid "bad value (%s) for -mabi= switch" msgstr "" -#: config/mips/mips.c:4021 +#: config/mips/mips.c:4024 #, c-format msgid "" "-mips%s conflicts with the other architecture options, which specify a MIPS%" "d processor" msgstr "" -#: config/mips/mips.c:4040 +#: config/mips/mips.c:4043 #, c-format msgid "-march=%s is not compatible with the selected ABI" msgstr "" -#: config/mips/mips.c:4055 +#: config/mips/mips.c:4058 msgid "-mgp64 used with a 32-bit processor" msgstr "" -#: config/mips/mips.c:4057 +#: config/mips/mips.c:4060 msgid "-mgp32 used with a 64-bit ABI" msgstr "" -#: config/mips/mips.c:4059 +#: config/mips/mips.c:4062 msgid "-mgp64 used with a 32-bit ABI" msgstr "" -#: config/mips/mips.c:4077 config/mips/mips.c:4079 config/mips/mips.c:4081 -#: config/mips/mips.c:4161 +#: config/mips/mips.c:4080 config/mips/mips.c:4082 config/mips/mips.c:4084 +#: config/mips/mips.c:4164 #, c-format msgid "unsupported combination: %s" msgstr "" -#: config/mips/mips.c:4156 +#: config/mips/mips.c:4159 msgid "" "generation of Branch Likely instructions enabled, but not supported by " "architecture" msgstr "" -#: config/mips/mips.c:4173 +#: config/mips/mips.c:4176 msgid "-G is incompatible with PIC code which is the default" msgstr "" -#: config/mips/mips.c:4240 +#: config/mips/mips.c:4243 msgid "-mips3d requires -mpaired-single" msgstr "" -#: config/mips/mips.c:4249 +#: config/mips/mips.c:4252 msgid "-mips3d/-mpaired-single must be used with -mfp64 -mhard-float" msgstr "" -#: config/mips/mips.c:4254 +#: config/mips/mips.c:4257 msgid "-mips3d/-mpaired-single must be used with -mips64" msgstr "" -#: config/mips/mips.c:4612 +#: config/mips/mips.c:4615 msgid "mips_debugger_offset called with non stack/frame/arg pointer" msgstr "" -#: config/mips/mips.c:4738 +#: config/mips/mips.c:4741 #, c-format msgid "internal error: %%) found without a %%( in assembler pattern" msgstr "" -#: config/mips/mips.c:4752 +#: config/mips/mips.c:4755 #, c-format msgid "internal error: %%] found without a %%[ in assembler pattern" msgstr "" -#: config/mips/mips.c:4765 +#: config/mips/mips.c:4768 #, c-format msgid "internal error: %%> found without a %%< in assembler pattern" msgstr "" -#: config/mips/mips.c:4778 +#: config/mips/mips.c:4781 #, c-format msgid "internal error: %%} found without a %%{ in assembler pattern" msgstr "" -#: config/mips/mips.c:4792 +#: config/mips/mips.c:4795 #, c-format msgid "PRINT_OPERAND: unknown punctuation '%c'" msgstr "" -#: config/mips/mips.c:4821 +#: config/mips/mips.c:4824 #, c-format msgid "PRINT_OPERAND, invalid insn for %%C" msgstr "" -#: config/mips/mips.c:4838 +#: config/mips/mips.c:4841 #, c-format msgid "PRINT_OPERAND, invalid insn for %%N" msgstr "" -#: config/mips/mips.c:4847 +#: config/mips/mips.c:4850 #, c-format msgid "PRINT_OPERAND, invalid insn for %%F" msgstr "" -#: config/mips/mips.c:4856 +#: config/mips/mips.c:4859 #, c-format msgid "PRINT_OPERAND, invalid insn for %%W" msgstr "" -#: config/mips/mips.c:4877 +#: config/mips/mips.c:4880 #, c-format msgid "invalid %%Y value" msgstr "" -#: config/mips/mips.c:4955 +#: config/mips/mips.c:4958 msgid "PRINT_OPERAND, invalid operand for relocation" msgstr "" -#: config/mips/mips.c:7517 +#: config/mips/mips.c:7556 #, c-format msgid "cannot handle inconsistent calls to `%s'" msgstr "" -#: config/mips/mips.c:8907 +#: config/mips/mips.c:8946 msgid "the cpu name must be lower case" msgstr "" -#: config/mips/mips.c:8929 +#: config/mips/mips.c:8968 #, c-format msgid "bad value (%s) for %s" msgstr "" @@ -10822,23 +10911,6 @@ msgstr "" msgid "MMIX Internal: This is not a constant:" msgstr "" -#. For these target macros, there is no generic documentation here. You -#. should read `Using and Porting GCC' for that. Only comments specific -#. to the MMIX target are here. -#. -#. There are however references to the specific texinfo node (comments -#. with "Node:"), so there should be little or nothing amiss. Probably -#. the opposite, since we don't have to care about old littering and -#. soon outdated generic comments. -#. Node: Driver -#. User symbols are in the same name-space as built-in symbols, but we -#. don't need the built-in symbols, so remove those and instead apply -#. stricter operand checking. Don't warn when expanding insns. -#. Pass on -mset-program-start=N and -mset-data-start=M to the linker. -#. Provide default program start 0x100 unless -mno-set-program-start. -#. Don't do this if linking relocatably, with -r. For a final link, -#. produce mmo, unless ELF is requested or when linking relocatably. -#. Put unused option values here. #: config/mmix/mmix.h:132 msgid "Set start-address of the program" msgstr "" @@ -11344,184 +11416,184 @@ msgstr "" msgid "junk at end of #pragma longcall" msgstr "" -#: config/rs6000/rs6000.c:1223 +#: config/rs6000/rs6000.c:1231 msgid "-mmultiple is not supported on little endian systems" msgstr "" -#: config/rs6000/rs6000.c:1230 +#: config/rs6000/rs6000.c:1238 msgid "-mstring is not supported on little endian systems" msgstr "" -#: config/rs6000/rs6000.c:1244 +#: config/rs6000/rs6000.c:1252 #, c-format msgid "unknown -mdebug-%s switch" msgstr "" -#: config/rs6000/rs6000.c:1256 +#: config/rs6000/rs6000.c:1264 #, c-format msgid "unknown -mtraceback arg `%s'; expecting `full', `partial' or `none'" msgstr "" -#: config/rs6000/rs6000.c:1267 +#: config/rs6000/rs6000.c:1275 #, c-format msgid "Unknown switch -mlong-double-%s" msgstr "" -#: config/rs6000/rs6000.c:1308 +#: config/rs6000/rs6000.c:1316 msgid "AltiVec and E500 instructions cannot coexist" msgstr "" #. Handle -mfix-and-continue. -#: config/rs6000/rs6000.c:1354 config/rs6000/rs6000.c:1365 +#: config/rs6000/rs6000.c:1362 config/rs6000/rs6000.c:1373 #: config/rs6000/darwin.h:106 #, c-format msgid "invalid option `%s'" msgstr "" -#: config/rs6000/rs6000.c:1586 +#: config/rs6000/rs6000.c:1594 #, c-format msgid "unknown -m%s= option specified: '%s'" msgstr "" -#: config/rs6000/rs6000.c:1607 +#: config/rs6000/rs6000.c:1615 #, c-format msgid "not configured for ABI: '%s'" msgstr "" -#: config/rs6000/rs6000.c:1613 +#: config/rs6000/rs6000.c:1621 #, c-format msgid "unknown ABI specified: '%s'" msgstr "" -#: config/rs6000/rs6000.c:1627 +#: config/rs6000/rs6000.c:1635 #, c-format msgid "unknown -malign-XXXXX option specified: '%s'" msgstr "" -#: config/rs6000/rs6000.c:4631 +#: config/rs6000/rs6000.c:4639 msgid "" "Cannot return value in vector register because altivec instructions are " "disabled, use -maltivec to enable them." msgstr "" -#: config/rs6000/rs6000.c:4765 +#: config/rs6000/rs6000.c:4773 msgid "" "Cannot pass argument in vector register because altivec instructions are " "disabled, use -maltivec to enable them." msgstr "" -#: config/rs6000/rs6000.c:6203 +#: config/rs6000/rs6000.c:6211 msgid "argument 1 must be a 5-bit signed literal" msgstr "" -#: config/rs6000/rs6000.c:6306 config/rs6000/rs6000.c:6976 +#: config/rs6000/rs6000.c:6314 config/rs6000/rs6000.c:6984 msgid "argument 2 must be a 5-bit unsigned literal" msgstr "" -#: config/rs6000/rs6000.c:6346 +#: config/rs6000/rs6000.c:6354 msgid "argument 1 of __builtin_altivec_predicate must be a constant" msgstr "" -#: config/rs6000/rs6000.c:6400 +#: config/rs6000/rs6000.c:6408 msgid "argument 1 of __builtin_altivec_predicate is out of range" msgstr "" -#: config/rs6000/rs6000.c:6562 +#: config/rs6000/rs6000.c:6570 msgid "argument 3 must be a 4-bit unsigned literal" msgstr "" -#: config/rs6000/rs6000.c:6734 +#: config/rs6000/rs6000.c:6742 #, c-format msgid "argument to `%s' must be a 2-bit unsigned literal" msgstr "" -#: config/rs6000/rs6000.c:6847 +#: config/rs6000/rs6000.c:6855 msgid "argument to dss must be a 2-bit unsigned literal" msgstr "" -#: config/rs6000/rs6000.c:6862 +#: config/rs6000/rs6000.c:6870 #, c-format msgid "invalid parameter combination for `%s' AltiVec intrinsic" msgstr "" -#: config/rs6000/rs6000.c:7096 +#: config/rs6000/rs6000.c:7104 msgid "argument 1 of __builtin_spe_predicate must be a constant" msgstr "" -#: config/rs6000/rs6000.c:7169 +#: config/rs6000/rs6000.c:7177 msgid "argument 1 of __builtin_spe_predicate is out of range" msgstr "" -#: config/rs6000/rs6000.c:10071 +#: config/rs6000/rs6000.c:10079 #, c-format msgid "invalid %%f value" msgstr "" -#: config/rs6000/rs6000.c:10080 +#: config/rs6000/rs6000.c:10088 #, c-format msgid "invalid %%F value" msgstr "" -#: config/rs6000/rs6000.c:10089 +#: config/rs6000/rs6000.c:10097 #, c-format msgid "invalid %%G value" msgstr "" -#: config/rs6000/rs6000.c:10124 +#: config/rs6000/rs6000.c:10132 #, c-format msgid "invalid %%j code" msgstr "" -#: config/rs6000/rs6000.c:10134 +#: config/rs6000/rs6000.c:10142 #, c-format msgid "invalid %%J code" msgstr "" -#: config/rs6000/rs6000.c:10144 +#: config/rs6000/rs6000.c:10152 #, c-format msgid "invalid %%k value" msgstr "" -#: config/rs6000/rs6000.c:10164 config/xtensa/xtensa.c:1937 +#: config/rs6000/rs6000.c:10172 config/xtensa/xtensa.c:1937 #, c-format msgid "invalid %%K value" msgstr "" -#: config/rs6000/rs6000.c:10231 +#: config/rs6000/rs6000.c:10239 #, c-format msgid "invalid %%O value" msgstr "" -#: config/rs6000/rs6000.c:10278 +#: config/rs6000/rs6000.c:10286 #, c-format msgid "invalid %%q value" msgstr "" -#: config/rs6000/rs6000.c:10322 +#: config/rs6000/rs6000.c:10330 #, c-format msgid "invalid %%S value" msgstr "" -#: config/rs6000/rs6000.c:10364 +#: config/rs6000/rs6000.c:10372 #, c-format msgid "invalid %%T value" msgstr "" -#: config/rs6000/rs6000.c:10374 +#: config/rs6000/rs6000.c:10382 #, c-format msgid "invalid %%u value" msgstr "" -#: config/rs6000/rs6000.c:10383 config/xtensa/xtensa.c:1907 +#: config/rs6000/rs6000.c:10391 config/xtensa/xtensa.c:1907 #, c-format msgid "invalid %%v value" msgstr "" -#: config/rs6000/rs6000.c:15209 +#: config/rs6000/rs6000.c:15498 msgid "no profiling of 64-bit code for this ABI" msgstr "" -#: config/rs6000/rs6000.c:16281 +#: config/rs6000/rs6000.c:16570 msgid "use of 'long' in AltiVec types is deprecated; use 'int'" msgstr "" @@ -11965,79 +12037,79 @@ msgstr "" msgid "-m%s not supported in this configuration" msgstr "" -#: config/s390/s390.c:1238 +#: config/s390/s390.c:1258 #, c-format msgid "Unknown cpu used in -march=%s." msgstr "" -#: config/s390/s390.c:1257 +#: config/s390/s390.c:1277 #, c-format msgid "Unknown cpu used in -mtune=%s." msgstr "" -#: config/s390/s390.c:1262 +#: config/s390/s390.c:1282 #, c-format msgid "z/Architecture mode not supported on %s." msgstr "" -#: config/s390/s390.c:1264 +#: config/s390/s390.c:1284 msgid "64-bit ABI not supported in ESA/390 mode." msgstr "" -#: config/s390/s390.c:1270 +#: config/s390/s390.c:1290 msgid "invalid value for -mwarn-framesize" msgstr "" -#: config/s390/s390.c:1280 +#: config/s390/s390.c:1300 msgid "invalid value for -mstack-size" msgstr "" -#: config/s390/s390.c:1283 +#: config/s390/s390.c:1303 msgid "stack size must be an exact power of 2" msgstr "" -#: config/s390/s390.c:1289 +#: config/s390/s390.c:1309 msgid "invalid value for -mstack-guard" msgstr "" -#: config/s390/s390.c:1292 +#: config/s390/s390.c:1312 msgid "stack size must be greater than the stack guard value" msgstr "" -#: config/s390/s390.c:1295 +#: config/s390/s390.c:1315 msgid "stack guard value must be an exact power of 2" msgstr "" -#: config/s390/s390.c:1298 +#: config/s390/s390.c:1318 msgid "-mstack-size implies use of -mstack-guard" msgstr "" -#: config/s390/s390.c:1302 +#: config/s390/s390.c:1322 msgid "-mstack-guard implies use of -mstack-size" msgstr "" -#: config/s390/s390.c:3995 +#: config/s390/s390.c:4024 msgid "Cannot decompose address." msgstr "" -#: config/s390/s390.c:4166 +#: config/s390/s390.c:4195 msgid "UNKNOWN in print_operand !?" msgstr "" -#: config/s390/s390.c:6212 +#: config/s390/s390.c:6241 msgid "Total size of local variables exceeds architecture limit." msgstr "" -#: config/s390/s390.c:6751 +#: config/s390/s390.c:6780 #, c-format msgid "frame size of `%s' is " msgstr "" -#: config/s390/s390.c:6751 +#: config/s390/s390.c:6780 msgid " bytes" msgstr "" -#: config/s390/s390.c:6755 +#: config/s390/s390.c:6784 #, c-format msgid "`%s' uses dynamic stack allocation" msgstr "" @@ -12139,6 +12211,7 @@ msgid "attribute interrupt_handler is not compatible with -m5-compact" msgstr "" #. The sp_switch attribute only has meaning for interrupt functions. +#. The trap_exit attribute only has meaning for interrupt functions. #: config/sh/sh.c:7174 config/sh/sh.c:7209 #, c-format msgid "`%s' attribute only applies to interrupt functions" @@ -12193,7 +12266,7 @@ msgstr "" msgid "%Hexternal linkage required for symbol '%D' because of '%s' attribute." msgstr "" -#: config/sh/symbian.c:893 cp/tree.c:2355 +#: config/sh/symbian.c:892 cp/tree.c:2355 #, c-format msgid "lang_* check: failed in %s, at %s:%d" msgstr "" @@ -12993,228 +13066,228 @@ msgid "" "invalid initialization of reference of type %qT from expression of type %qT" msgstr "" -#: cp/class.c:276 +#: cp/class.c:274 msgid "cannot convert from base %qT to derived type %qT via virtual base %qT" msgstr "" -#: cp/class.c:888 +#: cp/class.c:886 msgid "Java class %qT cannot have an implicit non-trivial destructor" msgstr "" -#: cp/class.c:889 +#: cp/class.c:887 msgid "Java class %qT cannot have a destructor" msgstr "" -#: cp/class.c:988 +#: cp/class.c:986 msgid "`%#D' and `%#D' cannot be overloaded" msgstr "" -#: cp/class.c:1045 +#: cp/class.c:1043 msgid "conflicting access specifications for method %qD, ignored" msgstr "" -#: cp/class.c:1048 +#: cp/class.c:1046 #, c-format msgid "conflicting access specifications for field %qE, ignored" msgstr "" -#: cp/class.c:1098 +#: cp/class.c:1096 msgid "%qD names constructor" msgstr "" -#: cp/class.c:1103 +#: cp/class.c:1101 msgid "%qD invalid in %qT" msgstr "" -#: cp/class.c:1111 +#: cp/class.c:1109 msgid "no members matching %qD in %q#T" msgstr "" -#: cp/class.c:1143 cp/class.c:1151 +#: cp/class.c:1141 cp/class.c:1149 msgid "%qD invalid in %q#T" msgstr "" -#: cp/class.c:1144 +#: cp/class.c:1142 msgid " because of local method %q#D with same name" msgstr "" -#: cp/class.c:1152 +#: cp/class.c:1150 msgid " because of local member %q#D with same name" msgstr "" -#: cp/class.c:1197 +#: cp/class.c:1195 msgid "base class %q#T has a non-virtual destructor" msgstr "" -#: cp/class.c:1216 +#: cp/class.c:1214 msgid "" "base %qT with only non-default constructor in class without a constructor" msgstr "" -#: cp/class.c:1523 +#: cp/class.c:1521 msgid "all member functions in class %qT are private" msgstr "" -#: cp/class.c:1534 +#: cp/class.c:1532 msgid "%q#T only defines a private destructor and has no friends" msgstr "" -#: cp/class.c:1574 +#: cp/class.c:1572 msgid "%q#T only defines private constructors and has no friends" msgstr "" -#: cp/class.c:1955 +#: cp/class.c:1910 msgid "no unique final overrider for %qD in %qT" msgstr "" #. Here we know it is a hider, and no overrider exists. -#: cp/class.c:2409 +#: cp/class.c:2361 msgid "%qD was hidden" msgstr "" -#: cp/class.c:2410 +#: cp/class.c:2362 msgid " by %qD" msgstr "" -#: cp/class.c:2451 cp/decl2.c:1143 +#: cp/class.c:2403 cp/decl2.c:1139 msgid "%q#D invalid; an anonymous union can only have non-static data members" msgstr "" -#: cp/class.c:2458 cp/decl2.c:1150 +#: cp/class.c:2410 cp/decl2.c:1146 msgid "private member %q#D in anonymous union" msgstr "" -#: cp/class.c:2461 cp/decl2.c:1152 +#: cp/class.c:2413 cp/decl2.c:1148 msgid "protected member %q#D in anonymous union" msgstr "" -#: cp/class.c:2575 +#: cp/class.c:2527 msgid "" "vtable layout for class %qT may not be ABI-compliant and may change in a " "future version of GCC due to implicit virtual destructor" msgstr "" -#: cp/class.c:2633 +#: cp/class.c:2585 msgid "bit-field %q#D with non-integral type" msgstr "" -#: cp/class.c:2653 +#: cp/class.c:2605 msgid "bit-field %qD width not an integer constant" msgstr "" -#: cp/class.c:2659 +#: cp/class.c:2611 msgid "negative width in bit-field %qD" msgstr "" -#: cp/class.c:2664 +#: cp/class.c:2616 msgid "zero width for bit-field %qD" msgstr "" -#: cp/class.c:2670 +#: cp/class.c:2622 msgid "width of %qD exceeds its type" msgstr "" -#: cp/class.c:2679 +#: cp/class.c:2631 msgid "%qD is too small to hold all values of %q#T" msgstr "" -#: cp/class.c:2741 +#: cp/class.c:2693 msgid "member %q#D with constructor not allowed in union" msgstr "" -#: cp/class.c:2744 +#: cp/class.c:2696 msgid "member %q#D with destructor not allowed in union" msgstr "" -#: cp/class.c:2747 +#: cp/class.c:2699 msgid "member %q#D with copy assignment operator not allowed in union" msgstr "" -#: cp/class.c:2774 +#: cp/class.c:2726 msgid "multiple fields in union %qT initialized" msgstr "" -#: cp/class.c:2840 +#: cp/class.c:2792 msgid "ignoring packed attribute on unpacked non-POD field %q#D" msgstr "" -#: cp/class.c:2900 +#: cp/class.c:2852 msgid "%qD may not be static because it is a member of a union" msgstr "" -#: cp/class.c:2905 +#: cp/class.c:2857 msgid "%qD may not have reference type `%T' because it is a member of a union" msgstr "" -#: cp/class.c:2913 +#: cp/class.c:2865 msgid "field %qD in local class cannot be static" msgstr "" -#: cp/class.c:2919 +#: cp/class.c:2871 msgid "field %qD invalidly declared function type" msgstr "" -#: cp/class.c:2925 +#: cp/class.c:2877 msgid "field %qD invalidly declared method type" msgstr "" -#: cp/class.c:2958 +#: cp/class.c:2910 msgid "non-static reference %q#D in class without a constructor" msgstr "" -#: cp/class.c:3006 +#: cp/class.c:2958 msgid "non-static const member %q#D in class without a constructor" msgstr "" -#: cp/class.c:3021 +#: cp/class.c:2973 msgid "field %q#D with same name as class" msgstr "" -#: cp/class.c:3055 +#: cp/class.c:3007 msgid "%q#T has pointer data members" msgstr "" -#: cp/class.c:3059 +#: cp/class.c:3011 msgid " but does not override %<%T(const %T&)%>" msgstr "" -#: cp/class.c:3061 +#: cp/class.c:3013 msgid " or %" msgstr "" -#: cp/class.c:3064 +#: cp/class.c:3016 msgid " but does not override %" msgstr "" -#: cp/class.c:3497 +#: cp/class.c:3449 msgid "" "offset of empty base %qT may not be ABI-compliant and maychange in a future " "version of GCC" msgstr "" -#: cp/class.c:3609 +#: cp/class.c:3561 msgid "class %qT will be considered nearly empty in a future version of GCC" msgstr "" -#: cp/class.c:3691 +#: cp/class.c:3643 msgid "initializer specified for non-virtual method %qD" msgstr "" -#: cp/class.c:4350 +#: cp/class.c:4302 msgid "" "offset of virtual base %qT is not ABI-compliant and may change in a future " "version of GCC" msgstr "" -#: cp/class.c:4445 +#: cp/class.c:4397 msgid "direct base %qT inaccessible in %qT due to ambiguity" msgstr "" -#: cp/class.c:4457 +#: cp/class.c:4409 msgid "virtual base %qT inaccessible in %qT due to ambiguity" msgstr "" -#: cp/class.c:4628 +#: cp/class.c:4580 msgid "" "size assigned to `%T' may not be ABI-compliant and may change in a future " "version of GCC" @@ -13222,76 +13295,76 @@ msgstr "" #. Versions of G++ before G++ 3.4 did not reset the #. DECL_MODE. -#: cp/class.c:4667 +#: cp/class.c:4619 msgid "" "the offset of %qD may not be ABI-compliant and may change in a future " "version of GCC" msgstr "" -#: cp/class.c:4690 +#: cp/class.c:4642 msgid "" "offset of %qD is not ABI-compliant and may change in a future version of GCC" msgstr "" -#: cp/class.c:4700 +#: cp/class.c:4652 msgid "" "%qD contains empty classes which may cause base classes to be placed at " "different locations in a future version of GCC" msgstr "" -#: cp/class.c:4759 +#: cp/class.c:4711 msgid "" "layout of classes derived from empty class %qT may change in a future " "version of GCC" msgstr "" -#: cp/class.c:4900 +#: cp/class.c:4852 msgid "redefinition of %q#T" msgstr "" -#: cp/class.c:5044 +#: cp/class.c:4996 msgid "%q#T has virtual functions but non-virtual destructor" msgstr "" -#: cp/class.c:5139 +#: cp/class.c:5091 msgid "trying to finish struct, but kicked out due to previous parse errors" msgstr "" -#: cp/class.c:5557 +#: cp/class.c:5509 #, c-format msgid "language string `\"%E\"' not recognized" msgstr "" -#: cp/class.c:5644 +#: cp/class.c:5596 msgid "" "cannot resolve overloaded function `%D' based on conversion to type `%T'" msgstr "" -#: cp/class.c:5769 +#: cp/class.c:5721 msgid "no matches converting function %qD to type %q#T" msgstr "" -#: cp/class.c:5792 +#: cp/class.c:5744 msgid "converting overloaded function %qD to type %q#T is ambiguous" msgstr "" -#: cp/class.c:5818 +#: cp/class.c:5770 msgid "assuming pointer to member %qD" msgstr "" -#: cp/class.c:5821 +#: cp/class.c:5773 msgid "(a pointer to member can only be formed with %<&%E%>)" msgstr "" -#: cp/class.c:5866 cp/class.c:6045 cp/class.c:6052 +#: cp/class.c:5818 cp/class.c:5997 cp/class.c:6004 msgid "not enough type information" msgstr "" -#: cp/class.c:5883 +#: cp/class.c:5835 msgid "argument of type %qT does not match %qT" msgstr "" -#: cp/class.c:6029 +#: cp/class.c:5981 msgid "invalid operation on uninstantiated type" msgstr "" @@ -13300,11 +13373,11 @@ msgstr "" #. A name N used in a class S shall refer to the same declaration #. in its context and when re-evaluated in the completed scope of #. S. -#: cp/class.c:6295 cp/decl.c:1230 cp/name-lookup.c:577 cp/pt.c:2143 +#: cp/class.c:6247 cp/decl.c:1230 cp/name-lookup.c:577 cp/pt.c:2166 msgid "declaration of %q#D" msgstr "" -#: cp/class.c:6296 +#: cp/class.c:6248 msgid "changes meaning of %qD from %q+#D" msgstr "" @@ -13942,7 +14015,7 @@ msgstr "" msgid "definition of implicitly-declared %qD" msgstr "" -#: cp/decl.c:5822 cp/decl2.c:719 +#: cp/decl.c:5822 cp/decl2.c:715 msgid "no %q#D member function declared in class %qT" msgstr "" @@ -14472,102 +14545,102 @@ msgstr "" #. or implicitly defined), there's no need to worry about their #. existence. Theoretically, they should never even be #. instantiated, but that's hard to forestall. -#: cp/decl.c:8586 +#: cp/decl.c:8587 msgid "invalid constructor; you probably meant %<%T (const %T&)%>" msgstr "" -#: cp/decl.c:8710 +#: cp/decl.c:8711 msgid "%qD may not be declared within a namespace" msgstr "" -#: cp/decl.c:8712 +#: cp/decl.c:8713 msgid "%qD may not be declared as static" msgstr "" -#: cp/decl.c:8732 +#: cp/decl.c:8733 msgid "%qD must be a nonstatic member function" msgstr "" -#: cp/decl.c:8738 +#: cp/decl.c:8739 msgid "" "%qD must be either a non-static member function or a non-member function" msgstr "" -#: cp/decl.c:8756 +#: cp/decl.c:8757 msgid "%qD must have an argument of class or enumerated type" msgstr "" -#: cp/decl.c:8791 +#: cp/decl.c:8792 #, c-format msgid "conversion to %s%s will never use a type conversion operator" msgstr "" #. 13.4.0.3 -#: cp/decl.c:8799 +#: cp/decl.c:8800 msgid "ISO C++ prohibits overloading operator ?:" msgstr "" -#: cp/decl.c:8849 +#: cp/decl.c:8850 msgid "postfix %qD must take % as its argument" msgstr "" -#: cp/decl.c:8853 +#: cp/decl.c:8854 msgid "postfix %qD must take % as its second argument" msgstr "" -#: cp/decl.c:8860 +#: cp/decl.c:8861 msgid "%qD must take either zero or one argument" msgstr "" -#: cp/decl.c:8862 +#: cp/decl.c:8863 msgid "%qD must take either one or two arguments" msgstr "" -#: cp/decl.c:8883 +#: cp/decl.c:8884 msgid "prefix %qD should return %qT" msgstr "" -#: cp/decl.c:8889 +#: cp/decl.c:8890 msgid "postfix %qD should return %qT" msgstr "" -#: cp/decl.c:8898 +#: cp/decl.c:8899 msgid "%qD must take %" msgstr "" -#: cp/decl.c:8900 cp/decl.c:8908 +#: cp/decl.c:8901 cp/decl.c:8909 msgid "%qD must take exactly one argument" msgstr "" -#: cp/decl.c:8910 +#: cp/decl.c:8911 msgid "%qD must take exactly two arguments" msgstr "" -#: cp/decl.c:8918 +#: cp/decl.c:8919 msgid "user-defined %qD always evaluates both arguments" msgstr "" -#: cp/decl.c:8932 +#: cp/decl.c:8933 msgid "%qD should return by value" msgstr "" -#: cp/decl.c:8944 cp/decl.c:8947 +#: cp/decl.c:8945 cp/decl.c:8948 msgid "%qD cannot have default arguments" msgstr "" -#: cp/decl.c:9007 +#: cp/decl.c:9008 msgid "using typedef-name %qD after %qs" msgstr "" -#: cp/decl.c:9013 +#: cp/decl.c:9014 msgid "using template type parameter %qT after %qs" msgstr "" -#: cp/decl.c:9021 +#: cp/decl.c:9022 msgid "%qT referred to as %qs" msgstr "" -#: cp/decl.c:9027 +#: cp/decl.c:9028 msgid "%qT referred to as enum" msgstr "" @@ -14578,47 +14651,47 @@ msgstr "" #. void f(class C); // No template header here #. #. then the required template argument is missing. -#: cp/decl.c:9042 +#: cp/decl.c:9043 msgid "template argument required for %<%s %T%>" msgstr "" -#: cp/decl.c:9187 +#: cp/decl.c:9188 msgid "use of enum %q#D without previous declaration" msgstr "" -#: cp/decl.c:9205 +#: cp/decl.c:9206 msgid "redeclaration of %qT as a non-template" msgstr "" -#: cp/decl.c:9298 +#: cp/decl.c:9299 msgid "derived union %qT invalid" msgstr "" -#: cp/decl.c:9304 +#: cp/decl.c:9305 msgid "Java class %qT cannot have multiple bases" msgstr "" -#: cp/decl.c:9312 +#: cp/decl.c:9313 msgid "Java class %qT cannot have virtual bases" msgstr "" -#: cp/decl.c:9331 +#: cp/decl.c:9332 msgid "base type %qT fails to be a struct or class type" msgstr "" -#: cp/decl.c:9364 +#: cp/decl.c:9365 msgid "recursive type %qT undefined" msgstr "" -#: cp/decl.c:9366 +#: cp/decl.c:9367 msgid "duplicate base type %qT invalid" msgstr "" -#: cp/decl.c:9434 +#: cp/decl.c:9435 msgid "multiple definition of %q#T" msgstr "" -#: cp/decl.c:9435 +#: cp/decl.c:9436 msgid "%Jprevious definition here" msgstr "" @@ -14626,39 +14699,39 @@ msgstr "" #. #. IF no integral type can represent all the enumerator values, the #. enumeration is ill-formed. -#: cp/decl.c:9560 +#: cp/decl.c:9561 msgid "no integral type can represent all of the enumerator values for %qT" msgstr "" -#: cp/decl.c:9661 +#: cp/decl.c:9662 msgid "enumerator value for %qD not integer constant" msgstr "" -#: cp/decl.c:9688 +#: cp/decl.c:9689 msgid "overflow in enumeration values at %qD" msgstr "" -#: cp/decl.c:9759 +#: cp/decl.c:9760 msgid "return type %q#T is incomplete" msgstr "" -#: cp/decl.c:9874 +#: cp/decl.c:9875 msgid "% should return a reference to %<*this%>" msgstr "" -#: cp/decl.c:10198 +#: cp/decl.c:10199 msgid "parameter %qD declared void" msgstr "" -#: cp/decl.c:10680 +#: cp/decl.c:10681 msgid "invalid member function declaration" msgstr "" -#: cp/decl.c:10695 +#: cp/decl.c:10696 msgid "%qD is already defined in class %qT" msgstr "" -#: cp/decl.c:10906 +#: cp/decl.c:10907 msgid "static member function `%#D' declared with type qualifiers" msgstr "" @@ -14703,7 +14776,7 @@ msgstr "" msgid "invalid use of % in template declaration of %q#D" msgstr "" -#: cp/decl2.c:507 cp/pt.c:2902 +#: cp/decl2.c:507 cp/pt.c:2933 msgid "template declaration of %q#D" msgstr "" @@ -14715,95 +14788,95 @@ msgstr "" msgid "Java method %qD has non-Java parameter type %qT" msgstr "" -#: cp/decl2.c:681 +#: cp/decl2.c:677 msgid "prototype for `%#D' does not match any in class `%T'" msgstr "" -#: cp/decl2.c:782 +#: cp/decl2.c:778 msgid "local class %q#T shall not have static data member %q#D" msgstr "" -#: cp/decl2.c:790 +#: cp/decl2.c:786 msgid "initializer invalid for static member with constructor" msgstr "" -#: cp/decl2.c:793 +#: cp/decl2.c:789 msgid "(an out of class initialization is required)" msgstr "" -#: cp/decl2.c:874 +#: cp/decl2.c:870 msgid "member %qD conflicts with virtual function table field name" msgstr "" -#: cp/decl2.c:891 +#: cp/decl2.c:887 msgid "%qD is already defined in %qT" msgstr "" -#: cp/decl2.c:937 +#: cp/decl2.c:933 msgid "field initializer is not constant" msgstr "" -#: cp/decl2.c:965 +#: cp/decl2.c:961 msgid "`asm' specifiers are not permitted on non-static data members" msgstr "" -#: cp/decl2.c:1011 +#: cp/decl2.c:1007 msgid "cannot declare %qD to be a bit-field type" msgstr "" -#: cp/decl2.c:1021 +#: cp/decl2.c:1017 msgid "cannot declare bit-field %qD with function type" msgstr "" -#: cp/decl2.c:1028 +#: cp/decl2.c:1024 msgid "%qD is already defined in the class %qT" msgstr "" -#: cp/decl2.c:1035 +#: cp/decl2.c:1031 msgid "static member %qD cannot be a bit-field" msgstr "" -#: cp/decl2.c:1094 +#: cp/decl2.c:1090 msgid "initializer specified for non-member function %qD" msgstr "" -#: cp/decl2.c:1098 +#: cp/decl2.c:1094 msgid "invalid initializer for virtual method %qD" msgstr "" -#: cp/decl2.c:1130 +#: cp/decl2.c:1126 msgid "anonymous struct not inside named type" msgstr "" -#: cp/decl2.c:1201 +#: cp/decl2.c:1197 msgid "namespace-scope anonymous aggregates must be static" msgstr "" -#: cp/decl2.c:1208 +#: cp/decl2.c:1204 msgid "anonymous union with no members" msgstr "" -#: cp/decl2.c:1244 +#: cp/decl2.c:1240 msgid "% must return type %qT" msgstr "" -#: cp/decl2.c:1253 +#: cp/decl2.c:1249 msgid "% takes type % (%qT) as first parameter" msgstr "" -#: cp/decl2.c:1282 +#: cp/decl2.c:1278 msgid "% must return type %qT" msgstr "" -#: cp/decl2.c:1291 +#: cp/decl2.c:1287 msgid "% takes type %qT as first parameter" msgstr "" -#: cp/decl2.c:3028 +#: cp/decl2.c:3024 msgid "inline function `%D' used but never defined" msgstr "" -#: cp/decl2.c:3178 +#: cp/decl2.c:3174 msgid "default argument missing for parameter %P of %q+#D" msgstr "" @@ -14835,7 +14908,7 @@ msgstr "" msgid "throwing NULL, which has integral, not pointer type" msgstr "" -#: cp/except.c:599 cp/init.c:1875 +#: cp/except.c:599 cp/init.c:1873 msgid "%qD should never be overloaded" msgstr "" @@ -14922,184 +14995,184 @@ msgstr "" msgid "argument to `%s' missing\n" msgstr "" -#: cp/init.c:318 +#: cp/init.c:316 msgid "%J%qD should be initialized in the member initialization list" msgstr "" -#: cp/init.c:365 +#: cp/init.c:363 msgid "%Jdefault-initialization of %q#D, which has reference type" msgstr "" -#: cp/init.c:371 +#: cp/init.c:369 msgid "%Juninitialized reference member %qD" msgstr "" -#: cp/init.c:374 +#: cp/init.c:372 msgid "%Juninitialized member %qD with % type %qT" msgstr "" -#: cp/init.c:517 +#: cp/init.c:515 msgid "%qD will be initialized after" msgstr "" -#: cp/init.c:520 +#: cp/init.c:518 msgid "base %qT will be initialized after" msgstr "" -#: cp/init.c:523 +#: cp/init.c:521 msgid " %q#D" msgstr "" -#: cp/init.c:525 +#: cp/init.c:523 msgid " base %qT" msgstr "" -#: cp/init.c:526 +#: cp/init.c:524 msgid "%J when initialized here" msgstr "" -#: cp/init.c:542 +#: cp/init.c:540 msgid "%Jmultiple initializations given for %qD" msgstr "" -#: cp/init.c:545 +#: cp/init.c:543 msgid "%Jmultiple initializations given for base %qT" msgstr "" -#: cp/init.c:612 +#: cp/init.c:610 msgid "%Jinitializations for multiple members of %qT" msgstr "" -#: cp/init.c:669 +#: cp/init.c:667 msgid "" "%Jbase class %q#T should be explicitly initialized in the copy constructor" msgstr "" -#: cp/init.c:893 cp/init.c:912 +#: cp/init.c:891 cp/init.c:910 msgid "class %qT does not have any field named %qD" msgstr "" -#: cp/init.c:899 +#: cp/init.c:897 msgid "" "%q#D is a static data member; it can only be initialized at its definition" msgstr "" -#: cp/init.c:906 +#: cp/init.c:904 msgid "%q#D is not a non-static data member of %qT" msgstr "" -#: cp/init.c:945 +#: cp/init.c:943 msgid "unnamed initializer for %qT, which has no base classes" msgstr "" -#: cp/init.c:953 +#: cp/init.c:951 msgid "unnamed initializer for %qT, which uses multiple inheritance" msgstr "" -#: cp/init.c:999 +#: cp/init.c:997 msgid "%qD is both a direct base and an indirect virtual base" msgstr "" -#: cp/init.c:1007 +#: cp/init.c:1005 msgid "type %qD is not a direct or virtual base of %qT" msgstr "" -#: cp/init.c:1010 +#: cp/init.c:1008 msgid "type %qD is not a direct base of %qT" msgstr "" -#: cp/init.c:1090 +#: cp/init.c:1088 msgid "bad array initializer" msgstr "" -#: cp/init.c:1289 +#: cp/init.c:1287 msgid "%qT is not an aggregate type" msgstr "" -#: cp/init.c:1381 +#: cp/init.c:1379 msgid "qualified type %qT does not match destructor name %<~%T%>" msgstr "" -#: cp/init.c:1389 +#: cp/init.c:1387 msgid "incomplete type %qT does not have member %qD" msgstr "" -#: cp/init.c:1408 +#: cp/init.c:1406 msgid "%qD is not a member of type %qT" msgstr "" -#: cp/init.c:1435 +#: cp/init.c:1433 msgid "invalid pointer to bit-field %qD" msgstr "" -#: cp/init.c:1537 +#: cp/init.c:1535 msgid "invalid use of non-static member function %qD" msgstr "" -#: cp/init.c:1543 +#: cp/init.c:1541 msgid "invalid use of non-static data member %qD" msgstr "" -#: cp/init.c:1660 +#: cp/init.c:1658 msgid "new cannot be applied to a reference type" msgstr "" -#: cp/init.c:1666 +#: cp/init.c:1664 msgid "new cannot be applied to a function type" msgstr "" -#: cp/init.c:1698 +#: cp/init.c:1696 msgid "call to Java constructor, while % undefined" msgstr "" -#: cp/init.c:1714 +#: cp/init.c:1712 msgid "can't find class$" msgstr "" -#: cp/init.c:1827 +#: cp/init.c:1825 msgid "invalid type % for new" msgstr "" -#: cp/init.c:1837 +#: cp/init.c:1835 msgid "uninitialized const in % of %q#T" msgstr "" -#: cp/init.c:1870 +#: cp/init.c:1868 #, c-format msgid "call to Java constructor with %qs undefined" msgstr "" -#: cp/init.c:1910 +#: cp/init.c:1908 msgid "request for member %qD is ambiguous" msgstr "" -#: cp/init.c:2043 +#: cp/init.c:2041 msgid "ISO C++ forbids initialization in array new" msgstr "" -#: cp/init.c:2513 +#: cp/init.c:2511 msgid "initializer ends prematurely" msgstr "" -#: cp/init.c:2566 +#: cp/init.c:2564 msgid "cannot initialize multi-dimensional array with initializer" msgstr "" -#: cp/init.c:2725 +#: cp/init.c:2723 msgid "possible problem detected in invocation of delete operator:" msgstr "" -#: cp/init.c:2728 +#: cp/init.c:2726 msgid "" "neither the destructor nor the class-specific operator delete will be " "called, even if they are declared when the class is defined." msgstr "" -#: cp/init.c:2749 +#: cp/init.c:2747 msgid "unknown array size in delete" msgstr "" -#: cp/init.c:3009 +#: cp/init.c:3007 msgid "type to vector delete is neither pointer or array type" msgstr "" @@ -15459,7 +15532,7 @@ msgstr "" msgid "new types may not be defined in a return type" msgstr "" -#: cp/parser.c:1965 cp/pt.c:4279 +#: cp/parser.c:1965 cp/pt.c:4312 msgid "%qT is not a template" msgstr "" @@ -15637,95 +15710,95 @@ msgstr "" msgid "a template-id may not appear in a using-declaration" msgstr "" -#: cp/parser.c:10526 +#: cp/parser.c:10532 msgid "an asm-specification is not allowed on a function-definition" msgstr "" -#: cp/parser.c:10528 +#: cp/parser.c:10534 msgid "attributes are not allowed on a function-definition" msgstr "" -#: cp/parser.c:10659 +#: cp/parser.c:10665 msgid "attributes after parenthesized initializer ignored" msgstr "" -#: cp/parser.c:11088 +#: cp/parser.c:11094 msgid "%<%T::%D%> is not a type" msgstr "" -#: cp/parser.c:11133 +#: cp/parser.c:11139 msgid "invalid use of constructor as a template" msgstr "" -#: cp/parser.c:11134 +#: cp/parser.c:11140 msgid "" "use %<%T::%D%> instead of %<%T::%T%> to name the constructor in a qualified " "name" msgstr "" -#: cp/parser.c:11322 +#: cp/parser.c:11328 msgid "duplicate cv-qualifier" msgstr "" -#: cp/parser.c:11836 +#: cp/parser.c:11842 msgid "file ends in default argument" msgstr "" -#: cp/parser.c:11896 +#: cp/parser.c:11902 msgid "deprecated use of default argument for parameter of non-function" msgstr "" -#: cp/parser.c:11899 +#: cp/parser.c:11905 msgid "default arguments are only permitted for function parameters" msgstr "" -#: cp/parser.c:12641 +#: cp/parser.c:12647 msgid "declaration of %qD in %qD which does not enclose %qD" msgstr "" -#: cp/parser.c:12654 +#: cp/parser.c:12660 msgid "extra qualification ignored" msgstr "" -#: cp/parser.c:12665 +#: cp/parser.c:12671 msgid "an explicit specialization must be preceded by %